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>
10class IP6FlowID {
public:
12 typedef uninitialized_type uninitialized_t;
24 inline IP6FlowID(
const IP6Address &, uint16_t,
const IP6Address &, uint16_t);
45 explicit IP6FlowID(
const Packet *,
bool reverse =
false);
54 explicit IP6FlowID(
const click_ip6 *ip6h,
bool reverse =
false);
66 explicit IP6FlowID(
const click_ip *iph,
bool reverse =
false);
73 explicit IP6FlowID(
const IPFlowID &);
77 inline IP6FlowID(
const uninitialized_type &unused) {
81 typedef const IP6Address &(IP6FlowID::*unspecified_bool_type)()
const;
82 inline operator unspecified_bool_type()
const;
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; }
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; }
103 void assign(
const IP6Address &saddr, uint16_t sport,
const IP6Address &daddr, uint16_t dport) {
122 inline IP6FlowID reverse()
const;
123 inline IP6FlowID rev() const CLICK_DEPRECATED;
127 inline
bool is_ip4_mapped()
const {
return _saddr.is_ip4_mapped(); }
133 IPFlowID flow_id4()
const;
138 IP6FlowID flow_id6()
const;
140 inline IP6FlowID &operator=(
const IPFlowID &);
142 inline hashcode_t hashcode()
const;
145 operator String()
const {
return unparse(); }
146 String s()
const {
return unparse(); }
159IP6FlowID::IP6FlowID()
160 : _saddr(), _daddr(), _sport(0), _dport(0)
165IP6FlowID::IP6FlowID(
const IP6Address &saddr, uint16_t sport,
166 const IP6Address &daddr, uint16_t dport)
167 : _saddr(saddr), _daddr(daddr), _sport(sport), _dport(dport)
172IP6FlowID::IP6FlowID(
const IPAddress &saddr, uint16_t sport,
174 : _saddr(saddr), _daddr(daddr), _sport(sport), _dport(dport)
179IP6FlowID::IP6FlowID(
const IPFlowID &flow)
185IP6FlowID::operator unspecified_bool_type()
const
187 return _saddr || _daddr ? &IP6FlowID::saddr : 0;
191IP6FlowID::reverse()
const
193 return IP6FlowID(_daddr, _dport, _saddr, _sport);
197IP6FlowID::rev()
const
203IP6FlowID::operator=(
const IPFlowID &f)
205 assign(f.saddr(), f.sport(), f.daddr(), f.dport());
209#define ROT(v, r) ((v)<<(r) | ((unsigned)(v))>>(32-(r)))
213IP6FlowID::hashcode()
const
215 return (ROT(_saddr.hashcode(), 13)
216 ^ ROT(_daddr.hashcode(), 23) ^ (_sport | (_dport<<16)));
220inline hashcode_t IP6FlowID::hashcode()
const
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)
237operator==(
const IP6FlowID &a,
const IP6FlowID &b)
239 return a.dport() == b.dport() && a.sport() == b.sport()
240 && a.daddr() == b.daddr() && a.saddr() == b.saddr();
244operator!=(
const IP6FlowID &a,
const IP6FlowID &b)
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