diff options
author | abial <abial@FreeBSD.org> | 1998-09-02 11:48:07 +0000 |
---|---|---|
committer | abial <abial@FreeBSD.org> | 1998-09-02 11:48:07 +0000 |
commit | e618724b5dd1602ab500937310c98e2d1a2783b4 (patch) | |
tree | 9a551988469e8b83f81d13b2fff5d776d1a918e6 /release/picobsd/tinyware/ns | |
parent | 3b8162003f07403322692967211a969abc9159cb (diff) | |
download | FreeBSD-src-e618724b5dd1602ab500937310c98e2d1a2783b4.zip FreeBSD-src-e618724b5dd1602ab500937310c98e2d1a2783b4.tar.gz |
Added code to display interface table and link layer info, as well
as bridging statistics when using Luigi's bridging code.
Also added some ifdef's to (hopefully) get it to compile under 2.2.x
Submitted by: Luigi Rizzo <luigi@iet.unipi.it>
Diffstat (limited to 'release/picobsd/tinyware/ns')
-rw-r--r-- | release/picobsd/tinyware/ns/Makefile | 4 | ||||
-rw-r--r-- | release/picobsd/tinyware/ns/ns.c | 135 |
2 files changed, 125 insertions, 14 deletions
diff --git a/release/picobsd/tinyware/ns/Makefile b/release/picobsd/tinyware/ns/Makefile index b75d813..9679f07 100644 --- a/release/picobsd/tinyware/ns/Makefile +++ b/release/picobsd/tinyware/ns/Makefile @@ -1,7 +1,9 @@ -# $Id: Makefile,v 1.1 1998/08/01 18:26:02 abial Exp $ +# $Id: Makefile,v 1.1.1.1 1998/08/27 17:38:45 abial Exp $ # PROG=ns SRCS= ns.c +# Uncomment this to use Luigi's bridging statistics +# CFLAGS+=-DBRIDGING NOMAN=yes .include <bsd.prog.mk> diff --git a/release/picobsd/tinyware/ns/ns.c b/release/picobsd/tinyware/ns/ns.c index 6ec15d3..d1e9208 100644 --- a/release/picobsd/tinyware/ns/ns.c +++ b/release/picobsd/tinyware/ns/ns.c @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: ns.c,v 1.2 1998/08/09 18:52:07 abial Exp $ + * $Id: ns.c,v 1.1.1.1 1998/08/27 17:38:45 abial Exp $ */ @@ -55,8 +55,20 @@ #include <net/if_dl.h> #include <sys/un.h> +#ifdef BRIDGING +#include <sys/param.h> +#include <sys/mbuf.h> +#include <net/ethernet.h> +#include <net/if_types.h> /* IFT_ETHER */ +#include <netinet/in.h> +#include <netinet/in_var.h> +#include <netinet/if_ether.h> +#include <net/bridge.h> +#endif + char *progname; -int rflag=1; /* print routing by default */ +int iflag=0; +int rflag=0; int sflag=0; int pflag=0; @@ -66,8 +78,12 @@ extern int optind; void usage() { - fprintf(stderr,"\n%s [-r | -s] [-p proto]\n",progname); + fprintf(stderr,"\n%s [-r | -i | -s [-p proto] ]\n",progname); +#ifdef BRIDGING + fprintf(stderr," proto: {ip|tcp|udp|icmp|bdg}\n\n"); +#else fprintf(stderr," proto: {ip|tcp|udp|icmp}\n\n"); +#endif } int if_num; @@ -221,7 +237,7 @@ get_flags(char *buf, int flags) } int -routing(char *proto) +print_routing(char *proto) { int mib[6],i=0,rt_len,if_len; char *rt_buf,*if_buf,*next,*lim; @@ -281,16 +297,47 @@ routing(char *proto) i++; } if_num=i; - if_table=(struct sockaddr **)malloc(i*sizeof(struct sockaddr)); - ifm_table=(struct if_msghdr **)malloc(i*sizeof(struct if_msghdr)); - memset(ifm_table,0,sizeof(ifm_table)); + if_table=(struct sockaddr **)calloc(i,sizeof(struct sockaddr)); + ifm_table=(struct if_msghdr **)calloc(i,sizeof(struct if_msghdr)); + if (iflag) { + printf("\nInterface table:\n"); + printf("----------------\n"); + printf("Name Mtu Network Address " + "Ipkts Ierrs Opkts Oerrs Coll\n"); + } i=0; for(next=if_buf;next<lim;next+=ifm->ifm_msglen) { + ifm=(struct if_msghdr *)next; if_table[i]=(struct sockaddr *)(ifm+1); ifm_table[i]=ifm; + + sa = if_table[i]; + if (iflag && sa->sa_family == AF_LINK) { + struct sockaddr_dl *sdl = (struct sockaddr_dl *) sa; + + printf("%-4s %-5d <Link> ", + sock_ntop(if_table[i], if_table[i]->sa_len), + ifm->ifm_data.ifi_mtu); + if ( sdl->sdl_alen == 6) { + unsigned char *p = sdl->sdl_data + sdl->sdl_nlen ; + + printf("%02x.%02x.%02x.%02x.%02x.%02x ", + p[0], p[1], p[2], p[3], p[4], p[5] ); + } else + printf(" "); + printf("%9d%6d%9d%6d%6d\n", + ifm->ifm_data.ifi_ipackets, + ifm->ifm_data.ifi_ierrors, + ifm->ifm_data.ifi_opackets, + ifm->ifm_data.ifi_oerrors, + ifm->ifm_data.ifi_collisions + ); + } i++; } + if (!rflag) + return(0); /* Now dump the routing table */ printf("\nRouting table:\n"); printf("--------------\n"); @@ -348,6 +395,10 @@ print_ip_stats() mib[0]=CTL_NET; mib[1]=PF_INET; mib[2]=IPPROTO_IP; +#ifndef IPCTL_STATS + printf("sorry, ip stats not available\n"); + return -1 ; +#else mib[3]=IPCTL_STATS; len=sizeof(struct ipstat); if(sysctl(mib,4,&s,&len,NULL,0)<0) { @@ -360,7 +411,9 @@ print_ip_stats() printf("* Packets ok:\n"); printf(" %10lu fragments received\n",s.ips_fragments); printf(" %10lu forwarded\n",s.ips_forward); +#if __FreeBSD_version < 300001 printf(" %10lu fast forwarded\n",s.ips_fastforward); +#endif printf(" %10lu forwarded on same net (redirect)\n",s.ips_redirectsent); printf(" %10lu delivered to upper level\n",s.ips_delivered); printf(" %10lu total ip packets generated here\n",s.ips_localout); @@ -384,7 +437,10 @@ print_ip_stats() printf(" %10lu dropped due to no route\n",s.ips_noroute); printf(" %10lu bad IP version\n",s.ips_badvers); printf(" %10lu too long (more than max IP size)\n",s.ips_toolong); +#if __FreeBSD_version < 300001 printf(" %10lu multicast for unregistered groups\n",s.ips_notmember); +#endif +#endif } print_tcp_stats() @@ -395,6 +451,10 @@ print_tcp_stats() mib[0]=CTL_NET; mib[1]=PF_INET; mib[2]=IPPROTO_TCP; +#ifndef TCPCTL_STATS + printf("sorry, tcp stats not available\n"); + return -1 ; +#else mib[3]=TCPCTL_STATS; len=sizeof(struct tcpstat); if(sysctl(mib,4,&s,&len,NULL,0)<0) { @@ -467,6 +527,7 @@ print_tcp_stats() printf(" %10lu bogus SYN, e.g. premature ACK\n",s.tcps_badsyn); printf(" %10lu resends due to MTU discovery\n",s.tcps_mturesent); printf(" %10lu listen queue overflows\n",s.tcps_listendrop); +#endif } print_udp_stats() @@ -497,7 +558,9 @@ print_udp_stats() printf(" %10lu packets not for hashed PCBs\n",s.udpps_pcbhashmiss); printf("* Packets sent:\n"); printf(" %10lu total output packets\n",s.udps_opackets); +#if __FreeBSD_version < 300001 printf(" %10lu output packets on fast path\n",s.udps_fastout); +#endif } char *icmp_names[]={ @@ -567,6 +630,8 @@ print_icmp_stats() int stats(char *proto) { + if (!sflag) + return 0 ; if(pflag) { if(proto==NULL) { fprintf(stderr,"Option '-p' requires paramter.\n"); @@ -577,12 +642,18 @@ stats(char *proto) if(strcmp(proto,"icmp")==0) print_icmp_stats(); if(strcmp(proto,"udp")==0) print_udp_stats(); if(strcmp(proto,"tcp")==0) print_tcp_stats(); +#ifdef BRIDGING + if(strcmp(proto,"bdg")==0) print_bdg_stats(); +#endif return(0); } print_ip_stats(); print_icmp_stats(); print_udp_stats(); print_tcp_stats(); +#ifdef BRIDGING + print_bdg_stats(); +#endif return(0); } @@ -594,17 +665,21 @@ main(int argc, char *argv[]) progname=argv[0]; - while((c=getopt(argc,argv,"rsp:"))!=-1) { + while((c=getopt(argc,argv,"irsp:"))!=-1) { switch(c) { case 'r': rflag++; break; + case 'i': + iflag++; + break; case 's': sflag++; rflag=0; break; case 'p': pflag++; + sflag++; proto=optarg; break; case '?': @@ -614,15 +689,49 @@ main(int argc, char *argv[]) break; } } + if (rflag == 0 && sflag == 0 && iflag == 0) + rflag = 1 ; argc-=optind; if(argc>0) { usage(); exit(-1); } - if(rflag) { - routing(proto); - } else { - stats(proto); - } + print_routing(proto); + stats(proto); exit(0); } + +#ifdef BRIDGING +int +print_bdg_stats() /* print bridge statistics */ +{ + int i, slen ; + struct bdg_stats s ; + int mib[4] ; + + slen = sizeof(s); + + mib[0] = CTL_NET ; + mib[1] = PF_LINK ; + mib[2] = IFT_ETHER ; + mib[3] = PF_BDG ; + if (sysctl(mib,4, &s,&slen,NULL,0)==-1) { + return 0 ; /* no bridging */ + } + printf("-- Bridging statistics --\n") ; + printf( +"Name__ ___in___ ___out__ ___fwd__ __drop__ __bcast_ __mcast_ __local_ ___unk__\n"); + for (i = 0 ; i < 16 ; i++) { + printf("%-6s %8d%8d%8d%8d%8d%8d%8d%8d\n", + s.s[i].name, + s.s[i].p_in[(int)BDG_IN], + s.s[i].p_in[(int)BDG_OUT], + s.s[i].p_in[(int)BDG_FORWARD], + s.s[i].p_in[(int)BDG_DROP], + s.s[i].p_in[(int)BDG_BCAST], + s.s[i].p_in[(int)BDG_MCAST], + s.s[i].p_in[(int)BDG_LOCAL], + s.s[i].p_in[(int)BDG_UNKNOWN] ); + } +} +#endif |