Page MenuHomeFreeBSD

D53870.id166930.diff
No OneTemporary

D53870.id166930.diff

diff --git a/sys/net/bpf.c b/sys/net/bpf.c
--- a/sys/net/bpf.c
+++ b/sys/net/bpf.c
@@ -674,7 +674,7 @@
else
m->m_flags |= M_MCAST;
}
- if (d->bd_hdrcmplt == 0) {
+ if (!(d->bd_flags & BPFD_HDRCMPLT)) {
memcpy(eh->ether_shost, IF_LLADDR(ifp),
sizeof(eh->ether_shost));
}
@@ -876,8 +876,8 @@
* Check if this descriptor had requested promiscuous mode.
* If so and ifnet is not detached, turn it off.
*/
- if (d->bd_promisc && !detached_ifp) {
- d->bd_promisc = 0;
+ if ((d->bd_flags & BPFD_PROMISC) && !detached_ifp) {
+ d->bd_flags &= ~BPFD_PROMISC;
CURVNET_SET(ifp->if_vnet);
error = ifpromisc(ifp, 0);
CURVNET_RESTORE();
@@ -957,7 +957,6 @@
bpf_buffer_init(d);
if ((flags & FREAD) == 0)
d->bd_writer = 2;
- d->bd_hbuf_in_use = 0;
d->bd_bufmode = BPF_BUFMODE_BUFFER;
d->bd_sig = SIGIO;
d->bd_direction = BPF_D_INOUT;
@@ -1011,9 +1010,9 @@
callout_stop(&d->bd_callout);
timed_out = (d->bd_state == BPF_TIMED_OUT);
d->bd_state = BPF_IDLE;
- while (d->bd_hbuf_in_use) {
- error = mtx_sleep(&d->bd_hbuf_in_use, &d->bd_lock,
- PRINET | PCATCH, "bd_hbuf", 0);
+ while (d->bd_flags & BPFD_HBUF_INUSE) {
+ error = mtx_sleep(&d->bd_hbuf, &d->bd_lock, PRINET | PCATCH,
+ "bd_hbuf", 0);
if (error != 0) {
BPFD_UNLOCK(d);
return (error);
@@ -1030,7 +1029,8 @@
* A packet(s) either arrived since the previous
* read or arrived while we were asleep.
*/
- if (d->bd_immediate || non_block || timed_out) {
+ if ((d->bd_flags & BPFD_IMMEDIATE) || non_block ||
+ timed_out) {
/*
* Rotate the buffers and return what's here
* if we are in immediate mode, non-blocking
@@ -1087,7 +1087,7 @@
/*
* At this point, we know we have something in the hold slot.
*/
- d->bd_hbuf_in_use = 1;
+ d->bd_flags |= BPFD_HBUF_INUSE;
BPFD_UNLOCK(d);
/*
@@ -1101,14 +1101,14 @@
error = bpf_uiomove(d, d->bd_hbuf, d->bd_hlen, uio);
BPFD_LOCK(d);
- if (d->bd_hbuf_in_use) {
+ if (d->bd_flags & BPFD_HBUF_INUSE) {
KASSERT(d->bd_hbuf != NULL, ("bpfread: lost bd_hbuf"));
d->bd_fbuf = d->bd_hbuf;
d->bd_hbuf = NULL;
d->bd_hlen = 0;
bpf_buf_reclaimed(d);
- d->bd_hbuf_in_use = 0;
- wakeup(&d->bd_hbuf_in_use);
+ d->bd_flags &= ~BPFD_HBUF_INUSE;
+ wakeup(&d->bd_hbuf);
}
BPFD_UNLOCK(d);
@@ -1128,7 +1128,7 @@
d->bd_state = BPF_IDLE;
}
wakeup(d);
- if (d->bd_async && d->bd_sig && d->bd_sigio)
+ if ((d->bd_flags & BPFD_ASYNC) && d->bd_sig && d->bd_sigio)
pgsigio(&d->bd_sigio, d->bd_sig, 0);
selwakeuppri(&d->bd_sel, PRINET);
@@ -1160,7 +1160,7 @@
if (!bpf_canfreebuf(d) && d->bd_hlen != 0)
return (1);
- if ((d->bd_immediate || d->bd_state == BPF_TIMED_OUT) &&
+ if (((d->bd_flags & BPFD_IMMEDIATE) || d->bd_state == BPF_TIMED_OUT) &&
d->bd_slen != 0)
return (1);
return (0);
@@ -1235,10 +1235,10 @@
return (ENXIO);
}
counter_u64_add(d->bd_wfcount, 1);
- if (d->bd_hdrcmplt)
+ if (d->bd_flags & BPFD_HDRCMPLT)
dst.sa_family = pseudo_AF_HDRCMPLT;
- if (d->bd_feedback) {
+ if (d->bd_flags & BPFD_FEEDBACK) {
mc = m_dup(m, M_NOWAIT);
if (mc != NULL)
mc->m_pkthdr.rcvif = ifp;
@@ -1307,9 +1307,8 @@
BPFD_LOCK_ASSERT(d);
- while (d->bd_hbuf_in_use)
- mtx_sleep(&d->bd_hbuf_in_use, &d->bd_lock, PRINET,
- "bd_hbuf", 0);
+ while (d->bd_flags & BPFD_HBUF_INUSE)
+ mtx_sleep(&d->bd_hbuf, &d->bd_lock, PRINET, "bd_hbuf", 0);
if ((d->bd_hbuf != NULL) &&
(d->bd_bufmode != BPF_BUFMODE_ZBUF || bpf_canfreebuf(d))) {
/* Free the hold buffer. */
@@ -1382,7 +1381,7 @@
d->bd_state = BPF_IDLE;
BPFD_UNLOCK(d);
- if (d->bd_locked == 1) {
+ if (d->bd_flags & BPFD_LOCKED) {
switch (cmd) {
case BIOCGBLEN:
case BIOCFLUSH:
@@ -1451,8 +1450,8 @@
BPFD_LOCK(d);
n = d->bd_slen;
- while (d->bd_hbuf_in_use)
- mtx_sleep(&d->bd_hbuf_in_use, &d->bd_lock,
+ while (d->bd_flags & BPFD_HBUF_INUSE)
+ mtx_sleep(&d->bd_hbuf, &d->bd_lock,
PRINET, "bd_hbuf", 0);
if (d->bd_hbuf)
n += d->bd_hlen;
@@ -1511,10 +1510,10 @@
* No interface attached yet.
*/
error = EINVAL;
- } else if (d->bd_promisc == 0) {
+ } else if (!(d->bd_flags & BPFD_PROMISC)) {
error = ifpromisc(d->bd_bif->bif_ifp, 1);
if (error == 0)
- d->bd_promisc = 1;
+ d->bd_flags |= BPFD_PROMISC;
}
BPF_UNLOCK();
break;
@@ -1702,7 +1701,7 @@
*/
case BIOCIMMEDIATE:
BPFD_LOCK(d);
- d->bd_immediate = *(u_int *)addr;
+ d->bd_flags |= *(u_int *)addr ? BPFD_IMMEDIATE : 0;
BPFD_UNLOCK(d);
break;
@@ -1720,7 +1719,7 @@
*/
case BIOCGHDRCMPLT:
BPFD_LOCK(d);
- *(u_int *)addr = d->bd_hdrcmplt;
+ *(u_int *)addr = d->bd_flags & BPFD_HDRCMPLT ? 1 : 0;
BPFD_UNLOCK(d);
break;
@@ -1729,7 +1728,7 @@
*/
case BIOCSHDRCMPLT:
BPFD_LOCK(d);
- d->bd_hdrcmplt = *(u_int *)addr ? 1 : 0;
+ d->bd_flags |= *(u_int *)addr ? BPFD_HDRCMPLT : 0;
BPFD_UNLOCK(d);
break;
@@ -1790,13 +1789,13 @@
case BIOCFEEDBACK:
BPFD_LOCK(d);
- d->bd_feedback = *(u_int *)addr;
+ d->bd_flags |= *(u_int *)addr ? BPFD_FEEDBACK : 0;
BPFD_UNLOCK(d);
break;
case BIOCLOCK:
BPFD_LOCK(d);
- d->bd_locked = 1;
+ d->bd_flags |= BPFD_LOCKED;
BPFD_UNLOCK(d);
break;
@@ -1805,7 +1804,7 @@
case FIOASYNC: /* Send signal on receive packets */
BPFD_LOCK(d);
- d->bd_async = *(int *)addr;
+ d->bd_flags |= *(u_int *)addr ? BPFD_ASYNC : 0;
BPFD_UNLOCK(d);
break;
@@ -2213,7 +2212,7 @@
/*
* Ignore the hold buffer if it is being copied to user space.
*/
- if (!d->bd_hbuf_in_use && d->bd_hbuf)
+ if (!(d->bd_flags & BPFD_HBUF_INUSE) && d->bd_hbuf)
kn->kn_data += d->bd_hlen;
} else if (d->bd_rtout > 0 && d->bd_state == BPF_IDLE) {
callout_reset(&d->bd_callout, d->bd_rtout,
@@ -2632,12 +2631,14 @@
counter_u64_add(d->bd_dcount, 1);
return;
}
- KASSERT(!d->bd_hbuf_in_use, ("hold buffer is in use"));
+ KASSERT(!(d->bd_flags & BPFD_HBUF_INUSE),
+ ("hold buffer is in use"));
ROTATE_BUFFERS(d);
do_wakeup = 1;
curlen = 0;
} else {
- if (d->bd_immediate || d->bd_state == BPF_TIMED_OUT) {
+ if ((d->bd_flags & BPFD_IMMEDIATE) ||
+ d->bd_state == BPF_TIMED_OUT) {
/*
* Immediate mode is set, or the read timeout has
* already expired during a select call. A packet
@@ -2929,9 +2930,10 @@
static int
bpf_setdlt(struct bpf_d *d, u_int dlt)
{
- int error, opromisc;
struct ifnet *ifp;
struct bpf_if *bp;
+ int error;
+ bool opromisc;
BPF_LOCK_ASSERT();
MPASS(d->bd_bif != NULL);
@@ -2951,7 +2953,7 @@
if (bp == NULL)
return (EINVAL);
- opromisc = d->bd_promisc;
+ opromisc = d->bd_flags & BPFD_PROMISC;
bpf_attachd(d, bp);
if (opromisc) {
error = ifpromisc(bp->bif_ifp, 1);
@@ -2959,7 +2961,7 @@
if_printf(bp->bif_ifp, "%s: ifpromisc failed (%d)\n",
__func__, error);
else
- d->bd_promisc = 1;
+ d->bd_flags |= BPFD_PROMISC;
}
return (0);
}
@@ -3014,12 +3016,12 @@
BPF_LOCK_ASSERT();
bzero(d, sizeof(*d));
d->bd_structsize = sizeof(*d);
- d->bd_immediate = bd->bd_immediate;
- d->bd_promisc = bd->bd_promisc;
- d->bd_hdrcmplt = bd->bd_hdrcmplt;
+ d->bd_immediate = bd->bd_flags & BPFD_IMMEDIATE ? 1 : 0;
+ d->bd_promisc = bd->bd_flags & BPFD_PROMISC ? 1 : 0;
+ d->bd_hdrcmplt = bd->bd_flags & BPFD_HDRCMPLT ? 1 : 0;
d->bd_direction = bd->bd_direction;
- d->bd_feedback = bd->bd_feedback;
- d->bd_async = bd->bd_async;
+ d->bd_feedback = bd->bd_flags & BPFD_FEEDBACK ? 1 : 0;
+ d->bd_async = bd->bd_flags & BPFD_ASYNC ? 1 : 0;
d->bd_rcount = counter_u64_fetch(bd->bd_rcount);
d->bd_dcount = counter_u64_fetch(bd->bd_dcount);
d->bd_fcount = counter_u64_fetch(bd->bd_fcount);
@@ -3030,7 +3032,7 @@
d->bd_pid = bd->bd_pid;
strlcpy(d->bd_ifname,
bd->bd_bif->bif_ifp->if_xname, IFNAMSIZ);
- d->bd_locked = bd->bd_locked;
+ d->bd_locked = bd->bd_flags & BPFD_LOCKED ? 1 : 0;
d->bd_wcount = counter_u64_fetch(bd->bd_wcount);
d->bd_wdcount = counter_u64_fetch(bd->bd_wdcount);
d->bd_wfcount = counter_u64_fetch(bd->bd_wfcount);
diff --git a/sys/net/bpfdesc.h b/sys/net/bpfdesc.h
--- a/sys/net/bpfdesc.h
+++ b/sys/net/bpfdesc.h
@@ -63,11 +63,17 @@
caddr_t bd_sbuf; /* store slot */
caddr_t bd_hbuf; /* hold slot */
caddr_t bd_fbuf; /* free slot */
- int bd_hbuf_in_use; /* don't rotate buffers */
int bd_slen; /* current length of store buffer */
int bd_hlen; /* current length of hold buffer */
-
int bd_bufsize; /* absolute length of buffers */
+ int bd_flags;
+#define BPFD_HBUF_INUSE 0x00000001 /* don't rotate buffers */
+#define BPFD_PROMISC 0x00000002 /* listening promiscuously */
+#define BPFD_IMMEDIATE 0x00000004 /* return on packet arrival */
+#define BPFD_HDRCMPLT 0x00000008 /* header already filled in */
+#define BPFD_FEEDBACK 0x00000010 /* feed back sent packets */
+#define BPFD_ASYNC 0x00000020 /* packet reception generates signal */
+#define BPFD_LOCKED 0x00000040 /* descriptor is locked */
struct bpf_if * bd_bif; /* interface descriptor */
u_long bd_rtout; /* Read timeout in 'ticks' */
@@ -77,15 +83,10 @@
counter_u64_t bd_rcount; /* number of packets received */
counter_u64_t bd_dcount; /* number of packets dropped */
- u_char bd_promisc; /* true if listening promiscuously */
u_char bd_state; /* idle, waiting, or timed out */
- u_char bd_immediate; /* true to return on packet arrival */
u_char bd_writer; /* non-zero if d is writer-only */
- int bd_hdrcmplt; /* false to fill in src lladdr automatically */
int bd_direction; /* select packet direction */
int bd_tstamp; /* select time stamping function */
- int bd_feedback; /* true to feed back sent packets */
- int bd_async; /* non-zero if packet reception should generate signal */
int bd_sig; /* signal to send upon packet reception */
int bd_pcp; /* VLAN pcp tag */
struct sigio * bd_sigio; /* information for async I/O */
@@ -95,7 +96,6 @@
struct label *bd_label; /* MAC label for descriptor */
counter_u64_t bd_fcount; /* number of packets which matched filter */
pid_t bd_pid; /* PID which created descriptor */
- int bd_locked; /* true if descriptor is locked */
u_int bd_bufmode; /* Current buffer mode. */
counter_u64_t bd_wcount; /* number of packets written */
counter_u64_t bd_wfcount; /* number of packets that matched write filter */

File Metadata

Mime Type
text/plain
Expires
Sun, Nov 23, 1:53 AM (7 h, 12 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
25998624
Default Alt Text
D53870.id166930.diff (10 KB)

Event Timeline