diff options
author | ume <ume@FreeBSD.org> | 2002-06-01 19:16:13 +0000 |
---|---|---|
committer | ume <ume@FreeBSD.org> | 2002-06-01 19:16:13 +0000 |
commit | 887cd7c01dadef00c999279ad8bd6ad3de17f1a6 (patch) | |
tree | 3b3c24be1e0f2c13e3f01f605dc724179e7334e7 /usr.sbin/rtadvd | |
parent | 12e7fe56eef250888a580c11d99e429a0109d5f7 (diff) | |
download | FreeBSD-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.c | 30 | ||||
-rw-r--r-- | usr.sbin/rtadvd/rtadvd.c | 2 | ||||
-rw-r--r-- | usr.sbin/rtadvd/rtadvd.h | 1 |
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 |