- Add support for attaching alternative DLTs to an interface.
authorJoerg Sonnenberger <joerg@dragonflybsd.org>
Wed, 26 Jan 2005 00:37:40 +0000 (00:37 +0000)
committerJoerg Sonnenberger <joerg@dragonflybsd.org>
Wed, 26 Jan 2005 00:37:40 +0000 (00:37 +0000)
  The function is named bpfattach_dlt, FreeBSD used bpfattach2.
- Change bpf_mtap to take the bpf_if directly.
- Add support for BIOCSDLT and BIOCGDLT to recieve a list of DLTs
  available on an interface.

Obtained-from: FreeBSD

- Add bpf_ptap, which takes an mbuf and a header, builds a temporary
  mbuf chain and calls bpf_mtap on that.

Inspired-by: FreeBSD's bpf_mtap2
- Use the new interface for all drivers doing this by hand before.
- Include the formerly commented out support for radio headers in wi(4)
  and wlan(4).
- Change if_loop, i4b_ipr, disc and ic to prepend a uint32_t, not an int.

28 files changed:
sys/dev/netif/ic/if_ic.c
sys/dev/netif/plip/if_plip.c
sys/dev/netif/wi/if_wi.c
sys/net/bpf.c
sys/net/bpf.h
sys/net/bpfdesc.h
sys/net/disc/if_disc.c
sys/net/ef/if_ef.c
sys/net/faith/if_faith.c
sys/net/gif/if_gif.c
sys/net/gre/if_gre.c
sys/net/i4b/driver/i4b_ipr.c
sys/net/if_ethersubr.c
sys/net/if_loop.c
sys/net/ppp/if_ppp.c
sys/net/sl/if_sl.c
sys/net/stf/if_stf.c
sys/net/tun/if_tun.c
sys/net/vlan/if_vlan.c
sys/netgraph/fec/ng_fec.c
sys/netgraph/iface/ng_iface.c
sys/netinet/ip_gre.c
sys/netproto/802_11/ieee80211.c
sys/netproto/802_11/ieee80211_input.c
sys/netproto/802_11/ieee80211_var.h
sys/netproto/802_11/wlan/ieee80211.c
sys/netproto/802_11/wlan/ieee80211_input.c
sys/netproto/802_11/wlan/ieee80211_var.h

index cdbdbcb..d15f26e 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/iicbus/if_ic.c,v 1.8 1999/12/29 04:35:39 peter Exp $
- * $DragonFly: src/sys/dev/netif/ic/if_ic.c,v 1.9 2005/01/23 20:21:31 joerg Exp $
+ * $DragonFly: src/sys/dev/netif/ic/if_ic.c,v 1.10 2005/01/26 00:37:39 joerg Exp $
  */
 
 /*
@@ -67,7 +67,7 @@
 
 #include "iicbus_if.h"
 
-#define ICHDRLEN       sizeof(u_int)
+#define ICHDRLEN       sizeof(uint32_t)
 #define ICMTU          1500            /* default mtu */
 
 struct ic_softc {
@@ -370,7 +370,7 @@ icoutput(struct ifnet *ifp, struct mbuf *m,
        int s, len, sent;
        struct mbuf *mm;
        u_char *cp;
-       u_int hdr = dst->sa_family;
+       uint32_t hdr = dst->sa_family;
 
        ifp->if_flags |= IFF_RUNNING;
 
@@ -401,23 +401,8 @@ icoutput(struct ifnet *ifp, struct mbuf *m,
 
        } while ((mm = mm->m_next));
 
-       if (ifp->if_bpf) {
-               struct mbuf m0, *n = m;
-
-               /*
-                * We need to prepend the address family as
-                * a four byte field.  Cons up a dummy header
-                * to pacify bpf.  This is safe because bpf
-                * will only read from the mbuf (i.e., it won't
-                * try to free it or keep a pointer a to it).
-                */
-               m0.m_next = m;
-               m0.m_len = sizeof(u_int);
-               m0.m_data = (char *)&hdr;
-               n = &m0;
-
-               bpf_mtap(ifp, n);
-       }
+       if (ifp->if_bpf)
+               bpf_ptap(ifp->if_bpf, m, &hdr, ICHDRLEN);
 
        sc->ic_sending = 1;
 
index 59452ce..e20f583 100644 (file)
@@ -25,7 +25,7 @@
  *
  *     From Id: lpt.c,v 1.55.2.1 1996/11/12 09:08:38 phk Exp
  * $FreeBSD: src/sys/dev/ppbus/if_plip.c,v 1.19.2.1 2000/05/24 00:20:57 n_hibma Exp $
- * $DragonFly: src/sys/dev/netif/plip/if_plip.c,v 1.8 2004/04/07 05:45:29 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/plip/if_plip.c,v 1.9 2005/01/26 00:37:39 joerg Exp $
  */
 
 /*
@@ -439,18 +439,12 @@ static void
 lptap(struct ifnet *ifp, struct mbuf *m)
 {
        /*
-        * Send a packet through bpf. We need to prepend the address family
-        * as a four byte field. Cons up a dummy header to pacify bpf. This
-        * is safe because bpf will only read from the mbuf (i.e., it won't
-        * try to free it or keep a pointer to it).
+        * We need to prepend the address family as a four byte field.
         */
-       u_int32_t af = AF_INET;
-       struct mbuf m0;
-       
-       m0.m_next = m;
-       m0.m_len = sizeof(u_int32_t);
-       m0.m_data = (char *)&af;
-       bpf_mtap(ifp, &m0);
+       static const uint32_t af = AF_INET;
+
+       if (ifp->if_bpf)
+               bpf_ptap(ifp->if_bpf, m, &af, sizeof(af));
 }
 
 static void
index 9a6a74d..73fc6ec 100644 (file)
@@ -32,7 +32,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/wi/if_wi.c,v 1.166 2004/04/01 00:38:45 sam Exp $
- * $DragonFly: src/sys/dev/netif/wi/if_wi.c,v 1.17 2005/01/14 02:35:09 joerg Exp $
+ * $DragonFly: src/sys/dev/netif/wi/if_wi.c,v 1.18 2005/01/26 00:37:39 joerg Exp $
  */
 
 /*
@@ -465,8 +465,7 @@ wi_attach(device_t dev)
        ic->ic_newstate = wi_newstate;
        ieee80211_media_init(ifp, wi_media_change, wi_media_status);
 
-#ifdef WI_RAWBPF
-       bpfattach2(ifp, DLT_IEEE802_11_RADIO,
+       bpfattach_dlt(ifp, DLT_IEEE802_11_RADIO,
                sizeof(struct ieee80211_frame) + sizeof(sc->sc_tx_th),
                &sc->sc_drvbpf);
        /*
@@ -485,7 +484,7 @@ wi_attach(device_t dev)
        sc->sc_rx_th_len = roundup(sizeof(sc->sc_rx_th), sizeof(u_int32_t));
        sc->sc_rx_th.wr_ihdr.it_len = htole16(sc->sc_rx_th_len);
        sc->sc_rx_th.wr_ihdr.it_present = htole32(WI_RX_RADIOTAP_PRESENT);
-#endif
+
        return (0);
 }
 
@@ -915,10 +914,10 @@ wi_start(struct ifnet *ifp)
                                wh->i_fc[1] |= IEEE80211_FC1_WEP;
 
                }
-#ifdef IEEE80211_RAWBPF
-               if (ic->ic_rawbpf)
+
+               if (ic->ic_rawbpf != NULL)
                        bpf_mtap(ic->ic_rawbpf, m0);
-#endif
+
                frmhdr.wi_tx_ctl = htole16(WI_ENC_TX_802_11|WI_TXCNTL_TX_EX);
                if (ic->ic_opmode == IEEE80211_M_HOSTAP &&
                    (wh->i_fc[1] & IEEE80211_FC1_WEP)) {
@@ -930,14 +929,14 @@ wi_start(struct ifnet *ifp)
                        }
                        frmhdr.wi_tx_ctl |= htole16(WI_TXCNTL_NOCRYPT);
                }
-#ifdef WI_RAWBPF
+
                if (sc->sc_drvbpf) {
                        sc->sc_tx_th.wt_rate =
                                ni->ni_rates.rs_rates[ni->ni_txrate];
-                       bpf_mtap2(sc->sc_drvbpf,
-                               &sc->sc_tx_th, sc->sc_tx_th_len, m0);
+                       bpf_ptap(sc->sc_drvbpf, m0, &sc->sc_tx_th,
+                                sc->sc_tx_th_len);
                }
-#endif
+
                m_copydata(m0, 0, sizeof(struct ieee80211_frame),
                    (caddr_t)&frmhdr.wi_whdr);
                m_adj(m0, sizeof(struct ieee80211_frame));
@@ -1477,7 +1476,6 @@ wi_rx_intr(struct wi_softc *sc)
 
        CSR_WRITE_2(sc, WI_EVENT_ACK, WI_EV_RX);
 
-#ifdef WI_RAWBPF
        if (sc->sc_drvbpf) {
                /* XXX replace divide by table */
                sc->sc_rx_th.wr_rate = frmhdr.wi_rx_rate / 5;
@@ -1486,10 +1484,9 @@ wi_rx_intr(struct wi_softc *sc)
                sc->sc_rx_th.wr_flags = 0;
                if (frmhdr.wi_status & WI_STAT_PCF)
                        sc->sc_rx_th.wr_flags |= IEEE80211_RADIOTAP_F_CFP;
-               bpf_mtap2(sc->sc_drvbpf,
-                       &sc->sc_rx_th, sc->sc_rx_th_len, m);
+               bpf_ptap(sc->sc_drvbpf, m, &sc->sc_rx_th, sc->sc_rx_th_len);
        }
-#endif
+
        wh = mtod(m, struct ieee80211_frame *);
        if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
                /*
@@ -2648,12 +2645,10 @@ wi_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
                wi_read_rid(sc, WI_RID_CURRENT_CHAN, &val, &buflen);
                /* XXX validate channel */
                ni->ni_chan = &ic->ic_channels[le16toh(val)];
-#ifdef WI_RAWBPF
                sc->sc_tx_th.wt_chan_freq = sc->sc_rx_th.wr_chan_freq =
                        htole16(ni->ni_chan->ic_freq);
                sc->sc_tx_th.wt_chan_flags = sc->sc_rx_th.wr_chan_flags =
                        htole16(ni->ni_chan->ic_flags);
-#endif
 
                if (IEEE80211_ADDR_EQ(old_bssid, ni->ni_bssid))
                        sc->sc_false_syns++;
index 54fb53c..41da314 100644 (file)
@@ -38,7 +38,7 @@
  *      @(#)bpf.c      8.2 (Berkeley) 3/28/94
  *
  * $FreeBSD: src/sys/net/bpf.c,v 1.59.2.12 2002/04/14 21:41:48 luigi Exp $
- * $DragonFly: src/sys/net/bpf.c,v 1.21 2005/01/06 09:14:13 hsu Exp $
+ * $DragonFly: src/sys/net/bpf.c,v 1.22 2005/01/26 00:37:39 joerg Exp $
  */
 
 #include "use_bpf.h"
@@ -103,6 +103,8 @@ static void catchpacket(struct bpf_d *, u_char *, u_int, u_int,
                            void (*)(const void *, void *, size_t));
 static void    reset_d(struct bpf_d *);
 static int     bpf_setf(struct bpf_d *, struct bpf_program *);
+static int     bpf_getdltlist(struct bpf_d *, struct bpf_dltlist *);
+static int     bpf_setdlt(struct bpf_d *, u_int);
 static void    bpf_drvinit(void *unused);
 
 static d_open_t                bpfopen;
@@ -245,7 +247,7 @@ bpf_attachd(struct bpf_d *d, struct bpf_if *bp)
         */
        d->bd_bif = bp;
        SLIST_INSERT_HEAD(&bp->bif_dlist, d, bd_next);
-       bp->bif_ifp->if_bpf = bp;
+       *bp->bif_driverp = bp;
 }
 
 /*
@@ -254,34 +256,41 @@ bpf_attachd(struct bpf_d *d, struct bpf_if *bp)
 static void
 bpf_detachd(struct bpf_d *d)
 {
+       int error;
        struct bpf_if *bp;
+       struct ifnet *ifp;
 
        bp = d->bd_bif;
+       ifp = bp->bif_ifp;
+
+       /* Remove d from the interface's descriptor list. */
+       SLIST_REMOVE(&bp->bif_dlist, d, bpf_d, bd_next);
+
+       if (SLIST_EMPTY(&bp->bif_dlist)) {
+               /*
+                * Let the driver know that there are no more listeners.
+                */
+               *bp->bif_driverp = NULL;
+       }
+       d->bd_bif = NULL;
        /*
         * Check if this descriptor had requested promiscuous mode.
         * If so, turn it off.
         */
        if (d->bd_promisc) {
                d->bd_promisc = 0;
-               if (ifpromisc(bp->bif_ifp, 0)) {
+               error = ifpromisc(ifp, 0);
+               if (error != 0 && error != ENXIO) {
                        /*
+                        * ENXIO can happen if a pccard is unplugged,
                         * Something is really wrong if we were able to put
                         * the driver into promiscuous mode, but can't
                         * take it out.
                         */
-                       panic("bpf: ifpromisc failed");
+                       if_printf(ifp, "bpf_detach: ifpromisc failed(%d)\n",
+                                 error);
                }
        }
-       /* Remove d from the interface's descriptor list. */
-       SLIST_REMOVE(&bp->bif_dlist, d, bpf_d, bd_next);
-
-       if (SLIST_EMPTY(&bp->bif_dlist)) {
-               /*
-                * Let the driver know that there are no more listeners.
-                */
-               d->bd_bif->bif_ifp->if_bpf = NULL;
-       }
-       d->bd_bif = NULL;
 }
 
 /*
@@ -686,6 +695,26 @@ bpfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td)
                        *(u_int *)addr = d->bd_bif->bif_dlt;
                break;
 
+       /*
+        * Get a list of supported data link types.
+        */
+       case BIOCGDLTLIST:
+               if (d->bd_bif == NULL)
+                       error = EINVAL;
+               else
+                       error = bpf_getdltlist(d, (struct bpf_dltlist *)addr);
+               break;
+
+       /*
+        * Set data link type.
+        */
+       case BIOCSDLT:
+               if (d->bd_bif == NULL)
+                       error = EINVAL;
+               else
+                       error = bpf_setdlt(d, *(u_int *)addr);
+               break;
+
        /*
         * Get interface name.
         */
@@ -904,6 +933,9 @@ bpf_setif(struct bpf_d *d, struct ifreq *ifr)
 
                if (ifp == NULL || ifp != theywant)
                        continue;
+               /* skip additional entry */
+               if (bp->bif_driverp != &ifp->if_bpf)
+                       continue;
                /*
                 * We found the requested interface.
                 * If it's not up, return an error.
@@ -984,15 +1016,13 @@ bpfpoll(dev_t dev, int events, struct thread *td)
 }
 
 /*
- * Incoming linkage from device drivers.  Process the packet pkt, of length
- * pktlen, which is stored in a contiguous buffer.  The packet is parsed
- * by each process' filter, and if accepted, stashed into the corresponding
- * buffer.
+ * Process the packet pkt of length pktlen.  The packet is parsed
+ * by each listener's filter, and if accepted, stashed into the
+ * corresponding buffer.
  */
 void
-bpf_tap(struct ifnet *ifp, u_char *pkt, u_int pktlen)
+bpf_tap(struct bpf_if *bp, u_char *pkt, u_int pktlen)
 {
-       struct bpf_if *bp = ifp->if_bpf;
        struct bpf_d *d;
        u_int slen;
 
@@ -1034,16 +1064,21 @@ bpf_mcopy(const void *src_arg, void *dst_arg, size_t len)
 }
 
 /*
- * Incoming linkage from device drivers, when packet is in an mbuf chain.
+ * Process the packet in the mbuf chain m.  The packet is parsed by each
+ * listener's filter, and if accepted, stashed into the corresponding
+ * buffer.
  */
 void
-bpf_mtap(struct ifnet *ifp, struct mbuf *m)
+bpf_mtap(struct bpf_if *bp, struct mbuf *m)
 {
-       struct bpf_if *bp = ifp->if_bpf;
        struct bpf_d *d;
        u_int pktlen, slen;
        struct mbuf *m0;
 
+       /* Don't compute pktlen, if no descriptor is attached. */
+       if (SLIST_EMPTY(&bp->bif_dlist))
+               return;
+
        pktlen = 0;
        for (m0 = m; m0 != NULL; m0 = m0->m_next)
                pktlen += m0->m_len;
@@ -1058,6 +1093,28 @@ bpf_mtap(struct ifnet *ifp, struct mbuf *m)
        }
 }
 
+/*
+ * Process the packet in the mbuf chain m with the header in m prepended.
+ * The packet is parsed by each listener's filter, and if accepted,
+ * stashed into the corresponding buffer.
+ */
+void
+bpf_ptap(struct bpf_if *bp, struct mbuf *m, const void *data, u_int dlen)
+{
+       struct mbuf mb;
+
+       /*
+        * Craft on-stack mbuf suitable for passing to bpf_mtap.
+        * Note that we cut corners here; we only setup what's
+        * absolutely needed--this mbuf should never go anywhere else.
+        */
+       mb.m_next = m;
+       mb.m_data = __DECONST(void *, data); /* LINTED */
+       mb.m_len = dlen;
+
+       bpf_mtap(bp, m);
+}
+
 /*
  * Move the packet data from interface memory (pkt) into the
  * store buffer.  Return 1 if it's time to wakeup a listener (buffer full),
@@ -1174,23 +1231,30 @@ bpf_freed(struct bpf_d *d)
  * Attach an interface to bpf.  ifp is a pointer to the structure
  * defining the interface to be attached, dlt is the link layer type,
  * and hdrlen is the fixed size of the link header (variable length
- * headers are not yet supporrted).
+ * headers are not yet supported).
  */
 void
 bpfattach(struct ifnet *ifp, u_int dlt, u_int hdrlen)
+{
+       bpfattach_dlt(ifp, dlt, hdrlen, &ifp->if_bpf);
+}
+
+void
+bpfattach_dlt(struct ifnet *ifp, u_int dlt, u_int hdrlen, struct bpf_if **driverp)
 {
        struct bpf_if *bp;
 
        bp = malloc(sizeof *bp, M_BPF, M_WAITOK | M_ZERO);
 
+       SLIST_INIT(&bp->bif_dlist);
        bp->bif_ifp = ifp;
        bp->bif_dlt = dlt;
+       bp->bif_driverp = driverp;
+       *bp->bif_driverp = NULL;
 
        bp->bif_next = bpf_iflist;
        bpf_iflist = bp;
 
-       bp->bif_ifp->if_bpf = NULL;
-
        /*
         * Compute the length of the bpf header.  This is not necessarily
         * equal to SIZEOF_BPF_HDR because we want to insert spacing such
@@ -1200,7 +1264,7 @@ bpfattach(struct ifnet *ifp, u_int dlt, u_int hdrlen)
        bp->bif_hdrlen = BPF_WORDALIGN(hdrlen + SIZEOF_BPF_HDR) - hdrlen;
 
        if (bootverbose)
-               printf("bpf: %s attached\n", ifp->if_xname);
+               if_printf(ifp, "bpf attached\n");
 }
 
 /*
@@ -1248,6 +1312,73 @@ bpfdetach(struct ifnet *ifp)
        splx(s);
 }
 
+/*
+ * Get a list of available data link type of the interface.
+ */
+static int
+bpf_getdltlist(struct bpf_d *d, struct bpf_dltlist *bfl)
+{
+       int n, error;
+       struct ifnet *ifp;
+       struct bpf_if *bp;
+
+       ifp = d->bd_bif->bif_ifp;
+       n = 0;
+       error = 0;
+       for (bp = bpf_iflist; bp != 0; bp = bp->bif_next) {
+               if (bp->bif_ifp != ifp)
+                       continue;
+               if (bfl->bfl_list != NULL) {
+                       if (n >= bfl->bfl_len) {
+                               return (ENOMEM);
+                       }
+                       error = copyout(&bp->bif_dlt,
+                           bfl->bfl_list + n, sizeof(u_int));
+               }
+               n++;
+       }
+       bfl->bfl_len = n;
+       return(error);
+}
+
+/*
+ * Set the data link type of a BPF instance.
+ */
+static int
+bpf_setdlt(struct bpf_d *d, u_int dlt)
+{
+       int error, opromisc;
+       struct ifnet *ifp;
+       struct bpf_if *bp;
+       int s;
+
+       if (d->bd_bif->bif_dlt == dlt)
+               return (0);
+       ifp = d->bd_bif->bif_ifp;
+       for (bp = bpf_iflist; bp != 0; bp = bp->bif_next) {
+               if (bp->bif_ifp == ifp && bp->bif_dlt == dlt)
+                       break;
+       }
+       if (bp != NULL) {
+               opromisc = d->bd_promisc;
+               s = splimp();   
+               bpf_detachd(d);
+               bpf_attachd(d, bp);
+               reset_d(d);
+               if (opromisc) {
+                       error = ifpromisc(bp->bif_ifp, 1);
+                       if (error)
+                               if_printf(bp->bif_ifp,
+                                       "bpf_setdlt: ifpromisc failed (%d)\n",
+                                       error);
+                       else
+                               d->bd_promisc = 1;
+               }
+               splx(s);
+       }
+       return(bp == NULL ? EINVAL : 0);
+}
+
 static void
 bpf_drvinit(void *unused)
 {
@@ -1265,12 +1396,17 @@ SYSINIT(bpfdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,bpf_drvinit,NULL)
  */
 
 void
-bpf_tap(struct ifnet *ifp, u_char *pkt, u_int pktlen)
+bpf_tap(struct bpf_if *bp, u_char *pkt, u_int pktlen)
+{
+}
+
+void
+bpf_mtap(struct bpf_if *bp, struct mbuf *m)
 {
 }
 
 void
-bpf_mtap(struct ifnet *ifp, struct mbuf *m)
+bpf_ptap(struct bpf_if *bp, struct mbuf *, void *data, u_int dlen)
 {
 }
 
@@ -1279,6 +1415,11 @@ bpfattach(struct ifnet *ifp, u_int dlt, u_int hdrlen)
 {
 }
 
+void
+bpfattach_dlt(struct ifnet *ifp, u_int dlt, u_int hdrlen, struct bpf_if **driverp)
+{
+}
+
 void
 bpfdetach(struct ifnet *ifp)
 {
index 9573104..55fd4a2 100644 (file)
@@ -39,7 +39,7 @@
  *     @(#)bpf.h       1.34 (LBL)     6/16/96
  *
  * $FreeBSD: src/sys/net/bpf.h,v 1.21.2.4 2002/07/05 14:40:00 fenner Exp $
- * $DragonFly: src/sys/net/bpf.h,v 1.7 2004/12/21 02:54:14 hsu Exp $
+ * $DragonFly: src/sys/net/bpf.h,v 1.8 2005/01/26 00:37:39 joerg Exp $
  */
 
 #ifndef _NET_BPF_H_
@@ -117,6 +117,8 @@ struct bpf_version {
 #define BIOCSHDRCMPLT  _IOW('B',117, u_int)
 #define BIOCGSEESENT   _IOR('B',118, u_int)
 #define BIOCSSEESENT   _IOW('B',119, u_int)
+#define        BIOCSDLT        _IOW('B',120, u_int)
+#define        BIOCGDLTLIST    _IOWR('B',121, struct bpf_dltlist)
 
 /*
  * Structure prepended to each packet.
@@ -346,26 +348,37 @@ struct bpf_insn {
 #define BPF_STMT(code, k) { (u_short)(code), 0, 0, k }
 #define BPF_JUMP(code, k, jt, jf) { (u_short)(code), jt, jf, k }
 
+/*
+ * Structure to retrieve available DLTs for the interface.
+ */
+struct bpf_dltlist {
+       u_int   bfl_len;        /* number of bfd_list array */
+       u_int   *bfl_list;      /* array of DLTs */
+};
+
 #ifdef _KERNEL
-int     bpf_validate (const struct bpf_insn *, int);
-void    bpf_tap (struct ifnet *, u_char *, u_int);
-void    bpf_mtap (struct ifnet *, struct mbuf *);
-void    bpfattach (struct ifnet *, u_int, u_int);
-void    bpfdetach (struct ifnet *);
-
-void    bpfilterattach (int);
-u_int   bpf_filter (const struct bpf_insn *, u_char *, u_int, u_int);
-#endif
+struct bpf_if;
+
+int     bpf_validate(const struct bpf_insn *, int);
+void    bpf_tap(struct bpf_if *, u_char *, u_int);
+void    bpf_mtap(struct bpf_if *, struct mbuf *);
+void    bpf_ptap(struct bpf_if *, struct mbuf *, const void *, u_int);
+void    bpfattach(struct ifnet *, u_int, u_int);
+void    bpfattach_dlt(struct ifnet *, u_int, u_int, struct bpf_if **);
+void    bpfdetach(struct ifnet *);
+
+void    bpfilterattach(int);
+u_int   bpf_filter(const struct bpf_insn *, u_char *, u_int, u_int);
 
 #define        BPF_TAP(_ifp,_pkt,_pktlen) do {                         \
        if ((_ifp)->if_bpf)                                     \
-               bpf_tap((_ifp), (_pkt), (_pktlen));             \
+               bpf_tap((_ifp)->if_bpf, (_pkt), (_pktlen));     \
 } while (0)
 #define        BPF_MTAP(_ifp,_m) do {                                  \
-       if ((_ifp)->if_bpf) {                                   \
-               bpf_mtap((_ifp), (_m));                         \
-       }                                                       \
+       if ((_ifp)->if_bpf)                                     \
+               bpf_mtap((_ifp)->if_bpf, (_m));                 \
 } while (0)
+#endif
 
 /*
  * Number of scratch memory words (for BPF_LD|BPF_MEM and BPF_ST).
index 90fc8f9..2870ea7 100644 (file)
@@ -38,7 +38,7 @@
  *      @(#)bpfdesc.h  8.1 (Berkeley) 6/10/93
  *
  * $FreeBSD: src/sys/net/bpfdesc.h,v 1.14.2.2 2001/12/17 19:32:33 jdp Exp $
- * $DragonFly: src/sys/net/bpfdesc.h,v 1.3 2004/12/21 02:54:14 hsu Exp $
+ * $DragonFly: src/sys/net/bpfdesc.h,v 1.4 2005/01/26 00:37:39 joerg Exp $
  */
 
 #ifndef _NET_BPFDESC_H_
@@ -105,6 +105,7 @@ struct bpf_d {
 struct bpf_if {
        struct bpf_if *bif_next;        /* list of all interfaces */
        SLIST_HEAD(, bpf_d) bif_dlist;  /* descriptor list */
+       struct bpf_if **bif_driverp;    /* pointer into softc */
        u_int bif_dlt;                  /* link layer type */
        u_int bif_hdrlen;               /* length of header (with padding) */
        struct ifnet *bif_ifp;          /* corresponding interface */
index 6c4c476..36bc87d 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     From: @(#)if_loop.c     8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/net/if_disc.c,v 1.26.2.2 2001/12/20 10:30:16 ru Exp $
- * $DragonFly: src/sys/net/disc/if_disc.c,v 1.6 2004/03/23 22:19:06 hsu Exp $
+ * $DragonFly: src/sys/net/disc/if_disc.c,v 1.7 2005/01/26 00:37:39 joerg Exp $
  */
 
 /*
@@ -131,19 +131,11 @@ discoutput(ifp, m, dst, rt)
        if (discif.if_bpf) {
                /*
                 * We need to prepend the address family as
-                * a four byte field.  Cons up a dummy header
-                * to pacify bpf.  This is safe because bpf
-                * will only read from the mbuf (i.e., it won't
-                * try to free it or keep a pointer a to it).
+                * a four byte field.
                 */
-               struct mbuf m0;
-               u_int af = dst->sa_family;
+               uint32_t af = dst->sa_family;
 
-               m0.m_next = m;
-               m0.m_len = 4;
-               m0.m_data = (char *)&af;
-
-               bpf_mtap(&discif, &m0);
+               bpf_ptap(discif.if_bpf, m, &af, sizeof(af));
        }
        m->m_pkthdr.rcvif = ifp;
 
index d954bab..81ad357 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/net/if_ef.c,v 1.2.2.4 2001/02/22 09:27:04 bp Exp $
- * $DragonFly: src/sys/net/ef/if_ef.c,v 1.12 2005/01/23 20:23:22 joerg Exp $
+ * $DragonFly: src/sys/net/ef/if_ef.c,v 1.13 2005/01/26 00:37:39 joerg Exp $
  */
 
 #include "opt_inet.h"
@@ -378,13 +378,9 @@ ef_input(struct ifnet *ifp, struct ether_header *eh, struct mbuf *m)
        eifp->if_ibytes += m->m_pkthdr.len + sizeof (*eh);
        m->m_pkthdr.rcvif = eifp;
 
-       if (eifp->if_bpf) {
-               struct mbuf m0;
-               m0.m_next = m;
-               m0.m_len = sizeof(struct ether_header);
-               m0.m_data = (char *)eh;
-               bpf_mtap(eifp, &m0);
-       }
+       if (eifp->if_bpf)
+               bpf_ptap(eifp->if_bpf, m, eh, ETHER_HDR_LEN);
+
        /*
         * Now we ready to adjust mbufs and pass them to protocol intr's
         */
index 778d785..aadee08 100644 (file)
@@ -33,7 +33,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/net/if_faith.c,v 1.3.2.6 2002/04/28 05:40:25 suz Exp $
- * $DragonFly: src/sys/net/faith/if_faith.c,v 1.11 2005/01/06 17:59:32 hsu Exp $
+ * $DragonFly: src/sys/net/faith/if_faith.c,v 1.12 2005/01/26 00:37:39 joerg Exp $
  */
 /*
  * derived from
@@ -216,22 +216,14 @@ faithoutput(ifp, m, dst, rt)
                m->m_data += sizeof(int);
        }
 
-       if (ifp->if_bpf) {
+       if (ifp->if_bpf != NULL) {
                /*
                 * We need to prepend the address family as
-                * a four byte field.  Cons up a faith header
-                * to pacify bpf.  This is safe because bpf
-                * will only read from the mbuf (i.e., it won't
-                * try to free it or keep a pointer a to it).
+                * a four byte field.
                 */
-               struct mbuf m0;
-               u_int32_t af = dst->sa_family;
+               uint32_t af = dst->sa_family;
 
-               m0.m_next = m;
-               m0.m_len = 4;
-               m0.m_data = (char *)&af;
-
-               bpf_mtap(ifp, &m0);
+               bpf_ptap(ifp->if_bpf, m, &af, sizeof(af));
        }
 
        if (rt && rt->rt_flags & (RTF_REJECT|RTF_BLACKHOLE)) {
index c030abc..fa3048b 100644 (file)
@@ -1,5 +1,5 @@
 /*     $FreeBSD: src/sys/net/if_gif.c,v 1.4.2.15 2002/11/08 16:57:13 ume Exp $ */
-/*     $DragonFly: src/sys/net/gif/if_gif.c,v 1.10 2004/11/30 19:21:26 joerg Exp $     */
+/*     $DragonFly: src/sys/net/gif/if_gif.c,v 1.11 2005/01/26 00:37:39 joerg Exp $     */
 /*     $KAME: if_gif.c,v 1.87 2001/10/19 08:50:27 itojun Exp $ */
 
 /*
@@ -333,19 +333,11 @@ gif_output(ifp, m, dst, rt)
        if (ifp->if_bpf) {
                /*
                 * We need to prepend the address family as
-                * a four byte field.  Cons up a dummy header
-                * to pacify bpf.  This is safe because bpf
-                * will only read from the mbuf (i.e., it won't
-                * try to free it or keep a pointer a to it).
+                * a four byte field.
                 */
-               struct mbuf m0;
-               u_int32_t af = dst->sa_family;
+               uint32_t af = dst->sa_family;
 
-               m0.m_next = m;
-               m0.m_len = 4;
-               m0.m_data = (char *)&af;
-               
-               bpf_mtap(ifp, &m0);
+               bpf_ptap(ifp->if_bpf, m, &af, sizeof(4));
        }
        ifp->if_opackets++;     
        ifp->if_obytes += m->m_pkthdr.len;
@@ -398,19 +390,11 @@ gif_input(m, af, ifp)
        if (ifp->if_bpf) {
                /*
                 * We need to prepend the address family as
-                * a four byte field.  Cons up a dummy header
-                * to pacify bpf.  This is safe because bpf
-                * will only read from the mbuf (i.e., it won't
-                * try to free it or keep a pointer a to it).
+                * a four byte field.
                 */
-               struct mbuf m0;
-               u_int32_t af1 = af;
-               
-               m0.m_next = m;
-               m0.m_len = 4;
-               m0.m_data = (char *)&af1;
-               
-               bpf_mtap(ifp, &m0);
+               uint32_t af1 = af;
+
+               bpf_ptap(ifp->if_bpf, m, &af1, sizeof(af1));
        }
 
        /*
index c1acbc6..61bbc34 100644 (file)
@@ -1,6 +1,6 @@
 /*     $NetBSD: if_gre.c,v 1.42 2002/08/14 00:23:27 itojun Exp $ */
 /*     $FreeBSD: src/sys/net/if_gre.c,v 1.9.2.3 2003/01/23 21:06:44 sam Exp $ */
-/*     $DragonFly: src/sys/net/gre/if_gre.c,v 1.10 2004/06/02 14:42:58 eirikn Exp $ */
+/*     $DragonFly: src/sys/net/gre/if_gre.c,v 1.11 2005/01/26 00:37:39 joerg Exp $ */
 
 /*
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -244,15 +244,9 @@ gre_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
        osrc = 0;
 
        if (ifp->if_bpf) {
-               /* see comment of other if_foo.c files */
-               struct mbuf m0;
-               u_int32_t af = dst->sa_family;
+               uint32_t af = dst->sa_family;
 
-               m0.m_next = m;
-               m0.m_len = 4;
-               m0.m_data = (char *)&af;
-
-               bpf_mtap(ifp, &m0);
+               bpf_ptap(ifp->if_bpf, m, &af, sizeof(af));
        }
 
        m->m_flags &= ~(M_BCAST|M_MCAST);
index 89bf88c..f69ce4b 100644 (file)
@@ -28,7 +28,7 @@
  *     ---------------------------------------------------------
  *
  * $FreeBSD: src/sys/i4b/driver/i4b_ipr.c,v 1.8.2.3 2001/10/27 15:48:17 hm Exp $
- * $DragonFly: src/sys/net/i4b/driver/i4b_ipr.c,v 1.13 2005/01/23 13:47:24 joerg Exp $
+ * $DragonFly: src/sys/net/i4b/driver/i4b_ipr.c,v 1.14 2005/01/26 00:37:39 joerg Exp $
  *
  *     last edit-date: [Fri Oct 26 19:32:38 2001]
  *
@@ -896,6 +896,7 @@ ipr_rx_data_rdy(int unit)
 #endif 
        int len, c;
 #endif
+       static const uint32_t af = AF_INET;
        
        if((m = *isdn_linktab[unit]->rx_mbuf) == NULL)
                return;
@@ -1038,23 +1039,8 @@ error:
        }
 #endif
 
-#if NBPFILTER > 0 || NBPF > 0
-       if(sc->sc_if.if_bpf)
-       {
-               /* prepend the address family as a four byte field */           
-               struct mbuf mm;
-               u_int af = AF_INET;
-               mm.m_next = m;
-               mm.m_len = 4;
-               mm.m_data = (char *)&af;
-
-#if defined(__DragonFly__) || defined(__FreeBSD__)
-               bpf_mtap(&sc->sc_if, &mm);
-#else
-               bpf_mtap(sc->sc_if.if_bpf, &mm);
-#endif
-       }
-#endif /* NBPFILTER > 0  || NBPF > 0 */
+       if (sc->sc_if.if_bpf)
+               bpf_ptap(sc->sc_if.if_bpf, m, &af, sizeof(af));
 
 #if defined(__DragonFly__) || defined (__FreeBSD__)
        if (netisr_queue(NETISR_IP, m)) {
@@ -1073,6 +1059,7 @@ error:
 static void
 ipr_tx_queue_empty(int unit)
 {
+       static const uint32_t af = AF_INET;
        struct ipr_softc *sc = &ipr_softc[unit];
        struct mbuf *m;
 #ifdef IPR_VJ  
@@ -1098,25 +1085,9 @@ ipr_tx_queue_empty(int unit)
                }
 
                microtime(&sc->sc_if.if_lastchange);
-               
-#if NBPFILTER > 0 || NBPF > 0
-               if(sc->sc_if.if_bpf)
-               {
-                       /* prepend the address family as a four byte field */
-       
-                       struct mbuf mm;
-                       u_int af = AF_INET;
-                       mm.m_next = m;
-                       mm.m_len = 4;
-                       mm.m_data = (char *)&af;
-       
-#if defined(__DragonFly__) || defined(__FreeBSD__)
-                       bpf_mtap(&sc->sc_if, &mm);
-#else
-                       bpf_mtap(sc->sc_if.if_bpf, &mm);
-#endif
-               }
-#endif /* NBPFILTER */
+
+               if (sc->sc_if.if_bpf)
+                       bpf_ptap(sc->sc_if.if_bpf, m, &af, sizeof(af));
        
 #if I4BIPRACCT
                sc->sc_outb += m->m_pkthdr.len; /* size before compression */
index 4a32d94..543695b 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)if_ethersubr.c      8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/net/if_ethersubr.c,v 1.70.2.33 2003/04/28 15:45:53 archie Exp $
- * $DragonFly: src/sys/net/if_ethersubr.c,v 1.25 2005/01/06 09:14:13 hsu Exp $
+ * $DragonFly: src/sys/net/if_ethersubr.c,v 1.26 2005/01/26 00:37:39 joerg Exp $
  */
 
 #include "opt_atalk.h"
@@ -565,16 +565,8 @@ ether_input(struct ifnet *ifp, struct ether_header *eh, struct mbuf *m)
                /* m->m_pkthdr.len = m->m_len; */
        }
 
-       /* Check for a BPF tap */
-       if (ifp->if_bpf != NULL) {
-               struct m_hdr mh;
-
-               /* This kludge is OK; BPF treats the "mbuf" as read-only */
-               mh.mh_next = m;
-               mh.mh_data = (char *)eh;
-               mh.mh_len = ETHER_HDR_LEN;
-               bpf_mtap(ifp, (struct mbuf *)&mh);
-       }
+       if (ifp->if_bpf)
+               bpf_ptap(ifp->if_bpf, m, eh, ETHER_HDR_LEN);
 
        ifp->if_ibytes += m->m_pkthdr.len + (sizeof *eh);
 
index 6c768c5..127fa28 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)if_loop.c   8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/net/if_loop.c,v 1.47.2.8 2003/06/01 01:46:11 silby Exp $
- * $DragonFly: src/sys/net/if_loop.c,v 1.12 2004/12/21 02:54:14 hsu Exp $
+ * $DragonFly: src/sys/net/if_loop.c,v 1.13 2005/01/26 00:37:39 joerg Exp $
  */
 
 /*
@@ -210,24 +210,14 @@ if_simloop(struct ifnet *ifp, struct mbuf *m, int af, int hlen)
                m->m_data += sizeof(int);
        }
 
-       /* Let BPF see incoming packet */
        if (ifp->if_bpf) {
-               struct mbuf m0, *n = m;
-
                if (ifp->if_bpf->bif_dlt == DLT_NULL) {
-                       /*
-                        * We need to prepend the address family as
-                        * a four byte field.  Cons up a dummy header
-                        * to pacify bpf.  This is safe because bpf
-                        * will only read from the mbuf (i.e., it won't
-                        * try to free it or keep a pointer a to it).
-                        */
-                       m0.m_next = m;
-                       m0.m_len = 4;
-                       m0.m_data = (char *)&af;
-                       n = &m0;
+                       uint32_t bpf_af = (uint32_t)af;
+                       bpf_ptap(ifp->if_bpf, m, &bpf_af, 4);
+               }
+               else {
+                       bpf_mtap(ifp->if_bpf, m);
                }
-               bpf_mtap(ifp, n);
        }
 
        /* Strip away media header */
index b00e0a2..1d04448 100644 (file)
@@ -70,7 +70,7 @@
  */
 
 /* $FreeBSD: src/sys/net/if_ppp.c,v 1.67.2.4 2002/04/14 21:41:48 luigi Exp $ */
-/* $DragonFly: src/sys/net/ppp/if_ppp.c,v 1.22 2005/01/23 20:23:22 joerg Exp $ */
+/* $DragonFly: src/sys/net/ppp/if_ppp.c,v 1.23 2005/01/26 00:37:39 joerg Exp $ */
 /* from if_sl.c,v 1.11 84/10/04 12:54:47 rick Exp */
 /* from NetBSD: if_ppp.c,v 1.15.2.2 1994/07/28 05:17:58 cgd Exp */
 
@@ -849,11 +849,7 @@ pppoutput(ifp, m0, dst, rtp)
 #endif /* PPP_FILTER */
     }
 
-    /*
-     * See if bpf wants to look at the packet.
-     */
-    if (ifp->if_bpf)
-       bpf_mtap(ifp, m0);
+    BPF_MTAP(ifp, m0);
 
     /*
      * Put the packet on the appropriate queue.
index b9d0fcb..8c851c4 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)if_sl.c     8.6 (Berkeley) 2/1/94
  * $FreeBSD: src/sys/net/if_sl.c,v 1.84.2.2 2002/02/13 00:43:10 dillon Exp $
- * $DragonFly: src/sys/net/sl/if_sl.c,v 1.15 2004/09/16 04:49:32 dillon Exp $
+ * $DragonFly: src/sys/net/sl/if_sl.c,v 1.16 2005/01/26 00:37:39 joerg Exp $
  */
 
 /*
@@ -609,7 +609,7 @@ slstart(tp)
                         */
                        bpfbuf[SLX_DIR] = SLIPDIR_OUT;
                        bcopy(mtod(m, caddr_t), &bpfbuf[SLX_CHDR], CHDR_LEN);
-                       bpf_tap(&sc->sc_if, bpfbuf, len + SLIP_HDRLEN);
+                       bpf_tap(sc->sc_if.if_bpf, bpfbuf, len + SLIP_HDRLEN);
                }
 
                /*
@@ -876,7 +876,7 @@ slinput(c, tp)
 
                        hp[SLX_DIR] = SLIPDIR_IN;
                        bcopy(chdr, &hp[SLX_CHDR], CHDR_LEN);
-                       bpf_tap(&sc->sc_if, hp, len + SLIP_HDRLEN);
+                       bpf_tap(sc->sc_if.if_bpf, hp, len + SLIP_HDRLEN);
                }
                m = sl_btom(sc, len);
                if (m == NULL)
index a2f09e1..15efd4b 100644 (file)
@@ -1,5 +1,5 @@
 /*     $FreeBSD: src/sys/net/if_stf.c,v 1.1.2.11 2003/01/23 21:06:44 sam Exp $ */
-/*     $DragonFly: src/sys/net/stf/if_stf.c,v 1.13 2005/01/07 05:42:59 hsu Exp $       */
+/*     $DragonFly: src/sys/net/stf/if_stf.c,v 1.14 2005/01/26 00:37:39 joerg Exp $     */
 /*     $KAME: if_stf.c,v 1.73 2001/12/03 11:08:30 keiichi Exp $        */
 
 /*
@@ -192,11 +192,7 @@ stfmodevent(mod, type, data)
 #endif
                sc->sc_if.if_snd.ifq_maxlen = IFQ_MAXLEN;
                if_attach(&sc->sc_if);
-#ifdef HAVE_OLD_BPF
                bpfattach(&sc->sc_if, DLT_NULL, sizeof(u_int));
-#else
-               bpfattach(&sc->sc_if.if_bpf, &sc->sc_if, DLT_NULL, sizeof(u_int));
-#endif
                break;
        case MOD_UNLOAD:
                sc = stf;
@@ -327,6 +323,7 @@ stf_output(ifp, m, dst, rt)
        struct ip *ip;
        struct ip6_hdr *ip6;
        struct in6_ifaddr *ia6;
+       static const uint32_t af = AF_INET6;
 
        sc = (struct stf_softc*)ifp;
        dst6 = (struct sockaddr_in6 *)dst;
@@ -369,29 +366,8 @@ stf_output(ifp, m, dst, rt)
                return ENETUNREACH;
        }
 
-#if NBPFILTER > 0
-       if (ifp->if_bpf) {
-               /*
-                * We need to prepend the address family as
-                * a four byte field.  Cons up a dummy header
-                * to pacify bpf.  This is safe because bpf
-                * will only read from the mbuf (i.e., it won't
-                * try to free it or keep a pointer a to it).
-                */
-               struct mbuf m0;
-               u_int32_t af = AF_INET6;
-               
-               m0.m_next = m;
-               m0.m_len = 4;
-               m0.m_data = (char *)&af;
-               
-#ifdef HAVE_OLD_BPF
-               bpf_mtap(ifp, &m0);
-#else
-               bpf_mtap(ifp->if_bpf, &m0);
-#endif
-       }
-#endif /*NBPFILTER > 0*/
+       if (ifp->if_bpf)
+               bpf_ptap(ifp->if_bpf, m, &af, sizeof(af));
 
        M_PREPEND(m, sizeof(struct ip), MB_DONTWAIT);
        if (m && m->m_len < sizeof(struct ip))
@@ -530,6 +506,7 @@ in_stf_input(struct mbuf *m, ...)
        u_int8_t otos, itos;
        struct ifnet *ifp;
        int off, proto;
+       static const uint32_t af = AF_INET6;
        __va_list ap;
 
        __va_start(ap, m);
@@ -592,28 +569,9 @@ in_stf_input(struct mbuf *m, ...)
        ip6->ip6_flow |= htonl((u_int32_t)itos << 20);
 
        m->m_pkthdr.rcvif = ifp;
-       
-       if (ifp->if_bpf) {
-               /*
-                * We need to prepend the address family as
-                * a four byte field.  Cons up a dummy header
-                * to pacify bpf.  This is safe because bpf
-                * will only read from the mbuf (i.e., it won't
-                * try to free it or keep a pointer a to it).
-                */
-               struct mbuf m0;
-               u_int32_t af = AF_INET6;
-               
-               m0.m_next = m;
-               m0.m_len = 4;
-               m0.m_data = (char *)&af;
-               
-#ifdef HAVE_OLD_BPF
-               bpf_mtap(ifp, &m0);
-#else
-               bpf_mtap(ifp->if_bpf, &m0);
-#endif
-       }
+
+       if (ifp->if_bpf)
+               bpf_ptap(ifp->if_bpf, m, &af, sizeof(af));
 
        /*
         * Put the packet to the network layer input queue according to the
index dcb5540..7e07abc 100644 (file)
@@ -14,7 +14,7 @@
  * operation though.
  *
  * $FreeBSD: src/sys/net/if_tun.c,v 1.74.2.8 2002/02/13 00:43:11 dillon Exp $
- * $DragonFly: src/sys/net/tun/if_tun.c,v 1.15 2004/06/02 14:42:59 eirikn Exp $
+ * $DragonFly: src/sys/net/tun/if_tun.c,v 1.16 2005/01/26 00:37:40 joerg Exp $
  */
 
 #include "opt_atalk.h"
@@ -334,19 +334,11 @@ tunoutput(ifp, m0, dst, rt)
        if (ifp->if_bpf) {
                /*
                 * We need to prepend the address family as
-                * a four byte field.  Cons up a dummy header
-                * to pacify bpf.  This is safe because bpf
-                * will only read from the mbuf (i.e., it won't
-                * try to free it or keep a pointer to it).
+                * a four byte field.
                 */
-               struct mbuf m;
                uint32_t af = dst->sa_family;
 
-               m.m_next = m0;
-               m.m_len = 4;
-               m.m_data = (char *)&af;
-
-               bpf_mtap(ifp, &m);
+               bpf_ptap(ifp->if_bpf, m0, &af, sizeof(af));
        }
 
        /* prepend sockaddr? this may abort if the mbuf allocation fails */
@@ -645,25 +637,17 @@ tunwrite(dev, uio, flag)
                                return ENOBUFS;
                        *mtod(top, u_int32_t *) =
                            ntohl(*mtod(top, u_int32_t *));
-                       bpf_mtap(ifp, top);
+                       bpf_mtap(ifp->if_bpf, top);
                        *mtod(top, u_int32_t *) =
                            htonl(*mtod(top, u_int32_t *));
                } else {
                        /*
                         * We need to prepend the address family as
-                        * a four byte field.  Cons up a dummy header
-                        * to pacify bpf.  This is safe because bpf
-                        * will only read from the mbuf (i.e., it won't
-                        * try to free it or keep a pointer to it).
+                        * a four byte field.
                         */
-                       struct mbuf m;
-                       uint32_t af = AF_INET;
-
-                       m.m_next = top;
-                       m.m_len = 4;
-                       m.m_data = (char *)&af;
+                       static const uint32_t af = AF_INET;
 
-                       bpf_mtap(ifp, &m);
+                       bpf_ptap(ifp->if_bpf, top, &af, sizeof(af));
                }
        }
 
index 2c9f090..c9a1626 100644 (file)
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/net/if_vlan.c,v 1.15.2.13 2003/02/14 22:25:58 fenner Exp $
- * $DragonFly: src/sys/net/vlan/if_vlan.c,v 1.11 2005/01/23 20:23:22 joerg Exp $
+ * $DragonFly: src/sys/net/vlan/if_vlan.c,v 1.12 2005/01/26 00:37:40 joerg Exp $
  */
 
 /*
@@ -369,6 +369,7 @@ vlan_start(struct ifnet *ifp)
 static int
 vlan_input_tag( struct mbuf *m, uint16_t t)
 {
+       struct bpf_if *bif;
        struct ifvlan *ifv;
        struct ether_header *eh = mtod(m, struct ether_header *);
 
@@ -378,8 +379,7 @@ vlan_input_tag( struct mbuf *m, uint16_t t)
         * Fake up a header and send the packet to the physical interface's
         * bpf tap if active.
         */
-       if (m->m_pkthdr.rcvif->if_bpf != NULL) {
-               struct m_hdr mh;
+       if ((bif = m->m_pkthdr.rcvif->if_bpf) != NULL) {
                struct ether_vlan_header evh;
 
                bcopy(eh, &evh, 2*ETHER_ADDR_LEN);
@@ -387,11 +387,7 @@ vlan_input_tag( struct mbuf *m, uint16_t t)
                evh.evl_tag = htons(t);
                evh.evl_proto = eh->ether_type;
 
-               /* This kludge is OK; BPF treats the "mbuf" as read-only */
-               mh.mh_next = m;
-               mh.mh_data = (char *)&evh;
-               mh.mh_len = ETHER_HDR_LEN + EVL_ENCAPLEN;
-               bpf_mtap(m->m_pkthdr.rcvif, (struct mbuf *)&mh);
+               bpf_ptap(bif, m, &evh, ETHER_HDR_LEN + EVL_ENCAPLEN);
        }
 
        for (ifv = LIST_FIRST(&ifv_list); ifv != NULL;
index 716e6de..8a474db 100644 (file)
@@ -33,7 +33,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/netgraph/ng_fec.c,v 1.1.2.1 2002/11/01 21:39:31 julian Exp $
- * $DragonFly: src/sys/netgraph/fec/ng_fec.c,v 1.10 2005/01/23 20:23:22 joerg Exp $
+ * $DragonFly: src/sys/netgraph/fec/ng_fec.c,v 1.11 2005/01/26 00:37:40 joerg Exp $
  */
 /*
  * Copyright (c) 1996-1999 Whistle Communications, Inc.
@@ -749,16 +749,8 @@ ng_fec_input(struct ifnet *ifp, struct mbuf **m0,
        bifp->if_ipackets++;
        bifp->if_ibytes += m->m_pkthdr.len + sizeof(struct ether_header);
 
-        /* Check for a BPF tap */
-       if (bifp->if_bpf != NULL) {
-               struct m_hdr mh;
-
-               /* This kludge is OK; BPF treats the "mbuf" as read-only */
-               mh.mh_next = m;
-               mh.mh_data = (char *)eh;
-               mh.mh_len = ETHER_HDR_LEN;
-               bpf_mtap(bifp, (struct mbuf *)&mh);
-       }
+       if (bifp->if_bpf)
+               bpf_ptap(bifp->if_bpf, m, eh, ETHER_HDR_LEN);
 }
 
 /*
index a690b26..78b9652 100644 (file)
@@ -37,7 +37,7 @@
  * Author: Archie Cobbs <archie@freebsd.org>
  *
  * $FreeBSD: src/sys/netgraph/ng_iface.c,v 1.7.2.5 2002/07/02 23:44:02 archie Exp $
- * $DragonFly: src/sys/netgraph/iface/ng_iface.c,v 1.7 2004/03/23 22:19:07 hsu Exp $
+ * $DragonFly: src/sys/netgraph/iface/ng_iface.c,v 1.8 2005/01/26 00:37:40 joerg Exp $
  * $Whistle: ng_iface.c,v 1.33 1999/11/01 09:24:51 julian Exp $
  */
 
@@ -469,22 +469,16 @@ ng_iface_start(struct ifnet *ifp)
 
 /*
  * Flash a packet by the BPF (requires prepending 4 byte AF header)
- * Note the phoney mbuf; this is OK because BPF treats it read-only.
  */
 static void
 ng_iface_bpftap(struct ifnet *ifp, struct mbuf *m, sa_family_t family)
 {
        int32_t family4 = (int32_t)family;
-       struct mbuf m0;
 
        KASSERT(family != AF_UNSPEC, ("%s: family=AF_UNSPEC", __FUNCTION__));
-       if (ifp->if_bpf != NULL) {
-               bzero(&m0, sizeof(m0));
-               m0.m_next = m;
-               m0.m_len = sizeof(family4);
-               m0.m_data = (char *)&family4;
-               bpf_mtap(ifp, &m0);
-       }
+
+       if (ifp->if_bpf)
+               bpf_ptap(ifp, m, &family, sizeof(family4));
 }
 
 #ifdef DEBUG
index f75b74c..6f29298 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * $NetBSD: ip_gre.c,v 1.21 2002/08/14 00:23:30 itojun Exp $
- * $DragonFly: src/sys/netinet/ip_gre.c,v 1.8 2004/12/21 02:54:15 hsu Exp $
+ * $DragonFly: src/sys/netinet/ip_gre.c,v 1.9 2005/01/26 00:37:40 joerg Exp $
  *
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -140,6 +140,7 @@ gre_input(struct mbuf *m, ...)
 static int
 gre_input2(struct mbuf *m ,int hlen, u_char proto)
 {
+       static const uint32_t af = AF_INET;
        struct greip *gip = mtod(m, struct greip *);
        int isr;
        struct gre_softc *sc;
@@ -201,16 +202,8 @@ gre_input2(struct mbuf *m ,int hlen, u_char proto)
        m->m_len -= hlen;
        m->m_pkthdr.len -= hlen;
 
-       if (sc->sc_if.if_bpf) {
-               struct mbuf m0;
-               u_int32_t af = AF_INET;
-
-               m0.m_next = m;
-               m0.m_len = 4;
-               m0.m_data = (char *)&af;
-
-               bpf_mtap(&(sc->sc_if), &m0);
-       }
+       if (sc->sc_if.if_bpf)
+               bpf_ptap(sc->sc_if.if_bpf, m, &af, sizeof(af));
 
        m->m_pkthdr.rcvif = &sc->sc_if;
        netisr_dispatch(isr, m);
@@ -227,6 +220,7 @@ gre_input2(struct mbuf *m ,int hlen, u_char proto)
 void
 gre_mobile_input(struct mbuf *m, ...)
 {
+       static const uint32_t af = AF_INET;
        struct ip *ip = mtod(m, struct ip *);
        struct mobip_h *mip = mtod(m, struct mobip_h *);
        struct gre_softc *sc;
@@ -279,16 +273,8 @@ gre_mobile_input(struct mbuf *m, ...)
        ip->ip_sum = 0;
        ip->ip_sum = in_cksum(m, (ip->ip_hl << 2));
 
-       if (sc->sc_if.if_bpf) {
-               struct mbuf m0;
-               u_int af = AF_INET;
-
-               m0.m_next = m;
-               m0.m_len = 4;
-               m0.m_data = (char *)&af;
-
-               bpf_mtap(&(sc->sc_if), &m0);
-       }
+       if (sc->sc_if.if_bpf)
+               bpf_ptap(sc->sc_if.if_bpf, m, &af, sizeof(af));
 
        m->m_pkthdr.rcvif = &sc->sc_if;
 
index 2f2bf70..a3ddfb9 100644 (file)
@@ -30,7 +30,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/net80211/ieee80211.c,v 1.13 2004/05/30 17:57:45 phk Exp $
- * $DragonFly: src/sys/netproto/802_11/Attic/ieee80211.c,v 1.2 2004/07/27 12:21:54 hmp Exp $
+ * $DragonFly: src/sys/netproto/802_11/Attic/ieee80211.c,v 1.3 2005/01/26 00:37:40 joerg Exp $
  */
 
 /*
@@ -98,10 +98,8 @@ ieee80211_ifattach(struct ifnet *ifp)
        int i;
 
        ether_ifattach(ifp, ic->ic_myaddr);
-#ifdef IEEE80211_RAWBPF
-       bpfattach2(ifp, DLT_IEEE802_11,
+       bpfattach_dlt(ifp, DLT_IEEE802_11,
            sizeof(struct ieee80211_frame_addr4), &ic->ic_rawbpf);
-#endif
        ieee80211_crypto_attach(ifp);
 
        /*
index 07182b2..c2c9dbc 100644 (file)
@@ -30,7 +30,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/net80211/ieee80211_input.c,v 1.21 2004/06/13 17:29:09 mlaier Exp $
- * $DragonFly: src/sys/netproto/802_11/Attic/ieee80211_input.c,v 1.1 2004/07/26 16:30:17 joerg Exp $
+ * $DragonFly: src/sys/netproto/802_11/Attic/ieee80211_input.c,v 1.2 2005/01/26 00:37:40 joerg Exp $
  */
 
 #include "opt_inet.h"
@@ -260,10 +260,9 @@ ieee80211_input(struct ifnet *ifp, struct mbuf *m, struct ieee80211_node *ni,
                        }
                }
                /* copy to listener after decrypt */
-#ifdef IEEE80211_RAWBPF
-               if (ic->ic_rawbpf)
+               if (ic->ic_rawbpf != NULL)
                        bpf_mtap(ic->ic_rawbpf, m);
-#endif
+
                m = ieee80211_decap(ifp, m);
                if (m == NULL) {
                        ic->ic_stats.is_rx_decap++;
@@ -355,10 +354,8 @@ ieee80211_input(struct ifnet *ifp, struct mbuf *m, struct ieee80211_node *ni,
                                    >> IEEE80211_FC0_SUBTYPE_SHIFT],
                                    wh->i_addr2, ":", rssi);
                }
-#ifdef IEEE80211_RAWBPF
-               if (ic->ic_rawbpf)
+               if (ic->ic_rawbpf != NULL)
                        bpf_mtap(ic->ic_rawbpf, m);
-#endif
                (*ic->ic_recv_mgmt)(ic, m, ni, subtype, rssi, rstamp);
                m_freem(m);
                return;
@@ -375,10 +372,8 @@ ieee80211_input(struct ifnet *ifp, struct mbuf *m, struct ieee80211_node *ni,
        ifp->if_ierrors++;
   out:
        if (m != NULL) {
-#ifdef IEEE80211_RAWBPF
-               if (ic->ic_rawbpf)
+               if (ic->ic_rawbpf != NULL)
                        bpf_mtap(ic->ic_rawbpf, m);
-#endif
                m_freem(m);
        }
 }
index f43bcb8..265c5d4 100644 (file)
@@ -30,7 +30,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/net80211/ieee80211_var.h,v 1.15 2004/04/05 22:10:26 sam Exp $
- * $DragonFly: src/sys/netproto/802_11/ieee80211_var.h,v 1.1 2004/07/26 16:30:17 joerg Exp $
+ * $DragonFly: src/sys/netproto/802_11/ieee80211_var.h,v 1.2 2005/01/26 00:37:40 joerg Exp $
  */
 
 #ifndef _NETPROTO_802_11_IEEE80211_VAR_H_
@@ -182,9 +182,7 @@ struct ieee80211com {
        enum ieee80211_state    ic_state;       /* 802.11 state */
        enum ieee80211_protmode ic_protmode;    /* 802.11g protection mode */
        struct ifmedia          ic_media;       /* interface media config */
-#ifdef IEEE80211_RAWBPF
        struct bpf_if           *ic_rawbpf;     /* packet filter structure */
-#endif
        struct ieee80211_node   *ic_bss;        /* information for this node */
        struct ieee80211_channel *ic_ibss_chan;
        int                     ic_fixed_rate;  /* index to ic_sup_rates[] */
index a1aecb3..8d6e087 100644 (file)
@@ -30,7 +30,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/net80211/ieee80211.c,v 1.13 2004/05/30 17:57:45 phk Exp $
- * $DragonFly: src/sys/netproto/802_11/wlan/ieee80211.c,v 1.2 2004/07/27 12:21:54 hmp Exp $
+ * $DragonFly: src/sys/netproto/802_11/wlan/ieee80211.c,v 1.3 2005/01/26 00:37:40 joerg Exp $
  */
 
 /*
@@ -98,10 +98,8 @@ ieee80211_ifattach(struct ifnet *ifp)
        int i;
 
        ether_ifattach(ifp, ic->ic_myaddr);
-#ifdef IEEE80211_RAWBPF
-       bpfattach2(ifp, DLT_IEEE802_11,
+       bpfattach_dlt(ifp, DLT_IEEE802_11,
            sizeof(struct ieee80211_frame_addr4), &ic->ic_rawbpf);
-#endif
        ieee80211_crypto_attach(ifp);
 
        /*
index c25418e..e3ba098 100644 (file)
@@ -30,7 +30,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/net80211/ieee80211_input.c,v 1.21 2004/06/13 17:29:09 mlaier Exp $
- * $DragonFly: src/sys/netproto/802_11/wlan/ieee80211_input.c,v 1.1 2004/07/26 16:30:17 joerg Exp $
+ * $DragonFly: src/sys/netproto/802_11/wlan/ieee80211_input.c,v 1.2 2005/01/26 00:37:40 joerg Exp $
  */
 
 #include "opt_inet.h"
@@ -260,10 +260,9 @@ ieee80211_input(struct ifnet *ifp, struct mbuf *m, struct ieee80211_node *ni,
                        }
                }
                /* copy to listener after decrypt */
-#ifdef IEEE80211_RAWBPF
-               if (ic->ic_rawbpf)
+               if (ic->ic_rawbpf != NULL)
                        bpf_mtap(ic->ic_rawbpf, m);
-#endif
+
                m = ieee80211_decap(ifp, m);
                if (m == NULL) {
                        ic->ic_stats.is_rx_decap++;
@@ -355,10 +354,8 @@ ieee80211_input(struct ifnet *ifp, struct mbuf *m, struct ieee80211_node *ni,
                                    >> IEEE80211_FC0_SUBTYPE_SHIFT],
                                    wh->i_addr2, ":", rssi);
                }
-#ifdef IEEE80211_RAWBPF
-               if (ic->ic_rawbpf)
+               if (ic->ic_rawbpf != NULL)
                        bpf_mtap(ic->ic_rawbpf, m);
-#endif
                (*ic->ic_recv_mgmt)(ic, m, ni, subtype, rssi, rstamp);
                m_freem(m);
                return;
@@ -375,10 +372,8 @@ ieee80211_input(struct ifnet *ifp, struct mbuf *m, struct ieee80211_node *ni,
        ifp->if_ierrors++;
   out:
        if (m != NULL) {
-#ifdef IEEE80211_RAWBPF
-               if (ic->ic_rawbpf)
+               if (ic->ic_rawbpf != NULL)
                        bpf_mtap(ic->ic_rawbpf, m);
-#endif
                m_freem(m);
        }
 }
index ed7d49a..72d410a 100644 (file)
@@ -30,7 +30,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/net80211/ieee80211_var.h,v 1.15 2004/04/05 22:10:26 sam Exp $
- * $DragonFly: src/sys/netproto/802_11/wlan/Attic/ieee80211_var.h,v 1.1 2004/07/26 16:30:17 joerg Exp $
+ * $DragonFly: src/sys/netproto/802_11/wlan/Attic/ieee80211_var.h,v 1.2 2005/01/26 00:37:40 joerg Exp $
  */
 
 #ifndef _NETPROTO_802_11_IEEE80211_VAR_H_
@@ -182,9 +182,7 @@ struct ieee80211com {
        enum ieee80211_state    ic_state;       /* 802.11 state */
        enum ieee80211_protmode ic_protmode;    /* 802.11g protection mode */
        struct ifmedia          ic_media;       /* interface media config */
-#ifdef IEEE80211_RAWBPF
        struct bpf_if           *ic_rawbpf;     /* packet filter structure */
-#endif
        struct ieee80211_node   *ic_bss;        /* information for this node */
        struct ieee80211_channel *ic_ibss_chan;
        int                     ic_fixed_rate;  /* index to ic_sup_rates[] */