blob: 8c99f0689efc5a290756544b186b6c0d9515e77f [file] [log] [blame]
Ido Schimmel607bd2e2018-01-07 12:45:16 +02001#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3
4# This test is for checking IPv4 and IPv6 FIB behavior in response to
5# different events.
6
7ret=0
8
David Ahern1c7447b2018-05-21 10:26:55 -07009TESTS="unregister down carrier nexthop"
10VERBOSE=0
11PAUSE_ON_FAIL=no
David Ahern171a4872018-03-13 08:29:39 -070012IP="ip -netns testns"
Ido Schimmel607bd2e2018-01-07 12:45:16 +020013
David Ahern10566912018-02-13 08:37:34 -080014log_test()
Ido Schimmel607bd2e2018-01-07 12:45:16 +020015{
David Ahern10566912018-02-13 08:37:34 -080016 local rc=$1
17 local expected=$2
18 local msg="$3"
19
20 if [ ${rc} -eq ${expected} ]; then
David Ahern654d3a72018-03-13 08:29:41 -070021 printf " TEST: %-60s [ OK ]\n" "${msg}"
David Ahern37ce42c2018-05-21 10:26:54 -070022 nsuccess=$((nsuccess+1))
David Ahern10566912018-02-13 08:37:34 -080023 else
Ido Schimmel607bd2e2018-01-07 12:45:16 +020024 ret=1
David Ahern37ce42c2018-05-21 10:26:54 -070025 nfail=$((nfail+1))
David Ahern654d3a72018-03-13 08:29:41 -070026 printf " TEST: %-60s [FAIL]\n" "${msg}"
David Ahern10566912018-02-13 08:37:34 -080027 if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
28 echo
29 echo "hit enter to continue, 'q' to quit"
30 read a
31 [ "$a" = "q" ] && exit 1
32 fi
Ido Schimmel607bd2e2018-01-07 12:45:16 +020033 fi
34}
35
David Ahernee395a52018-02-13 08:37:35 -080036setup()
Ido Schimmel607bd2e2018-01-07 12:45:16 +020037{
David Ahernee395a52018-02-13 08:37:35 -080038 set -e
39 ip netns add testns
David Ahern171a4872018-03-13 08:29:39 -070040 $IP link set dev lo up
Ido Schimmel607bd2e2018-01-07 12:45:16 +020041
David Ahern171a4872018-03-13 08:29:39 -070042 $IP link add dummy0 type dummy
43 $IP link set dev dummy0 up
44 $IP address add 198.51.100.1/24 dev dummy0
45 $IP -6 address add 2001:db8:1::1/64 dev dummy0
David Ahernee395a52018-02-13 08:37:35 -080046 set +e
47
48}
49
50cleanup()
51{
David Ahern171a4872018-03-13 08:29:39 -070052 $IP link del dev dummy0 &> /dev/null
David Ahernee395a52018-02-13 08:37:35 -080053 ip netns del testns
Ido Schimmel607bd2e2018-01-07 12:45:16 +020054}
55
David Ahern654d3a72018-03-13 08:29:41 -070056get_linklocal()
57{
58 local dev=$1
59 local addr
60
61 addr=$($IP -6 -br addr show dev ${dev} | \
62 awk '{
63 for (i = 3; i <= NF; ++i) {
64 if ($i ~ /^fe80/)
65 print $i
66 }
67 }'
68 )
69 addr=${addr/\/*}
70
71 [ -z "$addr" ] && return 1
72
73 echo $addr
74
75 return 0
76}
77
Ido Schimmel607bd2e2018-01-07 12:45:16 +020078fib_unreg_unicast_test()
79{
David Ahern10566912018-02-13 08:37:34 -080080 echo
81 echo "Single path route test"
Ido Schimmel607bd2e2018-01-07 12:45:16 +020082
David Ahernee395a52018-02-13 08:37:35 -080083 setup
Ido Schimmel607bd2e2018-01-07 12:45:16 +020084
David Ahern10566912018-02-13 08:37:34 -080085 echo " Start point"
David Ahern171a4872018-03-13 08:29:39 -070086 $IP route get fibmatch 198.51.100.2 &> /dev/null
David Ahern10566912018-02-13 08:37:34 -080087 log_test $? 0 "IPv4 fibmatch"
David Ahern171a4872018-03-13 08:29:39 -070088 $IP -6 route get fibmatch 2001:db8:1::2 &> /dev/null
David Ahern10566912018-02-13 08:37:34 -080089 log_test $? 0 "IPv6 fibmatch"
Ido Schimmel607bd2e2018-01-07 12:45:16 +020090
David Ahern10566912018-02-13 08:37:34 -080091 set -e
David Ahern171a4872018-03-13 08:29:39 -070092 $IP link del dev dummy0
David Ahern10566912018-02-13 08:37:34 -080093 set +e
Ido Schimmel607bd2e2018-01-07 12:45:16 +020094
David Ahern10566912018-02-13 08:37:34 -080095 echo " Nexthop device deleted"
David Ahern171a4872018-03-13 08:29:39 -070096 $IP route get fibmatch 198.51.100.2 &> /dev/null
David Ahern10566912018-02-13 08:37:34 -080097 log_test $? 2 "IPv4 fibmatch - no route"
David Ahern171a4872018-03-13 08:29:39 -070098 $IP -6 route get fibmatch 2001:db8:1::2 &> /dev/null
David Ahern10566912018-02-13 08:37:34 -080099 log_test $? 2 "IPv6 fibmatch - no route"
Ido Schimmel607bd2e2018-01-07 12:45:16 +0200100
David Ahernee395a52018-02-13 08:37:35 -0800101 cleanup
Ido Schimmel607bd2e2018-01-07 12:45:16 +0200102}
103
104fib_unreg_multipath_test()
105{
Ido Schimmel607bd2e2018-01-07 12:45:16 +0200106
David Ahern10566912018-02-13 08:37:34 -0800107 echo
108 echo "Multipath route test"
109
David Ahernee395a52018-02-13 08:37:35 -0800110 setup
111
David Ahern10566912018-02-13 08:37:34 -0800112 set -e
David Ahern171a4872018-03-13 08:29:39 -0700113 $IP link add dummy1 type dummy
114 $IP link set dev dummy1 up
115 $IP address add 192.0.2.1/24 dev dummy1
116 $IP -6 address add 2001:db8:2::1/64 dev dummy1
Ido Schimmel607bd2e2018-01-07 12:45:16 +0200117
David Ahern171a4872018-03-13 08:29:39 -0700118 $IP route add 203.0.113.0/24 \
Ido Schimmel607bd2e2018-01-07 12:45:16 +0200119 nexthop via 198.51.100.2 dev dummy0 \
120 nexthop via 192.0.2.2 dev dummy1
David Ahern171a4872018-03-13 08:29:39 -0700121 $IP -6 route add 2001:db8:3::/64 \
Ido Schimmel607bd2e2018-01-07 12:45:16 +0200122 nexthop via 2001:db8:1::2 dev dummy0 \
123 nexthop via 2001:db8:2::2 dev dummy1
David Ahern10566912018-02-13 08:37:34 -0800124 set +e
Ido Schimmel607bd2e2018-01-07 12:45:16 +0200125
David Ahern10566912018-02-13 08:37:34 -0800126 echo " Start point"
David Ahern171a4872018-03-13 08:29:39 -0700127 $IP route get fibmatch 203.0.113.1 &> /dev/null
David Ahern10566912018-02-13 08:37:34 -0800128 log_test $? 0 "IPv4 fibmatch"
David Ahern171a4872018-03-13 08:29:39 -0700129 $IP -6 route get fibmatch 2001:db8:3::1 &> /dev/null
David Ahern10566912018-02-13 08:37:34 -0800130 log_test $? 0 "IPv6 fibmatch"
Ido Schimmel607bd2e2018-01-07 12:45:16 +0200131
David Ahern10566912018-02-13 08:37:34 -0800132 set -e
David Ahern171a4872018-03-13 08:29:39 -0700133 $IP link del dev dummy0
David Ahern10566912018-02-13 08:37:34 -0800134 set +e
Ido Schimmel607bd2e2018-01-07 12:45:16 +0200135
David Ahern10566912018-02-13 08:37:34 -0800136 echo " One nexthop device deleted"
David Ahern171a4872018-03-13 08:29:39 -0700137 $IP route get fibmatch 203.0.113.1 &> /dev/null
David Ahern10566912018-02-13 08:37:34 -0800138 log_test $? 2 "IPv4 - multipath route removed on delete"
139
David Ahern171a4872018-03-13 08:29:39 -0700140 $IP -6 route get fibmatch 2001:db8:3::1 &> /dev/null
Ido Schimmel607bd2e2018-01-07 12:45:16 +0200141 # In IPv6 we do not flush the entire multipath route.
David Ahern10566912018-02-13 08:37:34 -0800142 log_test $? 0 "IPv6 - multipath down to single path"
Ido Schimmel607bd2e2018-01-07 12:45:16 +0200143
David Ahern10566912018-02-13 08:37:34 -0800144 set -e
David Ahern171a4872018-03-13 08:29:39 -0700145 $IP link del dev dummy1
David Ahern10566912018-02-13 08:37:34 -0800146 set +e
147
148 echo " Second nexthop device deleted"
David Ahern171a4872018-03-13 08:29:39 -0700149 $IP -6 route get fibmatch 2001:db8:3::1 &> /dev/null
David Ahern10566912018-02-13 08:37:34 -0800150 log_test $? 2 "IPv6 - no route"
Ido Schimmel607bd2e2018-01-07 12:45:16 +0200151
David Ahernee395a52018-02-13 08:37:35 -0800152 cleanup
Ido Schimmel607bd2e2018-01-07 12:45:16 +0200153}
154
155fib_unreg_test()
156{
Ido Schimmel607bd2e2018-01-07 12:45:16 +0200157 fib_unreg_unicast_test
158 fib_unreg_multipath_test
159}
160
Ido Schimmel5adb7682018-01-07 12:45:17 +0200161fib_down_unicast_test()
162{
David Ahern10566912018-02-13 08:37:34 -0800163 echo
164 echo "Single path, admin down"
Ido Schimmel5adb7682018-01-07 12:45:17 +0200165
David Ahernee395a52018-02-13 08:37:35 -0800166 setup
Ido Schimmel5adb7682018-01-07 12:45:17 +0200167
David Ahern10566912018-02-13 08:37:34 -0800168 echo " Start point"
David Ahern171a4872018-03-13 08:29:39 -0700169 $IP route get fibmatch 198.51.100.2 &> /dev/null
David Ahern10566912018-02-13 08:37:34 -0800170 log_test $? 0 "IPv4 fibmatch"
David Ahern171a4872018-03-13 08:29:39 -0700171 $IP -6 route get fibmatch 2001:db8:1::2 &> /dev/null
David Ahern10566912018-02-13 08:37:34 -0800172 log_test $? 0 "IPv6 fibmatch"
Ido Schimmel5adb7682018-01-07 12:45:17 +0200173
David Ahern10566912018-02-13 08:37:34 -0800174 set -e
David Ahern171a4872018-03-13 08:29:39 -0700175 $IP link set dev dummy0 down
David Ahern10566912018-02-13 08:37:34 -0800176 set +e
Ido Schimmel5adb7682018-01-07 12:45:17 +0200177
David Ahern10566912018-02-13 08:37:34 -0800178 echo " Route deleted on down"
David Ahern171a4872018-03-13 08:29:39 -0700179 $IP route get fibmatch 198.51.100.2 &> /dev/null
David Ahern10566912018-02-13 08:37:34 -0800180 log_test $? 2 "IPv4 fibmatch"
David Ahern171a4872018-03-13 08:29:39 -0700181 $IP -6 route get fibmatch 2001:db8:1::2 &> /dev/null
David Ahern10566912018-02-13 08:37:34 -0800182 log_test $? 2 "IPv6 fibmatch"
Ido Schimmel5adb7682018-01-07 12:45:17 +0200183
David Ahernee395a52018-02-13 08:37:35 -0800184 cleanup
Ido Schimmel5adb7682018-01-07 12:45:17 +0200185}
186
187fib_down_multipath_test_do()
188{
189 local down_dev=$1
190 local up_dev=$2
191
David Ahern171a4872018-03-13 08:29:39 -0700192 $IP route get fibmatch 203.0.113.1 \
Ido Schimmel5adb7682018-01-07 12:45:17 +0200193 oif $down_dev &> /dev/null
David Ahern10566912018-02-13 08:37:34 -0800194 log_test $? 2 "IPv4 fibmatch on down device"
David Ahern171a4872018-03-13 08:29:39 -0700195 $IP -6 route get fibmatch 2001:db8:3::1 \
Ido Schimmel5adb7682018-01-07 12:45:17 +0200196 oif $down_dev &> /dev/null
David Ahern10566912018-02-13 08:37:34 -0800197 log_test $? 2 "IPv6 fibmatch on down device"
Ido Schimmel5adb7682018-01-07 12:45:17 +0200198
David Ahern171a4872018-03-13 08:29:39 -0700199 $IP route get fibmatch 203.0.113.1 \
Ido Schimmel5adb7682018-01-07 12:45:17 +0200200 oif $up_dev &> /dev/null
David Ahern10566912018-02-13 08:37:34 -0800201 log_test $? 0 "IPv4 fibmatch on up device"
David Ahern171a4872018-03-13 08:29:39 -0700202 $IP -6 route get fibmatch 2001:db8:3::1 \
Ido Schimmel5adb7682018-01-07 12:45:17 +0200203 oif $up_dev &> /dev/null
David Ahern10566912018-02-13 08:37:34 -0800204 log_test $? 0 "IPv6 fibmatch on up device"
Ido Schimmel5adb7682018-01-07 12:45:17 +0200205
David Ahern171a4872018-03-13 08:29:39 -0700206 $IP route get fibmatch 203.0.113.1 | \
Ido Schimmel5adb7682018-01-07 12:45:17 +0200207 grep $down_dev | grep -q "dead linkdown"
David Ahern10566912018-02-13 08:37:34 -0800208 log_test $? 0 "IPv4 flags on down device"
David Ahern171a4872018-03-13 08:29:39 -0700209 $IP -6 route get fibmatch 2001:db8:3::1 | \
Ido Schimmel5adb7682018-01-07 12:45:17 +0200210 grep $down_dev | grep -q "dead linkdown"
David Ahern10566912018-02-13 08:37:34 -0800211 log_test $? 0 "IPv6 flags on down device"
Ido Schimmel5adb7682018-01-07 12:45:17 +0200212
David Ahern171a4872018-03-13 08:29:39 -0700213 $IP route get fibmatch 203.0.113.1 | \
Ido Schimmel5adb7682018-01-07 12:45:17 +0200214 grep $up_dev | grep -q "dead linkdown"
David Ahern10566912018-02-13 08:37:34 -0800215 log_test $? 1 "IPv4 flags on up device"
David Ahern171a4872018-03-13 08:29:39 -0700216 $IP -6 route get fibmatch 2001:db8:3::1 | \
Ido Schimmel5adb7682018-01-07 12:45:17 +0200217 grep $up_dev | grep -q "dead linkdown"
David Ahern10566912018-02-13 08:37:34 -0800218 log_test $? 1 "IPv6 flags on up device"
Ido Schimmel5adb7682018-01-07 12:45:17 +0200219}
220
221fib_down_multipath_test()
222{
David Ahern10566912018-02-13 08:37:34 -0800223 echo
224 echo "Admin down multipath"
Ido Schimmel5adb7682018-01-07 12:45:17 +0200225
David Ahernee395a52018-02-13 08:37:35 -0800226 setup
227
David Ahern10566912018-02-13 08:37:34 -0800228 set -e
David Ahern171a4872018-03-13 08:29:39 -0700229 $IP link add dummy1 type dummy
230 $IP link set dev dummy1 up
Ido Schimmel5adb7682018-01-07 12:45:17 +0200231
David Ahern171a4872018-03-13 08:29:39 -0700232 $IP address add 192.0.2.1/24 dev dummy1
233 $IP -6 address add 2001:db8:2::1/64 dev dummy1
Ido Schimmel5adb7682018-01-07 12:45:17 +0200234
David Ahern171a4872018-03-13 08:29:39 -0700235 $IP route add 203.0.113.0/24 \
Ido Schimmel5adb7682018-01-07 12:45:17 +0200236 nexthop via 198.51.100.2 dev dummy0 \
237 nexthop via 192.0.2.2 dev dummy1
David Ahern171a4872018-03-13 08:29:39 -0700238 $IP -6 route add 2001:db8:3::/64 \
Ido Schimmel5adb7682018-01-07 12:45:17 +0200239 nexthop via 2001:db8:1::2 dev dummy0 \
240 nexthop via 2001:db8:2::2 dev dummy1
David Ahern10566912018-02-13 08:37:34 -0800241 set +e
Ido Schimmel5adb7682018-01-07 12:45:17 +0200242
David Ahern10566912018-02-13 08:37:34 -0800243 echo " Verify start point"
David Ahern171a4872018-03-13 08:29:39 -0700244 $IP route get fibmatch 203.0.113.1 &> /dev/null
David Ahern10566912018-02-13 08:37:34 -0800245 log_test $? 0 "IPv4 fibmatch"
246
David Ahern171a4872018-03-13 08:29:39 -0700247 $IP -6 route get fibmatch 2001:db8:3::1 &> /dev/null
David Ahern10566912018-02-13 08:37:34 -0800248 log_test $? 0 "IPv6 fibmatch"
Ido Schimmel5adb7682018-01-07 12:45:17 +0200249
David Ahern10566912018-02-13 08:37:34 -0800250 set -e
David Ahern171a4872018-03-13 08:29:39 -0700251 $IP link set dev dummy0 down
David Ahern10566912018-02-13 08:37:34 -0800252 set +e
Ido Schimmel5adb7682018-01-07 12:45:17 +0200253
David Ahern10566912018-02-13 08:37:34 -0800254 echo " One device down, one up"
Ido Schimmel5adb7682018-01-07 12:45:17 +0200255 fib_down_multipath_test_do "dummy0" "dummy1"
256
David Ahern10566912018-02-13 08:37:34 -0800257 set -e
David Ahern171a4872018-03-13 08:29:39 -0700258 $IP link set dev dummy0 up
259 $IP link set dev dummy1 down
David Ahern10566912018-02-13 08:37:34 -0800260 set +e
Ido Schimmel5adb7682018-01-07 12:45:17 +0200261
David Ahern10566912018-02-13 08:37:34 -0800262 echo " Other device down and up"
Ido Schimmel5adb7682018-01-07 12:45:17 +0200263 fib_down_multipath_test_do "dummy1" "dummy0"
264
David Ahern10566912018-02-13 08:37:34 -0800265 set -e
David Ahern171a4872018-03-13 08:29:39 -0700266 $IP link set dev dummy0 down
David Ahern10566912018-02-13 08:37:34 -0800267 set +e
Ido Schimmel5adb7682018-01-07 12:45:17 +0200268
David Ahern10566912018-02-13 08:37:34 -0800269 echo " Both devices down"
David Ahern171a4872018-03-13 08:29:39 -0700270 $IP route get fibmatch 203.0.113.1 &> /dev/null
David Ahern10566912018-02-13 08:37:34 -0800271 log_test $? 2 "IPv4 fibmatch"
David Ahern171a4872018-03-13 08:29:39 -0700272 $IP -6 route get fibmatch 2001:db8:3::1 &> /dev/null
David Ahern10566912018-02-13 08:37:34 -0800273 log_test $? 2 "IPv6 fibmatch"
Ido Schimmel5adb7682018-01-07 12:45:17 +0200274
David Ahern171a4872018-03-13 08:29:39 -0700275 $IP link del dev dummy1
David Ahernee395a52018-02-13 08:37:35 -0800276 cleanup
Ido Schimmel5adb7682018-01-07 12:45:17 +0200277}
278
279fib_down_test()
280{
Ido Schimmel5adb7682018-01-07 12:45:17 +0200281 fib_down_unicast_test
282 fib_down_multipath_test
283}
284
David Ahern10566912018-02-13 08:37:34 -0800285# Local routes should not be affected when carrier changes.
Ido Schimmel82e45b62018-01-07 12:45:18 +0200286fib_carrier_local_test()
287{
David Ahern10566912018-02-13 08:37:34 -0800288 echo
289 echo "Local carrier tests - single path"
Ido Schimmel82e45b62018-01-07 12:45:18 +0200290
David Ahernee395a52018-02-13 08:37:35 -0800291 setup
292
David Ahern10566912018-02-13 08:37:34 -0800293 set -e
David Ahern171a4872018-03-13 08:29:39 -0700294 $IP link set dev dummy0 carrier on
David Ahern10566912018-02-13 08:37:34 -0800295 set +e
Ido Schimmel82e45b62018-01-07 12:45:18 +0200296
David Ahern10566912018-02-13 08:37:34 -0800297 echo " Start point"
David Ahern171a4872018-03-13 08:29:39 -0700298 $IP route get fibmatch 198.51.100.1 &> /dev/null
David Ahern10566912018-02-13 08:37:34 -0800299 log_test $? 0 "IPv4 fibmatch"
David Ahern171a4872018-03-13 08:29:39 -0700300 $IP -6 route get fibmatch 2001:db8:1::1 &> /dev/null
David Ahern10566912018-02-13 08:37:34 -0800301 log_test $? 0 "IPv6 fibmatch"
Ido Schimmel82e45b62018-01-07 12:45:18 +0200302
David Ahern171a4872018-03-13 08:29:39 -0700303 $IP route get fibmatch 198.51.100.1 | \
Ido Schimmel82e45b62018-01-07 12:45:18 +0200304 grep -q "linkdown"
David Ahern10566912018-02-13 08:37:34 -0800305 log_test $? 1 "IPv4 - no linkdown flag"
David Ahern171a4872018-03-13 08:29:39 -0700306 $IP -6 route get fibmatch 2001:db8:1::1 | \
Ido Schimmel82e45b62018-01-07 12:45:18 +0200307 grep -q "linkdown"
David Ahern10566912018-02-13 08:37:34 -0800308 log_test $? 1 "IPv6 - no linkdown flag"
Ido Schimmel82e45b62018-01-07 12:45:18 +0200309
David Ahern10566912018-02-13 08:37:34 -0800310 set -e
David Ahern171a4872018-03-13 08:29:39 -0700311 $IP link set dev dummy0 carrier off
David Aherne2ba7322018-02-13 08:37:36 -0800312 sleep 1
David Ahern10566912018-02-13 08:37:34 -0800313 set +e
Ido Schimmel82e45b62018-01-07 12:45:18 +0200314
David Ahern10566912018-02-13 08:37:34 -0800315 echo " Carrier off on nexthop"
David Ahern171a4872018-03-13 08:29:39 -0700316 $IP route get fibmatch 198.51.100.1 &> /dev/null
David Ahern10566912018-02-13 08:37:34 -0800317 log_test $? 0 "IPv4 fibmatch"
David Ahern171a4872018-03-13 08:29:39 -0700318 $IP -6 route get fibmatch 2001:db8:1::1 &> /dev/null
David Ahern10566912018-02-13 08:37:34 -0800319 log_test $? 0 "IPv6 fibmatch"
Ido Schimmel82e45b62018-01-07 12:45:18 +0200320
David Ahern171a4872018-03-13 08:29:39 -0700321 $IP route get fibmatch 198.51.100.1 | \
Ido Schimmel82e45b62018-01-07 12:45:18 +0200322 grep -q "linkdown"
David Ahern10566912018-02-13 08:37:34 -0800323 log_test $? 1 "IPv4 - linkdown flag set"
David Ahern171a4872018-03-13 08:29:39 -0700324 $IP -6 route get fibmatch 2001:db8:1::1 | \
Ido Schimmel82e45b62018-01-07 12:45:18 +0200325 grep -q "linkdown"
David Ahern10566912018-02-13 08:37:34 -0800326 log_test $? 1 "IPv6 - linkdown flag set"
Ido Schimmel82e45b62018-01-07 12:45:18 +0200327
David Ahern10566912018-02-13 08:37:34 -0800328 set -e
David Ahern171a4872018-03-13 08:29:39 -0700329 $IP address add 192.0.2.1/24 dev dummy0
330 $IP -6 address add 2001:db8:2::1/64 dev dummy0
David Ahern10566912018-02-13 08:37:34 -0800331 set +e
Ido Schimmel82e45b62018-01-07 12:45:18 +0200332
David Ahern10566912018-02-13 08:37:34 -0800333 echo " Route to local address with carrier down"
David Ahern171a4872018-03-13 08:29:39 -0700334 $IP route get fibmatch 192.0.2.1 &> /dev/null
David Ahern10566912018-02-13 08:37:34 -0800335 log_test $? 0 "IPv4 fibmatch"
David Ahern171a4872018-03-13 08:29:39 -0700336 $IP -6 route get fibmatch 2001:db8:2::1 &> /dev/null
David Ahern10566912018-02-13 08:37:34 -0800337 log_test $? 0 "IPv6 fibmatch"
Ido Schimmel82e45b62018-01-07 12:45:18 +0200338
David Ahern171a4872018-03-13 08:29:39 -0700339 $IP route get fibmatch 192.0.2.1 | \
Ido Schimmel82e45b62018-01-07 12:45:18 +0200340 grep -q "linkdown"
David Ahern10566912018-02-13 08:37:34 -0800341 log_test $? 1 "IPv4 linkdown flag set"
David Ahern171a4872018-03-13 08:29:39 -0700342 $IP -6 route get fibmatch 2001:db8:2::1 | \
Ido Schimmel82e45b62018-01-07 12:45:18 +0200343 grep -q "linkdown"
David Ahern10566912018-02-13 08:37:34 -0800344 log_test $? 1 "IPv6 linkdown flag set"
Ido Schimmel82e45b62018-01-07 12:45:18 +0200345
David Ahernee395a52018-02-13 08:37:35 -0800346 cleanup
Ido Schimmel82e45b62018-01-07 12:45:18 +0200347}
348
349fib_carrier_unicast_test()
350{
351 ret=0
352
David Ahern10566912018-02-13 08:37:34 -0800353 echo
354 echo "Single path route carrier test"
355
David Ahernee395a52018-02-13 08:37:35 -0800356 setup
Ido Schimmel82e45b62018-01-07 12:45:18 +0200357
David Ahern10566912018-02-13 08:37:34 -0800358 set -e
David Ahern171a4872018-03-13 08:29:39 -0700359 $IP link set dev dummy0 carrier on
David Ahern10566912018-02-13 08:37:34 -0800360 set +e
Ido Schimmel82e45b62018-01-07 12:45:18 +0200361
David Ahern10566912018-02-13 08:37:34 -0800362 echo " Start point"
David Ahern171a4872018-03-13 08:29:39 -0700363 $IP route get fibmatch 198.51.100.2 &> /dev/null
David Ahern10566912018-02-13 08:37:34 -0800364 log_test $? 0 "IPv4 fibmatch"
David Ahern171a4872018-03-13 08:29:39 -0700365 $IP -6 route get fibmatch 2001:db8:1::2 &> /dev/null
David Ahern10566912018-02-13 08:37:34 -0800366 log_test $? 0 "IPv6 fibmatch"
Ido Schimmel82e45b62018-01-07 12:45:18 +0200367
David Ahern171a4872018-03-13 08:29:39 -0700368 $IP route get fibmatch 198.51.100.2 | \
Ido Schimmel82e45b62018-01-07 12:45:18 +0200369 grep -q "linkdown"
David Ahern10566912018-02-13 08:37:34 -0800370 log_test $? 1 "IPv4 no linkdown flag"
David Ahern171a4872018-03-13 08:29:39 -0700371 $IP -6 route get fibmatch 2001:db8:1::2 | \
Ido Schimmel82e45b62018-01-07 12:45:18 +0200372 grep -q "linkdown"
David Ahern10566912018-02-13 08:37:34 -0800373 log_test $? 1 "IPv6 no linkdown flag"
Ido Schimmel82e45b62018-01-07 12:45:18 +0200374
David Ahern10566912018-02-13 08:37:34 -0800375 set -e
David Ahern171a4872018-03-13 08:29:39 -0700376 $IP link set dev dummy0 carrier off
David Ahern10566912018-02-13 08:37:34 -0800377 set +e
Ido Schimmel82e45b62018-01-07 12:45:18 +0200378
David Ahern10566912018-02-13 08:37:34 -0800379 echo " Carrier down"
David Ahern171a4872018-03-13 08:29:39 -0700380 $IP route get fibmatch 198.51.100.2 &> /dev/null
David Ahern10566912018-02-13 08:37:34 -0800381 log_test $? 0 "IPv4 fibmatch"
David Ahern171a4872018-03-13 08:29:39 -0700382 $IP -6 route get fibmatch 2001:db8:1::2 &> /dev/null
David Ahern10566912018-02-13 08:37:34 -0800383 log_test $? 0 "IPv6 fibmatch"
Ido Schimmel82e45b62018-01-07 12:45:18 +0200384
David Ahern171a4872018-03-13 08:29:39 -0700385 $IP route get fibmatch 198.51.100.2 | \
Ido Schimmel82e45b62018-01-07 12:45:18 +0200386 grep -q "linkdown"
David Ahern10566912018-02-13 08:37:34 -0800387 log_test $? 0 "IPv4 linkdown flag set"
David Ahern171a4872018-03-13 08:29:39 -0700388 $IP -6 route get fibmatch 2001:db8:1::2 | \
Ido Schimmel82e45b62018-01-07 12:45:18 +0200389 grep -q "linkdown"
David Ahern10566912018-02-13 08:37:34 -0800390 log_test $? 0 "IPv6 linkdown flag set"
Ido Schimmel82e45b62018-01-07 12:45:18 +0200391
David Ahern10566912018-02-13 08:37:34 -0800392 set -e
David Ahern171a4872018-03-13 08:29:39 -0700393 $IP address add 192.0.2.1/24 dev dummy0
394 $IP -6 address add 2001:db8:2::1/64 dev dummy0
David Ahern10566912018-02-13 08:37:34 -0800395 set +e
Ido Schimmel82e45b62018-01-07 12:45:18 +0200396
David Ahern10566912018-02-13 08:37:34 -0800397 echo " Second address added with carrier down"
David Ahern171a4872018-03-13 08:29:39 -0700398 $IP route get fibmatch 192.0.2.2 &> /dev/null
David Ahern10566912018-02-13 08:37:34 -0800399 log_test $? 0 "IPv4 fibmatch"
David Ahern171a4872018-03-13 08:29:39 -0700400 $IP -6 route get fibmatch 2001:db8:2::2 &> /dev/null
David Ahern10566912018-02-13 08:37:34 -0800401 log_test $? 0 "IPv6 fibmatch"
Ido Schimmel82e45b62018-01-07 12:45:18 +0200402
David Ahern171a4872018-03-13 08:29:39 -0700403 $IP route get fibmatch 192.0.2.2 | \
Ido Schimmel82e45b62018-01-07 12:45:18 +0200404 grep -q "linkdown"
David Ahern10566912018-02-13 08:37:34 -0800405 log_test $? 0 "IPv4 linkdown flag set"
David Ahern171a4872018-03-13 08:29:39 -0700406 $IP -6 route get fibmatch 2001:db8:2::2 | \
Ido Schimmel82e45b62018-01-07 12:45:18 +0200407 grep -q "linkdown"
David Ahern10566912018-02-13 08:37:34 -0800408 log_test $? 0 "IPv6 linkdown flag set"
Ido Schimmel82e45b62018-01-07 12:45:18 +0200409
David Ahernee395a52018-02-13 08:37:35 -0800410 cleanup
Ido Schimmel82e45b62018-01-07 12:45:18 +0200411}
412
413fib_carrier_test()
414{
Ido Schimmel82e45b62018-01-07 12:45:18 +0200415 fib_carrier_local_test
416 fib_carrier_unicast_test
417}
418
David Ahern654d3a72018-03-13 08:29:41 -0700419################################################################################
420# Tests on nexthop spec
421
422# run 'ip route add' with given spec
423add_rt()
424{
425 local desc="$1"
426 local erc=$2
427 local vrf=$3
428 local pfx=$4
429 local gw=$5
430 local dev=$6
431 local cmd out rc
432
433 [ "$vrf" = "-" ] && vrf="default"
434 [ -n "$gw" ] && gw="via $gw"
435 [ -n "$dev" ] && dev="dev $dev"
436
437 cmd="$IP route add vrf $vrf $pfx $gw $dev"
438 if [ "$VERBOSE" = "1" ]; then
439 printf "\n COMMAND: $cmd\n"
440 fi
441
442 out=$(eval $cmd 2>&1)
443 rc=$?
444 if [ "$VERBOSE" = "1" -a -n "$out" ]; then
445 echo " $out"
446 fi
447 log_test $rc $erc "$desc"
448}
449
450fib4_nexthop()
451{
452 echo
453 echo "IPv4 nexthop tests"
454
455 echo "<<< write me >>>"
456}
457
458fib6_nexthop()
459{
460 local lldummy=$(get_linklocal dummy0)
461 local llv1=$(get_linklocal dummy0)
462
463 if [ -z "$lldummy" ]; then
464 echo "Failed to get linklocal address for dummy0"
465 return 1
466 fi
467 if [ -z "$llv1" ]; then
468 echo "Failed to get linklocal address for veth1"
469 return 1
470 fi
471
472 echo
473 echo "IPv6 nexthop tests"
474
475 add_rt "Directly connected nexthop, unicast address" 0 \
476 - 2001:db8:101::/64 2001:db8:1::2
477 add_rt "Directly connected nexthop, unicast address with device" 0 \
478 - 2001:db8:102::/64 2001:db8:1::2 "dummy0"
479 add_rt "Gateway is linklocal address" 0 \
480 - 2001:db8:103::1/64 $llv1 "veth0"
481
482 # fails because LL address requires a device
483 add_rt "Gateway is linklocal address, no device" 2 \
484 - 2001:db8:104::1/64 $llv1
485
486 # local address can not be a gateway
487 add_rt "Gateway can not be local unicast address" 2 \
488 - 2001:db8:105::/64 2001:db8:1::1
489 add_rt "Gateway can not be local unicast address, with device" 2 \
490 - 2001:db8:106::/64 2001:db8:1::1 "dummy0"
491 add_rt "Gateway can not be a local linklocal address" 2 \
492 - 2001:db8:107::1/64 $lldummy "dummy0"
493
494 # VRF tests
495 add_rt "Gateway can be local address in a VRF" 0 \
496 - 2001:db8:108::/64 2001:db8:51::2
497 add_rt "Gateway can be local address in a VRF, with device" 0 \
498 - 2001:db8:109::/64 2001:db8:51::2 "veth0"
499 add_rt "Gateway can be local linklocal address in a VRF" 0 \
500 - 2001:db8:110::1/64 $llv1 "veth0"
501
502 add_rt "Redirect to VRF lookup" 0 \
503 - 2001:db8:111::/64 "" "red"
504
505 add_rt "VRF route, gateway can be local address in default VRF" 0 \
506 red 2001:db8:112::/64 2001:db8:51::1
507
508 # local address in same VRF fails
509 add_rt "VRF route, gateway can not be a local address" 2 \
510 red 2001:db8:113::1/64 2001:db8:2::1
511 add_rt "VRF route, gateway can not be a local addr with device" 2 \
512 red 2001:db8:114::1/64 2001:db8:2::1 "dummy1"
513}
514
515# Default VRF:
516# dummy0 - 198.51.100.1/24 2001:db8:1::1/64
517# veth0 - 192.0.2.1/24 2001:db8:51::1/64
518#
519# VRF red:
520# dummy1 - 192.168.2.1/24 2001:db8:2::1/64
521# veth1 - 192.0.2.2/24 2001:db8:51::2/64
522#
523# [ dummy0 veth0 ]--[ veth1 dummy1 ]
524
525fib_nexthop_test()
526{
527 setup
528
529 set -e
530
531 $IP -4 rule add pref 32765 table local
532 $IP -4 rule del pref 0
533 $IP -6 rule add pref 32765 table local
534 $IP -6 rule del pref 0
535
536 $IP link add red type vrf table 1
537 $IP link set red up
538 $IP -4 route add vrf red unreachable default metric 4278198272
539 $IP -6 route add vrf red unreachable default metric 4278198272
540
541 $IP link add veth0 type veth peer name veth1
542 $IP link set dev veth0 up
543 $IP address add 192.0.2.1/24 dev veth0
544 $IP -6 address add 2001:db8:51::1/64 dev veth0
545
546 $IP link set dev veth1 vrf red up
547 $IP address add 192.0.2.2/24 dev veth1
548 $IP -6 address add 2001:db8:51::2/64 dev veth1
549
550 $IP link add dummy1 type dummy
551 $IP link set dev dummy1 vrf red up
552 $IP address add 192.168.2.1/24 dev dummy1
553 $IP -6 address add 2001:db8:2::1/64 dev dummy1
554 set +e
555
556 sleep 1
557 fib4_nexthop
558 fib6_nexthop
559
560 (
561 $IP link del dev dummy1
562 $IP link del veth0
563 $IP link del red
564 ) 2>/dev/null
565 cleanup
566}
567
568################################################################################
David Ahern1c7447b2018-05-21 10:26:55 -0700569# usage
David Ahern654d3a72018-03-13 08:29:41 -0700570
David Ahern1c7447b2018-05-21 10:26:55 -0700571usage()
Ido Schimmel607bd2e2018-01-07 12:45:16 +0200572{
David Ahern1c7447b2018-05-21 10:26:55 -0700573 cat <<EOF
574usage: ${0##*/} OPTS
575
576 -t <test> Test(s) to run (default: all)
577 (options: $TESTS)
578 -p Pause on fail
579 -v verbose mode (show commands and output)
580EOF
Ido Schimmel607bd2e2018-01-07 12:45:16 +0200581}
582
David Ahern1c7447b2018-05-21 10:26:55 -0700583################################################################################
584# main
585
586while getopts :t:pPhv o
587do
588 case $o in
589 t) TESTS=$OPTARG;;
590 p) PAUSE_ON_FAIL=yes;;
591 v) VERBOSE=$(($VERBOSE + 1));;
592 h) usage; exit 0;;
593 *) usage; exit 1;;
594 esac
595done
596
597PEER_CMD="ip netns exec ${PEER_NS}"
598
Ido Schimmel607bd2e2018-01-07 12:45:16 +0200599if [ "$(id -u)" -ne 0 ];then
600 echo "SKIP: Need root privileges"
601 exit 0
602fi
603
604if [ ! -x "$(command -v ip)" ]; then
605 echo "SKIP: Could not run test without ip tool"
606 exit 0
607fi
608
609ip route help 2>&1 | grep -q fibmatch
610if [ $? -ne 0 ]; then
611 echo "SKIP: iproute2 too old, missing fibmatch"
612 exit 0
613fi
614
David Ahernee395a52018-02-13 08:37:35 -0800615# start clean
616cleanup &> /dev/null
617
David Ahern1c7447b2018-05-21 10:26:55 -0700618for t in $TESTS
619do
620 case $t in
621 fib_unreg_test|unregister) fib_unreg_test;;
622 fib_down_test|down) fib_down_test;;
623 fib_carrier_test|carrier) fib_carrier_test;;
624 fib_nexthop_test|nexthop) fib_nexthop_test;;
625
626 help) echo "Test names: $TESTS"; exit 0;;
627 esac
628done
Ido Schimmel607bd2e2018-01-07 12:45:16 +0200629
David Ahern37ce42c2018-05-21 10:26:54 -0700630if [ "$TESTS" != "none" ]; then
631 printf "\nTests passed: %3d\n" ${nsuccess}
632 printf "Tests failed: %3d\n" ${nfail}
633fi
634
Ido Schimmel607bd2e2018-01-07 12:45:16 +0200635exit $ret