svn commit: r254470 - head/usr.sbin/rtsold
Hiroki Sato
hrs at FreeBSD.org
Sat Aug 17 22:13:26 UTC 2013
Author: hrs
Date: Sat Aug 17 22:13:26 2013
New Revision: 254470
URL: http://svnweb.freebsd.org/changeset/base/254470
Log:
Use sysctl(ICMPV6CTL_ND6_DRLIST) instead of SIOCGDRLST_IN6 ioctl.
Modified:
head/usr.sbin/rtsold/probe.c
Modified: head/usr.sbin/rtsold/probe.c
==============================================================================
--- head/usr.sbin/rtsold/probe.c Sat Aug 17 22:06:30 2013 (r254469)
+++ head/usr.sbin/rtsold/probe.c Sat Aug 17 22:13:26 2013 (r254470)
@@ -35,6 +35,7 @@
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
+#include <sys/sysctl.h>
#include <sys/uio.h>
#include <sys/queue.h>
@@ -102,41 +103,51 @@ probe_init(void)
void
defrouter_probe(struct ifinfo *ifinfo)
{
- u_char ntopbuf[INET6_ADDRSTRLEN];
- struct in6_drlist dr;
- int s, i;
- int ifindex = ifinfo->sdl->sdl_index;
+ struct in6_defrouter *p, *ep;
+ int ifindex, mib[4];
+ char *buf, ntopbuf[INET6_ADDRSTRLEN];
+ size_t l;
- if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
- warnmsg(LOG_ERR, __func__, "socket: %s", strerror(errno));
+ ifindex = ifinfo->sdl->sdl_index;
+ if (ifindex == 0)
+ return;
+ mib[0] = CTL_NET;
+ mib[1] = PF_INET6;
+ mib[2] = IPPROTO_ICMPV6;
+ mib[3] = ICMPV6CTL_ND6_DRLIST;
+ if (sysctl(mib, nitems(mib), NULL, &l, NULL, 0) < 0) {
+ warnmsg(LOG_ERR, __func__, "sysctl(ICMPV6CTL_ND6_DRLIST): %s",
+ strerror(errno));
return;
}
- memset(&dr, 0, sizeof(dr));
- strlcpy(dr.ifname, "lo0", sizeof dr.ifname); /* dummy interface */
- if (ioctl(s, SIOCGDRLST_IN6, (caddr_t)&dr) < 0) {
- warnmsg(LOG_ERR, __func__, "ioctl(SIOCGDRLST_IN6): %s",
+ if (l == 0)
+ return;
+ buf = malloc(l);
+ if (buf == NULL) {
+ warnmsg(LOG_ERR, __func__, "malloc(): %s", strerror(errno));
+ return;
+ }
+ if (sysctl(mib, nitems(mib), buf, &l, NULL, 0) < 0) {
+ warnmsg(LOG_ERR, __func__, "sysctl(ICMPV6CTL_ND6_DRLIST): %s",
strerror(errno));
- goto closeandend;
+ free(buf);
+ return;
}
-
- for (i = 0; i < DRLSTSIZ && dr.defrouter[i].if_index; i++) {
- if (ifindex && dr.defrouter[i].if_index == ifindex) {
- /* sanity check */
- if (!IN6_IS_ADDR_LINKLOCAL(&dr.defrouter[i].rtaddr)) {
- warnmsg(LOG_ERR, __func__,
- "default router list contains a "
- "non-link-local address(%s)",
- inet_ntop(AF_INET6,
- &dr.defrouter[i].rtaddr,
- ntopbuf, INET6_ADDRSTRLEN));
- continue; /* ignore the address */
- }
- sendprobe(&dr.defrouter[i].rtaddr, ifinfo);
+ ep = (struct in6_defrouter *)(void *)(buf + l);
+ for (p = (struct in6_defrouter *)(void *)buf; p < ep; p++) {
+ if (ifindex != p->if_index)
+ continue;
+ if (!IN6_IS_ADDR_LINKLOCAL(&p->rtaddr.sin6_addr)) {
+ warnmsg(LOG_ERR, __func__,
+ "default router list contains a "
+ "non-link-local address(%s)",
+ inet_ntop(AF_INET6, &p->rtaddr.sin6_addr, ntopbuf,
+ INET6_ADDRSTRLEN));
+ continue; /* ignore the address */
}
+ sendprobe(&p->rtaddr.sin6_addr, ifinfo);
}
-
-closeandend:
- close(s);
+ free(buf);
}
static void
More information about the svn-src-all
mailing list