Try to prevent underrun / possible off by one
Checking for bigger value
This commit is contained in:
parent
86885760b2
commit
7599ebb89d
3 changed files with 18 additions and 13 deletions
|
@ -37,30 +37,33 @@ action v6sum() {
|
||||||
meta.v6sum = meta.v6sum + (bit<16>) hdr.ipv6.next_header; // 8 bit
|
meta.v6sum = meta.v6sum + (bit<16>) hdr.ipv6.next_header; // 8 bit
|
||||||
}
|
}
|
||||||
|
|
||||||
action delta_udp_from_v4_to_v6()
|
action delta_prepare()
|
||||||
{
|
{
|
||||||
v4sum();
|
v4sum();
|
||||||
v6sum();
|
v6sum();
|
||||||
bit<16> diff = meta.v6sum - meta.v4sum;
|
if(meta.v6sum > meta.v4sum) {
|
||||||
hdr.udp.checksum = hdr.udp.checksum + ~diff +1;
|
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()
|
action delta_tcp_from_v4_to_v6()
|
||||||
{
|
{
|
||||||
v4sum();
|
delta_prepare();
|
||||||
v6sum();
|
hdr.tcp.checksum = hdr.tcp.checksum + ~meta.headerdiff;
|
||||||
bit<16> diff = meta.v6sum - meta.v4sum;
|
|
||||||
hdr.tcp.checksum = hdr.tcp.checksum + ~diff +1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
action delta_ipv4_from_v6_to_v4()
|
action delta_ipv4_from_v6_to_v4()
|
||||||
{
|
{
|
||||||
v4sum();
|
delta_prepare();
|
||||||
v6sum();
|
hdr.tcp.checksum = hdr.tcp.checksum + ~meta.headerdiff;
|
||||||
bit<16> diff = meta.v4sum - meta.v6sum ;
|
|
||||||
hdr.tcp.checksum = hdr.tcp.checksum + ~diff +1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -234,6 +234,7 @@ struct metadata {
|
||||||
/* for delta checksums */
|
/* for delta checksums */
|
||||||
bit<16> v4sum;
|
bit<16> v4sum;
|
||||||
bit<16> v6sum;
|
bit<16> v6sum;
|
||||||
|
bit<16> headerdiff;
|
||||||
|
|
||||||
table_t table_id;
|
table_t table_id;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
meta.chk_tcp_v4 = 0;
|
meta.chk_tcp_v4 = 0;
|
||||||
meta.v4sum = 0;
|
meta.v4sum = 0;
|
||||||
meta.v6sum = 0;
|
meta.v6sum = 0;
|
||||||
|
meta.headerdiff = 0;
|
||||||
|
|
||||||
packet.extract(hdr.ethernet);
|
packet.extract(hdr.ethernet);
|
||||||
transition select(hdr.ethernet.ethertype){
|
transition select(hdr.ethernet.ethertype){
|
||||||
|
|
Loading…
Reference in a new issue