Skip to content

Commit f96a3d7

Browse files
idoschkuba-moo
authored andcommitted
ipv4: Fix incorrect route flushing when source address is deleted
Cited commit added the table ID to the FIB info structure, but did not prevent structures with different table IDs from being consolidated. This can lead to routes being flushed from a VRF when an address is deleted from a different VRF. Fix by taking the table ID into account when looking for a matching FIB info. This is already done for FIB info structures backed by a nexthop object in fib_find_info_nh(). Add test cases that fail before the fix: # ./fib_tests.sh -t ipv4_del_addr IPv4 delete address route tests Regular FIB info TEST: Route removed from VRF when source address deleted [ OK ] TEST: Route in default VRF not removed [ OK ] TEST: Route removed in default VRF when source address deleted [ OK ] TEST: Route in VRF is not removed by address delete [ OK ] Identical FIB info with different table ID TEST: Route removed from VRF when source address deleted [FAIL] TEST: Route in default VRF not removed [ OK ] RTNETLINK answers: File exists TEST: Route removed in default VRF when source address deleted [ OK ] TEST: Route in VRF is not removed by address delete [FAIL] Tests passed: 6 Tests failed: 2 And pass after: # ./fib_tests.sh -t ipv4_del_addr IPv4 delete address route tests Regular FIB info TEST: Route removed from VRF when source address deleted [ OK ] TEST: Route in default VRF not removed [ OK ] TEST: Route removed in default VRF when source address deleted [ OK ] TEST: Route in VRF is not removed by address delete [ OK ] Identical FIB info with different table ID TEST: Route removed from VRF when source address deleted [ OK ] TEST: Route in default VRF not removed [ OK ] TEST: Route removed in default VRF when source address deleted [ OK ] TEST: Route in VRF is not removed by address delete [ OK ] Tests passed: 8 Tests failed: 0 Fixes: 5a56a0b ("net: Don't delete routes in different VRFs") Signed-off-by: Ido Schimmel <[email protected]> Reviewed-by: David Ahern <[email protected]> Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 7e63035 commit f96a3d7

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

net/ipv4/fib_semantics.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,7 @@ static struct fib_info *fib_find_info(struct fib_info *nfi)
423423
nfi->fib_prefsrc == fi->fib_prefsrc &&
424424
nfi->fib_priority == fi->fib_priority &&
425425
nfi->fib_type == fi->fib_type &&
426+
nfi->fib_tb_id == fi->fib_tb_id &&
426427
memcmp(nfi->fib_metrics, fi->fib_metrics,
427428
sizeof(u32) * RTAX_MAX) == 0 &&
428429
!((nfi->fib_flags ^ fi->fib_flags) & ~RTNH_COMPARE_MASK) &&

tools/testing/selftests/net/fib_tests.sh

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1711,13 +1711,19 @@ ipv4_del_addr_test()
17111711

17121712
$IP addr add dev dummy1 172.16.104.1/24
17131713
$IP addr add dev dummy1 172.16.104.11/24
1714+
$IP addr add dev dummy1 172.16.104.12/24
17141715
$IP addr add dev dummy2 172.16.104.1/24
17151716
$IP addr add dev dummy2 172.16.104.11/24
1717+
$IP addr add dev dummy2 172.16.104.12/24
17161718
$IP route add 172.16.105.0/24 via 172.16.104.2 src 172.16.104.11
1719+
$IP route add 172.16.106.0/24 dev lo src 172.16.104.12
17171720
$IP route add vrf red 172.16.105.0/24 via 172.16.104.2 src 172.16.104.11
1721+
$IP route add vrf red 172.16.106.0/24 dev lo src 172.16.104.12
17181722
set +e
17191723

17201724
# removing address from device in vrf should only remove route from vrf table
1725+
echo " Regular FIB info"
1726+
17211727
$IP addr del dev dummy2 172.16.104.11/24
17221728
$IP ro ls vrf red | grep -q 172.16.105.0/24
17231729
log_test $? 1 "Route removed from VRF when source address deleted"
@@ -1735,6 +1741,27 @@ ipv4_del_addr_test()
17351741
$IP ro ls vrf red | grep -q 172.16.105.0/24
17361742
log_test $? 0 "Route in VRF is not removed by address delete"
17371743

1744+
# removing address from device in vrf should only remove route from vrf
1745+
# table even when the associated fib info only differs in table ID
1746+
echo " Identical FIB info with different table ID"
1747+
1748+
$IP addr del dev dummy2 172.16.104.12/24
1749+
$IP ro ls vrf red | grep -q 172.16.106.0/24
1750+
log_test $? 1 "Route removed from VRF when source address deleted"
1751+
1752+
$IP ro ls | grep -q 172.16.106.0/24
1753+
log_test $? 0 "Route in default VRF not removed"
1754+
1755+
$IP addr add dev dummy2 172.16.104.12/24
1756+
$IP route add vrf red 172.16.106.0/24 dev lo src 172.16.104.12
1757+
1758+
$IP addr del dev dummy1 172.16.104.12/24
1759+
$IP ro ls | grep -q 172.16.106.0/24
1760+
log_test $? 1 "Route removed in default VRF when source address deleted"
1761+
1762+
$IP ro ls vrf red | grep -q 172.16.106.0/24
1763+
log_test $? 0 "Route in VRF is not removed by address delete"
1764+
17381765
$IP li del dummy1
17391766
$IP li del dummy2
17401767
cleanup

0 commit comments

Comments
 (0)