I'd love to hear from people using USB Ethernet adapters about the
if_input() conversion diff below.

Please make sure everything works as before, including tcpdump(8).

I also take ok on a per-driver basis :)
M

Index: if_aue.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/if_aue.c,v
retrieving revision 1.97
diff -u -p -r1.97 if_aue.c
--- if_aue.c    14 Mar 2015 03:38:49 -0000      1.97
+++ if_aue.c    17 Mar 2015 21:45:27 -0000
@@ -1017,6 +1017,7 @@ aue_rxeof(struct usbd_xfer *xfer, void *
        struct aue_softc        *sc = c->aue_sc;
        struct ifnet            *ifp = GET_IFP(sc);
        struct mbuf             *m;
+       struct mbuf_list        ml = MBUF_LIST_INITIALIZER();
        u_int32_t               total_len;
        struct aue_rxpkt        r;
        int                     s;
@@ -1067,32 +1068,15 @@ aue_rxeof(struct usbd_xfer *xfer, void *
        total_len -= ETHER_CRC_LEN + 4;
        m->m_pkthdr.len = m->m_len = total_len;
        ifp->if_ipackets++;
+       ml_enqueue(&ml, m);
 
-       m->m_pkthdr.rcvif = ifp;
-
-       s = splnet();
-
-       /* XXX ugly */
        if (aue_newbuf(sc, c, NULL) == ENOBUFS) {
                ifp->if_ierrors++;
-               goto done1;
+               goto done;
        }
 
-#if NBPFILTER > 0
-       /*
-        * Handle BPF listeners. Let the BPF user see the packet, but
-        * don't pass it up to the ether_input() layer unless it's
-        * a broadcast packet, multicast packet, matches our ethernet
-        * address or the interface is in promiscuous mode.
-        */
-       if (ifp->if_bpf)
-               bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_IN);
-#endif
-
-       DPRINTFN(10,("%s: %s: deliver %d\n", sc->aue_dev.dv_xname,
-                   __func__, m->m_len));
-       ether_input_mbuf(ifp, m);
- done1:
+       s = splnet();
+       if_input(ifp, &ml);
        splx(s);
 
  done:
Index: if_axen.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/if_axen.c,v
retrieving revision 1.11
diff -u -p -r1.11 if_axen.c
--- if_axen.c   22 Jan 2015 10:23:47 -0000      1.11
+++ if_axen.c   17 Mar 2015 20:45:27 -0000
@@ -948,6 +948,7 @@ axen_rxeof(struct usbd_xfer *xfer, void 
        struct axen_softc       *sc = c->axen_sc;
        struct ifnet            *ifp = GET_IFP(sc);
        u_char                  *buf = c->axen_buf;
+       struct mbuf_list        ml = MBUF_LIST_INITIALIZER();
        struct mbuf             *m;
        u_int32_t               total_len;
        u_int32_t               rx_hdr, pkt_hdr;
@@ -1053,7 +1054,6 @@ axen_rxeof(struct usbd_xfer *xfer, void 
 
                /* skip pseudo header (2byte) */
                ifp->if_ipackets++;
-               m->m_pkthdr.rcvif = ifp;
                m->m_pkthdr.len = m->m_len = pkt_len - 2;
 
 #ifdef AXEN_TOE
@@ -1078,14 +1078,7 @@ axen_rxeof(struct usbd_xfer *xfer, void 
 
                memcpy(mtod(m, char *), buf + 2, pkt_len - 2);
 
-               /* push the packet up */
-               s = splnet();
-#if NBPFILTER > 0
-               if (ifp->if_bpf)
-                       bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_IN);
-#endif
-               ether_input_mbuf(ifp, m);
-               splx(s);
+               ml_enqueue(&ml, m);
 
 nextpkt:
                /*
@@ -1100,6 +1093,11 @@ nextpkt:
        } while( pkt_count > 0);
 
 done:
+       /* push the packet up */
+       s = splnet();
+       if_input(ifp, &ml);
+       splx(s);
+
        /* clear buffer for next transaction */
        memset(c->axen_buf, 0, sc->axen_bufsz);
 
Index: if_cdce.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/if_cdce.c,v
retrieving revision 1.63
diff -u -p -r1.63 if_cdce.c
--- if_cdce.c   14 Mar 2015 03:38:49 -0000      1.63
+++ if_cdce.c   17 Mar 2015 21:45:15 -0000
@@ -726,6 +726,7 @@ cdce_rxeof(struct usbd_xfer *xfer, void 
        struct cdce_softc       *sc = c->cdce_sc;
        struct ifnet            *ifp = GET_IFP(sc);
        struct mbuf             *m;
+       struct mbuf_list         ml = MBUF_LIST_INITIALIZER();
        int                      total_len = 0;
        int                      s;
 
@@ -767,25 +768,16 @@ cdce_rxeof(struct usbd_xfer *xfer, void 
        }
 
        ifp->if_ipackets++;
-
        m->m_pkthdr.len = m->m_len = total_len;
-       m->m_pkthdr.rcvif = ifp;
-
-       s = splnet();
+       ml_enqueue(&ml, m);
 
        if (cdce_newbuf(sc, c, NULL) == ENOBUFS) {
                ifp->if_ierrors++;
-               goto done1;
+               goto done;
        }
 
-#if NBPFILTER > 0
-       if (ifp->if_bpf)
-               bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_IN);
-#endif
-
-       ether_input_mbuf(ifp, m);
-
-done1:
+       s = splnet();
+       if_input(ifp, &ml);
        splx(s);
 
 done:
Index: if_cdcef.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/if_cdcef.c,v
retrieving revision 1.35
diff -u -p -r1.35 if_cdcef.c
--- if_cdcef.c  22 Dec 2014 02:28:52 -0000      1.35
+++ if_cdcef.c  17 Mar 2015 21:43:23 -0000
@@ -361,6 +361,7 @@ cdcef_rxeof(struct usbf_xfer *xfer, void
        struct cdcef_softc      *sc = priv;
        int total_len = 0;
        struct ifnet            *ifp = GET_IFP(sc);
+       struct mbuf_list        ml = MBUF_LIST_INITIALIZER();
        struct mbuf             *m = NULL;
 
 
@@ -403,32 +404,24 @@ cdcef_rxeof(struct usbf_xfer *xfer, void
                goto done;
        }
 
-       s = splnet();
        if (ifp->if_flags & IFF_RUNNING) {
                m = cdcef_newbuf();
                if (m == NULL) {
                        /* message? */
                        ifp->if_ierrors++;
-                       goto done1;
+                       goto done;
                }
 
                m->m_pkthdr.len = m->m_len = total_len;
                bcopy(sc->sc_buffer_out, mtod(m, char *), total_len);
-               m->m_pkthdr.rcvif = ifp;
 
                ifp->if_ipackets++;
-
-#if NBPFILTER > 0
-               if (ifp->if_bpf)
-                       bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_IN);
-#endif
-
-               ether_input_mbuf(ifp, m);
+               ml_enqueue(&ml, m);
        }
 
-done1:
+       s = splnet();
+       if_input(ifp, &ml);
        splx(s);
-
 done:
        /* Setup another xfer. */
        usbf_setup_xfer(xfer, sc->sc_pipe_out, sc, sc->sc_buffer_out,
Index: if_cue.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/if_cue.c,v
retrieving revision 1.69
diff -u -p -r1.69 if_cue.c
--- if_cue.c    14 Mar 2015 03:38:49 -0000      1.69
+++ if_cue.c    17 Mar 2015 21:45:06 -0000
@@ -674,6 +674,7 @@ cue_rxeof(struct usbd_xfer *xfer, void *
        struct cue_chain        *c = priv;
        struct cue_softc        *sc = c->cue_sc;
        struct ifnet            *ifp = GET_IFP(sc);
+       struct mbuf_list        ml = MBUF_LIST_INITIALIZER();
        struct mbuf             *m;
        int                     total_len = 0;
        u_int16_t               len;
@@ -721,26 +722,15 @@ cue_rxeof(struct usbd_xfer *xfer, void *
        ifp->if_ipackets++;
        m_adj(m, sizeof(u_int16_t));
        m->m_pkthdr.len = m->m_len = total_len;
+       ml_enqueue(&ml, m);
 
-       m->m_pkthdr.rcvif = ifp;
-
-       s = splnet();
-
-       /* XXX ugly */
        if (cue_newbuf(sc, c, NULL) == ENOBUFS) {
                ifp->if_ierrors++;
-               goto done1;
+               goto done;
        }
 
-#if NBPFILTER > 0
-       if (ifp->if_bpf)
-               bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_IN);
-#endif
-
-       DPRINTFN(10,("%s: %s: deliver %d\n", sc->cue_dev.dv_xname,
-                   __func__, m->m_len));
-       ether_input_mbuf(ifp, m);
- done1:
+       s = splnet();
+       if_input(ifp, &ml);
        splx(s);
 
 done:
Index: if_kue.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/if_kue.c,v
retrieving revision 1.78
diff -u -p -r1.78 if_kue.c
--- if_kue.c    14 Mar 2015 03:38:49 -0000      1.78
+++ if_kue.c    17 Mar 2015 21:44:56 -0000
@@ -676,6 +676,7 @@ kue_rxeof(struct usbd_xfer *xfer, void *
        struct kue_chain        *c = priv;
        struct kue_softc        *sc = c->kue_sc;
        struct ifnet            *ifp = GET_IFP(sc);
+       struct mbuf_list        ml = MBUF_LIST_INITIALIZER();
        struct mbuf             *m;
        int                     total_len = 0;
        int                     s;
@@ -728,26 +729,15 @@ kue_rxeof(struct usbd_xfer *xfer, void *
 
        ifp->if_ipackets++;
        m->m_pkthdr.len = m->m_len = total_len;
+       ml_enqueue(&ml, m);
 
-       m->m_pkthdr.rcvif = ifp;
-
-       s = splnet();
-
-       /* XXX ugly */
        if (kue_newbuf(sc, c, NULL) == ENOBUFS) {
                ifp->if_ierrors++;
-               goto done1;
+               goto done;
        }
 
-#if NBPFILTER > 0
-       if (ifp->if_bpf)
-               bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_IN);
-#endif
-
-       DPRINTFN(10,("%s: %s: deliver %d\n", sc->kue_dev.dv_xname,
-                   __func__, m->m_len));
-       ether_input_mbuf(ifp, m);
- done1:
+       s = splnet();
+       if_input(ifp, &ml);
        splx(s);
 
  done:
Index: if_mos.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/if_mos.c,v
retrieving revision 1.28
diff -u -p -r1.28 if_mos.c
--- if_mos.c    14 Mar 2015 03:38:49 -0000      1.28
+++ if_mos.c    17 Mar 2015 20:58:39 -0000
@@ -902,6 +902,7 @@ mos_rxeof(struct usbd_xfer *xfer, void *
        u_int8_t                rxstat;
        u_int32_t               total_len;
        u_int16_t               pktlen = 0;
+       struct mbuf_list        ml = MBUF_LIST_INITIALIZER();
        struct mbuf             *m;
        int                     s;
 
@@ -961,20 +962,14 @@ mos_rxeof(struct usbd_xfer *xfer, void *
        }
 
        ifp->if_ipackets++;
-       m->m_pkthdr.rcvif = ifp;
        m->m_pkthdr.len = m->m_len = pktlen;
 
        memcpy(mtod(m, char *), buf, pktlen);
 
-       /* push the packet up */
-       s = splnet();
-#if NBPFILTER > 0
-       if (ifp->if_bpf)
-               bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_IN);
-#endif
-
-       ether_input_mbuf(ifp, m);
+       ml_enqueue(&ml, m);
 
+       s = splnet();
+       if_input(ifp, &ml);
        splx(s);
 
 done:
Index: if_smsc.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/if_smsc.c,v
retrieving revision 1.15
diff -u -p -r1.15 if_smsc.c
--- if_smsc.c   14 Mar 2015 03:38:49 -0000      1.15
+++ if_smsc.c   17 Mar 2015 20:56:46 -0000
@@ -1149,6 +1149,7 @@ smsc_rxeof(struct usbd_xfer *xfer, void 
        u_char                  *buf = c->sc_buf;
        uint32_t                total_len;
        uint16_t                pktlen = 0;
+       struct mbuf_list        ml = MBUF_LIST_INITIALIZER();
        struct mbuf             *m;
        int                     s;
        uint32_t                rxhdr;
@@ -1219,24 +1220,18 @@ smsc_rxeof(struct usbd_xfer *xfer, void 
                }
 
                ifp->if_ipackets++;
-               m->m_pkthdr.rcvif = ifp;
                m->m_pkthdr.len = m->m_len = pktlen;
                m_adj(m, ETHER_ALIGN);
 
                memcpy(mtod(m, char *), buf, pktlen);
 
-               /* push the packet up */
-               s = splnet();
-#if NBPFILTER > 0
-               if (ifp->if_bpf)
-                       bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_IN);
-#endif
-               ether_input_mbuf(ifp, m);
-
-               splx(s);
+               ml_enqueue(&ml, m);
        } while (total_len > 0);
 
 done:
+       s = splnet();
+       if_input(ifp, &ml);
+       splx(s);
        memset(c->sc_buf, 0, sc->sc_bufsz);
 
        /* Setup new transfer. */
Index: if_udav.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/if_udav.c,v
retrieving revision 1.69
diff -u -p -r1.69 if_udav.c
--- if_udav.c   14 Mar 2015 03:38:49 -0000      1.69
+++ if_udav.c   17 Mar 2015 21:44:40 -0000
@@ -1060,6 +1060,7 @@ udav_rxeof(struct usbd_xfer *xfer, void 
        struct udav_softc *sc = c->udav_sc;
        struct ifnet *ifp = GET_IFP(sc);
        struct udav_rx_hdr *h;
+       struct mbuf_list ml = MBUF_LIST_INITIALIZER();
        struct mbuf *m;
        u_int32_t total_len;
        int s;
@@ -1118,27 +1119,16 @@ udav_rxeof(struct usbd_xfer *xfer, void 
        memcpy(mtod(m, char *), c->udav_buf + UDAV_RX_HDRLEN, total_len);
 
        ifp->if_ipackets++;
-
        m->m_pkthdr.len = m->m_len = total_len;
-       m->m_pkthdr.rcvif = ifp;
-
-       s = splnet();
+       ml_enqueue(&ml, m);
 
        if (udav_newbuf(sc, c, NULL) == ENOBUFS) {
                ifp->if_ierrors++;
-               goto done1;
+               goto done;
        }
 
-#if NBPFILTER > 0
-       if (ifp->if_bpf)
-               bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_IN);
-#endif
-
-       DPRINTF(("%s: %s: deliver %d\n", sc->sc_dev.dv_xname,
-                __func__, m->m_len));
-       ether_input_mbuf(ifp, m);
-
- done1:
+       s = splnet();
+       if_input(ifp, &ml);
        splx(s);
 
  done:
Index: if_ugl.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/if_ugl.c,v
retrieving revision 1.10
diff -u -p -r1.10 if_ugl.c
--- if_ugl.c    14 Mar 2015 03:38:49 -0000      1.10
+++ if_ugl.c    17 Mar 2015 21:44:32 -0000
@@ -436,6 +436,7 @@ ugl_rxeof(struct usbd_xfer *xfer, void *
        struct ugl_chain        *c = priv;
        struct ugl_softc        *sc = c->ugl_sc;
        struct ifnet            *ifp = GET_IFP(sc);
+       struct mbuf_list        ml = MBUF_LIST_INITIALIZER();
        struct mbuf             *m;
        int                     total_len = 0;
        unsigned int            packet_len, packet_count;
@@ -497,29 +498,15 @@ ugl_rxeof(struct usbd_xfer *xfer, void *
 
        ifp->if_ipackets++;
        m->m_pkthdr.len = m->m_len = packet_len;
+       ml_enqueue(&ml, m);
 
-       m->m_pkthdr.rcvif = ifp;
-
-       s = splnet();
-
-       /* XXX ugly */
        if (ugl_newbuf(sc, c, NULL) == ENOBUFS) {
                ifp->if_ierrors++;
-               goto done1;
-       }
-
-#if NBPFILTER > 0
-       if (ifp->if_bpf) {
-               bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_IN);
+               goto done;
        }
-#endif
-
-       DPRINTFN(10,("%s: %s: deliver %d\n", sc->sc_dev.dv_xname,
-                   __func__, m->m_len));
 
-       ether_input_mbuf(ifp, m);
-
- done1:
+       s = splnet();
+       if_input(ifp, &ml);
        splx(s);
 
  done:

Reply via email to