From: Linus Heckemann Date: Mon, 14 Jul 2025 11:03:51 +0000 (+0200) Subject: netdev-util: allow finding addresses from dhcp-pd X-Git-Tag: v258-rc1~40^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=94e5d8b0e00d9c1e0c2df174226e97e469fa9f7e;p=thirdparty%2Fsystemd.git netdev-util: allow finding addresses from dhcp-pd --- diff --git a/man/systemd.netdev.xml b/man/systemd.netdev.xml index 65812aca51f..415feea0466 100644 --- a/man/systemd.netdev.xml +++ b/man/systemd.netdev.xml @@ -1508,7 +1508,7 @@ Ports=eth2 A static local address for tunneled packets. It must be an address on another interface of this host, or one of the special values any, ipv4_link_local, ipv6_link_local, - dhcp4, dhcp6, and slaac. If one + dhcp4, dhcp6, dhcp_pd, and slaac. If one of the special values except for any is specified, an address which matches the corresponding type on the underlying interface will be used. Defaults to any. diff --git a/src/network/netdev/netdev-util.c b/src/network/netdev/netdev-util.c index 1b781d00096..d6cddf6bcb0 100644 --- a/src/network/netdev/netdev-util.c +++ b/src/network/netdev/netdev-util.c @@ -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(); } diff --git a/src/network/netdev/netdev-util.h b/src/network/netdev/netdev-util.h index 847a6e73267..0f0be41cb94 100644 --- a/src/network/netdev/netdev-util.h +++ b/src/network/netdev/netdev-util.h @@ -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; diff --git a/src/network/netdev/tunnel.c b/src/network/netdev/tunnel.c index 211388bb95b..08acfb1ceeb 100644 --- a/src/network/netdev/tunnel.c +++ b/src/network/netdev/tunnel.c @@ -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;