diff --git a/man/systemd.link.xml b/man/systemd.link.xml
index 504977c862d..24271ea65a0 100644
--- a/man/systemd.link.xml
+++ b/man/systemd.link.xml
@@ -273,18 +273,21 @@
- Keeps the MAC address assigned by the kernel.
+ Keeps the MAC address assigned by the kernel. Or use the MAC address specified in
+ MACAddress=.
+
+ An empty string assignment is equivalent to setting none.MACAddress=
- The MAC address to use, if no
- MACAddressPolicy=
- is specified.
+ The interface MAC address to use. For this setting to take effect,
+ MACAddressPolicy= must either be unset, empty, or none.
+
diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c
index afb2cd4d1c9..d12fd0e2991 100644
--- a/src/udev/net/link-config.c
+++ b/src/udev/net/link-config.c
@@ -181,6 +181,13 @@ int link_load_one(link_config_ctx *ctx, const char *filename) {
return 0;
}
+ if (IN_SET(link->mac_address_policy, MAC_ADDRESS_POLICY_PERSISTENT, MAC_ADDRESS_POLICY_RANDOM) && link->mac) {
+ log_warning("%s: MACAddress= in [Link] section will be ignored when MACAddressPolicy= "
+ "is set to \"persistent\" or \"random\".",
+ filename);
+ link->mac = mfree(link->mac);
+ }
+
log_debug("Parsed configuration file %s", filename);
LIST_PREPEND(links, ctx->links, TAKE_PTR(link));
@@ -668,8 +675,12 @@ static const char* const mac_address_policy_table[_MAC_ADDRESS_POLICY_MAX] = {
};
DEFINE_STRING_TABLE_LOOKUP(mac_address_policy, MACAddressPolicy);
-DEFINE_CONFIG_PARSE_ENUM(config_parse_mac_address_policy, mac_address_policy, MACAddressPolicy,
- "Failed to parse MAC address policy");
+DEFINE_CONFIG_PARSE_ENUM_WITH_DEFAULT(
+ config_parse_mac_address_policy,
+ mac_address_policy,
+ MACAddressPolicy,
+ MAC_ADDRESS_POLICY_NONE,
+ "Failed to parse MAC address policy");
static const char* const name_policy_table[_NAMEPOLICY_MAX] = {
[NAMEPOLICY_KERNEL] = "kernel",