fib_nexthops.sh 69 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0
  3. #
  4. # ns: me | ns: peer | ns: remote
  5. # 2001:db8:91::1 | 2001:db8:91::2 |
  6. # 172.16.1.1 | 172.16.1.2 |
  7. # veth1 <---|---> veth2 |
  8. # | veth5 <--|--> veth6 172.16.101.1
  9. # veth3 <---|---> veth4 | 2001:db8:101::1
  10. # 172.16.2.1 | 172.16.2.2 |
  11. # 2001:db8:92::1 | 2001:db8:92::2 |
  12. #
  13. # This test is for checking IPv4 and IPv6 FIB behavior with nexthop
  14. # objects. Device reference counts and network namespace cleanup tested
  15. # by use of network namespace for peer.
  16. ret=0
  17. # Kselftest framework requirement - SKIP code is 4.
  18. ksft_skip=4
  19. # all tests in this script. Can be overridden with -t option
  20. IPV4_TESTS="
  21. ipv4_fcnal
  22. ipv4_grp_fcnal
  23. ipv4_res_grp_fcnal
  24. ipv4_withv6_fcnal
  25. ipv4_fcnal_runtime
  26. ipv4_large_grp
  27. ipv4_large_res_grp
  28. ipv4_compat_mode
  29. ipv4_fdb_grp_fcnal
  30. ipv4_torture
  31. ipv4_res_torture
  32. "
  33. IPV6_TESTS="
  34. ipv6_fcnal
  35. ipv6_grp_fcnal
  36. ipv6_res_grp_fcnal
  37. ipv6_fcnal_runtime
  38. ipv6_large_grp
  39. ipv6_large_res_grp
  40. ipv6_compat_mode
  41. ipv6_fdb_grp_fcnal
  42. ipv6_torture
  43. ipv6_res_torture
  44. "
  45. ALL_TESTS="
  46. basic
  47. basic_res
  48. ${IPV4_TESTS}
  49. ${IPV6_TESTS}
  50. "
  51. TESTS="${ALL_TESTS}"
  52. VERBOSE=0
  53. PAUSE_ON_FAIL=no
  54. PAUSE=no
  55. PING_TIMEOUT=5
  56. nsid=100
  57. ################################################################################
  58. # utilities
  59. log_test()
  60. {
  61. local rc=$1
  62. local expected=$2
  63. local msg="$3"
  64. if [ ${rc} -eq ${expected} ]; then
  65. printf "TEST: %-60s [ OK ]\n" "${msg}"
  66. nsuccess=$((nsuccess+1))
  67. else
  68. ret=1
  69. nfail=$((nfail+1))
  70. printf "TEST: %-60s [FAIL]\n" "${msg}"
  71. if [ "$VERBOSE" = "1" ]; then
  72. echo " rc=$rc, expected $expected"
  73. fi
  74. if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
  75. echo
  76. echo "hit enter to continue, 'q' to quit"
  77. read a
  78. [ "$a" = "q" ] && exit 1
  79. fi
  80. fi
  81. if [ "${PAUSE}" = "yes" ]; then
  82. echo
  83. echo "hit enter to continue, 'q' to quit"
  84. read a
  85. [ "$a" = "q" ] && exit 1
  86. fi
  87. [ "$VERBOSE" = "1" ] && echo
  88. }
  89. run_cmd()
  90. {
  91. local cmd="$1"
  92. local out
  93. local stderr="2>/dev/null"
  94. if [ "$VERBOSE" = "1" ]; then
  95. printf "COMMAND: $cmd\n"
  96. stderr=
  97. fi
  98. out=$(eval $cmd $stderr)
  99. rc=$?
  100. if [ "$VERBOSE" = "1" -a -n "$out" ]; then
  101. echo " $out"
  102. fi
  103. return $rc
  104. }
  105. get_linklocal()
  106. {
  107. local dev=$1
  108. local ns
  109. local addr
  110. [ -n "$2" ] && ns="-netns $2"
  111. addr=$(ip $ns -6 -br addr show dev ${dev} | \
  112. awk '{
  113. for (i = 3; i <= NF; ++i) {
  114. if ($i ~ /^fe80/)
  115. print $i
  116. }
  117. }'
  118. )
  119. addr=${addr/\/*}
  120. [ -z "$addr" ] && return 1
  121. echo $addr
  122. return 0
  123. }
  124. create_ns()
  125. {
  126. local n=${1}
  127. ip netns del ${n} 2>/dev/null
  128. set -e
  129. ip netns add ${n}
  130. ip netns set ${n} $((nsid++))
  131. ip -netns ${n} addr add 127.0.0.1/8 dev lo
  132. ip -netns ${n} link set lo up
  133. ip netns exec ${n} sysctl -qw net.ipv4.ip_forward=1
  134. ip netns exec ${n} sysctl -qw net.ipv4.fib_multipath_use_neigh=1
  135. ip netns exec ${n} sysctl -qw net.ipv4.conf.default.ignore_routes_with_linkdown=1
  136. ip netns exec ${n} sysctl -qw net.ipv6.conf.all.keep_addr_on_down=1
  137. ip netns exec ${n} sysctl -qw net.ipv6.conf.all.forwarding=1
  138. ip netns exec ${n} sysctl -qw net.ipv6.conf.default.forwarding=1
  139. ip netns exec ${n} sysctl -qw net.ipv6.conf.default.ignore_routes_with_linkdown=1
  140. ip netns exec ${n} sysctl -qw net.ipv6.conf.all.accept_dad=0
  141. ip netns exec ${n} sysctl -qw net.ipv6.conf.default.accept_dad=0
  142. set +e
  143. }
  144. setup()
  145. {
  146. cleanup
  147. create_ns me
  148. create_ns peer
  149. create_ns remote
  150. IP="ip -netns me"
  151. BRIDGE="bridge -netns me"
  152. set -e
  153. $IP li add veth1 type veth peer name veth2
  154. $IP li set veth1 up
  155. $IP addr add 172.16.1.1/24 dev veth1
  156. $IP -6 addr add 2001:db8:91::1/64 dev veth1 nodad
  157. $IP li add veth3 type veth peer name veth4
  158. $IP li set veth3 up
  159. $IP addr add 172.16.2.1/24 dev veth3
  160. $IP -6 addr add 2001:db8:92::1/64 dev veth3 nodad
  161. $IP li set veth2 netns peer up
  162. ip -netns peer addr add 172.16.1.2/24 dev veth2
  163. ip -netns peer -6 addr add 2001:db8:91::2/64 dev veth2 nodad
  164. $IP li set veth4 netns peer up
  165. ip -netns peer addr add 172.16.2.2/24 dev veth4
  166. ip -netns peer -6 addr add 2001:db8:92::2/64 dev veth4 nodad
  167. ip -netns remote li add veth5 type veth peer name veth6
  168. ip -netns remote li set veth5 up
  169. ip -netns remote addr add dev veth5 172.16.101.1/24
  170. ip -netns remote -6 addr add dev veth5 2001:db8:101::1/64 nodad
  171. ip -netns remote ro add 172.16.0.0/22 via 172.16.101.2
  172. ip -netns remote -6 ro add 2001:db8:90::/40 via 2001:db8:101::2
  173. ip -netns remote li set veth6 netns peer up
  174. ip -netns peer addr add dev veth6 172.16.101.2/24
  175. ip -netns peer -6 addr add dev veth6 2001:db8:101::2/64 nodad
  176. set +e
  177. }
  178. cleanup()
  179. {
  180. local ns
  181. for ns in me peer remote; do
  182. ip netns del ${ns} 2>/dev/null
  183. done
  184. }
  185. check_output()
  186. {
  187. local out="$1"
  188. local expected="$2"
  189. local rc=0
  190. [ "${out}" = "${expected}" ] && return 0
  191. if [ -z "${out}" ]; then
  192. if [ "$VERBOSE" = "1" ]; then
  193. printf "\nNo entry found\n"
  194. printf "Expected:\n"
  195. printf " ${expected}\n"
  196. fi
  197. return 1
  198. fi
  199. out=$(echo ${out})
  200. if [ "${out}" != "${expected}" ]; then
  201. rc=1
  202. if [ "${VERBOSE}" = "1" ]; then
  203. printf " Unexpected entry. Have:\n"
  204. printf " ${out}\n"
  205. printf " Expected:\n"
  206. printf " ${expected}\n\n"
  207. else
  208. echo " WARNING: Unexpected route entry"
  209. fi
  210. fi
  211. return $rc
  212. }
  213. check_nexthop()
  214. {
  215. local nharg="$1"
  216. local expected="$2"
  217. local out
  218. out=$($IP nexthop ls ${nharg} 2>/dev/null)
  219. check_output "${out}" "${expected}"
  220. }
  221. check_nexthop_bucket()
  222. {
  223. local nharg="$1"
  224. local expected="$2"
  225. local out
  226. # remove the idle time since we cannot match it
  227. out=$($IP nexthop bucket ${nharg} \
  228. | sed s/idle_time\ [0-9.]*\ // 2>/dev/null)
  229. check_output "${out}" "${expected}"
  230. }
  231. check_route()
  232. {
  233. local pfx="$1"
  234. local expected="$2"
  235. local out
  236. out=$($IP route ls match ${pfx} 2>/dev/null)
  237. check_output "${out}" "${expected}"
  238. }
  239. check_route6()
  240. {
  241. local pfx="$1"
  242. local expected="$2"
  243. local out
  244. out=$($IP -6 route ls match ${pfx} 2>/dev/null | sed -e 's/pref medium//')
  245. check_output "${out}" "${expected}"
  246. }
  247. check_large_grp()
  248. {
  249. local ipv=$1
  250. local ecmp=$2
  251. local grpnum=100
  252. local nhidstart=100
  253. local grpidstart=1000
  254. local iter=0
  255. local nhidstr=""
  256. local grpidstr=""
  257. local grpstr=""
  258. local ipstr=""
  259. if [ $ipv -eq 4 ]; then
  260. ipstr="172.16.1."
  261. else
  262. ipstr="2001:db8:91::"
  263. fi
  264. #
  265. # Create $grpnum groups with specified $ecmp and dump them
  266. #
  267. # create nexthops with different gateways
  268. iter=2
  269. while [ $iter -le $(($ecmp + 1)) ]
  270. do
  271. nhidstr="$(($nhidstart + $iter))"
  272. run_cmd "$IP nexthop add id $nhidstr via $ipstr$iter dev veth1"
  273. check_nexthop "id $nhidstr" "id $nhidstr via $ipstr$iter dev veth1 scope link"
  274. if [ $iter -le $ecmp ]; then
  275. grpstr+="$nhidstr/"
  276. else
  277. grpstr+="$nhidstr"
  278. fi
  279. ((iter++))
  280. done
  281. # create duplicate large ecmp groups
  282. iter=0
  283. while [ $iter -le $grpnum ]
  284. do
  285. grpidstr="$(($grpidstart + $iter))"
  286. run_cmd "$IP nexthop add id $grpidstr group $grpstr"
  287. check_nexthop "id $grpidstr" "id $grpidstr group $grpstr"
  288. ((iter++))
  289. done
  290. # dump large groups
  291. run_cmd "$IP nexthop list"
  292. log_test $? 0 "Dump large (x$ecmp) ecmp groups"
  293. }
  294. check_large_res_grp()
  295. {
  296. local ipv=$1
  297. local buckets=$2
  298. local ipstr=""
  299. if [ $ipv -eq 4 ]; then
  300. ipstr="172.16.1.2"
  301. else
  302. ipstr="2001:db8:91::2"
  303. fi
  304. # create a resilient group with $buckets buckets and dump them
  305. run_cmd "$IP nexthop add id 100 via $ipstr dev veth1"
  306. run_cmd "$IP nexthop add id 1000 group 100 type resilient buckets $buckets"
  307. run_cmd "$IP nexthop bucket list"
  308. log_test $? 0 "Dump large (x$buckets) nexthop buckets"
  309. }
  310. start_ip_monitor()
  311. {
  312. local mtype=$1
  313. # start the monitor in the background
  314. tmpfile=`mktemp /var/run/nexthoptestXXX`
  315. mpid=`($IP monitor $mtype > $tmpfile & echo $!) 2>/dev/null`
  316. sleep 0.2
  317. echo "$mpid $tmpfile"
  318. }
  319. stop_ip_monitor()
  320. {
  321. local mpid=$1
  322. local tmpfile=$2
  323. local el=$3
  324. # check the monitor results
  325. kill $mpid
  326. lines=`wc -l $tmpfile | cut "-d " -f1`
  327. test $lines -eq $el
  328. rc=$?
  329. rm -rf $tmpfile
  330. return $rc
  331. }
  332. check_nexthop_fdb_support()
  333. {
  334. $IP nexthop help 2>&1 | grep -q fdb
  335. if [ $? -ne 0 ]; then
  336. echo "SKIP: iproute2 too old, missing fdb nexthop support"
  337. return $ksft_skip
  338. fi
  339. }
  340. check_nexthop_res_support()
  341. {
  342. $IP nexthop help 2>&1 | grep -q resilient
  343. if [ $? -ne 0 ]; then
  344. echo "SKIP: iproute2 too old, missing resilient nexthop group support"
  345. return $ksft_skip
  346. fi
  347. }
  348. ipv6_fdb_grp_fcnal()
  349. {
  350. local rc
  351. echo
  352. echo "IPv6 fdb groups functional"
  353. echo "--------------------------"
  354. check_nexthop_fdb_support
  355. if [ $? -eq $ksft_skip ]; then
  356. return $ksft_skip
  357. fi
  358. # create group with multiple nexthops
  359. run_cmd "$IP nexthop add id 61 via 2001:db8:91::2 fdb"
  360. run_cmd "$IP nexthop add id 62 via 2001:db8:91::3 fdb"
  361. run_cmd "$IP nexthop add id 102 group 61/62 fdb"
  362. check_nexthop "id 102" "id 102 group 61/62 fdb"
  363. log_test $? 0 "Fdb Nexthop group with multiple nexthops"
  364. ## get nexthop group
  365. run_cmd "$IP nexthop get id 102"
  366. check_nexthop "id 102" "id 102 group 61/62 fdb"
  367. log_test $? 0 "Get Fdb nexthop group by id"
  368. # fdb nexthop group can only contain fdb nexthops
  369. run_cmd "$IP nexthop add id 63 via 2001:db8:91::4"
  370. run_cmd "$IP nexthop add id 64 via 2001:db8:91::5"
  371. run_cmd "$IP nexthop add id 103 group 63/64 fdb"
  372. log_test $? 2 "Fdb Nexthop group with non-fdb nexthops"
  373. # Non fdb nexthop group can not contain fdb nexthops
  374. run_cmd "$IP nexthop add id 65 via 2001:db8:91::5 fdb"
  375. run_cmd "$IP nexthop add id 66 via 2001:db8:91::6 fdb"
  376. run_cmd "$IP nexthop add id 104 group 65/66"
  377. log_test $? 2 "Non-Fdb Nexthop group with fdb nexthops"
  378. # fdb nexthop cannot have blackhole
  379. run_cmd "$IP nexthop add id 67 blackhole fdb"
  380. log_test $? 2 "Fdb Nexthop with blackhole"
  381. # fdb nexthop with oif
  382. run_cmd "$IP nexthop add id 68 via 2001:db8:91::7 dev veth1 fdb"
  383. log_test $? 2 "Fdb Nexthop with oif"
  384. # fdb nexthop with onlink
  385. run_cmd "$IP nexthop add id 68 via 2001:db8:91::7 onlink fdb"
  386. log_test $? 2 "Fdb Nexthop with onlink"
  387. # fdb nexthop with encap
  388. run_cmd "$IP nexthop add id 69 encap mpls 101 via 2001:db8:91::8 dev veth1 fdb"
  389. log_test $? 2 "Fdb Nexthop with encap"
  390. run_cmd "$IP link add name vx10 type vxlan id 1010 local 2001:db8:91::9 remote 2001:db8:91::10 dstport 4789 nolearning noudpcsum tos inherit ttl 100"
  391. run_cmd "$BRIDGE fdb add 02:02:00:00:00:13 dev vx10 nhid 102 self"
  392. log_test $? 0 "Fdb mac add with nexthop group"
  393. ## fdb nexthops can only reference nexthop groups and not nexthops
  394. run_cmd "$BRIDGE fdb add 02:02:00:00:00:14 dev vx10 nhid 61 self"
  395. log_test $? 255 "Fdb mac add with nexthop"
  396. run_cmd "$IP -6 ro add 2001:db8:101::1/128 nhid 66"
  397. log_test $? 2 "Route add with fdb nexthop"
  398. run_cmd "$IP -6 ro add 2001:db8:101::1/128 nhid 103"
  399. log_test $? 2 "Route add with fdb nexthop group"
  400. run_cmd "$IP nexthop del id 61"
  401. run_cmd "$BRIDGE fdb get to 02:02:00:00:00:13 dev vx10 self"
  402. log_test $? 0 "Fdb entry after deleting a single nexthop"
  403. run_cmd "$IP nexthop del id 102"
  404. log_test $? 0 "Fdb nexthop delete"
  405. run_cmd "$BRIDGE fdb get to 02:02:00:00:00:13 dev vx10 self"
  406. log_test $? 254 "Fdb entry after deleting a nexthop group"
  407. $IP link del dev vx10
  408. }
  409. ipv4_fdb_grp_fcnal()
  410. {
  411. local rc
  412. echo
  413. echo "IPv4 fdb groups functional"
  414. echo "--------------------------"
  415. check_nexthop_fdb_support
  416. if [ $? -eq $ksft_skip ]; then
  417. return $ksft_skip
  418. fi
  419. # create group with multiple nexthops
  420. run_cmd "$IP nexthop add id 12 via 172.16.1.2 fdb"
  421. run_cmd "$IP nexthop add id 13 via 172.16.1.3 fdb"
  422. run_cmd "$IP nexthop add id 102 group 12/13 fdb"
  423. check_nexthop "id 102" "id 102 group 12/13 fdb"
  424. log_test $? 0 "Fdb Nexthop group with multiple nexthops"
  425. # get nexthop group
  426. run_cmd "$IP nexthop get id 102"
  427. check_nexthop "id 102" "id 102 group 12/13 fdb"
  428. log_test $? 0 "Get Fdb nexthop group by id"
  429. # fdb nexthop group can only contain fdb nexthops
  430. run_cmd "$IP nexthop add id 14 via 172.16.1.2"
  431. run_cmd "$IP nexthop add id 15 via 172.16.1.3"
  432. run_cmd "$IP nexthop add id 103 group 14/15 fdb"
  433. log_test $? 2 "Fdb Nexthop group with non-fdb nexthops"
  434. # Non fdb nexthop group can not contain fdb nexthops
  435. run_cmd "$IP nexthop add id 16 via 172.16.1.2 fdb"
  436. run_cmd "$IP nexthop add id 17 via 172.16.1.3 fdb"
  437. run_cmd "$IP nexthop add id 104 group 14/15"
  438. log_test $? 2 "Non-Fdb Nexthop group with fdb nexthops"
  439. # fdb nexthop cannot have blackhole
  440. run_cmd "$IP nexthop add id 18 blackhole fdb"
  441. log_test $? 2 "Fdb Nexthop with blackhole"
  442. # fdb nexthop with oif
  443. run_cmd "$IP nexthop add id 16 via 172.16.1.2 dev veth1 fdb"
  444. log_test $? 2 "Fdb Nexthop with oif"
  445. # fdb nexthop with onlink
  446. run_cmd "$IP nexthop add id 16 via 172.16.1.2 onlink fdb"
  447. log_test $? 2 "Fdb Nexthop with onlink"
  448. # fdb nexthop with encap
  449. run_cmd "$IP nexthop add id 17 encap mpls 101 via 172.16.1.2 dev veth1 fdb"
  450. log_test $? 2 "Fdb Nexthop with encap"
  451. run_cmd "$IP link add name vx10 type vxlan id 1010 local 10.0.0.1 remote 10.0.0.2 dstport 4789 nolearning noudpcsum tos inherit ttl 100"
  452. run_cmd "$BRIDGE fdb add 02:02:00:00:00:13 dev vx10 nhid 102 self"
  453. log_test $? 0 "Fdb mac add with nexthop group"
  454. # fdb nexthops can only reference nexthop groups and not nexthops
  455. run_cmd "$BRIDGE fdb add 02:02:00:00:00:14 dev vx10 nhid 12 self"
  456. log_test $? 255 "Fdb mac add with nexthop"
  457. run_cmd "$IP ro add 172.16.0.0/22 nhid 15"
  458. log_test $? 2 "Route add with fdb nexthop"
  459. run_cmd "$IP ro add 172.16.0.0/22 nhid 103"
  460. log_test $? 2 "Route add with fdb nexthop group"
  461. run_cmd "$IP nexthop del id 12"
  462. run_cmd "$BRIDGE fdb get to 02:02:00:00:00:13 dev vx10 self"
  463. log_test $? 0 "Fdb entry after deleting a single nexthop"
  464. run_cmd "$IP nexthop del id 102"
  465. log_test $? 0 "Fdb nexthop delete"
  466. run_cmd "$BRIDGE fdb get to 02:02:00:00:00:13 dev vx10 self"
  467. log_test $? 254 "Fdb entry after deleting a nexthop group"
  468. $IP link del dev vx10
  469. }
  470. ################################################################################
  471. # basic operations (add, delete, replace) on nexthops and nexthop groups
  472. #
  473. # IPv6
  474. ipv6_fcnal()
  475. {
  476. local rc
  477. echo
  478. echo "IPv6"
  479. echo "----------------------"
  480. run_cmd "$IP nexthop add id 52 via 2001:db8:91::2 dev veth1"
  481. rc=$?
  482. log_test $rc 0 "Create nexthop with id, gw, dev"
  483. if [ $rc -ne 0 ]; then
  484. echo "Basic IPv6 create fails; can not continue"
  485. return 1
  486. fi
  487. run_cmd "$IP nexthop get id 52"
  488. log_test $? 0 "Get nexthop by id"
  489. check_nexthop "id 52" "id 52 via 2001:db8:91::2 dev veth1 scope link"
  490. run_cmd "$IP nexthop del id 52"
  491. log_test $? 0 "Delete nexthop by id"
  492. check_nexthop "id 52" ""
  493. #
  494. # gw, device spec
  495. #
  496. # gw validation, no device - fails since dev required
  497. run_cmd "$IP nexthop add id 52 via 2001:db8:92::3"
  498. log_test $? 2 "Create nexthop - gw only"
  499. # gw is not reachable throught given dev
  500. run_cmd "$IP nexthop add id 53 via 2001:db8:3::3 dev veth1"
  501. log_test $? 2 "Create nexthop - invalid gw+dev combination"
  502. # onlink arg overrides gw+dev lookup
  503. run_cmd "$IP nexthop add id 53 via 2001:db8:3::3 dev veth1 onlink"
  504. log_test $? 0 "Create nexthop - gw+dev and onlink"
  505. # admin down should delete nexthops
  506. set -e
  507. run_cmd "$IP -6 nexthop add id 55 via 2001:db8:91::3 dev veth1"
  508. run_cmd "$IP nexthop add id 56 via 2001:db8:91::4 dev veth1"
  509. run_cmd "$IP nexthop add id 57 via 2001:db8:91::5 dev veth1"
  510. run_cmd "$IP li set dev veth1 down"
  511. set +e
  512. check_nexthop "dev veth1" ""
  513. log_test $? 0 "Nexthops removed on admin down"
  514. }
  515. ipv6_grp_refs()
  516. {
  517. if [ ! -x "$(command -v mausezahn)" ]; then
  518. echo "SKIP: Could not run test; need mausezahn tool"
  519. return
  520. fi
  521. run_cmd "$IP link set dev veth1 up"
  522. run_cmd "$IP link add veth1.10 link veth1 up type vlan id 10"
  523. run_cmd "$IP link add veth1.20 link veth1 up type vlan id 20"
  524. run_cmd "$IP -6 addr add 2001:db8:91::1/64 dev veth1.10"
  525. run_cmd "$IP -6 addr add 2001:db8:92::1/64 dev veth1.20"
  526. run_cmd "$IP -6 neigh add 2001:db8:91::2 lladdr 00:11:22:33:44:55 dev veth1.10"
  527. run_cmd "$IP -6 neigh add 2001:db8:92::2 lladdr 00:11:22:33:44:55 dev veth1.20"
  528. run_cmd "$IP nexthop add id 100 via 2001:db8:91::2 dev veth1.10"
  529. run_cmd "$IP nexthop add id 101 via 2001:db8:92::2 dev veth1.20"
  530. run_cmd "$IP nexthop add id 102 group 100"
  531. run_cmd "$IP route add 2001:db8:101::1/128 nhid 102"
  532. # create per-cpu dsts through nh 100
  533. run_cmd "ip netns exec me mausezahn -6 veth1.10 -B 2001:db8:101::1 -A 2001:db8:91::1 -c 5 -t tcp "dp=1-1023, flags=syn" >/dev/null 2>&1"
  534. # remove nh 100 from the group to delete the route potentially leaving
  535. # a stale per-cpu dst which holds a reference to the nexthop's net
  536. # device and to the IPv6 route
  537. run_cmd "$IP nexthop replace id 102 group 101"
  538. run_cmd "$IP route del 2001:db8:101::1/128"
  539. # add both nexthops to the group so a reference is taken on them
  540. run_cmd "$IP nexthop replace id 102 group 100/101"
  541. # if the bug described in commit "net: nexthop: release IPv6 per-cpu
  542. # dsts when replacing a nexthop group" exists at this point we have
  543. # an unlinked IPv6 route (but not freed due to stale dst) with a
  544. # reference over the group so we delete the group which will again
  545. # only unlink it due to the route reference
  546. run_cmd "$IP nexthop del id 102"
  547. # delete the nexthop with stale dst, since we have an unlinked
  548. # group with a ref to it and an unlinked IPv6 route with ref to the
  549. # group, the nh will only be unlinked and not freed so the stale dst
  550. # remains forever and we get a net device refcount imbalance
  551. run_cmd "$IP nexthop del id 100"
  552. # if a reference was lost this command will hang because the net device
  553. # cannot be removed
  554. timeout -s KILL 5 ip netns exec me ip link del veth1.10 >/dev/null 2>&1
  555. # we can't cleanup if the command is hung trying to delete the netdev
  556. if [ $? -eq 137 ]; then
  557. return 1
  558. fi
  559. # cleanup
  560. run_cmd "$IP link del veth1.20"
  561. run_cmd "$IP nexthop flush"
  562. return 0
  563. }
  564. ipv6_grp_fcnal()
  565. {
  566. local rc
  567. echo
  568. echo "IPv6 groups functional"
  569. echo "----------------------"
  570. # basic functionality: create a nexthop group, default weight
  571. run_cmd "$IP nexthop add id 61 via 2001:db8:91::2 dev veth1"
  572. run_cmd "$IP nexthop add id 101 group 61"
  573. log_test $? 0 "Create nexthop group with single nexthop"
  574. # get nexthop group
  575. run_cmd "$IP nexthop get id 101"
  576. log_test $? 0 "Get nexthop group by id"
  577. check_nexthop "id 101" "id 101 group 61"
  578. # delete nexthop group
  579. run_cmd "$IP nexthop del id 101"
  580. log_test $? 0 "Delete nexthop group by id"
  581. check_nexthop "id 101" ""
  582. $IP nexthop flush >/dev/null 2>&1
  583. check_nexthop "id 101" ""
  584. #
  585. # create group with multiple nexthops - mix of gw and dev only
  586. #
  587. run_cmd "$IP nexthop add id 62 via 2001:db8:91::2 dev veth1"
  588. run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1"
  589. run_cmd "$IP nexthop add id 64 via 2001:db8:91::4 dev veth1"
  590. run_cmd "$IP nexthop add id 65 dev veth1"
  591. run_cmd "$IP nexthop add id 102 group 62/63/64/65"
  592. log_test $? 0 "Nexthop group with multiple nexthops"
  593. check_nexthop "id 102" "id 102 group 62/63/64/65"
  594. # Delete nexthop in a group and group is updated
  595. run_cmd "$IP nexthop del id 63"
  596. check_nexthop "id 102" "id 102 group 62/64/65"
  597. log_test $? 0 "Nexthop group updated when entry is deleted"
  598. # create group with multiple weighted nexthops
  599. run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1"
  600. run_cmd "$IP nexthop add id 103 group 62/63,2/64,3/65,4"
  601. log_test $? 0 "Nexthop group with weighted nexthops"
  602. check_nexthop "id 103" "id 103 group 62/63,2/64,3/65,4"
  603. # Delete nexthop in a weighted group and group is updated
  604. run_cmd "$IP nexthop del id 63"
  605. check_nexthop "id 103" "id 103 group 62/64,3/65,4"
  606. log_test $? 0 "Weighted nexthop group updated when entry is deleted"
  607. # admin down - nexthop is removed from group
  608. run_cmd "$IP li set dev veth1 down"
  609. check_nexthop "dev veth1" ""
  610. log_test $? 0 "Nexthops in groups removed on admin down"
  611. # expect groups to have been deleted as well
  612. check_nexthop "" ""
  613. run_cmd "$IP li set dev veth1 up"
  614. $IP nexthop flush >/dev/null 2>&1
  615. # group with nexthops using different devices
  616. set -e
  617. run_cmd "$IP nexthop add id 62 via 2001:db8:91::2 dev veth1"
  618. run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1"
  619. run_cmd "$IP nexthop add id 64 via 2001:db8:91::4 dev veth1"
  620. run_cmd "$IP nexthop add id 65 via 2001:db8:91::5 dev veth1"
  621. run_cmd "$IP nexthop add id 72 via 2001:db8:92::2 dev veth3"
  622. run_cmd "$IP nexthop add id 73 via 2001:db8:92::3 dev veth3"
  623. run_cmd "$IP nexthop add id 74 via 2001:db8:92::4 dev veth3"
  624. run_cmd "$IP nexthop add id 75 via 2001:db8:92::5 dev veth3"
  625. set +e
  626. # multiple groups with same nexthop
  627. run_cmd "$IP nexthop add id 104 group 62"
  628. run_cmd "$IP nexthop add id 105 group 62"
  629. check_nexthop "group" "id 104 group 62 id 105 group 62"
  630. log_test $? 0 "Multiple groups with same nexthop"
  631. run_cmd "$IP nexthop flush groups"
  632. [ $? -ne 0 ] && return 1
  633. # on admin down of veth1, it should be removed from the group
  634. run_cmd "$IP nexthop add id 105 group 62/63/72/73/64"
  635. run_cmd "$IP li set veth1 down"
  636. check_nexthop "id 105" "id 105 group 72/73"
  637. log_test $? 0 "Nexthops in group removed on admin down - mixed group"
  638. run_cmd "$IP nexthop add id 106 group 105/74"
  639. log_test $? 2 "Nexthop group can not have a group as an entry"
  640. # a group can have a blackhole entry only if it is the only
  641. # nexthop in the group. Needed for atomic replace with an
  642. # actual nexthop group
  643. run_cmd "$IP -6 nexthop add id 31 blackhole"
  644. run_cmd "$IP nexthop add id 107 group 31"
  645. log_test $? 0 "Nexthop group with a blackhole entry"
  646. run_cmd "$IP nexthop add id 108 group 31/24"
  647. log_test $? 2 "Nexthop group can not have a blackhole and another nexthop"
  648. ipv6_grp_refs
  649. log_test $? 0 "Nexthop group replace refcounts"
  650. }
  651. ipv6_res_grp_fcnal()
  652. {
  653. local rc
  654. echo
  655. echo "IPv6 resilient groups functional"
  656. echo "--------------------------------"
  657. check_nexthop_res_support
  658. if [ $? -eq $ksft_skip ]; then
  659. return $ksft_skip
  660. fi
  661. #
  662. # migration of nexthop buckets - equal weights
  663. #
  664. run_cmd "$IP nexthop add id 62 via 2001:db8:91::2 dev veth1"
  665. run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1"
  666. run_cmd "$IP nexthop add id 102 group 62/63 type resilient buckets 2 idle_timer 0"
  667. run_cmd "$IP nexthop del id 63"
  668. check_nexthop "id 102" \
  669. "id 102 group 62 type resilient buckets 2 idle_timer 0 unbalanced_timer 0 unbalanced_time 0"
  670. log_test $? 0 "Nexthop group updated when entry is deleted"
  671. check_nexthop_bucket "list id 102" \
  672. "id 102 index 0 nhid 62 id 102 index 1 nhid 62"
  673. log_test $? 0 "Nexthop buckets updated when entry is deleted"
  674. run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1"
  675. run_cmd "$IP nexthop replace id 102 group 62/63 type resilient buckets 2 idle_timer 0"
  676. check_nexthop "id 102" \
  677. "id 102 group 62/63 type resilient buckets 2 idle_timer 0 unbalanced_timer 0 unbalanced_time 0"
  678. log_test $? 0 "Nexthop group updated after replace"
  679. check_nexthop_bucket "list id 102" \
  680. "id 102 index 0 nhid 63 id 102 index 1 nhid 62"
  681. log_test $? 0 "Nexthop buckets updated after replace"
  682. $IP nexthop flush >/dev/null 2>&1
  683. #
  684. # migration of nexthop buckets - unequal weights
  685. #
  686. run_cmd "$IP nexthop add id 62 via 2001:db8:91::2 dev veth1"
  687. run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1"
  688. run_cmd "$IP nexthop add id 102 group 62,3/63,1 type resilient buckets 4 idle_timer 0"
  689. run_cmd "$IP nexthop del id 63"
  690. check_nexthop "id 102" \
  691. "id 102 group 62,3 type resilient buckets 4 idle_timer 0 unbalanced_timer 0 unbalanced_time 0"
  692. log_test $? 0 "Nexthop group updated when entry is deleted - nECMP"
  693. check_nexthop_bucket "list id 102" \
  694. "id 102 index 0 nhid 62 id 102 index 1 nhid 62 id 102 index 2 nhid 62 id 102 index 3 nhid 62"
  695. log_test $? 0 "Nexthop buckets updated when entry is deleted - nECMP"
  696. run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1"
  697. run_cmd "$IP nexthop replace id 102 group 62,3/63,1 type resilient buckets 4 idle_timer 0"
  698. check_nexthop "id 102" \
  699. "id 102 group 62,3/63 type resilient buckets 4 idle_timer 0 unbalanced_timer 0 unbalanced_time 0"
  700. log_test $? 0 "Nexthop group updated after replace - nECMP"
  701. check_nexthop_bucket "list id 102" \
  702. "id 102 index 0 nhid 63 id 102 index 1 nhid 62 id 102 index 2 nhid 62 id 102 index 3 nhid 62"
  703. log_test $? 0 "Nexthop buckets updated after replace - nECMP"
  704. }
  705. ipv6_fcnal_runtime()
  706. {
  707. local rc
  708. echo
  709. echo "IPv6 functional runtime"
  710. echo "-----------------------"
  711. #
  712. # IPv6 - the basics
  713. #
  714. run_cmd "$IP nexthop add id 81 via 2001:db8:91::2 dev veth1"
  715. run_cmd "$IP ro add 2001:db8:101::1/128 nhid 81"
  716. log_test $? 0 "Route add"
  717. run_cmd "$IP ro delete 2001:db8:101::1/128 nhid 81"
  718. log_test $? 0 "Route delete"
  719. run_cmd "$IP ro add 2001:db8:101::1/128 nhid 81"
  720. run_cmd "ip netns exec me ping -c1 -w$PING_TIMEOUT 2001:db8:101::1"
  721. log_test $? 0 "Ping with nexthop"
  722. run_cmd "$IP nexthop add id 82 via 2001:db8:92::2 dev veth3"
  723. run_cmd "$IP nexthop add id 122 group 81/82"
  724. run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 122"
  725. run_cmd "ip netns exec me ping -c1 -w$PING_TIMEOUT 2001:db8:101::1"
  726. log_test $? 0 "Ping - multipath"
  727. #
  728. # IPv6 with blackhole nexthops
  729. #
  730. run_cmd "$IP -6 nexthop add id 83 blackhole"
  731. run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 83"
  732. run_cmd "ip netns exec me ping -c1 -w$PING_TIMEOUT 2001:db8:101::1"
  733. log_test $? 2 "Ping - blackhole"
  734. run_cmd "$IP nexthop replace id 83 via 2001:db8:91::2 dev veth1"
  735. run_cmd "ip netns exec me ping -c1 -w$PING_TIMEOUT 2001:db8:101::1"
  736. log_test $? 0 "Ping - blackhole replaced with gateway"
  737. run_cmd "$IP -6 nexthop replace id 83 blackhole"
  738. run_cmd "ip netns exec me ping -c1 -w$PING_TIMEOUT 2001:db8:101::1"
  739. log_test $? 2 "Ping - gateway replaced by blackhole"
  740. run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 122"
  741. run_cmd "ip netns exec me ping -c1 -w$PING_TIMEOUT 2001:db8:101::1"
  742. if [ $? -eq 0 ]; then
  743. run_cmd "$IP nexthop replace id 122 group 83"
  744. run_cmd "ip netns exec me ping -c1 -w$PING_TIMEOUT 2001:db8:101::1"
  745. log_test $? 2 "Ping - group with blackhole"
  746. run_cmd "$IP nexthop replace id 122 group 81/82"
  747. run_cmd "ip netns exec me ping -c1 -w$PING_TIMEOUT 2001:db8:101::1"
  748. log_test $? 0 "Ping - group blackhole replaced with gateways"
  749. else
  750. log_test 2 0 "Ping - multipath failed"
  751. fi
  752. #
  753. # device only and gw + dev only mix
  754. #
  755. run_cmd "$IP -6 nexthop add id 85 dev veth1"
  756. run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 85"
  757. log_test $? 0 "IPv6 route with device only nexthop"
  758. check_route6 "2001:db8:101::1" "2001:db8:101::1 nhid 85 dev veth1 metric 1024"
  759. run_cmd "$IP nexthop add id 123 group 81/85"
  760. run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 123"
  761. log_test $? 0 "IPv6 multipath route with nexthop mix - dev only + gw"
  762. check_route6 "2001:db8:101::1" "2001:db8:101::1 nhid 123 metric 1024 nexthop via 2001:db8:91::2 dev veth1 weight 1 nexthop dev veth1 weight 1"
  763. #
  764. # IPv6 route with v4 nexthop - not allowed
  765. #
  766. run_cmd "$IP ro delete 2001:db8:101::1/128"
  767. run_cmd "$IP nexthop add id 84 via 172.16.1.1 dev veth1"
  768. run_cmd "$IP ro add 2001:db8:101::1/128 nhid 84"
  769. log_test $? 2 "IPv6 route can not have a v4 gateway"
  770. run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 81"
  771. run_cmd "$IP nexthop replace id 81 via 172.16.1.1 dev veth1"
  772. log_test $? 2 "Nexthop replace - v6 route, v4 nexthop"
  773. run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 122"
  774. run_cmd "$IP nexthop replace id 81 via 172.16.1.1 dev veth1"
  775. log_test $? 2 "Nexthop replace of group entry - v6 route, v4 nexthop"
  776. run_cmd "$IP nexthop add id 86 via 2001:db8:92::2 dev veth3"
  777. run_cmd "$IP nexthop add id 87 via 172.16.1.1 dev veth1"
  778. run_cmd "$IP nexthop add id 88 via 172.16.1.1 dev veth1"
  779. run_cmd "$IP nexthop add id 124 group 86/87/88"
  780. run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 124"
  781. log_test $? 2 "IPv6 route can not have a group with v4 and v6 gateways"
  782. run_cmd "$IP nexthop del id 88"
  783. run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 124"
  784. log_test $? 2 "IPv6 route can not have a group with v4 and v6 gateways"
  785. run_cmd "$IP nexthop del id 87"
  786. run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 124"
  787. log_test $? 0 "IPv6 route using a group after removing v4 gateways"
  788. run_cmd "$IP ro delete 2001:db8:101::1/128"
  789. run_cmd "$IP nexthop add id 87 via 172.16.1.1 dev veth1"
  790. run_cmd "$IP nexthop add id 88 via 172.16.1.1 dev veth1"
  791. run_cmd "$IP nexthop replace id 124 group 86/87/88"
  792. run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 124"
  793. log_test $? 2 "IPv6 route can not have a group with v4 and v6 gateways"
  794. run_cmd "$IP nexthop replace id 88 via 2001:db8:92::2 dev veth3"
  795. run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 124"
  796. log_test $? 2 "IPv6 route can not have a group with v4 and v6 gateways"
  797. run_cmd "$IP nexthop replace id 87 via 2001:db8:92::2 dev veth3"
  798. run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 124"
  799. log_test $? 0 "IPv6 route using a group after replacing v4 gateways"
  800. $IP nexthop flush >/dev/null 2>&1
  801. #
  802. # weird IPv6 cases
  803. #
  804. run_cmd "$IP nexthop add id 86 via 2001:db8:91::2 dev veth1"
  805. run_cmd "$IP ro add 2001:db8:101::1/128 nhid 81"
  806. # route can not use prefsrc with nexthops
  807. run_cmd "$IP ro add 2001:db8:101::2/128 nhid 86 from 2001:db8:91::1"
  808. log_test $? 2 "IPv6 route can not use src routing with external nexthop"
  809. # check cleanup path on invalid metric
  810. run_cmd "$IP ro add 2001:db8:101::2/128 nhid 86 congctl lock foo"
  811. log_test $? 2 "IPv6 route with invalid metric"
  812. # rpfilter and default route
  813. $IP nexthop flush >/dev/null 2>&1
  814. run_cmd "ip netns exec me ip6tables -t mangle -I PREROUTING 1 -m rpfilter --invert -j DROP"
  815. run_cmd "$IP nexthop add id 91 via 2001:db8:91::2 dev veth1"
  816. run_cmd "$IP nexthop add id 92 via 2001:db8:92::2 dev veth3"
  817. run_cmd "$IP nexthop add id 93 group 91/92"
  818. run_cmd "$IP -6 ro add default nhid 91"
  819. run_cmd "ip netns exec me ping -c1 -w$PING_TIMEOUT 2001:db8:101::1"
  820. log_test $? 0 "Nexthop with default route and rpfilter"
  821. run_cmd "$IP -6 ro replace default nhid 93"
  822. run_cmd "ip netns exec me ping -c1 -w$PING_TIMEOUT 2001:db8:101::1"
  823. log_test $? 0 "Nexthop with multipath default route and rpfilter"
  824. # TO-DO:
  825. # existing route with old nexthop; append route with new nexthop
  826. # existing route with old nexthop; replace route with new
  827. # existing route with new nexthop; replace route with old
  828. # route with src address and using nexthop - not allowed
  829. }
  830. ipv6_large_grp()
  831. {
  832. local ecmp=32
  833. echo
  834. echo "IPv6 large groups (x$ecmp)"
  835. echo "---------------------"
  836. check_large_grp 6 $ecmp
  837. $IP nexthop flush >/dev/null 2>&1
  838. }
  839. ipv6_large_res_grp()
  840. {
  841. echo
  842. echo "IPv6 large resilient group (128k buckets)"
  843. echo "-----------------------------------------"
  844. check_nexthop_res_support
  845. if [ $? -eq $ksft_skip ]; then
  846. return $ksft_skip
  847. fi
  848. check_large_res_grp 6 $((128 * 1024))
  849. $IP nexthop flush >/dev/null 2>&1
  850. }
  851. ipv6_del_add_loop1()
  852. {
  853. while :; do
  854. $IP nexthop del id 100
  855. $IP nexthop add id 100 via 2001:db8:91::2 dev veth1
  856. done >/dev/null 2>&1
  857. }
  858. ipv6_grp_replace_loop()
  859. {
  860. while :; do
  861. $IP nexthop replace id 102 group 100/101
  862. done >/dev/null 2>&1
  863. }
  864. ipv6_torture()
  865. {
  866. local pid1
  867. local pid2
  868. local pid3
  869. local pid4
  870. local pid5
  871. echo
  872. echo "IPv6 runtime torture"
  873. echo "--------------------"
  874. if [ ! -x "$(command -v mausezahn)" ]; then
  875. echo "SKIP: Could not run test; need mausezahn tool"
  876. return
  877. fi
  878. run_cmd "$IP nexthop add id 100 via 2001:db8:91::2 dev veth1"
  879. run_cmd "$IP nexthop add id 101 via 2001:db8:92::2 dev veth3"
  880. run_cmd "$IP nexthop add id 102 group 100/101"
  881. run_cmd "$IP route add 2001:db8:101::1 nhid 102"
  882. run_cmd "$IP route add 2001:db8:101::2 nhid 102"
  883. ipv6_del_add_loop1 &
  884. pid1=$!
  885. ipv6_grp_replace_loop &
  886. pid2=$!
  887. ip netns exec me ping -f 2001:db8:101::1 >/dev/null 2>&1 &
  888. pid3=$!
  889. ip netns exec me ping -f 2001:db8:101::2 >/dev/null 2>&1 &
  890. pid4=$!
  891. ip netns exec me mausezahn -6 veth1 -B 2001:db8:101::2 -A 2001:db8:91::1 -c 0 -t tcp "dp=1-1023, flags=syn" >/dev/null 2>&1 &
  892. pid5=$!
  893. sleep 300
  894. kill -9 $pid1 $pid2 $pid3 $pid4 $pid5
  895. wait $pid1 $pid2 $pid3 $pid4 $pid5 2>/dev/null
  896. # if we did not crash, success
  897. log_test 0 0 "IPv6 torture test"
  898. }
  899. ipv6_res_grp_replace_loop()
  900. {
  901. while :; do
  902. $IP nexthop replace id 102 group 100/101 type resilient
  903. done >/dev/null 2>&1
  904. }
  905. ipv6_res_torture()
  906. {
  907. local pid1
  908. local pid2
  909. local pid3
  910. local pid4
  911. local pid5
  912. echo
  913. echo "IPv6 runtime resilient nexthop group torture"
  914. echo "--------------------------------------------"
  915. check_nexthop_res_support
  916. if [ $? -eq $ksft_skip ]; then
  917. return $ksft_skip
  918. fi
  919. if [ ! -x "$(command -v mausezahn)" ]; then
  920. echo "SKIP: Could not run test; need mausezahn tool"
  921. return
  922. fi
  923. run_cmd "$IP nexthop add id 100 via 2001:db8:91::2 dev veth1"
  924. run_cmd "$IP nexthop add id 101 via 2001:db8:92::2 dev veth3"
  925. run_cmd "$IP nexthop add id 102 group 100/101 type resilient buckets 512 idle_timer 0"
  926. run_cmd "$IP route add 2001:db8:101::1 nhid 102"
  927. run_cmd "$IP route add 2001:db8:101::2 nhid 102"
  928. ipv6_del_add_loop1 &
  929. pid1=$!
  930. ipv6_res_grp_replace_loop &
  931. pid2=$!
  932. ip netns exec me ping -f 2001:db8:101::1 >/dev/null 2>&1 &
  933. pid3=$!
  934. ip netns exec me ping -f 2001:db8:101::2 >/dev/null 2>&1 &
  935. pid4=$!
  936. ip netns exec me mausezahn -6 veth1 \
  937. -B 2001:db8:101::2 -A 2001:db8:91::1 -c 0 \
  938. -t tcp "dp=1-1023, flags=syn" >/dev/null 2>&1 &
  939. pid5=$!
  940. sleep 300
  941. kill -9 $pid1 $pid2 $pid3 $pid4 $pid5
  942. wait $pid1 $pid2 $pid3 $pid4 $pid5 2>/dev/null
  943. # if we did not crash, success
  944. log_test 0 0 "IPv6 resilient nexthop group torture test"
  945. }
  946. ipv4_fcnal()
  947. {
  948. local rc
  949. echo
  950. echo "IPv4 functional"
  951. echo "----------------------"
  952. #
  953. # basic IPv4 ops - add, get, delete
  954. #
  955. run_cmd "$IP nexthop add id 12 via 172.16.1.2 dev veth1"
  956. rc=$?
  957. log_test $rc 0 "Create nexthop with id, gw, dev"
  958. if [ $rc -ne 0 ]; then
  959. echo "Basic IPv4 create fails; can not continue"
  960. return 1
  961. fi
  962. run_cmd "$IP nexthop get id 12"
  963. log_test $? 0 "Get nexthop by id"
  964. check_nexthop "id 12" "id 12 via 172.16.1.2 dev veth1 scope link"
  965. run_cmd "$IP nexthop del id 12"
  966. log_test $? 0 "Delete nexthop by id"
  967. check_nexthop "id 52" ""
  968. #
  969. # gw, device spec
  970. #
  971. # gw validation, no device - fails since dev is required
  972. run_cmd "$IP nexthop add id 12 via 172.16.2.3"
  973. log_test $? 2 "Create nexthop - gw only"
  974. # gw not reachable through given dev
  975. run_cmd "$IP nexthop add id 13 via 172.16.3.2 dev veth1"
  976. log_test $? 2 "Create nexthop - invalid gw+dev combination"
  977. # onlink flag overrides gw+dev lookup
  978. run_cmd "$IP nexthop add id 13 via 172.16.3.2 dev veth1 onlink"
  979. log_test $? 0 "Create nexthop - gw+dev and onlink"
  980. # admin down should delete nexthops
  981. set -e
  982. run_cmd "$IP nexthop add id 15 via 172.16.1.3 dev veth1"
  983. run_cmd "$IP nexthop add id 16 via 172.16.1.4 dev veth1"
  984. run_cmd "$IP nexthop add id 17 via 172.16.1.5 dev veth1"
  985. run_cmd "$IP li set dev veth1 down"
  986. set +e
  987. check_nexthop "dev veth1" ""
  988. log_test $? 0 "Nexthops removed on admin down"
  989. # nexthop route delete warning: route add with nhid and delete
  990. # using device
  991. run_cmd "$IP li set dev veth1 up"
  992. run_cmd "$IP nexthop add id 12 via 172.16.1.3 dev veth1"
  993. out1=`dmesg | grep "WARNING:.*fib_nh_match.*" | wc -l`
  994. run_cmd "$IP route add 172.16.101.1/32 nhid 12"
  995. run_cmd "$IP route delete 172.16.101.1/32 dev veth1"
  996. out2=`dmesg | grep "WARNING:.*fib_nh_match.*" | wc -l`
  997. [ $out1 -eq $out2 ]
  998. rc=$?
  999. log_test $rc 0 "Delete nexthop route warning"
  1000. run_cmd "$IP route delete 172.16.101.1/32 nhid 12"
  1001. run_cmd "$IP nexthop del id 12"
  1002. run_cmd "$IP nexthop add id 21 via 172.16.1.6 dev veth1"
  1003. run_cmd "$IP ro add 172.16.101.0/24 nhid 21"
  1004. run_cmd "$IP ro del 172.16.101.0/24 nexthop via 172.16.1.7 dev veth1 nexthop via 172.16.1.8 dev veth1"
  1005. log_test $? 2 "Delete multipath route with only nh id based entry"
  1006. run_cmd "$IP nexthop add id 22 via 172.16.1.6 dev veth1"
  1007. run_cmd "$IP ro add 172.16.102.0/24 nhid 22"
  1008. run_cmd "$IP ro del 172.16.102.0/24 dev veth1"
  1009. log_test $? 2 "Delete route when specifying only nexthop device"
  1010. run_cmd "$IP ro del 172.16.102.0/24 via 172.16.1.6"
  1011. log_test $? 2 "Delete route when specifying only gateway"
  1012. run_cmd "$IP ro del 172.16.102.0/24"
  1013. log_test $? 0 "Delete route when not specifying nexthop attributes"
  1014. }
  1015. ipv4_grp_fcnal()
  1016. {
  1017. local rc
  1018. echo
  1019. echo "IPv4 groups functional"
  1020. echo "----------------------"
  1021. # basic functionality: create a nexthop group, default weight
  1022. run_cmd "$IP nexthop add id 11 via 172.16.1.2 dev veth1"
  1023. run_cmd "$IP nexthop add id 101 group 11"
  1024. log_test $? 0 "Create nexthop group with single nexthop"
  1025. # get nexthop group
  1026. run_cmd "$IP nexthop get id 101"
  1027. log_test $? 0 "Get nexthop group by id"
  1028. check_nexthop "id 101" "id 101 group 11"
  1029. # delete nexthop group
  1030. run_cmd "$IP nexthop del id 101"
  1031. log_test $? 0 "Delete nexthop group by id"
  1032. check_nexthop "id 101" ""
  1033. $IP nexthop flush >/dev/null 2>&1
  1034. #
  1035. # create group with multiple nexthops
  1036. run_cmd "$IP nexthop add id 12 via 172.16.1.2 dev veth1"
  1037. run_cmd "$IP nexthop add id 13 via 172.16.1.3 dev veth1"
  1038. run_cmd "$IP nexthop add id 14 via 172.16.1.4 dev veth1"
  1039. run_cmd "$IP nexthop add id 15 via 172.16.1.5 dev veth1"
  1040. run_cmd "$IP nexthop add id 102 group 12/13/14/15"
  1041. log_test $? 0 "Nexthop group with multiple nexthops"
  1042. check_nexthop "id 102" "id 102 group 12/13/14/15"
  1043. # Delete nexthop in a group and group is updated
  1044. run_cmd "$IP nexthop del id 13"
  1045. check_nexthop "id 102" "id 102 group 12/14/15"
  1046. log_test $? 0 "Nexthop group updated when entry is deleted"
  1047. # create group with multiple weighted nexthops
  1048. run_cmd "$IP nexthop add id 13 via 172.16.1.3 dev veth1"
  1049. run_cmd "$IP nexthop add id 103 group 12/13,2/14,3/15,4"
  1050. log_test $? 0 "Nexthop group with weighted nexthops"
  1051. check_nexthop "id 103" "id 103 group 12/13,2/14,3/15,4"
  1052. # Delete nexthop in a weighted group and group is updated
  1053. run_cmd "$IP nexthop del id 13"
  1054. check_nexthop "id 103" "id 103 group 12/14,3/15,4"
  1055. log_test $? 0 "Weighted nexthop group updated when entry is deleted"
  1056. # admin down - nexthop is removed from group
  1057. run_cmd "$IP li set dev veth1 down"
  1058. check_nexthop "dev veth1" ""
  1059. log_test $? 0 "Nexthops in groups removed on admin down"
  1060. # expect groups to have been deleted as well
  1061. check_nexthop "" ""
  1062. run_cmd "$IP li set dev veth1 up"
  1063. $IP nexthop flush >/dev/null 2>&1
  1064. # group with nexthops using different devices
  1065. set -e
  1066. run_cmd "$IP nexthop add id 12 via 172.16.1.2 dev veth1"
  1067. run_cmd "$IP nexthop add id 13 via 172.16.1.3 dev veth1"
  1068. run_cmd "$IP nexthop add id 14 via 172.16.1.4 dev veth1"
  1069. run_cmd "$IP nexthop add id 15 via 172.16.1.5 dev veth1"
  1070. run_cmd "$IP nexthop add id 22 via 172.16.2.2 dev veth3"
  1071. run_cmd "$IP nexthop add id 23 via 172.16.2.3 dev veth3"
  1072. run_cmd "$IP nexthop add id 24 via 172.16.2.4 dev veth3"
  1073. run_cmd "$IP nexthop add id 25 via 172.16.2.5 dev veth3"
  1074. set +e
  1075. # multiple groups with same nexthop
  1076. run_cmd "$IP nexthop add id 104 group 12"
  1077. run_cmd "$IP nexthop add id 105 group 12"
  1078. check_nexthop "group" "id 104 group 12 id 105 group 12"
  1079. log_test $? 0 "Multiple groups with same nexthop"
  1080. run_cmd "$IP nexthop flush groups"
  1081. [ $? -ne 0 ] && return 1
  1082. # on admin down of veth1, it should be removed from the group
  1083. run_cmd "$IP nexthop add id 105 group 12/13/22/23/14"
  1084. run_cmd "$IP li set veth1 down"
  1085. check_nexthop "id 105" "id 105 group 22/23"
  1086. log_test $? 0 "Nexthops in group removed on admin down - mixed group"
  1087. run_cmd "$IP nexthop add id 106 group 105/24"
  1088. log_test $? 2 "Nexthop group can not have a group as an entry"
  1089. # a group can have a blackhole entry only if it is the only
  1090. # nexthop in the group. Needed for atomic replace with an
  1091. # actual nexthop group
  1092. run_cmd "$IP nexthop add id 31 blackhole"
  1093. run_cmd "$IP nexthop add id 107 group 31"
  1094. log_test $? 0 "Nexthop group with a blackhole entry"
  1095. run_cmd "$IP nexthop add id 108 group 31/24"
  1096. log_test $? 2 "Nexthop group can not have a blackhole and another nexthop"
  1097. }
  1098. ipv4_res_grp_fcnal()
  1099. {
  1100. local rc
  1101. echo
  1102. echo "IPv4 resilient groups functional"
  1103. echo "--------------------------------"
  1104. check_nexthop_res_support
  1105. if [ $? -eq $ksft_skip ]; then
  1106. return $ksft_skip
  1107. fi
  1108. #
  1109. # migration of nexthop buckets - equal weights
  1110. #
  1111. run_cmd "$IP nexthop add id 12 via 172.16.1.2 dev veth1"
  1112. run_cmd "$IP nexthop add id 13 via 172.16.1.3 dev veth1"
  1113. run_cmd "$IP nexthop add id 102 group 12/13 type resilient buckets 2 idle_timer 0"
  1114. run_cmd "$IP nexthop del id 13"
  1115. check_nexthop "id 102" \
  1116. "id 102 group 12 type resilient buckets 2 idle_timer 0 unbalanced_timer 0 unbalanced_time 0"
  1117. log_test $? 0 "Nexthop group updated when entry is deleted"
  1118. check_nexthop_bucket "list id 102" \
  1119. "id 102 index 0 nhid 12 id 102 index 1 nhid 12"
  1120. log_test $? 0 "Nexthop buckets updated when entry is deleted"
  1121. run_cmd "$IP nexthop add id 13 via 172.16.1.3 dev veth1"
  1122. run_cmd "$IP nexthop replace id 102 group 12/13 type resilient buckets 2 idle_timer 0"
  1123. check_nexthop "id 102" \
  1124. "id 102 group 12/13 type resilient buckets 2 idle_timer 0 unbalanced_timer 0 unbalanced_time 0"
  1125. log_test $? 0 "Nexthop group updated after replace"
  1126. check_nexthop_bucket "list id 102" \
  1127. "id 102 index 0 nhid 13 id 102 index 1 nhid 12"
  1128. log_test $? 0 "Nexthop buckets updated after replace"
  1129. $IP nexthop flush >/dev/null 2>&1
  1130. #
  1131. # migration of nexthop buckets - unequal weights
  1132. #
  1133. run_cmd "$IP nexthop add id 12 via 172.16.1.2 dev veth1"
  1134. run_cmd "$IP nexthop add id 13 via 172.16.1.3 dev veth1"
  1135. run_cmd "$IP nexthop add id 102 group 12,3/13,1 type resilient buckets 4 idle_timer 0"
  1136. run_cmd "$IP nexthop del id 13"
  1137. check_nexthop "id 102" \
  1138. "id 102 group 12,3 type resilient buckets 4 idle_timer 0 unbalanced_timer 0 unbalanced_time 0"
  1139. log_test $? 0 "Nexthop group updated when entry is deleted - nECMP"
  1140. check_nexthop_bucket "list id 102" \
  1141. "id 102 index 0 nhid 12 id 102 index 1 nhid 12 id 102 index 2 nhid 12 id 102 index 3 nhid 12"
  1142. log_test $? 0 "Nexthop buckets updated when entry is deleted - nECMP"
  1143. run_cmd "$IP nexthop add id 13 via 172.16.1.3 dev veth1"
  1144. run_cmd "$IP nexthop replace id 102 group 12,3/13,1 type resilient buckets 4 idle_timer 0"
  1145. check_nexthop "id 102" \
  1146. "id 102 group 12,3/13 type resilient buckets 4 idle_timer 0 unbalanced_timer 0 unbalanced_time 0"
  1147. log_test $? 0 "Nexthop group updated after replace - nECMP"
  1148. check_nexthop_bucket "list id 102" \
  1149. "id 102 index 0 nhid 13 id 102 index 1 nhid 12 id 102 index 2 nhid 12 id 102 index 3 nhid 12"
  1150. log_test $? 0 "Nexthop buckets updated after replace - nECMP"
  1151. }
  1152. ipv4_withv6_fcnal()
  1153. {
  1154. local lladdr
  1155. set -e
  1156. lladdr=$(get_linklocal veth2 peer)
  1157. run_cmd "$IP nexthop add id 11 via ${lladdr} dev veth1"
  1158. set +e
  1159. run_cmd "$IP ro add 172.16.101.1/32 nhid 11"
  1160. log_test $? 0 "IPv6 nexthop with IPv4 route"
  1161. check_route "172.16.101.1" "172.16.101.1 nhid 11 via inet6 ${lladdr} dev veth1"
  1162. set -e
  1163. run_cmd "$IP nexthop add id 12 via 172.16.1.2 dev veth1"
  1164. run_cmd "$IP nexthop add id 101 group 11/12"
  1165. set +e
  1166. run_cmd "$IP ro replace 172.16.101.1/32 nhid 101"
  1167. log_test $? 0 "IPv6 nexthop with IPv4 route"
  1168. check_route "172.16.101.1" "172.16.101.1 nhid 101 nexthop via inet6 ${lladdr} dev veth1 weight 1 nexthop via 172.16.1.2 dev veth1 weight 1"
  1169. run_cmd "$IP ro replace 172.16.101.1/32 via inet6 ${lladdr} dev veth1"
  1170. log_test $? 0 "IPv4 route with IPv6 gateway"
  1171. check_route "172.16.101.1" "172.16.101.1 via inet6 ${lladdr} dev veth1"
  1172. run_cmd "$IP ro replace 172.16.101.1/32 via inet6 2001:db8:50::1 dev veth1"
  1173. log_test $? 2 "IPv4 route with invalid IPv6 gateway"
  1174. }
  1175. ipv4_fcnal_runtime()
  1176. {
  1177. local lladdr
  1178. local rc
  1179. echo
  1180. echo "IPv4 functional runtime"
  1181. echo "-----------------------"
  1182. run_cmd "$IP nexthop add id 21 via 172.16.1.2 dev veth1"
  1183. run_cmd "$IP ro add 172.16.101.1/32 nhid 21"
  1184. log_test $? 0 "Route add"
  1185. check_route "172.16.101.1" "172.16.101.1 nhid 21 via 172.16.1.2 dev veth1"
  1186. run_cmd "$IP ro delete 172.16.101.1/32 nhid 21"
  1187. log_test $? 0 "Route delete"
  1188. #
  1189. # scope mismatch
  1190. #
  1191. run_cmd "$IP nexthop add id 22 via 172.16.1.2 dev veth1"
  1192. run_cmd "$IP ro add 172.16.101.1/32 nhid 22 scope host"
  1193. log_test $? 2 "Route add - scope conflict with nexthop"
  1194. run_cmd "$IP nexthop replace id 22 dev veth3"
  1195. run_cmd "$IP ro add 172.16.101.1/32 nhid 22 scope host"
  1196. run_cmd "$IP nexthop replace id 22 via 172.16.2.2 dev veth3"
  1197. log_test $? 2 "Nexthop replace with invalid scope for existing route"
  1198. # check cleanup path on invalid metric
  1199. run_cmd "$IP ro add 172.16.101.2/32 nhid 22 congctl lock foo"
  1200. log_test $? 2 "IPv4 route with invalid metric"
  1201. #
  1202. # add route with nexthop and check traffic
  1203. #
  1204. run_cmd "$IP nexthop replace id 21 via 172.16.1.2 dev veth1"
  1205. run_cmd "$IP ro replace 172.16.101.1/32 nhid 21"
  1206. run_cmd "ip netns exec me ping -c1 -w$PING_TIMEOUT 172.16.101.1"
  1207. log_test $? 0 "Basic ping"
  1208. run_cmd "$IP nexthop replace id 22 via 172.16.2.2 dev veth3"
  1209. run_cmd "$IP nexthop add id 122 group 21/22"
  1210. run_cmd "$IP ro replace 172.16.101.1/32 nhid 122"
  1211. run_cmd "ip netns exec me ping -c1 -w$PING_TIMEOUT 172.16.101.1"
  1212. log_test $? 0 "Ping - multipath"
  1213. run_cmd "$IP ro delete 172.16.101.1/32 nhid 122"
  1214. #
  1215. # multiple default routes
  1216. # - tests fib_select_default
  1217. run_cmd "$IP nexthop add id 501 via 172.16.1.2 dev veth1"
  1218. run_cmd "$IP ro add default nhid 501"
  1219. run_cmd "$IP ro add default via 172.16.1.3 dev veth1 metric 20"
  1220. run_cmd "ip netns exec me ping -c1 -w$PING_TIMEOUT 172.16.101.1"
  1221. log_test $? 0 "Ping - multiple default routes, nh first"
  1222. # flip the order
  1223. run_cmd "$IP ro del default nhid 501"
  1224. run_cmd "$IP ro del default via 172.16.1.3 dev veth1 metric 20"
  1225. run_cmd "$IP ro add default via 172.16.1.2 dev veth1 metric 20"
  1226. run_cmd "$IP nexthop replace id 501 via 172.16.1.3 dev veth1"
  1227. run_cmd "$IP ro add default nhid 501 metric 20"
  1228. run_cmd "ip netns exec me ping -c1 -w$PING_TIMEOUT 172.16.101.1"
  1229. log_test $? 0 "Ping - multiple default routes, nh second"
  1230. run_cmd "$IP nexthop delete nhid 501"
  1231. run_cmd "$IP ro del default"
  1232. #
  1233. # IPv4 with blackhole nexthops
  1234. #
  1235. run_cmd "$IP nexthop add id 23 blackhole"
  1236. run_cmd "$IP ro replace 172.16.101.1/32 nhid 23"
  1237. run_cmd "ip netns exec me ping -c1 -w$PING_TIMEOUT 172.16.101.1"
  1238. log_test $? 2 "Ping - blackhole"
  1239. run_cmd "$IP nexthop replace id 23 via 172.16.1.2 dev veth1"
  1240. run_cmd "ip netns exec me ping -c1 -w$PING_TIMEOUT 172.16.101.1"
  1241. log_test $? 0 "Ping - blackhole replaced with gateway"
  1242. run_cmd "$IP nexthop replace id 23 blackhole"
  1243. run_cmd "ip netns exec me ping -c1 -w$PING_TIMEOUT 172.16.101.1"
  1244. log_test $? 2 "Ping - gateway replaced by blackhole"
  1245. run_cmd "$IP ro replace 172.16.101.1/32 nhid 122"
  1246. run_cmd "ip netns exec me ping -c1 -w$PING_TIMEOUT 172.16.101.1"
  1247. if [ $? -eq 0 ]; then
  1248. run_cmd "$IP nexthop replace id 122 group 23"
  1249. run_cmd "ip netns exec me ping -c1 -w$PING_TIMEOUT 172.16.101.1"
  1250. log_test $? 2 "Ping - group with blackhole"
  1251. run_cmd "$IP nexthop replace id 122 group 21/22"
  1252. run_cmd "ip netns exec me ping -c1 -w$PING_TIMEOUT 172.16.101.1"
  1253. log_test $? 0 "Ping - group blackhole replaced with gateways"
  1254. else
  1255. log_test 2 0 "Ping - multipath failed"
  1256. fi
  1257. #
  1258. # device only and gw + dev only mix
  1259. #
  1260. run_cmd "$IP nexthop add id 85 dev veth1"
  1261. run_cmd "$IP ro replace 172.16.101.1/32 nhid 85"
  1262. log_test $? 0 "IPv4 route with device only nexthop"
  1263. check_route "172.16.101.1" "172.16.101.1 nhid 85 dev veth1"
  1264. run_cmd "$IP nexthop add id 123 group 21/85"
  1265. run_cmd "$IP ro replace 172.16.101.1/32 nhid 123"
  1266. log_test $? 0 "IPv4 multipath route with nexthop mix - dev only + gw"
  1267. check_route "172.16.101.1" "172.16.101.1 nhid 123 nexthop via 172.16.1.2 dev veth1 weight 1 nexthop dev veth1 weight 1"
  1268. #
  1269. # IPv4 with IPv6
  1270. #
  1271. set -e
  1272. lladdr=$(get_linklocal veth2 peer)
  1273. run_cmd "$IP nexthop add id 24 via ${lladdr} dev veth1"
  1274. set +e
  1275. run_cmd "$IP ro replace 172.16.101.1/32 nhid 24"
  1276. run_cmd "ip netns exec me ping -c1 -w$PING_TIMEOUT 172.16.101.1"
  1277. log_test $? 0 "IPv6 nexthop with IPv4 route"
  1278. $IP neigh sh | grep -q "${lladdr} dev veth1"
  1279. if [ $? -eq 1 ]; then
  1280. echo " WARNING: Neigh entry missing for ${lladdr}"
  1281. $IP neigh sh | grep 'dev veth1'
  1282. fi
  1283. $IP neigh sh | grep -q "172.16.101.1 dev eth1"
  1284. if [ $? -eq 0 ]; then
  1285. echo " WARNING: Neigh entry exists for 172.16.101.1"
  1286. $IP neigh sh | grep 'dev veth1'
  1287. fi
  1288. set -e
  1289. run_cmd "$IP nexthop add id 25 via 172.16.1.2 dev veth1"
  1290. run_cmd "$IP nexthop add id 101 group 24/25"
  1291. set +e
  1292. run_cmd "$IP ro replace 172.16.101.1/32 nhid 101"
  1293. log_test $? 0 "IPv4 route with mixed v4-v6 multipath route"
  1294. check_route "172.16.101.1" "172.16.101.1 nhid 101 nexthop via inet6 ${lladdr} dev veth1 weight 1 nexthop via 172.16.1.2 dev veth1 weight 1"
  1295. run_cmd "ip netns exec me ping -c1 -w$PING_TIMEOUT 172.16.101.1"
  1296. log_test $? 0 "IPv6 nexthop with IPv4 route"
  1297. run_cmd "$IP ro replace 172.16.101.1/32 via inet6 ${lladdr} dev veth1"
  1298. run_cmd "ip netns exec me ping -c1 -w$PING_TIMEOUT 172.16.101.1"
  1299. log_test $? 0 "IPv4 route with IPv6 gateway"
  1300. $IP neigh sh | grep -q "${lladdr} dev veth1"
  1301. if [ $? -eq 1 ]; then
  1302. echo " WARNING: Neigh entry missing for ${lladdr}"
  1303. $IP neigh sh | grep 'dev veth1'
  1304. fi
  1305. $IP neigh sh | grep -q "172.16.101.1 dev eth1"
  1306. if [ $? -eq 0 ]; then
  1307. echo " WARNING: Neigh entry exists for 172.16.101.1"
  1308. $IP neigh sh | grep 'dev veth1'
  1309. fi
  1310. run_cmd "$IP ro del 172.16.101.1/32 via inet6 ${lladdr} dev veth1"
  1311. run_cmd "$IP -4 ro add default via inet6 ${lladdr} dev veth1"
  1312. run_cmd "ip netns exec me ping -c1 -w$PING_TIMEOUT 172.16.101.1"
  1313. log_test $? 0 "IPv4 default route with IPv6 gateway"
  1314. #
  1315. # MPLS as an example of LWT encap
  1316. #
  1317. run_cmd "$IP nexthop add id 51 encap mpls 101 via 172.16.1.2 dev veth1"
  1318. log_test $? 0 "IPv4 route with MPLS encap"
  1319. check_nexthop "id 51" "id 51 encap mpls 101 via 172.16.1.2 dev veth1 scope link"
  1320. log_test $? 0 "IPv4 route with MPLS encap - check"
  1321. run_cmd "$IP nexthop add id 52 encap mpls 102 via inet6 2001:db8:91::2 dev veth1"
  1322. log_test $? 0 "IPv4 route with MPLS encap and v6 gateway"
  1323. check_nexthop "id 52" "id 52 encap mpls 102 via 2001:db8:91::2 dev veth1 scope link"
  1324. log_test $? 0 "IPv4 route with MPLS encap, v6 gw - check"
  1325. }
  1326. ipv4_large_grp()
  1327. {
  1328. local ecmp=32
  1329. echo
  1330. echo "IPv4 large groups (x$ecmp)"
  1331. echo "---------------------"
  1332. check_large_grp 4 $ecmp
  1333. $IP nexthop flush >/dev/null 2>&1
  1334. }
  1335. ipv4_large_res_grp()
  1336. {
  1337. echo
  1338. echo "IPv4 large resilient group (128k buckets)"
  1339. echo "-----------------------------------------"
  1340. check_nexthop_res_support
  1341. if [ $? -eq $ksft_skip ]; then
  1342. return $ksft_skip
  1343. fi
  1344. check_large_res_grp 4 $((128 * 1024))
  1345. $IP nexthop flush >/dev/null 2>&1
  1346. }
  1347. sysctl_nexthop_compat_mode_check()
  1348. {
  1349. local sysctlname="net.ipv4.nexthop_compat_mode"
  1350. local lprefix=$1
  1351. IPE="ip netns exec me"
  1352. $IPE sysctl -q $sysctlname 2>&1 >/dev/null
  1353. if [ $? -ne 0 ]; then
  1354. echo "SKIP: kernel lacks nexthop compat mode sysctl control"
  1355. return $ksft_skip
  1356. fi
  1357. out=$($IPE sysctl $sysctlname 2>/dev/null)
  1358. log_test $? 0 "$lprefix default nexthop compat mode check"
  1359. check_output "${out}" "$sysctlname = 1"
  1360. }
  1361. sysctl_nexthop_compat_mode_set()
  1362. {
  1363. local sysctlname="net.ipv4.nexthop_compat_mode"
  1364. local mode=$1
  1365. local lprefix=$2
  1366. IPE="ip netns exec me"
  1367. out=$($IPE sysctl -w $sysctlname=$mode)
  1368. log_test $? 0 "$lprefix set compat mode - $mode"
  1369. check_output "${out}" "net.ipv4.nexthop_compat_mode = $mode"
  1370. }
  1371. ipv6_compat_mode()
  1372. {
  1373. local rc
  1374. echo
  1375. echo "IPv6 nexthop api compat mode test"
  1376. echo "--------------------------------"
  1377. sysctl_nexthop_compat_mode_check "IPv6"
  1378. if [ $? -eq $ksft_skip ]; then
  1379. return $ksft_skip
  1380. fi
  1381. run_cmd "$IP nexthop add id 62 via 2001:db8:91::2 dev veth1"
  1382. run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1"
  1383. run_cmd "$IP nexthop add id 122 group 62/63"
  1384. ipmout=$(start_ip_monitor route)
  1385. run_cmd "$IP -6 ro add 2001:db8:101::1/128 nhid 122"
  1386. # route add notification should contain expanded nexthops
  1387. stop_ip_monitor $ipmout 3
  1388. log_test $? 0 "IPv6 compat mode on - route add notification"
  1389. # route dump should contain expanded nexthops
  1390. check_route6 "2001:db8:101::1" "2001:db8:101::1 nhid 122 metric 1024 nexthop via 2001:db8:91::2 dev veth1 weight 1 nexthop via 2001:db8:91::3 dev veth1 weight 1"
  1391. log_test $? 0 "IPv6 compat mode on - route dump"
  1392. # change in nexthop group should generate route notification
  1393. run_cmd "$IP nexthop add id 64 via 2001:db8:91::4 dev veth1"
  1394. ipmout=$(start_ip_monitor route)
  1395. run_cmd "$IP nexthop replace id 122 group 62/64"
  1396. stop_ip_monitor $ipmout 3
  1397. log_test $? 0 "IPv6 compat mode on - nexthop change"
  1398. # set compat mode off
  1399. sysctl_nexthop_compat_mode_set 0 "IPv6"
  1400. run_cmd "$IP -6 ro del 2001:db8:101::1/128 nhid 122"
  1401. run_cmd "$IP nexthop add id 62 via 2001:db8:91::2 dev veth1"
  1402. run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1"
  1403. run_cmd "$IP nexthop add id 122 group 62/63"
  1404. ipmout=$(start_ip_monitor route)
  1405. run_cmd "$IP -6 ro add 2001:db8:101::1/128 nhid 122"
  1406. # route add notification should not contain expanded nexthops
  1407. stop_ip_monitor $ipmout 1
  1408. log_test $? 0 "IPv6 compat mode off - route add notification"
  1409. # route dump should not contain expanded nexthops
  1410. check_route6 "2001:db8:101::1" "2001:db8:101::1 nhid 122 metric 1024"
  1411. log_test $? 0 "IPv6 compat mode off - route dump"
  1412. # change in nexthop group should not generate route notification
  1413. run_cmd "$IP nexthop add id 64 via 2001:db8:91::4 dev veth1"
  1414. ipmout=$(start_ip_monitor route)
  1415. run_cmd "$IP nexthop replace id 122 group 62/64"
  1416. stop_ip_monitor $ipmout 0
  1417. log_test $? 0 "IPv6 compat mode off - nexthop change"
  1418. # nexthop delete should not generate route notification
  1419. ipmout=$(start_ip_monitor route)
  1420. run_cmd "$IP nexthop del id 122"
  1421. stop_ip_monitor $ipmout 0
  1422. log_test $? 0 "IPv6 compat mode off - nexthop delete"
  1423. # set compat mode back on
  1424. sysctl_nexthop_compat_mode_set 1 "IPv6"
  1425. }
  1426. ipv4_compat_mode()
  1427. {
  1428. local rc
  1429. echo
  1430. echo "IPv4 nexthop api compat mode"
  1431. echo "----------------------------"
  1432. sysctl_nexthop_compat_mode_check "IPv4"
  1433. if [ $? -eq $ksft_skip ]; then
  1434. return $ksft_skip
  1435. fi
  1436. run_cmd "$IP nexthop add id 21 via 172.16.1.2 dev veth1"
  1437. run_cmd "$IP nexthop add id 22 via 172.16.1.2 dev veth1"
  1438. run_cmd "$IP nexthop add id 122 group 21/22"
  1439. ipmout=$(start_ip_monitor route)
  1440. run_cmd "$IP ro add 172.16.101.1/32 nhid 122"
  1441. stop_ip_monitor $ipmout 3
  1442. # route add notification should contain expanded nexthops
  1443. log_test $? 0 "IPv4 compat mode on - route add notification"
  1444. # route dump should contain expanded nexthops
  1445. check_route "172.16.101.1" "172.16.101.1 nhid 122 nexthop via 172.16.1.2 dev veth1 weight 1 nexthop via 172.16.1.2 dev veth1 weight 1"
  1446. log_test $? 0 "IPv4 compat mode on - route dump"
  1447. # change in nexthop group should generate route notification
  1448. run_cmd "$IP nexthop add id 23 via 172.16.1.3 dev veth1"
  1449. ipmout=$(start_ip_monitor route)
  1450. run_cmd "$IP nexthop replace id 122 group 21/23"
  1451. stop_ip_monitor $ipmout 3
  1452. log_test $? 0 "IPv4 compat mode on - nexthop change"
  1453. sysctl_nexthop_compat_mode_set 0 "IPv4"
  1454. # cleanup
  1455. run_cmd "$IP ro del 172.16.101.1/32 nhid 122"
  1456. ipmout=$(start_ip_monitor route)
  1457. run_cmd "$IP ro add 172.16.101.1/32 nhid 122"
  1458. stop_ip_monitor $ipmout 1
  1459. # route add notification should not contain expanded nexthops
  1460. log_test $? 0 "IPv4 compat mode off - route add notification"
  1461. # route dump should not contain expanded nexthops
  1462. check_route "172.16.101.1" "172.16.101.1 nhid 122"
  1463. log_test $? 0 "IPv4 compat mode off - route dump"
  1464. # change in nexthop group should not generate route notification
  1465. ipmout=$(start_ip_monitor route)
  1466. run_cmd "$IP nexthop replace id 122 group 21/22"
  1467. stop_ip_monitor $ipmout 0
  1468. log_test $? 0 "IPv4 compat mode off - nexthop change"
  1469. # nexthop delete should not generate route notification
  1470. ipmout=$(start_ip_monitor route)
  1471. run_cmd "$IP nexthop del id 122"
  1472. stop_ip_monitor $ipmout 0
  1473. log_test $? 0 "IPv4 compat mode off - nexthop delete"
  1474. sysctl_nexthop_compat_mode_set 1 "IPv4"
  1475. }
  1476. ipv4_del_add_loop1()
  1477. {
  1478. while :; do
  1479. $IP nexthop del id 100
  1480. $IP nexthop add id 100 via 172.16.1.2 dev veth1
  1481. done >/dev/null 2>&1
  1482. }
  1483. ipv4_grp_replace_loop()
  1484. {
  1485. while :; do
  1486. $IP nexthop replace id 102 group 100/101
  1487. done >/dev/null 2>&1
  1488. }
  1489. ipv4_torture()
  1490. {
  1491. local pid1
  1492. local pid2
  1493. local pid3
  1494. local pid4
  1495. local pid5
  1496. echo
  1497. echo "IPv4 runtime torture"
  1498. echo "--------------------"
  1499. if [ ! -x "$(command -v mausezahn)" ]; then
  1500. echo "SKIP: Could not run test; need mausezahn tool"
  1501. return
  1502. fi
  1503. run_cmd "$IP nexthop add id 100 via 172.16.1.2 dev veth1"
  1504. run_cmd "$IP nexthop add id 101 via 172.16.2.2 dev veth3"
  1505. run_cmd "$IP nexthop add id 102 group 100/101"
  1506. run_cmd "$IP route add 172.16.101.1 nhid 102"
  1507. run_cmd "$IP route add 172.16.101.2 nhid 102"
  1508. ipv4_del_add_loop1 &
  1509. pid1=$!
  1510. ipv4_grp_replace_loop &
  1511. pid2=$!
  1512. ip netns exec me ping -f 172.16.101.1 >/dev/null 2>&1 &
  1513. pid3=$!
  1514. ip netns exec me ping -f 172.16.101.2 >/dev/null 2>&1 &
  1515. pid4=$!
  1516. ip netns exec me mausezahn veth1 -B 172.16.101.2 -A 172.16.1.1 -c 0 -t tcp "dp=1-1023, flags=syn" >/dev/null 2>&1 &
  1517. pid5=$!
  1518. sleep 300
  1519. kill -9 $pid1 $pid2 $pid3 $pid4 $pid5
  1520. wait $pid1 $pid2 $pid3 $pid4 $pid5 2>/dev/null
  1521. # if we did not crash, success
  1522. log_test 0 0 "IPv4 torture test"
  1523. }
  1524. ipv4_res_grp_replace_loop()
  1525. {
  1526. while :; do
  1527. $IP nexthop replace id 102 group 100/101 type resilient
  1528. done >/dev/null 2>&1
  1529. }
  1530. ipv4_res_torture()
  1531. {
  1532. local pid1
  1533. local pid2
  1534. local pid3
  1535. local pid4
  1536. local pid5
  1537. echo
  1538. echo "IPv4 runtime resilient nexthop group torture"
  1539. echo "--------------------------------------------"
  1540. check_nexthop_res_support
  1541. if [ $? -eq $ksft_skip ]; then
  1542. return $ksft_skip
  1543. fi
  1544. if [ ! -x "$(command -v mausezahn)" ]; then
  1545. echo "SKIP: Could not run test; need mausezahn tool"
  1546. return
  1547. fi
  1548. run_cmd "$IP nexthop add id 100 via 172.16.1.2 dev veth1"
  1549. run_cmd "$IP nexthop add id 101 via 172.16.2.2 dev veth3"
  1550. run_cmd "$IP nexthop add id 102 group 100/101 type resilient buckets 512 idle_timer 0"
  1551. run_cmd "$IP route add 172.16.101.1 nhid 102"
  1552. run_cmd "$IP route add 172.16.101.2 nhid 102"
  1553. ipv4_del_add_loop1 &
  1554. pid1=$!
  1555. ipv4_res_grp_replace_loop &
  1556. pid2=$!
  1557. ip netns exec me ping -f 172.16.101.1 >/dev/null 2>&1 &
  1558. pid3=$!
  1559. ip netns exec me ping -f 172.16.101.2 >/dev/null 2>&1 &
  1560. pid4=$!
  1561. ip netns exec me mausezahn veth1 \
  1562. -B 172.16.101.2 -A 172.16.1.1 -c 0 \
  1563. -t tcp "dp=1-1023, flags=syn" >/dev/null 2>&1 &
  1564. pid5=$!
  1565. sleep 300
  1566. kill -9 $pid1 $pid2 $pid3 $pid4 $pid5
  1567. wait $pid1 $pid2 $pid3 $pid4 $pid5 2>/dev/null
  1568. # if we did not crash, success
  1569. log_test 0 0 "IPv4 resilient nexthop group torture test"
  1570. }
  1571. basic()
  1572. {
  1573. echo
  1574. echo "Basic functional tests"
  1575. echo "----------------------"
  1576. run_cmd "$IP nexthop ls"
  1577. log_test $? 0 "List with nothing defined"
  1578. run_cmd "$IP nexthop get id 1"
  1579. log_test $? 2 "Nexthop get on non-existent id"
  1580. # attempt to create nh without a device or gw - fails
  1581. run_cmd "$IP nexthop add id 1"
  1582. log_test $? 2 "Nexthop with no device or gateway"
  1583. # attempt to create nh with down device - fails
  1584. $IP li set veth1 down
  1585. run_cmd "$IP nexthop add id 1 dev veth1"
  1586. log_test $? 2 "Nexthop with down device"
  1587. # create nh with linkdown device - fails
  1588. $IP li set veth1 up
  1589. ip -netns peer li set veth2 down
  1590. run_cmd "$IP nexthop add id 1 dev veth1"
  1591. log_test $? 2 "Nexthop with device that is linkdown"
  1592. ip -netns peer li set veth2 up
  1593. # device only
  1594. run_cmd "$IP nexthop add id 1 dev veth1"
  1595. log_test $? 0 "Nexthop with device only"
  1596. # create nh with duplicate id
  1597. run_cmd "$IP nexthop add id 1 dev veth3"
  1598. log_test $? 2 "Nexthop with duplicate id"
  1599. # blackhole nexthop
  1600. run_cmd "$IP nexthop add id 2 blackhole"
  1601. log_test $? 0 "Blackhole nexthop"
  1602. # blackhole nexthop can not have other specs
  1603. run_cmd "$IP nexthop replace id 2 blackhole dev veth1"
  1604. log_test $? 2 "Blackhole nexthop with other attributes"
  1605. # blackhole nexthop should not be affected by the state of the loopback
  1606. # device
  1607. run_cmd "$IP link set dev lo down"
  1608. check_nexthop "id 2" "id 2 blackhole"
  1609. log_test $? 0 "Blackhole nexthop with loopback device down"
  1610. run_cmd "$IP link set dev lo up"
  1611. # Dump should not loop endlessly when maximum nexthop ID is configured.
  1612. run_cmd "$IP nexthop add id $((2**32-1)) blackhole"
  1613. run_cmd "timeout 5 $IP nexthop"
  1614. log_test $? 0 "Maximum nexthop ID dump"
  1615. #
  1616. # groups
  1617. #
  1618. run_cmd "$IP nexthop add id 101 group 1"
  1619. log_test $? 0 "Create group"
  1620. run_cmd "$IP nexthop add id 102 group 2"
  1621. log_test $? 0 "Create group with blackhole nexthop"
  1622. # multipath group can not have a blackhole as 1 path
  1623. run_cmd "$IP nexthop add id 103 group 1/2"
  1624. log_test $? 2 "Create multipath group where 1 path is a blackhole"
  1625. # multipath group can not have a member replaced by a blackhole
  1626. run_cmd "$IP nexthop replace id 2 dev veth3"
  1627. run_cmd "$IP nexthop replace id 102 group 1/2"
  1628. run_cmd "$IP nexthop replace id 2 blackhole"
  1629. log_test $? 2 "Multipath group can not have a member replaced by blackhole"
  1630. # attempt to create group with non-existent nexthop
  1631. run_cmd "$IP nexthop add id 103 group 12"
  1632. log_test $? 2 "Create group with non-existent nexthop"
  1633. # attempt to create group with same nexthop
  1634. run_cmd "$IP nexthop add id 103 group 1/1"
  1635. log_test $? 2 "Create group with same nexthop multiple times"
  1636. # replace nexthop with a group - fails
  1637. run_cmd "$IP nexthop replace id 2 group 1"
  1638. log_test $? 2 "Replace nexthop with nexthop group"
  1639. # replace nexthop group with a nexthop - fails
  1640. run_cmd "$IP nexthop replace id 101 dev veth1"
  1641. log_test $? 2 "Replace nexthop group with nexthop"
  1642. # nexthop group with other attributes fail
  1643. run_cmd "$IP nexthop add id 104 group 1 dev veth1"
  1644. log_test $? 2 "Nexthop group and device"
  1645. # Tests to ensure that flushing works as expected.
  1646. run_cmd "$IP nexthop add id 105 blackhole proto 99"
  1647. run_cmd "$IP nexthop add id 106 blackhole proto 100"
  1648. run_cmd "$IP nexthop add id 107 blackhole proto 99"
  1649. run_cmd "$IP nexthop flush proto 99"
  1650. check_nexthop "id 105" ""
  1651. check_nexthop "id 106" "id 106 blackhole proto 100"
  1652. check_nexthop "id 107" ""
  1653. run_cmd "$IP nexthop flush proto 100"
  1654. check_nexthop "id 106" ""
  1655. run_cmd "$IP nexthop flush proto 100"
  1656. log_test $? 0 "Test proto flush"
  1657. run_cmd "$IP nexthop add id 104 group 1 blackhole"
  1658. log_test $? 2 "Nexthop group and blackhole"
  1659. $IP nexthop flush >/dev/null 2>&1
  1660. # Test to ensure that flushing with a multi-part nexthop dump works as
  1661. # expected.
  1662. local batch_file=$(mktemp)
  1663. for i in $(seq 1 $((64 * 1024))); do
  1664. echo "nexthop add id $i blackhole" >> $batch_file
  1665. done
  1666. $IP -b $batch_file
  1667. $IP nexthop flush >/dev/null 2>&1
  1668. [[ $($IP nexthop | wc -l) -eq 0 ]]
  1669. log_test $? 0 "Large scale nexthop flushing"
  1670. rm $batch_file
  1671. }
  1672. check_nexthop_buckets_balance()
  1673. {
  1674. local nharg=$1; shift
  1675. local ret
  1676. while (($# > 0)); do
  1677. local selector=$1; shift
  1678. local condition=$1; shift
  1679. local count
  1680. count=$($IP -j nexthop bucket ${nharg} ${selector} | jq length)
  1681. (( $count $condition ))
  1682. ret=$?
  1683. if ((ret != 0)); then
  1684. return $ret
  1685. fi
  1686. done
  1687. return 0
  1688. }
  1689. basic_res()
  1690. {
  1691. echo
  1692. echo "Basic resilient nexthop group functional tests"
  1693. echo "----------------------------------------------"
  1694. check_nexthop_res_support
  1695. if [ $? -eq $ksft_skip ]; then
  1696. return $ksft_skip
  1697. fi
  1698. run_cmd "$IP nexthop add id 1 dev veth1"
  1699. #
  1700. # resilient nexthop group addition
  1701. #
  1702. run_cmd "$IP nexthop add id 101 group 1 type resilient buckets 8"
  1703. log_test $? 0 "Add a nexthop group with default parameters"
  1704. run_cmd "$IP nexthop get id 101"
  1705. check_nexthop "id 101" \
  1706. "id 101 group 1 type resilient buckets 8 idle_timer 120 unbalanced_timer 0 unbalanced_time 0"
  1707. log_test $? 0 "Get a nexthop group with default parameters"
  1708. run_cmd "$IP nexthop add id 102 group 1 type resilient
  1709. buckets 4 idle_timer 100 unbalanced_timer 5"
  1710. run_cmd "$IP nexthop get id 102"
  1711. check_nexthop "id 102" \
  1712. "id 102 group 1 type resilient buckets 4 idle_timer 100 unbalanced_timer 5 unbalanced_time 0"
  1713. log_test $? 0 "Get a nexthop group with non-default parameters"
  1714. run_cmd "$IP nexthop add id 103 group 1 type resilient buckets 0"
  1715. log_test $? 2 "Add a nexthop group with 0 buckets"
  1716. #
  1717. # resilient nexthop group replacement
  1718. #
  1719. run_cmd "$IP nexthop replace id 101 group 1 type resilient
  1720. buckets 8 idle_timer 240 unbalanced_timer 80"
  1721. log_test $? 0 "Replace nexthop group parameters"
  1722. check_nexthop "id 101" \
  1723. "id 101 group 1 type resilient buckets 8 idle_timer 240 unbalanced_timer 80 unbalanced_time 0"
  1724. log_test $? 0 "Get a nexthop group after replacing parameters"
  1725. run_cmd "$IP nexthop replace id 101 group 1 type resilient idle_timer 512"
  1726. log_test $? 0 "Replace idle timer"
  1727. check_nexthop "id 101" \
  1728. "id 101 group 1 type resilient buckets 8 idle_timer 512 unbalanced_timer 80 unbalanced_time 0"
  1729. log_test $? 0 "Get a nexthop group after replacing idle timer"
  1730. run_cmd "$IP nexthop replace id 101 group 1 type resilient unbalanced_timer 256"
  1731. log_test $? 0 "Replace unbalanced timer"
  1732. check_nexthop "id 101" \
  1733. "id 101 group 1 type resilient buckets 8 idle_timer 512 unbalanced_timer 256 unbalanced_time 0"
  1734. log_test $? 0 "Get a nexthop group after replacing unbalanced timer"
  1735. run_cmd "$IP nexthop replace id 101 group 1 type resilient"
  1736. log_test $? 0 "Replace with no parameters"
  1737. check_nexthop "id 101" \
  1738. "id 101 group 1 type resilient buckets 8 idle_timer 512 unbalanced_timer 256 unbalanced_time 0"
  1739. log_test $? 0 "Get a nexthop group after replacing no parameters"
  1740. run_cmd "$IP nexthop replace id 101 group 1"
  1741. log_test $? 2 "Replace nexthop group type - implicit"
  1742. run_cmd "$IP nexthop replace id 101 group 1 type mpath"
  1743. log_test $? 2 "Replace nexthop group type - explicit"
  1744. run_cmd "$IP nexthop replace id 101 group 1 type resilient buckets 1024"
  1745. log_test $? 2 "Replace number of nexthop buckets"
  1746. check_nexthop "id 101" \
  1747. "id 101 group 1 type resilient buckets 8 idle_timer 512 unbalanced_timer 256 unbalanced_time 0"
  1748. log_test $? 0 "Get a nexthop group after replacing with invalid parameters"
  1749. #
  1750. # resilient nexthop buckets dump
  1751. #
  1752. $IP nexthop flush >/dev/null 2>&1
  1753. run_cmd "$IP nexthop add id 1 dev veth1"
  1754. run_cmd "$IP nexthop add id 2 dev veth3"
  1755. run_cmd "$IP nexthop add id 101 group 1/2 type resilient buckets 4"
  1756. run_cmd "$IP nexthop add id 201 group 1/2"
  1757. check_nexthop_bucket "" \
  1758. "id 101 index 0 nhid 2 id 101 index 1 nhid 2 id 101 index 2 nhid 1 id 101 index 3 nhid 1"
  1759. log_test $? 0 "Dump all nexthop buckets"
  1760. check_nexthop_bucket "list id 101" \
  1761. "id 101 index 0 nhid 2 id 101 index 1 nhid 2 id 101 index 2 nhid 1 id 101 index 3 nhid 1"
  1762. log_test $? 0 "Dump all nexthop buckets in a group"
  1763. sleep 0.1
  1764. (( $($IP -j nexthop bucket list id 101 |
  1765. jq '[.[] | select(.bucket.idle_time > 0 and
  1766. .bucket.idle_time < 2)] | length') == 4 ))
  1767. log_test $? 0 "All nexthop buckets report a positive near-zero idle time"
  1768. check_nexthop_bucket "list dev veth1" \
  1769. "id 101 index 2 nhid 1 id 101 index 3 nhid 1"
  1770. log_test $? 0 "Dump all nexthop buckets with a specific nexthop device"
  1771. check_nexthop_bucket "list nhid 2" \
  1772. "id 101 index 0 nhid 2 id 101 index 1 nhid 2"
  1773. log_test $? 0 "Dump all nexthop buckets with a specific nexthop identifier"
  1774. run_cmd "$IP nexthop bucket list id 111"
  1775. log_test $? 2 "Dump all nexthop buckets in a non-existent group"
  1776. run_cmd "$IP nexthop bucket list id 201"
  1777. log_test $? 2 "Dump all nexthop buckets in a non-resilient group"
  1778. run_cmd "$IP nexthop bucket list dev bla"
  1779. log_test $? 255 "Dump all nexthop buckets using a non-existent device"
  1780. run_cmd "$IP nexthop bucket list groups"
  1781. log_test $? 255 "Dump all nexthop buckets with invalid 'groups' keyword"
  1782. run_cmd "$IP nexthop bucket list fdb"
  1783. log_test $? 255 "Dump all nexthop buckets with invalid 'fdb' keyword"
  1784. # Dump should not loop endlessly when maximum nexthop ID is configured.
  1785. run_cmd "$IP nexthop add id $((2**32-1)) group 1/2 type resilient buckets 4"
  1786. run_cmd "timeout 5 $IP nexthop bucket"
  1787. log_test $? 0 "Maximum nexthop ID dump"
  1788. #
  1789. # resilient nexthop buckets get requests
  1790. #
  1791. check_nexthop_bucket "get id 101 index 0" "id 101 index 0 nhid 2"
  1792. log_test $? 0 "Get a valid nexthop bucket"
  1793. run_cmd "$IP nexthop bucket get id 101 index 999"
  1794. log_test $? 2 "Get a nexthop bucket with valid group, but invalid index"
  1795. run_cmd "$IP nexthop bucket get id 201 index 0"
  1796. log_test $? 2 "Get a nexthop bucket from a non-resilient group"
  1797. run_cmd "$IP nexthop bucket get id 999 index 0"
  1798. log_test $? 2 "Get a nexthop bucket from a non-existent group"
  1799. #
  1800. # tests for bucket migration
  1801. #
  1802. $IP nexthop flush >/dev/null 2>&1
  1803. run_cmd "$IP nexthop add id 1 dev veth1"
  1804. run_cmd "$IP nexthop add id 2 dev veth3"
  1805. run_cmd "$IP nexthop add id 101
  1806. group 1/2 type resilient buckets 10
  1807. idle_timer 1 unbalanced_timer 20"
  1808. check_nexthop_buckets_balance "list id 101" \
  1809. "nhid 1" "== 5" \
  1810. "nhid 2" "== 5"
  1811. log_test $? 0 "Initial bucket allocation"
  1812. run_cmd "$IP nexthop replace id 101
  1813. group 1,2/2,3 type resilient"
  1814. check_nexthop_buckets_balance "list id 101" \
  1815. "nhid 1" "== 4" \
  1816. "nhid 2" "== 6"
  1817. log_test $? 0 "Bucket allocation after replace"
  1818. # Check that increase in idle timer does not make buckets appear busy.
  1819. run_cmd "$IP nexthop replace id 101
  1820. group 1,2/2,3 type resilient
  1821. idle_timer 10"
  1822. run_cmd "$IP nexthop replace id 101
  1823. group 1/2 type resilient"
  1824. check_nexthop_buckets_balance "list id 101" \
  1825. "nhid 1" "== 5" \
  1826. "nhid 2" "== 5"
  1827. log_test $? 0 "Buckets migrated after idle timer change"
  1828. $IP nexthop flush >/dev/null 2>&1
  1829. }
  1830. ################################################################################
  1831. # usage
  1832. usage()
  1833. {
  1834. cat <<EOF
  1835. usage: ${0##*/} OPTS
  1836. -t <test> Test(s) to run (default: all)
  1837. (options: $ALL_TESTS)
  1838. -4 IPv4 tests only
  1839. -6 IPv6 tests only
  1840. -p Pause on fail
  1841. -P Pause after each test before cleanup
  1842. -v verbose mode (show commands and output)
  1843. -w Timeout for ping
  1844. Runtime test
  1845. -n num Number of nexthops to target
  1846. -N Use new style to install routes in DUT
  1847. done
  1848. EOF
  1849. }
  1850. ################################################################################
  1851. # main
  1852. while getopts :t:pP46hvw: o
  1853. do
  1854. case $o in
  1855. t) TESTS=$OPTARG;;
  1856. 4) TESTS=${IPV4_TESTS};;
  1857. 6) TESTS=${IPV6_TESTS};;
  1858. p) PAUSE_ON_FAIL=yes;;
  1859. P) PAUSE=yes;;
  1860. v) VERBOSE=$(($VERBOSE + 1));;
  1861. w) PING_TIMEOUT=$OPTARG;;
  1862. h) usage; exit 0;;
  1863. *) usage; exit 1;;
  1864. esac
  1865. done
  1866. # make sure we don't pause twice
  1867. [ "${PAUSE}" = "yes" ] && PAUSE_ON_FAIL=no
  1868. if [ "$(id -u)" -ne 0 ];then
  1869. echo "SKIP: Need root privileges"
  1870. exit $ksft_skip;
  1871. fi
  1872. if [ ! -x "$(command -v ip)" ]; then
  1873. echo "SKIP: Could not run test without ip tool"
  1874. exit $ksft_skip
  1875. fi
  1876. ip help 2>&1 | grep -q nexthop
  1877. if [ $? -ne 0 ]; then
  1878. echo "SKIP: iproute2 too old, missing nexthop command"
  1879. exit $ksft_skip
  1880. fi
  1881. out=$(ip nexthop ls 2>&1 | grep -q "Operation not supported")
  1882. if [ $? -eq 0 ]; then
  1883. echo "SKIP: kernel lacks nexthop support"
  1884. exit $ksft_skip
  1885. fi
  1886. for t in $TESTS
  1887. do
  1888. case $t in
  1889. none) IP="ip -netns peer"; setup; exit 0;;
  1890. *) setup; $t; cleanup;;
  1891. esac
  1892. done
  1893. if [ "$TESTS" != "none" ]; then
  1894. printf "\nTests passed: %3d\n" ${nsuccess}
  1895. printf "Tests failed: %3d\n" ${nfail}
  1896. fi
  1897. exit $ret