Skip duplicated prefixes in get_prefix().
Obtained from: KAME
This commit is contained in:
parent
0658e085a7
commit
c7aec5cc57
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=97719
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user