because the network stack does it for it on the way in.
the following chunk in src/sys/net/if_ethersubr.c does the same job
later on:
int
ether_input(struct ifnet *ifp, struct mbuf *m, void *cookie)
{
...
/*
* If packet is unicast, make sure it is for us. Drop otherwise.
* This check is required in promiscous mode, and for some hypervisors
* where the MAC filter is 'best effort' only.
*/
if ((m->m_flags & (M_BCAST|M_MCAST)) == 0) {
if (memcmp(ac->ac_enaddr, eh->ether_dhost, ETHER_ADDR_LEN)) {
m_freem(m);
return (1);
}
}
...
ok?
Index: if_vlan.c
===================================================================
RCS file: /cvs/src/sys/net/if_vlan.c,v
retrieving revision 1.157
diff -u -p -r1.157 if_vlan.c
--- if_vlan.c 29 Mar 2016 04:33:16 -0000 1.157
+++ if_vlan.c 29 Mar 2016 04:35:28 -0000
@@ -375,18 +375,6 @@ vlan_input(struct ifnet *ifp0, struct mb
goto drop;
/*
- * Drop promiscuously received packets if we are not in
- * promiscuous mode.
- */
- if (!ETHER_IS_MULTICAST(eh->ether_dhost) &&
- (ifp0->if_flags & IFF_PROMISC) &&
- (ifv->ifv_if.if_flags & IFF_PROMISC) == 0) {
- if (bcmp(&ifv->ifv_ac.ac_enaddr, eh->ether_dhost,
- ETHER_ADDR_LEN))
- goto drop;
- }
-
- /*
* Having found a valid vlan interface corresponding to
* the given source interface and vlan tag, remove the
* encapsulation.