⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ipflowid.hh

📁 Click is a modular router toolkit. To use it you ll need to know how to compile and install the sof
💻 HH
字号:
// -*- related-file-name: "../../lib/ipflowid.cc" -*-#ifndef CLICK_IPFLOWID_HH#define CLICK_IPFLOWID_HH#include <click/ipaddress.hh>#include <click/hashcode.hh>CLICK_DECLSclass Packet;class IPFlowID { public:    struct uninitialized_t {    };    /** @brief Construct an empty flow ID.     *     * The empty flow ID has zero-valued addresses and ports. */    IPFlowID()	: _saddr(), _daddr(), _sport(0), _dport(0) {    }    /** @brief Construct a flow ID with the given parts.     * @param saddr source address     * @param sport source port, in network order     * @param daddr destination address     * @param dport destination port, in network order */    IPFlowID(IPAddress saddr, uint16_t sport, IPAddress daddr, uint16_t dport)	: _saddr(saddr), _daddr(daddr), _sport(sport), _dport(dport) {    }    /** @brief Construct a flow ID from @a p's ip_header() and udp_header().     * @param p input packet     * @param reverse if true, use the reverse of @a p's flow ID     *     * @pre @a p's ip_header() must point to a first-fragment IPv4 header, and     * @a p's transport header should have source and destination ports in the     * UDP-like positions; TCP, UDP, and DCCP fit the bill. */    explicit IPFlowID(const Packet *p, bool reverse = false);    /** @brief Construct a flow ID from @a iph and the following TCP/UDP header.     * @param iph IP header     * @param reverse if true, use the reverse of @a p's flow ID     *     * The IP header's header length, @a iph->ip_hl, is used to find the     * following transport header.  This transport header should have source     * and destination ports in the UDP-like positions; TCP, UDP, and DCCP fit     * the bill. */    explicit IPFlowID(const click_ip *iph, bool reverse = false);    /** @brief Construct an uninitialized flow ID. */    inline IPFlowID(const uninitialized_t &unused) {	(void) unused;    }    typedef IPAddress (IPFlowID::*unspecified_bool_type)() const;    /** @brief Return true iff the addresses of this flow ID are zero. */    operator unspecified_bool_type() const {	return _saddr || _daddr ? &IPFlowID::saddr : 0;    }    /** @brief Return this flow's source address. */    IPAddress saddr() const {	return _saddr;    }    /** @brief Return this flow's source port, in network order. */    uint16_t sport() const {	return _sport;    }    /** @brief Return this flow's destination address. */    IPAddress daddr() const {	return _daddr;    }    /** @brief Return this flow's destination port, in network order. */    uint16_t dport() const {	return _dport;    }    /** @brief Set this flow's source address to @a a. */    void set_saddr(IPAddress a) {	_saddr = a;    }    /** @brief Set this flow's source port to @a p.     * @note @a p should be in network order. */    void set_sport(uint16_t p) {	_sport = p;    }    /** @brief Set this flow's destination address to @a a. */    void set_daddr(IPAddress a) {	_daddr = a;    }    /** @brief Set this flow's destination port to @a p.     * @note @a p should be in network order. */    void set_dport(uint16_t p) {	_dport = p;    }    /** @brief Set this flow to the given value.     * @param saddr source address     * @param sport source port, in network order     * @param daddr destination address     * @param dport destination port, in network order */    void assign(IPAddress saddr, uint16_t sport, IPAddress daddr, uint16_t dport) {	_saddr = saddr;	_daddr = daddr;	_sport = sport;	_dport = dport;    }    /** @brief Return this flow's reverse, which swaps sources and destinations.     * @return IPFlowID(daddr(), dport(), saddr(), sport()) */    IPFlowID reverse() const {	return IPFlowID(_daddr, _dport, _saddr, _sport);    }    inline IPFlowID rev() const CLICK_DEPRECATED;    /** @brief Hash function.     * @return The hash value of this IPFlowID.     *     * Equal IPFlowID objects always have equal hashcode() values. */    inline hashcode_t hashcode() const;    /** @brief Unparse this address into a String.     *     * Returns a string with formatted like "(SADDR, SPORT, DADDR, DPORT)". */    String unparse() const;    inline operator String() const CLICK_DEPRECATED;    inline String s() const CLICK_DEPRECATED;  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    int unparse(char *s) const;    friend StringAccum &operator<<(StringAccum &sa, const IPFlowID &flow_id);};inline IPFlowID IPFlowID::rev() const{    return reverse();}#define ROT(v, r) ((v)<<(r) | ((unsigned)(v))>>(32-(r)))inline hashcode_t IPFlowID::hashcode() const{    // more complicated hashcode, but causes less collision    uint16_t s = ntohs(sport());    uint16_t d = ntohs(dport());    hashcode_t sx = CLICK_NAME(hashcode)(saddr());    hashcode_t dx = CLICK_NAME(hashcode)(daddr());    return (ROT(sx, s%16)	    ^ ROT(dx, 31-d%16))	^ ((d << 16) | s);}#undef ROTinline bool operator==(const IPFlowID &a, const IPFlowID &b){    return a.sport() == b.sport() && a.dport() == b.dport()	&& a.saddr() == b.saddr() && a.daddr() == b.daddr();}inline bool operator!=(const IPFlowID &a, const IPFlowID &b){    return a.sport() != b.sport() || a.dport() != b.dport()	|| a.saddr() != b.saddr() || a.daddr() != b.daddr();}StringAccum &operator<<(StringAccum &, const IPFlowID &);inline IPFlowID::operator String() const{    return unparse();}inline String IPFlowID::s() const{    return unparse();}CLICK_ENDDECLS#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -