diff options
Diffstat (limited to 'src/network')
-rw-r--r-- | src/network/networkd-dhcp-common.c | 126 | ||||
-rw-r--r-- | src/network/networkd-dhcp-common.h | 2 | ||||
-rw-r--r-- | src/network/networkd-dhcp4.c | 27 | ||||
-rw-r--r-- | src/network/networkd-dhcp4.h | 1 | ||||
-rw-r--r-- | src/network/networkd-dhcp6.c | 29 | ||||
-rw-r--r-- | src/network/networkd-dhcp6.h | 1 | ||||
-rw-r--r-- | src/network/networkd-link.c | 43 | ||||
-rw-r--r-- | src/network/networkd-manager.c | 1 | ||||
-rw-r--r-- | src/network/networkd-manager.h | 1 | ||||
-rw-r--r-- | src/network/networkd-ndisc.c | 11 | ||||
-rw-r--r-- | src/network/networkd-ndisc.h | 1 | ||||
-rw-r--r-- | src/network/networkd-network.c | 5 |
12 files changed, 122 insertions, 126 deletions
diff --git a/src/network/networkd-dhcp-common.c b/src/network/networkd-dhcp-common.c index cbe2f67c94..b311dce490 100644 --- a/src/network/networkd-dhcp-common.c +++ b/src/network/networkd-dhcp-common.c @@ -86,19 +86,42 @@ DUID* link_get_duid(Link *link, int family) { return duid; } -static int duid_set_uuid(DUID *duid, sd_id128_t uuid) { - assert(duid); +static int link_configure_and_start_dhcp_delayed(Link *link) { + int r; - if (duid->raw_data_len > 0) + assert(link); + + if (!IN_SET(link->state, LINK_STATE_CONFIGURING, LINK_STATE_CONFIGURED)) return 0; - if (duid->type != DUID_TYPE_UUID) - return -EINVAL; + if (!link->dhcp_client) { + r = dhcp4_configure(link); + if (r < 0) + return r; + } + + if (!link->dhcp6_client) { + r = dhcp6_configure(link); + if (r < 0) + return r; + } - memcpy(&duid->raw_data, &uuid, sizeof(sd_id128_t)); - duid->raw_data_len = sizeof(sd_id128_t); + if (!link_has_carrier(link)) + return 0; - return 1; + r = dhcp4_start(link); + if (r < 0) + return log_link_warning_errno(link, r, "Failed to start DHCPv4 client: %m"); + + r = ndisc_start(link); + if (r < 0) + return log_link_warning_errno(link, r, "Failed to start IPv6 Router Discovery: %m"); + + r = dhcp6_start(link); + if (r < 0) + return log_link_warning_errno(link, r, "Failed to start DHCPv6 client: %m"); + + return 0; } static int get_product_uuid_handler(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) { @@ -106,7 +129,6 @@ static int get_product_uuid_handler(sd_bus_message *m, void *userdata, sd_bus_er const sd_bus_error *e; const void *a; size_t sz; - DUID *duid; Link *link; int r; @@ -133,26 +155,22 @@ static int get_product_uuid_handler(sd_bus_message *m, void *userdata, sd_bus_er } memcpy(&manager->product_uuid, a, sz); - while ((duid = set_steal_first(manager->duids_requesting_uuid))) - (void) duid_set_uuid(duid, manager->product_uuid); - - manager->duids_requesting_uuid = set_free(manager->duids_requesting_uuid); configure: - while ((link = set_steal_first(manager->links_requesting_uuid))) { - link_unref(link); + /* To avoid calling GetProductUUID() bus method so frequently, set the flag below + * even if the method fails. */ + manager->has_product_uuid = true; - r = link_configure(link); + while ((link = set_steal_first(manager->links_requesting_uuid))) { + r = link_configure_and_start_dhcp_delayed(link); if (r < 0) link_enter_failed(link); + + link_unref(link); } manager->links_requesting_uuid = set_free(manager->links_requesting_uuid); - /* To avoid calling GetProductUUID() bus method so frequently, set the flag below - * even if the method fails. */ - manager->has_product_uuid = true; - return 1; } @@ -190,66 +208,22 @@ int manager_request_product_uuid(Manager *m) { return 0; } -static bool dhcp4_requires_uuid(Link *link) { - const DUID *duid; - - assert(link); - - if (!link_dhcp4_enabled(link)) - return false; - - if (!IN_SET(link->network->dhcp_client_identifier, DHCP_CLIENT_ID_DUID, DHCP_CLIENT_ID_DUID_ONLY)) - return false; - - duid = link_get_dhcp4_duid(link); - if (duid->type != DUID_TYPE_UUID || duid->raw_data_len != 0) - return false; - - return true; -} - -static bool dhcp6_requires_uuid(Link *link) { - const DUID *duid; - - assert(link); - - if (!link_dhcp6_enabled(link) && !link_ipv6_accept_ra_enabled(link)) - return false; - - duid = link_get_dhcp6_duid(link); - if (duid->type != DUID_TYPE_UUID || duid->raw_data_len != 0) - return false; - - return true; -} - -static bool link_requires_uuid(Link *link) { - return dhcp4_requires_uuid(link) || dhcp6_requires_uuid(link); -} - -int link_configure_duid(Link *link) { +int dhcp_configure_duid(Link *link, DUID *duid) { Manager *m; - DUID *duid; int r; assert(link); assert(link->manager); - assert(link->network); + assert(duid); m = link->manager; - if (!link_requires_uuid(link)) + if (duid->type != DUID_TYPE_UUID || duid->raw_data_len != 0) return 1; if (m->has_product_uuid) { - if (dhcp4_requires_uuid(link)) { - duid = link_get_dhcp4_duid(link); - (void) duid_set_uuid(duid, m->product_uuid); - } - if (dhcp6_requires_uuid(link)) { - duid = link_get_dhcp6_duid(link); - (void) duid_set_uuid(duid, m->product_uuid); - } + memcpy(&duid->raw_data, &m->product_uuid, sizeof(sd_id128_t)); + duid->raw_data_len = sizeof(sd_id128_t); return 1; } @@ -266,20 +240,6 @@ int link_configure_duid(Link *link) { if (r > 0) link_ref(link); - if (dhcp4_requires_uuid(link)) { - duid = link_get_dhcp4_duid(link); - r = set_ensure_put(&m->duids_requesting_uuid, NULL, duid); - if (r < 0) - return log_oom(); - } - - if (dhcp6_requires_uuid(link)) { - duid = link_get_dhcp6_duid(link); - r = set_ensure_put(&m->duids_requesting_uuid, NULL, duid); - if (r < 0) - return log_oom(); - } - return 0; } diff --git a/src/network/networkd-dhcp-common.h b/src/network/networkd-dhcp-common.h index 6b462b3bd2..fc85fb4706 100644 --- a/src/network/networkd-dhcp-common.h +++ b/src/network/networkd-dhcp-common.h @@ -60,7 +60,7 @@ static inline DUID *link_get_dhcp6_duid(Link *link) { return link_get_duid(link, AF_INET6); } -int link_configure_duid(Link *link); +int dhcp_configure_duid(Link *link, DUID *duid); int manager_request_product_uuid(Manager *m); const char* dhcp_use_domains_to_string(DHCPUseDomains p) _const_; diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c index 5c4e1d789c..4987c8fc53 100644 --- a/src/network/networkd-dhcp4.c +++ b/src/network/networkd-dhcp4.c @@ -1284,6 +1284,15 @@ static int dhcp4_set_client_identifier(Link *link) { return 0; } +static int dhcp4_configure_duid(Link *link) { + assert(link); + + if (!IN_SET(link->network->dhcp_client_identifier, DHCP_CLIENT_ID_DUID, DHCP_CLIENT_ID_DUID_ONLY)) + return 1; + + return dhcp_configure_duid(link, link_get_dhcp4_duid(link)); +} + static int dhcp4_set_request_address(Link *link) { Address *a; @@ -1323,6 +1332,10 @@ int dhcp4_configure(Link *link) { if (link->dhcp_client) return -EBUSY; /* Already configured. */ + r = dhcp4_configure_duid(link); + if (r <= 0) + return r; + r = sd_dhcp_client_new(&link->dhcp_client, link->network->dhcp_anonymize); if (r < 0) return log_link_warning_errno(link, r, "DHCP4 CLIENT: Failed to allocate DHCP4 client: %m"); @@ -1505,6 +1518,20 @@ int dhcp4_update_mac(Link *link) { return 0; } +int dhcp4_start(Link *link) { + assert(link); + + if (!link->dhcp_client) + return 0; + + if (sd_dhcp_client_is_running(link->dhcp_client) > 0) + return 0; + + log_link_debug(link, "Acquiring DHCPv4 lease"); + + return sd_dhcp_client_start(link->dhcp_client); +} + int config_parse_dhcp_max_attempts( const char *unit, const char *filename, diff --git a/src/network/networkd-dhcp4.h b/src/network/networkd-dhcp4.h index cfad656c3d..a33fe403be 100644 --- a/src/network/networkd-dhcp4.h +++ b/src/network/networkd-dhcp4.h @@ -20,6 +20,7 @@ typedef enum DHCPClientIdentifier { void network_adjust_dhcp4(Network *network); int dhcp4_configure(Link *link); int dhcp4_update_mac(Link *link); +int dhcp4_start(Link *link); CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_client_identifier); CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_acl_ip_address); diff --git a/src/network/networkd-dhcp6.c b/src/network/networkd-dhcp6.c index 4cd479c584..617bf6b07c 100644 --- a/src/network/networkd-dhcp6.c +++ b/src/network/networkd-dhcp6.c @@ -1290,6 +1290,31 @@ int dhcp6_request_address(Link *link, int ir) { return 0; } +int dhcp6_start(Link *link) { + assert(link); + + if (!link->dhcp6_client) + return 0; + + if (!link_dhcp6_enabled(link)) + return 0; + + if (link->network->dhcp6_without_ra == DHCP6_CLIENT_START_MODE_NO) + return 0; + + if (!in6_addr_is_link_local(&link->ipv6ll_address)) { + log_link_debug(link, "IPv6 link-local address is not set, delaying to start DHCPv6 client."); + return 0; + } + + if (sd_dhcp6_client_is_running(link->dhcp6_client) > 0) + return 0; + + log_link_debug(link, "Acquiring DHCPv6 lease"); + + return dhcp6_request_address(link, link->network->dhcp6_without_ra == DHCP6_CLIENT_START_MODE_INFORMATION_REQUEST); +} + int dhcp6_request_prefix_delegation(Link *link) { Link *l; @@ -1460,6 +1485,10 @@ int dhcp6_configure(Link *link) { if (link->dhcp6_client) return -EBUSY; + r = dhcp_configure_duid(link, link_get_dhcp6_duid(link)); + if (r <= 0) + return r; + r = sd_dhcp6_client_new(&client); if (r == -ENOMEM) return log_oom(); diff --git a/src/network/networkd-dhcp6.h b/src/network/networkd-dhcp6.h index a8028a95ab..025bbb6188 100644 --- a/src/network/networkd-dhcp6.h +++ b/src/network/networkd-dhcp6.h @@ -31,6 +31,7 @@ bool link_dhcp6_pd_is_enabled(Link *link); int dhcp6_pd_remove(Link *link); int dhcp6_configure(Link *link); int dhcp6_update_mac(Link *link); +int dhcp6_start(Link *link); int dhcp6_request_address(Link *link, int ir); int dhcp6_request_prefix_delegation(Link *link); diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 5143502745..2c8c8cd414 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -1177,14 +1177,6 @@ static int link_acquire_ipv6_conf(Link *link) { assert(link); - if (link->ndisc) { - log_link_debug(link, "Discovering IPv6 routers"); - - r = sd_ndisc_start(link->ndisc); - if (r < 0 && r != -EBUSY) - return log_link_warning_errno(link, r, "Could not start IPv6 Router Discovery: %m"); - } - if (link->radv) { assert(link->radv); assert(in6_addr_is_link_local(&link->ipv6ll_address)); @@ -1200,18 +1192,13 @@ static int link_acquire_ipv6_conf(Link *link) { return log_link_warning_errno(link, r, "Could not start IPv6 Router Advertisement: %m"); } - if (link_dhcp6_enabled(link) && IN_SET(link->network->dhcp6_without_ra, - DHCP6_CLIENT_START_MODE_INFORMATION_REQUEST, - DHCP6_CLIENT_START_MODE_SOLICIT)) { - assert(link->dhcp6_client); - assert(in6_addr_is_link_local(&link->ipv6ll_address)); + r = ndisc_start(link); + if (r < 0) + return log_link_warning_errno(link, r, "Failed to start IPv6 Router Discovery: %m"); - r = dhcp6_request_address(link, link->network->dhcp6_without_ra == DHCP6_CLIENT_START_MODE_INFORMATION_REQUEST); - if (r < 0 && r != -EBUSY) - return log_link_warning_errno(link, r, "Could not acquire DHCPv6 lease: %m"); - else - log_link_debug(link, "Acquiring DHCPv6 lease"); - } + r = dhcp6_start(link); + if (r < 0) + return log_link_warning_errno(link, r, "Failed to start DHCPv6 client: %m"); r = dhcp6_request_prefix_delegation(link); if (r < 0) @@ -1228,11 +1215,9 @@ static int link_acquire_ipv4_conf(Link *link) { assert(link->manager->event); if (link->dhcp_client) { - log_link_debug(link, "Acquiring DHCPv4 lease"); - - r = sd_dhcp_client_start(link->dhcp_client); + r = dhcp4_start(link); if (r < 0) - return log_link_warning_errno(link, r, "Could not acquire DHCPv4 lease: %m"); + return log_link_warning_errno(link, r, "Failed to start DHCPv4 client: %m"); } else if (link->ipv4ll) { log_link_debug(link, "Acquiring IPv4 link-local address"); @@ -2252,12 +2237,6 @@ static int link_reconfigure_internal(Link *link, sd_netlink_message *m, bool for link_set_state(link, LINK_STATE_INITIALIZED); link->activated = false; - /* 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; @@ -2372,12 +2351,6 @@ static int link_initialized_and_synced(Link *link) { if (r < 0) return r; - /* 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; diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index 7beabf7e6f..fce1d03de5 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -452,7 +452,6 @@ Manager* manager_free(Manager *m) { m->links_requesting_uuid = set_free_with_destructor(m->links_requesting_uuid, link_unref); m->links = hashmap_free_with_destructor(m->links, link_unref); - m->duids_requesting_uuid = set_free(m->duids_requesting_uuid); m->networks = ordered_hashmap_free_with_destructor(m->networks, network_unref); m->netdevs = hashmap_free_with_destructor(m->netdevs, netdev_unref); diff --git a/src/network/networkd-manager.h b/src/network/networkd-manager.h index bb2cad1883..9cb99325db 100644 --- a/src/network/networkd-manager.h +++ b/src/network/networkd-manager.h @@ -58,7 +58,6 @@ struct Manager { bool has_product_uuid; bool product_uuid_requested; Set *links_requesting_uuid; - Set *duids_requesting_uuid; char* dynamic_hostname; char* dynamic_timezone; diff --git a/src/network/networkd-ndisc.c b/src/network/networkd-ndisc.c index b02f67c770..af2d6a3ef7 100644 --- a/src/network/networkd-ndisc.c +++ b/src/network/networkd-ndisc.c @@ -1341,6 +1341,17 @@ int ndisc_configure(Link *link) { return 0; } +int ndisc_start(Link *link) { + assert(link); + + if (!link->ndisc || !link->dhcp6_client) + return 0; + + log_link_debug(link, "Discovering IPv6 routers"); + + return sd_ndisc_start(link->ndisc); +} + void ndisc_vacuum(Link *link) { NDiscRDNSS *r; NDiscDNSSL *d; diff --git a/src/network/networkd-ndisc.h b/src/network/networkd-ndisc.h index 13e9547311..2ff9a8969d 100644 --- a/src/network/networkd-ndisc.h +++ b/src/network/networkd-ndisc.h @@ -73,6 +73,7 @@ bool link_ipv6_accept_ra_enabled(Link *link); void network_adjust_ipv6_accept_ra(Network *network); int ndisc_configure(Link *link); +int ndisc_start(Link *link); void ndisc_vacuum(Link *link); void ndisc_flush(Link *link); diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 736f0d593b..239cb1e7cb 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -600,11 +600,6 @@ static Network *network_free(Network *network) { ordered_hashmap_free_with_destructor(network->sr_iov_by_section, sr_iov_free); ordered_hashmap_free_with_destructor(network->tc_by_section, traffic_control_free); - if (network->manager) { - set_remove(network->manager->duids_requesting_uuid, &network->dhcp_duid); - set_remove(network->manager->duids_requesting_uuid, &network->dhcp6_duid); - } - free(network->name); free(network->dhcp_server_timezone); |