mirror of
https://github.com/torvalds/linux.git
synced 2026-05-23 14:42:08 +02:00
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: Yue Haibing <yuehaibing@huawei.com> Reviewed-by: Dawid Osuchowski <dawid.osuchowski@linux.intel.com> Link: https://patch.msgid.link/20250822064051.2991480-1-yuehaibing@huawei.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
411d7d70cd
commit
60c481d4ca
|
|
@ -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,
|
||||
const struct in6_addr *group,
|
||||
int ifindex)
|
||||
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;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user