From 285b3ac29464d7d05b0c30047f6a4d1563448823 Mon Sep 17 00:00:00 2001 From: seb Date: Thu, 18 Jul 2002 12:57:56 +0000 Subject: Add support for Solaris via the kstat(3) facility. Provided in PR pkg/17521 by Lubomir Sedlacik . --- net/wmnet/distinfo | 12 ++-- net/wmnet/patches/patch-aa | 13 ++-- net/wmnet/patches/patch-ab | 23 ++++++- net/wmnet/patches/patch-ac | 159 +++++++++++++++++++++++++++++++++++++++++++-- net/wmnet/patches/patch-ad | 58 ++++++++--------- net/wmnet/patches/patch-ae | 12 ++-- 6 files changed, 226 insertions(+), 51 deletions(-) (limited to 'net/wmnet') diff --git a/net/wmnet/distinfo b/net/wmnet/distinfo index 3be590e7028..882fd1cf7cc 100644 --- a/net/wmnet/distinfo +++ b/net/wmnet/distinfo @@ -1,10 +1,10 @@ -$NetBSD: distinfo,v 1.3 2001/06/30 09:55:57 wiz Exp $ +$NetBSD: distinfo,v 1.4 2002/07/18 12:57:56 seb Exp $ SHA1 (wmnet-1.06.tar.gz) = 978364e0ab45c71730c196334e8fced4ac0a7853 Size (wmnet-1.06.tar.gz) = 27506 bytes -SHA1 (patch-aa) = be4c53294fbdf234f50900f5051d7a48c70e4481 -SHA1 (patch-ab) = 97418adde93c0299fa5cdfdafc435350cf99e22e -SHA1 (patch-ac) = 9afb6353c121f8d935243d5cd34daa824005d6da -SHA1 (patch-ad) = b8212251da24d60856f5ff0349a6b6abf732888b -SHA1 (patch-ae) = bc43be18fc06090bf102ec927ce5c1bd6f9ab953 +SHA1 (patch-aa) = d999f66818c05f2f9a58571abc0e548bb2938a4b +SHA1 (patch-ab) = 2c2fbc065a49bc27dd42660dda23393e02269714 +SHA1 (patch-ac) = f8793a06cdf4ffd9e852dd802054734a566edb30 +SHA1 (patch-ad) = 7a420d0dcef977549ba35a1046a0e5509a0c3643 +SHA1 (patch-ae) = 09d413422b0074c29da7c8a9c271d9ddb2be04fb SHA1 (patch-af) = 70c0917b465acf778b6b744bef587bc8e41e49fb diff --git a/net/wmnet/patches/patch-aa b/net/wmnet/patches/patch-aa index 9c012b14b87..060ea478331 100644 --- a/net/wmnet/patches/patch-aa +++ b/net/wmnet/patches/patch-aa @@ -1,8 +1,8 @@ -$NetBSD: patch-aa,v 1.1 2000/07/31 17:02:25 tron Exp $ +$NetBSD: patch-aa,v 1.2 2002/07/18 12:57:57 seb Exp $ --- Imakefile.orig Fri May 5 02:34:29 2000 -+++ Imakefile Mon Jul 31 19:01:24 2000 -@@ -10,14 +10,16 @@ ++++ Imakefile Mon Jul 8 16:54:18 2002 +@@ -10,14 +10,21 @@ LOCAL_LIBRARIES = $(XLIB) -lm #endif @@ -13,11 +13,16 @@ $NetBSD: patch-aa,v 1.1 2000/07/31 17:02:25 tron Exp $ INSTPGMFLAGS = -s -g kmem -m 2755 #endif ++#if defined (SunArchitecture) ++LOCAL_LIBRARIES = $(XLIB) -lm -lkstat ++CCOPTIONS = ++#endif ++ LINTLIBS = $(LINTXLIB) -#if defined (FreeBSDArchitecture) || defined (OpenBSDArchitecture) +#if defined (FreeBSDArchitecture) || defined (OpenBSDArchitecture) || \ -+ defined (NetBSDArchitecture) ++ defined (NetBSDArchitecture) || defined (SunArchitecture) SRCS = wmnet.c drivers.c getopt.c getopt1.c OBJS = wmnet.o drivers.o getopt.o getopt1.o #else diff --git a/net/wmnet/patches/patch-ab b/net/wmnet/patches/patch-ab index b143f017ea6..28028f90a83 100644 --- a/net/wmnet/patches/patch-ab +++ b/net/wmnet/patches/patch-ab @@ -1,10 +1,29 @@ -$NetBSD: patch-ab,v 1.1 2000/07/31 17:02:25 tron Exp $ +$NetBSD: patch-ab,v 1.2 2002/07/18 12:57:57 seb Exp $ --- config.h.orig Fri May 5 02:34:29 2000 -+++ config.h Mon Jul 31 19:00:30 2000 ++++ config.h Mon Jul 8 16:44:18 2002 @@ -1,4 +1,4 @@ -#if defined (__FreeBSD__) || defined (__OpenBSD__) +#if defined (__FreeBSD__) || defined (__OpenBSD__) || defined (__NetBSD__) /* Our only FreeBSD driver, this goes straight into kernel memory * and reads the raw structures from right underneath the kernel using the +@@ -13,7 +13,18 @@ + #endif + + ++#if defined (sun) + ++/* ++ * This driver uses the Solaris kstat(3) mechanism to acquire interface ++ * statistics. It's a lot more elegant than grovelling through kernel ++ * memory. ++ */ ++#define USE_KSTAT ++ ++#endif ++ ++ + #ifdef linux + + /* this driver uses a socket ioctl() to get stats from a ppp type interface diff --git a/net/wmnet/patches/patch-ac b/net/wmnet/patches/patch-ac index 72c7efb7234..f63adda3c9d 100644 --- a/net/wmnet/patches/patch-ac +++ b/net/wmnet/patches/patch-ac @@ -1,8 +1,24 @@ -$NetBSD: patch-ac,v 1.3 2001/06/30 09:55:57 wiz Exp $ +$NetBSD: patch-ac,v 1.4 2002/07/18 12:57:57 seb Exp $ --- drivers.c.orig Fri May 5 02:34:29 2000 -+++ drivers.c -@@ -57,7 +57,7 @@ ++++ drivers.c Mon Jul 8 16:50:15 2002 +@@ -37,7 +37,15 @@ + int kvm_updateStats(void); + #endif /* USE_KVM */ + ++/* For Solaris */ ++#ifdef USE_KSTAT ++#include + ++int kstat_test(void); ++int kstat_updateStats(void); ++#endif /* USE_KSTAT */ ++ ++ + #ifdef USE_LINUX_PPP + #include + +@@ -57,7 +65,7 @@ #define ACCOUNT_IN_FOUND 1 #define ACCOUNT_OUT_FOUND 2 @@ -11,7 +27,17 @@ $NetBSD: patch-ac,v 1.3 2001/06/30 09:55:57 wiz Exp $ extern char *in_rule_string, *out_rule_string, *device; extern unsigned long totalbytes_in, totalbytes_out, lastbytes_in, lastbytes_out; extern unsigned long totalpackets_in, totalpackets_out, lastpackets_in, lastpackets_out; -@@ -445,7 +445,7 @@ +@@ -104,6 +112,9 @@ + #ifdef USE_KVM + {"kmem",kvm_updateStats, kvm_test}, + #endif ++#ifdef USE_KSTAT ++ {"kstat", kstat_updateStats, kstat_test}, ++#endif + {NULL, NULL} + }; + +@@ -445,7 +456,7 @@ if (((kvmfd = kvm_open(NULL, NULL, NULL, O_RDONLY, buffer)) == NULL) || (kvm_nlist(kvmfd, symbols) < 0) || kvm_read(kvmfd, (unsigned long)symbols[0].n_value, &ifnet_savedaddr, sizeof(unsigned long)) == -1 ) return False; @@ -20,7 +46,7 @@ $NetBSD: patch-ac,v 1.3 2001/06/30 09:55:57 wiz Exp $ fprintf(stderr, "wmnet: using kmem driver to monitor %s\n", device); return True; } -@@ -457,7 +457,7 @@ +@@ -457,7 +468,7 @@ int flag = 0; while (ifnet_addr && flag != (ACCOUNT_IN_FOUND|ACCOUNT_OUT_FOUND)) { kvm_read(kvmfd, ifnet_addr, buffer, sizeof(struct ifnet)); @@ -29,7 +55,7 @@ $NetBSD: patch-ac,v 1.3 2001/06/30 09:55:57 wiz Exp $ snprintf(devname, 15, "%s", ifnet->if_xname); #else kvm_read(kvmfd, (unsigned long)ifnet->if_name, devname, 15); -@@ -487,7 +487,7 @@ +@@ -487,7 +498,7 @@ flag = (ACCOUNT_IN_FOUND|ACCOUNT_OUT_FOUND); } else { @@ -38,3 +64,124 @@ $NetBSD: patch-ac,v 1.3 2001/06/30 09:55:57 wiz Exp $ ifnet_addr = (unsigned long)ifnet->if_list.tqe_next; #else ifnet_addr = (unsigned long)ifnet->if_next; +@@ -502,8 +513,119 @@ + } + + +-#endif ++#endif /* KVM */ + + ++#ifdef USE_KSTAT + ++kstat_ctl_t *kc = NULL; ++kstat_t *if_ksp = NULL; ++ ++int kstat_test(void) ++{ ++ kstat_t *ksp; ++ ++ if (kc == NULL) { ++ if ((kc = kstat_open()) == NULL) { ++ perror("wmnet [kstat]: can't open /dev/kstat\n"); ++ return (False); ++ } ++ } ++ ++ /* ++ * If no device given, take the first thing we find of class 'net' ++ * which exports the four kstats we need. ++ */ ++ if (device == NULL) { ++ for (ksp = kc->kc_chain; ksp; ksp = ksp->ks_next) { ++ if (strcmp(ksp->ks_class, "net") == 0) { ++ kstat_read(kc, ksp, NULL); ++ if (kstat_data_lookup(ksp, "ipackets") && ++ kstat_data_lookup(ksp, "opackets") && ++ kstat_data_lookup(ksp, "rbytes") && ++ kstat_data_lookup(ksp, "obytes")) { ++ if_ksp = ksp; ++ break; ++ } ++ } ++ } ++ if (if_ksp == NULL) { ++ fprintf(stderr, "wmnet [kstat]: no network interface " ++ "exporting kstats found\n"); ++ return (False); ++ } else { ++ fprintf(stderr, "wmnet [kstat]: monitoring %s\n", ++ ksp->ks_name); ++ } ++ } else { ++ if ((if_ksp = (kstat_lookup(kc, NULL, -1, device))) == NULL) { ++ fprintf(stderr, "wmnet [kstat]: no network interface " ++ "%s exporting kstats found\n", device); ++ return (False); ++ } ++ } ++ ++ return (True); ++} ++ ++int kstat_updateStats(void) ++{ ++ kstat_named_t *in_pkt, *in_byte, *out_pkt, *out_byte; ++ tx = rx = False; ++ ++ if (kstat_read(kc, if_ksp, NULL) == -1) { ++ (void) fprintf(stderr, "wmnet [kstat]: kstat_read failed\n"); ++ exit (1); ++ } ++ ++ if ((in_pkt = (kstat_named_t *) kstat_data_lookup(if_ksp, "ipackets")) ++ == NULL) { ++ (void) fprintf(stderr, "wmnet [kstat]: kstat_data_lookup " ++ "(ipackets) failed\n"); ++ exit (1); ++ } ++ ++ totalpackets_in = (in_pkt->value.ui32); ++ if (totalpackets_in != lastpackets_in) { ++ if ((in_byte = (kstat_named_t *) kstat_data_lookup(if_ksp, ++ "rbytes")) == NULL) { ++ (void) fprintf(stderr, "wmnet [kstat]: " ++ "kstat_data_lookup (rbytes) failed\n"); ++ exit (1); ++ } ++ totalbytes_in = in_byte->value.ui32; ++ diffpackets_in += totalpackets_in - lastpackets_in; ++ diffbytes_in += totalbytes_in - lastbytes_in; ++ lastpackets_in = totalpackets_in; ++ lastbytes_in = totalbytes_in; ++ rx = True; ++ } ++ ++ if ((out_pkt = (kstat_named_t *) kstat_data_lookup(if_ksp, "opackets")) ++ == NULL) { ++ (void) fprintf(stderr, "wmnet [kstat]: kstat_data_lookup " ++ "(opackets) failed\n"); ++ exit (1); ++ } ++ ++ totalpackets_out = (out_pkt->value.ui32); ++ if (totalpackets_out != lastpackets_out) { ++ if ((out_byte = (kstat_named_t *) kstat_data_lookup(if_ksp, ++ "obytes")) == NULL) { ++ (void) fprintf(stderr, "wmnet [kstat]: " ++ "kstat_data_lookup (obytes) failed\n"); ++ exit (1); ++ } ++ totalbytes_out = out_byte->value.ui32; ++ diffpackets_out += totalpackets_out - lastpackets_out; ++ diffbytes_out += totalbytes_out - lastbytes_out; ++ lastpackets_out = totalpackets_out; ++ lastbytes_out = totalbytes_out; ++ tx = True; ++ } ++ ++ return ((rx == current_rx) && (tx == current_tx)); ++} ++ ++#endif /* KSTAT */ + diff --git a/net/wmnet/patches/patch-ad b/net/wmnet/patches/patch-ad index 5d252a8e941..ca99652c2c5 100644 --- a/net/wmnet/patches/patch-ad +++ b/net/wmnet/patches/patch-ad @@ -1,8 +1,8 @@ -$NetBSD: patch-ad,v 1.2 2001/03/27 02:29:18 hubertf Exp $ +$NetBSD: patch-ad,v 1.3 2002/07/18 12:57:58 seb Exp $ --- wmnet.c.orig Fri May 5 03:01:14 2000 -+++ wmnet.c -@@ -55,7 +55,7 @@ ++++ wmnet.c Mon Jul 8 16:52:30 2002 +@@ -55,9 +55,13 @@ #include #include #include @@ -10,8 +10,14 @@ $NetBSD: patch-ad,v 1.2 2001/03/27 02:29:18 hubertf Exp $ +#if defined (__FreeBSD__) || defined (__OpenBSD__) || defined (__NetBSD__) # include # include"getopt.h" ++#elif defined (sun) ++# include ++# include ++# include "getopt.h" #else -@@ -97,17 +97,19 @@ + # include + #endif +@@ -97,17 +101,19 @@ int c; XColor thecolor; struct sigaction signal_action; @@ -34,7 +40,7 @@ $NetBSD: patch-ad,v 1.2 2001/03/27 02:29:18 hubertf Exp $ {"logscale", no_argument, NULL, 'l'}, {"help", no_argument, NULL, 'h'}, {"execute", required_argument, NULL, 'e'}, -@@ -131,9 +133,9 @@ +@@ -131,9 +137,9 @@ /* Get options */ #ifdef linux @@ -46,7 +52,7 @@ $NetBSD: patch-ad,v 1.2 2001/03/27 02:29:18 hubertf Exp $ #endif switch(c) { case 'v': -@@ -176,6 +178,15 @@ +@@ -176,6 +182,15 @@ exit(23); } break; @@ -62,7 +68,7 @@ $NetBSD: patch-ad,v 1.2 2001/03/27 02:29:18 hubertf Exp $ case 'F': if (labelfgcolorString == NULL) { labelfgcolorString = (char *)alloca(strlen(optarg)+1); -@@ -228,6 +239,9 @@ +@@ -228,6 +243,9 @@ case 'n': specified_state = NormalState; break; @@ -72,7 +78,7 @@ $NetBSD: patch-ad,v 1.2 2001/03/27 02:29:18 hubertf Exp $ case 'u': { int fds; -@@ -283,6 +297,7 @@ +@@ -283,6 +301,7 @@ " -L, --label=LABEL display LABEL on bottom of window\n" " -F, --labelfg=COLOR foreground color for the label\n" " -B, --labelbg=COLOR background color for the label\n" @@ -80,7 +86,7 @@ $NetBSD: patch-ad,v 1.2 2001/03/27 02:29:18 hubertf Exp $ " -e, --execute=COMMAND run COMMAND on click\n" #ifdef linux " -T, --txrule=RULE accounting rule number (ipfwadm) or\n" -@@ -320,6 +335,7 @@ +@@ -320,6 +339,7 @@ if (rxcolorString == NULL) rxcolorString = "red"; if (labelfgcolorString == NULL) labelfgcolorString = "white"; if (labelbgcolorString == NULL) labelbgcolorString = "black"; @@ -88,7 +94,7 @@ $NetBSD: patch-ad,v 1.2 2001/03/27 02:29:18 hubertf Exp $ /* Change dir to /, security precaution, and common courtesy */ if (chdir("/") == -1) { -@@ -384,6 +400,14 @@ +@@ -384,6 +404,14 @@ XAllocColor(dpy, DefaultColormap(dpy, screen), &thecolor); labelbg_pixel = thecolor.pixel; } @@ -103,7 +109,7 @@ $NetBSD: patch-ad,v 1.2 2001/03/27 02:29:18 hubertf Exp $ /* usleep() in between polls to /proc/net/ip_acct */ if (delayTime <= 0) delayTime = 25000; -@@ -442,7 +466,7 @@ +@@ -442,7 +470,7 @@ } gcv.graphics_exposures = False; gcv.foreground = tx_pixel[HIGH_INTENSITY]; @@ -112,7 +118,7 @@ $NetBSD: patch-ad,v 1.2 2001/03/27 02:29:18 hubertf Exp $ gcv.font = XLoadFont(dpy, "5x8"); graphics_context = XCreateGC(dpy, root_window, (GCFont|GCGraphicsExposures|GCForeground|GCBackground), &gcv); black_pixel = BlackPixel(dpy, screen); -@@ -494,12 +518,12 @@ +@@ -494,12 +522,12 @@ /* Handles Expose events, repaints the window */ void redraw(XExposeEvent *ee) { static XRectangle cliprect = { 4, 51, 56, 9 }; @@ -127,34 +133,28 @@ $NetBSD: patch-ad,v 1.2 2001/03/27 02:29:18 hubertf Exp $ XFillRectangle(dpy, *visible_window, graphics_context, TOPBOX_X, TOPBOX_Y, TOPBOX_WIDTH, TOPBOX_HEIGHT); XDrawLine(dpy, *visible_window, graphics_context, GRAPHBOX_X_LEFT, GRAPHBOX_Y_TOP, GRAPHBOX_X_LEFT, GRAPHBOX_Y_BOTTOM); XDrawPoint(dpy, *visible_window, graphics_context, GRAPHBOX_X_RIGHT, GRAPHBOX_Y_TOP); -@@ -513,15 +537,19 @@ +@@ -513,15 +541,19 @@ } -- XSetForeground(dpy, graphics_context, white_pixel); -- XDrawLine(dpy, *visible_window, graphics_context, GRAPHBOX_X_RIGHT, GRAPHBOX_Y_BOTTOM, GRAPHBOX_X_RIGHT, (GRAPHBOX_Y_TOP + 1)); -- XDrawLine(dpy, *visible_window, graphics_context, GRAPHBOX_X_LEFT, GRAPHBOX_Y_BOTTOM, GRAPHBOX_X_RIGHT, GRAPHBOX_Y_BOTTOM); + if (! no3d) { -+ XSetForeground(dpy, graphics_context, white_pixel); -+ XDrawLine(dpy, *visible_window, graphics_context, GRAPHBOX_X_RIGHT, GRAPHBOX_Y_BOTTOM, GRAPHBOX_X_RIGHT, (GRAPHBOX_Y_TOP + 1)); -+ XDrawLine(dpy, *visible_window, graphics_context, GRAPHBOX_X_LEFT, GRAPHBOX_Y_BOTTOM, GRAPHBOX_X_RIGHT, GRAPHBOX_Y_BOTTOM); + XSetForeground(dpy, graphics_context, white_pixel); + XDrawLine(dpy, *visible_window, graphics_context, GRAPHBOX_X_RIGHT, GRAPHBOX_Y_BOTTOM, GRAPHBOX_X_RIGHT, (GRAPHBOX_Y_TOP + 1)); + XDrawLine(dpy, *visible_window, graphics_context, GRAPHBOX_X_LEFT, GRAPHBOX_Y_BOTTOM, GRAPHBOX_X_RIGHT, GRAPHBOX_Y_BOTTOM); + } -- XSetForeground(dpy, graphics_context, grey_pixel); -- XSetBackground(dpy, graphics_context, black_pixel); -- XCopyPlane(dpy, arrow, *visible_window, graphics_context, 7, 0, 7, 9, 53, 5, 1); -- XCopyPlane(dpy, arrow, *visible_window, graphics_context, 0, 0, 7, 9, 46, 5, 1); + if (! no3d) { /* OK, this is cheating, but I don't want to add yet another switch; I have NFC what these arrows are for - HF */ -+ XSetForeground(dpy, graphics_context, grey_pixel); + XSetForeground(dpy, graphics_context, grey_pixel); +- XSetBackground(dpy, graphics_context, black_pixel); + XSetBackground(dpy, graphics_context, bg_pixel); -+ XCopyPlane(dpy, arrow, *visible_window, graphics_context, 7, 0, 7, 9, 53, 5, 1); -+ XCopyPlane(dpy, arrow, *visible_window, graphics_context, 0, 0, 7, 9, 46, 5, 1); + XCopyPlane(dpy, arrow, *visible_window, graphics_context, 7, 0, 7, 9, 53, 5, 1); + XCopyPlane(dpy, arrow, *visible_window, graphics_context, 0, 0, 7, 9, 46, 5, 1); + } } -@@ -572,7 +600,7 @@ +@@ -572,7 +604,7 @@ if (blank < (GRAPH_WIDTH + 1) ) { XCopyArea(dpy, *visible_window, *visible_window, graphics_context, GRAPH_X + 1, GRAPH_Y, GRAPH_WIDTH - 1, GRAPH_HEIGHT, GRAPH_X, GRAPH_Y); @@ -163,7 +163,7 @@ $NetBSD: patch-ad,v 1.2 2001/03/27 02:29:18 hubertf Exp $ XDrawLine(dpy, *visible_window, graphics_context, GRAPH_X_RIGHT, y, GRAPH_X_RIGHT, yy); if (( (yy == GRAPH_Y_UPPER && diffbytes_out > 0 && rate_rx > rate_tx) || (rate_rx >= rate_tx && yy != GRAPH_Y_UPPER)) ) { drawColoredLine(GRAPH_Y_UPPER, yy, tx_pixel); -@@ -593,7 +621,7 @@ +@@ -593,7 +625,7 @@ if (!stat_gather()) { /* Anything change? */ current_rx = rx; current_tx = tx; @@ -172,7 +172,7 @@ $NetBSD: patch-ad,v 1.2 2001/03/27 02:29:18 hubertf Exp $ if(current_tx == True) { XSetForeground(dpy, graphics_context, tx_pixel[HIGH_INTENSITY]); XCopyPlane(dpy, arrow, *visible_window, graphics_context, 7, 0, 7, 9, 53, 5, 1); -@@ -646,7 +674,7 @@ +@@ -646,7 +678,7 @@ if (!clear) { diff --git a/net/wmnet/patches/patch-ae b/net/wmnet/patches/patch-ae index cf44a87f1de..4dbc23d4a60 100644 --- a/net/wmnet/patches/patch-ae +++ b/net/wmnet/patches/patch-ae @@ -1,12 +1,12 @@ -$NetBSD: patch-ae,v 1.3 2001/03/27 02:29:18 hubertf Exp $ +$NetBSD: patch-ae,v 1.4 2002/07/18 12:57:58 seb Exp $ --- wmnet.man.orig Fri May 5 02:43:35 2000 -+++ wmnet.man ++++ wmnet.man Mon Jul 8 17:09:42 2002 @@ -1,6 +1,6 @@ .\" -*-Nroff-*- .\" -.TH wmnet 1x "4 May 2000" -+.TH wmnet 1x "4 Mar 2001" ++.TH wmnet 1x "8 Jul 2002" .SH NAME wmnet \- an IP accounting monitoring tool .SH SYNOPSIS @@ -40,7 +40,7 @@ $NetBSD: patch-ae,v 1.3 2001/03/27 02:29:18 hubertf Exp $ .B -e,--execute=\fICOMMAND executes \fICOMMAND \fPon a single click from button 1 (left mouse button). .TP -@@ -147,9 +156,9 @@ +@@ -147,9 +156,13 @@ Otherwise, the kernel will not collect the stats we need. .TP .B kmem @@ -50,6 +50,10 @@ $NetBSD: patch-ae,v 1.3 2001/03/27 02:29:18 hubertf Exp $ +this driver is available on FreeBSD, OpenBSD and NetBSD systems and must be +passed a device through the \fI--device\fP option. By default, it uses ppp0 +but will accept any valid device name. ++.TP ++.B kstat ++this driver is available on Solaris and uses general-purpose kernel statistics ++facility provided by kstat device. .SH FILES .TP .I /proc/net/ip_acct /proc/net/dev /proc/net/ipchains -- cgit v1.2.3