Message ID | 1361772305-1665-1-git-send-email-pshelar@nicira.com |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
> -----Original Message----- > From: Pravin B Shelar [mailto:pshelar@nicira.com] > Sent: Monday, February 25, 2013 8:05 AM > To: davem@davemloft.net > Cc: netdev@vger.kernel.org; Dmitry Kravkov; Pravin B Shelar > Subject: [PATCH net-next 1/2] IP_GRE: Fix GRE_CSUM case. > > commit "ip_gre: allow CSUM capable devices to handle packets" > aa0e51cdda005cd37e2, 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: Pravin B Shelar <pshelar@nicira.com> > --- > net/ipv4/ip_gre.c | 12 ++++++++---- > 1 files changed, 8 insertions(+), 4 deletions(-) > > diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c > index 5ef4da7..9b4996d 100644 > --- a/net/ipv4/ip_gre.c > +++ b/net/ipv4/ip_gre.c > @@ -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; > -- > 1.7.1 Tested the series on two different devices Acked-by: Dmitry Kravkov <dmitry@broadcom.com> -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
From: "Dmitry Kravkov" <dmitry@broadcom.com> Date: Mon, 25 Feb 2013 11:40:06 +0000 >> -----Original Message----- >> From: Pravin B Shelar [mailto:pshelar@nicira.com] >> Sent: Monday, February 25, 2013 8:05 AM >> To: davem@davemloft.net >> Cc: netdev@vger.kernel.org; Dmitry Kravkov; Pravin B Shelar >> Subject: [PATCH net-next 1/2] IP_GRE: Fix GRE_CSUM case. >> >> commit "ip_gre: allow CSUM capable devices to handle packets" >> aa0e51cdda005cd37e2, 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: Pravin B Shelar <pshelar@nicira.com> ... > Tested the series on two different devices > > Acked-by: Dmitry Kravkov <dmitry@broadcom.com> > > Applied. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index 5ef4da7..9b4996d 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c @@ -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;
commit "ip_gre: allow CSUM capable devices to handle packets" aa0e51cdda005cd37e2, 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: Pravin B Shelar <pshelar@nicira.com> --- net/ipv4/ip_gre.c | 12 ++++++++---- 1 files changed, 8 insertions(+), 4 deletions(-)