inet6.c revision 55533
154263Sshin/* BSDI inet.c,v 2.3 1995/10/24 02:19:29 prb Exp */ 254263Sshin/* 354263Sshin * Copyright (c) 1983, 1988, 1993 454263Sshin * The Regents of the University of California. All rights reserved. 554263Sshin * 654263Sshin * Redistribution and use in source and binary forms, with or without 754263Sshin * modification, are permitted provided that the following conditions 854263Sshin * are met: 954263Sshin * 1. Redistributions of source code must retain the above copyright 1054263Sshin * notice, this list of conditions and the following disclaimer. 1154263Sshin * 2. Redistributions in binary form must reproduce the above copyright 1254263Sshin * notice, this list of conditions and the following disclaimer in the 1354263Sshin * documentation and/or other materials provided with the distribution. 1454263Sshin * 3. All advertising materials mentioning features or use of this software 1554263Sshin * must display the following acknowledgement: 1654263Sshin * This product includes software developed by the University of 1754263Sshin * California, Berkeley and its contributors. 1854263Sshin * 4. Neither the name of the University nor the names of its contributors 1954263Sshin * may be used to endorse or promote products derived from this software 2054263Sshin * without specific prior written permission. 2154263Sshin * 2254263Sshin * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2354263Sshin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2454263Sshin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2554263Sshin * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2654263Sshin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2754263Sshin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2854263Sshin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2954263Sshin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3054263Sshin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3154263Sshin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3254263Sshin * SUCH DAMAGE. 3354263Sshin * 3454263Sshin * $FreeBSD: head/usr.bin/netstat/inet6.c 55533 2000-01-07 05:17:09Z shin $ 3554263Sshin */ 3654263Sshin 3754263Sshin#ifndef lint 3854263Sshin/* 3954263Sshinstatic char sccsid[] = "@(#)inet6.c 8.4 (Berkeley) 4/20/94"; 4054263Sshin*/ 4154263Sshin#endif /* not lint */ 4254263Sshin 4354263Sshin#include <sys/param.h> 4454263Sshin#include <sys/socket.h> 4554263Sshin#include <sys/socketvar.h> 4654263Sshin#include <sys/ioctl.h> 4754263Sshin#include <sys/mbuf.h> 4854263Sshin#include <sys/protosw.h> 4954263Sshin 5054263Sshin#include <net/route.h> 5154263Sshin#include <net/if.h> 5254263Sshin#include <net/if_var.h> 5354263Sshin#include <netinet/in.h> 5454263Sshin#include <netinet/ip6.h> 5554263Sshin#include <netinet/icmp6.h> 5654263Sshin#include <netinet/in_systm.h> 5754263Sshin#include <netinet6/in6_pcb.h> 5854263Sshin#include <netinet6/in6_var.h> 5954263Sshin#include <netinet6/ip6_var.h> 6054263Sshin#include <netinet6/pim6_var.h> 6154263Sshin 6254263Sshin#include <arpa/inet.h> 6354263Sshin#include <netdb.h> 6454263Sshin 6554263Sshin#include <stdio.h> 6654263Sshin#include <string.h> 6754263Sshin#include <unistd.h> 6854263Sshin#include "netstat.h" 6954263Sshin 7054263Sshinstruct socket sockb; 7154263Sshin 7254263Sshinchar *inet6name __P((struct in6_addr *)); 7354263Sshinvoid inet6print __P((struct in6_addr *, int, char *, int)); 7454263Sshin 7554263Sshinstatic char ntop_buf[INET6_ADDRSTRLEN]; 7654263Sshin 7754263Sshinstatic char *ip6nh[] = { 7854263Sshin "hop by hop", 7954263Sshin "ICMP", 8054263Sshin "IGMP", 8154263Sshin "#3", 8254263Sshin "IP", 8354263Sshin "#5", 8454263Sshin "TCP", 8554263Sshin "#7", 8654263Sshin "#8", 8754263Sshin "#9", 8854263Sshin "#10", 8954263Sshin "#11", 9054263Sshin "#12", 9154263Sshin "#13", 9254263Sshin "#14", 9354263Sshin "#15", 9454263Sshin "#16", 9554263Sshin "UDP", 9654263Sshin "#18", 9754263Sshin "#19", 9854263Sshin "#20", 9954263Sshin "#21", 10054263Sshin "IDP", 10154263Sshin "#23", 10254263Sshin "#24", 10354263Sshin "#25", 10454263Sshin "#26", 10554263Sshin "#27", 10654263Sshin "#28", 10754263Sshin "TP", 10854263Sshin "#30", 10954263Sshin "#31", 11054263Sshin "#32", 11154263Sshin "#33", 11254263Sshin "#34", 11354263Sshin "#35", 11454263Sshin "#36", 11554263Sshin "#37", 11654263Sshin "#38", 11754263Sshin "#39", 11854263Sshin "#40", 11954263Sshin "IP6", 12054263Sshin "#42", 12154263Sshin "routing", 12254263Sshin "fragment", 12354263Sshin "#45", 12454263Sshin "#46", 12554263Sshin "#47", 12654263Sshin "#48", 12754263Sshin "#49", 12854263Sshin "ESP", 12954263Sshin "AH", 13054263Sshin "#52", 13154263Sshin "#53", 13254263Sshin "#54", 13354263Sshin "#55", 13454263Sshin "#56", 13554263Sshin "#57", 13654263Sshin "ICMP6", 13754263Sshin "no next header", 13854263Sshin "destination option", 13954263Sshin "#61", 14054263Sshin "#62", 14154263Sshin "#63", 14254263Sshin "#64", 14354263Sshin "#65", 14454263Sshin "#66", 14554263Sshin "#67", 14654263Sshin "#68", 14754263Sshin "#69", 14854263Sshin "#70", 14954263Sshin "#71", 15054263Sshin "#72", 15154263Sshin "#73", 15254263Sshin "#74", 15354263Sshin "#75", 15454263Sshin "#76", 15554263Sshin "#77", 15654263Sshin "#78", 15754263Sshin "#79", 15854263Sshin "ISOIP", 15954263Sshin "#81", 16054263Sshin "#82", 16154263Sshin "#83", 16254263Sshin "#84", 16354263Sshin "#85", 16454263Sshin "#86", 16554263Sshin "#87", 16654263Sshin "#88", 16754263Sshin "#89", 16854263Sshin "#80", 16954263Sshin "#91", 17054263Sshin "#92", 17154263Sshin "#93", 17254263Sshin "#94", 17354263Sshin "#95", 17454263Sshin "#96", 17554263Sshin "Ethernet", 17654263Sshin "#98", 17754263Sshin "#99", 17854263Sshin "#100", 17954263Sshin "#101", 18054263Sshin "#102", 18154263Sshin "PIM", 18254263Sshin "#104", 18354263Sshin "#105", 18454263Sshin "#106", 18554263Sshin "#107", 18654263Sshin "#108", 18754263Sshin "#109", 18854263Sshin "#110", 18954263Sshin "#111", 19054263Sshin "#112", 19154263Sshin "#113", 19254263Sshin "#114", 19354263Sshin "#115", 19454263Sshin "#116", 19554263Sshin "#117", 19654263Sshin "#118", 19754263Sshin "#119", 19854263Sshin "#120", 19954263Sshin "#121", 20054263Sshin "#122", 20154263Sshin "#123", 20254263Sshin "#124", 20354263Sshin "#125", 20454263Sshin "#126", 20554263Sshin "#127", 20654263Sshin "#128", 20754263Sshin "#129", 20854263Sshin "#130", 20954263Sshin "#131", 21054263Sshin "#132", 21154263Sshin "#133", 21254263Sshin "#134", 21354263Sshin "#135", 21454263Sshin "#136", 21554263Sshin "#137", 21654263Sshin "#138", 21754263Sshin "#139", 21854263Sshin "#140", 21954263Sshin "#141", 22054263Sshin "#142", 22154263Sshin "#143", 22254263Sshin "#144", 22354263Sshin "#145", 22454263Sshin "#146", 22554263Sshin "#147", 22654263Sshin "#148", 22754263Sshin "#149", 22854263Sshin "#150", 22954263Sshin "#151", 23054263Sshin "#152", 23154263Sshin "#153", 23254263Sshin "#154", 23354263Sshin "#155", 23454263Sshin "#156", 23554263Sshin "#157", 23654263Sshin "#158", 23754263Sshin "#159", 23854263Sshin "#160", 23954263Sshin "#161", 24054263Sshin "#162", 24154263Sshin "#163", 24254263Sshin "#164", 24354263Sshin "#165", 24454263Sshin "#166", 24554263Sshin "#167", 24654263Sshin "#168", 24754263Sshin "#169", 24854263Sshin "#170", 24954263Sshin "#171", 25054263Sshin "#172", 25154263Sshin "#173", 25254263Sshin "#174", 25354263Sshin "#175", 25454263Sshin "#176", 25554263Sshin "#177", 25654263Sshin "#178", 25754263Sshin "#179", 25854263Sshin "#180", 25954263Sshin "#181", 26054263Sshin "#182", 26154263Sshin "#183", 26254263Sshin "#184", 26354263Sshin "#185", 26454263Sshin "#186", 26554263Sshin "#187", 26654263Sshin "#188", 26754263Sshin "#189", 26854263Sshin "#180", 26954263Sshin "#191", 27054263Sshin "#192", 27154263Sshin "#193", 27254263Sshin "#194", 27354263Sshin "#195", 27454263Sshin "#196", 27554263Sshin "#197", 27654263Sshin "#198", 27754263Sshin "#199", 27854263Sshin "#200", 27954263Sshin "#201", 28054263Sshin "#202", 28154263Sshin "#203", 28254263Sshin "#204", 28354263Sshin "#205", 28454263Sshin "#206", 28554263Sshin "#207", 28654263Sshin "#208", 28754263Sshin "#209", 28854263Sshin "#210", 28954263Sshin "#211", 29054263Sshin "#212", 29154263Sshin "#213", 29254263Sshin "#214", 29354263Sshin "#215", 29454263Sshin "#216", 29554263Sshin "#217", 29654263Sshin "#218", 29754263Sshin "#219", 29854263Sshin "#220", 29954263Sshin "#221", 30054263Sshin "#222", 30154263Sshin "#223", 30254263Sshin "#224", 30354263Sshin "#225", 30454263Sshin "#226", 30554263Sshin "#227", 30654263Sshin "#228", 30754263Sshin "#229", 30854263Sshin "#230", 30954263Sshin "#231", 31054263Sshin "#232", 31154263Sshin "#233", 31254263Sshin "#234", 31354263Sshin "#235", 31454263Sshin "#236", 31554263Sshin "#237", 31654263Sshin "#238", 31754263Sshin "#239", 31854263Sshin "#240", 31954263Sshin "#241", 32054263Sshin "#242", 32154263Sshin "#243", 32254263Sshin "#244", 32354263Sshin "#245", 32454263Sshin "#246", 32554263Sshin "#247", 32654263Sshin "#248", 32754263Sshin "#249", 32854263Sshin "#250", 32954263Sshin "#251", 33054263Sshin "#252", 33154263Sshin "#253", 33254263Sshin "#254", 33354263Sshin "#255", 33454263Sshin}; 33554263Sshin 33654263Sshin/* 33754263Sshin * Dump IP6 statistics structure. 33854263Sshin */ 33954263Sshinvoid 34054263Sshinip6_stats(off, name) 34154263Sshin u_long off; 34254263Sshin char *name; 34354263Sshin{ 34454263Sshin struct ip6stat ip6stat; 34554263Sshin int first, i; 34654263Sshin 34754263Sshin if (off == 0) 34854263Sshin return; 34954263Sshin 35054263Sshin kread(off, (char *)&ip6stat, sizeof (ip6stat)); 35154263Sshin printf("%s:\n", name); 35254263Sshin 35354263Sshin#define p(f, m) if (ip6stat.f || sflag <= 1) \ 35454263Sshin printf(m, ip6stat.f, plural(ip6stat.f)) 35554263Sshin#define p1a(f, m) if (ip6stat.f || sflag <= 1) \ 35654263Sshin printf(m, ip6stat.f) 35754263Sshin 35854263Sshin p(ip6s_total, "\t%lu total packet%s received\n"); 35954263Sshin p1a(ip6s_toosmall, "\t%lu with size smaller than minimum\n"); 36054263Sshin p1a(ip6s_tooshort, "\t%lu with data size < data length\n"); 36154263Sshin p1a(ip6s_badoptions, "\t%lu with bad options\n"); 36254263Sshin p1a(ip6s_badvers, "\t%lu with incorrect version number\n"); 36354263Sshin p(ip6s_fragments, "\t%lu fragment%s received\n"); 36454263Sshin p(ip6s_fragdropped, "\t%lu fragment%s dropped (dup or out of space)\n"); 36554263Sshin p(ip6s_fragtimeout, "\t%lu fragment%s dropped after timeout\n"); 36654263Sshin p(ip6s_fragoverflow, "\t%lu fragment%s that exceeded limit\n"); 36754263Sshin p(ip6s_reassembled, "\t%lu packet%s reassembled ok\n"); 36854263Sshin p(ip6s_delivered, "\t%lu packet%s for this host\n"); 36954263Sshin p(ip6s_forward, "\t%lu packet%s forwarded\n"); 37054263Sshin p(ip6s_cantforward, "\t%lu packet%s not forwardable\n"); 37154263Sshin p(ip6s_redirectsent, "\t%lu redirect%s sent\n"); 37254263Sshin p(ip6s_localout, "\t%lu packet%s sent from this host\n"); 37354263Sshin p(ip6s_rawout, "\t%lu packet%s sent with fabricated ip header\n"); 37454263Sshin p(ip6s_odropped, "\t%lu output packet%s dropped due to no bufs, etc.\n"); 37554263Sshin p(ip6s_noroute, "\t%lu output packet%s discarded due to no route\n"); 37654263Sshin p(ip6s_fragmented, "\t%lu output datagram%s fragmented\n"); 37754263Sshin p(ip6s_ofragments, "\t%lu fragment%s created\n"); 37854263Sshin p(ip6s_cantfrag, "\t%lu datagram%s that can't be fragmented\n"); 37954263Sshin p(ip6s_badscope, "\t%lu packet%s that violated scope rules\n"); 38054263Sshin p(ip6s_notmember, "\t%lu multicast packet%s which we don't join\n"); 38154263Sshin for (first = 1, i = 0; i < 256; i++) 38254263Sshin if (ip6stat.ip6s_nxthist[i] != 0) { 38354263Sshin if (first) { 38454263Sshin printf("\tInput histogram:\n"); 38554263Sshin first = 0; 38654263Sshin } 38754263Sshin printf("\t\t%s: %lu\n", ip6nh[i], 38854263Sshin ip6stat.ip6s_nxthist[i]); 38954263Sshin } 39054263Sshin printf("\tMbuf statistics:\n"); 39154263Sshin printf("\t\t%lu one mbuf\n", ip6stat.ip6s_m1); 39254263Sshin for (first = 1, i = 0; i < 32; i++) { 39355163Sshin char ifbuf[IFNAMSIZ]; 39454263Sshin if (ip6stat.ip6s_m2m[i] != 0) { 39554263Sshin if (first) { 39654263Sshin printf("\t\ttwo or more mbuf:\n"); 39754263Sshin first = 0; 39854263Sshin } 39955163Sshin printf("\t\t\t%s= %ld\n", 40054263Sshin if_indextoname(i, ifbuf), 40154263Sshin ip6stat.ip6s_m2m[i]); 40254263Sshin } 40354263Sshin } 40454263Sshin printf("\t\t%lu one ext mbuf\n", ip6stat.ip6s_mext1); 40554263Sshin printf("\t\t%lu two or more ext mbuf\n", ip6stat.ip6s_mext2m); 40654263Sshin p(ip6s_exthdrtoolong, "\t%lu packet%s whose headers are not continuous\n"); 40754263Sshin p(ip6s_nogif, "\t%lu tunneling packet%s that can't find gif\n"); 40854263Sshin p(ip6s_toomanyhdr, "\t%lu packet%s discarded due to too may headers\n"); 40954263Sshin#undef p 41054263Sshin} 41154263Sshin 41254263Sshin/* 41354263Sshin * Dump IPv6 per-interface statistics based on RFC 2465. 41454263Sshin */ 41554263Sshinvoid 41654263Sshinip6_ifstats(ifname) 41754263Sshin char *ifname; 41854263Sshin{ 41954263Sshin struct in6_ifreq ifr; 42054263Sshin int s; 42154263Sshin#define p(f, m) if (ifr.ifr_ifru.ifru_stat.f || sflag <= 1) \ 42254263Sshin printf(m, ifr.ifr_ifru.ifru_stat.f, plural(ifr.ifr_ifru.ifru_stat.f)) 42354263Sshin#define p_5(f, m) if (ifr.ifr_ifru.ifru_stat.f || sflag <= 1) \ 42454263Sshin printf(m, ip6stat.f) 42554263Sshin 42654263Sshin if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) { 42754263Sshin perror("Warning: socket(AF_INET6)"); 42854263Sshin return; 42954263Sshin } 43054263Sshin 43154263Sshin strcpy(ifr.ifr_name, ifname); 43254263Sshin printf("ip6 on %s:\n", ifr.ifr_name); 43354263Sshin 43454263Sshin if (ioctl(s, SIOCGIFSTAT_IN6, (char *)&ifr) < 0) { 43554263Sshin perror("Warning: ioctl(SIOCGIFSTAT_IN6)"); 43654263Sshin goto end; 43754263Sshin } 43854263Sshin 43954263Sshin p(ifs6_in_receive, "\t%qu total input datagram%s\n"); 44054263Sshin p(ifs6_in_hdrerr, "\t%qu datagram%s with invalid header received\n"); 44154263Sshin p(ifs6_in_toobig, "\t%qu datagram%s exceeded MTU received\n"); 44254263Sshin p(ifs6_in_noroute, "\t%qu datagram%s with no route received\n"); 44354263Sshin p(ifs6_in_addrerr, "\t%qu datagram%s with invalid dst received\n"); 44454263Sshin p(ifs6_in_protounknown, "\t%qu datagram%s with unknown proto received\n"); 44554263Sshin p(ifs6_in_truncated, "\t%qu truncated datagram%s received\n"); 44654263Sshin p(ifs6_in_discard, "\t%qu input datagram%s discarded\n"); 44754263Sshin p(ifs6_in_deliver, 44854263Sshin "\t%qu datagram%s delivered to an upper layer protocol\n"); 44954263Sshin p(ifs6_out_forward, "\t%qu datagram%s forwarded to this interface\n"); 45054263Sshin p(ifs6_out_request, 45154263Sshin "\t%qu datagram%s sent from an upper layer protocol\n"); 45254263Sshin p(ifs6_out_discard, "\t%qu total discarded output datagram%s\n"); 45354263Sshin p(ifs6_out_fragok, "\t%qu output datagram%s fragmented\n"); 45454263Sshin p(ifs6_out_fragfail, "\t%qu output datagram%s failed on fragment\n"); 45554263Sshin p(ifs6_out_fragcreat, "\t%qu output datagram%s succeeded on fragment\n"); 45654263Sshin p(ifs6_reass_reqd, "\t%qu incoming datagram%s fragmented\n"); 45754263Sshin p(ifs6_reass_ok, "\t%qu datagram%s reassembled\n"); 45854263Sshin p(ifs6_reass_fail, "\t%qu datagram%s failed on reassembling\n"); 45954263Sshin p(ifs6_in_mcast, "\t%qu multicast datagram%s received\n"); 46054263Sshin p(ifs6_out_mcast, "\t%qu multicast datagram%s sent\n"); 46154263Sshin 46254263Sshin end: 46354263Sshin close(s); 46454263Sshin 46554263Sshin#undef p 46654263Sshin#undef p_5 46754263Sshin} 46854263Sshin 46954263Sshinstatic char *icmp6names[] = { 47054263Sshin "#0", 47154263Sshin "unreach", 47254263Sshin "packet too big", 47354263Sshin "time exceed", 47454263Sshin "parameter problem", 47554263Sshin "#5", 47654263Sshin "#6", 47754263Sshin "#7", 47854263Sshin "#8", 47954263Sshin "#9", 48054263Sshin "#10", 48154263Sshin "#11", 48254263Sshin "#12", 48354263Sshin "#13", 48454263Sshin "#14", 48554263Sshin "#15", 48654263Sshin "#16", 48754263Sshin "#17", 48854263Sshin "#18", 48954263Sshin "#19", 49054263Sshin "#20", 49154263Sshin "#21", 49254263Sshin "#22", 49354263Sshin "#23", 49454263Sshin "#24", 49554263Sshin "#25", 49654263Sshin "#26", 49754263Sshin "#27", 49854263Sshin "#28", 49954263Sshin "#29", 50054263Sshin "#30", 50154263Sshin "#31", 50254263Sshin "#32", 50354263Sshin "#33", 50454263Sshin "#34", 50554263Sshin "#35", 50654263Sshin "#36", 50754263Sshin "#37", 50854263Sshin "#38", 50954263Sshin "#39", 51054263Sshin "#40", 51154263Sshin "#41", 51254263Sshin "#42", 51354263Sshin "#43", 51454263Sshin "#44", 51554263Sshin "#45", 51654263Sshin "#46", 51754263Sshin "#47", 51854263Sshin "#48", 51954263Sshin "#49", 52054263Sshin "#50", 52154263Sshin "#51", 52254263Sshin "#52", 52354263Sshin "#53", 52454263Sshin "#54", 52554263Sshin "#55", 52654263Sshin "#56", 52754263Sshin "#57", 52854263Sshin "#58", 52954263Sshin "#59", 53054263Sshin "#60", 53154263Sshin "#61", 53254263Sshin "#62", 53354263Sshin "#63", 53454263Sshin "#64", 53554263Sshin "#65", 53654263Sshin "#66", 53754263Sshin "#67", 53854263Sshin "#68", 53954263Sshin "#69", 54054263Sshin "#70", 54154263Sshin "#71", 54254263Sshin "#72", 54354263Sshin "#73", 54454263Sshin "#74", 54554263Sshin "#75", 54654263Sshin "#76", 54754263Sshin "#77", 54854263Sshin "#78", 54954263Sshin "#79", 55054263Sshin "#80", 55154263Sshin "#81", 55254263Sshin "#82", 55354263Sshin "#83", 55454263Sshin "#84", 55554263Sshin "#85", 55654263Sshin "#86", 55754263Sshin "#87", 55854263Sshin "#88", 55954263Sshin "#89", 56054263Sshin "#80", 56154263Sshin "#91", 56254263Sshin "#92", 56354263Sshin "#93", 56454263Sshin "#94", 56554263Sshin "#95", 56654263Sshin "#96", 56754263Sshin "#97", 56854263Sshin "#98", 56954263Sshin "#99", 57054263Sshin "#100", 57154263Sshin "#101", 57254263Sshin "#102", 57354263Sshin "#103", 57454263Sshin "#104", 57554263Sshin "#105", 57654263Sshin "#106", 57754263Sshin "#107", 57854263Sshin "#108", 57954263Sshin "#109", 58054263Sshin "#110", 58154263Sshin "#111", 58254263Sshin "#112", 58354263Sshin "#113", 58454263Sshin "#114", 58554263Sshin "#115", 58654263Sshin "#116", 58754263Sshin "#117", 58854263Sshin "#118", 58954263Sshin "#119", 59054263Sshin "#120", 59154263Sshin "#121", 59254263Sshin "#122", 59354263Sshin "#123", 59454263Sshin "#124", 59554263Sshin "#125", 59654263Sshin "#126", 59754263Sshin "#127", 59854263Sshin "echo", 59954263Sshin "echo reply", 60054263Sshin "multicast listener query", 60154263Sshin "multicast listener report", 60254263Sshin "multicast listener done", 60354263Sshin "router solicitation", 60454263Sshin "router advertisment", 60554263Sshin "neighbor solicitation", 60654263Sshin "neighbor advertisment", 60754263Sshin "redirect", 60854263Sshin "router renumbering", 60954263Sshin "node information request", 61054263Sshin "node information reply", 61154263Sshin "#141", 61254263Sshin "#142", 61354263Sshin "#143", 61454263Sshin "#144", 61554263Sshin "#145", 61654263Sshin "#146", 61754263Sshin "#147", 61854263Sshin "#148", 61954263Sshin "#149", 62054263Sshin "#150", 62154263Sshin "#151", 62254263Sshin "#152", 62354263Sshin "#153", 62454263Sshin "#154", 62554263Sshin "#155", 62654263Sshin "#156", 62754263Sshin "#157", 62854263Sshin "#158", 62954263Sshin "#159", 63054263Sshin "#160", 63154263Sshin "#161", 63254263Sshin "#162", 63354263Sshin "#163", 63454263Sshin "#164", 63554263Sshin "#165", 63654263Sshin "#166", 63754263Sshin "#167", 63854263Sshin "#168", 63954263Sshin "#169", 64054263Sshin "#170", 64154263Sshin "#171", 64254263Sshin "#172", 64354263Sshin "#173", 64454263Sshin "#174", 64554263Sshin "#175", 64654263Sshin "#176", 64754263Sshin "#177", 64854263Sshin "#178", 64954263Sshin "#179", 65054263Sshin "#180", 65154263Sshin "#181", 65254263Sshin "#182", 65354263Sshin "#183", 65454263Sshin "#184", 65554263Sshin "#185", 65654263Sshin "#186", 65754263Sshin "#187", 65854263Sshin "#188", 65954263Sshin "#189", 66054263Sshin "#180", 66154263Sshin "#191", 66254263Sshin "#192", 66354263Sshin "#193", 66454263Sshin "#194", 66554263Sshin "#195", 66654263Sshin "#196", 66754263Sshin "#197", 66854263Sshin "#198", 66954263Sshin "#199", 67054263Sshin "#200", 67154263Sshin "#201", 67254263Sshin "#202", 67354263Sshin "#203", 67454263Sshin "#204", 67554263Sshin "#205", 67654263Sshin "#206", 67754263Sshin "#207", 67854263Sshin "#208", 67954263Sshin "#209", 68054263Sshin "#210", 68154263Sshin "#211", 68254263Sshin "#212", 68354263Sshin "#213", 68454263Sshin "#214", 68554263Sshin "#215", 68654263Sshin "#216", 68754263Sshin "#217", 68854263Sshin "#218", 68954263Sshin "#219", 69054263Sshin "#220", 69154263Sshin "#221", 69254263Sshin "#222", 69354263Sshin "#223", 69454263Sshin "#224", 69554263Sshin "#225", 69654263Sshin "#226", 69754263Sshin "#227", 69854263Sshin "#228", 69954263Sshin "#229", 70054263Sshin "#230", 70154263Sshin "#231", 70254263Sshin "#232", 70354263Sshin "#233", 70454263Sshin "#234", 70554263Sshin "#235", 70654263Sshin "#236", 70754263Sshin "#237", 70854263Sshin "#238", 70954263Sshin "#239", 71054263Sshin "#240", 71154263Sshin "#241", 71254263Sshin "#242", 71354263Sshin "#243", 71454263Sshin "#244", 71554263Sshin "#245", 71654263Sshin "#246", 71754263Sshin "#247", 71854263Sshin "#248", 71954263Sshin "#249", 72054263Sshin "#250", 72154263Sshin "#251", 72254263Sshin "#252", 72354263Sshin "#253", 72454263Sshin "#254", 72554263Sshin "#255", 72654263Sshin}; 72754263Sshin 72854263Sshin/* 72954263Sshin * Dump ICMP6 statistics. 73054263Sshin */ 73154263Sshinvoid 73254263Sshinicmp6_stats(off, name) 73354263Sshin u_long off; 73454263Sshin char *name; 73554263Sshin{ 73654263Sshin struct icmp6stat icmp6stat; 73754263Sshin register int i, first; 73854263Sshin 73954263Sshin if (off == 0) 74054263Sshin return; 74154263Sshin kread(off, (char *)&icmp6stat, sizeof (icmp6stat)); 74254263Sshin printf("%s:\n", name); 74354263Sshin 74454263Sshin#define p(f, m) if (icmp6stat.f || sflag <= 1) \ 74554263Sshin printf(m, icmp6stat.f, plural(icmp6stat.f)) 74654263Sshin 74754263Sshin p(icp6s_error, "\t%lu call%s to icmp_error\n"); 74854263Sshin p(icp6s_canterror, 74954263Sshin "\t%lu error%s not generated because old message was icmp error or so\n"); 75054263Sshin p(icp6s_toofreq, 75154263Sshin "\t%lu error%s not generated because rate limitation\n"); 75254263Sshin for (first = 1, i = 0; i < 256; i++) 75354263Sshin if (icmp6stat.icp6s_outhist[i] != 0) { 75454263Sshin if (first) { 75554263Sshin printf("\tOutput histogram:\n"); 75654263Sshin first = 0; 75754263Sshin } 75854263Sshin printf("\t\t%s: %lu\n", icmp6names[i], 75954263Sshin icmp6stat.icp6s_outhist[i]); 76054263Sshin } 76154263Sshin p(icp6s_badcode, "\t%lu message%s with bad code fields\n"); 76254263Sshin p(icp6s_tooshort, "\t%lu message%s < minimum length\n"); 76354263Sshin p(icp6s_checksum, "\t%lu bad checksum%s\n"); 76454263Sshin p(icp6s_badlen, "\t%lu message%s with bad length\n"); 76554263Sshin for (first = 1, i = 0; i < ICMP6_MAXTYPE; i++) 76654263Sshin if (icmp6stat.icp6s_inhist[i] != 0) { 76754263Sshin if (first) { 76854263Sshin printf("\tInput histogram:\n"); 76954263Sshin first = 0; 77054263Sshin } 77154263Sshin printf("\t\t%s: %lu\n", icmp6names[i], 77254263Sshin icmp6stat.icp6s_inhist[i]); 77354263Sshin } 77454263Sshin p(icp6s_reflect, "\t%lu message response%s generated\n"); 77554263Sshin#undef p 77654263Sshin#undef p_5 77754263Sshin} 77854263Sshin 77954263Sshin/* 78054263Sshin * Dump ICMPv6 per-interface statistics based on RFC 2466. 78154263Sshin */ 78254263Sshinvoid 78354263Sshinicmp6_ifstats(ifname) 78454263Sshin char *ifname; 78554263Sshin{ 78654263Sshin struct in6_ifreq ifr; 78754263Sshin int s; 78854263Sshin#define p(f, m) if (ifr.ifr_ifru.ifru_icmp6stat.f || sflag <= 1) \ 78954263Sshin printf(m, (u_quad_t)ifr.ifr_ifru.ifru_icmp6stat.f, plural(ifr.ifr_ifru.ifru_icmp6stat.f)) 79054263Sshin 79154263Sshin if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) { 79254263Sshin perror("Warning: socket(AF_INET6)"); 79354263Sshin return; 79454263Sshin } 79554263Sshin 79654263Sshin strcpy(ifr.ifr_name, ifname); 79754263Sshin printf("icmp6 on %s:\n", ifr.ifr_name); 79854263Sshin 79954263Sshin if (ioctl(s, SIOCGIFSTAT_ICMP6, (char *)&ifr) < 0) { 80054263Sshin perror("Warning: ioctl(SIOCGIFSTAT_ICMP6)"); 80154263Sshin goto end; 80254263Sshin } 80354263Sshin 80454263Sshin p(ifs6_in_msg, "\t%qu total input message%s\n"); 80554263Sshin p(ifs6_in_error, "\t%qu total input error message%s\n"); 80654263Sshin p(ifs6_in_dstunreach, "\t%qu input destination unreachable error%s\n"); 80754263Sshin p(ifs6_in_adminprohib, "\t%qu input administratively prohibited error%s\n"); 80854263Sshin p(ifs6_in_timeexceed, "\t%qu input time exceeded error%s\n"); 80954263Sshin p(ifs6_in_paramprob, "\t%qu input parameter problem error%s\n"); 81054263Sshin p(ifs6_in_pkttoobig, "\t%qu input packet too big error%s\n"); 81154263Sshin p(ifs6_in_echo, "\t%qu input echo request%s\n"); 81254263Sshin p(ifs6_in_echoreply, "\t%qu input echo reply%s\n"); 81354263Sshin p(ifs6_in_routersolicit, "\t%qu input router solicitation%s\n"); 81454263Sshin p(ifs6_in_routeradvert, "\t%qu input router advertisement%s\n"); 81554263Sshin p(ifs6_in_neighborsolicit, "\t%qu input neighbor solicitation%s\n"); 81654263Sshin p(ifs6_in_neighboradvert, "\t%qu input neighbor advertisement%s\n"); 81754263Sshin p(ifs6_in_redirect, "\t%qu input redirect%s\n"); 81854263Sshin p(ifs6_in_mldquery, "\t%qu input MLD query%s\n"); 81954263Sshin p(ifs6_in_mldreport, "\t%qu input MLD report%s\n"); 82054263Sshin p(ifs6_in_mlddone, "\t%qu input MLD done%s\n"); 82154263Sshin 82254263Sshin p(ifs6_out_msg, "\t%qu total output message%s\n"); 82354263Sshin p(ifs6_out_error, "\t%qu total output error message%s\n"); 82454263Sshin p(ifs6_out_dstunreach, "\t%qu output destination unreachable error%s\n"); 82554263Sshin p(ifs6_out_adminprohib, "\t%qu output administratively prohibited error%s\n"); 82654263Sshin p(ifs6_out_timeexceed, "\t%qu output time exceeded error%s\n"); 82754263Sshin p(ifs6_out_paramprob, "\t%qu output parameter problem error%s\n"); 82854263Sshin p(ifs6_out_pkttoobig, "\t%qu output packet too big error%s\n"); 82954263Sshin p(ifs6_out_echo, "\t%qu output echo request%s\n"); 83054263Sshin p(ifs6_out_echoreply, "\t%qu output echo reply%s\n"); 83154263Sshin p(ifs6_out_routersolicit, "\t%qu output router solicitation%s\n"); 83254263Sshin p(ifs6_out_routeradvert, "\t%qu output router advertisement%s\n"); 83354263Sshin p(ifs6_out_neighborsolicit, "\t%qu output neighbor solicitation%s\n"); 83454263Sshin p(ifs6_out_neighboradvert, "\t%qu output neighbor advertisement%s\n"); 83554263Sshin p(ifs6_out_redirect, "\t%qu output redirect%s\n"); 83654263Sshin p(ifs6_out_mldquery, "\t%qu output MLD query%s\n"); 83754263Sshin p(ifs6_out_mldreport, "\t%qu output MLD report%s\n"); 83854263Sshin p(ifs6_out_mlddone, "\t%qu output MLD done%s\n"); 83954263Sshin 84054263Sshin end: 84154263Sshin close(s); 84254263Sshin#undef p 84354263Sshin} 84454263Sshin 84554263Sshin/* 84654263Sshin * Dump PIM statistics structure. 84754263Sshin */ 84854263Sshinvoid 84954263Sshinpim6_stats(off, name) 85054263Sshin u_long off; 85154263Sshin char *name; 85254263Sshin{ 85354263Sshin struct pim6stat pim6stat; 85454263Sshin 85554263Sshin if (off == 0) 85654263Sshin return; 85754263Sshin kread(off, (char *)&pim6stat, sizeof(pim6stat)); 85854263Sshin printf("%s:\n", name); 85954263Sshin 86054263Sshin#define p(f, m) if (pim6stat.f || sflag <= 1) \ 86154263Sshin printf(m, pim6stat.f, plural(pim6stat.f)) 86254263Sshin p(pim6s_rcv_total, "\t%u message%s received\n"); 86354263Sshin p(pim6s_rcv_tooshort, "\t%u message%s received with too few bytes\n"); 86454263Sshin p(pim6s_rcv_badsum, "\t%u message%s received with bad checksum\n"); 86554263Sshin p(pim6s_rcv_badversion, "\t%u message%s received with bad version\n"); 86654263Sshin p(pim6s_rcv_registers, "\t%u register%s received\n"); 86754263Sshin p(pim6s_rcv_badregisters, "\t%u bad register%s received\n"); 86854263Sshin p(pim6s_snd_registers, "\t%u register%s sent\n"); 86954263Sshin#undef p 87054263Sshin} 87154263Sshin 87254263Sshin/* 87354263Sshin * Pretty print an Internet address (net address + port). 87454263Sshin * If the nflag was specified, use numbers instead of names. 87554263Sshin */ 87654263Sshin#define GETSERVBYPORT6(port, proto, ret)\ 87754263Sshin{\ 87854263Sshin if (strcmp((proto), "tcp6") == 0)\ 87954263Sshin (ret) = getservbyport((int)(port), "tcp");\ 88054263Sshin else if (strcmp((proto), "udp6") == 0)\ 88154263Sshin (ret) = getservbyport((int)(port), "udp");\ 88254263Sshin else\ 88354263Sshin (ret) = getservbyport((int)(port), (proto));\ 88454263Sshin}; 88554263Sshin 88654263Sshinvoid 88754263Sshininet6print(in6, port, proto, numeric) 88854263Sshin register struct in6_addr *in6; 88954263Sshin int port; 89054263Sshin char *proto; 89154263Sshin int numeric; 89254263Sshin{ 89354263Sshin struct servent *sp = 0; 89454263Sshin char line[80], *cp; 89554263Sshin int width; 89654263Sshin 89754263Sshin sprintf(line, "%.*s.", lflag ? 39 : 89854263Sshin (Aflag && !numeric) ? 12 : 16, inet6name(in6)); 89954263Sshin cp = index(line, '\0'); 90054263Sshin if (!numeric && port) 90154263Sshin GETSERVBYPORT6(port, proto, sp); 90254263Sshin if (sp || port == 0) 90354263Sshin sprintf(cp, "%.8s", sp ? sp->s_name : "*"); 90454263Sshin else 90554263Sshin sprintf(cp, "%d", ntohs((u_short)port)); 90654263Sshin width = lflag ? 45 : Aflag ? 18 : 22; 90755533Sshin printf("%-*.*s ", width, width, line); 90854263Sshin} 90954263Sshin 91054263Sshin/* 91154263Sshin * Construct an Internet address representation. 91254263Sshin * If the nflag has been supplied, give 91354263Sshin * numeric value, otherwise try for symbolic name. 91454263Sshin */ 91554263Sshin 91654263Sshinchar * 91754263Sshininet6name(in6p) 91854263Sshin struct in6_addr *in6p; 91954263Sshin{ 92054263Sshin register char *cp; 92154263Sshin static char line[50]; 92254263Sshin struct hostent *hp; 92354263Sshin static char domain[MAXHOSTNAMELEN + 1]; 92454263Sshin static int first = 1; 92554263Sshin 92654263Sshin if (first && !nflag) { 92754263Sshin first = 0; 92854263Sshin if (gethostname(domain, MAXHOSTNAMELEN) == 0 && 92954263Sshin (cp = index(domain, '.'))) 93054263Sshin (void) strcpy(domain, cp + 1); 93154263Sshin else 93254263Sshin domain[0] = 0; 93354263Sshin } 93454263Sshin cp = 0; 93554263Sshin if (!nflag && !IN6_IS_ADDR_UNSPECIFIED(in6p)) { 93654263Sshin hp = gethostbyaddr((char *)in6p, sizeof(*in6p), AF_INET6); 93754263Sshin if (hp) { 93854263Sshin if ((cp = index(hp->h_name, '.')) && 93954263Sshin !strcmp(cp + 1, domain)) 94054263Sshin *cp = 0; 94154263Sshin cp = hp->h_name; 94254263Sshin } 94354263Sshin } 94454263Sshin if (IN6_IS_ADDR_UNSPECIFIED(in6p)) 94554263Sshin strcpy(line, "*"); 94654263Sshin else if (cp) 94754263Sshin strcpy(line, cp); 94854263Sshin else 94954263Sshin sprintf(line, "%s", 95054263Sshin inet_ntop(AF_INET6, (void *)in6p, ntop_buf, 95154263Sshin sizeof(ntop_buf))); 95254263Sshin return (line); 95354263Sshin} 954