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 */