From: Yu Watanabe Date: Mon, 1 Aug 2022 18:33:21 +0000 (+0900) Subject: network: make link_may_have_ipv6ll() optionally check Multicast= setting X-Git-Tag: v252-rc1~546^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bd7e0a3f1cd28fd00d7c21bea766bffb42917c36;p=thirdparty%2Fsystemd.git network: make link_may_have_ipv6ll() optionally check Multicast= setting Fixes the IPv6LL issue in #23197. --- diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index a60cd746a4b..ccb4a426fae 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -802,7 +802,7 @@ int link_drop_ipv6ll_addresses(Link *link) { /* IPv6LL address may be in the tentative state, and in that case networkd has not received it. * So, we need to dump all IPv6 addresses. */ - if (link_may_have_ipv6ll(link)) + if (link_may_have_ipv6ll(link, /* check_multicast = */ false)) return 0; r = sd_rtnl_message_new_addr(link->manager->rtnl, &req, RTM_GETADDR, link->ifindex, AF_INET6); diff --git a/src/network/networkd-ipv6ll.c b/src/network/networkd-ipv6ll.c index 9b859897019..32229a3fc70 100644 --- a/src/network/networkd-ipv6ll.c +++ b/src/network/networkd-ipv6ll.c @@ -38,7 +38,7 @@ bool link_ipv6ll_enabled(Link *link) { return link->network->link_local & ADDRESS_FAMILY_IPV6; } -bool link_may_have_ipv6ll(Link *link) { +bool link_may_have_ipv6ll(Link *link, bool check_multicast) { assert(link); /* @@ -62,6 +62,9 @@ bool link_may_have_ipv6ll(Link *link) { if (!link->network) return false; + if (check_multicast && !FLAGS_SET(link->flags, IFF_MULTICAST) && link->network->multicast <= 0) + return false; + ORDERED_HASHMAP_FOREACH(a, link->network->addresses_by_section) { if (a->family != AF_INET6) continue; diff --git a/src/network/networkd-ipv6ll.h b/src/network/networkd-ipv6ll.h index a9763debb1a..2759eed7f70 100644 --- a/src/network/networkd-ipv6ll.h +++ b/src/network/networkd-ipv6ll.h @@ -22,7 +22,7 @@ typedef enum IPv6LinkLocalAddressGenMode { } IPv6LinkLocalAddressGenMode; bool link_ipv6ll_enabled(Link *link); -bool link_may_have_ipv6ll(Link *link); +bool link_may_have_ipv6ll(Link *link, bool check_multicast); IPv6LinkLocalAddressGenMode link_get_ipv6ll_addrgen_mode(Link *link); int ipv6ll_addrgen_mode_fill_message(sd_netlink_message *message, IPv6LinkLocalAddressGenMode mode); diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index c8df554cd62..76e0690aefc 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -83,8 +83,7 @@ bool link_ipv6_enabled(Link *link) { if (link->network->bond) return false; - /* DHCPv6 client will not be started if no IPv6 link-local address is configured. */ - if (link_ipv6ll_enabled(link)) + if (link_may_have_ipv6ll(link, /* check_multicast = */ false)) return true; if (network_has_static_ipv6_configurations(link->network)) diff --git a/src/network/networkd-ndisc.c b/src/network/networkd-ndisc.c index 943e12ba560..dfbb7043bf1 100644 --- a/src/network/networkd-ndisc.c +++ b/src/network/networkd-ndisc.c @@ -41,7 +41,7 @@ bool link_ipv6_accept_ra_enabled(Link *link) { if (!link->network) return false; - if (!link_may_have_ipv6ll(link)) + if (!link_may_have_ipv6ll(link, /* check_multicast = */ true)) return false; assert(link->network->ipv6_accept_ra >= 0); diff --git a/src/network/networkd-radv.c b/src/network/networkd-radv.c index 32ee7aa7abf..c59ae826940 100644 --- a/src/network/networkd-radv.c +++ b/src/network/networkd-radv.c @@ -54,7 +54,7 @@ void network_adjust_radv(Network *network) { bool link_radv_enabled(Link *link) { assert(link); - if (!link_may_have_ipv6ll(link)) + if (!link_may_have_ipv6ll(link, /* check_multicast = */ true)) return false; if (link->hw_addr.length != ETH_ALEN)