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

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
...@@ -735,7 +735,7 @@ static int ipgre_rcv(struct sk_buff *skb) ...@@ -735,7 +735,7 @@ static int ipgre_rcv(struct sk_buff *skb)
return 0; 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; int err;
...@@ -745,8 +745,12 @@ static struct sk_buff *handle_offloads(struct sk_buff *skb) ...@@ -745,8 +745,12 @@ static struct sk_buff *handle_offloads(struct sk_buff *skb)
goto error; goto error;
skb_shinfo(skb)->gso_type |= SKB_GSO_GRE; skb_shinfo(skb)->gso_type |= SKB_GSO_GRE;
return skb; return skb;
} } else if (skb->ip_summed == CHECKSUM_PARTIAL &&
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; skb->ip_summed = CHECKSUM_NONE;
return skb; return skb;
...@@ -776,7 +780,7 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev ...@@ -776,7 +780,7 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev
int err; int err;
int pkt_len; int pkt_len;
skb = handle_offloads(skb); skb = handle_offloads(tunnel, skb);
if (IS_ERR(skb)) { if (IS_ERR(skb)) {
dev->stats.tx_dropped++; dev->stats.tx_dropped++;
return NETDEV_TX_OK; return NETDEV_TX_OK;
......
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