| From: YueHaibing <yuehaibing@huawei.com> |
| Date: Wed, 7 Aug 2019 10:19:59 +0800 |
| Subject: bonding: Add vlan tx offload to hw_enc_features |
| |
| commit d595b03de2cb0bdf9bcdf35ff27840cc3a37158f upstream. |
| |
| 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> |
| [bwh: Backported to 3.16: adjust context] |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| --- a/drivers/net/bonding/bond_main.c |
| +++ b/drivers/net/bonding/bond_main.c |
| @@ -1083,7 +1083,9 @@ static void bond_compute_features(struct |
| |
| done: |
| bond_dev->vlan_features = vlan_features; |
| - bond_dev->hw_enc_features = enc_features; |
| + bond_dev->hw_enc_features = enc_features | |
| + NETIF_F_HW_VLAN_CTAG_TX | |
| + NETIF_F_HW_VLAN_STAG_TX; |
| bond_dev->hard_header_len = max_hard_header_len; |
| bond_dev->gso_max_segs = gso_max_segs; |
| netif_set_gso_max_size(bond_dev, gso_max_size); |