]> git.baikalelectronics.ru Git - kernel.git/commit
bonding: Add vlan tx offload to hw_enc_features
authorYueHaibing <yuehaibing@huawei.com>
Wed, 7 Aug 2019 02:19:59 +0000 (10:19 +0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 9 Aug 2019 05:01:44 +0000 (22:01 -0700)
commit0772aedaefb961943b04203814816da6300a63a6
tree4716612c5f6db0e48e3a2173cfaf2deea7d83e9e
parent9c77b11170e35b479a412053893703ef05a236fd
bonding: Add vlan tx offload to hw_enc_features

As commit a21180d9081f ("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 a21180d9081f 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: 0b7a1920dd77 ("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>
drivers/net/bonding/bond_main.c