From 7bbe9ad796d69370d49e2f3eeddd4727ba413ffc Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 30 Dec 2024 10:16:37 +0900 Subject: [PATCH] network: introduce system wide default setting for DHCPv4 client ID Typically, the same client identifier setting is used for all interfaces. Hence, better to provide the system-wide setting to specify the client identifier. --- man/networkd.conf.xml | 14 ++++++++++++++ man/systemd.network.xml | 7 +++++-- src/network/networkd-dhcp4.c | 2 +- src/network/networkd-gperf.gperf | 1 + src/network/networkd-manager.c | 1 + src/network/networkd-manager.h | 1 + src/network/networkd.conf | 1 + 7 files changed, 24 insertions(+), 3 deletions(-) diff --git a/man/networkd.conf.xml b/man/networkd.conf.xml index e843e3d9b1e..1d5edfd45f2 100644 --- a/man/networkd.conf.xml +++ b/man/networkd.conf.xml @@ -256,6 +256,20 @@ The following options are understood: + + ClientIdentifier= + + Specifies the default DHCPv4 client identifier to be used. Takes one of + or . If set to , the MAC address of each link will be used. + If set to , an RFC4361-compliant Client ID, which is the combination of IAID + and DUID, is used. IAID can be configured by IAID= in each matching + .network file. DUID can be configured by DUIDType= and + DUIDRawData=. Defaults to . + + + + + DUIDType= Specifies how the DUID should be generated. See diff --git a/man/systemd.network.xml b/man/systemd.network.xml index 6ed4dde4df4..1c26609917e 100644 --- a/man/systemd.network.xml +++ b/man/systemd.network.xml @@ -2371,8 +2371,11 @@ NFTSet=prefix:netdev:filter:eth_ipv4_prefix . If set to , the MAC address of the link is used. If set to , an RFC4361-compliant Client ID, which is the combination of IAID and DUID, is used. IAID can be configured by IAID=. DUID can be configured by - DUIDType= and DUIDRawData=. Defaults to - . + DUIDType= and DUIDRawData=. When + Anonymize= is enabled, is unconditionally used and the + specified value will be ignored. When unspecified, the value specified in the same setting in + networkd.conf5 + will be used. diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c index d94ac1a213a..30abef49a23 100644 --- a/src/network/networkd-dhcp4.c +++ b/src/network/networkd-dhcp4.c @@ -52,7 +52,7 @@ void network_adjust_dhcp4(Network *network) { } if (network->dhcp_client_identifier < 0) - network->dhcp_client_identifier = network->dhcp_anonymize ? DHCP_CLIENT_ID_MAC : DHCP_CLIENT_ID_DUID; + network->dhcp_client_identifier = network->dhcp_anonymize ? DHCP_CLIENT_ID_MAC : network->manager->dhcp_client_identifier; /* By default, RapidCommit= is enabled when Anonymize=no and neither AllowList= nor DenyList= is specified. */ if (network->dhcp_use_rapid_commit < 0) diff --git a/src/network/networkd-gperf.gperf b/src/network/networkd-gperf.gperf index b69ef5fd313..21e8d12690b 100644 --- a/src/network/networkd-gperf.gperf +++ b/src/network/networkd-gperf.gperf @@ -37,6 +37,7 @@ IPv6AcceptRA.UseDomains, config_parse_use_domains, IPv6AddressLabel.Prefix, config_parse_ipv6_address_label_section, IPV6_ADDRESS_LABEL_BY_MANAGER | IPV6_ADDRESS_LABEL_PREFIX, 0 IPv6AddressLabel.Label, config_parse_ipv6_address_label_section, IPV6_ADDRESS_LABEL_BY_MANAGER | IPV6_ADDRESS_LABEL, 0 DHCPv4.UseDomains, config_parse_use_domains, 0, offsetof(Manager, dhcp_use_domains) +DHCPv4.ClientIdentifier, config_parse_dhcp_client_identifier, 0, offsetof(Manager, dhcp_client_identifier) DHCPv4.DUIDType, config_parse_duid_type, 0, offsetof(Manager, dhcp_duid) DHCPv4.DUIDRawData, config_parse_duid_rawdata, 0, offsetof(Manager, dhcp_duid) DHCPv6.UseDomains, config_parse_use_domains, 0, offsetof(Manager, dhcp6_use_domains) diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index 829937958b4..8061976d7b9 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -647,6 +647,7 @@ int manager_new(Manager **ret, bool test_mode) { .dhcp_use_domains = _USE_DOMAINS_INVALID, .dhcp6_use_domains = _USE_DOMAINS_INVALID, .ndisc_use_domains = _USE_DOMAINS_INVALID, + .dhcp_client_identifier = DHCP_CLIENT_ID_DUID, .dhcp_duid.type = DUID_TYPE_EN, .dhcp6_duid.type = DUID_TYPE_EN, .duid_product_uuid.type = DUID_TYPE_UUID, diff --git a/src/network/networkd-manager.h b/src/network/networkd-manager.h index faa33571516..9891b8c1fc0 100644 --- a/src/network/networkd-manager.h +++ b/src/network/networkd-manager.h @@ -78,6 +78,7 @@ struct Manager { UseDomains dhcp6_use_domains; UseDomains ndisc_use_domains; + DHCPClientIdentifier dhcp_client_identifier; DUID dhcp_duid; DUID dhcp6_duid; DUID duid_product_uuid; diff --git a/src/network/networkd.conf b/src/network/networkd.conf index 857df0899f3..a5a9418bbb1 100644 --- a/src/network/networkd.conf +++ b/src/network/networkd.conf @@ -36,6 +36,7 @@ #UseDomains= [DHCPv4] +#ClientIdentifier=duid #DUIDType=vendor #DUIDRawData= #UseDomains=