]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - usr.bin/systat/icmp6.c
Upgrade Unbound to 1.6.4. More to follow.
[FreeBSD/FreeBSD.git] / usr.bin / systat / icmp6.c
1 /*-
2  * SPDX-License-Identifier: BSD-3-Clause
3  *
4  * Copyright (c) 1980, 1992, 1993
5  *      The Regents of the University of California.  All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
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.
18  *
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
29  * SUCH DAMAGE.
30  */
31
32 #include <sys/cdefs.h>
33
34 __FBSDID("$FreeBSD$");
35
36 #ifdef lint
37 static char sccsid[] = "@(#)mbufs.c     8.1 (Berkeley) 6/6/93";
38 #endif
39
40 /* From:
41         "Id: mbufs.c,v 1.5 1997/02/24 20:59:03 wollman Exp"
42 */
43
44 #ifdef INET6
45 #include <sys/param.h>
46 #include <sys/types.h>
47 #include <sys/socket.h>
48 #include <sys/sysctl.h>
49
50 #include <netinet/in.h>
51 #include <netinet/icmp6.h>
52
53 #include <stdlib.h>
54 #include <string.h>
55 #include <paths.h>
56 #include "systat.h"
57 #include "extern.h"
58 #include "mode.h"
59
60 static struct icmp6stat icmp6stat, initstat, oldstat;
61
62 /*-
63 --0         1         2         3         4         5         6         7
64 --0123456789012345678901234567890123456789012345678901234567890123456789012345
65 00          ICMPv6 Input                       ICMPv6 Output
66 01999999999 total messages           999999999 total messages
67 02999999999 with bad code            999999999 errors generated
68 03999999999 with bad length          999999999 suppressed - original too short
69 04999999999 with bad checksum        999999999 suppressed - original was ICMP
70 05999999999 with insufficient data   999999999 responses sent
71 06
72 07          Input Histogram                    Output Histogram
73 08999999999 echo response            999999999 echo response
74 09999999999 echo request             999999999 echo request
75 10999999999 destination unreachable  999999999 destination unreachable
76 11999999999 redirect                 999999999 redirect
77 12999999999 time-to-live exceeded    999999999 time-to-line exceeded
78 13999999999 parameter problem        999999999 parameter problem
79 14999999999 neighbor solicitation    999999999 neighbor solicitation
80 15999999999 neighbor advertisement   999999999 neighbor advertisement
81 16999999999 router advertisement     999999999 router solicitation
82 17
83 18
84 --0123456789012345678901234567890123456789012345678901234567890123456789012345
85 --0         1         2         3         4         5         6         7
86 */
87
88 WINDOW *
89 openicmp6(void)
90 {
91         return (subwin(stdscr, LINES-3-1, 0, MAINWIN_ROW, 0));
92 }
93
94 void
95 closeicmp6(WINDOW *w)
96 {
97         if (w == NULL)
98                 return;
99         wclear(w);
100         wrefresh(w);
101         delwin(w);
102 }
103
104 void
105 labelicmp6(void)
106 {
107         wmove(wnd, 0, 0); wclrtoeol(wnd);
108 #define L(row, str) mvwprintw(wnd, row, 10, str)
109 #define R(row, str) mvwprintw(wnd, row, 45, str);
110         L(0, "ICMPv6 Input");           R(0, "ICMPv6 Output");
111         L(1, "total messages");         R(1, "total messages");
112         L(2, "with bad code");          R(2, "errors generated");
113         L(3, "with bad length");        R(3, "suppressed - original too short");
114         L(4, "with bad checksum");      R(4, "suppressed - original was ICMP");
115         L(5, "with insufficient data"); R(5, "responses sent");
116
117         L(7, "Input Histogram");        R(7, "Output Histogram");
118 #define B(row, str) L(row, str); R(row, str)
119         B(8, "echo response");
120         B(9, "echo request");
121         B(10, "destination unreachable");
122         B(11, "redirect");
123         B(12, "time-to-live exceeded");
124         B(13, "parameter problem");
125         B(14, "neighbor solicitation");
126         B(15, "neighbor advertisement");
127         L(16, "router advertisement");  R(16, "router solicitation");
128 #undef L
129 #undef R
130 #undef B
131 }
132
133 static void
134 domode(struct icmp6stat *ret)
135 {
136         const struct icmp6stat *sub;
137         int i, divisor = 1;
138
139         switch(currentmode) {
140         case display_RATE:
141                 sub = &oldstat;
142                 divisor = (delay > 1000000) ? delay / 1000000 : 1;
143                 break;
144         case display_DELTA:
145                 sub = &oldstat;
146                 break;
147         case display_SINCE:
148                 sub = &initstat;
149                 break;
150         default:
151                 *ret = icmp6stat;
152                 return;
153         }
154 #define DO(stat) ret->stat = (icmp6stat.stat - sub->stat) / divisor
155         DO(icp6s_error);
156         DO(icp6s_tooshort);
157         DO(icp6s_canterror);
158         for (i = 0; i <= ICMP6_MAXTYPE; i++) {
159                 DO(icp6s_outhist[i]);
160         }
161         DO(icp6s_badcode);
162         DO(icp6s_tooshort);
163         DO(icp6s_checksum);
164         DO(icp6s_badlen);
165         DO(icp6s_reflect);
166         for (i = 0; i <= ICMP6_MAXTYPE; i++) {
167                 DO(icp6s_inhist[i]);
168         }
169 #undef DO
170 }
171
172 void
173 showicmp6(void)
174 {
175         struct icmp6stat stats;
176         u_long totalin, totalout;
177         int i;
178
179         memset(&stats, 0, sizeof stats);
180         domode(&stats);
181         for (i = totalin = totalout = 0; i <= ICMP6_MAXTYPE; i++) {
182                 totalin += stats.icp6s_inhist[i];
183                 totalout += stats.icp6s_outhist[i];
184         }
185         totalin += stats.icp6s_badcode + stats.icp6s_badlen +
186                 stats.icp6s_checksum + stats.icp6s_tooshort;
187         mvwprintw(wnd, 1, 0, "%9lu", totalin);
188         mvwprintw(wnd, 1, 35, "%9lu", totalout);
189
190 #define DO(stat, row, col) \
191         mvwprintw(wnd, row, col, "%9lu", stats.stat)
192
193         DO(icp6s_badcode, 2, 0);
194         DO(icp6s_badlen, 3, 0);
195         DO(icp6s_checksum, 4, 0);
196         DO(icp6s_tooshort, 5, 0);
197         DO(icp6s_error, 2, 35);
198         DO(icp6s_tooshort, 3, 35);
199         DO(icp6s_canterror, 4, 35);
200         DO(icp6s_reflect, 5, 35);
201 #define DO2(type, row) DO(icp6s_inhist[type], row, 0); DO(icp6s_outhist[type], \
202                                                          row, 35)
203         DO2(ICMP6_ECHO_REPLY, 8);
204         DO2(ICMP6_ECHO_REQUEST, 9);
205         DO2(ICMP6_DST_UNREACH, 10);
206         DO2(ND_REDIRECT, 11);
207         DO2(ICMP6_TIME_EXCEEDED, 12);
208         DO2(ICMP6_PARAM_PROB, 13);
209         DO2(ND_NEIGHBOR_SOLICIT, 14);
210         DO2(ND_NEIGHBOR_ADVERT, 15);
211         DO(icp6s_inhist[ND_ROUTER_SOLICIT], 16, 0);
212         DO(icp6s_outhist[ND_ROUTER_ADVERT], 16, 35);
213 #undef DO
214 #undef DO2
215 }
216
217 int
218 initicmp6(void)
219 {
220         size_t len;
221         int name[4];
222
223         name[0] = CTL_NET;
224         name[1] = PF_INET6;
225         name[2] = IPPROTO_ICMPV6;
226         name[3] = ICMPV6CTL_STATS;
227
228         len = 0;
229         if (sysctl(name, 4, 0, &len, 0, 0) < 0) {
230                 error("sysctl getting icmp6stat size failed");
231                 return 0;
232         }
233         if (len > sizeof icmp6stat) {
234                 error("icmp6stat structure has grown--recompile systat!");
235                 return 0;
236         }
237         if (sysctl(name, 4, &initstat, &len, 0, 0) < 0) {
238                 error("sysctl getting icmp6stat size failed");
239                 return 0;
240         }
241         oldstat = initstat;
242         return 1;
243 }
244
245 void
246 reseticmp6(void)
247 {
248         size_t len;
249         int name[4];
250
251         name[0] = CTL_NET;
252         name[1] = PF_INET6;
253         name[2] = IPPROTO_ICMPV6;
254         name[3] = ICMPV6CTL_STATS;
255
256         len = sizeof initstat;
257         if (sysctl(name, 4, &initstat, &len, 0, 0) < 0) {
258                 error("sysctl getting icmp6stat size failed");
259         }
260         oldstat = initstat;
261 }
262
263 void
264 fetchicmp6(void)
265 {
266         int name[4];
267         size_t len;
268
269         oldstat = icmp6stat;
270         name[0] = CTL_NET;
271         name[1] = PF_INET6;
272         name[2] = IPPROTO_ICMPV6;
273         name[3] = ICMPV6CTL_STATS;
274         len = sizeof icmp6stat;
275
276         if (sysctl(name, 4, &icmp6stat, &len, 0, 0) < 0)
277                 return;
278 }
279
280 #endif