The routing policy rule setup logic is moved to the routes setup phase (rather than the addresses setup phase as it is now). Additionally, a call to `link_check_ready` is added to the routing policy rules setup handler. This prevents a race condition with the routes setup handler.
Also give each async handler its own message counter to prevent race conditions when logging successes.
Fixes: #7614
if (!link->network)
return;
if (!link->network)
return;
- if (!link->static_configured)
+ if (!link->static_routes_configured)
+ return;
+
+ if (!link->routing_policy_rules_configured)
return;
if (link_ipv4ll_enabled(link))
return;
if (link_ipv4ll_enabled(link))
+ link->routing_policy_rule_messages++;
}
routing_policy_rule_purge(link->manager, link);
}
routing_policy_rule_purge(link->manager, link);
+ if (link->routing_policy_rule_messages == 0) {
+ link->routing_policy_rules_configured = true;
+ link_check_ready(link);
+ } else
+ log_link_debug(link, "Setting routing policy rules");
_cleanup_link_unref_ Link *link = userdata;
int r;
_cleanup_link_unref_ Link *link = userdata;
int r;
- assert(link->link_messages > 0);
+ assert(link->route_messages > 0);
assert(IN_SET(link->state, LINK_STATE_SETTING_ADDRESSES,
LINK_STATE_SETTING_ROUTES, LINK_STATE_FAILED,
LINK_STATE_LINGER));
assert(IN_SET(link->state, LINK_STATE_SETTING_ADDRESSES,
LINK_STATE_SETTING_ROUTES, LINK_STATE_FAILED,
LINK_STATE_LINGER));
+ link->route_messages--;
if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
return 1;
if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
return 1;
if (r < 0 && r != -EEXIST)
log_link_warning_errno(link, r, "Could not set route: %m");
if (r < 0 && r != -EEXIST)
log_link_warning_errno(link, r, "Could not set route: %m");
- if (link->link_messages == 0) {
+ if (link->route_messages == 0) {
log_link_debug(link, "Routes set");
log_link_debug(link, "Routes set");
- link->static_configured = true;
+ link->static_routes_configured = true;
link_check_ready(link);
}
link_check_ready(link);
}
+ link->route_messages++;
- if (link->link_messages == 0) {
- link->static_configured = true;
+ (void) link_set_routing_policy_rule(link);
+
+ if (link->route_messages == 0) {
+ link->static_routes_configured = true;
link_check_ready(link);
} else
log_link_debug(link, "Setting routes");
link_check_ready(link);
} else
log_link_debug(link, "Setting routes");
assert(m);
assert(link);
assert(link->ifname);
assert(m);
assert(link);
assert(link->ifname);
- assert(link->link_messages > 0);
+ assert(link->address_messages > 0);
assert(IN_SET(link->state, LINK_STATE_SETTING_ADDRESSES,
LINK_STATE_FAILED, LINK_STATE_LINGER));
assert(IN_SET(link->state, LINK_STATE_SETTING_ADDRESSES,
LINK_STATE_FAILED, LINK_STATE_LINGER));
+ link->address_messages--;
if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
return 1;
if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
return 1;
else if (r >= 0)
manager_rtnl_process_address(rtnl, m, link->manager);
else if (r >= 0)
manager_rtnl_process_address(rtnl, m, link->manager);
- if (link->link_messages == 0) {
+ if (link->address_messages == 0) {
log_link_debug(link, "Addresses set");
link_enter_set_routes(link);
}
log_link_debug(link, "Addresses set");
link_enter_set_routes(link);
}
assert(m);
assert(link);
assert(link->ifname);
assert(m);
assert(link);
assert(link->ifname);
- assert(link->link_messages > 0);
+ assert(link->address_label_messages > 0);
+ link->address_label_messages--;
if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
return 1;
if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
return 1;
else if (r >= 0)
manager_rtnl_process_address(rtnl, m, link->manager);
else if (r >= 0)
manager_rtnl_process_address(rtnl, m, link->manager);
- if (link->link_messages == 0)
+ if (link->address_label_messages == 0)
log_link_debug(link, "Addresses label set");
return 1;
log_link_debug(link, "Addresses label set");
return 1;
+ link->address_messages++;
}
LIST_FOREACH(labels, label, link->network->address_labels) {
}
LIST_FOREACH(labels, label, link->network->address_labels) {
+ link->address_label_messages++;
}
/* now that we can figure out a default address for the dhcp server,
}
/* now that we can figure out a default address for the dhcp server,
log_link_debug(link, "Offering DHCPv4 leases");
}
log_link_debug(link, "Offering DHCPv4 leases");
}
- if (link->link_messages == 0)
+ if (link->address_messages == 0)
link_enter_set_routes(link);
else
log_link_debug(link, "Setting addresses");
link_enter_set_routes(link);
else
log_link_debug(link, "Setting addresses");
- (void) link_set_routing_policy_rule(link);
-
if (link_has_carrier(link) || link->network->configure_without_carrier) {
r = link_acquire_conf(link);
if (r < 0)
if (link_has_carrier(link) || link->network->configure_without_carrier) {
r = link_acquire_conf(link);
if (r < 0)
LinkState state;
LinkOperationalState operstate;
LinkState state;
LinkOperationalState operstate;
- unsigned link_messages;
+ unsigned address_messages;
+ unsigned address_label_messages;
+ unsigned route_messages;
+ unsigned routing_policy_rule_messages;
+ unsigned routing_policy_rule_remove_messages;
unsigned enslaving;
Set *addresses;
unsigned enslaving;
Set *addresses;
bool ipv4ll_address:1;
bool ipv4ll_route:1;
bool ipv4ll_address:1;
bool ipv4ll_route:1;
- bool static_configured;
+ bool static_routes_configured;
+ bool routing_policy_rules_configured;
bool setting_mtu;
LIST_HEAD(Address, pool_addresses);
bool setting_mtu;
LIST_HEAD(Address, pool_addresses);
assert(link);
assert(link->ifname);
assert(link);
assert(link->ifname);
+ link->routing_policy_rule_remove_messages--;
if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
return 1;
if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
return 1;
assert(m);
assert(link);
assert(link->ifname);
assert(m);
assert(link);
assert(link->ifname);
- assert(link->link_messages > 0);
+ assert(link->routing_policy_rule_messages > 0);
+ link->routing_policy_rule_messages--;
if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
return 1;
if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
return 1;
if (r < 0 && r != -EEXIST)
log_link_warning_errno(link, r, "Could not add routing policy rule: %m");
if (r < 0 && r != -EEXIST)
log_link_warning_errno(link, r, "Could not add routing policy rule: %m");
- if (link->link_messages == 0)
+ if (link->routing_policy_rule_messages == 0) {
log_link_debug(link, "Routing policy rule configured");
log_link_debug(link, "Routing policy rule configured");
+ link->routing_policy_rules_configured = true;
+ link_check_ready(link);
+ }
+ link->routing_policy_rule_remove_messages++;