summaryrefslogtreecommitdiffstats
path: root/usr.sbin/rtadvd
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
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')
-rw-r--r--usr.sbin/rtadvd/config.c30
-rw-r--r--usr.sbin/rtadvd/rtadvd.c2
-rw-r--r--usr.sbin/rtadvd/rtadvd.h1
3 files changed, 19 insertions, 14 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);
diff --git a/usr.sbin/rtadvd/rtadvd.c b/usr.sbin/rtadvd/rtadvd.c
index 9c7991f..88a0a3d 100644
--- a/usr.sbin/rtadvd/rtadvd.c
+++ b/usr.sbin/rtadvd/rtadvd.c
@@ -143,8 +143,6 @@ static void ra_output __P((struct rainfo *));
static void rtmsg_input __P((void));
static void rtadvd_set_dump_file __P((void));
-struct prefix *find_prefix __P((struct rainfo *, struct in6_addr *, int));
-
int
main(argc, argv)
int argc;
diff --git a/usr.sbin/rtadvd/rtadvd.h b/usr.sbin/rtadvd/rtadvd.h
index c05dcf4..2bf3647 100644
--- a/usr.sbin/rtadvd/rtadvd.h
+++ b/usr.sbin/rtadvd/rtadvd.h
@@ -164,6 +164,7 @@ void ra_timer_update __P((void *, struct timeval *));
int prefix_match __P((struct in6_addr *, int, struct in6_addr *, int));
struct rainfo *if_indextorainfo __P((int));
+struct prefix *find_prefix __P((struct rainfo *, struct in6_addr *, int));
extern struct in6_addr in6a_site_allrouters;
#ifdef MIP6
OpenPOWER on IntegriCloud