Back to home page

OSCL-LXR

 
 

    


0001 # SPDX-License-Identifier: GPL-2.0
0002 #
0003 # Various helpers and tests to verify FIB offload.
0004 
0005 __fib_trap_check()
0006 {
0007         local ns=$1; shift
0008         local family=$1; shift
0009         local route=$1; shift
0010         local should_fail=$1; shift
0011         local ret
0012 
0013         ip -n $ns -j -p -$family route show $route \
0014                 | jq -e '.[]["flags"] | contains(["trap"])' &> /dev/null
0015         ret=$?
0016         if [[ $should_fail == "true" ]]; then
0017                 if [[ $ret -ne 0 ]]; then
0018                         return 0
0019                 else
0020                         return 1
0021                 fi
0022         fi
0023 
0024         return $ret
0025 }
0026 
0027 fib_trap_check()
0028 {
0029         local ns=$1; shift
0030         local family=$1; shift
0031         local route=$1; shift
0032         local should_fail=$1; shift
0033 
0034         busywait 5000 __fib_trap_check $ns $family "$route" $should_fail
0035 }
0036 
0037 fib4_trap_check()
0038 {
0039         local ns=$1; shift
0040         local route=$1; shift
0041         local should_fail=$1; shift
0042 
0043         fib_trap_check $ns 4 "$route" $should_fail
0044 }
0045 
0046 fib6_trap_check()
0047 {
0048         local ns=$1; shift
0049         local route=$1; shift
0050         local should_fail=$1; shift
0051 
0052         fib_trap_check $ns 6 "$route" $should_fail
0053 }
0054 
0055 fib_ipv4_identical_routes_test()
0056 {
0057         local ns=$1; shift
0058         local i
0059 
0060         RET=0
0061 
0062         for i in $(seq 1 3); do
0063                 ip -n $ns link add name dummy$i type dummy
0064                 ip -n $ns link set dev dummy$i up
0065         done
0066 
0067         ip -n $ns route add 192.0.2.0/24 dev dummy1 tos 0 metric 1024
0068         fib4_trap_check $ns "192.0.2.0/24 dev dummy1 tos 0 metric 1024" false
0069         check_err $? "Route not in hardware when should"
0070 
0071         ip -n $ns route append 192.0.2.0/24 dev dummy2 tos 0 metric 1024
0072         fib4_trap_check $ns "192.0.2.0/24 dev dummy2 tos 0 metric 1024" true
0073         check_err $? "Appended route in hardware when should not"
0074 
0075         ip -n $ns route prepend 192.0.2.0/24 dev dummy3 tos 0 metric 1024
0076         fib4_trap_check $ns "192.0.2.0/24 dev dummy3 tos 0 metric 1024" false
0077         check_err $? "Prepended route not in hardware when should"
0078 
0079         fib4_trap_check $ns "192.0.2.0/24 dev dummy1 tos 0 metric 1024" true
0080         check_err $? "Route was not replaced in hardware by prepended one"
0081 
0082         log_test "IPv4 identical routes"
0083 
0084         for i in $(seq 1 3); do
0085                 ip -n $ns link del dev dummy$i
0086         done
0087 }
0088 
0089 fib_ipv4_tos_test()
0090 {
0091         local ns=$1; shift
0092 
0093         RET=0
0094 
0095         ip -n $ns link add name dummy1 type dummy
0096         ip -n $ns link set dev dummy1 up
0097 
0098         ip -n $ns route add 192.0.2.0/24 dev dummy1 tos 0 metric 1024
0099         fib4_trap_check $ns "192.0.2.0/24 dev dummy1 tos 0 metric 1024" false
0100         check_err $? "Route not in hardware when should"
0101 
0102         ip -n $ns route add 192.0.2.0/24 dev dummy1 tos 8 metric 1024
0103         fib4_trap_check $ns "192.0.2.0/24 dev dummy1 tos 8 metric 1024" false
0104         check_err $? "Highest TOS route not in hardware when should"
0105 
0106         fib4_trap_check $ns "192.0.2.0/24 dev dummy1 tos 0 metric 1024" true
0107         check_err $? "Lowest TOS route still in hardware when should not"
0108 
0109         ip -n $ns route add 192.0.2.0/24 dev dummy1 tos 4 metric 1024
0110         fib4_trap_check $ns "192.0.2.0/24 dev dummy1 tos 4 metric 1024" true
0111         check_err $? "Middle TOS route in hardware when should not"
0112 
0113         log_test "IPv4 routes with TOS"
0114 
0115         ip -n $ns link del dev dummy1
0116 }
0117 
0118 fib_ipv4_metric_test()
0119 {
0120         local ns=$1; shift
0121 
0122         RET=0
0123 
0124         ip -n $ns link add name dummy1 type dummy
0125         ip -n $ns link set dev dummy1 up
0126 
0127         ip -n $ns route add 192.0.2.0/24 dev dummy1 metric 1024
0128         fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1024" false
0129         check_err $? "Route not in hardware when should"
0130 
0131         ip -n $ns route add 192.0.2.0/24 dev dummy1 metric 1022
0132         fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1022" false
0133         check_err $? "Lowest metric route not in hardware when should"
0134 
0135         fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1024" true
0136         check_err $? "Highest metric route still in hardware when should not"
0137 
0138         ip -n $ns route add 192.0.2.0/24 dev dummy1 metric 1023
0139         fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1023" true
0140         check_err $? "Middle metric route in hardware when should not"
0141 
0142         log_test "IPv4 routes with metric"
0143 
0144         ip -n $ns link del dev dummy1
0145 }
0146 
0147 fib_ipv4_replace_test()
0148 {
0149         local ns=$1; shift
0150         local i
0151 
0152         RET=0
0153 
0154         for i in $(seq 1 2); do
0155                 ip -n $ns link add name dummy$i type dummy
0156                 ip -n $ns link set dev dummy$i up
0157         done
0158 
0159         ip -n $ns route add 192.0.2.0/24 dev dummy1 metric 1024
0160         fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1024" false
0161         check_err $? "Route not in hardware when should"
0162 
0163         ip -n $ns route replace 192.0.2.0/24 dev dummy2 metric 1024
0164         fib4_trap_check $ns "192.0.2.0/24 dev dummy2 metric 1024" false
0165         check_err $? "Replacement route not in hardware when should"
0166 
0167         # Add a route with an higher metric and make sure that replacing it
0168         # does not affect the lower metric one.
0169         ip -n $ns route add 192.0.2.0/24 dev dummy1 metric 1025
0170         ip -n $ns route replace 192.0.2.0/24 dev dummy2 metric 1025
0171 
0172         fib4_trap_check $ns "192.0.2.0/24 dev dummy2 metric 1024" false
0173         check_err $? "Lowest metric route not in hardware when should"
0174         fib4_trap_check $ns "192.0.2.0/24 dev dummy2 metric 1025" true
0175         check_err $? "Highest metric route in hardware when should not"
0176 
0177         log_test "IPv4 route replace"
0178 
0179         for i in $(seq 1 2); do
0180                 ip -n $ns link del dev dummy$i
0181         done
0182 }
0183 
0184 fib_ipv4_delete_test()
0185 {
0186         local ns=$1; shift
0187         local metric
0188 
0189         RET=0
0190 
0191         ip -n $ns link add name dummy1 type dummy
0192         ip -n $ns link set dev dummy1 up
0193 
0194         # Insert multiple routes with the same prefix and length and varying
0195         # metrics. Make sure that throughout delete operations the lowest
0196         # metric route is the one in hardware.
0197         for metric in $(seq 1024 1026); do
0198                 ip -n $ns route add 192.0.2.0/24 dev dummy1 metric $metric
0199         done
0200 
0201         fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1024" false
0202         check_err $? "Route not in hardware when should"
0203 
0204         ip -n $ns route del 192.0.2.0/24 dev dummy1 metric 1024
0205         fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1025" false
0206         check_err $? "Lowest metric route not in hardware when should"
0207 
0208         ip -n $ns route del 192.0.2.0/24 dev dummy1 metric 1026
0209         fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1025" false
0210         check_err $? "Sole route not in hardware when should"
0211 
0212         log_test "IPv4 route delete"
0213 
0214         ip -n $ns link del dev dummy1
0215 }
0216 
0217 fib_ipv4_plen_test()
0218 {
0219         local ns=$1; shift
0220 
0221         RET=0
0222 
0223         ip -n $ns link add name dummy1 type dummy
0224         ip -n $ns link set dev dummy1 up
0225 
0226         # Add two routes with the same key and different prefix length and
0227         # make sure both are in hardware. It can be verified that both are
0228         # sharing the same leaf by checking the /proc/net/fib_trie
0229         ip -n $ns route add 192.0.2.0/24 dev dummy1
0230         ip -n $ns route add 192.0.2.0/25 dev dummy1
0231 
0232         fib4_trap_check $ns "192.0.2.0/24 dev dummy1" false
0233         check_err $? "/24 not in hardware when should"
0234 
0235         fib4_trap_check $ns "192.0.2.0/25 dev dummy1" false
0236         check_err $? "/25 not in hardware when should"
0237 
0238         log_test "IPv4 routes with different prefix length"
0239 
0240         ip -n $ns link del dev dummy1
0241 }
0242 
0243 fib_ipv4_replay_metric_test()
0244 {
0245         local ns=$1; shift
0246         local devlink_dev=$1; shift
0247 
0248         RET=0
0249 
0250         ip -n $ns link add name dummy1 type dummy
0251         ip -n $ns link set dev dummy1 up
0252 
0253         ip -n $ns route add 192.0.2.0/24 dev dummy1 metric 1024
0254         ip -n $ns route add 192.0.2.0/24 dev dummy1 metric 1025
0255 
0256         devlink -N $ns dev reload $devlink_dev
0257 
0258         fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1024" false
0259         check_err $? "Lowest metric route not in hardware when should"
0260 
0261         fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1025" true
0262         check_err $? "Highest metric route in hardware when should not"
0263 
0264         log_test "IPv4 routes replay - metric"
0265 
0266         ip -n $ns link del dev dummy1
0267 }
0268 
0269 fib_ipv4_replay_tos_test()
0270 {
0271         local ns=$1; shift
0272         local devlink_dev=$1; shift
0273 
0274         RET=0
0275 
0276         ip -n $ns link add name dummy1 type dummy
0277         ip -n $ns link set dev dummy1 up
0278 
0279         ip -n $ns route add 192.0.2.0/24 dev dummy1 tos 0
0280         ip -n $ns route add 192.0.2.0/24 dev dummy1 tos 4
0281 
0282         devlink -N $ns dev reload $devlink_dev
0283 
0284         fib4_trap_check $ns "192.0.2.0/24 dev dummy1 tos 4" false
0285         check_err $? "Highest TOS route not in hardware when should"
0286 
0287         fib4_trap_check $ns "192.0.2.0/24 dev dummy1 tos 0" true
0288         check_err $? "Lowest TOS route in hardware when should not"
0289 
0290         log_test "IPv4 routes replay - TOS"
0291 
0292         ip -n $ns link del dev dummy1
0293 }
0294 
0295 fib_ipv4_replay_plen_test()
0296 {
0297         local ns=$1; shift
0298         local devlink_dev=$1; shift
0299 
0300         RET=0
0301 
0302         ip -n $ns link add name dummy1 type dummy
0303         ip -n $ns link set dev dummy1 up
0304 
0305         ip -n $ns route add 192.0.2.0/24 dev dummy1
0306         ip -n $ns route add 192.0.2.0/25 dev dummy1
0307 
0308         devlink -N $ns dev reload $devlink_dev
0309 
0310         fib4_trap_check $ns "192.0.2.0/24 dev dummy1" false
0311         check_err $? "/24 not in hardware when should"
0312 
0313         fib4_trap_check $ns "192.0.2.0/25 dev dummy1" false
0314         check_err $? "/25 not in hardware when should"
0315 
0316         log_test "IPv4 routes replay - prefix length"
0317 
0318         ip -n $ns link del dev dummy1
0319 }
0320 
0321 fib_ipv4_flush_test()
0322 {
0323         local ns=$1; shift
0324         local metric
0325 
0326         RET=0
0327 
0328         ip -n $ns link add name dummy1 type dummy
0329         ip -n $ns link set dev dummy1 up
0330 
0331         # Exercise the routes flushing code paths by inserting various
0332         # prefix routes on a netdev and then deleting it.
0333         for metric in $(seq 1 20); do
0334                 ip -n $ns route add 192.0.2.0/24 dev dummy1 metric $metric
0335         done
0336 
0337         ip -n $ns link del dev dummy1
0338 
0339         log_test "IPv4 routes flushing"
0340 }
0341 
0342 fib_ipv6_add_test()
0343 {
0344         local ns=$1; shift
0345 
0346         RET=0
0347 
0348         for i in $(seq 1 2); do
0349                 ip -n $ns link add name dummy$i type dummy
0350                 ip -n $ns link set dev dummy$i up
0351         done
0352 
0353         ip -n $ns route add 2001:db8:1::/64 dev dummy1 metric 1024
0354         fib6_trap_check $ns "2001:db8:1::/64 dev dummy1 metric 1024" false
0355         check_err $? "Route not in hardware when should"
0356 
0357         ip -n $ns route append 2001:db8:1::/64 dev dummy2 metric 1024
0358         fib6_trap_check $ns "2001:db8:1::/64 dev dummy2 metric 1024" true
0359         check_err $? "Route in hardware when should not"
0360 
0361         fib6_trap_check $ns "2001:db8:1::/64 dev dummy1 metric 1024" false
0362         check_err $? "Route not in hardware after appending route"
0363 
0364         log_test "IPv6 single route add"
0365 
0366         for i in $(seq 1 2); do
0367                 ip -n $ns link del dev dummy$i
0368         done
0369 }
0370 
0371 fib_ipv6_metric_test()
0372 {
0373         local ns=$1; shift
0374 
0375         RET=0
0376 
0377         ip -n $ns link add name dummy1 type dummy
0378         ip -n $ns link set dev dummy1 up
0379 
0380         ip -n $ns route add 2001:db8:1::/64 dev dummy1 metric 1024
0381         fib6_trap_check $ns "2001:db8:1::/64 dev dummy1 metric 1024" false
0382         check_err $? "Route not in hardware when should"
0383 
0384         ip -n $ns route add 2001:db8:1::/64 dev dummy1 metric 1022
0385         fib6_trap_check $ns "2001:db8:1::/64 dev dummy1 metric 1022" false
0386         check_err $? "Lowest metric route not in hardware when should"
0387 
0388         fib6_trap_check $ns "2001:db8:1::/64 dev dummy1 metric 1024" true
0389         check_err $? "Highest metric route still in hardware when should not"
0390 
0391         ip -n $ns route add 2001:db8:1::/64 dev dummy1 metric 1023
0392         fib6_trap_check $ns "2001:db8:1::/64 dev dummy1 metric 1023" true
0393         check_err $? "Middle metric route in hardware when should not"
0394 
0395         log_test "IPv6 routes with metric"
0396 
0397         ip -n $ns link del dev dummy1
0398 }
0399 
0400 fib_ipv6_append_single_test()
0401 {
0402         local ns=$1; shift
0403 
0404         # When an IPv6 multipath route is added without the 'nexthop' keyword,
0405         # different code paths are taken compared to when the keyword is used.
0406         # This test tries to verify the former.
0407         RET=0
0408 
0409         for i in $(seq 1 2); do
0410                 ip -n $ns link add name dummy$i type dummy
0411                 ip -n $ns link set dev dummy$i up
0412                 ip -n $ns address add 2001:db8:$i::1/64 dev dummy$i
0413         done
0414 
0415         ip -n $ns route add 2001:db8:10::/64 via 2001:db8:1::2 metric 1024
0416         fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false
0417         check_err $? "Route not in hardware when should"
0418 
0419         ip -n $ns route append 2001:db8:10::/64 via 2001:db8:2::2 metric 1024
0420         fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false
0421         check_err $? "Route not in hardware after appending"
0422 
0423         ip -n $ns route add 2001:db8:10::/64 via 2001:db8:1::2 metric 1025
0424         fib6_trap_check $ns "2001:db8:10::/64 metric 1025" true
0425         check_err $? "Route in hardware when should not"
0426 
0427         ip -n $ns route append 2001:db8:10::/64 via 2001:db8:2::2 metric 1025
0428         fib6_trap_check $ns "2001:db8:10::/64 metric 1025" true
0429         check_err $? "Route in hardware when should not after appending"
0430 
0431         fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false
0432         check_err $? "Lowest metric route not in hardware when should"
0433 
0434         log_test "IPv6 append single route without 'nexthop' keyword"
0435 
0436         for i in $(seq 1 2); do
0437                 ip -n $ns link del dev dummy$i
0438         done
0439 }
0440 
0441 fib_ipv6_replace_single_test()
0442 {
0443         local ns=$1; shift
0444         local i
0445 
0446         RET=0
0447 
0448         for i in $(seq 1 2); do
0449                 ip -n $ns link add name dummy$i type dummy
0450                 ip -n $ns link set dev dummy$i up
0451         done
0452 
0453         ip -n $ns route add 2001:db8:1::/64 dev dummy1 metric 1024
0454         fib6_trap_check $ns "2001:db8:1::/64 dev dummy1 metric 1024" false
0455         check_err $? "Route not in hardware when should"
0456 
0457         ip -n $ns route replace 2001:db8:1::/64 dev dummy2 metric 1024
0458         fib6_trap_check $ns "2001:db8:1::/64 dev dummy2 metric 1024" false
0459         check_err $? "Replacement route not in hardware when should"
0460 
0461         # Add a route with an higher metric and make sure that replacing it
0462         # does not affect the lower metric one.
0463         ip -n $ns route add 2001:db8:1::/64 dev dummy1 metric 1025
0464         ip -n $ns route replace 2001:db8:1::/64 dev dummy2 metric 1025
0465 
0466         fib6_trap_check $ns "2001:db8:1::/64 dev dummy2 metric 1024" false
0467         check_err $? "Lowest metric route not in hardware when should"
0468         fib6_trap_check $ns "2001:db8:1::/64 dev dummy2 metric 1025" true
0469         check_err $? "Highest metric route in hardware when should not"
0470 
0471         log_test "IPv6 single route replace"
0472 
0473         for i in $(seq 1 2); do
0474                 ip -n $ns link del dev dummy$i
0475         done
0476 }
0477 
0478 fib_ipv6_metric_multipath_test()
0479 {
0480         local ns=$1; shift
0481 
0482         RET=0
0483 
0484         for i in $(seq 1 2); do
0485                 ip -n $ns link add name dummy$i type dummy
0486                 ip -n $ns link set dev dummy$i up
0487                 ip -n $ns address add 2001:db8:$i::1/64 dev dummy$i
0488         done
0489 
0490         ip -n $ns route add 2001:db8:10::/64 metric 1024 \
0491                 nexthop via 2001:db8:1::2 dev dummy1 \
0492                 nexthop via 2001:db8:2::2 dev dummy2
0493         fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false
0494         check_err $? "Route not in hardware when should"
0495 
0496         ip -n $ns route add 2001:db8:10::/64 metric 1022 \
0497                 nexthop via 2001:db8:1::2 dev dummy1 \
0498                 nexthop via 2001:db8:2::2 dev dummy2
0499         fib6_trap_check $ns "2001:db8:10::/64 metric 1022" false
0500         check_err $? "Lowest metric route not in hardware when should"
0501 
0502         ip -n $ns route add 2001:db8:10::/64 metric 1023 \
0503                 nexthop via 2001:db8:1::2 dev dummy1 \
0504                 nexthop via 2001:db8:2::2 dev dummy2
0505         fib6_trap_check $ns "2001:db8:10::/64 metric 1024" true
0506         check_err $? "Highest metric route still in hardware when should not"
0507 
0508         fib6_trap_check $ns "2001:db8:10::/64 metric 1023" true
0509         check_err $? "Middle metric route in hardware when should not"
0510 
0511         log_test "IPv6 multipath routes with metric"
0512 
0513         for i in $(seq 1 2); do
0514                 ip -n $ns link del dev dummy$i
0515         done
0516 }
0517 
0518 fib_ipv6_append_multipath_test()
0519 {
0520         local ns=$1; shift
0521 
0522         RET=0
0523 
0524         for i in $(seq 1 3); do
0525                 ip -n $ns link add name dummy$i type dummy
0526                 ip -n $ns link set dev dummy$i up
0527                 ip -n $ns address add 2001:db8:$i::1/64 dev dummy$i
0528         done
0529 
0530         ip -n $ns route add 2001:db8:10::/64 metric 1024 \
0531                 nexthop via 2001:db8:1::2 dev dummy1
0532         fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false
0533         check_err $? "Route not in hardware when should"
0534 
0535         ip -n $ns route append 2001:db8:10::/64 metric 1024 \
0536                 nexthop via 2001:db8:2::2 dev dummy2 \
0537                 nexthop via 2001:db8:3::2 dev dummy3
0538         fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false
0539         check_err $? "Route not in hardware after appending"
0540 
0541         ip -n $ns route add 2001:db8:10::/64 metric 1025 \
0542                 nexthop via 2001:db8:1::2 dev dummy1
0543         fib6_trap_check $ns "2001:db8:10::/64 metric 1025" true
0544         check_err $? "Route in hardware when should not"
0545 
0546         ip -n $ns route append 2001:db8:10::/64 metric 1025 \
0547                 nexthop via 2001:db8:2::2 dev dummy2 \
0548                 nexthop via 2001:db8:3::2 dev dummy3
0549         fib6_trap_check $ns "2001:db8:10::/64 metric 1025" true
0550         check_err $? "Route in hardware when should not after appending"
0551 
0552         fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false
0553         check_err $? "Lowest metric route not in hardware when should"
0554 
0555         log_test "IPv6 append multipath route with 'nexthop' keyword"
0556 
0557         for i in $(seq 1 3); do
0558                 ip -n $ns link del dev dummy$i
0559         done
0560 }
0561 
0562 fib_ipv6_replace_multipath_test()
0563 {
0564         local ns=$1; shift
0565         local i
0566 
0567         RET=0
0568 
0569         for i in $(seq 1 3); do
0570                 ip -n $ns link add name dummy$i type dummy
0571                 ip -n $ns link set dev dummy$i up
0572                 ip -n $ns address add 2001:db8:$i::1/64 dev dummy$i
0573         done
0574 
0575         ip -n $ns route add 2001:db8:10::/64 metric 1024 \
0576                 nexthop via 2001:db8:1::2 dev dummy1 \
0577                 nexthop via 2001:db8:2::2 dev dummy2
0578         fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false
0579         check_err $? "Route not in hardware when should"
0580 
0581         ip -n $ns route replace 2001:db8:10::/64 metric 1024 \
0582                 nexthop via 2001:db8:1::2 dev dummy1 \
0583                 nexthop via 2001:db8:3::2 dev dummy3
0584         fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false
0585         check_err $? "Replacement route not in hardware when should"
0586 
0587         # Add a route with an higher metric and make sure that replacing it
0588         # does not affect the lower metric one.
0589         ip -n $ns route add 2001:db8:10::/64 metric 1025 \
0590                 nexthop via 2001:db8:1::2 dev dummy1 \
0591                 nexthop via 2001:db8:2::2 dev dummy2
0592         ip -n $ns route replace 2001:db8:10::/64 metric 1025 \
0593                 nexthop via 2001:db8:1::2 dev dummy1 \
0594                 nexthop via 2001:db8:3::2 dev dummy3
0595 
0596         fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false
0597         check_err $? "Lowest metric route not in hardware when should"
0598         fib6_trap_check $ns "2001:db8:10::/64 metric 1025" true
0599         check_err $? "Highest metric route in hardware when should not"
0600 
0601         log_test "IPv6 multipath route replace"
0602 
0603         for i in $(seq 1 3); do
0604                 ip -n $ns link del dev dummy$i
0605         done
0606 }
0607 
0608 fib_ipv6_append_multipath_to_single_test()
0609 {
0610         local ns=$1; shift
0611 
0612         # Test that when the first route in the leaf is not a multipath route
0613         # and we try to append a multipath route with the same metric to it, it
0614         # is not notified.
0615         RET=0
0616 
0617         for i in $(seq 1 2); do
0618                 ip -n $ns link add name dummy$i type dummy
0619                 ip -n $ns link set dev dummy$i up
0620                 ip -n $ns address add 2001:db8:$i::1/64 dev dummy$i
0621         done
0622 
0623         ip -n $ns route add 2001:db8:10::/64 dev dummy1 metric 1024
0624         fib6_trap_check $ns "2001:db8:10::/64 dev dummy1 metric 1024" false
0625         check_err $? "Route not in hardware when should"
0626 
0627         ip -n $ns route append 2001:db8:10::/64 metric 1024 \
0628                 nexthop via 2001:db8:2::2 dev dummy2
0629         fib6_trap_check $ns "2001:db8:10::/64 dev dummy2 metric 1024" true
0630         check_err $? "Route in hardware when should not"
0631 
0632         fib6_trap_check $ns "2001:db8:10::/64 dev dummy1 metric 1024" false
0633         check_err $? "Route not in hardware after append"
0634 
0635         log_test "IPv6 append multipath route to non-multipath route"
0636 
0637         for i in $(seq 1 2); do
0638                 ip -n $ns link del dev dummy$i
0639         done
0640 }
0641 
0642 fib_ipv6_delete_single_test()
0643 {
0644         local ns=$1; shift
0645 
0646         # Test various deletion scenarios, where only a single route is
0647         # deleted from the FIB node.
0648         for i in $(seq 1 2); do
0649                 ip -n $ns link add name dummy$i type dummy
0650                 ip -n $ns link set dev dummy$i up
0651                 ip -n $ns address add 2001:db8:$i::1/64 dev dummy$i
0652         done
0653 
0654         # Test deletion of a single route when it is the only route in the FIB
0655         # node.
0656         RET=0
0657 
0658         ip -n $ns route add 2001:db8:10::/64 dev dummy1 metric 1024
0659         ip -n $ns route del 2001:db8:10::/64 dev dummy1 metric 1024
0660 
0661         log_test "IPv6 delete sole single route"
0662 
0663         # Test that deletion of last route does not affect the first one.
0664         RET=0
0665 
0666         ip -n $ns route add 2001:db8:10::/64 dev dummy1 metric 1024
0667         ip -n $ns route add 2001:db8:10::/64 dev dummy1 metric 1025
0668         ip -n $ns route del 2001:db8:10::/64 dev dummy1 metric 1025
0669 
0670         fib6_trap_check $ns "2001:db8:10::/64 dev dummy1 metric 1024" false
0671         check_err $? "Route not in hardware after deleting higher metric route"
0672 
0673         log_test "IPv6 delete single route not in hardware"
0674 
0675         ip -n $ns route del 2001:db8:10::/64 dev dummy1 metric 1024
0676 
0677         # Test that first route is replaced by next single route in the FIB
0678         # node.
0679         RET=0
0680 
0681         ip -n $ns route add 2001:db8:10::/64 dev dummy1 metric 1024
0682         ip -n $ns route add 2001:db8:10::/64 dev dummy1 metric 1025
0683         ip -n $ns route del 2001:db8:10::/64 dev dummy1 metric 1024
0684 
0685         fib6_trap_check $ns "2001:db8:10::/64 dev dummy1 metric 1025" false
0686         check_err $? "Route not in hardware after deleting lowest metric route"
0687 
0688         log_test "IPv6 delete single route - replaced by single"
0689 
0690         ip -n $ns route del 2001:db8:10::/64 dev dummy1 metric 1025
0691 
0692         # Test that first route is replaced by next multipath route in the FIB
0693         # node.
0694         RET=0
0695 
0696         ip -n $ns route add 2001:db8:10::/64 dev dummy1 metric 1024
0697         ip -n $ns route add 2001:db8:10::/64 metric 1025 \
0698                 nexthop via 2001:db8:1::2 dev dummy1 \
0699                 nexthop via 2001:db8:2::2 dev dummy2
0700         ip -n $ns route del 2001:db8:10::/64 dev dummy1 metric 1024
0701 
0702         fib6_trap_check $ns "2001:db8:10::/64 metric 1025" false
0703         check_err $? "Route not in hardware after deleting lowest metric route"
0704 
0705         log_test "IPv6 delete single route - replaced by multipath"
0706 
0707         ip -n $ns route del 2001:db8:10::/64 metric 1025
0708 
0709         # Test deletion of a single nexthop from a multipath route.
0710         ip -n $ns route add 2001:db8:10::/64 metric 1024 \
0711                 nexthop via 2001:db8:1::2 dev dummy1 \
0712                 nexthop via 2001:db8:2::2 dev dummy2
0713         ip -n $ns route del 2001:db8:10::/64 metric 1024 \
0714                 nexthop via 2001:db8:1::2 dev dummy1
0715 
0716         fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false
0717         check_err $? "Route not in hardware after deleting a single nexthop"
0718 
0719         log_test "IPv6 delete single nexthop"
0720 
0721         ip -n $ns route del 2001:db8:10::/64 metric 1024
0722 
0723         for i in $(seq 1 2); do
0724                 ip -n $ns link del dev dummy$i
0725         done
0726 }
0727 
0728 fib_ipv6_delete_multipath_test()
0729 {
0730         local ns=$1; shift
0731 
0732         # Test various deletion scenarios, where an entire multipath route is
0733         # deleted from the FIB node.
0734         for i in $(seq 1 2); do
0735                 ip -n $ns link add name dummy$i type dummy
0736                 ip -n $ns link set dev dummy$i up
0737                 ip -n $ns address add 2001:db8:$i::1/64 dev dummy$i
0738         done
0739 
0740         # Test deletion of a multipath route when it is the only route in the
0741         # FIB node.
0742         RET=0
0743 
0744         ip -n $ns route add 2001:db8:10::/64 metric 1024 \
0745                 nexthop via 2001:db8:1::2 dev dummy1 \
0746                 nexthop via 2001:db8:2::2 dev dummy2
0747         ip -n $ns route del 2001:db8:10::/64 metric 1024
0748 
0749         log_test "IPv6 delete sole multipath route"
0750 
0751         # Test that deletion of last route does not affect the first one.
0752         RET=0
0753 
0754         ip -n $ns route add 2001:db8:10::/64 metric 1024 \
0755                 nexthop via 2001:db8:1::2 dev dummy1 \
0756                 nexthop via 2001:db8:2::2 dev dummy2
0757         ip -n $ns route add 2001:db8:10::/64 metric 1025 \
0758                 nexthop via 2001:db8:1::2 dev dummy1 \
0759                 nexthop via 2001:db8:2::2 dev dummy2
0760         ip -n $ns route del 2001:db8:10::/64 metric 1025
0761 
0762         fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false
0763         check_err $? "Route not in hardware after deleting higher metric route"
0764 
0765         log_test "IPv6 delete multipath route not in hardware"
0766 
0767         ip -n $ns route del 2001:db8:10::/64 metric 1024
0768 
0769         # Test that first route is replaced by next single route in the FIB
0770         # node.
0771         RET=0
0772 
0773         ip -n $ns route add 2001:db8:10::/64 metric 1024 \
0774                 nexthop via 2001:db8:1::2 dev dummy1 \
0775                 nexthop via 2001:db8:2::2 dev dummy2
0776         ip -n $ns route add 2001:db8:10::/64 dev dummy1 metric 1025
0777         ip -n $ns route del 2001:db8:10::/64 metric 1024
0778 
0779         fib6_trap_check $ns "2001:db8:10::/64 dev dummy1 metric 1025" false
0780         check_err $? "Route not in hardware after deleting lowest metric route"
0781 
0782         log_test "IPv6 delete multipath route - replaced by single"
0783 
0784         ip -n $ns route del 2001:db8:10::/64 dev dummy1 metric 1025
0785 
0786         # Test that first route is replaced by next multipath route in the FIB
0787         # node.
0788         RET=0
0789 
0790         ip -n $ns route add 2001:db8:10::/64 metric 1024 \
0791                 nexthop via 2001:db8:1::2 dev dummy1 \
0792                 nexthop via 2001:db8:2::2 dev dummy2
0793         ip -n $ns route add 2001:db8:10::/64 metric 1025 \
0794                 nexthop via 2001:db8:1::2 dev dummy1 \
0795                 nexthop via 2001:db8:2::2 dev dummy2
0796         ip -n $ns route del 2001:db8:10::/64 metric 1024
0797 
0798         fib6_trap_check $ns "2001:db8:10::/64 metric 1025" false
0799         check_err $? "Route not in hardware after deleting lowest metric route"
0800 
0801         log_test "IPv6 delete multipath route - replaced by multipath"
0802 
0803         ip -n $ns route del 2001:db8:10::/64 metric 1025
0804 
0805         for i in $(seq 1 2); do
0806                 ip -n $ns link del dev dummy$i
0807         done
0808 }
0809 
0810 fib_ipv6_replay_single_test()
0811 {
0812         local ns=$1; shift
0813         local devlink_dev=$1; shift
0814 
0815         RET=0
0816 
0817         for i in $(seq 1 2); do
0818                 ip -n $ns link add name dummy$i type dummy
0819                 ip -n $ns link set dev dummy$i up
0820         done
0821 
0822         ip -n $ns route add 2001:db8:1::/64 dev dummy1
0823         ip -n $ns route append 2001:db8:1::/64 dev dummy2
0824 
0825         devlink -N $ns dev reload $devlink_dev
0826 
0827         fib6_trap_check $ns "2001:db8:1::/64 dev dummy1" false
0828         check_err $? "First route not in hardware when should"
0829 
0830         fib6_trap_check $ns "2001:db8:1::/64 dev dummy2" true
0831         check_err $? "Second route in hardware when should not"
0832 
0833         log_test "IPv6 routes replay - single route"
0834 
0835         for i in $(seq 1 2); do
0836                 ip -n $ns link del dev dummy$i
0837         done
0838 }
0839 
0840 fib_ipv6_replay_multipath_test()
0841 {
0842         local ns=$1; shift
0843         local devlink_dev=$1; shift
0844 
0845         RET=0
0846 
0847         for i in $(seq 1 2); do
0848                 ip -n $ns link add name dummy$i type dummy
0849                 ip -n $ns link set dev dummy$i up
0850                 ip -n $ns address add 2001:db8:$i::1/64 dev dummy$i
0851         done
0852 
0853         ip -n $ns route add 2001:db8:10::/64 metric 1024 \
0854                 nexthop via 2001:db8:1::2 dev dummy1 \
0855                 nexthop via 2001:db8:2::2 dev dummy2
0856         ip -n $ns route add 2001:db8:10::/64 metric 1025 \
0857                 nexthop via 2001:db8:1::2 dev dummy1 \
0858                 nexthop via 2001:db8:2::2 dev dummy2
0859 
0860         devlink -N $ns dev reload $devlink_dev
0861 
0862         fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false
0863         check_err $? "First route not in hardware when should"
0864 
0865         fib6_trap_check $ns "2001:db8:10::/64 metric 1025" true
0866         check_err $? "Second route in hardware when should not"
0867 
0868         log_test "IPv6 routes replay - multipath route"
0869 
0870         for i in $(seq 1 2); do
0871                 ip -n $ns link del dev dummy$i
0872         done
0873 }