From: Sepherosa Ziehau Date: Sun, 15 Mar 2009 03:20:40 +0000 (+0800) Subject: Defer ethernet mcast/bcast address detection to ether_input_handler() X-Git-Tag: v2.3.1~289 X-Git-Url: http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff_plain/828c9923f6ecf55b0984e75818ca75764740780d Defer ethernet mcast/bcast address detection to ether_input_handler() --- diff --git a/sys/net/if_ethersubr.c b/sys/net/if_ethersubr.c index 9af80db..1628c43 100644 --- a/sys/net/if_ethersubr.c +++ b/sys/net/if_ethersubr.c @@ -1415,6 +1415,7 @@ static void ether_input_handler(struct netmsg *nmsg) { struct netmsg_packet *nmp = (struct netmsg_packet *)nmsg; + struct ether_header *eh; struct ifnet *ifp; struct mbuf *m; @@ -1422,6 +1423,16 @@ ether_input_handler(struct netmsg *nmsg) M_ASSERTPKTHDR(m); ifp = m->m_pkthdr.rcvif; + eh = mtod(m, struct ether_header *); + if (ETHER_IS_MULTICAST(eh->ether_dhost)) { + if (bcmp(ifp->if_broadcastaddr, eh->ether_dhost, + ifp->if_addrlen) == 0) + m->m_flags |= M_BCAST; + else + m->m_flags |= M_MCAST; + ifp->if_imcasts++; + } + ether_input_oncpu(ifp, m); } @@ -1494,26 +1505,20 @@ ether_input_chain(struct ifnet *ifp, struct mbuf *m, struct mbuf_chain *chain) m_freem(m); return; } - eh = mtod(m, struct ether_header *); m->m_pkthdr.rcvif = ifp; logether(chain_beg, ifp); - if (ETHER_IS_MULTICAST(eh->ether_dhost)) { - if (bcmp(ifp->if_broadcastaddr, eh->ether_dhost, - ifp->if_addrlen) == 0) - m->m_flags |= M_BCAST; - else - m->m_flags |= M_MCAST; - ifp->if_imcasts++; - } - ETHER_BPF_MTAP(ifp, m); ifp->if_ibytes += m->m_pkthdr.len; if (ifp->if_flags & IFF_MONITOR) { + eh = mtod(m, struct ether_header *); + if (ETHER_IS_MULTICAST(eh->ether_dhost)) + ifp->if_imcasts++; + /* * Interface marked for monitoring; discard packet. */ @@ -1523,6 +1528,8 @@ ether_input_chain(struct ifnet *ifp, struct mbuf *m, struct mbuf_chain *chain) return; } + eh = mtod(m, struct ether_header *); + if (ntohs(eh->ether_type) == ETHERTYPE_VLAN && (m->m_flags & M_VLANTAG) == 0) { /*