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
> 

Reply via email to