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:
@@ -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>
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/bin/bash
|
||||
#!/usr/bin/env bash
|
||||
# SPDX-License-Identifier: LGPL-2.1-or-later
|
||||
set -e
|
||||
|
||||
|
||||
Reference in New Issue
Block a user