6
6
7
7
ret=0
8
8
9
+ VERBOSE=${VERBOSE:= 0}
9
10
PAUSE_ON_FAIL=${PAUSE_ON_FAIL:= no}
10
11
IP=" ip -netns testns"
11
12
@@ -16,10 +17,10 @@ log_test()
16
17
local msg=" $3 "
17
18
18
19
if [ ${rc} -eq ${expected} ]; then
19
- printf " %-60s [ OK ]\n" " ${msg} "
20
+ printf " TEST: %-60s [ OK ]\n" " ${msg} "
20
21
else
21
22
ret=1
22
- printf " %-60s [FAIL]\n" " ${msg} "
23
+ printf " TEST: %-60s [FAIL]\n" " ${msg} "
23
24
if [ " ${PAUSE_ON_FAIL} " = " yes" ]; then
24
25
echo
25
26
echo " hit enter to continue, 'q' to quit"
@@ -49,6 +50,28 @@ cleanup()
49
50
ip netns del testns
50
51
}
51
52
53
+ get_linklocal ()
54
+ {
55
+ local dev=$1
56
+ local addr
57
+
58
+ addr=$( $IP -6 -br addr show dev ${dev} | \
59
+ awk ' {
60
+ for (i = 3; i <= NF; ++i) {
61
+ if ($i ~ /^fe80/)
62
+ print $i
63
+ }
64
+ }'
65
+ )
66
+ addr=${addr/ \/ * }
67
+
68
+ [ -z " $addr " ] && return 1
69
+
70
+ echo $addr
71
+
72
+ return 0
73
+ }
74
+
52
75
fib_unreg_unicast_test ()
53
76
{
54
77
echo
@@ -390,6 +413,158 @@ fib_carrier_test()
390
413
fib_carrier_unicast_test
391
414
}
392
415
416
+ # ###############################################################################
417
+ # Tests on nexthop spec
418
+
419
+ # run 'ip route add' with given spec
420
+ add_rt ()
421
+ {
422
+ local desc=" $1 "
423
+ local erc=$2
424
+ local vrf=$3
425
+ local pfx=$4
426
+ local gw=$5
427
+ local dev=$6
428
+ local cmd out rc
429
+
430
+ [ " $vrf " = " -" ] && vrf=" default"
431
+ [ -n " $gw " ] && gw=" via $gw "
432
+ [ -n " $dev " ] && dev=" dev $dev "
433
+
434
+ cmd=" $IP route add vrf $vrf $pfx $gw $dev "
435
+ if [ " $VERBOSE " = " 1" ]; then
436
+ printf " \n COMMAND: $cmd \n"
437
+ fi
438
+
439
+ out=$( eval $cmd 2>&1 )
440
+ rc=$?
441
+ if [ " $VERBOSE " = " 1" -a -n " $out " ]; then
442
+ echo " $out "
443
+ fi
444
+ log_test $rc $erc " $desc "
445
+ }
446
+
447
+ fib4_nexthop ()
448
+ {
449
+ echo
450
+ echo " IPv4 nexthop tests"
451
+
452
+ echo " <<< write me >>>"
453
+ }
454
+
455
+ fib6_nexthop ()
456
+ {
457
+ local lldummy=$( get_linklocal dummy0)
458
+ local llv1=$( get_linklocal dummy0)
459
+
460
+ if [ -z " $lldummy " ]; then
461
+ echo " Failed to get linklocal address for dummy0"
462
+ return 1
463
+ fi
464
+ if [ -z " $llv1 " ]; then
465
+ echo " Failed to get linklocal address for veth1"
466
+ return 1
467
+ fi
468
+
469
+ echo
470
+ echo " IPv6 nexthop tests"
471
+
472
+ add_rt " Directly connected nexthop, unicast address" 0 \
473
+ - 2001:db8:101::/64 2001:db8:1::2
474
+ add_rt " Directly connected nexthop, unicast address with device" 0 \
475
+ - 2001:db8:102::/64 2001:db8:1::2 " dummy0"
476
+ add_rt " Gateway is linklocal address" 0 \
477
+ - 2001:db8:103::1/64 $llv1 " veth0"
478
+
479
+ # fails because LL address requires a device
480
+ add_rt " Gateway is linklocal address, no device" 2 \
481
+ - 2001:db8:104::1/64 $llv1
482
+
483
+ # local address can not be a gateway
484
+ add_rt " Gateway can not be local unicast address" 2 \
485
+ - 2001:db8:105::/64 2001:db8:1::1
486
+ add_rt " Gateway can not be local unicast address, with device" 2 \
487
+ - 2001:db8:106::/64 2001:db8:1::1 " dummy0"
488
+ add_rt " Gateway can not be a local linklocal address" 2 \
489
+ - 2001:db8:107::1/64 $lldummy " dummy0"
490
+
491
+ # VRF tests
492
+ add_rt " Gateway can be local address in a VRF" 0 \
493
+ - 2001:db8:108::/64 2001:db8:51::2
494
+ add_rt " Gateway can be local address in a VRF, with device" 0 \
495
+ - 2001:db8:109::/64 2001:db8:51::2 " veth0"
496
+ add_rt " Gateway can be local linklocal address in a VRF" 0 \
497
+ - 2001:db8:110::1/64 $llv1 " veth0"
498
+
499
+ add_rt " Redirect to VRF lookup" 0 \
500
+ - 2001:db8:111::/64 " " " red"
501
+
502
+ add_rt " VRF route, gateway can be local address in default VRF" 0 \
503
+ red 2001:db8:112::/64 2001:db8:51::1
504
+
505
+ # local address in same VRF fails
506
+ add_rt " VRF route, gateway can not be a local address" 2 \
507
+ red 2001:db8:113::1/64 2001:db8:2::1
508
+ add_rt " VRF route, gateway can not be a local addr with device" 2 \
509
+ red 2001:db8:114::1/64 2001:db8:2::1 " dummy1"
510
+ }
511
+
512
+ # Default VRF:
513
+ # dummy0 - 198.51.100.1/24 2001:db8:1::1/64
514
+ # veth0 - 192.0.2.1/24 2001:db8:51::1/64
515
+ #
516
+ # VRF red:
517
+ # dummy1 - 192.168.2.1/24 2001:db8:2::1/64
518
+ # veth1 - 192.0.2.2/24 2001:db8:51::2/64
519
+ #
520
+ # [ dummy0 veth0 ]--[ veth1 dummy1 ]
521
+
522
+ fib_nexthop_test ()
523
+ {
524
+ setup
525
+
526
+ set -e
527
+
528
+ $IP -4 rule add pref 32765 table local
529
+ $IP -4 rule del pref 0
530
+ $IP -6 rule add pref 32765 table local
531
+ $IP -6 rule del pref 0
532
+
533
+ $IP link add red type vrf table 1
534
+ $IP link set red up
535
+ $IP -4 route add vrf red unreachable default metric 4278198272
536
+ $IP -6 route add vrf red unreachable default metric 4278198272
537
+
538
+ $IP link add veth0 type veth peer name veth1
539
+ $IP link set dev veth0 up
540
+ $IP address add 192.0.2.1/24 dev veth0
541
+ $IP -6 address add 2001:db8:51::1/64 dev veth0
542
+
543
+ $IP link set dev veth1 vrf red up
544
+ $IP address add 192.0.2.2/24 dev veth1
545
+ $IP -6 address add 2001:db8:51::2/64 dev veth1
546
+
547
+ $IP link add dummy1 type dummy
548
+ $IP link set dev dummy1 vrf red up
549
+ $IP address add 192.168.2.1/24 dev dummy1
550
+ $IP -6 address add 2001:db8:2::1/64 dev dummy1
551
+ set +e
552
+
553
+ sleep 1
554
+ fib4_nexthop
555
+ fib6_nexthop
556
+
557
+ (
558
+ $IP link del dev dummy1
559
+ $IP link del veth0
560
+ $IP link del red
561
+ ) 2> /dev/null
562
+ cleanup
563
+ }
564
+
565
+ # ###############################################################################
566
+ #
567
+
393
568
fib_test ()
394
569
{
395
570
if [ -n " $TEST " ]; then
@@ -398,6 +573,7 @@ fib_test()
398
573
fib_unreg_test
399
574
fib_down_test
400
575
fib_carrier_test
576
+ fib_nexthop_test
401
577
fi
402
578
}
403
579
0 commit comments