forked from Minki/linux
vxlan: Don't override user-added entries with ext-learned ones
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>
This commit is contained in:
parent
45598c1cee
commit
0ec566aacc
@ -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) ||
|
||||
|
Loading…
Reference in New Issue
Block a user