Hi, this diff makes more use of the goto dropanyway instead of repeating m_freem() and return. Also change the sizeof(etherbroadcastaddr) with ETHER_ADDR_LEN for consistency with the other memcmps.
Regards, Michele Index: sys/net/if_ethersubr.c =================================================================== RCS file: /cvs/src/sys/net/if_ethersubr.c,v retrieving revision 1.250 diff -u -p -r1.250 if_ethersubr.c --- sys/net/if_ethersubr.c 10 Jan 2018 00:14:38 -0000 1.250 +++ sys/net/if_ethersubr.c 1 Feb 2018 22:20:08 -0000 @@ -333,14 +333,12 @@ ether_input(struct ifnet *ifp, struct mb */ if ((ifp->if_flags & IFF_SIMPLEX) == 0) { if (memcmp(ac->ac_enaddr, eh->ether_shost, - ETHER_ADDR_LEN) == 0) { - m_freem(m); - return (1); - } + ETHER_ADDR_LEN) == 0) + goto dropanyway; } if (memcmp(etherbroadcastaddr, eh->ether_dhost, - sizeof(etherbroadcastaddr)) == 0) + ETHER_ADDR_LEN) == 0) m->m_flags |= M_BCAST; else m->m_flags |= M_MCAST; @@ -351,10 +349,8 @@ ether_input(struct ifnet *ifp, struct mb * HW vlan tagged packets that were not collected by vlan(4) must * be dropped now. */ - if (m->m_flags & M_VLANTAG) { - m_freem(m); - return (1); - } + if (m->m_flags & M_VLANTAG) + goto dropanyway; /* * If packet is unicast, make sure it is for us. Drop otherwise. @@ -362,10 +358,8 @@ ether_input(struct ifnet *ifp, struct mb * 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); - } + if (memcmp(ac->ac_enaddr, eh->ether_dhost, ETHER_ADDR_LEN)) + goto dropanyway; } etype = ntohs(eh->ether_type);