Fix netstat -gs with ip_mroute module and/or vnet
The code for "netstat -gs -f inet" failed if the kernel namelist did not include the _mrtstat symbol. However, that symbol is not in a standard kernel even with the ip_mroute module loaded, where the functionality is available. It is also not in a kernel with MROUTING but also VIMAGE, as there can be multiple sets of stats. However, when running the command on a live system, the symbol is not used; a sysctl is used. Go ahead and try the sysctl in any case, and complain that IPv4 MROUTING is not present only if the sysctl fails with ENOENT. Also fail if _mrtstat is not defined when running on a core file; netstat doesn't know about vnets, so can only work if MROUTING was included, and VIMAGE was not. Reviewed by: bz MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D22311
This commit is contained in:
parent
b0cf923749
commit
7483fbadf4
@ -409,15 +409,13 @@ mrt_stats()
|
||||
|
||||
mstaddr = nl[N_MRTSTAT].n_value;
|
||||
|
||||
if (mstaddr == 0) {
|
||||
fprintf(stderr, "No IPv4 MROUTING kernel support.\n");
|
||||
if (fetch_stats("net.inet.ip.mrtstat", mstaddr, &mrtstat,
|
||||
sizeof(mrtstat), kread_counters) != 0) {
|
||||
if ((live && errno == ENOENT) || (!live && mstaddr == 0))
|
||||
fprintf(stderr, "No IPv4 MROUTING kernel support.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (fetch_stats("net.inet.ip.mrtstat", mstaddr, &mrtstat,
|
||||
sizeof(mrtstat), kread_counters) != 0)
|
||||
return;
|
||||
|
||||
xo_emit("{T:IPv4 multicast forwarding}:\n");
|
||||
|
||||
#define p(f, m) if (mrtstat.f || sflag <= 1) \
|
||||
|
Loading…
Reference in New Issue
Block a user