]> www.infradead.org Git - users/hch/misc.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)
committerJakub Kicinski <kuba@kernel.org>
Fri, 21 Feb 2025 23:28:02 +0000 (15:28 -0800)
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>
net/ipv6/ip6_gre.c
net/ipv6/ip6_tunnel.c
net/ipv6/ip6_vti.c
net/ipv6/sit.c

index 863852abe8eacf8abbe2f17b204d3bb97030cbae..d9e6b1fd991785a53eeddd57e099cd0e1706df9e 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 54b843d2087089de40ec328d8ad70c7bcd0231fc..111a8777c2f7a5ad3ef1584580e024b87d16bc4a 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);
@@ -2015,6 +2015,7 @@ static int ip6_tnl_newlink(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 993f85aeb88239964fbefdf210bb33e2e4e845b7..16e0d74f99dd025efc512c496ee3476ab51b1777 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);
@@ -1009,6 +1009,7 @@ static int vti6_newlink(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 e2bd52cabdee596e2e4ed050d13b8021456cec4b..20453671ac5021a35c1b3c957521fc586fc26016 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);
@@ -1565,6 +1565,7 @@ static int ipip6_newlink(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);
@@ -1860,6 +1861,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;
@@ -1867,8 +1871,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;