diff --git a/man/systemd.network.xml b/man/systemd.network.xml index 8d3d65024c..3e85edec6d 100644 --- a/man/systemd.network.xml +++ b/man/systemd.network.xml @@ -1098,8 +1098,8 @@ IPv6Token=prefixstable:2002:da8:1:: Takes one of ipv4, ipv6, both, none. When ipv4, - performs IPv4 Duplicate Address Detection. See - RFC 5224. + performs IPv4 Address Conflict Detection. See + RFC 5227. When ipv6, performs IPv6 Duplicate Address Detection. See RFC 4862. Defaults to ipv6. diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index b84181892e..04ad2aa69d 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -2111,9 +2111,17 @@ static int address_section_verify(Address *address) { address->scope = RT_SCOPE_HOST; } - if (!FLAGS_SET(address->duplicate_address_detection, ADDRESS_FAMILY_IPV6)) + if (address->family == AF_INET6 && + !FLAGS_SET(address->duplicate_address_detection, ADDRESS_FAMILY_IPV6)) address->flags |= IFA_F_NODAD; + if (address->family == AF_INET && in4_addr_is_link_local(&address->in_addr.in) && + !FLAGS_SET(address->duplicate_address_detection, ADDRESS_FAMILY_IPV4)) { + log_debug("%s: An IPv4 link-local address is specified, enabling IPv4 Address Conflict Detection (ACD).", + address->section->filename); + address->duplicate_address_detection |= ADDRESS_FAMILY_IPV4; + } + return 0; }