]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
netdev-util: allow finding addresses from dhcp-pd 38211/head
authorLinus Heckemann <git@sphalerite.org>
Mon, 14 Jul 2025 11:03:51 +0000 (13:03 +0200)
committerLinus Heckemann <git@sphalerite.org>
Wed, 16 Jul 2025 14:17:19 +0000 (16:17 +0200)
man/systemd.netdev.xml
src/network/netdev/netdev-util.c
src/network/netdev/netdev-util.h
src/network/netdev/tunnel.c

index 65812aca51ffaee50a12dc71fe7c6cc982cebf49..415feea046661728dde2580d488c2d7d93e8ad8a 100644 (file)
@@ -1508,7 +1508,7 @@ Ports=eth2</programlisting>
           <para>A static local address for tunneled packets. It must be an address on another interface
           of this host, or one of the special values <literal>any</literal>,
           <literal>ipv4_link_local</literal>, <literal>ipv6_link_local</literal>,
-          <literal>dhcp4</literal>, <literal>dhcp6</literal>, and <literal>slaac</literal>. If one
+          <literal>dhcp4</literal>, <literal>dhcp6</literal>, <literal>dhcp_pd</literal>, and <literal>slaac</literal>. If one
           of the special values except for <literal>any</literal> is specified, an address which
           matches the corresponding type on the underlying interface will be used. Defaults to
           <literal>any</literal>.</para>
index 1b781d00096e36e2545e3de2366dd274a687645b..d6cddf6bcb01062c8f3889c6a540887640b93ec0 100644 (file)
@@ -7,11 +7,12 @@
 #include "string-table.h"
 
 static const char * const netdev_local_address_type_table[_NETDEV_LOCAL_ADDRESS_TYPE_MAX] = {
-        [NETDEV_LOCAL_ADDRESS_IPV4LL] = "ipv4_link_local",
-        [NETDEV_LOCAL_ADDRESS_IPV6LL] = "ipv6_link_local",
-        [NETDEV_LOCAL_ADDRESS_DHCP4]  = "dhcp4",
-        [NETDEV_LOCAL_ADDRESS_DHCP6]  = "dhcp6",
-        [NETDEV_LOCAL_ADDRESS_SLAAC]  = "slaac",
+        [NETDEV_LOCAL_ADDRESS_IPV4LL]   = "ipv4_link_local",
+        [NETDEV_LOCAL_ADDRESS_IPV6LL]   = "ipv6_link_local",
+        [NETDEV_LOCAL_ADDRESS_DHCP4]    = "dhcp4",
+        [NETDEV_LOCAL_ADDRESS_DHCP6]    = "dhcp6",
+        [NETDEV_LOCAL_ADDRESS_SLAAC]    = "slaac",
+        [NETDEV_LOCAL_ADDRESS_DHCP_PD]  = "dhcp_pd",
 };
 
 DEFINE_STRING_TABLE_LOOKUP(netdev_local_address_type, NetDevLocalAddressType);
@@ -36,6 +37,7 @@ int link_get_local_address(
         case NETDEV_LOCAL_ADDRESS_IPV6LL:
         case NETDEV_LOCAL_ADDRESS_DHCP6:
         case NETDEV_LOCAL_ADDRESS_SLAAC:
+        case NETDEV_LOCAL_ADDRESS_DHCP_PD:
                 assert(IN_SET(family, AF_UNSPEC, AF_INET6));
                 family = AF_INET6;
                 break;
@@ -77,6 +79,10 @@ int link_get_local_address(
                         if (a->source != NETWORK_CONFIG_SOURCE_NDISC)
                                 continue;
                         break;
+                case NETDEV_LOCAL_ADDRESS_DHCP_PD:
+                        if (a->source != NETWORK_CONFIG_SOURCE_DHCP_PD)
+                                continue;
+                        break;
                 default:
                         assert_not_reached();
                 }
index 847a6e732670f10619cdfb910cf7abb79956e04d..0f0be41cb94c760be303cde3786812801fde12f3 100644 (file)
@@ -9,6 +9,7 @@ typedef enum NetDevLocalAddressType {
         NETDEV_LOCAL_ADDRESS_DHCP4,
         NETDEV_LOCAL_ADDRESS_DHCP6,
         NETDEV_LOCAL_ADDRESS_SLAAC,
+        NETDEV_LOCAL_ADDRESS_DHCP_PD,
         _NETDEV_LOCAL_ADDRESS_TYPE_MAX,
         _NETDEV_LOCAL_ADDRESS_TYPE_INVALID = -EINVAL,
 } NetDevLocalAddressType;
index 211388bb95b5e71328f22d9bad67f5715f11234b..08acfb1ceeb87d06aa7f86994f456b6ec124d1f9 100644 (file)
@@ -11,6 +11,7 @@
 #include "conf-parser.h"
 #include "hexdecoct.h"
 #include "missing-network.h"
+#include "netdev-util.h"
 #include "netlink-util.h"
 #include "networkd-manager.h"
 #include "parse-util.h"
@@ -784,7 +785,7 @@ int config_parse_tunnel_local_address(
         type = netdev_local_address_type_from_string(rvalue);
         if (IN_SET(type, NETDEV_LOCAL_ADDRESS_IPV4LL, NETDEV_LOCAL_ADDRESS_DHCP4))
                 f = AF_INET;
-        else if (IN_SET(type, NETDEV_LOCAL_ADDRESS_IPV6LL, NETDEV_LOCAL_ADDRESS_DHCP6, NETDEV_LOCAL_ADDRESS_SLAAC))
+        else if (IN_SET(type, NETDEV_LOCAL_ADDRESS_IPV6LL, NETDEV_LOCAL_ADDRESS_DHCP6, NETDEV_LOCAL_ADDRESS_SLAAC, NETDEV_LOCAL_ADDRESS_DHCP_PD))
                 f = AF_INET6;
         else {
                 type = _NETDEV_LOCAL_ADDRESS_TYPE_INVALID;