Click
Loading...
Searching...
No Matches
ip6flowid.hh
1// -*- c-basic-offset: 2; related-file-name: "../../lib/ip6flowid.cc" -*-
2#ifndef CLICK_IP6FLOWID_HH
3#define CLICK_IP6FLOWID_HH
4#include <click/ip6address.hh>
5#include <click/ipflowid.hh>
6#include <click/hashcode.hh>
7CLICK_DECLS
8class Packet;
9
10class IP6FlowID { public:
11
12 typedef uninitialized_type uninitialized_t;
13
17 inline IP6FlowID();
18
24 inline IP6FlowID(const IP6Address &, uint16_t, const IP6Address &, uint16_t);
25
34 inline IP6FlowID(const IPAddress &, uint16_t, const IPAddress &, uint16_t);
35
45 explicit IP6FlowID(const Packet *, bool reverse = false);
46
54 explicit IP6FlowID(const click_ip6 *ip6h, bool reverse = false);
55
66 explicit IP6FlowID(const click_ip *iph, bool reverse = false);
67
73 explicit IP6FlowID(const IPFlowID &);
74
75
77 inline IP6FlowID(const uninitialized_type &unused) {
78 (void) unused;
79 }
80
81 typedef const IP6Address &(IP6FlowID::*unspecified_bool_type)() const;
82 inline operator unspecified_bool_type() const;
83
84 const IP6Address &saddr() const { return _saddr; }
85 const IP6Address &daddr() const { return _daddr; }
86 IPAddress saddr4() const { return _saddr.ip4_address(); }
87 IPAddress daddr4() const { return _daddr.ip4_address(); }
88 uint16_t sport() const { return _sport; }
89 uint16_t dport() const { return _dport; }
90
91 void set_saddr(const IP6Address &a) { _saddr = a; }
92 void set_daddr(const IP6Address &a) { _daddr = a; }
93 void set_saddr(const IPAddress a) { _saddr = a; }
94 void set_daddr(const IPAddress a) { _daddr = a; }
95 void set_sport(uint16_t p) { _sport = p; }
96 void set_dport(uint16_t p) { _dport = p; }
97
103 void assign(const IP6Address &saddr, uint16_t sport, const IP6Address &daddr, uint16_t dport) {
104 _saddr = saddr;
105 _daddr = daddr;
106 _sport = sport;
107 _dport = dport;
108 }
109
115 void assign(IPAddress saddr, uint16_t sport, IPAddress daddr, uint16_t dport) {
116 _saddr = saddr;
117 _daddr = daddr;
118 _sport = sport;
119 _dport = dport;
120 }
121
122 inline IP6FlowID reverse() const;
123 inline IP6FlowID rev() const CLICK_DEPRECATED;
124
127 inline bool is_ip4_mapped() const { return _saddr.is_ip4_mapped(); }
128
133 IPFlowID flow_id4() const;
134
138 IP6FlowID flow_id6() const;
139
140 inline IP6FlowID &operator=(const IPFlowID &);
141
142 inline hashcode_t hashcode() const;
143
144 String unparse() const;
145 operator String() const { return unparse(); }
146 String s() const { return unparse(); }
147
148 protected:
149
150 // note: several functions depend on this field order!
151 IP6Address _saddr;
152 IP6Address _daddr;
153 uint16_t _sport; // network byte order
154 uint16_t _dport; // network byte order
155
156};
157
158inline
159IP6FlowID::IP6FlowID()
160 : _saddr(), _daddr(), _sport(0), _dport(0)
161{
162}
163
164inline
165IP6FlowID::IP6FlowID(const IP6Address &saddr, uint16_t sport,
166 const IP6Address &daddr, uint16_t dport)
167 : _saddr(saddr), _daddr(daddr), _sport(sport), _dport(dport)
168{
169}
170
171inline
172IP6FlowID::IP6FlowID(const IPAddress &saddr, uint16_t sport,
173 const IPAddress &daddr, uint16_t dport)
174 : _saddr(saddr), _daddr(daddr), _sport(sport), _dport(dport)
175{
176}
177
178inline
179IP6FlowID::IP6FlowID(const IPFlowID &flow)
180{
181 *this = flow;
182}
183
184inline
185IP6FlowID::operator unspecified_bool_type() const
186{
187 return _saddr || _daddr ? &IP6FlowID::saddr : 0;
188}
189
190inline IP6FlowID
191IP6FlowID::reverse() const
192{
193 return IP6FlowID(_daddr, _dport, _saddr, _sport);
194}
195
196inline IP6FlowID
197IP6FlowID::rev() const
198{
199 return reverse();
200}
201
202inline IP6FlowID &
203IP6FlowID::operator=(const IPFlowID &f)
204{
205 assign(f.saddr(), f.sport(), f.daddr(), f.dport());
206 return *this;
207}
208
209#define ROT(v, r) ((v)<<(r) | ((unsigned)(v))>>(32-(r)))
210
211#if 0
212inline hashcode_t
213IP6FlowID::hashcode() const
214{
215 return (ROT(_saddr.hashcode(), 13)
216 ^ ROT(_daddr.hashcode(), 23) ^ (_sport | (_dport<<16)));
217}
218#endif
219
220inline hashcode_t IP6FlowID::hashcode() const
221{
222 // more complicated hashcode, but causes less collision
223 uint16_t s = ntohs(sport());
224 uint16_t d = ntohs(dport());
225 hashcode_t sx = CLICK_NAME(hashcode)(saddr());
226 hashcode_t dx = CLICK_NAME(hashcode)(daddr());
227 return (ROT(sx, s%16)
228 ^ ROT(dx, 31-d%16))
229 ^ ((d << 16) | s);
230}
231
232#undef ROT
233
234StringAccum &operator<<(StringAccum &sa, const IP6FlowID &flow_id);
235
236inline bool
237operator==(const IP6FlowID &a, const IP6FlowID &b)
238{
239 return a.dport() == b.dport() && a.sport() == b.sport()
240 && a.daddr() == b.daddr() && a.saddr() == b.saddr();
241}
242
243inline bool
244operator!=(const IP6FlowID &a, const IP6FlowID &b)
245{
246 return !(a == b);
247}
248
249CLICK_ENDDECLS
250#endif
An IPv4 address.
Definition ipaddress.hh:16
A network packet.
Definition packet.hh:68
Efficiently build up Strings from pieces.
Definition straccum.hh:28
A string of characters.
Definition string.hh:22