From: Yu Watanabe Date: Tue, 16 Jan 2024 16:01:32 +0000 (+0900) Subject: network: several cleanups for LinkOperationalState X-Git-Tag: v256-rc1~1133^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2278d9f66ead0b68acc75c09d27a7761bdee5fb3;p=thirdparty%2Fsystemd.git network: several cleanups for LinkOperationalState - introduce link_required_operstate_for_online() helper function, - use recently introduced macros and helper functions, - unconditionally serialize the minimum and maximum of required operational state. --- diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 9e69624fd2b..d553a716fa4 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -71,6 +71,16 @@ #include "udev-util.h" #include "vrf.h" +void link_required_operstate_for_online(Link *link, LinkOperationalStateRange *ret) { + assert(link); + assert(ret); + + if (link->network && operational_state_range_is_valid(&link->network->required_operstate_for_online)) + *ret = link->network->required_operstate_for_online; + else + *ret = LINK_OPERSTATE_RANGE_DEFAULT; +} + bool link_ipv6_enabled(Link *link) { assert(link); @@ -1845,12 +1855,16 @@ void link_update_operstate(Link *link, bool also_update_master) { else operstate = LINK_OPERSTATE_ENSLAVED; + LinkOperationalStateRange req; + link_required_operstate_for_online(link, &req); + /* Only determine online state for managed links with RequiredForOnline=yes */ if (!link->network || !link->network->required_for_online) online_state = _LINK_ONLINE_STATE_INVALID; - else if (operstate < link->network->required_operstate_for_online.min || - operstate > link->network->required_operstate_for_online.max) + + else if (!operational_state_is_in_range(operstate, &req)) online_state = LINK_ONLINE_STATE_OFFLINE; + else { AddressFamily required_family = link->network->required_family_for_online; bool needs_ipv4 = required_family & ADDRESS_FAMILY_IPV4; @@ -1861,14 +1875,14 @@ void link_update_operstate(Link *link, bool also_update_master) { * to offline in the blocks below. */ online_state = LINK_ONLINE_STATE_ONLINE; - if (link->network->required_operstate_for_online.min >= LINK_OPERSTATE_DEGRADED) { + if (req.min >= LINK_OPERSTATE_DEGRADED) { if (needs_ipv4 && ipv4_address_state < LINK_ADDRESS_STATE_DEGRADED) online_state = LINK_ONLINE_STATE_OFFLINE; if (needs_ipv6 && ipv6_address_state < LINK_ADDRESS_STATE_DEGRADED) online_state = LINK_ONLINE_STATE_OFFLINE; } - if (link->network->required_operstate_for_online.min >= LINK_OPERSTATE_ROUTABLE) { + if (req.min >= LINK_OPERSTATE_ROUTABLE) { if (needs_ipv4 && ipv4_address_state < LINK_ADDRESS_STATE_ROUTABLE) online_state = LINK_ONLINE_STATE_OFFLINE; if (needs_ipv6 && ipv6_address_state < LINK_ADDRESS_STATE_ROUTABLE) diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h index 05b028dff31..b5b1995361a 100644 --- a/src/network/networkd-link.h +++ b/src/network/networkd-link.h @@ -259,3 +259,5 @@ int manager_rtnl_process_link(sd_netlink *rtnl, sd_netlink_message *message, Man int link_flags_to_string_alloc(uint32_t flags, char **ret); const char *kernel_operstate_to_string(int t) _const_; + +void link_required_operstate_for_online(Link *link, LinkOperationalStateRange *ret); diff --git a/src/network/networkd-state-file.c b/src/network/networkd-state-file.c index 9f0e365c22b..b79b898832b 100644 --- a/src/network/networkd-state-file.c +++ b/src/network/networkd-state-file.c @@ -630,11 +630,11 @@ static int link_save(Link *link) { fprintf(f, "REQUIRED_FOR_ONLINE=%s\n", yes_no(link->network->required_for_online)); - LinkOperationalStateRange st = link->network->required_operstate_for_online; - fprintf(f, "REQUIRED_OPER_STATE_FOR_ONLINE=%s%s%s\n", - strempty(link_operstate_to_string(st.min)), - st.max != LINK_OPERSTATE_RANGE_DEFAULT.max ? ":" : "", - st.max != LINK_OPERSTATE_RANGE_DEFAULT.max ? strempty(link_operstate_to_string(st.max)) : ""); + LinkOperationalStateRange st; + link_required_operstate_for_online(link, &st); + + fprintf(f, "REQUIRED_OPER_STATE_FOR_ONLINE=%s:%s\n", + link_operstate_to_string(st.min), link_operstate_to_string(st.max)); fprintf(f, "REQUIRED_FAMILY_FOR_ONLINE=%s\n", link_required_address_family_to_string(link->network->required_family_for_online));