]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: introduce two helper functions for setting IPv6LL address generation mode
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 8 Feb 2022 13:16:38 +0000 (22:16 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 10 Feb 2022 08:34:02 +0000 (17:34 +0900)
src/network/networkd-ipv6ll.c
src/network/networkd-ipv6ll.h
src/network/networkd-setlink.c

index 016df4a1b000ac65eeb311300c70a520d7f593d2..0ff28761f2ad30e8c0368d1645c7da7b2b8b529c 100644 (file)
@@ -74,6 +74,50 @@ bool link_may_have_ipv6ll(Link *link) {
         return false;
 }
 
+IPv6LinkLocalAddressGenMode link_get_ipv6ll_addrgen_mode(Link *link) {
+        assert(link);
+
+        if (!link_ipv6ll_enabled(link))
+                return IPV6_LINK_LOCAL_ADDRESSS_GEN_MODE_NONE;
+
+        if (link->network->ipv6ll_address_gen_mode >= 0)
+                return link->network->ipv6ll_address_gen_mode;
+
+        if (in6_addr_is_set(&link->network->ipv6ll_stable_secret))
+                return IPV6_LINK_LOCAL_ADDRESSS_GEN_MODE_STABLE_PRIVACY;
+
+        return IPV6_LINK_LOCAL_ADDRESSS_GEN_MODE_EUI64;
+}
+
+int ipv6ll_addrgen_mode_fill_message(sd_netlink_message *message, IPv6LinkLocalAddressGenMode mode) {
+        int r;
+
+        assert(message);
+        assert(mode >= 0 && mode < _IPV6_LINK_LOCAL_ADDRESS_GEN_MODE_MAX);
+
+        r = sd_netlink_message_open_container(message, IFLA_AF_SPEC);
+        if (r < 0)
+                return r;
+
+        r = sd_netlink_message_open_container(message, AF_INET6);
+        if (r < 0)
+                return r;
+
+        r = sd_netlink_message_append_u8(message, IFLA_INET6_ADDR_GEN_MODE, mode);
+        if (r < 0)
+                return r;
+
+        r = sd_netlink_message_close_container(message);
+        if (r < 0)
+                return r;
+
+        r = sd_netlink_message_close_container(message);
+        if (r < 0)
+                return r;
+
+        return 0;
+}
+
 static const char* const ipv6_link_local_address_gen_mode_table[_IPV6_LINK_LOCAL_ADDRESS_GEN_MODE_MAX] = {
         [IPV6_LINK_LOCAL_ADDRESSS_GEN_MODE_EUI64]          = "eui64",
         [IPV6_LINK_LOCAL_ADDRESSS_GEN_MODE_NONE]           = "none",
index 0a1c3da5fd7d358deedc0bc8ed1c95acd52e9406..4f63c71fb5f431937884c4e47696bc66a1360bb3 100644 (file)
@@ -5,6 +5,8 @@
 #include <linux/if_link.h>
 #include <stdbool.h>
 
+#include "sd-netlink.h"
+
 #include "conf-parser.h"
 #include "macro.h"
 
@@ -22,6 +24,9 @@ typedef enum IPv6LinkLocalAddressGenMode {
 bool link_ipv6ll_enabled(Link *link);
 bool link_may_have_ipv6ll(Link *link);
 
+IPv6LinkLocalAddressGenMode link_get_ipv6ll_addrgen_mode(Link *link);
+int ipv6ll_addrgen_mode_fill_message(sd_netlink_message *message, IPv6LinkLocalAddressGenMode mode);
+
 const char* ipv6_link_local_address_gen_mode_to_string(IPv6LinkLocalAddressGenMode s) _const_;
 IPv6LinkLocalAddressGenMode ipv6_link_local_address_gen_mode_from_string(const char *s) _pure_;
 
index 3fbc910aa2baa02df170458d11a9ba8af5612e6d..514833e42088aef65ebadd329304aa0eb90579c7 100644 (file)
@@ -228,23 +228,7 @@ static int link_configure_fill_message(
 
         switch (op) {
         case SET_LINK_ADDRESS_GENERATION_MODE:
-                r = sd_netlink_message_open_container(req, IFLA_AF_SPEC);
-                if (r < 0)
-                        return r;
-
-                r = sd_netlink_message_open_container(req, AF_INET6);
-                if (r < 0)
-                        return r;
-
-                r = sd_netlink_message_append_u8(req, IFLA_INET6_ADDR_GEN_MODE, PTR_TO_UINT8(userdata));
-                if (r < 0)
-                        return r;
-
-                r = sd_netlink_message_close_container(req);
-                if (r < 0)
-                        return r;
-
-                r = sd_netlink_message_close_container(req);
+                r = ipv6ll_addrgen_mode_fill_message(req, PTR_TO_UINT8(userdata));
                 if (r < 0)
                         return r;
                 break;
@@ -689,8 +673,8 @@ static int link_request_set_link(
 }
 
 int link_request_to_set_addrgen_mode(Link *link) {
+        IPv6LinkLocalAddressGenMode mode;
         Request *req;
-        uint8_t mode;
         int r;
 
         assert(link);
@@ -699,14 +683,7 @@ int link_request_to_set_addrgen_mode(Link *link) {
         if (!socket_ipv6_is_supported())
                 return 0;
 
-        if (!link_ipv6ll_enabled(link))
-                mode = IN6_ADDR_GEN_MODE_NONE;
-        else if (link->network->ipv6ll_address_gen_mode >= 0)
-                mode = link->network->ipv6ll_address_gen_mode;
-        else if (in6_addr_is_set(&link->network->ipv6ll_stable_secret))
-                mode = IN6_ADDR_GEN_MODE_STABLE_PRIVACY;
-        else
-                mode = IN6_ADDR_GEN_MODE_EUI64;
+        mode = link_get_ipv6ll_addrgen_mode(link);
 
         r = link_request_set_link(link, SET_LINK_ADDRESS_GENERATION_MODE, link_set_addrgen_mode_handler, &req);
         if (r < 0)