X Tutup
Skip to content

Commit 2859932

Browse files
yuwatakeszybz
authored andcommitted
network: do not enable IPv4 ACD for IPv4 link-local address if ACD is disabled explicitly
The commit 1cf4ed1 makes the IPv4 ACD enabled unconditionally for IPv4 link-local addresses even if users explicitly disable ACD. This makes the IPv4 ACD is enabled by default, but honor user setting. Fixes systemd#22763.
1 parent 000096f commit 2859932

File tree

3 files changed

+23
-9
lines changed

3 files changed

+23
-9
lines changed

man/systemd.network.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1045,7 +1045,8 @@ Table=1234</programlisting></para>
10451045
Detection. See <ulink url="https://tools.ietf.org/html/rfc5227">RFC 5227</ulink>.
10461046
When <literal>ipv6</literal>, performs IPv6 Duplicate Address Detection. See
10471047
<ulink url="https://tools.ietf.org/html/rfc4862">RFC 4862</ulink>. Defaults to
1048-
<literal>ipv6</literal>.</para>
1048+
<literal>ipv4</literal> for IPv4 link-local addresses, <literal>ipv6</literal> for IPv6
1049+
addresses, and <literal>none</literal> otherwise.</para>
10491050
</listitem>
10501051
</varlistentry>
10511052

src/network/networkd-address.c

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ int address_new(Address **ret) {
6868
.lifetime_valid_usec = USEC_INFINITY,
6969
.lifetime_preferred_usec = USEC_INFINITY,
7070
.set_broadcast = -1,
71-
.duplicate_address_detection = ADDRESS_FAMILY_IPV6,
7271
};
7372

7473
*ret = TAKE_PTR(address);
@@ -106,6 +105,8 @@ static int address_new_static(Network *network, const char *filename, unsigned s
106105
address->network = network;
107106
address->section = TAKE_PTR(n);
108107
address->source = NETWORK_CONFIG_SOURCE_STATIC;
108+
/* This will be adjusted in address_section_verify(). */
109+
address->duplicate_address_detection = _ADDRESS_FAMILY_INVALID;
109110

110111
r = ordered_hashmap_ensure_put(&network->addresses_by_section, &config_section_hash_ops, address->section, address);
111112
if (r < 0)
@@ -1951,6 +1952,8 @@ static int address_section_verify(Address *address) {
19511952
address->section->filename, address->section->line);
19521953
}
19531954

1955+
assert(IN_SET(address->family, AF_INET, AF_INET6));
1956+
19541957
if (in4_addr_is_set(&address->broadcast) &&
19551958
(address->family == AF_INET6 || address->prefixlen > 30 ||
19561959
in_addr_is_set(address->family, &address->in_addr_peer))) {
@@ -1977,17 +1980,24 @@ static int address_section_verify(Address *address) {
19771980
address->scope = RT_SCOPE_LINK;
19781981
}
19791982

1983+
if (address->duplicate_address_detection < 0) {
1984+
if (address->family == AF_INET6)
1985+
address->duplicate_address_detection = ADDRESS_FAMILY_IPV6;
1986+
else if (in4_addr_is_link_local(&address->in_addr.in))
1987+
address->duplicate_address_detection = ADDRESS_FAMILY_IPV4;
1988+
else
1989+
address->duplicate_address_detection = ADDRESS_FAMILY_NO;
1990+
} else if (address->duplicate_address_detection == ADDRESS_FAMILY_IPV6 && address->family == AF_INET)
1991+
log_warning("%s: DuplicateAddressDetection=ipv6 is specified for IPv4 address, ignoring.",
1992+
address->section->filename);
1993+
else if (address->duplicate_address_detection == ADDRESS_FAMILY_IPV4 && address->family == AF_INET6)
1994+
log_warning("%s: DuplicateAddressDetection=ipv4 is specified for IPv6 address, ignoring.",
1995+
address->section->filename);
1996+
19801997
if (address->family == AF_INET6 &&
19811998
!FLAGS_SET(address->duplicate_address_detection, ADDRESS_FAMILY_IPV6))
19821999
address->flags |= IFA_F_NODAD;
19832000

1984-
if (address->family == AF_INET && in4_addr_is_link_local(&address->in_addr.in) &&
1985-
!FLAGS_SET(address->duplicate_address_detection, ADDRESS_FAMILY_IPV4)) {
1986-
log_debug("%s: An IPv4 link-local address is specified, enabling IPv4 Address Conflict Detection (ACD).",
1987-
address->section->filename);
1988-
address->duplicate_address_detection |= ADDRESS_FAMILY_IPV4;
1989-
}
1990-
19912001
return 0;
19922002
}
19932003

src/network/networkd-address.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ struct Address {
5353

5454
bool scope_set:1;
5555
bool ip_masquerade_done:1;
56+
57+
/* duplicate_address_detection is only used by static or IPv4 dynamic addresses.
58+
* To control DAD for IPv6 dynamic addresses, set IFA_F_NODAD to flags. */
5659
AddressFamily duplicate_address_detection;
5760
sd_ipv4acd *acd;
5861

0 commit comments

Comments
 (0)
X Tutup