From 7599ebb89d7cbbb7e90587a4eb0e08c5eaa675dc Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 13 Jul 2019 18:05:50 +0200 Subject: [PATCH] Try to prevent underrun / possible off by one Checking for bigger value --- p4src/actions_delta_checksum.p4 | 29 ++++++++++++++++------------- p4src/headers.p4 | 1 + p4src/parsers.p4 | 1 + 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/p4src/actions_delta_checksum.p4 b/p4src/actions_delta_checksum.p4 index 7b03af3..0a1b9de 100644 --- a/p4src/actions_delta_checksum.p4 +++ b/p4src/actions_delta_checksum.p4 @@ -37,30 +37,33 @@ action v6sum() { meta.v6sum = meta.v6sum + (bit<16>) hdr.ipv6.next_header; // 8 bit } -action delta_udp_from_v4_to_v6() +action delta_prepare() { v4sum(); v6sum(); - bit<16> diff = meta.v6sum - meta.v4sum; - hdr.udp.checksum = hdr.udp.checksum + ~diff +1; + if(meta.v6sum > meta.v4sum) { + meta.headerdiff = meta.v6sum - meta.v4sum; + } else { + meta.headerdiff = meta.v4sum - meta.v6sum; + } +} + +action delta_udp_from_v4_to_v6() +{ + delta_prepare(); + hdr.udp.checksum = hdr.udp.checksum + ~meta.headerdiff; } action delta_tcp_from_v4_to_v6() { - v4sum(); - v6sum(); - bit<16> diff = meta.v6sum - meta.v4sum; - hdr.tcp.checksum = hdr.tcp.checksum + ~diff +1; + delta_prepare(); + hdr.tcp.checksum = hdr.tcp.checksum + ~meta.headerdiff; } action delta_ipv4_from_v6_to_v4() { - v4sum(); - v6sum(); - bit<16> diff = meta.v4sum - meta.v6sum ; - hdr.tcp.checksum = hdr.tcp.checksum + ~diff +1; + delta_prepare(); + hdr.tcp.checksum = hdr.tcp.checksum + ~meta.headerdiff; } - - #endif \ No newline at end of file diff --git a/p4src/headers.p4 b/p4src/headers.p4 index 36ee76d..fc20d51 100644 --- a/p4src/headers.p4 +++ b/p4src/headers.p4 @@ -234,6 +234,7 @@ struct metadata { /* for delta checksums */ bit<16> v4sum; bit<16> v6sum; + bit<16> headerdiff; table_t table_id; } diff --git a/p4src/parsers.p4 b/p4src/parsers.p4 index 97887e3..25bada6 100644 --- a/p4src/parsers.p4 +++ b/p4src/parsers.p4 @@ -15,6 +15,7 @@ meta.chk_tcp_v4 = 0; meta.v4sum = 0; meta.v6sum = 0; + meta.headerdiff = 0; packet.extract(hdr.ethernet); transition select(hdr.ethernet.ethertype){