2#ifndef CLICK_IPFLOWID_HH
3#define CLICK_IPFLOWID_HH
5#include <click/hashcode.hh>
10class IPFlowID {
public:
12 typedef uninitialized_type uninitialized_t;
19 : _saddr(), _daddr(), _sport(0), _dport(0) {
28 : _saddr(saddr), _daddr(daddr), _sport(sport), _dport(dport) {
38 explicit IPFlowID(
const Packet *p,
bool reverse =
false);
48 explicit IPFlowID(
const click_ip *iph,
bool reverse =
false);
51 inline IPFlowID(
const uninitialized_type &unused) {
56 typedef IPAddress (IPFlowID::*unspecified_bool_type)() const;
58 operator unspecified_bool_type()
const {
59 return _saddr || _daddr ? &IPFlowID::saddr : 0;
68 uint16_t sport()
const {
76 uint16_t dport()
const {
86 void set_sport(uint16_t p) {
95 void set_dport(uint16_t p) {
114 IPFlowID reverse()
const {
115 return IPFlowID(_daddr, _dport, _saddr, _sport);
117 inline IPFlowID rev() const CLICK_DEPRECATED;
123 inline hashcode_t hashcode() const;
130 inline operator
String() const CLICK_DEPRECATED;
131 inline
String s() const CLICK_DEPRECATED;
141 int unparse(
char *s) const;
147inline IPFlowID IPFlowID::rev()
const
153#define ROT(v, r) ((v)<<(r) | ((unsigned)(v))>>(32-(r)))
155inline hashcode_t IPFlowID::hashcode()
const
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)))
167inline bool operator==(
const IPFlowID &a,
const IPFlowID &b)
169 return a.sport() == b.sport() && a.dport() == b.dport()
170 && a.saddr() == b.saddr() && a.daddr() == b.daddr();
173inline bool operator!=(
const IPFlowID &a,
const IPFlowID &b)
175 return a.sport() != b.sport() || a.dport() != b.dport()
176 || a.saddr() != b.saddr() || a.daddr() != b.daddr();
180inline IPFlowID
operator&(
const IPFlowID &a,
const IPFlowID &b)
182 return IPFlowID(a.saddr() & b.saddr(), a.sport() & b.sport(), a.daddr() & b.daddr(), a.dport() & b.dport());
187inline IPFlowID::operator
String()
const
192inline String IPFlowID::s()
const
197class IPFlow5ID :
public IPFlowID {
public:
205 explicit IPFlow5ID(
const Packet *p,
bool reverse =
false);
207 explicit IPFlow5ID() {
211 uint8_t proto()
const {
219 inline hashcode_t hashcode()
const;
232 int unparse(
char *s)
const;
233} CLICK_SIZE_PACKED_ATTRIBUTE ;
235inline bool operator==(
const IPFlow5ID &a,
const IPFlow5ID &b)
237 return a.sport() == b.sport() && a.dport() == b.dport()
238 && a.saddr() == b.saddr() && a.daddr() == b.daddr() && a.proto() == b.proto();
242inline hashcode_t IPFlow5ID::hashcode()
const
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();
254inline bool operator!=(
const IPFlow5ID &a,
const IPFlow5ID &b)
256 return a.sport() != b.sport() || a.dport() != b.dport()
257 || a.saddr() != b.saddr() || a.daddr() != b.daddr() || a.proto() != b.proto();
262 template <>
struct hash<IPFlow5ID>
264 size_t operator()(
const IPFlow5ID & x)
const
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.