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

📄 xorheader_general.hh

📁 COPE the first practical network coding scheme which is developped on click
💻 HH
字号:
#ifndef CLICK_XORHEADERN_HH#define CLICK_XORHEADERN_HH#include <clicknet/ip.h>#include <clicknet/tcp.h>#include <elements/wifi/sr/srpacket.hh>CLICK_SIZE_PACKED_STRUCTURE(struct click_xorn_header {,  uint8_t _nentries;  uint16_t _cksum;   // One unit of the xor header  CLICK_SIZE_PACKED_STRUCTURE(  struct xor_unit {,    uint16_t _ether_type;    uint8_t _alias; // destination of the packet    uint8_t _nhops; // no of hops on the SR, decides SR header size    uint32_t _src; // src IP (along with IP ID, uniquely identifies pkt)    uint16_t _ipid; // IP ID    uint8_t _ipttl; // IP TTL of the packet you coded    uint16_t _len;      // bunch of fields for helping the snooper log stuff    // DO NOT USE THESE FIELDS FOR THE ACTUAL PROTOCOL    uint32_t _dst; // IP dst    uint16_t _iplen; // ip_len field    uint8_t _proto; // ip_proto field    uint16_t _sport; // source port for TCP or UDP    uint16_t _dport; // dst port for TCP or UDP    tcp_seq_t _tcp_seq; // TCP sequence number    tcp_seq_t _tcp_ack; // TCP ack number    uint8_t _tcp_flags; // tcp th_flags fields    // END ADDITIONAL FIELDS    void set_entry(uint16_t ether_type, uint8_t alias, uint8_t nhops, uint32_t src, uint16_t ipid, uint8_t ipttl, uint16_t len) {      _ether_type = htons(ether_type);      _alias = alias;      _nhops = nhops;      _src = src;      _ipid = htons(ipid);      _ipttl = ipttl;      _len = htons(len);    }    // FOR ADDITIONAL FIELDS    void set_entry_additional(uint32_t dst, uint16_t iplen, uint8_t proto, uint16_t sport, uint16_t dport, tcp_seq_t tcp_seq, tcp_seq_t tcp_ack, uint8_t tcp_flags) {      _dst = dst;      _iplen = htons(iplen);      _proto = proto;      _sport = htons(sport);      _dport = htons(dport);      _tcp_seq = htonl(tcp_seq);      _tcp_ack = htonl(tcp_ack);      _tcp_flags = tcp_flags;    }    // END ADDITIONAL FIELDS  });  struct xor_unit _unit;  void set_entry(int entry_index, uint16_t ether_type, uint8_t alias, uint8_t nhops, uint32_t src, uint16_t ipid, uint8_t ipttl, uint16_t len) {    uint8_t *ndx = (uint8_t *) (this+1);    ndx += (entry_index - 1) * sizeof(struct xor_unit);       struct xor_unit *unit = (struct xor_unit*)ndx;    unit->set_entry(ether_type, alias, nhops, src, ipid, ipttl, len);  }  void set_entry_additional(int entry_index, uint32_t dst, uint16_t iplen, uint8_t proto, uint16_t sport, uint16_t dport, tcp_seq_t tcp_seq, tcp_seq_t tcp_ack, uint8_t tcp_flags) {    uint8_t *ndx = (uint8_t *) (this+1);    ndx += (entry_index - 1) * sizeof(struct xor_unit);       struct xor_unit *unit = (struct xor_unit*)ndx;    unit->set_entry_additional(dst, iplen, proto, sport, dport, tcp_seq, tcp_ack, tcp_flags);  }  uint16_t get_entry_ethtype(int entry_index) {    uint8_t *ndx = (uint8_t *) (this+1);    ndx += (entry_index - 1) * sizeof(struct xor_unit);       struct xor_unit *unit = (struct xor_unit*)ndx;    return ntohs(unit->_ether_type);  }  uint8_t get_entry_alias(int entry_index) {    uint8_t *ndx = (uint8_t *) (this+1);    ndx += (entry_index - 1) * sizeof(struct xor_unit);       struct xor_unit *unit = (struct xor_unit*)ndx;    return unit->_alias;  }  uint8_t get_entry_nhops(int entry_index) {    uint8_t *ndx = (uint8_t *) (this+1);    ndx += (entry_index - 1) * sizeof(struct xor_unit);       struct xor_unit *unit = (struct xor_unit*)ndx;    return unit->_nhops;  }  uint32_t get_entry_src(int entry_index) {    uint8_t *ndx = (uint8_t *) (this+1);    ndx += (entry_index - 1) * sizeof(struct xor_unit);       struct xor_unit *unit = (struct xor_unit*)ndx;    return unit->_src;  }  uint16_t get_entry_ipid(int entry_index) {    uint8_t *ndx = (uint8_t *) (this+1);    ndx += (entry_index - 1) * sizeof(struct xor_unit);       struct xor_unit *unit = (struct xor_unit*)ndx;    return ntohs(unit->_ipid);  }  uint8_t get_entry_ipttl(int entry_index) {    uint8_t *ndx = (uint8_t *) (this+1);    ndx += (entry_index - 1) * sizeof(struct xor_unit);       struct xor_unit *unit = (struct xor_unit*)ndx;    return unit->_ipttl;  }  uint16_t get_entry_len(int entry_index) {    uint8_t *ndx = (uint8_t *) (this+1);    ndx += (entry_index - 1) * sizeof(struct xor_unit);       struct xor_unit *unit = (struct xor_unit*)ndx;    return ntohs(unit->_len);  }  // ALL THIS IS FOR THE ADDITIONAL FIELDS  uint32_t get_entry_dst(int entry_index) {    uint8_t *ndx = (uint8_t *) (this+1);    ndx += (entry_index - 1) * sizeof(struct xor_unit);       struct xor_unit *unit = (struct xor_unit*)ndx;    return unit->_dst;  }    uint16_t get_entry_iplen(int entry_index) {    uint8_t *ndx = (uint8_t *) (this+1);    ndx += (entry_index - 1) * sizeof(struct xor_unit);       struct xor_unit *unit = (struct xor_unit*)ndx;    return ntohs(unit->_iplen);  }  uint8_t get_entry_proto(int entry_index) {    uint8_t *ndx = (uint8_t *) (this+1);    ndx += (entry_index - 1) * sizeof(struct xor_unit);       struct xor_unit *unit = (struct xor_unit*)ndx;    return unit->_proto;  }  uint16_t get_entry_sport(int entry_index) {    uint8_t *ndx = (uint8_t *) (this+1);    ndx += (entry_index - 1) * sizeof(struct xor_unit);       struct xor_unit *unit = (struct xor_unit*)ndx;    return ntohs(unit->_sport);  }  uint16_t get_entry_dport(int entry_index) {    uint8_t *ndx = (uint8_t *) (this+1);    ndx += (entry_index - 1) * sizeof(struct xor_unit);       struct xor_unit *unit = (struct xor_unit*)ndx;    return ntohs(unit->_dport);  }  tcp_seq_t get_entry_tcp_seq(int entry_index) {    uint8_t *ndx = (uint8_t *) (this+1);    ndx += (entry_index - 1) * sizeof(struct xor_unit);       struct xor_unit *unit = (struct xor_unit*)ndx;    return ntohl(unit->_tcp_seq);  }  tcp_seq_t get_entry_tcp_ack(int entry_index) {    uint8_t *ndx = (uint8_t *) (this+1);    ndx += (entry_index - 1) * sizeof(struct xor_unit);       struct xor_unit *unit = (struct xor_unit*)ndx;    return ntohl(unit->_tcp_ack);  }  uint8_t get_entry_tcp_flags(int entry_index) {    uint8_t *ndx = (uint8_t *) (this+1);    ndx += (entry_index - 1) * sizeof(struct xor_unit);       struct xor_unit *unit = (struct xor_unit*)ndx;    return unit->_tcp_flags;  }  // END ADDITIONAL FIELDS  void set_nentries(int n) {    _nentries = n;  }  static size_t get_hlen(int nentries) {    return sizeof(struct click_xorn_header) + (sizeof(struct xor_unit) * (nentries-1));  }  size_t nentries() {    return _nentries;  }  size_t get_sr_size() {    size_t sr_size = 0;    for (int i = 0; i < _nentries; i++) {      sr_size += srpacket::len_wo_data(get_entry_nhops(i));    }    return sr_size;  }    size_t get_sr_size_upto(int idx) {    size_t sr_size = 0;    for (int i = 0; i < idx; i++) {      sr_size += srpacket::len_wo_data(get_entry_nhops(i));    }    return sr_size;  }  void set_checksum() {    unsigned int max_len = 0;    for (unsigned int i = 0; i < nentries(); i++) {      if (get_entry_len(i) > max_len) max_len = get_entry_len(i);    }    max_len += get_hlen(_nentries);    max_len += get_sr_size();    _cksum = 0;    _cksum = click_in_cksum((unsigned char *)this, max_len);  }});    #endif

⌨️ 快捷键说明

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