| From foo@baz Mon Apr 9 17:09:24 CEST 2018 |
| From: "Mintz, Yuval" <Yuval.Mintz@cavium.com> |
| Date: Fri, 9 Jun 2017 17:17:01 +0300 |
| Subject: bnx2x: Allow vfs to disable txvlan offload |
| |
| From: "Mintz, Yuval" <Yuval.Mintz@cavium.com> |
| |
| |
| [ Upstream commit 92f85f05caa51d844af6ea14ffbc7a786446a644 ] |
| |
| VF clients are configured as enforced, meaning firmware is validating |
| the correctness of their ethertype/vid during transmission. |
| Once txvlan is disabled, VF would start getting SKBs for transmission |
| here vlan is on the payload - but it'll pass the packet's ethertype |
| instead of the vid, leading to firmware declaring it as malicious. |
| |
| Signed-off-by: Yuval Mintz <Yuval.Mintz@cavium.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | 19 +++++++++++++++---- |
| 1 file changed, 15 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c |
| +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c |
| @@ -3887,15 +3887,26 @@ netdev_tx_t bnx2x_start_xmit(struct sk_b |
| /* when transmitting in a vf, start bd must hold the ethertype |
| * for fw to enforce it |
| */ |
| + u16 vlan_tci = 0; |
| #ifndef BNX2X_STOP_ON_ERROR |
| - if (IS_VF(bp)) |
| + if (IS_VF(bp)) { |
| #endif |
| - tx_start_bd->vlan_or_ethertype = |
| - cpu_to_le16(ntohs(eth->h_proto)); |
| + /* Still need to consider inband vlan for enforced */ |
| + if (__vlan_get_tag(skb, &vlan_tci)) { |
| + tx_start_bd->vlan_or_ethertype = |
| + cpu_to_le16(ntohs(eth->h_proto)); |
| + } else { |
| + tx_start_bd->bd_flags.as_bitfield |= |
| + (X_ETH_INBAND_VLAN << |
| + ETH_TX_BD_FLAGS_VLAN_MODE_SHIFT); |
| + tx_start_bd->vlan_or_ethertype = |
| + cpu_to_le16(vlan_tci); |
| + } |
| #ifndef BNX2X_STOP_ON_ERROR |
| - else |
| + } else { |
| /* used by FW for packet accounting */ |
| tx_start_bd->vlan_or_ethertype = cpu_to_le16(pkt_prod); |
| + } |
| #endif |
| } |
| |