Skip duplicated prefixes in get_prefix().

Obtained from:	KAME
This commit is contained in:
Hajimu UMEMOTO 2002-06-01 19:16:13 +00:00
parent 0658e085a7
commit c7aec5cc57
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=97719
3 changed files with 19 additions and 14 deletions

View File

@ -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,6 +574,21 @@ get_prefix(struct rainfo *rai)
if (IN6_IS_ADDR_LINKLOCAL(a))
continue;
/* 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);
}
if (find_prefix(rai, a, plen)) {
/* ignore a duplicated prefix. */
continue;
}
/* allocate memory to store prefix info. */
if ((pp = malloc(sizeof(*pp))) == NULL) {
syslog(LOG_ERR,
@ -581,19 +598,8 @@ get_prefix(struct rainfo *rai)
}
memset(pp, 0, sizeof(*pp));
/* 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) {
syslog(LOG_ERR,
"<%s> failed to get prefixlen "
"or prefix is invalid",
__FUNCTION__);
exit(1);
}
/* 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);

View File

@ -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;

View File

@ -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