Commit 60c481d4 authored by Yue Haibing's avatar Yue Haibing Committed by Jakub Kicinski
Browse files

ipv6: mcast: Add ip6_mc_find_idev() helper



Extract the same code logic from __ipv6_sock_mc_join() and
ip6_mc_find_dev(), also add new helper ip6_mc_find_idev() to
reduce redundancy and enhance readability.

No functional changes intended.

Signed-off-by: default avatarYue Haibing <yuehaibing@huawei.com>
Reviewed-by: default avatarDawid Osuchowski <dawid.osuchowski@linux.intel.com>
Link: https://patch.msgid.link/20250822064051.2991480-1-yuehaibing@huawei.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 411d7d70
Loading
Loading
Loading
Loading
+31 −36
Original line number Diff line number Diff line
@@ -169,6 +169,29 @@ static int unsolicited_report_interval(struct inet6_dev *idev)
	return iv > 0 ? iv : 1;
}

static struct net_device *ip6_mc_find_dev(struct net *net,
					  const struct in6_addr *group,
					  int ifindex)
{
	struct net_device *dev = NULL;
	struct rt6_info *rt;

	if (ifindex == 0) {
		rcu_read_lock();
		rt = rt6_lookup(net, group, NULL, 0, NULL, 0);
		if (rt) {
			dev = dst_dev(&rt->dst);
			dev_hold(dev);
			ip6_rt_put(rt);
		}
		rcu_read_unlock();
	} else {
		dev = dev_get_by_index(net, ifindex);
	}

	return dev;
}

/*
 *	socket join on multicast group
 */
@@ -191,28 +214,13 @@ static int __ipv6_sock_mc_join(struct sock *sk, int ifindex,
	}

	mc_lst = sock_kmalloc(sk, sizeof(struct ipv6_mc_socklist), GFP_KERNEL);

	if (!mc_lst)
		return -ENOMEM;

	mc_lst->next = NULL;
	mc_lst->addr = *addr;

	if (ifindex == 0) {
		struct rt6_info *rt;

		rcu_read_lock();
		rt = rt6_lookup(net, addr, NULL, 0, NULL, 0);
		if (rt) {
			dev = dst_dev(&rt->dst);
			dev_hold(dev);
			ip6_rt_put(rt);
		}
		rcu_read_unlock();
	} else {
		dev = dev_get_by_index(net, ifindex);
	}

	dev = ip6_mc_find_dev(net, addr, ifindex);
	if (!dev) {
		sock_kfree_s(sk, mc_lst, sizeof(*mc_lst));
		return -ENODEV;
@@ -302,27 +310,14 @@ int ipv6_sock_mc_drop(struct sock *sk, int ifindex, const struct in6_addr *addr)
}
EXPORT_SYMBOL(ipv6_sock_mc_drop);

static struct inet6_dev *ip6_mc_find_dev(struct net *net,
static struct inet6_dev *ip6_mc_find_idev(struct net *net,
					  const struct in6_addr *group,
					  int ifindex)
{
	struct net_device *dev = NULL;
	struct net_device *dev;
	struct inet6_dev *idev;

	if (ifindex == 0) {
		struct rt6_info *rt;

		rcu_read_lock();
		rt = rt6_lookup(net, group, NULL, 0, NULL, 0);
		if (rt) {
			dev = dst_dev(&rt->dst);
			dev_hold(dev);
			ip6_rt_put(rt);
		}
		rcu_read_unlock();
	} else {
		dev = dev_get_by_index(net, ifindex);
	}
	dev = ip6_mc_find_dev(net, group, ifindex);
	if (!dev)
		return NULL;

@@ -374,7 +369,7 @@ int ip6_mc_source(int add, int omode, struct sock *sk,
	if (!ipv6_addr_is_multicast(group))
		return -EINVAL;

	idev = ip6_mc_find_dev(net, group, pgsr->gsr_interface);
	idev = ip6_mc_find_idev(net, group, pgsr->gsr_interface);
	if (!idev)
		return -ENODEV;

@@ -509,7 +504,7 @@ int ip6_mc_msfilter(struct sock *sk, struct group_filter *gsf,
	    gsf->gf_fmode != MCAST_EXCLUDE)
		return -EINVAL;

	idev = ip6_mc_find_dev(net, group, gsf->gf_interface);
	idev = ip6_mc_find_idev(net, group, gsf->gf_interface);
	if (!idev)
		return -ENODEV;