// Not a FIX, workaround for special case only! --- a/sys/netinet6/in6.h +++ b/sys/netinet6/in6.h @@ -297,6 +297,8 @@ extern const struct in6_addr in6addr_linklocal_allv2routers; (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80)) #define IN6_IS_ADDR_SITELOCAL(a) \ (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0)) +#define IN6_IS_ADDR_ULA(a) \ + ((a)->s6_addr[0] == 0xfd) /* * Multicast --- a/sys/netinet6/nd6_rtr.c +++ b/sys/netinet6/nd6_rtr.c @@ -1892,6 +1892,7 @@ pfxlist_onlink_check(void) LIST_FOREACH(pr, &V_nd_prefix, ndpr_entry) { /* XXX: a link-local prefix should never be detached */ if (IN6_IS_ADDR_LINKLOCAL(&pr->ndpr_prefix.sin6_addr) || + IN6_IS_ADDR_ULA(&pr->ndpr_prefix.sin6_addr) || /* FB: wild hack to avoid deletion of link routes for local provided prefix */ pr->ndpr_raf_onlink == 0 || pr->ndpr_raf_auto == 0) continue; @@ -1928,6 +1929,7 @@ pfxlist_onlink_check(void) int e; if (IN6_IS_ADDR_LINKLOCAL(&pr->ndpr_prefix.sin6_addr) || + IN6_IS_ADDR_ULA(&pr->ndpr_prefix.sin6_addr) || /* FB: wild hack to avoid deletion of link routes for local provided prefix */ pr->ndpr_raf_onlink == 0 || pr->ndpr_raf_auto == 0) continue;