]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: DHCPv6 Add support to send MUD URL 15252/head
authorSusant Sahani <ssahani@vmware.com>
Mon, 30 Mar 2020 14:31:10 +0000 (16:31 +0200)
committerSusant Sahani <ssahani@vmware.com>
Wed, 1 Apr 2020 15:01:12 +0000 (17:01 +0200)
man/systemd.network.xml
src/network/networkd-dhcp-common.c
src/network/networkd-dhcp-common.h
src/network/networkd-dhcp6.c
src/network/networkd-network-gperf.gperf
src/network/networkd-network.c
src/network/networkd-network.h
test/fuzz/fuzz-network-parser/directives.network

index 5457e668dd282a7aed9cd974859f10ad395aeb9f..201e33ed6e06eddfe9bc844c6efb03d2562a14d9 100644 (file)
           </listitem>
         </varlistentry>
 
+        <varlistentry>
+          <term><varname>MUDURL=</varname></term>
+          <listitem>
+            <para>When configured, the Manufacturer Usage Descriptions (MUD) URL will be sent to the DHCPV6 server.
+            Takes an URL of length up to 255 characters. A superficial verification that the string is a valid URL
+            will be performed. DHCPv6 clients are intended to have at most one MUD URL associated with them. See
+            <ulink url="https://tools.ietf.org/html/rfc8520">RFC 8520</ulink>.</para>
+          </listitem>
+        </varlistentry>
+
         <varlistentry>
           <term><varname>ForceDHCPv6PDOtherInformation=</varname></term>
           <listitem>
index 8664d8cdc0d43782def4aa85ac2f7060e7c7ab6e..0473aba6159eeba5e4a440507f19ef369e082d11 100644 (file)
@@ -8,6 +8,7 @@
 #include "parse-util.h"
 #include "string-table.h"
 #include "strv.h"
+#include "web-util.h"
 
 int config_parse_dhcp(
                 const char* unit,
@@ -265,6 +266,48 @@ int config_parse_dhcp6_pd_hint(
         return 0;
 }
 
+int config_parse_dhcp6_mud_url(
+                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) {
+
+        _cleanup_free_ char *unescaped = NULL;
+        Network *network = data;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+
+        if (isempty(rvalue)) {
+                network->dhcp6_mudurl = mfree(network->dhcp6_mudurl);
+                return 0;
+        }
+
+        r = cunescape(rvalue, 0, &unescaped);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r,
+                           "Failed to Failed to unescape MUD URL, ignoring: %s", rvalue);
+                return 0;
+        }
+
+        if (!http_url_is_valid(unescaped) || strlen(unescaped) > 255) {
+                log_syntax(unit, LOG_ERR, filename, line, 0,
+                           "Failed to parse MUD URL '%s', ignoring: %m", rvalue);
+
+                return 0;
+        }
+
+        return free_and_replace(network->dhcp6_mudurl, unescaped);
+}
+
 int config_parse_dhcp_send_option(
                 const char *unit,
                 const char *filename,
index 1d6ddbb8cc0b07c6775d5178adb5dd896f22b86e..ca86016ef2a7209b649230e442bb2fc906dcd5d5 100644 (file)
@@ -48,4 +48,5 @@ CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_use_sip);
 CONFIG_PARSER_PROTOTYPE(config_parse_iaid);
 CONFIG_PARSER_PROTOTYPE(config_parse_section_route_table);
 CONFIG_PARSER_PROTOTYPE(config_parse_dhcp6_pd_hint);
+CONFIG_PARSER_PROTOTYPE(config_parse_dhcp6_mud_url);
 CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_send_option);
index 7304270c60b1e97bcad6e5b77dddc339aac5c1bf..3580498e3512cb0b8b53728b8420d9a0ac0943bf 100644 (file)
@@ -676,6 +676,12 @@ int dhcp6_configure(Link *link) {
                         return log_link_error_errno(link, r, "DHCP6 CLIENT: Failed to set request flag for rapid commit: %m");
         }
 
+        if (link->network->dhcp6_mudurl) {
+                r = sd_dhcp6_client_set_request_mud_url(client, link->network->dhcp6_mudurl);
+                if (r < 0)
+                        return log_link_error_errno(link, r, "DHCP6 CLIENT: Failed to set MUD URL: %m");
+        }
+
         r = sd_dhcp6_client_set_callback(client, dhcp6_handler, link);
         if (r < 0)
                 return log_link_error_errno(link, r, "DHCP6 CLIENT: Failed to set callback: %m");
index fd996327a55fc5e3e729057de682e493c63b9f69..d98b32b7568af59deb7fe6060a05c6594d52ae7c 100644 (file)
@@ -189,6 +189,7 @@ DHCPv4.RouteMTUBytes,                        config_parse_mtu,
 DHCPv6.UseDNS,                               config_parse_bool,                                        0,                             offsetof(Network, dhcp6_use_dns)
 DHCPv6.UseNTP,                               config_parse_bool,                                        0,                             offsetof(Network, dhcp6_use_ntp)
 DHCPv6.RapidCommit,                          config_parse_bool,                                        0,                             offsetof(Network, rapid_commit)
+DHCPv6.MUDURL,                               config_parse_dhcp6_mud_url,                               0,                             0
 DHCPv6.ForceDHCPv6PDOtherInformation,        config_parse_bool,                                        0,                             offsetof(Network, dhcp6_force_pd_other_information)
 DHCPv6.PrefixDelegationHint,                 config_parse_dhcp6_pd_hint,                               0,                             0
 DHCPv6.WithoutRA,                            config_parse_bool,                                        0,                             offsetof(Network, dhcp6_without_ra)
index e7ead446c7640227874263790168a09adfa426f6..46a5a5320a0a98519e936f0d576dc730c33b1f0b 100644 (file)
@@ -644,6 +644,7 @@ static Network *network_free(Network *network) {
         set_free(network->dhcp_black_listed_ip);
         set_free(network->dhcp_request_options);
         free(network->mac);
+        free(network->dhcp6_mudurl);
 
         if (network->dhcp_acd)
                 sd_ipv4acd_unref(network->dhcp_acd);
index f747ccaf101812633f0badc35fe88856e2f31e15..3b48e4238dcf1ed84d113f9102f18b727b18a0d2 100644 (file)
@@ -130,6 +130,7 @@ struct Network {
         bool dhcp6_use_ntp;
         bool dhcp6_without_ra;
         uint8_t dhcp6_pd_length;
+        char *dhcp6_mudurl;
         struct in6_addr dhcp6_pd_address;
 
         /* DHCP Server Support */
index 4418fc01495b92e2b16902e4488939f8c0fee072..76a4c42403cdfce20c41ca2378f0436fad1f0c3b 100644 (file)
@@ -110,6 +110,7 @@ RapidCommit=
 ForceDHCPv6PDOtherInformation=
 PrefixDelegationHint=
 WithoutRA=
+MUDURL=
 [Route]
 Destination=
 Protocol=