Message ID | 1389318437-17744-1-git-send-email-ncardwell@google.com |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
On Thu, 2014-01-09 at 20:47 -0500, Neal Cardwell wrote: > Simplify the GRE header length calculation in gre_gso_segment(). > Switch to an approach that is simpler, faster, and more general. The > new approach will continue to be correct even if we add support for > the optional variable-length routing info that may be present in a GRE > header. > > Signed-off-by: Neal Cardwell <ncardwell@google.com> > Cc: Eric Dumazet <edumazet@google.com> > Cc: H.K. Jerry Chu <hkchu@google.com> > Cc: Pravin B Shelar <pshelar@nicira.com> > --- Acked-by: Eric Dumazet <edumazet@google.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: Eric Dumazet <eric.dumazet@gmail.com> Date: Thu, 09 Jan 2014 18:09:18 -0800 > On Thu, 2014-01-09 at 20:47 -0500, Neal Cardwell wrote: >> Simplify the GRE header length calculation in gre_gso_segment(). >> Switch to an approach that is simpler, faster, and more general. The >> new approach will continue to be correct even if we add support for >> the optional variable-length routing info that may be present in a GRE >> header. >> >> Signed-off-by: Neal Cardwell <ncardwell@google.com> >> Cc: Eric Dumazet <edumazet@google.com> >> Cc: H.K. Jerry Chu <hkchu@google.com> >> Cc: Pravin B Shelar <pshelar@nicira.com> >> --- > > Acked-by: Eric Dumazet <edumazet@google.com> Applied, thank you. -- 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/gre_offload.c b/net/ipv4/gre_offload.c index 746a7b1..f6604b6 100644 --- a/net/ipv4/gre_offload.c +++ b/net/ipv4/gre_offload.c @@ -26,7 +26,7 @@ static struct sk_buff *gre_gso_segment(struct sk_buff *skb, { struct sk_buff *segs = ERR_PTR(-EINVAL); netdev_features_t enc_features; - int ghl = GRE_HEADER_SECTION; + int ghl; struct gre_base_hdr *greh; u16 mac_offset = skb->mac_header; int mac_len = skb->mac_len; @@ -49,15 +49,11 @@ static struct sk_buff *gre_gso_segment(struct sk_buff *skb, greh = (struct gre_base_hdr *)skb_transport_header(skb); - if (greh->flags & GRE_KEY) - ghl += GRE_HEADER_SECTION; - if (greh->flags & GRE_SEQ) - ghl += GRE_HEADER_SECTION; - if (greh->flags & GRE_CSUM) { - ghl += GRE_HEADER_SECTION; - csum = true; - } else - csum = false; + ghl = skb_inner_network_header(skb) - skb_transport_header(skb); + if (unlikely(ghl < sizeof(*greh))) + goto out; + + csum = !!(greh->flags & GRE_CSUM); if (unlikely(!pskb_may_pull(skb, ghl))) goto out;
Simplify the GRE header length calculation in gre_gso_segment(). Switch to an approach that is simpler, faster, and more general. The new approach will continue to be correct even if we add support for the optional variable-length routing info that may be present in a GRE header. Signed-off-by: Neal Cardwell <ncardwell@google.com> Cc: Eric Dumazet <edumazet@google.com> Cc: H.K. Jerry Chu <hkchu@google.com> Cc: Pravin B Shelar <pshelar@nicira.com> --- net/ipv4/gre_offload.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-)