From 7657ec3eb81fed61f8ae944c818a33ffc6956560 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Wed, 8 Sep 2021 15:52:53 +0900 Subject: [PATCH] network: store IPv6LL address even if link is in failed state Otherwise, if IPv6LL is received when the link is in failed state, we may fail to reconfigure the link. --- src/network/networkd-address.c | 21 ++++++++++++--------- src/network/networkd-link.c | 19 ++++++++----------- src/network/networkd-link.h | 2 +- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index 08f0982ff0f..5125c60b86c 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -451,6 +451,18 @@ static int address_update(Address *address, const Address *src) { 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; @@ -467,15 +479,6 @@ static int address_update(Address *address, const Address *src) { 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; diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index a5a23a33b44..1f840db22bb 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -701,24 +701,21 @@ static int link_acquire_dynamic_conf(Link *link) { 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; + if (!IN_SET(link->state, LINK_STATE_CONFIGURING, LINK_STATE_CONFIGURED)) + return 0; + + r = link_acquire_dynamic_ipv6_conf(link); + if (r < 0) + return r; + link_check_ready(link); - - 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; - } - } - return 0; } diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h index 79400dee2e9..19e212766e1 100644 --- a/src/network/networkd-link.h +++ b/src/network/networkd-link.h @@ -236,7 +236,7 @@ bool link_has_carrier(Link *link); 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);