📄 xorheader_general.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 + -