summaryrefslogtreecommitdiffstats
path: root/src/stateless/cp
diff options
context:
space:
mode:
authorimarom <imarom@cisco.com>2016-09-28 16:58:05 +0300
committerimarom <imarom@cisco.com>2016-09-28 17:04:27 +0300
commitbc02d31292c32469fe3d8fae6f529450512cf6f0 (patch)
tree1d4aada04622223e48b13771c62cabd4f5a68ccc /src/stateless/cp
parent5963a0384f1317d03f65247e96a82bef402b0be0 (diff)
performance measurements - class fix checksum does not work well
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));