]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: add address label on dhcpv4
authorMaxime de Roucy <maxime.deroucy@fr.clara.net>
Sat, 14 Aug 2021 20:50:14 +0000 (22:50 +0200)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 16 Aug 2021 17:40:18 +0000 (02:40 +0900)
Fixes: #13967
man/systemd.network.xml
src/network/networkd-dhcp4.c
src/network/networkd-dhcp4.h
src/network/networkd-network-gperf.gperf
src/network/networkd-network.c
src/network/networkd-network.h
test/fuzz/fuzz-network-parser/directives.network
test/test-network/conf/dhcp-client-ipv4-dhcp-settings.network
test/test-network/systemd-networkd-tests.py

index 299c56df0ad400cd9a48a74a6fd36d83380a6d95..e568ef9b457eaafbdc3514369ab2bdb770200770 100644 (file)
@@ -1770,6 +1770,15 @@ IPv6Token=prefixstable:2002:da8:1::</programlisting></para>
 
         <!-- How to use the DHCP lease -->
 
+        <varlistentry>
+          <term><varname>Label=</varname></term>
+          <listitem>
+            <para>Specifies the label for the IPv4 address received from the DHCP server.
+            The label must be a 7-bit ASCII string with a length of 1…15 characters.
+            Defaults to unset.</para>
+          </listitem>
+        </varlistentry>
+
         <varlistentry>
           <term><varname>UseDNS=</varname></term>
           <listitem>
index 12fb85bf9020f2640cb06ad4c53302f39f47d06e..c35b5514a58e976c7bbd38faeade69167dd161a6 100644 (file)
@@ -992,6 +992,12 @@ static int dhcp4_request_address(Link *link, bool announce) {
         addr->route_metric = link->network->dhcp_route_metric;
         addr->duplicate_address_detection = link->network->dhcp_send_decline ? ADDRESS_FAMILY_IPV4 : ADDRESS_FAMILY_NO;
 
+        if (link->network->dhcp_label) {
+                addr->label = strdup(link->network->dhcp_label);
+                if (!addr->label)
+                        return log_oom();
+        }
+
         if (address_get(link, addr, NULL) < 0)
                 link->dhcp4_configured = false;
 
@@ -1876,6 +1882,39 @@ int config_parse_dhcp_fallback_lease_lifetime(const char *unit,
         return 0;
 }
 
+int config_parse_dhcp_label(
+                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) {
+
+        char **label = data;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        if (isempty(rvalue)) {
+                *label = mfree(*label);
+                return 0;
+        }
+
+        if (!address_label_valid(rvalue)) {
+                log_syntax(unit, LOG_WARNING, filename, line, 0,
+                           "Address label is too long or invalid, ignoring assignment: %s", rvalue);
+                return 0;
+        }
+
+        return free_and_strdup_warn(label, rvalue);
+}
+
 static const char* const dhcp_client_identifier_table[_DHCP_CLIENT_ID_MAX] = {
         [DHCP_CLIENT_ID_MAC] = "mac",
         [DHCP_CLIENT_ID_DUID] = "duid",
index 152c2213b49ec1412fca2595fc74d80ced5530b4..541fd62aa2325e96e8601ada00d8caaee3bc89fd 100644 (file)
@@ -33,3 +33,4 @@ CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_max_attempts);
 CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_ip_service_type);
 CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_mud_url);
 CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_fallback_lease_lifetime);
+CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_label);
index 9166376aaa872a6045c586f778b7429c96d33809..d5c8c1ff4b5771b95ad4f32f607dd56dbc99abb9 100644 (file)
@@ -212,6 +212,7 @@ DHCPv4.RequestOptions,                       config_parse_dhcp_request_options,
 DHCPv4.Anonymize,                            config_parse_bool,                                        0,                             offsetof(Network, dhcp_anonymize)
 DHCPv4.SendHostname,                         config_parse_bool,                                        0,                             offsetof(Network, dhcp_send_hostname)
 DHCPv4.Hostname,                             config_parse_hostname,                                    0,                             offsetof(Network, dhcp_hostname)
+DHCPv4.Label,                                config_parse_dhcp_label,                                  0,                             offsetof(Network, dhcp_label)
 DHCPv4.RequestBroadcast,                     config_parse_tristate,                                    0,                             offsetof(Network, dhcp_broadcast)
 DHCPv4.VendorClassIdentifier,                config_parse_string,                                      0,                             offsetof(Network, dhcp_vendor_class_identifier)
 DHCPv4.MUDURL,                               config_parse_mud_url,                                     0,                             offsetof(Network, dhcp_mudurl)
index f16553a6d9d72d692231d7b62fb3d6c167f09871..945ac600334026e1d278172e0c47fa01bcc26570 100644 (file)
@@ -585,6 +585,7 @@ static Network *network_free(Network *network) {
         free(network->dhcp_mudurl);
         strv_free(network->dhcp_user_class);
         free(network->dhcp_hostname);
+        free(network->dhcp_label);
         set_free(network->dhcp_deny_listed_ip);
         set_free(network->dhcp_allow_listed_ip);
         set_free(network->dhcp_request_options);
index bf0e1a733e7e5ddadc1c43106acc41a9bde99110..8b0b53b4f55f39c7c2324329a288793f57941ec9 100644 (file)
@@ -129,6 +129,7 @@ struct Network {
         char *dhcp_mudurl;
         char **dhcp_user_class;
         char *dhcp_hostname;
+        char *dhcp_label;
         uint64_t dhcp_max_attempts;
         uint32_t dhcp_route_metric;
         bool dhcp_route_metric_set;
index 2dca1cda3ab4db3ecbdd4f03b28b1b7b16e35216..a05260b3b52a0b5508e6a16f9aabd65b18e09052 100644 (file)
@@ -107,6 +107,7 @@ VendorClassIdentifier=
 Hostname=
 DUIDType=
 UseHostname=
+Label=
 CriticalConnection=
 DUIDRawData=
 RequestBroadcast=
index 41d6ea40faefc0be07de928efbfa531b96b357e6..5352956e7e5d42d2516739192f893686159c65f6 100644 (file)
@@ -14,3 +14,4 @@ Hostname=test-hostname
 ClientIdentifier=mac
 VendorClassIdentifier=SusantVendorTest
 RouteTable=211
+Label=test-label
index dffd728881af7f7c1dedaefc52316267585c551c..c74fb226bef69beed00647c4618427c544c4cf60 100755 (executable)
@@ -4150,6 +4150,7 @@ class NetworkdDHCPClientTests(unittest.TestCase, Utilities):
         self.assertRegex(output, '12:34:56:78:9a:bc')
         self.assertRegex(output, '192.168.5')
         self.assertRegex(output, '1492')
+        self.assertRegex(output, 'test-label')
 
         print('## ip route show table main dev veth99')
         output = check_output('ip route show table main dev veth99')