Download raw body.
Bug or feature? TCP chksum fails when IPv6 packet carries ext. headers
Hi,
While working on some tests with IPv6 extension headers I noticed that
OpenBSD
drops TCP packets if there is any extension header (pf is disabled).
I managed to pinpoint the problem to the `in6_cksum` function as it doesn't
receive
the correct offset where to find the TCP header (thus "failing" and
dropping the packet).
Instead, it receives a fixed offset of 40 bytes a.k.a `sizeof(struct
ip6_hdr)`.
Applying the following diff fixed the issue.
Index: src/sys/netinet/tcp_input.c
===================================================================
RCS file: /cvs/src/sys/netinet/tcp_input.c,v
retrieving revision 1.431
diff -u -p -u -p -r1.431 tcp_input.c
--- src/sys/netinet/tcp_input.c 17 Feb 2025 08:56:33 -0000 1.431
+++ src/sys/netinet/tcp_input.c 28 Feb 2025 17:23:51 -0000
@@ -469,7 +469,7 @@ tcp_input(struct mbuf **mp, int *offp, i
break;
#ifdef INET6
case AF_INET6:
- sum = in6_cksum(m, IPPROTO_TCP, sizeof(struct ip6_hdr),
+ sum = in6_cksum(m, IPPROTO_TCP, iphlen,
tlen);
break;
#endif
As this was a trivial mistake I was wondering whether it was intentional.
As such, in OpenBSD,
are IPv6 packets carrying TCP as the upper layer protocol NOT supposed to
also carry ext. headers?
--
Best regards,
Giovanni
Bug or feature? TCP chksum fails when IPv6 packet carries ext. headers