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);
 }
 
 /*
@@ -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

Reply via email to