mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 17:47:41 +02:00
vmxnet3_get_hdr_len() assumes gdesc->rcd.v4/v6/tcp always describe the
outer header, but for a Geneve-encapsulated packet the device can set
them based on the inner header instead, signalled by the
VMXNET3_RCD_HDR_INNER_SHIFT bit in the completion descriptor. Since the
function never skips the outer encapsulation, this mismatch triggers:
- BUG_ON(hdr.ipv4->protocol != IPPROTO_TCP), because the outer
protocol is UDP (Geneve), not TCP.
- BUG_ON(hdr.eth->h_proto != ...), when the tunnel's outer and inner
IP versions differ (e.g. outer IPv6/inner IPv4 or vice versa).
Check VMXNET3_RCD_HDR_INNER_SHIFT up front and bail out, since the
function cannot locate the inner header it would need to parse. Also
convert the remaining BUG_ON()s in this function to return 0
defensively.
Fixes:
|
||
|---|---|---|
| .. | ||
| Makefile | ||
| upt1_defs.h | ||
| vmxnet3_defs.h | ||
| vmxnet3_drv.c | ||
| vmxnet3_ethtool.c | ||
| vmxnet3_int.h | ||
| vmxnet3_xdp.c | ||
| vmxnet3_xdp.h | ||