]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: Add support to select an IPv4 link-local start address
authorAndre Kalb <andre.kalb@sma.de>
Thu, 30 Jun 2022 08:01:34 +0000 (10:01 +0200)
committerAndre Kalb <andre.kalb@sma.de>
Wed, 13 Jul 2022 21:57:18 +0000 (23:57 +0200)
man/systemd.network.xml
src/network/networkd-ipv4ll.c
src/network/networkd-ipv4ll.h
src/network/networkd-network-gperf.gperf
src/network/networkd-network.h
test/fuzz/fuzz-network-parser/directives

index eae27389ede858bab36f9a5e11389cc7b0713fd4..d1eca399dfdf4f35d1bc1e5503a3b68ca5f84ac1 100644 (file)
         </listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><varname>IPv4LLStartAddress=</varname></term>
+        <listitem>
+          <para>Specifies the first IPv4 link-local address to try. Takes an IPv4 address
+          for example 169.254.1.2, from the link-local address range 169.254.0.0/16.
+          This setting may be useful if the device should always have the same address
+          as long as there is no address conflict. When unset, a random address will be automatically selected.
+          Defaults to unset.
+          </para>
+        </listitem>
+      </varlistentry>
+
       <varlistentry>
         <term><varname>IPv4LLRoute=</varname></term>
         <listitem>
index 67eb9d2aa1cd139fd2b8675ec2dffcd76b18b674..8833bee2330dfbff39e6930b7a921edb806cb326 100644 (file)
@@ -263,3 +263,44 @@ int config_parse_ipv4ll(
 
         return 0;
 }
+
+int config_parse_ipv4ll_address(
+                const char* unit,
+                const char *filename,
+                unsigned line,
+                const char *section,
+                unsigned section_line,
+                const char *lvalue,
+                int ltype,
+                const char *rvalue,
+                void *data,
+                void *userdata) {
+
+        union in_addr_union a;
+        struct in_addr *ipv4ll_address = ASSERT_PTR(data);
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+
+        if (isempty(rvalue)) {
+                *ipv4ll_address = (struct in_addr) {};
+                return 0;
+        }
+
+        r = in_addr_from_string(AF_INET, rvalue, &a);
+        if (r < 0) {
+                log_syntax(unit, LOG_WARNING, filename, line, r,
+                           "Failed to parse %s=, ignoring assignment: %s", lvalue, rvalue);
+                return 0;
+        }
+        if (!in4_addr_is_link_local(&a.in)) {
+                log_syntax(unit, LOG_WARNING, filename, line, 0,
+                           "Not a IPv4 link local address, ignoring assignment: %s", rvalue);
+                return 0;
+        }
+
+        *ipv4ll_address = a.in;
+        return 0;
+}
index 82acc2ec70913f8096f7e25cf96ad43c42fceb32..f5c69285350efeccdbdab9bc60b370e53bdf8f11 100644 (file)
@@ -11,3 +11,4 @@ int ipv4ll_configure(Link *link);
 int ipv4ll_update_mac(Link *link);
 
 CONFIG_PARSER_PROTOTYPE(config_parse_ipv4ll);
+CONFIG_PARSER_PROTOTYPE(config_parse_ipv4ll_address);
index ceaaa6a0f7cdbabe2fa65ad3191cc2b4c93bf99b..0b0c8da27b5c57725571d1c76334b4af9126868f 100644 (file)
@@ -106,6 +106,7 @@ Network.DHCPServer,                          config_parse_bool,
 Network.LinkLocalAddressing,                 config_parse_link_local_address_family,                   0,                             offsetof(Network, link_local)
 Network.IPv6LinkLocalAddressGenerationMode,  config_parse_ipv6_link_local_address_gen_mode,            0,                             offsetof(Network, ipv6ll_address_gen_mode)
 Network.IPv6StableSecretAddress,             config_parse_in_addr_non_null,                            AF_INET6,                      offsetof(Network, ipv6ll_stable_secret)
+Network.IPv4LLStartAddress,                  config_parse_ipv4ll_address,                              0,                             offsetof(Network, ipv4ll_start_address)
 Network.IPv4LLRoute,                         config_parse_bool,                                        0,                             offsetof(Network, ipv4ll_route)
 Network.DefaultRouteOnDevice,                config_parse_bool,                                        0,                             offsetof(Network, default_route_on_device)
 Network.LLDP,                                config_parse_lldp_mode,                                   0,                             offsetof(Network, lldp_mode)
index 98e6159040ee302b8cbfa1064d7fb898a0a7505f..c653124a9c6ec66fad171ffb4306f8c94031416d 100644 (file)
@@ -208,6 +208,7 @@ struct Network {
         AddressFamily link_local;
         IPv6LinkLocalAddressGenMode ipv6ll_address_gen_mode;
         struct in6_addr ipv6ll_stable_secret;
+        struct in_addr ipv4ll_start_address;
         bool ipv4ll_route;
 
         /* IPv6 RA support */
index 276f3c9307678a317ecc712d82cd313d7e2a0e19..ea0de6660c78dfd1c4077543d9ce3e028a3c2a2a 100644 (file)
@@ -235,6 +235,7 @@ VXLAN=
 L2TP=
 MACsec=
 LinkLocalAddressing=
+IPv4LLStartAddress=
 IPv6LinkLocalAddressGenerationMode=
 IPv6StableSecretAddress=
 ConfigureWithoutCarrier=