When radv sends to the ipv6 all-nodes multicast address (ff02::1) we don't set sin6_scope_id because ipa_is_link_local isn't satisfied. This will cause packets to be sent via the wrong interface. To fix this we use ip6_classify, which returns SCOPE_LINK for unicast fe80::/64 as well as multicast ff02::/8 destinations. --- Tested with bird 2.0.10 on Debian 11. sysdep/unix/io.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sysdep/unix/io.c b/sysdep/unix/io.c index e131ca41..f77b4a51 100644 --- a/sysdep/unix/io.c +++ b/sysdep/unix/io.c @@ -229,7 +229,7 @@ sockaddr_fill6(struct sockaddr_in6 *sa, ip_addr a, struct iface *ifa, uint port) sa->sin6_flowinfo = 0; sa->sin6_addr = ipa_to_in6(a); - if (ifa && ipa_is_link_local(a)) + if (ifa && ip6_classify(&a) & SCOPE_LINK) sa->sin6_scope_id = ifa->index; } -- 2.30.2