When rcd->tcp is set based on the inner TCP header of a Geneve-encapsulated packet that exceeds MTU and is non-LRO, the driver hits BUG_ON(hdr.ipv4->protocol != IPPROTO_TCP) in vmxnet3_get_hdr_len() because the outer IPv4 protocol is UDP (Geneve), not TCP. Convert this BUG_ON to return 0, letting the caller's existing hlen == 0 check skip the LRO path gracefully. Also convert the preceding BUG_ON(gdesc->rcd.tcp == 0) assertion to return 0 defensively. Fixes: 45dac1d6ea04 ("vmxnet3: Changes for vmxnet3 adapter version 2 (fwd)") Signed-off-by: Harshaka Narayana Signed-off-by: Ronak Doshi Signed-off-by: Sankararaman Jayaraman --- drivers/net/vmxnet3/vmxnet3_drv.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c index 40522afc0532..f706cacfa70f 100644 --- a/drivers/net/vmxnet3/vmxnet3_drv.c +++ b/drivers/net/vmxnet3/vmxnet3_drv.c @@ -1530,7 +1530,8 @@ vmxnet3_get_hdr_len(struct vmxnet3_adapter *adapter, struct sk_buff *skb, struct ipv6hdr *ipv6; struct tcphdr *tcp; } hdr; - BUG_ON(gdesc->rcd.tcp == 0); + if (gdesc->rcd.tcp == 0) + return 0; maplen = skb_headlen(skb); if (unlikely(sizeof(struct iphdr) + sizeof(struct tcphdr) > maplen)) @@ -1547,7 +1548,9 @@ vmxnet3_get_hdr_len(struct vmxnet3_adapter *adapter, struct sk_buff *skb, BUG_ON(hdr.eth->h_proto != htons(ETH_P_IP) && hdr.veth->h_vlan_encapsulated_proto != htons(ETH_P_IP)); hdr.ptr += hlen; - BUG_ON(hdr.ipv4->protocol != IPPROTO_TCP); + if (hdr.ipv4->protocol != IPPROTO_TCP) + return 0; + hlen = hdr.ipv4->ihl << 2; hdr.ptr += hdr.ipv4->ihl << 2; } else if (gdesc->rcd.v6) { -- 2.52.0