inet6.c revision 160787
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
35132671Scharnier#if 0
3654263Sshin#ifndef lint
3754263Sshinstatic char sccsid[] = "@(#)inet6.c	8.4 (Berkeley) 4/20/94";
3854263Sshin#endif /* not lint */
39132671Scharnier#endif
4054263Sshin
41132671Scharnier#include <sys/cdefs.h>
42132671Scharnier__FBSDID("$FreeBSD: head/usr.bin/netstat/inet6.c 160787 2006-07-28 16:09:19Z yar $");
43132671Scharnier
4464342Sume#ifdef INET6
4554263Sshin#include <sys/param.h>
4654263Sshin#include <sys/socket.h>
4754263Sshin#include <sys/socketvar.h>
4854263Sshin#include <sys/ioctl.h>
4954263Sshin#include <sys/mbuf.h>
5054263Sshin#include <sys/protosw.h>
5178064Sume#include <sys/sysctl.h>
5254263Sshin
5354263Sshin#include <net/route.h>
5454263Sshin#include <net/if.h>
5554263Sshin#include <net/if_var.h>
5654263Sshin#include <netinet/in.h>
5754263Sshin#include <netinet/ip6.h>
5854263Sshin#include <netinet/icmp6.h>
5954263Sshin#include <netinet/in_systm.h>
6054263Sshin#include <netinet6/in6_pcb.h>
6154263Sshin#include <netinet6/in6_var.h>
6254263Sshin#include <netinet6/ip6_var.h>
6354263Sshin#include <netinet6/pim6_var.h>
6478064Sume#include <netinet6/raw_ip6.h>
6554263Sshin
6654263Sshin#include <arpa/inet.h>
6754263Sshin#include <netdb.h>
6854263Sshin
69160787Syar#include <stdint.h>
7054263Sshin#include <stdio.h>
71160373Sjulian#include <errno.h>
7254263Sshin#include <string.h>
7354263Sshin#include <unistd.h>
7454263Sshin#include "netstat.h"
7554263Sshin
7654263Sshinstruct	socket sockb;
7754263Sshin
78132671Scharnierchar	*inet6name(struct in6_addr *);
7954263Sshin
8054263Sshinstatic char ntop_buf[INET6_ADDRSTRLEN];
8154263Sshin
82102975Sdwmalonestatic	const char *ip6nh[] = {
8354263Sshin	"hop by hop",
8454263Sshin	"ICMP",
8554263Sshin	"IGMP",
8654263Sshin	"#3",
8754263Sshin	"IP",
8854263Sshin	"#5",
8954263Sshin	"TCP",
9054263Sshin	"#7",
9154263Sshin	"#8",
9254263Sshin	"#9",
9354263Sshin	"#10",
9454263Sshin	"#11",
9554263Sshin	"#12",
9654263Sshin	"#13",
9754263Sshin	"#14",
9854263Sshin	"#15",
9954263Sshin	"#16",
10054263Sshin	"UDP",
10154263Sshin	"#18",
10254263Sshin	"#19",
10354263Sshin	"#20",
10454263Sshin	"#21",
10554263Sshin	"IDP",
10654263Sshin	"#23",
10754263Sshin	"#24",
10854263Sshin	"#25",
10954263Sshin	"#26",
11054263Sshin	"#27",
11154263Sshin	"#28",
11254263Sshin	"TP",
11354263Sshin	"#30",
11454263Sshin	"#31",
11554263Sshin	"#32",
11654263Sshin	"#33",
11754263Sshin	"#34",
11854263Sshin	"#35",
11954263Sshin	"#36",
12054263Sshin	"#37",
12154263Sshin	"#38",
12254263Sshin	"#39",
12354263Sshin	"#40",
12454263Sshin	"IP6",
12554263Sshin	"#42",
12654263Sshin	"routing",
12754263Sshin	"fragment",
12854263Sshin	"#45",
12954263Sshin	"#46",
13054263Sshin	"#47",
13154263Sshin	"#48",
13254263Sshin	"#49",
13354263Sshin	"ESP",
13454263Sshin	"AH",
13554263Sshin	"#52",
13654263Sshin	"#53",
13754263Sshin	"#54",
13854263Sshin	"#55",
13954263Sshin	"#56",
14054263Sshin	"#57",
14154263Sshin	"ICMP6",
14254263Sshin	"no next header",
14354263Sshin	"destination option",
14454263Sshin	"#61",
145125482Sume	"mobility",
14654263Sshin	"#63",
14754263Sshin	"#64",
14854263Sshin	"#65",
14954263Sshin	"#66",
15054263Sshin	"#67",
15154263Sshin	"#68",
15254263Sshin	"#69",
15354263Sshin	"#70",
15454263Sshin	"#71",
15554263Sshin	"#72",
15654263Sshin	"#73",
15754263Sshin	"#74",
15854263Sshin	"#75",
15954263Sshin	"#76",
16054263Sshin	"#77",
16154263Sshin	"#78",
16254263Sshin	"#79",
16354263Sshin	"ISOIP",
16454263Sshin	"#81",
16554263Sshin	"#82",
16654263Sshin	"#83",
16754263Sshin	"#84",
16854263Sshin	"#85",
16954263Sshin	"#86",
17054263Sshin	"#87",
17154263Sshin	"#88",
17262584Sitojun	"OSPF",
17354263Sshin	"#80",
17454263Sshin	"#91",
17554263Sshin	"#92",
17654263Sshin	"#93",
17754263Sshin	"#94",
17854263Sshin	"#95",
17954263Sshin	"#96",
18054263Sshin	"Ethernet",
18154263Sshin	"#98",
18254263Sshin	"#99",
18354263Sshin	"#100",
18454263Sshin	"#101",
18554263Sshin	"#102",
18654263Sshin	"PIM",
18754263Sshin	"#104",
18854263Sshin	"#105",
18954263Sshin	"#106",
19054263Sshin	"#107",
19154263Sshin	"#108",
19254263Sshin	"#109",
19354263Sshin	"#110",
19454263Sshin	"#111",
19554263Sshin	"#112",
19654263Sshin	"#113",
19754263Sshin	"#114",
19854263Sshin	"#115",
19954263Sshin	"#116",
20054263Sshin	"#117",
20154263Sshin	"#118",
20254263Sshin	"#119",
20354263Sshin	"#120",
20454263Sshin	"#121",
20554263Sshin	"#122",
20654263Sshin	"#123",
20754263Sshin	"#124",
20854263Sshin	"#125",
20954263Sshin	"#126",
21054263Sshin	"#127",
21154263Sshin	"#128",
21254263Sshin	"#129",
21354263Sshin	"#130",
21454263Sshin	"#131",
21554263Sshin	"#132",
21654263Sshin	"#133",
21754263Sshin	"#134",
21854263Sshin	"#135",
21954263Sshin	"#136",
22054263Sshin	"#137",
22154263Sshin	"#138",
22254263Sshin	"#139",
22354263Sshin	"#140",
22454263Sshin	"#141",
22554263Sshin	"#142",
22654263Sshin	"#143",
22754263Sshin	"#144",
22854263Sshin	"#145",
22954263Sshin	"#146",
23054263Sshin	"#147",
23154263Sshin	"#148",
23254263Sshin	"#149",
23354263Sshin	"#150",
23454263Sshin	"#151",
23554263Sshin	"#152",
23654263Sshin	"#153",
23754263Sshin	"#154",
23854263Sshin	"#155",
23954263Sshin	"#156",
24054263Sshin	"#157",
24154263Sshin	"#158",
24254263Sshin	"#159",
24354263Sshin	"#160",
24454263Sshin	"#161",
24554263Sshin	"#162",
24654263Sshin	"#163",
24754263Sshin	"#164",
24854263Sshin	"#165",
24954263Sshin	"#166",
25054263Sshin	"#167",
25154263Sshin	"#168",
25254263Sshin	"#169",
25354263Sshin	"#170",
25454263Sshin	"#171",
25554263Sshin	"#172",
25654263Sshin	"#173",
25754263Sshin	"#174",
25854263Sshin	"#175",
25954263Sshin	"#176",
26054263Sshin	"#177",
26154263Sshin	"#178",
26254263Sshin	"#179",
26354263Sshin	"#180",
26454263Sshin	"#181",
26554263Sshin	"#182",
26654263Sshin	"#183",
26754263Sshin	"#184",
26854263Sshin	"#185",
26954263Sshin	"#186",
27054263Sshin	"#187",
27154263Sshin	"#188",
27254263Sshin	"#189",
27354263Sshin	"#180",
27454263Sshin	"#191",
27554263Sshin	"#192",
27654263Sshin	"#193",
27754263Sshin	"#194",
27854263Sshin	"#195",
27954263Sshin	"#196",
28054263Sshin	"#197",
28154263Sshin	"#198",
28254263Sshin	"#199",
28354263Sshin	"#200",
28454263Sshin	"#201",
28554263Sshin	"#202",
28654263Sshin	"#203",
28754263Sshin	"#204",
28854263Sshin	"#205",
28954263Sshin	"#206",
29054263Sshin	"#207",
29154263Sshin	"#208",
29254263Sshin	"#209",
29354263Sshin	"#210",
29454263Sshin	"#211",
29554263Sshin	"#212",
29654263Sshin	"#213",
29754263Sshin	"#214",
29854263Sshin	"#215",
29954263Sshin	"#216",
30054263Sshin	"#217",
30154263Sshin	"#218",
30254263Sshin	"#219",
30354263Sshin	"#220",
30454263Sshin	"#221",
30554263Sshin	"#222",
30654263Sshin	"#223",
30754263Sshin	"#224",
30854263Sshin	"#225",
30954263Sshin	"#226",
31054263Sshin	"#227",
31154263Sshin	"#228",
31254263Sshin	"#229",
31354263Sshin	"#230",
31454263Sshin	"#231",
31554263Sshin	"#232",
31654263Sshin	"#233",
31754263Sshin	"#234",
31854263Sshin	"#235",
31954263Sshin	"#236",
32054263Sshin	"#237",
32154263Sshin	"#238",
32254263Sshin	"#239",
32354263Sshin	"#240",
32454263Sshin	"#241",
32554263Sshin	"#242",
32654263Sshin	"#243",
32754263Sshin	"#244",
32854263Sshin	"#245",
32954263Sshin	"#246",
33054263Sshin	"#247",
33154263Sshin	"#248",
33254263Sshin	"#249",
33354263Sshin	"#250",
33454263Sshin	"#251",
33554263Sshin	"#252",
33654263Sshin	"#253",
33754263Sshin	"#254",
33854263Sshin	"#255",
33954263Sshin};
34054263Sshin
341125483Sumestatic char *srcrule_str[] = {
342125483Sume	"first candidate",
343125483Sume	"same address",
344125483Sume	"appropriate scope",
345125483Sume	"deprecated address",
346125483Sume	"home address",
347125483Sume	"outgoing interface",
348125483Sume	"matching label",
349125483Sume	"public/temporary address",
350125483Sume	"alive interface",
351125483Sume	"preferred interface",
352125483Sume	"rule #10",
353125483Sume	"rule #11",
354125483Sume	"rule #12",
355125483Sume	"rule #13",
356125483Sume	"longest match",
357125483Sume	"rule #15",
358125483Sume};
359125483Sume
36054263Sshin/*
36154263Sshin * Dump IP6 statistics structure.
36254263Sshin */
36354263Sshinvoid
364102975Sdwmaloneip6_stats(u_long off __unused, const char *name, int af1 __unused)
36554263Sshin{
36654263Sshin	struct ip6stat ip6stat;
36754263Sshin	int first, i;
36878931Sume	int mib[4];
36978931Sume	size_t len;
37054263Sshin
37178931Sume	mib[0] = CTL_NET;
37278931Sume	mib[1] = PF_INET6;
37378931Sume	mib[2] = IPPROTO_IPV6;
37478931Sume	mib[3] = IPV6CTL_STATS;
37554263Sshin
37678931Sume	len = sizeof ip6stat;
37778931Sume	memset(&ip6stat, 0, len);
37878931Sume	if (sysctl(mib, 4, &ip6stat, &len, (void *)0, 0) < 0)
37974453Sphk		return;
38054263Sshin	printf("%s:\n", name);
38154263Sshin
38254263Sshin#define	p(f, m) if (ip6stat.f || sflag <= 1) \
383160787Syar    printf(m, (uintmax_t)ip6stat.f, plural(ip6stat.f))
38454263Sshin#define	p1a(f, m) if (ip6stat.f || sflag <= 1) \
385160787Syar    printf(m, (uintmax_t)ip6stat.f)
38654263Sshin
387160787Syar	p(ip6s_total, "\t%ju total packet%s received\n");
388160787Syar	p1a(ip6s_toosmall, "\t%ju with size smaller than minimum\n");
389160787Syar	p1a(ip6s_tooshort, "\t%ju with data size < data length\n");
390160787Syar	p1a(ip6s_badoptions, "\t%ju with bad options\n");
391160787Syar	p1a(ip6s_badvers, "\t%ju with incorrect version number\n");
392160787Syar	p(ip6s_fragments, "\t%ju fragment%s received\n");
393160787Syar	p(ip6s_fragdropped, "\t%ju fragment%s dropped (dup or out of space)\n");
394160787Syar	p(ip6s_fragtimeout, "\t%ju fragment%s dropped after timeout\n");
395160787Syar	p(ip6s_fragoverflow, "\t%ju fragment%s that exceeded limit\n");
396160787Syar	p(ip6s_reassembled, "\t%ju packet%s reassembled ok\n");
397160787Syar	p(ip6s_delivered, "\t%ju packet%s for this host\n");
398160787Syar	p(ip6s_forward, "\t%ju packet%s forwarded\n");
399160787Syar	p(ip6s_cantforward, "\t%ju packet%s not forwardable\n");
400160787Syar	p(ip6s_redirectsent, "\t%ju redirect%s sent\n");
401160787Syar	p(ip6s_localout, "\t%ju packet%s sent from this host\n");
402160787Syar	p(ip6s_rawout, "\t%ju packet%s sent with fabricated ip header\n");
403160787Syar	p(ip6s_odropped, "\t%ju output packet%s dropped due to no bufs, etc.\n");
404160787Syar	p(ip6s_noroute, "\t%ju output packet%s discarded due to no route\n");
405160787Syar	p(ip6s_fragmented, "\t%ju output datagram%s fragmented\n");
406160787Syar	p(ip6s_ofragments, "\t%ju fragment%s created\n");
407160787Syar	p(ip6s_cantfrag, "\t%ju datagram%s that can't be fragmented\n");
408160787Syar	p(ip6s_badscope, "\t%ju packet%s that violated scope rules\n");
409160787Syar	p(ip6s_notmember, "\t%ju multicast packet%s which we don't join\n");
41054263Sshin	for (first = 1, i = 0; i < 256; i++)
41154263Sshin		if (ip6stat.ip6s_nxthist[i] != 0) {
41254263Sshin			if (first) {
41354263Sshin				printf("\tInput histogram:\n");
41454263Sshin				first = 0;
41554263Sshin			}
416160787Syar			printf("\t\t%s: %ju\n", ip6nh[i],
417160787Syar			    (uintmax_t)ip6stat.ip6s_nxthist[i]);
41854263Sshin		}
41954263Sshin	printf("\tMbuf statistics:\n");
420160787Syar	printf("\t\t%ju one mbuf\n", (uintmax_t)ip6stat.ip6s_m1);
42154263Sshin	for (first = 1, i = 0; i < 32; i++) {
42255163Sshin		char ifbuf[IFNAMSIZ];
42354263Sshin		if (ip6stat.ip6s_m2m[i] != 0) {
42454263Sshin			if (first) {
42554263Sshin				printf("\t\ttwo or more mbuf:\n");
42654263Sshin				first = 0;
42754263Sshin			}
428160787Syar			printf("\t\t\t%s= %ju\n",
42962584Sitojun			    if_indextoname(i, ifbuf),
430160787Syar			    (uintmax_t)ip6stat.ip6s_m2m[i]);
43154263Sshin		}
43254263Sshin	}
433160787Syar	printf("\t\t%ju one ext mbuf\n",
434160787Syar	    (uintmax_t)ip6stat.ip6s_mext1);
435160787Syar	printf("\t\t%ju two or more ext mbuf\n",
436160787Syar	    (uintmax_t)ip6stat.ip6s_mext2m);
43762584Sitojun	p(ip6s_exthdrtoolong,
438160787Syar	    "\t%ju packet%s whose headers are not continuous\n");
439160787Syar	p(ip6s_nogif, "\t%ju tunneling packet%s that can't find gif\n");
44062584Sitojun	p(ip6s_toomanyhdr,
441160787Syar	    "\t%ju packet%s discarded because of too many headers\n");
44262584Sitojun
44362584Sitojun	/* for debugging source address selection */
44462584Sitojun#define PRINT_SCOPESTAT(s,i) do {\
44562584Sitojun		switch(i) { /* XXX hardcoding in each case */\
44662584Sitojun		case 1:\
447160787Syar			p(s, "\t\t%ju node-local%s\n");\
44862584Sitojun			break;\
44962584Sitojun		case 2:\
450160787Syar			p(s,"\t\t%ju link-local%s\n");\
45162584Sitojun			break;\
45262584Sitojun		case 5:\
453160787Syar			p(s,"\t\t%ju site-local%s\n");\
45462584Sitojun			break;\
45562584Sitojun		case 14:\
456160787Syar			p(s,"\t\t%ju global%s\n");\
45762584Sitojun			break;\
45862584Sitojun		default:\
459160787Syar			printf("\t\t%ju addresses scope=%x\n",\
460160787Syar			    (uintmax_t)ip6stat.s, i);\
46162584Sitojun		}\
46262584Sitojun	} while (0);
46362584Sitojun
46462584Sitojun	p(ip6s_sources_none,
465160787Syar	  "\t%ju failure%s of source address selection\n");
46662584Sitojun	for (first = 1, i = 0; i < 16; i++) {
46762584Sitojun		if (ip6stat.ip6s_sources_sameif[i]) {
46862584Sitojun			if (first) {
46962584Sitojun				printf("\tsource addresses on an outgoing I/F\n");
47062584Sitojun				first = 0;
47162584Sitojun			}
47262584Sitojun			PRINT_SCOPESTAT(ip6s_sources_sameif[i], i);
47362584Sitojun		}
47462584Sitojun	}
47562584Sitojun	for (first = 1, i = 0; i < 16; i++) {
47662584Sitojun		if (ip6stat.ip6s_sources_otherif[i]) {
47762584Sitojun			if (first) {
47862584Sitojun				printf("\tsource addresses on a non-outgoing I/F\n");
47962584Sitojun				first = 0;
48062584Sitojun			}
48162584Sitojun			PRINT_SCOPESTAT(ip6s_sources_otherif[i], i);
48262584Sitojun		}
48362584Sitojun	}
48462584Sitojun	for (first = 1, i = 0; i < 16; i++) {
48562584Sitojun		if (ip6stat.ip6s_sources_samescope[i]) {
48662584Sitojun			if (first) {
48762584Sitojun				printf("\tsource addresses of same scope\n");
48862584Sitojun				first = 0;
48962584Sitojun			}
49062584Sitojun			PRINT_SCOPESTAT(ip6s_sources_samescope[i], i);
49162584Sitojun		}
49262584Sitojun	}
49362584Sitojun	for (first = 1, i = 0; i < 16; i++) {
49462584Sitojun		if (ip6stat.ip6s_sources_otherscope[i]) {
49562584Sitojun			if (first) {
49662584Sitojun				printf("\tsource addresses of a different scope\n");
49762584Sitojun				first = 0;
49862584Sitojun			}
49962584Sitojun			PRINT_SCOPESTAT(ip6s_sources_otherscope[i], i);
50062584Sitojun		}
50162584Sitojun	}
50262584Sitojun	for (first = 1, i = 0; i < 16; i++) {
50362584Sitojun		if (ip6stat.ip6s_sources_deprecated[i]) {
50462584Sitojun			if (first) {
50562584Sitojun				printf("\tdeprecated source addresses\n");
50662584Sitojun				first = 0;
50762584Sitojun			}
50862584Sitojun			PRINT_SCOPESTAT(ip6s_sources_deprecated[i], i);
50962584Sitojun		}
51062584Sitojun	}
51162584Sitojun
512160787Syar	p1a(ip6s_forward_cachehit, "\t%ju forward cache hit\n");
513160787Syar	p1a(ip6s_forward_cachemiss, "\t%ju forward cache miss\n");
514125483Sume	printf("\tSource addresses selection rule applied:\n");
515125483Sume	for (i = 0; i < 16; i++) {
516125483Sume		if (ip6stat.ip6s_sources_rule[i])
517160787Syar			printf("\t\t%ju %s\n",
518160787Syar			       (uintmax_t)ip6stat.ip6s_sources_rule[i],
519125483Sume			       srcrule_str[i]);
520125483Sume	}
52154263Sshin#undef p
52262584Sitojun#undef p1a
52354263Sshin}
52454263Sshin
52554263Sshin/*
52654263Sshin * Dump IPv6 per-interface statistics based on RFC 2465.
52754263Sshin */
52854263Sshinvoid
52978314Sassarip6_ifstats(char *ifname)
53054263Sshin{
53154263Sshin	struct in6_ifreq ifr;
53254263Sshin	int s;
53354263Sshin#define	p(f, m) if (ifr.ifr_ifru.ifru_stat.f || sflag <= 1) \
534160787Syar    printf(m, (uintmax_t)ifr.ifr_ifru.ifru_stat.f, plural(ifr.ifr_ifru.ifru_stat.f))
53554263Sshin#define	p_5(f, m) if (ifr.ifr_ifru.ifru_stat.f || sflag <= 1) \
536160787Syar    printf(m, (uintmax_t)ip6stat.f)
53754263Sshin
53854263Sshin	if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
53954263Sshin		perror("Warning: socket(AF_INET6)");
54054263Sshin		return;
54154263Sshin	}
54254263Sshin
54354263Sshin	strcpy(ifr.ifr_name, ifname);
54454263Sshin	printf("ip6 on %s:\n", ifr.ifr_name);
54554263Sshin
54654263Sshin	if (ioctl(s, SIOCGIFSTAT_IN6, (char *)&ifr) < 0) {
54754263Sshin		perror("Warning: ioctl(SIOCGIFSTAT_IN6)");
54854263Sshin		goto end;
54954263Sshin	}
55054263Sshin
551160787Syar	p(ifs6_in_receive, "\t%ju total input datagram%s\n");
552160787Syar	p(ifs6_in_hdrerr, "\t%ju datagram%s with invalid header received\n");
553160787Syar	p(ifs6_in_toobig, "\t%ju datagram%s exceeded MTU received\n");
554160787Syar	p(ifs6_in_noroute, "\t%ju datagram%s with no route received\n");
555160787Syar	p(ifs6_in_addrerr, "\t%ju datagram%s with invalid dst received\n");
556160787Syar	p(ifs6_in_protounknown, "\t%ju datagram%s with unknown proto received\n");
557160787Syar	p(ifs6_in_truncated, "\t%ju truncated datagram%s received\n");
558160787Syar	p(ifs6_in_discard, "\t%ju input datagram%s discarded\n");
55954263Sshin	p(ifs6_in_deliver,
560160787Syar	  "\t%ju datagram%s delivered to an upper layer protocol\n");
561160787Syar	p(ifs6_out_forward, "\t%ju datagram%s forwarded to this interface\n");
56254263Sshin	p(ifs6_out_request,
563160787Syar	  "\t%ju datagram%s sent from an upper layer protocol\n");
564160787Syar	p(ifs6_out_discard, "\t%ju total discarded output datagram%s\n");
565160787Syar	p(ifs6_out_fragok, "\t%ju output datagram%s fragmented\n");
566160787Syar	p(ifs6_out_fragfail, "\t%ju output datagram%s failed on fragment\n");
567160787Syar	p(ifs6_out_fragcreat, "\t%ju output datagram%s succeeded on fragment\n");
568160787Syar	p(ifs6_reass_reqd, "\t%ju incoming datagram%s fragmented\n");
569160787Syar	p(ifs6_reass_ok, "\t%ju datagram%s reassembled\n");
570160787Syar	p(ifs6_reass_fail, "\t%ju datagram%s failed on reassembly\n");
571160787Syar	p(ifs6_in_mcast, "\t%ju multicast datagram%s received\n");
572160787Syar	p(ifs6_out_mcast, "\t%ju multicast datagram%s sent\n");
57354263Sshin
57454263Sshin  end:
57554263Sshin	close(s);
57654263Sshin
57754263Sshin#undef p
57854263Sshin#undef p_5
57954263Sshin}
58054263Sshin
581102975Sdwmalonestatic	const char *icmp6names[] = {
58254263Sshin	"#0",
58354263Sshin	"unreach",
58454263Sshin	"packet too big",
58554263Sshin	"time exceed",
58654263Sshin	"parameter problem",
58754263Sshin	"#5",
58854263Sshin	"#6",
58954263Sshin	"#7",
59054263Sshin	"#8",
59154263Sshin	"#9",
59254263Sshin	"#10",
59354263Sshin	"#11",
59454263Sshin	"#12",
59554263Sshin	"#13",
59654263Sshin	"#14",
59754263Sshin	"#15",
59854263Sshin	"#16",
59954263Sshin	"#17",
60054263Sshin	"#18",
60154263Sshin	"#19",
60254263Sshin	"#20",
60354263Sshin	"#21",
60454263Sshin	"#22",
60554263Sshin	"#23",
60654263Sshin	"#24",
60754263Sshin	"#25",
60854263Sshin	"#26",
60954263Sshin	"#27",
61054263Sshin	"#28",
61154263Sshin	"#29",
61254263Sshin	"#30",
61354263Sshin	"#31",
61454263Sshin	"#32",
61554263Sshin	"#33",
61654263Sshin	"#34",
61754263Sshin	"#35",
61854263Sshin	"#36",
61954263Sshin	"#37",
62054263Sshin	"#38",
62154263Sshin	"#39",
62254263Sshin	"#40",
62354263Sshin	"#41",
62454263Sshin	"#42",
62554263Sshin	"#43",
62654263Sshin	"#44",
62754263Sshin	"#45",
62854263Sshin	"#46",
62954263Sshin	"#47",
63054263Sshin	"#48",
63154263Sshin	"#49",
63254263Sshin	"#50",
63354263Sshin	"#51",
63454263Sshin	"#52",
63554263Sshin	"#53",
63654263Sshin	"#54",
63754263Sshin	"#55",
63854263Sshin	"#56",
63954263Sshin	"#57",
64054263Sshin	"#58",
64154263Sshin	"#59",
64254263Sshin	"#60",
64354263Sshin	"#61",
64454263Sshin	"#62",
64554263Sshin	"#63",
64654263Sshin	"#64",
64754263Sshin	"#65",
64854263Sshin	"#66",
64954263Sshin	"#67",
65054263Sshin	"#68",
65154263Sshin	"#69",
65254263Sshin	"#70",
65354263Sshin	"#71",
65454263Sshin	"#72",
65554263Sshin	"#73",
65654263Sshin	"#74",
65754263Sshin	"#75",
65854263Sshin	"#76",
65954263Sshin	"#77",
66054263Sshin	"#78",
66154263Sshin	"#79",
66254263Sshin	"#80",
66354263Sshin	"#81",
66454263Sshin	"#82",
66554263Sshin	"#83",
66654263Sshin	"#84",
66754263Sshin	"#85",
66854263Sshin	"#86",
66954263Sshin	"#87",
67054263Sshin	"#88",
67154263Sshin	"#89",
67254263Sshin	"#80",
67354263Sshin	"#91",
67454263Sshin	"#92",
67554263Sshin	"#93",
67654263Sshin	"#94",
67754263Sshin	"#95",
67854263Sshin	"#96",
67954263Sshin	"#97",
68054263Sshin	"#98",
68154263Sshin	"#99",
68254263Sshin	"#100",
68354263Sshin	"#101",
68454263Sshin	"#102",
68554263Sshin	"#103",
68654263Sshin	"#104",
68754263Sshin	"#105",
68854263Sshin	"#106",
68954263Sshin	"#107",
69054263Sshin	"#108",
69154263Sshin	"#109",
69254263Sshin	"#110",
69354263Sshin	"#111",
69454263Sshin	"#112",
69554263Sshin	"#113",
69654263Sshin	"#114",
69754263Sshin	"#115",
69854263Sshin	"#116",
69954263Sshin	"#117",
70054263Sshin	"#118",
70154263Sshin	"#119",
70254263Sshin	"#120",
70354263Sshin	"#121",
70454263Sshin	"#122",
70554263Sshin	"#123",
70654263Sshin	"#124",
70754263Sshin	"#125",
70854263Sshin	"#126",
70954263Sshin	"#127",
71054263Sshin	"echo",
71154263Sshin	"echo reply",
71254263Sshin	"multicast listener query",
71354263Sshin	"multicast listener report",
71454263Sshin	"multicast listener done",
71554263Sshin	"router solicitation",
71677565Sdd	"router advertisement",
71754263Sshin	"neighbor solicitation",
71877565Sdd	"neighbor advertisement",
71954263Sshin	"redirect",
72054263Sshin	"router renumbering",
72154263Sshin	"node information request",
72254263Sshin	"node information reply",
72378540Ssumikawa	"inverse neighbor solicitation",
72478540Ssumikawa	"inverse neighbor advertisement",
72554263Sshin	"#143",
72654263Sshin	"#144",
72754263Sshin	"#145",
72854263Sshin	"#146",
72954263Sshin	"#147",
73054263Sshin	"#148",
73154263Sshin	"#149",
73254263Sshin	"#150",
73354263Sshin	"#151",
73454263Sshin	"#152",
73554263Sshin	"#153",
73654263Sshin	"#154",
73754263Sshin	"#155",
73854263Sshin	"#156",
73954263Sshin	"#157",
74054263Sshin	"#158",
74154263Sshin	"#159",
74254263Sshin	"#160",
74354263Sshin	"#161",
74454263Sshin	"#162",
74554263Sshin	"#163",
74654263Sshin	"#164",
74754263Sshin	"#165",
74854263Sshin	"#166",
74954263Sshin	"#167",
75054263Sshin	"#168",
75154263Sshin	"#169",
75254263Sshin	"#170",
75354263Sshin	"#171",
75454263Sshin	"#172",
75554263Sshin	"#173",
75654263Sshin	"#174",
75754263Sshin	"#175",
75854263Sshin	"#176",
75954263Sshin	"#177",
76054263Sshin	"#178",
76154263Sshin	"#179",
76254263Sshin	"#180",
76354263Sshin	"#181",
76454263Sshin	"#182",
76554263Sshin	"#183",
76654263Sshin	"#184",
76754263Sshin	"#185",
76854263Sshin	"#186",
76954263Sshin	"#187",
77054263Sshin	"#188",
77154263Sshin	"#189",
77254263Sshin	"#180",
77354263Sshin	"#191",
77454263Sshin	"#192",
77554263Sshin	"#193",
77654263Sshin	"#194",
77754263Sshin	"#195",
77854263Sshin	"#196",
77954263Sshin	"#197",
78054263Sshin	"#198",
78154263Sshin	"#199",
78254263Sshin	"#200",
78354263Sshin	"#201",
78454263Sshin	"#202",
78554263Sshin	"#203",
78654263Sshin	"#204",
78754263Sshin	"#205",
78854263Sshin	"#206",
78954263Sshin	"#207",
79054263Sshin	"#208",
79154263Sshin	"#209",
79254263Sshin	"#210",
79354263Sshin	"#211",
79454263Sshin	"#212",
79554263Sshin	"#213",
79654263Sshin	"#214",
79754263Sshin	"#215",
79854263Sshin	"#216",
79954263Sshin	"#217",
80054263Sshin	"#218",
80154263Sshin	"#219",
80254263Sshin	"#220",
80354263Sshin	"#221",
80454263Sshin	"#222",
80554263Sshin	"#223",
80654263Sshin	"#224",
80754263Sshin	"#225",
80854263Sshin	"#226",
80954263Sshin	"#227",
81054263Sshin	"#228",
81154263Sshin	"#229",
81254263Sshin	"#230",
81354263Sshin	"#231",
81454263Sshin	"#232",
81554263Sshin	"#233",
81654263Sshin	"#234",
81754263Sshin	"#235",
81854263Sshin	"#236",
81954263Sshin	"#237",
82054263Sshin	"#238",
82154263Sshin	"#239",
82254263Sshin	"#240",
82354263Sshin	"#241",
82454263Sshin	"#242",
82554263Sshin	"#243",
82654263Sshin	"#244",
82754263Sshin	"#245",
82854263Sshin	"#246",
82954263Sshin	"#247",
83054263Sshin	"#248",
83154263Sshin	"#249",
83254263Sshin	"#250",
83354263Sshin	"#251",
83454263Sshin	"#252",
83554263Sshin	"#253",
83654263Sshin	"#254",
83754263Sshin	"#255",
83854263Sshin};
83954263Sshin
84054263Sshin/*
84154263Sshin * Dump ICMP6 statistics.
84254263Sshin */
84354263Sshinvoid
844102975Sdwmaloneicmp6_stats(u_long off __unused, const char *name, int af1 __unused)
84554263Sshin{
84654263Sshin	struct icmp6stat icmp6stat;
84795637Smarkm	int i, first;
84878931Sume	int mib[4];
84978931Sume	size_t len;
85054263Sshin
85178931Sume	mib[0] = CTL_NET;
85278931Sume	mib[1] = PF_INET6;
85378931Sume	mib[2] = IPPROTO_ICMPV6;
85478931Sume	mib[3] = ICMPV6CTL_STATS;
85578931Sume
85678931Sume	len = sizeof icmp6stat;
85778931Sume	memset(&icmp6stat, 0, len);
85878931Sume	if (sysctl(mib, 4, &icmp6stat, &len, (void *)0, 0) < 0)
85954263Sshin		return;
86054263Sshin	printf("%s:\n", name);
86154263Sshin
86254263Sshin#define	p(f, m) if (icmp6stat.f || sflag <= 1) \
863160787Syar    printf(m, (uintmax_t)icmp6stat.f, plural(icmp6stat.f))
864160787Syar#define p_5(f, m) printf(m, (uintmax_t)icmp6stat.f)
86554263Sshin
866160787Syar	p(icp6s_error, "\t%ju call%s to icmp6_error\n");
86754263Sshin	p(icp6s_canterror,
868160787Syar	    "\t%ju error%s not generated in response to an icmp6 message\n");
86954263Sshin	p(icp6s_toofreq,
870160787Syar	  "\t%ju error%s not generated because of rate limitation\n");
87195637Smarkm#define NELEM (int)(sizeof(icmp6stat.icp6s_outhist)/sizeof(icmp6stat.icp6s_outhist[0]))
87278540Ssumikawa	for (first = 1, i = 0; i < NELEM; i++)
87354263Sshin		if (icmp6stat.icp6s_outhist[i] != 0) {
87454263Sshin			if (first) {
87554263Sshin				printf("\tOutput histogram:\n");
87654263Sshin				first = 0;
87754263Sshin			}
878160787Syar			printf("\t\t%s: %ju\n", icmp6names[i],
879160787Syar			    (uintmax_t)icmp6stat.icp6s_outhist[i]);
88054263Sshin		}
88178540Ssumikawa#undef NELEM
882160787Syar	p(icp6s_badcode, "\t%ju message%s with bad code fields\n");
883160787Syar	p(icp6s_tooshort, "\t%ju message%s < minimum length\n");
884160787Syar	p(icp6s_checksum, "\t%ju bad checksum%s\n");
885160787Syar	p(icp6s_badlen, "\t%ju message%s with bad length\n");
88695637Smarkm#define NELEM (int)(sizeof(icmp6stat.icp6s_inhist)/sizeof(icmp6stat.icp6s_inhist[0]))
88778540Ssumikawa	for (first = 1, i = 0; i < NELEM; i++)
88854263Sshin		if (icmp6stat.icp6s_inhist[i] != 0) {
88954263Sshin			if (first) {
89054263Sshin				printf("\tInput histogram:\n");
89154263Sshin				first = 0;
89254263Sshin			}
893160787Syar			printf("\t\t%s: %ju\n", icmp6names[i],
894160787Syar			    (uintmax_t)icmp6stat.icp6s_inhist[i]);
89554263Sshin		}
89678540Ssumikawa#undef NELEM
89777565Sdd	printf("\tHistogram of error messages to be generated:\n");
898160787Syar	p_5(icp6s_odst_unreach_noroute, "\t\t%ju no route\n");
899160787Syar	p_5(icp6s_odst_unreach_admin, "\t\t%ju administratively prohibited\n");
900160787Syar	p_5(icp6s_odst_unreach_beyondscope, "\t\t%ju beyond scope\n");
901160787Syar	p_5(icp6s_odst_unreach_addr, "\t\t%ju address unreachable\n");
902160787Syar	p_5(icp6s_odst_unreach_noport, "\t\t%ju port unreachable\n");
903160787Syar	p_5(icp6s_opacket_too_big, "\t\t%ju packet too big\n");
904160787Syar	p_5(icp6s_otime_exceed_transit, "\t\t%ju time exceed transit\n");
905160787Syar	p_5(icp6s_otime_exceed_reassembly, "\t\t%ju time exceed reassembly\n");
906160787Syar	p_5(icp6s_oparamprob_header, "\t\t%ju erroneous header field\n");
907160787Syar	p_5(icp6s_oparamprob_nextheader, "\t\t%ju unrecognized next header\n");
908160787Syar	p_5(icp6s_oparamprob_option, "\t\t%ju unrecognized option\n");
909160787Syar	p_5(icp6s_oredirect, "\t\t%ju redirect\n");
910160787Syar	p_5(icp6s_ounknown, "\t\t%ju unknown\n");
91162584Sitojun
912160787Syar	p(icp6s_reflect, "\t%ju message response%s generated\n");
913160787Syar	p(icp6s_nd_toomanyopt, "\t%ju message%s with too many ND options\n");
914160787Syar	p(icp6s_nd_badopt, "\t%ju message%s with bad ND options\n");
915160787Syar	p(icp6s_badns, "\t%ju bad neighbor solicitation message%s\n");
916160787Syar	p(icp6s_badna, "\t%ju bad neighbor advertisement message%s\n");
917160787Syar	p(icp6s_badrs, "\t%ju bad router solicitation message%s\n");
918160787Syar	p(icp6s_badra, "\t%ju bad router advertisement message%s\n");
919160787Syar	p(icp6s_badredirect, "\t%ju bad redirect message%s\n");
920160787Syar	p(icp6s_pmtuchg, "\t%ju path MTU change%s\n");
92154263Sshin#undef p
92254263Sshin#undef p_5
92354263Sshin}
92454263Sshin
92554263Sshin/*
92654263Sshin * Dump ICMPv6 per-interface statistics based on RFC 2466.
92754263Sshin */
92854263Sshinvoid
92978314Sassaricmp6_ifstats(char *ifname)
93054263Sshin{
93154263Sshin	struct in6_ifreq ifr;
93254263Sshin	int s;
93354263Sshin#define	p(f, m) if (ifr.ifr_ifru.ifru_icmp6stat.f || sflag <= 1) \
934160787Syar    printf(m, (uintmax_t)ifr.ifr_ifru.ifru_icmp6stat.f, plural(ifr.ifr_ifru.ifru_icmp6stat.f))
935109234Smtm#define	p2(f, m) if (ifr.ifr_ifru.ifru_icmp6stat.f || sflag <= 1) \
936160787Syar    printf(m, (uintmax_t)ifr.ifr_ifru.ifru_icmp6stat.f, pluralies(ifr.ifr_ifru.ifru_icmp6stat.f))
93754263Sshin
93854263Sshin	if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
93954263Sshin		perror("Warning: socket(AF_INET6)");
94054263Sshin		return;
94154263Sshin	}
94254263Sshin
94354263Sshin	strcpy(ifr.ifr_name, ifname);
94454263Sshin	printf("icmp6 on %s:\n", ifr.ifr_name);
94554263Sshin
94654263Sshin	if (ioctl(s, SIOCGIFSTAT_ICMP6, (char *)&ifr) < 0) {
94754263Sshin		perror("Warning: ioctl(SIOCGIFSTAT_ICMP6)");
94854263Sshin		goto end;
94954263Sshin	}
95054263Sshin
951160787Syar	p(ifs6_in_msg, "\t%ju total input message%s\n");
952160787Syar	p(ifs6_in_error, "\t%ju total input error message%s\n");
953160787Syar	p(ifs6_in_dstunreach, "\t%ju input destination unreachable error%s\n");
954160787Syar	p(ifs6_in_adminprohib, "\t%ju input administratively prohibited error%s\n");
955160787Syar	p(ifs6_in_timeexceed, "\t%ju input time exceeded error%s\n");
956160787Syar	p(ifs6_in_paramprob, "\t%ju input parameter problem error%s\n");
957160787Syar	p(ifs6_in_pkttoobig, "\t%ju input packet too big error%s\n");
958160787Syar	p(ifs6_in_echo, "\t%ju input echo request%s\n");
959160787Syar	p2(ifs6_in_echoreply, "\t%ju input echo repl%s\n");
960160787Syar	p(ifs6_in_routersolicit, "\t%ju input router solicitation%s\n");
961160787Syar	p(ifs6_in_routeradvert, "\t%ju input router advertisement%s\n");
962160787Syar	p(ifs6_in_neighborsolicit, "\t%ju input neighbor solicitation%s\n");
963160787Syar	p(ifs6_in_neighboradvert, "\t%ju input neighbor advertisement%s\n");
964160787Syar	p(ifs6_in_redirect, "\t%ju input redirect%s\n");
965160787Syar	p2(ifs6_in_mldquery, "\t%ju input MLD quer%s\n");
966160787Syar	p(ifs6_in_mldreport, "\t%ju input MLD report%s\n");
967160787Syar	p(ifs6_in_mlddone, "\t%ju input MLD done%s\n");
96854263Sshin
969160787Syar	p(ifs6_out_msg, "\t%ju total output message%s\n");
970160787Syar	p(ifs6_out_error, "\t%ju total output error message%s\n");
971160787Syar	p(ifs6_out_dstunreach, "\t%ju output destination unreachable error%s\n");
972160787Syar	p(ifs6_out_adminprohib, "\t%ju output administratively prohibited error%s\n");
973160787Syar	p(ifs6_out_timeexceed, "\t%ju output time exceeded error%s\n");
974160787Syar	p(ifs6_out_paramprob, "\t%ju output parameter problem error%s\n");
975160787Syar	p(ifs6_out_pkttoobig, "\t%ju output packet too big error%s\n");
976160787Syar	p(ifs6_out_echo, "\t%ju output echo request%s\n");
977160787Syar	p2(ifs6_out_echoreply, "\t%ju output echo repl%s\n");
978160787Syar	p(ifs6_out_routersolicit, "\t%ju output router solicitation%s\n");
979160787Syar	p(ifs6_out_routeradvert, "\t%ju output router advertisement%s\n");
980160787Syar	p(ifs6_out_neighborsolicit, "\t%ju output neighbor solicitation%s\n");
981160787Syar	p(ifs6_out_neighboradvert, "\t%ju output neighbor advertisement%s\n");
982160787Syar	p(ifs6_out_redirect, "\t%ju output redirect%s\n");
983160787Syar	p2(ifs6_out_mldquery, "\t%ju output MLD quer%s\n");
984160787Syar	p(ifs6_out_mldreport, "\t%ju output MLD report%s\n");
985160787Syar	p(ifs6_out_mlddone, "\t%ju output MLD done%s\n");
98654263Sshin
98754263Sshin  end:
98854263Sshin	close(s);
98954263Sshin#undef p
99054263Sshin}
99154263Sshin
99254263Sshin/*
99354263Sshin * Dump PIM statistics structure.
99454263Sshin */
99554263Sshinvoid
996102975Sdwmalonepim6_stats(u_long off __unused, const char *name, int af1 __unused)
99754263Sshin{
99854263Sshin	struct pim6stat pim6stat;
99954263Sshin
100054263Sshin	if (off == 0)
100154263Sshin		return;
1002125482Sume	if (kread(off, (char *)&pim6stat, sizeof(pim6stat)))
1003125482Sume		return;
100454263Sshin	printf("%s:\n", name);
100554263Sshin
100654263Sshin#define	p(f, m) if (pim6stat.f || sflag <= 1) \
1007160787Syar    printf(m, (uintmax_t)pim6stat.f, plural(pim6stat.f))
1008160787Syar	p(pim6s_rcv_total, "\t%ju message%s received\n");
1009160787Syar	p(pim6s_rcv_tooshort, "\t%ju message%s received with too few bytes\n");
1010160787Syar	p(pim6s_rcv_badsum, "\t%ju message%s received with bad checksum\n");
1011160787Syar	p(pim6s_rcv_badversion, "\t%ju message%s received with bad version\n");
1012160787Syar	p(pim6s_rcv_registers, "\t%ju register%s received\n");
1013160787Syar	p(pim6s_rcv_badregisters, "\t%ju bad register%s received\n");
1014160787Syar	p(pim6s_snd_registers, "\t%ju register%s sent\n");
101554263Sshin#undef p
101654263Sshin}
101754263Sshin
101854263Sshin/*
101978064Sume * Dump raw ip6 statistics structure.
102078064Sume */
102178064Sumevoid
1022102975Sdwmalonerip6_stats(u_long off __unused, const char *name, int af1 __unused)
102378064Sume{
102478064Sume	struct rip6stat rip6stat;
102578064Sume	u_quad_t delivered;
102678064Sume	int mib[4];
102778064Sume	size_t l;
102878064Sume
102978064Sume	mib[0] = CTL_NET;
103078064Sume	mib[1] = PF_INET6;
103178064Sume	mib[2] = IPPROTO_IPV6;
103278064Sume	mib[3] = IPV6CTL_RIP6STATS;
103378064Sume	l = sizeof(rip6stat);
103478064Sume	if (sysctl(mib, 4, &rip6stat, &l, NULL, 0) < 0) {
1035160373Sjulian		/* Just shut up if the kernel doesn't have ipv6. */
1036160373Sjulian		if (errno != ENOENT)
1037160373Sjulian			perror("Warning: sysctl(net.inet6.ip6.rip6stats)");
103878064Sume		return;
103978064Sume	}
104078064Sume
104178064Sume	printf("%s:\n", name);
104278064Sume
104378064Sume#define	p(f, m) if (rip6stat.f || sflag <= 1) \
1044160787Syar    printf(m, (uintmax_t)rip6stat.f, plural(rip6stat.f))
1045160787Syar	p(rip6s_ipackets, "\t%ju message%s received\n");
1046160787Syar	p(rip6s_isum, "\t%ju checksum calcuration%s on inbound\n");
1047160787Syar	p(rip6s_badsum, "\t%ju message%s with bad checksum\n");
1048160787Syar	p(rip6s_nosock, "\t%ju message%s dropped due to no socket\n");
104978064Sume	p(rip6s_nosockmcast,
1050160787Syar	    "\t%ju multicast message%s dropped due to no socket\n");
105178064Sume	p(rip6s_fullsock,
1052160787Syar	    "\t%ju message%s dropped due to full socket buffers\n");
105378064Sume	delivered = rip6stat.rip6s_ipackets -
105478064Sume		    rip6stat.rip6s_badsum -
105578064Sume		    rip6stat.rip6s_nosock -
105678064Sume		    rip6stat.rip6s_nosockmcast -
105778064Sume		    rip6stat.rip6s_fullsock;
105878064Sume	if (delivered || sflag <= 1)
1059160787Syar		printf("\t%ju delivered\n", (uintmax_t)delivered);
1060160787Syar	p(rip6s_opackets, "\t%ju datagram%s output\n");
106178064Sume#undef p
106278064Sume}
106378064Sume
106478064Sume/*
106554263Sshin * Pretty print an Internet address (net address + port).
106678238Sassar * Take numeric_addr and numeric_port into consideration.
106754263Sshin */
106854263Sshin#define GETSERVBYPORT6(port, proto, ret)\
106954263Sshin{\
107054263Sshin	if (strcmp((proto), "tcp6") == 0)\
107154263Sshin		(ret) = getservbyport((int)(port), "tcp");\
107254263Sshin	else if (strcmp((proto), "udp6") == 0)\
107354263Sshin		(ret) = getservbyport((int)(port), "udp");\
107454263Sshin	else\
107554263Sshin		(ret) = getservbyport((int)(port), (proto));\
107654263Sshin};
107754263Sshin
107854263Sshinvoid
1079102975Sdwmaloneinet6print(struct in6_addr *in6, int port, const char *proto, int numeric)
108054263Sshin{
108154263Sshin	struct servent *sp = 0;
108254263Sshin	char line[80], *cp;
108354263Sshin	int width;
108454263Sshin
108583200Sru	sprintf(line, "%.*s.", Wflag ? 39 :
108654263Sshin		(Aflag && !numeric) ? 12 : 16, inet6name(in6));
108754263Sshin	cp = index(line, '\0');
108854263Sshin	if (!numeric && port)
108954263Sshin		GETSERVBYPORT6(port, proto, sp);
109054263Sshin	if (sp || port == 0)
109154263Sshin		sprintf(cp, "%.8s", sp ? sp->s_name : "*");
109254263Sshin	else
109354263Sshin		sprintf(cp, "%d", ntohs((u_short)port));
109483200Sru	width = Wflag ? 45 : Aflag ? 18 : 22;
109555533Sshin	printf("%-*.*s ", width, width, line);
109654263Sshin}
109754263Sshin
109854263Sshin/*
109954263Sshin * Construct an Internet address representation.
110078238Sassar * If the numeric_addr has been supplied, give
110154263Sshin * numeric value, otherwise try for symbolic name.
110254263Sshin */
110354263Sshin
110454263Sshinchar *
110578314Sassarinet6name(struct in6_addr *in6p)
110654263Sshin{
1107102975Sdwmalone	char *cp;
110854263Sshin	static char line[50];
110954263Sshin	struct hostent *hp;
111074262Sbrian	static char domain[MAXHOSTNAMELEN];
111154263Sshin	static int first = 1;
111254263Sshin
111378238Sassar	if (first && !numeric_addr) {
111454263Sshin		first = 0;
111554263Sshin		if (gethostname(domain, MAXHOSTNAMELEN) == 0 &&
111654263Sshin		    (cp = index(domain, '.')))
111754263Sshin			(void) strcpy(domain, cp + 1);
111854263Sshin		else
111954263Sshin			domain[0] = 0;
112054263Sshin	}
112154263Sshin	cp = 0;
112278238Sassar	if (!numeric_addr && !IN6_IS_ADDR_UNSPECIFIED(in6p)) {
112354263Sshin		hp = gethostbyaddr((char *)in6p, sizeof(*in6p), AF_INET6);
112454263Sshin		if (hp) {
112554263Sshin			if ((cp = index(hp->h_name, '.')) &&
112654263Sshin			    !strcmp(cp + 1, domain))
112754263Sshin				*cp = 0;
112854263Sshin			cp = hp->h_name;
112954263Sshin		}
113054263Sshin	}
113154263Sshin	if (IN6_IS_ADDR_UNSPECIFIED(in6p))
113254263Sshin		strcpy(line, "*");
113354263Sshin	else if (cp)
113454263Sshin		strcpy(line, cp);
113554263Sshin	else
113654263Sshin		sprintf(line, "%s",
113754263Sshin			inet_ntop(AF_INET6, (void *)in6p, ntop_buf,
113854263Sshin				sizeof(ntop_buf)));
113954263Sshin	return (line);
114054263Sshin}
114164342Sume#endif /*INET6*/
1142