Commit 2c2d06d5 authored by Yuval Mintz's avatar Yuval Mintz Committed by David S. Miller

bnx2x: prevent GRO false checksum claims

This patch introduces a more robust error handling flow in case of incorrect
behaviour by the FW when passing on GRO aggregations.

Although this should never happen (i.e., this is merely a theoretical fix),
if the bnx2x driver was to receive a GRO from FW with protocol other than
IPv4/IPv6, the driver would falsely claim to have performed partial
checksum and set various incorrect fields in the skb header.

Current behaviour of the bnx2x driver (i.e., print an error) is insufficient.
This patch remedies this by simply preventing the false claims.
Signed-off-by: default avatarYuval Mintz <yuvalmin@broadcom.com>
Signed-off-by: default avatarAriel Elior <ariele@broadcom.com>
Signed-off-by: default avatarEilon Greenstein <eilong@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 09960769
...@@ -642,6 +642,14 @@ static void bnx2x_gro_ipv6_csum(struct bnx2x *bp, struct sk_buff *skb) ...@@ -642,6 +642,14 @@ static void bnx2x_gro_ipv6_csum(struct bnx2x *bp, struct sk_buff *skb)
th->check = ~tcp_v6_check(skb->len - skb_transport_offset(skb), th->check = ~tcp_v6_check(skb->len - skb_transport_offset(skb),
&iph->saddr, &iph->daddr, 0); &iph->saddr, &iph->daddr, 0);
} }
static void bnx2x_gro_csum(struct bnx2x *bp, struct sk_buff *skb,
void (*gro_func)(struct bnx2x*, struct sk_buff*))
{
skb_set_network_header(skb, 0);
gro_func(bp, skb);
tcp_gro_complete(skb);
}
#endif #endif
static void bnx2x_gro_receive(struct bnx2x *bp, struct bnx2x_fastpath *fp, static void bnx2x_gro_receive(struct bnx2x *bp, struct bnx2x_fastpath *fp,
...@@ -649,19 +657,17 @@ static void bnx2x_gro_receive(struct bnx2x *bp, struct bnx2x_fastpath *fp, ...@@ -649,19 +657,17 @@ static void bnx2x_gro_receive(struct bnx2x *bp, struct bnx2x_fastpath *fp,
{ {
#ifdef CONFIG_INET #ifdef CONFIG_INET
if (skb_shinfo(skb)->gso_size) { if (skb_shinfo(skb)->gso_size) {
skb_set_network_header(skb, 0);
switch (be16_to_cpu(skb->protocol)) { switch (be16_to_cpu(skb->protocol)) {
case ETH_P_IP: case ETH_P_IP:
bnx2x_gro_ip_csum(bp, skb); bnx2x_gro_csum(bp, skb, bnx2x_gro_ip_csum);
break; break;
case ETH_P_IPV6: case ETH_P_IPV6:
bnx2x_gro_ipv6_csum(bp, skb); bnx2x_gro_csum(bp, skb, bnx2x_gro_ipv6_csum);
break; break;
default: default:
BNX2X_ERR("FW GRO supports only IPv4/IPv6, not 0x%04x\n", BNX2X_ERR("Error: FW GRO supports only IPv4/IPv6, not 0x%04x\n",
be16_to_cpu(skb->protocol)); be16_to_cpu(skb->protocol));
} }
tcp_gro_complete(skb);
} }
#endif #endif
napi_gro_receive(&fp->napi, skb); napi_gro_receive(&fp->napi, skb);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment