Defer ethernet mcast/bcast address detection to ether_input_handler()
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Sun, 15 Mar 2009 03:20:40 +0000 (11:20 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Tue, 17 Mar 2009 11:21:40 +0000 (19:21 +0800)
sys/net/if_ethersubr.c

index 9af80db..1628c43 100644 (file)
@@ -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) {
                /*