Index: net/bpf.c =================================================================== RCS file: /cvs/src/sys/net/bpf.c,v diff -u -p -r1.225 bpf.c --- net/bpf.c 15 Aug 2024 12:20:20 -0000 1.225 +++ net/bpf.c 1 Nov 2024 01:47:54 -0000 @@ -1758,13 +1758,22 @@ bpfsattach(caddr_t *bpfp, const char *na return (bp); } -void -bpfattach(caddr_t *driverp, struct ifnet *ifp, u_int dlt, u_int hdrlen) +void * +bpfxattach(caddr_t *driverp, const char *name, struct ifnet *ifp, + u_int dlt, u_int hdrlen) { struct bpf_if *bp; - bp = bpfsattach(driverp, ifp->if_xname, dlt, hdrlen); + bp = bpfsattach(driverp, name, dlt, hdrlen); bp->bif_ifp = ifp; + + return (bp); +} + +void +bpfattach(caddr_t *driverp, struct ifnet *ifp, u_int dlt, u_int hdrlen) +{ + bpfxattach(driverp, ifp->if_xname, ifp, dlt, hdrlen); } /* Detach an interface from its attached bpf device. */ Index: net/bpf.h =================================================================== RCS file: /cvs/src/sys/net/bpf.h,v diff -u -p -r1.73 bpf.h --- net/bpf.h 15 Aug 2024 12:20:20 -0000 1.73 +++ net/bpf.h 1 Nov 2024 01:47:54 -0000 @@ -327,6 +327,7 @@ int bpf_tap_hdr(caddr_t, const void *, void bpfattach(caddr_t *, struct ifnet *, u_int, u_int); void bpfdetach(struct ifnet *); void *bpfsattach(caddr_t *, const char *, u_int, u_int); +void *bpfxattach(caddr_t *, const char *, struct ifnet *, u_int, u_int); void bpfsdetach(void *); void bpfilterattach(int); Index: net/ifq.c =================================================================== RCS file: /cvs/src/sys/net/ifq.c,v diff -u -p -r1.53 ifq.c --- net/ifq.c 10 Nov 2023 15:51:24 -0000 1.53 +++ net/ifq.c 1 Nov 2024 01:47:54 -0000 @@ -659,6 +659,7 @@ void ifiq_init(struct ifiqueue *ifiq, struct ifnet *ifp, unsigned int idx) { ifiq->ifiq_if = ifp; + ifiq->ifiq_bpfp = NULL; ifiq->ifiq_softnet = net_tq(idx); ifiq->ifiq_softc = NULL; @@ -706,6 +707,32 @@ ifiq_destroy(struct ifiqueue *ifiq) unsigned int ifiq_maxlen_drop = 2048 * 5; unsigned int ifiq_maxlen_return = 2048 * 3; +#if NBPFILTER > 0 +static unsigned int +ifiq_bpfilter(struct ifnet *ifp, caddr_t if_bpf, struct mbuf_list *ml) +{ + unsigned int fdrops = 0; + struct mbuf_list ml0; + struct mbuf *m; + + if (if_bpf == NULL) + return (0); + + ml0 = *ml; + ml_init(ml); + + while ((m = ml_dequeue(&ml0)) != NULL) { + if ((*ifp->if_bpf_mtap)(if_bpf, m, BPF_DIRECTION_IN)) { + m_freem(m); + fdrops++; + } else + ml_enqueue(ml, m); + } + + return (fdrops); +} +#endif + int ifiq_input(struct ifiqueue *ifiq, struct mbuf_list *ml) { @@ -715,9 +742,6 @@ ifiq_input(struct ifiqueue *ifiq, struct uint64_t bytes = 0; uint64_t fdrops = 0; unsigned int len; -#if NBPFILTER > 0 - caddr_t if_bpf; -#endif if (ml_empty(ml)) return (0); @@ -730,29 +754,17 @@ ifiq_input(struct ifiqueue *ifiq, struct packets = ml_len(ml); #if NBPFILTER > 0 - if_bpf = ifp->if_bpf; - if (if_bpf) { - struct mbuf_list ml0 = *ml; - - ml_init(ml); - - while ((m = ml_dequeue(&ml0)) != NULL) { - if ((*ifp->if_bpf_mtap)(if_bpf, m, BPF_DIRECTION_IN)) { - m_freem(m); - fdrops++; - } else - ml_enqueue(ml, m); - } - - if (ml_empty(ml)) { - mtx_enter(&ifiq->ifiq_mtx); - ifiq->ifiq_packets += packets; - ifiq->ifiq_bytes += bytes; - ifiq->ifiq_fdrops += fdrops; - mtx_leave(&ifiq->ifiq_mtx); + fdrops += ifiq_bpfilter(ifp, *ifiq->ifiq_bpfp, ml); + fdrops += ifiq_bpfilter(ifp, ifp->if_bpf, ml); - return (0); - } + if (ml_empty(ml)) { + mtx_enter(&ifiq->ifiq_mtx); + ifiq->ifiq_packets += packets; + ifiq->ifiq_bytes += bytes; + ifiq->ifiq_fdrops += fdrops; + mtx_leave(&ifiq->ifiq_mtx); + + return (0); } #endif Index: net/ifq.h =================================================================== RCS file: /cvs/src/sys/net/ifq.h,v diff -u -p -r1.41 ifq.h --- net/ifq.h 10 Nov 2023 15:51:24 -0000 1.41 +++ net/ifq.h 1 Nov 2024 01:47:54 -0000 @@ -75,6 +75,7 @@ struct ifqueue { struct ifiqueue { struct ifnet *ifiq_if; + caddr_t *ifiq_bpfp; struct taskq *ifiq_softnet; union { void *_ifiq_softc; Index: dev/pci/if_vmx.c =================================================================== RCS file: /cvs/src/sys/dev/pci/if_vmx.c,v diff -u -p -r1.89 if_vmx.c --- dev/pci/if_vmx.c 1 Sep 2024 03:08:59 -0000 1.89 +++ dev/pci/if_vmx.c 1 Nov 2024 01:47:54 -0000 @@ -124,6 +124,7 @@ struct vmxnet3_txqueue { struct vmxnet3_comp_ring comp_ring; struct vmxnet3_txq_shared *ts; struct ifqueue *ifq; + caddr_t *bpfp; struct kstat *txkstat; unsigned int queue; } __aligned(64); @@ -144,6 +145,7 @@ struct vmxnet3_queue { char intrname[16]; void *ih; int intr; + caddr_t bpf; }; struct vmxnet3_softc { @@ -452,9 +454,24 @@ vmxnet3_attach(struct device *parent, st #endif for (i = 0; i < sc->sc_nqueues; i++) { - ifp->if_ifqs[i]->ifq_softc = &sc->sc_q[i].tx; - sc->sc_q[i].tx.ifq = ifp->if_ifqs[i]; - sc->sc_q[i].rx.ifiq = ifp->if_iqs[i]; + struct vmxnet3_queue *q = &sc->sc_q[i]; + struct ifiqueue *ifiq; + + ifp->if_ifqs[i]->ifq_softc = &q->tx; + q->tx.ifq = ifp->if_ifqs[i]; + + ifiq = ifp->if_iqs[i]; + q->rx.ifiq = ifiq; + +#if NBPFILTER > 0 + if (sc->sc_intrmap != NULL) { + bpfxattach(&q->bpf, q->intrname, + ifp, DLT_EN10MB, ETHER_HDR_LEN); + + ifiq->ifiq_bpfp = &q->bpf; + q->tx.bpfp = &q->bpf; + } +#endif #if NKSTAT > 0 vmx_kstat_txstats(sc, &sc->sc_q[i].tx, i); @@ -1604,6 +1621,9 @@ vmxnet3_start(struct ifqueue *ifq) unsigned int prod, free, i; unsigned int post = 0; uint32_t rgen, gen; +#if NBPFILTER > 0 + caddr_t if_bpf; +#endif struct mbuf *m; @@ -1663,8 +1683,13 @@ vmxnet3_start(struct ifqueue *ifq) } #if NBPFILTER > 0 - if (ifp->if_bpf) - bpf_mtap_ether(ifp->if_bpf, m, BPF_DIRECTION_OUT); + if_bpf = ifp->if_bpf; + if (if_bpf) + bpf_mtap_ether(if_bpf, m, BPF_DIRECTION_OUT); + + if_bpf = *tq->bpfp; + if (if_bpf) + bpf_mtap_ether(if_bpf, m, BPF_DIRECTION_OUT); #endif ring->m[prod] = m;