summaryrefslogtreecommitdiffstats
path: root/sys/net/bpf.c
diff options
context:
space:
mode:
authordwmalone <dwmalone@FreeBSD.org>2008-07-07 09:25:49 +0000
committerdwmalone <dwmalone@FreeBSD.org>2008-07-07 09:25:49 +0000
commitea74539fbc8e15c5f08d274a44fab9597bd721a8 (patch)
tree6d102cc7476e793a6fcd823731a33ab5a474ad3d /sys/net/bpf.c
parentea1979e3d2b54ba0ce259e583ff88846d8108407 (diff)
downloadFreeBSD-src-ea74539fbc8e15c5f08d274a44fab9597bd721a8.zip
FreeBSD-src-ea74539fbc8e15c5f08d274a44fab9597bd721a8.tar.gz
Add a new ioctl for changing the read filter (BIOCSETFNR). This is
just like BIOCSETF but it doesn't drop all the packets buffered on the discriptor and reset the statistics. Also, when setting the write filter, don't drop packets waiting to be read or reset the statistics. PR: 118486 Submitted by: Matthew Luckie <mluckie@cs.waikato.ac.nz> MFC after: 1 month
Diffstat (limited to 'sys/net/bpf.c')
-rw-r--r--sys/net/bpf.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/sys/net/bpf.c b/sys/net/bpf.c
index e03f30e..ffaa762 100644
--- a/sys/net/bpf.c
+++ b/sys/net/bpf.c
@@ -927,8 +927,9 @@ reset_d(struct bpf_d *d)
* FIONREAD Check for read packet available.
* SIOCGIFADDR Get interface address - convenient hook to driver.
* BIOCGBLEN Get buffer len [for read()].
- * BIOCSETF Set ethernet read filter.
- * BIOCSETWF Set ethernet write filter.
+ * BIOCSETF Set read filter.
+ * BIOCSETFNR Set read filter without resetting descriptor.
+ * BIOCSETWF Set write filter.
* BIOCFLUSH Flush read packet buffer.
* BIOCPROMISC Put interface into promiscuous mode.
* BIOCGDLT Get link layer type.
@@ -1047,6 +1048,7 @@ bpfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags,
* Set link layer read filter.
*/
case BIOCSETF:
+ case BIOCSETFNR:
case BIOCSETWF:
error = bpf_setf(d, (struct bpf_program *)addr, cmd);
break;
@@ -1361,8 +1363,9 @@ bpf_setf(struct bpf_d *d, struct bpf_program *fp, u_long cmd)
#ifdef BPF_JITTER
d->bd_bfilter = NULL;
#endif
+ if (cmd == BIOCSETF)
+ reset_d(d);
}
- reset_d(d);
BPFD_UNLOCK(d);
if (old != NULL)
free((caddr_t)old, M_BPF);
@@ -1388,8 +1391,9 @@ bpf_setf(struct bpf_d *d, struct bpf_program *fp, u_long cmd)
#ifdef BPF_JITTER
d->bd_bfilter = bpf_jitter(fcode, flen);
#endif
+ if (cmd == BIOCSETF)
+ reset_d(d);
}
- reset_d(d);
BPFD_UNLOCK(d);
if (old != NULL)
free((caddr_t)old, M_BPF);
OpenPOWER on IntegriCloud