From 571eeba9092e18b9f082f8c933ecc1ae20e8997f Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 2 Oct 2020 18:07:32 +0900 Subject: [PATCH] network: introduce link_deserialize_dhcp4() --- src/network/networkd-dhcp4.c | 57 +++++++++++++++++++++++++++++------- src/network/networkd-dhcp4.h | 2 ++ src/network/networkd-link.c | 24 ++------------- 3 files changed, 51 insertions(+), 32 deletions(-) diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c index 59c68744c0..91abe888cb 100644 --- a/src/network/networkd-dhcp4.c +++ b/src/network/networkd-dhcp4.c @@ -1241,6 +1241,25 @@ int dhcp4_set_client_identifier(Link *link) { return 0; } +static int dhcp4_init(Link *link) { + int r; + + assert(link); + + if (link->dhcp_client) + return 0; + + r = sd_dhcp_client_new(&link->dhcp_client, link->network->dhcp_anonymize); + if (r < 0) + return r; + + r = sd_dhcp_client_attach_event(link->dhcp_client, link->manager->event, 0); + if (r < 0) + return r; + + return 0; +} + int dhcp4_configure(Link *link) { sd_dhcp_option *send_option; void *request_options; @@ -1250,17 +1269,9 @@ int dhcp4_configure(Link *link) { assert(link->network); assert(link->network->dhcp & ADDRESS_FAMILY_IPV4); - if (!link->dhcp_client) { - r = sd_dhcp_client_new(&link->dhcp_client, link->network->dhcp_anonymize); - if (r == -ENOMEM) - return log_oom(); - if (r < 0) - return log_link_error_errno(link, r, "DHCP4 CLIENT: Failed to create DHCP4 client: %m"); - - r = sd_dhcp_client_attach_event(link->dhcp_client, NULL, 0); - if (r < 0) - return log_link_error_errno(link, r, "DHCP4 CLIENT: Failed to attach event: %m"); - } + r = dhcp4_init(link); + if (r < 0) + return log_link_error_errno(link, r, "DHCP4 CLIENT: Failed to initialize DHCP4 client: %m"); r = sd_dhcp_client_set_mac(link->dhcp_client, (const uint8_t *) &link->mac, @@ -1420,6 +1431,30 @@ int dhcp4_configure(Link *link) { return dhcp4_set_client_identifier(link); } +int link_deserialize_dhcp4(Link *link, const char *dhcp4_address) { + union in_addr_union address; + int r; + + assert(link); + + if (isempty(dhcp4_address)) + return 0; + + r = in_addr_from_string(AF_INET, dhcp4_address, &address); + if (r < 0) + return log_link_debug_errno(link, r, "Failed to parse DHCPv4 address: %s", dhcp4_address); + + r = dhcp4_init(link); + if (r < 0) + return log_link_debug_errno(link, r, "Failed to initialize DHCPv4 client: %m"); + + r = sd_dhcp_client_set_request_address(link->dhcp_client, &address.in); + if (r < 0) + return log_link_debug_errno(link, r, "Failed to set initial DHCPv4 address %s: %m", dhcp4_address); + + return 0; +} + 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 7a80897ffc..5fe1cb323c 100644 --- a/src/network/networkd-dhcp4.h +++ b/src/network/networkd-dhcp4.h @@ -21,6 +21,8 @@ int dhcp4_configure(Link *link); int dhcp4_set_client_identifier(Link *link); int dhcp4_set_promote_secondaries(Link *link); +int link_deserialize_dhcp4(Link *link, const char *dhcp4_address); + CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_client_identifier); CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_acl_ip_address); CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_max_attempts); diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 04038e986c..7f96c52a04 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -2726,27 +2726,9 @@ network_file_fail: if (r < 0) log_link_warning_errno(link, r, "Failed to load routes from %s, ignoring: %m", link->state_file); - if (dhcp4_address) { - r = in_addr_from_string(AF_INET, dhcp4_address, &address); - if (r < 0) { - log_link_debug_errno(link, r, "Failed to parse DHCPv4 address %s: %m", dhcp4_address); - goto dhcp4_address_fail; - } - - r = sd_dhcp_client_new(&link->dhcp_client, link->network ? link->network->dhcp_anonymize : 0); - if (r < 0) - return log_link_error_errno(link, r, "Failed to create DHCPv4 client: %m"); - - r = sd_dhcp_client_attach_event(link->dhcp_client, NULL, 0); - if (r < 0) - return log_link_error_errno(link, r, "Failed to attach DHCPv4 event: %m"); - - r = sd_dhcp_client_set_request_address(link->dhcp_client, &address.in); - if (r < 0) - return log_link_error_errno(link, r, "Failed to set initial DHCPv4 address %s: %m", dhcp4_address); - } - -dhcp4_address_fail: + r = link_deserialize_dhcp4(link, dhcp4_address); + if (r < 0) + log_link_warning_errno(link, r, "Failed to load DHCPv4 address from %s, ignoring: %m", link->state_file); if (ipv4ll_address) { r = in_addr_from_string(AF_INET, ipv4ll_address, &address);