/* * Dump IP6 statistics structure. */ void ip6_stats(u_long off, const char *name, int af1 __unused, int proto __unused) { struct ip6stat ip6stat, zerostat; int first, i; size_t len; len = sizeof ip6stat; if (live) { memset(&ip6stat, 0, len); if (zflag) memset(&zerostat, 0, len); if (sysctlbyname("net.inet6.ip6.stats", &ip6stat, &len, zflag ? &zerostat : NULL, zflag ? len : 0) < 0) { if (errno != ENOENT) warn("sysctl: net.inet6.ip6.stats"); return; } } else kread_counters(off, &ip6stat, len); printf("%s:\n", name); #define p(f, m) if (ip6stat.f || sflag <= 1) \ printf(m, (uintmax_t)ip6stat.f, plural(ip6stat.f)) #define p1a(f, m) if (ip6stat.f || sflag <= 1) \ printf(m, (uintmax_t)ip6stat.f) p(ip6s_total, "\t%ju total packet%s received\n"); p1a(ip6s_toosmall, "\t%ju with size smaller than minimum\n"); p1a(ip6s_tooshort, "\t%ju with data size < data length\n"); p1a(ip6s_badoptions, "\t%ju with bad options\n"); p1a(ip6s_badvers, "\t%ju with incorrect version number\n"); p(ip6s_fragments, "\t%ju fragment%s received\n"); p(ip6s_fragdropped, "\t%ju fragment%s dropped (dup or out of space)\n"); p(ip6s_fragtimeout, "\t%ju fragment%s dropped after timeout\n"); p(ip6s_fragoverflow, "\t%ju fragment%s that exceeded limit\n"); p(ip6s_reassembled, "\t%ju packet%s reassembled ok\n"); p(ip6s_delivered, "\t%ju packet%s for this host\n"); p(ip6s_forward, "\t%ju packet%s forwarded\n"); p(ip6s_cantforward, "\t%ju packet%s not forwardable\n"); p(ip6s_redirectsent, "\t%ju redirect%s sent\n"); p(ip6s_localout, "\t%ju packet%s sent from this host\n"); p(ip6s_rawout, "\t%ju packet%s sent with fabricated ip header\n"); p(ip6s_odropped, "\t%ju output packet%s dropped due to no bufs, etc.\n"); p(ip6s_noroute, "\t%ju output packet%s discarded due to no route\n"); p(ip6s_fragmented, "\t%ju output datagram%s fragmented\n"); p(ip6s_ofragments, "\t%ju fragment%s created\n"); p(ip6s_cantfrag, "\t%ju datagram%s that can't be fragmented\n"); p(ip6s_badscope, "\t%ju packet%s that violated scope rules\n"); p(ip6s_notmember, "\t%ju multicast packet%s which we don't join\n"); for (first = 1, i = 0; i < IP6S_HDRCNT; i++) if (ip6stat.ip6s_nxthist[i] != 0) { if (first) { printf("\tInput histogram:\n"); first = 0; } printf("\t\t%s: %ju\n", ip6nh[i], (uintmax_t)ip6stat.ip6s_nxthist[i]); } printf("\tMbuf statistics:\n"); printf("\t\t%ju one mbuf\n", (uintmax_t)ip6stat.ip6s_m1); for (first = 1, i = 0; i < IP6S_M2MMAX; i++) { char ifbuf[IFNAMSIZ]; if (ip6stat.ip6s_m2m[i] != 0) { if (first) { printf("\t\ttwo or more mbuf:\n"); first = 0; } printf("\t\t\t%s= %ju\n", if_indextoname(i, ifbuf), (uintmax_t)ip6stat.ip6s_m2m[i]); } } printf("\t\t%ju one ext mbuf\n", (uintmax_t)ip6stat.ip6s_mext1); printf("\t\t%ju two or more ext mbuf\n", (uintmax_t)ip6stat.ip6s_mext2m); p(ip6s_exthdrtoolong, "\t%ju packet%s whose headers are not contiguous\n"); p(ip6s_nogif, "\t%ju tunneling packet%s that can't find gif\n"); p(ip6s_toomanyhdr, "\t%ju packet%s discarded because of too many headers\n"); /* for debugging source address selection */ #define PRINT_SCOPESTAT(s,i) do {\ switch(i) { /* XXX hardcoding in each case */\ case 1:\ p(s, "\t\t%ju interface-local%s\n");\ break;\ case 2:\ p(s,"\t\t%ju link-local%s\n");\ break;\ case 5:\ p(s,"\t\t%ju site-local%s\n");\ break;\ case 14:\ p(s,"\t\t%ju global%s\n");\ break;\ default:\ printf("\t\t%ju addresses scope=%x\n",\ (uintmax_t)ip6stat.s, i);\ }\ } while (0); p(ip6s_sources_none, "\t%ju failure%s of source address selection\n"); for (first = 1, i = 0; i < IP6S_SCOPECNT; i++) { if (ip6stat.ip6s_sources_sameif[i]) { if (first) { printf("\tsource addresses on an outgoing I/F\n"); first = 0; } PRINT_SCOPESTAT(ip6s_sources_sameif[i], i); } } for (first = 1, i = 0; i < IP6S_SCOPECNT; i++) { if (ip6stat.ip6s_sources_otherif[i]) { if (first) { printf("\tsource addresses on a non-outgoing I/F\n"); first = 0; } PRINT_SCOPESTAT(ip6s_sources_otherif[i], i); } } for (first = 1, i = 0; i < IP6S_SCOPECNT; i++) { if (ip6stat.ip6s_sources_samescope[i]) { if (first) { printf("\tsource addresses of same scope\n"); first = 0; } PRINT_SCOPESTAT(ip6s_sources_samescope[i], i); } } for (first = 1, i = 0; i < IP6S_SCOPECNT; i++) { if (ip6stat.ip6s_sources_otherscope[i]) { if (first) { printf("\tsource addresses of a different scope\n"); first = 0; } PRINT_SCOPESTAT(ip6s_sources_otherscope[i], i); } } for (first = 1, i = 0; i < IP6S_SCOPECNT; i++) { if (ip6stat.ip6s_sources_deprecated[i]) { if (first) { printf("\tdeprecated source addresses\n"); first = 0; } PRINT_SCOPESTAT(ip6s_sources_deprecated[i], i); } } printf("\tSource addresses selection rule applied:\n"); for (i = 0; i < IP6S_RULESMAX; i++) { if (ip6stat.ip6s_sources_rule[i]) printf("\t\t%ju %s\n", (uintmax_t)ip6stat.ip6s_sources_rule[i], srcrule_str[i]); } #undef p #undef p1a }
/* * Dump IP6 statistics structure. */ void ip6_stats(u_long off, const char *name, int af1 __unused, int proto __unused) { struct ip6stat ip6stat, zerostat; int first, i; size_t len; len = sizeof ip6stat; if (live) { memset(&ip6stat, 0, len); if (zflag) memset(&zerostat, 0, len); if (sysctlbyname("net.inet6.ip6.stats", &ip6stat, &len, zflag ? &zerostat : NULL, zflag ? len : 0) < 0) { if (errno != ENOENT) xo_warn("sysctl: net.inet6.ip6.stats"); return; } } else kread_counters(off, &ip6stat, len); xo_open_container(name); xo_emit("{T:/%s}:\n", name); #define p(f, m) if (ip6stat.f || sflag <= 1) \ xo_emit(m, (uintmax_t)ip6stat.f, plural(ip6stat.f)) #define p1a(f, m) if (ip6stat.f || sflag <= 1) \ xo_emit(m, (uintmax_t)ip6stat.f) p(ip6s_total, "\t{:received-packets/%ju} " "{N:/total packet%s received}\n"); p1a(ip6s_toosmall, "\t{:dropped-below-minimum-size/%ju} " "{N:/with size smaller than minimum}\n"); p1a(ip6s_tooshort, "\t{:dropped-short-packets/%ju} " "{N:/with data size < data length}\n"); p1a(ip6s_badoptions, "\t{:dropped-bad-options/%ju} " "{N:/with bad options}\n"); p1a(ip6s_badvers, "\t{:dropped-bad-version/%ju} " "{N:/with incorrect version number}\n"); p(ip6s_fragments, "\t{:received-fragments/%ju} " "{N:/fragment%s received}\n"); p(ip6s_fragdropped, "\t{:dropped-fragment/%ju} " "{N:/fragment%s dropped (dup or out of space)}\n"); p(ip6s_fragtimeout, "\t{:dropped-fragment-after-timeout/%ju} " "{N:/fragment%s dropped after timeout}\n"); p(ip6s_fragoverflow, "\t{:dropped-fragments-overflow/%ju} " "{N:/fragment%s that exceeded limit}\n"); p(ip6s_reassembled, "\t{:reassembled-packets/%ju} " "{N:/packet%s reassembled ok}\n"); p(ip6s_delivered, "\t{:received-local-packets/%ju} " "{N:/packet%s for this host}\n"); p(ip6s_forward, "\t{:forwarded-packets/%ju} " "{N:/packet%s forwarded}\n"); p(ip6s_cantforward, "\t{:packets-not-forwardable/%ju} " "{N:/packet%s not forwardable}\n"); p(ip6s_redirectsent, "\t{:sent-redirects/%ju} " "{N:/redirect%s sent}\n"); p(ip6s_localout, "\t{:sent-packets/%ju} " "{N:/packet%s sent from this host}\n"); p(ip6s_rawout, "\t{:send-packets-fabricated-header/%ju} " "{N:/packet%s sent with fabricated ip header}\n"); p(ip6s_odropped, "\t{:discard-no-mbufs/%ju} " "{N:/output packet%s dropped due to no bufs, etc.}\n"); p(ip6s_noroute, "\t{:discard-no-route/%ju} " "{N:/output packet%s discarded due to no route}\n"); p(ip6s_fragmented, "\t{:sent-fragments/%ju} " "{N:/output datagram%s fragmented}\n"); p(ip6s_ofragments, "\t{:fragments-created/%ju} " "{N:/fragment%s created}\n"); p(ip6s_cantfrag, "\t{:discard-cannot-fragment/%ju} " "{N:/datagram%s that can't be fragmented}\n"); p(ip6s_badscope, "\t{:discard-scope-violations/%ju} " "{N:/packet%s that violated scope rules}\n"); p(ip6s_notmember, "\t{:multicast-no-join-packets/%ju} " "{N:/multicast packet%s which we don't join}\n"); for (first = 1, i = 0; i < IP6S_HDRCNT; i++) if (ip6stat.ip6s_nxthist[i] != 0) { if (first) { xo_emit("\t{T:Input histogram}:\n"); xo_open_list("input-histogram"); first = 0; } xo_open_instance("input-histogram"); xo_emit("\t\t{k:name/%s}: {:count/%ju}\n", ip6nh[i], (uintmax_t)ip6stat.ip6s_nxthist[i]); xo_close_instance("input-histogram"); } if (!first) xo_close_list("input-histogram"); xo_open_container("mbuf-statistics"); xo_emit("\t{T:Mbuf statistics}:\n"); xo_emit("\t\t{:one-mbuf/%ju} {N:/one mbuf}\n", (uintmax_t)ip6stat.ip6s_m1); for (first = 1, i = 0; i < IP6S_M2MMAX; i++) { char ifbuf[IFNAMSIZ]; if (ip6stat.ip6s_m2m[i] != 0) { if (first) { xo_emit("\t\t{N:two or more mbuf}:\n"); xo_open_list("mbuf-data"); first = 0; } xo_open_instance("mbuf-data"); xo_emit("\t\t\t{k:name/%s}= {:count/%ju}\n", if_indextoname(i, ifbuf), (uintmax_t)ip6stat.ip6s_m2m[i]); xo_close_instance("mbuf-data"); } } if (!first) xo_close_list("mbuf-data"); xo_emit("\t\t{:one-extra-mbuf/%ju} {N:one ext mbuf}\n", (uintmax_t)ip6stat.ip6s_mext1); xo_emit("\t\t{:two-or-more-extra-mbufs/%ju} " "{N:/two or more ext mbuf}\n", (uintmax_t)ip6stat.ip6s_mext2m); xo_close_container("mbuf-statistics"); p(ip6s_exthdrtoolong, "\t{:dropped-header-too-long/%ju} " "{N:/packet%s whose headers are not contiguous}\n"); p(ip6s_nogif, "\t{:discard-tunnel-no-gif/%ju} " "{N:/tunneling packet%s that can't find gif}\n"); p(ip6s_toomanyhdr, "\t{:dropped-too-many-headers/%ju} " "{N:/packet%s discarded because of too many headers}\n"); /* for debugging source address selection */ #define PRINT_SCOPESTAT(s,i) do {\ switch(i) { /* XXX hardcoding in each case */\ case 1:\ p(s, "\t\t{ke:name/interface-locals}{:count/%ju} " \ "{N:/interface-local%s}\n"); \ break;\ case 2:\ p(s,"\t\t{ke:name/link-locals}{:count/%ju} " \ "{N:/link-local%s}\n"); \ break;\ case 5:\ p(s,"\t\t{ke:name/site-locals}{:count/%ju} " \ "{N:/site-local%s}\n");\ break;\ case 14:\ p(s,"\t\t{ke:name/globals}{:count/%ju} " \ "{N:/global%s}\n");\ break;\ default:\ xo_emit("\t\t{qke:name/%x}{:count/%ju} " \ "addresses scope=%x\n",\ i, (uintmax_t)ip6stat.s, i); \ }\ } while (0); xo_open_container("source-address-selection"); p(ip6s_sources_none, "\t{:address-selection-failures/%ju} " "{N:/failure%s of source address selection}\n"); for (first = 1, i = 0; i < IP6S_SCOPECNT; i++) { if (ip6stat.ip6s_sources_sameif[i]) { if (first) { xo_open_list("outgoing-interface"); xo_emit("\tsource addresses on an outgoing " "I/F\n"); first = 0; } xo_open_instance("outgoing-interface"); PRINT_SCOPESTAT(ip6s_sources_sameif[i], i); xo_close_instance("outgoing-interface"); } } if (!first) xo_close_list("outgoing-interface"); for (first = 1, i = 0; i < IP6S_SCOPECNT; i++) { if (ip6stat.ip6s_sources_otherif[i]) { if (first) { xo_open_list("non-outgoing-interface"); xo_emit("\tsource addresses on a non-outgoing " "I/F\n"); first = 0; } xo_open_instance("non-outgoing-interface"); PRINT_SCOPESTAT(ip6s_sources_otherif[i], i); xo_close_instance("non-outgoing-interface"); } } if (!first) xo_close_list("non-outgoing-interface"); for (first = 1, i = 0; i < IP6S_SCOPECNT; i++) { if (ip6stat.ip6s_sources_samescope[i]) { if (first) { xo_open_list("same-source"); xo_emit("\tsource addresses of same scope\n"); first = 0; } xo_open_instance("same-source"); PRINT_SCOPESTAT(ip6s_sources_samescope[i], i); xo_close_instance("same-source"); } } if (!first) xo_close_list("same-source"); for (first = 1, i = 0; i < IP6S_SCOPECNT; i++) { if (ip6stat.ip6s_sources_otherscope[i]) { if (first) { xo_open_list("different-scope"); xo_emit("\tsource addresses of a different " "scope\n"); first = 0; } xo_open_instance("different-scope"); PRINT_SCOPESTAT(ip6s_sources_otherscope[i], i); xo_close_instance("different-scope"); } } if (!first) xo_close_list("different-scope"); for (first = 1, i = 0; i < IP6S_SCOPECNT; i++) { if (ip6stat.ip6s_sources_deprecated[i]) { if (first) { xo_open_list("deprecated-source"); xo_emit("\tdeprecated source addresses\n"); first = 0; } xo_open_instance("deprecated-source"); PRINT_SCOPESTAT(ip6s_sources_deprecated[i], i); xo_close_instance("deprecated-source"); } } if (!first) xo_close_list("deprecated-source"); for (first = 1, i = 0; i < IP6S_RULESMAX; i++) { if (ip6stat.ip6s_sources_rule[i]) { if (first) { xo_open_list("rules-applied"); xo_emit("\t{T:Source addresses selection " "rule applied}:\n"); first = 0; } xo_open_instance("rules-applied"); xo_emit("\t\t{ke:name/%s}{:count/%ju} {d:name/%s}\n", srcrule_str[i], (uintmax_t)ip6stat.ip6s_sources_rule[i], srcrule_str[i]); xo_close_instance("rules-applied"); } } if (!first) xo_close_list("rules-applied"); xo_close_container("source-address-selection"); #undef p #undef p1a xo_close_container(name); }
/* * Dump IP6 statistics structure. */ void ip6_stats(u_long off, char *name) { struct ip6stat ip6stat; int first, i; struct protoent *ep; const char *n; if (off == 0) return; kread(off, (char *)&ip6stat, sizeof (ip6stat)); printf("%s:\n", name); #define p(f, m) if (ip6stat.f || sflag <= 1) \ printf(m, (unsigned long long)ip6stat.f, plural(ip6stat.f)) #define p1(f, m) if (ip6stat.f || sflag <= 1) \ printf(m, (unsigned long long)ip6stat.f) p(ip6s_total, "\t%llu total packet%s received\n"); p1(ip6s_toosmall, "\t%llu with size smaller than minimum\n"); p1(ip6s_tooshort, "\t%llu with data size < data length\n"); p1(ip6s_badoptions, "\t%llu with bad options\n"); p1(ip6s_badvers, "\t%llu with incorrect version number\n"); p(ip6s_fragments, "\t%llu fragment%s received\n"); p(ip6s_fragdropped, "\t%llu fragment%s dropped (duplicates or out of space)\n"); p(ip6s_fragtimeout, "\t%llu fragment%s dropped after timeout\n"); p(ip6s_fragoverflow, "\t%llu fragment%s that exceeded limit\n"); p(ip6s_reassembled, "\t%llu packet%s reassembled ok\n"); p(ip6s_delivered, "\t%llu packet%s for this host\n"); p(ip6s_forward, "\t%llu packet%s forwarded\n"); p(ip6s_cantforward, "\t%llu packet%s not forwardable\n"); p(ip6s_redirectsent, "\t%llu redirect%s sent\n"); p(ip6s_localout, "\t%llu packet%s sent from this host\n"); p(ip6s_rawout, "\t%llu packet%s sent with fabricated ip header\n"); p(ip6s_odropped, "\t%llu output packet%s dropped due to no bufs, etc.\n"); p(ip6s_noroute, "\t%llu output packet%s discarded due to no route\n"); p(ip6s_fragmented, "\t%llu output datagram%s fragmented\n"); p(ip6s_ofragments, "\t%llu fragment%s created\n"); p(ip6s_cantfrag, "\t%llu datagram%s that can't be fragmented\n"); p(ip6s_badscope, "\t%llu packet%s that violated scope rules\n"); p(ip6s_notmember, "\t%llu multicast packet%s which we don't join\n"); for (first = 1, i = 0; i < 256; i++) if (ip6stat.ip6s_nxthist[i] != 0) { if (first) { printf("\tInput packet histogram:\n"); first = 0; } n = NULL; if (ip6nh[i]) n = ip6nh[i]; else if ((ep = getprotobynumber(i)) != NULL) n = ep->p_name; if (n) printf("\t\t%s: %llu\n", n, (unsigned long long)ip6stat.ip6s_nxthist[i]); else printf("\t\t#%d: %llu\n", i, (unsigned long long)ip6stat.ip6s_nxthist[i]); } printf("\tMbuf statistics:\n"); p(ip6s_m1, "\t\t%llu one mbuf%s\n"); for (first = 1, i = 0; i < 32; i++) { char ifbuf[IFNAMSIZ]; if (ip6stat.ip6s_m2m[i] != 0) { if (first) { printf("\t\ttwo or more mbuf:\n"); first = 0; } printf("\t\t\t%s = %llu\n", if_indextoname(i, ifbuf), (unsigned long long)ip6stat.ip6s_m2m[i]); } } p(ip6s_mext1, "\t\t%llu one ext mbuf%s\n"); p(ip6s_mext2m, "\t\t%llu two or more ext mbuf%s\n"); p(ip6s_exthdrtoolong, "\t%llu packet%s whose headers are not continuous\n"); p(ip6s_nogif, "\t%llu tunneling packet%s that can't find gif\n"); p(ip6s_toomanyhdr, "\t%llu packet%s discarded due to too many headers\n"); /* for debugging source address selection */ #define PRINT_SCOPESTAT(s,i) do {\ switch(i) { /* XXX hardcoding in each case */\ case 1:\ p(s, "\t\t%llu node-local%s\n");\ break;\ case 2:\ p(s, "\t\t%llu link-local%s\n");\ break;\ case 5:\ p(s, "\t\t%llu site-local%s\n");\ break;\ case 14:\ p(s, "\t\t%llu global%s\n");\ break;\ default:\ printf("\t\t%llu addresses scope=%x\n",\ (unsigned long long)ip6stat.s, i);\ }\ } while(0); p(ip6s_sources_none, "\t%llu failure%s of source address selection\n"); for (first = 1, i = 0; i < 16; i++) { if (ip6stat.ip6s_sources_sameif[i]) { if (first) { printf("\tsource addresses on an outgoing I/F\n"); first = 0; } PRINT_SCOPESTAT(ip6s_sources_sameif[i], i); } } for (first = 1, i = 0; i < 16; i++) { if (ip6stat.ip6s_sources_otherif[i]) { if (first) { printf("\tsource addresses on a non-outgoing I/F\n"); first = 0; } PRINT_SCOPESTAT(ip6s_sources_otherif[i], i); } } for (first = 1, i = 0; i < 16; i++) { if (ip6stat.ip6s_sources_samescope[i]) { if (first) { printf("\tsource addresses of same scope\n"); first = 0; } PRINT_SCOPESTAT(ip6s_sources_samescope[i], i); } } for (first = 1, i = 0; i < 16; i++) { if (ip6stat.ip6s_sources_otherscope[i]) { if (first) { printf("\tsource addresses of a different scope\n"); first = 0; } PRINT_SCOPESTAT(ip6s_sources_otherscope[i], i); } } for (first = 1, i = 0; i < 16; i++) { if (ip6stat.ip6s_sources_deprecated[i]) { if (first) { printf("\tdeprecated source addresses\n"); first = 0; } PRINT_SCOPESTAT(ip6s_sources_deprecated[i], i); } } p1(ip6s_forward_cachehit, "\t%llu forward cache hit\n"); p1(ip6s_forward_cachemiss, "\t%llu forward cache miss\n"); #undef p #undef p1 }
/* * Dump IP6 statistics structure. */ void ip6_stats(u_long off __unused, const char *name, int af1 __unused) { struct ip6stat ip6stat; int first, i; int mib[4]; size_t len; mib[0] = CTL_NET; mib[1] = PF_INET6; mib[2] = IPPROTO_IPV6; mib[3] = IPV6CTL_STATS; len = sizeof ip6stat; memset(&ip6stat, 0, len); if (sysctl(mib, 4, &ip6stat, &len, NULL, 0) < 0) return; printf("%s:\n", name); #define p(f, m) if (ip6stat.f || sflag <= 1) \ printf(m, (unsigned long long)ip6stat.f, plural(ip6stat.f)) #define p1a(f, m) if (ip6stat.f || sflag <= 1) \ printf(m, (unsigned long long)ip6stat.f) p(ip6s_total, "\t%llu total packet%s received\n"); p1a(ip6s_toosmall, "\t%llu with size smaller than minimum\n"); p1a(ip6s_tooshort, "\t%llu with data size < data length\n"); p1a(ip6s_badoptions, "\t%llu with bad options\n"); p1a(ip6s_badvers, "\t%llu with incorrect version number\n"); p(ip6s_fragments, "\t%llu fragment%s received\n"); p(ip6s_fragdropped, "\t%llu fragment%s dropped (dup or out of space)\n"); p(ip6s_fragtimeout, "\t%llu fragment%s dropped after timeout\n"); p(ip6s_fragoverflow, "\t%llu fragment%s that exceeded limit\n"); p(ip6s_reassembled, "\t%llu packet%s reassembled ok\n"); p(ip6s_delivered, "\t%llu packet%s for this host\n"); p(ip6s_forward, "\t%llu packet%s forwarded\n"); p(ip6s_cantforward, "\t%llu packet%s not forwardable\n"); p(ip6s_redirectsent, "\t%llu redirect%s sent\n"); p(ip6s_localout, "\t%llu packet%s sent from this host\n"); p(ip6s_rawout, "\t%llu packet%s sent with fabricated ip header\n"); p(ip6s_odropped, "\t%llu output packet%s dropped due to no bufs, etc.\n"); p(ip6s_noroute, "\t%llu output packet%s discarded due to no route\n"); p(ip6s_fragmented, "\t%llu output datagram%s fragmented\n"); p(ip6s_ofragments, "\t%llu fragment%s created\n"); p(ip6s_cantfrag, "\t%llu datagram%s that can't be fragmented\n"); p(ip6s_badscope, "\t%llu packet%s that violated scope rules\n"); p(ip6s_notmember, "\t%llu multicast packet%s which we don't join\n"); for (first = 1, i = 0; i < 256; i++) if (ip6stat.ip6s_nxthist[i] != 0) { if (first) { printf("\tInput histogram:\n"); first = 0; } printf("\t\t%s: %llu\n", ip6nh[i], (unsigned long long)ip6stat.ip6s_nxthist[i]); } printf("\tMbuf statistics:\n"); printf("\t\t%llu one mbuf\n", (unsigned long long)ip6stat.ip6s_m1); for (first = 1, i = 0; i < 32; i++) { char ifbuf[IFNAMSIZ]; if (ip6stat.ip6s_m2m[i] != 0) { if (first) { printf("\t\ttwo or more mbuf:\n"); first = 0; } printf("\t\t\t%s= %llu\n", if_indextoname(i, ifbuf), (unsigned long long)ip6stat.ip6s_m2m[i]); } } printf("\t\t%llu one ext mbuf\n", (unsigned long long)ip6stat.ip6s_mext1); printf("\t\t%llu two or more ext mbuf\n", (unsigned long long)ip6stat.ip6s_mext2m); p(ip6s_exthdrtoolong, "\t%llu packet%s whose headers are not continuous\n"); p(ip6s_nogif, "\t%llu tunneling packet%s that can't find gif\n"); p(ip6s_toomanyhdr, "\t%llu packet%s discarded due to too may headers\n"); /* for debugging source address selection */ #define PRINT_SCOPESTAT(s,i) do {\ switch(i) { /* XXX hardcoding in each case */\ case 1:\ p(s, "\t\t%llu node-local%s\n");\ break;\ case 2:\ p(s,"\t\t%llu link-local%s\n");\ break;\ case 5:\ p(s,"\t\t%llu site-local%s\n");\ break;\ case 14:\ p(s,"\t\t%llu global%s\n");\ break;\ default:\ printf("\t\t%llu addresses scope=%x\n",\ (unsigned long long)ip6stat.s, i);\ }\ } while (0); p(ip6s_sources_none, "\t%llu failure%s of source address selection\n"); for (first = 1, i = 0; i < 16; i++) { if (ip6stat.ip6s_sources_sameif[i]) { if (first) { printf("\tsource addresses on an outgoing I/F\n"); first = 0; } PRINT_SCOPESTAT(ip6s_sources_sameif[i], i); } } for (first = 1, i = 0; i < 16; i++) { if (ip6stat.ip6s_sources_otherif[i]) { if (first) { printf("\tsource addresses on a non-outgoing I/F\n"); first = 0; } PRINT_SCOPESTAT(ip6s_sources_otherif[i], i); } } for (first = 1, i = 0; i < 16; i++) { if (ip6stat.ip6s_sources_samescope[i]) { if (first) { printf("\tsource addresses of same scope\n"); first = 0; } PRINT_SCOPESTAT(ip6s_sources_samescope[i], i); } } for (first = 1, i = 0; i < 16; i++) { if (ip6stat.ip6s_sources_otherscope[i]) { if (first) { printf("\tsource addresses of a different scope\n"); first = 0; } PRINT_SCOPESTAT(ip6s_sources_otherscope[i], i); } } for (first = 1, i = 0; i < 16; i++) { if (ip6stat.ip6s_sources_deprecated[i]) { if (first) { printf("\tdeprecated source addresses\n"); first = 0; } PRINT_SCOPESTAT(ip6s_sources_deprecated[i], i); } } p1a(ip6s_forward_cachehit, "\t%llu forward cache hit\n"); p1a(ip6s_forward_cachemiss, "\t%llu forward cache miss\n"); #undef p #undef p1a }