: [VLAN] Turn off the HW vlan filter if promisc
Subsystems (2)
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.
Signed-off-by Joonwoo Park <[email protected]>
--- drivers/net/e1000e/netdev.c | 21 +++++++++++++++------ 1 files changed, 15 insertions(+), 6 deletions(-)
drivers/net/e1000e/netdev.c +15 -6
@@ -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