diff --git a/sys/arch/acorn32/podulebus/if_ie.c b/sys/arch/acorn32/podulebus/if_ie.c index be6f4db..8bb02ec 100644 --- a/sys/arch/acorn32/podulebus/if_ie.c +++ b/sys/arch/acorn32/podulebus/if_ie.c @@ -1282,7 +1282,7 @@ ie_read_frame(struct ie_softc *sc, int num) bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } void diff --git a/sys/arch/amiga/dev/if_es.c b/sys/arch/amiga/dev/if_es.c index 94a6a22..8269a3b 100644 --- a/sys/arch/amiga/dev/if_es.c +++ b/sys/arch/amiga/dev/if_es.c @@ -721,7 +721,7 @@ esrint(struct es_softc *sc) * the raw packet to bpf. */ bpf_mtap(ifp, top); - (*ifp->if_input)(ifp, top); + if_input(ifp, top); #ifdef ESDEBUG if (--sc->sc_smcbusy) { printf("%s: esintr busy on exit\n", device_xname(sc->sc_dev)); diff --git a/sys/arch/amiga/dev/if_qn.c b/sys/arch/amiga/dev/if_qn.c index 5c79072..2150cd3 100644 --- a/sys/arch/amiga/dev/if_qn.c +++ b/sys/arch/amiga/dev/if_qn.c @@ -585,7 +585,7 @@ qn_get_packet(struct qn_softc *sc, u_short len) /* Tap off BPF listeners */ bpf_mtap(ifp, head); - (*ifp->if_input)(ifp, head); + if_input(ifp, head); return; bad: diff --git a/sys/arch/arm/allwinner/awin_eth.c b/sys/arch/arm/allwinner/awin_eth.c index bf66172..536cb4d 100644 --- a/sys/arch/arm/allwinner/awin_eth.c +++ b/sys/arch/arm/allwinner/awin_eth.c @@ -422,7 +422,7 @@ awin_eth_if_input(struct awin_eth_softc *sc, struct mbuf *m) { struct ifnet * const ifp = &sc->sc_ec.ec_if; - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } static void diff --git a/sys/arch/arm/at91/at91emac.c b/sys/arch/arm/at91/at91emac.c index c76a21c..687b534 100644 --- a/sys/arch/arm/at91/at91emac.c +++ b/sys/arch/arm/at91/at91emac.c @@ -284,7 +284,7 @@ emac_intr(void *arg) sc->rxq[bi].m->m_len = fl; bpf_mtap(ifp, sc->rxq[bi].m); DPRINTFN(2,("received %u bytes packet\n", fl)); - (*ifp->if_input)(ifp, sc->rxq[bi].m); + if_input(ifp, sc->rxq[bi].m); if (mtod(m, intptr_t) & 3) { m_adj(m, mtod(m, intptr_t) & 3); } diff --git a/sys/arch/arm/broadcom/bcm53xx_eth.c b/sys/arch/arm/broadcom/bcm53xx_eth.c index 7a924cd..69e3b9a 100644 --- a/sys/arch/arm/broadcom/bcm53xx_eth.c +++ b/sys/arch/arm/broadcom/bcm53xx_eth.c @@ -401,8 +401,9 @@ bcmeth_ccb_attach(device_t parent, device_t self, void *aux) /* * Attach the interface. */ - if_attach(ifp); + if_initialize(ifp, IF_INPUTF_NO_SOFTINT); ether_ifattach(ifp, sc->sc_enaddr); + if_register(ifp); #ifdef BCMETH_COUNTERS evcnt_attach_dynamic(&sc->sc_ev_intr, EVCNT_TYPE_INTR, @@ -1020,12 +1021,12 @@ bcmeth_rx_input( */ #ifdef BCMETH_MPSAFE mutex_exit(sc->sc_lock); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); mutex_enter(sc->sc_lock); #else int s = splnet(); bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); splx(s); #endif } diff --git a/sys/arch/arm/ep93xx/epe.c b/sys/arch/arm/ep93xx/epe.c index 997ebf7..3072ada 100644 --- a/sys/arch/arm/ep93xx/epe.c +++ b/sys/arch/arm/ep93xx/epe.c @@ -231,7 +231,7 @@ begin: sc->rxq[bi].m->m_pkthdr.len = sc->rxq[bi].m->m_len = fl; bpf_mtap(ifp, sc->rxq[bi].m); - (*ifp->if_input)(ifp, sc->rxq[bi].m); + if_input(ifp, sc->rxq[bi].m); sc->rxq[bi].m = m; bus_dmamap_load(sc->sc_dmat, sc->rxq[bi].m_dmamap, diff --git a/sys/arch/arm/gemini/gemini_gmac.c b/sys/arch/arm/gemini/gemini_gmac.c index 8a46bfa..10a0c19 100644 --- a/sys/arch/arm/gemini/gemini_gmac.c +++ b/sys/arch/arm/gemini/gemini_gmac.c @@ -856,7 +856,7 @@ gmac_hwqueue_rxconsume(gmac_hwqueue_t *hwq, const gmac_desc_t *d) m->m_data += 2; KASSERT(m_length(m) == m->m_pkthdr.len); bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); break; default: ifp->if_ierrors++; diff --git a/sys/arch/arm/gemini/if_gpn.c b/sys/arch/arm/gemini/if_gpn.c index 71c12a6..a08352d 100644 --- a/sys/arch/arm/gemini/if_gpn.c +++ b/sys/arch/arm/gemini/if_gpn.c @@ -307,7 +307,7 @@ gpn_process_data(struct gpn_softc *sc, const ipm_gpn_desc_t *gd) printf("%s: rx len=%d crc=%#x\n", ifp->if_xname, m->m_pkthdr.len, m_crc32_le(m)); #endif - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } out: diff --git a/sys/arch/arm/imx/if_enet.c b/sys/arch/arm/imx/if_enet.c index d62b2da..1e52e3a 100644 --- a/sys/arch/arm/imx/if_enet.c +++ b/sys/arch/arm/imx/if_enet.c @@ -755,7 +755,7 @@ enet_rx_intr(void *arg) /* Pass this up to any BPF listeners */ bpf_mtap(ifp, m0); - (*ifp->if_input)(ifp, m0); + if_input(ifp, m0); } m0 = NULL; diff --git a/sys/arch/arm/omap/if_cpsw.c b/sys/arch/arm/omap/if_cpsw.c index 6b6ae90..2287ebc 100644 --- a/sys/arch/arm/omap/if_cpsw.c +++ b/sys/arch/arm/omap/if_cpsw.c @@ -1170,7 +1170,7 @@ cpsw_rxintr(void *arg) bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); next: sc->sc_rxhead = RXDESC_NEXT(sc->sc_rxhead); diff --git a/sys/arch/arm/omap/omapl1x_emac.c b/sys/arch/arm/omap/omapl1x_emac.c index 9af7e54..4a23332 100644 --- a/sys/arch/arm/omap/omapl1x_emac.c +++ b/sys/arch/arm/omap/omapl1x_emac.c @@ -658,7 +658,7 @@ emac_rx_desc_process (struct emac_softc *sc, struct emac_channel *chan) ifp->if_ipackets++; bpf_mtap(ifp, mb); - (*ifp->if_input)(ifp, mb); + if_input(ifp, mb); entry->m = NULL; diff --git a/sys/arch/arm/rockchip/rockchip_emac.c b/sys/arch/arm/rockchip/rockchip_emac.c index c4dfd77..cffa42f 100644 --- a/sys/arch/arm/rockchip/rockchip_emac.c +++ b/sys/arch/arm/rockchip/rockchip_emac.c @@ -879,7 +879,7 @@ rkemac_rxintr(struct rkemac_softc *sc) bpf_mtap(ifp, m); ifp->if_ipackets++; - ifp->if_input(ifp, m); + if_input(ifp, m); skip: bus_dmamap_sync(sc->sc_dmat, rd->rd_map, 0, diff --git a/sys/arch/arm/xscale/ixp425_if_npe.c b/sys/arch/arm/xscale/ixp425_if_npe.c index 0edcf35..84a0b71 100644 --- a/sys/arch/arm/xscale/ixp425_if_npe.c +++ b/sys/arch/arm/xscale/ixp425_if_npe.c @@ -1055,7 +1055,7 @@ npe_rxdone(int qid, void *arg) * Tap off here if there is a bpf listener. */ bpf_mtap(ifp, mrx); - ifp->if_input(ifp, mrx); + if_input(ifp, mrx); } else { fail: /* discard frame and re-use mbuf */ diff --git a/sys/arch/emips/ebus/if_le_ebus.c b/sys/arch/emips/ebus/if_le_ebus.c index 8e37c36..947bdb0 100644 --- a/sys/arch/emips/ebus/if_le_ebus.c +++ b/sys/arch/emips/ebus/if_le_ebus.c @@ -768,7 +768,7 @@ enic_rint(struct enic_softc *sc, uint32_t saf, paddr_t phys) bpf_mtap(ifp, m); /* Pass the packet up. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); /* Need to refill now */ enic_refill(sc); diff --git a/sys/arch/evbppc/virtex/dev/if_temac.c b/sys/arch/evbppc/virtex/dev/if_temac.c index 7f65ce3..b61dae5 100644 --- a/sys/arch/evbppc/virtex/dev/if_temac.c +++ b/sys/arch/evbppc/virtex/dev/if_temac.c @@ -1211,7 +1211,7 @@ temac_rxreap(struct temac_softc *sc) bpf_mtap(ifp, m); ifp->if_ipackets++; - (ifp->if_input)(ifp, m); + if_input(ifp, m); /* Refresh descriptor, bail out if we're out of buffers. */ if (temac_rxalloc(sc, tail, 1) != 0) { diff --git a/sys/arch/mac68k/dev/if_mc.c b/sys/arch/mac68k/dev/if_mc.c index 04d4933..240308a 100644 --- a/sys/arch/mac68k/dev/if_mc.c +++ b/sys/arch/mac68k/dev/if_mc.c @@ -585,7 +585,7 @@ mace_read(struct mc_softc *sc, void *pkt, int len) bpf_mtap(ifp, m); /* Pass the packet up. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } /* diff --git a/sys/arch/mac68k/nubus/if_netdock_nubus.c b/sys/arch/mac68k/nubus/if_netdock_nubus.c index 3d0940a..f409666 100644 --- a/sys/arch/mac68k/nubus/if_netdock_nubus.c +++ b/sys/arch/mac68k/nubus/if_netdock_nubus.c @@ -766,7 +766,7 @@ netdock_read(struct netdock_softc *sc, int len) bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); return (1); } diff --git a/sys/arch/macppc/dev/am79c950.c b/sys/arch/macppc/dev/am79c950.c index 20195c3..cc24c3d 100644 --- a/sys/arch/macppc/dev/am79c950.c +++ b/sys/arch/macppc/dev/am79c950.c @@ -597,7 +597,7 @@ mace_read(struct mc_softc *sc, uint8_t *pkt, int len) bpf_mtap(ifp, m); /* Pass the packet up. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } /* diff --git a/sys/arch/macppc/dev/if_bm.c b/sys/arch/macppc/dev/if_bm.c index 8973260..b915695 100644 --- a/sys/arch/macppc/dev/if_bm.c +++ b/sys/arch/macppc/dev/if_bm.c @@ -502,7 +502,7 @@ bmac_rint(void *v) * If so, hand off the raw packet to BPF. */ bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); ifp->if_ipackets++; next: diff --git a/sys/arch/macppc/dev/if_gm.c b/sys/arch/macppc/dev/if_gm.c index d9fc859..2701f6c 100644 --- a/sys/arch/macppc/dev/if_gm.c +++ b/sys/arch/macppc/dev/if_gm.c @@ -382,7 +382,7 @@ gmac_rint(struct gmac_softc *sc) * If so, hand off the raw packet to BPF. */ bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); ifp->if_ipackets++; next: diff --git a/sys/arch/mips/adm5120/dev/if_admsw.c b/sys/arch/mips/adm5120/dev/if_admsw.c index 2ed507b..df46260 100644 --- a/sys/arch/mips/adm5120/dev/if_admsw.c +++ b/sys/arch/mips/adm5120/dev/if_admsw.c @@ -1002,7 +1002,7 @@ admsw_rxintr(struct admsw_softc *sc, int high) bpf_mtap(ifp, m); /* Pass it on. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); ifp->if_ipackets++; } #ifdef ADMSW_EVENT_COUNTERS diff --git a/sys/arch/mips/alchemy/dev/if_aumac.c b/sys/arch/mips/alchemy/dev/if_aumac.c index 0bc885c..cc6b123 100644 --- a/sys/arch/mips/alchemy/dev/if_aumac.c +++ b/sys/arch/mips/alchemy/dev/if_aumac.c @@ -719,7 +719,7 @@ aumac_rxintr(struct aumac_softc *sc) bpf_mtap(ifp, m); /* Pass it on. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); ifp->if_ipackets++; } if (pkts) diff --git a/sys/arch/mips/atheros/dev/if_ae.c b/sys/arch/mips/atheros/dev/if_ae.c index 93e7453..3e02216 100644 --- a/sys/arch/mips/atheros/dev/if_ae.c +++ b/sys/arch/mips/atheros/dev/if_ae.c @@ -1139,7 +1139,7 @@ ae_rxintr(struct ae_softc *sc) bpf_mtap(ifp, m); /* Pass it on. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } /* Update the receive pointer. */ diff --git a/sys/arch/mips/cavium/dev/if_cnmac.c b/sys/arch/mips/cavium/dev/if_cnmac.c index e0b6474..c7824e3 100644 --- a/sys/arch/mips/cavium/dev/if_cnmac.c +++ b/sys/arch/mips/cavium/dev/if_cnmac.c @@ -1489,7 +1489,7 @@ octeon_eth_recv(struct octeon_eth_softc *sc, uint64_t *work) octeon_eth_send_queue_flush_sync(sc); /* XXX XXX XXX */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); return 0; @@ -1826,7 +1826,7 @@ octeon_eth_sysctl_verify(SYSCTLFN_ARGS) octeon_eth_mii_statchg(ifp); /* octeon_gmx_set_filter(sc->sc_gmx_port); */ } - ifp->if_input = ether_input; + if_input= ether_input; } else { if (!ISSET(ifp->if_flags, IFF_PROMISC)) { @@ -1834,7 +1834,7 @@ octeon_eth_sysctl_verify(SYSCTLFN_ARGS) octeon_eth_mii_statchg(ifp); /* octeon_gmx_set_filter(sc->sc_gmx_port); */ } - ifp->if_input = octeon_eth_recv_redir; + if_input= octeon_eth_recv_redir; } } splx(s); diff --git a/sys/arch/mips/ralink/ralink_eth.c b/sys/arch/mips/ralink/ralink_eth.c index d328e8a..245e571 100644 --- a/sys/arch/mips/ralink/ralink_eth.c +++ b/sys/arch/mips/ralink/ralink_eth.c @@ -1490,7 +1490,7 @@ ralink_eth_rxintr(ralink_eth_softc_t *sc) /* Pass it on. */ sc->sc_evcnt_input.ev_count++; - (*ifp->if_input)(ifp, m); + if_input(ifp, m); fe_write(sc, RA_FE_PDMA_RX0_CPU_IDX, rx_cpu_idx); } diff --git a/sys/arch/mips/sibyte/dev/sbmac.c b/sys/arch/mips/sibyte/dev/sbmac.c index ee8c946..4ce905c 100644 --- a/sys/arch/mips/sibyte/dev/sbmac.c +++ b/sys/arch/mips/sibyte/dev/sbmac.c @@ -938,7 +938,7 @@ sbdma_rx_process(struct sbmac_softc *sc, sbmacdma_t *d) /* * Pass the buffer to the kernel */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } else { /* * Packet was mangled somehow. Just drop it and diff --git a/sys/arch/newsmips/apbus/if_sn.c b/sys/arch/newsmips/apbus/if_sn.c index 1a03d7d..2f9ee54 100644 --- a/sys/arch/newsmips/apbus/if_sn.c +++ b/sys/arch/newsmips/apbus/if_sn.c @@ -1059,7 +1059,7 @@ sonic_read(struct sn_softc *sc, void *pkt, int len) return 0; /* Pass the packet to any BPF listeners. */ bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); return 1; } diff --git a/sys/arch/next68k/dev/mb8795.c b/sys/arch/next68k/dev/mb8795.c index 34f19fa..a2c54d3 100644 --- a/sys/arch/next68k/dev/mb8795.c +++ b/sys/arch/next68k/dev/mb8795.c @@ -328,7 +328,7 @@ mb8795_rint(struct mb8795_softc *sc) ifp->if_ipackets++; /* Pass the packet up. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); s = spldma(); diff --git a/sys/arch/playstation2/dev/if_smap.c b/sys/arch/playstation2/dev/if_smap.c index 8f496ad..0bf16bb 100644 --- a/sys/arch/playstation2/dev/if_smap.c +++ b/sys/arch/playstation2/dev/if_smap.c @@ -410,7 +410,7 @@ smap_rxeof(void *arg) if (m != NULL) { if (ifp->if_bpf) bpf_mtap(ifp->if_bpf, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } } sc->rx_done_index = i; diff --git a/sys/arch/powerpc/booke/dev/pq3etsec.c b/sys/arch/powerpc/booke/dev/pq3etsec.c index 00117d8..a610364 100644 --- a/sys/arch/powerpc/booke/dev/pq3etsec.c +++ b/sys/arch/powerpc/booke/dev/pq3etsec.c @@ -796,7 +796,7 @@ pq3etsec_attach(device_t parent, device_t self, void *aux) /* * Attach the interface. */ - if_initialize(ifp); + if_initialize(ifp, IF_INPUTF_NO_SOFTINT); ether_ifattach(ifp, enaddr); if_register(ifp); @@ -1577,7 +1577,7 @@ pq3etsec_rx_input( */ int s = splnet(); bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); splx(s); } diff --git a/sys/arch/powerpc/ibm4xx/dev/if_emac.c b/sys/arch/powerpc/ibm4xx/dev/if_emac.c index 7b3c85a..5df1ab2 100644 --- a/sys/arch/powerpc/ibm4xx/dev/if_emac.c +++ b/sys/arch/powerpc/ibm4xx/dev/if_emac.c @@ -1676,7 +1676,7 @@ emac_rxeob_intr(void *arg) bpf_mtap(ifp, m); /* Pass it on. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } /* Update the receive pointer. */ diff --git a/sys/arch/sgimips/hpc/if_sq.c b/sys/arch/sgimips/hpc/if_sq.c index cf3b7eb..080e816 100644 --- a/sys/arch/sgimips/hpc/if_sq.c +++ b/sys/arch/sgimips/hpc/if_sq.c @@ -1022,7 +1022,7 @@ sq_rxintr(struct sq_softc *sc) device_xname(sc->sc_dev), i, framelen)); bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } diff --git a/sys/arch/sgimips/mace/if_mec.c b/sys/arch/sgimips/mace/if_mec.c index 6b606c8..4064785 100644 --- a/sys/arch/sgimips/mace/if_mec.c +++ b/sys/arch/sgimips/mace/if_mec.c @@ -1739,7 +1739,7 @@ mec_rxintr(struct mec_softc *sc) bpf_mtap(ifp, m); /* Pass it on. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } /* update RX pointer */ diff --git a/sys/arch/sun2/dev/if_ec.c b/sys/arch/sun2/dev/if_ec.c index f9e539a..6017c64 100644 --- a/sys/arch/sun2/dev/if_ec.c +++ b/sys/arch/sun2/dev/if_ec.c @@ -532,7 +532,7 @@ ec_recv(struct ec_softc *sc, int intbit) bpf_mtap(ifp, m0); /* Pass the packet up. */ - (*ifp->if_input)(ifp, m0); + if_input(ifp, m0); } else { /* Something went wrong. */ diff --git a/sys/arch/sun3/dev/if_ie.c b/sys/arch/sun3/dev/if_ie.c index f4e48eb..ea8c67e 100644 --- a/sys/arch/sun3/dev/if_ie.c +++ b/sys/arch/sun3/dev/if_ie.c @@ -996,7 +996,7 @@ ie_readframe(struct ie_softc *sc, int num) /* * Finally pass this packet up to higher layers. */ - (*sc->sc_if.if_input)(&sc->sc_if, m); + if_input(&sc->sc_if, m); sc->sc_if.if_ipackets++; } diff --git a/sys/arch/usermode/dev/if_veth.c b/sys/arch/usermode/dev/if_veth.c index 328162d..901c9aa 100644 --- a/sys/arch/usermode/dev/if_veth.c +++ b/sys/arch/usermode/dev/if_veth.c @@ -137,8 +137,9 @@ veth_attach(device_t parent, device_t self, void *opaque) IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); IFQ_SET_READY(&ifq->if_snd); - if_attach(ifp); + if_initialize(ifp, IF_INPUTF_NO_SOFTINT); ether_ifattach(ifp, sc->sc_eaddr); + if_register(ifp); ifmedia_init(&sc->sc_ifmedia, 0, veth_ifmedia_change, @@ -236,7 +237,7 @@ veth_softrx(void *priv) bpf_mtap(ifp, m); s = splnet(); - ifp->if_input(ifp, m); + if_input(ifp, m); splx(s); } } diff --git a/sys/arch/x86/pci/if_vmx.c b/sys/arch/x86/pci/if_vmx.c index 4c70818..850b62f9 100644 --- a/sys/arch/x86/pci/if_vmx.c +++ b/sys/arch/x86/pci/if_vmx.c @@ -767,7 +767,7 @@ vmxnet3_rxintr(struct vmxnet3_softc *sc, struct vmxnet3_rxqueue *rq) bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); skip_buffer: #ifdef VMXNET3_STAT diff --git a/sys/arch/xen/xen/if_xennet_xenbus.c b/sys/arch/xen/xen/if_xennet_xenbus.c index 5de13bc..b7daca8 100644 --- a/sys/arch/xen/xen/if_xennet_xenbus.c +++ b/sys/arch/xen/xen/if_xennet_xenbus.c @@ -1107,7 +1107,7 @@ again: ifp->if_ipackets++; /* Pass the packet up. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } xen_rmb(); sc->sc_rx_ring.rsp_cons = i; diff --git a/sys/arch/xen/xen/xennetback_xenbus.c b/sys/arch/xen/xen/xennetback_xenbus.c index a284e02..0885d2c 100644 --- a/sys/arch/xen/xen/xennetback_xenbus.c +++ b/sys/arch/xen/xen/xennetback_xenbus.c @@ -891,7 +891,7 @@ so always copy for now. ifp->if_ipackets++; bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } xen_rmb(); /* be sure to read the request before updating pointer */ xneti->xni_txring.req_cons = req_cons; diff --git a/sys/dev/bi/if_ni.c b/sys/dev/bi/if_ni.c index 8aadca6..2836b68 100644 --- a/sys/dev/bi/if_ni.c +++ b/sys/dev/bi/if_ni.c @@ -618,7 +618,7 @@ niintr(void *arg) break; /* Out of mbufs */ bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); break; case BVP_DGRAM: diff --git a/sys/dev/cadence/if_cemac.c b/sys/dev/cadence/if_cemac.c index a3988f8..13e27a2 100644 --- a/sys/dev/cadence/if_cemac.c +++ b/sys/dev/cadence/if_cemac.c @@ -358,7 +358,7 @@ cemac_intr(void *arg) sc->rxq[bi].m->m_pkthdr.csum_flags = csum; bpf_mtap(ifp, sc->rxq[bi].m); DPRINTFN(2,("received %u bytes packet\n", fl)); - (*ifp->if_input)(ifp, sc->rxq[bi].m); + if_input(ifp, sc->rxq[bi].m); if (mtod(m, intptr_t) & 3) m_adj(m, mtod(m, intptr_t) & 3); sc->rxq[bi].m = m; diff --git a/sys/dev/ic/aic6915.c b/sys/dev/ic/aic6915.c index 205625b..0cc2152 100644 --- a/sys/dev/ic/aic6915.c +++ b/sys/dev/ic/aic6915.c @@ -791,7 +791,7 @@ sf_rxintr(struct sf_softc *sc) bpf_mtap(ifp, m); /* Pass it on. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } /* Update the chip's pointers. */ diff --git a/sys/dev/ic/cs89x0.c b/sys/dev/ic/cs89x0.c index 1e7576f..4a74b19 100644 --- a/sys/dev/ic/cs89x0.c +++ b/sys/dev/ic/cs89x0.c @@ -1665,7 +1665,7 @@ cs_ether_input(struct cs_softc *sc, struct mbuf *m) bpf_mtap(ifp, m); /* Pass the packet up. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } void diff --git a/sys/dev/ic/dm9000.c b/sys/dev/ic/dm9000.c index 386741c..b688d4b 100644 --- a/sys/dev/ic/dm9000.c +++ b/sys/dev/ic/dm9000.c @@ -827,7 +827,7 @@ dme_receive(struct dme_softc *sc, struct ifnet *ifp) if (ifp->if_bpf) bpf_mtap(ifp, m); ifp->if_ipackets++; - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } } else if (ready != 0x00) { diff --git a/sys/dev/ic/dp8390.c b/sys/dev/ic/dp8390.c index e8a1126..9ac92a2 100644 --- a/sys/dev/ic/dp8390.c +++ b/sys/dev/ic/dp8390.c @@ -947,7 +947,7 @@ dp8390_read(struct dp8390_softc *sc, int buf, u_short len) */ bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } diff --git a/sys/dev/ic/dp83932.c b/sys/dev/ic/dp83932.c index 3333e16..f511869 100644 --- a/sys/dev/ic/dp83932.c +++ b/sys/dev/ic/dp83932.c @@ -843,7 +843,7 @@ sonic_rxintr(struct sonic_softc *sc) bpf_mtap(ifp, m); /* Pass it on. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } /* Update the receive pointer. */ diff --git a/sys/dev/ic/dwc_gmac.c b/sys/dev/ic/dwc_gmac.c index cce240f..358ecc7 100644 --- a/sys/dev/ic/dwc_gmac.c +++ b/sys/dev/ic/dwc_gmac.c @@ -1127,7 +1127,7 @@ dwc_gmac_rx_intr(struct dwc_gmac_softc *sc) bpf_mtap(ifp, m); ifp->if_ipackets++; - (*ifp->if_input)(ifp, m); + if_input(ifp, m); skip: bus_dmamap_sync(sc->sc_dmat, data->rd_map, 0, diff --git a/sys/dev/ic/elink3.c b/sys/dev/ic/elink3.c index c8a2194..ea14a4a 100644 --- a/sys/dev/ic/elink3.c +++ b/sys/dev/ic/elink3.c @@ -1496,7 +1496,7 @@ again: */ bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); /* * In periods of high traffic we can actually receive enough diff --git a/sys/dev/ic/elinkxl.c b/sys/dev/ic/elinkxl.c index 9dd2d0b..7130201 100644 --- a/sys/dev/ic/elinkxl.c +++ b/sys/dev/ic/elinkxl.c @@ -1393,7 +1393,7 @@ ex_intr(void *arg) M_CSUM_TCP_UDP_BAD; } } - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } goto rcvloop; } diff --git a/sys/dev/ic/gem.c b/sys/dev/ic/gem.c index b59ff38..423a3a4 100644 --- a/sys/dev/ic/gem.c +++ b/sys/dev/ic/gem.c @@ -1940,7 +1940,7 @@ swcsum: m->m_pkthdr.csum_flags = 0; #endif /* Pass it on. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } if (progress) { diff --git a/sys/dev/ic/hme.c b/sys/dev/ic/hme.c index cac2652..6ba8fe0 100644 --- a/sys/dev/ic/hme.c +++ b/sys/dev/ic/hme.c @@ -885,7 +885,7 @@ hme_read(struct hme_softc *sc, int ix, uint32_t flags) bpf_mtap(ifp, m); /* Pass the packet up. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } void diff --git a/sys/dev/ic/i82557.c b/sys/dev/ic/i82557.c index cb8bdef..ba110b3 100644 --- a/sys/dev/ic/i82557.c +++ b/sys/dev/ic/i82557.c @@ -1458,7 +1458,7 @@ fxp_rxintr(struct fxp_softc *sc) bpf_mtap(ifp, m); /* Pass it on. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } } diff --git a/sys/dev/ic/i82586.c b/sys/dev/ic/i82586.c index 69ea76f..cb1252f 100644 --- a/sys/dev/ic/i82586.c +++ b/sys/dev/ic/i82586.c @@ -1039,7 +1039,7 @@ ie_readframe( /* * Finally pass this packet up to higher layers. */ - (*sc->sc_ethercom.ec_if.if_input)(&sc->sc_ethercom.ec_if, m); + if_input(&sc->sc_ethercom.ec_if, m); sc->sc_ethercom.ec_if.if_ipackets++; return (0); } diff --git a/sys/dev/ic/i82596.c b/sys/dev/ic/i82596.c index d6bed02..776ecb2 100644 --- a/sys/dev/ic/i82596.c +++ b/sys/dev/ic/i82596.c @@ -281,7 +281,7 @@ iee_intr(void *intarg) bus_dmamap_sync(sc->sc_dmat, rx_map, 0, rx_map->dm_mapsize, BUS_DMASYNC_PREREAD); bpf_mtap(ifp, rx_mbuf); - (*ifp->if_input)(ifp, rx_mbuf); + if_input(ifp, rx_mbuf); ifp->if_ipackets++; sc->sc_rx_mbuf[sc->sc_rx_done] = new_mbuf; rbd->rbd_count = 0; diff --git a/sys/dev/ic/lan9118.c b/sys/dev/ic/lan9118.c index 62e4ba5..4ca065c 100644 --- a/sys/dev/ic/lan9118.c +++ b/sys/dev/ic/lan9118.c @@ -1002,7 +1002,7 @@ dropit: bpf_mtap(ifp, m); /* Pass it on. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } } diff --git a/sys/dev/ic/lance.c b/sys/dev/ic/lance.c index ee015f1..2bb24c1 100644 --- a/sys/dev/ic/lance.c +++ b/sys/dev/ic/lance.c @@ -479,7 +479,7 @@ lance_read(struct lance_softc *sc, int boff, int len) bpf_mtap(ifp, m); /* Pass the packet up. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } #undef ifp diff --git a/sys/dev/ic/lemac.c b/sys/dev/ic/lemac.c index d419963..7a49291 100644 --- a/sys/dev/ic/lemac.c +++ b/sys/dev/ic/lemac.c @@ -317,7 +317,7 @@ lemac_input( } m->m_pkthdr.len = m->m_len = length; m->m_pkthdr.rcvif = &sc->sc_if; - (*sc->sc_if.if_input)(&sc->sc_if, m); + if_input(&sc->sc_if, m); } static void diff --git a/sys/dev/ic/mb86950.c b/sys/dev/ic/mb86950.c index 6738190..8765142 100644 --- a/sys/dev/ic/mb86950.c +++ b/sys/dev/ic/mb86950.c @@ -908,7 +908,7 @@ mb86950_get_fifo(struct mb86950_softc *sc, u_int len) */ bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); return (0); } diff --git a/sys/dev/ic/mb86960.c b/sys/dev/ic/mb86960.c index 327591d..0aaaef6 100644 --- a/sys/dev/ic/mb86960.c +++ b/sys/dev/ic/mb86960.c @@ -1336,7 +1336,7 @@ mb86960_get_packet(struct mb86960_softc *sc, u_int len) */ bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); return 1; } diff --git a/sys/dev/ic/mtd803.c b/sys/dev/ic/mtd803.c index 23618e4..47491e8 100644 --- a/sys/dev/ic/mtd803.c +++ b/sys/dev/ic/mtd803.c @@ -681,7 +681,7 @@ mtd_rxirq(struct mtd_softc *sc) bpf_mtap(ifp, m); /* Pass the packet up */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } return 1; diff --git a/sys/dev/ic/pdq_ifsubr.c b/sys/dev/ic/pdq_ifsubr.c index 3a32b91..d0323a0 100644 --- a/sys/dev/ic/pdq_ifsubr.c +++ b/sys/dev/ic/pdq_ifsubr.c @@ -249,7 +249,7 @@ pdq_os_receive_pdu( } m->m_pkthdr.rcvif = &sc->sc_if; - (*sc->sc_if.if_input)(&sc->sc_if, m); + if_input(&sc->sc_if, m); } void diff --git a/sys/dev/ic/rrunner.c b/sys/dev/ic/rrunner.c index 7fdf97a..ebcb728 100644 --- a/sys/dev/ic/rrunner.c +++ b/sys/dev/ic/rrunner.c @@ -2377,7 +2377,7 @@ esh_read_snap_ring(struct esh_softc *sc, u_int16_t consumer, int error) } else { m = m_pullup(m, sizeof(struct hippi_header)); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } } else { ifp->if_ierrors++; diff --git a/sys/dev/ic/rtl8169.c b/sys/dev/ic/rtl8169.c index 372d340..4af51a3 100644 --- a/sys/dev/ic/rtl8169.c +++ b/sys/dev/ic/rtl8169.c @@ -1358,7 +1358,7 @@ re_rxeof(struct rtk_softc *sc) continue); } bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } sc->re_ldata.re_rx_prodidx = i; diff --git a/sys/dev/ic/rtl81x9.c b/sys/dev/ic/rtl81x9.c index d5b532b..7725298 100644 --- a/sys/dev/ic/rtl81x9.c +++ b/sys/dev/ic/rtl81x9.c @@ -1077,7 +1077,7 @@ rtk_rxeof(struct rtk_softc *sc) bpf_mtap(ifp, m); /* pass it on. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } } diff --git a/sys/dev/ic/seeq8005.c b/sys/dev/ic/seeq8005.c index 917658f..a800cab 100644 --- a/sys/dev/ic/seeq8005.c +++ b/sys/dev/ic/seeq8005.c @@ -1252,7 +1252,7 @@ ea_read(struct seeq8005_softc *sc, int addr, int len) */ bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } /* diff --git a/sys/dev/ic/sgec.c b/sys/dev/ic/sgec.c index 81ba463..4c1fb9f 100644 --- a/sys/dev/ic/sgec.c +++ b/sys/dev/ic/sgec.c @@ -466,7 +466,7 @@ sgec_intr(struct ze_softc *sc) m->m_pkthdr.len = m->m_len = len - ETHER_CRC_LEN; bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } } } diff --git a/sys/dev/ic/smc83c170.c b/sys/dev/ic/smc83c170.c index 588d8b5..71a04c3 100644 --- a/sys/dev/ic/smc83c170.c +++ b/sys/dev/ic/smc83c170.c @@ -714,7 +714,7 @@ epic_intr(void *arg) bpf_mtap(ifp, m); /* Pass it on. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); ifp->if_ipackets++; } diff --git a/sys/dev/ic/smc90cx6.c b/sys/dev/ic/smc90cx6.c index 559d5f5..5ed9121 100644 --- a/sys/dev/ic/smc90cx6.c +++ b/sys/dev/ic/smc90cx6.c @@ -598,7 +598,7 @@ bah_srint(void *vsc) bpf_mtap(ifp, head); - (*sc->sc_arccom.ac_if.if_input)(&sc->sc_arccom.ac_if, head); + if_input(&sc->sc_arccom.ac_if, head); head = NULL; ifp->if_ipackets++; diff --git a/sys/dev/ic/smc91cxx.c b/sys/dev/ic/smc91cxx.c index 7af74ca..4c0c0e2 100644 --- a/sys/dev/ic/smc91cxx.c +++ b/sys/dev/ic/smc91cxx.c @@ -1243,7 +1243,7 @@ smc91cxx_read(struct smc91cxx_softc *sc) */ bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); out: /* diff --git a/sys/dev/ic/tropic.c b/sys/dev/ic/tropic.c index 2fb6d21..55570ad 100644 --- a/sys/dev/ic/tropic.c +++ b/sys/dev/ic/tropic.c @@ -1251,7 +1251,7 @@ tr_rint(struct tr_softc *sc) ++ifp->if_ipackets; bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } } diff --git a/sys/dev/ic/tulip.c b/sys/dev/ic/tulip.c index 3ea9fec..a3543ed 100644 --- a/sys/dev/ic/tulip.c +++ b/sys/dev/ic/tulip.c @@ -1397,7 +1397,7 @@ tlp_rxintr(struct tulip_softc *sc) } /* Pass it on. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } /* Update the receive pointer. */ diff --git a/sys/dev/if_ndis/if_ndis.c b/sys/dev/if_ndis/if_ndis.c index 1cb7fe6..1a3be07 100644 --- a/sys/dev/if_ndis/if_ndis.c +++ b/sys/dev/if_ndis/if_ndis.c @@ -1048,7 +1048,7 @@ ndis_rxeof(ndis_handle adapter, ndis_packet **packets, uint32_t pktcnt) bpf_mtap(ifp, m0); - (*ifp->if_input)(ifp, m0); + if_input(ifp, m0); } } diff --git a/sys/dev/isa/if_eg.c b/sys/dev/isa/if_eg.c index b1420b9..c6a1d17 100644 --- a/sys/dev/isa/if_eg.c +++ b/sys/dev/isa/if_eg.c @@ -730,7 +730,7 @@ egread(struct eg_softc *sc, void *buf, int len) */ bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } /* diff --git a/sys/dev/isa/if_el.c b/sys/dev/isa/if_el.c index c0f9469..f2c3c5a 100644 --- a/sys/dev/isa/if_el.c +++ b/sys/dev/isa/if_el.c @@ -591,7 +591,7 @@ elread(struct el_softc *sc, int len) */ bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } /* diff --git a/sys/dev/isa/if_iy.c b/sys/dev/isa/if_iy.c index d7aa89a..acf1374 100644 --- a/sys/dev/isa/if_iy.c +++ b/sys/dev/isa/if_iy.c @@ -1046,7 +1046,7 @@ iyget(struct iy_softc *sc, bus_space_tag_t iot, bus_space_handle_t ioh, int rxle bpf_mtap(ifp, top); - (*ifp->if_input)(ifp, top); + if_input(ifp, top); return; dropped: diff --git a/sys/dev/marvell/if_gfe.c b/sys/dev/marvell/if_gfe.c index ecf7602..a8f15bb 100644 --- a/sys/dev/marvell/if_gfe.c +++ b/sys/dev/marvell/if_gfe.c @@ -955,7 +955,7 @@ gfe_rx_get(struct gfe_softc *sc, enum gfe_rxprio rxprio) (eh->ether_dhost[0] & 1) != 0 || memcmp(eh->ether_dhost, CLLADDR(ifp->if_sadl), ETHER_ADDR_LEN) == 0) { - (*ifp->if_input)(ifp, m); + if_input(ifp, m); m = NULL; GE_DPRINTF(sc, (">")); } else { diff --git a/sys/dev/marvell/if_mvgbe.c b/sys/dev/marvell/if_mvgbe.c index b18c126..1e2d97e 100644 --- a/sys/dev/marvell/if_mvgbe.c +++ b/sys/dev/marvell/if_mvgbe.c @@ -2085,7 +2085,7 @@ mvgbe_rxeof(struct mvgbe_softc *sc) bpf_mtap(ifp, m); /* pass it on. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } } diff --git a/sys/dev/marvell/if_mvxpe.c b/sys/dev/marvell/if_mvxpe.c index e1ba655..a9d3a28 100644 --- a/sys/dev/marvell/if_mvxpe.c +++ b/sys/dev/marvell/if_mvxpe.c @@ -2448,7 +2448,7 @@ mvxpe_rx_queue(struct mvxpe_softc *sc, int q, int npkt) mvxpe_rx_set_csumflag(ifp, r, m); ifp->if_ipackets++; bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); chunk = NULL; /* the BM chunk goes to networking stack now */ rx_done: if (chunk) { diff --git a/sys/dev/ofw/ofnet.c b/sys/dev/ofw/ofnet.c index 829cfcd..06d2235 100644 --- a/sys/dev/ofw/ofnet.c +++ b/sys/dev/ofw/ofnet.c @@ -263,7 +263,7 @@ ofnet_read(struct ofnet_softc *of) bpf_mtap(ifp, m); ifp->if_ipackets++; - (*ifp->if_input)(ifp, head); + if_input(ifp, head); } splx(s); } diff --git a/sys/dev/pci/cxgb/cxgb_sge.c b/sys/dev/pci/cxgb/cxgb_sge.c index 53ad9b7..3482ecb 100644 --- a/sys/dev/pci/cxgb/cxgb_sge.c +++ b/sys/dev/pci/cxgb/cxgb_sge.c @@ -2176,7 +2176,7 @@ t3_rx_eth(struct adapter *adap, struct sge_rspq *rq, struct mbuf *m, int ethpad) */ m_adj(m, sizeof(*cpl) + ethpad); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } /** diff --git a/sys/dev/pci/if_age.c b/sys/dev/pci/if_age.c index b9fa768..b950c17 100644 --- a/sys/dev/pci/if_age.c +++ b/sys/dev/pci/if_age.c @@ -1505,7 +1505,7 @@ age_rxeof(struct age_softc *sc, struct rx_rdesc *rxrd) bpf_mtap(ifp, m); /* Pass it on. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); /* Reset mbuf chains. */ AGE_RXCHAIN_RESET(sc); diff --git a/sys/dev/pci/if_alc.c b/sys/dev/pci/if_alc.c index 80023d6..c2cdbb3 100644 --- a/sys/dev/pci/if_alc.c +++ b/sys/dev/pci/if_alc.c @@ -2596,7 +2596,7 @@ alc_rxeof(struct alc_softc *sc, struct rx_rdesc *rrd) bpf_mtap(ifp, m); /* Pass it on. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } } /* Reset mbuf chains. */ diff --git a/sys/dev/pci/if_ale.c b/sys/dev/pci/if_ale.c index 43dc6e3..4d3b7b0 100644 --- a/sys/dev/pci/if_ale.c +++ b/sys/dev/pci/if_ale.c @@ -1548,7 +1548,7 @@ ale_rxeof(struct ale_softc *sc) bpf_mtap(ifp, m); /* Pass it to upper layer. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); ale_rx_update_page(sc, &rx_page, length, &prod); } diff --git a/sys/dev/pci/if_bce.c b/sys/dev/pci/if_bce.c index b127ced..9f07de1 100644 --- a/sys/dev/pci/if_bce.c +++ b/sys/dev/pci/if_bce.c @@ -815,7 +815,7 @@ bce_rxintr(struct bce_softc *sc) bpf_mtap(ifp, m); /* Pass it on. */ - (*ifp->if_input) (ifp, m); + if_input (ifp, m); /* re-check current in case it changed */ curr = (bus_space_read_4(sc->bce_btag, sc->bce_bhandle, diff --git a/sys/dev/pci/if_bge.c b/sys/dev/pci/if_bge.c index 81908f1..c59eda5 100644 --- a/sys/dev/pci/if_bge.c +++ b/sys/dev/pci/if_bge.c @@ -4574,7 +4574,7 @@ bge_rxeof(struct bge_softc *sc) VLAN_INPUT_TAG(ifp, m, cur_rx->bge_vlan_tag, continue); } - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } sc->bge_rx_saved_considx = rx_cons; diff --git a/sys/dev/pci/if_bnx.c b/sys/dev/pci/if_bnx.c index 5b79dfe..74e4f5f 100644 --- a/sys/dev/pci/if_bnx.c +++ b/sys/dev/pci/if_bnx.c @@ -4647,7 +4647,7 @@ bnx_rx_intr(struct bnx_softc *sc) ifp->if_ipackets++; DBPRINT(sc, BNX_VERBOSE_RECV, "%s(): Passing received frame up.\n", __func__); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); DBRUNIF(1, sc->rx_mbuf_alloc--); } diff --git a/sys/dev/pci/if_cas.c b/sys/dev/pci/if_cas.c index ec4c78f..37ced60 100644 --- a/sys/dev/pci/if_cas.c +++ b/sys/dev/pci/if_cas.c @@ -1303,7 +1303,7 @@ cas_rint(struct cas_softc *sc) ifp->if_ipackets++; m->m_pkthdr.csum_flags = 0; - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } else ifp->if_ierrors++; } @@ -1336,7 +1336,7 @@ cas_rint(struct cas_softc *sc) ifp->if_ipackets++; m->m_pkthdr.csum_flags = 0; - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } else ifp->if_ierrors++; } diff --git a/sys/dev/pci/if_de.c b/sys/dev/pci/if_de.c index 6a229b5..f916419 100644 --- a/sys/dev/pci/if_de.c +++ b/sys/dev/pci/if_de.c @@ -3750,7 +3750,7 @@ tulip_rx_intr( ms->m_pkthdr.len = total_len; ms->m_pkthdr.rcvif = ifp; #if defined(__NetBSD__) - (*ifp->if_input)(ifp, ms); + if_input(ifp, ms); #else m_adj(ms, sizeof(struct ether_header)); ether_input(ifp, &eh, ms); @@ -3764,7 +3764,7 @@ tulip_rx_intr( m0->m_len = m0->m_pkthdr.len = total_len; m0->m_pkthdr.rcvif = ifp; #if defined(__NetBSD__) - (*ifp->if_input)(ifp, m0); + if_input(ifp, m0); #else m_adj(m0, sizeof(struct ether_header)); ether_input(ifp, &eh, m0); diff --git a/sys/dev/pci/if_dge.c b/sys/dev/pci/if_dge.c index 66ef831..570b935 100644 --- a/sys/dev/pci/if_dge.c +++ b/sys/dev/pci/if_dge.c @@ -1763,7 +1763,7 @@ dge_rxintr(struct dge_softc *sc) bpf_mtap(ifp, m); /* Pass it on. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } /* Update the receive pointer. */ diff --git a/sys/dev/pci/if_et.c b/sys/dev/pci/if_et.c index 208359e..35efae3 100644 --- a/sys/dev/pci/if_et.c +++ b/sys/dev/pci/if_et.c @@ -1759,7 +1759,7 @@ et_rxeof(struct et_softc *sc) bpf_mtap(ifp, m); ifp->if_ipackets++; - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } } else { ifp->if_ierrors++; diff --git a/sys/dev/pci/if_iwm.c b/sys/dev/pci/if_iwm.c index 12c60bb..ecde05c 100644 --- a/sys/dev/pci/if_iwm.c +++ b/sys/dev/pci/if_iwm.c @@ -6825,7 +6825,7 @@ iwm_attach(device_t parent, device_t self, void *aux) IFQ_SET_READY(&ifp->if_snd); memcpy(ifp->if_xname, DEVNAME(sc), IFNAMSIZ); - if_initialize(ifp); + if_initialize(ifp, 0); #if 0 ieee80211_ifattach(ic); #else diff --git a/sys/dev/pci/if_jme.c b/sys/dev/pci/if_jme.c index d5e7514..d4045ce 100644 --- a/sys/dev/pci/if_jme.c +++ b/sys/dev/pci/if_jme.c @@ -1213,7 +1213,7 @@ jme_intr_rx(jme_softc_t *sc) { VLAN_INPUT_TAG(ifp, mhead, (flags & JME_RD_VLAN_MASK), continue); } - (*ifp->if_input)(ifp, mhead); + if_input(ifp, mhead); } if (ipackets) rnd_add_uint32(&sc->rnd_source, ipackets); diff --git a/sys/dev/pci/if_kse.c b/sys/dev/pci/if_kse.c index e25f61d..05bf539 100644 --- a/sys/dev/pci/if_kse.c +++ b/sys/dev/pci/if_kse.c @@ -1200,7 +1200,7 @@ rxintr(struct kse_softc *sc) m->m_pkthdr.csum_flags |= M_CSUM_TCP_UDP_BAD; } bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); #ifdef KSEDIAGNOSTIC if (kse_monitor_rxintr > 0) { printf("m stat %x data %p len %d\n", diff --git a/sys/dev/pci/if_lii.c b/sys/dev/pci/if_lii.c index f494b6e..3a68627 100644 --- a/sys/dev/pci/if_lii.c +++ b/sys/dev/pci/if_lii.c @@ -1001,7 +1001,7 @@ lii_rxintr(struct lii_softc *sc) bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } AT_WRITE_4(sc, ATL2_MB_RXD_RD_IDX, sc->sc_rxcur); diff --git a/sys/dev/pci/if_msk.c b/sys/dev/pci/if_msk.c index 92e4d76..237668f 100644 --- a/sys/dev/pci/if_msk.c +++ b/sys/dev/pci/if_msk.c @@ -1751,7 +1751,7 @@ msk_rxeof(struct sk_if_softc *sc_if, u_int16_t len, u_int32_t rxstat) bpf_mtap(ifp, m); /* pass it on. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } void diff --git a/sys/dev/pci/if_nfe.c b/sys/dev/pci/if_nfe.c index 6c17241..817aa9a 100644 --- a/sys/dev/pci/if_nfe.c +++ b/sys/dev/pci/if_nfe.c @@ -946,7 +946,7 @@ mbufcopied: } bpf_mtap(ifp, m); ifp->if_ipackets++; - (*ifp->if_input)(ifp, m); + if_input(ifp, m); skip1: /* update mapping address in h/w descriptor */ diff --git a/sys/dev/pci/if_pcn.c b/sys/dev/pci/if_pcn.c index 55bf8e7..3bdc599 100644 --- a/sys/dev/pci/if_pcn.c +++ b/sys/dev/pci/if_pcn.c @@ -1551,7 +1551,7 @@ pcn_rxintr(struct pcn_softc *sc) bpf_mtap(ifp, m); /* Pass it on. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); ifp->if_ipackets++; } diff --git a/sys/dev/pci/if_rtwn.c b/sys/dev/pci/if_rtwn.c index 99c7d46..fe60c68 100644 --- a/sys/dev/pci/if_rtwn.c +++ b/sys/dev/pci/if_rtwn.c @@ -355,7 +355,7 @@ rtwn_attach(device_t parent, device_t self, void *aux) IFQ_SET_READY(&ifp->if_snd); memcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ); - if_initialize(ifp); + if_initialize(ifp, 0); ieee80211_ifattach(ic); if_register(ifp); diff --git a/sys/dev/pci/if_sip.c b/sys/dev/pci/if_sip.c index 4d9d5bd..5752c79 100644 --- a/sys/dev/pci/if_sip.c +++ b/sys/dev/pci/if_sip.c @@ -2242,7 +2242,7 @@ gsip_rxintr(struct sip_softc *sc) bpf_mtap(ifp, m); /* Pass it on. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } /* Update the receive pointer. */ @@ -2409,7 +2409,7 @@ sip_rxintr(struct sip_softc *sc) bpf_mtap(ifp, m); /* Pass it on. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } /* Update the receive pointer. */ diff --git a/sys/dev/pci/if_sk.c b/sys/dev/pci/if_sk.c index dc93aac..2f3e424 100644 --- a/sys/dev/pci/if_sk.c +++ b/sys/dev/pci/if_sk.c @@ -2117,7 +2117,7 @@ sk_rxeof(struct sk_if_softc *sc_if) bpf_mtap(ifp, m); /* pass it on. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } } diff --git a/sys/dev/pci/if_ste.c b/sys/dev/pci/if_ste.c index b6053c0..34e9e13 100644 --- a/sys/dev/pci/if_ste.c +++ b/sys/dev/pci/if_ste.c @@ -1050,7 +1050,7 @@ ste_rxintr(struct ste_softc *sc) bpf_mtap(ifp, m); /* Pass it on. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } /* Update the receive pointer. */ diff --git a/sys/dev/pci/if_stge.c b/sys/dev/pci/if_stge.c index a8cd774..6cce8b9 100644 --- a/sys/dev/pci/if_stge.c +++ b/sys/dev/pci/if_stge.c @@ -1377,7 +1377,7 @@ stge_rxintr(struct stge_softc *sc) } #endif /* Pass it on. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } /* Update the receive pointer. */ diff --git a/sys/dev/pci/if_ti.c b/sys/dev/pci/if_ti.c index d4c5ef2..4912d8a 100644 --- a/sys/dev/pci/if_ti.c +++ b/sys/dev/pci/if_ti.c @@ -2030,7 +2030,7 @@ ti_rxeof(struct ti_softc *sc) continue); } - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } /* Only necessary on the Tigon 1. */ diff --git a/sys/dev/pci/if_tl.c b/sys/dev/pci/if_tl.c index bf5036c..a9dfb1b 100644 --- a/sys/dev/pci/if_tl.c +++ b/sys/dev/pci/if_tl.c @@ -1078,7 +1078,7 @@ tl_intr(void *v) } #endif bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } } bus_dmamap_sync(sc->tl_dmatag, sc->Rx_dmamap, 0, diff --git a/sys/dev/pci/if_txp.c b/sys/dev/pci/if_txp.c index b259ff9..bf560e3 100644 --- a/sys/dev/pci/if_txp.c +++ b/sys/dev/pci/if_txp.c @@ -751,7 +751,7 @@ txp_rx_reclaim(struct txp_softc *sc, struct txp_rx_ring *r, struct txp_dma_alloc continue); } - (*ifp->if_input)(ifp, m); + if_input(ifp, m); next: bus_dmamap_sync(sc->sc_dmat, dma->dma_map, diff --git a/sys/dev/pci/if_vge.c b/sys/dev/pci/if_vge.c index 3c4da7e..f23f785 100644 --- a/sys/dev/pci/if_vge.c +++ b/sys/dev/pci/if_vge.c @@ -1373,7 +1373,7 @@ vge_rxeof(struct vge_softc *sc) */ bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); lim++; if (lim == VGE_NRXDESC) diff --git a/sys/dev/pci/if_vioif.c b/sys/dev/pci/if_vioif.c index 6f60c5c..8f1fa30 100644 --- a/sys/dev/pci/if_vioif.c +++ b/sys/dev/pci/if_vioif.c @@ -1038,7 +1038,7 @@ vioif_rx_deq_locked(struct vioif_softc *sc) bpf_mtap(ifp, m); VIOIF_RX_UNLOCK(sc); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); VIOIF_RX_LOCK(sc); if (sc->sc_stopping) diff --git a/sys/dev/pci/if_vr.c b/sys/dev/pci/if_vr.c index 06ec081..0d1ad42 100644 --- a/sys/dev/pci/if_vr.c +++ b/sys/dev/pci/if_vr.c @@ -788,7 +788,7 @@ vr_rxeof(struct vr_softc *sc) */ bpf_mtap(ifp, m); /* Pass it on. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } /* Update the receive pointer. */ diff --git a/sys/dev/pci/if_vte.c b/sys/dev/pci/if_vte.c index f0f1293..8db52291 100644 --- a/sys/dev/pci/if_vte.c +++ b/sys/dev/pci/if_vte.c @@ -1131,7 +1131,7 @@ vte_rxeof(struct vte_softc *sc) m->m_pkthdr.rcvif = ifp; ifp->if_ipackets++; bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } if (prog > 0) { diff --git a/sys/dev/pci/if_wm.c b/sys/dev/pci/if_wm.c index 4124859..6a19ffe 100644 --- a/sys/dev/pci/if_wm.c +++ b/sys/dev/pci/if_wm.c @@ -7121,7 +7121,7 @@ wm_rxeof(struct wm_rxqueue *rxq) bpf_mtap(ifp, m); /* Pass it on. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); WM_RX_LOCK(rxq); diff --git a/sys/dev/pci/if_xge.c b/sys/dev/pci/if_xge.c index ffd22b3..798528c 100644 --- a/sys/dev/pci/if_xge.c +++ b/sys/dev/pci/if_xge.c @@ -808,7 +808,7 @@ xge_intr(void *pv) bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); if (++sc->sc_nextrx == NRXREAL) sc->sc_nextrx = 0; diff --git a/sys/dev/pci/ixgbe/ixgbe.c b/sys/dev/pci/ixgbe/ixgbe.c index a389453..a93cc94 100644 --- a/sys/dev/pci/ixgbe/ixgbe.c +++ b/sys/dev/pci/ixgbe/ixgbe.c @@ -1650,7 +1650,12 @@ ixgbe_legacy_irq(void *arg) } if ((ifp->if_flags & IFF_RUNNING) != 0) { +#ifdef __NetBSD__ + /* Don't run ixgbe_rxeof in interrupt context */ + more = true; +#else more = ixgbe_rxeof(que); +#endif IXGBE_TX_LOCK(txr); ixgbe_txeof(txr); @@ -1712,7 +1717,12 @@ ixgbe_msix_que(void *arg) ixgbe_disable_queue(adapter, que->msix); ++que->irqs; +#ifdef __NetBSD__ + /* Don't run ixgbe_rxeof in interrupt context */ + more = true; +#else more = ixgbe_rxeof(que); +#endif IXGBE_TX_LOCK(txr); ixgbe_txeof(txr); @@ -4812,7 +4822,7 @@ ixgbe_rx_input(struct rx_ring *rxr, struct ifnet *ifp, struct mbuf *m, u32 ptype s = splnet(); /* Pass this up to any BPF listeners. */ bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); splx(s); IXGBE_RX_LOCK(rxr); diff --git a/sys/dev/pci/ixgbe/ixv.c b/sys/dev/pci/ixgbe/ixv.c index 32d86b0..7dc5641 100644 --- a/sys/dev/pci/ixgbe/ixv.c +++ b/sys/dev/pci/ixgbe/ixv.c @@ -3372,7 +3372,7 @@ ixv_rx_input(struct rx_ring *rxr, struct ifnet *ifp, struct mbuf *m, u32 ptype) s = splnet(); /* Pass this up to any BPF listeners. */ bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); splx(s); IXV_RX_LOCK(rxr); diff --git a/sys/dev/pcmcia/if_cnw.c b/sys/dev/pcmcia/if_cnw.c index 4bfaf09..bf54ff7 100644 --- a/sys/dev/pcmcia/if_cnw.c +++ b/sys/dev/pcmcia/if_cnw.c @@ -856,7 +856,7 @@ cnw_recv(struct cnw_softc *sc) bpf_mtap(ifp, m); /* Pass the packet up. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } } diff --git a/sys/dev/pcmcia/if_malo_pcmcia.c b/sys/dev/pcmcia/if_malo_pcmcia.c index f9fb417..d3b4c93 100644 --- a/sys/dev/pcmcia/if_malo_pcmcia.c +++ b/sys/dev/pcmcia/if_malo_pcmcia.c @@ -1013,7 +1013,7 @@ cmalo_rx(struct malo_softc *sc) /* push the frame up to the network stack if not in monitor mode */ if (ic->ic_opmode != IEEE80211_M_MONITOR) { - (*ifp->if_input)(ifp, m); + if_input(ifp, m); ifp->if_ipackets++; } } diff --git a/sys/dev/pcmcia/if_ray.c b/sys/dev/pcmcia/if_ray.c index 98f844c..ed62d07 100644 --- a/sys/dev/pcmcia/if_ray.c +++ b/sys/dev/pcmcia/if_ray.c @@ -1517,7 +1517,7 @@ done: bpf_mtap(ifp, m); /* XXX doesn't appear to be included m->m_flags |= M_HASFCS; */ ifp->if_ipackets++; - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } /* diff --git a/sys/dev/pcmcia/if_xi.c b/sys/dev/pcmcia/if_xi.c index 7df0635..0df3f0d 100644 --- a/sys/dev/pcmcia/if_xi.c +++ b/sys/dev/pcmcia/if_xi.c @@ -475,7 +475,7 @@ xi_get(struct xi_softc *sc) bpf_mtap(ifp, top); - (*ifp->if_input)(ifp, top); + if_input(ifp, top); return (recvcount); } diff --git a/sys/dev/qbus/if_de.c b/sys/dev/qbus/if_de.c index eef778e..49ad29f 100644 --- a/sys/dev/qbus/if_de.c +++ b/sys/dev/qbus/if_de.c @@ -557,7 +557,7 @@ derecv(struct de_softc *sc) } bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); /* hang the receive buffer again */ next: rp->r_lenerr = 0; diff --git a/sys/dev/qbus/if_il.c b/sys/dev/qbus/if_il.c index c9c9faf..fdf3a5f 100644 --- a/sys/dev/qbus/if_il.c +++ b/sys/dev/qbus/if_il.c @@ -533,7 +533,7 @@ ilrint(void *arg) /* Shave off status hdr */ m_adj(m, 4); - (*sc->sc_if.if_input)(&sc->sc_if, m); + if_input(&sc->sc_if, m); setup: /* * Reset for next packet if possible. diff --git a/sys/dev/qbus/if_qe.c b/sys/dev/qbus/if_qe.c index 4ebb9ee..2ecae27 100644 --- a/sys/dev/qbus/if_qe.c +++ b/sys/dev/qbus/if_qe.c @@ -597,7 +597,7 @@ qeintr(void *arg) sc->sc_nextrx = 0; bpf_mtap(ifp, m); if ((status1 & QE_ESETUP) == 0) - (*ifp->if_input)(ifp, m); + if_input(ifp, m); else m_freem(m); } diff --git a/sys/dev/qbus/if_qt.c b/sys/dev/qbus/if_qt.c index 83f2b74..5e749a1 100644 --- a/sys/dev/qbus/if_qt.c +++ b/sys/dev/qbus/if_qt.c @@ -586,7 +586,7 @@ qtrint(struct qt_softc *sc) goto rnext; } bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); rnext: --sc->nrcv; rp->rmd3 = 0; diff --git a/sys/dev/sbus/be.c b/sys/dev/sbus/be.c index 7241ca6..e81c0f2 100644 --- a/sys/dev/sbus/be.c +++ b/sys/dev/sbus/be.c @@ -574,7 +574,7 @@ be_read(struct be_softc *sc, int idx, int len) */ bpf_mtap(ifp, m); /* Pass the packet up. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } /* diff --git a/sys/dev/sbus/qe.c b/sys/dev/sbus/qe.c index 24d1c5a..2bee6fe 100644 --- a/sys/dev/sbus/qe.c +++ b/sys/dev/sbus/qe.c @@ -429,7 +429,7 @@ qe_read(struct qe_softc *sc, int idx, int len) */ bpf_mtap(ifp, m); /* Pass the packet up. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } /* diff --git a/sys/dev/scsipi/if_se.c b/sys/dev/scsipi/if_se.c index 707b90d..c8d2680 100644 --- a/sys/dev/scsipi/if_se.c +++ b/sys/dev/scsipi/if_se.c @@ -674,7 +674,7 @@ se_read(struct se_softc *sc, char *data, int datalen) bpf_mtap(ifp, m); /* Pass the packet up. */ - (*ifp->if_input)(ifp, m); + if_input(ifp, m); next_packet: data += len; diff --git a/sys/dev/usb/if_aue.c b/sys/dev/usb/if_aue.c index 9d9343a..76face1 100644 --- a/sys/dev/usb/if_aue.c +++ b/sys/dev/usb/if_aue.c @@ -1173,7 +1173,7 @@ aue_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status) DPRINTFN(10,("%s: %s: deliver %d\n", device_xname(sc->aue_dev), __func__, m->m_len)); - (*(ifp)->if_input)((ifp), (m)); + if_input((ifp), (m)); done1: splx(s); diff --git a/sys/dev/usb/if_axe.c b/sys/dev/usb/if_axe.c index 13f2029..5698259 100644 --- a/sys/dev/usb/if_axe.c +++ b/sys/dev/usb/if_axe.c @@ -1095,7 +1095,7 @@ axe_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status) DPRINTFN(10,("%s: %s: deliver %d\n", device_xname(sc->axe_dev), __func__, m->m_len)); - (*(ifp)->if_input)((ifp), (m)); + if_input((ifp), (m)); splx(s); diff --git a/sys/dev/usb/if_axen.c b/sys/dev/usb/if_axen.c index 3ccd7bf..8d1e216 100644 --- a/sys/dev/usb/if_axen.c +++ b/sys/dev/usb/if_axen.c @@ -1112,7 +1112,7 @@ axen_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status) /* push the packet up */ s = splnet(); bpf_mtap(ifp, m); - (*(ifp)->if_input)((ifp), (m)); + if_input((ifp), (m)); splx(s); nextpkt: diff --git a/sys/dev/usb/if_cdce.c b/sys/dev/usb/if_cdce.c index 52067ab..45cc622 100644 --- a/sys/dev/usb/if_cdce.c +++ b/sys/dev/usb/if_cdce.c @@ -722,7 +722,7 @@ cdce_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status) bpf_mtap(ifp, m); - (*(ifp)->if_input)((ifp), (m)); + if_input((ifp), (m)); done1: splx(s); diff --git a/sys/dev/usb/if_cue.c b/sys/dev/usb/if_cue.c index bfe0b05..58d3c5f 100644 --- a/sys/dev/usb/if_cue.c +++ b/sys/dev/usb/if_cue.c @@ -798,7 +798,7 @@ cue_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status) DPRINTFN(10,("%s: %s: deliver %d\n", device_xname(sc->cue_dev), __func__, m->m_len)); - (*(ifp)->if_input)((ifp), (m)); + if_input((ifp), (m)); done1: splx(s); diff --git a/sys/dev/usb/if_kue.c b/sys/dev/usb/if_kue.c index b69c0d3..77b8ceb 100644 --- a/sys/dev/usb/if_kue.c +++ b/sys/dev/usb/if_kue.c @@ -723,7 +723,7 @@ kue_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status) DPRINTFN(10,("%s: %s: deliver %d\n", device_xname(sc->kue_dev), __func__, m->m_len)); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); splx(s); diff --git a/sys/dev/usb/if_smsc.c b/sys/dev/usb/if_smsc.c index 48cbf1b..314d0bd 100644 --- a/sys/dev/usb/if_smsc.c +++ b/sys/dev/usb/if_smsc.c @@ -1410,7 +1410,7 @@ smsc_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status) /* push the packet up */ s = splnet(); bpf_mtap(ifp, m); - ifp->if_input(ifp, m); + if_input(ifp, m); splx(s); } diff --git a/sys/dev/usb/if_udav.c b/sys/dev/usb/if_udav.c index 455481a..e707021 100644 --- a/sys/dev/usb/if_udav.c +++ b/sys/dev/usb/if_udav.c @@ -1203,7 +1203,7 @@ udav_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status) DPRINTF(("%s: %s: deliver %d\n", device_xname(sc->sc_dev), __func__, m->m_len)); - (*(ifp)->if_input)((ifp), (m)); + if_input((ifp), (m)); done1: splx(s); diff --git a/sys/dev/usb/if_upl.c b/sys/dev/usb/if_upl.c index 82095cd..42db489 100644 --- a/sys/dev/usb/if_upl.c +++ b/sys/dev/usb/if_upl.c @@ -546,7 +546,7 @@ upl_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status) DPRINTFN(10,("%s: %s: deliver %d\n", device_xname(sc->sc_dev), __func__, m->m_len)); - (*(ifp)->if_input)((ifp), (m)); + if_input((ifp), (m)); done1: splx(s); diff --git a/sys/dev/usb/if_url.c b/sys/dev/usb/if_url.c index 0d3d41a..1d54c5b 100644 --- a/sys/dev/usb/if_url.c +++ b/sys/dev/usb/if_url.c @@ -1065,7 +1065,7 @@ url_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status) DPRINTF(("%s: %s: deliver %d\n", device_xname(sc->sc_dev), __func__, m->m_len)); - (*(ifp)->if_input)((ifp), (m)); + if_input((ifp), (m)); done1: splx(s); diff --git a/sys/dev/usb/if_urndis.c b/sys/dev/usb/if_urndis.c index 1ae2f74..5448fef 100644 --- a/sys/dev/usb/if_urndis.c +++ b/sys/dev/usb/if_urndis.c @@ -874,7 +874,7 @@ urndis_decap(struct urndis_softc *sc, struct urndis_chain *c, uint32_t len) bpf_mtap(ifp, m); - (*(ifp)->if_input)((ifp), (m)); + if_input((ifp), (m)); } splx(s); diff --git a/sys/net/agr/if_agr.c b/sys/net/agr/if_agr.c index 5210867..4524715 100644 --- a/sys/net/agr/if_agr.c +++ b/sys/net/agr/if_agr.c @@ -158,7 +158,7 @@ agr_input(struct ifnet *ifp_port, struct mbuf *m) #endif bpf_mtap(ifp, m); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } /* diff --git a/sys/net/bpf.c b/sys/net/bpf.c index 825894c..a3af562 100644 --- a/sys/net/bpf.c +++ b/sys/net/bpf.c @@ -720,7 +720,7 @@ bpf_write(struct file *fp, off_t *offp, struct uio *uio, if (mc != NULL) { if (error == 0) - (*ifp->if_input)(ifp, mc); + if_input(ifp, mc); else m_freem(mc); } diff --git a/sys/net/if.c b/sys/net/if.c index 56e3d98..40d65fc 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -117,6 +117,7 @@ __KERNEL_RCSID(0, "$NetBSD: if.c,v 1.322 2016/01/21 15:41:29 riastradh Exp $"); #include #include #include +#include #include #include @@ -198,6 +199,7 @@ static void if_attachdomain1(struct ifnet *); static int ifconf(u_long, void *); static int if_clone_create(const char *); static int if_clone_destroy(const char *); +static void if_input_softint(void *); #if defined(INET) || defined(INET6) static void sysctl_net_pktq_setup(struct sysctllog **, int); @@ -564,6 +566,15 @@ skip: ifindex2ifnet[ifp->if_index] = ifp; } +static void +if_input_init_ifq(void *p, void *arg __unused, struct cpu_info *ci __unused) +{ + struct ifqueue *const ifq = p; + + memset(ifq, 0, sizeof(*ifq)); + ifq->ifq_maxlen = IFQ_MAXLEN; +} + /* * Initialize an interface and assign an index for it. * @@ -571,12 +582,12 @@ skip: * (e.g., ether_ifattach and ieee80211_ifattach) or if_alloc_sadl, * and be followed by if_register: * - * if_initialize(ifp); + * if_initialize(ifp, 0); * ether_ifattach(ifp, enaddr); * if_register(ifp); */ void -if_initialize(ifnet_t *ifp) +if_initialize(ifnet_t *ifp, int flags) { KASSERT(if_indexlim > 0); TAILQ_INIT(&ifp->if_addrlist); @@ -618,6 +629,13 @@ if_initialize(ifnet_t *ifp) IF_AFDATA_LOCK_INIT(ifp); if_getindex(ifp); + + if ((flags & IF_INPUTF_NO_SOFTINT) == 0) { + ifp->if_input_si = softint_establish(SOFTINT_NET|SOFTINT_MPSAFE, + if_input_softint, ifp); + ifp->if_input_ifqs = percpu_alloc(sizeof(struct ifqueue)); + percpu_foreach(ifp->if_input_ifqs, &if_input_init_ifq, NULL); + } } /* @@ -655,7 +673,7 @@ if_register(ifnet_t *ifp) void if_attach(ifnet_t *ifp) { - if_initialize(ifp); + if_initialize(ifp, 0); if_register(ifp); } @@ -728,6 +746,14 @@ if_purgeaddrs(struct ifnet *ifp, int family, void (*purgeaddr)(struct ifaddr *)) } } +static void +if_input_purge_ifq(void *p, void *arg __unused, struct cpu_info *ci __unused) +{ + struct ifqueue *const ifq = p; + + IF_PURGE(ifq); +} + /* * Detach an interface from the list of "active" interfaces, * freeing any resources as we go along. @@ -925,6 +951,12 @@ again: xc = xc_broadcast(0, (xcfunc_t)nullop, NULL, NULL); xc_wait(xc); + if (ifp->if_input_ifqs != NULL) { + percpu_foreach(ifp->if_input_ifqs, &if_input_purge_ifq, NULL); + percpu_free(ifp->if_input_ifqs, sizeof(struct ifqueue)); + softint_disestablish(ifp->if_input_si); + } + splx(s); } @@ -2442,6 +2474,54 @@ if_mcast_op(ifnet_t *ifp, const unsigned long cmd, const struct sockaddr *sa) } static void +if_input_softint(void *arg) +{ + struct ifnet *ifp = arg; + struct mbuf *m; + struct ifqueue *ifq; + int s; + + s = splnet(); + ifq = percpu_getref(ifp->if_input_ifqs); + while (!IF_IS_EMPTY(ifq)) { + IF_DEQUEUE(ifq, m); + ifp->if_input(ifp, m); + } + percpu_putref(ifp->if_input_ifqs); + splx(s); +} + +/* + * The common interface input routine that is called by device drivers. + * We ensure that the upper layer routines, e.g., ether_input and bridge_input, + * aren't run in hardware interrupt context. + */ +void +if_input(struct ifnet *ifp, struct mbuf *m) +{ + + if (ifp->if_input_ifqs) { + struct ifqueue *ifq = percpu_getref(ifp->if_input_ifqs); + + KASSERT(cpu_intr_p()); + + if (IF_QFULL(ifq)) { + IF_DROP(ifq); + m_freem(m); + return; + } + IF_ENQUEUE(ifq, m); + percpu_putref(ifp->if_input_ifqs); + + softint_schedule(ifp->if_input_si); + } else { + KASSERT(!cpu_intr_p()); + + ifp->if_input(ifp, m); + } +} + +static void sysctl_sndq_setup(struct sysctllog **clog, const char *ifname, struct ifaltq *ifq) { diff --git a/sys/net/if.h b/sys/net/if.h index f8051e4..803dc6d 100644 --- a/sys/net/if.h +++ b/sys/net/if.h @@ -85,6 +85,7 @@ #include #ifdef _KERNEL #include +#include #endif /* @@ -351,12 +352,14 @@ typedef struct ifnet { struct ifnet_lock *if_ioctl_lock; #ifdef _KERNEL /* XXX kvm(3) */ struct callout *if_slowtimo_ch; -#endif #ifdef GATEWAY struct kmutex *if_afdata_lock; #else struct krwlock *if_afdata_lock; #endif + void *if_input_si; + percpu_t *if_input_ifqs; +#endif } ifnet_t; #define if_mtu if_data.ifi_mtu @@ -924,7 +927,8 @@ void if_activate_sadl(struct ifnet *, struct ifaddr *, const struct sockaddr_dl *); void if_set_sadl(struct ifnet *, const void *, u_char, bool); void if_alloc_sadl(struct ifnet *); -void if_initialize(struct ifnet *); +void if_initialize(struct ifnet *, int); +#define IF_INPUTF_NO_SOFTINT 1 /* Don't use softint in if_input */ void if_register(struct ifnet *); void if_attach(struct ifnet *); /* Deprecated. Use if_initialize and if_register */ void if_attachdomain(void); @@ -946,6 +950,7 @@ int if_do_dad(struct ifnet *); int if_mcast_op(ifnet_t *, const unsigned long, const struct sockaddr *); int if_flags_set(struct ifnet *, const short); int if_clone_list(int, char *, int *); +void if_input(struct ifnet *, struct mbuf *); void ifa_insert(struct ifnet *, struct ifaddr *); void ifa_remove(struct ifnet *, struct ifaddr *); diff --git a/sys/net/if_atmsubr.c b/sys/net/if_atmsubr.c index a184ae3..2097a6a 100644 --- a/sys/net/if_atmsubr.c +++ b/sys/net/if_atmsubr.c @@ -257,7 +257,7 @@ atm_input(struct ifnet *ifp, struct atm_pseudohdr *ah, struct mbuf *m, switch (etype) { #ifdef INET case ETHERTYPE_IP: -#ifdef GATEWAY +#if 0 /* XXX re-enable once atm_input runs in softint */ if (ipflow_fastforward(m)) return; #endif @@ -266,7 +266,7 @@ atm_input(struct ifnet *ifp, struct atm_pseudohdr *ah, struct mbuf *m, #endif /* INET */ #ifdef INET6 case ETHERTYPE_IPV6: -#ifdef GATEWAY +#if 0 /* XXX re-enable once atm_input runs in softint */ if (ip6flow_fastforward(&m)) return; #endif diff --git a/sys/net/if_bridge.c b/sys/net/if_bridge.c index f51edd3..03eb052 100644 --- a/sys/net/if_bridge.c +++ b/sys/net/if_bridge.c @@ -1887,6 +1887,8 @@ bridge_input(struct ifnet *ifp, struct mbuf *m) struct bridge_iflist *bif; struct ether_header *eh; + KASSERT(!cpu_intr_p()); + if (__predict_false(sc == NULL) || (sc->sc_if.if_flags & IFF_RUNNING) == 0) { ether_input(ifp, m); diff --git a/sys/net/if_ethersubr.c b/sys/net/if_ethersubr.c index 67e2cf1..79437d0 100644 --- a/sys/net/if_ethersubr.c +++ b/sys/net/if_ethersubr.c @@ -88,6 +88,7 @@ __KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.215 2015/11/19 16:23:54 christos #include #include #include +#include #include #include @@ -539,6 +540,8 @@ ether_input(struct ifnet *ifp, struct mbuf *m) struct llc *l; #endif + KASSERT(!cpu_intr_p()); + if ((ifp->if_flags & IFF_UP) == 0) { m_freem(m); return; diff --git a/sys/net/if_tap.c b/sys/net/if_tap.c index c7a6aa9..f0168e1 100644 --- a/sys/net/if_tap.c +++ b/sys/net/if_tap.c @@ -342,7 +342,7 @@ tap_attach(device_t parent, device_t self, void *aux) sc->sc_ec.ec_capabilities = ETHERCAP_VLAN_MTU | ETHERCAP_JUMBO_MTU; /* Those steps are mandatory for an Ethernet driver. */ - if_initialize(ifp); + if_initialize(ifp, IF_INPUTF_NO_SOFTINT); ether_ifattach(ifp, enaddr); if_register(ifp); @@ -1061,7 +1061,7 @@ tap_dev_write(int unit, struct uio *uio, int flags) bpf_mtap(ifp, m); s = splnet(); - (*ifp->if_input)(ifp, m); + if_input(ifp, m); splx(s); return (0); diff --git a/sys/net80211/ieee80211_input.c b/sys/net80211/ieee80211_input.c index c4f6796..f39387c 100644 --- a/sys/net80211/ieee80211_input.c +++ b/sys/net80211/ieee80211_input.c @@ -766,7 +766,7 @@ ieee80211_deliver_data(struct ieee80211com *ic, /* XXX goto err? */ VLAN_INPUT_TAG(ifp, m, ni->ni_vlan, goto out); } - (*ifp->if_input)(ifp, m); + if_input(ifp, m); } return; out: diff --git a/sys/netinet/ip_etherip.c b/sys/netinet/ip_etherip.c index 5e444f2..d60d0f8 100644 --- a/sys/netinet/ip_etherip.c +++ b/sys/netinet/ip_etherip.c @@ -259,7 +259,7 @@ ip_etherip_input(struct mbuf *m, ...) ifp->if_ipackets++; s = splnet(); - (ifp->if_input)(ifp, m); + if_input(ifp, m); splx(s); return; diff --git a/sys/netinet6/ip6_etherip.c b/sys/netinet6/ip6_etherip.c index a06d301..80795af 100644 --- a/sys/netinet6/ip6_etherip.c +++ b/sys/netinet6/ip6_etherip.c @@ -264,7 +264,7 @@ ip6_etherip_input(struct mbuf **mp, int *offp, int proto) ifp->if_ipackets++; s = splnet(); - (ifp->if_input)(ifp, m); + if_input(ifp, m); splx(s); return IPPROTO_DONE; diff --git a/sys/rump/net/lib/libshmif/if_shmem.c b/sys/rump/net/lib/libshmif/if_shmem.c index 89b8b91..2cea961 100644 --- a/sys/rump/net/lib/libshmif/if_shmem.c +++ b/sys/rump/net/lib/libshmif/if_shmem.c @@ -186,8 +186,9 @@ allocif(int unit, struct shmif_sc **scp) mutex_init(&sc->sc_mtx, MUTEX_DEFAULT, IPL_NONE); cv_init(&sc->sc_cv, "shmifcv"); - if_attach(ifp); + if_initialize(ifp, IF_INPUTF_NO_SOFTINT); ether_ifattach(ifp, enaddr); + if_register(ifp); aprint_verbose("shmif%d: Ethernet address %s\n", unit, ether_sprintf(enaddr)); @@ -765,7 +766,7 @@ shmif_rcv(void *arg) ifp->if_ipackets++; KERNEL_LOCK(1, NULL); bpf_mtap(ifp, m); - ifp->if_input(ifp, m); + if_input(ifp, m); KERNEL_UNLOCK_ONE(NULL); m = NULL; } diff --git a/sys/rump/net/lib/libvirtif/if_virt.c b/sys/rump/net/lib/libvirtif/if_virt.c index fd8f34c..7b14d23a 100644 --- a/sys/rump/net/lib/libvirtif/if_virt.c +++ b/sys/rump/net/lib/libvirtif/if_virt.c @@ -121,7 +121,8 @@ virtif_clone(struct if_clone *ifc, int num) ifp->if_mtu = ETHERMTU; ifp->if_dlt = DLT_EN10MB; - if_attach(ifp); + if_initialize(ifp, IF_INPUTF_NO_SOFTINT); + if_register(ifp); #ifndef RUMP_VIF_LINKSTR /* @@ -377,7 +378,7 @@ VIF_DELIVERPKT(struct virtif_sc *sc, struct iovec *iov, size_t iovlen) m->m_pkthdr.rcvif = ifp; KERNEL_LOCK(1, NULL); bpf_mtap(ifp, m); - ifp->if_input(ifp, m); + if_input(ifp, m); KERNEL_UNLOCK_LAST(NULL); } else { m_freem(m);