From 8a7a33ab1eb7f59da827b576368c2df3f8552074 Mon Sep 17 00:00:00 2001 From: Linus Heckemann Date: Mon, 14 Jul 2025 13:01:41 +0200 Subject: [PATCH 1/3] vcs-tag.sh: use more compatible shebang --- tools/vcs-tag.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/vcs-tag.sh b/tools/vcs-tag.sh index f9575aeced..faec440f6b 100755 --- a/tools/vcs-tag.sh +++ b/tools/vcs-tag.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # SPDX-License-Identifier: LGPL-2.1-or-later set -e From 4d6c0a55e17be819cc36c54d729f87311b68bd6c Mon Sep 17 00:00:00 2001 From: Linus Heckemann Date: Mon, 14 Jul 2025 13:02:23 +0200 Subject: [PATCH 2/3] netdev-util: don't repeat AF check for each address type --- src/network/netdev/netdev-util.c | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/network/netdev/netdev-util.c b/src/network/netdev/netdev-util.c index e0555ebe41..1b781d0009 100644 --- a/src/network/netdev/netdev-util.c +++ b/src/network/netdev/netdev-util.c @@ -29,21 +29,12 @@ int link_get_local_address( switch (type) { case NETDEV_LOCAL_ADDRESS_IPV4LL: - assert(IN_SET(family, AF_UNSPEC, AF_INET)); - family = AF_INET; - break; - case NETDEV_LOCAL_ADDRESS_IPV6LL: - assert(IN_SET(family, AF_UNSPEC, AF_INET6)); - family = AF_INET6; - break; case NETDEV_LOCAL_ADDRESS_DHCP4: assert(IN_SET(family, AF_UNSPEC, AF_INET)); family = AF_INET; break; + case NETDEV_LOCAL_ADDRESS_IPV6LL: case NETDEV_LOCAL_ADDRESS_DHCP6: - assert(IN_SET(family, AF_UNSPEC, AF_INET6)); - family = AF_INET6; - break; case NETDEV_LOCAL_ADDRESS_SLAAC: assert(IN_SET(family, AF_UNSPEC, AF_INET6)); family = AF_INET6; From 94e5d8b0e00d9c1e0c2df174226e97e469fa9f7e Mon Sep 17 00:00:00 2001 From: Linus Heckemann Date: Mon, 14 Jul 2025 13:03:51 +0200 Subject: [PATCH 3/3] netdev-util: allow finding addresses from dhcp-pd --- man/systemd.netdev.xml | 2 +- src/network/netdev/netdev-util.c | 16 +++++++++++----- src/network/netdev/netdev-util.h | 1 + src/network/netdev/tunnel.c | 3 ++- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/man/systemd.netdev.xml b/man/systemd.netdev.xml index 65812aca51..415feea046 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 1b781d0009..d6cddf6bcb 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 847a6e7326..0f0be41cb9 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 211388bb95..08acfb1cee 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;