diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2019-07-04 13:52:03 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2019-10-15 01:57:19 +0900 |
commit | ad932b156c159094148bfbb508641fb818f932f1 (patch) | |
tree | 01918ae418c514bf8f4596f72bbe46f6531da70d | |
parent | 1a6bb31faedf6d6feae2a42a6aa02105181d8aea (diff) | |
download | systemd-ad932b156c159094148bfbb508641fb818f932f1.tar.gz |
network: introduce link_reconfigure()
Will be used in later commits.
-rw-r--r-- | src/network/networkd-link.c | 72 | ||||
-rw-r--r-- | src/network/networkd-link.h | 2 |
2 files changed, 74 insertions, 0 deletions
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 6c1cb45492..328295e98a 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -2855,6 +2855,78 @@ static int link_configure_duid(Link *link) { return 0; } +int link_reconfigure(Link *link) { + Network *network; + int r; + + if (IN_SET(link->state, LINK_STATE_PENDING, LINK_STATE_LINGER)) + return 0; + + r = network_get(link->manager, link->sd_device, link->ifname, + &link->mac, &network); + if (r == -ENOENT) { + link_enter_unmanaged(link); + return 0; + } else if (r == 0 && network->unmanaged) { + link_enter_unmanaged(link); + return 0; + } else if (r < 0) + return r; + + if (link->network == network) + return 0; + + log_link_info(link, "Re-configuring with %s", network->filename); + + /* Dropping old .network file */ + r = link_stop_clients(link, false); + if (r < 0) { + link_enter_failed(link); + return r; + } + + if (link_dhcp4_server_enabled(link)) + (void) sd_dhcp_server_stop(link->dhcp_server); + + r = link_drop_config(link); + if (r < 0) + return r; + + if (!IN_SET(link->state, LINK_STATE_UNMANAGED, LINK_STATE_PENDING)) { + log_link_debug(link, "State is %s, dropping config", link_state_to_string(link->state)); + r = link_drop_foreign_config(link); + if (r < 0) + return r; + } + + link_free_carrier_maps(link); + link_free_engines(link); + link->network = network_unref(link->network); + + /* Then, apply new .network file */ + r = network_apply(network, link); + if (r < 0) + return r; + + r = link_new_carrier_maps(link); + if (r < 0) + return r; + + link_set_state(link, LINK_STATE_INITIALIZED); + + /* link_configure_duid() returns 0 if it requests product UUID. In that case, + * link_configure() is called later asynchronously. */ + r = link_configure_duid(link); + if (r <= 0) + return r; + + r = link_configure(link); + if (r < 0) + return r; + + return 0; +} + static int link_initialized_and_synced(Link *link) { Network *network; int r; diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h index d6604c9120..02fcb126c3 100644 --- a/src/network/networkd-link.h +++ b/src/network/networkd-link.h @@ -204,6 +204,8 @@ uint32_t link_get_ipv6_accept_ra_route_table(Link *link); int link_request_set_routes(Link *link); int link_request_set_nexthop(Link *link); +int link_reconfigure(Link *link); + #define ADDRESS_FMT_VAL(address) \ be32toh((address).s_addr) >> 24, \ (be32toh((address).s_addr) >> 16) & 0xFFu, \ |