diff options
| author | Hajimu UMEMOTO <ume@FreeBSD.org> | 2002-06-01 19:16:13 +0000 |
|---|---|---|
| committer | Hajimu UMEMOTO <ume@FreeBSD.org> | 2002-06-01 19:16:13 +0000 |
| commit | c7aec5cc575d2028ec81048e8e4de0ce79a758a7 (patch) | |
| tree | 3b3c24be1e0f2c13e3f01f605dc724179e7334e7 /usr.sbin/rtadvd | |
| parent | 0658e085a7b6ae18de504d5d5c413ebce46952f5 (diff) | |
Notes
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 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 |
