Click
Loading...
Searching...
No Matches
ipflowid.hh
1// -*- related-file-name: "../../lib/ipflowid.cc" -*-
2#ifndef CLICK_IPFLOWID_HH
3#define CLICK_IPFLOWID_HH
4#include <click/ipaddress.hh>
5#include <click/hashcode.hh>
6#include <functional>
7CLICK_DECLS
8class Packet;
9
10class IPFlowID { public:
11
12 typedef uninitialized_type uninitialized_t;
13
14
18 explicit IPFlowID()
19 : _saddr(), _daddr(), _sport(0), _dport(0) {
20 }
21
27 explicit IPFlowID(IPAddress saddr, uint16_t sport, IPAddress daddr, uint16_t dport)
28 : _saddr(saddr), _daddr(daddr), _sport(sport), _dport(dport) {
29 }
30
38 explicit IPFlowID(const Packet *p, bool reverse = false);
39
48 explicit IPFlowID(const click_ip *iph, bool reverse = false);
49
51 inline IPFlowID(const uninitialized_type &unused) {
52 (void) unused;
53 }
54
55
56 typedef IPAddress (IPFlowID::*unspecified_bool_type)() const;
58 operator unspecified_bool_type() const {
59 return _saddr || _daddr ? &IPFlowID::saddr : 0;
60 }
61
62
64 IPAddress saddr() const {
65 return _saddr;
66 }
68 uint16_t sport() const {
69 return _sport;
70 }
72 IPAddress daddr() const {
73 return _daddr;
74 }
76 uint16_t dport() const {
77 return _dport;
78 }
79
81 void set_saddr(IPAddress a) {
82 _saddr = a;
83 }
86 void set_sport(uint16_t p) {
87 _sport = p;
88 }
90 void set_daddr(IPAddress a) {
91 _daddr = a;
92 }
95 void set_dport(uint16_t p) {
96 _dport = p;
97 }
98
104 void assign(IPAddress saddr, uint16_t sport, IPAddress daddr, uint16_t dport) {
105 _saddr = saddr;
106 _daddr = daddr;
107 _sport = sport;
108 _dport = dport;
109 }
110
111
114 IPFlowID reverse() const {
115 return IPFlowID(_daddr, _dport, _saddr, _sport);
116 }
117 inline IPFlowID rev() const CLICK_DEPRECATED;
118
123 inline hashcode_t hashcode() const;
124
128 String unparse() const;
129
130 inline operator String() const CLICK_DEPRECATED;
131 inline String s() const CLICK_DEPRECATED;
132
133 protected:
134
135 // note: several functions depend on this field order!
136 IPAddress _saddr;
137 IPAddress _daddr;
138 uint16_t _sport; // network byte order
139 uint16_t _dport; // network byte order
140
141 int unparse(char *s) const;
142 friend StringAccum &operator<<(StringAccum &sa, const IPFlowID &flow_id);
143
144};
145
146
147inline IPFlowID IPFlowID::rev() const
148{
149 return reverse();
150}
151
152
153#define ROT(v, r) ((v)<<(r) | ((unsigned)(v))>>(32-(r)))
154
155inline hashcode_t IPFlowID::hashcode() const
156{
157 // more complicated hashcode, but causes less collision
158 uint16_t s = ntohs(sport());
159 uint16_t d = ntohs(dport());
160 hashcode_t sx = CLICK_NAME(hashcode)(saddr());
161 hashcode_t dx = CLICK_NAME(hashcode)(daddr());
162 return (ROT(sx, (s % 16) + 1) ^ ROT(dx, 31 - (d % 16)))
163 ^ ((d << 16) | s);
164}
165
166
167inline bool operator==(const IPFlowID &a, const IPFlowID &b)
168{
169 return a.sport() == b.sport() && a.dport() == b.dport()
170 && a.saddr() == b.saddr() && a.daddr() == b.daddr();
171}
172
173inline bool operator!=(const IPFlowID &a, const IPFlowID &b)
174{
175 return a.sport() != b.sport() || a.dport() != b.dport()
176 || a.saddr() != b.saddr() || a.daddr() != b.daddr();
177}
178
179
180inline IPFlowID operator&(const IPFlowID &a, const IPFlowID &b)
181{
182 return IPFlowID(a.saddr() & b.saddr(), a.sport() & b.sport(), a.daddr() & b.daddr(), a.dport() & b.dport());
183}
184
185StringAccum &operator<<(StringAccum &, const IPFlowID &);
186
187inline IPFlowID::operator String() const
188{
189 return unparse();
190}
191
192inline String IPFlowID::s() const
193{
194 return unparse();
195}
196
197class IPFlow5ID : public IPFlowID { public:
205 explicit IPFlow5ID(const Packet *p, bool reverse = false);
206
207 explicit IPFlow5ID() {
208 _zero = 0;
209 };
210
211 uint8_t proto() const {
212 return _proto;
213 }
214
219 inline hashcode_t hashcode() const;
220
221
225 String unparse() const;
226
227
228protected:
229 uint8_t _proto;
230 uint8_t _zero;
231
232 int unparse(char *s) const;
233} CLICK_SIZE_PACKED_ATTRIBUTE ;
234
235inline bool operator==(const IPFlow5ID &a, const IPFlow5ID &b)
236{
237 return a.sport() == b.sport() && a.dport() == b.dport()
238 && a.saddr() == b.saddr() && a.daddr() == b.daddr() && a.proto() == b.proto();
239}
240
241
242inline hashcode_t IPFlow5ID::hashcode() const
243{
244 // more complicated hashcode, but causes less collision
245 uint16_t s = ntohs(sport());
246 uint16_t d = ntohs(dport());
247 hashcode_t sx = CLICK_NAME(hashcode)(saddr());
248 hashcode_t dx = CLICK_NAME(hashcode)(daddr());
249 return (ROT(sx, (s % 16) + 1) ^ ROT(dx, 31 - (d % 16)))
250 ^ ((d << 16) | s) ^ proto();
251}
252
253#undef ROT
254inline bool operator!=(const IPFlow5ID &a, const IPFlow5ID &b)
255{
256 return a.sport() != b.sport() || a.dport() != b.dport()
257 || a.saddr() != b.saddr() || a.daddr() != b.daddr() || a.proto() != b.proto();
258}
259
260
261namespace std {
262 template <> struct hash<IPFlow5ID>
263 {
264 size_t operator()(const IPFlow5ID & x) const
265 {
266 return x.hashcode();
267 }
268 };
269}
270
271CLICK_ENDDECLS
272#endif
Bitvector operator&(Bitvector a, const Bitvector &b)
Return the bitwise and of two bitvectors.
Definition bitvector.hh:299
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
The IPAddress type for IPv4 addresses.