diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_virtchnl.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_virtchnl.c | 57 | 
1 files changed, 50 insertions, 7 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice_virtchnl.c b/drivers/net/ethernet/intel/ice/ice_virtchnl.c index 094e3c97a1ea..2b4c791b6cba 100644 --- a/drivers/net/ethernet/intel/ice/ice_virtchnl.c +++ b/drivers/net/ethernet/intel/ice/ice_virtchnl.c @@ -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", @@ -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); @@ -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; @@ -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; +				} +			}  		}  	} @@ -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; @@ -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; +				}  			}  		}  	}  | 
