I saw this was already committed, but one tiny consistency nit inline below.
On Tue, Jul 08, 2014 at 05:11:22PM +0200, Henning Brauer wrote:
> I'll need this for some upcoming changes, at least to do it WITHOUT
> adding the 3rd or 4th or 5th copy of the bpf_mtap loop. most of these
> bpf_mtap_* are almost identical, minor differences in what to prepend,
> and foremost: passing custom copy functions. since bpf_mtap is all
> over the place I made bpf_mtap_hdr the flexible one: takes the copy
> function as parameter (if NULL, use default), and don't prepend
> anything if dlen == 0 (so can be used like bpf_mtap).
>
> lightly tested.
>
> Index: arch/sparc/dev/if_ie.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/sparc/dev/if_ie.c,v
> retrieving revision 1.45
> diff -u -p -r1.45 if_ie.c
> --- arch/sparc/dev/if_ie.c 28 Nov 2013 22:18:52 -0000 1.45
> +++ arch/sparc/dev/if_ie.c 8 Jul 2014 14:37:17 -0000
> @@ -1335,7 +1335,7 @@ ie_readframe(sc, num)
> if (bpf_gets_it) {
> /* Pass it up. */
> bpf_mtap_hdr(sc->sc_arpcom.ac_if.if_bpf, (caddr_t)&eh,
> - sizeof(eh), m, BPF_DIRECTION_IN);
> + sizeof(eh), m, BPF_DIRECTION_IN, NULL);
> }
> /*
> * A signal passed up from the filtering code indicating that the
> Index: net/bpf.c
> ===================================================================
> RCS file: /cvs/src/sys/net/bpf.c,v
> retrieving revision 1.93
> diff -u -p -r1.93 bpf.c
> --- net/bpf.c 23 Apr 2014 10:50:18 -0000 1.93
> +++ net/bpf.c 8 Jul 2014 15:09:10 -0000
> @@ -92,6 +92,8 @@ LIST_HEAD(, bpf_d) bpf_d_list;
> void bpf_allocbufs(struct bpf_d *);
> void bpf_freed(struct bpf_d *);
> void bpf_ifname(struct ifnet *, struct ifreq *);
> +void _bpf_mtap(caddr_t, struct mbuf *, u_int,
> + void (*)(const void *, void *, size_t));
> void bpf_mcopy(const void *, void *, size_t);
> int bpf_movein(struct uio *, u_int, struct mbuf **,
> struct sockaddr *, struct bpf_insn *);
> @@ -1159,10 +1161,11 @@ bpf_mcopy(const void *src_arg, void *dst
> }
>
> /*
> - * Incoming linkage from device drivers, when packet is in an mbuf chain.
> + * like bpf_mtap, but copy fn can be given. used by various bpf_mtap*
> */
> void
> -bpf_mtap(caddr_t arg, struct mbuf *m, u_int direction)
> +_bpf_mtap(caddr_t arg, struct mbuf *m, u_int direction,
> + void (*cpfn)(const void *, void *, size_t))
> {
> struct bpf_if *bp = (struct bpf_if *)arg;
> struct bpf_d *d;
> @@ -1174,6 +1177,9 @@ bpf_mtap(caddr_t arg, struct mbuf *m, u_
> if (m == NULL)
> return;
>
> + if (cpfn == NULL)
> + cpfn = bpf_mcopy;
> +
> pktlen = 0;
> for (m0 = m; m0 != 0; m0 = m0->m_next)
> pktlen += m0->m_len;
> @@ -1191,13 +1197,22 @@ bpf_mtap(caddr_t arg, struct mbuf *m, u_
>
> if (!gottime++)
> microtime(&tv);
> - bpf_catchpacket(d, (u_char *)m, pktlen, slen, bpf_mcopy, &tv);
> + bpf_catchpacket(d, (u_char *)m, pktlen, slen, cpfn, &tv);
> if (d->bd_fildrop)
> m->m_flags |= M_FILDROP;
> }
> }
>
> /*
> + * Incoming linkage from device drivers, when packet is in an mbuf chain.
> + */
> +void
> +bpf_mtap(caddr_t arg, struct mbuf *m, u_int direction)
> +{
> + _bpf_mtap(arg, m, direction, NULL);
> +}
> +
> +/*
> * Incoming linkage from device drivers, where we have a mbuf chain
> * but need to prepend some arbitrary header from a linear buffer.
> *
> @@ -1208,17 +1223,23 @@ bpf_mtap(caddr_t arg, struct mbuf *m, u_
> */
> void
> bpf_mtap_hdr(caddr_t arg, caddr_t data, u_int dlen, struct mbuf *m,
> - u_int direction)
> + u_int direction, void (*cpfn)(const void *, void *, size_t))
> {
> - struct m_hdr mh;
> -
> - mh.mh_flags = 0;
> - mh.mh_next = m;
> - mh.mh_len = dlen;
> - mh.mh_data = data;
> + struct m_hdr mh;
> + struct mbuf *m0;
>
> - bpf_mtap(arg, (struct mbuf *) &mh, direction);
> - m->m_flags |= mh.mh_flags & M_FILDROP;
> + if (dlen > 0) {
> + mh.mh_flags = 0;
> + mh.mh_next = m;
> + mh.mh_len = dlen;
> + mh.mh_data = data;
> + m0 = (struct mbuf *)&mh;
> + } else
> + m0 = m;
> +
> + _bpf_mtap(arg, (struct mbuf *) m0, direction, cpfn);
> + if (m0 != m)
> + m->m_flags |= m0->m_flags & M_FILDROP;
> }
>
> /*
> @@ -1233,17 +1254,10 @@ bpf_mtap_hdr(caddr_t arg, caddr_t data,
> void
> bpf_mtap_af(caddr_t arg, u_int32_t af, struct mbuf *m, u_int direction)
> {
> - struct m_hdr mh;
> u_int32_t afh;
>
> - mh.mh_flags = 0;
> - mh.mh_next = m;
> - mh.mh_len = 4;
> afh = htonl(af);
> - mh.mh_data = (caddr_t)&afh;
> -
> - bpf_mtap(arg, (struct mbuf *) &mh, direction);
> - m->m_flags |= mh.mh_flags & M_FILDROP;
> + bpf_mtap_hdr(arg, (caddr_t)&afh, 4, m, direction, NULL);
I realize this is kind of obvious because afh is declared immediately before
this, but to me that 4 looks out of place. Perhaps sizeof(afh) would be
better?
> }
>
> /*
> @@ -1259,7 +1273,6 @@ void
> bpf_mtap_ether(caddr_t arg, struct mbuf *m, u_int direction)
> {
> #if NVLAN > 0
> - struct m_hdr mh;
> struct ether_vlan_header evh;
>
> if ((m->m_flags & M_VLANTAG) == 0)
> @@ -1277,13 +1290,7 @@ bpf_mtap_ether(caddr_t arg, struct mbuf
> m->m_len -= ETHER_HDR_LEN;
> m->m_data += ETHER_HDR_LEN;
>
> - mh.mh_flags = 0;
> - mh.mh_next = m;
> - mh.mh_len = sizeof(evh);
> - mh.mh_data = (caddr_t)&evh;
> -
> - bpf_mtap(arg, (struct mbuf *) &mh, direction);
> - m->m_flags |= mh.mh_flags & M_FILDROP;
> + bpf_mtap_hdr(arg, (caddr_t)&evh, sizeof(evh), m, direction, NULL);
>
> m->m_len += ETHER_HDR_LEN;
> m->m_data -= ETHER_HDR_LEN;
> @@ -1294,42 +1301,11 @@ void
> bpf_mtap_pflog(caddr_t arg, caddr_t data, struct mbuf *m)
> {
> #if NPFLOG > 0
> - struct m_hdr mh;
> - struct bpf_if *bp = (struct bpf_if *)arg;
> - struct bpf_d *d;
> - size_t pktlen, slen;
> - struct mbuf *m0;
> - struct timeval tv;
> - int gottime = 0;
> -
> if (m == NULL)
> return;
>
> - mh.mh_flags = 0;
> - mh.mh_next = m;
> - mh.mh_len = PFLOG_HDRLEN;
> - mh.mh_data = data;
> -
> - pktlen = mh.mh_len;
> - for (m0 = m; m0 != 0; m0 = m0->m_next)
> - pktlen += m0->m_len;
> -
> - for (d = bp->bif_dlist; d != 0; d = d->bd_next) {
> - ++d->bd_rcount;
> - if ((BPF_DIRECTION_OUT & d->bd_dirfilt) != 0)
> - slen = 0;
> - else
> - slen = bpf_filter(d->bd_rfilter, (u_char *)&mh,
> - pktlen, 0);
> -
> - if (slen == 0)
> - continue;
> -
> - if (!gottime++)
> - microtime(&tv);
> - bpf_catchpacket(d, (u_char *)&mh, pktlen, slen, pflog_bpfcopy,
> - &tv);
> - }
> + bpf_mtap_hdr(arg, data, PFLOG_HDRLEN, m, BPF_DIRECTION_OUT,
> + pflog_bpfcopy);
> #endif
> }
>
> Index: net/bpf.h
> ===================================================================
> RCS file: /cvs/src/sys/net/bpf.h,v
> retrieving revision 1.43
> diff -u -p -r1.43 bpf.h
> --- net/bpf.h 26 Mar 2012 19:37:42 -0000 1.43
> +++ net/bpf.h 8 Jul 2014 14:40:33 -0000
> @@ -272,7 +272,8 @@ struct bpf_dltlist {
> int bpf_validate(struct bpf_insn *, int);
> int bpf_tap(caddr_t, u_char *, u_int, u_int);
> void bpf_mtap(caddr_t, struct mbuf *, u_int);
> -void bpf_mtap_hdr(caddr_t, caddr_t, u_int, struct mbuf *, u_int);
> +void bpf_mtap_hdr(caddr_t, caddr_t, u_int, struct mbuf *, u_int,
> + void (*)(const void *, void *, size_t));
> void bpf_mtap_af(caddr_t, u_int32_t, struct mbuf *, u_int);
> void bpf_mtap_ether(caddr_t, struct mbuf *, u_int);
> void bpf_mtap_pflog(caddr_t, caddr_t, struct mbuf *);
> Index: net/if_bridge.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_bridge.c,v
> retrieving revision 1.223
> diff -u -p -r1.223 if_bridge.c
> --- net/if_bridge.c 19 Apr 2014 14:39:26 -0000 1.223
> +++ net/if_bridge.c 8 Jul 2014 14:30:30 -0000
> @@ -1330,7 +1330,7 @@ bridge_input(struct ifnet *ifp, struct e
> #if NBPFILTER > 0
> if (sc->sc_if.if_bpf)
> bpf_mtap_hdr(sc->sc_if.if_bpf, (caddr_t)eh,
> - ETHER_HDR_LEN, m, BPF_DIRECTION_IN);
> + ETHER_HDR_LEN, m, BPF_DIRECTION_IN, NULL);
> #endif
>
> bridge_span(sc, eh, m);
> @@ -1441,10 +1441,8 @@ bridge_input(struct ifnet *ifp, struct e
> * is aware */
> #if NBPFILTER > 0
> if (ifl->ifp->if_bpf)
> - bpf_mtap_hdr(ifl->ifp->if_bpf,
> - (caddr_t)eh,
> - ETHER_HDR_LEN, m,
> - BPF_DIRECTION_IN);
> + bpf_mtap_hdr(ifl->ifp->if_bpf, (caddr_t)eh,
> + ETHER_HDR_LEN, m, BPF_DIRECTION_IN, NULL);
> #endif
> /* Count for the interface we are going to */
> ifl->ifp->if_ipackets++;
> Index: net/if_trunk.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_trunk.c,v
> retrieving revision 1.87
> diff -u -p -r1.87 if_trunk.c
> --- net/if_trunk.c 10 Mar 2014 12:21:35 -0000 1.87
> +++ net/if_trunk.c 8 Jul 2014 14:31:04 -0000
> @@ -1102,7 +1102,7 @@ trunk_input(struct ifnet *ifp, struct et
> #if NBPFILTER > 0
> if (trifp->if_bpf && tr->tr_proto != TRUNK_PROTO_FAILOVER)
> bpf_mtap_hdr(trifp->if_bpf, (char *)eh, ETHER_HDR_LEN, m,
> - BPF_DIRECTION_IN);
> + BPF_DIRECTION_IN, NULL);
> #endif
>
> error = (*tr->tr_input)(tr, tp, eh, m);
> @@ -1372,7 +1372,7 @@ trunk_fail_input(struct trunk_softc *tr,
> #if NBPFILTER > 0
> if (ifp->if_bpf)
> bpf_mtap_hdr(ifp->if_bpf, (char *)eh, ETHER_HDR_LEN, m,
> - BPF_DIRECTION_IN);
> + BPF_DIRECTION_IN, NULL);
> #endif
>
> m->m_pkthdr.rcvif = ifp;
> Index: net/if_vlan.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_vlan.c,v
> retrieving revision 1.105
> diff -u -p -r1.105 if_vlan.c
> --- net/if_vlan.c 14 May 2014 21:48:50 -0000 1.105
> +++ net/if_vlan.c 8 Jul 2014 14:31:47 -0000
> @@ -299,7 +299,7 @@ vlan_input(struct ether_header *eh, stru
> #if NBPFILTER > 0
> if (ifv->ifv_if.if_bpf)
> bpf_mtap_hdr(ifv->ifv_if.if_bpf, (char *)eh, ETHER_HDR_LEN, m,
> - BPF_DIRECTION_IN);
> + BPF_DIRECTION_IN, NULL);
> #endif
>
> /*
> Index: netinet/ip_ah.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_ah.c,v
> retrieving revision 1.108
> diff -u -p -r1.108 ip_ah.c
> --- netinet/ip_ah.c 9 Jan 2014 06:29:05 -0000 1.108
> +++ netinet/ip_ah.c 8 Jul 2014 14:39:01 -0000
> @@ -1016,7 +1016,7 @@ ah_output(struct mbuf *m, struct tdb *td
> hdr.flags |= M_AUTH;
>
> bpf_mtap_hdr(encif->if_bpf, (char *)&hdr,
> - ENC_HDRLEN, m, BPF_DIRECTION_OUT);
> + ENC_HDRLEN, m, BPF_DIRECTION_OUT, NULL);
> }
> }
> #endif
> Index: netinet/ip_carp.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_carp.c,v
> retrieving revision 1.230
> diff -u -p -r1.230 ip_carp.c
> --- netinet/ip_carp.c 30 Jun 2014 07:02:22 -0000 1.230
> +++ netinet/ip_carp.c 8 Jul 2014 14:39:01 -0000
> @@ -1454,7 +1454,7 @@ carp_input(struct ifnet *ifp0, struct et
> #if NBPFILTER > 0
> if (vh->sc_if.if_bpf)
> bpf_mtap_hdr(vh->sc_if.if_bpf, (char *)&eh,
> - ETHER_HDR_LEN, m0, BPF_DIRECTION_IN);
> + ETHER_HDR_LEN, m0, BPF_DIRECTION_IN, NULL);
> #endif
> vh->sc_if.if_ipackets++;
> ether_input(&vh->sc_if, &eh, m0);
> @@ -1470,7 +1470,7 @@ carp_input(struct ifnet *ifp0, struct et
> #if NBPFILTER > 0
> if (ifp->if_bpf)
> bpf_mtap_hdr(ifp->if_bpf, (char *)&eh, ETHER_HDR_LEN, m,
> - BPF_DIRECTION_IN);
> + BPF_DIRECTION_IN, NULL);
> #endif
> ifp->if_ipackets++;
> ether_input(ifp, &eh, m);
> Index: netinet/ip_esp.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_esp.c,v
> retrieving revision 1.123
> diff -u -p -r1.123 ip_esp.c
> --- netinet/ip_esp.c 9 Jan 2014 06:29:06 -0000 1.123
> +++ netinet/ip_esp.c 8 Jul 2014 14:39:01 -0000
> @@ -803,7 +803,7 @@ esp_output(struct mbuf *m, struct tdb *t
> hdr.flags |= M_AUTH;
>
> bpf_mtap_hdr(encif->if_bpf, (char *)&hdr,
> - ENC_HDRLEN, m, BPF_DIRECTION_OUT);
> + ENC_HDRLEN, m, BPF_DIRECTION_OUT, NULL);
> }
> }
> #endif
> Index: netinet/ip_ipcomp.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_ipcomp.c,v
> retrieving revision 1.33
> diff -u -p -r1.33 ip_ipcomp.c
> --- netinet/ip_ipcomp.c 9 Jan 2014 06:29:06 -0000 1.33
> +++ netinet/ip_ipcomp.c 8 Jul 2014 14:39:01 -0000
> @@ -402,7 +402,7 @@ ipcomp_output(m, tdb, mp, skip, protoff)
> hdr.spi = tdb->tdb_spi;
>
> bpf_mtap_hdr(encif->if_bpf, (char *)&hdr,
> - ENC_HDRLEN, m, BPF_DIRECTION_OUT);
> + ENC_HDRLEN, m, BPF_DIRECTION_OUT, NULL);
> }
> }
> #endif
> Index: netinet/ipsec_input.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ipsec_input.c,v
> retrieving revision 1.120
> diff -u -p -r1.120 ipsec_input.c
> --- netinet/ipsec_input.c 14 Apr 2014 09:06:42 -0000 1.120
> +++ netinet/ipsec_input.c 8 Jul 2014 14:39:01 -0000
> @@ -702,7 +702,7 @@ ipsec_common_input_cb(struct mbuf *m, st
> hdr.flags = m->m_flags & (M_AUTH|M_CONF);
>
> bpf_mtap_hdr(encif->if_bpf, (char *)&hdr,
> - ENC_HDRLEN, m, BPF_DIRECTION_IN);
> + ENC_HDRLEN, m, BPF_DIRECTION_IN, NULL);
> }
> }
> #endif
>