[PATCH net] vmxnet3: Don't enable vlan filters in promiscuous mode.

Subsystems: networking drivers, the rest, vmware vmxnet3 ethernet driver

STALE5543d

5 messages, 3 authors, 2011-08-14 · open the first message on its own page

[PATCH net] vmxnet3: Don't enable vlan filters in promiscuous mode.

From: Jesse Gross <hidden>
Date: 2011-08-08 09:15:59

The vmxnet3 driver enables vlan filters if filtering is enabled for
any vlan.  In promiscuous mode the filter table is cleared to in
order to disable filtering.  However, if a vlan device is subsequently
created that vlan will be added to the filter, re-engaging it.  As a
result, not only do we not see all the vlans in promiscuous mode, we
don't even see vlans for which a filter was previously created.

CC: Scott J. Goldman <redacted>
CC: Shreyas Bhatewara <redacted>
CC: VMware PV-Drivers <redacted>
Signed-off-by: Jesse Gross <redacted>
---
 drivers/net/vmxnet3/vmxnet3_drv.c |   34 ++++++++++++++++++++--------------
 1 files changed, 20 insertions(+), 14 deletions(-)
diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c
index 1cbacb3..0959583 100644
--- a/drivers/net/vmxnet3/vmxnet3_drv.c
+++ b/drivers/net/vmxnet3/vmxnet3_drv.c
@@ -1929,14 +1929,17 @@ static void
 vmxnet3_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
 {
 	struct vmxnet3_adapter *adapter = netdev_priv(netdev);
-	u32 *vfTable = adapter->shared->devRead.rxFilterConf.vfTable;
-	unsigned long flags;
 
-	VMXNET3_SET_VFTABLE_ENTRY(vfTable, vid);
-	spin_lock_irqsave(&adapter->cmd_lock, flags);
-	VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,
-			       VMXNET3_CMD_UPDATE_VLAN_FILTERS);
-	spin_unlock_irqrestore(&adapter->cmd_lock, flags);
+	if (!(netdev->flags & IFF_PROMISC)) {
+		u32 *vfTable = adapter->shared->devRead.rxFilterConf.vfTable;
+		unsigned long flags;
+
+		VMXNET3_SET_VFTABLE_ENTRY(vfTable, vid);
+		spin_lock_irqsave(&adapter->cmd_lock, flags);
+		VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,
+				       VMXNET3_CMD_UPDATE_VLAN_FILTERS);
+		spin_unlock_irqrestore(&adapter->cmd_lock, flags);
+	}
 
 	set_bit(vid, adapter->active_vlans);
 }
@@ -1946,14 +1949,17 @@ static void
 vmxnet3_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
 {
 	struct vmxnet3_adapter *adapter = netdev_priv(netdev);
-	u32 *vfTable = adapter->shared->devRead.rxFilterConf.vfTable;
-	unsigned long flags;
 
-	VMXNET3_CLEAR_VFTABLE_ENTRY(vfTable, vid);
-	spin_lock_irqsave(&adapter->cmd_lock, flags);
-	VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,
-			       VMXNET3_CMD_UPDATE_VLAN_FILTERS);
-	spin_unlock_irqrestore(&adapter->cmd_lock, flags);
+	if (!(netdev->flags & IFF_PROMISC)) {
+		u32 *vfTable = adapter->shared->devRead.rxFilterConf.vfTable;
+		unsigned long flags;
+
+		VMXNET3_CLEAR_VFTABLE_ENTRY(vfTable, vid);
+		spin_lock_irqsave(&adapter->cmd_lock, flags);
+		VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,
+				       VMXNET3_CMD_UPDATE_VLAN_FILTERS);
+		spin_unlock_irqrestore(&adapter->cmd_lock, flags);
+	}
 
 	clear_bit(vid, adapter->active_vlans);
 }
-- 
1.7.4.1

Re: [PATCH net] vmxnet3: Don't enable vlan filters in promiscuous mode.

From: Shreyas Bhatewara <hidden>
Date: 2011-08-09 21:32:18


On Mon, 8 Aug 2011, Jesse Gross wrote:
quoted hunk
@@ -1929,14 +1929,17 @@ static void
 vmxnet3_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
 {
 	struct vmxnet3_adapter *adapter = netdev_priv(netdev);
-	u32 *vfTable = adapter->shared->devRead.rxFilterConf.vfTable;
-	unsigned long flags;
 
-	VMXNET3_SET_VFTABLE_ENTRY(vfTable, vid);
-	spin_lock_irqsave(&adapter->cmd_lock, flags);
-	VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,
-			       VMXNET3_CMD_UPDATE_VLAN_FILTERS);
-	spin_unlock_irqrestore(&adapter->cmd_lock, flags);
+	if (!(netdev->flags & IFF_PROMISC)) {
+		u32 *vfTable = adapter->shared->devRead.rxFilterConf.vfTable;
+		unsigned long flags;
+
+		VMXNET3_SET_VFTABLE_ENTRY(vfTable, vid);
+		spin_lock_irqsave(&adapter->cmd_lock, flags);
+		VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,
+				       VMXNET3_CMD_UPDATE_VLAN_FILTERS);
+		spin_unlock_irqrestore(&adapter->cmd_lock, flags);
+	}
 
If this is done, the driver will ignore all vlan tag registrations (and 
deletions) while the interface is in promiscuous mode. Better solution
would be to send UPDATE_VLAN_FILTERS command alone inside the promiscuous 
condition. vfTable can be set/unset unconditionally as before. By doing 
this, when the interface comes out of promiscuous mode, the restored vlan 
state will have all the added/removed vlan tags into effect.

Re: [PATCH net] vmxnet3: Don't enable vlan filters in promiscuous mode.

From: Jesse Gross <hidden>
Date: 2011-08-10 00:16:40

On Wed, Aug 10, 2011 at 5:32 AM, Shreyas Bhatewara
[off-list ref] wrote:

On Mon, 8 Aug 2011, Jesse Gross wrote:
quoted
@@ -1929,14 +1929,17 @@ static void
 vmxnet3_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
 {
      struct vmxnet3_adapter *adapter = netdev_priv(netdev);
-     u32 *vfTable = adapter->shared->devRead.rxFilterConf.vfTable;
-     unsigned long flags;

-     VMXNET3_SET_VFTABLE_ENTRY(vfTable, vid);
-     spin_lock_irqsave(&adapter->cmd_lock, flags);
-     VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,
-                            VMXNET3_CMD_UPDATE_VLAN_FILTERS);
-     spin_unlock_irqrestore(&adapter->cmd_lock, flags);
+     if (!(netdev->flags & IFF_PROMISC)) {
+             u32 *vfTable = adapter->shared->devRead.rxFilterConf.vfTable;
+             unsigned long flags;
+
+             VMXNET3_SET_VFTABLE_ENTRY(vfTable, vid);
+             spin_lock_irqsave(&adapter->cmd_lock, flags);
+             VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,
+                                    VMXNET3_CMD_UPDATE_VLAN_FILTERS);
+             spin_unlock_irqrestore(&adapter->cmd_lock, flags);
+     }
If this is done, the driver will ignore all vlan tag registrations (and
deletions) while the interface is in promiscuous mode. Better solution
would be to send UPDATE_VLAN_FILTERS command alone inside the promiscuous
condition. vfTable can be set/unset unconditionally as before. By doing
this, when the interface comes out of promiscuous mode, the restored vlan
state will have all the added/removed vlan tags into effect.
Adds and removes are not ignored when in promiscuous mode because the
active_vlans bitfield is still being updated (this is in the context
that you clipped out).  When we come out of promiscuous mode,
vmxnet3_restore_vlan() is called which will update the hardware with
the vlans that have been registered.  This is much safer than directly
updating vfTable because it will get overwritten if vmxnet3_set_mc()
is called again and is potentially very error prone to have it not
reflect what we actually want programmed in the hardware.

Re: [PATCH net] vmxnet3: Don't enable vlan filters in promiscuous mode.

From: Shreyas Bhatewara <hidden>
Date: 2011-08-10 03:00:51

Adds and removes are not ignored when in promiscuous mode because the
active_vlans bitfield is still being updated (this is in the context
that you clipped out).  When we come out of promiscuous mode,
vmxnet3_restore_vlan() is called which will update the hardware with
the vlans that have been registered.  This is much safer than directly
updating vfTable because it will get overwritten if vmxnet3_set_mc()
is called again and is potentially very error prone to have it not
reflect what we actually want programmed in the hardware.
Thats right.

Signed-off-by: Shreyas N Bhatewara <redacted>

Re: [PATCH net] vmxnet3: Don't enable vlan filters in promiscuous mode.

From: David Miller <davem@davemloft.net>
Date: 2011-08-14 01:01:06

From: Jesse Gross <redacted>
Date: Mon,  8 Aug 2011 02:15:47 -0700
The vmxnet3 driver enables vlan filters if filtering is enabled for
any vlan.  In promiscuous mode the filter table is cleared to in
order to disable filtering.  However, if a vlan device is subsequently
created that vlan will be added to the filter, re-engaging it.  As a
result, not only do we not see all the vlans in promiscuous mode, we
don't even see vlans for which a filter was previously created.

CC: Scott J. Goldman <redacted>
CC: Shreyas Bhatewara <redacted>
CC: VMware PV-Drivers <redacted>
Signed-off-by: Jesse Gross <redacted>
Applied.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help