vxlan: changelink: Delete remote after update
authorPetr Machata <petrm@mellanox.com>
Wed, 16 Jan 2019 23:06:43 +0000 (23:06 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 17 Jan 2019 23:18:46 +0000 (15:18 -0800)
If a change in remote address prompts a change in a default FDB entry,
that change might be vetoed. If that happens, it would then be necessary
to reinstate the already-removed default FDB entry corresponding to the
previous remote address.

Instead, arrange to have the previous address removed only after the
FDB is successfully vetted.

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

index 51e10f47d4f19259ed3ef68f4b1e0c82ef4bab21..83f65eb3085f913bcf4e419a1a435665a1589d80 100644 (file)
@@ -3809,15 +3809,6 @@ static int vxlan_changelink(struct net_device *dev, struct nlattr *tb[],
        /* handle default dst entry */
        if (!vxlan_addr_equal(&conf.remote_ip, &dst->remote_ip)) {
                spin_lock_bh(&vxlan->hash_lock);
-               if (!vxlan_addr_any(&dst->remote_ip))
-                       __vxlan_fdb_delete(vxlan, all_zeros_mac,
-                                          dst->remote_ip,
-                                          vxlan->cfg.dst_port,
-                                          dst->remote_vni,
-                                          dst->remote_vni,
-                                          dst->remote_ifindex,
-                                          true);
-
                if (!vxlan_addr_any(&conf.remote_ip)) {
                        err = vxlan_fdb_update(vxlan, all_zeros_mac,
                                               &conf.remote_ip,
@@ -3832,6 +3823,14 @@ static int vxlan_changelink(struct net_device *dev, struct nlattr *tb[],
                                return err;
                        }
                }
+               if (!vxlan_addr_any(&dst->remote_ip))
+                       __vxlan_fdb_delete(vxlan, all_zeros_mac,
+                                          dst->remote_ip,
+                                          vxlan->cfg.dst_port,
+                                          dst->remote_vni,
+                                          dst->remote_vni,
+                                          dst->remote_ifindex,
+                                          true);
                spin_unlock_bh(&vxlan->hash_lock);
        }