inet6.c revision 160787
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 35132671Scharnier#if 0 3654263Sshin#ifndef lint 3754263Sshinstatic char sccsid[] = "@(#)inet6.c 8.4 (Berkeley) 4/20/94"; 3854263Sshin#endif /* not lint */ 39132671Scharnier#endif 4054263Sshin 41132671Scharnier#include <sys/cdefs.h> 42132671Scharnier__FBSDID("$FreeBSD: head/usr.bin/netstat/inet6.c 160787 2006-07-28 16:09:19Z yar $"); 43132671Scharnier 4464342Sume#ifdef INET6 4554263Sshin#include <sys/param.h> 4654263Sshin#include <sys/socket.h> 4754263Sshin#include <sys/socketvar.h> 4854263Sshin#include <sys/ioctl.h> 4954263Sshin#include <sys/mbuf.h> 5054263Sshin#include <sys/protosw.h> 5178064Sume#include <sys/sysctl.h> 5254263Sshin 5354263Sshin#include <net/route.h> 5454263Sshin#include <net/if.h> 5554263Sshin#include <net/if_var.h> 5654263Sshin#include <netinet/in.h> 5754263Sshin#include <netinet/ip6.h> 5854263Sshin#include <netinet/icmp6.h> 5954263Sshin#include <netinet/in_systm.h> 6054263Sshin#include <netinet6/in6_pcb.h> 6154263Sshin#include <netinet6/in6_var.h> 6254263Sshin#include <netinet6/ip6_var.h> 6354263Sshin#include <netinet6/pim6_var.h> 6478064Sume#include <netinet6/raw_ip6.h> 6554263Sshin 6654263Sshin#include <arpa/inet.h> 6754263Sshin#include <netdb.h> 6854263Sshin 69160787Syar#include <stdint.h> 7054263Sshin#include <stdio.h> 71160373Sjulian#include <errno.h> 7254263Sshin#include <string.h> 7354263Sshin#include <unistd.h> 7454263Sshin#include "netstat.h" 7554263Sshin 7654263Sshinstruct socket sockb; 7754263Sshin 78132671Scharnierchar *inet6name(struct in6_addr *); 7954263Sshin 8054263Sshinstatic char ntop_buf[INET6_ADDRSTRLEN]; 8154263Sshin 82102975Sdwmalonestatic const char *ip6nh[] = { 8354263Sshin "hop by hop", 8454263Sshin "ICMP", 8554263Sshin "IGMP", 8654263Sshin "#3", 8754263Sshin "IP", 8854263Sshin "#5", 8954263Sshin "TCP", 9054263Sshin "#7", 9154263Sshin "#8", 9254263Sshin "#9", 9354263Sshin "#10", 9454263Sshin "#11", 9554263Sshin "#12", 9654263Sshin "#13", 9754263Sshin "#14", 9854263Sshin "#15", 9954263Sshin "#16", 10054263Sshin "UDP", 10154263Sshin "#18", 10254263Sshin "#19", 10354263Sshin "#20", 10454263Sshin "#21", 10554263Sshin "IDP", 10654263Sshin "#23", 10754263Sshin "#24", 10854263Sshin "#25", 10954263Sshin "#26", 11054263Sshin "#27", 11154263Sshin "#28", 11254263Sshin "TP", 11354263Sshin "#30", 11454263Sshin "#31", 11554263Sshin "#32", 11654263Sshin "#33", 11754263Sshin "#34", 11854263Sshin "#35", 11954263Sshin "#36", 12054263Sshin "#37", 12154263Sshin "#38", 12254263Sshin "#39", 12354263Sshin "#40", 12454263Sshin "IP6", 12554263Sshin "#42", 12654263Sshin "routing", 12754263Sshin "fragment", 12854263Sshin "#45", 12954263Sshin "#46", 13054263Sshin "#47", 13154263Sshin "#48", 13254263Sshin "#49", 13354263Sshin "ESP", 13454263Sshin "AH", 13554263Sshin "#52", 13654263Sshin "#53", 13754263Sshin "#54", 13854263Sshin "#55", 13954263Sshin "#56", 14054263Sshin "#57", 14154263Sshin "ICMP6", 14254263Sshin "no next header", 14354263Sshin "destination option", 14454263Sshin "#61", 145125482Sume "mobility", 14654263Sshin "#63", 14754263Sshin "#64", 14854263Sshin "#65", 14954263Sshin "#66", 15054263Sshin "#67", 15154263Sshin "#68", 15254263Sshin "#69", 15354263Sshin "#70", 15454263Sshin "#71", 15554263Sshin "#72", 15654263Sshin "#73", 15754263Sshin "#74", 15854263Sshin "#75", 15954263Sshin "#76", 16054263Sshin "#77", 16154263Sshin "#78", 16254263Sshin "#79", 16354263Sshin "ISOIP", 16454263Sshin "#81", 16554263Sshin "#82", 16654263Sshin "#83", 16754263Sshin "#84", 16854263Sshin "#85", 16954263Sshin "#86", 17054263Sshin "#87", 17154263Sshin "#88", 17262584Sitojun "OSPF", 17354263Sshin "#80", 17454263Sshin "#91", 17554263Sshin "#92", 17654263Sshin "#93", 17754263Sshin "#94", 17854263Sshin "#95", 17954263Sshin "#96", 18054263Sshin "Ethernet", 18154263Sshin "#98", 18254263Sshin "#99", 18354263Sshin "#100", 18454263Sshin "#101", 18554263Sshin "#102", 18654263Sshin "PIM", 18754263Sshin "#104", 18854263Sshin "#105", 18954263Sshin "#106", 19054263Sshin "#107", 19154263Sshin "#108", 19254263Sshin "#109", 19354263Sshin "#110", 19454263Sshin "#111", 19554263Sshin "#112", 19654263Sshin "#113", 19754263Sshin "#114", 19854263Sshin "#115", 19954263Sshin "#116", 20054263Sshin "#117", 20154263Sshin "#118", 20254263Sshin "#119", 20354263Sshin "#120", 20454263Sshin "#121", 20554263Sshin "#122", 20654263Sshin "#123", 20754263Sshin "#124", 20854263Sshin "#125", 20954263Sshin "#126", 21054263Sshin "#127", 21154263Sshin "#128", 21254263Sshin "#129", 21354263Sshin "#130", 21454263Sshin "#131", 21554263Sshin "#132", 21654263Sshin "#133", 21754263Sshin "#134", 21854263Sshin "#135", 21954263Sshin "#136", 22054263Sshin "#137", 22154263Sshin "#138", 22254263Sshin "#139", 22354263Sshin "#140", 22454263Sshin "#141", 22554263Sshin "#142", 22654263Sshin "#143", 22754263Sshin "#144", 22854263Sshin "#145", 22954263Sshin "#146", 23054263Sshin "#147", 23154263Sshin "#148", 23254263Sshin "#149", 23354263Sshin "#150", 23454263Sshin "#151", 23554263Sshin "#152", 23654263Sshin "#153", 23754263Sshin "#154", 23854263Sshin "#155", 23954263Sshin "#156", 24054263Sshin "#157", 24154263Sshin "#158", 24254263Sshin "#159", 24354263Sshin "#160", 24454263Sshin "#161", 24554263Sshin "#162", 24654263Sshin "#163", 24754263Sshin "#164", 24854263Sshin "#165", 24954263Sshin "#166", 25054263Sshin "#167", 25154263Sshin "#168", 25254263Sshin "#169", 25354263Sshin "#170", 25454263Sshin "#171", 25554263Sshin "#172", 25654263Sshin "#173", 25754263Sshin "#174", 25854263Sshin "#175", 25954263Sshin "#176", 26054263Sshin "#177", 26154263Sshin "#178", 26254263Sshin "#179", 26354263Sshin "#180", 26454263Sshin "#181", 26554263Sshin "#182", 26654263Sshin "#183", 26754263Sshin "#184", 26854263Sshin "#185", 26954263Sshin "#186", 27054263Sshin "#187", 27154263Sshin "#188", 27254263Sshin "#189", 27354263Sshin "#180", 27454263Sshin "#191", 27554263Sshin "#192", 27654263Sshin "#193", 27754263Sshin "#194", 27854263Sshin "#195", 27954263Sshin "#196", 28054263Sshin "#197", 28154263Sshin "#198", 28254263Sshin "#199", 28354263Sshin "#200", 28454263Sshin "#201", 28554263Sshin "#202", 28654263Sshin "#203", 28754263Sshin "#204", 28854263Sshin "#205", 28954263Sshin "#206", 29054263Sshin "#207", 29154263Sshin "#208", 29254263Sshin "#209", 29354263Sshin "#210", 29454263Sshin "#211", 29554263Sshin "#212", 29654263Sshin "#213", 29754263Sshin "#214", 29854263Sshin "#215", 29954263Sshin "#216", 30054263Sshin "#217", 30154263Sshin "#218", 30254263Sshin "#219", 30354263Sshin "#220", 30454263Sshin "#221", 30554263Sshin "#222", 30654263Sshin "#223", 30754263Sshin "#224", 30854263Sshin "#225", 30954263Sshin "#226", 31054263Sshin "#227", 31154263Sshin "#228", 31254263Sshin "#229", 31354263Sshin "#230", 31454263Sshin "#231", 31554263Sshin "#232", 31654263Sshin "#233", 31754263Sshin "#234", 31854263Sshin "#235", 31954263Sshin "#236", 32054263Sshin "#237", 32154263Sshin "#238", 32254263Sshin "#239", 32354263Sshin "#240", 32454263Sshin "#241", 32554263Sshin "#242", 32654263Sshin "#243", 32754263Sshin "#244", 32854263Sshin "#245", 32954263Sshin "#246", 33054263Sshin "#247", 33154263Sshin "#248", 33254263Sshin "#249", 33354263Sshin "#250", 33454263Sshin "#251", 33554263Sshin "#252", 33654263Sshin "#253", 33754263Sshin "#254", 33854263Sshin "#255", 33954263Sshin}; 34054263Sshin 341125483Sumestatic char *srcrule_str[] = { 342125483Sume "first candidate", 343125483Sume "same address", 344125483Sume "appropriate scope", 345125483Sume "deprecated address", 346125483Sume "home address", 347125483Sume "outgoing interface", 348125483Sume "matching label", 349125483Sume "public/temporary address", 350125483Sume "alive interface", 351125483Sume "preferred interface", 352125483Sume "rule #10", 353125483Sume "rule #11", 354125483Sume "rule #12", 355125483Sume "rule #13", 356125483Sume "longest match", 357125483Sume "rule #15", 358125483Sume}; 359125483Sume 36054263Sshin/* 36154263Sshin * Dump IP6 statistics structure. 36254263Sshin */ 36354263Sshinvoid 364102975Sdwmaloneip6_stats(u_long off __unused, const char *name, int af1 __unused) 36554263Sshin{ 36654263Sshin struct ip6stat ip6stat; 36754263Sshin int first, i; 36878931Sume int mib[4]; 36978931Sume size_t len; 37054263Sshin 37178931Sume mib[0] = CTL_NET; 37278931Sume mib[1] = PF_INET6; 37378931Sume mib[2] = IPPROTO_IPV6; 37478931Sume mib[3] = IPV6CTL_STATS; 37554263Sshin 37678931Sume len = sizeof ip6stat; 37778931Sume memset(&ip6stat, 0, len); 37878931Sume if (sysctl(mib, 4, &ip6stat, &len, (void *)0, 0) < 0) 37974453Sphk return; 38054263Sshin printf("%s:\n", name); 38154263Sshin 38254263Sshin#define p(f, m) if (ip6stat.f || sflag <= 1) \ 383160787Syar printf(m, (uintmax_t)ip6stat.f, plural(ip6stat.f)) 38454263Sshin#define p1a(f, m) if (ip6stat.f || sflag <= 1) \ 385160787Syar printf(m, (uintmax_t)ip6stat.f) 38654263Sshin 387160787Syar p(ip6s_total, "\t%ju total packet%s received\n"); 388160787Syar p1a(ip6s_toosmall, "\t%ju with size smaller than minimum\n"); 389160787Syar p1a(ip6s_tooshort, "\t%ju with data size < data length\n"); 390160787Syar p1a(ip6s_badoptions, "\t%ju with bad options\n"); 391160787Syar p1a(ip6s_badvers, "\t%ju with incorrect version number\n"); 392160787Syar p(ip6s_fragments, "\t%ju fragment%s received\n"); 393160787Syar p(ip6s_fragdropped, "\t%ju fragment%s dropped (dup or out of space)\n"); 394160787Syar p(ip6s_fragtimeout, "\t%ju fragment%s dropped after timeout\n"); 395160787Syar p(ip6s_fragoverflow, "\t%ju fragment%s that exceeded limit\n"); 396160787Syar p(ip6s_reassembled, "\t%ju packet%s reassembled ok\n"); 397160787Syar p(ip6s_delivered, "\t%ju packet%s for this host\n"); 398160787Syar p(ip6s_forward, "\t%ju packet%s forwarded\n"); 399160787Syar p(ip6s_cantforward, "\t%ju packet%s not forwardable\n"); 400160787Syar p(ip6s_redirectsent, "\t%ju redirect%s sent\n"); 401160787Syar p(ip6s_localout, "\t%ju packet%s sent from this host\n"); 402160787Syar p(ip6s_rawout, "\t%ju packet%s sent with fabricated ip header\n"); 403160787Syar p(ip6s_odropped, "\t%ju output packet%s dropped due to no bufs, etc.\n"); 404160787Syar p(ip6s_noroute, "\t%ju output packet%s discarded due to no route\n"); 405160787Syar p(ip6s_fragmented, "\t%ju output datagram%s fragmented\n"); 406160787Syar p(ip6s_ofragments, "\t%ju fragment%s created\n"); 407160787Syar p(ip6s_cantfrag, "\t%ju datagram%s that can't be fragmented\n"); 408160787Syar p(ip6s_badscope, "\t%ju packet%s that violated scope rules\n"); 409160787Syar p(ip6s_notmember, "\t%ju multicast packet%s which we don't join\n"); 41054263Sshin for (first = 1, i = 0; i < 256; i++) 41154263Sshin if (ip6stat.ip6s_nxthist[i] != 0) { 41254263Sshin if (first) { 41354263Sshin printf("\tInput histogram:\n"); 41454263Sshin first = 0; 41554263Sshin } 416160787Syar printf("\t\t%s: %ju\n", ip6nh[i], 417160787Syar (uintmax_t)ip6stat.ip6s_nxthist[i]); 41854263Sshin } 41954263Sshin printf("\tMbuf statistics:\n"); 420160787Syar printf("\t\t%ju one mbuf\n", (uintmax_t)ip6stat.ip6s_m1); 42154263Sshin for (first = 1, i = 0; i < 32; i++) { 42255163Sshin char ifbuf[IFNAMSIZ]; 42354263Sshin if (ip6stat.ip6s_m2m[i] != 0) { 42454263Sshin if (first) { 42554263Sshin printf("\t\ttwo or more mbuf:\n"); 42654263Sshin first = 0; 42754263Sshin } 428160787Syar printf("\t\t\t%s= %ju\n", 42962584Sitojun if_indextoname(i, ifbuf), 430160787Syar (uintmax_t)ip6stat.ip6s_m2m[i]); 43154263Sshin } 43254263Sshin } 433160787Syar printf("\t\t%ju one ext mbuf\n", 434160787Syar (uintmax_t)ip6stat.ip6s_mext1); 435160787Syar printf("\t\t%ju two or more ext mbuf\n", 436160787Syar (uintmax_t)ip6stat.ip6s_mext2m); 43762584Sitojun p(ip6s_exthdrtoolong, 438160787Syar "\t%ju packet%s whose headers are not continuous\n"); 439160787Syar p(ip6s_nogif, "\t%ju tunneling packet%s that can't find gif\n"); 44062584Sitojun p(ip6s_toomanyhdr, 441160787Syar "\t%ju packet%s discarded because of too many headers\n"); 44262584Sitojun 44362584Sitojun /* for debugging source address selection */ 44462584Sitojun#define PRINT_SCOPESTAT(s,i) do {\ 44562584Sitojun switch(i) { /* XXX hardcoding in each case */\ 44662584Sitojun case 1:\ 447160787Syar p(s, "\t\t%ju node-local%s\n");\ 44862584Sitojun break;\ 44962584Sitojun case 2:\ 450160787Syar p(s,"\t\t%ju link-local%s\n");\ 45162584Sitojun break;\ 45262584Sitojun case 5:\ 453160787Syar p(s,"\t\t%ju site-local%s\n");\ 45462584Sitojun break;\ 45562584Sitojun case 14:\ 456160787Syar p(s,"\t\t%ju global%s\n");\ 45762584Sitojun break;\ 45862584Sitojun default:\ 459160787Syar printf("\t\t%ju addresses scope=%x\n",\ 460160787Syar (uintmax_t)ip6stat.s, i);\ 46162584Sitojun }\ 46262584Sitojun } while (0); 46362584Sitojun 46462584Sitojun p(ip6s_sources_none, 465160787Syar "\t%ju failure%s of source address selection\n"); 46662584Sitojun for (first = 1, i = 0; i < 16; i++) { 46762584Sitojun if (ip6stat.ip6s_sources_sameif[i]) { 46862584Sitojun if (first) { 46962584Sitojun printf("\tsource addresses on an outgoing I/F\n"); 47062584Sitojun first = 0; 47162584Sitojun } 47262584Sitojun PRINT_SCOPESTAT(ip6s_sources_sameif[i], i); 47362584Sitojun } 47462584Sitojun } 47562584Sitojun for (first = 1, i = 0; i < 16; i++) { 47662584Sitojun if (ip6stat.ip6s_sources_otherif[i]) { 47762584Sitojun if (first) { 47862584Sitojun printf("\tsource addresses on a non-outgoing I/F\n"); 47962584Sitojun first = 0; 48062584Sitojun } 48162584Sitojun PRINT_SCOPESTAT(ip6s_sources_otherif[i], i); 48262584Sitojun } 48362584Sitojun } 48462584Sitojun for (first = 1, i = 0; i < 16; i++) { 48562584Sitojun if (ip6stat.ip6s_sources_samescope[i]) { 48662584Sitojun if (first) { 48762584Sitojun printf("\tsource addresses of same scope\n"); 48862584Sitojun first = 0; 48962584Sitojun } 49062584Sitojun PRINT_SCOPESTAT(ip6s_sources_samescope[i], i); 49162584Sitojun } 49262584Sitojun } 49362584Sitojun for (first = 1, i = 0; i < 16; i++) { 49462584Sitojun if (ip6stat.ip6s_sources_otherscope[i]) { 49562584Sitojun if (first) { 49662584Sitojun printf("\tsource addresses of a different scope\n"); 49762584Sitojun first = 0; 49862584Sitojun } 49962584Sitojun PRINT_SCOPESTAT(ip6s_sources_otherscope[i], i); 50062584Sitojun } 50162584Sitojun } 50262584Sitojun for (first = 1, i = 0; i < 16; i++) { 50362584Sitojun if (ip6stat.ip6s_sources_deprecated[i]) { 50462584Sitojun if (first) { 50562584Sitojun printf("\tdeprecated source addresses\n"); 50662584Sitojun first = 0; 50762584Sitojun } 50862584Sitojun PRINT_SCOPESTAT(ip6s_sources_deprecated[i], i); 50962584Sitojun } 51062584Sitojun } 51162584Sitojun 512160787Syar p1a(ip6s_forward_cachehit, "\t%ju forward cache hit\n"); 513160787Syar p1a(ip6s_forward_cachemiss, "\t%ju forward cache miss\n"); 514125483Sume printf("\tSource addresses selection rule applied:\n"); 515125483Sume for (i = 0; i < 16; i++) { 516125483Sume if (ip6stat.ip6s_sources_rule[i]) 517160787Syar printf("\t\t%ju %s\n", 518160787Syar (uintmax_t)ip6stat.ip6s_sources_rule[i], 519125483Sume srcrule_str[i]); 520125483Sume } 52154263Sshin#undef p 52262584Sitojun#undef p1a 52354263Sshin} 52454263Sshin 52554263Sshin/* 52654263Sshin * Dump IPv6 per-interface statistics based on RFC 2465. 52754263Sshin */ 52854263Sshinvoid 52978314Sassarip6_ifstats(char *ifname) 53054263Sshin{ 53154263Sshin struct in6_ifreq ifr; 53254263Sshin int s; 53354263Sshin#define p(f, m) if (ifr.ifr_ifru.ifru_stat.f || sflag <= 1) \ 534160787Syar printf(m, (uintmax_t)ifr.ifr_ifru.ifru_stat.f, plural(ifr.ifr_ifru.ifru_stat.f)) 53554263Sshin#define p_5(f, m) if (ifr.ifr_ifru.ifru_stat.f || sflag <= 1) \ 536160787Syar printf(m, (uintmax_t)ip6stat.f) 53754263Sshin 53854263Sshin if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) { 53954263Sshin perror("Warning: socket(AF_INET6)"); 54054263Sshin return; 54154263Sshin } 54254263Sshin 54354263Sshin strcpy(ifr.ifr_name, ifname); 54454263Sshin printf("ip6 on %s:\n", ifr.ifr_name); 54554263Sshin 54654263Sshin if (ioctl(s, SIOCGIFSTAT_IN6, (char *)&ifr) < 0) { 54754263Sshin perror("Warning: ioctl(SIOCGIFSTAT_IN6)"); 54854263Sshin goto end; 54954263Sshin } 55054263Sshin 551160787Syar p(ifs6_in_receive, "\t%ju total input datagram%s\n"); 552160787Syar p(ifs6_in_hdrerr, "\t%ju datagram%s with invalid header received\n"); 553160787Syar p(ifs6_in_toobig, "\t%ju datagram%s exceeded MTU received\n"); 554160787Syar p(ifs6_in_noroute, "\t%ju datagram%s with no route received\n"); 555160787Syar p(ifs6_in_addrerr, "\t%ju datagram%s with invalid dst received\n"); 556160787Syar p(ifs6_in_protounknown, "\t%ju datagram%s with unknown proto received\n"); 557160787Syar p(ifs6_in_truncated, "\t%ju truncated datagram%s received\n"); 558160787Syar p(ifs6_in_discard, "\t%ju input datagram%s discarded\n"); 55954263Sshin p(ifs6_in_deliver, 560160787Syar "\t%ju datagram%s delivered to an upper layer protocol\n"); 561160787Syar p(ifs6_out_forward, "\t%ju datagram%s forwarded to this interface\n"); 56254263Sshin p(ifs6_out_request, 563160787Syar "\t%ju datagram%s sent from an upper layer protocol\n"); 564160787Syar p(ifs6_out_discard, "\t%ju total discarded output datagram%s\n"); 565160787Syar p(ifs6_out_fragok, "\t%ju output datagram%s fragmented\n"); 566160787Syar p(ifs6_out_fragfail, "\t%ju output datagram%s failed on fragment\n"); 567160787Syar p(ifs6_out_fragcreat, "\t%ju output datagram%s succeeded on fragment\n"); 568160787Syar p(ifs6_reass_reqd, "\t%ju incoming datagram%s fragmented\n"); 569160787Syar p(ifs6_reass_ok, "\t%ju datagram%s reassembled\n"); 570160787Syar p(ifs6_reass_fail, "\t%ju datagram%s failed on reassembly\n"); 571160787Syar p(ifs6_in_mcast, "\t%ju multicast datagram%s received\n"); 572160787Syar p(ifs6_out_mcast, "\t%ju multicast datagram%s sent\n"); 57354263Sshin 57454263Sshin end: 57554263Sshin close(s); 57654263Sshin 57754263Sshin#undef p 57854263Sshin#undef p_5 57954263Sshin} 58054263Sshin 581102975Sdwmalonestatic const char *icmp6names[] = { 58254263Sshin "#0", 58354263Sshin "unreach", 58454263Sshin "packet too big", 58554263Sshin "time exceed", 58654263Sshin "parameter problem", 58754263Sshin "#5", 58854263Sshin "#6", 58954263Sshin "#7", 59054263Sshin "#8", 59154263Sshin "#9", 59254263Sshin "#10", 59354263Sshin "#11", 59454263Sshin "#12", 59554263Sshin "#13", 59654263Sshin "#14", 59754263Sshin "#15", 59854263Sshin "#16", 59954263Sshin "#17", 60054263Sshin "#18", 60154263Sshin "#19", 60254263Sshin "#20", 60354263Sshin "#21", 60454263Sshin "#22", 60554263Sshin "#23", 60654263Sshin "#24", 60754263Sshin "#25", 60854263Sshin "#26", 60954263Sshin "#27", 61054263Sshin "#28", 61154263Sshin "#29", 61254263Sshin "#30", 61354263Sshin "#31", 61454263Sshin "#32", 61554263Sshin "#33", 61654263Sshin "#34", 61754263Sshin "#35", 61854263Sshin "#36", 61954263Sshin "#37", 62054263Sshin "#38", 62154263Sshin "#39", 62254263Sshin "#40", 62354263Sshin "#41", 62454263Sshin "#42", 62554263Sshin "#43", 62654263Sshin "#44", 62754263Sshin "#45", 62854263Sshin "#46", 62954263Sshin "#47", 63054263Sshin "#48", 63154263Sshin "#49", 63254263Sshin "#50", 63354263Sshin "#51", 63454263Sshin "#52", 63554263Sshin "#53", 63654263Sshin "#54", 63754263Sshin "#55", 63854263Sshin "#56", 63954263Sshin "#57", 64054263Sshin "#58", 64154263Sshin "#59", 64254263Sshin "#60", 64354263Sshin "#61", 64454263Sshin "#62", 64554263Sshin "#63", 64654263Sshin "#64", 64754263Sshin "#65", 64854263Sshin "#66", 64954263Sshin "#67", 65054263Sshin "#68", 65154263Sshin "#69", 65254263Sshin "#70", 65354263Sshin "#71", 65454263Sshin "#72", 65554263Sshin "#73", 65654263Sshin "#74", 65754263Sshin "#75", 65854263Sshin "#76", 65954263Sshin "#77", 66054263Sshin "#78", 66154263Sshin "#79", 66254263Sshin "#80", 66354263Sshin "#81", 66454263Sshin "#82", 66554263Sshin "#83", 66654263Sshin "#84", 66754263Sshin "#85", 66854263Sshin "#86", 66954263Sshin "#87", 67054263Sshin "#88", 67154263Sshin "#89", 67254263Sshin "#80", 67354263Sshin "#91", 67454263Sshin "#92", 67554263Sshin "#93", 67654263Sshin "#94", 67754263Sshin "#95", 67854263Sshin "#96", 67954263Sshin "#97", 68054263Sshin "#98", 68154263Sshin "#99", 68254263Sshin "#100", 68354263Sshin "#101", 68454263Sshin "#102", 68554263Sshin "#103", 68654263Sshin "#104", 68754263Sshin "#105", 68854263Sshin "#106", 68954263Sshin "#107", 69054263Sshin "#108", 69154263Sshin "#109", 69254263Sshin "#110", 69354263Sshin "#111", 69454263Sshin "#112", 69554263Sshin "#113", 69654263Sshin "#114", 69754263Sshin "#115", 69854263Sshin "#116", 69954263Sshin "#117", 70054263Sshin "#118", 70154263Sshin "#119", 70254263Sshin "#120", 70354263Sshin "#121", 70454263Sshin "#122", 70554263Sshin "#123", 70654263Sshin "#124", 70754263Sshin "#125", 70854263Sshin "#126", 70954263Sshin "#127", 71054263Sshin "echo", 71154263Sshin "echo reply", 71254263Sshin "multicast listener query", 71354263Sshin "multicast listener report", 71454263Sshin "multicast listener done", 71554263Sshin "router solicitation", 71677565Sdd "router advertisement", 71754263Sshin "neighbor solicitation", 71877565Sdd "neighbor advertisement", 71954263Sshin "redirect", 72054263Sshin "router renumbering", 72154263Sshin "node information request", 72254263Sshin "node information reply", 72378540Ssumikawa "inverse neighbor solicitation", 72478540Ssumikawa "inverse neighbor advertisement", 72554263Sshin "#143", 72654263Sshin "#144", 72754263Sshin "#145", 72854263Sshin "#146", 72954263Sshin "#147", 73054263Sshin "#148", 73154263Sshin "#149", 73254263Sshin "#150", 73354263Sshin "#151", 73454263Sshin "#152", 73554263Sshin "#153", 73654263Sshin "#154", 73754263Sshin "#155", 73854263Sshin "#156", 73954263Sshin "#157", 74054263Sshin "#158", 74154263Sshin "#159", 74254263Sshin "#160", 74354263Sshin "#161", 74454263Sshin "#162", 74554263Sshin "#163", 74654263Sshin "#164", 74754263Sshin "#165", 74854263Sshin "#166", 74954263Sshin "#167", 75054263Sshin "#168", 75154263Sshin "#169", 75254263Sshin "#170", 75354263Sshin "#171", 75454263Sshin "#172", 75554263Sshin "#173", 75654263Sshin "#174", 75754263Sshin "#175", 75854263Sshin "#176", 75954263Sshin "#177", 76054263Sshin "#178", 76154263Sshin "#179", 76254263Sshin "#180", 76354263Sshin "#181", 76454263Sshin "#182", 76554263Sshin "#183", 76654263Sshin "#184", 76754263Sshin "#185", 76854263Sshin "#186", 76954263Sshin "#187", 77054263Sshin "#188", 77154263Sshin "#189", 77254263Sshin "#180", 77354263Sshin "#191", 77454263Sshin "#192", 77554263Sshin "#193", 77654263Sshin "#194", 77754263Sshin "#195", 77854263Sshin "#196", 77954263Sshin "#197", 78054263Sshin "#198", 78154263Sshin "#199", 78254263Sshin "#200", 78354263Sshin "#201", 78454263Sshin "#202", 78554263Sshin "#203", 78654263Sshin "#204", 78754263Sshin "#205", 78854263Sshin "#206", 78954263Sshin "#207", 79054263Sshin "#208", 79154263Sshin "#209", 79254263Sshin "#210", 79354263Sshin "#211", 79454263Sshin "#212", 79554263Sshin "#213", 79654263Sshin "#214", 79754263Sshin "#215", 79854263Sshin "#216", 79954263Sshin "#217", 80054263Sshin "#218", 80154263Sshin "#219", 80254263Sshin "#220", 80354263Sshin "#221", 80454263Sshin "#222", 80554263Sshin "#223", 80654263Sshin "#224", 80754263Sshin "#225", 80854263Sshin "#226", 80954263Sshin "#227", 81054263Sshin "#228", 81154263Sshin "#229", 81254263Sshin "#230", 81354263Sshin "#231", 81454263Sshin "#232", 81554263Sshin "#233", 81654263Sshin "#234", 81754263Sshin "#235", 81854263Sshin "#236", 81954263Sshin "#237", 82054263Sshin "#238", 82154263Sshin "#239", 82254263Sshin "#240", 82354263Sshin "#241", 82454263Sshin "#242", 82554263Sshin "#243", 82654263Sshin "#244", 82754263Sshin "#245", 82854263Sshin "#246", 82954263Sshin "#247", 83054263Sshin "#248", 83154263Sshin "#249", 83254263Sshin "#250", 83354263Sshin "#251", 83454263Sshin "#252", 83554263Sshin "#253", 83654263Sshin "#254", 83754263Sshin "#255", 83854263Sshin}; 83954263Sshin 84054263Sshin/* 84154263Sshin * Dump ICMP6 statistics. 84254263Sshin */ 84354263Sshinvoid 844102975Sdwmaloneicmp6_stats(u_long off __unused, const char *name, int af1 __unused) 84554263Sshin{ 84654263Sshin struct icmp6stat icmp6stat; 84795637Smarkm int i, first; 84878931Sume int mib[4]; 84978931Sume size_t len; 85054263Sshin 85178931Sume mib[0] = CTL_NET; 85278931Sume mib[1] = PF_INET6; 85378931Sume mib[2] = IPPROTO_ICMPV6; 85478931Sume mib[3] = ICMPV6CTL_STATS; 85578931Sume 85678931Sume len = sizeof icmp6stat; 85778931Sume memset(&icmp6stat, 0, len); 85878931Sume if (sysctl(mib, 4, &icmp6stat, &len, (void *)0, 0) < 0) 85954263Sshin return; 86054263Sshin printf("%s:\n", name); 86154263Sshin 86254263Sshin#define p(f, m) if (icmp6stat.f || sflag <= 1) \ 863160787Syar printf(m, (uintmax_t)icmp6stat.f, plural(icmp6stat.f)) 864160787Syar#define p_5(f, m) printf(m, (uintmax_t)icmp6stat.f) 86554263Sshin 866160787Syar p(icp6s_error, "\t%ju call%s to icmp6_error\n"); 86754263Sshin p(icp6s_canterror, 868160787Syar "\t%ju error%s not generated in response to an icmp6 message\n"); 86954263Sshin p(icp6s_toofreq, 870160787Syar "\t%ju error%s not generated because of rate limitation\n"); 87195637Smarkm#define NELEM (int)(sizeof(icmp6stat.icp6s_outhist)/sizeof(icmp6stat.icp6s_outhist[0])) 87278540Ssumikawa for (first = 1, i = 0; i < NELEM; i++) 87354263Sshin if (icmp6stat.icp6s_outhist[i] != 0) { 87454263Sshin if (first) { 87554263Sshin printf("\tOutput histogram:\n"); 87654263Sshin first = 0; 87754263Sshin } 878160787Syar printf("\t\t%s: %ju\n", icmp6names[i], 879160787Syar (uintmax_t)icmp6stat.icp6s_outhist[i]); 88054263Sshin } 88178540Ssumikawa#undef NELEM 882160787Syar p(icp6s_badcode, "\t%ju message%s with bad code fields\n"); 883160787Syar p(icp6s_tooshort, "\t%ju message%s < minimum length\n"); 884160787Syar p(icp6s_checksum, "\t%ju bad checksum%s\n"); 885160787Syar p(icp6s_badlen, "\t%ju message%s with bad length\n"); 88695637Smarkm#define NELEM (int)(sizeof(icmp6stat.icp6s_inhist)/sizeof(icmp6stat.icp6s_inhist[0])) 88778540Ssumikawa for (first = 1, i = 0; i < NELEM; i++) 88854263Sshin if (icmp6stat.icp6s_inhist[i] != 0) { 88954263Sshin if (first) { 89054263Sshin printf("\tInput histogram:\n"); 89154263Sshin first = 0; 89254263Sshin } 893160787Syar printf("\t\t%s: %ju\n", icmp6names[i], 894160787Syar (uintmax_t)icmp6stat.icp6s_inhist[i]); 89554263Sshin } 89678540Ssumikawa#undef NELEM 89777565Sdd printf("\tHistogram of error messages to be generated:\n"); 898160787Syar p_5(icp6s_odst_unreach_noroute, "\t\t%ju no route\n"); 899160787Syar p_5(icp6s_odst_unreach_admin, "\t\t%ju administratively prohibited\n"); 900160787Syar p_5(icp6s_odst_unreach_beyondscope, "\t\t%ju beyond scope\n"); 901160787Syar p_5(icp6s_odst_unreach_addr, "\t\t%ju address unreachable\n"); 902160787Syar p_5(icp6s_odst_unreach_noport, "\t\t%ju port unreachable\n"); 903160787Syar p_5(icp6s_opacket_too_big, "\t\t%ju packet too big\n"); 904160787Syar p_5(icp6s_otime_exceed_transit, "\t\t%ju time exceed transit\n"); 905160787Syar p_5(icp6s_otime_exceed_reassembly, "\t\t%ju time exceed reassembly\n"); 906160787Syar p_5(icp6s_oparamprob_header, "\t\t%ju erroneous header field\n"); 907160787Syar p_5(icp6s_oparamprob_nextheader, "\t\t%ju unrecognized next header\n"); 908160787Syar p_5(icp6s_oparamprob_option, "\t\t%ju unrecognized option\n"); 909160787Syar p_5(icp6s_oredirect, "\t\t%ju redirect\n"); 910160787Syar p_5(icp6s_ounknown, "\t\t%ju unknown\n"); 91162584Sitojun 912160787Syar p(icp6s_reflect, "\t%ju message response%s generated\n"); 913160787Syar p(icp6s_nd_toomanyopt, "\t%ju message%s with too many ND options\n"); 914160787Syar p(icp6s_nd_badopt, "\t%ju message%s with bad ND options\n"); 915160787Syar p(icp6s_badns, "\t%ju bad neighbor solicitation message%s\n"); 916160787Syar p(icp6s_badna, "\t%ju bad neighbor advertisement message%s\n"); 917160787Syar p(icp6s_badrs, "\t%ju bad router solicitation message%s\n"); 918160787Syar p(icp6s_badra, "\t%ju bad router advertisement message%s\n"); 919160787Syar p(icp6s_badredirect, "\t%ju bad redirect message%s\n"); 920160787Syar p(icp6s_pmtuchg, "\t%ju path MTU change%s\n"); 92154263Sshin#undef p 92254263Sshin#undef p_5 92354263Sshin} 92454263Sshin 92554263Sshin/* 92654263Sshin * Dump ICMPv6 per-interface statistics based on RFC 2466. 92754263Sshin */ 92854263Sshinvoid 92978314Sassaricmp6_ifstats(char *ifname) 93054263Sshin{ 93154263Sshin struct in6_ifreq ifr; 93254263Sshin int s; 93354263Sshin#define p(f, m) if (ifr.ifr_ifru.ifru_icmp6stat.f || sflag <= 1) \ 934160787Syar printf(m, (uintmax_t)ifr.ifr_ifru.ifru_icmp6stat.f, plural(ifr.ifr_ifru.ifru_icmp6stat.f)) 935109234Smtm#define p2(f, m) if (ifr.ifr_ifru.ifru_icmp6stat.f || sflag <= 1) \ 936160787Syar printf(m, (uintmax_t)ifr.ifr_ifru.ifru_icmp6stat.f, pluralies(ifr.ifr_ifru.ifru_icmp6stat.f)) 93754263Sshin 93854263Sshin if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) { 93954263Sshin perror("Warning: socket(AF_INET6)"); 94054263Sshin return; 94154263Sshin } 94254263Sshin 94354263Sshin strcpy(ifr.ifr_name, ifname); 94454263Sshin printf("icmp6 on %s:\n", ifr.ifr_name); 94554263Sshin 94654263Sshin if (ioctl(s, SIOCGIFSTAT_ICMP6, (char *)&ifr) < 0) { 94754263Sshin perror("Warning: ioctl(SIOCGIFSTAT_ICMP6)"); 94854263Sshin goto end; 94954263Sshin } 95054263Sshin 951160787Syar p(ifs6_in_msg, "\t%ju total input message%s\n"); 952160787Syar p(ifs6_in_error, "\t%ju total input error message%s\n"); 953160787Syar p(ifs6_in_dstunreach, "\t%ju input destination unreachable error%s\n"); 954160787Syar p(ifs6_in_adminprohib, "\t%ju input administratively prohibited error%s\n"); 955160787Syar p(ifs6_in_timeexceed, "\t%ju input time exceeded error%s\n"); 956160787Syar p(ifs6_in_paramprob, "\t%ju input parameter problem error%s\n"); 957160787Syar p(ifs6_in_pkttoobig, "\t%ju input packet too big error%s\n"); 958160787Syar p(ifs6_in_echo, "\t%ju input echo request%s\n"); 959160787Syar p2(ifs6_in_echoreply, "\t%ju input echo repl%s\n"); 960160787Syar p(ifs6_in_routersolicit, "\t%ju input router solicitation%s\n"); 961160787Syar p(ifs6_in_routeradvert, "\t%ju input router advertisement%s\n"); 962160787Syar p(ifs6_in_neighborsolicit, "\t%ju input neighbor solicitation%s\n"); 963160787Syar p(ifs6_in_neighboradvert, "\t%ju input neighbor advertisement%s\n"); 964160787Syar p(ifs6_in_redirect, "\t%ju input redirect%s\n"); 965160787Syar p2(ifs6_in_mldquery, "\t%ju input MLD quer%s\n"); 966160787Syar p(ifs6_in_mldreport, "\t%ju input MLD report%s\n"); 967160787Syar p(ifs6_in_mlddone, "\t%ju input MLD done%s\n"); 96854263Sshin 969160787Syar p(ifs6_out_msg, "\t%ju total output message%s\n"); 970160787Syar p(ifs6_out_error, "\t%ju total output error message%s\n"); 971160787Syar p(ifs6_out_dstunreach, "\t%ju output destination unreachable error%s\n"); 972160787Syar p(ifs6_out_adminprohib, "\t%ju output administratively prohibited error%s\n"); 973160787Syar p(ifs6_out_timeexceed, "\t%ju output time exceeded error%s\n"); 974160787Syar p(ifs6_out_paramprob, "\t%ju output parameter problem error%s\n"); 975160787Syar p(ifs6_out_pkttoobig, "\t%ju output packet too big error%s\n"); 976160787Syar p(ifs6_out_echo, "\t%ju output echo request%s\n"); 977160787Syar p2(ifs6_out_echoreply, "\t%ju output echo repl%s\n"); 978160787Syar p(ifs6_out_routersolicit, "\t%ju output router solicitation%s\n"); 979160787Syar p(ifs6_out_routeradvert, "\t%ju output router advertisement%s\n"); 980160787Syar p(ifs6_out_neighborsolicit, "\t%ju output neighbor solicitation%s\n"); 981160787Syar p(ifs6_out_neighboradvert, "\t%ju output neighbor advertisement%s\n"); 982160787Syar p(ifs6_out_redirect, "\t%ju output redirect%s\n"); 983160787Syar p2(ifs6_out_mldquery, "\t%ju output MLD quer%s\n"); 984160787Syar p(ifs6_out_mldreport, "\t%ju output MLD report%s\n"); 985160787Syar p(ifs6_out_mlddone, "\t%ju output MLD done%s\n"); 98654263Sshin 98754263Sshin end: 98854263Sshin close(s); 98954263Sshin#undef p 99054263Sshin} 99154263Sshin 99254263Sshin/* 99354263Sshin * Dump PIM statistics structure. 99454263Sshin */ 99554263Sshinvoid 996102975Sdwmalonepim6_stats(u_long off __unused, const char *name, int af1 __unused) 99754263Sshin{ 99854263Sshin struct pim6stat pim6stat; 99954263Sshin 100054263Sshin if (off == 0) 100154263Sshin return; 1002125482Sume if (kread(off, (char *)&pim6stat, sizeof(pim6stat))) 1003125482Sume return; 100454263Sshin printf("%s:\n", name); 100554263Sshin 100654263Sshin#define p(f, m) if (pim6stat.f || sflag <= 1) \ 1007160787Syar printf(m, (uintmax_t)pim6stat.f, plural(pim6stat.f)) 1008160787Syar p(pim6s_rcv_total, "\t%ju message%s received\n"); 1009160787Syar p(pim6s_rcv_tooshort, "\t%ju message%s received with too few bytes\n"); 1010160787Syar p(pim6s_rcv_badsum, "\t%ju message%s received with bad checksum\n"); 1011160787Syar p(pim6s_rcv_badversion, "\t%ju message%s received with bad version\n"); 1012160787Syar p(pim6s_rcv_registers, "\t%ju register%s received\n"); 1013160787Syar p(pim6s_rcv_badregisters, "\t%ju bad register%s received\n"); 1014160787Syar p(pim6s_snd_registers, "\t%ju register%s sent\n"); 101554263Sshin#undef p 101654263Sshin} 101754263Sshin 101854263Sshin/* 101978064Sume * Dump raw ip6 statistics structure. 102078064Sume */ 102178064Sumevoid 1022102975Sdwmalonerip6_stats(u_long off __unused, const char *name, int af1 __unused) 102378064Sume{ 102478064Sume struct rip6stat rip6stat; 102578064Sume u_quad_t delivered; 102678064Sume int mib[4]; 102778064Sume size_t l; 102878064Sume 102978064Sume mib[0] = CTL_NET; 103078064Sume mib[1] = PF_INET6; 103178064Sume mib[2] = IPPROTO_IPV6; 103278064Sume mib[3] = IPV6CTL_RIP6STATS; 103378064Sume l = sizeof(rip6stat); 103478064Sume if (sysctl(mib, 4, &rip6stat, &l, NULL, 0) < 0) { 1035160373Sjulian /* Just shut up if the kernel doesn't have ipv6. */ 1036160373Sjulian if (errno != ENOENT) 1037160373Sjulian perror("Warning: sysctl(net.inet6.ip6.rip6stats)"); 103878064Sume return; 103978064Sume } 104078064Sume 104178064Sume printf("%s:\n", name); 104278064Sume 104378064Sume#define p(f, m) if (rip6stat.f || sflag <= 1) \ 1044160787Syar printf(m, (uintmax_t)rip6stat.f, plural(rip6stat.f)) 1045160787Syar p(rip6s_ipackets, "\t%ju message%s received\n"); 1046160787Syar p(rip6s_isum, "\t%ju checksum calcuration%s on inbound\n"); 1047160787Syar p(rip6s_badsum, "\t%ju message%s with bad checksum\n"); 1048160787Syar p(rip6s_nosock, "\t%ju message%s dropped due to no socket\n"); 104978064Sume p(rip6s_nosockmcast, 1050160787Syar "\t%ju multicast message%s dropped due to no socket\n"); 105178064Sume p(rip6s_fullsock, 1052160787Syar "\t%ju message%s dropped due to full socket buffers\n"); 105378064Sume delivered = rip6stat.rip6s_ipackets - 105478064Sume rip6stat.rip6s_badsum - 105578064Sume rip6stat.rip6s_nosock - 105678064Sume rip6stat.rip6s_nosockmcast - 105778064Sume rip6stat.rip6s_fullsock; 105878064Sume if (delivered || sflag <= 1) 1059160787Syar printf("\t%ju delivered\n", (uintmax_t)delivered); 1060160787Syar p(rip6s_opackets, "\t%ju datagram%s output\n"); 106178064Sume#undef p 106278064Sume} 106378064Sume 106478064Sume/* 106554263Sshin * Pretty print an Internet address (net address + port). 106678238Sassar * Take numeric_addr and numeric_port into consideration. 106754263Sshin */ 106854263Sshin#define GETSERVBYPORT6(port, proto, ret)\ 106954263Sshin{\ 107054263Sshin if (strcmp((proto), "tcp6") == 0)\ 107154263Sshin (ret) = getservbyport((int)(port), "tcp");\ 107254263Sshin else if (strcmp((proto), "udp6") == 0)\ 107354263Sshin (ret) = getservbyport((int)(port), "udp");\ 107454263Sshin else\ 107554263Sshin (ret) = getservbyport((int)(port), (proto));\ 107654263Sshin}; 107754263Sshin 107854263Sshinvoid 1079102975Sdwmaloneinet6print(struct in6_addr *in6, int port, const char *proto, int numeric) 108054263Sshin{ 108154263Sshin struct servent *sp = 0; 108254263Sshin char line[80], *cp; 108354263Sshin int width; 108454263Sshin 108583200Sru sprintf(line, "%.*s.", Wflag ? 39 : 108654263Sshin (Aflag && !numeric) ? 12 : 16, inet6name(in6)); 108754263Sshin cp = index(line, '\0'); 108854263Sshin if (!numeric && port) 108954263Sshin GETSERVBYPORT6(port, proto, sp); 109054263Sshin if (sp || port == 0) 109154263Sshin sprintf(cp, "%.8s", sp ? sp->s_name : "*"); 109254263Sshin else 109354263Sshin sprintf(cp, "%d", ntohs((u_short)port)); 109483200Sru width = Wflag ? 45 : Aflag ? 18 : 22; 109555533Sshin printf("%-*.*s ", width, width, line); 109654263Sshin} 109754263Sshin 109854263Sshin/* 109954263Sshin * Construct an Internet address representation. 110078238Sassar * If the numeric_addr has been supplied, give 110154263Sshin * numeric value, otherwise try for symbolic name. 110254263Sshin */ 110354263Sshin 110454263Sshinchar * 110578314Sassarinet6name(struct in6_addr *in6p) 110654263Sshin{ 1107102975Sdwmalone char *cp; 110854263Sshin static char line[50]; 110954263Sshin struct hostent *hp; 111074262Sbrian static char domain[MAXHOSTNAMELEN]; 111154263Sshin static int first = 1; 111254263Sshin 111378238Sassar if (first && !numeric_addr) { 111454263Sshin first = 0; 111554263Sshin if (gethostname(domain, MAXHOSTNAMELEN) == 0 && 111654263Sshin (cp = index(domain, '.'))) 111754263Sshin (void) strcpy(domain, cp + 1); 111854263Sshin else 111954263Sshin domain[0] = 0; 112054263Sshin } 112154263Sshin cp = 0; 112278238Sassar if (!numeric_addr && !IN6_IS_ADDR_UNSPECIFIED(in6p)) { 112354263Sshin hp = gethostbyaddr((char *)in6p, sizeof(*in6p), AF_INET6); 112454263Sshin if (hp) { 112554263Sshin if ((cp = index(hp->h_name, '.')) && 112654263Sshin !strcmp(cp + 1, domain)) 112754263Sshin *cp = 0; 112854263Sshin cp = hp->h_name; 112954263Sshin } 113054263Sshin } 113154263Sshin if (IN6_IS_ADDR_UNSPECIFIED(in6p)) 113254263Sshin strcpy(line, "*"); 113354263Sshin else if (cp) 113454263Sshin strcpy(line, cp); 113554263Sshin else 113654263Sshin sprintf(line, "%s", 113754263Sshin inet_ntop(AF_INET6, (void *)in6p, ntop_buf, 113854263Sshin sizeof(ntop_buf))); 113954263Sshin return (line); 114054263Sshin} 114164342Sume#endif /*INET6*/ 1142