diff options
-rw-r--r-- | src/stateless/cp/trex_stream_vm.h | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/src/stateless/cp/trex_stream_vm.h b/src/stateless/cp/trex_stream_vm.h index a0de7b2e..4f500a44 100644 --- a/src/stateless/cp/trex_stream_vm.h +++ b/src/stateless/cp/trex_stream_vm.h @@ -499,15 +499,37 @@ public: } __attribute__((packed)); +static inline uint16_t fast_csum(const void *iph, unsigned int ihl) { + const uint16_t *ipv4 = (const uint16_t *)iph; + + int sum = 0; + for (int i = 0; i < (ihl >> 1); i++) { + sum += ipv4[i]; + } + + sum = (sum & 0xffff) + (sum >> 16); + + return (uint16_t)(~sum); +} + + struct StreamDPOpIpv4Fix { - uint8_t m_op; + uint8_t m_op; uint16_t m_offset; public: void dump(FILE *fd,std::string opt); - void run(uint8_t * pkt_base) { + inline void run(uint8_t * pkt_base) { + + uint8_t *ipv4 = pkt_base + m_offset; - IPHeader *ipv4 = (IPHeader *)(pkt_base+m_offset); - ipv4->updateCheckSumFast(); + IPHeader *ipv4h = (IPHeader *)(pkt_base + m_offset); + ipv4h->myChecksum = 0; + + if (ipv4h->myVer_HeaderLength == 0x45) { + ipv4h->myChecksum = fast_csum(ipv4, 20); + } else { + ipv4h->myChecksum = fast_csum(ipv4, ipv4h->getHeaderLength()); + } } } __attribute__((packed)); |