if (state == NULL)
return 0;
TAILQ_FOREACH(ia, &state->addrs, next) {
- if (ia->prefix_pltime &&
- (ia->addr.s6_addr[0] & 0xfe) != 0xc)
+ if (ipv6_publicaddr(ia))
return 1;
}
return 0;
return 0;
}
+int
+ipv6_publicaddr(const struct ipv6_addr *ia)
+{
+ return (ia->prefix_pltime &&
+ (ia->addr.s6_addr[0] & 0xfe) != 0xc &&
+ !(ia->addr_flags & IN6_IFF_NOTUSEABLE));
+}
+
struct ipv6_addr *
ipv6_findaddr(struct dhcpcd_ctx *ctx, const struct in6_addr *addr, short flags)
{
const char *, const struct in6_addr *, uint8_t, int);
int ipv6_handleifa_addrs(int, struct ipv6_addrhead *,
const struct in6_addr *, int);
+int ipv6_publicaddr(const struct ipv6_addr *);
const struct ipv6_addr *ipv6_iffindaddr(const struct interface *,
const struct in6_addr *);
struct ipv6_addr *ipv6_findaddr(struct dhcpcd_ctx *,
const struct ipv6_addr *ia;
TAILQ_FOREACH(ia, &rap->addrs, next) {
- if (ia->prefix_pltime &&
- (ia->addr.s6_addr[0] & 0xfe) != 0xfc &&
- ia->flags & IPV6_AF_AUTOCONF)
+ if (ia->flags & IPV6_AF_AUTOCONF &&
+ ipv6_publicaddr(ia))
return 1;
}
return 0;