networkd: Use only a generic CONFIGURING state

This allows us to convey that we are performing multiple link
configuration changes in parallel. This is needed to support configuring
neighbors while simultaneously configuring addresses and routes.
This commit is contained in:
William A. Kennington III 2018-11-30 15:36:33 -08:00
parent c42ff3a1a7
commit 289e6774d0
2 changed files with 18 additions and 23 deletions

View File

@ -719,7 +719,7 @@ static void link_enter_configured(Link *link) {
assert(link);
assert(link->network);
if (link->state != LINK_STATE_SETTING_ROUTES)
if (link->state != LINK_STATE_CONFIGURING)
return;
log_link_info(link, "Configured");
@ -824,9 +824,8 @@ 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_SETTING_ADDRESSES,
LINK_STATE_SETTING_ROUTES, LINK_STATE_FAILED,
LINK_STATE_LINGER));
assert(IN_SET(link->state, LINK_STATE_CONFIGURING,
LINK_STATE_FAILED, LINK_STATE_LINGER));
link->route_messages--;
@ -846,7 +845,7 @@ static int route_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
return 1;
}
static int link_enter_set_routes(Link *link) {
static int link_request_set_routes(Link *link) {
enum {
PHASE_NON_GATEWAY, /* First phase: Routes without a gateway */
PHASE_GATEWAY, /* Second phase: Routes with a gateway */
@ -859,12 +858,12 @@ static int link_enter_set_routes(Link *link) {
assert(link->network);
assert(link->addresses_configured);
assert(link->address_messages == 0);
assert(link->state == LINK_STATE_SETTING_ADDRESSES);
assert(link->state != _LINK_STATE_INVALID);
link_set_state(link, LINK_STATE_CONFIGURING);
(void) link_set_routing_policy_rule(link);
link_set_state(link, LINK_STATE_SETTING_ROUTES);
/* First add the routes that enable us to talk to gateways, then add in the others that need a gateway. */
for (phase = 0; phase < _PHASE_MAX; phase++)
LIST_FOREACH(routes, rt, link->network->static_routes) {
@ -899,7 +898,7 @@ 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_SETTING_ADDRESSES,
assert(IN_SET(link->state, LINK_STATE_CONFIGURING,
LINK_STATE_FAILED, LINK_STATE_LINGER));
link->address_messages--;
@ -916,7 +915,7 @@ static int address_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link)
if (link->address_messages == 0) {
log_link_debug(link, "Addresses set");
link->addresses_configured = true;
link_enter_set_routes(link);
link_request_set_routes(link);
}
return 1;
@ -1033,7 +1032,7 @@ static int link_set_bridge_fdb(Link *link) {
return 0;
}
static int link_enter_set_addresses(Link *link) {
static int link_request_set_addresses(Link *link) {
AddressLabel *label;
Address *ad;
int r;
@ -1046,7 +1045,7 @@ static int link_enter_set_addresses(Link *link) {
if (r < 0)
return r;
link_set_state(link, LINK_STATE_SETTING_ADDRESSES);
link_set_state(link, LINK_STATE_CONFIGURING);
LIST_FOREACH(addresses, ad, link->network->static_addresses) {
r = address_configure(ad, link, address_handler, false);
@ -1189,7 +1188,7 @@ static int link_enter_set_addresses(Link *link) {
if (link->address_messages == 0) {
link->addresses_configured = true;
link_enter_set_routes(link);
link_request_set_routes(link);
} else
log_link_debug(link, "Setting addresses");
@ -2276,7 +2275,7 @@ static int link_joined(Link *link) {
if (!link_has_carrier(link) && !link->network->configure_without_carrier)
return 0;
return link_enter_set_addresses(link);
return link_request_set_addresses(link);
}
static int netdev_join_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
@ -2313,7 +2312,7 @@ static int link_enter_join_netdev(Link *link) {
assert(link->network);
assert(link->state == LINK_STATE_PENDING);
link_set_state(link, LINK_STATE_ENSLAVING);
link_set_state(link, LINK_STATE_CONFIGURING);
link_dirty(link);
@ -3426,7 +3425,7 @@ static int link_carrier_gained(Link *link) {
return r;
}
r = link_enter_set_addresses(link);
r = link_request_set_addresses(link);
if (r < 0)
return r;
}
@ -3509,7 +3508,7 @@ int link_update(Link *link, sd_netlink_message *m) {
if (link->state == LINK_STATE_LINGER) {
log_link_info(link, "Link readded");
link_set_state(link, LINK_STATE_ENSLAVING);
link_set_state(link, LINK_STATE_CONFIGURING);
r = link_new_carrier_maps(link);
if (r < 0)
@ -4037,9 +4036,7 @@ void link_clean(Link *link) {
static const char* const link_state_table[_LINK_STATE_MAX] = {
[LINK_STATE_PENDING] = "pending",
[LINK_STATE_ENSLAVING] = "configuring",
[LINK_STATE_SETTING_ADDRESSES] = "configuring",
[LINK_STATE_SETTING_ROUTES] = "configuring",
[LINK_STATE_CONFIGURING] = "configuring",
[LINK_STATE_CONFIGURED] = "configured",
[LINK_STATE_UNMANAGED] = "unmanaged",
[LINK_STATE_FAILED] = "failed",

View File

@ -19,9 +19,7 @@
typedef enum LinkState {
LINK_STATE_PENDING,
LINK_STATE_ENSLAVING,
LINK_STATE_SETTING_ADDRESSES,
LINK_STATE_SETTING_ROUTES,
LINK_STATE_CONFIGURING,
LINK_STATE_CONFIGURED,
LINK_STATE_UNMANAGED,
LINK_STATE_FAILED,