Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8f10098f authored by Pravin B Shelar's avatar Pravin B Shelar Committed by David S. Miller
Browse files

IP_GRE: Fix GRE_CSUM case.



commit "ip_gre: allow CSUM capable devices to handle packets"
aa0e51cd, broke GRE_CSUM case.
GRE_CSUM needs checksum computed for inner packet. Therefore
csum-calculation can not be offloaded if tunnel device requires
GRE_CSUM.  Following patch fixes it by computing inner packet checksum
for GRE_CSUM type, for all other type of GRE devices csum is offloaded.

CC: Dmitry Kravkov <dmitry@broadcom.com>
Signed-off-by: default avatarPravin B Shelar <pshelar@nicira.com>
Acked-by: default avatarDmitry Kravkov <dmitry@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 8dc98eb2
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -735,7 +735,7 @@ drop:
	return 0;
}

static struct sk_buff *handle_offloads(struct sk_buff *skb)
static struct sk_buff *handle_offloads(struct ip_tunnel *tunnel, struct sk_buff *skb)
{
	int err;

@@ -745,8 +745,12 @@ static struct sk_buff *handle_offloads(struct sk_buff *skb)
			goto error;
		skb_shinfo(skb)->gso_type |= SKB_GSO_GRE;
		return skb;
	}
	if (skb->ip_summed != CHECKSUM_PARTIAL)
	} else if (skb->ip_summed == CHECKSUM_PARTIAL &&
		   tunnel->parms.o_flags&GRE_CSUM) {
		err = skb_checksum_help(skb);
		if (unlikely(err))
			goto error;
	} else if (skb->ip_summed != CHECKSUM_PARTIAL)
		skb->ip_summed = CHECKSUM_NONE;

	return skb;
@@ -776,7 +780,7 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev
	int    err;
	int    pkt_len;

	skb = handle_offloads(skb);
	skb = handle_offloads(tunnel, skb);
	if (IS_ERR(skb)) {
		dev->stats.tx_dropped++;
		return NETDEV_TX_OK;