diff --git a/NEWS b/NEWS
index 49de335a48..5d79200cf1 100644
--- a/NEWS
+++ b/NEWS
@@ -145,7 +145,7 @@ CHANGES WITH 246 in spe:
frame ring buffer sizes.
* networkd.conf gained a new boolean setting ManageForeignRoutes=. If
- enabled systemd-networkd manage all routes configured by other tools.
+ enabled systemd-networkd manages all routes configured by other tools.
* systemd-networkd's [IPv6Prefix] section in .network files gained a
new boolean setting Assign=. If enabled an address from the prefix is
@@ -212,7 +212,7 @@ CHANGES WITH 246 in spe:
* systemd-networkd supports a new Group= setting in the [Link] section
of the .network files, to control the link group.
- * systemd-networkd's [Link] section gained a new
+ * systemd-networkd's [Network] section gained a new
IPv6LinkLocalAddressGenerationMode= setting, which specifies how IPv6
link local address is generated.
@@ -229,7 +229,7 @@ CHANGES WITH 246 in spe:
automatically chosen and assigned to the interface.
* systemd-networkd's [DHCPv6] section gained a new setting RouteMetric=
- which set the route priority for routes specified by the DHCP server.
+ which sets the route priority for routes specified by the DHCP server.
* systemd-networkd's [DHCPv6] section gained a new setting VendorClass=
which configures the vendor class information sent to DHCP server.
diff --git a/man/systemd.network.xml b/man/systemd.network.xml
index 6f3e89978f..dce81692df 100644
--- a/man/systemd.network.xml
+++ b/man/systemd.network.xml
@@ -193,16 +193,6 @@
This happens when multicast routing is enabled.
-
- IPv6LinkLocalAddressGenerationMode=
-
- Specifies how IPv6 link local address is generated. Takes one of eui64,
- none, stable-privacy and random.
- When unset, the kernel's default will be used. Note that if LinkLocalAdressing=
- not configured as ipv6 then IPv6LinkLocalAddressGenerationMode=
- is ignored.
-
-
Unmanaged=
@@ -308,6 +298,16 @@
+
+ IPv6LinkLocalAddressGenerationMode=
+
+ Specifies how IPv6 link local address is generated. Takes one of eui64,
+ none, stable-privacy and random.
+ When unset, the kernel's default will be used. Note that if LinkLocalAdressing=
+ not configured as ipv6 then IPv6LinkLocalAddressGenerationMode=
+ is ignored.
+
+
IPv4LLRoute=
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
index f73d00f697..b3c0224034 100644
--- a/src/network/networkd-link.c
+++ b/src/network/networkd-link.c
@@ -1698,7 +1698,7 @@ static int link_configure_addrgen_mode(Link *link) {
if (!link_ipv6ll_enabled(link))
ipv6ll_mode = IN6_ADDR_GEN_MODE_NONE;
- else if (link->network->ipv6_address_gen_mode < 0) {
+ else if (link->network->ipv6ll_address_gen_mode < 0) {
r = sysctl_read_ip_property(AF_INET6, link->ifname, "stable_secret", NULL);
if (r < 0) {
/* The file may not exist. And even if it exists, when stable_secret is unset,
@@ -1709,7 +1709,7 @@ static int link_configure_addrgen_mode(Link *link) {
} else
ipv6ll_mode = IN6_ADDR_GEN_MODE_STABLE_PRIVACY;
} else
- ipv6ll_mode = link->network->ipv6_address_gen_mode;
+ ipv6ll_mode = link->network->ipv6ll_address_gen_mode;
r = sd_netlink_message_append_u8(req, IFLA_INET6_ADDR_GEN_MODE, ipv6ll_mode);
if (r < 0)
@@ -4427,16 +4427,6 @@ void link_clean(Link *link) {
link_unref(set_remove(link->manager->dirty_links, link));
}
-static const char* const link_ipv6_address_gen_mode_table[_LINK_IPV6_ADDRESS_GEN_MODE_MAX] = {
- [LINK_IPV6_ADDRESSS_GEN_MODE_EUI64] = "eui64",
- [LINK_IPV6_ADDRESSS_GEN_MODE_NONE] = "none",
- [LINK_IPV6_ADDRESSS_GEN_MODE_STABLE_PRIVACY] = "stable-privacy",
- [LINK_IPV6_ADDRESSS_GEN_MODE_RANDOM] = "random",
-};
-
-DEFINE_STRING_TABLE_LOOKUP(link_ipv6_address_gen_mode, LinkIPv6AddressGenMode);
-DEFINE_CONFIG_PARSE_ENUM(config_parse_link_ipv6_address_gen_mode, link_ipv6_address_gen_mode, LinkIPv6AddressGenMode, "Failed to parse link IPv6 address generation mode");
-
static const char* const link_state_table[_LINK_STATE_MAX] = {
[LINK_STATE_PENDING] = "pending",
[LINK_STATE_INITIALIZED] = "initialized",
diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h
index 2d36ed2463..5a81805a04 100644
--- a/src/network/networkd-link.h
+++ b/src/network/networkd-link.h
@@ -35,15 +35,6 @@ typedef enum LinkState {
_LINK_STATE_INVALID = -1
} LinkState;
-typedef enum LinkIPv6AddressGenMode {
- LINK_IPV6_ADDRESSS_GEN_MODE_EUI64 = IN6_ADDR_GEN_MODE_EUI64,
- LINK_IPV6_ADDRESSS_GEN_MODE_NONE = IN6_ADDR_GEN_MODE_NONE,
- LINK_IPV6_ADDRESSS_GEN_MODE_STABLE_PRIVACY = IN6_ADDR_GEN_MODE_STABLE_PRIVACY,
- LINK_IPV6_ADDRESSS_GEN_MODE_RANDOM = IN6_ADDR_GEN_MODE_RANDOM,
- _LINK_IPV6_ADDRESS_GEN_MODE_MAX,
- _LINK_IPV6_ADDRESS_GEN_MODE_INVALID = -1
-} LinkIPv6AddressGenMode;
-
typedef struct Manager Manager;
typedef struct Network Network;
typedef struct Address Address;
@@ -220,9 +211,6 @@ int link_stop_clients(Link *link, bool may_keep_dhcp);
const char* link_state_to_string(LinkState s) _const_;
LinkState link_state_from_string(const char *s) _pure_;
-const char* link_ipv6_address_gen_mode_to_string(LinkIPv6AddressGenMode s) _const_;
-LinkIPv6AddressGenMode link_ipv6_address_gen_mode_from_string(const char *s) _pure_;
-
uint32_t link_get_vrf_table(Link *link);
uint32_t link_get_dhcp_route_table(Link *link);
uint32_t link_get_ipv6_accept_ra_route_table(Link *link);
@@ -232,8 +220,6 @@ int link_request_set_nexthop(Link *link);
int link_reconfigure(Link *link, bool force);
int address_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link);
-CONFIG_PARSER_PROTOTYPE(config_parse_link_ipv6_address_gen_mode);
-
int log_link_message_full_errno(Link *link, sd_netlink_message *m, int level, int err, const char *msg);
#define log_link_message_error_errno(link, m, err, msg) log_link_message_full_errno(link, m, LOG_ERR, err, msg)
#define log_link_message_warning_errno(link, m, err, msg) log_link_message_full_errno(link, m, LOG_WARNING, err, msg)
diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf
index 0326ae62de..5a0c86b5b3 100644
--- a/src/network/networkd-network-gperf.gperf
+++ b/src/network/networkd-network-gperf.gperf
@@ -52,7 +52,6 @@ Link.ARP, config_parse_tristate,
Link.Multicast, config_parse_tristate, 0, offsetof(Network, multicast)
Link.AllMulticast, config_parse_tristate, 0, offsetof(Network, allmulticast)
Link.Unmanaged, config_parse_bool, 0, offsetof(Network, unmanaged)
-Link.IPv6LinkLocalAddressGenerationMode, config_parse_link_ipv6_address_gen_mode, 0, offsetof(Network, ipv6_address_gen_mode)
Link.RequiredForOnline, config_parse_required_for_online, 0, 0
Network.Description, config_parse_string, 0, offsetof(Network, description)
Network.Bridge, config_parse_ifname, 0, offsetof(Network, bridge_name)
@@ -71,6 +70,7 @@ Network.VRF, config_parse_ifname,
Network.DHCP, config_parse_dhcp, 0, offsetof(Network, dhcp)
Network.DHCPServer, config_parse_bool, 0, offsetof(Network, dhcp_server)
Network.LinkLocalAddressing, config_parse_link_local_address_family, 0, offsetof(Network, link_local)
+Network.IPv6LinkLocalAddressGenerationMode, config_parse_ipv6_link_local_address_gen_mode, 0, offsetof(Network, ipv6ll_address_gen_mode)
Network.IPv4LLRoute, config_parse_bool, 0, offsetof(Network, ipv4ll_route)
Network.DefaultRouteOnDevice, config_parse_bool, 0, offsetof(Network, default_route_on_device)
Network.IPv6Token, config_parse_address_generation_type, 0, 0
diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c
index 0d54a7ef6b..e3012b4769 100644
--- a/src/network/networkd-network.c
+++ b/src/network/networkd-network.c
@@ -451,6 +451,7 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
/* If LinkLocalAddressing= is not set, then set to ADDRESS_FAMILY_IPV6 later. */
.link_local = _ADDRESS_FAMILY_INVALID,
+ .ipv6ll_address_gen_mode = _IPV6_LINK_LOCAL_ADDRESS_GEN_MODE_INVALID,
.ipv4_accept_local = -1,
@@ -474,7 +475,6 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
.configure_without_carrier = false,
.ignore_carrier_loss = -1,
.keep_configuration = _KEEP_CONFIGURATION_INVALID,
- .ipv6_address_gen_mode = _LINK_IPV6_ADDRESS_GEN_MODE_INVALID,
.can_triple_sampling = -1,
.can_termination = -1,
.ip_service_type = -1,
@@ -1392,3 +1392,13 @@ static const char* const keep_configuration_table[_KEEP_CONFIGURATION_MAX] = {
};
DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(keep_configuration, KeepConfiguration, KEEP_CONFIGURATION_YES);
+
+static const char* const ipv6_link_local_address_gen_mode_table[_IPV6_LINK_LOCAL_ADDRESS_GEN_MODE_MAX] = {
+ [IPV6_LINK_LOCAL_ADDRESSS_GEN_MODE_EUI64] = "eui64",
+ [IPV6_LINK_LOCAL_ADDRESSS_GEN_MODE_NONE] = "none",
+ [IPV6_LINK_LOCAL_ADDRESSS_GEN_MODE_STABLE_PRIVACY] = "stable-privacy",
+ [IPV6_LINK_LOCAL_ADDRESSS_GEN_MODE_RANDOM] = "random",
+};
+
+DEFINE_STRING_TABLE_LOOKUP(ipv6_link_local_address_gen_mode, IPv6LinkLocalAddressGenMode);
+DEFINE_CONFIG_PARSE_ENUM(config_parse_ipv6_link_local_address_gen_mode, ipv6_link_local_address_gen_mode, IPv6LinkLocalAddressGenMode, "Failed to parse IPv6 link local address generation mode");
diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h
index 67cf056b9d..916bfdc9a8 100644
--- a/src/network/networkd-network.h
+++ b/src/network/networkd-network.h
@@ -52,6 +52,15 @@ typedef enum KeepConfiguration {
_KEEP_CONFIGURATION_INVALID = -1,
} KeepConfiguration;
+typedef enum IPv6LinkLocalAddressGenMode {
+ IPV6_LINK_LOCAL_ADDRESSS_GEN_MODE_EUI64 = IN6_ADDR_GEN_MODE_EUI64,
+ IPV6_LINK_LOCAL_ADDRESSS_GEN_MODE_NONE = IN6_ADDR_GEN_MODE_NONE,
+ IPV6_LINK_LOCAL_ADDRESSS_GEN_MODE_STABLE_PRIVACY = IN6_ADDR_GEN_MODE_STABLE_PRIVACY,
+ IPV6_LINK_LOCAL_ADDRESSS_GEN_MODE_RANDOM = IN6_ADDR_GEN_MODE_RANDOM,
+ _IPV6_LINK_LOCAL_ADDRESS_GEN_MODE_MAX,
+ _IPV6_LINK_LOCAL_ADDRESS_GEN_MODE_INVALID = -1
+} IPv6LinkLocalAddressGenMode;
+
typedef struct Manager Manager;
typedef struct NetworkDHCPServerEmitAddress {
@@ -163,8 +172,9 @@ struct Network {
uint32_t dhcp_server_pool_offset;
uint32_t dhcp_server_pool_size;
- /* IPV4LL Support */
+ /* link local addressing support */
AddressFamily link_local;
+ IPv6LinkLocalAddressGenMode ipv6ll_address_gen_mode;
bool ipv4ll_route;
bool default_route_on_device;
@@ -256,7 +266,6 @@ struct Network {
bool configure_without_carrier;
int ignore_carrier_loss;
KeepConfiguration keep_configuration;
- LinkIPv6AddressGenMode ipv6_address_gen_mode;
uint32_t iaid;
DUID duid;
@@ -351,6 +360,7 @@ CONFIG_PARSER_PROTOTYPE(config_parse_dnssec_negative_trust_anchors);
CONFIG_PARSER_PROTOTYPE(config_parse_ntp);
CONFIG_PARSER_PROTOTYPE(config_parse_required_for_online);
CONFIG_PARSER_PROTOTYPE(config_parse_keep_configuration);
+CONFIG_PARSER_PROTOTYPE(config_parse_ipv6_link_local_address_gen_mode);
const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, GPERF_LEN_TYPE length);
@@ -359,3 +369,6 @@ IPv6PrivacyExtensions ipv6_privacy_extensions_from_string(const char *s) _pure_;
const char* keep_configuration_to_string(KeepConfiguration i) _const_;
KeepConfiguration keep_configuration_from_string(const char *s) _pure_;
+
+const char* ipv6_link_local_address_gen_mode_to_string(IPv6LinkLocalAddressGenMode s) _const_;
+IPv6LinkLocalAddressGenMode ipv6_link_local_address_gen_mode_from_string(const char *s) _pure_;
diff --git a/test/fuzz/fuzz-network-parser/directives.network b/test/fuzz/fuzz-network-parser/directives.network
index 628971f83a..703da475b6 100644
--- a/test/fuzz/fuzz-network-parser/directives.network
+++ b/test/fuzz/fuzz-network-parser/directives.network
@@ -38,7 +38,6 @@ MTUBytes=
Multicast=
MACAddress=
Group=
-IPv6LinkLocalAddressGenerationMode=
[BridgeFDB]
VLANId=
MACAddress=
@@ -187,6 +186,7 @@ VXLAN=
L2TP=
MACsec=
LinkLocalAddressing=
+IPv6LinkLocalAddressGenerationMode=
ConfigureWithoutCarrier=
NTP=
DHCP=