1*66dfcc85SDavid van Moolenbroek /* $NetBSD: inet6.c,v 1.68 2015/02/08 15:09:45 christos Exp $ */
2*66dfcc85SDavid van Moolenbroek /* BSDI inet.c,v 2.3 1995/10/24 02:19:29 prb Exp */
3*66dfcc85SDavid van Moolenbroek
4*66dfcc85SDavid van Moolenbroek /*
5*66dfcc85SDavid van Moolenbroek * Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project.
6*66dfcc85SDavid van Moolenbroek * All rights reserved.
7*66dfcc85SDavid van Moolenbroek *
8*66dfcc85SDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without
9*66dfcc85SDavid van Moolenbroek * modification, are permitted provided that the following conditions
10*66dfcc85SDavid van Moolenbroek * are met:
11*66dfcc85SDavid van Moolenbroek * 1. Redistributions of source code must retain the above copyright
12*66dfcc85SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer.
13*66dfcc85SDavid van Moolenbroek * 2. Redistributions in binary form must reproduce the above copyright
14*66dfcc85SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer in the
15*66dfcc85SDavid van Moolenbroek * documentation and/or other materials provided with the distribution.
16*66dfcc85SDavid van Moolenbroek * 3. Neither the name of the project nor the names of its contributors
17*66dfcc85SDavid van Moolenbroek * may be used to endorse or promote products derived from this software
18*66dfcc85SDavid van Moolenbroek * without specific prior written permission.
19*66dfcc85SDavid van Moolenbroek *
20*66dfcc85SDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
21*66dfcc85SDavid van Moolenbroek * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22*66dfcc85SDavid van Moolenbroek * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23*66dfcc85SDavid van Moolenbroek * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
24*66dfcc85SDavid van Moolenbroek * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25*66dfcc85SDavid van Moolenbroek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26*66dfcc85SDavid van Moolenbroek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27*66dfcc85SDavid van Moolenbroek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28*66dfcc85SDavid van Moolenbroek * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29*66dfcc85SDavid van Moolenbroek * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30*66dfcc85SDavid van Moolenbroek * SUCH DAMAGE.
31*66dfcc85SDavid van Moolenbroek */
32*66dfcc85SDavid van Moolenbroek
33*66dfcc85SDavid van Moolenbroek /*
34*66dfcc85SDavid van Moolenbroek * Copyright (c) 1983, 1988, 1993
35*66dfcc85SDavid van Moolenbroek * The Regents of the University of California. All rights reserved.
36*66dfcc85SDavid van Moolenbroek *
37*66dfcc85SDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without
38*66dfcc85SDavid van Moolenbroek * modification, are permitted provided that the following conditions
39*66dfcc85SDavid van Moolenbroek * are met:
40*66dfcc85SDavid van Moolenbroek * 1. Redistributions of source code must retain the above copyright
41*66dfcc85SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer.
42*66dfcc85SDavid van Moolenbroek * 2. Redistributions in binary form must reproduce the above copyright
43*66dfcc85SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer in the
44*66dfcc85SDavid van Moolenbroek * documentation and/or other materials provided with the distribution.
45*66dfcc85SDavid van Moolenbroek * 3. Neither the name of the University nor the names of its contributors
46*66dfcc85SDavid van Moolenbroek * may be used to endorse or promote products derived from this software
47*66dfcc85SDavid van Moolenbroek * without specific prior written permission.
48*66dfcc85SDavid van Moolenbroek *
49*66dfcc85SDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
50*66dfcc85SDavid van Moolenbroek * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
51*66dfcc85SDavid van Moolenbroek * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
52*66dfcc85SDavid van Moolenbroek * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
53*66dfcc85SDavid van Moolenbroek * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
54*66dfcc85SDavid van Moolenbroek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
55*66dfcc85SDavid van Moolenbroek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
56*66dfcc85SDavid van Moolenbroek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
57*66dfcc85SDavid van Moolenbroek * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
58*66dfcc85SDavid van Moolenbroek * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
59*66dfcc85SDavid van Moolenbroek * SUCH DAMAGE.
60*66dfcc85SDavid van Moolenbroek */
61*66dfcc85SDavid van Moolenbroek
62*66dfcc85SDavid van Moolenbroek #include <sys/cdefs.h>
63*66dfcc85SDavid van Moolenbroek #ifndef lint
64*66dfcc85SDavid van Moolenbroek #if 0
65*66dfcc85SDavid van Moolenbroek static char sccsid[] = "@(#)inet.c 8.4 (Berkeley) 4/20/94";
66*66dfcc85SDavid van Moolenbroek #else
67*66dfcc85SDavid van Moolenbroek __RCSID("$NetBSD: inet6.c,v 1.68 2015/02/08 15:09:45 christos Exp $");
68*66dfcc85SDavid van Moolenbroek #endif
69*66dfcc85SDavid van Moolenbroek #endif /* not lint */
70*66dfcc85SDavid van Moolenbroek
71*66dfcc85SDavid van Moolenbroek #define _CALLOUT_PRIVATE
72*66dfcc85SDavid van Moolenbroek
73*66dfcc85SDavid van Moolenbroek #include <sys/param.h>
74*66dfcc85SDavid van Moolenbroek #include <sys/socket.h>
75*66dfcc85SDavid van Moolenbroek #include <sys/socketvar.h>
76*66dfcc85SDavid van Moolenbroek #include <sys/ioctl.h>
77*66dfcc85SDavid van Moolenbroek #include <sys/mbuf.h>
78*66dfcc85SDavid van Moolenbroek #include <sys/protosw.h>
79*66dfcc85SDavid van Moolenbroek #include <sys/sysctl.h>
80*66dfcc85SDavid van Moolenbroek
81*66dfcc85SDavid van Moolenbroek #include <net/route.h>
82*66dfcc85SDavid van Moolenbroek #include <net/if.h>
83*66dfcc85SDavid van Moolenbroek #include <netinet/in.h>
84*66dfcc85SDavid van Moolenbroek #include <netinet/ip6.h>
85*66dfcc85SDavid van Moolenbroek #include <netinet/icmp6.h>
86*66dfcc85SDavid van Moolenbroek #include <netinet/in_systm.h>
87*66dfcc85SDavid van Moolenbroek #ifndef TCP6
88*66dfcc85SDavid van Moolenbroek #include <netinet/ip.h>
89*66dfcc85SDavid van Moolenbroek #include <netinet/ip_var.h>
90*66dfcc85SDavid van Moolenbroek #endif
91*66dfcc85SDavid van Moolenbroek #include <netinet6/ip6_var.h>
92*66dfcc85SDavid van Moolenbroek #include <netinet6/in6_pcb.h>
93*66dfcc85SDavid van Moolenbroek #include <netinet6/in6_var.h>
94*66dfcc85SDavid van Moolenbroek #ifdef TCP6
95*66dfcc85SDavid van Moolenbroek #include <netinet/tcp6.h>
96*66dfcc85SDavid van Moolenbroek #include <netinet/tcp6_seq.h>
97*66dfcc85SDavid van Moolenbroek #define TCP6STATES
98*66dfcc85SDavid van Moolenbroek #include <netinet/tcp6_fsm.h>
99*66dfcc85SDavid van Moolenbroek #define TCP6TIMERS
100*66dfcc85SDavid van Moolenbroek #include <netinet/tcp6_timer.h>
101*66dfcc85SDavid van Moolenbroek #include <netinet/tcp6_var.h>
102*66dfcc85SDavid van Moolenbroek #include <netinet/tcp6_debug.h>
103*66dfcc85SDavid van Moolenbroek #else
104*66dfcc85SDavid van Moolenbroek #define TCP6T_NTIMERS TCPT_NTIMERS
105*66dfcc85SDavid van Moolenbroek #define tcp6timers tcptimers
106*66dfcc85SDavid van Moolenbroek #define tcp6states tcpstates
107*66dfcc85SDavid van Moolenbroek #define TCP6_NSTATES TCP_NSTATES
108*66dfcc85SDavid van Moolenbroek #define tcp6cb tcpcb
109*66dfcc85SDavid van Moolenbroek #include <netinet/tcp.h>
110*66dfcc85SDavid van Moolenbroek #include <netinet/tcpip.h>
111*66dfcc85SDavid van Moolenbroek #include <netinet/tcp_seq.h>
112*66dfcc85SDavid van Moolenbroek #include <netinet/tcp_fsm.h>
113*66dfcc85SDavid van Moolenbroek extern const char * const tcpstates[];
114*66dfcc85SDavid van Moolenbroek extern const char * const tcptimers[];
115*66dfcc85SDavid van Moolenbroek #include <netinet/tcp_timer.h>
116*66dfcc85SDavid van Moolenbroek #include <netinet/tcp_var.h>
117*66dfcc85SDavid van Moolenbroek #include <netinet/tcp_debug.h>
118*66dfcc85SDavid van Moolenbroek #endif /*TCP6*/
119*66dfcc85SDavid van Moolenbroek #include <netinet6/udp6.h>
120*66dfcc85SDavid van Moolenbroek #include <netinet6/udp6_var.h>
121*66dfcc85SDavid van Moolenbroek #include <netinet6/pim6_var.h>
122*66dfcc85SDavid van Moolenbroek #include <netinet6/raw_ip6.h>
123*66dfcc85SDavid van Moolenbroek #include <netinet/tcp_vtw.h>
124*66dfcc85SDavid van Moolenbroek
125*66dfcc85SDavid van Moolenbroek #include <arpa/inet.h>
126*66dfcc85SDavid van Moolenbroek #if 0
127*66dfcc85SDavid van Moolenbroek #include "gethostbyname2.h"
128*66dfcc85SDavid van Moolenbroek #endif
129*66dfcc85SDavid van Moolenbroek #include <netdb.h>
130*66dfcc85SDavid van Moolenbroek
131*66dfcc85SDavid van Moolenbroek #include <err.h>
132*66dfcc85SDavid van Moolenbroek #include <errno.h>
133*66dfcc85SDavid van Moolenbroek #include <kvm.h>
134*66dfcc85SDavid van Moolenbroek #include <stdio.h>
135*66dfcc85SDavid van Moolenbroek #include <stdlib.h>
136*66dfcc85SDavid van Moolenbroek #include <string.h>
137*66dfcc85SDavid van Moolenbroek #include <unistd.h>
138*66dfcc85SDavid van Moolenbroek #include <util.h>
139*66dfcc85SDavid van Moolenbroek #include "netstat.h"
140*66dfcc85SDavid van Moolenbroek #include "vtw.h"
141*66dfcc85SDavid van Moolenbroek #include "prog_ops.h"
142*66dfcc85SDavid van Moolenbroek
143*66dfcc85SDavid van Moolenbroek #ifdef INET6
144*66dfcc85SDavid van Moolenbroek
145*66dfcc85SDavid van Moolenbroek struct in6pcb in6pcb;
146*66dfcc85SDavid van Moolenbroek #ifdef TCP6
147*66dfcc85SDavid van Moolenbroek struct tcp6cb tcp6cb;
148*66dfcc85SDavid van Moolenbroek #else
149*66dfcc85SDavid van Moolenbroek struct tcpcb tcpcb;
150*66dfcc85SDavid van Moolenbroek #endif
151*66dfcc85SDavid van Moolenbroek struct socket sockb;
152*66dfcc85SDavid van Moolenbroek
153*66dfcc85SDavid van Moolenbroek char *inet6name(const struct in6_addr *);
154*66dfcc85SDavid van Moolenbroek void inet6print(const struct in6_addr *, int, const char *);
155*66dfcc85SDavid van Moolenbroek void print_vtw_v6(const vtw_t *);
156*66dfcc85SDavid van Moolenbroek
157*66dfcc85SDavid van Moolenbroek /*
158*66dfcc85SDavid van Moolenbroek * Print a summary of connections related to an Internet
159*66dfcc85SDavid van Moolenbroek * protocol. For TCP, also give state of connection.
160*66dfcc85SDavid van Moolenbroek * Listening processes (aflag) are suppressed unless the
161*66dfcc85SDavid van Moolenbroek * -a (all) flag is specified.
162*66dfcc85SDavid van Moolenbroek */
163*66dfcc85SDavid van Moolenbroek static int width;
164*66dfcc85SDavid van Moolenbroek static int compact;
165*66dfcc85SDavid van Moolenbroek
166*66dfcc85SDavid van Moolenbroek /* VTW-related variables. */
167*66dfcc85SDavid van Moolenbroek static struct timeval now;
168*66dfcc85SDavid van Moolenbroek
169*66dfcc85SDavid van Moolenbroek static void
ip6protoprhdr(void)170*66dfcc85SDavid van Moolenbroek ip6protoprhdr(void)
171*66dfcc85SDavid van Moolenbroek {
172*66dfcc85SDavid van Moolenbroek
173*66dfcc85SDavid van Moolenbroek printf("Active Internet6 connections");
174*66dfcc85SDavid van Moolenbroek
175*66dfcc85SDavid van Moolenbroek if (aflag)
176*66dfcc85SDavid van Moolenbroek printf(" (including servers)");
177*66dfcc85SDavid van Moolenbroek putchar('\n');
178*66dfcc85SDavid van Moolenbroek
179*66dfcc85SDavid van Moolenbroek if (Aflag) {
180*66dfcc85SDavid van Moolenbroek printf("%-8.8s ", "PCB");
181*66dfcc85SDavid van Moolenbroek width = 18;
182*66dfcc85SDavid van Moolenbroek }
183*66dfcc85SDavid van Moolenbroek printf(
184*66dfcc85SDavid van Moolenbroek Vflag ? "%-5.5s %-6.6s %-6.6s %*.*s %*.*s %-13.13s Expires\n"
185*66dfcc85SDavid van Moolenbroek : "%-5.5s %-6.6s %-6.6s %*.*s %*.*s %s\n",
186*66dfcc85SDavid van Moolenbroek "Proto", "Recv-Q", "Send-Q",
187*66dfcc85SDavid van Moolenbroek -width, width, "Local Address",
188*66dfcc85SDavid van Moolenbroek -width, width, "Foreign Address", "(state)");
189*66dfcc85SDavid van Moolenbroek }
190*66dfcc85SDavid van Moolenbroek
191*66dfcc85SDavid van Moolenbroek static void
ip6protopr0(intptr_t ppcb,u_long rcv_sb_cc,u_long snd_sb_cc,const struct in6_addr * laddr,u_int16_t lport,const struct in6_addr * faddr,u_int16_t fport,short t_state,const char * name,const struct timeval * expires)192*66dfcc85SDavid van Moolenbroek ip6protopr0(intptr_t ppcb, u_long rcv_sb_cc, u_long snd_sb_cc,
193*66dfcc85SDavid van Moolenbroek const struct in6_addr *laddr, u_int16_t lport,
194*66dfcc85SDavid van Moolenbroek const struct in6_addr *faddr, u_int16_t fport,
195*66dfcc85SDavid van Moolenbroek short t_state, const char *name, const struct timeval *expires)
196*66dfcc85SDavid van Moolenbroek {
197*66dfcc85SDavid van Moolenbroek static const char *shorttcpstates[] = {
198*66dfcc85SDavid van Moolenbroek "CLOSED", "LISTEN", "SYNSEN", "SYSRCV",
199*66dfcc85SDavid van Moolenbroek "ESTABL", "CLWAIT", "FWAIT1", "CLOSNG",
200*66dfcc85SDavid van Moolenbroek "LASTAK", "FWAIT2", "TMWAIT",
201*66dfcc85SDavid van Moolenbroek };
202*66dfcc85SDavid van Moolenbroek int istcp;
203*66dfcc85SDavid van Moolenbroek
204*66dfcc85SDavid van Moolenbroek istcp = strcmp(name, "tcp6") == 0;
205*66dfcc85SDavid van Moolenbroek if (Aflag)
206*66dfcc85SDavid van Moolenbroek printf("%8" PRIxPTR " ", ppcb);
207*66dfcc85SDavid van Moolenbroek
208*66dfcc85SDavid van Moolenbroek printf("%-5.5s %6ld %6ld%s", name, rcv_sb_cc, snd_sb_cc,
209*66dfcc85SDavid van Moolenbroek compact ? "" : " ");
210*66dfcc85SDavid van Moolenbroek
211*66dfcc85SDavid van Moolenbroek inet6print(laddr, (int)lport, name);
212*66dfcc85SDavid van Moolenbroek inet6print(faddr, (int)fport, name);
213*66dfcc85SDavid van Moolenbroek if (istcp) {
214*66dfcc85SDavid van Moolenbroek #ifdef TCP6
215*66dfcc85SDavid van Moolenbroek if (t_state < 0 || t_state >= TCP6_NSTATES)
216*66dfcc85SDavid van Moolenbroek printf(" %d", t_state);
217*66dfcc85SDavid van Moolenbroek else
218*66dfcc85SDavid van Moolenbroek printf(" %s", tcp6states[t_state]);
219*66dfcc85SDavid van Moolenbroek #else
220*66dfcc85SDavid van Moolenbroek if (t_state < 0 || t_state >= TCP_NSTATES)
221*66dfcc85SDavid van Moolenbroek printf(" %d", t_state);
222*66dfcc85SDavid van Moolenbroek else
223*66dfcc85SDavid van Moolenbroek printf(" %s", compact ? shorttcpstates[t_state] :
224*66dfcc85SDavid van Moolenbroek tcpstates[t_state]);
225*66dfcc85SDavid van Moolenbroek #endif
226*66dfcc85SDavid van Moolenbroek }
227*66dfcc85SDavid van Moolenbroek if (Vflag && expires != NULL) {
228*66dfcc85SDavid van Moolenbroek if (expires->tv_sec == 0 && expires->tv_usec == -1)
229*66dfcc85SDavid van Moolenbroek printf(" reclaimed");
230*66dfcc85SDavid van Moolenbroek else {
231*66dfcc85SDavid van Moolenbroek struct timeval delta;
232*66dfcc85SDavid van Moolenbroek
233*66dfcc85SDavid van Moolenbroek timersub(expires, &now, &delta);
234*66dfcc85SDavid van Moolenbroek printf(" %.3fms",
235*66dfcc85SDavid van Moolenbroek delta.tv_sec * 1000.0 + delta.tv_usec / 1000.0);
236*66dfcc85SDavid van Moolenbroek }
237*66dfcc85SDavid van Moolenbroek }
238*66dfcc85SDavid van Moolenbroek putchar('\n');
239*66dfcc85SDavid van Moolenbroek }
240*66dfcc85SDavid van Moolenbroek
241*66dfcc85SDavid van Moolenbroek static void
dbg_printf(const char * fmt,...)242*66dfcc85SDavid van Moolenbroek dbg_printf(const char *fmt, ...)
243*66dfcc85SDavid van Moolenbroek {
244*66dfcc85SDavid van Moolenbroek return;
245*66dfcc85SDavid van Moolenbroek }
246*66dfcc85SDavid van Moolenbroek
247*66dfcc85SDavid van Moolenbroek void
print_vtw_v6(const vtw_t * vtw)248*66dfcc85SDavid van Moolenbroek print_vtw_v6(const vtw_t *vtw)
249*66dfcc85SDavid van Moolenbroek {
250*66dfcc85SDavid van Moolenbroek const vtw_v6_t *v6 = (const vtw_v6_t *)vtw;
251*66dfcc85SDavid van Moolenbroek struct timeval delta;
252*66dfcc85SDavid van Moolenbroek char buf[2][128];
253*66dfcc85SDavid van Moolenbroek static const struct timeval zero = {.tv_sec = 0, .tv_usec = 0};
254*66dfcc85SDavid van Moolenbroek
255*66dfcc85SDavid van Moolenbroek inet_ntop(AF_INET6, &v6->laddr, buf[0], sizeof(buf[0]));
256*66dfcc85SDavid van Moolenbroek inet_ntop(AF_INET6, &v6->faddr, buf[1], sizeof(buf[1]));
257*66dfcc85SDavid van Moolenbroek
258*66dfcc85SDavid van Moolenbroek timersub(&vtw->expire, &now, &delta);
259*66dfcc85SDavid van Moolenbroek
260*66dfcc85SDavid van Moolenbroek if (vtw->expire.tv_sec == 0 && vtw->expire.tv_usec == -1) {
261*66dfcc85SDavid van Moolenbroek dbg_printf("%15.15s:%d %15.15s:%d reclaimed\n"
262*66dfcc85SDavid van Moolenbroek ,buf[0], ntohs(v6->lport)
263*66dfcc85SDavid van Moolenbroek ,buf[1], ntohs(v6->fport));
264*66dfcc85SDavid van Moolenbroek if (!(Vflag && vflag))
265*66dfcc85SDavid van Moolenbroek return;
266*66dfcc85SDavid van Moolenbroek } else if (vtw->expire.tv_sec == 0)
267*66dfcc85SDavid van Moolenbroek return;
268*66dfcc85SDavid van Moolenbroek else if (timercmp(&delta, &zero, <) && !(Vflag && vflag)) {
269*66dfcc85SDavid van Moolenbroek dbg_printf("%15.15s:%d %15.15s:%d expired\n"
270*66dfcc85SDavid van Moolenbroek ,buf[0], ntohs(v6->lport)
271*66dfcc85SDavid van Moolenbroek ,buf[1], ntohs(v6->fport));
272*66dfcc85SDavid van Moolenbroek return;
273*66dfcc85SDavid van Moolenbroek } else {
274*66dfcc85SDavid van Moolenbroek dbg_printf("%15.15s:%d %15.15s:%d expires in %.3fms\n"
275*66dfcc85SDavid van Moolenbroek ,buf[0], ntohs(v6->lport)
276*66dfcc85SDavid van Moolenbroek ,buf[1], ntohs(v6->fport)
277*66dfcc85SDavid van Moolenbroek ,delta.tv_sec * 1000.0 + delta.tv_usec / 1000.0);
278*66dfcc85SDavid van Moolenbroek }
279*66dfcc85SDavid van Moolenbroek ip6protopr0(0, 0, 0,
280*66dfcc85SDavid van Moolenbroek &v6->laddr, v6->lport,
281*66dfcc85SDavid van Moolenbroek &v6->faddr, v6->fport,
282*66dfcc85SDavid van Moolenbroek TCPS_TIME_WAIT, "tcp6", &vtw->expire);
283*66dfcc85SDavid van Moolenbroek }
284*66dfcc85SDavid van Moolenbroek
285*66dfcc85SDavid van Moolenbroek
286*66dfcc85SDavid van Moolenbroek static struct kinfo_pcb *
getpcblist_kmem(u_long off,const char * name,size_t * len)287*66dfcc85SDavid van Moolenbroek getpcblist_kmem(u_long off, const char *name, size_t *len) {
288*66dfcc85SDavid van Moolenbroek
289*66dfcc85SDavid van Moolenbroek struct inpcbtable table;
290*66dfcc85SDavid van Moolenbroek struct inpcb_hdr *next, *prev;
291*66dfcc85SDavid van Moolenbroek int istcp = strcmp(name, "tcp6") == 0;
292*66dfcc85SDavid van Moolenbroek struct kinfo_pcb *pcblist;
293*66dfcc85SDavid van Moolenbroek size_t size = 100, i;
294*66dfcc85SDavid van Moolenbroek struct sockaddr_in6 sin6;
295*66dfcc85SDavid van Moolenbroek struct inpcbqueue *head;
296*66dfcc85SDavid van Moolenbroek
297*66dfcc85SDavid van Moolenbroek if (off == 0) {
298*66dfcc85SDavid van Moolenbroek *len = 0;
299*66dfcc85SDavid van Moolenbroek return NULL;
300*66dfcc85SDavid van Moolenbroek }
301*66dfcc85SDavid van Moolenbroek kread(off, (char *)&table, sizeof (table));
302*66dfcc85SDavid van Moolenbroek head = &table.inpt_queue;
303*66dfcc85SDavid van Moolenbroek next = TAILQ_FIRST(head);
304*66dfcc85SDavid van Moolenbroek prev = TAILQ_END(head);
305*66dfcc85SDavid van Moolenbroek
306*66dfcc85SDavid van Moolenbroek if ((pcblist = malloc(size * sizeof(*pcblist))) == NULL)
307*66dfcc85SDavid van Moolenbroek err(1, "malloc");
308*66dfcc85SDavid van Moolenbroek
309*66dfcc85SDavid van Moolenbroek i = 0;
310*66dfcc85SDavid van Moolenbroek while (next != TAILQ_END(head)) {
311*66dfcc85SDavid van Moolenbroek kread((u_long)next, (char *)&in6pcb, sizeof in6pcb);
312*66dfcc85SDavid van Moolenbroek next = TAILQ_NEXT(&in6pcb, in6p_queue);
313*66dfcc85SDavid van Moolenbroek prev = next;
314*66dfcc85SDavid van Moolenbroek
315*66dfcc85SDavid van Moolenbroek if (in6pcb.in6p_af != AF_INET6)
316*66dfcc85SDavid van Moolenbroek continue;
317*66dfcc85SDavid van Moolenbroek
318*66dfcc85SDavid van Moolenbroek kread((u_long)in6pcb.in6p_socket, (char *)&sockb,
319*66dfcc85SDavid van Moolenbroek sizeof (sockb));
320*66dfcc85SDavid van Moolenbroek if (istcp) {
321*66dfcc85SDavid van Moolenbroek #ifdef TCP6
322*66dfcc85SDavid van Moolenbroek kread((u_long)in6pcb.in6p_ppcb,
323*66dfcc85SDavid van Moolenbroek (char *)&tcp6cb, sizeof (tcp6cb));
324*66dfcc85SDavid van Moolenbroek #else
325*66dfcc85SDavid van Moolenbroek kread((u_long)in6pcb.in6p_ppcb,
326*66dfcc85SDavid van Moolenbroek (char *)&tcpcb, sizeof (tcpcb));
327*66dfcc85SDavid van Moolenbroek #endif
328*66dfcc85SDavid van Moolenbroek }
329*66dfcc85SDavid van Moolenbroek pcblist[i].ki_ppcbaddr =
330*66dfcc85SDavid van Moolenbroek istcp ? (uintptr_t) in6pcb.in6p_ppcb : (uintptr_t) prev;
331*66dfcc85SDavid van Moolenbroek pcblist[i].ki_rcvq = (uint64_t)sockb.so_rcv.sb_cc;
332*66dfcc85SDavid van Moolenbroek pcblist[i].ki_sndq = (uint64_t)sockb.so_snd.sb_cc;
333*66dfcc85SDavid van Moolenbroek sin6.sin6_addr = in6pcb.in6p_laddr;
334*66dfcc85SDavid van Moolenbroek sin6.sin6_port = in6pcb.in6p_lport;
335*66dfcc85SDavid van Moolenbroek memcpy(&pcblist[i].ki_s, &sin6, sizeof(sin6));
336*66dfcc85SDavid van Moolenbroek sin6.sin6_addr = in6pcb.in6p_faddr;
337*66dfcc85SDavid van Moolenbroek sin6.sin6_port = in6pcb.in6p_fport;
338*66dfcc85SDavid van Moolenbroek memcpy(&pcblist[i].ki_d, &sin6, sizeof(sin6));
339*66dfcc85SDavid van Moolenbroek pcblist[i].ki_tstate = tcpcb.t_state;
340*66dfcc85SDavid van Moolenbroek if (i++ == size) {
341*66dfcc85SDavid van Moolenbroek size += 100;
342*66dfcc85SDavid van Moolenbroek struct kinfo_pcb *n = realloc(pcblist,
343*66dfcc85SDavid van Moolenbroek size * sizeof(*pcblist));
344*66dfcc85SDavid van Moolenbroek if (n == NULL)
345*66dfcc85SDavid van Moolenbroek err(1, "realloc");
346*66dfcc85SDavid van Moolenbroek pcblist = n;
347*66dfcc85SDavid van Moolenbroek }
348*66dfcc85SDavid van Moolenbroek }
349*66dfcc85SDavid van Moolenbroek *len = i;
350*66dfcc85SDavid van Moolenbroek return pcblist;
351*66dfcc85SDavid van Moolenbroek }
352*66dfcc85SDavid van Moolenbroek
353*66dfcc85SDavid van Moolenbroek void
ip6protopr(u_long off,const char * name)354*66dfcc85SDavid van Moolenbroek ip6protopr(u_long off, const char *name)
355*66dfcc85SDavid van Moolenbroek {
356*66dfcc85SDavid van Moolenbroek struct kinfo_pcb *pcblist;
357*66dfcc85SDavid van Moolenbroek size_t i, len;
358*66dfcc85SDavid van Moolenbroek static int first = 1;
359*66dfcc85SDavid van Moolenbroek
360*66dfcc85SDavid van Moolenbroek compact = 0;
361*66dfcc85SDavid van Moolenbroek if (Aflag) {
362*66dfcc85SDavid van Moolenbroek if (!numeric_addr)
363*66dfcc85SDavid van Moolenbroek width = 18;
364*66dfcc85SDavid van Moolenbroek else {
365*66dfcc85SDavid van Moolenbroek width = 21;
366*66dfcc85SDavid van Moolenbroek compact = 1;
367*66dfcc85SDavid van Moolenbroek }
368*66dfcc85SDavid van Moolenbroek } else
369*66dfcc85SDavid van Moolenbroek width = 22;
370*66dfcc85SDavid van Moolenbroek
371*66dfcc85SDavid van Moolenbroek if (use_sysctl)
372*66dfcc85SDavid van Moolenbroek pcblist = getpcblist_sysctl(name, &len);
373*66dfcc85SDavid van Moolenbroek else
374*66dfcc85SDavid van Moolenbroek pcblist = getpcblist_kmem(off, name, &len);
375*66dfcc85SDavid van Moolenbroek
376*66dfcc85SDavid van Moolenbroek for (i = 0; i < len; i++) {
377*66dfcc85SDavid van Moolenbroek struct sockaddr_in6 src, dst;
378*66dfcc85SDavid van Moolenbroek
379*66dfcc85SDavid van Moolenbroek memcpy(&src, &pcblist[i].ki_s, sizeof(src));
380*66dfcc85SDavid van Moolenbroek memcpy(&dst, &pcblist[i].ki_d, sizeof(dst));
381*66dfcc85SDavid van Moolenbroek
382*66dfcc85SDavid van Moolenbroek if (!aflag && IN6_IS_ADDR_UNSPECIFIED(&dst.sin6_addr))
383*66dfcc85SDavid van Moolenbroek continue;
384*66dfcc85SDavid van Moolenbroek
385*66dfcc85SDavid van Moolenbroek if (first) {
386*66dfcc85SDavid van Moolenbroek ip6protoprhdr();
387*66dfcc85SDavid van Moolenbroek first = 0;
388*66dfcc85SDavid van Moolenbroek }
389*66dfcc85SDavid van Moolenbroek
390*66dfcc85SDavid van Moolenbroek ip6protopr0((intptr_t) pcblist[i].ki_ppcbaddr,
391*66dfcc85SDavid van Moolenbroek pcblist[i].ki_rcvq, pcblist[i].ki_sndq,
392*66dfcc85SDavid van Moolenbroek &src.sin6_addr, src.sin6_port,
393*66dfcc85SDavid van Moolenbroek &dst.sin6_addr, dst.sin6_port,
394*66dfcc85SDavid van Moolenbroek pcblist[i].ki_tstate, name, NULL);
395*66dfcc85SDavid van Moolenbroek }
396*66dfcc85SDavid van Moolenbroek
397*66dfcc85SDavid van Moolenbroek free(pcblist);
398*66dfcc85SDavid van Moolenbroek
399*66dfcc85SDavid van Moolenbroek #ifndef __minix
400*66dfcc85SDavid van Moolenbroek if (strcmp(name, "tcp6") == 0) {
401*66dfcc85SDavid van Moolenbroek struct timeval t;
402*66dfcc85SDavid van Moolenbroek timebase(&t);
403*66dfcc85SDavid van Moolenbroek gettimeofday(&now, NULL);
404*66dfcc85SDavid van Moolenbroek timersub(&now, &t, &now);
405*66dfcc85SDavid van Moolenbroek show_vtw_v6(print_vtw_v6);
406*66dfcc85SDavid van Moolenbroek }
407*66dfcc85SDavid van Moolenbroek #endif /* !__minix */
408*66dfcc85SDavid van Moolenbroek }
409*66dfcc85SDavid van Moolenbroek
410*66dfcc85SDavid van Moolenbroek #ifdef TCP6
411*66dfcc85SDavid van Moolenbroek /*
412*66dfcc85SDavid van Moolenbroek * Dump TCP6 statistics structure.
413*66dfcc85SDavid van Moolenbroek */
414*66dfcc85SDavid van Moolenbroek void
tcp6_stats(u_long off,const char * name)415*66dfcc85SDavid van Moolenbroek tcp6_stats(u_long off, const char *name)
416*66dfcc85SDavid van Moolenbroek {
417*66dfcc85SDavid van Moolenbroek struct tcp6stat tcp6stat;
418*66dfcc85SDavid van Moolenbroek
419*66dfcc85SDavid van Moolenbroek if (use_sysctl) {
420*66dfcc85SDavid van Moolenbroek size_t size = sizeof(tcp6stat);
421*66dfcc85SDavid van Moolenbroek
422*66dfcc85SDavid van Moolenbroek if (sysctlbyname("net.inet6.tcp6.stats", &tcp6stat, &size,
423*66dfcc85SDavid van Moolenbroek NULL, 0) == -1)
424*66dfcc85SDavid van Moolenbroek return;
425*66dfcc85SDavid van Moolenbroek } else {
426*66dfcc85SDavid van Moolenbroek warnx("%s stats not available via KVM.", name);
427*66dfcc85SDavid van Moolenbroek return;
428*66dfcc85SDavid van Moolenbroek }
429*66dfcc85SDavid van Moolenbroek
430*66dfcc85SDavid van Moolenbroek printf ("%s:\n", name);
431*66dfcc85SDavid van Moolenbroek
432*66dfcc85SDavid van Moolenbroek #define p(f, m) if (tcp6stat.f || sflag <= 1) \
433*66dfcc85SDavid van Moolenbroek printf(m, tcp6stat.f, plural(tcp6stat.f))
434*66dfcc85SDavid van Moolenbroek #define p2(f1, f2, m) if (tcp6stat.f1 || tcp6stat.f2 || sflag <= 1) \
435*66dfcc85SDavid van Moolenbroek printf(m, tcp6stat.f1, plural(tcp6stat.f1), tcp6stat.f2, plural(tcp6stat.f2))
436*66dfcc85SDavid van Moolenbroek #define p3(f, m) if (tcp6stat.f || sflag <= 1) \
437*66dfcc85SDavid van Moolenbroek printf(m, tcp6stat.f, plurales(tcp6stat.f))
438*66dfcc85SDavid van Moolenbroek
439*66dfcc85SDavid van Moolenbroek p(tcp6s_sndtotal, "\t%ld packet%s sent\n");
440*66dfcc85SDavid van Moolenbroek p2(tcp6s_sndpack,tcp6s_sndbyte,
441*66dfcc85SDavid van Moolenbroek "\t\t%ld data packet%s (%ld byte%s)\n");
442*66dfcc85SDavid van Moolenbroek p2(tcp6s_sndrexmitpack, tcp6s_sndrexmitbyte,
443*66dfcc85SDavid van Moolenbroek "\t\t%ld data packet%s (%ld byte%s) retransmitted\n");
444*66dfcc85SDavid van Moolenbroek p2(tcp6s_sndacks, tcp6s_delack,
445*66dfcc85SDavid van Moolenbroek "\t\t%ld ack-only packet%s (%ld packet%s delayed)\n");
446*66dfcc85SDavid van Moolenbroek p(tcp6s_sndurg, "\t\t%ld URG only packet%s\n");
447*66dfcc85SDavid van Moolenbroek p(tcp6s_sndprobe, "\t\t%ld window probe packet%s\n");
448*66dfcc85SDavid van Moolenbroek p(tcp6s_sndwinup, "\t\t%ld window update packet%s\n");
449*66dfcc85SDavid van Moolenbroek p(tcp6s_sndctrl, "\t\t%ld control packet%s\n");
450*66dfcc85SDavid van Moolenbroek p(tcp6s_rcvtotal, "\t%ld packet%s received\n");
451*66dfcc85SDavid van Moolenbroek p2(tcp6s_rcvackpack, tcp6s_rcvackbyte, "\t\t%ld ack%s (for %ld byte%s)\n");
452*66dfcc85SDavid van Moolenbroek p(tcp6s_rcvdupack, "\t\t%ld duplicate ack%s\n");
453*66dfcc85SDavid van Moolenbroek p(tcp6s_rcvacktoomuch, "\t\t%ld ack%s for unsent data\n");
454*66dfcc85SDavid van Moolenbroek p2(tcp6s_rcvpack, tcp6s_rcvbyte,
455*66dfcc85SDavid van Moolenbroek "\t\t%ld packet%s (%ld byte%s) received in-sequence\n");
456*66dfcc85SDavid van Moolenbroek p2(tcp6s_rcvduppack, tcp6s_rcvdupbyte,
457*66dfcc85SDavid van Moolenbroek "\t\t%ld completely duplicate packet%s (%ld byte%s)\n");
458*66dfcc85SDavid van Moolenbroek p(tcp6s_pawsdrop, "\t\t%ld old duplicate packet%s\n");
459*66dfcc85SDavid van Moolenbroek p2(tcp6s_rcvpartduppack, tcp6s_rcvpartdupbyte,
460*66dfcc85SDavid van Moolenbroek "\t\t%ld packet%s with some dup. data (%ld byte%s duped)\n");
461*66dfcc85SDavid van Moolenbroek p2(tcp6s_rcvoopack, tcp6s_rcvoobyte,
462*66dfcc85SDavid van Moolenbroek "\t\t%ld out-of-order packet%s (%ld byte%s)\n");
463*66dfcc85SDavid van Moolenbroek p2(tcp6s_rcvpackafterwin, tcp6s_rcvbyteafterwin,
464*66dfcc85SDavid van Moolenbroek "\t\t%ld packet%s (%ld byte%s) of data after window\n");
465*66dfcc85SDavid van Moolenbroek p(tcp6s_rcvwinprobe, "\t\t%ld window probe%s\n");
466*66dfcc85SDavid van Moolenbroek p(tcp6s_rcvwinupd, "\t\t%ld window update packet%s\n");
467*66dfcc85SDavid van Moolenbroek p(tcp6s_rcvafterclose, "\t\t%ld packet%s received after close\n");
468*66dfcc85SDavid van Moolenbroek p(tcp6s_rcvbadsum, "\t\t%ld discarded for bad checksum%s\n");
469*66dfcc85SDavid van Moolenbroek p(tcp6s_rcvbadoff, "\t\t%ld discarded for bad header offset field%s\n");
470*66dfcc85SDavid van Moolenbroek p(tcp6s_rcvshort, "\t\t%ld discarded because packet%s too short\n");
471*66dfcc85SDavid van Moolenbroek p(tcp6s_connattempt, "\t%ld connection request%s\n");
472*66dfcc85SDavid van Moolenbroek p(tcp6s_accepts, "\t%ld connection accept%s\n");
473*66dfcc85SDavid van Moolenbroek p(tcp6s_badsyn, "\t%ld bad connection attempt%s\n");
474*66dfcc85SDavid van Moolenbroek p(tcp6s_connects, "\t%ld connection%s established (including accepts)\n");
475*66dfcc85SDavid van Moolenbroek p2(tcp6s_closed, tcp6s_drops,
476*66dfcc85SDavid van Moolenbroek "\t%ld connection%s closed (including %ld drop%s)\n");
477*66dfcc85SDavid van Moolenbroek p(tcp6s_conndrops, "\t%ld embryonic connection%s dropped\n");
478*66dfcc85SDavid van Moolenbroek p2(tcp6s_rttupdated, tcp6s_segstimed,
479*66dfcc85SDavid van Moolenbroek "\t%ld segment%s updated rtt (of %ld attempt%s)\n");
480*66dfcc85SDavid van Moolenbroek p(tcp6s_rexmttimeo, "\t%ld retransmit timeout%s\n");
481*66dfcc85SDavid van Moolenbroek p(tcp6s_timeoutdrop, "\t\t%ld connection%s dropped by rexmit timeout\n");
482*66dfcc85SDavid van Moolenbroek p(tcp6s_persisttimeo, "\t%ld persist timeout%s\n");
483*66dfcc85SDavid van Moolenbroek p(tcp6s_persistdrop, "\t%ld connection%s timed out in persist\n");
484*66dfcc85SDavid van Moolenbroek p(tcp6s_keeptimeo, "\t%ld keepalive timeout%s\n");
485*66dfcc85SDavid van Moolenbroek p(tcp6s_keepprobe, "\t\t%ld keepalive probe%s sent\n");
486*66dfcc85SDavid van Moolenbroek p(tcp6s_keepdrops, "\t\t%ld connection%s dropped by keepalive\n");
487*66dfcc85SDavid van Moolenbroek p(tcp6s_predack, "\t%ld correct ACK header prediction%s\n");
488*66dfcc85SDavid van Moolenbroek p(tcp6s_preddat, "\t%ld correct data packet header prediction%s\n");
489*66dfcc85SDavid van Moolenbroek p3(tcp6s_pcbcachemiss, "\t%ld PCB cache miss%s\n");
490*66dfcc85SDavid van Moolenbroek #undef p
491*66dfcc85SDavid van Moolenbroek #undef p2
492*66dfcc85SDavid van Moolenbroek #undef p3
493*66dfcc85SDavid van Moolenbroek }
494*66dfcc85SDavid van Moolenbroek #endif
495*66dfcc85SDavid van Moolenbroek
496*66dfcc85SDavid van Moolenbroek /*
497*66dfcc85SDavid van Moolenbroek * Dump UDP6 statistics structure.
498*66dfcc85SDavid van Moolenbroek */
499*66dfcc85SDavid van Moolenbroek void
udp6_stats(u_long off,const char * name)500*66dfcc85SDavid van Moolenbroek udp6_stats(u_long off, const char *name)
501*66dfcc85SDavid van Moolenbroek {
502*66dfcc85SDavid van Moolenbroek uint64_t udp6stat[UDP6_NSTATS];
503*66dfcc85SDavid van Moolenbroek u_quad_t delivered;
504*66dfcc85SDavid van Moolenbroek
505*66dfcc85SDavid van Moolenbroek if (use_sysctl) {
506*66dfcc85SDavid van Moolenbroek size_t size = sizeof(udp6stat);
507*66dfcc85SDavid van Moolenbroek
508*66dfcc85SDavid van Moolenbroek if (sysctlbyname("net.inet6.udp6.stats", udp6stat, &size,
509*66dfcc85SDavid van Moolenbroek NULL, 0) == -1)
510*66dfcc85SDavid van Moolenbroek return;
511*66dfcc85SDavid van Moolenbroek } else {
512*66dfcc85SDavid van Moolenbroek warnx("%s stats not available via KVM.", name);
513*66dfcc85SDavid van Moolenbroek return;
514*66dfcc85SDavid van Moolenbroek }
515*66dfcc85SDavid van Moolenbroek printf("%s:\n", name);
516*66dfcc85SDavid van Moolenbroek #define p(f, m) if (udp6stat[f] || sflag <= 1) \
517*66dfcc85SDavid van Moolenbroek printf(m, (unsigned long long)udp6stat[f], plural(udp6stat[f]))
518*66dfcc85SDavid van Moolenbroek #define p1(f, m) if (udp6stat[f] || sflag <= 1) \
519*66dfcc85SDavid van Moolenbroek printf(m, (unsigned long long)udp6stat[f])
520*66dfcc85SDavid van Moolenbroek p(UDP6_STAT_IPACKETS, "\t%llu datagram%s received\n");
521*66dfcc85SDavid van Moolenbroek p1(UDP6_STAT_HDROPS, "\t%llu with incomplete header\n");
522*66dfcc85SDavid van Moolenbroek p1(UDP6_STAT_BADLEN, "\t%llu with bad data length field\n");
523*66dfcc85SDavid van Moolenbroek p1(UDP6_STAT_BADSUM, "\t%llu with bad checksum\n");
524*66dfcc85SDavid van Moolenbroek p1(UDP6_STAT_NOSUM, "\t%llu with no checksum\n");
525*66dfcc85SDavid van Moolenbroek p1(UDP6_STAT_NOPORT, "\t%llu dropped due to no socket\n");
526*66dfcc85SDavid van Moolenbroek p(UDP6_STAT_NOPORTMCAST,
527*66dfcc85SDavid van Moolenbroek "\t%llu multicast datagram%s dropped due to no socket\n");
528*66dfcc85SDavid van Moolenbroek p1(UDP6_STAT_FULLSOCK, "\t%llu dropped due to full socket buffers\n");
529*66dfcc85SDavid van Moolenbroek delivered = udp6stat[UDP6_STAT_IPACKETS] -
530*66dfcc85SDavid van Moolenbroek udp6stat[UDP6_STAT_HDROPS] -
531*66dfcc85SDavid van Moolenbroek udp6stat[UDP6_STAT_BADLEN] -
532*66dfcc85SDavid van Moolenbroek udp6stat[UDP6_STAT_BADSUM] -
533*66dfcc85SDavid van Moolenbroek udp6stat[UDP6_STAT_NOPORT] -
534*66dfcc85SDavid van Moolenbroek udp6stat[UDP6_STAT_NOPORTMCAST] -
535*66dfcc85SDavid van Moolenbroek udp6stat[UDP6_STAT_FULLSOCK];
536*66dfcc85SDavid van Moolenbroek if (delivered || sflag <= 1)
537*66dfcc85SDavid van Moolenbroek printf("\t%llu delivered\n", (unsigned long long)delivered);
538*66dfcc85SDavid van Moolenbroek p(UDP6_STAT_OPACKETS, "\t%llu datagram%s output\n");
539*66dfcc85SDavid van Moolenbroek #undef p
540*66dfcc85SDavid van Moolenbroek #undef p1
541*66dfcc85SDavid van Moolenbroek }
542*66dfcc85SDavid van Moolenbroek
543*66dfcc85SDavid van Moolenbroek static const char *ip6nh[] = {
544*66dfcc85SDavid van Moolenbroek /*0*/ "hop by hop",
545*66dfcc85SDavid van Moolenbroek "ICMP",
546*66dfcc85SDavid van Moolenbroek "IGMP",
547*66dfcc85SDavid van Moolenbroek NULL,
548*66dfcc85SDavid van Moolenbroek "IP",
549*66dfcc85SDavid van Moolenbroek /*5*/ NULL,
550*66dfcc85SDavid van Moolenbroek "TCP",
551*66dfcc85SDavid van Moolenbroek NULL,
552*66dfcc85SDavid van Moolenbroek NULL,
553*66dfcc85SDavid van Moolenbroek NULL,
554*66dfcc85SDavid van Moolenbroek /*10*/ NULL, NULL, NULL, NULL, NULL,
555*66dfcc85SDavid van Moolenbroek /*15*/ NULL,
556*66dfcc85SDavid van Moolenbroek NULL,
557*66dfcc85SDavid van Moolenbroek "UDP",
558*66dfcc85SDavid van Moolenbroek NULL,
559*66dfcc85SDavid van Moolenbroek NULL,
560*66dfcc85SDavid van Moolenbroek /*20*/ NULL,
561*66dfcc85SDavid van Moolenbroek NULL,
562*66dfcc85SDavid van Moolenbroek "IDP",
563*66dfcc85SDavid van Moolenbroek NULL,
564*66dfcc85SDavid van Moolenbroek NULL,
565*66dfcc85SDavid van Moolenbroek /*25*/ NULL,
566*66dfcc85SDavid van Moolenbroek NULL,
567*66dfcc85SDavid van Moolenbroek NULL,
568*66dfcc85SDavid van Moolenbroek NULL,
569*66dfcc85SDavid van Moolenbroek NULL,
570*66dfcc85SDavid van Moolenbroek /*30*/ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
571*66dfcc85SDavid van Moolenbroek /*40*/ NULL,
572*66dfcc85SDavid van Moolenbroek "IP6",
573*66dfcc85SDavid van Moolenbroek NULL,
574*66dfcc85SDavid van Moolenbroek "routing",
575*66dfcc85SDavid van Moolenbroek "fragment",
576*66dfcc85SDavid van Moolenbroek /*45*/ NULL, NULL, NULL, NULL, NULL,
577*66dfcc85SDavid van Moolenbroek /*50*/ "ESP",
578*66dfcc85SDavid van Moolenbroek "AH",
579*66dfcc85SDavid van Moolenbroek NULL,
580*66dfcc85SDavid van Moolenbroek NULL,
581*66dfcc85SDavid van Moolenbroek NULL,
582*66dfcc85SDavid van Moolenbroek /*55*/ NULL,
583*66dfcc85SDavid van Moolenbroek NULL,
584*66dfcc85SDavid van Moolenbroek NULL,
585*66dfcc85SDavid van Moolenbroek "ICMP6",
586*66dfcc85SDavid van Moolenbroek "no next header",
587*66dfcc85SDavid van Moolenbroek /*60*/ "destination option",
588*66dfcc85SDavid van Moolenbroek NULL,
589*66dfcc85SDavid van Moolenbroek NULL,
590*66dfcc85SDavid van Moolenbroek NULL,
591*66dfcc85SDavid van Moolenbroek NULL,
592*66dfcc85SDavid van Moolenbroek /*65*/ NULL, NULL, NULL, NULL, NULL,
593*66dfcc85SDavid van Moolenbroek /*70*/ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
594*66dfcc85SDavid van Moolenbroek /*80*/ NULL,
595*66dfcc85SDavid van Moolenbroek NULL,
596*66dfcc85SDavid van Moolenbroek NULL,
597*66dfcc85SDavid van Moolenbroek NULL,
598*66dfcc85SDavid van Moolenbroek NULL,
599*66dfcc85SDavid van Moolenbroek NULL,
600*66dfcc85SDavid van Moolenbroek NULL,
601*66dfcc85SDavid van Moolenbroek NULL,
602*66dfcc85SDavid van Moolenbroek NULL,
603*66dfcc85SDavid van Moolenbroek "OSPF",
604*66dfcc85SDavid van Moolenbroek /*90*/ NULL, NULL, NULL, NULL, NULL,
605*66dfcc85SDavid van Moolenbroek /*95*/ NULL,
606*66dfcc85SDavid van Moolenbroek NULL,
607*66dfcc85SDavid van Moolenbroek "Ethernet",
608*66dfcc85SDavid van Moolenbroek NULL,
609*66dfcc85SDavid van Moolenbroek NULL,
610*66dfcc85SDavid van Moolenbroek /*100*/ NULL,
611*66dfcc85SDavid van Moolenbroek NULL,
612*66dfcc85SDavid van Moolenbroek NULL,
613*66dfcc85SDavid van Moolenbroek "PIM",
614*66dfcc85SDavid van Moolenbroek NULL,
615*66dfcc85SDavid van Moolenbroek /*105*/ NULL, NULL, NULL, NULL, NULL,
616*66dfcc85SDavid van Moolenbroek /*110*/ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
617*66dfcc85SDavid van Moolenbroek /*120*/ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
618*66dfcc85SDavid van Moolenbroek /*130*/ NULL,
619*66dfcc85SDavid van Moolenbroek NULL,
620*66dfcc85SDavid van Moolenbroek "SCTP",
621*66dfcc85SDavid van Moolenbroek NULL,
622*66dfcc85SDavid van Moolenbroek NULL,
623*66dfcc85SDavid van Moolenbroek /*135*/ NULL, NULL, NULL, NULL, NULL,
624*66dfcc85SDavid van Moolenbroek /*140*/ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
625*66dfcc85SDavid van Moolenbroek NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
626*66dfcc85SDavid van Moolenbroek /*160*/ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
627*66dfcc85SDavid van Moolenbroek NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
628*66dfcc85SDavid van Moolenbroek /*180*/ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
629*66dfcc85SDavid van Moolenbroek NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
630*66dfcc85SDavid van Moolenbroek /*200*/ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
631*66dfcc85SDavid van Moolenbroek NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
632*66dfcc85SDavid van Moolenbroek /*220*/ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
633*66dfcc85SDavid van Moolenbroek NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
634*66dfcc85SDavid van Moolenbroek /*240*/ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
635*66dfcc85SDavid van Moolenbroek NULL, NULL, NULL, NULL, NULL, NULL,
636*66dfcc85SDavid van Moolenbroek };
637*66dfcc85SDavid van Moolenbroek
638*66dfcc85SDavid van Moolenbroek /*
639*66dfcc85SDavid van Moolenbroek * Dump IP6 statistics structure.
640*66dfcc85SDavid van Moolenbroek */
641*66dfcc85SDavid van Moolenbroek void
ip6_stats(u_long off,const char * name)642*66dfcc85SDavid van Moolenbroek ip6_stats(u_long off, const char *name)
643*66dfcc85SDavid van Moolenbroek {
644*66dfcc85SDavid van Moolenbroek uint64_t ip6stat[IP6_NSTATS];
645*66dfcc85SDavid van Moolenbroek int first, i;
646*66dfcc85SDavid van Moolenbroek struct protoent *ep;
647*66dfcc85SDavid van Moolenbroek const char *n;
648*66dfcc85SDavid van Moolenbroek
649*66dfcc85SDavid van Moolenbroek if (use_sysctl) {
650*66dfcc85SDavid van Moolenbroek size_t size = sizeof(ip6stat);
651*66dfcc85SDavid van Moolenbroek
652*66dfcc85SDavid van Moolenbroek if (sysctlbyname("net.inet6.ip6.stats", ip6stat, &size,
653*66dfcc85SDavid van Moolenbroek NULL, 0) == -1)
654*66dfcc85SDavid van Moolenbroek return;
655*66dfcc85SDavid van Moolenbroek } else {
656*66dfcc85SDavid van Moolenbroek warnx("%s stats not available via KVM.", name);
657*66dfcc85SDavid van Moolenbroek return;
658*66dfcc85SDavid van Moolenbroek }
659*66dfcc85SDavid van Moolenbroek printf("%s:\n", name);
660*66dfcc85SDavid van Moolenbroek
661*66dfcc85SDavid van Moolenbroek #define p(f, m) if (ip6stat[f] || sflag <= 1) \
662*66dfcc85SDavid van Moolenbroek printf(m, (unsigned long long)ip6stat[f], plural(ip6stat[f]))
663*66dfcc85SDavid van Moolenbroek #define p1(f, m) if (ip6stat[f] || sflag <= 1) \
664*66dfcc85SDavid van Moolenbroek printf(m, (unsigned long long)ip6stat[f])
665*66dfcc85SDavid van Moolenbroek
666*66dfcc85SDavid van Moolenbroek p(IP6_STAT_TOTAL, "\t%llu total packet%s received\n");
667*66dfcc85SDavid van Moolenbroek p1(IP6_STAT_TOOSMALL, "\t%llu with size smaller than minimum\n");
668*66dfcc85SDavid van Moolenbroek p1(IP6_STAT_TOOSHORT, "\t%llu with data size < data length\n");
669*66dfcc85SDavid van Moolenbroek p1(IP6_STAT_BADOPTIONS, "\t%llu with bad options\n");
670*66dfcc85SDavid van Moolenbroek p1(IP6_STAT_BADVERS, "\t%llu with incorrect version number\n");
671*66dfcc85SDavid van Moolenbroek p(IP6_STAT_FRAGMENTS, "\t%llu fragment%s received\n");
672*66dfcc85SDavid van Moolenbroek p(IP6_STAT_FRAGDROPPED,
673*66dfcc85SDavid van Moolenbroek "\t%llu fragment%s dropped (dup or out of space)\n");
674*66dfcc85SDavid van Moolenbroek p(IP6_STAT_FRAGTIMEOUT, "\t%llu fragment%s dropped after timeout\n");
675*66dfcc85SDavid van Moolenbroek p(IP6_STAT_FRAGOVERFLOW, "\t%llu fragment%s that exceeded limit\n");
676*66dfcc85SDavid van Moolenbroek p(IP6_STAT_REASSEMBLED, "\t%llu packet%s reassembled ok\n");
677*66dfcc85SDavid van Moolenbroek p(IP6_STAT_DELIVERED, "\t%llu packet%s for this host\n");
678*66dfcc85SDavid van Moolenbroek p(IP6_STAT_FORWARD, "\t%llu packet%s forwarded\n");
679*66dfcc85SDavid van Moolenbroek p(IP6_STAT_FASTFORWARD, "\t%llu packet%s fast forwarded\n");
680*66dfcc85SDavid van Moolenbroek p1(IP6_STAT_FASTFORWARDFLOWS, "\t%llu fast forward flows\n");
681*66dfcc85SDavid van Moolenbroek p(IP6_STAT_CANTFORWARD, "\t%llu packet%s not forwardable\n");
682*66dfcc85SDavid van Moolenbroek p(IP6_STAT_REDIRECTSENT, "\t%llu redirect%s sent\n");
683*66dfcc85SDavid van Moolenbroek p(IP6_STAT_LOCALOUT, "\t%llu packet%s sent from this host\n");
684*66dfcc85SDavid van Moolenbroek p(IP6_STAT_RAWOUT, "\t%llu packet%s sent with fabricated ip header\n");
685*66dfcc85SDavid van Moolenbroek p(IP6_STAT_ODROPPED,
686*66dfcc85SDavid van Moolenbroek "\t%llu output packet%s dropped due to no bufs, etc.\n");
687*66dfcc85SDavid van Moolenbroek p(IP6_STAT_NOROUTE, "\t%llu output packet%s discarded due to no route\n");
688*66dfcc85SDavid van Moolenbroek p(IP6_STAT_FRAGMENTED, "\t%llu output datagram%s fragmented\n");
689*66dfcc85SDavid van Moolenbroek p(IP6_STAT_OFRAGMENTS, "\t%llu fragment%s created\n");
690*66dfcc85SDavid van Moolenbroek p(IP6_STAT_CANTFRAG, "\t%llu datagram%s that can't be fragmented\n");
691*66dfcc85SDavid van Moolenbroek p(IP6_STAT_BADSCOPE, "\t%llu packet%s that violated scope rules\n");
692*66dfcc85SDavid van Moolenbroek p(IP6_STAT_NOTMEMBER, "\t%llu multicast packet%s which we don't join\n");
693*66dfcc85SDavid van Moolenbroek for (first = 1, i = 0; i < 256; i++)
694*66dfcc85SDavid van Moolenbroek if (ip6stat[IP6_STAT_NXTHIST + i] != 0) {
695*66dfcc85SDavid van Moolenbroek if (first) {
696*66dfcc85SDavid van Moolenbroek printf("\tInput packet histogram:\n");
697*66dfcc85SDavid van Moolenbroek first = 0;
698*66dfcc85SDavid van Moolenbroek }
699*66dfcc85SDavid van Moolenbroek n = NULL;
700*66dfcc85SDavid van Moolenbroek if (ip6nh[i])
701*66dfcc85SDavid van Moolenbroek n = ip6nh[i];
702*66dfcc85SDavid van Moolenbroek else if ((ep = getprotobynumber(i)) != NULL)
703*66dfcc85SDavid van Moolenbroek n = ep->p_name;
704*66dfcc85SDavid van Moolenbroek if (n)
705*66dfcc85SDavid van Moolenbroek printf("\t\t%s: %llu\n", n,
706*66dfcc85SDavid van Moolenbroek (unsigned long long)ip6stat[IP6_STAT_NXTHIST + i]);
707*66dfcc85SDavid van Moolenbroek else
708*66dfcc85SDavid van Moolenbroek printf("\t\t#%d: %llu\n", i,
709*66dfcc85SDavid van Moolenbroek (unsigned long long)ip6stat[IP6_STAT_NXTHIST + i]);
710*66dfcc85SDavid van Moolenbroek }
711*66dfcc85SDavid van Moolenbroek printf("\tMbuf statistics:\n");
712*66dfcc85SDavid van Moolenbroek p(IP6_STAT_M1, "\t\t%llu one mbuf%s\n");
713*66dfcc85SDavid van Moolenbroek for (first = 1, i = 0; i < 32; i++) {
714*66dfcc85SDavid van Moolenbroek char ifbuf[IFNAMSIZ];
715*66dfcc85SDavid van Moolenbroek if (ip6stat[IP6_STAT_M2M + i] != 0) {
716*66dfcc85SDavid van Moolenbroek if (first) {
717*66dfcc85SDavid van Moolenbroek printf("\t\ttwo or more mbuf:\n");
718*66dfcc85SDavid van Moolenbroek first = 0;
719*66dfcc85SDavid van Moolenbroek }
720*66dfcc85SDavid van Moolenbroek printf("\t\t\t%s = %llu\n",
721*66dfcc85SDavid van Moolenbroek if_indextoname(i, ifbuf),
722*66dfcc85SDavid van Moolenbroek (unsigned long long)ip6stat[IP6_STAT_M2M + i]);
723*66dfcc85SDavid van Moolenbroek }
724*66dfcc85SDavid van Moolenbroek }
725*66dfcc85SDavid van Moolenbroek p(IP6_STAT_MEXT1, "\t\t%llu one ext mbuf%s\n");
726*66dfcc85SDavid van Moolenbroek p(IP6_STAT_MEXT2M, "\t\t%llu two or more ext mbuf%s\n");
727*66dfcc85SDavid van Moolenbroek p(IP6_STAT_EXTHDRTOOLONG,
728*66dfcc85SDavid van Moolenbroek "\t%llu packet%s whose headers are not continuous\n");
729*66dfcc85SDavid van Moolenbroek p(IP6_STAT_NOGIF, "\t%llu tunneling packet%s that can't find gif\n");
730*66dfcc85SDavid van Moolenbroek p(IP6_STAT_TOOMANYHDR,
731*66dfcc85SDavid van Moolenbroek "\t%llu packet%s discarded due to too many headers\n");
732*66dfcc85SDavid van Moolenbroek
733*66dfcc85SDavid van Moolenbroek /* for debugging source address selection */
734*66dfcc85SDavid van Moolenbroek #define PRINT_SCOPESTAT(s,i) do {\
735*66dfcc85SDavid van Moolenbroek switch(i) { /* XXX hardcoding in each case */\
736*66dfcc85SDavid van Moolenbroek case 1:\
737*66dfcc85SDavid van Moolenbroek p(s, "\t\t%llu node-local%s\n");\
738*66dfcc85SDavid van Moolenbroek break;\
739*66dfcc85SDavid van Moolenbroek case 2:\
740*66dfcc85SDavid van Moolenbroek p(s, "\t\t%llu link-local%s\n");\
741*66dfcc85SDavid van Moolenbroek break;\
742*66dfcc85SDavid van Moolenbroek case 5:\
743*66dfcc85SDavid van Moolenbroek p(s, "\t\t%llu site-local%s\n");\
744*66dfcc85SDavid van Moolenbroek break;\
745*66dfcc85SDavid van Moolenbroek case 14:\
746*66dfcc85SDavid van Moolenbroek p(s, "\t\t%llu global%s\n");\
747*66dfcc85SDavid van Moolenbroek break;\
748*66dfcc85SDavid van Moolenbroek default:\
749*66dfcc85SDavid van Moolenbroek printf("\t\t%llu addresses scope=%x\n",\
750*66dfcc85SDavid van Moolenbroek (unsigned long long)ip6stat[s], i);\
751*66dfcc85SDavid van Moolenbroek }\
752*66dfcc85SDavid van Moolenbroek } while(/*CONSTCOND*/0);
753*66dfcc85SDavid van Moolenbroek
754*66dfcc85SDavid van Moolenbroek p(IP6_STAT_SOURCES_NONE,
755*66dfcc85SDavid van Moolenbroek "\t%llu failure%s of source address selection\n");
756*66dfcc85SDavid van Moolenbroek for (first = 1, i = 0; i < 16; i++) {
757*66dfcc85SDavid van Moolenbroek if (ip6stat[IP6_STAT_SOURCES_SAMEIF + i]) {
758*66dfcc85SDavid van Moolenbroek if (first) {
759*66dfcc85SDavid van Moolenbroek printf("\tsource addresses on an outgoing I/F\n");
760*66dfcc85SDavid van Moolenbroek first = 0;
761*66dfcc85SDavid van Moolenbroek }
762*66dfcc85SDavid van Moolenbroek PRINT_SCOPESTAT(IP6_STAT_SOURCES_SAMEIF + i, i);
763*66dfcc85SDavid van Moolenbroek }
764*66dfcc85SDavid van Moolenbroek }
765*66dfcc85SDavid van Moolenbroek for (first = 1, i = 0; i < 16; i++) {
766*66dfcc85SDavid van Moolenbroek if (ip6stat[IP6_STAT_SOURCES_OTHERIF + i]) {
767*66dfcc85SDavid van Moolenbroek if (first) {
768*66dfcc85SDavid van Moolenbroek printf("\tsource addresses on a non-outgoing I/F\n");
769*66dfcc85SDavid van Moolenbroek first = 0;
770*66dfcc85SDavid van Moolenbroek }
771*66dfcc85SDavid van Moolenbroek PRINT_SCOPESTAT(IP6_STAT_SOURCES_OTHERIF + i, i);
772*66dfcc85SDavid van Moolenbroek }
773*66dfcc85SDavid van Moolenbroek }
774*66dfcc85SDavid van Moolenbroek for (first = 1, i = 0; i < 16; i++) {
775*66dfcc85SDavid van Moolenbroek if (ip6stat[IP6_STAT_SOURCES_SAMESCOPE + i]) {
776*66dfcc85SDavid van Moolenbroek if (first) {
777*66dfcc85SDavid van Moolenbroek printf("\tsource addresses of same scope\n");
778*66dfcc85SDavid van Moolenbroek first = 0;
779*66dfcc85SDavid van Moolenbroek }
780*66dfcc85SDavid van Moolenbroek PRINT_SCOPESTAT(IP6_STAT_SOURCES_SAMESCOPE + i, i);
781*66dfcc85SDavid van Moolenbroek }
782*66dfcc85SDavid van Moolenbroek }
783*66dfcc85SDavid van Moolenbroek for (first = 1, i = 0; i < 16; i++) {
784*66dfcc85SDavid van Moolenbroek if (ip6stat[IP6_STAT_SOURCES_OTHERSCOPE + i]) {
785*66dfcc85SDavid van Moolenbroek if (first) {
786*66dfcc85SDavid van Moolenbroek printf("\tsource addresses of a different scope\n");
787*66dfcc85SDavid van Moolenbroek first = 0;
788*66dfcc85SDavid van Moolenbroek }
789*66dfcc85SDavid van Moolenbroek PRINT_SCOPESTAT(IP6_STAT_SOURCES_OTHERSCOPE + i, i);
790*66dfcc85SDavid van Moolenbroek }
791*66dfcc85SDavid van Moolenbroek }
792*66dfcc85SDavid van Moolenbroek for (first = 1, i = 0; i < 16; i++) {
793*66dfcc85SDavid van Moolenbroek if (ip6stat[IP6_STAT_SOURCES_DEPRECATED + i]) {
794*66dfcc85SDavid van Moolenbroek if (first) {
795*66dfcc85SDavid van Moolenbroek printf("\tdeprecated source addresses\n");
796*66dfcc85SDavid van Moolenbroek first = 0;
797*66dfcc85SDavid van Moolenbroek }
798*66dfcc85SDavid van Moolenbroek PRINT_SCOPESTAT(IP6_STAT_SOURCES_DEPRECATED + i, i);
799*66dfcc85SDavid van Moolenbroek }
800*66dfcc85SDavid van Moolenbroek }
801*66dfcc85SDavid van Moolenbroek
802*66dfcc85SDavid van Moolenbroek p1(IP6_STAT_FORWARD_CACHEHIT, "\t%llu forward cache hit\n");
803*66dfcc85SDavid van Moolenbroek p1(IP6_STAT_FORWARD_CACHEMISS, "\t%llu forward cache miss\n");
804*66dfcc85SDavid van Moolenbroek #undef p
805*66dfcc85SDavid van Moolenbroek #undef p1
806*66dfcc85SDavid van Moolenbroek }
807*66dfcc85SDavid van Moolenbroek
808*66dfcc85SDavid van Moolenbroek /*
809*66dfcc85SDavid van Moolenbroek * Dump IPv6 per-interface statistics based on RFC 2465.
810*66dfcc85SDavid van Moolenbroek */
811*66dfcc85SDavid van Moolenbroek void
ip6_ifstats(const char * ifname)812*66dfcc85SDavid van Moolenbroek ip6_ifstats(const char *ifname)
813*66dfcc85SDavid van Moolenbroek {
814*66dfcc85SDavid van Moolenbroek struct in6_ifreq ifr;
815*66dfcc85SDavid van Moolenbroek int s;
816*66dfcc85SDavid van Moolenbroek #define p(f, m) if (ifr.ifr_ifru.ifru_stat.f || sflag <= 1) \
817*66dfcc85SDavid van Moolenbroek printf(m, (unsigned long long)ifr.ifr_ifru.ifru_stat.f, \
818*66dfcc85SDavid van Moolenbroek plural(ifr.ifr_ifru.ifru_stat.f))
819*66dfcc85SDavid van Moolenbroek #define p_5(f, m) if (ifr.ifr_ifru.ifru_stat.f || sflag <= 1) \
820*66dfcc85SDavid van Moolenbroek printf(m, (unsigned long long)ip6stat.f)
821*66dfcc85SDavid van Moolenbroek
822*66dfcc85SDavid van Moolenbroek if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
823*66dfcc85SDavid van Moolenbroek perror("Warning: socket(AF_INET6)");
824*66dfcc85SDavid van Moolenbroek return;
825*66dfcc85SDavid van Moolenbroek }
826*66dfcc85SDavid van Moolenbroek
827*66dfcc85SDavid van Moolenbroek strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
828*66dfcc85SDavid van Moolenbroek printf("ip6 on %s:\n", ifname);
829*66dfcc85SDavid van Moolenbroek
830*66dfcc85SDavid van Moolenbroek if (ioctl(s, SIOCGIFSTAT_IN6, (char *)&ifr) < 0) {
831*66dfcc85SDavid van Moolenbroek perror("Warning: ioctl(SIOCGIFSTAT_IN6)");
832*66dfcc85SDavid van Moolenbroek goto end;
833*66dfcc85SDavid van Moolenbroek }
834*66dfcc85SDavid van Moolenbroek
835*66dfcc85SDavid van Moolenbroek p(ifs6_in_receive, "\t%llu total input datagram%s\n");
836*66dfcc85SDavid van Moolenbroek p(ifs6_in_hdrerr, "\t%llu datagram%s with invalid header received\n");
837*66dfcc85SDavid van Moolenbroek p(ifs6_in_toobig, "\t%llu datagram%s exceeded MTU received\n");
838*66dfcc85SDavid van Moolenbroek p(ifs6_in_noroute, "\t%llu datagram%s with no route received\n");
839*66dfcc85SDavid van Moolenbroek p(ifs6_in_addrerr, "\t%llu datagram%s with invalid dst received\n");
840*66dfcc85SDavid van Moolenbroek p(ifs6_in_truncated, "\t%llu truncated datagram%s received\n");
841*66dfcc85SDavid van Moolenbroek p(ifs6_in_protounknown, "\t%llu datagram%s with unknown proto received\n");
842*66dfcc85SDavid van Moolenbroek p(ifs6_in_discard, "\t%llu input datagram%s discarded\n");
843*66dfcc85SDavid van Moolenbroek p(ifs6_in_deliver,
844*66dfcc85SDavid van Moolenbroek "\t%llu datagram%s delivered to an upper layer protocol\n");
845*66dfcc85SDavid van Moolenbroek p(ifs6_out_forward, "\t%llu datagram%s forwarded to this interface\n");
846*66dfcc85SDavid van Moolenbroek p(ifs6_out_request,
847*66dfcc85SDavid van Moolenbroek "\t%llu datagram%s sent from an upper layer protocol\n");
848*66dfcc85SDavid van Moolenbroek p(ifs6_out_discard, "\t%llu total discarded output datagram%s\n");
849*66dfcc85SDavid van Moolenbroek p(ifs6_out_fragok, "\t%llu output datagram%s fragmented\n");
850*66dfcc85SDavid van Moolenbroek p(ifs6_out_fragfail, "\t%llu output datagram%s failed on fragment\n");
851*66dfcc85SDavid van Moolenbroek p(ifs6_out_fragcreat, "\t%llu output datagram%s succeeded on fragment\n");
852*66dfcc85SDavid van Moolenbroek p(ifs6_reass_reqd, "\t%llu incoming datagram%s fragmented\n");
853*66dfcc85SDavid van Moolenbroek p(ifs6_reass_ok, "\t%llu datagram%s reassembled\n");
854*66dfcc85SDavid van Moolenbroek p(ifs6_reass_fail, "\t%llu datagram%s failed on reassembling\n");
855*66dfcc85SDavid van Moolenbroek p(ifs6_in_mcast, "\t%llu multicast datagram%s received\n");
856*66dfcc85SDavid van Moolenbroek p(ifs6_out_mcast, "\t%llu multicast datagram%s sent\n");
857*66dfcc85SDavid van Moolenbroek
858*66dfcc85SDavid van Moolenbroek end:
859*66dfcc85SDavid van Moolenbroek close(s);
860*66dfcc85SDavid van Moolenbroek
861*66dfcc85SDavid van Moolenbroek #undef p
862*66dfcc85SDavid van Moolenbroek #undef p_5
863*66dfcc85SDavid van Moolenbroek }
864*66dfcc85SDavid van Moolenbroek
865*66dfcc85SDavid van Moolenbroek static const char *icmp6names[] = {
866*66dfcc85SDavid van Moolenbroek "#0",
867*66dfcc85SDavid van Moolenbroek "unreach",
868*66dfcc85SDavid van Moolenbroek "packet too big",
869*66dfcc85SDavid van Moolenbroek "time exceed",
870*66dfcc85SDavid van Moolenbroek "parameter problem",
871*66dfcc85SDavid van Moolenbroek "#5",
872*66dfcc85SDavid van Moolenbroek "#6",
873*66dfcc85SDavid van Moolenbroek "#7",
874*66dfcc85SDavid van Moolenbroek "#8",
875*66dfcc85SDavid van Moolenbroek "#9",
876*66dfcc85SDavid van Moolenbroek "#10",
877*66dfcc85SDavid van Moolenbroek "#11",
878*66dfcc85SDavid van Moolenbroek "#12",
879*66dfcc85SDavid van Moolenbroek "#13",
880*66dfcc85SDavid van Moolenbroek "#14",
881*66dfcc85SDavid van Moolenbroek "#15",
882*66dfcc85SDavid van Moolenbroek "#16",
883*66dfcc85SDavid van Moolenbroek "#17",
884*66dfcc85SDavid van Moolenbroek "#18",
885*66dfcc85SDavid van Moolenbroek "#19",
886*66dfcc85SDavid van Moolenbroek "#20",
887*66dfcc85SDavid van Moolenbroek "#21",
888*66dfcc85SDavid van Moolenbroek "#22",
889*66dfcc85SDavid van Moolenbroek "#23",
890*66dfcc85SDavid van Moolenbroek "#24",
891*66dfcc85SDavid van Moolenbroek "#25",
892*66dfcc85SDavid van Moolenbroek "#26",
893*66dfcc85SDavid van Moolenbroek "#27",
894*66dfcc85SDavid van Moolenbroek "#28",
895*66dfcc85SDavid van Moolenbroek "#29",
896*66dfcc85SDavid van Moolenbroek "#30",
897*66dfcc85SDavid van Moolenbroek "#31",
898*66dfcc85SDavid van Moolenbroek "#32",
899*66dfcc85SDavid van Moolenbroek "#33",
900*66dfcc85SDavid van Moolenbroek "#34",
901*66dfcc85SDavid van Moolenbroek "#35",
902*66dfcc85SDavid van Moolenbroek "#36",
903*66dfcc85SDavid van Moolenbroek "#37",
904*66dfcc85SDavid van Moolenbroek "#38",
905*66dfcc85SDavid van Moolenbroek "#39",
906*66dfcc85SDavid van Moolenbroek "#40",
907*66dfcc85SDavid van Moolenbroek "#41",
908*66dfcc85SDavid van Moolenbroek "#42",
909*66dfcc85SDavid van Moolenbroek "#43",
910*66dfcc85SDavid van Moolenbroek "#44",
911*66dfcc85SDavid van Moolenbroek "#45",
912*66dfcc85SDavid van Moolenbroek "#46",
913*66dfcc85SDavid van Moolenbroek "#47",
914*66dfcc85SDavid van Moolenbroek "#48",
915*66dfcc85SDavid van Moolenbroek "#49",
916*66dfcc85SDavid van Moolenbroek "#50",
917*66dfcc85SDavid van Moolenbroek "#51",
918*66dfcc85SDavid van Moolenbroek "#52",
919*66dfcc85SDavid van Moolenbroek "#53",
920*66dfcc85SDavid van Moolenbroek "#54",
921*66dfcc85SDavid van Moolenbroek "#55",
922*66dfcc85SDavid van Moolenbroek "#56",
923*66dfcc85SDavid van Moolenbroek "#57",
924*66dfcc85SDavid van Moolenbroek "#58",
925*66dfcc85SDavid van Moolenbroek "#59",
926*66dfcc85SDavid van Moolenbroek "#60",
927*66dfcc85SDavid van Moolenbroek "#61",
928*66dfcc85SDavid van Moolenbroek "#62",
929*66dfcc85SDavid van Moolenbroek "#63",
930*66dfcc85SDavid van Moolenbroek "#64",
931*66dfcc85SDavid van Moolenbroek "#65",
932*66dfcc85SDavid van Moolenbroek "#66",
933*66dfcc85SDavid van Moolenbroek "#67",
934*66dfcc85SDavid van Moolenbroek "#68",
935*66dfcc85SDavid van Moolenbroek "#69",
936*66dfcc85SDavid van Moolenbroek "#70",
937*66dfcc85SDavid van Moolenbroek "#71",
938*66dfcc85SDavid van Moolenbroek "#72",
939*66dfcc85SDavid van Moolenbroek "#73",
940*66dfcc85SDavid van Moolenbroek "#74",
941*66dfcc85SDavid van Moolenbroek "#75",
942*66dfcc85SDavid van Moolenbroek "#76",
943*66dfcc85SDavid van Moolenbroek "#77",
944*66dfcc85SDavid van Moolenbroek "#78",
945*66dfcc85SDavid van Moolenbroek "#79",
946*66dfcc85SDavid van Moolenbroek "#80",
947*66dfcc85SDavid van Moolenbroek "#81",
948*66dfcc85SDavid van Moolenbroek "#82",
949*66dfcc85SDavid van Moolenbroek "#83",
950*66dfcc85SDavid van Moolenbroek "#84",
951*66dfcc85SDavid van Moolenbroek "#85",
952*66dfcc85SDavid van Moolenbroek "#86",
953*66dfcc85SDavid van Moolenbroek "#87",
954*66dfcc85SDavid van Moolenbroek "#88",
955*66dfcc85SDavid van Moolenbroek "#89",
956*66dfcc85SDavid van Moolenbroek "#80",
957*66dfcc85SDavid van Moolenbroek "#91",
958*66dfcc85SDavid van Moolenbroek "#92",
959*66dfcc85SDavid van Moolenbroek "#93",
960*66dfcc85SDavid van Moolenbroek "#94",
961*66dfcc85SDavid van Moolenbroek "#95",
962*66dfcc85SDavid van Moolenbroek "#96",
963*66dfcc85SDavid van Moolenbroek "#97",
964*66dfcc85SDavid van Moolenbroek "#98",
965*66dfcc85SDavid van Moolenbroek "#99",
966*66dfcc85SDavid van Moolenbroek "#100",
967*66dfcc85SDavid van Moolenbroek "#101",
968*66dfcc85SDavid van Moolenbroek "#102",
969*66dfcc85SDavid van Moolenbroek "#103",
970*66dfcc85SDavid van Moolenbroek "#104",
971*66dfcc85SDavid van Moolenbroek "#105",
972*66dfcc85SDavid van Moolenbroek "#106",
973*66dfcc85SDavid van Moolenbroek "#107",
974*66dfcc85SDavid van Moolenbroek "#108",
975*66dfcc85SDavid van Moolenbroek "#109",
976*66dfcc85SDavid van Moolenbroek "#110",
977*66dfcc85SDavid van Moolenbroek "#111",
978*66dfcc85SDavid van Moolenbroek "#112",
979*66dfcc85SDavid van Moolenbroek "#113",
980*66dfcc85SDavid van Moolenbroek "#114",
981*66dfcc85SDavid van Moolenbroek "#115",
982*66dfcc85SDavid van Moolenbroek "#116",
983*66dfcc85SDavid van Moolenbroek "#117",
984*66dfcc85SDavid van Moolenbroek "#118",
985*66dfcc85SDavid van Moolenbroek "#119",
986*66dfcc85SDavid van Moolenbroek "#120",
987*66dfcc85SDavid van Moolenbroek "#121",
988*66dfcc85SDavid van Moolenbroek "#122",
989*66dfcc85SDavid van Moolenbroek "#123",
990*66dfcc85SDavid van Moolenbroek "#124",
991*66dfcc85SDavid van Moolenbroek "#125",
992*66dfcc85SDavid van Moolenbroek "#126",
993*66dfcc85SDavid van Moolenbroek "#127",
994*66dfcc85SDavid van Moolenbroek "echo",
995*66dfcc85SDavid van Moolenbroek "echo reply",
996*66dfcc85SDavid van Moolenbroek "multicast listener query",
997*66dfcc85SDavid van Moolenbroek "multicast listener report",
998*66dfcc85SDavid van Moolenbroek "multicast listener done",
999*66dfcc85SDavid van Moolenbroek "router solicitation",
1000*66dfcc85SDavid van Moolenbroek "router advertisement",
1001*66dfcc85SDavid van Moolenbroek "neighbor solicitation",
1002*66dfcc85SDavid van Moolenbroek "neighbor advertisement",
1003*66dfcc85SDavid van Moolenbroek "redirect",
1004*66dfcc85SDavid van Moolenbroek "router renumbering",
1005*66dfcc85SDavid van Moolenbroek "node information request",
1006*66dfcc85SDavid van Moolenbroek "node information reply",
1007*66dfcc85SDavid van Moolenbroek "#141",
1008*66dfcc85SDavid van Moolenbroek "#142",
1009*66dfcc85SDavid van Moolenbroek "#143",
1010*66dfcc85SDavid van Moolenbroek "#144",
1011*66dfcc85SDavid van Moolenbroek "#145",
1012*66dfcc85SDavid van Moolenbroek "#146",
1013*66dfcc85SDavid van Moolenbroek "#147",
1014*66dfcc85SDavid van Moolenbroek "#148",
1015*66dfcc85SDavid van Moolenbroek "#149",
1016*66dfcc85SDavid van Moolenbroek "#150",
1017*66dfcc85SDavid van Moolenbroek "#151",
1018*66dfcc85SDavid van Moolenbroek "#152",
1019*66dfcc85SDavid van Moolenbroek "#153",
1020*66dfcc85SDavid van Moolenbroek "#154",
1021*66dfcc85SDavid van Moolenbroek "#155",
1022*66dfcc85SDavid van Moolenbroek "#156",
1023*66dfcc85SDavid van Moolenbroek "#157",
1024*66dfcc85SDavid van Moolenbroek "#158",
1025*66dfcc85SDavid van Moolenbroek "#159",
1026*66dfcc85SDavid van Moolenbroek "#160",
1027*66dfcc85SDavid van Moolenbroek "#161",
1028*66dfcc85SDavid van Moolenbroek "#162",
1029*66dfcc85SDavid van Moolenbroek "#163",
1030*66dfcc85SDavid van Moolenbroek "#164",
1031*66dfcc85SDavid van Moolenbroek "#165",
1032*66dfcc85SDavid van Moolenbroek "#166",
1033*66dfcc85SDavid van Moolenbroek "#167",
1034*66dfcc85SDavid van Moolenbroek "#168",
1035*66dfcc85SDavid van Moolenbroek "#169",
1036*66dfcc85SDavid van Moolenbroek "#170",
1037*66dfcc85SDavid van Moolenbroek "#171",
1038*66dfcc85SDavid van Moolenbroek "#172",
1039*66dfcc85SDavid van Moolenbroek "#173",
1040*66dfcc85SDavid van Moolenbroek "#174",
1041*66dfcc85SDavid van Moolenbroek "#175",
1042*66dfcc85SDavid van Moolenbroek "#176",
1043*66dfcc85SDavid van Moolenbroek "#177",
1044*66dfcc85SDavid van Moolenbroek "#178",
1045*66dfcc85SDavid van Moolenbroek "#179",
1046*66dfcc85SDavid van Moolenbroek "#180",
1047*66dfcc85SDavid van Moolenbroek "#181",
1048*66dfcc85SDavid van Moolenbroek "#182",
1049*66dfcc85SDavid van Moolenbroek "#183",
1050*66dfcc85SDavid van Moolenbroek "#184",
1051*66dfcc85SDavid van Moolenbroek "#185",
1052*66dfcc85SDavid van Moolenbroek "#186",
1053*66dfcc85SDavid van Moolenbroek "#187",
1054*66dfcc85SDavid van Moolenbroek "#188",
1055*66dfcc85SDavid van Moolenbroek "#189",
1056*66dfcc85SDavid van Moolenbroek "#180",
1057*66dfcc85SDavid van Moolenbroek "#191",
1058*66dfcc85SDavid van Moolenbroek "#192",
1059*66dfcc85SDavid van Moolenbroek "#193",
1060*66dfcc85SDavid van Moolenbroek "#194",
1061*66dfcc85SDavid van Moolenbroek "#195",
1062*66dfcc85SDavid van Moolenbroek "#196",
1063*66dfcc85SDavid van Moolenbroek "#197",
1064*66dfcc85SDavid van Moolenbroek "#198",
1065*66dfcc85SDavid van Moolenbroek "#199",
1066*66dfcc85SDavid van Moolenbroek "#200",
1067*66dfcc85SDavid van Moolenbroek "#201",
1068*66dfcc85SDavid van Moolenbroek "#202",
1069*66dfcc85SDavid van Moolenbroek "#203",
1070*66dfcc85SDavid van Moolenbroek "#204",
1071*66dfcc85SDavid van Moolenbroek "#205",
1072*66dfcc85SDavid van Moolenbroek "#206",
1073*66dfcc85SDavid van Moolenbroek "#207",
1074*66dfcc85SDavid van Moolenbroek "#208",
1075*66dfcc85SDavid van Moolenbroek "#209",
1076*66dfcc85SDavid van Moolenbroek "#210",
1077*66dfcc85SDavid van Moolenbroek "#211",
1078*66dfcc85SDavid van Moolenbroek "#212",
1079*66dfcc85SDavid van Moolenbroek "#213",
1080*66dfcc85SDavid van Moolenbroek "#214",
1081*66dfcc85SDavid van Moolenbroek "#215",
1082*66dfcc85SDavid van Moolenbroek "#216",
1083*66dfcc85SDavid van Moolenbroek "#217",
1084*66dfcc85SDavid van Moolenbroek "#218",
1085*66dfcc85SDavid van Moolenbroek "#219",
1086*66dfcc85SDavid van Moolenbroek "#220",
1087*66dfcc85SDavid van Moolenbroek "#221",
1088*66dfcc85SDavid van Moolenbroek "#222",
1089*66dfcc85SDavid van Moolenbroek "#223",
1090*66dfcc85SDavid van Moolenbroek "#224",
1091*66dfcc85SDavid van Moolenbroek "#225",
1092*66dfcc85SDavid van Moolenbroek "#226",
1093*66dfcc85SDavid van Moolenbroek "#227",
1094*66dfcc85SDavid van Moolenbroek "#228",
1095*66dfcc85SDavid van Moolenbroek "#229",
1096*66dfcc85SDavid van Moolenbroek "#230",
1097*66dfcc85SDavid van Moolenbroek "#231",
1098*66dfcc85SDavid van Moolenbroek "#232",
1099*66dfcc85SDavid van Moolenbroek "#233",
1100*66dfcc85SDavid van Moolenbroek "#234",
1101*66dfcc85SDavid van Moolenbroek "#235",
1102*66dfcc85SDavid van Moolenbroek "#236",
1103*66dfcc85SDavid van Moolenbroek "#237",
1104*66dfcc85SDavid van Moolenbroek "#238",
1105*66dfcc85SDavid van Moolenbroek "#239",
1106*66dfcc85SDavid van Moolenbroek "#240",
1107*66dfcc85SDavid van Moolenbroek "#241",
1108*66dfcc85SDavid van Moolenbroek "#242",
1109*66dfcc85SDavid van Moolenbroek "#243",
1110*66dfcc85SDavid van Moolenbroek "#244",
1111*66dfcc85SDavid van Moolenbroek "#245",
1112*66dfcc85SDavid van Moolenbroek "#246",
1113*66dfcc85SDavid van Moolenbroek "#247",
1114*66dfcc85SDavid van Moolenbroek "#248",
1115*66dfcc85SDavid van Moolenbroek "#249",
1116*66dfcc85SDavid van Moolenbroek "#250",
1117*66dfcc85SDavid van Moolenbroek "#251",
1118*66dfcc85SDavid van Moolenbroek "#252",
1119*66dfcc85SDavid van Moolenbroek "#253",
1120*66dfcc85SDavid van Moolenbroek "#254",
1121*66dfcc85SDavid van Moolenbroek "#255",
1122*66dfcc85SDavid van Moolenbroek };
1123*66dfcc85SDavid van Moolenbroek
1124*66dfcc85SDavid van Moolenbroek /*
1125*66dfcc85SDavid van Moolenbroek * Dump ICMPv6 statistics.
1126*66dfcc85SDavid van Moolenbroek */
1127*66dfcc85SDavid van Moolenbroek void
icmp6_stats(u_long off,const char * name)1128*66dfcc85SDavid van Moolenbroek icmp6_stats(u_long off, const char *name)
1129*66dfcc85SDavid van Moolenbroek {
1130*66dfcc85SDavid van Moolenbroek uint64_t icmp6stat[ICMP6_NSTATS];
1131*66dfcc85SDavid van Moolenbroek int i, first;
1132*66dfcc85SDavid van Moolenbroek
1133*66dfcc85SDavid van Moolenbroek if (use_sysctl) {
1134*66dfcc85SDavid van Moolenbroek size_t size = sizeof(icmp6stat);
1135*66dfcc85SDavid van Moolenbroek
1136*66dfcc85SDavid van Moolenbroek if (sysctlbyname("net.inet6.icmp6.stats", icmp6stat, &size,
1137*66dfcc85SDavid van Moolenbroek NULL, 0) == -1)
1138*66dfcc85SDavid van Moolenbroek return;
1139*66dfcc85SDavid van Moolenbroek } else {
1140*66dfcc85SDavid van Moolenbroek warnx("%s stats not available via KVM.", name);
1141*66dfcc85SDavid van Moolenbroek return;
1142*66dfcc85SDavid van Moolenbroek }
1143*66dfcc85SDavid van Moolenbroek
1144*66dfcc85SDavid van Moolenbroek printf("%s:\n", name);
1145*66dfcc85SDavid van Moolenbroek
1146*66dfcc85SDavid van Moolenbroek #define p(f, m) if (icmp6stat[f] || sflag <= 1) \
1147*66dfcc85SDavid van Moolenbroek printf(m, (unsigned long long)icmp6stat[f], plural(icmp6stat[f]))
1148*66dfcc85SDavid van Moolenbroek #define p_oerr(f, m) if (icmp6stat[ICMP6_STAT_OUTERRHIST + f] || sflag <= 1) \
1149*66dfcc85SDavid van Moolenbroek printf(m, (unsigned long long)icmp6stat[ICMP6_STAT_OUTERRHIST + f])
1150*66dfcc85SDavid van Moolenbroek
1151*66dfcc85SDavid van Moolenbroek p(ICMP6_STAT_ERROR, "\t%llu call%s to icmp6_error\n");
1152*66dfcc85SDavid van Moolenbroek p(ICMP6_STAT_CANTERROR,
1153*66dfcc85SDavid van Moolenbroek "\t%llu error%s not generated because old message was icmp6 or so\n");
1154*66dfcc85SDavid van Moolenbroek p(ICMP6_STAT_TOOFREQ,
1155*66dfcc85SDavid van Moolenbroek "\t%llu error%s not generated because of rate limitation\n");
1156*66dfcc85SDavid van Moolenbroek for (first = 1, i = 0; i < 256; i++)
1157*66dfcc85SDavid van Moolenbroek if (icmp6stat[ICMP6_STAT_OUTHIST + i] != 0) {
1158*66dfcc85SDavid van Moolenbroek if (first) {
1159*66dfcc85SDavid van Moolenbroek printf("\tOutput packet histogram:\n");
1160*66dfcc85SDavid van Moolenbroek first = 0;
1161*66dfcc85SDavid van Moolenbroek }
1162*66dfcc85SDavid van Moolenbroek printf("\t\t%s: %llu\n", icmp6names[i],
1163*66dfcc85SDavid van Moolenbroek (unsigned long long)icmp6stat[ICMP6_STAT_OUTHIST + i]);
1164*66dfcc85SDavid van Moolenbroek }
1165*66dfcc85SDavid van Moolenbroek p(ICMP6_STAT_BADCODE, "\t%llu message%s with bad code fields\n");
1166*66dfcc85SDavid van Moolenbroek p(ICMP6_STAT_TOOSHORT, "\t%llu message%s < minimum length\n");
1167*66dfcc85SDavid van Moolenbroek p(ICMP6_STAT_CHECKSUM, "\t%llu bad checksum%s\n");
1168*66dfcc85SDavid van Moolenbroek p(ICMP6_STAT_BADLEN, "\t%llu message%s with bad length\n");
1169*66dfcc85SDavid van Moolenbroek for (first = 1, i = 0; i < ICMP6_MAXTYPE; i++)
1170*66dfcc85SDavid van Moolenbroek if (icmp6stat[ICMP6_STAT_INHIST + i] != 0) {
1171*66dfcc85SDavid van Moolenbroek if (first) {
1172*66dfcc85SDavid van Moolenbroek printf("\tInput packet histogram:\n");
1173*66dfcc85SDavid van Moolenbroek first = 0;
1174*66dfcc85SDavid van Moolenbroek }
1175*66dfcc85SDavid van Moolenbroek printf("\t\t%s: %llu\n", icmp6names[i],
1176*66dfcc85SDavid van Moolenbroek (unsigned long long)icmp6stat[ICMP6_STAT_INHIST + i]);
1177*66dfcc85SDavid van Moolenbroek }
1178*66dfcc85SDavid van Moolenbroek printf("\tHistogram of error messages to be generated:\n");
1179*66dfcc85SDavid van Moolenbroek p_oerr(ICMP6_ERRSTAT_DST_UNREACH_NOROUTE, "\t\t%llu no route\n");
1180*66dfcc85SDavid van Moolenbroek p_oerr(ICMP6_ERRSTAT_DST_UNREACH_ADMIN, "\t\t%llu administratively prohibited\n");
1181*66dfcc85SDavid van Moolenbroek p_oerr(ICMP6_ERRSTAT_DST_UNREACH_BEYONDSCOPE, "\t\t%llu beyond scope\n");
1182*66dfcc85SDavid van Moolenbroek p_oerr(ICMP6_ERRSTAT_DST_UNREACH_ADDR, "\t\t%llu address unreachable\n");
1183*66dfcc85SDavid van Moolenbroek p_oerr(ICMP6_ERRSTAT_DST_UNREACH_NOPORT, "\t\t%llu port unreachable\n");
1184*66dfcc85SDavid van Moolenbroek p_oerr(ICMP6_ERRSTAT_PACKET_TOO_BIG, "\t\t%llu packet too big\n");
1185*66dfcc85SDavid van Moolenbroek p_oerr(ICMP6_ERRSTAT_TIME_EXCEED_TRANSIT, "\t\t%llu time exceed transit\n");
1186*66dfcc85SDavid van Moolenbroek p_oerr(ICMP6_ERRSTAT_TIME_EXCEED_REASSEMBLY, "\t\t%llu time exceed reassembly\n");
1187*66dfcc85SDavid van Moolenbroek p_oerr(ICMP6_ERRSTAT_PARAMPROB_HEADER, "\t\t%llu erroneous header field\n");
1188*66dfcc85SDavid van Moolenbroek p_oerr(ICMP6_ERRSTAT_PARAMPROB_NEXTHEADER, "\t\t%llu unrecognized next header\n");
1189*66dfcc85SDavid van Moolenbroek p_oerr(ICMP6_ERRSTAT_PARAMPROB_OPTION, "\t\t%llu unrecognized option\n");
1190*66dfcc85SDavid van Moolenbroek p_oerr(ICMP6_ERRSTAT_REDIRECT, "\t\t%llu redirect\n");
1191*66dfcc85SDavid van Moolenbroek p_oerr(ICMP6_ERRSTAT_UNKNOWN, "\t\t%llu unknown\n");
1192*66dfcc85SDavid van Moolenbroek
1193*66dfcc85SDavid van Moolenbroek p(ICMP6_STAT_REFLECT, "\t%llu message response%s generated\n");
1194*66dfcc85SDavid van Moolenbroek p(ICMP6_STAT_ND_TOOMANYOPT, "\t%llu message%s with too many ND options\n");
1195*66dfcc85SDavid van Moolenbroek p(ICMP6_STAT_ND_BADOPT, "\t%llu message%s with bad ND options\n");
1196*66dfcc85SDavid van Moolenbroek p(ICMP6_STAT_BADNS, "\t%llu bad neighbor solicitation message%s\n");
1197*66dfcc85SDavid van Moolenbroek p(ICMP6_STAT_BADNA, "\t%llu bad neighbor advertisement message%s\n");
1198*66dfcc85SDavid van Moolenbroek p(ICMP6_STAT_BADRS, "\t%llu bad router solicitation message%s\n");
1199*66dfcc85SDavid van Moolenbroek p(ICMP6_STAT_BADRA, "\t%llu bad router advertisement message%s\n");
1200*66dfcc85SDavid van Moolenbroek p(ICMP6_STAT_DROPPED_RAROUTE, "\t%llu router advertisement route%s dropped\n");
1201*66dfcc85SDavid van Moolenbroek p(ICMP6_STAT_BADREDIRECT, "\t%llu bad redirect message%s\n");
1202*66dfcc85SDavid van Moolenbroek p(ICMP6_STAT_PMTUCHG, "\t%llu path MTU change%s\n");
1203*66dfcc85SDavid van Moolenbroek #undef p
1204*66dfcc85SDavid van Moolenbroek #undef p_oerr
1205*66dfcc85SDavid van Moolenbroek }
1206*66dfcc85SDavid van Moolenbroek
1207*66dfcc85SDavid van Moolenbroek /*
1208*66dfcc85SDavid van Moolenbroek * Dump ICMPv6 per-interface statistics based on RFC 2466.
1209*66dfcc85SDavid van Moolenbroek */
1210*66dfcc85SDavid van Moolenbroek void
icmp6_ifstats(const char * ifname)1211*66dfcc85SDavid van Moolenbroek icmp6_ifstats(const char *ifname)
1212*66dfcc85SDavid van Moolenbroek {
1213*66dfcc85SDavid van Moolenbroek struct in6_ifreq ifr;
1214*66dfcc85SDavid van Moolenbroek int s;
1215*66dfcc85SDavid van Moolenbroek #define p(f, m) if (ifr.ifr_ifru.ifru_icmp6stat.f || sflag <= 1) \
1216*66dfcc85SDavid van Moolenbroek printf(m, (unsigned long long)ifr.ifr_ifru.ifru_icmp6stat.f, \
1217*66dfcc85SDavid van Moolenbroek plural(ifr.ifr_ifru.ifru_icmp6stat.f))
1218*66dfcc85SDavid van Moolenbroek
1219*66dfcc85SDavid van Moolenbroek if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
1220*66dfcc85SDavid van Moolenbroek perror("Warning: socket(AF_INET6)");
1221*66dfcc85SDavid van Moolenbroek return;
1222*66dfcc85SDavid van Moolenbroek }
1223*66dfcc85SDavid van Moolenbroek
1224*66dfcc85SDavid van Moolenbroek strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
1225*66dfcc85SDavid van Moolenbroek printf("icmp6 on %s:\n", ifname);
1226*66dfcc85SDavid van Moolenbroek
1227*66dfcc85SDavid van Moolenbroek if (ioctl(s, SIOCGIFSTAT_ICMP6, (char *)&ifr) < 0) {
1228*66dfcc85SDavid van Moolenbroek perror("Warning: ioctl(SIOCGIFSTAT_ICMP6)");
1229*66dfcc85SDavid van Moolenbroek goto end;
1230*66dfcc85SDavid van Moolenbroek }
1231*66dfcc85SDavid van Moolenbroek
1232*66dfcc85SDavid van Moolenbroek p(ifs6_in_msg, "\t%llu total input message%s\n");
1233*66dfcc85SDavid van Moolenbroek p(ifs6_in_error, "\t%llu total input error message%s\n");
1234*66dfcc85SDavid van Moolenbroek p(ifs6_in_dstunreach, "\t%llu input destination unreachable error%s\n");
1235*66dfcc85SDavid van Moolenbroek p(ifs6_in_adminprohib, "\t%llu input administratively prohibited error%s\n");
1236*66dfcc85SDavid van Moolenbroek p(ifs6_in_timeexceed, "\t%llu input time exceeded error%s\n");
1237*66dfcc85SDavid van Moolenbroek p(ifs6_in_paramprob, "\t%llu input parameter problem error%s\n");
1238*66dfcc85SDavid van Moolenbroek p(ifs6_in_pkttoobig, "\t%llu input packet too big error%s\n");
1239*66dfcc85SDavid van Moolenbroek p(ifs6_in_echo, "\t%llu input echo request%s\n");
1240*66dfcc85SDavid van Moolenbroek p(ifs6_in_echoreply, "\t%llu input echo reply%s\n");
1241*66dfcc85SDavid van Moolenbroek p(ifs6_in_routersolicit, "\t%llu input router solicitation%s\n");
1242*66dfcc85SDavid van Moolenbroek p(ifs6_in_routeradvert, "\t%llu input router advertisement%s\n");
1243*66dfcc85SDavid van Moolenbroek p(ifs6_in_neighborsolicit, "\t%llu input neighbor solicitation%s\n");
1244*66dfcc85SDavid van Moolenbroek p(ifs6_in_neighboradvert, "\t%llu input neighbor advertisement%s\n");
1245*66dfcc85SDavid van Moolenbroek p(ifs6_in_redirect, "\t%llu input redirect%s\n");
1246*66dfcc85SDavid van Moolenbroek p(ifs6_in_mldquery, "\t%llu input MLD query%s\n");
1247*66dfcc85SDavid van Moolenbroek p(ifs6_in_mldreport, "\t%llu input MLD report%s\n");
1248*66dfcc85SDavid van Moolenbroek p(ifs6_in_mlddone, "\t%llu input MLD done%s\n");
1249*66dfcc85SDavid van Moolenbroek
1250*66dfcc85SDavid van Moolenbroek p(ifs6_out_msg, "\t%llu total output message%s\n");
1251*66dfcc85SDavid van Moolenbroek p(ifs6_out_error, "\t%llu total output error message%s\n");
1252*66dfcc85SDavid van Moolenbroek p(ifs6_out_dstunreach, "\t%llu output destination unreachable error%s\n");
1253*66dfcc85SDavid van Moolenbroek p(ifs6_out_adminprohib, "\t%llu output administratively prohibited error%s\n");
1254*66dfcc85SDavid van Moolenbroek p(ifs6_out_timeexceed, "\t%llu output time exceeded error%s\n");
1255*66dfcc85SDavid van Moolenbroek p(ifs6_out_paramprob, "\t%llu output parameter problem error%s\n");
1256*66dfcc85SDavid van Moolenbroek p(ifs6_out_pkttoobig, "\t%llu output packet too big error%s\n");
1257*66dfcc85SDavid van Moolenbroek p(ifs6_out_echo, "\t%llu output echo request%s\n");
1258*66dfcc85SDavid van Moolenbroek p(ifs6_out_echoreply, "\t%llu output echo reply%s\n");
1259*66dfcc85SDavid van Moolenbroek p(ifs6_out_routersolicit, "\t%llu output router solicitation%s\n");
1260*66dfcc85SDavid van Moolenbroek p(ifs6_out_routeradvert, "\t%llu output router advertisement%s\n");
1261*66dfcc85SDavid van Moolenbroek p(ifs6_out_neighborsolicit, "\t%llu output neighbor solicitation%s\n");
1262*66dfcc85SDavid van Moolenbroek p(ifs6_out_neighboradvert, "\t%llu output neighbor advertisement%s\n");
1263*66dfcc85SDavid van Moolenbroek p(ifs6_out_redirect, "\t%llu output redirect%s\n");
1264*66dfcc85SDavid van Moolenbroek p(ifs6_out_mldquery, "\t%llu output MLD query%s\n");
1265*66dfcc85SDavid van Moolenbroek p(ifs6_out_mldreport, "\t%llu output MLD report%s\n");
1266*66dfcc85SDavid van Moolenbroek p(ifs6_out_mlddone, "\t%llu output MLD done%s\n");
1267*66dfcc85SDavid van Moolenbroek
1268*66dfcc85SDavid van Moolenbroek end:
1269*66dfcc85SDavid van Moolenbroek close(s);
1270*66dfcc85SDavid van Moolenbroek #undef p
1271*66dfcc85SDavid van Moolenbroek }
1272*66dfcc85SDavid van Moolenbroek
1273*66dfcc85SDavid van Moolenbroek /*
1274*66dfcc85SDavid van Moolenbroek * Dump PIM statistics structure.
1275*66dfcc85SDavid van Moolenbroek */
1276*66dfcc85SDavid van Moolenbroek void
pim6_stats(u_long off,const char * name)1277*66dfcc85SDavid van Moolenbroek pim6_stats(u_long off, const char *name)
1278*66dfcc85SDavid van Moolenbroek {
1279*66dfcc85SDavid van Moolenbroek uint64_t pim6stat[PIM6_NSTATS];
1280*66dfcc85SDavid van Moolenbroek
1281*66dfcc85SDavid van Moolenbroek if (use_sysctl) {
1282*66dfcc85SDavid van Moolenbroek size_t size = sizeof(pim6stat);
1283*66dfcc85SDavid van Moolenbroek
1284*66dfcc85SDavid van Moolenbroek if (sysctlbyname("net.inet6.pim6.stats", pim6stat, &size,
1285*66dfcc85SDavid van Moolenbroek NULL, 0) == -1)
1286*66dfcc85SDavid van Moolenbroek return;
1287*66dfcc85SDavid van Moolenbroek } else {
1288*66dfcc85SDavid van Moolenbroek warnx("%s stats not available via KVM.", name);
1289*66dfcc85SDavid van Moolenbroek return;
1290*66dfcc85SDavid van Moolenbroek }
1291*66dfcc85SDavid van Moolenbroek printf("%s:\n", name);
1292*66dfcc85SDavid van Moolenbroek
1293*66dfcc85SDavid van Moolenbroek #define p(f, m) if (pim6stat[f] || sflag <= 1) \
1294*66dfcc85SDavid van Moolenbroek printf(m, (unsigned long long)pim6stat[f], plural(pim6stat[f]))
1295*66dfcc85SDavid van Moolenbroek p(PIM6_STAT_RCV_TOTAL, "\t%llu message%s received\n");
1296*66dfcc85SDavid van Moolenbroek p(PIM6_STAT_RCV_TOOSHORT, "\t%llu message%s received with too few bytes\n");
1297*66dfcc85SDavid van Moolenbroek p(PIM6_STAT_RCV_BADSUM, "\t%llu message%s received with bad checksum\n");
1298*66dfcc85SDavid van Moolenbroek p(PIM6_STAT_RCV_BADVERSION, "\t%llu message%s received with bad version\n");
1299*66dfcc85SDavid van Moolenbroek p(PIM6_STAT_RCV_REGISTERS, "\t%llu register%s received\n");
1300*66dfcc85SDavid van Moolenbroek p(PIM6_STAT_RCV_BADREGISTERS, "\t%llu bad register%s received\n");
1301*66dfcc85SDavid van Moolenbroek p(PIM6_STAT_SND_REGISTERS, "\t%llu register%s sent\n");
1302*66dfcc85SDavid van Moolenbroek #undef p
1303*66dfcc85SDavid van Moolenbroek }
1304*66dfcc85SDavid van Moolenbroek
1305*66dfcc85SDavid van Moolenbroek /*
1306*66dfcc85SDavid van Moolenbroek * Dump raw ip6 statistics structure.
1307*66dfcc85SDavid van Moolenbroek */
1308*66dfcc85SDavid van Moolenbroek void
rip6_stats(u_long off,const char * name)1309*66dfcc85SDavid van Moolenbroek rip6_stats(u_long off, const char *name)
1310*66dfcc85SDavid van Moolenbroek {
1311*66dfcc85SDavid van Moolenbroek uint64_t rip6stat[RIP6_NSTATS];
1312*66dfcc85SDavid van Moolenbroek u_quad_t delivered;
1313*66dfcc85SDavid van Moolenbroek
1314*66dfcc85SDavid van Moolenbroek if (use_sysctl) {
1315*66dfcc85SDavid van Moolenbroek size_t size = sizeof(rip6stat);
1316*66dfcc85SDavid van Moolenbroek
1317*66dfcc85SDavid van Moolenbroek if (sysctlbyname("net.inet6.raw6.stats", rip6stat, &size,
1318*66dfcc85SDavid van Moolenbroek NULL, 0) == -1)
1319*66dfcc85SDavid van Moolenbroek return;
1320*66dfcc85SDavid van Moolenbroek } else {
1321*66dfcc85SDavid van Moolenbroek warnx("%s stats not available via KVM.", name);
1322*66dfcc85SDavid van Moolenbroek return;
1323*66dfcc85SDavid van Moolenbroek }
1324*66dfcc85SDavid van Moolenbroek printf("%s:\n", name);
1325*66dfcc85SDavid van Moolenbroek
1326*66dfcc85SDavid van Moolenbroek #define p(f, m) if (rip6stat[f] || sflag <= 1) \
1327*66dfcc85SDavid van Moolenbroek printf(m, (unsigned long long)rip6stat[f], plural(rip6stat[f]))
1328*66dfcc85SDavid van Moolenbroek p(RIP6_STAT_IPACKETS, "\t%llu message%s received\n");
1329*66dfcc85SDavid van Moolenbroek p(RIP6_STAT_ISUM, "\t%llu checksum calculation%s on inbound\n");
1330*66dfcc85SDavid van Moolenbroek p(RIP6_STAT_BADSUM, "\t%llu message%s with bad checksum\n");
1331*66dfcc85SDavid van Moolenbroek p(RIP6_STAT_NOSOCK, "\t%llu message%s dropped due to no socket\n");
1332*66dfcc85SDavid van Moolenbroek p(RIP6_STAT_NOSOCKMCAST,
1333*66dfcc85SDavid van Moolenbroek "\t%llu multicast message%s dropped due to no socket\n");
1334*66dfcc85SDavid van Moolenbroek p(RIP6_STAT_FULLSOCK,
1335*66dfcc85SDavid van Moolenbroek "\t%llu message%s dropped due to full socket buffers\n");
1336*66dfcc85SDavid van Moolenbroek delivered = rip6stat[RIP6_STAT_IPACKETS] -
1337*66dfcc85SDavid van Moolenbroek rip6stat[RIP6_STAT_BADSUM] -
1338*66dfcc85SDavid van Moolenbroek rip6stat[RIP6_STAT_NOSOCK] -
1339*66dfcc85SDavid van Moolenbroek rip6stat[RIP6_STAT_NOSOCKMCAST] -
1340*66dfcc85SDavid van Moolenbroek rip6stat[RIP6_STAT_FULLSOCK];
1341*66dfcc85SDavid van Moolenbroek if (delivered || sflag <= 1)
1342*66dfcc85SDavid van Moolenbroek printf("\t%llu delivered\n", (unsigned long long)delivered);
1343*66dfcc85SDavid van Moolenbroek p(RIP6_STAT_OPACKETS, "\t%llu datagram%s output\n");
1344*66dfcc85SDavid van Moolenbroek #undef p
1345*66dfcc85SDavid van Moolenbroek }
1346*66dfcc85SDavid van Moolenbroek
1347*66dfcc85SDavid van Moolenbroek /*
1348*66dfcc85SDavid van Moolenbroek * Pretty print an Internet address (net address + port).
1349*66dfcc85SDavid van Moolenbroek * Take numeric_addr and numeric_port into consideration.
1350*66dfcc85SDavid van Moolenbroek */
1351*66dfcc85SDavid van Moolenbroek void
inet6print(const struct in6_addr * in6,int port,const char * proto)1352*66dfcc85SDavid van Moolenbroek inet6print(const struct in6_addr *in6, int port, const char *proto)
1353*66dfcc85SDavid van Moolenbroek {
1354*66dfcc85SDavid van Moolenbroek #define GETSERVBYPORT6(port, proto, ret)\
1355*66dfcc85SDavid van Moolenbroek do {\
1356*66dfcc85SDavid van Moolenbroek if (strcmp((proto), "tcp6") == 0)\
1357*66dfcc85SDavid van Moolenbroek (ret) = getservbyport((int)(port), "tcp");\
1358*66dfcc85SDavid van Moolenbroek else if (strcmp((proto), "udp6") == 0)\
1359*66dfcc85SDavid van Moolenbroek (ret) = getservbyport((int)(port), "udp");\
1360*66dfcc85SDavid van Moolenbroek else\
1361*66dfcc85SDavid van Moolenbroek (ret) = getservbyport((int)(port), (proto));\
1362*66dfcc85SDavid van Moolenbroek } while (0)
1363*66dfcc85SDavid van Moolenbroek struct servent *sp = 0;
1364*66dfcc85SDavid van Moolenbroek char line[80], *cp;
1365*66dfcc85SDavid van Moolenbroek int lwidth;
1366*66dfcc85SDavid van Moolenbroek
1367*66dfcc85SDavid van Moolenbroek lwidth = Aflag ? 12 : 16;
1368*66dfcc85SDavid van Moolenbroek if (vflag && lwidth < (int)strlen(inet6name(in6)))
1369*66dfcc85SDavid van Moolenbroek lwidth = strlen(inet6name(in6));
1370*66dfcc85SDavid van Moolenbroek snprintf(line, sizeof(line), "%.*s.", lwidth, inet6name(in6));
1371*66dfcc85SDavid van Moolenbroek cp = strchr(line, '\0');
1372*66dfcc85SDavid van Moolenbroek if (!numeric_port && port)
1373*66dfcc85SDavid van Moolenbroek GETSERVBYPORT6(port, proto, sp);
1374*66dfcc85SDavid van Moolenbroek if (sp || port == 0)
1375*66dfcc85SDavid van Moolenbroek snprintf(cp, sizeof(line) - (cp - line),
1376*66dfcc85SDavid van Moolenbroek "%s", sp ? sp->s_name : "*");
1377*66dfcc85SDavid van Moolenbroek else
1378*66dfcc85SDavid van Moolenbroek snprintf(cp, sizeof(line) - (cp - line),
1379*66dfcc85SDavid van Moolenbroek "%d", ntohs((u_short)port));
1380*66dfcc85SDavid van Moolenbroek lwidth = Aflag ? 18 : 22;
1381*66dfcc85SDavid van Moolenbroek if (vflag && lwidth < (int)strlen(line))
1382*66dfcc85SDavid van Moolenbroek lwidth = strlen(line);
1383*66dfcc85SDavid van Moolenbroek printf(" %-*.*s", lwidth, lwidth, line);
1384*66dfcc85SDavid van Moolenbroek }
1385*66dfcc85SDavid van Moolenbroek
1386*66dfcc85SDavid van Moolenbroek /*
1387*66dfcc85SDavid van Moolenbroek * Construct an Internet address representation.
1388*66dfcc85SDavid van Moolenbroek * If the numeric_addr has been supplied, give
1389*66dfcc85SDavid van Moolenbroek * numeric value, otherwise try for symbolic name.
1390*66dfcc85SDavid van Moolenbroek */
1391*66dfcc85SDavid van Moolenbroek
1392*66dfcc85SDavid van Moolenbroek char *
inet6name(const struct in6_addr * in6p)1393*66dfcc85SDavid van Moolenbroek inet6name(const struct in6_addr *in6p)
1394*66dfcc85SDavid van Moolenbroek {
1395*66dfcc85SDavid van Moolenbroek char *cp;
1396*66dfcc85SDavid van Moolenbroek static char line[NI_MAXHOST];
1397*66dfcc85SDavid van Moolenbroek struct hostent *hp;
1398*66dfcc85SDavid van Moolenbroek static char domain[MAXHOSTNAMELEN + 1];
1399*66dfcc85SDavid van Moolenbroek static int first = 1;
1400*66dfcc85SDavid van Moolenbroek char hbuf[NI_MAXHOST];
1401*66dfcc85SDavid van Moolenbroek struct sockaddr_in6 sin6;
1402*66dfcc85SDavid van Moolenbroek const int niflag = NI_NUMERICHOST;
1403*66dfcc85SDavid van Moolenbroek
1404*66dfcc85SDavid van Moolenbroek if (first && !numeric_addr) {
1405*66dfcc85SDavid van Moolenbroek first = 0;
1406*66dfcc85SDavid van Moolenbroek if (gethostname(domain, MAXHOSTNAMELEN) == 0 &&
1407*66dfcc85SDavid van Moolenbroek (cp = strchr(domain, '.')))
1408*66dfcc85SDavid van Moolenbroek (void) strlcpy(domain, cp + 1, sizeof(domain));
1409*66dfcc85SDavid van Moolenbroek else
1410*66dfcc85SDavid van Moolenbroek domain[0] = 0;
1411*66dfcc85SDavid van Moolenbroek }
1412*66dfcc85SDavid van Moolenbroek cp = 0;
1413*66dfcc85SDavid van Moolenbroek if (!numeric_addr && !IN6_IS_ADDR_UNSPECIFIED(in6p)) {
1414*66dfcc85SDavid van Moolenbroek hp = gethostbyaddr((const char *)in6p, sizeof(*in6p), AF_INET6);
1415*66dfcc85SDavid van Moolenbroek if (hp) {
1416*66dfcc85SDavid van Moolenbroek if ((cp = strchr(hp->h_name, '.')) &&
1417*66dfcc85SDavid van Moolenbroek !strcmp(cp + 1, domain))
1418*66dfcc85SDavid van Moolenbroek *cp = 0;
1419*66dfcc85SDavid van Moolenbroek cp = hp->h_name;
1420*66dfcc85SDavid van Moolenbroek }
1421*66dfcc85SDavid van Moolenbroek }
1422*66dfcc85SDavid van Moolenbroek if (IN6_IS_ADDR_UNSPECIFIED(in6p))
1423*66dfcc85SDavid van Moolenbroek strlcpy(line, "*", sizeof(line));
1424*66dfcc85SDavid van Moolenbroek else if (cp)
1425*66dfcc85SDavid van Moolenbroek strlcpy(line, cp, sizeof(line));
1426*66dfcc85SDavid van Moolenbroek else {
1427*66dfcc85SDavid van Moolenbroek memset(&sin6, 0, sizeof(sin6));
1428*66dfcc85SDavid van Moolenbroek sin6.sin6_len = sizeof(sin6);
1429*66dfcc85SDavid van Moolenbroek sin6.sin6_family = AF_INET6;
1430*66dfcc85SDavid van Moolenbroek sin6.sin6_addr = *in6p;
1431*66dfcc85SDavid van Moolenbroek inet6_getscopeid(&sin6, INET6_IS_ADDR_LINKLOCAL|
1432*66dfcc85SDavid van Moolenbroek INET6_IS_ADDR_MC_LINKLOCAL);
1433*66dfcc85SDavid van Moolenbroek if (getnameinfo((struct sockaddr *)&sin6, sin6.sin6_len,
1434*66dfcc85SDavid van Moolenbroek hbuf, sizeof(hbuf), NULL, 0, niflag) != 0)
1435*66dfcc85SDavid van Moolenbroek strlcpy(hbuf, "?", sizeof(hbuf));
1436*66dfcc85SDavid van Moolenbroek strlcpy(line, hbuf, sizeof(line));
1437*66dfcc85SDavid van Moolenbroek }
1438*66dfcc85SDavid van Moolenbroek return (line);
1439*66dfcc85SDavid van Moolenbroek }
1440*66dfcc85SDavid van Moolenbroek
1441*66dfcc85SDavid van Moolenbroek /*
1442*66dfcc85SDavid van Moolenbroek * Dump the contents of a TCP6 PCB.
1443*66dfcc85SDavid van Moolenbroek */
1444*66dfcc85SDavid van Moolenbroek void
tcp6_dump(u_long off,const char * name,u_long pcbaddr)1445*66dfcc85SDavid van Moolenbroek tcp6_dump(u_long off, const char *name, u_long pcbaddr)
1446*66dfcc85SDavid van Moolenbroek {
1447*66dfcc85SDavid van Moolenbroek callout_impl_t *ci;
1448*66dfcc85SDavid van Moolenbroek int i, hardticks;
1449*66dfcc85SDavid van Moolenbroek struct kinfo_pcb *pcblist;
1450*66dfcc85SDavid van Moolenbroek #ifdef TCP6
1451*66dfcc85SDavid van Moolenbroek #define mypcb tcp6cb
1452*66dfcc85SDavid van Moolenbroek #else
1453*66dfcc85SDavid van Moolenbroek #define mypcb tcpcb
1454*66dfcc85SDavid van Moolenbroek #endif
1455*66dfcc85SDavid van Moolenbroek size_t j, len;
1456*66dfcc85SDavid van Moolenbroek
1457*66dfcc85SDavid van Moolenbroek if (use_sysctl)
1458*66dfcc85SDavid van Moolenbroek pcblist = getpcblist_sysctl(name, &len);
1459*66dfcc85SDavid van Moolenbroek else
1460*66dfcc85SDavid van Moolenbroek pcblist = getpcblist_kmem(off, name, &len);
1461*66dfcc85SDavid van Moolenbroek
1462*66dfcc85SDavid van Moolenbroek for (j = 0; j < len; j++)
1463*66dfcc85SDavid van Moolenbroek if (pcblist[j].ki_ppcbaddr == pcbaddr)
1464*66dfcc85SDavid van Moolenbroek break;
1465*66dfcc85SDavid van Moolenbroek free(pcblist);
1466*66dfcc85SDavid van Moolenbroek
1467*66dfcc85SDavid van Moolenbroek if (j == len)
1468*66dfcc85SDavid van Moolenbroek errx(1, "0x%lx is not a valid pcb address", pcbaddr);
1469*66dfcc85SDavid van Moolenbroek
1470*66dfcc85SDavid van Moolenbroek kread(pcbaddr, (char *)&mypcb, sizeof(mypcb));
1471*66dfcc85SDavid van Moolenbroek hardticks = get_hardticks();
1472*66dfcc85SDavid van Moolenbroek
1473*66dfcc85SDavid van Moolenbroek printf("TCP Protocol Control Block at 0x%08lx:\n\n", pcbaddr);
1474*66dfcc85SDavid van Moolenbroek printf("Timers:\n");
1475*66dfcc85SDavid van Moolenbroek for (i = 0; i < TCP6T_NTIMERS; i++) {
1476*66dfcc85SDavid van Moolenbroek char buf[128];
1477*66dfcc85SDavid van Moolenbroek ci = (callout_impl_t *)&tcpcb.t_timer[i];
1478*66dfcc85SDavid van Moolenbroek snprintb(buf, sizeof(buf), CALLOUT_FMT, ci->c_flags);
1479*66dfcc85SDavid van Moolenbroek printf("\t%s\t%s", tcptimers[i], buf);
1480*66dfcc85SDavid van Moolenbroek if (ci->c_flags & CALLOUT_PENDING)
1481*66dfcc85SDavid van Moolenbroek printf("\t%d\n", ci->c_time - hardticks);
1482*66dfcc85SDavid van Moolenbroek else
1483*66dfcc85SDavid van Moolenbroek printf("\n");
1484*66dfcc85SDavid van Moolenbroek }
1485*66dfcc85SDavid van Moolenbroek printf("\n\n");
1486*66dfcc85SDavid van Moolenbroek
1487*66dfcc85SDavid van Moolenbroek if (mypcb.t_state < 0 || mypcb.t_state >= TCP6_NSTATES)
1488*66dfcc85SDavid van Moolenbroek printf("State: %d", mypcb.t_state);
1489*66dfcc85SDavid van Moolenbroek else
1490*66dfcc85SDavid van Moolenbroek printf("State: %s", tcp6states[mypcb.t_state]);
1491*66dfcc85SDavid van Moolenbroek printf(", flags 0x%x, in6pcb 0x%lx\n\n", mypcb.t_flags,
1492*66dfcc85SDavid van Moolenbroek (u_long)mypcb.t_in6pcb);
1493*66dfcc85SDavid van Moolenbroek
1494*66dfcc85SDavid van Moolenbroek printf("rxtshift %d, rxtcur %d, dupacks %d\n", mypcb.t_rxtshift,
1495*66dfcc85SDavid van Moolenbroek mypcb.t_rxtcur, mypcb.t_dupacks);
1496*66dfcc85SDavid van Moolenbroek #ifdef TCP6
1497*66dfcc85SDavid van Moolenbroek printf("peermaxseg %u, maxseg %u, force %d\n\n", mypcb.t_peermaxseg,
1498*66dfcc85SDavid van Moolenbroek mypcb.t_maxseg, mypcb.t_force);
1499*66dfcc85SDavid van Moolenbroek #endif
1500*66dfcc85SDavid van Moolenbroek
1501*66dfcc85SDavid van Moolenbroek printf("snd_una %u, snd_nxt %u, snd_up %u\n",
1502*66dfcc85SDavid van Moolenbroek mypcb.snd_una, mypcb.snd_nxt, mypcb.snd_up);
1503*66dfcc85SDavid van Moolenbroek printf("snd_wl1 %u, snd_wl2 %u, iss %u, snd_wnd %llu\n\n",
1504*66dfcc85SDavid van Moolenbroek mypcb.snd_wl1, mypcb.snd_wl2, mypcb.iss,
1505*66dfcc85SDavid van Moolenbroek (unsigned long long)mypcb.snd_wnd);
1506*66dfcc85SDavid van Moolenbroek
1507*66dfcc85SDavid van Moolenbroek printf("rcv_wnd %llu, rcv_nxt %u, rcv_up %u, irs %u\n\n",
1508*66dfcc85SDavid van Moolenbroek (unsigned long long)mypcb.rcv_wnd, mypcb.rcv_nxt,
1509*66dfcc85SDavid van Moolenbroek mypcb.rcv_up, mypcb.irs);
1510*66dfcc85SDavid van Moolenbroek
1511*66dfcc85SDavid van Moolenbroek printf("rcv_adv %u, snd_max %u, snd_cwnd %llu, snd_ssthresh %llu\n",
1512*66dfcc85SDavid van Moolenbroek mypcb.rcv_adv, mypcb.snd_max, (unsigned long long)mypcb.snd_cwnd,
1513*66dfcc85SDavid van Moolenbroek (unsigned long long)mypcb.snd_ssthresh);
1514*66dfcc85SDavid van Moolenbroek
1515*66dfcc85SDavid van Moolenbroek #ifdef TCP6
1516*66dfcc85SDavid van Moolenbroek printf("idle %d, rtt %d, " mypcb.t_idle, mypcb.t_rtt)
1517*66dfcc85SDavid van Moolenbroek #endif
1518*66dfcc85SDavid van Moolenbroek printf("rtseq %u, srtt %d, rttvar %d, rttmin %d, "
1519*66dfcc85SDavid van Moolenbroek "max_sndwnd %llu\n\n", mypcb.t_rtseq,
1520*66dfcc85SDavid van Moolenbroek mypcb.t_srtt, mypcb.t_rttvar, mypcb.t_rttmin,
1521*66dfcc85SDavid van Moolenbroek (unsigned long long)mypcb.max_sndwnd);
1522*66dfcc85SDavid van Moolenbroek
1523*66dfcc85SDavid van Moolenbroek printf("oobflags %d, iobc %d, softerror %d\n\n", mypcb.t_oobflags,
1524*66dfcc85SDavid van Moolenbroek mypcb.t_iobc, mypcb.t_softerror);
1525*66dfcc85SDavid van Moolenbroek
1526*66dfcc85SDavid van Moolenbroek printf("snd_scale %d, rcv_scale %d, req_r_scale %d, req_s_scale %d\n",
1527*66dfcc85SDavid van Moolenbroek mypcb.snd_scale, mypcb.rcv_scale, mypcb.request_r_scale,
1528*66dfcc85SDavid van Moolenbroek mypcb.requested_s_scale);
1529*66dfcc85SDavid van Moolenbroek printf("ts_recent %u, ts_regent_age %d, last_ack_sent %u\n",
1530*66dfcc85SDavid van Moolenbroek mypcb.ts_recent, mypcb.ts_recent_age, mypcb.last_ack_sent);
1531*66dfcc85SDavid van Moolenbroek }
1532*66dfcc85SDavid van Moolenbroek
1533*66dfcc85SDavid van Moolenbroek #endif /*INET6*/
1534