vxlan: Allow changing ageing time
authorIdo Schimmel <idosch@mellanox.com>
Wed, 21 Nov 2018 08:02:40 +0000 (08:02 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 22 Nov 2018 01:10:31 +0000 (17:10 -0800)
In a similar fashion to the bridge device, allow changing the ageing
time of the VxLAN device by scheduling its timer to fire if the ageing
time changed.

One use case is selftests where learning / ageing of VxLAN FDB entries
is tested. The default ageing time is 5 minutes, which is too long for a
simple selftest.

Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Reviewed-by: Petr Machata <petrm@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/vxlan.c

index 03ba1b56ba6d6dcc7e8485e462328b021ae68032..911066299a836f53107c3c82fa098abf9bee15da 100644 (file)
@@ -3458,11 +3458,8 @@ static int vxlan_nl2conf(struct nlattr *tb[], struct nlattr *data[],
                conf->flags |= VXLAN_F_LEARN;
        }
 
-       if (data[IFLA_VXLAN_AGEING]) {
-               if (changelink)
-                       return -EOPNOTSUPP;
+       if (data[IFLA_VXLAN_AGEING])
                conf->age_interval = nla_get_u32(data[IFLA_VXLAN_AGEING]);
-       }
 
        if (data[IFLA_VXLAN_PROXY]) {
                if (changelink)
@@ -3607,6 +3604,7 @@ static int vxlan_changelink(struct net_device *dev, struct nlattr *tb[],
 {
        struct vxlan_dev *vxlan = netdev_priv(dev);
        struct vxlan_rdst *dst = &vxlan->default_dst;
+       unsigned long old_age_interval;
        struct vxlan_rdst old_dst;
        struct vxlan_config conf;
        struct vxlan_fdb *f = NULL;
@@ -3617,12 +3615,16 @@ static int vxlan_changelink(struct net_device *dev, struct nlattr *tb[],
        if (err)
                return err;
 
+       old_age_interval = vxlan->cfg.age_interval;
        memcpy(&old_dst, dst, sizeof(struct vxlan_rdst));
 
        err = vxlan_dev_configure(vxlan->net, dev, &conf, true, extack);
        if (err)
                return err;
 
+       if (old_age_interval != vxlan->cfg.age_interval)
+               mod_timer(&vxlan->age_timer, jiffies);
+
        /* handle default dst entry */
        if (!vxlan_addr_equal(&dst->remote_ip, &old_dst.remote_ip)) {
                spin_lock_bh(&vxlan->hash_lock);