svn commit: r222591 - user/hrs/ipv6/sbin/ifconfig
Hiroki Sato
hrs at FreeBSD.org
Thu Jun 2 01:44:24 UTC 2011
Author: hrs
Date: Thu Jun 2 01:44:24 2011
New Revision: 222591
URL: http://svn.freebsd.org/changeset/base/222591
Log:
Move a handler of "nd6 options" line to af_other_status() of AF_INET6.
Discussed with: bz
Modified:
user/hrs/ipv6/sbin/ifconfig/af_inet6.c
user/hrs/ipv6/sbin/ifconfig/af_nd6.c
Modified: user/hrs/ipv6/sbin/ifconfig/af_inet6.c
==============================================================================
--- user/hrs/ipv6/sbin/ifconfig/af_inet6.c Thu Jun 2 00:58:20 2011 (r222590)
+++ user/hrs/ipv6/sbin/ifconfig/af_inet6.c Thu Jun 2 01:44:24 2011 (r222591)
@@ -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()*/
@@ -521,6 +522,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: user/hrs/ipv6/sbin/ifconfig/af_nd6.c
==============================================================================
--- user/hrs/ipv6/sbin/ifconfig/af_nd6.c Thu Jun 2 00:58:20 2011 (r222590)
+++ user/hrs/ipv6/sbin/ifconfig/af_nd6.c Thu Jun 2 01:44:24 2011 (r222591)
@@ -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,62 +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);
+ int isdefif;
memset(&nd, 0, sizeof(nd));
strncpy(nd.ifname, ifr.ifr_name, sizeof(nd.ifname));
@@ -207,30 +159,10 @@ nd6_status(int s)
}
isdefif = isnd6defif(s6);
close(s6);
- /*
- * Display an nd6 line only for cases of IPv6 address + non-zero flag
- * or accept_rtadv flag.
- */
- if (nd.ndi.flags == 0 && !isdefif)
- return;
- if (nd.ndi.flags & ND6_IFF_ACCEPT_RTADV)
- isinet6 = 1;
- if (!isinet6)
+
+ if (nd.ndi.flags == 0)
return;
printb("\tnd6 options",
(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)
-{
-
- af_register(&af_nd6);
-}
More information about the svn-src-user
mailing list