Skip to content

Commit

Permalink
ice: Fix VF not able to send tagged traffic with no VLAN filters
Browse files Browse the repository at this point in the history
VF was not able to send tagged traffic when it didn't
have any VLAN interfaces and VLAN anti-spoofing was enabled.
Fix this by allowing VFs with no VLAN filters to send tagged
traffic. After VF adds a VLAN interface it will be able to
send tagged traffic matching VLAN filters only.

Testing hints:
1. Spawn VF
2. Send tagged packet from a VF
3. The packet should be sent out and not dropped
4. Add a VLAN interface on VF
5. Send tagged packet on that VLAN interface
6. Packet should be sent out and not dropped
7. Send tagged packet with id different than VLAN interface
8. Packet should be dropped

Fixes: daf4dd1 ("ice: Refactor spoofcheck configuration functions")
Signed-off-by: Sylwester Dziedziuch <[email protected]>
Signed-off-by: Mateusz Palczewski <[email protected]>
Tested-by: Konrad Jankowski <[email protected]>
Signed-off-by: Tony Nguyen <[email protected]>
  • Loading branch information
sylwesterdziedziuch authored and anguy11 committed Aug 17, 2022
1 parent 79956b8 commit 664d464
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 11 deletions.
11 changes: 7 additions & 4 deletions drivers/net/ethernet/intel/ice/ice_vf_lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -764,13 +764,16 @@ static int ice_cfg_mac_antispoof(struct ice_vsi *vsi, bool enable)
static int ice_vsi_ena_spoofchk(struct ice_vsi *vsi)
{
struct ice_vsi_vlan_ops *vlan_ops;
int err;
int err = 0;

vlan_ops = ice_get_compat_vsi_vlan_ops(vsi);

err = vlan_ops->ena_tx_filtering(vsi);
if (err)
return err;
/* Allow VF with VLAN 0 only to send all tagged traffic */
if (vsi->type != ICE_VSI_VF || ice_vsi_has_non_zero_vlans(vsi)) {
err = vlan_ops->ena_tx_filtering(vsi);
if (err)
return err;
}

return ice_cfg_mac_antispoof(vsi, true);
}
Expand Down
57 changes: 50 additions & 7 deletions drivers/net/ethernet/intel/ice/ice_virtchnl.c
Original file line number Diff line number Diff line change
Expand Up @@ -2288,6 +2288,15 @@ static int ice_vc_process_vlan_msg(struct ice_vf *vf, u8 *msg, bool add_v)

/* Enable VLAN filtering on first non-zero VLAN */
if (!vlan_promisc && vid && !ice_is_dvm_ena(&pf->hw)) {
if (vf->spoofchk) {
status = vsi->inner_vlan_ops.ena_tx_filtering(vsi);
if (status) {
v_ret = VIRTCHNL_STATUS_ERR_PARAM;
dev_err(dev, "Enable VLAN anti-spoofing on VLAN ID: %d failed error-%d\n",
vid, status);
goto error_param;
}
}
if (vsi->inner_vlan_ops.ena_rx_filtering(vsi)) {
v_ret = VIRTCHNL_STATUS_ERR_PARAM;
dev_err(dev, "Enable VLAN pruning on VLAN ID: %d failed error-%d\n",
Expand Down Expand Up @@ -2333,8 +2342,10 @@ static int ice_vc_process_vlan_msg(struct ice_vf *vf, u8 *msg, bool add_v)
}

/* Disable VLAN filtering when only VLAN 0 is left */
if (!ice_vsi_has_non_zero_vlans(vsi))
if (!ice_vsi_has_non_zero_vlans(vsi)) {
vsi->inner_vlan_ops.dis_tx_filtering(vsi);
vsi->inner_vlan_ops.dis_rx_filtering(vsi);
}

if (vlan_promisc)
ice_vf_dis_vlan_promisc(vsi, &vlan);
Expand Down Expand Up @@ -2838,6 +2849,13 @@ ice_vc_del_vlans(struct ice_vf *vf, struct ice_vsi *vsi,

if (vlan_promisc)
ice_vf_dis_vlan_promisc(vsi, &vlan);

/* Disable VLAN filtering when only VLAN 0 is left */
if (!ice_vsi_has_non_zero_vlans(vsi) && ice_is_dvm_ena(&vsi->back->hw)) {
err = vsi->outer_vlan_ops.dis_tx_filtering(vsi);
if (err)
return err;
}
}

vc_vlan = &vlan_fltr->inner;
Expand All @@ -2853,8 +2871,17 @@ ice_vc_del_vlans(struct ice_vf *vf, struct ice_vsi *vsi,
/* no support for VLAN promiscuous on inner VLAN unless
* we are in Single VLAN Mode (SVM)
*/
if (!ice_is_dvm_ena(&vsi->back->hw) && vlan_promisc)
ice_vf_dis_vlan_promisc(vsi, &vlan);
if (!ice_is_dvm_ena(&vsi->back->hw)) {
if (vlan_promisc)
ice_vf_dis_vlan_promisc(vsi, &vlan);

/* Disable VLAN filtering when only VLAN 0 is left */
if (!ice_vsi_has_non_zero_vlans(vsi)) {
err = vsi->inner_vlan_ops.dis_tx_filtering(vsi);
if (err)
return err;
}
}
}
}

Expand Down Expand Up @@ -2931,6 +2958,13 @@ ice_vc_add_vlans(struct ice_vf *vf, struct ice_vsi *vsi,
if (err)
return err;
}

/* Enable VLAN filtering on first non-zero VLAN */
if (vf->spoofchk && vlan.vid && ice_is_dvm_ena(&vsi->back->hw)) {
err = vsi->outer_vlan_ops.ena_tx_filtering(vsi);
if (err)
return err;
}
}

vc_vlan = &vlan_fltr->inner;
Expand All @@ -2946,10 +2980,19 @@ ice_vc_add_vlans(struct ice_vf *vf, struct ice_vsi *vsi,
/* no support for VLAN promiscuous on inner VLAN unless
* we are in Single VLAN Mode (SVM)
*/
if (!ice_is_dvm_ena(&vsi->back->hw) && vlan_promisc) {
err = ice_vf_ena_vlan_promisc(vsi, &vlan);
if (err)
return err;
if (!ice_is_dvm_ena(&vsi->back->hw)) {
if (vlan_promisc) {
err = ice_vf_ena_vlan_promisc(vsi, &vlan);
if (err)
return err;
}

/* Enable VLAN filtering on first non-zero VLAN */
if (vf->spoofchk && vlan.vid) {
err = vsi->inner_vlan_ops.ena_tx_filtering(vsi);
if (err)
return err;
}
}
}
}
Expand Down

0 comments on commit 664d464

Please sign in to comment.