]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
ipv6: Pass dev to inet6_addr_add().
authorKuniyuki Iwashima <kuniyu@amazon.com>
Wed, 15 Jan 2025 08:06:04 +0000 (17:06 +0900)
committerJakub Kicinski <kuba@kernel.org>
Mon, 20 Jan 2025 20:16:05 +0000 (12:16 -0800)
inet6_addr_add() is called from inet6_rtm_newaddr() and
addrconf_add_ifaddr().

inet6_addr_add() looks up dev by __dev_get_by_index(), but
it's already done in inet6_rtm_newaddr().

Let's move the 2nd lookup to addrconf_add_ifaddr() and pass
dev to inet6_addr_add().

Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Link: https://patch.msgid.link/20250115080608.28127-8-kuniyu@amazon.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ipv6/addrconf.c

index 9c7257b28a84f3f61714e70bc72380b3fdce3521..0e7ca74012aaa382b77389add727fb4d32adf2eb 100644 (file)
@@ -3007,13 +3007,12 @@ static int ipv6_mc_config(struct sock *sk, bool join,
 /*
  *     Manual configuration of address on an interface
  */
-static int inet6_addr_add(struct net *net, int ifindex,
+static int inet6_addr_add(struct net *net, struct net_device *dev,
                          struct ifa6_config *cfg,
                          struct netlink_ext_ack *extack)
 {
        struct inet6_ifaddr *ifp;
        struct inet6_dev *idev;
-       struct net_device *dev;
        unsigned long timeout;
        clock_t expires;
        u32 flags;
@@ -3036,10 +3035,6 @@ static int inet6_addr_add(struct net *net, int ifindex,
                return -EINVAL;
        }
 
-       dev = __dev_get_by_index(net, ifindex);
-       if (!dev)
-               return -ENODEV;
-
        idev = addrconf_add_dev(dev);
        if (IS_ERR(idev)) {
                NL_SET_ERR_MSG_MOD(extack, "IPv6 is disabled on this device");
@@ -3048,7 +3043,7 @@ static int inet6_addr_add(struct net *net, int ifindex,
 
        if (cfg->ifa_flags & IFA_F_MCAUTOJOIN) {
                int ret = ipv6_mc_config(net->ipv6.mc_autojoin_sk,
-                                        true, cfg->pfx, ifindex);
+                                        true, cfg->pfx, dev->ifindex);
 
                if (ret < 0) {
                        NL_SET_ERR_MSG_MOD(extack, "Multicast auto join failed");
@@ -3103,7 +3098,7 @@ static int inet6_addr_add(struct net *net, int ifindex,
                return 0;
        } else if (cfg->ifa_flags & IFA_F_MCAUTOJOIN) {
                ipv6_mc_config(net->ipv6.mc_autojoin_sk, false,
-                              cfg->pfx, ifindex);
+                              cfg->pfx, dev->ifindex);
        }
 
        return PTR_ERR(ifp);
@@ -3169,6 +3164,7 @@ int addrconf_add_ifaddr(struct net *net, void __user *arg)
                .preferred_lft = INFINITY_LIFE_TIME,
                .valid_lft = INFINITY_LIFE_TIME,
        };
+       struct net_device *dev;
        struct in6_ifreq ireq;
        int err;
 
@@ -3182,7 +3178,11 @@ int addrconf_add_ifaddr(struct net *net, void __user *arg)
        cfg.plen = ireq.ifr6_prefixlen;
 
        rtnl_net_lock(net);
-       err = inet6_addr_add(net, ireq.ifr6_ifindex, &cfg, NULL);
+       dev = __dev_get_by_index(net, ireq.ifr6_ifindex);
+       if (dev)
+               err = inet6_addr_add(net, dev, &cfg, NULL);
+       else
+               err = -ENODEV;
        rtnl_net_unlock(net);
        return err;
 }
@@ -5064,7 +5064,7 @@ inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh,
                 * It would be best to check for !NLM_F_CREATE here but
                 * userspace already relies on not having to provide this.
                 */
-               return inet6_addr_add(net, ifm->ifa_index, &cfg, extack);
+               return inet6_addr_add(net, dev, &cfg, extack);
        }
 
        if (nlh->nlmsg_flags & NLM_F_EXCL ||