]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ipv6: mcast: Add ip6_mc_find_idev() helper
authorYue Haibing <yuehaibing@huawei.com>
Fri, 22 Aug 2025 06:40:51 +0000 (14:40 +0800)
committerJakub Kicinski <kuba@kernel.org>
Mon, 25 Aug 2025 23:36:59 +0000 (16:36 -0700)
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>
net/ipv6/mcast.c

index 36ca27496b3c04945570c1aa8ad2130033c10234..55c49dc14b1bd9815128bbd07c80837adc19e7ec 100644 (file)
@@ -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;