1 /* $NetBSD: inet.c,v 1.91 2009/09/14 10:36:50 degroote Exp $ */
4 * Copyright (c) 1983, 1988, 1993
5 * The Regents of the University of California. All rights reserved.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the University nor the names of its contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 #include <sys/cdefs.h>
35 static char sccsid
[] = "from: @(#)inet.c 8.4 (Berkeley) 4/20/94";
37 __RCSID("$NetBSD: inet.c,v 1.91 2009/09/14 10:36:50 degroote Exp $");
41 #define _CALLOUT_PRIVATE /* for defs in sys/callout.h */
43 #include <sys/param.h>
44 #include <sys/queue.h>
45 #include <sys/socket.h>
46 #include <sys/socketvar.h>
48 #include <sys/protosw.h>
49 #include <sys/sysctl.h>
51 #include <net/if_arp.h>
52 #include <net/route.h>
53 #include <netinet/in.h>
54 #include <netinet/in_systm.h>
55 #include <netinet/ip.h>
56 #include <netinet/in_pcb.h>
57 #include <netinet/ip_icmp.h>
60 #include <netinet/ip6.h>
63 #include <netinet/icmp_var.h>
64 #include <netinet/igmp_var.h>
65 #include <netinet/ip_var.h>
66 #include <netinet/pim_var.h>
67 #include <netinet/tcp.h>
68 #include <netinet/tcpip.h>
69 #include <netinet/tcp_seq.h>
71 #include <netinet/tcp_fsm.h>
73 #include <netinet/tcp_timer.h>
74 #include <netinet/tcp_var.h>
75 #include <netinet/tcp_debug.h>
76 #include <netinet/udp.h>
77 #include <netinet/ip_carp.h>
78 #include <netinet/udp_var.h>
79 #include <net/pfvar.h>
80 #include <net/if_pfsync.h>
82 #include <arpa/inet.h>
92 char *inetname(struct in_addr
*);
93 void inetprint(struct in_addr
*, u_int16_t
, const char *, int);
96 * Print a summary of connections related to an Internet
97 * protocol. For TCP, also give state of connection.
98 * Listening processes (aflag) are suppressed unless the
99 * -a (all) flag is specified.
107 printf("Active Internet connections");
109 printf(" (including servers)");
112 printf("%-8.8s ", "PCB");
113 printf("%-5.5s %-6.6s %-6.6s %s%-*.*s %-*.*s %s\n",
114 "Proto", "Recv-Q", "Send-Q", compact
? "" : " ",
115 width
, width
, "Local Address",
116 width
, width
, "Foreign Address",
121 protopr0(intptr_t ppcb
, u_long rcv_sb_cc
, u_long snd_sb_cc
,
122 struct in_addr
*laddr
, u_int16_t lport
,
123 struct in_addr
*faddr
, u_int16_t fport
,
124 short t_state
, const char *name
, int inp_flags
)
126 static const char *shorttcpstates
[] = {
127 "CLOSED", "LISTEN", "SYNSEN", "SYSRCV",
128 "ESTABL", "CLWAIT", "FWAIT1", "CLOSNG",
129 "LASTAK", "FWAIT2", "TMWAIT",
133 istcp
= strcmp(name
, "tcp") == 0;
136 printf("%8" PRIxPTR
" ", ppcb
);
138 printf("%-5.5s %6ld %6ld%s", name
, rcv_sb_cc
, snd_sb_cc
,
141 inetprint(laddr
, lport
, name
, 1);
142 inetprint(faddr
, fport
, name
, 1);
143 } else if (inp_flags
& INP_ANONPORT
) {
144 inetprint(laddr
, lport
, name
, 1);
145 inetprint(faddr
, fport
, name
, 0);
147 inetprint(laddr
, lport
, name
, 0);
148 inetprint(faddr
, fport
, name
, 0);
151 if (t_state
< 0 || t_state
>= TCP_NSTATES
)
152 printf(" %d", t_state
);
154 printf(" %s", compact
? shorttcpstates
[t_state
] :
161 protopr(u_long off
, const char *name
)
163 struct inpcbtable table
;
164 struct inpcb
*head
, *next
, *prev
;
169 static int first
= 1;
183 struct kinfo_pcb
*pcblist
;
185 size_t namelen
= 0, size
= 0, i
;
186 char *mibname
= NULL
;
188 memset(mib
, 0, sizeof(mib
));
190 if (asprintf(&mibname
, "net.inet.%s.pcblist", name
) == -1)
193 /* get dynamic pcblist node */
194 if (sysctlnametomib(mibname
, mib
, &namelen
) == -1)
195 err(1, "sysctlnametomib: %s", mibname
);
197 if (sysctl(mib
, sizeof(mib
) / sizeof(*mib
), NULL
, &size
,
199 err(1, "sysctl (query)");
201 if ((pcblist
= malloc(size
)) == NULL
)
203 memset(pcblist
, 0, size
);
205 mib
[6] = sizeof(*pcblist
);
206 mib
[7] = size
/ sizeof(*pcblist
);
208 if (sysctl(mib
, sizeof(mib
) / sizeof(*mib
), pcblist
,
209 &size
, NULL
, 0) == -1)
210 err(1, "sysctl (copy)");
212 for (i
= 0; i
< size
/ sizeof(*pcblist
); i
++) {
213 struct sockaddr_in src
, dst
;
215 memcpy(&src
, &pcblist
[i
].ki_s
, sizeof(src
));
216 memcpy(&dst
, &pcblist
[i
].ki_d
, sizeof(dst
));
219 inet_lnaof(dst
.sin_addr
) == INADDR_ANY
)
227 protopr0((intptr_t) pcblist
[i
].ki_ppcbaddr
,
228 pcblist
[i
].ki_rcvq
, pcblist
[i
].ki_sndq
,
229 &src
.sin_addr
, src
.sin_port
,
230 &dst
.sin_addr
, dst
.sin_port
,
231 pcblist
[i
].ki_tstate
, name
,
232 pcblist
[i
].ki_pflags
);
241 istcp
= strcmp(name
, "tcp") == 0;
242 kread(off
, (char *)&table
, sizeof table
);
244 (struct inpcb
*)&((struct inpcbtable
*)off
)->inpt_queue
.cqh_first
;
245 next
= (struct inpcb
*)table
.inpt_queue
.cqh_first
;
247 while (next
!= head
) {
248 kread((u_long
)next
, (char *)&inpcb
, sizeof inpcb
);
249 if ((struct inpcb
*)inpcb
.inp_queue
.cqe_prev
!= prev
) {
254 next
= (struct inpcb
*)inpcb
.inp_queue
.cqe_next
;
256 if (inpcb
.inp_af
!= AF_INET
)
260 inet_lnaof(inpcb
.inp_faddr
) == INADDR_ANY
)
262 kread((u_long
)inpcb
.inp_socket
, (char *)&sockb
, sizeof (sockb
));
264 kread((u_long
)inpcb
.inp_ppcb
,
265 (char *)&tcpcb
, sizeof (tcpcb
));
273 protopr0(istcp
? (intptr_t) inpcb
.inp_ppcb
: (intptr_t) prev
,
274 sockb
.so_rcv
.sb_cc
, sockb
.so_snd
.sb_cc
,
275 &inpcb
.inp_laddr
, inpcb
.inp_lport
,
276 &inpcb
.inp_faddr
, inpcb
.inp_fport
,
277 tcpcb
.t_state
, name
, inpcb
.inp_flags
);
282 * Dump TCP statistics structure.
285 tcp_stats(u_long off
, const char *name
)
287 uint64_t tcpstat
[TCP_NSTATS
];
290 size_t size
= sizeof(tcpstat
);
292 if (sysctlbyname("net.inet.tcp.stats", tcpstat
, &size
,
296 warnx("%s stats not available via KVM.", name
);
300 printf ("%s:\n", name
);
302 #define ps(f, m) if (tcpstat[f] || sflag <= 1) \
303 printf(m, (unsigned long long)tcpstat[f])
304 #define p(f, m) if (tcpstat[f] || sflag <= 1) \
305 printf(m, (unsigned long long)tcpstat[f], plural(tcpstat[f]))
306 #define p2(f1, f2, m) if (tcpstat[f1] || tcpstat[f2] || sflag <= 1) \
307 printf(m, (unsigned long long)tcpstat[f1], plural(tcpstat[f1]), \
308 (unsigned long long)tcpstat[f2], plural(tcpstat[f2]))
309 #define p2s(f1, f2, m) if (tcpstat[f1] || tcpstat[f2] || sflag <= 1) \
310 printf(m, (unsigned long long)tcpstat[f1], plural(tcpstat[f1]), \
311 (unsigned long long)tcpstat[f2])
312 #define p3(f, m) if (tcpstat[f] || sflag <= 1) \
313 printf(m, (unsigned long long)tcpstat[f], plurales(tcpstat[f]))
315 p(TCP_STAT_SNDTOTAL
, "\t%llu packet%s sent\n");
316 p2(TCP_STAT_SNDPACK
,TCP_STAT_SNDBYTE
,
317 "\t\t%llu data packet%s (%llu byte%s)\n");
318 p2(TCP_STAT_SNDREXMITPACK
, TCP_STAT_SNDREXMITBYTE
,
319 "\t\t%llu data packet%s (%llu byte%s) retransmitted\n");
320 p2s(TCP_STAT_SNDACKS
, TCP_STAT_DELACK
,
321 "\t\t%llu ack-only packet%s (%llu delayed)\n");
322 p(TCP_STAT_SNDURG
, "\t\t%llu URG only packet%s\n");
323 p(TCP_STAT_SNDPROBE
, "\t\t%llu window probe packet%s\n");
324 p(TCP_STAT_SNDWINUP
, "\t\t%llu window update packet%s\n");
325 p(TCP_STAT_SNDCTRL
, "\t\t%llu control packet%s\n");
326 p(TCP_STAT_SELFQUENCH
,
327 "\t\t%llu send attempt%s resulted in self-quench\n");
328 p(TCP_STAT_RCVTOTAL
, "\t%llu packet%s received\n");
329 p2(TCP_STAT_RCVACKPACK
, TCP_STAT_RCVACKBYTE
,
330 "\t\t%llu ack%s (for %llu byte%s)\n");
331 p(TCP_STAT_RCVDUPACK
, "\t\t%llu duplicate ack%s\n");
332 p(TCP_STAT_RCVACKTOOMUCH
, "\t\t%llu ack%s for unsent data\n");
333 p2(TCP_STAT_RCVPACK
, TCP_STAT_RCVBYTE
,
334 "\t\t%llu packet%s (%llu byte%s) received in-sequence\n");
335 p2(TCP_STAT_RCVDUPPACK
, TCP_STAT_RCVDUPBYTE
,
336 "\t\t%llu completely duplicate packet%s (%llu byte%s)\n");
337 p(TCP_STAT_PAWSDROP
, "\t\t%llu old duplicate packet%s\n");
338 p2(TCP_STAT_RCVPARTDUPPACK
, TCP_STAT_RCVPARTDUPBYTE
,
339 "\t\t%llu packet%s with some dup. data (%llu byte%s duped)\n");
340 p2(TCP_STAT_RCVOOPACK
, TCP_STAT_RCVOOBYTE
,
341 "\t\t%llu out-of-order packet%s (%llu byte%s)\n");
342 p2(TCP_STAT_RCVPACKAFTERWIN
, TCP_STAT_RCVBYTEAFTERWIN
,
343 "\t\t%llu packet%s (%llu byte%s) of data after window\n");
344 p(TCP_STAT_RCVWINPROBE
, "\t\t%llu window probe%s\n");
345 p(TCP_STAT_RCVWINUPD
, "\t\t%llu window update packet%s\n");
346 p(TCP_STAT_RCVAFTERCLOSE
, "\t\t%llu packet%s received after close\n");
347 p(TCP_STAT_RCVBADSUM
, "\t\t%llu discarded for bad checksum%s\n");
348 p(TCP_STAT_RCVBADOFF
, "\t\t%llu discarded for bad header offset field%s\n");
349 ps(TCP_STAT_RCVSHORT
, "\t\t%llu discarded because packet too short\n");
350 p(TCP_STAT_CONNATTEMPT
, "\t%llu connection request%s\n");
351 p(TCP_STAT_ACCEPTS
, "\t%llu connection accept%s\n");
353 "\t%llu connection%s established (including accepts)\n");
354 p2(TCP_STAT_CLOSED
, TCP_STAT_DROPS
,
355 "\t%llu connection%s closed (including %llu drop%s)\n");
356 p(TCP_STAT_CONNDROPS
, "\t%llu embryonic connection%s dropped\n");
357 p(TCP_STAT_DELAYED_FREE
, "\t%llu delayed free%s of tcpcb\n");
358 p2(TCP_STAT_RTTUPDATED
, TCP_STAT_SEGSTIMED
,
359 "\t%llu segment%s updated rtt (of %llu attempt%s)\n");
360 p(TCP_STAT_REXMTTIMEO
, "\t%llu retransmit timeout%s\n");
361 p(TCP_STAT_TIMEOUTDROP
,
362 "\t\t%llu connection%s dropped by rexmit timeout\n");
363 p2(TCP_STAT_PERSISTTIMEO
, TCP_STAT_PERSISTDROPS
,
364 "\t%llu persist timeout%s (resulting in %llu dropped "
366 p(TCP_STAT_KEEPTIMEO
, "\t%llu keepalive timeout%s\n");
367 p(TCP_STAT_KEEPPROBE
, "\t\t%llu keepalive probe%s sent\n");
368 p(TCP_STAT_KEEPDROPS
, "\t\t%llu connection%s dropped by keepalive\n");
369 p(TCP_STAT_PREDACK
, "\t%llu correct ACK header prediction%s\n");
370 p(TCP_STAT_PREDDAT
, "\t%llu correct data packet header prediction%s\n");
371 p3(TCP_STAT_PCBHASHMISS
, "\t%llu PCB hash miss%s\n");
372 ps(TCP_STAT_NOPORT
, "\t%llu dropped due to no socket\n");
373 p(TCP_STAT_CONNSDRAINED
, "\t%llu connection%s drained due to memory "
375 p(TCP_STAT_PMTUBLACKHOLE
, "\t%llu PMTUD blackhole%s detected\n");
377 p(TCP_STAT_BADSYN
, "\t%llu bad connection attempt%s\n");
378 ps(TCP_STAT_SC_ADDED
, "\t%llu SYN cache entries added\n");
379 p(TCP_STAT_SC_COLLISIONS
, "\t\t%llu hash collision%s\n");
380 ps(TCP_STAT_SC_COMPLETED
, "\t\t%llu completed\n");
381 ps(TCP_STAT_SC_ABORTED
, "\t\t%llu aborted (no space to build PCB)\n");
382 ps(TCP_STAT_SC_TIMED_OUT
, "\t\t%llu timed out\n");
383 ps(TCP_STAT_SC_OVERFLOWED
, "\t\t%llu dropped due to overflow\n");
384 ps(TCP_STAT_SC_BUCKETOVERFLOW
, "\t\t%llu dropped due to bucket overflow\n");
385 ps(TCP_STAT_SC_RESET
, "\t\t%llu dropped due to RST\n");
386 ps(TCP_STAT_SC_UNREACH
, "\t\t%llu dropped due to ICMP unreachable\n");
387 ps(TCP_STAT_SC_DELAYED_FREE
, "\t\t%llu delayed free of SYN cache "
389 p(TCP_STAT_SC_RETRANSMITTED
, "\t%llu SYN,ACK%s retransmitted\n");
390 p(TCP_STAT_SC_DUPESYN
, "\t%llu duplicate SYN%s received for entries "
391 "already in the cache\n");
392 p(TCP_STAT_SC_DROPPED
, "\t%llu SYN%s dropped (no route or no space)\n");
393 p(TCP_STAT_BADSIG
, "\t%llu packet%s with bad signature\n");
394 p(TCP_STAT_GOODSIG
, "\t%llu packet%s with good signature\n");
396 p(TCP_STAT_ECN_SHS
, "\t%llu sucessful ECN handshake%s\n");
397 p(TCP_STAT_ECN_CE
, "\t%llu packet%s with ECN CE bit\n");
398 p(TCP_STAT_ECN_ECT
, "\t%llu packet%s ECN ECT(0) bit\n");
407 * Dump UDP statistics structure.
410 udp_stats(u_long off
, const char *name
)
412 uint64_t udpstat
[UDP_NSTATS
];
416 size_t size
= sizeof(udpstat
);
418 if (sysctlbyname("net.inet.udp.stats", udpstat
, &size
,
422 warnx("%s stats not available via KVM.", name
);
426 printf ("%s:\n", name
);
428 #define ps(f, m) if (udpstat[f] || sflag <= 1) \
429 printf(m, (unsigned long long)udpstat[f])
430 #define p(f, m) if (udpstat[f] || sflag <= 1) \
431 printf(m, (unsigned long long)udpstat[f], plural(udpstat[f]))
432 #define p3(f, m) if (udpstat[f] || sflag <= 1) \
433 printf(m, (unsigned long long)udpstat[f], plurales(udpstat[f]))
435 p(UDP_STAT_IPACKETS
, "\t%llu datagram%s received\n");
436 ps(UDP_STAT_HDROPS
, "\t%llu with incomplete header\n");
437 ps(UDP_STAT_BADLEN
, "\t%llu with bad data length field\n");
438 ps(UDP_STAT_BADSUM
, "\t%llu with bad checksum\n");
439 ps(UDP_STAT_NOPORT
, "\t%llu dropped due to no socket\n");
440 p(UDP_STAT_NOPORTBCAST
,
441 "\t%llu broadcast/multicast datagram%s dropped due to no socket\n");
442 ps(UDP_STAT_FULLSOCK
, "\t%llu dropped due to full socket buffers\n");
443 delivered
= udpstat
[UDP_STAT_IPACKETS
] -
444 udpstat
[UDP_STAT_HDROPS
] -
445 udpstat
[UDP_STAT_BADLEN
] -
446 udpstat
[UDP_STAT_BADSUM
] -
447 udpstat
[UDP_STAT_NOPORT
] -
448 udpstat
[UDP_STAT_NOPORTBCAST
] -
449 udpstat
[UDP_STAT_FULLSOCK
];
450 if (delivered
|| sflag
<= 1)
451 printf("\t%llu delivered\n", (unsigned long long)delivered
);
452 p3(UDP_STAT_PCBHASHMISS
, "\t%llu PCB hash miss%s\n");
453 p(UDP_STAT_OPACKETS
, "\t%llu datagram%s output\n");
461 * Dump IP statistics structure.
464 ip_stats(u_long off
, const char *name
)
466 uint64_t ipstat
[IP_NSTATS
];
469 size_t size
= sizeof(ipstat
);
471 if (sysctlbyname("net.inet.ip.stats", ipstat
, &size
,
475 warnx("%s stats not available via KVM.", name
);
479 printf("%s:\n", name
);
481 #define ps(f, m) if (ipstat[f] || sflag <= 1) \
482 printf(m, (unsigned long long)ipstat[f])
483 #define p(f, m) if (ipstat[f] || sflag <= 1) \
484 printf(m, (unsigned long long)ipstat[f], plural(ipstat[f]))
486 p(IP_STAT_TOTAL
, "\t%llu total packet%s received\n");
487 p(IP_STAT_BADSUM
, "\t%llu bad header checksum%s\n");
488 ps(IP_STAT_TOOSMALL
, "\t%llu with size smaller than minimum\n");
489 ps(IP_STAT_TOOSHORT
, "\t%llu with data size < data length\n");
490 ps(IP_STAT_TOOLONG
, "\t%llu with length > max ip packet size\n");
491 ps(IP_STAT_BADHLEN
, "\t%llu with header length < data size\n");
492 ps(IP_STAT_BADLEN
, "\t%llu with data length < header length\n");
493 ps(IP_STAT_BADOPTIONS
, "\t%llu with bad options\n");
494 ps(IP_STAT_BADVERS
, "\t%llu with incorrect version number\n");
495 p(IP_STAT_FRAGMENTS
, "\t%llu fragment%s received\n");
496 p(IP_STAT_FRAGDROPPED
, "\t%llu fragment%s dropped (dup or out of space)\n");
497 p(IP_STAT_RCVMEMDROP
, "\t%llu fragment%s dropped (out of ipqent)\n");
498 p(IP_STAT_BADFRAGS
, "\t%llu malformed fragment%s dropped\n");
499 p(IP_STAT_FRAGTIMEOUT
, "\t%llu fragment%s dropped after timeout\n");
500 p(IP_STAT_REASSEMBLED
, "\t%llu packet%s reassembled ok\n");
501 p(IP_STAT_DELIVERED
, "\t%llu packet%s for this host\n");
502 p(IP_STAT_NOPROTO
, "\t%llu packet%s for unknown/unsupported protocol\n");
503 p(IP_STAT_FORWARD
, "\t%llu packet%s forwarded");
504 p(IP_STAT_FASTFORWARD
, " (%llu packet%s fast forwarded)");
505 if (ipstat
[IP_STAT_FORWARD
] || sflag
<= 1)
507 p(IP_STAT_CANTFORWARD
, "\t%llu packet%s not forwardable\n");
508 p(IP_STAT_REDIRECTSENT
, "\t%llu redirect%s sent\n");
509 p(IP_STAT_NOGIF
, "\t%llu packet%s no matching gif found\n");
510 p(IP_STAT_LOCALOUT
, "\t%llu packet%s sent from this host\n");
511 p(IP_STAT_RAWOUT
, "\t%llu packet%s sent with fabricated ip header\n");
512 p(IP_STAT_ODROPPED
, "\t%llu output packet%s dropped due to no bufs, etc.\n");
513 p(IP_STAT_NOROUTE
, "\t%llu output packet%s discarded due to no route\n");
514 p(IP_STAT_FRAGMENTED
, "\t%llu output datagram%s fragmented\n");
515 p(IP_STAT_OFRAGMENTS
, "\t%llu fragment%s created\n");
516 p(IP_STAT_CANTFRAG
, "\t%llu datagram%s that can't be fragmented\n");
517 p(IP_STAT_BADADDR
, "\t%llu datagram%s with bad address in header\n");
522 static const char *icmpnames
[] = {
526 "destination unreachable",
529 "alternate host address",
532 "router advertisement",
533 "router solicitation",
538 "information request",
539 "information request reply",
540 "address mask request",
541 "address mask reply",
545 * Dump ICMP statistics.
548 icmp_stats(u_long off
, const char *name
)
550 uint64_t icmpstat
[ICMP_NSTATS
];
554 size_t size
= sizeof(icmpstat
);
556 if (sysctlbyname("net.inet.icmp.stats", icmpstat
, &size
,
560 warnx("%s stats not available via KVM.", name
);
564 printf("%s:\n", name
);
566 #define p(f, m) if (icmpstat[f] || sflag <= 1) \
567 printf(m, (unsigned long long)icmpstat[f], plural(icmpstat[f]))
569 p(ICMP_STAT_ERROR
, "\t%llu call%s to icmp_error\n");
571 "\t%llu error%s not generated because old message was icmp\n");
572 for (first
= 1, i
= 0; i
< ICMP_MAXTYPE
+ 1; i
++)
573 if (icmpstat
[ICMP_STAT_OUTHIST
+ i
] != 0) {
575 printf("\tOutput histogram:\n");
578 printf("\t\t%s: %llu\n", icmpnames
[i
],
579 (unsigned long long)icmpstat
[ICMP_STAT_OUTHIST
+ i
]);
581 p(ICMP_STAT_BADCODE
, "\t%llu message%s with bad code fields\n");
582 p(ICMP_STAT_TOOSHORT
, "\t%llu message%s < minimum length\n");
583 p(ICMP_STAT_CHECKSUM
, "\t%llu bad checksum%s\n");
584 p(ICMP_STAT_BADLEN
, "\t%llu message%s with bad length\n");
585 p(ICMP_STAT_BMCASTECHO
, "\t%llu multicast echo request%s ignored\n");
586 p(ICMP_STAT_BMCASTTSTAMP
, "\t%llu multicast timestamp request%s ignored\n");
587 for (first
= 1, i
= 0; i
< ICMP_MAXTYPE
+ 1; i
++)
588 if (icmpstat
[ICMP_STAT_INHIST
+ i
] != 0) {
590 printf("\tInput histogram:\n");
593 printf("\t\t%s: %llu\n", icmpnames
[i
],
594 (unsigned long long)icmpstat
[ICMP_STAT_INHIST
+ i
]);
596 p(ICMP_STAT_REFLECT
, "\t%llu message response%s generated\n");
597 p(ICMP_STAT_PMTUCHG
, "\t%llu path MTU change%s\n");
602 * Dump IGMP statistics structure.
605 igmp_stats(u_long off
, const char *name
)
607 uint64_t igmpstat
[IGMP_NSTATS
];
610 size_t size
= sizeof(igmpstat
);
612 if (sysctlbyname("net.inet.igmp.stats", igmpstat
, &size
,
616 warnx("%s stats not available via KVM.", name
);
620 printf("%s:\n", name
);
622 #define p(f, m) if (igmpstat[f] || sflag <= 1) \
623 printf(m, (unsigned long long)igmpstat[f], plural(igmpstat[f]))
624 #define py(f, m) if (igmpstat[f] || sflag <= 1) \
625 printf(m, (unsigned long long)igmpstat[f], igmpstat[f] != 1 ? "ies" : "y")
626 p(IGMP_STAT_RCV_TOTAL
, "\t%llu message%s received\n");
627 p(IGMP_STAT_RCV_TOOSHORT
, "\t%llu message%s received with too few bytes\n");
628 p(IGMP_STAT_RCV_BADSUM
, "\t%llu message%s received with bad checksum\n");
629 py(IGMP_STAT_RCV_QUERIES
, "\t%llu membership quer%s received\n");
630 py(IGMP_STAT_RCV_BADQUERIES
, "\t%llu membership quer%s received with invalid field(s)\n");
631 p(IGMP_STAT_RCV_REPORTS
, "\t%llu membership report%s received\n");
632 p(IGMP_STAT_RCV_BADREPORTS
, "\t%llu membership report%s received with invalid field(s)\n");
633 p(IGMP_STAT_RCV_OURREPORTS
, "\t%llu membership report%s received for groups to which we belong\n");
634 p(IGMP_STAT_SND_REPORTS
, "\t%llu membership report%s sent\n");
640 * Dump CARP statistics structure.
643 carp_stats(u_long off
, const char *name
)
645 uint64_t carpstat
[CARP_NSTATS
];
648 size_t size
= sizeof(carpstat
);
650 if (sysctlbyname("net.inet.carp.stats", carpstat
, &size
,
654 warnx("%s stats not available via KVM.", name
);
658 printf("%s:\n", name
);
660 #define p(f, m) if (carpstat[f] || sflag <= 1) \
661 printf(m, carpstat[f], plural(carpstat[f]))
662 #define p2(f, m) if (carpstat[f] || sflag <= 1) \
663 printf(m, carpstat[f])
665 p(CARP_STAT_IPACKETS
, "\t%" PRIu64
" packet%s received (IPv4)\n");
666 p(CARP_STAT_IPACKETS6
, "\t%" PRIu64
" packet%s received (IPv6)\n");
668 "\t\t%" PRIu64
" packet%s discarded for bad interface\n");
670 "\t\t%" PRIu64
" packet%s discarded for wrong TTL\n");
671 p(CARP_STAT_HDROPS
, "\t\t%" PRIu64
" packet%s shorter than header\n");
672 p(CARP_STAT_BADSUM
, "\t\t%" PRIu64
673 " packet%s discarded for bad checksum\n");
675 "\t\t%" PRIu64
" packet%s discarded with a bad version\n");
677 "\t\t%" PRIu64
" discarded because packet was too short\n");
679 "\t\t%" PRIu64
" packet%s discarded for bad authentication\n");
680 p(CARP_STAT_BADVHID
, "\t\t%" PRIu64
" packet%s discarded for bad vhid\n");
681 p(CARP_STAT_BADADDRS
, "\t\t%" PRIu64
682 " packet%s discarded because of a bad address list\n");
683 p(CARP_STAT_OPACKETS
, "\t%" PRIu64
" packet%s sent (IPv4)\n");
684 p(CARP_STAT_OPACKETS6
, "\t%" PRIu64
" packet%s sent (IPv6)\n");
686 "\t\t%" PRIu64
" send failed due to mbuf memory error\n");
692 * Dump PFSYNC statistics structure.
695 pfsync_stats(u_long off
, const char *name
)
697 uint64_t pfsyncstat
[PFSYNC_NSTATS
];
700 size_t size
= sizeof(pfsyncstat
);
702 if (sysctlbyname("net.inet.pfsync.stats", pfsyncstat
, &size
,
706 warnx("%s stats not available via KVM.", name
);
710 printf("%s:\n", name
);
712 #define p(f, m) if (pfsyncstat[f] || sflag <= 1) \
713 printf(m, pfsyncstat[f], plural(pfsyncstat[f]))
714 #define p2(f, m) if (pfsyncstat[f] || sflag <= 1) \
715 printf(m, pfsyncstat[f])
717 p(PFSYNC_STAT_IPACKETS
, "\t%" PRIu64
" packet%s received (IPv4)\n");
718 p(PFSYNC_STAT_IPACKETS6
,"\t%" PRIu64
" packet%s received (IPv6)\n");
719 p(PFSYNC_STAT_BADIF
, "\t\t%" PRIu64
" packet%s discarded for bad interface\n");
720 p(PFSYNC_STAT_BADTTL
, "\t\t%" PRIu64
" packet%s discarded for bad ttl\n");
721 p(PFSYNC_STAT_HDROPS
, "\t\t%" PRIu64
" packet%s shorter than header\n");
722 p(PFSYNC_STAT_BADVER
, "\t\t%" PRIu64
" packet%s discarded for bad version\n");
723 p(PFSYNC_STAT_BADAUTH
, "\t\t%" PRIu64
" packet%s discarded for bad HMAC\n");
724 p(PFSYNC_STAT_BADACT
,"\t\t%" PRIu64
" packet%s discarded for bad action\n");
725 p(PFSYNC_STAT_BADLEN
, "\t\t%" PRIu64
" packet%s discarded for short packet\n");
726 p(PFSYNC_STAT_BADVAL
, "\t\t%" PRIu64
" state%s discarded for bad values\n");
727 p(PFSYNC_STAT_STALE
, "\t\t%" PRIu64
" stale state%s\n");
728 p(PFSYNC_STAT_BADSTATE
, "\t\t%" PRIu64
" failed state lookup/insert%s\n");
729 p(PFSYNC_STAT_OPACKETS
, "\t%" PRIu64
" packet%s sent (IPv4)\n");
730 p(PFSYNC_STAT_OPACKETS6
, "\t%" PRIu64
" packet%s sent (IPv6)\n");
731 p2(PFSYNC_STAT_ONOMEM
, "\t\t%" PRIu64
" send failed due to mbuf memory error\n");
732 p2(PFSYNC_STAT_OERRORS
, "\t\t%" PRIu64
" send error\n");
738 * Dump PIM statistics structure.
741 pim_stats(u_long off
, const char *name
)
743 struct pimstat pimstat
;
747 if (kread(off
, (char *)&pimstat
, sizeof (pimstat
)) != 0) {
748 /* XXX: PIM is probably not enabled in the kernel */
752 printf("%s:\n", name
);
754 #define p(f, m) if (pimstat.f || sflag <= 1) \
755 printf(m, (unsigned long long)pimstat.f, plural(pimstat.f))
757 p(pims_rcv_total_msgs
, "\t%llu message%s received\n");
758 p(pims_rcv_total_bytes
, "\t%llu byte%s received\n");
759 p(pims_rcv_tooshort
, "\t%llu message%s received with too few bytes\n");
760 p(pims_rcv_badsum
, "\t%llu message%s received with bad checksum\n");
761 p(pims_rcv_badversion
, "\t%llu message%s received with bad version\n");
762 p(pims_rcv_registers_msgs
, "\t%llu data register message%s received\n");
763 p(pims_rcv_registers_bytes
, "\t%llu data register byte%s received\n");
764 p(pims_rcv_registers_wrongiif
, "\t%llu data register message%s received on wrong iif\n");
765 p(pims_rcv_badregisters
, "\t%llu bad register%s received\n");
766 p(pims_snd_registers_msgs
, "\t%llu data register message%s sent\n");
767 p(pims_snd_registers_bytes
, "\t%llu data register byte%s sent\n");
772 * Dump the ARP statistics structure.
775 arp_stats(u_long off
, const char *name
)
777 uint64_t arpstat
[ARP_NSTATS
];
780 size_t size
= sizeof(arpstat
);
782 if (sysctlbyname("net.inet.arp.stats", arpstat
, &size
,
786 warnx("%s stats not available via KVM.", name
);
790 printf("%s:\n", name
);
792 #define ps(f, m) if (arpstat[f] || sflag <= 1) \
793 printf(m, (unsigned long long)arpstat[f])
794 #define p(f, m) if (arpstat[f] || sflag <= 1) \
795 printf(m, (unsigned long long)arpstat[f], plural(arpstat[f]))
797 p(ARP_STAT_SNDTOTAL
, "\t%llu packet%s sent\n");
798 p(ARP_STAT_SNDREPLY
, "\t\t%llu reply packet%s\n");
799 p(ARP_STAT_SENDREQUEST
, "\t\t%llu request packet%s\n");
801 p(ARP_STAT_RCVTOTAL
, "\t%llu packet%s received\n");
802 p(ARP_STAT_RCVREPLY
, "\t\t%llu reply packet%s\n");
803 p(ARP_STAT_RCVREQUEST
, "\t\t%llu valid request packet%s\n");
804 p(ARP_STAT_RCVMCAST
, "\t\t%llu broadcast/multicast packet%s\n");
805 p(ARP_STAT_RCVBADPROTO
, "\t\t%llu packet%s with unknown protocol type\n");
806 p(ARP_STAT_RCVBADLEN
, "\t\t%llu packet%s with bad (short) length\n");
807 p(ARP_STAT_RCVZEROTPA
, "\t\t%llu packet%s with null target IP address\n");
808 p(ARP_STAT_RCVZEROSPA
, "\t\t%llu packet%s with null source IP address\n");
809 ps(ARP_STAT_RCVNOINT
, "\t\t%llu could not be mapped to an interface\n");
810 p(ARP_STAT_RCVLOCALSHA
, "\t\t%llu packet%s sourced from a local hardware "
812 p(ARP_STAT_RCVBCASTSHA
, "\t\t%llu packet%s with a broadcast "
813 "source hardware address\n");
814 p(ARP_STAT_RCVLOCALSPA
, "\t\t%llu duplicate%s for a local IP address\n");
815 p(ARP_STAT_RCVOVERPERM
, "\t\t%llu attempt%s to overwrite a static entry\n");
816 p(ARP_STAT_RCVOVERINT
, "\t\t%llu packet%s received on wrong interface\n");
817 p(ARP_STAT_RCVOVER
, "\t\t%llu entry%s overwritten\n");
818 p(ARP_STAT_RCVLENCHG
, "\t\t%llu change%s in hardware address length\n");
820 p(ARP_STAT_DFRTOTAL
, "\t%llu packet%s deferred pending ARP resolution\n");
821 ps(ARP_STAT_DFRSENT
, "\t\t%llu sent\n");
822 ps(ARP_STAT_DFRDROPPED
, "\t\t%llu dropped\n");
824 p(ARP_STAT_ALLOCFAIL
, "\t%llu failure%s to allocate llinfo\n");
831 * Pretty print an Internet address (net address + port).
832 * Take numeric_addr and numeric_port into consideration.
835 inetprint(struct in_addr
*in
, uint16_t port
, const char *proto
,
838 struct servent
*sp
= 0;
842 (void)snprintf(line
, sizeof line
, "%.*s.",
843 (Aflag
&& !numeric_addr
) ? 12 : 16, inetname(in
));
844 cp
= strchr(line
, '\0');
845 if (!port_numeric
&& port
)
846 sp
= getservbyport((int)port
, proto
);
847 space
= sizeof line
- (cp
-line
);
849 (void)snprintf(cp
, space
, "%s", sp
? sp
->s_name
: "*");
851 (void)snprintf(cp
, space
, "%u", ntohs(port
));
852 (void)printf(" %-*.*s", width
, width
, line
);
856 * Construct an Internet address representation.
857 * If numeric_addr has been supplied, give
858 * numeric value, otherwise try for symbolic name.
861 inetname(struct in_addr
*inp
)
864 static char line
[50];
867 static char domain
[MAXHOSTNAMELEN
+ 1];
868 static int first
= 1;
870 if (first
&& !numeric_addr
) {
872 if (gethostname(domain
, sizeof domain
) == 0) {
873 domain
[sizeof(domain
) - 1] = '\0';
874 if ((cp
= strchr(domain
, '.')))
875 (void) strlcpy(domain
, cp
+ 1, sizeof(domain
));
882 if (!numeric_addr
&& inp
->s_addr
!= INADDR_ANY
) {
883 int net
= inet_netof(*inp
);
884 int lna
= inet_lnaof(*inp
);
886 if (lna
== INADDR_ANY
) {
887 np
= getnetbyaddr(net
, AF_INET
);
892 hp
= gethostbyaddr((char *)inp
, sizeof (*inp
), AF_INET
);
894 if ((cp
= strchr(hp
->h_name
, '.')) &&
895 !strcmp(cp
+ 1, domain
))
901 if (inp
->s_addr
== INADDR_ANY
)
902 strlcpy(line
, "*", sizeof line
);
904 strlcpy(line
, cp
, sizeof line
);
906 inp
->s_addr
= ntohl(inp
->s_addr
);
907 #define C(x) ((x) & 0xff)
908 (void)snprintf(line
, sizeof line
, "%u.%u.%u.%u",
909 C(inp
->s_addr
>> 24), C(inp
->s_addr
>> 16),
910 C(inp
->s_addr
>> 8), C(inp
->s_addr
));
917 * Dump the contents of a TCP PCB.
920 tcp_dump(u_long pcbaddr
)
926 kread(pcbaddr
, (char *)&tcpcb
, sizeof(tcpcb
));
927 hardticks
= get_hardticks();
929 printf("TCP Protocol Control Block at 0x%08lx:\n\n", pcbaddr
);
932 for (i
= 0; i
< TCPT_NTIMERS
; i
++) {
933 ci
= (callout_impl_t
*)&tcpcb
.t_timer
[i
];
934 printf("\t%s: %d", tcptimers
[i
],
935 (ci
->c_flags
& CALLOUT_PENDING
) ?
936 ci
->c_time
- hardticks
: 0);
940 if (tcpcb
.t_state
< 0 || tcpcb
.t_state
>= TCP_NSTATES
)
941 printf("State: %d", tcpcb
.t_state
);
943 printf("State: %s", tcpstates
[tcpcb
.t_state
]);
944 printf(", flags 0x%x, inpcb 0x%lx, in6pcb 0x%lx\n\n", tcpcb
.t_flags
,
945 (u_long
)tcpcb
.t_inpcb
, (u_long
)tcpcb
.t_in6pcb
);
947 printf("rxtshift %d, rxtcur %d, dupacks %d\n", tcpcb
.t_rxtshift
,
948 tcpcb
.t_rxtcur
, tcpcb
.t_dupacks
);
949 printf("peermss %u, ourmss %u, segsz %u\n\n", tcpcb
.t_peermss
,
950 tcpcb
.t_ourmss
, tcpcb
.t_segsz
);
952 printf("snd_una %u, snd_nxt %u, snd_up %u\n",
953 tcpcb
.snd_una
, tcpcb
.snd_nxt
, tcpcb
.snd_up
);
954 printf("snd_wl1 %u, snd_wl2 %u, iss %u, snd_wnd %lu\n\n",
955 tcpcb
.snd_wl1
, tcpcb
.snd_wl2
, tcpcb
.iss
, tcpcb
.snd_wnd
);
957 printf("rcv_wnd %lu, rcv_nxt %u, rcv_up %u, irs %u\n\n",
958 tcpcb
.rcv_wnd
, tcpcb
.rcv_nxt
, tcpcb
.rcv_up
, tcpcb
.irs
);
960 printf("rcv_adv %u, snd_max %u, snd_cwnd %lu, snd_ssthresh %lu\n",
961 tcpcb
.rcv_adv
, tcpcb
.snd_max
, tcpcb
.snd_cwnd
, tcpcb
.snd_ssthresh
);
963 printf("rcvtime %u, rtttime %u, rtseq %u, srtt %d, rttvar %d, "
964 "rttmin %d, max_sndwnd %lu\n\n", tcpcb
.t_rcvtime
, tcpcb
.t_rtttime
,
965 tcpcb
.t_rtseq
, tcpcb
.t_srtt
, tcpcb
.t_rttvar
, tcpcb
.t_rttmin
,
968 printf("oobflags %d, iobc %d, softerror %d\n\n", tcpcb
.t_oobflags
,
969 tcpcb
.t_iobc
, tcpcb
.t_softerror
);
971 printf("snd_scale %d, rcv_scale %d, req_r_scale %d, req_s_scale %d\n",
972 tcpcb
.snd_scale
, tcpcb
.rcv_scale
, tcpcb
.request_r_scale
,
973 tcpcb
.requested_s_scale
);
974 printf("ts_recent %u, ts_regent_age %d, last_ack_sent %u\n",
975 tcpcb
.ts_recent
, tcpcb
.ts_recent_age
, tcpcb
.last_ack_sent
);