0001
0002
0003
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
0168
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
0195
0196
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
0227
0228
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
0332
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
0405
0406
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
0462
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
0588
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
0613
0614
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
0647
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
0655
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
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
0678
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
0693
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
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
0733
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
0741
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
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
0770
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
0787
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 }