From b2219cc4b6a2832c29eb82e90625d9c6ac61e73c Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 10 Dec 2020 14:16:22 +0900 Subject: [PATCH 1/3] network: drop assertions to check link state in netlink callback handlers As, the link may be dropped while configuring addresses or routes. Fixes #17920. --- src/network/networkd-address.c | 2 -- src/network/networkd-route.c | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index 18eecf6c8a..59357a6b1c 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -932,8 +932,6 @@ static int address_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) assert(link); assert(link->ifname); assert(link->address_messages > 0); - assert(IN_SET(link->state, LINK_STATE_CONFIGURING, - LINK_STATE_FAILED, LINK_STATE_LINGER)); link->address_messages--; diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index 280c1ee92c..de7c232f15 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -1192,8 +1192,6 @@ static int route_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) { assert(link); assert(link->route_messages > 0); - assert(IN_SET(link->state, LINK_STATE_CONFIGURING, - LINK_STATE_FAILED, LINK_STATE_LINGER)); link->route_messages--; From b788a429d19acda8acb1c4b543da1adc2e49f4a9 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 11 Dec 2020 14:22:35 +0900 Subject: [PATCH 2/3] network: do not assume address ready callback is always set to static addresses --- src/network/networkd-address.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index 59357a6b1c..82daa1135e 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -956,16 +956,11 @@ static int address_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) * will not be called automatically. So, call it here. */ a = set_first(link->static_addresses); if (!a) { - log_link_warning(link, "No static address is stored."); - link_enter_failed(link); + log_link_debug(link, "No static address is stored. Already removed?"); return 1; } - if (!a->callback) { - log_link_warning(link, "Address ready callback is not set."); - link_enter_failed(link); - return 1; - } - r = a->callback(a); + + r = static_address_ready_callback(a); if (r < 0) link_enter_failed(link); } From bd4733da646edbec64251cf72d83c1a9a2588433 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 11 Dec 2020 14:39:46 +0900 Subject: [PATCH 3/3] network: do not configure static configs more than once simultaneously --- src/network/networkd-address.c | 5 +++++ src/network/networkd-mdb.c | 5 +++++ src/network/networkd-neighbor.c | 5 +++++ src/network/networkd-nexthop.c | 5 +++++ src/network/networkd-route.c | 5 +++++ src/network/networkd-routing-policy-rule.c | 5 +++++ src/network/networkd-sriov.c | 9 ++++++++- src/network/tc/tc.c | 9 ++++++++- 8 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index 82daa1135e..9e98b77720 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -1004,6 +1004,11 @@ int link_set_addresses(Link *link) { return 0; } + if (link->address_messages != 0) { + log_link_debug(link, "Static addresses are configuring."); + return 0; + } + ORDERED_HASHMAP_FOREACH(ad, link->network->addresses_by_section) { bool update; diff --git a/src/network/networkd-mdb.c b/src/network/networkd-mdb.c index 0300dced62..7007a8202d 100644 --- a/src/network/networkd-mdb.c +++ b/src/network/networkd-mdb.c @@ -199,6 +199,11 @@ int link_set_bridge_mdb(Link *link) { assert(link); assert(link->manager); + if (link->bridge_mdb_messages != 0) { + log_link_debug(link, "MDB entries are configuring."); + return 0; + } + link->bridge_mdb_configured = false; if (!link->network) diff --git a/src/network/networkd-neighbor.c b/src/network/networkd-neighbor.c index c805d52cf3..847ecd27c3 100644 --- a/src/network/networkd-neighbor.c +++ b/src/network/networkd-neighbor.c @@ -294,6 +294,11 @@ int link_set_neighbors(Link *link) { assert(link->network); assert(link->state != _LINK_STATE_INVALID); + if (link->neighbor_messages != 0) { + log_link_debug(link, "Neighbors are configuring."); + return 0; + } + link->neighbors_configured = false; HASHMAP_FOREACH(neighbor, link->network->neighbors_by_section) { diff --git a/src/network/networkd-nexthop.c b/src/network/networkd-nexthop.c index 4a09b4c912..13f532763d 100644 --- a/src/network/networkd-nexthop.c +++ b/src/network/networkd-nexthop.c @@ -312,6 +312,11 @@ int link_set_nexthop(Link *link) { assert(link); assert(link->network); + if (link->nexthop_messages != 0) { + log_link_debug(link, "Nexthops are configuring."); + return 0; + } + link->static_nexthops_configured = false; HASHMAP_FOREACH(nh, link->network->nexthops_by_section) { diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index de7c232f15..ccacfacf3d 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -1237,6 +1237,11 @@ int link_set_routes(Link *link) { * the addresses now, let's not configure the routes either. */ return 0; + if (link->route_messages != 0) { + log_link_debug(link, "Static routes are configuring."); + return 0; + } + r = link_set_routing_policy_rules(link); if (r < 0) return r; diff --git a/src/network/networkd-routing-policy-rule.c b/src/network/networkd-routing-policy-rule.c index a31fb31fa4..06c597d147 100644 --- a/src/network/networkd-routing-policy-rule.c +++ b/src/network/networkd-routing-policy-rule.c @@ -663,6 +663,11 @@ int link_set_routing_policy_rules(Link *link) { assert(link); assert(link->network); + if (link->routing_policy_rule_messages != 0) { + log_link_debug(link, "Routing policy rules are configuring."); + return 0; + } + link->routing_policy_rules_configured = false; HASHMAP_FOREACH(rule, link->network->rules_by_section) { diff --git a/src/network/networkd-sriov.c b/src/network/networkd-sriov.c index 68f43b5ce6..92c00d79e0 100644 --- a/src/network/networkd-sriov.c +++ b/src/network/networkd-sriov.c @@ -230,8 +230,15 @@ int link_configure_sr_iov(Link *link) { SRIOV *sr_iov; int r; + assert(link); + assert(link->network); + + if (link->sr_iov_messages != 0) { + log_link_debug(link, "SR-IOV is configuring."); + return 0; + } + link->sr_iov_configured = false; - link->sr_iov_messages = 0; ORDERED_HASHMAP_FOREACH(sr_iov, link->network->sr_iov_by_section) { r = sr_iov_configure(link, sr_iov); diff --git a/src/network/tc/tc.c b/src/network/tc/tc.c index c32b040919..0cd46cf633 100644 --- a/src/network/tc/tc.c +++ b/src/network/tc/tc.c @@ -39,8 +39,15 @@ int link_configure_traffic_control(Link *link) { TrafficControl *tc; int r; + assert(link); + assert(link->network); + + if (link->tc_messages != 0) { + log_link_debug(link, "Traffic control is configuring."); + return 0; + } + link->tc_configured = false; - link->tc_messages = 0; ORDERED_HASHMAP_FOREACH(tc, link->network->tc_by_section) { r = traffic_control_configure(link, tc);