1118318Sdwmalone/*- 2118318Sdwmalone * Copyright (c) 1980, 1992, 1993 3118318Sdwmalone * The Regents of the University of California. All rights reserved. 4118318Sdwmalone * 5118318Sdwmalone * Redistribution and use in source and binary forms, with or without 6118318Sdwmalone * modification, are permitted provided that the following conditions 7118318Sdwmalone * are met: 8118318Sdwmalone * 1. Redistributions of source code must retain the above copyright 9118318Sdwmalone * notice, this list of conditions and the following disclaimer. 10118318Sdwmalone * 2. Redistributions in binary form must reproduce the above copyright 11118318Sdwmalone * notice, this list of conditions and the following disclaimer in the 12118318Sdwmalone * documentation and/or other materials provided with the distribution. 13118318Sdwmalone * 4. Neither the name of the University nor the names of its contributors 14118318Sdwmalone * may be used to endorse or promote products derived from this software 15118318Sdwmalone * without specific prior written permission. 16118318Sdwmalone * 17118318Sdwmalone * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 18118318Sdwmalone * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19118318Sdwmalone * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20118318Sdwmalone * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 21118318Sdwmalone * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22118318Sdwmalone * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23118318Sdwmalone * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24118318Sdwmalone * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25118318Sdwmalone * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26118318Sdwmalone * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27118318Sdwmalone * SUCH DAMAGE. 28118318Sdwmalone */ 29118318Sdwmalone 30118318Sdwmalone#include <sys/cdefs.h> 31118318Sdwmalone 32118318Sdwmalone__FBSDID("$FreeBSD: stable/11/usr.bin/systat/ip6.c 368931 2021-01-05 20:02:55Z mr $"); 33118318Sdwmalone 34118318Sdwmalone#ifdef lint 35118318Sdwmalonestatic const char sccsid[] = "@(#)mbufs.c 8.1 (Berkeley) 6/6/93"; 36118318Sdwmalone#endif 37118318Sdwmalone 38118318Sdwmalone/* From: 39118318Sdwmalone "Id: mbufs.c,v 1.5 1997/02/24 20:59:03 wollman Exp" 40118318Sdwmalone*/ 41118318Sdwmalone 42118318Sdwmalone#ifdef INET6 43118318Sdwmalone#include <sys/param.h> 44118318Sdwmalone#include <sys/types.h> 45118318Sdwmalone#include <sys/socket.h> 46118318Sdwmalone#include <sys/sysctl.h> 47118318Sdwmalone 48118318Sdwmalone#include <netinet/in.h> 49118318Sdwmalone#include <netinet/in_systm.h> 50118318Sdwmalone#include <netinet/ip.h> 51118318Sdwmalone#include <netinet6/ip6_var.h> 52118318Sdwmalone 53368931Smr#include <inttypes.h> 54118318Sdwmalone#include <stdlib.h> 55118318Sdwmalone#include <string.h> 56118318Sdwmalone#include <paths.h> 57118318Sdwmalone 58118318Sdwmalone#include "systat.h" 59118318Sdwmalone#include "extern.h" 60118318Sdwmalone#include "mode.h" 61118318Sdwmalone 62118318Sdwmalonestatic struct ip6stat curstat, initstat, oldstat; 63118318Sdwmalone 64118318Sdwmalone/*- 65118318Sdwmalone--0 1 2 3 4 5 6 7 66118318Sdwmalone--0123456789012345678901234567890123456789012345678901234567890123456789012345 67158160Sbde00 IPv6 Input IPv6 Output 68158160Sbde019999999 total packets received 999999999 total packets sent 69158160Sbde029999999 - too short for header 999999999 - generated locally 70158160Sbde039999999 - too short for data 999999999 - output drops 71158160Sbde049999999 - with invalid version 999999999 output fragments generated 72158160Sbde059999999 total fragments received 999999999 - fragmentation failed 73158160Sbde069999999 - fragments dropped 999999999 destinations unreachable 74158160Sbde079999999 - fragments timed out 999999999 packets output via raw IP 75158161Sbde089999999 - fragments overflown 76158160Sbde099999999 - packets reassembled ok Input next-header histogram 77158160Sbde109999999 packets forwarded 999999999 - destination options 78158160Sbde119999999 - unreachable dests 999999999 - hop-by-hop options 79158160Sbde129999999 - redirects generated 999999999 - IPv4 80158160Sbde139999999 option errors 999999999 - TCP 81158160Sbde149999999 unwanted multicasts 999999999 - UDP 82158160Sbde159999999 delivered to upper layer 999999999 - IPv6 83158160Sbde169999999 bad scope packets 999999999 - routing header 84158160Sbde179999999 address selection failed 999999999 - fragmentation header 85158160Sbde18 999999999 - ICMP6 86158161Sbde19 999999999 - none 87118318Sdwmalone--0123456789012345678901234567890123456789012345678901234567890123456789012345 88118318Sdwmalone--0 1 2 3 4 5 6 7 89118318Sdwmalone*/ 90118318Sdwmalone 91118318SdwmaloneWINDOW * 92118318Sdwmaloneopenip6(void) 93118318Sdwmalone{ 94158160Sbde return (subwin(stdscr, LINES-3-1, 0, MAINWIN_ROW, 0)); 95118318Sdwmalone} 96118318Sdwmalone 97118318Sdwmalonevoid 98175387Sdelphijcloseip6(WINDOW *w) 99118318Sdwmalone{ 100118318Sdwmalone if (w == NULL) 101118318Sdwmalone return; 102118318Sdwmalone wclear(w); 103118318Sdwmalone wrefresh(w); 104118318Sdwmalone delwin(w); 105118318Sdwmalone} 106118318Sdwmalone 107118318Sdwmalonevoid 108118318Sdwmalonelabelip6(void) 109118318Sdwmalone{ 110118318Sdwmalone wmove(wnd, 0, 0); wclrtoeol(wnd); 111118318Sdwmalone#define L(row, str) mvwprintw(wnd, row, 10, str) 112118318Sdwmalone#define R(row, str) mvwprintw(wnd, row, 45, str); 113158160Sbde L(0, "IPv6 Input"); R(0, "IPv6 Output"); 114158160Sbde L(1, "total packets received"); R(1, "total packets sent"); 115158160Sbde L(2, "- too short for header"); R(2, "- generated locally"); 116158160Sbde L(3, "- too short for data"); R(3, "- output drops"); 117158160Sbde L(4, "- with invalid version"); R(4, "output fragments generated"); 118158160Sbde L(5, "total fragments received"); R(5, "- fragmentation failed"); 119158160Sbde L(6, "- fragments dropped"); R(6, "destinations unreachable"); 120158160Sbde L(7, "- fragments timed out"); R(7, "packets output via raw IP"); 121158160Sbde L(8, "- fragments overflown"); 122158160Sbde L(9, "- packets reassembled ok"); R(9, "Input next-header histogram"); 123158160Sbde L(10, "packets forwarded"); R(10, " - destination options"); 124158160Sbde L(11, "- unreachable dests"); R(11, " - hop-by-hop options"); 125158160Sbde L(12, "- redirects generated"); R(12, " - IPv4"); 126158160Sbde L(13, "option errors"); R(13, " - TCP"); 127158160Sbde L(14, "unwanted multicasts"); R(14, " - UDP"); 128158160Sbde L(15, "delivered to upper layer"); R(15, " - IPv6"); 129158160Sbde L(16, "bad scope packets"); R(16, " - routing header"); 130158160Sbde L(17, "address selection failed"); R(17, " - fragmentation header"); 131158160Sbde R(18, " - ICMP6"); 132158160Sbde R(19, " - none"); 133118318Sdwmalone#undef L 134118318Sdwmalone#undef R 135118318Sdwmalone} 136118318Sdwmalone 137118318Sdwmalonestatic void 138118318Sdwmalonedomode(struct ip6stat *ret) 139118318Sdwmalone{ 140118318Sdwmalone const struct ip6stat *sub; 141118318Sdwmalone int divisor = 1, i; 142118318Sdwmalone 143118318Sdwmalone switch(currentmode) { 144118318Sdwmalone case display_RATE: 145118318Sdwmalone sub = &oldstat; 146240605Smelifaro divisor = (delay > 1000000) ? delay / 1000000 : 1; 147118318Sdwmalone break; 148118318Sdwmalone case display_DELTA: 149118318Sdwmalone sub = &oldstat; 150118318Sdwmalone break; 151118318Sdwmalone case display_SINCE: 152118318Sdwmalone sub = &initstat; 153118318Sdwmalone break; 154118318Sdwmalone default: 155118318Sdwmalone *ret = curstat; 156118318Sdwmalone return; 157118318Sdwmalone } 158118318Sdwmalone#define DO(stat) ret->stat = (curstat.stat - sub->stat) / divisor 159118318Sdwmalone DO(ip6s_total); 160118318Sdwmalone DO(ip6s_tooshort); 161118318Sdwmalone DO(ip6s_toosmall); 162118318Sdwmalone DO(ip6s_fragments); 163118318Sdwmalone DO(ip6s_fragdropped); 164118318Sdwmalone DO(ip6s_fragtimeout); 165118318Sdwmalone DO(ip6s_fragoverflow); 166118318Sdwmalone DO(ip6s_forward); 167118318Sdwmalone DO(ip6s_cantforward); 168118318Sdwmalone DO(ip6s_redirectsent); 169118318Sdwmalone DO(ip6s_delivered); 170118318Sdwmalone DO(ip6s_localout); 171118318Sdwmalone DO(ip6s_odropped); 172118318Sdwmalone DO(ip6s_reassembled); 173118318Sdwmalone DO(ip6s_fragmented); 174118318Sdwmalone DO(ip6s_ofragments); 175118318Sdwmalone DO(ip6s_cantfrag); 176118318Sdwmalone DO(ip6s_badoptions); 177118318Sdwmalone DO(ip6s_noroute); 178118318Sdwmalone DO(ip6s_badvers); 179118318Sdwmalone DO(ip6s_rawout); 180118318Sdwmalone DO(ip6s_notmember); 181118318Sdwmalone for (i = 0; i < 256; i++) 182118318Sdwmalone DO(ip6s_nxthist[i]); 183118318Sdwmalone DO(ip6s_badscope); 184118318Sdwmalone DO(ip6s_sources_none); 185118318Sdwmalone#undef DO 186118318Sdwmalone} 187158161Sbde 188118318Sdwmalonevoid 189118318Sdwmaloneshowip6(void) 190118318Sdwmalone{ 191118318Sdwmalone struct ip6stat stats; 192368931Smr uint64_t totalout; 193118318Sdwmalone 194118318Sdwmalone domode(&stats); 195118318Sdwmalone totalout = stats.ip6s_forward + stats.ip6s_localout; 196118318Sdwmalone 197118318Sdwmalone#define DO(stat, row, col) \ 198368931Smr mvwprintw(wnd, row, col, "%9"PRIu64, stats.stat) 199118318Sdwmalone 200158160Sbde DO(ip6s_total, 1, 0); 201368931Smr mvwprintw(wnd, 1, 35, "%9"PRIu64, totalout); 202158160Sbde DO(ip6s_tooshort, 2, 0); 203158160Sbde DO(ip6s_localout, 2, 35); 204158160Sbde DO(ip6s_toosmall, 3, 0); 205158160Sbde DO(ip6s_odropped, 3, 35); 206158160Sbde DO(ip6s_badvers, 4, 0); 207158160Sbde DO(ip6s_ofragments, 4, 35); 208158160Sbde DO(ip6s_fragments, 5, 0); 209158160Sbde DO(ip6s_cantfrag, 5, 35); 210158160Sbde DO(ip6s_fragdropped, 6, 0); 211158160Sbde DO(ip6s_noroute, 6, 35); 212158160Sbde DO(ip6s_fragtimeout, 7, 0); 213158160Sbde DO(ip6s_rawout, 7, 35); 214158160Sbde DO(ip6s_fragoverflow, 8, 0); 215158160Sbde DO(ip6s_reassembled, 9, 0); 216158160Sbde DO(ip6s_forward, 10, 0); 217118318Sdwmalone DO(ip6s_nxthist[IPPROTO_DSTOPTS], 10, 35); 218158160Sbde DO(ip6s_cantforward, 11, 0); 219118318Sdwmalone DO(ip6s_nxthist[IPPROTO_HOPOPTS], 11, 35); 220158160Sbde DO(ip6s_redirectsent, 12, 0); 221118318Sdwmalone DO(ip6s_nxthist[IPPROTO_IPV4], 12, 35); 222158160Sbde DO(ip6s_badoptions, 13, 0); 223118318Sdwmalone DO(ip6s_nxthist[IPPROTO_TCP], 13, 35); 224158160Sbde DO(ip6s_notmember, 14, 0); 225118318Sdwmalone DO(ip6s_nxthist[IPPROTO_UDP], 14, 35); 226158160Sbde DO(ip6s_delivered, 15, 0); 227118318Sdwmalone DO(ip6s_nxthist[IPPROTO_IPV6], 15, 35); 228158160Sbde DO(ip6s_badscope, 16, 0); 229118318Sdwmalone DO(ip6s_nxthist[IPPROTO_ROUTING], 16, 35); 230158160Sbde DO(ip6s_sources_none, 17, 0); 231118318Sdwmalone DO(ip6s_nxthist[IPPROTO_FRAGMENT], 17, 35); 232118318Sdwmalone DO(ip6s_nxthist[IPPROTO_ICMPV6], 18, 35); 233118318Sdwmalone DO(ip6s_nxthist[IPPROTO_NONE], 19, 35); 234118318Sdwmalone#undef DO 235118318Sdwmalone} 236118318Sdwmalone 237118318Sdwmaloneint 238118318Sdwmaloneinitip6(void) 239118318Sdwmalone{ 240118318Sdwmalone size_t len; 241118318Sdwmalone int name[4]; 242118318Sdwmalone 243118318Sdwmalone name[0] = CTL_NET; 244118318Sdwmalone name[1] = PF_INET6; 245118318Sdwmalone name[2] = IPPROTO_IPV6; 246118318Sdwmalone name[3] = IPV6CTL_STATS; 247118318Sdwmalone 248118318Sdwmalone len = 0; 249118318Sdwmalone if (sysctl(name, 4, 0, &len, 0, 0) < 0) { 250118318Sdwmalone error("sysctl getting ip6stat size failed"); 251118318Sdwmalone return 0; 252118318Sdwmalone } 253118318Sdwmalone if (len > sizeof curstat) { 254118318Sdwmalone error("ip6stat structure has grown--recompile systat!"); 255118318Sdwmalone return 0; 256118318Sdwmalone } 257118318Sdwmalone if (sysctl(name, 4, &initstat, &len, 0, 0) < 0) { 258118318Sdwmalone error("sysctl getting ip6stat failed"); 259118318Sdwmalone return 0; 260118318Sdwmalone } 261118318Sdwmalone oldstat = initstat; 262118318Sdwmalone return 1; 263118318Sdwmalone} 264118318Sdwmalone 265118318Sdwmalonevoid 266118318Sdwmaloneresetip6(void) 267118318Sdwmalone{ 268118318Sdwmalone size_t len; 269118318Sdwmalone int name[4]; 270118318Sdwmalone 271118318Sdwmalone name[0] = CTL_NET; 272118318Sdwmalone name[1] = PF_INET6; 273118318Sdwmalone name[2] = IPPROTO_IPV6; 274118318Sdwmalone name[3] = IPV6CTL_STATS; 275118318Sdwmalone 276118318Sdwmalone len = sizeof initstat; 277118318Sdwmalone if (sysctl(name, 4, &initstat, &len, 0, 0) < 0) { 278118318Sdwmalone error("sysctl getting ipstat failed"); 279118318Sdwmalone } 280118318Sdwmalone 281118318Sdwmalone oldstat = initstat; 282118318Sdwmalone} 283118318Sdwmalone 284118318Sdwmalonevoid 285118318Sdwmalonefetchip6(void) 286118318Sdwmalone{ 287118318Sdwmalone int name[4]; 288118318Sdwmalone size_t len; 289118318Sdwmalone 290118318Sdwmalone oldstat = curstat; 291118318Sdwmalone name[0] = CTL_NET; 292118318Sdwmalone name[1] = PF_INET6; 293118318Sdwmalone name[2] = IPPROTO_IPV6; 294118318Sdwmalone name[3] = IPV6CTL_STATS; 295118318Sdwmalone len = sizeof curstat; 296118318Sdwmalone 297118318Sdwmalone if (sysctl(name, 4, &curstat, &len, 0, 0) < 0) 298118318Sdwmalone return; 299118318Sdwmalone} 300118318Sdwmalone 301118318Sdwmalone#endif 302