]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
vxlan: Don't override user-added entries with ext-learned ones
authorPetr Machata <petrm@mellanox.com>
Wed, 21 Nov 2018 08:02:37 +0000 (08:02 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 22 Nov 2018 01:10:30 +0000 (17:10 -0800)
When an external learning event collides with an user-added entry, the
user-added entry shouldn't be taken over. Otherwise on an unlearn event
the entry would be completely lost, even though the user added it by
hand.

Therefore skip update of FDB flags and state for these cases. This is in
accordance with the bridge behavior.

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

index 9171c1f42fe9418130cc89d845d324ab635326e0..b50705a50686a68e808a5dc45b391a2c5996b8ca 100644 (file)
@@ -780,16 +780,24 @@ static int vxlan_fdb_update(struct vxlan_dev *vxlan,
                                   "lost race to create %pM\n", mac);
                        return -EEXIST;
                }
-               if (f->state != state) {
-                       f->state = state;
-                       f->updated = jiffies;
-                       notify = 1;
-               }
-               if (f->flags != fdb_flags) {
-                       f->flags = fdb_flags;
-                       f->updated = jiffies;
-                       notify = 1;
+
+               /* Do not allow an externally learned entry to take over an
+                * entry added by the user.
+                */
+               if (!(fdb_flags & NTF_EXT_LEARNED) ||
+                   !(f->flags & NTF_VXLAN_ADDED_BY_USER)) {
+                       if (f->state != state) {
+                               f->state = state;
+                               f->updated = jiffies;
+                               notify = 1;
+                       }
+                       if (f->flags != fdb_flags) {
+                               f->flags = fdb_flags;
+                               f->updated = jiffies;
+                               notify = 1;
+                       }
                }
+
                if ((flags & NLM_F_REPLACE)) {
                        /* Only change unicasts */
                        if (!(is_multicast_ether_addr(f->eth_addr) ||