📄 ipflowid.hh
字号:
// -*- c-basic-offset: 2; related-file-name: "../../lib/ipflowid.cc" -*-#ifndef CLICK_IPFLOWID_HH#define CLICK_IPFLOWID_HH#include <click/ipaddress.hh>CLICK_DECLSclass Packet;class IPFlowID { public: IPFlowID(); IPFlowID(IPAddress, uint16_t, IPAddress, uint16_t); explicit IPFlowID(const Packet *); // reads ip_header and udp_header explicit IPFlowID(const click_ip *); // also reads adjacent TCP/UDP header operator bool() const; IPAddress saddr() const { return _saddr; } IPAddress daddr() const { return _daddr; } uint16_t sport() const { return _sport; } uint16_t dport() const { return _dport; } void set_saddr(IPAddress a) { _saddr = a; } void set_daddr(IPAddress a) { _daddr = a; } void set_sport(uint16_t p) { _sport = p; } // network order void set_dport(uint16_t p) { _dport = p; } // network order IPFlowID rev() const; String unparse() const; operator String() const { return unparse(); } String s() const { return unparse(); } protected: // note: several functions depend on this field order! IPAddress _saddr; IPAddress _daddr; uint16_t _sport; // network byte order uint16_t _dport; // network byte order};inlineIPFlowID::IPFlowID() : _saddr(), _daddr(), _sport(0), _dport(0){}inlineIPFlowID::IPFlowID(IPAddress saddr, uint16_t sport, IPAddress daddr, uint16_t dport) : _saddr(saddr), _daddr(daddr), _sport(sport), _dport(dport){}inlineIPFlowID::operator bool() const{ return _saddr || _daddr;}inline IPFlowIDIPFlowID::rev() const{ return IPFlowID(_daddr, _dport, _saddr, _sport);}#define ROT(v, r) ((v)<<(r) | ((unsigned)(v))>>(32-(r)))inline unsignedhashcode(const IPFlowID &f){ // more complicated hashcode, but causes less collision uint16_t s = ntohs(f.sport()); uint16_t d = ntohs(f.dport()); return (ROT(hashcode(f.saddr()), s%16) ^ ROT(hashcode(f.daddr()), 31-d%16)) ^ ((d << 16) | s);}#undef ROTinline booloperator==(const IPFlowID &a, const IPFlowID &b){ return a.dport() == b.dport() && a.sport() == b.sport() && a.daddr() == b.daddr() && a.saddr() == b.saddr();}inline booloperator!=(const IPFlowID &a, const IPFlowID &b){ return a.dport() != b.dport() || a.sport() != b.sport() || a.daddr() != b.daddr() || a.saddr() != b.saddr();}StringAccum &operator<<(StringAccum &, const IPFlowID &);CLICK_ENDDECLS#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -