Change ether_demux() interface to accept mbuf containing ether header.
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Thu, 20 Mar 2008 12:55:32 +0000 (12:55 +0000)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Thu, 20 Mar 2008 12:55:32 +0000 (12:55 +0000)
sys/net/dummynet/ip_dummynet_glue.c
sys/net/if_ethersubr.c
sys/net/if_var.h
sys/netgraph/ether/ng_ether.c

index b34b33f..d63d593 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/net/dummynet/ip_dummynet_glue.c,v 1.4 2007/11/18 13:00:28 sephe Exp $
+ * $DragonFly: src/sys/net/dummynet/ip_dummynet_glue.c,v 1.5 2008/03/20 12:55:32 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -379,7 +379,6 @@ ip_dn_ether_demux(struct netmsg *nmsg)
        struct mbuf *m;
        struct m_tag *mtag;
        struct dn_pkt *pkt;
-       struct ether_header *eh;
        ip_dn_unref_priv_t unref_priv;
        void *priv;
 
@@ -406,18 +405,15 @@ ip_dn_ether_demux(struct netmsg *nmsg)
        priv = pkt->dn_priv;
        unref_priv = pkt->dn_unref_priv;
 
+       /*
+        * Make sure that ether header is contiguous
+        */
        if (m->m_len < ETHER_HDR_LEN &&
            (m = m_pullup(m, ETHER_HDR_LEN)) == NULL) {
                kprintf("%s: pullup fail, dropping pkt\n", __func__);
                goto back;
        }
-
-       /*
-        * Same as ether_input, make eh be a pointer into the mbuf
-        */
-       eh = mtod(m, struct ether_header *);
-       m_adj(m, ETHER_HDR_LEN);
-       ether_demux(NULL, eh, m);
+       ether_demux(NULL, m);
 back:
        if (unref_priv)
                unref_priv(priv);
index cba65e5..6ce0112 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)if_ethersubr.c      8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/net/if_ethersubr.c,v 1.70.2.33 2003/04/28 15:45:53 archie Exp $
- * $DragonFly: src/sys/net/if_ethersubr.c,v 1.55 2008/03/20 10:42:15 sephe Exp $
+ * $DragonFly: src/sys/net/if_ethersubr.c,v 1.56 2008/03/20 12:55:32 sephe Exp $
  */
 
 #include "opt_atalk.h"
@@ -626,20 +626,17 @@ ether_input(struct ifnet *ifp, struct mbuf *m)
                eh = mtod(m, struct ether_header *);
        }
 
-       /* XXX old crufty stuff, needs to be removed */
-       m_adj(m, sizeof(struct ether_header));
-
        /* Continue with upper layer processing */
-       ether_demux(ifp, eh, m);
+       ether_demux(ifp, m);
 }
 
 /*
  * Upper layer processing for a received Ethernet packet.
  */
 void
-ether_demux(struct ifnet *ifp, struct ether_header *eh0, struct mbuf *m)
+ether_demux(struct ifnet *ifp, struct mbuf *m)
 {
-       struct ether_header eh;
+       struct ether_header save_eh, *eh;
        int isr;
        u_short ether_type;
        struct ip_fw *rule = NULL;
@@ -648,7 +645,15 @@ ether_demux(struct ifnet *ifp, struct ether_header *eh0, struct mbuf *m)
        struct llc *l;
 #endif
 
-       eh = *eh0;
+       M_ASSERTPKTHDR(m);
+       KASSERT(m->m_len >= ETHER_HDR_LEN,
+               ("ether header is no contiguous!\n"));
+
+       eh = mtod(m, struct ether_header *);
+       save_eh = *eh;
+
+       /* XXX old crufty stuff, needs to be removed */
+       m_adj(m, sizeof(struct ether_header));
 
        /* Extract info from dummynet tag */
        mtag = m_tag_find(m, PACKET_TAG_DUMMYNET, NULL);
@@ -673,7 +678,7 @@ ether_demux(struct ifnet *ifp, struct ether_header *eh0, struct mbuf *m)
          * evaluation, to see if the carp ether_dhost values break any
          * of these checks!
          */
-       if (ifp->if_carp && carp_forus(ifp->if_carp, eh.ether_dhost))
+       if (ifp->if_carp && carp_forus(ifp->if_carp, eh->ether_dhost))
                goto post_stats;
 #endif
 
@@ -684,21 +689,22 @@ ether_demux(struct ifnet *ifp, struct ether_header *eh0, struct mbuf *m)
         * happen when the interface is in promiscuous mode.
         */
        if (((ifp->if_flags & (IFF_PROMISC | IFF_PPROMISC)) == IFF_PROMISC) &&
-           (eh.ether_dhost[0] & 1) == 0 &&
-           bcmp(eh.ether_dhost, IFP2AC(ifp)->ac_enaddr, ETHER_ADDR_LEN)) {
+           (eh->ether_dhost[0] & 1) == 0 &&
+           bcmp(eh->ether_dhost, IFP2AC(ifp)->ac_enaddr, ETHER_ADDR_LEN)) {
                m_freem(m);
                return;
        }
 
 post_stats:
        if (IPFW_LOADED && ether_ipfw != 0) {
-               if (!ether_ipfw_chk(&m, NULL, &rule, &eh, FALSE)) {
+               if (!ether_ipfw_chk(&m, NULL, &rule, eh, FALSE)) {
                        m_freem(m);
                        return;
                }
        }
+       eh = NULL; /* catch any further usage */
 
-       ether_type = ntohs(eh.ether_type);
+       ether_type = ntohs(save_eh.ether_type);
 
        switch (ether_type) {
 #ifdef INET
@@ -726,7 +732,7 @@ post_stats:
 
 #ifdef IPX
        case ETHERTYPE_IPX:
-               if (ef_inputp && ef_inputp(ifp, &eh, m) == 0)
+               if (ef_inputp && ef_inputp(ifp, &save_eh, m) == 0)
                        return;
                isr = NETISR_IPX;
                break;
@@ -749,9 +755,9 @@ post_stats:
 #endif
 
        case ETHERTYPE_VLAN:
-               if (vlan_input_p != NULL)
-                       (*vlan_input_p)(&eh, m);
-               else {
+               if (vlan_input_p != NULL) {
+                       (*vlan_input_p)(&save_eh, m);
+               else {
                        m->m_pkthdr.rcvif->if_noproto++;
                        m_freem(m);
                }
@@ -759,7 +765,7 @@ post_stats:
 
        default:
 #ifdef IPX
-               if (ef_inputp && ef_inputp(ifp, &eh, m) == 0)
+               if (ef_inputp && ef_inputp(ifp, &save_eh, m) == 0)
                        return;
 #endif
 #ifdef NS
@@ -801,7 +807,7 @@ post_stats:
 dropanyway:
 #endif
                if (ng_ether_input_orphan_p != NULL)
-                       (*ng_ether_input_orphan_p)(ifp, m, &eh);
+                       (*ng_ether_input_orphan_p)(ifp, m, &save_eh);
                else
                        m_freem(m);
                return;
index 3f11e59..385e775 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     From: @(#)if.h  8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/net/if_var.h,v 1.18.2.16 2003/04/15 18:11:19 fjoe Exp $
- * $DragonFly: src/sys/net/if_var.h,v 1.47 2008/03/18 08:29:16 hasso Exp $
+ * $DragonFly: src/sys/net/if_var.h,v 1.48 2008/03/20 12:55:32 sephe Exp $
  */
 
 #ifndef        _NET_IF_VAR_H_
@@ -490,7 +490,7 @@ void        ether_ifattach_bpf(struct ifnet *, uint8_t *, u_int, u_int,
                        struct lwkt_serialize *);
 void   ether_ifdetach(struct ifnet *);
 void   ether_input(struct ifnet *, struct mbuf *);
-void   ether_demux(struct ifnet *, struct ether_header *, struct mbuf *);
+void   ether_demux(struct ifnet *, struct mbuf *);
 int    ether_output_frame(struct ifnet *, struct mbuf *);
 int    ether_ioctl(struct ifnet *, int, caddr_t);
 uint32_t       ether_crc32_le(const uint8_t *, size_t);
index f25e0a6..e56843a 100644 (file)
@@ -38,7 +38,7 @@
  *         Julian Elischer <julian@freebsd.org>
  *
  * $FreeBSD: src/sys/netgraph/ng_ether.c,v 1.2.2.13 2002/07/02 20:10:25 archie Exp $
- * $DragonFly: src/sys/netgraph/ether/ng_ether.c,v 1.14 2008/03/19 14:46:03 sephe Exp $
+ * $DragonFly: src/sys/netgraph/ether/ng_ether.c,v 1.15 2008/03/20 12:55:32 sephe Exp $
  */
 
 /*
@@ -622,27 +622,24 @@ static int
 ng_ether_rcv_upper(node_p node, struct mbuf *m, meta_p meta)
 {
        const priv_p priv = node->private;
-       struct ether_header *eh;
 
        /* Discard meta info */
        NG_FREE_META(meta);
 
        /* Check length and pull off header */
-       if (m->m_pkthdr.len < sizeof(*eh)) {
+       if (m->m_pkthdr.len < ETHER_HDR_LEN) {
                m_freem(m);
                return (EINVAL);
        }
-       if (m->m_len < sizeof(*eh) && (m = m_pullup(m, sizeof(*eh))) == NULL)
+       if (m->m_len < ETHER_HDR_LEN &&
+           (m = m_pullup(m, ETHER_HDR_LEN)) == NULL)
                return (ENOBUFS);
-       eh = mtod(m, struct ether_header *);
-       m->m_data += sizeof(*eh);
-       m->m_len -= sizeof(*eh);
-       m->m_pkthdr.len -= sizeof(*eh);
+
        m->m_pkthdr.rcvif = priv->ifp;
 
        /* Route packet back in */
        lwkt_serialize_enter(priv->ifp->if_serializer);
-       ether_demux(priv->ifp, eh, m);
+       ether_demux(priv->ifp, m);
        lwkt_serialize_exit(priv->ifp->if_serializer);
        return (0);
 }