summaryrefslogtreecommitdiff
path: root/usr.sbin/rtadvd
diff options
context:
space:
mode:
authorHajimu UMEMOTO <ume@FreeBSD.org>2002-06-01 19:16:13 +0000
committerHajimu UMEMOTO <ume@FreeBSD.org>2002-06-01 19:16:13 +0000
commitc7aec5cc575d2028ec81048e8e4de0ce79a758a7 (patch)
tree3b3c24be1e0f2c13e3f01f605dc724179e7334e7 /usr.sbin/rtadvd
parent0658e085a7b6ae18de504d5d5c413ebce46952f5 (diff)
Notes
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 4a0e141b9665..de817a80a7d5 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 9c7991f9e1d0..88a0a3dbeca6 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 c05dcf48e3ca..2bf3647a18ad 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