xref: /dragonfly/usr.bin/systat/icmp6.c (revision dc71b7ab)
10adc6530SHasso Tepper /*-
20adc6530SHasso Tepper  * Copyright (c) 1980, 1992, 1993
30adc6530SHasso Tepper  *	The Regents of the University of California.  All rights reserved.
40adc6530SHasso Tepper  *
50adc6530SHasso Tepper  * Redistribution and use in source and binary forms, with or without
60adc6530SHasso Tepper  * modification, are permitted provided that the following conditions
70adc6530SHasso Tepper  * are met:
80adc6530SHasso Tepper  * 1. Redistributions of source code must retain the above copyright
90adc6530SHasso Tepper  *    notice, this list of conditions and the following disclaimer.
100adc6530SHasso Tepper  * 2. Redistributions in binary form must reproduce the above copyright
110adc6530SHasso Tepper  *    notice, this list of conditions and the following disclaimer in the
120adc6530SHasso Tepper  *    documentation and/or other materials provided with the distribution.
13*dc71b7abSJustin C. Sherrill  * 3. Neither the name of the University nor the names of its contributors
140adc6530SHasso Tepper  *    may be used to endorse or promote products derived from this software
150adc6530SHasso Tepper  *    without specific prior written permission.
160adc6530SHasso Tepper  *
170adc6530SHasso Tepper  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
180adc6530SHasso Tepper  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
190adc6530SHasso Tepper  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
200adc6530SHasso Tepper  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
210adc6530SHasso Tepper  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
220adc6530SHasso Tepper  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
230adc6530SHasso Tepper  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
240adc6530SHasso Tepper  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
250adc6530SHasso Tepper  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
260adc6530SHasso Tepper  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
270adc6530SHasso Tepper  * SUCH DAMAGE.
280adc6530SHasso Tepper  *
290adc6530SHasso Tepper  * @(#)mbufs.c     8.1 (Berkeley) 6/6/93
300adc6530SHasso Tepper  * $FreeBSD: src/usr.bin/systat/icmp6.c,v 1.3 2006/04/30 04:47:23 bde Exp $
310adc6530SHasso Tepper  */
320adc6530SHasso Tepper 
330adc6530SHasso Tepper #ifdef INET6
340adc6530SHasso Tepper #include <sys/param.h>
350adc6530SHasso Tepper #include <sys/types.h>
360adc6530SHasso Tepper #include <sys/socket.h>
370adc6530SHasso Tepper #include <sys/sysctl.h>
380adc6530SHasso Tepper 
390adc6530SHasso Tepper #include <netinet/in.h>
400adc6530SHasso Tepper #include <netinet/icmp6.h>
410adc6530SHasso Tepper 
420adc6530SHasso Tepper #include <stdlib.h>
430adc6530SHasso Tepper #include <string.h>
440adc6530SHasso Tepper #include <paths.h>
450adc6530SHasso Tepper #include "systat.h"
460adc6530SHasso Tepper #include "extern.h"
470adc6530SHasso Tepper #include "mode.h"
480adc6530SHasso Tepper 
490adc6530SHasso Tepper static struct icmp6stat icmp6stat, initstat, oldstat;
500adc6530SHasso Tepper 
510adc6530SHasso Tepper /*-
520adc6530SHasso Tepper --0         1         2         3         4         5         6         7
530adc6530SHasso Tepper --0123456789012345678901234567890123456789012345678901234567890123456789012345
540adc6530SHasso Tepper 00          ICMPv6 Input                       ICMPv6 Output
550adc6530SHasso Tepper 01999999999 total messages           999999999 total messages
560adc6530SHasso Tepper 02999999999 with bad code            999999999 errors generated
570adc6530SHasso Tepper 03999999999 with bad length          999999999 suppressed - original too short
580adc6530SHasso Tepper 04999999999 with bad checksum        999999999 suppressed - original was ICMP
590adc6530SHasso Tepper 05999999999 with insufficient data   999999999 responses sent
600adc6530SHasso Tepper 06
610adc6530SHasso Tepper 07          Input Histogram                    Output Histogram
620adc6530SHasso Tepper 08999999999 echo response            999999999 echo response
630adc6530SHasso Tepper 09999999999 echo request             999999999 echo request
640adc6530SHasso Tepper 10999999999 destination unreachable  999999999 destination unreachable
650adc6530SHasso Tepper 11999999999 redirect                 999999999 redirect
660adc6530SHasso Tepper 12999999999 time-to-live exceeded    999999999 time-to-line exceeded
670adc6530SHasso Tepper 13999999999 parameter problem        999999999 parameter problem
680adc6530SHasso Tepper 14999999999 neighbor solicitation    999999999 neighbor solicitation
690adc6530SHasso Tepper 15999999999 neighbor advertisment    999999999 neighbor advertisment
700adc6530SHasso Tepper 16999999999 router advertisement     999999999 router solicitation
710adc6530SHasso Tepper 17
720adc6530SHasso Tepper 18
730adc6530SHasso Tepper --0123456789012345678901234567890123456789012345678901234567890123456789012345
740adc6530SHasso Tepper --0         1         2         3         4         5         6         7
750adc6530SHasso Tepper */
760adc6530SHasso Tepper 
770adc6530SHasso Tepper WINDOW *
openicmp6(void)780adc6530SHasso Tepper openicmp6(void)
790adc6530SHasso Tepper {
800adc6530SHasso Tepper 	return (subwin(stdscr, LINES-4-1, 0, 4, 0));
810adc6530SHasso Tepper }
820adc6530SHasso Tepper 
830adc6530SHasso Tepper void
closeicmp6(WINDOW * w)84815943a9SSascha Wildner closeicmp6(WINDOW *w)
850adc6530SHasso Tepper {
860adc6530SHasso Tepper 	if (w == NULL)
870adc6530SHasso Tepper 		return;
880adc6530SHasso Tepper 	wclear(w);
890adc6530SHasso Tepper 	wrefresh(w);
900adc6530SHasso Tepper 	delwin(w);
910adc6530SHasso Tepper }
920adc6530SHasso Tepper 
930adc6530SHasso Tepper void
labelicmp6(void)940adc6530SHasso Tepper labelicmp6(void)
950adc6530SHasso Tepper {
960adc6530SHasso Tepper 	wmove(wnd, 0, 0); wclrtoeol(wnd);
970adc6530SHasso Tepper #define L(row, str) mvwprintw(wnd, row, 10, str)
980adc6530SHasso Tepper #define R(row, str) mvwprintw(wnd, row, 45, str);
990adc6530SHasso Tepper 	L(1, "ICMPv6 Input");		R(1, "ICMPv6 Output");
1000adc6530SHasso Tepper 	L(2, "total messages");		R(2, "total messages");
1010adc6530SHasso Tepper 	L(3, "with bad code");		R(3, "errors generated");
1020adc6530SHasso Tepper 	L(4, "with bad length");	R(4, "suppressed - original too short");
1030adc6530SHasso Tepper 	L(5, "with bad checksum");	R(5, "suppressed - original was ICMP");
1040adc6530SHasso Tepper 	L(6, "with insufficient data");	R(6, "responses sent");
1050adc6530SHasso Tepper 
1060adc6530SHasso Tepper 	L(8, "Input Histogram");	R(8, "Output Histogram");
1070adc6530SHasso Tepper #define B(row, str) L(row, str); R(row, str)
1080adc6530SHasso Tepper 	B(9, "echo response");
1090adc6530SHasso Tepper 	B(10, "echo request");
1100adc6530SHasso Tepper 	B(11, "destination unreachable");
1110adc6530SHasso Tepper 	B(12, "redirect");
1120adc6530SHasso Tepper 	B(13, "time-to-live exceeded");
1130adc6530SHasso Tepper 	B(14, "parameter problem");
1140adc6530SHasso Tepper 	B(15, "neighbor solicitation");
1150ca0cd25SSascha Wildner 	B(16, "neighbor advertisement");
1160adc6530SHasso Tepper 	L(17, "router advertisement");	R(17, "router solicitation");
1170adc6530SHasso Tepper #undef L
1180adc6530SHasso Tepper #undef R
1190adc6530SHasso Tepper #undef B
1200adc6530SHasso Tepper }
1210adc6530SHasso Tepper 
1220adc6530SHasso Tepper static void
domode(struct icmp6stat * ret)1230adc6530SHasso Tepper domode(struct icmp6stat *ret)
1240adc6530SHasso Tepper {
1250adc6530SHasso Tepper 	const struct icmp6stat *sub;
1260adc6530SHasso Tepper 	int i, divisor = 1;
1270adc6530SHasso Tepper 
1280adc6530SHasso Tepper 	switch(currentmode) {
1290adc6530SHasso Tepper 	case display_RATE:
1300adc6530SHasso Tepper 		sub = &oldstat;
1310adc6530SHasso Tepper 		divisor = naptime;
1320adc6530SHasso Tepper 		break;
1330adc6530SHasso Tepper 	case display_DELTA:
1340adc6530SHasso Tepper 		sub = &oldstat;
1350adc6530SHasso Tepper 		break;
1360adc6530SHasso Tepper 	case display_SINCE:
1370adc6530SHasso Tepper 		sub = &initstat;
1380adc6530SHasso Tepper 		break;
1390adc6530SHasso Tepper 	default:
1400adc6530SHasso Tepper 		*ret = icmp6stat;
1410adc6530SHasso Tepper 		return;
1420adc6530SHasso Tepper 	}
1430adc6530SHasso Tepper #define DO(stat) ret->stat = (icmp6stat.stat - sub->stat) / divisor
1440adc6530SHasso Tepper 	DO(icp6s_error);
1450adc6530SHasso Tepper 	DO(icp6s_tooshort);
1460adc6530SHasso Tepper 	DO(icp6s_canterror);
1470adc6530SHasso Tepper 	for (i = 0; i <= ICMP6_MAXTYPE; i++) {
1480adc6530SHasso Tepper 		DO(icp6s_outhist[i]);
1490adc6530SHasso Tepper 	}
1500adc6530SHasso Tepper 	DO(icp6s_badcode);
1510adc6530SHasso Tepper 	DO(icp6s_tooshort);
1520adc6530SHasso Tepper 	DO(icp6s_checksum);
1530adc6530SHasso Tepper 	DO(icp6s_badlen);
1540adc6530SHasso Tepper 	DO(icp6s_reflect);
1550adc6530SHasso Tepper 	for (i = 0; i <= ICMP6_MAXTYPE; i++) {
1560adc6530SHasso Tepper 		DO(icp6s_inhist[i]);
1570adc6530SHasso Tepper 	}
1580adc6530SHasso Tepper #undef DO
1590adc6530SHasso Tepper }
1600adc6530SHasso Tepper 
1610adc6530SHasso Tepper void
showicmp6(void)1620adc6530SHasso Tepper showicmp6(void)
1630adc6530SHasso Tepper {
1640adc6530SHasso Tepper 	struct icmp6stat stats;
1650adc6530SHasso Tepper 	u_long totalin, totalout;
1660adc6530SHasso Tepper 	int i;
1670adc6530SHasso Tepper 
1680adc6530SHasso Tepper 	memset(&stats, 0, sizeof stats);
1690adc6530SHasso Tepper 	domode(&stats);
1700adc6530SHasso Tepper 	for (i = totalin = totalout = 0; i <= ICMP6_MAXTYPE; i++) {
1710adc6530SHasso Tepper 		totalin += stats.icp6s_inhist[i];
1720adc6530SHasso Tepper 		totalout += stats.icp6s_outhist[i];
1730adc6530SHasso Tepper 	}
1740adc6530SHasso Tepper 	totalin += stats.icp6s_badcode + stats.icp6s_badlen +
1750adc6530SHasso Tepper 		stats.icp6s_checksum + stats.icp6s_tooshort;
1760adc6530SHasso Tepper 	mvwprintw(wnd, 2, 0, "%9lu", totalin);
1770adc6530SHasso Tepper 	mvwprintw(wnd, 2, 35, "%9lu", totalout);
1780adc6530SHasso Tepper 
1790adc6530SHasso Tepper #define DO(stat, row, col) \
1800adc6530SHasso Tepper 	mvwprintw(wnd, row, col, "%9lu", stats.stat)
1810adc6530SHasso Tepper 
1820adc6530SHasso Tepper 	DO(icp6s_badcode, 3, 0);
1830adc6530SHasso Tepper 	DO(icp6s_badlen, 4, 0);
1840adc6530SHasso Tepper 	DO(icp6s_checksum, 5, 0);
1850adc6530SHasso Tepper 	DO(icp6s_tooshort, 6, 0);
1860adc6530SHasso Tepper 	DO(icp6s_error, 3, 35);
1870adc6530SHasso Tepper 	DO(icp6s_tooshort, 4, 35);
1880adc6530SHasso Tepper 	DO(icp6s_canterror, 5, 35);
1890adc6530SHasso Tepper 	DO(icp6s_reflect, 6, 35);
1900adc6530SHasso Tepper #define DO2(type, row) DO(icp6s_inhist[type], row, 0); DO(icp6s_outhist[type], \
1910adc6530SHasso Tepper 							 row, 35)
1920adc6530SHasso Tepper 	DO2(ICMP6_ECHO_REPLY, 9);
1930adc6530SHasso Tepper 	DO2(ICMP6_ECHO_REQUEST, 10);
1940adc6530SHasso Tepper 	DO2(ICMP6_DST_UNREACH, 11);
1950adc6530SHasso Tepper 	DO2(ND_REDIRECT, 12);
1960adc6530SHasso Tepper 	DO2(ICMP6_TIME_EXCEEDED, 13);
1970adc6530SHasso Tepper 	DO2(ICMP6_PARAM_PROB, 14);
1980adc6530SHasso Tepper 	DO2(ND_NEIGHBOR_SOLICIT, 15);
1990adc6530SHasso Tepper 	DO2(ND_NEIGHBOR_ADVERT, 16);
2000adc6530SHasso Tepper 	DO(icp6s_inhist[ND_ROUTER_SOLICIT], 17, 0);
2010adc6530SHasso Tepper 	DO(icp6s_outhist[ND_ROUTER_ADVERT], 17, 35);
2020adc6530SHasso Tepper #undef DO
2030adc6530SHasso Tepper #undef DO2
2040adc6530SHasso Tepper }
2050adc6530SHasso Tepper 
2060adc6530SHasso Tepper int
initicmp6(void)2070adc6530SHasso Tepper initicmp6(void)
2080adc6530SHasso Tepper {
2090adc6530SHasso Tepper 	size_t len;
2100adc6530SHasso Tepper 	int name[4];
2110adc6530SHasso Tepper 
2120adc6530SHasso Tepper 	name[0] = CTL_NET;
2130adc6530SHasso Tepper 	name[1] = PF_INET6;
2140adc6530SHasso Tepper 	name[2] = IPPROTO_ICMPV6;
2150adc6530SHasso Tepper 	name[3] = ICMPV6CTL_STATS;
2160adc6530SHasso Tepper 
2170adc6530SHasso Tepper 	len = 0;
2180adc6530SHasso Tepper 	if (sysctl(name, 4, 0, &len, 0, 0) < 0) {
2190adc6530SHasso Tepper 		error("sysctl getting icmp6stat size failed");
2200adc6530SHasso Tepper 		return 0;
2210adc6530SHasso Tepper 	}
2220adc6530SHasso Tepper 	if (len > sizeof icmp6stat) {
2230adc6530SHasso Tepper 		error("icmp6stat structure has grown--recompile systat!");
2240adc6530SHasso Tepper 		return 0;
2250adc6530SHasso Tepper 	}
2260adc6530SHasso Tepper 	if (sysctl(name, 4, &initstat, &len, 0, 0) < 0) {
2270adc6530SHasso Tepper 		error("sysctl getting icmp6stat size failed");
2280adc6530SHasso Tepper 		return 0;
2290adc6530SHasso Tepper 	}
2300adc6530SHasso Tepper 	oldstat = initstat;
2310adc6530SHasso Tepper 	return 1;
2320adc6530SHasso Tepper }
2330adc6530SHasso Tepper 
2340adc6530SHasso Tepper void
reseticmp6(void)2350adc6530SHasso Tepper reseticmp6(void)
2360adc6530SHasso Tepper {
2370adc6530SHasso Tepper 	size_t len;
2380adc6530SHasso Tepper 	int name[4];
2390adc6530SHasso Tepper 
2400adc6530SHasso Tepper 	name[0] = CTL_NET;
2410adc6530SHasso Tepper 	name[1] = PF_INET6;
2420adc6530SHasso Tepper 	name[2] = IPPROTO_ICMPV6;
2430adc6530SHasso Tepper 	name[3] = ICMPV6CTL_STATS;
2440adc6530SHasso Tepper 
2450adc6530SHasso Tepper 	len = sizeof initstat;
2460adc6530SHasso Tepper 	if (sysctl(name, 4, &initstat, &len, 0, 0) < 0) {
2470adc6530SHasso Tepper 		error("sysctl getting icmp6stat size failed");
2480adc6530SHasso Tepper 	}
2490adc6530SHasso Tepper 	oldstat = initstat;
2500adc6530SHasso Tepper }
2510adc6530SHasso Tepper 
2520adc6530SHasso Tepper void
fetchicmp6(void)2530adc6530SHasso Tepper fetchicmp6(void)
2540adc6530SHasso Tepper {
2550adc6530SHasso Tepper 	int name[4];
2560adc6530SHasso Tepper 	size_t len;
2570adc6530SHasso Tepper 
2580adc6530SHasso Tepper 	oldstat = icmp6stat;
2590adc6530SHasso Tepper 	name[0] = CTL_NET;
2600adc6530SHasso Tepper 	name[1] = PF_INET6;
2610adc6530SHasso Tepper 	name[2] = IPPROTO_ICMPV6;
2620adc6530SHasso Tepper 	name[3] = ICMPV6CTL_STATS;
2630adc6530SHasso Tepper 	len = sizeof icmp6stat;
2640adc6530SHasso Tepper 
2650adc6530SHasso Tepper 	if (sysctl(name, 4, &icmp6stat, &len, 0, 0) < 0)
2660adc6530SHasso Tepper 		return;
2670adc6530SHasso Tepper }
2680adc6530SHasso Tepper 
2690adc6530SHasso Tepper #endif
270