Skip to content

Commit 774ca6d

Browse files
idoschkuba-moo
authored andcommitted
bridge: Allow deleting FDB entries with non-existent VLAN
It is currently impossible to delete individual FDB entries (as opposed to flushing) that were added with a VLAN that no longer exists: # ip link add name dummy1 up type dummy # ip link add name br1 up type bridge vlan_filtering 1 # ip link set dev dummy1 master br1 # bridge fdb add 00:11:22:33:44:55 dev dummy1 master static vlan 1 # bridge vlan del vid 1 dev dummy1 # bridge fdb get 00:11:22:33:44:55 br br1 vlan 1 00:11:22:33:44:55 dev dummy1 vlan 1 master br1 static # bridge fdb del 00:11:22:33:44:55 dev dummy1 master vlan 1 RTNETLINK answers: Invalid argument # bridge fdb get 00:11:22:33:44:55 br br1 vlan 1 00:11:22:33:44:55 dev dummy1 vlan 1 master br1 static This is in contrast to MDB entries that can be deleted after the VLAN was deleted: # bridge vlan add vid 10 dev dummy1 # bridge mdb add dev br1 port dummy1 grp 239.1.1.1 permanent vid 10 # bridge vlan del vid 10 dev dummy1 # bridge mdb get dev br1 grp 239.1.1.1 vid 10 dev br1 port dummy1 grp 239.1.1.1 permanent vid 10 # bridge mdb del dev br1 port dummy1 grp 239.1.1.1 permanent vid 10 # bridge mdb get dev br1 grp 239.1.1.1 vid 10 Error: bridge: MDB entry not found. Align the two interfaces and allow user space to delete FDB entries that were added with a VLAN that no longer exists: # ip link add name dummy1 up type dummy # ip link add name br1 up type bridge vlan_filtering 1 # ip link set dev dummy1 master br1 # bridge fdb add 00:11:22:33:44:55 dev dummy1 master static vlan 1 # bridge vlan del vid 1 dev dummy1 # bridge fdb get 00:11:22:33:44:55 br br1 vlan 1 00:11:22:33:44:55 dev dummy1 vlan 1 master br1 static # bridge fdb del 00:11:22:33:44:55 dev dummy1 master vlan 1 # bridge fdb get 00:11:22:33:44:55 br br1 vlan 1 Error: Fdb entry not found. Add a selftest to make sure this behavior does not regress: # ./rtnetlink.sh -t kci_test_fdb_del PASS: bridge fdb del Signed-off-by: Ido Schimmel <[email protected]> Reviewed-by: Andy Roulin <[email protected]> Reviewed-by: Petr Machata <[email protected]> Acked-by: Nikolay Aleksandrov <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 0ac2043 commit 774ca6d

File tree

2 files changed

+42
-7
lines changed

2 files changed

+42
-7
lines changed

net/bridge/br_fdb.c

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1319,7 +1319,6 @@ int br_fdb_delete(struct ndmsg *ndm, struct nlattr *tb[],
13191319
{
13201320
struct net_bridge_vlan_group *vg;
13211321
struct net_bridge_port *p = NULL;
1322-
struct net_bridge_vlan *v;
13231322
struct net_bridge *br;
13241323
int err;
13251324

@@ -1338,14 +1337,10 @@ int br_fdb_delete(struct ndmsg *ndm, struct nlattr *tb[],
13381337
}
13391338

13401339
if (vid) {
1341-
v = br_vlan_find(vg, vid);
1342-
if (!v) {
1343-
pr_info("bridge: RTM_DELNEIGH with unconfigured vlan %d on %s\n", vid, dev->name);
1344-
return -EINVAL;
1345-
}
1346-
13471340
err = __br_fdb_delete(br, p, addr, vid);
13481341
} else {
1342+
struct net_bridge_vlan *v;
1343+
13491344
err = -ENOENT;
13501345
err &= __br_fdb_delete(br, p, addr, 0);
13511346
if (!vg || !vg->num_vlans)

tools/testing/selftests/net/rtnetlink.sh

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ ALL_TESTS="
2525
kci_test_ipsec
2626
kci_test_ipsec_offload
2727
kci_test_fdb_get
28+
kci_test_fdb_del
2829
kci_test_neigh_get
2930
kci_test_bridge_parent_id
3031
kci_test_address_proto
@@ -1065,6 +1066,45 @@ kci_test_fdb_get()
10651066
end_test "PASS: bridge fdb get"
10661067
}
10671068

1069+
kci_test_fdb_del()
1070+
{
1071+
local test_mac=de:ad:be:ef:13:37
1072+
local dummydev="dummy1"
1073+
local brdev="test-br0"
1074+
local ret=0
1075+
1076+
run_cmd_grep 'bridge fdb get' bridge fdb help
1077+
if [ $? -ne 0 ]; then
1078+
end_test "SKIP: fdb del tests: iproute2 too old"
1079+
return $ksft_skip
1080+
fi
1081+
1082+
setup_ns testns
1083+
if [ $? -ne 0 ]; then
1084+
end_test "SKIP fdb del tests: cannot add net namespace $testns"
1085+
return $ksft_skip
1086+
fi
1087+
IP="ip -netns $testns"
1088+
BRIDGE="bridge -netns $testns"
1089+
run_cmd $IP link add $dummydev type dummy
1090+
run_cmd $IP link add name $brdev type bridge vlan_filtering 1
1091+
run_cmd $IP link set dev $dummydev master $brdev
1092+
run_cmd $BRIDGE fdb add $test_mac dev $dummydev master static vlan 1
1093+
run_cmd $BRIDGE vlan del vid 1 dev $dummydev
1094+
run_cmd $BRIDGE fdb get $test_mac br $brdev vlan 1
1095+
run_cmd $BRIDGE fdb del $test_mac dev $dummydev master vlan 1
1096+
run_cmd_fail $BRIDGE fdb get $test_mac br $brdev vlan 1
1097+
1098+
ip netns del $testns &>/dev/null
1099+
1100+
if [ $ret -ne 0 ]; then
1101+
end_test "FAIL: bridge fdb del"
1102+
return 1
1103+
fi
1104+
1105+
end_test "PASS: bridge fdb del"
1106+
}
1107+
10681108
kci_test_neigh_get()
10691109
{
10701110
dstmac=de:ad:be:ef:13:37

0 commit comments

Comments
 (0)