ip6.c revision 118318
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 * 3. All advertising materials mentioning features or use of this software 14118318Sdwmalone * must display the following acknowledgement: 15118318Sdwmalone * This product includes software developed by the University of 16118318Sdwmalone * California, Berkeley and its contributors. 17118318Sdwmalone * 4. Neither the name of the University nor the names of its contributors 18118318Sdwmalone * may be used to endorse or promote products derived from this software 19118318Sdwmalone * without specific prior written permission. 20118318Sdwmalone * 21118318Sdwmalone * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22118318Sdwmalone * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23118318Sdwmalone * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24118318Sdwmalone * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25118318Sdwmalone * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26118318Sdwmalone * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27118318Sdwmalone * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28118318Sdwmalone * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29118318Sdwmalone * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30118318Sdwmalone * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31118318Sdwmalone * SUCH DAMAGE. 32118318Sdwmalone */ 33118318Sdwmalone 34118318Sdwmalone#include <sys/cdefs.h> 35118318Sdwmalone 36118318Sdwmalone__FBSDID("$FreeBSD: head/usr.bin/systat/ip6.c 118318 2003-08-01 20:28:20Z dwmalone $"); 37118318Sdwmalone 38118318Sdwmalone#ifdef lint 39118318Sdwmalonestatic const char sccsid[] = "@(#)mbufs.c 8.1 (Berkeley) 6/6/93"; 40118318Sdwmalone#endif 41118318Sdwmalone 42118318Sdwmalone/* From: 43118318Sdwmalone "Id: mbufs.c,v 1.5 1997/02/24 20:59:03 wollman Exp" 44118318Sdwmalone*/ 45118318Sdwmalone 46118318Sdwmalone#ifdef INET6 47118318Sdwmalone#include <sys/param.h> 48118318Sdwmalone#include <sys/types.h> 49118318Sdwmalone#include <sys/socket.h> 50118318Sdwmalone#include <sys/sysctl.h> 51118318Sdwmalone 52118318Sdwmalone#include <netinet/in.h> 53118318Sdwmalone#include <netinet/in_systm.h> 54118318Sdwmalone#include <netinet/ip.h> 55118318Sdwmalone#include <netinet6/ip6_var.h> 56118318Sdwmalone 57118318Sdwmalone#include <stdlib.h> 58118318Sdwmalone#include <string.h> 59118318Sdwmalone#include <paths.h> 60118318Sdwmalone 61118318Sdwmalone#include "systat.h" 62118318Sdwmalone#include "extern.h" 63118318Sdwmalone#include "mode.h" 64118318Sdwmalone 65118318Sdwmalonestatic struct ip6stat curstat, initstat, oldstat; 66118318Sdwmalone 67118318Sdwmalone/*- 68118318Sdwmalone--0 1 2 3 4 5 6 7 69118318Sdwmalone--0123456789012345678901234567890123456789012345678901234567890123456789012345 70118318Sdwmalone01 IPv6 Input IPv6 Output 71118318Sdwmalone029999999 total packets received 999999999 total packets sent 72118318Sdwmalone039999999 - too short for header 999999999 - generated locally 73118318Sdwmalone049999999 - too short for data 999999999 - output drops 74118318Sdwmalone059999999 - with invalid version 999999999 output fragments generated 75118318Sdwmalone069999999 total fragments received 999999999 - fragmentation failed 76118318Sdwmalone079999999 - fragments dropped 999999999 destinations unreachable 77118318Sdwmalone089999999 - fragments timed out 999999999 packets output via raw IP 78118318Sdwmalone099999999 - fragments overflown Input next-header histogram 79118318Sdwmalone109999999 - packets reassembled ok 999999999 - destination options 80118318Sdwmalone119999999 packets forwarded 999999999 - hop-by-hop options 81118318Sdwmalone129999999 - unreachable dests 999999999 - IPv4 82118318Sdwmalone139999999 - redirects generated 999999999 - TCP 83118318Sdwmalone149999999 option errors 999999999 - UDP 84118318Sdwmalone159999999 unwanted multicasts 999999999 - IPv6 85118318Sdwmalone169999999 delivered to upper layer 999999999 - routing header 86118318Sdwmalone17 999999999 - fragmentation header 87118318Sdwmalone189999999 bad scope packets 999999999 - ICMP6 88118318Sdwmalone199999999 address selection failed 999999999 - none 89118318Sdwmalone--0123456789012345678901234567890123456789012345678901234567890123456789012345 90118318Sdwmalone--0 1 2 3 4 5 6 7 91118318Sdwmalone*/ 92118318Sdwmalone 93118318SdwmaloneWINDOW * 94118318Sdwmaloneopenip6(void) 95118318Sdwmalone{ 96118318Sdwmalone return (subwin(stdscr, LINES-4-1, 0, 4, 0)); 97118318Sdwmalone} 98118318Sdwmalone 99118318Sdwmalonevoid 100118318Sdwmalonecloseip6(w) 101118318Sdwmalone WINDOW *w; 102118318Sdwmalone{ 103118318Sdwmalone if (w == NULL) 104118318Sdwmalone return; 105118318Sdwmalone wclear(w); 106118318Sdwmalone wrefresh(w); 107118318Sdwmalone delwin(w); 108118318Sdwmalone} 109118318Sdwmalone 110118318Sdwmalonevoid 111118318Sdwmalonelabelip6(void) 112118318Sdwmalone{ 113118318Sdwmalone wmove(wnd, 0, 0); wclrtoeol(wnd); 114118318Sdwmalone#define L(row, str) mvwprintw(wnd, row, 10, str) 115118318Sdwmalone#define R(row, str) mvwprintw(wnd, row, 45, str); 116118318Sdwmalone L(1, "IPv6 Input"); R(1, "IPv6 Output"); 117118318Sdwmalone L(2, "total packets received"); R(2, "total packets sent"); 118118318Sdwmalone L(3, "- too short for header"); R(3, "- generated locally"); 119118318Sdwmalone L(4, "- too short for data"); R(4, "- output drops"); 120118318Sdwmalone L(5, "- with invalid version"); R(5, "output fragments generated"); 121118318Sdwmalone L(6, "total fragments received"); R(6, "- fragmentation failed"); 122118318Sdwmalone L(7, "- fragments dropped"); R(7, "destinations unreachable"); 123118318Sdwmalone L(8, "- fragments timed out"); R(8, "packets output via raw IP"); 124118318Sdwmalone L(9, "- fragments overflown"); R(9, "Input next-header histogram"); 125118318Sdwmalone L(10, "- packets reassembled ok"); R(10, " - destination options"); 126118318Sdwmalone L(11, "packets forwarded"); R(11, " - hop-by-hop options"); 127118318Sdwmalone L(12, "- unreachable dests"); R(12, " - IPv4"); 128118318Sdwmalone L(13, "- redirects generated"); R(13, " - TCP"); 129118318Sdwmalone L(14, "option errors"); R(14, " - UDP"); 130118318Sdwmalone L(15, "unwanted multicasts"); R(15, " - IPv6"); 131118318Sdwmalone L(16, "delivered to upper layer"); R(16, " - routing header"); 132118318Sdwmalone R(17, " - fragmentation header"); 133118318Sdwmalone L(18, "bad scope packets"); R(18, " - ICMP6"); 134118318Sdwmalone L(19, "address selection failed"); R(19, " - none"); 135118318Sdwmalone#undef L 136118318Sdwmalone#undef R 137118318Sdwmalone} 138118318Sdwmalone 139118318Sdwmalonestatic void 140118318Sdwmalonedomode(struct ip6stat *ret) 141118318Sdwmalone{ 142118318Sdwmalone const struct ip6stat *sub; 143118318Sdwmalone int divisor = 1, i; 144118318Sdwmalone 145118318Sdwmalone switch(currentmode) { 146118318Sdwmalone case display_RATE: 147118318Sdwmalone sub = &oldstat; 148118318Sdwmalone divisor = naptime; 149118318Sdwmalone break; 150118318Sdwmalone case display_DELTA: 151118318Sdwmalone sub = &oldstat; 152118318Sdwmalone break; 153118318Sdwmalone case display_SINCE: 154118318Sdwmalone sub = &initstat; 155118318Sdwmalone break; 156118318Sdwmalone default: 157118318Sdwmalone *ret = curstat; 158118318Sdwmalone return; 159118318Sdwmalone } 160118318Sdwmalone#define DO(stat) ret->stat = (curstat.stat - sub->stat) / divisor 161118318Sdwmalone DO(ip6s_total); 162118318Sdwmalone DO(ip6s_tooshort); 163118318Sdwmalone DO(ip6s_toosmall); 164118318Sdwmalone DO(ip6s_fragments); 165118318Sdwmalone DO(ip6s_fragdropped); 166118318Sdwmalone DO(ip6s_fragtimeout); 167118318Sdwmalone DO(ip6s_fragoverflow); 168118318Sdwmalone DO(ip6s_forward); 169118318Sdwmalone DO(ip6s_cantforward); 170118318Sdwmalone DO(ip6s_redirectsent); 171118318Sdwmalone DO(ip6s_delivered); 172118318Sdwmalone DO(ip6s_localout); 173118318Sdwmalone DO(ip6s_odropped); 174118318Sdwmalone DO(ip6s_reassembled); 175118318Sdwmalone DO(ip6s_fragmented); 176118318Sdwmalone DO(ip6s_ofragments); 177118318Sdwmalone DO(ip6s_cantfrag); 178118318Sdwmalone DO(ip6s_badoptions); 179118318Sdwmalone DO(ip6s_noroute); 180118318Sdwmalone DO(ip6s_badvers); 181118318Sdwmalone DO(ip6s_rawout); 182118318Sdwmalone DO(ip6s_notmember); 183118318Sdwmalone for (i = 0; i < 256; i++) 184118318Sdwmalone DO(ip6s_nxthist[i]); 185118318Sdwmalone DO(ip6s_badscope); 186118318Sdwmalone DO(ip6s_sources_none); 187118318Sdwmalone#undef DO 188118318Sdwmalone} 189118318Sdwmalone 190118318Sdwmalonevoid 191118318Sdwmaloneshowip6(void) 192118318Sdwmalone{ 193118318Sdwmalone struct ip6stat stats; 194118318Sdwmalone u_long totalout; 195118318Sdwmalone 196118318Sdwmalone domode(&stats); 197118318Sdwmalone totalout = stats.ip6s_forward + stats.ip6s_localout; 198118318Sdwmalone 199118318Sdwmalone#define DO(stat, row, col) \ 200118318Sdwmalone mvwprintw(wnd, row, col, "%9lu", stats.stat) 201118318Sdwmalone 202118318Sdwmalone DO(ip6s_total, 2, 0); 203118318Sdwmalone mvwprintw(wnd, 2, 35, "%9lu", totalout); 204118318Sdwmalone DO(ip6s_localout, 3, 35); 205118318Sdwmalone DO(ip6s_tooshort, 3, 0); 206118318Sdwmalone DO(ip6s_odropped, 4, 35); 207118318Sdwmalone DO(ip6s_toosmall, 4, 0); 208118318Sdwmalone DO(ip6s_ofragments, 5, 35); 209118318Sdwmalone DO(ip6s_badvers, 5, 0); 210118318Sdwmalone DO(ip6s_cantfrag, 6, 35); 211118318Sdwmalone DO(ip6s_fragments, 6, 0); 212118318Sdwmalone DO(ip6s_noroute, 7, 35); 213118318Sdwmalone DO(ip6s_fragdropped, 7, 0); 214118318Sdwmalone DO(ip6s_rawout, 8, 35); 215118318Sdwmalone DO(ip6s_fragtimeout, 8, 0); 216118318Sdwmalone DO(ip6s_fragoverflow, 9, 0); 217118318Sdwmalone DO(ip6s_nxthist[IPPROTO_DSTOPTS], 10, 35); 218118318Sdwmalone DO(ip6s_reassembled, 10, 0); 219118318Sdwmalone DO(ip6s_nxthist[IPPROTO_HOPOPTS], 11, 35); 220118318Sdwmalone DO(ip6s_forward, 11, 0); 221118318Sdwmalone DO(ip6s_nxthist[IPPROTO_IPV4], 12, 35); 222118318Sdwmalone DO(ip6s_cantforward, 12, 0); 223118318Sdwmalone DO(ip6s_nxthist[IPPROTO_TCP], 13, 35); 224118318Sdwmalone DO(ip6s_redirectsent, 13, 0); 225118318Sdwmalone DO(ip6s_nxthist[IPPROTO_UDP], 14, 35); 226118318Sdwmalone DO(ip6s_badoptions, 14, 0); 227118318Sdwmalone DO(ip6s_nxthist[IPPROTO_IPV6], 15, 35); 228118318Sdwmalone DO(ip6s_notmember, 15, 0); 229118318Sdwmalone DO(ip6s_nxthist[IPPROTO_ROUTING], 16, 35); 230118318Sdwmalone DO(ip6s_delivered, 16, 0); 231118318Sdwmalone DO(ip6s_nxthist[IPPROTO_FRAGMENT], 17, 35); 232118318Sdwmalone DO(ip6s_nxthist[IPPROTO_ICMPV6], 18, 35); 233118318Sdwmalone DO(ip6s_badscope, 18, 0); 234118318Sdwmalone DO(ip6s_nxthist[IPPROTO_NONE], 19, 35); 235118318Sdwmalone DO(ip6s_sources_none, 19, 0); 236118318Sdwmalone#undef DO 237118318Sdwmalone} 238118318Sdwmalone 239118318Sdwmaloneint 240118318Sdwmaloneinitip6(void) 241118318Sdwmalone{ 242118318Sdwmalone size_t len; 243118318Sdwmalone int name[4]; 244118318Sdwmalone 245118318Sdwmalone name[0] = CTL_NET; 246118318Sdwmalone name[1] = PF_INET6; 247118318Sdwmalone name[2] = IPPROTO_IPV6; 248118318Sdwmalone name[3] = IPV6CTL_STATS; 249118318Sdwmalone 250118318Sdwmalone len = 0; 251118318Sdwmalone if (sysctl(name, 4, 0, &len, 0, 0) < 0) { 252118318Sdwmalone error("sysctl getting ip6stat size failed"); 253118318Sdwmalone return 0; 254118318Sdwmalone } 255118318Sdwmalone if (len > sizeof curstat) { 256118318Sdwmalone error("ip6stat structure has grown--recompile systat!"); 257118318Sdwmalone return 0; 258118318Sdwmalone } 259118318Sdwmalone if (sysctl(name, 4, &initstat, &len, 0, 0) < 0) { 260118318Sdwmalone error("sysctl getting ip6stat failed"); 261118318Sdwmalone return 0; 262118318Sdwmalone } 263118318Sdwmalone oldstat = initstat; 264118318Sdwmalone return 1; 265118318Sdwmalone} 266118318Sdwmalone 267118318Sdwmalonevoid 268118318Sdwmaloneresetip6(void) 269118318Sdwmalone{ 270118318Sdwmalone size_t len; 271118318Sdwmalone int name[4]; 272118318Sdwmalone 273118318Sdwmalone name[0] = CTL_NET; 274118318Sdwmalone name[1] = PF_INET6; 275118318Sdwmalone name[2] = IPPROTO_IPV6; 276118318Sdwmalone name[3] = IPV6CTL_STATS; 277118318Sdwmalone 278118318Sdwmalone len = sizeof initstat; 279118318Sdwmalone if (sysctl(name, 4, &initstat, &len, 0, 0) < 0) { 280118318Sdwmalone error("sysctl getting ipstat failed"); 281118318Sdwmalone } 282118318Sdwmalone 283118318Sdwmalone oldstat = initstat; 284118318Sdwmalone} 285118318Sdwmalone 286118318Sdwmalonevoid 287118318Sdwmalonefetchip6(void) 288118318Sdwmalone{ 289118318Sdwmalone int name[4]; 290118318Sdwmalone size_t len; 291118318Sdwmalone 292118318Sdwmalone oldstat = curstat; 293118318Sdwmalone name[0] = CTL_NET; 294118318Sdwmalone name[1] = PF_INET6; 295118318Sdwmalone name[2] = IPPROTO_IPV6; 296118318Sdwmalone name[3] = IPV6CTL_STATS; 297118318Sdwmalone len = sizeof curstat; 298118318Sdwmalone 299118318Sdwmalone if (sysctl(name, 4, &curstat, &len, 0, 0) < 0) 300118318Sdwmalone return; 301118318Sdwmalone} 302118318Sdwmalone 303118318Sdwmalone#endif 304