fib_nexthops.sh 74 KB

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