1
0
mirror of https://github.com/systemd/systemd.git synced 2025-10-23 23:34:02 +03:00

netdev-util: allow setting local address based on dhcp-pd addresses as well (#38211)

This extends the functionality introduced in #21648 to allow using
addresses chosen from a delegated prefix as well as the existing
SLAAC/LL/DHCP functionality.
This commit is contained in:
Luca Boccassi
2025-07-17 14:14:49 +01:00
committed by GitHub
5 changed files with 17 additions and 18 deletions

View 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>

View 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);
@@ -29,22 +30,14 @@ 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:
case NETDEV_LOCAL_ADDRESS_DHCP_PD:
assert(IN_SET(family, AF_UNSPEC, AF_INET6));
family = AF_INET6;
break;
@@ -86,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();
}

View 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;

View 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;

View File

@@ -1,4 +1,4 @@
#!/bin/bash
#!/usr/bin/env bash
# SPDX-License-Identifier: LGPL-2.1-or-later
set -e