PERFORCE change 166485 for review

Gabor Pali pgj at FreeBSD.org
Fri Jul 24 03:45:58 UTC 2009


http://perforce.freebsd.org/chv.cgi?CH=166485

Change 166485 by pgj at petymeg-current on 2009/07/24 03:45:11

	Add net.bpf.sstats, a streamed version of net.bpf.stats (as a
	read-only variable).  This will be used by libnetstat(3) for
	live monitoring.

Affected files ...

.. //depot/projects/soc2009/pgj_libstat/src/sys/net/bpf.c#3 edit
.. //depot/projects/soc2009/pgj_libstat/src/sys/net/bpfdesc.h#2 edit

Differences ...

==== //depot/projects/soc2009/pgj_libstat/src/sys/net/bpf.c#3 (text+ko) ====

@@ -48,6 +48,7 @@
 #include <sys/fcntl.h>
 #include <sys/malloc.h>
 #include <sys/mbuf.h>
+#include <sys/sbuf.h>
 #include <sys/time.h>
 #include <sys/priv.h>
 #include <sys/proc.h>
@@ -119,6 +120,7 @@
 static int	filt_bpfread(struct knote *, long);
 static void	bpf_drvinit(void *);
 static int	bpf_stats_sysctl(SYSCTL_HANDLER_ARGS);
+static int	bpf_sstats_sysctl(SYSCTL_HANDLER_ARGS);
 
 SYSCTL_NODE(_net, OID_AUTO, bpf, CTLFLAG_RW, 0, "bpf sysctl");
 int bpf_maxinsns = BPF_MAXINSNS;
@@ -129,6 +131,9 @@
     &bpf_zerocopy_enable, 0, "Enable new zero-copy BPF buffer sessions");
 SYSCTL_NODE(_net_bpf, OID_AUTO, stats, CTLFLAG_MPSAFE | CTLFLAG_RW,
     bpf_stats_sysctl, "bpf statistics portal");
+SYSCTL_PROC(_net_bpf, OID_AUTO, sstats, CTLFLAG_RD | CTLTYPE_STRUCT,
+    0, 0, bpf_sstats_sysctl, "s,struct bpfd_data",
+    "bpf statistics portal (streamed)");
 
 static	d_open_t	bpfopen;
 static	d_read_t	bpfread;
@@ -2108,6 +2113,87 @@
 	return (error);
 }
 
+static int
+bpf_sstats_sysctl(SYSCTL_HANDLER_ARGS)
+{
+	int error, i, buflen;
+	char *buffer;
+	struct bpf_if *bp;
+	struct bpf_d *bd, **bd_list;
+
+	struct bpfd_stream bps;
+	struct bpfd_data bpd;
+	struct sbuf sbuf;
+
+	error = priv_check(req->td, PRIV_NET_BPF);
+	if (error != 0)
+		return (error);
+
+	bzero(&bps, sizeof(bps));
+	bps.bps_version = BPFD_STREAM_VERSION;
+	bps.bps_count = bpf_bpfd_cnt;
+
+	bd_list = malloc(bps.bps_count * sizeof(*bd_list), M_TEMP, M_WAITOK);
+	if (bd_list == NULL)
+		return (ENOMEM);
+
+	i = 0;
+	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_list[i++] = bd;
+			BPFD_UNLOCK(bd);
+		}
+		BPFIF_UNLOCK(bp);
+	}
+	mtx_unlock(&bpf_mtx);
+	bps.bps_count = i;
+
+	buflen = sizeof(bps) + bps.bps_count * sizeof(bpd) + 1;
+	buffer = malloc(buflen, M_TEMP, M_WAITOK | M_ZERO);
+	sbuf_new(&sbuf, buffer, buflen, SBUF_FIXEDLEN);
+
+	if (sbuf_bcat(&sbuf, &bps, sizeof(bps)) < 0) {
+		error = ENOMEM;
+		goto out;
+	}
+
+	for (i = 0; i < bps.bps_count; i++) {
+		bd = bd_list[i];
+		bzero(&bpd, sizeof(bpd));
+		BPFD_LOCK(bd);
+		bpd.bpd_promisc = bd->bd_promisc;
+		bpd.bpd_immediate = bd->bd_immediate;
+		bpd.bpd_hdrcmplt = bd->bd_hdrcmplt;
+		bpd.bpd_direction = bd->bd_direction;
+		bpd.bpd_feedback = bd->bd_feedback;
+		bpd.bpd_async = bd->bd_async;
+		bpd.bpd_locked = bd->bd_locked;
+		bpd.bpd_slen = bd->bd_slen;
+		bpd.bpd_hlen = bd->bd_hlen;
+		bpd.bpd_rcount = bd->bd_rcount;
+		bpd.bpd_dcount = bd->bd_dcount;
+		bpd.bpd_fcount = bd->bd_fcount;
+		bpd.bpd_pid = bd->bd_pid;
+		bcopy(bd->bd_bif->bif_ifp->if_xname, bpd.bpd_ifname,
+		    sizeof(bpd.bpd_ifname));
+		BPFD_UNLOCK(bd);
+		if (sbuf_bcat(&sbuf, &bpd, sizeof(bpd)) < 0) {
+			error = ENOMEM;
+			goto out;
+		}
+	}
+
+	sbuf_finish(&sbuf);
+	error = SYSCTL_OUT(req, sbuf_data(&sbuf), sbuf_len(&sbuf));
+out:
+	free(bd_list, M_TEMP);
+	free(buffer, M_TEMP);
+	return (error);
+}
+
 SYSINIT(bpfdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE,bpf_drvinit,NULL);
 
 #else /* !DEV_BPF && !NETGRAPH_BPF */

==== //depot/projects/soc2009/pgj_libstat/src/sys/net/bpfdesc.h#2 (text+ko) ====

@@ -147,4 +147,34 @@
 #define BPFIF_LOCK(bif)		mtx_lock(&(bif)->bif_mtx)
 #define BPFIF_UNLOCK(bif)	mtx_unlock(&(bif)->bif_mtx)
 
+/*
+ * Structures for exporting BPF statistics for user-space monitoring tools.
+ */
+
+#define BPFD_STREAM_VERSION	0x00000001
+
+struct bpfd_stream {
+	u_int32_t   bps_version;
+	u_int64_t   bps_count;
+	u_int8_t    _bps_pad[4];
+};
+
+struct bpfd_data {
+	u_int8_t    bpd_promisc;
+	u_int8_t    bpd_immediate;
+	u_int8_t    bpd_hdrcmplt;
+	u_int8_t    bpd_direction;
+	u_int8_t    bpd_feedback;
+	u_int8_t    bpd_async;
+	u_int8_t    bpd_locked;
+	u_int32_t   bpd_slen;
+	u_int32_t   bpd_hlen;
+	u_int64_t   bpd_rcount;
+	u_int64_t   bpd_dcount;
+	u_int64_t   bpd_fcount;
+	u_int32_t   bpd_pid;
+	char	    bpd_ifname[16]; /* IFNAMSIZ */
+	u_int8_t    _bpd_pad[5];
+};
+
 #endif


More information about the p4-projects mailing list