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