lkml.org 
[lkml]   [2015]   [Sep]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.14 75/84] net: gso: use feature flag argument in all protocol gso handlers
    Date
    3.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Florian Westphal <fw@strlen.de>

    [ Upstream commit 1e16aa3ddf863c6b9f37eddf52503230a62dedb3 ]

    skb_gso_segment() has a 'features' argument representing offload features
    available to the output path.

    A few handlers, e.g. GRE, instead re-fetch the features of skb->dev and use
    those instead of the provided ones when handing encapsulation/tunnels.

    Depending on dev->hw_enc_features of the output device skb_gso_segment() can
    then return NULL even when the caller has disabled all GSO feature bits,
    as segmentation of inner header thinks device will take care of segmentation.

    This e.g. affects the tbf scheduler, which will silently drop GRE-encap GSO skbs
    that did not fit the remaining token quota as the segmentation does not work
    when device supports corresponding hw offload capabilities.

    Cc: Pravin B Shelar <pshelar@nicira.com>
    Signed-off-by: Florian Westphal <fw@strlen.de>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    [jay.vosburgh: backported to 3.14. ]
    Signed-off-by: Jay Vosburgh <jay.vosburgh@canonical.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    net/ipv4/af_inet.c | 2 +-
    net/ipv4/gre_offload.c | 2 +-
    net/ipv4/udp.c | 2 +-
    net/ipv6/ip6_offload.c | 2 +-
    net/mpls/mpls_gso.c | 2 +-
    5 files changed, 5 insertions(+), 5 deletions(-)

    --- a/net/ipv4/af_inet.c
    +++ b/net/ipv4/af_inet.c
    @@ -1291,7 +1291,7 @@ static struct sk_buff *inet_gso_segment(

    encap = SKB_GSO_CB(skb)->encap_level > 0;
    if (encap)
    - features = skb->dev->hw_enc_features & netif_skb_features(skb);
    + features &= skb->dev->hw_enc_features;
    SKB_GSO_CB(skb)->encap_level += ihl;

    skb_reset_transport_header(skb);
    --- a/net/ipv4/gre_offload.c
    +++ b/net/ipv4/gre_offload.c
    @@ -69,7 +69,7 @@ static struct sk_buff *gre_gso_segment(s
    skb->mac_len = skb_inner_network_offset(skb);

    /* segment inner packet. */
    - enc_features = skb->dev->hw_enc_features & netif_skb_features(skb);
    + enc_features = skb->dev->hw_enc_features & features;
    segs = skb_mac_gso_segment(skb, enc_features);
    if (!segs || IS_ERR(segs)) {
    skb_gso_error_unwind(skb, protocol, ghl, mac_offset, mac_len);
    --- a/net/ipv4/udp.c
    +++ b/net/ipv4/udp.c
    @@ -2517,7 +2517,7 @@ struct sk_buff *skb_udp_tunnel_segment(s
    skb->protocol = htons(ETH_P_TEB);

    /* segment inner packet. */
    - enc_features = skb->dev->hw_enc_features & netif_skb_features(skb);
    + enc_features = skb->dev->hw_enc_features & features;
    segs = skb_mac_gso_segment(skb, enc_features);
    if (!segs || IS_ERR(segs)) {
    skb_gso_error_unwind(skb, protocol, tnl_hlen, mac_offset,
    --- a/net/ipv6/ip6_offload.c
    +++ b/net/ipv6/ip6_offload.c
    @@ -112,7 +112,7 @@ static struct sk_buff *ipv6_gso_segment(

    encap = SKB_GSO_CB(skb)->encap_level > 0;
    if (encap)
    - features = skb->dev->hw_enc_features & netif_skb_features(skb);
    + features &= skb->dev->hw_enc_features;
    SKB_GSO_CB(skb)->encap_level += sizeof(*ipv6h);

    ipv6h = ipv6_hdr(skb);
    --- a/net/mpls/mpls_gso.c
    +++ b/net/mpls/mpls_gso.c
    @@ -47,7 +47,7 @@ static struct sk_buff *mpls_gso_segment(
    __skb_push(skb, skb->mac_len);

    /* Segment inner packet. */
    - mpls_features = skb->dev->mpls_features & netif_skb_features(skb);
    + mpls_features = skb->dev->mpls_features & features;
    segs = skb_mac_gso_segment(skb, mpls_features);





    \
     
     \ /
      Last update: 2015-09-29 17:41    [W:4.187 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site