diff mbox series

[ovs-dev] dp-packet: Correct IPv4 checksum calculation.

Message ID 20240726042846.591226-1-mkp@redhat.com
State Changes Requested, archived
Headers show
Series [ovs-dev] dp-packet: Correct IPv4 checksum calculation. | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test success github build: passed
ovsrobot/intel-ovs-compilation fail test: fail

Commit Message

Mike Pattrick July 26, 2024, 4:28 a.m. UTC
During the transition towards checksum offloading, the function to
handle software fallback of IPv4 checksums didn't account for the
options field.

Fixes: 5d11c47d3ebe ("userspace: Enable IP checksum offloading by default.")
Signed-off-by: Mike Pattrick <mkp@redhat.com>
---
 lib/dp-packet.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Ilya Maximets July 26, 2024, 11:56 a.m. UTC | #1
On 7/26/24 06:28, Mike Pattrick wrote:
> During the transition towards checksum offloading, the function to
> handle software fallback of IPv4 checksums didn't account for the
> options field.
> 
> Fixes: 5d11c47d3ebe ("userspace: Enable IP checksum offloading by default.")
> Signed-off-by: Mike Pattrick <mkp@redhat.com>

Hi, Mike.  Thanks for the patch!

Reported-at/by tags would be good to have here.

Also, please, add a test case for this issue.

> ---
>  lib/dp-packet.h | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/lib/dp-packet.h b/lib/dp-packet.h
> index a75b1c5cd..3e625571e 100644
> --- a/lib/dp-packet.h
> +++ b/lib/dp-packet.h
> @@ -1394,7 +1394,7 @@ dp_packet_ip_set_header_csum(struct dp_packet *p, bool inner)
>  
>      ovs_assert(ip);
>      ip->ip_csum = 0;
> -    ip->ip_csum = csum(ip, sizeof *ip);
> +    ip->ip_csum = csum(ip, IP_IHL(ip->ip_ihl_ver) * 4);

We need to check that the header length doesn't exceed the length of the
packet.  Packets that fail ipv4 header sanity checks still have their
l3_ofs set, so we may end up summing using the data from a malformed header.
We may still calculate a wrong checksum if the header is wrong, but within
the range, but we can't really do anything about that.

Another test for a short packet would be also good to have.

>  }
>  
>  /* Returns 'true' if the packet 'p' has good integrity and the


Best regards, Ilya Maximets.
diff mbox series

Patch

diff --git a/lib/dp-packet.h b/lib/dp-packet.h
index a75b1c5cd..3e625571e 100644
--- a/lib/dp-packet.h
+++ b/lib/dp-packet.h
@@ -1394,7 +1394,7 @@  dp_packet_ip_set_header_csum(struct dp_packet *p, bool inner)
 
     ovs_assert(ip);
     ip->ip_csum = 0;
-    ip->ip_csum = csum(ip, sizeof *ip);
+    ip->ip_csum = csum(ip, IP_IHL(ip->ip_ihl_ver) * 4);
 }
 
 /* Returns 'true' if the packet 'p' has good integrity and the