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: