Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

gre: Fix IPv6 multicast route creation.

Use addrconf_add_dev() instead of ipv6_find_idev() in
addrconf_gre_config() so that we don't just get the inet6_dev, but also
install the default ff00::/8 multicast route.

Before commit 3e6a0243ff00 ("gre: Fix again IPv6 link-local address
generation."), the multicast route was created at the end of the
function by addrconf_add_mroute(). But this code path is now only taken
in one particular case (gre devices not bound to a local IP address and
in EUI64 mode). For all other cases, the function exits early and
addrconf_add_mroute() is not called anymore.

Using addrconf_add_dev() instead of ipv6_find_idev() in
addrconf_gre_config(), fixes the problem as it will create the default
multicast route for all gre devices. This also brings
addrconf_gre_config() a bit closer to the normal netdevice IPv6
configuration code (addrconf_dev_config()).

Cc: stable@vger.kernel.org
Fixes: 3e6a0243ff00 ("gre: Fix again IPv6 link-local address generation.")
Reported-by: Aiden Yang <ling@moedove.com>
Closes: https://lore.kernel.org/netdev/CANR=AhRM7YHHXVxJ4DmrTNMeuEOY87K2mLmo9KMed1JMr20p6g@mail.gmail.com/
Reviewed-by: Gary Guo <gary@garyguo.net>
Tested-by: Gary Guo <gary@garyguo.net>
Signed-off-by: Guillaume Nault <gnault@redhat.com>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Link: https://patch.msgid.link/027a923dcb550ad115e6d93ee8bb7d310378bd01.1752070620.git.gnault@redhat.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Guillaume Nault and committed by
Jakub Kicinski
4e914ef0 2dfa4e31

+2 -7
+2 -7
net/ipv6/addrconf.c
··· 3525 3525 3526 3526 ASSERT_RTNL(); 3527 3527 3528 - idev = ipv6_find_idev(dev); 3529 - if (IS_ERR(idev)) { 3530 - pr_debug("%s: add_dev failed\n", __func__); 3528 + idev = addrconf_add_dev(dev); 3529 + if (IS_ERR(idev)) 3531 3530 return; 3532 - } 3533 3531 3534 3532 /* Generate the IPv6 link-local address using addrconf_addr_gen(), 3535 3533 * unless we have an IPv4 GRE device not bound to an IP address and ··· 3541 3543 } 3542 3544 3543 3545 add_v4_addrs(idev); 3544 - 3545 - if (dev->flags & IFF_POINTOPOINT) 3546 - addrconf_add_mroute(dev); 3547 3546 } 3548 3547 #endif 3549 3548