]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: introduce Token=eui64
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 24 Sep 2021 19:04:09 +0000 (04:04 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 6 Oct 2021 16:16:36 +0000 (01:16 +0900)
So, now user can explicitly request EUI-64 algorithm to generate addresses.

man/systemd.network.xml
src/network/networkd-address-generation.c

index 7860bd10e6ec4dbc5d7efefde21f5c54eb5c0274..1d811a68678b6a008a68dbefeab876ef92a0b28f 100644 (file)
@@ -2193,8 +2193,11 @@ Table=1234</programlisting></para>
           <term><varname>Token=</varname></term>
           <listitem>
             <para>Specifies an optional address generation mode for the Stateless Address
-            Autoconfiguration (SLAAC). Supported modes are <literal>static</literal> and
-            <literal>prefixstable</literal>.</para>
+            Autoconfiguration (SLAAC). Supported modes are <literal>eui64</literal>,
+            <literal>static</literal>, and <literal>prefixstable</literal>.</para>
+
+            <para>When the mode is set to <literal>eui64</literal>, then the EUI-64 algorithm will be
+            used to generate an address for that prefix.</para>
 
             <para>When the mode is set to <literal>static</literal>, an IPv6 address must be
             specified after a colon (<literal>:</literal>), and the lower bits of the supplied
@@ -2229,7 +2232,8 @@ Table=1234</programlisting></para>
             the all previous assignments are cleared.</para>
 
             <para>Examples:
-            <programlisting>Token=::1a:2b:3c:4d
+            <programlisting>Token=eui64
+Token=::1a:2b:3c:4d
 Token=static:::1a:2b:3c:4d
 Token=prefixstable
 Token=prefixstable:2002:da8:1::</programlisting></para>
index 008575f7f87bf1f82f17e4e806137982093f14b2..800a96d351aa8477dd114ad143034bb41c8de54c 100644 (file)
@@ -23,6 +23,7 @@
 #define NDISC_APP_ID   SD_ID128_MAKE(13,ac,81,a7,d5,3f,49,78,92,79,5d,0c,29,3a,bc,7e)
 
 typedef enum AddressGenerationType {
+        ADDRESS_GENERATION_EUI64,
         ADDRESS_GENERATION_STATIC,
         ADDRESS_GENERATION_PREFIXSTABLE,
         _ADDRESS_GENERATION_TYPE_MAX,
@@ -176,6 +177,10 @@ static int generate_addresses(
                 struct in6_addr addr, *copy;
 
                 switch (j->type) {
+                case ADDRESS_GENERATION_EUI64:
+                        generate_eui64_address(link, &masked, &addr);
+                        break;
+
                 case ADDRESS_GENERATION_STATIC:
                         memcpy(addr.s6_addr, masked.s6_addr, 8);
                         memcpy(addr.s6_addr + 8, j->address.s6_addr + 8, 8);
@@ -309,6 +314,9 @@ int config_parse_address_generation_type(
                         return 0;
                 }
 
+        } else if (streq(rvalue, "eui64")) {
+                type = ADDRESS_GENERATION_EUI64;
+                p = NULL;
         } else {
                 type = ADDRESS_GENERATION_STATIC;
 
@@ -328,6 +336,10 @@ int config_parse_address_generation_type(
         }
 
         switch (type) {
+        case ADDRESS_GENERATION_EUI64:
+                assert(in6_addr_is_null(&buffer.in6));
+                break;
+
         case ADDRESS_GENERATION_STATIC:
                 /* Only last 64 bits are used. */
                 memzero(buffer.in6.s6_addr, 8);