Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 6 Apr 2015 22:12:19 +0000 (UTC)
From:      Gleb Smirnoff <glebius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r281172 - in head: sys/netinet6 sys/sys usr.bin/netstat
Message-ID:  <201504062212.t36MCJ34095873@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: glebius
Date: Mon Apr  6 22:12:18 2015
New Revision: 281172
URL: https://svnweb.freebsd.org/changeset/base/281172

Log:
  o Make net.inet6.ip6.mif6table return special API structure, that doesn't
    contain kernel pointers, and instead has interface index.
    Bump __FreeBSD_version for that change.
  o Now, netstat/mroute6.c no longer needs to kvm_read(3) struct ifnet, and
    no longer needs to include if_var.h
  
  Note that this change is far from being a complete move of IPv6 multicast
  routing to a proper API. Other structures are still dumped into their
  sysctls as is, requiring userland application to #define _KERNEL when
  including ip6_mroute.h and then call kvm_read(3) to gather all bits and
  pieces. But fixing this is out of scope of the opaque ifnet project.
  
  Sponsored by:	Nginx, Inc.
  Sponsored by:	Netflix

Modified:
  head/sys/netinet6/ip6_mroute.c
  head/sys/netinet6/ip6_mroute.h
  head/sys/sys/param.h
  head/usr.bin/netstat/mroute6.c
  head/usr.bin/netstat/netstat.1

Modified: head/sys/netinet6/ip6_mroute.c
==============================================================================
--- head/sys/netinet6/ip6_mroute.c	Mon Apr  6 21:51:55 2015	(r281171)
+++ head/sys/netinet6/ip6_mroute.c	Mon Apr  6 22:12:18 2015	(r281172)
@@ -196,9 +196,34 @@ static struct mtx mfc6_mtx;
 static u_char n6expire[MF6CTBLSIZ];
 
 static struct mif6 mif6table[MAXMIFS];
-SYSCTL_OPAQUE(_net_inet6_ip6, OID_AUTO, mif6table, CTLFLAG_RD,
-    &mif6table, sizeof(mif6table), "S,mif6[MAXMIFS]",
-    "IPv6 Multicast Interfaces (struct mif6[MAXMIFS], netinet6/ip6_mroute.h)");
+static int
+sysctl_mif6table(SYSCTL_HANDLER_ARGS)
+{
+	struct mif6_sctl *out;
+	int error;
+
+	out = malloc(sizeof(struct mif6_sctl) * MAXMIFS, M_TEMP, M_WAITOK);
+	for (int i = 0; i < MAXMIFS; i++) {
+		out[i].m6_flags		= mif6table[i].m6_flags;
+		out[i].m6_rate_limit	= mif6table[i].m6_rate_limit;
+		out[i].m6_lcl_addr	= mif6table[i].m6_lcl_addr;
+		if (mif6table[i].m6_ifp != NULL)
+			out[i].m6_ifp	= mif6table[i].m6_ifp->if_index;
+		else
+			out[i].m6_ifp	= 0;
+		out[i].m6_pkt_in	= mif6table[i].m6_pkt_in;
+		out[i].m6_pkt_out	= mif6table[i].m6_pkt_out;
+		out[i].m6_bytes_in	= mif6table[i].m6_bytes_in;
+		out[i].m6_bytes_out	= mif6table[i].m6_bytes_out;
+	}
+	error = SYSCTL_OUT(req, out, sizeof(struct mif6_sctl) * MAXMIFS);
+	free(out, M_TEMP);
+	return (error);
+}
+SYSCTL_PROC(_net_inet6_ip6, OID_AUTO, mif6table, CTLTYPE_OPAQUE | CTLFLAG_RD,
+    NULL, 0, sysctl_mif6table, "S,mif6_sctl[MAXMIFS]",
+    "IPv6 Multicast Interfaces (struct mif6_sctl[MAXMIFS], "
+    "netinet6/ip6_mroute.h)");
 
 static struct mtx mif6_mtx;
 #define	MIF6_LOCK()		mtx_lock(&mif6_mtx)

Modified: head/sys/netinet6/ip6_mroute.h
==============================================================================
--- head/sys/netinet6/ip6_mroute.h	Mon Apr  6 21:51:55 2015	(r281171)
+++ head/sys/netinet6/ip6_mroute.h	Mon Apr  6 22:12:18 2015	(r281172)
@@ -194,6 +194,20 @@ struct sioc_mif_req6 {
 	u_quad_t obytes;	/* Output byte count on mif		*/
 };
 
+/*
+ * Structure to export 'struct mif6' to userland via sysctl.
+ */
+struct mif6_sctl {
+	u_char		m6_flags;	/* MIFF_ flags defined above         */
+	u_int		m6_rate_limit;	/* max rate			     */
+	struct in6_addr	m6_lcl_addr;	/* local interface address           */
+	uint32_t	m6_ifp;		/* interface index	             */
+	u_quad_t	m6_pkt_in;	/* # pkts in on interface            */
+	u_quad_t	m6_pkt_out;	/* # pkts out on interface           */
+	u_quad_t	m6_bytes_in;	/* # bytes in on interface	     */
+	u_quad_t	m6_bytes_out;	/* # bytes out on interface	     */
+};
+
 #if defined(_KERNEL) || defined(KERNEL)
 /*
  * The kernel's multicast-interface structure.

Modified: head/sys/sys/param.h
==============================================================================
--- head/sys/sys/param.h	Mon Apr  6 21:51:55 2015	(r281171)
+++ head/sys/sys/param.h	Mon Apr  6 22:12:18 2015	(r281172)
@@ -58,7 +58,7 @@
  *		in the range 5 to 9.
  */
 #undef __FreeBSD_version
-#define __FreeBSD_version 1100067	/* Master, propagated to newvers */
+#define __FreeBSD_version 1100068	/* Master, propagated to newvers */
 
 /*
  * __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,

Modified: head/usr.bin/netstat/mroute6.c
==============================================================================
--- head/usr.bin/netstat/mroute6.c	Mon Apr  6 21:51:55 2015	(r281171)
+++ head/usr.bin/netstat/mroute6.c	Mon Apr  6 22:12:18 2015	(r281172)
@@ -79,13 +79,11 @@ __FBSDID("$FreeBSD$");
 #include <sys/time.h>
 
 #include <net/if.h>
-#include <net/if_var.h>
 #include <net/route.h>
 
 #include <netinet/in.h>
 
 #include <err.h>
-#include <nlist.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -98,20 +96,6 @@ __FBSDID("$FreeBSD$");
 
 #include "netstat.h"
 
-/*
- * kvm(3) bindings for every needed symbol
- */
-static struct nlist mrl[] = {
-#define	N_MF6CTABLE	0
-	{ .n_name = "_mf6ctable" },
-#define	N_MIF6TABLE	1
-	{ .n_name = "_mif6table" },
-#define	N_MRT6STAT	2
-	{ .n_name = "_mrt6stat" },
-	{ .n_name = NULL },
-};
-
-
 #define	WID_ORG	(Wflag ? 39 : (numeric_addr ? 29 : 18)) /* width of origin column */
 #define	WID_GRP	(Wflag ? 18 : (numeric_addr ? 16 : 18)) /* width of group column */
 
@@ -119,11 +103,10 @@ void
 mroute6pr()
 {
 	struct mf6c *mf6ctable[MF6CTBLSIZ], *mfcp;
-	struct mif6 mif6table[MAXMIFS];
+	struct mif6_sctl mif6table[MAXMIFS];
 	struct mf6c mfc;
 	struct rtdetq rte, *rtep;
-	struct mif6 *mifp;
-	u_long mfcaddr, mifaddr;
+	struct mif6_sctl *mifp;
 	mifi_t mifi;
 	int i;
 	int banner_printed;
@@ -132,39 +115,26 @@ mroute6pr()
 	long int waitings;
 	size_t len;
 
-	kresolve_list(mrl);
-	mfcaddr = mrl[N_MF6CTABLE].n_value;
-	mifaddr = mrl[N_MIF6TABLE].n_value;
-
-	if (mfcaddr == 0 || mifaddr == 0) {
-		fprintf(stderr, "No IPv6 MROUTING kernel support.\n");
+	if (live == 0)
 		return;
-	}
 
 	len = sizeof(mif6table);
-	if (live) {
-		if (sysctlbyname("net.inet6.ip6.mif6table", mif6table, &len,
-		    NULL, 0) < 0) {
-			xo_warn("sysctl: net.inet6.ip6.mif6table");
-			return;
-		}
-	} else
-		kread(mifaddr, (char *)mif6table, sizeof(mif6table));
+	if (sysctlbyname("net.inet6.ip6.mif6table", mif6table, &len, NULL, 0) <
+	    0) {
+		xo_warn("sysctl: net.inet6.ip6.mif6table");
+		return;
+	}
 
 	saved_numeric_addr = numeric_addr;
 	numeric_addr = 1;
 	banner_printed = 0;
 
 	for (mifi = 0, mifp = mif6table; mifi < MAXMIFS; ++mifi, ++mifp) {
-		struct ifnet ifnet;
 		char ifname[IFNAMSIZ];
 
-		if (mifp->m6_ifp == NULL)
+		if (mifp->m6_ifp == 0)
 			continue;
 
-		/* XXX KVM */
-		kread((u_long)mifp->m6_ifp, (char *)&ifnet, sizeof(ifnet));
-
 		maxmif = mifi;
 		if (!banner_printed) {
 			xo_open_list("multicast-interface");
@@ -177,7 +147,7 @@ mroute6pr()
 		xo_emit("  {:mif/%2u}   {:rate-limit/%4d}",
 		    mifi, mifp->m6_rate_limit);
 		xo_emit("   {:ifname/%5s}", (mifp->m6_flags & MIFF_REGISTER) ?
-		    "reg0" : if_indextoname(ifnet.if_index, ifname));
+		    "reg0" : if_indextoname(mifp->m6_ifp, ifname));
 
 		xo_emit(" {:received-packets/%9ju}  {:sent-packets/%9ju}\n",
 		    (uintmax_t)mifp->m6_pkt_in,
@@ -190,14 +160,11 @@ mroute6pr()
 		xo_emit("\n{T:IPv6 Multicast Interface Table is empty}\n");
 
 	len = sizeof(mf6ctable);
-	if (live) {
-		if (sysctlbyname("net.inet6.ip6.mf6ctable", mf6ctable, &len,
-		    NULL, 0) < 0) {
-			xo_warn("sysctl: net.inet6.ip6.mf6ctable");
-			return;
-		}
-	} else
-		kread(mfcaddr, (char *)mf6ctable, sizeof(mf6ctable));
+	if (sysctlbyname("net.inet6.ip6.mf6ctable", mf6ctable, &len, NULL, 0) <
+	    0) {
+		xo_warn("sysctl: net.inet6.ip6.mf6ctable");
+		return;
+	}
 
 	banner_printed = 0;
 
@@ -262,26 +229,14 @@ void
 mrt6_stats()
 {
 	struct mrt6stat mrtstat;
-	u_long mstaddr;
 	size_t len = sizeof mrtstat;
 
-	kresolve_list(mrl);
-	mstaddr = mrl[N_MRT6STAT].n_value;
-
-	if (mstaddr == 0) {
-		fprintf(stderr, "No IPv6 MROUTING kernel support.\n");
+	if (sysctlbyname("net.inet6.ip6.mrt6stat", &mrtstat, &len, NULL, 0) <
+	    0) {
+		xo_warn("sysctl: net.inet6.ip6.mrt6stat");
 		return;
 	}
 
-	if (live) {
-		if (sysctlbyname("net.inet6.ip6.mrt6stat", &mrtstat, &len,
-		    NULL, 0) < 0) {
-			xo_warn("sysctl: net.inet6.ip6.mrt6stat");
-			return;
-		}
-	} else
-		kread(mstaddr, (char *)&mrtstat, sizeof(mrtstat));
-
 	xo_open_container("multicast-statistics");
 	xo_emit("{T:IPv6 multicast forwarding}:\n");
 

Modified: head/usr.bin/netstat/netstat.1
==============================================================================
--- head/usr.bin/netstat/netstat.1	Mon Apr  6 21:51:55 2015	(r281171)
+++ head/usr.bin/netstat/netstat.1	Mon Apr  6 22:12:18 2015	(r281172)
@@ -28,7 +28,7 @@
 .\"	@(#)netstat.1	8.8 (Berkeley) 4/18/94
 .\" $FreeBSD$
 .\"
-.Dd February 21, 2015
+.Dd April 7, 2015
 .Dt NETSTAT 1
 .Os
 .Sh NAME
@@ -92,8 +92,6 @@
 .Op Fl -libxo
 .Op Fl 46W
 .Op Fl f Ar address_family
-.Op Fl M Ar core
-.Op Fl N Ar system
 .It Nm Fl gs
 .Op Fl -libxo
 .Op Fl 46s



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201504062212.t36MCJ34095873>