Add the "nd6 options" line handler as af_other_status() of AF_INET6, not as an

own address family.

Reviewed by:	bz
This commit is contained in:
Hiroki Sato 2011-06-05 11:37:20 +00:00
parent fa0fb79540
commit c3cc3217bc
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=222711
2 changed files with 5 additions and 69 deletions

View File

@ -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,

View File

@ -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);
}