From 67653866aa83c06cbc92828ae2988bbeea1e776d Mon Sep 17 00:00:00 2001 From: ru Date: Fri, 15 Jun 2001 18:25:38 +0000 Subject: [PATCH] First round of netstat(1) cleanup. Removed the ambiguity in -s, -f, -p and -i flags handling. Basically, there are four displays (except others): 1. PCB display. 2. Protocol statistics display. (-s) 3. Interface statistics display. (-i) 4. Per-interface protocol statistics display. (-i -s) All of the above except 3) can be limited to a particular protocol family (-f) or a single protocol (-p). Some examples: 1. netstat -f inet -- show PCBs of all INET protocols 2. netstat -p udp -- show PCB of UDP protocol only (NEW!) 3. netstat -s -- show protocol statistics for all families 4. netstat -s -f inet -- show INET protocols statistics 5. netstat -s -p icmp -- show ICMP protocol statistics This is a work in progress. Manpage has been fixed slightly, but is still incomplete. --- usr.bin/netstat/if.c | 2 +- usr.bin/netstat/main.c | 47 +++++++++++------------- usr.bin/netstat/netstat.1 | 75 ++++++++++++++++++--------------------- usr.bin/netstat/netstat.h | 1 - 4 files changed, 56 insertions(+), 69 deletions(-) diff --git a/usr.bin/netstat/if.c b/usr.bin/netstat/if.c index 150d2f0d2116..500ced1ae992 100644 --- a/usr.bin/netstat/if.c +++ b/usr.bin/netstat/if.c @@ -202,7 +202,7 @@ intpr(int interval, u_long ifnetaddr, void (*pfunc)(char *)) if (kread(ifnetaddr, (char *)&ifnet, sizeof ifnet)) return; - if ((!sflag || iflag) && !pflag) { + if (!pfunc) { printf("%-5.5s %-5.5s %-13.13s %-15.15s %8.8s %5.5s", "Name", "Mtu", "Network", "Address", "Ipkts", "Ierrs"); if (bflag) diff --git a/usr.bin/netstat/main.c b/usr.bin/netstat/main.c index db11fba38708..81238b8e2fa2 100644 --- a/usr.bin/netstat/main.c +++ b/usr.bin/netstat/main.c @@ -315,7 +315,7 @@ int Lflag; /* show size of listen queues */ int mflag; /* show memory stats */ int numeric_addr; /* show addresses numerically */ int numeric_port; /* show ports numerically */ -int pflag; /* show given protocol */ +static int pflag; /* show given protocol */ int rflag; /* show routing tables (or routing stats) */ int sflag; /* show protocol statistics */ int tflag; /* show i/f watchdog timers */ @@ -338,7 +338,7 @@ main(argc, argv) af = AF_UNSPEC; - while ((ch = getopt(argc, argv, "Aabdf:gI:iLlM:mN:np:rsStuWw:")) != -1) + while ((ch = getopt(argc, argv, "Aabdf:gI:iLlM:mN:np:rSstuWw:")) != -1) switch(ch) { case 'A': Aflag = 1; @@ -491,25 +491,6 @@ main(argc, argv) mbpr(0, 0, 0, 0); exit(0); } - if (pflag) { - if (iflag && tp->pr_istats) { - kread(0, 0, 0); - intpr(interval, nl[N_IFNET].n_value, tp->pr_istats); - exit(0); - } - if (!tp->pr_stats) { - printf("%s: no stats routine\n", tp->pr_name); - exit(0); - } - if (tp->pr_usesysctl) { - (*tp->pr_stats)(tp->pr_usesysctl, tp->pr_name, af); - } else { - kread(0, 0, 0); - (*tp->pr_stats)(nl[tp->pr_sindex].n_value, - tp->pr_name, af); - } - exit(0); - } #if 0 /* * Keep file descriptors open to avoid overhead @@ -524,10 +505,7 @@ main(argc, argv) * used for the queries, which is slower. */ #endif - if (iflag) { - if (sflag && af != AF_UNSPEC) - goto protostat; - + if (iflag && !sflag) { kread(0, 0, 0); intpr(interval, nl[N_IFNET].n_value, NULL); exit(0); @@ -562,8 +540,11 @@ main(argc, argv) exit(0); } - protostat: kread(0, 0, 0); + if (tp) { + printproto(tp, tp->pr_name); + exit(0); + } if (af == AF_INET || af == AF_UNSPEC) for (tp = protox; tp->pr_name; tp++) printproto(tp, tp->pr_name); @@ -621,15 +602,29 @@ printproto(tp, name) if (tp->pr_istats) intpr(interval, nl[N_IFNET].n_value, tp->pr_istats); + else if (pflag) + printf("%s: no per-interface stats routine\n", + tp->pr_name); return; } else { pr = tp->pr_stats; + if (!pr) { + if (pflag) + printf("%s: no stats routine\n", + tp->pr_name); + return; + } off = tp->pr_usesysctl ? tp->pr_usesysctl : nl[tp->pr_sindex].n_value; } } else { pr = tp->pr_cblocks; + if (!pr) { + if (pflag) + printf("%s: no PCB routine\n", tp->pr_name); + return; + } off = tp->pr_usesysctl ? tp->pr_usesysctl : nl[tp->pr_index].n_value; } diff --git a/usr.bin/netstat/netstat.1 b/usr.bin/netstat/netstat.1 index 774c4ac736a3..594e277d9bc7 100644 --- a/usr.bin/netstat/netstat.1 +++ b/usr.bin/netstat/netstat.1 @@ -32,7 +32,7 @@ .\" @(#)netstat.1 8.8 (Berkeley) 4/18/94 .\" $FreeBSD$ .\" -.Dd April 18, 1994 +.Dd June 15, 2001 .Dt NETSTAT 1 .Os .Sh NAME @@ -41,33 +41,30 @@ .Sh SYNOPSIS .Nm .Op Fl AaLlnW +.Op Fl f Ar address_family | Fl p Ar protocol +.Op Fl M Ar core +.Op Fl N Ar system +.Nm +.Op Fl gilnrsS .Op Fl f Ar address_family .Op Fl M Ar core .Op Fl N Ar system .Nm -.Op Fl bdgilnrsS -.Op Fl f Ar address_family -.Op Fl M Ar core -.Op Fl N Ar system -.Nm -.Op Fl bdn -.Op Fl I Ar interface -.Op Fl M Ar core -.Op Fl N Ar system +.Fl i | I Ar interface .Op Fl w Ar wait -.Nm -.Op Fl p Ar protocol +.Op Fl abdgt .Op Fl M Ar core .Op Fl N Ar system .Nm -.Op Fl p Ar protocol -.Op Fl i -.Op Fl I Ar Interface +.Fl s Op Fl s +.Op Fl f Ar address_family | Fl p Ar protocol +.Op Fl M Ar core +.Op Fl N Ar system .Nm -.Op Fl s -.Op Fl f Ar address_family -.Op Fl i -.Op Fl I Ar Interface +.Fl i | I Ar interface Fl s +.Op Fl f Ar address_family | Fl p Ar protocol +.Op Fl M Ar core +.Op Fl N Ar system .Nm .Fl m .Op Fl M Ar core @@ -89,9 +86,13 @@ interval specified, .Nm will continuously display the information regarding packet traffic on the configured network interfaces. -The fourth form displays statistics about the named protocol. -The fifth and sixth forms display per interface statistics for +The fourth form displays statistics for +the specified protocol or address familily. +The fifth form displays per-interface statistics for the specified protocol or address family. +The sixth form displays +.Xr mbuf 9 +statistics. .Pp The options have the following meaning: .Bl -tag -width flag @@ -112,8 +113,8 @@ parent route); normally these routes are not shown. .It Fl b With the interface display (option -.Fl i -, as described below), +.Fl i , +as described below), show the number of bytes in and out. .It Fl d With either interface display (option @@ -165,18 +166,14 @@ used with a .Ar wait interval as described below. If the -.Fl f Ar address_family -option (with the .Fl s -option) or the -.Fl p Ar protocol -option is present, show per-interface statistics on the +option is present, show per-interface protocol statistics on the .Ar interface for the specified .Ar address_family or .Ar protocol , -respectively. +or for all protocol families. .It Fl i Show the state of interfaces which have been auto-configured (interfaces statically configured into a system, but not @@ -188,17 +185,13 @@ for each Ethernet interface and for each IP interface address. Multicast addresses are shown on separate lines following the interface address with which they are associated. If the -.Fl f Ar address_family -option (with the .Fl s -option) or the -.Fl p Ar protocol option is present, show per-interface statistics on all interfaces for the specified .Ar address_family or .Ar protocol , -respectively. +or for all protocol families. .It Fl L Show the size of the various listen queues. The first count shows the @@ -223,10 +216,6 @@ Show network addresses and ports as numbers (normally interprets addresses and ports and attempts to display them symbolically). This option may be used with any of the display formats. -.It Fl S -Show network addresses as numbers (as with -.Fl n ) -but show ports symbolically). .It Fl p Ar protocol Show statistics about .Ar protocol , @@ -241,9 +230,6 @@ report. The program will complain if .Ar protocol is unknown or if there is no statistics routine for it. -.It Fl s -Show per-protocol statistics. -If this option is repeated, counters with a value of zero are suppressed. .It Fl r Show the routing tables. Use with @@ -259,6 +245,13 @@ is also present, assumes more columns are there and the maximum transmission unit .Pq Dq mtu are also displayed. +.It Fl S +Show network addresses as numbers (as with +.Fl n ) +but show ports symbolically). +.It Fl s +Show per-protocol statistics. +If this option is repeated, counters with a value of zero are suppressed. .It Fl W In certain displays, avoid truncating addresses even if this causes some fields to overflow. diff --git a/usr.bin/netstat/netstat.h b/usr.bin/netstat/netstat.h index f61384720a7e..322a7e2d4a81 100644 --- a/usr.bin/netstat/netstat.h +++ b/usr.bin/netstat/netstat.h @@ -47,7 +47,6 @@ extern int Lflag; /* show size of listen queues */ extern int mflag; /* show memory stats */ extern int numeric_addr; /* show addresses numerically */ extern int numeric_port; /* show ports numerically */ -extern int pflag; /* show given protocol */ extern int rflag; /* show routing tables (or routing stats) */ extern int sflag; /* show protocol statistics */ extern int tflag; /* show i/f watchdog timers */