address->scope = src->scope;
address->cinfo = src->cinfo;
+ if (address_is_ready(address) &&
+ address->family == AF_INET6 &&
+ in6_addr_is_link_local(&address->in_addr.in6) &&
+ in6_addr_is_null(&link->ipv6ll_address)) {
+
+ link->ipv6ll_address = address->in_addr.in6;
+
+ r = link_ipv6ll_gained(link);
+ if (r < 0)
+ return r;
+ }
+
if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
return 0;
if (r < 0)
return r;
}
-
- if (address->family == AF_INET6 &&
- in6_addr_is_link_local(&address->in_addr.in6) &&
- in6_addr_is_null(&link->ipv6ll_address)) {
-
- r = link_ipv6ll_gained(link, &address->in_addr.in6);
- if (r < 0)
- return r;
- }
}
return 0;
return 0;
}
-int link_ipv6ll_gained(Link *link, const struct in6_addr *address) {
+int link_ipv6ll_gained(Link *link) {
int r;
assert(link);
log_link_info(link, "Gained IPv6LL");
- link->ipv6ll_address = *address;
- link_check_ready(link);
+ if (!IN_SET(link->state, LINK_STATE_CONFIGURING, LINK_STATE_CONFIGURED))
+ return 0;
- if (IN_SET(link->state, LINK_STATE_CONFIGURING, LINK_STATE_CONFIGURED)) {
- r = link_acquire_dynamic_ipv6_conf(link);
- if (r < 0) {
- link_enter_failed(link);
- return r;
- }
- }
+ r = link_acquire_dynamic_ipv6_conf(link);
+ if (r < 0)
+ return r;
+ link_check_ready(link);
return 0;
}
bool link_ipv6_enabled(Link *link);
bool link_ipv6ll_enabled(Link *link);
-int link_ipv6ll_gained(Link *link, const struct in6_addr *address);
+int link_ipv6ll_gained(Link *link);
bool link_ipv4ll_enabled(Link *link);