knew i should have double/triple checked, old FreeBSD mirror; this from:
Fetched directly from raw.githubusercontent.com/freebsd/freebsd-src/releng/15.1/sys/netinet6/ (that branch is exactly where the p3 errata patches land, so this is the correct source):
c
// in6_ifattach.c, in6_ifattach():
NET_EPOCH_ENTER(et);
ia = in6ifa_ifpforlinklocal(ifp, 0);
NET_EPOCH_EXIT(et);
if (ia == NULL)
in6_ifattach_linklocal(ifp, altifp);
else
ifa_free(&ia->ia_ifa);
c
// in6.c, in6ifa_ifpforlinklocal():
CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
if (ifa->ifa_addr->sa_family != AF_INET6)
continue;
if (IN6_IS_ADDR_LINKLOCAL(IFA_IN6(ifa))) {
if ((((struct in6_ifaddr *)ifa)->ia6_flags & ignoreflags) != 0)
continue;
ifa_ref(ifa);
break;
}
}
Same gating logic.
Fetched directly from raw.githubusercontent.com/freebsd/freebsd-src/releng/15.1/sys/netinet6/ (that branch is exactly where the p3 errata patches land, so this is the correct source):
c
// in6_ifattach.c, in6_ifattach():
NET_EPOCH_ENTER(et);
ia = in6ifa_ifpforlinklocal(ifp, 0);
NET_EPOCH_EXIT(et);
if (ia == NULL)
in6_ifattach_linklocal(ifp, altifp);
else
ifa_free(&ia->ia_ifa);
c
// in6.c, in6ifa_ifpforlinklocal():
CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
if (ifa->ifa_addr->sa_family != AF_INET6)
continue;
if (IN6_IS_ADDR_LINKLOCAL(IFA_IN6(ifa))) {
if ((((struct in6_ifaddr *)ifa)->ia6_flags & ignoreflags) != 0)
continue;
ifa_ref(ifa);
break;
}
}
Same gating logic.
"