vxlan: correctly set vxlan->net when creating the device in a netns
authorSabrina Dubroca <sd@queasysnail.net>
Fri, 30 Jun 2017 13:50:00 +0000 (15:50 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 3 Jul 2017 09:04:10 +0000 (02:04 -0700)
Commit a985343ba906 ("vxlan: refactor verification and application of
configuration") modified vxlan device creation, and replaced the
assignment of vxlan->net to src_net with dev_net(netdev) in ->setup().

But dev_net(netdev) is not the same as src_net. At the time ->setup()
is called, dev_net hasn't been set yet, so we end up creating the
socket for the vxlan device in init_net.

Fix this by bringing back the assignment of vxlan->net during device
creation.

Fixes: a985343ba906 ("vxlan: refactor verification and application of configuration")
Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
Reviewed-by: Matthias Schiffer <mschiffer@universe-factory.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/vxlan.c

index fd0ff97e3d81f3c4249c5a51e3da65b4f04d85f1..47d6e65851aa163f042b27bae6e162aa8237474f 100644 (file)
@@ -2656,7 +2656,6 @@ static void vxlan_setup(struct net_device *dev)
        vxlan->age_timer.data = (unsigned long) vxlan;
 
        vxlan->dev = dev;
-       vxlan->net = dev_net(dev);
 
        gro_cells_init(&vxlan->gro_cells, dev);
 
@@ -3028,7 +3027,9 @@ static int vxlan_config_validate(struct net *src_net, struct vxlan_config *conf,
 
 static void vxlan_config_apply(struct net_device *dev,
                               struct vxlan_config *conf,
-                              struct net_device *lowerdev, bool changelink)
+                              struct net_device *lowerdev,
+                              struct net *src_net,
+                              bool changelink)
 {
        struct vxlan_dev *vxlan = netdev_priv(dev);
        struct vxlan_rdst *dst = &vxlan->default_dst;
@@ -3044,6 +3045,8 @@ static void vxlan_config_apply(struct net_device *dev,
 
                if (conf->mtu)
                        dev->mtu = conf->mtu;
+
+               vxlan->net = src_net;
        }
 
        dst->remote_vni = conf->vni;
@@ -3086,7 +3089,7 @@ static int vxlan_dev_configure(struct net *src_net, struct net_device *dev,
        if (ret)
                return ret;
 
-       vxlan_config_apply(dev, conf, lowerdev, changelink);
+       vxlan_config_apply(dev, conf, lowerdev, src_net, changelink);
 
        return 0;
 }