All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] net/i40e: fix vlan promisc setting
@ 2017-04-01  6:15 Wenzhuo Lu
  2017-04-03 13:38 ` [dpdk-stable] " Ferruh Yigit
  0 siblings, 1 reply; 2+ messages in thread
From: Wenzhuo Lu @ 2017-04-01  6:15 UTC (permalink / raw)
  To: dev; +Cc: Wenzhuo Lu, stable

After adding VLAN filter, the VLAN promiscuous mode is
disabled. But there's no chance to enable it.
So add the check after deleting VLAN filter. If there's
no VLAN filter left, enable the VLAN promiscuous mode.

Fixes: 310dac2fde07 ("net/i40e: fix VLAN filter issue")
Cc: stable@dpdk.org

Signed-off-by: Wenzhuo Lu <wenzhuo.lu@intel.com>
---
 drivers/net/i40e/i40e_ethdev.c | 42 +++++++++++++++++++++++++++++++++++++++---
 1 file changed, 39 insertions(+), 3 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 00079bb..63ca029 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -11448,6 +11448,32 @@ int rte_pmd_i40e_set_vf_vlan_tag(uint8_t port, uint16_t vf_id, uint8_t on)
 	return ret;
 }
 
+static int
+i40e_vlan_filter_count(struct i40e_vsi *vsi)
+{
+	uint32_t j, k;
+	uint16_t vlan_id;
+	int count = 0;
+
+	for (j = 0; j < I40E_VFTA_SIZE; j++) {
+		if (!vsi->vfta[j])
+			continue;
+
+		for (k = 0; k < I40E_UINT32_BIT_SIZE; k++) {
+			if (!(vsi->vfta[j] & (1 << k)))
+				continue;
+
+			vlan_id = j * I40E_UINT32_BIT_SIZE + k;
+			if (!vlan_id)
+				continue;
+
+			count++;
+		}
+	}
+
+	return count;
+}
+
 int rte_pmd_i40e_set_vf_vlan_filter(uint8_t port, uint16_t vlan_id,
 				    uint64_t vf_mask, uint8_t on)
 {
@@ -11465,7 +11491,7 @@ int rte_pmd_i40e_set_vf_vlan_filter(uint8_t port, uint16_t vlan_id,
 	if (!is_device_supported(dev, &rte_i40e_pmd))
 		return -ENOTSUP;
 
-	if (vlan_id > ETHER_MAX_VLAN_ID) {
+	if (vlan_id > ETHER_MAX_VLAN_ID || !vlan_id) {
 		PMD_DRV_LOG(ERR, "Invalid VLAN ID.");
 		return -EINVAL;
 	}
@@ -11499,15 +11525,25 @@ int rte_pmd_i40e_set_vf_vlan_filter(uint8_t port, uint16_t vlan_id,
 			if (on) {
 				if (!vsi->vlan_filter_on) {
 					vsi->vlan_filter_on = true;
+					i40e_aq_set_vsi_vlan_promisc(hw,
+								     vsi->seid,
+								     false,
+								     NULL);
 					if (!vsi->vlan_anti_spoof_on)
 						i40e_add_rm_all_vlan_filter(
 							vsi, true);
 				}
-				i40e_aq_set_vsi_vlan_promisc(hw, vsi->seid,
-							     false, NULL);
 				ret = i40e_vsi_add_vlan(vsi, vlan_id);
 			} else {
 				ret = i40e_vsi_delete_vlan(vsi, vlan_id);
+
+				if (!i40e_vlan_filter_count(vsi)) {
+					vsi->vlan_filter_on = false;
+					i40e_aq_set_vsi_vlan_promisc(hw,
+								     vsi->seid,
+								     true,
+								     NULL);
+				}
 			}
 		}
 	}
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [dpdk-stable] [PATCH] net/i40e: fix vlan promisc setting
  2017-04-01  6:15 [PATCH] net/i40e: fix vlan promisc setting Wenzhuo Lu
@ 2017-04-03 13:38 ` Ferruh Yigit
  0 siblings, 0 replies; 2+ messages in thread
From: Ferruh Yigit @ 2017-04-03 13:38 UTC (permalink / raw)
  To: Wenzhuo Lu, dev; +Cc: stable

On 4/1/2017 7:15 AM, Wenzhuo Lu wrote:
> After adding VLAN filter, the VLAN promiscuous mode is
> disabled. But there's no chance to enable it.
> So add the check after deleting VLAN filter. If there's
> no VLAN filter left, enable the VLAN promiscuous mode.
> 
> Fixes: 310dac2fde07 ("net/i40e: fix VLAN filter issue")

> 
> Signed-off-by: Wenzhuo Lu <wenzhuo.lu@intel.com>

Applied to dpdk-next-net/master, thanks.

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2017-04-03 13:38 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-04-01  6:15 [PATCH] net/i40e: fix vlan promisc setting Wenzhuo Lu
2017-04-03 13:38 ` [dpdk-stable] " Ferruh Yigit

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.