packet.hh
来自「COPE the first practical network coding 」· HH 代码 · 共 848 行 · 第 1/2 页
HH
848 行
}inline voidPacket::kill(){ struct sk_buff *b = skb(); b->next = b->prev = 0; b->list = 0; skbmgr_recycle_skbs(b);}#endif#ifdef CLICK_BSDMODULE /* BSD kernel module */inline voidPacket::assimilate_mbuf(Packet *p){ struct mbuf *m = p->m(); if (!m) return; p->_head = (unsigned char *) (m->m_flags & M_EXT ? m->m_ext.ext_buf : m->m_flags & M_PKTHDR ? m->m_pktdat : m->m_dat); p->_data = (unsigned char *)m->m_data; p->_tail = (unsigned char *)(m->m_data + m->m_len); p->_end = p->_head + ( m->m_flags & M_EXT ? MCLBYTES : m->m_flags & M_PKTHDR ? MHLEN : MLEN);}inline voidPacket::assimilate_mbuf(){ assimilate_mbuf(this);}inline Packet *Packet::make(struct mbuf *m){ if (!(m->m_flags & M_PKTHDR)) panic("trying to construct Packet from a non-packet mbuf"); Packet *p = new Packet; if (m->m_pkthdr.len != m->m_len) { /* click needs contiguous data */ // click_chatter("m_pulldown, Click needs contiguous data"); if (m_pulldown(m, 0, m->m_pkthdr.len, NULL) == NULL) panic("m_pulldown failed"); } p->_m = m; assimilate_mbuf(p); return p;}#endifinline boolPacket::shared() const{#ifdef CLICK_LINUXMODULE /* Linux kernel module */ return skb_cloned(const_cast<struct sk_buff *>(skb()));#else /* User-space or BSD kernel module */ return (_data_packet || _use_count > 1);#endif}inline WritablePacket *Packet::uniqueify(){ if (!shared()) return static_cast<WritablePacket *>(this); else return expensive_uniqueify(0, 0, true);}inline WritablePacket *Packet::push(uint32_t nbytes){ if (headroom() >= nbytes && !shared()) { WritablePacket *q = (WritablePacket *)this;#ifdef CLICK_LINUXMODULE /* Linux kernel module */ __skb_push(q->skb(), nbytes);#else /* User-space and BSD kernel module */ q->_data -= nbytes;# ifdef CLICK_BSDMODULE q->m()->m_data -= nbytes; q->m()->m_len += nbytes; q->m()->m_pkthdr.len += nbytes;# endif#endif return q; } else return expensive_push(nbytes);}inline Packet *Packet::nonunique_push(uint32_t nbytes){ if (headroom() >= nbytes) {#ifdef CLICK_LINUXMODULE /* Linux kernel module */ __skb_push(skb(), nbytes);#else /* User-space and BSD kernel module */ _data -= nbytes;# ifdef CLICK_BSDMODULE m()->m_data -= nbytes; m()->m_len += nbytes; m()->m_pkthdr.len += nbytes;# endif#endif return this; } else return expensive_push(nbytes);}/* Get rid of some bytes at the start of a packet */inline voidPacket::pull(uint32_t nbytes){ if (nbytes > length()) { click_chatter("Packet::pull %d > length %d\n", nbytes, length()); nbytes = length(); }#ifdef CLICK_LINUXMODULE /* Linux kernel module */ __skb_pull(skb(), nbytes);#else /* User-space and BSD kernel module */ _data += nbytes;# ifdef CLICK_BSDMODULE m()->m_data += nbytes; m()->m_len -= nbytes; m()->m_pkthdr.len -= nbytes;# endif#endif}inline WritablePacket *Packet::put(uint32_t nbytes){ if (tailroom() >= nbytes && !shared()) { WritablePacket *q = (WritablePacket *)this;#ifdef CLICK_LINUXMODULE /* Linux kernel module */ __skb_put(q->skb(), nbytes);#else /* User-space and BSD kernel module */ q->_tail += nbytes;# ifdef CLICK_BSDMODULE q->m()->m_len += nbytes; q->m()->m_pkthdr.len += nbytes;# endif#endif return q; } else return expensive_put(nbytes);}inline Packet *Packet::nonunique_put(uint32_t nbytes){ if (tailroom() >= nbytes) {#ifdef CLICK_LINUXMODULE /* Linux kernel module */ __skb_put(skb(), nbytes);#else /* User-space and BSD kernel module */ _tail += nbytes;# ifdef CLICK_BSDMODULE m()->m_len += nbytes; m()->m_pkthdr.len += nbytes;# endif#endif return this; } else return expensive_put(nbytes);}/* Get rid of some bytes at the end of a packet */inline voidPacket::take(uint32_t nbytes){ if (nbytes > length()) { click_chatter("Packet::take %d > length %d\n", nbytes, length()); nbytes = length(); }#ifdef CLICK_LINUXMODULE /* Linux kernel module */ skb()->tail -= nbytes; skb()->len -= nbytes;#else /* User-space and BSD kernel module */ _tail -= nbytes;# ifdef CLICK_BSDMODULE m()->m_len -= nbytes; m()->m_pkthdr.len -= nbytes;# endif#endif}#ifdef CLICK_USERLEVELinline voidPacket::shrink_data(const unsigned char *d, uint32_t length){ assert(_data_packet); if (d >= _head && d + length >= d && d + length <= _end) { _head = _data = const_cast<unsigned char *>(d); _tail = _end = const_cast<unsigned char *>(d + length); }}inline voidPacket::change_headroom_and_length(uint32_t headroom, uint32_t length){ if (headroom + length <= buffer_length()) { _data = _head + headroom; _tail = _data + length; }}#endifinline const IP6Address &Packet::dst_ip6_anno() const{ return reinterpret_cast<const IP6Address &>(anno()->addr.c);}inline voidPacket::set_dst_ip6_anno(const IP6Address &a){ memcpy(anno()->addr.c, &a, 16);}inline IPAddress Packet::dst_ip_anno() const{ return IPAddress(anno()->addr.ip4);}inline void Packet::set_dst_ip_anno(IPAddress a){ anno()->addr.ip4 = a.addr(); }inline voidPacket::set_mac_header(const unsigned char *h){#ifdef CLICK_LINUXMODULE /* Linux kernel module */ skb()->mac.raw = const_cast<unsigned char *>(h);#else /* User-space and BSD kernel module */ _mac.raw = const_cast<unsigned char *>(h);#endif}inline voidPacket::set_mac_header(const unsigned char *h, uint32_t len){#ifdef CLICK_LINUXMODULE /* Linux kernel module */ skb()->mac.raw = const_cast<unsigned char *>(h); skb()->nh.raw = const_cast<unsigned char *>(h) + len;#else /* User-space and BSD kernel module */ _mac.raw = const_cast<unsigned char *>(h); _nh.raw = const_cast<unsigned char *>(h) + len;#endif}inline voidPacket::set_ether_header(const click_ether *h){ set_mac_header(reinterpret_cast<const unsigned char *>(h), 14);}inline WritablePacket *Packet::push_mac_header(uint32_t nbytes){ WritablePacket *q; if (headroom() >= nbytes && !shared()) { q = (WritablePacket *)this;#ifdef CLICK_LINUXMODULE /* Linux kernel module */ __skb_push(q->skb(), nbytes);#else /* User-space and BSD kernel module */ q->_data -= nbytes;# ifdef CLICK_BSDMODULE q->m()->m_data -= nbytes; q->m()->m_len += nbytes; q->m()->m_pkthdr.len += nbytes;# endif#endif } else if ((q = expensive_push(nbytes))) /* nada */; else return 0; q->set_mac_header(q->data(), nbytes); return q;}inline voidPacket::set_network_header(const unsigned char *h, uint32_t len){#ifdef CLICK_LINUXMODULE /* Linux kernel module */ skb()->nh.raw = const_cast<unsigned char *>(h); skb()->h.raw = const_cast<unsigned char *>(h) + len;#else /* User-space and BSD kernel module */ _nh.raw = const_cast<unsigned char *>(h); _h.raw = const_cast<unsigned char *>(h) + len;#endif}inline voidPacket::set_network_header_length(uint32_t len){#ifdef CLICK_LINUXMODULE /* Linux kernel module */ skb()->h.raw = skb()->nh.raw + len;#else /* User-space and BSD kernel module */ _h.raw = _nh.raw + len;#endif}inline voidPacket::set_ip_header(const click_ip *iph, uint32_t len){ set_network_header(reinterpret_cast<const unsigned char *>(iph), len);}inline voidPacket::set_ip6_header(const click_ip6 *ip6h, uint32_t len){ set_network_header(reinterpret_cast<const unsigned char *>(ip6h), len);}inline voidPacket::set_ip6_header(const click_ip6 *ip6h){ set_ip6_header(ip6h, 40);}inline intPacket::mac_header_offset() const{ return mac_header() - data();}inline uint32_tPacket::mac_header_length() const{ return network_header() - mac_header();}inline intPacket::network_header_offset() const{ return network_header() - data();}inline uint32_tPacket::network_header_length() const{ return transport_header() - network_header();}inline intPacket::ip_header_offset() const{ return network_header_offset();}inline uint32_tPacket::ip_header_length() const{ return network_header_length();}inline intPacket::ip6_header_offset() const{ return network_header_offset();}inline uint32_tPacket::ip6_header_length() const{ return network_header_length();}inline intPacket::transport_header_offset() const{ return transport_header() - data();}inline voidPacket::clear_annotations(){ memset(anno(), '\0', sizeof(Anno)); set_packet_type_anno(HOST); set_device_anno(0); set_timestamp_anno(Timestamp()); set_mac_header(0); set_network_header(0, 0); set_next(0);}inline voidPacket::copy_annotations(const Packet *p){ *anno() = *p->anno(); set_packet_type_anno(p->packet_type_anno()); set_device_anno(p->device_anno()); set_timestamp_anno(p->timestamp_anno());}inline voidPacket::shift_header_annotations(int32_t shift){#if CLICK_USERLEVEL || CLICK_BSDMODULE _mac.raw += (_mac.raw ? shift : 0); _nh.raw += (_nh.raw ? shift : 0); _h.raw += (_h.raw ? shift : 0);#else struct sk_buff *mskb = skb(); mskb->mac.raw += (mskb->mac.raw ? shift : 0); mskb->nh.raw += (mskb->nh.raw ? shift : 0); mskb->h.raw += (mskb->h.raw ? shift : 0);#endif}CLICK_ENDDECLS#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?