Message ID | 20250204145549.1216254-6-idosch@nvidia.com (mailing list archive) |
---|---|
State | New |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | vxlan: Age FDB entries based on Rx traffic | expand |
On 2/4/25 16:55, Ido Schimmel wrote: > When a host migrates to a different remote and a packet is received from > the new remote, the corresponding FDB entry is updated and its 'updated' > time is refreshed. > > However, when user space replaces the remote of an FDB entry, its > 'updated' time is not refreshed: > > # ip link add name vx1 up type vxlan id 10010 dstport 4789 > # bridge fdb add 00:11:22:33:44:55 dev vx1 self dynamic dst 198.51.100.1 > # sleep 10 > # bridge -s -j -p fdb get 00:11:22:33:44:55 br vx1 self | jq '.[]["updated"]' > 10 > # bridge fdb replace 00:11:22:33:44:55 dev vx1 self dynamic dst 198.51.100.2 > # bridge -s -j -p fdb get 00:11:22:33:44:55 br vx1 self | jq '.[]["updated"]' > 10 > > This can lead to the entry being aged out prematurely and it is also > inconsistent with the bridge driver: > > # ip link add name br1 up type bridge > # ip link add name swp1 master br1 up type dummy > # ip link add name swp2 master br1 up type dummy > # bridge fdb add 00:11:22:33:44:55 dev swp1 master dynamic vlan 1 > # sleep 10 > # bridge -s -j fdb get 00:11:22:33:44:55 br br1 vlan 1 | jq '.[]["updated"]' > 10 > # bridge fdb replace 00:11:22:33:44:55 dev swp2 master dynamic vlan 1 > # bridge -s -j fdb get 00:11:22:33:44:55 br br1 vlan 1 | jq '.[]["updated"]' > 0 > > Adjust the VXLAN driver to refresh the 'updated' time of an FDB entry > whenever one of its attributes is changed by user space: > > # ip link add name vx1 up type vxlan id 10010 dstport 4789 > # bridge fdb add 00:11:22:33:44:55 dev vx1 self dynamic dst 198.51.100.1 > # sleep 10 > # bridge -s -j -p fdb get 00:11:22:33:44:55 br vx1 self | jq '.[]["updated"]' > 10 > # bridge fdb replace 00:11:22:33:44:55 dev vx1 self dynamic dst 198.51.100.2 > # bridge -s -j -p fdb get 00:11:22:33:44:55 br vx1 self | jq '.[]["updated"]' > 0 > > Reviewed-by: Petr Machata <petrm@nvidia.com> > Signed-off-by: Ido Schimmel <idosch@nvidia.com> > --- > drivers/net/vxlan/vxlan_core.c | 3 +-- > 1 file changed, 1 insertion(+), 2 deletions(-) > Reviewed-by: Nikolay Aleksandrov <razor@blackwall.org>
diff --git a/drivers/net/vxlan/vxlan_core.c b/drivers/net/vxlan/vxlan_core.c index c73138647110..c75fcb0679ac 100644 --- a/drivers/net/vxlan/vxlan_core.c +++ b/drivers/net/vxlan/vxlan_core.c @@ -1013,12 +1013,10 @@ static int vxlan_fdb_update_existing(struct vxlan_dev *vxlan, !(f->flags & NTF_VXLAN_ADDED_BY_USER)) { if (f->state != state) { f->state = state; - WRITE_ONCE(f->updated, jiffies); notify = 1; } if (f->flags != fdb_flags) { f->flags = fdb_flags; - WRITE_ONCE(f->updated, jiffies); notify = 1; } } @@ -1060,6 +1058,7 @@ static int vxlan_fdb_update_existing(struct vxlan_dev *vxlan, if (rd == NULL) rd = first_remote_rtnl(f); + WRITE_ONCE(f->updated, jiffies); err = vxlan_fdb_notify(vxlan, f, rd, RTM_NEWNEIGH, swdev_notify, extack); if (err)