}
static int
-ipv6nd_ra_has_public_addr(const struct ra *rap)
+ipv6nd_has_public_addr(const struct interface *ifp)
{
+ const struct ra *rap;
const struct ipv6_addr *ia;
- TAILQ_FOREACH(ia, &rap->addrs, next) {
- if (ia->flags & IPV6_AF_AUTOCONF &&
- ipv6_publicaddr(ia))
- return 1;
+ TAILQ_FOREACH(rap, ifp->ctx->ipv6->ra_routers, next) {
+ if (rap->iface == ifp) {
+ TAILQ_FOREACH(ia, &rap->addrs, next) {
+ if (ia->flags & IPV6_AF_AUTOCONF &&
+ ipv6_publicaddr(ia))
+ return 1;
+ }
+ }
}
return 0;
}
if (new_rap)
add_router(ifp->ctx->ipv6, rap);
- if (!ipv6nd_ra_has_public_addr(rap) &&
+ if (!ipv6nd_has_public_addr(rap->iface) &&
!(rap->iface->options->options & DHCPCD_IPV6RA_ACCEPT_NOPUBLIC) &&
(!(rap->flags & ND_RA_FLAG_MANAGED) ||
!dhcp6_has_public_addr(rap->iface)))