svn commit: r354633 - head/usr.bin/netstat

Mike Karels karels at FreeBSD.org
Tue Nov 12 01:03:09 UTC 2019


Author: karels
Date: Tue Nov 12 01:03:08 2019
New Revision: 354633
URL: https://svnweb.freebsd.org/changeset/base/354633

Log:
  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

Modified:
  head/usr.bin/netstat/mroute.c

Modified: head/usr.bin/netstat/mroute.c
==============================================================================
--- head/usr.bin/netstat/mroute.c	Tue Nov 12 00:32:33 2019	(r354632)
+++ head/usr.bin/netstat/mroute.c	Tue Nov 12 01:03:08 2019	(r354633)
@@ -409,14 +409,12 @@ mrt_stats()
 
 	mstaddr = nl[N_MRTSTAT].n_value;
 
-	if (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)
+	    sizeof(mrtstat), kread_counters) != 0) {
+		if ((live && errno == ENOENT) || (!live && mstaddr == 0))
+			fprintf(stderr, "No IPv4 MROUTING kernel support.\n");
 		return;
+	}
 
 	xo_emit("{T:IPv4 multicast forwarding}:\n");
 


More information about the svn-src-head mailing list