/* * Dump ICMP6 statistics. */ void icmp6_stats(u_long off, const char *name, int af1 __unused, int proto __unused) { struct icmp6stat icmp6stat, zerostat; int i, first; size_t len; len = sizeof icmp6stat; if (live) { memset(&icmp6stat, 0, len); if (zflag) memset(&zerostat, 0, len); if (sysctlbyname("net.inet6.icmp6.stats", &icmp6stat, &len, zflag ? &zerostat : NULL, zflag ? len : 0) < 0) { if (errno != ENOENT) warn("sysctl: net.inet6.icmp6.stats"); return; } } else kread_counters(off, &icmp6stat, len); printf("%s:\n", name); #define p(f, m) if (icmp6stat.f || sflag <= 1) \ printf(m, (uintmax_t)icmp6stat.f, plural(icmp6stat.f)) #define p_5(f, m) if (icmp6stat.f || sflag <= 1) \ printf(m, (uintmax_t)icmp6stat.f) p(icp6s_error, "\t%ju call%s to icmp6_error\n"); p(icp6s_canterror, "\t%ju error%s not generated in response to an icmp6 message\n"); p(icp6s_toofreq, "\t%ju error%s not generated because of rate limitation\n"); #define NELEM (int)(sizeof(icmp6stat.icp6s_outhist)/sizeof(icmp6stat.icp6s_outhist[0])) for (first = 1, i = 0; i < NELEM; i++) if (icmp6stat.icp6s_outhist[i] != 0) { if (first) { printf("\tOutput histogram:\n"); first = 0; } printf("\t\t%s: %ju\n", icmp6names[i], (uintmax_t)icmp6stat.icp6s_outhist[i]); } #undef NELEM p(icp6s_badcode, "\t%ju message%s with bad code fields\n"); p(icp6s_tooshort, "\t%ju message%s < minimum length\n"); p(icp6s_checksum, "\t%ju bad checksum%s\n"); p(icp6s_badlen, "\t%ju message%s with bad length\n"); #define NELEM (int)(sizeof(icmp6stat.icp6s_inhist)/sizeof(icmp6stat.icp6s_inhist[0])) for (first = 1, i = 0; i < NELEM; i++) if (icmp6stat.icp6s_inhist[i] != 0) { if (first) { printf("\tInput histogram:\n"); first = 0; } printf("\t\t%s: %ju\n", icmp6names[i], (uintmax_t)icmp6stat.icp6s_inhist[i]); } #undef NELEM printf("\tHistogram of error messages to be generated:\n"); p_5(icp6s_odst_unreach_noroute, "\t\t%ju no route\n"); p_5(icp6s_odst_unreach_admin, "\t\t%ju administratively prohibited\n"); p_5(icp6s_odst_unreach_beyondscope, "\t\t%ju beyond scope\n"); p_5(icp6s_odst_unreach_addr, "\t\t%ju address unreachable\n"); p_5(icp6s_odst_unreach_noport, "\t\t%ju port unreachable\n"); p_5(icp6s_opacket_too_big, "\t\t%ju packet too big\n"); p_5(icp6s_otime_exceed_transit, "\t\t%ju time exceed transit\n"); p_5(icp6s_otime_exceed_reassembly, "\t\t%ju time exceed reassembly\n"); p_5(icp6s_oparamprob_header, "\t\t%ju erroneous header field\n"); p_5(icp6s_oparamprob_nextheader, "\t\t%ju unrecognized next header\n"); p_5(icp6s_oparamprob_option, "\t\t%ju unrecognized option\n"); p_5(icp6s_oredirect, "\t\t%ju redirect\n"); p_5(icp6s_ounknown, "\t\t%ju unknown\n"); p(icp6s_reflect, "\t%ju message response%s generated\n"); p(icp6s_nd_toomanyopt, "\t%ju message%s with too many ND options\n"); p(icp6s_nd_badopt, "\t%ju message%s with bad ND options\n"); p(icp6s_badns, "\t%ju bad neighbor solicitation message%s\n"); p(icp6s_badna, "\t%ju bad neighbor advertisement message%s\n"); p(icp6s_badrs, "\t%ju bad router solicitation message%s\n"); p(icp6s_badra, "\t%ju bad router advertisement message%s\n"); p(icp6s_badredirect, "\t%ju bad redirect message%s\n"); p(icp6s_pmtuchg, "\t%ju path MTU change%s\n"); #undef p #undef p_5 }
/* * Dump ICMP6 statistics. */ void icmp6_stats(u_long off, const char *name, int af1 __unused, int proto __unused) { struct icmp6stat icmp6stat, zerostat; int i, first; size_t len; len = sizeof icmp6stat; if (live) { memset(&icmp6stat, 0, len); if (zflag) memset(&zerostat, 0, len); if (sysctlbyname("net.inet6.icmp6.stats", &icmp6stat, &len, zflag ? &zerostat : NULL, zflag ? len : 0) < 0) { if (errno != ENOENT) xo_warn("sysctl: net.inet6.icmp6.stats"); return; } } else kread_counters(off, &icmp6stat, len); xo_emit("{T:/%s}:\n", name); xo_open_container(name); #define p(f, m) if (icmp6stat.f || sflag <= 1) \ xo_emit(m, (uintmax_t)icmp6stat.f, plural(icmp6stat.f)) #define p_5(f, m) if (icmp6stat.f || sflag <= 1) \ xo_emit(m, (uintmax_t)icmp6stat.f) p(icp6s_error, "\t{:icmp6-calls/%ju} " "{N:/call%s to icmp6_error}\n"); p(icp6s_canterror, "\t{:errors-not-generated-from-message/%ju} " "{N:/error%s not generated in response to an icmp6 message}\n"); p(icp6s_toofreq, "\t{:errors-discarded-by-rate-limitation/%ju} " "{N:/error%s not generated because of rate limitation}\n"); #define NELEM (int)(sizeof(icmp6stat.icp6s_outhist)/sizeof(icmp6stat.icp6s_outhist[0])) for (first = 1, i = 0; i < NELEM; i++) if (icmp6stat.icp6s_outhist[i] != 0) { if (first) { xo_open_list("output-histogram"); xo_emit("\t{T:Output histogram}:\n"); first = 0; } xo_open_instance("output-histogram"); xo_emit("\t\t{k:name/%s}: {:count/%ju}\n", icmp6names[i], (uintmax_t)icmp6stat.icp6s_outhist[i]); xo_close_instance("output-histogram"); } if (!first) xo_close_list("output-histogram"); #undef NELEM p(icp6s_badcode, "\t{:dropped-bad-code/%ju} " "{N:/message%s with bad code fields}\n"); p(icp6s_tooshort, "\t{:dropped-too-short/%ju} " "{N:/message%s < minimum length}\n"); p(icp6s_checksum, "\t{:dropped-bad-checksum/%ju} " "{N:/bad checksum%s}\n"); p(icp6s_badlen, "\t{:dropped-bad-length/%ju} " "{N:/message%s with bad length}\n"); #define NELEM (int)(sizeof(icmp6stat.icp6s_inhist)/sizeof(icmp6stat.icp6s_inhist[0])) for (first = 1, i = 0; i < NELEM; i++) if (icmp6stat.icp6s_inhist[i] != 0) { if (first) { xo_open_list("input-histogram"); xo_emit("\t{T:Input histogram}:\n"); first = 0; } xo_open_instance("input-histogram"); xo_emit("\t\t{k:name/%s}: {:count/%ju}\n", icmp6names[i], (uintmax_t)icmp6stat.icp6s_inhist[i]); xo_close_instance("input-histogram"); } if (!first) xo_close_list("input-histogram"); #undef NELEM xo_emit("\t{T:Histogram of error messages to be generated}:\n"); xo_open_container("errors"); p_5(icp6s_odst_unreach_noroute, "\t\t{:no-route/%ju} " "{N:/no route}\n"); p_5(icp6s_odst_unreach_admin, "\t\t{:admin-prohibited/%ju} " "{N:/administratively prohibited}\n"); p_5(icp6s_odst_unreach_beyondscope, "\t\t{:beyond-scope/%ju} " "{N:/beyond scope}\n"); p_5(icp6s_odst_unreach_addr, "\t\t{:address-unreachable/%ju} " "{N:/address unreachable}\n"); p_5(icp6s_odst_unreach_noport, "\t\t{:port-unreachable/%ju} " "{N:/port unreachable}\n"); p_5(icp6s_opacket_too_big, "\t\t{:packet-too-big/%ju} " "{N:/packet too big}\n"); p_5(icp6s_otime_exceed_transit, "\t\t{:time-exceed-transmit/%ju} " "{N:/time exceed transit}\n"); p_5(icp6s_otime_exceed_reassembly, "\t\t{:time-exceed-reassembly/%ju} " "{N:/time exceed reassembly}\n"); p_5(icp6s_oparamprob_header, "\t\t{:bad-header/%ju} " "{N:/erroneous header field}\n"); p_5(icp6s_oparamprob_nextheader, "\t\t{:bad-next-header/%ju} " "{N:/unrecognized next header}\n"); p_5(icp6s_oparamprob_option, "\t\t{:bad-option/%ju} " "{N:/unrecognized option}\n"); p_5(icp6s_oredirect, "\t\t{:redirects/%ju} " "{N:/redirect}\n"); p_5(icp6s_ounknown, "\t\t{:unknown/%ju} {N:unknown}\n"); p(icp6s_reflect, "\t{:reflect/%ju} " "{N:/message response%s generated}\n"); p(icp6s_nd_toomanyopt, "\t{:too-many-nd-options/%ju} " "{N:/message%s with too many ND options}\n"); p(icp6s_nd_badopt, "\t{:bad-nd-options/%ju} " "{N:/message%s with bad ND options}\n"); p(icp6s_badns, "\t{:bad-neighbor-solicitation/%ju} " "{N:/bad neighbor solicitation message%s}\n"); p(icp6s_badna, "\t{:bad-neighbor-advertisement/%ju} " "{N:/bad neighbor advertisement message%s}\n"); p(icp6s_badrs, "\t{:bad-router-solicitation/%ju} " "{N:/bad router solicitation message%s}\n"); p(icp6s_badra, "\t{:bad-router-advertisement/%ju} " "{N:/bad router advertisement message%s}\n"); p(icp6s_badredirect, "\t{:bad-redirect/%ju} " "{N:/bad redirect message%s}\n"); xo_close_container("errors"); p(icp6s_pmtuchg, "\t{:path-mtu-changes/%ju} {N:/path MTU change%s}\n"); #undef p #undef p_5 xo_close_container(name); }
/* * Dump ICMPv6 statistics. */ void icmp6_stats(u_long off, char *name) { struct icmp6stat icmp6stat; int i, first; if (off == 0) return; kread(off, (char *)&icmp6stat, sizeof (icmp6stat)); printf("%s:\n", name); #define p(f, m) if (icmp6stat.f || sflag <= 1) \ printf(m, (unsigned long long)icmp6stat.f, plural(icmp6stat.f)) #define p_5(f, m) if (icmp6stat.f || sflag <= 1) \ printf(m, (unsigned long long)icmp6stat.f) p(icp6s_error, "\t%llu call%s to icmp6_error\n"); p(icp6s_canterror, "\t%llu error%s not generated because old message was icmp6 or so\n"); p(icp6s_toofreq, "\t%llu error%s not generated because of rate limitation\n"); #define NELEM (sizeof(icmp6stat.icp6s_outhist)/sizeof(icmp6stat.icp6s_outhist[0])) for (first = 1, i = 0; i < NELEM; i++) if (icmp6stat.icp6s_outhist[i] != 0) { if (first) { printf("\tOutput packet histogram:\n"); first = 0; } printf("\t\t%s: %llu\n", icmp6names[i], (unsigned long long)icmp6stat.icp6s_outhist[i]); } #undef NELEM p(icp6s_badcode, "\t%llu message%s with bad code fields\n"); p(icp6s_tooshort, "\t%llu message%s < minimum length\n"); p(icp6s_checksum, "\t%llu bad checksum%s\n"); p(icp6s_badlen, "\t%llu message%s with bad length\n"); #define NELEM (sizeof(icmp6stat.icp6s_inhist)/sizeof(icmp6stat.icp6s_inhist[0])) for (first = 1, i = 0; i < NELEM; i++) if (icmp6stat.icp6s_inhist[i] != 0) { if (first) { printf("\tInput packet histogram:\n"); first = 0; } printf("\t\t%s: %llu\n", icmp6names[i], (unsigned long long)icmp6stat.icp6s_inhist[i]); } #undef NELEM printf("\tHistogram of error messages to be generated:\n"); p_5(icp6s_odst_unreach_noroute, "\t\t%llu no route\n"); p_5(icp6s_odst_unreach_admin, "\t\t%llu administratively prohibited\n"); p_5(icp6s_odst_unreach_beyondscope, "\t\t%llu beyond scope\n"); p_5(icp6s_odst_unreach_addr, "\t\t%llu address unreachable\n"); p_5(icp6s_odst_unreach_noport, "\t\t%llu port unreachable\n"); p_5(icp6s_opacket_too_big, "\t\t%llu packet too big\n"); p_5(icp6s_otime_exceed_transit, "\t\t%llu time exceed transit\n"); p_5(icp6s_otime_exceed_reassembly, "\t\t%llu time exceed reassembly\n"); p_5(icp6s_oparamprob_header, "\t\t%llu erroneous header field\n"); p_5(icp6s_oparamprob_nextheader, "\t\t%llu unrecognized next header\n"); p_5(icp6s_oparamprob_option, "\t\t%llu unrecognized option\n"); p_5(icp6s_oredirect, "\t\t%llu redirect\n"); p_5(icp6s_ounknown, "\t\t%llu unknown\n"); p(icp6s_reflect, "\t%llu message response%s generated\n"); p(icp6s_nd_toomanyopt, "\t%llu message%s with too many ND options\n"); p(icp6s_nd_badopt, "\t%llu message%s with bad ND options\n"); p(icp6s_badns, "\t%llu bad neighbor solicitation message%s\n"); p(icp6s_badna, "\t%llu bad neighbor advertisement message%s\n"); p(icp6s_badrs, "\t%llu bad router solicitation message%s\n"); p(icp6s_badra, "\t%llu bad router advertisement message%s\n"); p(icp6s_badredirect, "\t%llu bad redirect message%s\n"); p(icp6s_pmtuchg, "\t%llu path MTU change%s\n"); #undef p #undef p_5 }
/* * Dump ICMP6 statistics. */ void icmp6_stats(u_long off __unused, const char *name, int af1 __unused) { struct icmp6stat icmp6stat; int first; int mib[4]; size_t i, len; mib[0] = CTL_NET; mib[1] = PF_INET6; mib[2] = IPPROTO_ICMPV6; mib[3] = ICMPV6CTL_STATS; len = sizeof icmp6stat; memset(&icmp6stat, 0, len); if (sysctl(mib, 4, &icmp6stat, &len, NULL, 0) < 0) return; printf("%s:\n", name); #define p(f, m) if (icmp6stat.f || sflag <= 1) \ printf(m, (unsigned long long)icmp6stat.f, plural(icmp6stat.f)) #define p_5(f, m) printf(m, (unsigned long long)icmp6stat.f) p(icp6s_error, "\t%llu call%s to icmp_error\n"); p(icp6s_canterror, "\t%llu error%s not generated because old message was icmp error or so\n"); p(icp6s_toofreq, "\t%llu error%s not generated because rate limitation\n"); for (first = 1, i = 0; i < NELEM(icmp6stat.icp6s_outhist); i++) if (icmp6stat.icp6s_outhist[i] != 0) { if (first) { printf("\tOutput histogram:\n"); first = 0; } printf("\t\t%s: %llu\n", icmp6names[i], (unsigned long long)icmp6stat.icp6s_outhist[i]); } p(icp6s_badcode, "\t%llu message%s with bad code fields\n"); p(icp6s_tooshort, "\t%llu message%s < minimum length\n"); p(icp6s_checksum, "\t%llu bad checksum%s\n"); p(icp6s_badlen, "\t%llu message%s with bad length\n"); for (first = 1, i = 0; i < NELEM(icmp6stat.icp6s_inhist); i++) if (icmp6stat.icp6s_inhist[i] != 0) { if (first) { printf("\tInput histogram:\n"); first = 0; } printf("\t\t%s: %llu\n", icmp6names[i], (unsigned long long)icmp6stat.icp6s_inhist[i]); } printf("\tHistogram of error messages to be generated:\n"); p_5(icp6s_odst_unreach_noroute, "\t\t%llu no route\n"); p_5(icp6s_odst_unreach_admin, "\t\t%llu administratively prohibited\n"); p_5(icp6s_odst_unreach_beyondscope, "\t\t%llu beyond scope\n"); p_5(icp6s_odst_unreach_addr, "\t\t%llu address unreachable\n"); p_5(icp6s_odst_unreach_noport, "\t\t%llu port unreachable\n"); p_5(icp6s_opacket_too_big, "\t\t%llu packet too big\n"); p_5(icp6s_otime_exceed_transit, "\t\t%llu time exceed transit\n"); p_5(icp6s_otime_exceed_reassembly, "\t\t%llu time exceed reassembly\n"); p_5(icp6s_oparamprob_header, "\t\t%llu erroneous header field\n"); p_5(icp6s_oparamprob_nextheader, "\t\t%llu unrecognized next header\n"); p_5(icp6s_oparamprob_option, "\t\t%llu unrecognized option\n"); p_5(icp6s_oredirect, "\t\t%llu redirect\n"); p_5(icp6s_ounknown, "\t\t%llu unknown\n"); p(icp6s_reflect, "\t%llu message response%s generated\n"); p(icp6s_nd_toomanyopt, "\t%llu message%s with too many ND options\n"); p(icp6s_nd_badopt, "\t%qu message%s with bad ND options\n"); p(icp6s_badns, "\t%qu bad neighbor solicitation message%s\n"); p(icp6s_badna, "\t%qu bad neighbor advertisement message%s\n"); p(icp6s_badrs, "\t%qu bad router solicitation message%s\n"); p(icp6s_badra, "\t%qu bad router advertisement message%s\n"); p(icp6s_badredirect, "\t%qu bad redirect message%s\n"); p(icp6s_pmtuchg, "\t%llu path MTU change%s\n"); #undef p #undef p_5 }