Add series of tests for valid and invalid nexthop specs for IPv6.

$ TEST=fib_nexthop_test ./fib_tests.sh
...
IPv6 nexthop tests
    TEST: Directly connected nexthop, unicast address              [ OK ]
    TEST: Directly connected nexthop, unicast address with device  [ OK ]
    TEST: Gateway is linklocal address                             [ OK ]
    TEST: Gateway is linklocal address, no device                  [ OK ]
    TEST: Gateway can not be local unicast address                 [ OK ]
    TEST: Gateway can not be local unicast address, with device    [ OK ]
    TEST: Gateway can not be a local linklocal address             [ OK ]
    TEST: Gateway can be local address in a VRF                    [ OK ]
    TEST: Gateway can be local address in a VRF, with device       [ OK ]
    TEST: Gateway can be local linklocal address in a VRF          [ OK ]
    TEST: Redirect to VRF lookup                                   [ OK ]
    TEST: VRF route, gateway can be local address in default VRF   [ OK ]
    TEST: VRF route, gateway can not be a local address            [ OK ]
    TEST: VRF route, gateway can not be a local addr with device   [ OK ]

Signed-off-by: David Ahern <dsah...@gmail.com>
---
 tools/testing/selftests/net/fib_tests.sh | 180 ++++++++++++++++++++++++++++++-
 1 file changed, 178 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/net/fib_tests.sh 
b/tools/testing/selftests/net/fib_tests.sh
index cfdeb35bfed5..9164e60d4b66 100755
--- a/tools/testing/selftests/net/fib_tests.sh
+++ b/tools/testing/selftests/net/fib_tests.sh
@@ -6,6 +6,7 @@
 
 ret=0
 
+VERBOSE=${VERBOSE:=0}
 PAUSE_ON_FAIL=${PAUSE_ON_FAIL:=no}
 IP="ip -netns testns"
 
@@ -16,10 +17,10 @@ log_test()
        local msg="$3"
 
        if [ ${rc} -eq ${expected} ]; then
-               printf "        %-60s  [ OK ]\n" "${msg}"
+               printf "    TEST: %-60s  [ OK ]\n" "${msg}"
        else
                ret=1
-               printf "        %-60s  [FAIL]\n" "${msg}"
+               printf "    TEST: %-60s  [FAIL]\n" "${msg}"
                if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
                echo
                        echo "hit enter to continue, 'q' to quit"
@@ -49,6 +50,28 @@ cleanup()
        ip netns del testns
 }
 
+get_linklocal()
+{
+       local dev=$1
+       local addr
+
+       addr=$($IP -6 -br addr show dev ${dev} | \
+       awk '{
+               for (i = 3; i <= NF; ++i) {
+                       if ($i ~ /^fe80/)
+                               print $i
+               }
+       }'
+       )
+       addr=${addr/\/*}
+
+       [ -z "$addr" ] && return 1
+
+       echo $addr
+
+       return 0
+}
+
 fib_unreg_unicast_test()
 {
        echo
@@ -390,6 +413,158 @@ fib_carrier_test()
        fib_carrier_unicast_test
 }
 
+################################################################################
+# Tests on nexthop spec
+
+# run 'ip route add' with given spec
+add_rt()
+{
+       local desc="$1"
+       local erc=$2
+       local vrf=$3
+       local pfx=$4
+       local gw=$5
+       local dev=$6
+       local cmd out rc
+
+       [ "$vrf" = "-" ] && vrf="default"
+       [ -n "$gw" ] && gw="via $gw"
+       [ -n "$dev" ] && dev="dev $dev"
+
+       cmd="$IP route add vrf $vrf $pfx $gw $dev"
+       if [ "$VERBOSE" = "1" ]; then
+               printf "\n    COMMAND: $cmd\n"
+       fi
+
+       out=$(eval $cmd 2>&1)
+       rc=$?
+       if [ "$VERBOSE" = "1" -a -n "$out" ]; then
+               echo "    $out"
+       fi
+       log_test $rc $erc "$desc"
+}
+
+fib4_nexthop()
+{
+       echo
+       echo "IPv4 nexthop tests"
+
+       echo "<<< write me >>>"
+}
+
+fib6_nexthop()
+{
+       local lldummy=$(get_linklocal dummy0)
+       local llv1=$(get_linklocal dummy0)
+
+       if [ -z "$lldummy" ]; then
+               echo "Failed to get linklocal address for dummy0"
+               return 1
+       fi
+       if [ -z "$llv1" ]; then
+               echo "Failed to get linklocal address for veth1"
+               return 1
+       fi
+
+       echo
+       echo "IPv6 nexthop tests"
+
+       add_rt "Directly connected nexthop, unicast address" 0 \
+               - 2001:db8:101::/64 2001:db8:1::2
+       add_rt "Directly connected nexthop, unicast address with device" 0 \
+               - 2001:db8:102::/64 2001:db8:1::2 "dummy0"
+       add_rt "Gateway is linklocal address" 0 \
+               - 2001:db8:103::1/64 $llv1 "veth0"
+
+       # fails because LL address requires a device
+       add_rt "Gateway is linklocal address, no device" 2 \
+               - 2001:db8:104::1/64 $llv1
+
+       # local address can not be a gateway
+       add_rt "Gateway can not be local unicast address" 2 \
+               - 2001:db8:105::/64 2001:db8:1::1
+       add_rt "Gateway can not be local unicast address, with device" 2 \
+               - 2001:db8:106::/64 2001:db8:1::1 "dummy0"
+       add_rt "Gateway can not be a local linklocal address" 2 \
+               - 2001:db8:107::1/64 $lldummy "dummy0"
+
+       # VRF tests
+       add_rt "Gateway can be local address in a VRF" 0 \
+               - 2001:db8:108::/64 2001:db8:51::2
+       add_rt "Gateway can be local address in a VRF, with device" 0 \
+               - 2001:db8:109::/64 2001:db8:51::2 "veth0"
+       add_rt "Gateway can be local linklocal address in a VRF" 0 \
+               - 2001:db8:110::1/64 $llv1 "veth0"
+
+       add_rt "Redirect to VRF lookup" 0 \
+               - 2001:db8:111::/64 "" "red"
+
+       add_rt "VRF route, gateway can be local address in default VRF" 0 \
+               red 2001:db8:112::/64 2001:db8:51::1
+
+       # local address in same VRF fails
+       add_rt "VRF route, gateway can not be a local address" 2 \
+               red 2001:db8:113::1/64 2001:db8:2::1
+       add_rt "VRF route, gateway can not be a local addr with device" 2 \
+               red 2001:db8:114::1/64 2001:db8:2::1 "dummy1"
+}
+
+# Default VRF:
+#   dummy0 - 198.51.100.1/24 2001:db8:1::1/64
+#   veth0  - 192.0.2.1/24    2001:db8:51::1/64
+#
+# VRF red:
+#   dummy1 - 192.168.2.1/24 2001:db8:2::1/64
+#   veth1  - 192.0.2.2/24   2001:db8:51::2/64
+#
+#  [ dummy0   veth0 ]--[ veth1   dummy1 ]
+
+fib_nexthop_test()
+{
+       setup
+
+       set -e
+
+       $IP -4 rule add pref 32765 table local
+       $IP -4 rule del pref 0
+       $IP -6 rule add pref 32765 table local
+       $IP -6 rule del pref 0
+
+       $IP link add red type vrf table 1
+       $IP link set red up
+       $IP -4 route add vrf red unreachable default metric 4278198272
+       $IP -6 route add vrf red unreachable default metric 4278198272
+
+       $IP link add veth0 type veth peer name veth1
+       $IP link set dev veth0 up
+       $IP address add 192.0.2.1/24 dev veth0
+       $IP -6 address add 2001:db8:51::1/64 dev veth0
+
+       $IP link set dev veth1 vrf red up
+       $IP address add 192.0.2.2/24 dev veth1
+       $IP -6 address add 2001:db8:51::2/64 dev veth1
+
+       $IP link add dummy1 type dummy
+       $IP link set dev dummy1 vrf red up
+       $IP address add 192.168.2.1/24 dev dummy1
+       $IP -6 address add 2001:db8:2::1/64 dev dummy1
+       set +e
+
+       sleep 1
+       fib4_nexthop
+       fib6_nexthop
+
+       (
+       $IP link del dev dummy1
+       $IP link del veth0
+       $IP link del red
+       ) 2>/dev/null
+       cleanup
+}
+
+################################################################################
+#
+
 fib_test()
 {
        if [ -n "$TEST" ]; then
@@ -398,6 +573,7 @@ fib_test()
                fib_unreg_test
                fib_down_test
                fib_carrier_test
+               fib_nexthop_test
        fi
 }
 
-- 
2.11.0

Reply via email to