]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: ipv6: Init tunnel link-netns before registering dev
authorXiao Liang <shaw.leon@gmail.com>
Wed, 19 Feb 2025 12:50:33 +0000 (20:50 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 29 May 2025 09:13:11 +0000 (11:13 +0200)
[ Upstream commit db014522f35606031d8ac58b4aed6b1ed84f03d1 ]

Currently some IPv6 tunnel drivers set tnl->net to dev_net(dev) in
ndo_init(), which is called in register_netdevice(). However, it lacks
the context of link-netns when we enable cross-net tunnels at device
registration time.

Let's move the init of tunnel link-netns before register_netdevice().

ip6_gre has already initialized netns, so just remove the redundant
assignment.

Signed-off-by: Xiao Liang <shaw.leon@gmail.com>
Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Link: https://patch.msgid.link/20250219125039.18024-8-shaw.leon@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/ipv6/ip6_gre.c
net/ipv6/ip6_tunnel.c
net/ipv6/ip6_vti.c
net/ipv6/sit.c

index 235808cfec705032b545d6f396f8e58f4693e8d8..68e9a41eed4914cfa76116c4c06f0923db6b6fa3 100644 (file)
@@ -1498,7 +1498,6 @@ static int ip6gre_tunnel_init_common(struct net_device *dev)
        tunnel = netdev_priv(dev);
 
        tunnel->dev = dev;
-       tunnel->net = dev_net(dev);
        strcpy(tunnel->parms.name, dev->name);
 
        ret = dst_cache_init(&tunnel->dst_cache, GFP_KERNEL);
@@ -1882,7 +1881,6 @@ static int ip6erspan_tap_init(struct net_device *dev)
        tunnel = netdev_priv(dev);
 
        tunnel->dev = dev;
-       tunnel->net = dev_net(dev);
        strcpy(tunnel->parms.name, dev->name);
 
        ret = dst_cache_init(&tunnel->dst_cache, GFP_KERNEL);
index 48fd53b9897265338086136e96ea8e8c6ec3cac8..5350c9bb2319bf77653bffc769caff0631454eec 100644 (file)
@@ -1878,7 +1878,6 @@ ip6_tnl_dev_init_gen(struct net_device *dev)
        int t_hlen;
 
        t->dev = dev;
-       t->net = dev_net(dev);
 
        ret = dst_cache_init(&t->dst_cache, GFP_KERNEL);
        if (ret)
@@ -1940,6 +1939,7 @@ static int __net_init ip6_fb_tnl_dev_init(struct net_device *dev)
        struct net *net = dev_net(dev);
        struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id);
 
+       t->net = net;
        t->parms.proto = IPPROTO_IPV6;
 
        rcu_assign_pointer(ip6n->tnls_wc[0], t);
@@ -2013,6 +2013,7 @@ static int ip6_tnl_newlink(struct net *src_net, struct net_device *dev,
        int err;
 
        nt = netdev_priv(dev);
+       nt->net = net;
 
        if (ip_tunnel_netlink_encap_parms(data, &ipencap)) {
                err = ip6_tnl_encap_setup(nt, &ipencap);
index 590737c275379851f7bbd8c44e08c2d75ce7c375..01235046914432c415995ea3647cebf511c3935d 100644 (file)
@@ -925,7 +925,6 @@ static inline int vti6_dev_init_gen(struct net_device *dev)
        struct ip6_tnl *t = netdev_priv(dev);
 
        t->dev = dev;
-       t->net = dev_net(dev);
        netdev_hold(dev, &t->dev_tracker, GFP_KERNEL);
        netdev_lockdep_set_classes(dev);
        return 0;
@@ -958,6 +957,7 @@ static int __net_init vti6_fb_tnl_dev_init(struct net_device *dev)
        struct net *net = dev_net(dev);
        struct vti6_net *ip6n = net_generic(net, vti6_net_id);
 
+       t->net = net;
        t->parms.proto = IPPROTO_IPV6;
 
        rcu_assign_pointer(ip6n->tnls_wc[0], t);
@@ -1008,6 +1008,7 @@ static int vti6_newlink(struct net *src_net, struct net_device *dev,
        vti6_netlink_parms(data, &nt->parms);
 
        nt->parms.proto = IPPROTO_IPV6;
+       nt->net = net;
 
        if (vti6_locate(net, &nt->parms, 0))
                return -EEXIST;
index 39bd8951bfca18e570154dc298f7f8ebdf6208d7..3c15a0ae228e2187d25144441e33794d06278b7b 100644 (file)
@@ -269,6 +269,7 @@ static struct ip_tunnel *ipip6_tunnel_locate(struct net *net,
 
        nt = netdev_priv(dev);
 
+       nt->net = net;
        nt->parms = *parms;
        if (ipip6_tunnel_create(dev) < 0)
                goto failed_free;
@@ -1449,7 +1450,6 @@ static int ipip6_tunnel_init(struct net_device *dev)
        int err;
 
        tunnel->dev = dev;
-       tunnel->net = dev_net(dev);
        strcpy(tunnel->parms.name, dev->name);
 
        ipip6_tunnel_bind_dev(dev);
@@ -1563,6 +1563,7 @@ static int ipip6_newlink(struct net *src_net, struct net_device *dev,
        int err;
 
        nt = netdev_priv(dev);
+       nt->net = net;
 
        if (ip_tunnel_netlink_encap_parms(data, &ipencap)) {
                err = ip_tunnel_encap_setup(nt, &ipencap);
@@ -1858,6 +1859,9 @@ static int __net_init sit_init_net(struct net *net)
         */
        sitn->fb_tunnel_dev->netns_local = true;
 
+       t = netdev_priv(sitn->fb_tunnel_dev);
+       t->net = net;
+
        err = register_netdev(sitn->fb_tunnel_dev);
        if (err)
                goto err_reg_dev;
@@ -1865,8 +1869,6 @@ static int __net_init sit_init_net(struct net *net)
        ipip6_tunnel_clone_6rd(sitn->fb_tunnel_dev, sitn);
        ipip6_fb_tunnel_init(sitn->fb_tunnel_dev);
 
-       t = netdev_priv(sitn->fb_tunnel_dev);
-
        strcpy(t->parms.name, sitn->fb_tunnel_dev->name);
        return 0;