inet6.c revision 55533
154263Sshin/*	BSDI inet.c,v 2.3 1995/10/24 02:19:29 prb Exp	*/
254263Sshin/*
354263Sshin * Copyright (c) 1983, 1988, 1993
454263Sshin *	The Regents of the University of California.  All rights reserved.
554263Sshin *
654263Sshin * Redistribution and use in source and binary forms, with or without
754263Sshin * modification, are permitted provided that the following conditions
854263Sshin * are met:
954263Sshin * 1. Redistributions of source code must retain the above copyright
1054263Sshin *    notice, this list of conditions and the following disclaimer.
1154263Sshin * 2. Redistributions in binary form must reproduce the above copyright
1254263Sshin *    notice, this list of conditions and the following disclaimer in the
1354263Sshin *    documentation and/or other materials provided with the distribution.
1454263Sshin * 3. All advertising materials mentioning features or use of this software
1554263Sshin *    must display the following acknowledgement:
1654263Sshin *	This product includes software developed by the University of
1754263Sshin *	California, Berkeley and its contributors.
1854263Sshin * 4. Neither the name of the University nor the names of its contributors
1954263Sshin *    may be used to endorse or promote products derived from this software
2054263Sshin *    without specific prior written permission.
2154263Sshin *
2254263Sshin * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2354263Sshin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2454263Sshin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2554263Sshin * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2654263Sshin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2754263Sshin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2854263Sshin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2954263Sshin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3054263Sshin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3154263Sshin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3254263Sshin * SUCH DAMAGE.
3354263Sshin *
3454263Sshin * $FreeBSD: head/usr.bin/netstat/inet6.c 55533 2000-01-07 05:17:09Z shin $
3554263Sshin */
3654263Sshin
3754263Sshin#ifndef lint
3854263Sshin/*
3954263Sshinstatic char sccsid[] = "@(#)inet6.c	8.4 (Berkeley) 4/20/94";
4054263Sshin*/
4154263Sshin#endif /* not lint */
4254263Sshin
4354263Sshin#include <sys/param.h>
4454263Sshin#include <sys/socket.h>
4554263Sshin#include <sys/socketvar.h>
4654263Sshin#include <sys/ioctl.h>
4754263Sshin#include <sys/mbuf.h>
4854263Sshin#include <sys/protosw.h>
4954263Sshin
5054263Sshin#include <net/route.h>
5154263Sshin#include <net/if.h>
5254263Sshin#include <net/if_var.h>
5354263Sshin#include <netinet/in.h>
5454263Sshin#include <netinet/ip6.h>
5554263Sshin#include <netinet/icmp6.h>
5654263Sshin#include <netinet/in_systm.h>
5754263Sshin#include <netinet6/in6_pcb.h>
5854263Sshin#include <netinet6/in6_var.h>
5954263Sshin#include <netinet6/ip6_var.h>
6054263Sshin#include <netinet6/pim6_var.h>
6154263Sshin
6254263Sshin#include <arpa/inet.h>
6354263Sshin#include <netdb.h>
6454263Sshin
6554263Sshin#include <stdio.h>
6654263Sshin#include <string.h>
6754263Sshin#include <unistd.h>
6854263Sshin#include "netstat.h"
6954263Sshin
7054263Sshinstruct	socket sockb;
7154263Sshin
7254263Sshinchar	*inet6name __P((struct in6_addr *));
7354263Sshinvoid	inet6print __P((struct in6_addr *, int, char *, int));
7454263Sshin
7554263Sshinstatic char ntop_buf[INET6_ADDRSTRLEN];
7654263Sshin
7754263Sshinstatic	char *ip6nh[] = {
7854263Sshin	"hop by hop",
7954263Sshin	"ICMP",
8054263Sshin	"IGMP",
8154263Sshin	"#3",
8254263Sshin	"IP",
8354263Sshin	"#5",
8454263Sshin	"TCP",
8554263Sshin	"#7",
8654263Sshin	"#8",
8754263Sshin	"#9",
8854263Sshin	"#10",
8954263Sshin	"#11",
9054263Sshin	"#12",
9154263Sshin	"#13",
9254263Sshin	"#14",
9354263Sshin	"#15",
9454263Sshin	"#16",
9554263Sshin	"UDP",
9654263Sshin	"#18",
9754263Sshin	"#19",
9854263Sshin	"#20",
9954263Sshin	"#21",
10054263Sshin	"IDP",
10154263Sshin	"#23",
10254263Sshin	"#24",
10354263Sshin	"#25",
10454263Sshin	"#26",
10554263Sshin	"#27",
10654263Sshin	"#28",
10754263Sshin	"TP",
10854263Sshin	"#30",
10954263Sshin	"#31",
11054263Sshin	"#32",
11154263Sshin	"#33",
11254263Sshin	"#34",
11354263Sshin	"#35",
11454263Sshin	"#36",
11554263Sshin	"#37",
11654263Sshin	"#38",
11754263Sshin	"#39",
11854263Sshin	"#40",
11954263Sshin	"IP6",
12054263Sshin	"#42",
12154263Sshin	"routing",
12254263Sshin	"fragment",
12354263Sshin	"#45",
12454263Sshin	"#46",
12554263Sshin	"#47",
12654263Sshin	"#48",
12754263Sshin	"#49",
12854263Sshin	"ESP",
12954263Sshin	"AH",
13054263Sshin	"#52",
13154263Sshin	"#53",
13254263Sshin	"#54",
13354263Sshin	"#55",
13454263Sshin	"#56",
13554263Sshin	"#57",
13654263Sshin	"ICMP6",
13754263Sshin	"no next header",
13854263Sshin	"destination option",
13954263Sshin	"#61",
14054263Sshin	"#62",
14154263Sshin	"#63",
14254263Sshin	"#64",
14354263Sshin	"#65",
14454263Sshin	"#66",
14554263Sshin	"#67",
14654263Sshin	"#68",
14754263Sshin	"#69",
14854263Sshin	"#70",
14954263Sshin	"#71",
15054263Sshin	"#72",
15154263Sshin	"#73",
15254263Sshin	"#74",
15354263Sshin	"#75",
15454263Sshin	"#76",
15554263Sshin	"#77",
15654263Sshin	"#78",
15754263Sshin	"#79",
15854263Sshin	"ISOIP",
15954263Sshin	"#81",
16054263Sshin	"#82",
16154263Sshin	"#83",
16254263Sshin	"#84",
16354263Sshin	"#85",
16454263Sshin	"#86",
16554263Sshin	"#87",
16654263Sshin	"#88",
16754263Sshin	"#89",
16854263Sshin	"#80",
16954263Sshin	"#91",
17054263Sshin	"#92",
17154263Sshin	"#93",
17254263Sshin	"#94",
17354263Sshin	"#95",
17454263Sshin	"#96",
17554263Sshin	"Ethernet",
17654263Sshin	"#98",
17754263Sshin	"#99",
17854263Sshin	"#100",
17954263Sshin	"#101",
18054263Sshin	"#102",
18154263Sshin	"PIM",
18254263Sshin	"#104",
18354263Sshin	"#105",
18454263Sshin	"#106",
18554263Sshin	"#107",
18654263Sshin	"#108",
18754263Sshin	"#109",
18854263Sshin	"#110",
18954263Sshin	"#111",
19054263Sshin	"#112",
19154263Sshin	"#113",
19254263Sshin	"#114",
19354263Sshin	"#115",
19454263Sshin	"#116",
19554263Sshin	"#117",
19654263Sshin	"#118",
19754263Sshin	"#119",
19854263Sshin	"#120",
19954263Sshin	"#121",
20054263Sshin	"#122",
20154263Sshin	"#123",
20254263Sshin	"#124",
20354263Sshin	"#125",
20454263Sshin	"#126",
20554263Sshin	"#127",
20654263Sshin	"#128",
20754263Sshin	"#129",
20854263Sshin	"#130",
20954263Sshin	"#131",
21054263Sshin	"#132",
21154263Sshin	"#133",
21254263Sshin	"#134",
21354263Sshin	"#135",
21454263Sshin	"#136",
21554263Sshin	"#137",
21654263Sshin	"#138",
21754263Sshin	"#139",
21854263Sshin	"#140",
21954263Sshin	"#141",
22054263Sshin	"#142",
22154263Sshin	"#143",
22254263Sshin	"#144",
22354263Sshin	"#145",
22454263Sshin	"#146",
22554263Sshin	"#147",
22654263Sshin	"#148",
22754263Sshin	"#149",
22854263Sshin	"#150",
22954263Sshin	"#151",
23054263Sshin	"#152",
23154263Sshin	"#153",
23254263Sshin	"#154",
23354263Sshin	"#155",
23454263Sshin	"#156",
23554263Sshin	"#157",
23654263Sshin	"#158",
23754263Sshin	"#159",
23854263Sshin	"#160",
23954263Sshin	"#161",
24054263Sshin	"#162",
24154263Sshin	"#163",
24254263Sshin	"#164",
24354263Sshin	"#165",
24454263Sshin	"#166",
24554263Sshin	"#167",
24654263Sshin	"#168",
24754263Sshin	"#169",
24854263Sshin	"#170",
24954263Sshin	"#171",
25054263Sshin	"#172",
25154263Sshin	"#173",
25254263Sshin	"#174",
25354263Sshin	"#175",
25454263Sshin	"#176",
25554263Sshin	"#177",
25654263Sshin	"#178",
25754263Sshin	"#179",
25854263Sshin	"#180",
25954263Sshin	"#181",
26054263Sshin	"#182",
26154263Sshin	"#183",
26254263Sshin	"#184",
26354263Sshin	"#185",
26454263Sshin	"#186",
26554263Sshin	"#187",
26654263Sshin	"#188",
26754263Sshin	"#189",
26854263Sshin	"#180",
26954263Sshin	"#191",
27054263Sshin	"#192",
27154263Sshin	"#193",
27254263Sshin	"#194",
27354263Sshin	"#195",
27454263Sshin	"#196",
27554263Sshin	"#197",
27654263Sshin	"#198",
27754263Sshin	"#199",
27854263Sshin	"#200",
27954263Sshin	"#201",
28054263Sshin	"#202",
28154263Sshin	"#203",
28254263Sshin	"#204",
28354263Sshin	"#205",
28454263Sshin	"#206",
28554263Sshin	"#207",
28654263Sshin	"#208",
28754263Sshin	"#209",
28854263Sshin	"#210",
28954263Sshin	"#211",
29054263Sshin	"#212",
29154263Sshin	"#213",
29254263Sshin	"#214",
29354263Sshin	"#215",
29454263Sshin	"#216",
29554263Sshin	"#217",
29654263Sshin	"#218",
29754263Sshin	"#219",
29854263Sshin	"#220",
29954263Sshin	"#221",
30054263Sshin	"#222",
30154263Sshin	"#223",
30254263Sshin	"#224",
30354263Sshin	"#225",
30454263Sshin	"#226",
30554263Sshin	"#227",
30654263Sshin	"#228",
30754263Sshin	"#229",
30854263Sshin	"#230",
30954263Sshin	"#231",
31054263Sshin	"#232",
31154263Sshin	"#233",
31254263Sshin	"#234",
31354263Sshin	"#235",
31454263Sshin	"#236",
31554263Sshin	"#237",
31654263Sshin	"#238",
31754263Sshin	"#239",
31854263Sshin	"#240",
31954263Sshin	"#241",
32054263Sshin	"#242",
32154263Sshin	"#243",
32254263Sshin	"#244",
32354263Sshin	"#245",
32454263Sshin	"#246",
32554263Sshin	"#247",
32654263Sshin	"#248",
32754263Sshin	"#249",
32854263Sshin	"#250",
32954263Sshin	"#251",
33054263Sshin	"#252",
33154263Sshin	"#253",
33254263Sshin	"#254",
33354263Sshin	"#255",
33454263Sshin};
33554263Sshin
33654263Sshin/*
33754263Sshin * Dump IP6 statistics structure.
33854263Sshin */
33954263Sshinvoid
34054263Sshinip6_stats(off, name)
34154263Sshin	u_long off;
34254263Sshin	char *name;
34354263Sshin{
34454263Sshin	struct ip6stat ip6stat;
34554263Sshin	int first, i;
34654263Sshin
34754263Sshin	if (off == 0)
34854263Sshin		return;
34954263Sshin
35054263Sshin	kread(off, (char *)&ip6stat, sizeof (ip6stat));
35154263Sshin	printf("%s:\n", name);
35254263Sshin
35354263Sshin#define	p(f, m) if (ip6stat.f || sflag <= 1) \
35454263Sshin    printf(m, ip6stat.f, plural(ip6stat.f))
35554263Sshin#define	p1a(f, m) if (ip6stat.f || sflag <= 1) \
35654263Sshin    printf(m, ip6stat.f)
35754263Sshin
35854263Sshin	p(ip6s_total, "\t%lu total packet%s received\n");
35954263Sshin	p1a(ip6s_toosmall, "\t%lu with size smaller than minimum\n");
36054263Sshin	p1a(ip6s_tooshort, "\t%lu with data size < data length\n");
36154263Sshin	p1a(ip6s_badoptions, "\t%lu with bad options\n");
36254263Sshin	p1a(ip6s_badvers, "\t%lu with incorrect version number\n");
36354263Sshin	p(ip6s_fragments, "\t%lu fragment%s received\n");
36454263Sshin	p(ip6s_fragdropped, "\t%lu fragment%s dropped (dup or out of space)\n");
36554263Sshin	p(ip6s_fragtimeout, "\t%lu fragment%s dropped after timeout\n");
36654263Sshin	p(ip6s_fragoverflow, "\t%lu fragment%s that exceeded limit\n");
36754263Sshin	p(ip6s_reassembled, "\t%lu packet%s reassembled ok\n");
36854263Sshin	p(ip6s_delivered, "\t%lu packet%s for this host\n");
36954263Sshin	p(ip6s_forward, "\t%lu packet%s forwarded\n");
37054263Sshin	p(ip6s_cantforward, "\t%lu packet%s not forwardable\n");
37154263Sshin	p(ip6s_redirectsent, "\t%lu redirect%s sent\n");
37254263Sshin	p(ip6s_localout, "\t%lu packet%s sent from this host\n");
37354263Sshin	p(ip6s_rawout, "\t%lu packet%s sent with fabricated ip header\n");
37454263Sshin	p(ip6s_odropped, "\t%lu output packet%s dropped due to no bufs, etc.\n");
37554263Sshin	p(ip6s_noroute, "\t%lu output packet%s discarded due to no route\n");
37654263Sshin	p(ip6s_fragmented, "\t%lu output datagram%s fragmented\n");
37754263Sshin	p(ip6s_ofragments, "\t%lu fragment%s created\n");
37854263Sshin	p(ip6s_cantfrag, "\t%lu datagram%s that can't be fragmented\n");
37954263Sshin	p(ip6s_badscope, "\t%lu packet%s that violated scope rules\n");
38054263Sshin	p(ip6s_notmember, "\t%lu multicast packet%s which we don't join\n");
38154263Sshin	for (first = 1, i = 0; i < 256; i++)
38254263Sshin		if (ip6stat.ip6s_nxthist[i] != 0) {
38354263Sshin			if (first) {
38454263Sshin				printf("\tInput histogram:\n");
38554263Sshin				first = 0;
38654263Sshin			}
38754263Sshin			printf("\t\t%s: %lu\n", ip6nh[i],
38854263Sshin			       ip6stat.ip6s_nxthist[i]);
38954263Sshin		}
39054263Sshin	printf("\tMbuf statistics:\n");
39154263Sshin	printf("\t\t%lu one mbuf\n", ip6stat.ip6s_m1);
39254263Sshin	for (first = 1, i = 0; i < 32; i++) {
39355163Sshin		char ifbuf[IFNAMSIZ];
39454263Sshin		if (ip6stat.ip6s_m2m[i] != 0) {
39554263Sshin			if (first) {
39654263Sshin				printf("\t\ttwo or more mbuf:\n");
39754263Sshin				first = 0;
39854263Sshin			}
39955163Sshin			printf("\t\t\t%s= %ld\n",
40054263Sshin			       if_indextoname(i, ifbuf),
40154263Sshin			       ip6stat.ip6s_m2m[i]);
40254263Sshin		}
40354263Sshin	}
40454263Sshin	printf("\t\t%lu one ext mbuf\n", ip6stat.ip6s_mext1);
40554263Sshin	printf("\t\t%lu two or more ext mbuf\n", ip6stat.ip6s_mext2m);
40654263Sshin	p(ip6s_exthdrtoolong, "\t%lu packet%s whose headers are not continuous\n");
40754263Sshin	p(ip6s_nogif, "\t%lu tunneling packet%s that can't find gif\n");
40854263Sshin	p(ip6s_toomanyhdr, "\t%lu packet%s discarded due to too may headers\n");
40954263Sshin#undef p
41054263Sshin}
41154263Sshin
41254263Sshin/*
41354263Sshin * Dump IPv6 per-interface statistics based on RFC 2465.
41454263Sshin */
41554263Sshinvoid
41654263Sshinip6_ifstats(ifname)
41754263Sshin	char *ifname;
41854263Sshin{
41954263Sshin	struct in6_ifreq ifr;
42054263Sshin	int s;
42154263Sshin#define	p(f, m) if (ifr.ifr_ifru.ifru_stat.f || sflag <= 1) \
42254263Sshin    printf(m, ifr.ifr_ifru.ifru_stat.f, plural(ifr.ifr_ifru.ifru_stat.f))
42354263Sshin#define	p_5(f, m) if (ifr.ifr_ifru.ifru_stat.f || sflag <= 1) \
42454263Sshin    printf(m, ip6stat.f)
42554263Sshin
42654263Sshin	if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
42754263Sshin		perror("Warning: socket(AF_INET6)");
42854263Sshin		return;
42954263Sshin	}
43054263Sshin
43154263Sshin	strcpy(ifr.ifr_name, ifname);
43254263Sshin	printf("ip6 on %s:\n", ifr.ifr_name);
43354263Sshin
43454263Sshin	if (ioctl(s, SIOCGIFSTAT_IN6, (char *)&ifr) < 0) {
43554263Sshin		perror("Warning: ioctl(SIOCGIFSTAT_IN6)");
43654263Sshin		goto end;
43754263Sshin	}
43854263Sshin
43954263Sshin	p(ifs6_in_receive, "\t%qu total input datagram%s\n");
44054263Sshin	p(ifs6_in_hdrerr, "\t%qu datagram%s with invalid header received\n");
44154263Sshin	p(ifs6_in_toobig, "\t%qu datagram%s exceeded MTU received\n");
44254263Sshin	p(ifs6_in_noroute, "\t%qu datagram%s with no route received\n");
44354263Sshin	p(ifs6_in_addrerr, "\t%qu datagram%s with invalid dst received\n");
44454263Sshin	p(ifs6_in_protounknown, "\t%qu datagram%s with unknown proto received\n");
44554263Sshin	p(ifs6_in_truncated, "\t%qu truncated datagram%s received\n");
44654263Sshin	p(ifs6_in_discard, "\t%qu input datagram%s discarded\n");
44754263Sshin	p(ifs6_in_deliver,
44854263Sshin	  "\t%qu datagram%s delivered to an upper layer protocol\n");
44954263Sshin	p(ifs6_out_forward, "\t%qu datagram%s forwarded to this interface\n");
45054263Sshin	p(ifs6_out_request,
45154263Sshin	  "\t%qu datagram%s sent from an upper layer protocol\n");
45254263Sshin	p(ifs6_out_discard, "\t%qu total discarded output datagram%s\n");
45354263Sshin	p(ifs6_out_fragok, "\t%qu output datagram%s fragmented\n");
45454263Sshin	p(ifs6_out_fragfail, "\t%qu output datagram%s failed on fragment\n");
45554263Sshin	p(ifs6_out_fragcreat, "\t%qu output datagram%s succeeded on fragment\n");
45654263Sshin	p(ifs6_reass_reqd, "\t%qu incoming datagram%s fragmented\n");
45754263Sshin	p(ifs6_reass_ok, "\t%qu datagram%s reassembled\n");
45854263Sshin	p(ifs6_reass_fail, "\t%qu datagram%s failed on reassembling\n");
45954263Sshin	p(ifs6_in_mcast, "\t%qu multicast datagram%s received\n");
46054263Sshin	p(ifs6_out_mcast, "\t%qu multicast datagram%s sent\n");
46154263Sshin
46254263Sshin  end:
46354263Sshin	close(s);
46454263Sshin
46554263Sshin#undef p
46654263Sshin#undef p_5
46754263Sshin}
46854263Sshin
46954263Sshinstatic	char *icmp6names[] = {
47054263Sshin	"#0",
47154263Sshin	"unreach",
47254263Sshin	"packet too big",
47354263Sshin	"time exceed",
47454263Sshin	"parameter problem",
47554263Sshin	"#5",
47654263Sshin	"#6",
47754263Sshin	"#7",
47854263Sshin	"#8",
47954263Sshin	"#9",
48054263Sshin	"#10",
48154263Sshin	"#11",
48254263Sshin	"#12",
48354263Sshin	"#13",
48454263Sshin	"#14",
48554263Sshin	"#15",
48654263Sshin	"#16",
48754263Sshin	"#17",
48854263Sshin	"#18",
48954263Sshin	"#19",
49054263Sshin	"#20",
49154263Sshin	"#21",
49254263Sshin	"#22",
49354263Sshin	"#23",
49454263Sshin	"#24",
49554263Sshin	"#25",
49654263Sshin	"#26",
49754263Sshin	"#27",
49854263Sshin	"#28",
49954263Sshin	"#29",
50054263Sshin	"#30",
50154263Sshin	"#31",
50254263Sshin	"#32",
50354263Sshin	"#33",
50454263Sshin	"#34",
50554263Sshin	"#35",
50654263Sshin	"#36",
50754263Sshin	"#37",
50854263Sshin	"#38",
50954263Sshin	"#39",
51054263Sshin	"#40",
51154263Sshin	"#41",
51254263Sshin	"#42",
51354263Sshin	"#43",
51454263Sshin	"#44",
51554263Sshin	"#45",
51654263Sshin	"#46",
51754263Sshin	"#47",
51854263Sshin	"#48",
51954263Sshin	"#49",
52054263Sshin	"#50",
52154263Sshin	"#51",
52254263Sshin	"#52",
52354263Sshin	"#53",
52454263Sshin	"#54",
52554263Sshin	"#55",
52654263Sshin	"#56",
52754263Sshin	"#57",
52854263Sshin	"#58",
52954263Sshin	"#59",
53054263Sshin	"#60",
53154263Sshin	"#61",
53254263Sshin	"#62",
53354263Sshin	"#63",
53454263Sshin	"#64",
53554263Sshin	"#65",
53654263Sshin	"#66",
53754263Sshin	"#67",
53854263Sshin	"#68",
53954263Sshin	"#69",
54054263Sshin	"#70",
54154263Sshin	"#71",
54254263Sshin	"#72",
54354263Sshin	"#73",
54454263Sshin	"#74",
54554263Sshin	"#75",
54654263Sshin	"#76",
54754263Sshin	"#77",
54854263Sshin	"#78",
54954263Sshin	"#79",
55054263Sshin	"#80",
55154263Sshin	"#81",
55254263Sshin	"#82",
55354263Sshin	"#83",
55454263Sshin	"#84",
55554263Sshin	"#85",
55654263Sshin	"#86",
55754263Sshin	"#87",
55854263Sshin	"#88",
55954263Sshin	"#89",
56054263Sshin	"#80",
56154263Sshin	"#91",
56254263Sshin	"#92",
56354263Sshin	"#93",
56454263Sshin	"#94",
56554263Sshin	"#95",
56654263Sshin	"#96",
56754263Sshin	"#97",
56854263Sshin	"#98",
56954263Sshin	"#99",
57054263Sshin	"#100",
57154263Sshin	"#101",
57254263Sshin	"#102",
57354263Sshin	"#103",
57454263Sshin	"#104",
57554263Sshin	"#105",
57654263Sshin	"#106",
57754263Sshin	"#107",
57854263Sshin	"#108",
57954263Sshin	"#109",
58054263Sshin	"#110",
58154263Sshin	"#111",
58254263Sshin	"#112",
58354263Sshin	"#113",
58454263Sshin	"#114",
58554263Sshin	"#115",
58654263Sshin	"#116",
58754263Sshin	"#117",
58854263Sshin	"#118",
58954263Sshin	"#119",
59054263Sshin	"#120",
59154263Sshin	"#121",
59254263Sshin	"#122",
59354263Sshin	"#123",
59454263Sshin	"#124",
59554263Sshin	"#125",
59654263Sshin	"#126",
59754263Sshin	"#127",
59854263Sshin	"echo",
59954263Sshin	"echo reply",
60054263Sshin	"multicast listener query",
60154263Sshin	"multicast listener report",
60254263Sshin	"multicast listener done",
60354263Sshin	"router solicitation",
60454263Sshin	"router advertisment",
60554263Sshin	"neighbor solicitation",
60654263Sshin	"neighbor advertisment",
60754263Sshin	"redirect",
60854263Sshin	"router renumbering",
60954263Sshin	"node information request",
61054263Sshin	"node information reply",
61154263Sshin	"#141",
61254263Sshin	"#142",
61354263Sshin	"#143",
61454263Sshin	"#144",
61554263Sshin	"#145",
61654263Sshin	"#146",
61754263Sshin	"#147",
61854263Sshin	"#148",
61954263Sshin	"#149",
62054263Sshin	"#150",
62154263Sshin	"#151",
62254263Sshin	"#152",
62354263Sshin	"#153",
62454263Sshin	"#154",
62554263Sshin	"#155",
62654263Sshin	"#156",
62754263Sshin	"#157",
62854263Sshin	"#158",
62954263Sshin	"#159",
63054263Sshin	"#160",
63154263Sshin	"#161",
63254263Sshin	"#162",
63354263Sshin	"#163",
63454263Sshin	"#164",
63554263Sshin	"#165",
63654263Sshin	"#166",
63754263Sshin	"#167",
63854263Sshin	"#168",
63954263Sshin	"#169",
64054263Sshin	"#170",
64154263Sshin	"#171",
64254263Sshin	"#172",
64354263Sshin	"#173",
64454263Sshin	"#174",
64554263Sshin	"#175",
64654263Sshin	"#176",
64754263Sshin	"#177",
64854263Sshin	"#178",
64954263Sshin	"#179",
65054263Sshin	"#180",
65154263Sshin	"#181",
65254263Sshin	"#182",
65354263Sshin	"#183",
65454263Sshin	"#184",
65554263Sshin	"#185",
65654263Sshin	"#186",
65754263Sshin	"#187",
65854263Sshin	"#188",
65954263Sshin	"#189",
66054263Sshin	"#180",
66154263Sshin	"#191",
66254263Sshin	"#192",
66354263Sshin	"#193",
66454263Sshin	"#194",
66554263Sshin	"#195",
66654263Sshin	"#196",
66754263Sshin	"#197",
66854263Sshin	"#198",
66954263Sshin	"#199",
67054263Sshin	"#200",
67154263Sshin	"#201",
67254263Sshin	"#202",
67354263Sshin	"#203",
67454263Sshin	"#204",
67554263Sshin	"#205",
67654263Sshin	"#206",
67754263Sshin	"#207",
67854263Sshin	"#208",
67954263Sshin	"#209",
68054263Sshin	"#210",
68154263Sshin	"#211",
68254263Sshin	"#212",
68354263Sshin	"#213",
68454263Sshin	"#214",
68554263Sshin	"#215",
68654263Sshin	"#216",
68754263Sshin	"#217",
68854263Sshin	"#218",
68954263Sshin	"#219",
69054263Sshin	"#220",
69154263Sshin	"#221",
69254263Sshin	"#222",
69354263Sshin	"#223",
69454263Sshin	"#224",
69554263Sshin	"#225",
69654263Sshin	"#226",
69754263Sshin	"#227",
69854263Sshin	"#228",
69954263Sshin	"#229",
70054263Sshin	"#230",
70154263Sshin	"#231",
70254263Sshin	"#232",
70354263Sshin	"#233",
70454263Sshin	"#234",
70554263Sshin	"#235",
70654263Sshin	"#236",
70754263Sshin	"#237",
70854263Sshin	"#238",
70954263Sshin	"#239",
71054263Sshin	"#240",
71154263Sshin	"#241",
71254263Sshin	"#242",
71354263Sshin	"#243",
71454263Sshin	"#244",
71554263Sshin	"#245",
71654263Sshin	"#246",
71754263Sshin	"#247",
71854263Sshin	"#248",
71954263Sshin	"#249",
72054263Sshin	"#250",
72154263Sshin	"#251",
72254263Sshin	"#252",
72354263Sshin	"#253",
72454263Sshin	"#254",
72554263Sshin	"#255",
72654263Sshin};
72754263Sshin
72854263Sshin/*
72954263Sshin * Dump ICMP6 statistics.
73054263Sshin */
73154263Sshinvoid
73254263Sshinicmp6_stats(off, name)
73354263Sshin	u_long off;
73454263Sshin	char *name;
73554263Sshin{
73654263Sshin	struct icmp6stat icmp6stat;
73754263Sshin	register int i, first;
73854263Sshin
73954263Sshin	if (off == 0)
74054263Sshin		return;
74154263Sshin	kread(off, (char *)&icmp6stat, sizeof (icmp6stat));
74254263Sshin	printf("%s:\n", name);
74354263Sshin
74454263Sshin#define	p(f, m) if (icmp6stat.f || sflag <= 1) \
74554263Sshin    printf(m, icmp6stat.f, plural(icmp6stat.f))
74654263Sshin
74754263Sshin	p(icp6s_error, "\t%lu call%s to icmp_error\n");
74854263Sshin	p(icp6s_canterror,
74954263Sshin	    "\t%lu error%s not generated because old message was icmp error or so\n");
75054263Sshin	p(icp6s_toofreq,
75154263Sshin	  "\t%lu error%s not generated because rate limitation\n");
75254263Sshin	for (first = 1, i = 0; i < 256; i++)
75354263Sshin		if (icmp6stat.icp6s_outhist[i] != 0) {
75454263Sshin			if (first) {
75554263Sshin				printf("\tOutput histogram:\n");
75654263Sshin				first = 0;
75754263Sshin			}
75854263Sshin			printf("\t\t%s: %lu\n", icmp6names[i],
75954263Sshin				icmp6stat.icp6s_outhist[i]);
76054263Sshin		}
76154263Sshin	p(icp6s_badcode, "\t%lu message%s with bad code fields\n");
76254263Sshin	p(icp6s_tooshort, "\t%lu message%s < minimum length\n");
76354263Sshin	p(icp6s_checksum, "\t%lu bad checksum%s\n");
76454263Sshin	p(icp6s_badlen, "\t%lu message%s with bad length\n");
76554263Sshin	for (first = 1, i = 0; i < ICMP6_MAXTYPE; i++)
76654263Sshin		if (icmp6stat.icp6s_inhist[i] != 0) {
76754263Sshin			if (first) {
76854263Sshin				printf("\tInput histogram:\n");
76954263Sshin				first = 0;
77054263Sshin			}
77154263Sshin			printf("\t\t%s: %lu\n", icmp6names[i],
77254263Sshin				icmp6stat.icp6s_inhist[i]);
77354263Sshin		}
77454263Sshin	p(icp6s_reflect, "\t%lu message response%s generated\n");
77554263Sshin#undef p
77654263Sshin#undef p_5
77754263Sshin}
77854263Sshin
77954263Sshin/*
78054263Sshin * Dump ICMPv6 per-interface statistics based on RFC 2466.
78154263Sshin */
78254263Sshinvoid
78354263Sshinicmp6_ifstats(ifname)
78454263Sshin	char *ifname;
78554263Sshin{
78654263Sshin	struct in6_ifreq ifr;
78754263Sshin	int s;
78854263Sshin#define	p(f, m) if (ifr.ifr_ifru.ifru_icmp6stat.f || sflag <= 1) \
78954263Sshin    printf(m, (u_quad_t)ifr.ifr_ifru.ifru_icmp6stat.f, plural(ifr.ifr_ifru.ifru_icmp6stat.f))
79054263Sshin
79154263Sshin	if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
79254263Sshin		perror("Warning: socket(AF_INET6)");
79354263Sshin		return;
79454263Sshin	}
79554263Sshin
79654263Sshin	strcpy(ifr.ifr_name, ifname);
79754263Sshin	printf("icmp6 on %s:\n", ifr.ifr_name);
79854263Sshin
79954263Sshin	if (ioctl(s, SIOCGIFSTAT_ICMP6, (char *)&ifr) < 0) {
80054263Sshin		perror("Warning: ioctl(SIOCGIFSTAT_ICMP6)");
80154263Sshin		goto end;
80254263Sshin	}
80354263Sshin
80454263Sshin	p(ifs6_in_msg, "\t%qu total input message%s\n");
80554263Sshin	p(ifs6_in_error, "\t%qu total input error message%s\n");
80654263Sshin	p(ifs6_in_dstunreach, "\t%qu input destination unreachable error%s\n");
80754263Sshin	p(ifs6_in_adminprohib, "\t%qu input administratively prohibited error%s\n");
80854263Sshin	p(ifs6_in_timeexceed, "\t%qu input time exceeded error%s\n");
80954263Sshin	p(ifs6_in_paramprob, "\t%qu input parameter problem error%s\n");
81054263Sshin	p(ifs6_in_pkttoobig, "\t%qu input packet too big error%s\n");
81154263Sshin	p(ifs6_in_echo, "\t%qu input echo request%s\n");
81254263Sshin	p(ifs6_in_echoreply, "\t%qu input echo reply%s\n");
81354263Sshin	p(ifs6_in_routersolicit, "\t%qu input router solicitation%s\n");
81454263Sshin	p(ifs6_in_routeradvert, "\t%qu input router advertisement%s\n");
81554263Sshin	p(ifs6_in_neighborsolicit, "\t%qu input neighbor solicitation%s\n");
81654263Sshin	p(ifs6_in_neighboradvert, "\t%qu input neighbor advertisement%s\n");
81754263Sshin	p(ifs6_in_redirect, "\t%qu input redirect%s\n");
81854263Sshin	p(ifs6_in_mldquery, "\t%qu input MLD query%s\n");
81954263Sshin	p(ifs6_in_mldreport, "\t%qu input MLD report%s\n");
82054263Sshin	p(ifs6_in_mlddone, "\t%qu input MLD done%s\n");
82154263Sshin
82254263Sshin	p(ifs6_out_msg, "\t%qu total output message%s\n");
82354263Sshin	p(ifs6_out_error, "\t%qu total output error message%s\n");
82454263Sshin	p(ifs6_out_dstunreach, "\t%qu output destination unreachable error%s\n");
82554263Sshin	p(ifs6_out_adminprohib, "\t%qu output administratively prohibited error%s\n");
82654263Sshin	p(ifs6_out_timeexceed, "\t%qu output time exceeded error%s\n");
82754263Sshin	p(ifs6_out_paramprob, "\t%qu output parameter problem error%s\n");
82854263Sshin	p(ifs6_out_pkttoobig, "\t%qu output packet too big error%s\n");
82954263Sshin	p(ifs6_out_echo, "\t%qu output echo request%s\n");
83054263Sshin	p(ifs6_out_echoreply, "\t%qu output echo reply%s\n");
83154263Sshin	p(ifs6_out_routersolicit, "\t%qu output router solicitation%s\n");
83254263Sshin	p(ifs6_out_routeradvert, "\t%qu output router advertisement%s\n");
83354263Sshin	p(ifs6_out_neighborsolicit, "\t%qu output neighbor solicitation%s\n");
83454263Sshin	p(ifs6_out_neighboradvert, "\t%qu output neighbor advertisement%s\n");
83554263Sshin	p(ifs6_out_redirect, "\t%qu output redirect%s\n");
83654263Sshin	p(ifs6_out_mldquery, "\t%qu output MLD query%s\n");
83754263Sshin	p(ifs6_out_mldreport, "\t%qu output MLD report%s\n");
83854263Sshin	p(ifs6_out_mlddone, "\t%qu output MLD done%s\n");
83954263Sshin
84054263Sshin  end:
84154263Sshin	close(s);
84254263Sshin#undef p
84354263Sshin}
84454263Sshin
84554263Sshin/*
84654263Sshin * Dump PIM statistics structure.
84754263Sshin */
84854263Sshinvoid
84954263Sshinpim6_stats(off, name)
85054263Sshin	u_long off;
85154263Sshin	char *name;
85254263Sshin{
85354263Sshin	struct pim6stat pim6stat;
85454263Sshin
85554263Sshin	if (off == 0)
85654263Sshin		return;
85754263Sshin	kread(off, (char *)&pim6stat, sizeof(pim6stat));
85854263Sshin	printf("%s:\n", name);
85954263Sshin
86054263Sshin#define	p(f, m) if (pim6stat.f || sflag <= 1) \
86154263Sshin    printf(m, pim6stat.f, plural(pim6stat.f))
86254263Sshin	p(pim6s_rcv_total, "\t%u message%s received\n");
86354263Sshin	p(pim6s_rcv_tooshort, "\t%u message%s received with too few bytes\n");
86454263Sshin	p(pim6s_rcv_badsum, "\t%u message%s received with bad checksum\n");
86554263Sshin	p(pim6s_rcv_badversion, "\t%u message%s received with bad version\n");
86654263Sshin	p(pim6s_rcv_registers, "\t%u register%s received\n");
86754263Sshin	p(pim6s_rcv_badregisters, "\t%u bad register%s received\n");
86854263Sshin	p(pim6s_snd_registers, "\t%u register%s sent\n");
86954263Sshin#undef p
87054263Sshin}
87154263Sshin
87254263Sshin/*
87354263Sshin * Pretty print an Internet address (net address + port).
87454263Sshin * If the nflag was specified, use numbers instead of names.
87554263Sshin */
87654263Sshin#define GETSERVBYPORT6(port, proto, ret)\
87754263Sshin{\
87854263Sshin	if (strcmp((proto), "tcp6") == 0)\
87954263Sshin		(ret) = getservbyport((int)(port), "tcp");\
88054263Sshin	else if (strcmp((proto), "udp6") == 0)\
88154263Sshin		(ret) = getservbyport((int)(port), "udp");\
88254263Sshin	else\
88354263Sshin		(ret) = getservbyport((int)(port), (proto));\
88454263Sshin};
88554263Sshin
88654263Sshinvoid
88754263Sshininet6print(in6, port, proto, numeric)
88854263Sshin	register struct in6_addr *in6;
88954263Sshin	int port;
89054263Sshin	char *proto;
89154263Sshin	int numeric;
89254263Sshin{
89354263Sshin	struct servent *sp = 0;
89454263Sshin	char line[80], *cp;
89554263Sshin	int width;
89654263Sshin
89754263Sshin	sprintf(line, "%.*s.", lflag ? 39 :
89854263Sshin		(Aflag && !numeric) ? 12 : 16, inet6name(in6));
89954263Sshin	cp = index(line, '\0');
90054263Sshin	if (!numeric && port)
90154263Sshin		GETSERVBYPORT6(port, proto, sp);
90254263Sshin	if (sp || port == 0)
90354263Sshin		sprintf(cp, "%.8s", sp ? sp->s_name : "*");
90454263Sshin	else
90554263Sshin		sprintf(cp, "%d", ntohs((u_short)port));
90654263Sshin	width = lflag ? 45 : Aflag ? 18 : 22;
90755533Sshin	printf("%-*.*s ", width, width, line);
90854263Sshin}
90954263Sshin
91054263Sshin/*
91154263Sshin * Construct an Internet address representation.
91254263Sshin * If the nflag has been supplied, give
91354263Sshin * numeric value, otherwise try for symbolic name.
91454263Sshin */
91554263Sshin
91654263Sshinchar *
91754263Sshininet6name(in6p)
91854263Sshin	struct in6_addr *in6p;
91954263Sshin{
92054263Sshin	register char *cp;
92154263Sshin	static char line[50];
92254263Sshin	struct hostent *hp;
92354263Sshin	static char domain[MAXHOSTNAMELEN + 1];
92454263Sshin	static int first = 1;
92554263Sshin
92654263Sshin	if (first && !nflag) {
92754263Sshin		first = 0;
92854263Sshin		if (gethostname(domain, MAXHOSTNAMELEN) == 0 &&
92954263Sshin		    (cp = index(domain, '.')))
93054263Sshin			(void) strcpy(domain, cp + 1);
93154263Sshin		else
93254263Sshin			domain[0] = 0;
93354263Sshin	}
93454263Sshin	cp = 0;
93554263Sshin	if (!nflag && !IN6_IS_ADDR_UNSPECIFIED(in6p)) {
93654263Sshin		hp = gethostbyaddr((char *)in6p, sizeof(*in6p), AF_INET6);
93754263Sshin		if (hp) {
93854263Sshin			if ((cp = index(hp->h_name, '.')) &&
93954263Sshin			    !strcmp(cp + 1, domain))
94054263Sshin				*cp = 0;
94154263Sshin			cp = hp->h_name;
94254263Sshin		}
94354263Sshin	}
94454263Sshin	if (IN6_IS_ADDR_UNSPECIFIED(in6p))
94554263Sshin		strcpy(line, "*");
94654263Sshin	else if (cp)
94754263Sshin		strcpy(line, cp);
94854263Sshin	else
94954263Sshin		sprintf(line, "%s",
95054263Sshin			inet_ntop(AF_INET6, (void *)in6p, ntop_buf,
95154263Sshin				sizeof(ntop_buf)));
95254263Sshin	return (line);
95354263Sshin}
954