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:
parent
1bda0775e2
commit
ec6800874c
@ -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,
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user