]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: make link_may_have_ipv6ll() optionally check Multicast= setting
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 1 Aug 2022 18:33:21 +0000 (03:33 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 1 Aug 2022 18:35:00 +0000 (03:35 +0900)
Fixes the IPv6LL issue in #23197.

src/network/networkd-address.c
src/network/networkd-ipv6ll.c
src/network/networkd-ipv6ll.h
src/network/networkd-link.c
src/network/networkd-ndisc.c
src/network/networkd-radv.c

index a60cd746a4bab8f2720cafa7b7ef947463eadf9c..ccb4a426faea04c1d915401532dff8c6810fcd0e 100644 (file)
@@ -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);
index 9b859897019e3d9b664b78c05f608fcba3d08f3f..32229a3fc70e84877d960a2e3a57bb5615d5c729 100644 (file)
@@ -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;
index a9763debb1abf6efcbd9b373df8ae209804ddfeb..2759eed7f70dc11eb8da6988ab581dd4d00a0cd4 100644 (file)
@@ -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);
index c8df554cd62f8e9c47772a471cc88942c3817db2..76e0690aefc01c3355080b18e8384c1b30e6949c 100644 (file)
@@ -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))
index 943e12ba56014db456fbb8c2b44f6be1e7c94fd1..dfbb7043bf14c665cfcd05a3ed5800da958a7d51 100644 (file)
@@ -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);
index 32ee7aa7abfaceff868360138cad7a719538fbef..c59ae8269401dfdab19761386fc9c09743de86a0 100644 (file)
@@ -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)