PERFORCE change 166487 for review

Gabor Pali pgj at FreeBSD.org
Fri Jul 24 03:53:05 UTC 2009


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

Change 166487 by pgj at petymeg-current on 2009/07/24 03:52:18

	Modify netstat(1) to use libnetstat(3) for displaying bpf(4)
	statistics.  Since libnetstat(3) includes kvm(3) support,
	-M flag also works for -B now :)

Affected files ...

.. //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/bpf.c#3 edit
.. //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/extern.h#9 edit
.. //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/main.c#16 edit

Differences ...

==== //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/bpf.c#3 (text+ko) ====

@@ -1,5 +1,6 @@
 /*-
  * Copyright (c) 2005 Christian S.J. Peron
+ * Copyright (c) 2009 Gabor Pali
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -28,108 +29,85 @@
 __FBSDID("$FreeBSD: src/usr.bin/netstat/bpf.c,v 1.11 2008/03/24 13:50:39 csjp Exp $");
 
 #include <sys/types.h>
-#include <sys/protosw.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-#include <sys/sysctl.h>
-#include <sys/param.h>
-#include <sys/user.h>
-
-#include <net/if.h>
-#include <net/if_var.h>
-#include <net/bpf.h>
-#include <net/bpfdesc.h>
-#include <arpa/inet.h>
 
 #include <err.h>
-#include <errno.h>
-#include <stdint.h>
+#include <kvm.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
+#include <netstat.h>
 #include "extern.h"
 
-/* print bpf stats */
-
-static char *
-bpf_pidname(pid_t pid)
-{
-	struct kinfo_proc newkp;
-	int error, mib[4];
-	size_t size;
-
-	mib[0] = CTL_KERN;
-	mib[1] = KERN_PROC;
-	mib[2] = KERN_PROC_PID;
-	mib[3] = pid;
-	size = sizeof(newkp);
-	error = sysctl(mib, 4, &newkp, &size, NULL, 0);
-	if (error < 0) {
-		warn("kern.proc.pid failed");
-		return (strdup("??????"));
-	}
-	return (strdup(newkp.ki_comm));
-}
-
 static void
-bpf_flags(struct xbpf_d *bd, char *flagbuf)
+bpf_flags(const struct bpf_type *btp, char *flagbuf)
 {
+	int flags;
 
-	*flagbuf++ = bd->bd_promisc ? 'p' : '-';
-	*flagbuf++ = bd->bd_immediate ? 'i' : '-';
-	*flagbuf++ = bd->bd_hdrcmplt ? '-' : 'f';
-	*flagbuf++ = (bd->bd_direction == BPF_D_IN) ? '-' :
-	    ((bd->bd_direction == BPF_D_OUT) ? 'o' : 's');
-	*flagbuf++ = bd->bd_feedback ? 'b' : '-';
-	*flagbuf++ = bd->bd_async ? 'a' : '-';
-	*flagbuf++ = bd->bd_locked ? 'l' : '-';
+	flags = netstat_bpt_get_flags(btp);
+	*flagbuf++ = flags & NETSTAT_BPF_PROMISC ? 'p' : '-';
+	*flagbuf++ = flags & NETSTAT_BPF_IMMEDIATE ? 'i' : '-';
+	*flagbuf++ = flags & NETSTAT_BPF_HDRCMPLT ? '-' : 'f';
+	*flagbuf++ = (netstat_bpt_get_direction(btp) == bpfdir_In) ? '-' :
+	    ((netstat_bpt_get_direction(btp) == bpfdir_Out) ? 'o' : 's');
+	*flagbuf++ = flags & NETSTAT_BPF_FEEDBACK ? 'b' : '-';
+	*flagbuf++ = flags & NETSTAT_BPF_ASYNC ? 'a' : '-';
+	*flagbuf++ = flags & NETSTAT_BPF_LOCKED ? 'l' : '-';
 	*flagbuf++ = '\0';
 }
 
+/* print bpf stats */
 void
-bpf_stats(char *ifname)
+bpf_stats(char *ifname, void *kvmd)
 {
-	struct xbpf_d *d, *bd;
-	char *pname, flagbuf[12];
-	size_t size;
+	struct bpf_type_list *bptlp;
+	struct bpf_type_iterator *bptip = NULL;
+
+	const struct bpf_type *bptp;
+
+	int bpt_flags, error;
+	char flagbuf[12];
+	kvm_t *kvm;
+
+	kvm = (kvm_t *)kvmd;
+	bpt_flags = 0;
+	if (kvmd != NULL)
+		bpt_flags |= NETSTAT_BPF_KVM;
 
-	if (sysctlbyname("net.bpf.stats", NULL, &size,
-	    NULL, 0) < 0) {
-		warn("net.bpf.stats");
+	bptlp = netstat_bptl_alloc();
+	if (bptlp == NULL) {
+		warn("netstat_btl_alloc()");
 		return;
 	}
-	if (size == 0)
-		return;
-	bd = malloc(size);
-	if (bd == NULL) {
-		warn("malloc failed");
-		return;
+
+	if (netstat_bpf(ifname, bptlp, bpt_flags, kvm)) {
+		error = netstat_bptl_geterror(bptlp);
+		if (error == NETSTAT_ERROR_KVM) {
+			warnx("netstat_bpf: %s", kvm_geterr(kvm));
+		} else {
+			warnx("netstat_bpf: %s", netstat_strerror(error));
+		}
+		goto out;
 	}
-	if (sysctlbyname("net.bpf.stats", bd, &size,
-	    NULL, 0) < 0) {
-		warn("net.bpf.stats");
-		free(bd);
-		return;
+
+	if (netstat_bpti_alloc(bptlp, &bptip) < 0) {
+		warn("netstat_bti_alloc()");
+		goto out;
 	}
+
 	(void) printf("%5s %6s %7s %9s %9s %9s %5s %5s %s\n",
 	    "Pid", "Netif", "Flags", "Recv", "Drop", "Match", "Sblen",
 	    "Hblen", "Command");
-	for (d = &bd[0]; d < &bd[size / sizeof(*d)]; d++) {
-		if (d->bd_structsize != sizeof(*d)) {
-			warnx("bpf_stats_extended: version mismatch");
-			return;
-		}
-		if (ifname && strcmp(ifname, d->bd_ifname) != 0)
-			continue;
-		bpf_flags(d, flagbuf);
-		pname = bpf_pidname(d->bd_pid);
-		(void) printf("%5d %6s %7s %9ju %9ju %9ju %5d %5d %s\n",
-		    d->bd_pid, d->bd_ifname, flagbuf,
-		    d->bd_rcount, d->bd_dcount, d->bd_fcount,
-		    d->bd_slen, d->bd_hlen, pname);
-		free(pname);
+	for (bptp = netstat_bpti_first(bptip); bptp != NULL;
+	    bptp = netstat_bpti_next(bptip)) {
+		bpf_flags(bptp, flagbuf);
+		(void) printf("%5d %6s %7s %9ju %9ju %9ju %5ju %5ju %s\n",
+		    netstat_bpt_get_pid(bptp), netstat_bpt_get_ifname(bptp),
+		    flagbuf, netstat_bpt_get_recv(bptp),
+		    netstat_bpt_get_drop(bptp), netstat_bpt_get_match(bptp),
+		    netstat_bpt_get_slen(bptp), netstat_bpt_get_hlen(bptp),
+		    netstat_bpt_get_pidname(bptp));
 	}
-	free(bd);
+out:
+	if (bptip != NULL)
+		netstat_bpti_free(bptip);
+	netstat_bptl_free(bptlp);
 }

==== //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/extern.h#9 (text+ko) ====

@@ -167,4 +167,4 @@
 
 void	mroutepr(u_long, u_long, u_long);
 void	mrt_stats(u_long);
-void	bpf_stats(char *);
+void	bpf_stats(char *, void *);

==== //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/main.c#16 (text+ko) ====

@@ -473,8 +473,8 @@
 
 	if (Bflag) {
 		if (!live)
-			usage();
-		bpf_stats(interface);
+			kread(0, NULL, 0);
+		bpf_stats(interface, kvmd);
 		exit(0);
 	}
 	if (mflag) {


More information about the p4-projects mailing list