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: