summaryrefslogtreecommitdiffstats
path: root/usr.sbin/rtadvd/config.c
diff options
context:
space:
mode:
authorume <ume@FreeBSD.org>2002-06-01 19:16:13 +0000
committerume <ume@FreeBSD.org>2002-06-01 19:16:13 +0000
commit887cd7c01dadef00c999279ad8bd6ad3de17f1a6 (patch)
tree3b3c24be1e0f2c13e3f01f605dc724179e7334e7 /usr.sbin/rtadvd/config.c
parent12e7fe56eef250888a580c11d99e429a0109d5f7 (diff)
downloadFreeBSD-src-887cd7c01dadef00c999279ad8bd6ad3de17f1a6.zip
FreeBSD-src-887cd7c01dadef00c999279ad8bd6ad3de17f1a6.tar.gz
Skip duplicated prefixes in get_prefix().
Obtained from: KAME
Diffstat (limited to 'usr.sbin/rtadvd/config.c')
-rw-r--r--usr.sbin/rtadvd/config.c30
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);
OpenPOWER on IntegriCloud