diff options
Diffstat (limited to 'usr.sbin/rtadvd/config.c')
-rw-r--r-- | usr.sbin/rtadvd/config.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/usr.sbin/rtadvd/config.c b/usr.sbin/rtadvd/config.c index 4a0e141..de817a8 100644 --- a/usr.sbin/rtadvd/config.c +++ b/usr.sbin/rtadvd/config.c @@ -564,6 +564,8 @@ get_prefix(struct rainfo *rai) exit(1); } for (ifa = ifap; ifa; ifa = ifa->ifa_next) { + int plen; + if (strcmp(ifa->ifa_name, rai->ifname) != 0) continue; if (ifa->ifa_addr->sa_family != AF_INET6) @@ -572,28 +574,32 @@ get_prefix(struct rainfo *rai) if (IN6_IS_ADDR_LINKLOCAL(a)) continue; - /* allocate memory to store prefix info. */ - if ((pp = malloc(sizeof(*pp))) == NULL) { - syslog(LOG_ERR, - "<%s> can't get allocate buffer for prefix", + /* get prefix length */ + m = (u_char *)&((struct sockaddr_in6 *)ifa->ifa_netmask)->sin6_addr; + lim = (u_char *)(ifa->ifa_netmask) + ifa->ifa_netmask->sa_len; + plen = prefixlen(m, lim); + if (plen < 0 || plen > 128) { + syslog(LOG_ERR, "<%s> failed to get prefixlen " + "or prefix is invalid", __FUNCTION__); exit(1); } - memset(pp, 0, sizeof(*pp)); + if (find_prefix(rai, a, plen)) { + /* ignore a duplicated prefix. */ + continue; + } - /* set prefix length */ - m = (u_char *)&((struct sockaddr_in6 *)ifa->ifa_netmask)->sin6_addr; - lim = (u_char *)(ifa->ifa_netmask) + ifa->ifa_netmask->sa_len; - pp->prefixlen = prefixlen(m, lim); - if (pp->prefixlen < 0 || pp->prefixlen > 128) { + /* allocate memory to store prefix info. */ + if ((pp = malloc(sizeof(*pp))) == NULL) { syslog(LOG_ERR, - "<%s> failed to get prefixlen " - "or prefix is invalid", + "<%s> can't get allocate buffer for prefix", __FUNCTION__); exit(1); } + memset(pp, 0, sizeof(*pp)); /* set prefix, sweep bits outside of prefixlen */ + pp->prefixlen = plen; memcpy(&pp->prefix, a, sizeof(*a)); p = (u_char *)&pp->prefix; ep = (u_char *)(&pp->prefix + 1); |