summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2019-07-04 13:52:03 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2019-10-15 01:57:19 +0900
commitad932b156c159094148bfbb508641fb818f932f1 (patch)
tree01918ae418c514bf8f4596f72bbe46f6531da70d
parent1a6bb31faedf6d6feae2a42a6aa02105181d8aea (diff)
downloadsystemd-ad932b156c159094148bfbb508641fb818f932f1.tar.gz
network: introduce link_reconfigure()
Will be used in later commits.
-rw-r--r--src/network/networkd-link.c72
-rw-r--r--src/network/networkd-link.h2
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, \