svn commit: r194512 - in head: sys/net usr.bin/netstat
Christian S.J. Peron
csjp at FreeBSD.org
Fri Jun 19 20:31:45 UTC 2009
Author: csjp
Date: Fri Jun 19 20:31:44 2009
New Revision: 194512
URL: http://svn.freebsd.org/changeset/base/194512
Log:
Implement the -z (zero counters) option for the various bpf counters.
Add necessary changes to the kernel for this (basically introduce a
bpf_zero_counters() function). As well, update the man page.
MFC after: 1 month
Discussed with: rwatson
Modified:
head/sys/net/bpf.c
head/usr.bin/netstat/bpf.c
head/usr.bin/netstat/netstat.1
Modified: head/sys/net/bpf.c
==============================================================================
--- head/sys/net/bpf.c Fri Jun 19 20:05:34 2009 (r194511)
+++ head/sys/net/bpf.c Fri Jun 19 20:31:44 2009 (r194512)
@@ -2032,6 +2032,35 @@ bpf_drvinit(void *unused)
}
+/*
+ * Zero out the various packet counters associated with all of the bpf
+ * descriptors. At some point, we will probably want to get a bit more
+ * granular and allow the user to specify descriptors to be zeroed.
+ */
+static void
+bpf_zero_counters(void)
+{
+ struct bpf_if *bp;
+ struct bpf_d *bd;
+
+ mtx_lock(&bpf_mtx);
+ LIST_FOREACH(bp, &bpf_iflist, bif_next) {
+ BPFIF_LOCK(bp);
+ LIST_FOREACH(bd, &bp->bif_dlist, bd_next) {
+ BPFD_LOCK(bd);
+ bd->bd_rcount = 0;
+ bd->bd_dcount = 0;
+ bd->bd_fcount = 0;
+ bd->bd_wcount = 0;
+ bd->bd_wfcount = 0;
+ bd->bd_zcopy = 0;
+ BPFD_UNLOCK(bd);
+ }
+ BPFIF_UNLOCK(bp);
+ }
+ mtx_unlock(&bpf_mtx);
+}
+
static void
bpfstats_fill_xbpf(struct xbpf_d *d, struct bpf_d *bd)
{
@@ -2066,7 +2095,7 @@ bpfstats_fill_xbpf(struct xbpf_d *d, str
static int
bpf_stats_sysctl(SYSCTL_HANDLER_ARGS)
{
- struct xbpf_d *xbdbuf, *xbd;
+ struct xbpf_d *xbdbuf, *xbd, zerostats;
int index, error;
struct bpf_if *bp;
struct bpf_d *bd;
@@ -2080,6 +2109,21 @@ bpf_stats_sysctl(SYSCTL_HANDLER_ARGS)
error = priv_check(req->td, PRIV_NET_BPF);
if (error)
return (error);
+ /*
+ * Check to see if the user is requesting that the counters be
+ * zeroed out. Explicitly check that the supplied data is zeroed,
+ * as we aren't allowing the user to set the counters currently.
+ */
+ if (req->newptr != NULL) {
+ if (req->newlen != sizeof(zerostats))
+ return (EINVAL);
+ bzero(&zerostats, sizeof(zerostats));
+ xbd = req->newptr;
+ if (bcmp(xbd, &zerostats, sizeof(*xbd)) != 0)
+ return (EINVAL);
+ bpf_zero_counters();
+ return (0);
+ }
if (req->oldptr == NULL)
return (SYSCTL_OUT(req, 0, bpf_bpfd_cnt * sizeof(*xbd)));
if (bpf_bpfd_cnt == 0)
Modified: head/usr.bin/netstat/bpf.c
==============================================================================
--- head/usr.bin/netstat/bpf.c Fri Jun 19 20:05:34 2009 (r194511)
+++ head/usr.bin/netstat/bpf.c Fri Jun 19 20:31:44 2009 (r194512)
@@ -91,10 +91,17 @@ bpf_flags(struct xbpf_d *bd, char *flagb
void
bpf_stats(char *ifname)
{
- struct xbpf_d *d, *bd;
+ struct xbpf_d *d, *bd, zerostat;
char *pname, flagbuf[12];
size_t size;
+ if (zflag) {
+ bzero(&zerostat, sizeof(zerostat));
+ if (sysctlbyname("net.bpf.stats", NULL, NULL,
+ &zerostat, sizeof(zerostat)) < 0)
+ warn("failed to zero bpf counters");
+ return;
+ }
if (sysctlbyname("net.bpf.stats", NULL, &size,
NULL, 0) < 0) {
warn("net.bpf.stats");
Modified: head/usr.bin/netstat/netstat.1
==============================================================================
--- head/usr.bin/netstat/netstat.1 Fri Jun 19 20:05:34 2009 (r194511)
+++ head/usr.bin/netstat/netstat.1 Fri Jun 19 20:31:44 2009 (r194512)
@@ -198,6 +198,7 @@ The network manages a private pool of me
.Bk -words
.Nm
.Fl B
+.Op Fl z
.Op Fl I Ar interface
.Ek
.Xc
More information about the svn-src-head
mailing list