lkml.org 
[lkml]   [2019]   [Aug]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 78/78] bonding: Add vlan tx offload to hw_enc_features
    Date
    From: YueHaibing <yuehaibing@huawei.com>

    [ Upstream commit d595b03de2cb0bdf9bcdf35ff27840cc3a37158f ]

    As commit 30d8177e8ac7 ("bonding: Always enable vlan tx offload")
    said, we should always enable bonding's vlan tx offload, pass the
    vlan packets to the slave devices with vlan tci, let them to handle
    vlan implementation.

    Now if encapsulation protocols like VXLAN is used, skb->encapsulation
    may be set, then the packet is passed to vlan device which based on
    bonding device. However in netif_skb_features(), the check of
    hw_enc_features:

    if (skb->encapsulation)
    features &= dev->hw_enc_features;

    clears NETIF_F_HW_VLAN_CTAG_TX/NETIF_F_HW_VLAN_STAG_TX. This results
    in same issue in commit 30d8177e8ac7 like this:

    vlan_dev_hard_start_xmit
    -->dev_queue_xmit
    -->validate_xmit_skb
    -->netif_skb_features //NETIF_F_HW_VLAN_CTAG_TX is cleared
    -->validate_xmit_vlan
    -->__vlan_hwaccel_push_inside //skb->tci is cleared
    ...
    --> bond_start_xmit
    --> bond_xmit_hash //BOND_XMIT_POLICY_ENCAP34
    --> __skb_flow_dissect // nhoff point to IP header
    --> case htons(ETH_P_8021Q)
    // skb_vlan_tag_present is false, so
    vlan = __skb_header_pointer(skb, nhoff, sizeof(_vlan),
    //vlan point to ip header wrongly

    Fixes: b2a103e6d0af ("bonding: convert to ndo_fix_features")
    Signed-off-by: YueHaibing <yuehaibing@huawei.com>
    Acked-by: Jay Vosburgh <jay.vosburgh@canonical.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/net/bonding/bond_main.c | 4 +++-
    1 file changed, 3 insertions(+), 1 deletion(-)

    --- a/drivers/net/bonding/bond_main.c
    +++ b/drivers/net/bonding/bond_main.c
    @@ -1111,7 +1111,9 @@ static void bond_compute_features(struct

    done:
    bond_dev->vlan_features = vlan_features;
    - bond_dev->hw_enc_features = enc_features | NETIF_F_GSO_ENCAP_ALL;
    + bond_dev->hw_enc_features = enc_features | NETIF_F_GSO_ENCAP_ALL |
    + NETIF_F_HW_VLAN_CTAG_TX |
    + NETIF_F_HW_VLAN_STAG_TX;
    bond_dev->gso_max_segs = gso_max_segs;
    netif_set_gso_max_size(bond_dev, gso_max_size);


    \
     
     \ /
      Last update: 2019-08-22 19:56    [W:4.173 / U:0.140 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site