]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: introduce dhcp6_update_mac()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 2 Oct 2020 11:41:41 +0000 (20:41 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 6 Oct 2020 17:50:51 +0000 (02:50 +0900)
src/network/networkd-dhcp6.c
src/network/networkd-dhcp6.h
src/network/networkd-link.c

index c835e5168f184e8e8d43c6ff52d236abfa29e116..5724d083fc38a7bdedd52c978943f8aa3f99e2dc 100644 (file)
@@ -1344,12 +1344,43 @@ static bool dhcp6_enable_prefix_delegation(Link *dhcp6_link) {
         return false;
 }
 
+static int dhcp6_set_identifier(Link *link, sd_dhcp6_client *client) {
+        const DUID *duid;
+        int r;
+
+        assert(link);
+        assert(link->network);
+        assert(client);
+
+        r = sd_dhcp6_client_set_mac(client, (const uint8_t *) &link->mac, sizeof (link->mac), ARPHRD_ETHER);
+        if (r < 0)
+                return r;
+
+        if (link->network->iaid_set) {
+                r = sd_dhcp6_client_set_iaid(client, link->network->iaid);
+                if (r < 0)
+                        return r;
+        }
+
+        duid = link_get_duid(link);
+        if (duid->type == DUID_TYPE_LLT && duid->raw_data_len == 0)
+                r = sd_dhcp6_client_set_duid_llt(client, duid->llt_time);
+        else
+                r = sd_dhcp6_client_set_duid(client,
+                                             duid->type,
+                                             duid->raw_data_len > 0 ? duid->raw_data : NULL,
+                                             duid->raw_data_len);
+        if (r < 0)
+                return r;
+
+        return 0;
+}
+
 int dhcp6_configure(Link *link) {
         _cleanup_(sd_dhcp6_client_unrefp) sd_dhcp6_client *client = NULL;
         sd_dhcp6_option *vendor_option;
         sd_dhcp6_option *send_option;
         void *request_options;
-        const DUID *duid;
         int r;
 
         assert(link);
@@ -1368,28 +1399,9 @@ int dhcp6_configure(Link *link) {
         if (r < 0)
                 return log_link_error_errno(link, r, "DHCP6 CLIENT: Failed to attach event: %m");
 
-        r = sd_dhcp6_client_set_mac(client,
-                                    (const uint8_t *) &link->mac,
-                                    sizeof (link->mac), ARPHRD_ETHER);
+        r = dhcp6_set_identifier(link, client);
         if (r < 0)
-                return log_link_error_errno(link, r, "DHCP6 CLIENT: Failed to set MAC address: %m");
-
-        if (link->network->iaid_set) {
-                r = sd_dhcp6_client_set_iaid(client, link->network->iaid);
-                if (r < 0)
-                        return log_link_error_errno(link, r, "DHCP6 CLIENT: Failed to set IAID: %m");
-        }
-
-        duid = link_get_duid(link);
-        if (duid->type == DUID_TYPE_LLT && duid->raw_data_len == 0)
-                r = sd_dhcp6_client_set_duid_llt(client, duid->llt_time);
-        else
-                r = sd_dhcp6_client_set_duid(client,
-                                             duid->type,
-                                             duid->raw_data_len > 0 ? duid->raw_data : NULL,
-                                             duid->raw_data_len);
-        if (r < 0)
-                return log_link_error_errno(link, r, "DHCP6 CLIENT: Failed to set DUID: %m");
+                return log_link_error_errno(link, r, "DHCP6 CLIENT: Failed to set identifier: %m");
 
         ORDERED_HASHMAP_FOREACH(send_option, link->network->dhcp6_client_send_options) {
                 r = sd_dhcp6_client_add_option(client, send_option);
@@ -1472,6 +1484,36 @@ int dhcp6_configure(Link *link) {
         return 0;
 }
 
+int dhcp6_update_mac(Link *link) {
+        bool restart;
+        int r;
+
+        assert(link);
+
+        if (!link->dhcp6_client)
+                return 0;
+
+        restart = sd_dhcp6_client_is_running(link->dhcp6_client) > 0;
+
+        if (restart) {
+                r = sd_dhcp6_client_stop(link->dhcp6_client);
+                if (r < 0)
+                        return r;
+        }
+
+        r = dhcp6_set_identifier(link, link->dhcp6_client);
+        if (r < 0)
+                return r;
+
+        if (restart) {
+                r = sd_dhcp6_client_start(link->dhcp6_client);
+                if (r < 0)
+                        return log_link_warning_errno(link, r, "Could not restart DHCPv6 client: %m");
+        }
+
+        return 0;
+}
+
 int link_serialize_dhcp6_client(Link *link, FILE *f) {
         _cleanup_free_ char *duid = NULL;
         uint32_t iaid;
index ae2cbcc988404192662ad647176b35de0b487ffd..4956c90915a14657233450cb68a62199ed173f76 100644 (file)
@@ -29,6 +29,7 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(DHCP6DelegatedPrefix*, dhcp6_pd_free);
 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_request_address(Link *link, int ir);
 int dhcp6_request_prefix_delegation(Link *link);
 
index 59a0166cab6b5c353d2a960e4b900b548f51a589..bcf193b08994176409b0b1cae28757fae4bbf72a 100644 (file)
@@ -3043,42 +3043,9 @@ int link_update(Link *link, sd_netlink_message *m) {
                 if (r < 0)
                         return log_link_warning_errno(link, r, "Could not update MAC address in DHCP client: %m");
 
-                if (link->dhcp6_client) {
-                        const DUID* duid = link_get_duid(link);
-                        bool restart = sd_dhcp6_client_is_running(link->dhcp6_client) > 0;
-
-                        if (restart) {
-                                r = sd_dhcp6_client_stop(link->dhcp6_client);
-                                if (r < 0)
-                                        return log_link_warning_errno(link, r, "Could not stop DHCPv6 client: %m");
-                        }
-
-                        r = sd_dhcp6_client_set_mac(link->dhcp6_client,
-                                                    (const uint8_t *) &link->mac,
-                                                    sizeof (link->mac),
-                                                    ARPHRD_ETHER);
-                        if (r < 0)
-                                return log_link_warning_errno(link, r, "Could not update MAC address in DHCPv6 client: %m");
-
-                        if (link->network->iaid_set) {
-                                r = sd_dhcp6_client_set_iaid(link->dhcp6_client, link->network->iaid);
-                                if (r < 0)
-                                        return log_link_warning_errno(link, r, "Could not update DHCPv6 IAID: %m");
-                        }
-
-                        r = sd_dhcp6_client_set_duid(link->dhcp6_client,
-                                                     duid->type,
-                                                     duid->raw_data_len > 0 ? duid->raw_data : NULL,
-                                                     duid->raw_data_len);
-                        if (r < 0)
-                                return log_link_warning_errno(link, r, "Could not update DHCPv6 DUID: %m");
-
-                        if (restart) {
-                                r = sd_dhcp6_client_start(link->dhcp6_client);
-                                if (r < 0)
-                                        return log_link_warning_errno(link, r, "Could not restart DHCPv6 client: %m");
-                        }
-                }
+                r = dhcp6_update_mac(link);
+                if (r < 0)
+                        return log_link_warning_errno(link, r, "Could not update MAC address in DHCPv6 client: %m");
 
                 if (link->radv) {
                         bool restart = sd_radv_is_running(link->radv);