} while ((mm = mm->m_next));
- if (ifp->if_bpf)
- bpf_ptap(ifp->if_bpf, m, &hdr, ICHDRLEN);
+ if (ifp->if_bpf) {
+ bpf_gettoken();
+ if (ifp->if_bpf)
+ bpf_ptap(ifp->if_bpf, m, &hdr, ICHDRLEN);
+ bpf_reltoken();
+ }
sc->ic_sending = 1;
*/
static const uint32_t af = AF_INET;
- if (ifp->if_bpf)
- bpf_ptap(ifp->if_bpf, m, &af, sizeof(af));
+ if (ifp->if_bpf) {
+ bpf_gettoken();
+ if (ifp->if_bpf)
+ bpf_ptap(ifp->if_bpf, m, &af, sizeof(af));
+ bpf_reltoken();
+ }
}
static void
#include <sys/vnode.h>
#include <sys/thread2.h>
-#include <sys/mplock2.h>
#include <net/if.h>
#include <net/bpf.h>
*/
static struct bpf_if *bpf_iflist;
+static struct lwkt_token bpf_token = LWKT_TOKEN_INITIALIZER(bpf_token);
+
static int bpf_allocbufs(struct bpf_d *);
static void bpf_attachd(struct bpf_d *d, struct bpf_if *bp);
static void bpf_detachd(struct bpf_d *d);
#define CDEV_MAJOR 23
static struct dev_ops bpf_ops = {
- { "bpf", 0, 0 },
+ { "bpf", 0, D_MPSAFE },
.d_open = bpfopen,
.d_close = bpfclose,
.d_read = bpfread,
* Finally, point the driver's bpf cookie at the interface so
* it will divert packets to bpf.
*/
+ lwkt_gettoken(&bpf_token);
d->bd_bif = bp;
SLIST_INSERT_HEAD(&bp->bif_dlist, d, bd_next);
*bp->bif_driverp = bp;
EVENTHANDLER_INVOKE(bpf_track, bp->bif_ifp, bp->bif_dlt, 1);
+ lwkt_reltoken(&bpf_token);
}
/*
struct bpf_if *bp;
struct ifnet *ifp;
+ lwkt_gettoken(&bpf_token);
bp = d->bd_bif;
ifp = bp->bif_ifp;
error);
}
}
+ lwkt_reltoken(&bpf_token);
}
/*
cdev_t dev = ap->a_head.a_dev;
struct bpf_d *d;
- if (ap->a_cred->cr_prison)
+ lwkt_gettoken(&bpf_token);
+ if (ap->a_cred->cr_prison) {
+ lwkt_reltoken(&bpf_token);
return(EPERM);
+ }
d = dev->si_drv1;
/*
* Each minor can be opened by only one process. If the requested
* minor is in use, return EBUSY.
*/
- if (d != NULL)
+ if (d != NULL) {
+ lwkt_reltoken(&bpf_token);
return(EBUSY);
+ }
d = kmalloc(sizeof *d, M_BPF, M_WAITOK | M_ZERO);
dev->si_drv1 = d;
d->bd_sig = SIGIO;
d->bd_seesent = 1;
callout_init(&d->bd_callout);
+ lwkt_reltoken(&bpf_token);
+
return(0);
}
cdev_t dev = ap->a_head.a_dev;
struct bpf_d *d = dev->si_drv1;
+ lwkt_gettoken(&bpf_token);
funsetown(&d->bd_sigio);
crit_enter();
if (d->bd_state == BPF_WAITING)
destroy_dev(dev);
}
kfree(d, M_BPF);
+ lwkt_reltoken(&bpf_token);
+
return(0);
}
int timed_out;
int error;
+ lwkt_gettoken(&bpf_token);
/*
* Restrict application to use a buffer the same size as
* as kernel buffers.
*/
- if (ap->a_uio->uio_resid != d->bd_bufsize)
+ if (ap->a_uio->uio_resid != d->bd_bufsize) {
+ lwkt_reltoken(&bpf_token);
return(EINVAL);
+ }
crit_enter();
if (d->bd_state == BPF_WAITING)
*/
if (d->bd_bif == NULL) {
crit_exit();
+ lwkt_reltoken(&bpf_token);
return(ENXIO);
}
if (ap->a_ioflag & IO_NDELAY) {
crit_exit();
+ lwkt_reltoken(&bpf_token);
return(EWOULDBLOCK);
}
error = tsleep(d, PCATCH, "bpf", d->bd_rtout);
if (error == EINTR || error == ERESTART) {
crit_exit();
+ lwkt_reltoken(&bpf_token);
return(error);
}
if (error == EWOULDBLOCK) {
if (d->bd_slen == 0) {
crit_exit();
+ lwkt_reltoken(&bpf_token);
return(0);
}
ROTATE_BUFFERS(d);
d->bd_hbuf = NULL;
d->bd_hlen = 0;
crit_exit();
+ lwkt_reltoken(&bpf_token);
return(error);
}
if (d->bd_async && d->bd_sig && d->bd_sigio)
pgsigio(d->bd_sigio, d->bd_sig, 0);
- get_mplock();
KNOTE(&d->bd_kq.ki_note, 0);
- rel_mplock();
}
static void
struct bpf_d *d = dev->si_drv1;
struct ifnet *ifp;
struct mbuf *m;
- int error;
+ int error, ret;
struct sockaddr dst;
int datlen;
struct netmsg_bpf_output bmsg;
- if (d->bd_bif == NULL)
+ lwkt_gettoken(&bpf_token);
+ if (d->bd_bif == NULL) {
+ lwkt_reltoken(&bpf_token);
return(ENXIO);
+ }
ifp = d->bd_bif->bif_ifp;
- if (ap->a_uio->uio_resid == 0)
+ if (ap->a_uio->uio_resid == 0) {
+ lwkt_reltoken(&bpf_token);
return(0);
+ }
error = bpf_movein(ap->a_uio, (int)d->bd_bif->bif_dlt, &m,
&dst, &datlen, d->bd_wfilter);
- if (error)
+ if (error) {
+ lwkt_reltoken(&bpf_token);
return(error);
+ }
if (datlen > ifp->if_mtu) {
m_freem(m);
+ lwkt_reltoken(&bpf_token);
return(EMSGSIZE);
}
bmsg.nm_ifp = ifp;
bmsg.nm_dst = &dst;
- return lwkt_domsg(netisr_portfn(0), &bmsg.base.lmsg, 0);
+ ret = lwkt_domsg(netisr_portfn(0), &bmsg.base.lmsg, 0);
+ lwkt_reltoken(&bpf_token);
+
+ return ret;
}
/*
struct bpf_d *d = dev->si_drv1;
int error = 0;
+ lwkt_gettoken(&bpf_token);
crit_enter();
if (d->bd_state == BPF_WAITING)
callout_stop(&d->bd_callout);
case TIOCGPGRP:
break;
default:
+ lwkt_reltoken(&bpf_token);
return (EPERM);
}
}
d->bd_locked = 1;
break;
}
+ lwkt_reltoken(&bpf_token);
+
return(error);
}
struct klist *klist;
struct bpf_d *d;
+ lwkt_gettoken(&bpf_token);
d = dev->si_drv1;
if (d->bd_bif == NULL) {
ap->a_result = 1;
+ lwkt_reltoken(&bpf_token);
return (0);
}
break;
default:
ap->a_result = EOPNOTSUPP;
+ lwkt_reltoken(&bpf_token);
return (0);
}
klist = &d->bd_kq.ki_note;
knote_insert(klist, kn);
+ lwkt_reltoken(&bpf_token);
return (0);
}
int gottime = 0;
u_int slen;
- get_mplock();
-
+ lwkt_gettoken(&bpf_token);
/* Re-check */
if (bp == NULL) {
- rel_mplock();
+ lwkt_reltoken(&bpf_token);
return;
}
catchpacket(d, pkt, pktlen, slen, ovbcopy, &tv);
}
}
-
- rel_mplock();
+ lwkt_reltoken(&bpf_token);
}
/*
struct timeval tv;
int gottime = 0;
- get_mplock();
-
+ lwkt_gettoken(&bpf_token);
/* Re-check */
if (bp == NULL) {
- rel_mplock();
+ lwkt_reltoken(&bpf_token);
return;
}
/* Don't compute pktlen, if no descriptor is attached. */
if (SLIST_EMPTY(&bp->bif_dlist)) {
- rel_mplock();
+ lwkt_reltoken(&bpf_token);
return;
}
&tv);
}
}
-
- rel_mplock();
+ lwkt_reltoken(&bpf_token);
}
/*
bp = kmalloc(sizeof *bp, M_BPF, M_WAITOK | M_ZERO);
+ lwkt_gettoken(&bpf_token);
+
SLIST_INIT(&bp->bif_dlist);
bp->bif_ifp = ifp;
bp->bif_dlt = dlt;
*/
bp->bif_hdrlen = BPF_WORDALIGN(hdrlen + SIZEOF_BPF_HDR) - hdrlen;
+ lwkt_reltoken(&bpf_token);
+
if (bootverbose)
if_printf(ifp, "bpf attached\n");
}
struct bpf_if *bp, *bp_prev;
struct bpf_d *d;
+ lwkt_gettoken(&bpf_token);
crit_enter();
/* Locate BPF interface information */
/* Interface wasn't attached */
if (bp->bif_ifp == NULL) {
crit_exit();
+ lwkt_reltoken(&bpf_token);
kprintf("bpfdetach: %s was not attached\n", ifp->if_xname);
return;
}
kfree(bp, M_BPF);
crit_exit();
+ lwkt_reltoken(&bpf_token);
}
/*
return(bp == NULL ? EINVAL : 0);
}
+void
+bpf_gettoken(void)
+{
+ lwkt_gettoken(&bpf_token);
+}
+
+void
+bpf_reltoken(void)
+{
+ lwkt_reltoken(&bpf_token);
+}
+
static void
bpf_drvinit(void *unused)
{
return -1; /* "no filter" behaviour */
}
+void
+bpf_gettoken(void)
+{
+}
+
+void
+bpf_reltoken(void)
+{
+}
+
#endif /* !BPF */
* @(#)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.12 2008/03/14 09:52:10 matthias Exp $
*/
#ifndef _NET_BPF_H_
};
#ifdef _KERNEL
+
struct bpf_if;
struct ifnet;
struct mbuf;
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 bpf_gettoken(void);
+void bpf_reltoken(void);
-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)->if_bpf, (_pkt), (_pktlen)); \
+#define BPF_TAP(_ifp,_pkt,_pktlen) do { \
+ if ((_ifp)->if_bpf) { \
+ bpf_gettoken(); \
+ if ((_ifp)->if_bpf) \
+ bpf_tap((_ifp)->if_bpf, (_pkt), (_pktlen)); \
+ bpf_reltoken(); \
+ } \
} while (0)
-#define BPF_MTAP(_ifp,_m) do { \
- if ((_ifp)->if_bpf) \
- bpf_mtap((_ifp)->if_bpf, (_m)); \
+
+#define BPF_MTAP(_ifp,_m) do { \
+ if ((_ifp)->if_bpf) { \
+ bpf_gettoken(); \
+ if ((_ifp)->if_bpf) \
+ bpf_mtap((_ifp)->if_bpf, (_m)); \
+ bpf_reltoken(); \
+ } \
} while (0)
-#endif
+
+#endif /* _KERNEL */
/*
* Number of scratch memory words (for BPF_LD|BPF_MEM and BPF_ST).
}
if (discif.if_bpf) {
- /*
- * We need to prepend the address family as
- * a four byte field.
- */
- uint32_t af = dst->sa_family;
-
- bpf_ptap(discif.if_bpf, m, &af, sizeof(af));
+ bpf_gettoken();
+ if (discif.if_bpf) {
+ /*
+ * We need to prepend the address family as
+ * a four byte field.
+ */
+ uint32_t af = dst->sa_family;
+
+ bpf_ptap(discif.if_bpf, m, &af, sizeof(af));
+ }
+ bpf_reltoken();
}
m->m_pkthdr.rcvif = ifp;
eifp->if_ibytes += m->m_pkthdr.len + sizeof (*eh);
m->m_pkthdr.rcvif = eifp;
- if (eifp->if_bpf)
- bpf_ptap(eifp->if_bpf, m, eh, ETHER_HDR_LEN);
+ if (eifp->if_bpf) {
+ bpf_gettoken();
+ if (eifp->if_bpf)
+ bpf_ptap(eifp->if_bpf, m, eh, ETHER_HDR_LEN);
+ bpf_reltoken();
+ }
/*
* Now we ready to adjust mbufs and pass them to protocol intr's
#define ETHER_BPF_MTAP(_ifp, _m) do { \
if ((_ifp)->if_bpf) { \
M_ASSERTPKTHDR((_m)); \
- if ((_m)->m_flags & M_VLANTAG) { \
- vlan_ether_ptap((_ifp)->if_bpf, (_m), \
- (_m)->m_pkthdr.ether_vlantag); \
- } else { \
- bpf_mtap((_ifp)->if_bpf, (_m)); \
+ bpf_gettoken(); \
+ if ((_ifp->if_bpf)) { \
+ if ((_m)->m_flags & M_VLANTAG) { \
+ vlan_ether_ptap((_ifp)->if_bpf, (_m), \
+ (_m)->m_pkthdr.ether_vlantag); \
+ } else { \
+ bpf_mtap((_ifp)->if_bpf, (_m)); \
+ } \
} \
+ bpf_reltoken(); \
} \
} while (0)
}
if (ifp->if_bpf != NULL) {
- /*
- * We need to prepend the address family as
- * a four byte field.
- */
- uint32_t af = dst->sa_family;
-
- bpf_ptap(ifp->if_bpf, m, &af, sizeof(af));
+ bpf_gettoken();
+ if (ifp->if_bpf != NULL) {
+ /*
+ * We need to prepend the address family as
+ * a four byte field.
+ */
+ uint32_t af = dst->sa_family;
+
+ bpf_ptap(ifp->if_bpf, m, &af, sizeof(af));
+ }
+ bpf_reltoken();
}
if (rt && rt->rt_flags & (RTF_REJECT|RTF_BLACKHOLE)) {
}
if (ifp->if_bpf) {
- /*
- * We need to prepend the address family as
- * a four byte field.
- */
- uint32_t af = dst->sa_family;
-
- bpf_ptap(ifp->if_bpf, m, &af, sizeof(af));
+ bpf_gettoken();
+ if (ifp->if_bpf) {
+ /*
+ * We need to prepend the address family as
+ * a four byte field.
+ */
+ uint32_t af = dst->sa_family;
+
+ bpf_ptap(ifp->if_bpf, m, &af, sizeof(af));
+ }
+ bpf_reltoken();
}
ifp->if_opackets++;
ifp->if_obytes += m->m_pkthdr.len;
m->m_pkthdr.rcvif = ifp;
if (ifp->if_bpf) {
- /*
- * We need to prepend the address family as
- * a four byte field.
- */
- uint32_t af1 = af;
-
- bpf_ptap(ifp->if_bpf, m, &af1, sizeof(af1));
+ bpf_gettoken();
+ if (ifp->if_bpf) {
+ /*
+ * We need to prepend the address family as
+ * a four byte field.
+ */
+ uint32_t af1 = af;
+
+ bpf_ptap(ifp->if_bpf, m, &af1, sizeof(af1));
+ }
+ bpf_reltoken();
}
/*
ip = NULL;
if (ifp->if_bpf) {
- uint32_t af = dst->sa_family;
+ bpf_gettoken();
+ if (ifp->if_bpf) {
+ uint32_t af = dst->sa_family;
- bpf_ptap(ifp->if_bpf, m, &af, sizeof(af));
+ bpf_ptap(ifp->if_bpf, m, &af, sizeof(af));
+ }
+ bpf_reltoken();
}
m->m_flags &= ~(M_BCAST|M_MCAST);
}
if (ifp->if_bpf) {
- get_mplock();
+ bpf_gettoken();
/* Re-check */
if (ifp->if_bpf == NULL)
bpf_mtap(ifp->if_bpf, m);
}
rel:
- rel_mplock();
+ bpf_reltoken();
}
/* Strip away media header */
ifn->if_opackets++;
ifn->if_obytes += m->m_pkthdr.len;
- lwkt_reltoken(&pf_token);
- bpf_mtap_hdr(ifn->if_bpf, (char *)&hdr, PFLOG_HDRLEN, m,
- BPF_DIRECTION_OUT);
- lwkt_gettoken(&pf_token);
+ if (ifn->if_bpf) {
+ bpf_gettoken();
+ if (ifn->if_bpf) {
+ bpf_mtap_hdr(ifn->if_bpf, (char *)&hdr, PFLOG_HDRLEN, m,
+ BPF_DIRECTION_OUT);
+ }
+ bpf_reltoken();
+ }
#ifdef INET
if (af == AF_INET) {
#if NBPFILTER > 0
if (ifp->if_bpf) {
- lwkt_reltoken(&pf_token);
- bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_OUT);
- lwkt_gettoken(&pf_token);
+ bpf_gettoken();
+ if (ifp->if_bpf)
+ bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_OUT);
+ bpf_reltoken();
}
#endif
&sc->sc_comp, 1);
}
if (sc->sc_if.if_bpf) {
- /*
- * Put the SLIP pseudo-"link header" in place. The
- * compressed header is now at the beginning of the
- * mbuf.
- */
- bpfbuf[SLX_DIR] = SLIPDIR_OUT;
- bcopy(mtod(m, caddr_t), &bpfbuf[SLX_CHDR], CHDR_LEN);
- bpf_tap(sc->sc_if.if_bpf, bpfbuf, len + SLIP_HDRLEN);
+ bpf_gettoken();
+
+ if (sc->sc_if.if_bpf) {
+ /*
+ * Put the SLIP pseudo-"link header" in place.
+ * The compressed header is now at the
+ * beginning of the mbuf.
+ */
+ bpfbuf[SLX_DIR] = SLIPDIR_OUT;
+ bcopy(mtod(m, caddr_t), &bpfbuf[SLX_CHDR],
+ CHDR_LEN);
+ bpf_tap(sc->sc_if.if_bpf, bpfbuf,
+ len + SLIP_HDRLEN);
+ }
+
+ bpf_reltoken();
}
/*
goto error;
}
if (sc->sc_if.if_bpf) {
- /*
- * Put the SLIP pseudo-"link header" in place.
- * We couldn't do this any earlier since
- * decompression probably moved the buffer
- * pointer. Then, invoke BPF.
- */
- u_char *hp = sc->sc_buf - SLIP_HDRLEN;
+ bpf_gettoken();
+
+ if (sc->sc_if.if_bpf) {
+ /*
+ * Put the SLIP pseudo-"link header" in place.
+ * We couldn't do this any earlier since
+ * decompression probably moved the buffer
+ * pointer. Then, invoke BPF.
+ */
+ u_char *hp = sc->sc_buf - SLIP_HDRLEN;
+
+ hp[SLX_DIR] = SLIPDIR_IN;
+ bcopy(chdr, &hp[SLX_CHDR], CHDR_LEN);
+ bpf_tap(sc->sc_if.if_bpf, hp,
+ len + SLIP_HDRLEN);
+ }
- hp[SLX_DIR] = SLIPDIR_IN;
- bcopy(chdr, &hp[SLX_CHDR], CHDR_LEN);
- bpf_tap(sc->sc_if.if_bpf, hp, len + SLIP_HDRLEN);
+ bpf_reltoken();
}
m = sl_btom(sc, len);
if (m == NULL)
return ENETUNREACH;
}
- if (ifp->if_bpf)
- bpf_ptap(ifp->if_bpf, m, &af, sizeof(af));
+ if (ifp->if_bpf) {
+ bpf_gettoken();
+ if (ifp->if_bpf)
+ bpf_ptap(ifp->if_bpf, m, &af, sizeof(af));
+ bpf_reltoken();
+ }
M_PREPEND(m, sizeof(struct ip), MB_DONTWAIT);
if (m && m->m_len < sizeof(struct ip))
m->m_pkthdr.rcvif = ifp;
- if (ifp->if_bpf)
- bpf_ptap(ifp->if_bpf, m, &af, sizeof(af));
+ if (ifp->if_bpf) {
+ bpf_gettoken();
+ if (ifp->if_bpf)
+ bpf_ptap(ifp->if_bpf, m, &af, sizeof(af));
+ bpf_reltoken();
+ }
/*
* Put the packet to the network layer input queue according to the
}
if (ifp->if_bpf) {
- /*
- * We need to prepend the address family as
- * a four byte field.
- */
- uint32_t af = dst->sa_family;
+ bpf_gettoken();
+ if (ifp->if_bpf) {
+ /*
+ * We need to prepend the address family as
+ * a four byte field.
+ */
+ uint32_t af = dst->sa_family;
- bpf_ptap(ifp->if_bpf, m0, &af, sizeof(af));
+ bpf_ptap(ifp->if_bpf, m0, &af, sizeof(af));
+ }
+ bpf_reltoken();
}
/* prepend sockaddr? this may abort if the mbuf allocation fails */
top->m_pkthdr.rcvif = ifp;
if (ifp->if_bpf) {
- if (tp->tun_flags & TUN_IFHEAD) {
- /*
- * Conveniently, we already have a 4-byte address
- * family prepended to our packet !
- * Inconveniently, it's in the wrong byte order !
- */
- if ((top = m_pullup(top, sizeof(family))) == NULL)
- return ENOBUFS;
- *mtod(top, u_int32_t *) =
- ntohl(*mtod(top, u_int32_t *));
- 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.
- */
- static const uint32_t af = AF_INET;
-
- bpf_ptap(ifp->if_bpf, top, &af, sizeof(af));
+ bpf_gettoken();
+
+ if (ifp->if_bpf) {
+ if (tp->tun_flags & TUN_IFHEAD) {
+ /*
+ * Conveniently, we already have a 4-byte
+ * address family prepended to our packet !
+ * Inconveniently, it's in the wrong byte
+ * order !
+ */
+ if ((top = m_pullup(top, sizeof(family)))
+ == NULL) {
+ bpf_reltoken();
+ return ENOBUFS;
+ }
+ *mtod(top, u_int32_t *) =
+ ntohl(*mtod(top, u_int32_t *));
+ 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.
+ */
+ static const uint32_t af = AF_INET;
+
+ bpf_ptap(ifp->if_bpf, top, &af, sizeof(af));
+ }
}
+
+ bpf_reltoken();
}
if (tp->tun_flags & TUN_IFHEAD) {
bifp->if_ipackets++;
bifp->if_ibytes += m->m_pkthdr.len;
- if (bifp->if_bpf)
- bpf_mtap(bifp->if_bpf, m);
+ if (bifp->if_bpf) {
+ bpf_gettoken();
+ if (bifp->if_bpf)
+ bpf_mtap(bifp->if_bpf, m);
+ bpf_reltoken();
+ }
}
/*
KASSERT(family != AF_UNSPEC, ("%s: family=AF_UNSPEC", __func__));
- if (ifp->if_bpf)
- bpf_ptap(ifp->if_bpf, m, &family, sizeof(family4));
+ if (ifp->if_bpf) {
+ bpf_gettoken();
+ if (ifp->if_bpf)
+ bpf_ptap(ifp->if_bpf, m, &family, sizeof(family4));
+ bpf_reltoken();
+ }
}
#ifdef DEBUG
KASSERT(family != AF_UNSPEC, ("%s: family=AF_UNSPEC", __func__));
- if (ifp->if_bpf)
- bpf_ptap(ifp->if_bpf, m, &family4, sizeof(family4));
+ if (ifp->if_bpf) {
+ bpf_gettoken();
+ if (ifp->if_bpf)
+ bpf_ptap(ifp->if_bpf, m, &family4, sizeof(family4));
+ bpf_reltoken();
+ }
}
/*
m->m_len -= hlen;
m->m_pkthdr.len -= hlen;
- if (sc->sc_if.if_bpf)
- bpf_ptap(sc->sc_if.if_bpf, m, &af, sizeof(af));
+ if (sc->sc_if.if_bpf) {
+ bpf_gettoken();
+ if (sc->sc_if.if_bpf)
+ bpf_ptap(sc->sc_if.if_bpf, m, &af, sizeof(af));
+ bpf_reltoken();
+ }
m->m_pkthdr.rcvif = &sc->sc_if;
netisr_queue(isr, m);
ip->ip_sum = 0;
ip->ip_sum = in_cksum(m, (ip->ip_hl << 2));
- if (sc->sc_if.if_bpf)
- bpf_ptap(sc->sc_if.if_bpf, m, &af, sizeof(af));
+ if (sc->sc_if.if_bpf) {
+ bpf_gettoken();
+ if (sc->sc_if.if_bpf)
+ bpf_ptap(sc->sc_if.if_bpf, m, &af, sizeof(af));
+ bpf_reltoken();
+ }
m->m_pkthdr.rcvif = &sc->sc_if;
if (vap != vap0 &&
vap->iv_opmode == IEEE80211_M_MONITOR &&
(vap->iv_flags_ext & IEEE80211_FEXT_BPF) &&
- vap->iv_state != IEEE80211_S_INIT)
- bpf_ptap(vap->iv_rawbpf, m, rh, len);
+ vap->iv_state != IEEE80211_S_INIT) {
+ if (vap->iv_rawbpf) {
+ bpf_gettoken();
+ if (vap->iv_rawbpf)
+ bpf_ptap(vap->iv_rawbpf, m, rh, len);
+ bpf_reltoken();
+ }
+ }
}
}
KASSERT(th != NULL, ("no tx radiotap header"));
len = le16toh(th->it_len);
- if (vap0->iv_flags_ext & IEEE80211_FEXT_BPF)
- bpf_ptap(vap0->iv_rawbpf, m, th, len);
+ if (vap0->iv_flags_ext & IEEE80211_FEXT_BPF) {
+ if (vap0->iv_rawbpf) {
+ bpf_gettoken();
+ if (vap0->iv_rawbpf)
+ bpf_ptap(vap0->iv_rawbpf, m, th, len);
+ bpf_reltoken();
+ }
+ }
/*
* Spam monitor mode vaps.
*/
KASSERT(rh != NULL, ("no rx radiotap header"));
len = le16toh(rh->it_len);
- if (vap0->iv_flags_ext & IEEE80211_FEXT_BPF)
- bpf_ptap(vap0->iv_rawbpf, m, rh, len);
+ if (vap0->iv_flags_ext & IEEE80211_FEXT_BPF) {
+ if (vap0->iv_rawbpf) {
+ bpf_gettoken();
+ if (vap0->iv_rawbpf)
+ bpf_ptap(vap0->iv_rawbpf, m, rh, len);
+ bpf_reltoken();
+ }
+ }
/*
* Spam monitor mode vaps with unicast frames. Multicast
* frames are handled by passing through ieee80211_input_all
/* XXX locking? */
TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) {
if (ieee80211_radiotap_active_vap(vap) &&
- vap->iv_state != IEEE80211_S_INIT)
- bpf_ptap(vap->iv_rawbpf, m, rh, len);
+ vap->iv_state != IEEE80211_S_INIT) {
+ if (vap->iv_rawbpf) {
+ bpf_gettoken();
+ if (vap->iv_rawbpf)
+ bpf_ptap(vap->iv_rawbpf, m, rh, len);
+ bpf_reltoken();
+ }
+ }
}
}