Home | History | Annotate | Line # | Download | only in netstat
inet6.c revision 1.4
      1  1.4  bouyer /*	$NetBSD: inet6.c,v 1.4 1999/11/19 10:44:33 bouyer Exp $	*/
      2  1.2  itojun 
      3  1.1  itojun /*	BSDI inet.c,v 2.3 1995/10/24 02:19:29 prb Exp	*/
      4  1.1  itojun /*
      5  1.1  itojun  * Copyright (c) 1983, 1988, 1993
      6  1.1  itojun  *	The Regents of the University of California.  All rights reserved.
      7  1.1  itojun  *
      8  1.1  itojun  * Redistribution and use in source and binary forms, with or without
      9  1.1  itojun  * modification, are permitted provided that the following conditions
     10  1.1  itojun  * are met:
     11  1.1  itojun  * 1. Redistributions of source code must retain the above copyright
     12  1.1  itojun  *    notice, this list of conditions and the following disclaimer.
     13  1.1  itojun  * 2. Redistributions in binary form must reproduce the above copyright
     14  1.1  itojun  *    notice, this list of conditions and the following disclaimer in the
     15  1.1  itojun  *    documentation and/or other materials provided with the distribution.
     16  1.1  itojun  * 3. All advertising materials mentioning features or use of this software
     17  1.1  itojun  *    must display the following acknowledgement:
     18  1.1  itojun  *	This product includes software developed by the University of
     19  1.1  itojun  *	California, Berkeley and its contributors.
     20  1.1  itojun  * 4. Neither the name of the University nor the names of its contributors
     21  1.1  itojun  *    may be used to endorse or promote products derived from this software
     22  1.1  itojun  *    without specific prior written permission.
     23  1.1  itojun  *
     24  1.1  itojun  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     25  1.1  itojun  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     26  1.1  itojun  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     27  1.1  itojun  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     28  1.1  itojun  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     29  1.1  itojun  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     30  1.1  itojun  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     31  1.1  itojun  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     32  1.1  itojun  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     33  1.1  itojun  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     34  1.1  itojun  * SUCH DAMAGE.
     35  1.1  itojun  */
     36  1.1  itojun 
     37  1.1  itojun #include <sys/cdefs.h>
     38  1.1  itojun #ifndef lint
     39  1.1  itojun #if 0
     40  1.1  itojun static char sccsid[] = "@(#)inet.c	8.4 (Berkeley) 4/20/94";
     41  1.1  itojun #else
     42  1.4  bouyer __RCSID("$NetBSD: inet6.c,v 1.4 1999/11/19 10:44:33 bouyer Exp $");
     43  1.1  itojun #endif
     44  1.1  itojun #endif /* not lint */
     45  1.1  itojun 
     46  1.1  itojun #include <sys/param.h>
     47  1.1  itojun #include <sys/socket.h>
     48  1.1  itojun #include <sys/socketvar.h>
     49  1.1  itojun #include <sys/mbuf.h>
     50  1.1  itojun #include <sys/protosw.h>
     51  1.1  itojun 
     52  1.1  itojun #include <net/route.h>
     53  1.1  itojun #include <net/if.h>
     54  1.1  itojun #include <netinet/in.h>
     55  1.1  itojun #include <netinet/ip6.h>
     56  1.1  itojun #include <netinet/icmp6.h>
     57  1.1  itojun #include <netinet/in_systm.h>
     58  1.1  itojun #ifndef TCP6
     59  1.1  itojun #include <netinet/ip.h>
     60  1.1  itojun #include <netinet/ip_var.h>
     61  1.1  itojun #endif
     62  1.1  itojun #include <netinet6/in6_pcb.h>
     63  1.1  itojun #include <netinet6/ip6_var.h>
     64  1.1  itojun #ifdef TCP6
     65  1.1  itojun #include <netinet6/tcp6.h>
     66  1.1  itojun #include <netinet6/tcp6_seq.h>
     67  1.1  itojun #define TCP6STATES
     68  1.1  itojun #include <netinet6/tcp6_fsm.h>
     69  1.1  itojun #define TCP6TIMERS
     70  1.1  itojun #include <netinet6/tcp6_timer.h>
     71  1.1  itojun #include <netinet6/tcp6_var.h>
     72  1.1  itojun #include <netinet6/tcp6_debug.h>
     73  1.1  itojun #else
     74  1.1  itojun #include <netinet/tcp.h>
     75  1.1  itojun #include <netinet/tcpip.h>
     76  1.1  itojun #include <netinet/tcp_seq.h>
     77  1.1  itojun /*#define TCPSTATES*/
     78  1.1  itojun #include <netinet/tcp_fsm.h>
     79  1.1  itojun extern char *tcpstates[];
     80  1.1  itojun /*#define	TCPTIMERS*/
     81  1.1  itojun #include <netinet/tcp_timer.h>
     82  1.1  itojun #include <netinet/tcp_var.h>
     83  1.1  itojun #include <netinet/tcp_debug.h>
     84  1.1  itojun #endif /*TCP6*/
     85  1.1  itojun #include <netinet6/udp6.h>
     86  1.1  itojun #include <netinet6/udp6_var.h>
     87  1.1  itojun #include <netinet6/pim6_var.h>
     88  1.1  itojun 
     89  1.1  itojun #include <arpa/inet.h>
     90  1.1  itojun #if 0
     91  1.1  itojun #include "gethostbyname2.h"
     92  1.1  itojun #endif
     93  1.1  itojun #include <netdb.h>
     94  1.1  itojun 
     95  1.1  itojun #include <stdio.h>
     96  1.1  itojun #include <string.h>
     97  1.1  itojun #include <unistd.h>
     98  1.1  itojun #include "netstat.h"
     99  1.1  itojun 
    100  1.1  itojun #ifdef INET6
    101  1.1  itojun 
    102  1.1  itojun struct	in6pcb in6pcb;
    103  1.1  itojun #ifdef TCP6
    104  1.1  itojun struct	tcp6cb tcp6cb;
    105  1.1  itojun #else
    106  1.1  itojun struct	tcpcb tcpcb;
    107  1.1  itojun #endif
    108  1.1  itojun struct	socket sockb;
    109  1.1  itojun 
    110  1.1  itojun char	*inet6name __P((struct in6_addr *));
    111  1.1  itojun void	inet6print __P((struct in6_addr *, int, char *));
    112  1.1  itojun 
    113  1.1  itojun static char ntop_buf[INET6_ADDRSTRLEN];
    114  1.1  itojun 
    115  1.1  itojun /*
    116  1.1  itojun  * Print a summary of connections related to an Internet
    117  1.1  itojun  * protocol.  For TCP, also give state of connection.
    118  1.1  itojun  * Listening processes (aflag) are suppressed unless the
    119  1.1  itojun  * -a (all) flag is specified.
    120  1.1  itojun  */
    121  1.1  itojun void
    122  1.1  itojun ip6protopr(off, name)
    123  1.1  itojun 	u_long off;
    124  1.1  itojun 	char *name;
    125  1.1  itojun {
    126  1.1  itojun 	struct in6pcb cb;
    127  1.1  itojun 	register struct in6pcb *prev, *next;
    128  1.1  itojun 	int istcp;
    129  1.1  itojun 	static int first = 1;
    130  1.1  itojun 
    131  1.1  itojun 	if (off == 0)
    132  1.1  itojun 		return;
    133  1.1  itojun 	istcp = strcmp(name, "tcp6") == 0;
    134  1.1  itojun 	kread(off, (char *)&cb, sizeof (struct in6pcb));
    135  1.1  itojun 	in6pcb = cb;
    136  1.1  itojun 	prev = (struct in6pcb *)off;
    137  1.1  itojun 	if (in6pcb.in6p_next == (struct in6pcb *)off)
    138  1.1  itojun 		return;
    139  1.1  itojun 	while (in6pcb.in6p_next != (struct in6pcb *)off) {
    140  1.1  itojun 		next = in6pcb.in6p_next;
    141  1.1  itojun 		kread((u_long)next, (char *)&in6pcb, sizeof (in6pcb));
    142  1.1  itojun 		if (in6pcb.in6p_prev != prev) {
    143  1.1  itojun 			printf("???\n");
    144  1.1  itojun 			break;
    145  1.1  itojun 		}
    146  1.1  itojun 		if (!aflag && IN6_IS_ADDR_ANY(&in6pcb.in6p_laddr)) {
    147  1.1  itojun 			prev = next;
    148  1.1  itojun 			continue;
    149  1.1  itojun 		}
    150  1.1  itojun 		kread((u_long)in6pcb.in6p_socket, (char *)&sockb, sizeof (sockb));
    151  1.1  itojun 		if (istcp) {
    152  1.1  itojun #ifdef TCP6
    153  1.1  itojun 			kread((u_long)in6pcb.in6p_ppcb,
    154  1.1  itojun 			    (char *)&tcp6cb, sizeof (tcp6cb));
    155  1.1  itojun #else
    156  1.1  itojun 			kread((u_long)in6pcb.in6p_ppcb,
    157  1.1  itojun 			    (char *)&tcpcb, sizeof (tcpcb));
    158  1.1  itojun #endif
    159  1.1  itojun 		}
    160  1.1  itojun 		if (first) {
    161  1.1  itojun 			printf("Active Internet6 connections");
    162  1.1  itojun 			if (aflag)
    163  1.1  itojun 				printf(" (including servers)");
    164  1.1  itojun 			putchar('\n');
    165  1.1  itojun 			if (Aflag)
    166  1.1  itojun 				printf("%-8.8s ", "PCB");
    167  1.1  itojun 			printf(Aflag ?
    168  1.1  itojun 				"%-5.5s %-6.6s %-6.6s  %-18.18s %-18.18s %s\n" :
    169  1.1  itojun 				"%-5.5s %-6.6s %-6.6s  %-22.22s %-22.22s %s\n",
    170  1.1  itojun 				"Proto", "Recv-Q", "Send-Q",
    171  1.1  itojun 				"Local Address", "Foreign Address", "(state)");
    172  1.1  itojun 			first = 0;
    173  1.1  itojun 		}
    174  1.1  itojun 		if (Aflag) {
    175  1.1  itojun 			if (istcp)
    176  1.1  itojun 				printf("%8p ", in6pcb.in6p_ppcb);
    177  1.1  itojun 			else
    178  1.1  itojun 				printf("%8p ", next);
    179  1.1  itojun 		}
    180  1.1  itojun 		printf("%-5.5s %6ld %6ld ", name, sockb.so_rcv.sb_cc,
    181  1.1  itojun 			sockb.so_snd.sb_cc);
    182  1.1  itojun 		/* xxx */
    183  1.1  itojun 		inet6print(&in6pcb.in6p_laddr, (int)in6pcb.in6p_lport, name);
    184  1.1  itojun 		inet6print(&in6pcb.in6p_faddr, (int)in6pcb.in6p_fport, name);
    185  1.1  itojun 		if (istcp) {
    186  1.1  itojun #ifdef TCP6
    187  1.1  itojun 			if (tcp6cb.t_state < 0 || tcp6cb.t_state >= TCP6_NSTATES)
    188  1.1  itojun 				printf(" %d", tcp6cb.t_state);
    189  1.1  itojun 			else
    190  1.1  itojun 				printf(" %s", tcp6states[tcp6cb.t_state]);
    191  1.1  itojun #else
    192  1.1  itojun 			if (tcpcb.t_state < 0 || tcpcb.t_state >= TCP_NSTATES)
    193  1.1  itojun 				printf(" %d", tcpcb.t_state);
    194  1.1  itojun 			else
    195  1.1  itojun 				printf(" %s", tcpstates[tcpcb.t_state]);
    196  1.1  itojun #endif
    197  1.1  itojun 		}
    198  1.1  itojun 		putchar('\n');
    199  1.1  itojun 		prev = next;
    200  1.1  itojun 	}
    201  1.1  itojun }
    202  1.1  itojun 
    203  1.1  itojun #ifdef TCP6
    204  1.1  itojun /*
    205  1.1  itojun  * Dump TCP6 statistics structure.
    206  1.1  itojun  */
    207  1.1  itojun void
    208  1.1  itojun tcp6_stats(off, name)
    209  1.1  itojun 	u_long off;
    210  1.1  itojun 	char *name;
    211  1.1  itojun {
    212  1.1  itojun 	struct tcp6stat tcp6stat;
    213  1.1  itojun 
    214  1.1  itojun 	if (off == 0)
    215  1.1  itojun 		return;
    216  1.1  itojun 	printf ("%s:\n", name);
    217  1.1  itojun 	kread(off, (char *)&tcp6stat, sizeof (tcp6stat));
    218  1.1  itojun 
    219  1.1  itojun #define	p(f, m) if (tcp6stat.f || sflag <= 1) \
    220  1.1  itojun     printf(m, tcp6stat.f, plural(tcp6stat.f))
    221  1.1  itojun #define	p2(f1, f2, m) if (tcp6stat.f1 || tcp6stat.f2 || sflag <= 1) \
    222  1.1  itojun     printf(m, tcp6stat.f1, plural(tcp6stat.f1), tcp6stat.f2, plural(tcp6stat.f2))
    223  1.1  itojun #define	p3(f, m) if (tcp6stat.f || sflag <= 1) \
    224  1.1  itojun     printf(m, tcp6stat.f, plurales(tcp6stat.f))
    225  1.1  itojun 
    226  1.1  itojun 	p(tcp6s_sndtotal, "\t%ld packet%s sent\n");
    227  1.1  itojun 	p2(tcp6s_sndpack,tcp6s_sndbyte,
    228  1.1  itojun 		"\t\t%ld data packet%s (%ld byte%s)\n");
    229  1.1  itojun 	p2(tcp6s_sndrexmitpack, tcp6s_sndrexmitbyte,
    230  1.1  itojun 		"\t\t%ld data packet%s (%ld byte%s) retransmitted\n");
    231  1.1  itojun 	p2(tcp6s_sndacks, tcp6s_delack,
    232  1.1  itojun 		"\t\t%ld ack-only packet%s (%ld packet%s delayed)\n");
    233  1.1  itojun 	p(tcp6s_sndurg, "\t\t%ld URG only packet%s\n");
    234  1.1  itojun 	p(tcp6s_sndprobe, "\t\t%ld window probe packet%s\n");
    235  1.1  itojun 	p(tcp6s_sndwinup, "\t\t%ld window update packet%s\n");
    236  1.1  itojun 	p(tcp6s_sndctrl, "\t\t%ld control packet%s\n");
    237  1.1  itojun 	p(tcp6s_rcvtotal, "\t%ld packet%s received\n");
    238  1.1  itojun 	p2(tcp6s_rcvackpack, tcp6s_rcvackbyte, "\t\t%ld ack%s (for %ld byte%s)\n");
    239  1.1  itojun 	p(tcp6s_rcvdupack, "\t\t%ld duplicate ack%s\n");
    240  1.1  itojun 	p(tcp6s_rcvacktoomuch, "\t\t%ld ack%s for unsent data\n");
    241  1.1  itojun 	p2(tcp6s_rcvpack, tcp6s_rcvbyte,
    242  1.1  itojun 		"\t\t%ld packet%s (%ld byte%s) received in-sequence\n");
    243  1.1  itojun 	p2(tcp6s_rcvduppack, tcp6s_rcvdupbyte,
    244  1.1  itojun 		"\t\t%ld completely duplicate packet%s (%ld byte%s)\n");
    245  1.1  itojun 	p(tcp6s_pawsdrop, "\t\t%ld old duplicate packet%s\n");
    246  1.1  itojun 	p2(tcp6s_rcvpartduppack, tcp6s_rcvpartdupbyte,
    247  1.1  itojun 		"\t\t%ld packet%s with some dup. data (%ld byte%s duped)\n");
    248  1.1  itojun 	p2(tcp6s_rcvoopack, tcp6s_rcvoobyte,
    249  1.1  itojun 		"\t\t%ld out-of-order packet%s (%ld byte%s)\n");
    250  1.1  itojun 	p2(tcp6s_rcvpackafterwin, tcp6s_rcvbyteafterwin,
    251  1.1  itojun 		"\t\t%ld packet%s (%ld byte%s) of data after window\n");
    252  1.1  itojun 	p(tcp6s_rcvwinprobe, "\t\t%ld window probe%s\n");
    253  1.1  itojun 	p(tcp6s_rcvwinupd, "\t\t%ld window update packet%s\n");
    254  1.1  itojun 	p(tcp6s_rcvafterclose, "\t\t%ld packet%s received after close\n");
    255  1.1  itojun 	p(tcp6s_rcvbadsum, "\t\t%ld discarded for bad checksum%s\n");
    256  1.1  itojun 	p(tcp6s_rcvbadoff, "\t\t%ld discarded for bad header offset field%s\n");
    257  1.1  itojun 	p(tcp6s_rcvshort, "\t\t%ld discarded because packet%s too short\n");
    258  1.1  itojun 	p(tcp6s_connattempt, "\t%ld connection request%s\n");
    259  1.1  itojun 	p(tcp6s_accepts, "\t%ld connection accept%s\n");
    260  1.1  itojun 	p(tcp6s_badsyn, "\t%ld bad connection attempt%s\n");
    261  1.1  itojun 	p(tcp6s_connects, "\t%ld connection%s established (including accepts)\n");
    262  1.1  itojun 	p2(tcp6s_closed, tcp6s_drops,
    263  1.1  itojun 		"\t%ld connection%s closed (including %ld drop%s)\n");
    264  1.1  itojun 	p(tcp6s_conndrops, "\t%ld embryonic connection%s dropped\n");
    265  1.1  itojun 	p2(tcp6s_rttupdated, tcp6s_segstimed,
    266  1.1  itojun 		"\t%ld segment%s updated rtt (of %ld attempt%s)\n");
    267  1.1  itojun 	p(tcp6s_rexmttimeo, "\t%ld retransmit timeout%s\n");
    268  1.1  itojun 	p(tcp6s_timeoutdrop, "\t\t%ld connection%s dropped by rexmit timeout\n");
    269  1.1  itojun 	p(tcp6s_persisttimeo, "\t%ld persist timeout%s\n");
    270  1.1  itojun 	p(tcp6s_persistdrop, "\t%ld connection%s timed out in persist\n");
    271  1.1  itojun 	p(tcp6s_keeptimeo, "\t%ld keepalive timeout%s\n");
    272  1.1  itojun 	p(tcp6s_keepprobe, "\t\t%ld keepalive probe%s sent\n");
    273  1.1  itojun 	p(tcp6s_keepdrops, "\t\t%ld connection%s dropped by keepalive\n");
    274  1.1  itojun 	p(tcp6s_predack, "\t%ld correct ACK header prediction%s\n");
    275  1.1  itojun 	p(tcp6s_preddat, "\t%ld correct data packet header prediction%s\n");
    276  1.1  itojun 	p3(tcp6s_pcbcachemiss, "\t%ld PCB cache miss%s\n");
    277  1.1  itojun #undef p
    278  1.1  itojun #undef p2
    279  1.1  itojun #undef p3
    280  1.1  itojun }
    281  1.1  itojun #endif
    282  1.1  itojun 
    283  1.1  itojun /*
    284  1.1  itojun  * Dump UDP6 statistics structure.
    285  1.1  itojun  */
    286  1.1  itojun void
    287  1.1  itojun udp6_stats(off, name)
    288  1.1  itojun 	u_long off;
    289  1.1  itojun 	char *name;
    290  1.1  itojun {
    291  1.1  itojun 	struct udp6stat udp6stat;
    292  1.4  bouyer 	u_quad_t delivered;
    293  1.1  itojun 
    294  1.1  itojun 	if (off == 0)
    295  1.1  itojun 		return;
    296  1.1  itojun 	kread(off, (char *)&udp6stat, sizeof (udp6stat));
    297  1.1  itojun 	printf("%s:\n", name);
    298  1.1  itojun #define	p(f, m) if (udp6stat.f || sflag <= 1) \
    299  1.4  bouyer     printf(m, (unsigned long long)udp6stat.f, plural(udp6stat.f))
    300  1.1  itojun #define	p1(f, m) if (udp6stat.f || sflag <= 1) \
    301  1.4  bouyer     printf(m, (unsigned long long)udp6stat.f)
    302  1.4  bouyer 	p(udp6s_ipackets, "\t%llu datagram%s received\n");
    303  1.4  bouyer 	p1(udp6s_hdrops, "\t%llu with incomplete header\n");
    304  1.4  bouyer 	p1(udp6s_badlen, "\t%llu with bad data length field\n");
    305  1.4  bouyer 	p1(udp6s_badsum, "\t%llu with bad checksum\n");
    306  1.4  bouyer 	p1(udp6s_nosum, "\t%llu with no checksum\n");
    307  1.4  bouyer 	p1(udp6s_noport, "\t%llu dropped due to no socket\n");
    308  1.4  bouyer 	p(udp6s_noportmcast, "\t%llu multicast datagram%s dropped due to no socket\n");
    309  1.4  bouyer 	p1(udp6s_fullsock, "\t%llu dropped due to full socket buffers\n");
    310  1.1  itojun 	delivered = udp6stat.udp6s_ipackets -
    311  1.1  itojun 		    udp6stat.udp6s_hdrops -
    312  1.1  itojun 		    udp6stat.udp6s_badlen -
    313  1.1  itojun 		    udp6stat.udp6s_badsum -
    314  1.1  itojun 		    udp6stat.udp6s_noport -
    315  1.1  itojun 		    udp6stat.udp6s_noportmcast -
    316  1.1  itojun 		    udp6stat.udp6s_fullsock;
    317  1.1  itojun 	if (delivered || sflag <= 1)
    318  1.4  bouyer 		printf("\t%llu delivered\n", (unsigned long long)delivered);
    319  1.4  bouyer 	p(udp6s_opackets, "\t%llu datagram%s output\n");
    320  1.1  itojun #undef p
    321  1.1  itojun #undef p1
    322  1.1  itojun }
    323  1.1  itojun 
    324  1.1  itojun static	char *ip6nh[] = {
    325  1.1  itojun 	"hop by hop",
    326  1.1  itojun 	"ICMP",
    327  1.1  itojun 	"IGMP",
    328  1.1  itojun 	"#3",
    329  1.1  itojun 	"IP",
    330  1.1  itojun 	"#5",
    331  1.1  itojun 	"TCP",
    332  1.1  itojun 	"#7",
    333  1.1  itojun 	"#8",
    334  1.1  itojun 	"#9",
    335  1.1  itojun 	"#10",
    336  1.1  itojun 	"#11",
    337  1.1  itojun 	"#12",
    338  1.1  itojun 	"#13",
    339  1.1  itojun 	"#14",
    340  1.1  itojun 	"#15",
    341  1.1  itojun 	"#16",
    342  1.1  itojun 	"UDP",
    343  1.1  itojun 	"#18",
    344  1.1  itojun 	"#19",
    345  1.1  itojun 	"#20",
    346  1.1  itojun 	"#21",
    347  1.1  itojun 	"IDP",
    348  1.1  itojun 	"#23",
    349  1.1  itojun 	"#24",
    350  1.1  itojun 	"#25",
    351  1.1  itojun 	"#26",
    352  1.1  itojun 	"#27",
    353  1.1  itojun 	"#28",
    354  1.1  itojun 	"TP",
    355  1.1  itojun 	"#30",
    356  1.1  itojun 	"#31",
    357  1.1  itojun 	"#32",
    358  1.1  itojun 	"#33",
    359  1.1  itojun 	"#34",
    360  1.1  itojun 	"#35",
    361  1.1  itojun 	"#36",
    362  1.1  itojun 	"#37",
    363  1.1  itojun 	"#38",
    364  1.1  itojun 	"#39",
    365  1.1  itojun 	"#40",
    366  1.1  itojun 	"IP6",
    367  1.1  itojun 	"#42",
    368  1.1  itojun 	"routing",
    369  1.1  itojun 	"fragment",
    370  1.1  itojun 	"#45",
    371  1.1  itojun 	"#46",
    372  1.1  itojun 	"#47",
    373  1.1  itojun 	"#48",
    374  1.1  itojun 	"#49",
    375  1.1  itojun 	"ESP",
    376  1.1  itojun 	"AH",
    377  1.1  itojun 	"#52",
    378  1.1  itojun 	"#53",
    379  1.1  itojun 	"#54",
    380  1.1  itojun 	"#55",
    381  1.1  itojun 	"#56",
    382  1.1  itojun 	"#57",
    383  1.1  itojun 	"ICMP6",
    384  1.1  itojun 	"no next header",
    385  1.1  itojun 	"destination option",
    386  1.1  itojun 	"#61",
    387  1.1  itojun 	"#62",
    388  1.1  itojun 	"#63",
    389  1.1  itojun 	"#64",
    390  1.1  itojun 	"#65",
    391  1.1  itojun 	"#66",
    392  1.1  itojun 	"#67",
    393  1.1  itojun 	"#68",
    394  1.1  itojun 	"#69",
    395  1.1  itojun 	"#70",
    396  1.1  itojun 	"#71",
    397  1.1  itojun 	"#72",
    398  1.1  itojun 	"#73",
    399  1.1  itojun 	"#74",
    400  1.1  itojun 	"#75",
    401  1.1  itojun 	"#76",
    402  1.1  itojun 	"#77",
    403  1.1  itojun 	"#78",
    404  1.1  itojun 	"#79",
    405  1.1  itojun 	"ISOIP",
    406  1.1  itojun 	"#81",
    407  1.1  itojun 	"#82",
    408  1.1  itojun 	"#83",
    409  1.1  itojun 	"#84",
    410  1.1  itojun 	"#85",
    411  1.1  itojun 	"#86",
    412  1.1  itojun 	"#87",
    413  1.1  itojun 	"#88",
    414  1.1  itojun 	"#89",
    415  1.1  itojun 	"#80",
    416  1.1  itojun 	"#91",
    417  1.1  itojun 	"#92",
    418  1.1  itojun 	"#93",
    419  1.1  itojun 	"#94",
    420  1.1  itojun 	"#95",
    421  1.1  itojun 	"#96",
    422  1.1  itojun 	"Ethernet",
    423  1.1  itojun 	"#98",
    424  1.1  itojun 	"#99",
    425  1.1  itojun 	"#100",
    426  1.1  itojun 	"#101",
    427  1.1  itojun 	"#102",
    428  1.1  itojun 	"PIM",
    429  1.1  itojun 	"#104",
    430  1.1  itojun 	"#105",
    431  1.1  itojun 	"#106",
    432  1.1  itojun 	"#107",
    433  1.1  itojun 	"#108",
    434  1.1  itojun 	"#109",
    435  1.1  itojun 	"#110",
    436  1.1  itojun 	"#111",
    437  1.1  itojun 	"#112",
    438  1.1  itojun 	"#113",
    439  1.1  itojun 	"#114",
    440  1.1  itojun 	"#115",
    441  1.1  itojun 	"#116",
    442  1.1  itojun 	"#117",
    443  1.1  itojun 	"#118",
    444  1.1  itojun 	"#119",
    445  1.1  itojun 	"#120",
    446  1.1  itojun 	"#121",
    447  1.1  itojun 	"#122",
    448  1.1  itojun 	"#123",
    449  1.1  itojun 	"#124",
    450  1.1  itojun 	"#125",
    451  1.1  itojun 	"#126",
    452  1.1  itojun 	"#127",
    453  1.1  itojun 	"#128",
    454  1.1  itojun 	"#129",
    455  1.1  itojun 	"#130",
    456  1.1  itojun 	"#131",
    457  1.1  itojun 	"#132",
    458  1.1  itojun 	"#133",
    459  1.1  itojun 	"#134",
    460  1.1  itojun 	"#135",
    461  1.1  itojun 	"#136",
    462  1.1  itojun 	"#137",
    463  1.1  itojun 	"#138",
    464  1.1  itojun 	"#139",
    465  1.1  itojun 	"#140",
    466  1.1  itojun 	"#141",
    467  1.1  itojun 	"#142",
    468  1.1  itojun 	"#143",
    469  1.1  itojun 	"#144",
    470  1.1  itojun 	"#145",
    471  1.1  itojun 	"#146",
    472  1.1  itojun 	"#147",
    473  1.1  itojun 	"#148",
    474  1.1  itojun 	"#149",
    475  1.1  itojun 	"#150",
    476  1.1  itojun 	"#151",
    477  1.1  itojun 	"#152",
    478  1.1  itojun 	"#153",
    479  1.1  itojun 	"#154",
    480  1.1  itojun 	"#155",
    481  1.1  itojun 	"#156",
    482  1.1  itojun 	"#157",
    483  1.1  itojun 	"#158",
    484  1.1  itojun 	"#159",
    485  1.1  itojun 	"#160",
    486  1.1  itojun 	"#161",
    487  1.1  itojun 	"#162",
    488  1.1  itojun 	"#163",
    489  1.1  itojun 	"#164",
    490  1.1  itojun 	"#165",
    491  1.1  itojun 	"#166",
    492  1.1  itojun 	"#167",
    493  1.1  itojun 	"#168",
    494  1.1  itojun 	"#169",
    495  1.1  itojun 	"#170",
    496  1.1  itojun 	"#171",
    497  1.1  itojun 	"#172",
    498  1.1  itojun 	"#173",
    499  1.1  itojun 	"#174",
    500  1.1  itojun 	"#175",
    501  1.1  itojun 	"#176",
    502  1.1  itojun 	"#177",
    503  1.1  itojun 	"#178",
    504  1.1  itojun 	"#179",
    505  1.1  itojun 	"#180",
    506  1.1  itojun 	"#181",
    507  1.1  itojun 	"#182",
    508  1.1  itojun 	"#183",
    509  1.1  itojun 	"#184",
    510  1.1  itojun 	"#185",
    511  1.1  itojun 	"#186",
    512  1.1  itojun 	"#187",
    513  1.1  itojun 	"#188",
    514  1.1  itojun 	"#189",
    515  1.1  itojun 	"#180",
    516  1.1  itojun 	"#191",
    517  1.1  itojun 	"#192",
    518  1.1  itojun 	"#193",
    519  1.1  itojun 	"#194",
    520  1.1  itojun 	"#195",
    521  1.1  itojun 	"#196",
    522  1.1  itojun 	"#197",
    523  1.1  itojun 	"#198",
    524  1.1  itojun 	"#199",
    525  1.1  itojun 	"#200",
    526  1.1  itojun 	"#201",
    527  1.1  itojun 	"#202",
    528  1.1  itojun 	"#203",
    529  1.1  itojun 	"#204",
    530  1.1  itojun 	"#205",
    531  1.1  itojun 	"#206",
    532  1.1  itojun 	"#207",
    533  1.1  itojun 	"#208",
    534  1.1  itojun 	"#209",
    535  1.1  itojun 	"#210",
    536  1.1  itojun 	"#211",
    537  1.1  itojun 	"#212",
    538  1.1  itojun 	"#213",
    539  1.1  itojun 	"#214",
    540  1.1  itojun 	"#215",
    541  1.1  itojun 	"#216",
    542  1.1  itojun 	"#217",
    543  1.1  itojun 	"#218",
    544  1.1  itojun 	"#219",
    545  1.1  itojun 	"#220",
    546  1.1  itojun 	"#221",
    547  1.1  itojun 	"#222",
    548  1.1  itojun 	"#223",
    549  1.1  itojun 	"#224",
    550  1.1  itojun 	"#225",
    551  1.1  itojun 	"#226",
    552  1.1  itojun 	"#227",
    553  1.1  itojun 	"#228",
    554  1.1  itojun 	"#229",
    555  1.1  itojun 	"#230",
    556  1.1  itojun 	"#231",
    557  1.1  itojun 	"#232",
    558  1.1  itojun 	"#233",
    559  1.1  itojun 	"#234",
    560  1.1  itojun 	"#235",
    561  1.1  itojun 	"#236",
    562  1.1  itojun 	"#237",
    563  1.1  itojun 	"#238",
    564  1.1  itojun 	"#239",
    565  1.1  itojun 	"#240",
    566  1.1  itojun 	"#241",
    567  1.1  itojun 	"#242",
    568  1.1  itojun 	"#243",
    569  1.1  itojun 	"#244",
    570  1.1  itojun 	"#245",
    571  1.1  itojun 	"#246",
    572  1.1  itojun 	"#247",
    573  1.1  itojun 	"#248",
    574  1.1  itojun 	"#249",
    575  1.1  itojun 	"#250",
    576  1.1  itojun 	"#251",
    577  1.1  itojun 	"#252",
    578  1.1  itojun 	"#253",
    579  1.1  itojun 	"#254",
    580  1.1  itojun 	"#255",
    581  1.1  itojun };
    582  1.1  itojun 
    583  1.1  itojun /*
    584  1.1  itojun  * Dump IP6 statistics structure.
    585  1.1  itojun  */
    586  1.1  itojun void
    587  1.1  itojun ip6_stats(off, name)
    588  1.1  itojun 	u_long off;
    589  1.1  itojun 	char *name;
    590  1.1  itojun {
    591  1.1  itojun 	struct ip6stat ip6stat;
    592  1.1  itojun 	int first, i;
    593  1.1  itojun 
    594  1.1  itojun 	if (off == 0)
    595  1.1  itojun 		return;
    596  1.1  itojun 
    597  1.1  itojun 	kread(off, (char *)&ip6stat, sizeof (ip6stat));
    598  1.1  itojun 	printf("%s:\n", name);
    599  1.1  itojun 
    600  1.1  itojun #define	p(f, m) if (ip6stat.f || sflag <= 1) \
    601  1.4  bouyer     printf(m, (unsigned long long)ip6stat.f, plural(ip6stat.f))
    602  1.1  itojun #define	p1(f, m) if (ip6stat.f || sflag <= 1) \
    603  1.4  bouyer     printf(m, (unsigned long long)ip6stat.f)
    604  1.1  itojun 
    605  1.4  bouyer 	p(ip6s_total, "\t%llu total packet%s received\n");
    606  1.4  bouyer 	p1(ip6s_toosmall, "\t%llu with size smaller than minimum\n");
    607  1.4  bouyer 	p1(ip6s_tooshort, "\t%llu with data size < data length\n");
    608  1.4  bouyer 	p1(ip6s_badoptions, "\t%llu with bad options\n");
    609  1.4  bouyer 	p1(ip6s_badvers, "\t%llu with incorrect version number\n");
    610  1.4  bouyer 	p(ip6s_fragments, "\t%llu fragment%s received\n");
    611  1.4  bouyer 	p(ip6s_fragdropped,
    612  1.4  bouyer 		"\t%llu fragment%s dropped (dup or out of space)\n");
    613  1.4  bouyer 	p(ip6s_fragtimeout, "\t%llu fragment%s dropped after timeout\n");
    614  1.4  bouyer 	p(ip6s_fragoverflow, "\t%llu fragment%s that exceeded limit\n");
    615  1.4  bouyer 	p(ip6s_reassembled, "\t%llu packet%s reassembled ok\n");
    616  1.4  bouyer 	p(ip6s_delivered, "\t%llu packet%s for this host\n");
    617  1.4  bouyer 	p(ip6s_forward, "\t%llu packet%s forwarded\n");
    618  1.4  bouyer 	p(ip6s_cantforward, "\t%llu packet%s not forwardable\n");
    619  1.4  bouyer 	p(ip6s_redirectsent, "\t%llu redirect%s sent\n");
    620  1.4  bouyer 	p(ip6s_localout, "\t%llu packet%s sent from this host\n");
    621  1.4  bouyer 	p(ip6s_rawout, "\t%llu packet%s sent with fabricated ip header\n");
    622  1.4  bouyer 	p(ip6s_odropped,
    623  1.4  bouyer 		"\t%llu output packet%s dropped due to no bufs, etc.\n");
    624  1.4  bouyer 	p(ip6s_noroute, "\t%llu output packet%s discarded due to no route\n");
    625  1.4  bouyer 	p(ip6s_fragmented, "\t%llu output datagram%s fragmented\n");
    626  1.4  bouyer 	p(ip6s_ofragments, "\t%llu fragment%s created\n");
    627  1.4  bouyer 	p(ip6s_cantfrag, "\t%llu datagram%s that can't be fragmented\n");
    628  1.4  bouyer 	p(ip6s_badscope, "\t%llu packet%s that violated scope rules\n");
    629  1.4  bouyer 	p(ip6s_notmember, "\t%llu multicast packet%s which we don't join\n");
    630  1.1  itojun 	for (first = 1, i = 0; i < 256; i++)
    631  1.1  itojun 		if (ip6stat.ip6s_nxthist[i] != 0) {
    632  1.1  itojun 			if (first) {
    633  1.1  itojun 				printf("\tInput histogram:\n");
    634  1.1  itojun 				first = 0;
    635  1.1  itojun 			}
    636  1.4  bouyer 			printf("\t\t%s: %llu\n", ip6nh[i],
    637  1.4  bouyer 			       (unsigned long long)ip6stat.ip6s_nxthist[i]);
    638  1.1  itojun 		}
    639  1.1  itojun 	printf("\tMbuf statics:\n");
    640  1.4  bouyer 	printf("\t\t%llu one mbuf\n", (unsigned long long)ip6stat.ip6s_m1);
    641  1.1  itojun 	for (first = 1, i = 0; i < 32; i++) {
    642  1.1  itojun 		char ifbuf[IFNAMSIZ];
    643  1.1  itojun 		if (ip6stat.ip6s_m2m[i] != 0) {
    644  1.1  itojun 			if (first) {
    645  1.1  itojun 				printf("\t\ttwo or more mbuf:\n");
    646  1.1  itojun 				first = 0;
    647  1.1  itojun 			}
    648  1.4  bouyer 			printf("\t\t\t%s = %llu\n",
    649  1.1  itojun 			       if_indextoname(i, ifbuf),
    650  1.4  bouyer 			       (unsigned long long)ip6stat.ip6s_m2m[i]);
    651  1.1  itojun 		}
    652  1.1  itojun 	}
    653  1.4  bouyer 	printf("\t\t%llu one ext mbuf\n",
    654  1.4  bouyer 	        (unsigned long long)ip6stat.ip6s_mext1);
    655  1.4  bouyer 	printf("\t\t%llu two or more ext mbuf\n",
    656  1.4  bouyer 		(unsigned long long)ip6stat.ip6s_mext2m);
    657  1.4  bouyer 	p(ip6s_exthdrtoolong,
    658  1.4  bouyer 		"\t%llu packet%s whose headers are not continuous\n");
    659  1.4  bouyer 	p(ip6s_nogif, "\t%llu tunneling packet%s that can't find gif\n");
    660  1.1  itojun #undef p
    661  1.1  itojun #undef p1
    662  1.1  itojun }
    663  1.1  itojun 
    664  1.1  itojun static	char *icmp6names[] = {
    665  1.1  itojun 	"#0",
    666  1.1  itojun 	"unreach",
    667  1.1  itojun 	"packet too big",
    668  1.1  itojun 	"time exceed",
    669  1.1  itojun 	"parameter problem",
    670  1.1  itojun 	"#5",
    671  1.1  itojun 	"#6",
    672  1.1  itojun 	"#7",
    673  1.1  itojun 	"#8",
    674  1.1  itojun 	"#9",
    675  1.1  itojun 	"#10",
    676  1.1  itojun 	"#11",
    677  1.1  itojun 	"#12",
    678  1.1  itojun 	"#13",
    679  1.1  itojun 	"#14",
    680  1.1  itojun 	"#15",
    681  1.1  itojun 	"#16",
    682  1.1  itojun 	"#17",
    683  1.1  itojun 	"#18",
    684  1.1  itojun 	"#19",
    685  1.1  itojun 	"#20",
    686  1.1  itojun 	"#21",
    687  1.1  itojun 	"#22",
    688  1.1  itojun 	"#23",
    689  1.1  itojun 	"#24",
    690  1.1  itojun 	"#25",
    691  1.1  itojun 	"#26",
    692  1.1  itojun 	"#27",
    693  1.1  itojun 	"#28",
    694  1.1  itojun 	"#29",
    695  1.1  itojun 	"#30",
    696  1.1  itojun 	"#31",
    697  1.1  itojun 	"#32",
    698  1.1  itojun 	"#33",
    699  1.1  itojun 	"#34",
    700  1.1  itojun 	"#35",
    701  1.1  itojun 	"#36",
    702  1.1  itojun 	"#37",
    703  1.1  itojun 	"#38",
    704  1.1  itojun 	"#39",
    705  1.1  itojun 	"#40",
    706  1.1  itojun 	"#41",
    707  1.1  itojun 	"#42",
    708  1.1  itojun 	"#43",
    709  1.1  itojun 	"#44",
    710  1.1  itojun 	"#45",
    711  1.1  itojun 	"#46",
    712  1.1  itojun 	"#47",
    713  1.1  itojun 	"#48",
    714  1.1  itojun 	"#49",
    715  1.1  itojun 	"#50",
    716  1.1  itojun 	"#51",
    717  1.1  itojun 	"#52",
    718  1.1  itojun 	"#53",
    719  1.1  itojun 	"#54",
    720  1.1  itojun 	"#55",
    721  1.1  itojun 	"#56",
    722  1.1  itojun 	"#57",
    723  1.1  itojun 	"#58",
    724  1.1  itojun 	"#59",
    725  1.1  itojun 	"#60",
    726  1.1  itojun 	"#61",
    727  1.1  itojun 	"#62",
    728  1.1  itojun 	"#63",
    729  1.1  itojun 	"#64",
    730  1.1  itojun 	"#65",
    731  1.1  itojun 	"#66",
    732  1.1  itojun 	"#67",
    733  1.1  itojun 	"#68",
    734  1.1  itojun 	"#69",
    735  1.1  itojun 	"#70",
    736  1.1  itojun 	"#71",
    737  1.1  itojun 	"#72",
    738  1.1  itojun 	"#73",
    739  1.1  itojun 	"#74",
    740  1.1  itojun 	"#75",
    741  1.1  itojun 	"#76",
    742  1.1  itojun 	"#77",
    743  1.1  itojun 	"#78",
    744  1.1  itojun 	"#79",
    745  1.1  itojun 	"#80",
    746  1.1  itojun 	"#81",
    747  1.1  itojun 	"#82",
    748  1.1  itojun 	"#83",
    749  1.1  itojun 	"#84",
    750  1.1  itojun 	"#85",
    751  1.1  itojun 	"#86",
    752  1.1  itojun 	"#87",
    753  1.1  itojun 	"#88",
    754  1.1  itojun 	"#89",
    755  1.1  itojun 	"#80",
    756  1.1  itojun 	"#91",
    757  1.1  itojun 	"#92",
    758  1.1  itojun 	"#93",
    759  1.1  itojun 	"#94",
    760  1.1  itojun 	"#95",
    761  1.1  itojun 	"#96",
    762  1.1  itojun 	"#97",
    763  1.1  itojun 	"#98",
    764  1.1  itojun 	"#99",
    765  1.1  itojun 	"#100",
    766  1.1  itojun 	"#101",
    767  1.1  itojun 	"#102",
    768  1.1  itojun 	"#103",
    769  1.1  itojun 	"#104",
    770  1.1  itojun 	"#105",
    771  1.1  itojun 	"#106",
    772  1.1  itojun 	"#107",
    773  1.1  itojun 	"#108",
    774  1.1  itojun 	"#109",
    775  1.1  itojun 	"#110",
    776  1.1  itojun 	"#111",
    777  1.1  itojun 	"#112",
    778  1.1  itojun 	"#113",
    779  1.1  itojun 	"#114",
    780  1.1  itojun 	"#115",
    781  1.1  itojun 	"#116",
    782  1.1  itojun 	"#117",
    783  1.1  itojun 	"#118",
    784  1.1  itojun 	"#119",
    785  1.1  itojun 	"#120",
    786  1.1  itojun 	"#121",
    787  1.1  itojun 	"#122",
    788  1.1  itojun 	"#123",
    789  1.1  itojun 	"#124",
    790  1.1  itojun 	"#125",
    791  1.1  itojun 	"#126",
    792  1.1  itojun 	"#127",
    793  1.1  itojun 	"echo",
    794  1.1  itojun 	"echo reply",
    795  1.1  itojun 	"group member query",
    796  1.1  itojun 	"group member report",
    797  1.1  itojun 	"group member termination",
    798  1.1  itojun 	"router solicitation",
    799  1.1  itojun 	"router advertisment",
    800  1.1  itojun 	"neighbor solicitation",
    801  1.1  itojun 	"neighbor advertisment",
    802  1.1  itojun 	"redirect",
    803  1.1  itojun 	"router renumbering",
    804  1.1  itojun 	"node information request",
    805  1.1  itojun 	"node information reply",
    806  1.1  itojun 	"#141",
    807  1.1  itojun 	"#142",
    808  1.1  itojun 	"#143",
    809  1.1  itojun 	"#144",
    810  1.1  itojun 	"#145",
    811  1.1  itojun 	"#146",
    812  1.1  itojun 	"#147",
    813  1.1  itojun 	"#148",
    814  1.1  itojun 	"#149",
    815  1.1  itojun 	"#150",
    816  1.1  itojun 	"#151",
    817  1.1  itojun 	"#152",
    818  1.1  itojun 	"#153",
    819  1.1  itojun 	"#154",
    820  1.1  itojun 	"#155",
    821  1.1  itojun 	"#156",
    822  1.1  itojun 	"#157",
    823  1.1  itojun 	"#158",
    824  1.1  itojun 	"#159",
    825  1.1  itojun 	"#160",
    826  1.1  itojun 	"#161",
    827  1.1  itojun 	"#162",
    828  1.1  itojun 	"#163",
    829  1.1  itojun 	"#164",
    830  1.1  itojun 	"#165",
    831  1.1  itojun 	"#166",
    832  1.1  itojun 	"#167",
    833  1.1  itojun 	"#168",
    834  1.1  itojun 	"#169",
    835  1.1  itojun 	"#170",
    836  1.1  itojun 	"#171",
    837  1.1  itojun 	"#172",
    838  1.1  itojun 	"#173",
    839  1.1  itojun 	"#174",
    840  1.1  itojun 	"#175",
    841  1.1  itojun 	"#176",
    842  1.1  itojun 	"#177",
    843  1.1  itojun 	"#178",
    844  1.1  itojun 	"#179",
    845  1.1  itojun 	"#180",
    846  1.1  itojun 	"#181",
    847  1.1  itojun 	"#182",
    848  1.1  itojun 	"#183",
    849  1.1  itojun 	"#184",
    850  1.1  itojun 	"#185",
    851  1.1  itojun 	"#186",
    852  1.1  itojun 	"#187",
    853  1.1  itojun 	"#188",
    854  1.1  itojun 	"#189",
    855  1.1  itojun 	"#180",
    856  1.1  itojun 	"#191",
    857  1.1  itojun 	"#192",
    858  1.1  itojun 	"#193",
    859  1.1  itojun 	"#194",
    860  1.1  itojun 	"#195",
    861  1.1  itojun 	"#196",
    862  1.1  itojun 	"#197",
    863  1.1  itojun 	"#198",
    864  1.1  itojun 	"#199",
    865  1.1  itojun 	"#200",
    866  1.1  itojun 	"#201",
    867  1.1  itojun 	"#202",
    868  1.1  itojun 	"#203",
    869  1.1  itojun 	"#204",
    870  1.1  itojun 	"#205",
    871  1.1  itojun 	"#206",
    872  1.1  itojun 	"#207",
    873  1.1  itojun 	"#208",
    874  1.1  itojun 	"#209",
    875  1.1  itojun 	"#210",
    876  1.1  itojun 	"#211",
    877  1.1  itojun 	"#212",
    878  1.1  itojun 	"#213",
    879  1.1  itojun 	"#214",
    880  1.1  itojun 	"#215",
    881  1.1  itojun 	"#216",
    882  1.1  itojun 	"#217",
    883  1.1  itojun 	"#218",
    884  1.1  itojun 	"#219",
    885  1.1  itojun 	"#220",
    886  1.1  itojun 	"#221",
    887  1.1  itojun 	"#222",
    888  1.1  itojun 	"#223",
    889  1.1  itojun 	"#224",
    890  1.1  itojun 	"#225",
    891  1.1  itojun 	"#226",
    892  1.1  itojun 	"#227",
    893  1.1  itojun 	"#228",
    894  1.1  itojun 	"#229",
    895  1.1  itojun 	"#230",
    896  1.1  itojun 	"#231",
    897  1.1  itojun 	"#232",
    898  1.1  itojun 	"#233",
    899  1.1  itojun 	"#234",
    900  1.1  itojun 	"#235",
    901  1.1  itojun 	"#236",
    902  1.1  itojun 	"#237",
    903  1.1  itojun 	"#238",
    904  1.1  itojun 	"#239",
    905  1.1  itojun 	"#240",
    906  1.1  itojun 	"#241",
    907  1.1  itojun 	"#242",
    908  1.1  itojun 	"#243",
    909  1.1  itojun 	"#244",
    910  1.1  itojun 	"#245",
    911  1.1  itojun 	"#246",
    912  1.1  itojun 	"#247",
    913  1.1  itojun 	"#248",
    914  1.1  itojun 	"#249",
    915  1.1  itojun 	"#250",
    916  1.1  itojun 	"#251",
    917  1.1  itojun 	"#252",
    918  1.1  itojun 	"#253",
    919  1.1  itojun 	"#254",
    920  1.1  itojun 	"#255",
    921  1.1  itojun };
    922  1.1  itojun 
    923  1.1  itojun /*
    924  1.1  itojun  * Dump ICMP6 statistics.
    925  1.1  itojun  */
    926  1.1  itojun void
    927  1.1  itojun icmp6_stats(off, name)
    928  1.1  itojun 	u_long off;
    929  1.1  itojun 	char *name;
    930  1.1  itojun {
    931  1.1  itojun 	struct icmp6stat icmp6stat;
    932  1.1  itojun 	register int i, first;
    933  1.1  itojun 
    934  1.1  itojun 	if (off == 0)
    935  1.1  itojun 		return;
    936  1.1  itojun 	kread(off, (char *)&icmp6stat, sizeof (icmp6stat));
    937  1.1  itojun 	printf("%s:\n", name);
    938  1.1  itojun 
    939  1.1  itojun #define	p(f, m) if (icmp6stat.f || sflag <= 1) \
    940  1.4  bouyer     printf(m, (unsigned long long)icmp6stat.f, plural(icmp6stat.f))
    941  1.1  itojun 
    942  1.4  bouyer 	p(icp6s_error, "\t%llu call%s to icmp_error\n");
    943  1.4  bouyer 	p(icp6s_canterror, "\t%llu error%s not generated because old message "
    944  1.4  bouyer 		"was icmp or so\n");
    945  1.1  itojun 	for (first = 1, i = 0; i < 256; i++)
    946  1.1  itojun 		if (icmp6stat.icp6s_outhist[i] != 0) {
    947  1.1  itojun 			if (first) {
    948  1.1  itojun 				printf("\tOutput histogram:\n");
    949  1.1  itojun 				first = 0;
    950  1.1  itojun 			}
    951  1.4  bouyer 			printf("\t\t%s: %llu\n", icmp6names[i],
    952  1.4  bouyer 				(unsigned long long)icmp6stat.icp6s_outhist[i]);
    953  1.1  itojun 		}
    954  1.4  bouyer 	p(icp6s_badcode, "\t%llu message%s with bad code fields\n");
    955  1.4  bouyer 	p(icp6s_tooshort, "\t%llu message%s < minimum length\n");
    956  1.4  bouyer 	p(icp6s_checksum, "\t%llu bad checksum%s\n");
    957  1.4  bouyer 	p(icp6s_badlen, "\t%llu message%s with bad length\n");
    958  1.1  itojun 	for (first = 1, i = 0; i < ICMP6_MAXTYPE; i++)
    959  1.1  itojun 		if (icmp6stat.icp6s_inhist[i] != 0) {
    960  1.1  itojun 			if (first) {
    961  1.1  itojun 				printf("\tInput histogram:\n");
    962  1.1  itojun 				first = 0;
    963  1.1  itojun 			}
    964  1.4  bouyer 			printf("\t\t%s: %llu\n", icmp6names[i],
    965  1.4  bouyer 				(unsigned long long)icmp6stat.icp6s_inhist[i]);
    966  1.1  itojun 		}
    967  1.4  bouyer 	p(icp6s_reflect, "\t%llu message response%s generated\n");
    968  1.1  itojun #undef p
    969  1.1  itojun }
    970  1.1  itojun 
    971  1.1  itojun /*
    972  1.1  itojun  * Dump PIM statistics structure.
    973  1.1  itojun  */
    974  1.1  itojun void
    975  1.1  itojun pim6_stats(off, name)
    976  1.1  itojun 	u_long off;
    977  1.1  itojun 	char *name;
    978  1.1  itojun {
    979  1.1  itojun 	struct pim6stat pim6stat;
    980  1.1  itojun 
    981  1.1  itojun 	if (off == 0)
    982  1.1  itojun 		return;
    983  1.1  itojun 	kread(off, (char *)&pim6stat, sizeof(pim6stat));
    984  1.1  itojun 	printf("%s:\n", name);
    985  1.1  itojun 
    986  1.1  itojun #define	p(f, m) if (pim6stat.f || sflag <= 1) \
    987  1.4  bouyer     printf(m, (unsigned long long)pim6stat.f, plural(pim6stat.f))
    988  1.4  bouyer 	p(pim6s_rcv_total, "\t%llu message%s received\n");
    989  1.4  bouyer 	p(pim6s_rcv_tooshort, "\t%llu message%s received with too few bytes\n");
    990  1.4  bouyer 	p(pim6s_rcv_badsum, "\t%llu message%s received with bad checksum\n");
    991  1.4  bouyer 	p(pim6s_rcv_badversion, "\t%llu message%s received with bad version\n");
    992  1.4  bouyer 	p(pim6s_rcv_registers, "\t%llu register%s received\n");
    993  1.4  bouyer 	p(pim6s_rcv_badregisters, "\t%llu bad register%s received\n");
    994  1.4  bouyer 	p(pim6s_snd_registers, "\t%llu register%s sent\n");
    995  1.1  itojun #undef p
    996  1.1  itojun }
    997  1.1  itojun 
    998  1.1  itojun /*
    999  1.1  itojun  * Pretty print an Internet address (net address + port).
   1000  1.1  itojun  * If the nflag was specified, use numbers instead of names.
   1001  1.1  itojun  */
   1002  1.1  itojun 
   1003  1.1  itojun void
   1004  1.1  itojun inet6print(in6, port, proto)
   1005  1.1  itojun 	register struct in6_addr *in6;
   1006  1.1  itojun 	int port;
   1007  1.1  itojun 	char *proto;
   1008  1.1  itojun {
   1009  1.1  itojun #define GETSERVBYPORT6(port, proto, ret)\
   1010  1.1  itojun {\
   1011  1.1  itojun 	if (strcmp((proto), "tcp6") == 0)\
   1012  1.1  itojun 		(ret) = getservbyport((int)(port), "tcp");\
   1013  1.1  itojun 	else if (strcmp((proto), "udp6") == 0)\
   1014  1.1  itojun 		(ret) = getservbyport((int)(port), "udp");\
   1015  1.1  itojun 	else\
   1016  1.1  itojun 		(ret) = getservbyport((int)(port), (proto));\
   1017  1.1  itojun };
   1018  1.1  itojun 	struct servent *sp = 0;
   1019  1.1  itojun 	char line[80], *cp;
   1020  1.1  itojun 	int width;
   1021  1.1  itojun 
   1022  1.1  itojun 	sprintf(line, "%.*s.", (Aflag && !nflag) ? 12 : 16, inet6name(in6));
   1023  1.1  itojun 	cp = index(line, '\0');
   1024  1.1  itojun 	if (!nflag && port)
   1025  1.1  itojun 		GETSERVBYPORT6(port, proto, sp);
   1026  1.1  itojun 	if (sp || port == 0)
   1027  1.1  itojun 		sprintf(cp, "%.8s", sp ? sp->s_name : "*");
   1028  1.1  itojun 	else
   1029  1.1  itojun 		sprintf(cp, "%d", ntohs((u_short)port));
   1030  1.1  itojun 	width = Aflag ? 18 : 22;
   1031  1.1  itojun 	printf(" %-*.*s", width, width, line);
   1032  1.1  itojun }
   1033  1.1  itojun 
   1034  1.1  itojun /*
   1035  1.1  itojun  * Construct an Internet address representation.
   1036  1.1  itojun  * If the nflag has been supplied, give
   1037  1.1  itojun  * numeric value, otherwise try for symbolic name.
   1038  1.1  itojun  */
   1039  1.1  itojun 
   1040  1.1  itojun char *
   1041  1.1  itojun inet6name(in6p)
   1042  1.1  itojun 	struct in6_addr *in6p;
   1043  1.1  itojun {
   1044  1.1  itojun 	register char *cp;
   1045  1.1  itojun 	static char line[50];
   1046  1.1  itojun 	struct hostent *hp;
   1047  1.1  itojun 	static char domain[MAXHOSTNAMELEN + 1];
   1048  1.1  itojun 	static int first = 1;
   1049  1.1  itojun 
   1050  1.1  itojun 	if (first && !nflag) {
   1051  1.1  itojun 		first = 0;
   1052  1.1  itojun 		if (gethostname(domain, MAXHOSTNAMELEN) == 0 &&
   1053  1.1  itojun 		    (cp = index(domain, '.')))
   1054  1.1  itojun 			(void) strcpy(domain, cp + 1);
   1055  1.1  itojun 		else
   1056  1.1  itojun 			domain[0] = 0;
   1057  1.1  itojun 	}
   1058  1.1  itojun 	cp = 0;
   1059  1.1  itojun 	if (!nflag && !IN6_IS_ADDR_UNSPECIFIED(in6p)) {
   1060  1.1  itojun 		hp = gethostbyaddr((char *)in6p, sizeof(*in6p), AF_INET6);
   1061  1.1  itojun 		if (hp) {
   1062  1.1  itojun 			if ((cp = index(hp->h_name, '.')) &&
   1063  1.1  itojun 			    !strcmp(cp + 1, domain))
   1064  1.1  itojun 				*cp = 0;
   1065  1.1  itojun 			cp = hp->h_name;
   1066  1.1  itojun 		}
   1067  1.1  itojun 	}
   1068  1.1  itojun 	if (IN6_IS_ADDR_UNSPECIFIED(in6p))
   1069  1.1  itojun 		strcpy(line, "*");
   1070  1.1  itojun 	else if (cp)
   1071  1.1  itojun 		strcpy(line, cp);
   1072  1.1  itojun 	else
   1073  1.1  itojun 		sprintf(line, "%s",
   1074  1.1  itojun 			inet_ntop(AF_INET6, (void *)in6p, ntop_buf,
   1075  1.1  itojun 				sizeof(ntop_buf)));
   1076  1.1  itojun 	return (line);
   1077  1.1  itojun }
   1078  1.1  itojun 
   1079  1.1  itojun #ifdef TCP6
   1080  1.1  itojun /*
   1081  1.1  itojun  * Dump the contents of a TCP6 PCB.
   1082  1.1  itojun  */
   1083  1.1  itojun void
   1084  1.1  itojun tcp6_dump(pcbaddr)
   1085  1.1  itojun 	u_long pcbaddr;
   1086  1.1  itojun {
   1087  1.1  itojun 	struct tcp6cb tcp6cb;
   1088  1.1  itojun 	int i;
   1089  1.1  itojun 
   1090  1.1  itojun 	kread(pcbaddr, (char *)&tcp6cb, sizeof(tcp6cb));
   1091  1.1  itojun 
   1092  1.1  itojun 	printf("TCP Protocol Control Block at 0x%08lx:\n\n", pcbaddr);
   1093  1.1  itojun 
   1094  1.1  itojun 	printf("Timers:\n");
   1095  1.1  itojun 	for (i = 0; i < TCP6T_NTIMERS; i++)
   1096  1.1  itojun 		printf("\t%s: %u", tcp6timers[i], tcp6cb.t_timer[i]);
   1097  1.1  itojun 	printf("\n\n");
   1098  1.1  itojun 
   1099  1.1  itojun 	if (tcp6cb.t_state < 0 || tcp6cb.t_state >= TCP6_NSTATES)
   1100  1.1  itojun 		printf("State: %d", tcp6cb.t_state);
   1101  1.1  itojun 	else
   1102  1.1  itojun 		printf("State: %s", tcp6states[tcp6cb.t_state]);
   1103  1.1  itojun 	printf(", flags 0x%x, in6pcb 0x%lx\n\n", tcp6cb.t_flags,
   1104  1.1  itojun 	    (u_long)tcp6cb.t_in6pcb);
   1105  1.1  itojun 
   1106  1.1  itojun 	printf("rxtshift %d, rxtcur %d, dupacks %d\n", tcp6cb.t_rxtshift,
   1107  1.1  itojun 	    tcp6cb.t_rxtcur, tcp6cb.t_dupacks);
   1108  1.1  itojun 	printf("peermaxseg %u, maxseg %u, force %d\n\n", tcp6cb.t_peermaxseg,
   1109  1.1  itojun 	    tcp6cb.t_maxseg, tcp6cb.t_force);
   1110  1.1  itojun 
   1111  1.1  itojun 	printf("snd_una %u, snd_nxt %u, snd_up %u\n",
   1112  1.1  itojun 	    tcp6cb.snd_una, tcp6cb.snd_nxt, tcp6cb.snd_up);
   1113  1.4  bouyer 	printf("snd_wl1 %u, snd_wl2 %u, iss %u, snd_wnd %llu\n\n",
   1114  1.4  bouyer 	    tcp6cb.snd_wl1, tcp6cb.snd_wl2, tcp6cb.iss,
   1115  1.4  bouyer 	    (unsigned long long)tcp6cb.snd_wnd);
   1116  1.4  bouyer 
   1117  1.4  bouyer 	printf("rcv_wnd %llu, rcv_nxt %u, rcv_up %u, irs %u\n\n",
   1118  1.4  bouyer 	    (unsigned long long)cp6cb.rcv_wnd, tcp6cb.rcv_nxt,
   1119  1.4  bouyer 	    tcp6cb.rcv_up, tcp6cb.irs);
   1120  1.4  bouyer 
   1121  1.4  bouyer 	printf("rcv_adv %u, snd_max %u, snd_cwnd %llu, snd_ssthresh %llu\n",
   1122  1.4  bouyer 	    tcp6cb.rcv_adv, tcp6cb.snd_max, (unsigned long long)tcp6cb.snd_cwnd,
   1123  1.4  bouyer 	    (unsigned long long)tcp6cb.snd_ssthresh);
   1124  1.1  itojun 
   1125  1.1  itojun 	printf("idle %d, rtt %d, rtseq %u, srtt %d, rttvar %d, rttmin %d, "
   1126  1.4  bouyer 	    "max_sndwnd %llu\n\n", tcp6cb.t_idle, tcp6cb.t_rtt, tcp6cb.t_rtseq,
   1127  1.4  bouyer 	    tcp6cb.t_srtt, tcp6cb.t_rttvar, tcp6cb.t_rttmin,
   1128  1.4  bouyer 	    (unsigned long long)tcp6cb.max_sndwnd);
   1129  1.1  itojun 
   1130  1.1  itojun 	printf("oobflags %d, iobc %d, softerror %d\n\n", tcp6cb.t_oobflags,
   1131  1.1  itojun 	    tcp6cb.t_iobc, tcp6cb.t_softerror);
   1132  1.1  itojun 
   1133  1.1  itojun 	printf("snd_scale %d, rcv_scale %d, req_r_scale %d, req_s_scale %d\n",
   1134  1.1  itojun 	    tcp6cb.snd_scale, tcp6cb.rcv_scale, tcp6cb.request_r_scale,
   1135  1.1  itojun 	    tcp6cb.requested_s_scale);
   1136  1.1  itojun 	printf("ts_recent %u, ts_regent_age %d, last_ack_sent %u\n",
   1137  1.1  itojun 	    tcp6cb.ts_recent, tcp6cb.ts_recent_age, tcp6cb.last_ack_sent);
   1138  1.1  itojun }
   1139  1.1  itojun #endif
   1140  1.1  itojun 
   1141  1.1  itojun #endif /*INET6*/
   1142