Use a common subroutine to fetch and zero protocol stats instead of
duplicating roughly similar code for each protocol. MFC after: 2 weeks
This commit is contained in:
parent
7297c5e535
commit
9eddb899d9
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=287649
@ -28,13 +28,15 @@
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/sysctl.h>
|
||||
|
||||
#include <net/flowtable.h>
|
||||
#include <err.h>
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "netstat.h"
|
||||
|
||||
/*
|
||||
@ -68,17 +70,18 @@ void
|
||||
flowtable_stats(void)
|
||||
{
|
||||
struct flowtable_stat stat;
|
||||
size_t len = sizeof(stat);
|
||||
|
||||
if (!live)
|
||||
return;
|
||||
|
||||
if (sysctlbyname("net.flowtable.ip4.stat", &stat, &len, NULL, 0) == 0) {
|
||||
if (fetch_stats("net.flowtable.ip4.stat", 0, &stat,
|
||||
sizeof(stat), NULL) == 0) {
|
||||
printf("flowtable for IPv4:\n");
|
||||
print_stats(&stat);
|
||||
}
|
||||
|
||||
if (sysctlbyname("net.flowtable.ip6.stat", &stat, &len, NULL, 0) == 0) {
|
||||
if (fetch_stats("net.flowtable.ip6.stat", 0, &stat,
|
||||
sizeof(stat), NULL) == 0) {
|
||||
printf("flowtable for IPv6:\n");
|
||||
print_stats(&stat);
|
||||
}
|
||||
|
@ -41,7 +41,6 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/protosw.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/socketvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include <net/if.h>
|
||||
@ -134,20 +133,11 @@ pfsync_acts_stats(const char *list, const char *desc, uint64_t *a)
|
||||
void
|
||||
pfsync_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
|
||||
{
|
||||
struct pfsyncstats pfsyncstat, zerostat;
|
||||
size_t len = sizeof(struct pfsyncstats);
|
||||
struct pfsyncstats pfsyncstat;
|
||||
|
||||
if (live) {
|
||||
if (zflag)
|
||||
memset(&zerostat, 0, len);
|
||||
if (sysctlbyname("net.pfsync.stats", &pfsyncstat, &len,
|
||||
zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
|
||||
if (errno != ENOENT)
|
||||
warn("sysctl: net.pfsync.stats");
|
||||
return;
|
||||
}
|
||||
} else
|
||||
kread(off, &pfsyncstat, len);
|
||||
if (fetch_stats("net.pfsync.stats", off, &pfsyncstat,
|
||||
sizeof(pfsyncstat), kread) != 0)
|
||||
return;
|
||||
|
||||
xo_emit("{T:/%s}:\n", name);
|
||||
xo_open_container(name);
|
||||
|
@ -627,8 +627,7 @@ protopr(u_long off, const char *name, int af1, int proto)
|
||||
void
|
||||
tcp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
|
||||
{
|
||||
struct tcpstat tcpstat, zerostat;
|
||||
size_t len = sizeof tcpstat;
|
||||
struct tcpstat tcpstat;
|
||||
|
||||
#ifdef INET6
|
||||
if (tcp_done != 0)
|
||||
@ -637,16 +636,9 @@ tcp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
|
||||
tcp_done = 1;
|
||||
#endif
|
||||
|
||||
if (live) {
|
||||
if (zflag)
|
||||
memset(&zerostat, 0, len);
|
||||
if (sysctlbyname("net.inet.tcp.stats", &tcpstat, &len,
|
||||
zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
|
||||
xo_warn("sysctl: net.inet.tcp.stats");
|
||||
return;
|
||||
}
|
||||
} else
|
||||
kread_counters(off, &tcpstat, len);
|
||||
if (fetch_stats("net.inet.tcp.stats", off, &tcpstat,
|
||||
sizeof(tcpstat), kread_counters) != 0)
|
||||
return;
|
||||
|
||||
xo_open_container("tcp");
|
||||
xo_emit("{T:/%s}:\n", name);
|
||||
@ -860,8 +852,7 @@ tcp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
|
||||
void
|
||||
udp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
|
||||
{
|
||||
struct udpstat udpstat, zerostat;
|
||||
size_t len = sizeof udpstat;
|
||||
struct udpstat udpstat;
|
||||
uint64_t delivered;
|
||||
|
||||
#ifdef INET6
|
||||
@ -871,16 +862,9 @@ udp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
|
||||
udp_done = 1;
|
||||
#endif
|
||||
|
||||
if (live) {
|
||||
if (zflag)
|
||||
memset(&zerostat, 0, len);
|
||||
if (sysctlbyname("net.inet.udp.stats", &udpstat, &len,
|
||||
zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
|
||||
xo_warn("sysctl: net.inet.udp.stats");
|
||||
return;
|
||||
}
|
||||
} else
|
||||
kread_counters(off, &udpstat, len);
|
||||
if (fetch_stats("net.inet.udp.stats", off, &udpstat,
|
||||
sizeof(udpstat), kread_counters) != 0)
|
||||
return;
|
||||
|
||||
xo_open_container("udp");
|
||||
xo_emit("{T:/%s}:\n", name);
|
||||
@ -933,23 +917,11 @@ udp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
|
||||
void
|
||||
carp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
|
||||
{
|
||||
struct carpstats carpstat, zerostat;
|
||||
size_t len = sizeof(struct carpstats);
|
||||
struct carpstats carpstat;
|
||||
|
||||
if (live) {
|
||||
if (zflag)
|
||||
memset(&zerostat, 0, len);
|
||||
if (sysctlbyname("net.inet.carp.stats", &carpstat, &len,
|
||||
zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
|
||||
if (errno != ENOENT)
|
||||
xo_warn("sysctl: net.inet.carp.stats");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (off == 0)
|
||||
return;
|
||||
kread_counters(off, &carpstat, len);
|
||||
}
|
||||
if (fetch_stats("net.inet.carp.stats", off, &carpstat,
|
||||
sizeof(carpstat), kread_counters) != 0)
|
||||
return;
|
||||
|
||||
xo_open_container(name);
|
||||
xo_emit("{T:/%s}:\n", name);
|
||||
@ -1000,19 +972,11 @@ carp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
|
||||
void
|
||||
ip_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
|
||||
{
|
||||
struct ipstat ipstat, zerostat;
|
||||
size_t len = sizeof ipstat;
|
||||
struct ipstat ipstat;
|
||||
|
||||
if (live) {
|
||||
if (zflag)
|
||||
memset(&zerostat, 0, len);
|
||||
if (sysctlbyname("net.inet.ip.stats", &ipstat, &len,
|
||||
zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
|
||||
xo_warn("sysctl: net.inet.ip.stats");
|
||||
return;
|
||||
}
|
||||
} else
|
||||
kread_counters(off, &ipstat, len);
|
||||
if (fetch_stats("net.inet.ip.stats", off, &ipstat,
|
||||
sizeof(ipstat), kread_counters) != 0)
|
||||
return;
|
||||
|
||||
xo_open_container(name);
|
||||
xo_emit("{T:/%s}:\n", name);
|
||||
@ -1093,19 +1057,11 @@ ip_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
|
||||
void
|
||||
arp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
|
||||
{
|
||||
struct arpstat arpstat, zerostat;
|
||||
size_t len = sizeof(arpstat);
|
||||
struct arpstat arpstat;
|
||||
|
||||
if (live) {
|
||||
if (zflag)
|
||||
memset(&zerostat, 0, len);
|
||||
if (sysctlbyname("net.link.ether.arp.stats", &arpstat, &len,
|
||||
zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
|
||||
xo_warn("sysctl: net.link.ether.arp.stats");
|
||||
return;
|
||||
}
|
||||
} else
|
||||
kread_counters(off, &arpstat, len);
|
||||
if (fetch_stats("net.link.ether.arp.stats", off, &arpstat,
|
||||
sizeof(arpstat), kread_counters) != 0)
|
||||
return;
|
||||
|
||||
xo_open_container(name);
|
||||
xo_emit("{T:/%s}:\n", name);
|
||||
@ -1186,21 +1142,13 @@ static const char *icmpnames[ICMP_MAXTYPE + 1] = {
|
||||
void
|
||||
icmp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
|
||||
{
|
||||
struct icmpstat icmpstat, zerostat;
|
||||
int i, first;
|
||||
struct icmpstat icmpstat;
|
||||
size_t len;
|
||||
int i, first;
|
||||
|
||||
len = sizeof icmpstat;
|
||||
if (live) {
|
||||
if (zflag)
|
||||
memset(&zerostat, 0, len);
|
||||
if (sysctlbyname("net.inet.icmp.stats", &icmpstat, &len,
|
||||
zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
|
||||
xo_warn("sysctl: net.inet.icmp.stats");
|
||||
return;
|
||||
}
|
||||
} else
|
||||
kread_counters(off, &icmpstat, len);
|
||||
if (fetch_stats("net.inet.icmp.stats", off, &icmpstat,
|
||||
sizeof(icmpstat), kread_counters) != 0)
|
||||
return;
|
||||
|
||||
xo_open_container(name);
|
||||
xo_emit("{T:/%s}:\n", name);
|
||||
@ -1300,22 +1248,11 @@ icmp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
|
||||
void
|
||||
igmp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
|
||||
{
|
||||
struct igmpstat igmpstat, zerostat;
|
||||
size_t len;
|
||||
struct igmpstat igmpstat;
|
||||
|
||||
len = sizeof(igmpstat);
|
||||
if (live) {
|
||||
if (zflag)
|
||||
memset(&zerostat, 0, len);
|
||||
if (sysctlbyname("net.inet.igmp.stats", &igmpstat, &len,
|
||||
zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
|
||||
xo_warn("sysctl: net.inet.igmp.stats");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
len = sizeof(igmpstat);
|
||||
kread(off, &igmpstat, len);
|
||||
}
|
||||
if (fetch_stats("net.inet.igmp.stats", 0, &igmpstat,
|
||||
sizeof(igmpstat), kread) != 0)
|
||||
return;
|
||||
|
||||
if (igmpstat.igps_version != IGPS_VERSION_3) {
|
||||
xo_warnx("%s: version mismatch (%d != %d)", __func__,
|
||||
@ -1380,23 +1317,11 @@ void
|
||||
pim_stats(u_long off __unused, const char *name, int af1 __unused,
|
||||
int proto __unused)
|
||||
{
|
||||
struct pimstat pimstat, zerostat;
|
||||
size_t len = sizeof pimstat;
|
||||
struct pimstat pimstat;
|
||||
|
||||
if (live) {
|
||||
if (zflag)
|
||||
memset(&zerostat, 0, len);
|
||||
if (sysctlbyname("net.inet.pim.stats", &pimstat, &len,
|
||||
zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
|
||||
if (errno != ENOENT)
|
||||
xo_warn("sysctl: net.inet.pim.stats");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (off == 0)
|
||||
return;
|
||||
kread_counters(off, &pimstat, len);
|
||||
}
|
||||
if (fetch_stats("net.inet.pim.stats", off, &pimstat,
|
||||
sizeof(pimstat), kread_counters) != 0)
|
||||
return;
|
||||
|
||||
xo_open_container(name);
|
||||
xo_emit("{T:/%s}:\n", name);
|
||||
|
@ -44,7 +44,6 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/mbuf.h>
|
||||
#include <sys/protosw.h>
|
||||
#include <sys/sysctl.h>
|
||||
|
||||
#include <net/route.h>
|
||||
#include <net/if.h>
|
||||
@ -359,23 +358,13 @@ static const char *srcrule_str[] = {
|
||||
void
|
||||
ip6_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
|
||||
{
|
||||
struct ip6stat ip6stat, zerostat;
|
||||
struct ip6stat ip6stat;
|
||||
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);
|
||||
if (fetch_stats("net.inet6.ip6.stats", off, &ip6stat,
|
||||
sizeof(ip6stat), kread_counters) != 0)
|
||||
return;
|
||||
|
||||
xo_open_container(name);
|
||||
xo_emit("{T:/%s}:\n", name);
|
||||
|
||||
@ -956,23 +945,12 @@ static const char *icmp6names[] = {
|
||||
void
|
||||
icmp6_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
|
||||
{
|
||||
struct icmp6stat icmp6stat, zerostat;
|
||||
struct icmp6stat icmp6stat;
|
||||
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);
|
||||
if (fetch_stats("net.inet6.icmp6.stats", off, &icmp6stat,
|
||||
sizeof(icmp6stat), kread_counters) != 0)
|
||||
return;
|
||||
|
||||
xo_emit("{T:/%s}:\n", name);
|
||||
xo_open_container(name);
|
||||
@ -1196,23 +1174,11 @@ icmp6_ifstats(char *ifname)
|
||||
void
|
||||
pim6_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
|
||||
{
|
||||
struct pim6stat pim6stat, zerostat;
|
||||
size_t len = sizeof pim6stat;
|
||||
struct pim6stat pim6stat;
|
||||
|
||||
if (live) {
|
||||
if (zflag)
|
||||
memset(&zerostat, 0, len);
|
||||
if (sysctlbyname("net.inet6.pim.stats", &pim6stat, &len,
|
||||
zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
|
||||
if (errno != ENOENT)
|
||||
xo_warn("sysctl: net.inet6.pim.stats");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (off == 0)
|
||||
return;
|
||||
kread(off, &pim6stat, len);
|
||||
}
|
||||
if (fetch_stats("net.inet6.pim.stats", off, &pim6stat,
|
||||
sizeof(pim6stat), kread) != 0)
|
||||
return;
|
||||
|
||||
xo_emit("{T:/%s}:\n", name);
|
||||
xo_open_container(name);
|
||||
@ -1244,22 +1210,12 @@ pim6_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
|
||||
void
|
||||
rip6_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
|
||||
{
|
||||
struct rip6stat rip6stat, zerostat;
|
||||
struct rip6stat rip6stat;
|
||||
u_quad_t delivered;
|
||||
size_t len;
|
||||
|
||||
len = sizeof(rip6stat);
|
||||
if (live) {
|
||||
if (zflag)
|
||||
memset(&zerostat, 0, len);
|
||||
if (sysctlbyname("net.inet6.ip6.rip6stats", &rip6stat, &len,
|
||||
zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
|
||||
if (errno != ENOENT)
|
||||
xo_warn("sysctl: net.inet6.ip6.rip6stats");
|
||||
return;
|
||||
}
|
||||
} else
|
||||
kread_counters(off, &rip6stat, len);
|
||||
if (fetch_stats("net.inet6.ip6.rip6stats", off, &rip6stat,
|
||||
sizeof(rip6stat), kread_counters) != 0)
|
||||
return;
|
||||
|
||||
xo_emit("{T:/%s}:\n", name);
|
||||
xo_open_container(name);
|
||||
|
@ -47,6 +47,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/protosw.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/socketvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
|
||||
#include <netinet/in.h>
|
||||
|
||||
@ -548,6 +549,29 @@ main(int argc, char *argv[])
|
||||
exit(0);
|
||||
}
|
||||
|
||||
int
|
||||
fetch_stats(const char *sysctlname, u_long off, void *stats, size_t len,
|
||||
int (*kreadfn)(u_long, void *, size_t))
|
||||
{
|
||||
int error;
|
||||
|
||||
if (live) {
|
||||
memset(stats, 0, len);
|
||||
if (zflag)
|
||||
error = sysctlbyname(sysctlname, NULL, NULL, stats,
|
||||
len);
|
||||
else
|
||||
error = sysctlbyname(sysctlname, stats, &len, NULL, 0);
|
||||
if (error == -1 && errno != ENOENT)
|
||||
xo_warn("sysctl %s", sysctlname);
|
||||
} else {
|
||||
if (off == 0)
|
||||
return (1);
|
||||
error = kreadfn(off, stats, len);
|
||||
}
|
||||
return (error);
|
||||
}
|
||||
|
||||
/*
|
||||
* Print out protocol statistics or control blocks (per sflag).
|
||||
* If the interface was not specifically requested, and the symbol
|
||||
|
@ -310,27 +310,22 @@ mbpr(void *kvmd, u_long mbaddr)
|
||||
jumbop_failures, jumbo9_failures, jumbo16_failures,
|
||||
jumbop_size / 1024);
|
||||
|
||||
if (live) {
|
||||
mlen = sizeof(nsfbufs);
|
||||
if (!sysctlbyname("kern.ipc.nsfbufs", &nsfbufs, &mlen, NULL,
|
||||
0) &&
|
||||
!sysctlbyname("kern.ipc.nsfbufsused", &nsfbufsused,
|
||||
&mlen, NULL, 0) &&
|
||||
!sysctlbyname("kern.ipc.nsfbufspeak", &nsfbufspeak,
|
||||
&mlen, NULL, 0))
|
||||
xo_emit("{:nsfbufs-current/%d}/{:nsfbufs-peak/%d}/"
|
||||
"{:nsfbufs/%d} "
|
||||
"{N:sfbufs in use (current\\/peak\\/max)}\n",
|
||||
nsfbufsused, nsfbufspeak, nsfbufs);
|
||||
mlen = sizeof(sfstat);
|
||||
if (sysctlbyname("kern.ipc.sfstat", &sfstat, &mlen, NULL, 0)) {
|
||||
xo_warn("kern.ipc.sfstat");
|
||||
goto out;
|
||||
}
|
||||
} else {
|
||||
if (kread_counters(mbaddr, (char *)&sfstat, sizeof sfstat) != 0)
|
||||
goto out;
|
||||
}
|
||||
mlen = sizeof(nsfbufs);
|
||||
if (live &&
|
||||
sysctlbyname("kern.ipc.nsfbufs", &nsfbufs, &mlen, NULL, 0) == 0 &&
|
||||
sysctlbyname("kern.ipc.nsfbufsused", &nsfbufsused, &mlen,
|
||||
NULL, 0) == 0 &&
|
||||
sysctlbyname("kern.ipc.nsfbufspeak", &nsfbufspeak, &mlen,
|
||||
NULL, 0) == 0)
|
||||
xo_emit("{:nsfbufs-current/%d}/{:nsfbufs-peak/%d}/"
|
||||
"{:nsfbufs/%d} "
|
||||
"{N:sfbufs in use (current\\/peak\\/max)}\n",
|
||||
nsfbufsused, nsfbufspeak, nsfbufs);
|
||||
|
||||
if (fetch_stats("kern.ipc.sfstat", mbaddr, &sfstat, sizeof(sfstat),
|
||||
kread_counters) != 0)
|
||||
goto out;
|
||||
|
||||
xo_emit("{:sfbufs-alloc-failed/%ju} {N:requests for sfbufs denied}\n",
|
||||
(uintmax_t)sfstat.sf_allocfail);
|
||||
xo_emit("{:sfbufs-alloc-wait/%ju} {N:requests for sfbufs delayed}\n",
|
||||
|
@ -400,7 +400,6 @@ mrt_stats()
|
||||
{
|
||||
struct mrtstat mrtstat;
|
||||
u_long mstaddr;
|
||||
size_t len = sizeof(mrtstat);
|
||||
|
||||
mstaddr = nl[N_MRTSTAT].n_value;
|
||||
|
||||
@ -409,14 +408,9 @@ mrt_stats()
|
||||
return;
|
||||
}
|
||||
|
||||
if (live) {
|
||||
if (sysctlbyname("net.inet.ip.mrtstat", &mrtstat, &len, NULL,
|
||||
0) < 0) {
|
||||
xo_warn("sysctl: net.inet.ip.mrtstat failed.");
|
||||
return;
|
||||
}
|
||||
} else
|
||||
kread_counters(mstaddr, &mrtstat, len);
|
||||
if (fetch_stats("net.inet.ip.mrtstat", mstaddr, &mrtstat,
|
||||
sizeof(mrtstat), kread_counters) != 0)
|
||||
return;
|
||||
|
||||
xo_emit("{T:IPv4 multicast forwarding}:\n");
|
||||
|
||||
|
@ -231,13 +231,10 @@ void
|
||||
mrt6_stats()
|
||||
{
|
||||
struct mrt6stat mrtstat;
|
||||
size_t len = sizeof mrtstat;
|
||||
|
||||
if (sysctlbyname("net.inet6.ip6.mrt6stat", &mrtstat, &len, NULL, 0) <
|
||||
0) {
|
||||
xo_warn("sysctl: net.inet6.ip6.mrt6stat");
|
||||
if (fetch_stats("net.inet6.ip6.mrt6stat", 0, &mrtstat,
|
||||
sizeof(mrtstat), kread_counters) != 0)
|
||||
return;
|
||||
}
|
||||
|
||||
xo_open_container("multicast-statistics");
|
||||
xo_emit("{T:IPv6 multicast forwarding}:\n");
|
||||
|
@ -63,6 +63,8 @@ extern int unit; /* unit number for above */
|
||||
|
||||
extern int live; /* true if we are examining a live system */
|
||||
|
||||
int fetch_stats(const char *sysctlname, u_long addr, void *stats,
|
||||
size_t len, int (*kreadfn)(u_long, void *, size_t));
|
||||
int kread(u_long addr, void *buf, size_t size);
|
||||
uint64_t kread_counter(u_long addr);
|
||||
int kread_counters(u_long addr, void *buf, size_t size);
|
||||
|
@ -658,20 +658,11 @@ sctp_statesprint(uint32_t state)
|
||||
void
|
||||
sctp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
|
||||
{
|
||||
struct sctpstat sctpstat, zerostat;
|
||||
size_t len = sizeof(sctpstat);
|
||||
struct sctpstat sctpstat;
|
||||
|
||||
if (live) {
|
||||
if (zflag)
|
||||
memset(&zerostat, 0, len);
|
||||
if (sysctlbyname("net.inet.sctp.stats", &sctpstat, &len,
|
||||
zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
|
||||
if (errno != ENOENT)
|
||||
xo_warn("sysctl: net.inet.sctp.stats");
|
||||
return;
|
||||
}
|
||||
} else
|
||||
kread(off, &sctpstat, len);
|
||||
if (fetch_stats("net.inet.sctp.stats", off, &sctpstat,
|
||||
sizeof(sctpstat), kread) != 0)
|
||||
return;
|
||||
|
||||
xo_open_container(name);
|
||||
xo_emit("{T:/%s}:\n", name);
|
||||
|
Loading…
Reference in New Issue
Block a user