Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 5 Jun 2011 11:37:21 +0000 (UTC)
From:      Hiroki Sato <hrs@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r222711 - head/sbin/ifconfig
Message-ID:  <201106051137.p55BbLv5054499@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: hrs
Date: Sun Jun  5 11:37:20 2011
New Revision: 222711
URL: http://svn.freebsd.org/changeset/base/222711

Log:
  Add the "nd6 options" line handler as af_other_status() of AF_INET6, not as an
  own address family.
  
  Reviewed by:	bz

Modified:
  head/sbin/ifconfig/af_inet6.c
  head/sbin/ifconfig/af_nd6.c

Modified: head/sbin/ifconfig/af_inet6.c
==============================================================================
--- head/sbin/ifconfig/af_inet6.c	Sun Jun  5 11:20:19 2011	(r222710)
+++ head/sbin/ifconfig/af_inet6.c	Sun Jun  5 11:37:20 2011	(r222711)
@@ -69,6 +69,7 @@ static	int explicit_prefix = 0;
 
 extern void setnd6flags(const char *, int, int, const struct afswtch *);
 extern void setnd6defif(const char *, int, int, const struct afswtch *);
+extern void nd6_status(int);
 
 static	char addr_buf[MAXHOSTNAMELEN *2 + 1];	/*for getnameinfo()*/
 
@@ -519,6 +520,7 @@ static struct afswtch af_inet6 = {
 	.af_status	= in6_status,
 	.af_getaddr	= in6_getaddr,
 	.af_getprefix	= in6_getprefix,
+	.af_other_status = nd6_status,
 	.af_postproc	= in6_postproc,
 	.af_status_tunnel = in6_status_tunnel,
 	.af_settunnel	= in6_set_tunnel,

Modified: head/sbin/ifconfig/af_nd6.c
==============================================================================
--- head/sbin/ifconfig/af_nd6.c	Sun Jun  5 11:20:19 2011	(r222710)
+++ head/sbin/ifconfig/af_nd6.c	Sun Jun  5 11:37:20 2011	(r222711)
@@ -63,6 +63,7 @@ static const char rcsid[] =
 static int isnd6defif(int);
 void setnd6flags(const char *, int, int, const struct afswtch *);
 void setnd6defif(const char *, int, int, const struct afswtch *);
+void nd6_status(int);
 
 void
 setnd6flags(const char *dummyaddr __unused,
@@ -136,64 +137,13 @@ isnd6defif(int s)
 	return (ndifreq.ifindex == ifindex);
 }
 
-static void
+void
 nd6_status(int s)
 {
 	struct in6_ndireq nd;
-	struct rt_msghdr *rtm;
-	size_t needed;
-	char *buf, *next;
-	int mib[6], ntry;
 	int s6;
 	int error;
-	int isinet6, isdefif;
-
-	/* Check if the interface has at least one IPv6 address. */
-	mib[0] = CTL_NET;
-	mib[1] = PF_ROUTE;
-	mib[2] = 0;
-	mib[3] = AF_INET6;
-	mib[4] = NET_RT_IFLIST;
-	mib[5] = if_nametoindex(ifr.ifr_name);
-
-	/* Try to prevent a race between two sysctls. */
-	ntry = 0;
-	do {
-		error = sysctl(mib, 6, NULL, &needed, NULL, 0);
-		if (error) {
-			warn("sysctl(NET_RT_IFLIST)/estimate");
-			return;
-		}
-		buf = malloc(needed);
-		if (buf == NULL) {
-			warn("malloc for sysctl(NET_RT_IFLIST) failed");
-			return;
-		}
-		if ((error = sysctl(mib, 6, buf, &needed, NULL, 0)) < 0) {
-			if (errno != ENOMEM || ++ntry >= MAX_SYSCTL_TRY) {
-				warn("sysctl(NET_RT_IFLIST)/get");
-				free(buf);
-				return;
-			}
-			free(buf);
-			buf = NULL;
-		}
-	} while (buf == NULL);
-	
-	isinet6 = 0;
-	for (next = buf; next < buf + needed; next += rtm->rtm_msglen) {
-		rtm = (struct rt_msghdr *)next;
-
-		if (rtm->rtm_version != RTM_VERSION)
-			continue;
-		if (rtm->rtm_type == RTM_NEWADDR) {
-			isinet6 = 1;
-			break;
-		}
-	}
-	free(buf);
-	if (!isinet6)
-		return;
+	int isdefif;
 
 	memset(&nd, 0, sizeof(nd));
 	strncpy(nd.ifname, ifr.ifr_name, sizeof(nd.ifname));
@@ -215,19 +165,3 @@ nd6_status(int s)
 	    (unsigned int)(nd.ndi.flags | (isdefif << 15)), ND6BITS);
 	putchar('\n');
 }
-
-static struct afswtch af_nd6 = {
-	.af_name	= "nd6",
-	.af_af		= AF_LOCAL,
-	.af_other_status= nd6_status,
-};
-
-static __constructor void
-nd6_ctor(void)
-{
-
-	if (!feature_present("inet6"))
-		return;
-
-	af_register(&af_nd6);
-}



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