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 + -
显示快捷键?