On 8/3/20 11:34 PM, Xin Long wrote:
> Without ub->ifindex set for ipv6 address in tipc_udp_enable(),
> ipv6_sock_mc_join() may make the wrong dev join the multicast
> address in enable_mcast(). This causes that tipc links would
> never be created.
> 
> So fix it by getting the right netdev and setting ub->ifindex,
> as it does for ipv4 address.
> 
> Reported-by: Shuang Li <shu...@redhat.com>
> Signed-off-by: Xin Long <lucien....@gmail.com>

Acked-by: Ying Xue <ying....@windriver.com>

> ---
>  net/tipc/udp_media.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/net/tipc/udp_media.c b/net/tipc/udp_media.c
> index 28a283f..9dec596 100644
> --- a/net/tipc/udp_media.c
> +++ b/net/tipc/udp_media.c
> @@ -738,6 +738,13 @@ static int tipc_udp_enable(struct net *net, struct 
> tipc_bearer *b,
>               b->mtu = b->media->mtu;
>  #if IS_ENABLED(CONFIG_IPV6)
>       } else if (local.proto == htons(ETH_P_IPV6)) {
> +             struct net_device *dev;
> +
> +             dev = ipv6_dev_find(net, &local.ipv6);
> +             if (!dev) {
> +                     err = -ENODEV;
> +                     goto err;
> +             }
>               udp_conf.family = AF_INET6;
>               udp_conf.use_udp6_tx_checksums = true;
>               udp_conf.use_udp6_rx_checksums = true;
> @@ -745,6 +752,7 @@ static int tipc_udp_enable(struct net *net, struct 
> tipc_bearer *b,
>                       udp_conf.local_ip6 = in6addr_any;
>               else
>                       udp_conf.local_ip6 = local.ipv6;
> +             ub->ifindex = dev->ifindex;
>               b->mtu = 1280;
>  #endif
>       } else {
> 

Reply via email to