Skip to contentSkip to conversation

: [VLAN] Turn off the HW vlan filter if promisc

PATCH Applied Joonwoo Park 1 participant 1 message Apr 11, 2008

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 5/5 : [VLAN] Turn off the HW vlan filter if promisc

If the netdev goes into mode promiscuous, receive all of the packets on the wire without HW filtering, those packets will be processed as type PACKET_OTHERHOST.

---
 drivers/net/e1000e/netdev.c |   21 +++++++++++++++------
 1 files changed, 15 insertions(+), 6 deletions(-)
drivers/net/e1000e/netdev.c +15 -6
index fc5c63f..4445b93 100644
@@ -1492,7 +1492,10 @@ static void e1000_vlan_rx_register(struct net_device *netdev,
 		if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) {
 			/* enable VLAN receive filtering */
 			rctl = er32(RCTL);
-			rctl |= E1000_RCTL_VFE;
+			if (netdev->flags & IFF_PROMISC)
+				rctl &= ~E1000_RCTL_VFE;
+			else
+				rctl |= E1000_RCTL_VFE;
 			rctl &= ~E1000_RCTL_CFIEN;
 			ew32(RCTL, rctl);
 			e1000_update_mng_vlan(adapter);
@@ -1889,20 +1892,26 @@ static void e1000_set_multi(struct net_device *netdev)
 	struct e1000_mac_info *mac = &hw->mac;
 	struct dev_mc_list *mc_ptr;
 	u8  *mta_list;
-	u32 rctl;
+	u32 rctl, ctrl;
 	int i;
 
 	/* Check for Promiscuous and All Multicast modes */
 
 	rctl = er32(RCTL);
+	ctrl = er32(CTRL);
 
 	if (netdev->flags & IFF_PROMISC) {
 		rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE);
-	} else if (netdev->flags & IFF_ALLMULTI) {
-		rctl |= E1000_RCTL_MPE;
-		rctl &= ~E1000_RCTL_UPE;
+		rctl &= ~E1000_RCTL_VFE;
 	} else {
-		rctl &= ~(E1000_RCTL_UPE | E1000_RCTL_MPE);
+		if (ctrl & E1000_CTRL_VME &&
+		    adapter->flags & FLAG_HAS_HW_VLAN_FILTER)
+			rctl |= E1000_RCTL_VFE;
+		if (netdev->flags & IFF_ALLMULTI) {
+			rctl |= E1000_RCTL_MPE;
+			rctl &= ~E1000_RCTL_UPE;
+		} else
+			rctl &= ~(E1000_RCTL_UPE | E1000_RCTL_MPE);
 	}
 
 	ew32(RCTL, rctl);
Signature · 1 line
1.5.4.3