Once upon a time, Beniamino Galvani bgalvani@redhat.com said:
In practice, it's a bit more complex than that. network-online.target is emitted after all NM connections succeed. The meaning of "success" depends on properties "ipv4.may-fail" and "ipv6.may-fail" of the connection profile. Normally they are both set to "yes" and this means that just one of IPv4 and IPv6 is enough to reach the activated state.
If the connection has static IPv4 addresses and "auto" IPv6 (i.e. SLAAC plus optionally DHCPv6), before enabling ACD it was guaranteed that IPv4 addresses were added before reaching network-online. After enabling ACD, both IPv4 ACD and IPv6 SLAAC are started in parallel and the first that completes will make the connection succeed. However, in practice IPv6 also requires DAD and the timeout is longer than the IPv4 ACD timeout; so, services that bind to static IPv4 addresses can still rely on the addresses being present after network-online.target is reached.
Of course, in case of services that bind IPv4 to addresses, the best solution is to set "ipv4.may-fail=no" (or for IPv6 addresses, "ipv6.may-fail=no") in the connection profile. That is required when using "auto" methods, in order to avoid the situation where the connection succeeds after the "other" address family completes.
Thanks for that detailed explanation! I had't seen that level of what network-online.target actually means.