summaryrefslogtreecommitdiffstats
path: root/src/stateless/cp
diff options
context:
space:
mode:
Diffstat (limited to 'src/stateless/cp')
-rw-r--r--src/stateless/cp/trex_stream_vm.h30
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));