ioam6.sh 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0+
  3. #
  4. # Author: Justin Iurman <justin.iurman@uliege.be>
  5. #
  6. # This script evaluates IOAM for IPv6 by checking local IOAM configurations and
  7. # IOAM data inside packets. There are three categories of tests: LOCAL, OUTPUT,
  8. # and INPUT. The former (LOCAL) checks all IOAM related configurations locally
  9. # without sending packets. OUTPUT tests verify the processing of an IOAM
  10. # encapsulating node, while INPUT tests verify the processing of an IOAM transit
  11. # node. Both OUTPUT and INPUT tests send packets. Each test is documented inside
  12. # its own handler.
  13. #
  14. # The topology used for OUTPUT and INPUT tests is made of three nodes:
  15. # - Alpha (the IOAM encapsulating node)
  16. # - Beta (the IOAM transit node)
  17. # - Gamma (the receiver) **
  18. #
  19. # An IOAM domain is configured from Alpha to Beta, but not on the reverse path.
  20. # Alpha adds an IOAM option (Pre-allocated Trace) inside a Hop-by-hop.
  21. #
  22. # ** Gamma is required because ioam6_parser.c uses a packet socket and we need
  23. # to see IOAM data inserted by the very last node (Beta), which would happen
  24. # _after_ we get a copy of the packet on Beta. Note that using an
  25. # IPv6 raw socket with IPV6_RECVHOPOPTS on Beta would not be enough: we also
  26. # need to access the IPv6 header to check some fields (e.g., source and
  27. # destination addresses), which is not possible in that case. As a
  28. # consequence, we need Gamma as a receiver to run ioam6_parser.c which uses a
  29. # packet socket.
  30. #
  31. #
  32. # +-----------------------+ +-----------------------+
  33. # | | | |
  34. # | Alpha netns | | Gamma netns |
  35. # | | | |
  36. # | +-------------------+ | | +-------------------+ |
  37. # | | veth0 | | | | veth0 | |
  38. # | | 2001:db8:1::2/64 | | | | 2001:db8:2::2/64 | |
  39. # | +-------------------+ | | +-------------------+ |
  40. # | . | | . |
  41. # +-----------.-----------+ +-----------.-----------+
  42. # . .
  43. # . .
  44. # . .
  45. # +-----------.----------------------------------.-----------+
  46. # | . . |
  47. # | +-------------------+ +-------------------+ |
  48. # | | veth0 | | veth1 | |
  49. # | | 2001:db8:1::1/64 | ............ | 2001:db8:2::1/64 | |
  50. # | +-------------------+ +-------------------+ |
  51. # | |
  52. # | Beta netns |
  53. # | |
  54. # +----------------------------------------------------------+
  55. #
  56. #
  57. #
  58. # +==========================================================+
  59. # | Alpha - IOAM configuration |
  60. # +=====================+====================================+
  61. # | Node ID | 1 |
  62. # +---------------------+------------------------------------+
  63. # | Node Wide ID | 11111111 |
  64. # +---------------------+------------------------------------+
  65. # | Ingress ID | 0xffff (default value) |
  66. # +---------------------+------------------------------------+
  67. # | Ingress Wide ID | 0xffffffff (default value) |
  68. # +---------------------+------------------------------------+
  69. # | Egress ID | 101 |
  70. # +---------------------+------------------------------------+
  71. # | Egress Wide ID | 101101 |
  72. # +---------------------+------------------------------------+
  73. # | Namespace Data | 0xdeadbeef |
  74. # +---------------------+------------------------------------+
  75. # | Namespace Wide Data | 0xcafec0caf00dc0de |
  76. # +---------------------+------------------------------------+
  77. # | Schema ID | 777 |
  78. # +---------------------+------------------------------------+
  79. # | Schema Data | something that will be 4n-aligned |
  80. # +---------------------+------------------------------------+
  81. #
  82. #
  83. # +==========================================================+
  84. # | Beta - IOAM configuration |
  85. # +=====================+====================================+
  86. # | Node ID | 2 |
  87. # +---------------------+------------------------------------+
  88. # | Node Wide ID | 22222222 |
  89. # +---------------------+------------------------------------+
  90. # | Ingress ID | 201 |
  91. # +---------------------+------------------------------------+
  92. # | Ingress Wide ID | 201201 |
  93. # +---------------------+------------------------------------+
  94. # | Egress ID | 202 |
  95. # +---------------------+------------------------------------+
  96. # | Egress Wide ID | 202202 |
  97. # +---------------------+------------------------------------+
  98. # | Namespace Data | 0xffffffff (default value) |
  99. # +---------------------+------------------------------------+
  100. # | Namespace Wide Data | 0xffffffffffffffff (default value) |
  101. # +---------------------+------------------------------------+
  102. # | Schema ID | 0xffffff (= None) |
  103. # +---------------------+------------------------------------+
  104. # | Schema Data | |
  105. # +---------------------+------------------------------------+
  106. source lib.sh
  107. ################################################################################
  108. # #
  109. # WARNING: Be careful if you modify the block below - it MUST be kept #
  110. # synchronized with configurations inside ioam6_parser.c and always #
  111. # reflect the same. #
  112. # #
  113. ################################################################################
  114. ALPHA=(
  115. 1 # ID
  116. 11111111 # Wide ID
  117. 0xffff # Ingress ID (default value)
  118. 0xffffffff # Ingress Wide ID (default value)
  119. 101 # Egress ID
  120. 101101 # Egress Wide ID
  121. 0xdeadbeef # Namespace Data
  122. 0xcafec0caf00dc0de # Namespace Wide Data
  123. 777 # Schema ID
  124. "something that will be 4n-aligned" # Schema Data
  125. )
  126. BETA=(
  127. 2 # ID
  128. 22222222 # Wide ID
  129. 201 # Ingress ID
  130. 201201 # Ingress Wide ID
  131. 202 # Egress ID
  132. 202202 # Egress Wide ID
  133. 0xffffffff # Namespace Data (empty value)
  134. 0xffffffffffffffff # Namespace Wide Data (empty value)
  135. 0xffffff # Schema ID (empty value)
  136. "" # Schema Data (empty value)
  137. )
  138. TESTS_LOCAL="
  139. local_sysctl_ioam_id
  140. local_sysctl_ioam_id_wide
  141. local_sysctl_ioam_intf_id
  142. local_sysctl_ioam_intf_id_wide
  143. local_sysctl_ioam_intf_enabled
  144. local_ioam_namespace
  145. local_ioam_schema
  146. local_ioam_schema_namespace
  147. local_route_ns
  148. local_route_tunsrc
  149. local_route_tundst
  150. local_route_trace_type
  151. local_route_trace_size
  152. local_route_trace_type_bits
  153. local_route_trace_size_values
  154. "
  155. TESTS_OUTPUT="
  156. output_undef_ns
  157. output_no_room
  158. output_no_room_oss
  159. output_bits
  160. output_sizes
  161. output_full_supp_trace
  162. "
  163. TESTS_INPUT="
  164. input_undef_ns
  165. input_no_room
  166. input_no_room_oss
  167. input_disabled
  168. input_oflag
  169. input_bits
  170. input_sizes
  171. input_full_supp_trace
  172. "
  173. ################################################################################
  174. # #
  175. # LIBRARY #
  176. # #
  177. ################################################################################
  178. check_kernel_compatibility()
  179. {
  180. setup_ns ioam_tmp_node &>/dev/null
  181. local ret=$?
  182. ip link add name veth0 netns $ioam_tmp_node type veth \
  183. peer name veth1 netns $ioam_tmp_node &>/dev/null
  184. ret=$((ret + $?))
  185. ip -netns $ioam_tmp_node link set veth0 up &>/dev/null
  186. ret=$((ret + $?))
  187. ip -netns $ioam_tmp_node link set veth1 up &>/dev/null
  188. ret=$((ret + $?))
  189. if [ $ret != 0 ]
  190. then
  191. echo "SKIP: Setup failed."
  192. cleanup_ns $ioam_tmp_node
  193. exit $ksft_skip
  194. fi
  195. ip -netns $ioam_tmp_node route add 2001:db8:2::/64 \
  196. encap ioam6 trace prealloc type 0x800000 ns 0 size 4 dev veth0 &>/dev/null
  197. ret=$?
  198. ip -netns $ioam_tmp_node -6 route 2>/dev/null | grep -q "encap ioam6"
  199. ret=$((ret + $?))
  200. if [ $ret != 0 ]
  201. then
  202. echo "SKIP: Cannot attach an IOAM trace to a route. Was your kernel" \
  203. "compiled without CONFIG_IPV6_IOAM6_LWTUNNEL? Are you running an" \
  204. "old kernel? Are you using an old version of iproute2?"
  205. cleanup_ns $ioam_tmp_node
  206. exit $ksft_skip
  207. fi
  208. cleanup_ns $ioam_tmp_node
  209. lsmod 2>/dev/null | grep -q "ip6_tunnel"
  210. ip6tnl_loaded=$?
  211. if [ $ip6tnl_loaded == 0 ]
  212. then
  213. encap_tests=0
  214. else
  215. modprobe ip6_tunnel &>/dev/null
  216. lsmod 2>/dev/null | grep -q "ip6_tunnel"
  217. encap_tests=$?
  218. if [ $encap_tests != 0 ]
  219. then
  220. ip a 2>/dev/null | grep -q "ip6tnl0"
  221. encap_tests=$?
  222. if [ $encap_tests != 0 ]
  223. then
  224. echo "Note: ip6_tunnel not found neither as a module nor inside the" \
  225. "kernel. Any tests that require it will be skipped."
  226. fi
  227. fi
  228. fi
  229. }
  230. cleanup()
  231. {
  232. cleanup_ns $ioam_node_alpha $ioam_node_beta $ioam_node_gamma
  233. if [ $ip6tnl_loaded != 0 ]
  234. then
  235. modprobe -r ip6_tunnel &>/dev/null
  236. fi
  237. }
  238. setup()
  239. {
  240. setup_ns ioam_node_alpha ioam_node_beta ioam_node_gamma &>/dev/null
  241. ip link add name ioam-veth-alpha netns $ioam_node_alpha type veth \
  242. peer name ioam-veth-betaL netns $ioam_node_beta &>/dev/null
  243. ip link add name ioam-veth-betaR netns $ioam_node_beta type veth \
  244. peer name ioam-veth-gamma netns $ioam_node_gamma &>/dev/null
  245. ip -netns $ioam_node_alpha link set ioam-veth-alpha name veth0 &>/dev/null
  246. ip -netns $ioam_node_beta link set ioam-veth-betaL name veth0 &>/dev/null
  247. ip -netns $ioam_node_beta link set ioam-veth-betaR name veth1 &>/dev/null
  248. ip -netns $ioam_node_gamma link set ioam-veth-gamma name veth0 &>/dev/null
  249. ip -netns $ioam_node_alpha addr add 2001:db8:1::2/64 dev veth0 &>/dev/null
  250. ip -netns $ioam_node_alpha addr add 2001:db8:1::50/64 dev veth0 &>/dev/null
  251. ip -netns $ioam_node_alpha link set veth0 up &>/dev/null
  252. ip -netns $ioam_node_alpha link set lo up &>/dev/null
  253. ip -netns $ioam_node_alpha route add 2001:db8:2::/64 \
  254. via 2001:db8:1::1 dev veth0 &>/dev/null
  255. ip -netns $ioam_node_beta addr add 2001:db8:1::1/64 dev veth0 &>/dev/null
  256. ip -netns $ioam_node_beta addr add 2001:db8:2::1/64 dev veth1 &>/dev/null
  257. ip -netns $ioam_node_beta link set veth0 up &>/dev/null
  258. ip -netns $ioam_node_beta link set veth1 up &>/dev/null
  259. ip -netns $ioam_node_beta link set lo up &>/dev/null
  260. ip -netns $ioam_node_gamma addr add 2001:db8:2::2/64 dev veth0 &>/dev/null
  261. ip -netns $ioam_node_gamma link set veth0 up &>/dev/null
  262. ip -netns $ioam_node_gamma link set lo up &>/dev/null
  263. ip -netns $ioam_node_gamma route add 2001:db8:1::/64 \
  264. via 2001:db8:2::1 dev veth0 &>/dev/null
  265. # - Alpha: IOAM config -
  266. ip netns exec $ioam_node_alpha \
  267. sysctl -wq net.ipv6.ioam6_id=${ALPHA[0]} &>/dev/null
  268. ip netns exec $ioam_node_alpha \
  269. sysctl -wq net.ipv6.ioam6_id_wide=${ALPHA[1]} &>/dev/null
  270. ip netns exec $ioam_node_alpha \
  271. sysctl -wq net.ipv6.conf.veth0.ioam6_id=${ALPHA[4]} &>/dev/null
  272. ip netns exec $ioam_node_alpha \
  273. sysctl -wq net.ipv6.conf.veth0.ioam6_id_wide=${ALPHA[5]} &>/dev/null
  274. ip -netns $ioam_node_alpha \
  275. ioam namespace add 123 data ${ALPHA[6]} wide ${ALPHA[7]} &>/dev/null
  276. ip -netns $ioam_node_alpha \
  277. ioam schema add ${ALPHA[8]} "${ALPHA[9]}" &>/dev/null
  278. ip -netns $ioam_node_alpha \
  279. ioam namespace set 123 schema ${ALPHA[8]} &>/dev/null
  280. # - Beta: IOAM config -
  281. ip netns exec $ioam_node_beta \
  282. sysctl -wq net.ipv6.conf.all.forwarding=1 &>/dev/null
  283. ip netns exec $ioam_node_beta \
  284. sysctl -wq net.ipv6.ioam6_id=${BETA[0]} &>/dev/null
  285. ip netns exec $ioam_node_beta \
  286. sysctl -wq net.ipv6.ioam6_id_wide=${BETA[1]} &>/dev/null
  287. ip netns exec $ioam_node_beta \
  288. sysctl -wq net.ipv6.conf.veth0.ioam6_enabled=1 &>/dev/null
  289. ip netns exec $ioam_node_beta \
  290. sysctl -wq net.ipv6.conf.veth0.ioam6_id=${BETA[2]} &>/dev/null
  291. ip netns exec $ioam_node_beta \
  292. sysctl -wq net.ipv6.conf.veth0.ioam6_id_wide=${BETA[3]} &>/dev/null
  293. ip netns exec $ioam_node_beta \
  294. sysctl -wq net.ipv6.conf.veth1.ioam6_id=${BETA[4]} &>/dev/null
  295. ip netns exec $ioam_node_beta \
  296. sysctl -wq net.ipv6.conf.veth1.ioam6_id_wide=${BETA[5]} &>/dev/null
  297. ip -netns $ioam_node_beta ioam namespace add 123 &>/dev/null
  298. sleep 1
  299. ip netns exec $ioam_node_alpha ping6 -c 5 -W 1 2001:db8:2::2 &>/dev/null
  300. if [ $? != 0 ]
  301. then
  302. echo "SKIP: Setup failed."
  303. cleanup
  304. exit $ksft_skip
  305. fi
  306. }
  307. log_test_passed()
  308. {
  309. printf " - TEST: %-57s [ OK ]\n" "$1"
  310. npassed=$((npassed+1))
  311. }
  312. log_test_skipped()
  313. {
  314. printf " - TEST: %-57s [SKIP]\n" "$1"
  315. nskipped=$((nskipped+1))
  316. }
  317. log_test_failed()
  318. {
  319. printf " - TEST: %-57s [FAIL]\n" "$1"
  320. nfailed=$((nfailed+1))
  321. }
  322. run_test()
  323. {
  324. local name=$1
  325. local desc=$2
  326. local ip6_src=$3
  327. local trace_type=$4
  328. local trace_size=$5
  329. local ioam_ns=$6
  330. local type=$7
  331. ip netns exec $ioam_node_gamma \
  332. ./ioam6_parser veth0 $name $ip6_src 2001:db8:2::2 \
  333. $trace_type $trace_size $ioam_ns $type &
  334. local spid=$!
  335. sleep 0.1
  336. ip netns exec $ioam_node_alpha ping6 -t 64 -c 1 -W 1 2001:db8:2::2 &>/dev/null
  337. if [ $? != 0 ]
  338. then
  339. log_test_failed "${desc}"
  340. kill -2 $spid &>/dev/null
  341. else
  342. wait $spid
  343. [ $? == 0 ] && log_test_passed "${desc}" || log_test_failed "${desc}"
  344. fi
  345. }
  346. run()
  347. {
  348. local test
  349. echo
  350. printf "+"
  351. printf "%0.s-" {1..72}
  352. printf "+"
  353. echo
  354. printf "| %-28s LOCAL tests %-29s |"
  355. echo
  356. printf "+"
  357. printf "%0.s-" {1..72}
  358. printf "+"
  359. echo
  360. echo
  361. echo "Global config"
  362. for test in $TESTS_LOCAL
  363. do
  364. $test
  365. done
  366. echo
  367. echo "Inline mode"
  368. for test in $TESTS_LOCAL
  369. do
  370. $test "inline"
  371. done
  372. echo
  373. echo "Encap mode"
  374. for test in $TESTS_LOCAL
  375. do
  376. $test "encap"
  377. done
  378. echo
  379. printf "+"
  380. printf "%0.s-" {1..72}
  381. printf "+"
  382. echo
  383. printf "| %-28s OUTPUT tests %-28s |"
  384. echo
  385. printf "+"
  386. printf "%0.s-" {1..72}
  387. printf "+"
  388. echo
  389. # set OUTPUT settings
  390. ip netns exec $ioam_node_beta \
  391. sysctl -wq net.ipv6.conf.veth0.ioam6_enabled=0 &>/dev/null
  392. echo
  393. echo "Inline mode"
  394. for test in $TESTS_OUTPUT
  395. do
  396. $test "inline"
  397. done
  398. echo
  399. echo "Encap mode"
  400. for test in $TESTS_OUTPUT
  401. do
  402. $test "encap"
  403. done
  404. echo
  405. echo "Encap mode (with tunsrc)"
  406. for test in $TESTS_OUTPUT
  407. do
  408. $test "encap" "tunsrc"
  409. done
  410. # clean OUTPUT settings
  411. ip netns exec $ioam_node_beta \
  412. sysctl -wq net.ipv6.conf.veth0.ioam6_enabled=1 &>/dev/null
  413. echo
  414. printf "+"
  415. printf "%0.s-" {1..72}
  416. printf "+"
  417. echo
  418. printf "| %-28s INPUT tests %-29s |"
  419. echo
  420. printf "+"
  421. printf "%0.s-" {1..72}
  422. printf "+"
  423. echo
  424. # set INPUT settings
  425. ip -netns $ioam_node_alpha ioam namespace del 123 &>/dev/null
  426. echo
  427. echo "Inline mode"
  428. for test in $TESTS_INPUT
  429. do
  430. $test "inline"
  431. done
  432. echo
  433. echo "Encap mode"
  434. for test in $TESTS_INPUT
  435. do
  436. $test "encap"
  437. done
  438. # clean INPUT settings
  439. ip -netns $ioam_node_alpha \
  440. ioam namespace add 123 data ${ALPHA[6]} wide ${ALPHA[7]} &>/dev/null
  441. ip -netns $ioam_node_alpha \
  442. ioam namespace set 123 schema ${ALPHA[8]} &>/dev/null
  443. echo
  444. printf "+"
  445. printf "%0.s-" {1..72}
  446. printf "+"
  447. echo
  448. printf "| %-30s Results %-31s |"
  449. echo
  450. printf "+"
  451. printf "%0.s-" {1..72}
  452. printf "+"
  453. echo
  454. echo
  455. echo "- Passed: ${npassed}"
  456. echo "- Skipped: ${nskipped}"
  457. echo "- Failed: ${nfailed}"
  458. echo
  459. }
  460. bit2type=(
  461. 0x800000 0x400000 0x200000 0x100000 0x080000 0x040000 0x020000 0x010000
  462. 0x008000 0x004000 0x002000 0x001000 0x000800 0x000400 0x000200 0x000100
  463. 0x000080 0x000040 0x000020 0x000010 0x000008 0x000004 0x000002 0x000001
  464. )
  465. bit2size=( 4 4 4 4 4 4 4 4 8 8 8 4 4 4 4 4 4 4 4 4 4 4 4 0 )
  466. ################################################################################
  467. # #
  468. # LOCAL tests #
  469. # #
  470. ################################################################################
  471. local_sysctl_ioam_id()
  472. {
  473. ##############################################################################
  474. # Make sure the sysctl "net.ipv6.ioam6_id" works as expected. #
  475. ##############################################################################
  476. local desc="Sysctl net.ipv6.ioam6_id"
  477. [ ! -z $1 ] && return
  478. ip netns exec $ioam_node_alpha \
  479. sysctl net.ipv6.ioam6_id 2>/dev/null | grep -wq ${ALPHA[0]}
  480. [ $? == 0 ] && log_test_passed "${desc}" || log_test_failed "${desc}"
  481. }
  482. local_sysctl_ioam_id_wide()
  483. {
  484. ##############################################################################
  485. # Make sure the sysctl "net.ipv6.ioam6_id_wide" works as expected. #
  486. ##############################################################################
  487. local desc="Sysctl net.ipv6.ioam6_id_wide"
  488. [ ! -z $1 ] && return
  489. ip netns exec $ioam_node_alpha \
  490. sysctl net.ipv6.ioam6_id_wide 2>/dev/null | grep -wq ${ALPHA[1]}
  491. [ $? == 0 ] && log_test_passed "${desc}" || log_test_failed "${desc}"
  492. }
  493. local_sysctl_ioam_intf_id()
  494. {
  495. ##############################################################################
  496. # Make sure the sysctl "net.ipv6.conf.XX.ioam6_id" works as expected. #
  497. ##############################################################################
  498. local desc="Sysctl net.ipv6.conf.XX.ioam6_id"
  499. [ ! -z $1 ] && return
  500. ip netns exec $ioam_node_alpha \
  501. sysctl net.ipv6.conf.veth0.ioam6_id 2>/dev/null | grep -wq ${ALPHA[4]}
  502. [ $? == 0 ] && log_test_passed "${desc}" || log_test_failed "${desc}"
  503. }
  504. local_sysctl_ioam_intf_id_wide()
  505. {
  506. ##############################################################################
  507. # Make sure the sysctl "net.ipv6.conf.XX.ioam6_id_wide" works as expected. #
  508. ##############################################################################
  509. local desc="Sysctl net.ipv6.conf.XX.ioam6_id_wide"
  510. [ ! -z $1 ] && return
  511. ip netns exec $ioam_node_alpha \
  512. sysctl net.ipv6.conf.veth0.ioam6_id_wide 2>/dev/null | grep -wq ${ALPHA[5]}
  513. [ $? == 0 ] && log_test_passed "${desc}" || log_test_failed "${desc}"
  514. }
  515. local_sysctl_ioam_intf_enabled()
  516. {
  517. ##############################################################################
  518. # Make sure the sysctl "net.ipv6.conf.XX.ioam6_enabled" works as expected. #
  519. ##############################################################################
  520. local desc="Sysctl net.ipv6.conf.XX.ioam6_enabled"
  521. [ ! -z $1 ] && return
  522. ip netns exec $ioam_node_beta \
  523. sysctl net.ipv6.conf.veth0.ioam6_enabled 2>/dev/null | grep -wq 1
  524. [ $? == 0 ] && log_test_passed "${desc}" || log_test_failed "${desc}"
  525. }
  526. local_ioam_namespace()
  527. {
  528. ##############################################################################
  529. # Make sure the creation of an IOAM Namespace works as expected. #
  530. ##############################################################################
  531. local desc="Create an IOAM Namespace"
  532. [ ! -z $1 ] && return
  533. ip -netns $ioam_node_alpha \
  534. ioam namespace show 2>/dev/null | grep -wq 123
  535. local ret=$?
  536. ip -netns $ioam_node_alpha \
  537. ioam namespace show 2>/dev/null | grep -wq ${ALPHA[6]}
  538. ret=$((ret + $?))
  539. ip -netns $ioam_node_alpha \
  540. ioam namespace show 2>/dev/null | grep -wq ${ALPHA[7]}
  541. ret=$((ret + $?))
  542. [ $ret == 0 ] && log_test_passed "${desc}" || log_test_failed "${desc}"
  543. }
  544. local_ioam_schema()
  545. {
  546. ##############################################################################
  547. # Make sure the creation of an IOAM Schema works as expected. #
  548. ##############################################################################
  549. local desc="Create an IOAM Schema"
  550. [ ! -z $1 ] && return
  551. ip -netns $ioam_node_alpha \
  552. ioam schema show 2>/dev/null | grep -wq ${ALPHA[8]}
  553. local ret=$?
  554. local sc_data=$(
  555. for i in `seq 0 $((${#ALPHA[9]}-1))`
  556. do
  557. chr=${ALPHA[9]:i:1}
  558. printf "%x " "'${chr}"
  559. done
  560. )
  561. ip -netns $ioam_node_alpha \
  562. ioam schema show 2>/dev/null | grep -q "$sc_data"
  563. ret=$((ret + $?))
  564. [ $ret == 0 ] && log_test_passed "${desc}" || log_test_failed "${desc}"
  565. }
  566. local_ioam_schema_namespace()
  567. {
  568. ##############################################################################
  569. # Make sure the binding of a Schema to a Namespace works as expected. #
  570. ##############################################################################
  571. local desc="Bind an IOAM Schema to an IOAM Namespace"
  572. [ ! -z $1 ] && return
  573. ip -netns $ioam_node_alpha \
  574. ioam namespace show 2>/dev/null | grep -wq ${ALPHA[8]}
  575. local ret=$?
  576. ip -netns $ioam_node_alpha \
  577. ioam schema show 2>/dev/null | grep -wq 123
  578. ret=$((ret + $?))
  579. [ $ret == 0 ] && log_test_passed "${desc}" || log_test_failed "${desc}"
  580. }
  581. local_route_ns()
  582. {
  583. ##############################################################################
  584. # Make sure the Namespace-ID is always provided, whatever the mode. #
  585. ##############################################################################
  586. local desc="Mandatory Namespace-ID"
  587. local mode
  588. [ -z $1 ] && return
  589. [ "$1" == "encap" ] && mode="$1 tundst 2001:db8:2::2" || mode="$1"
  590. ip -netns $ioam_node_alpha \
  591. route change 2001:db8:2::/64 \
  592. encap ioam6 mode $mode trace prealloc type 0x800000 size 4 \
  593. via 2001:db8:1::1 dev veth0 &>/dev/null
  594. local ret1=$?
  595. ip -netns $ioam_node_alpha \
  596. route change 2001:db8:2::/64 \
  597. encap ioam6 mode $mode trace prealloc type 0x800000 ns 0 size 4 \
  598. via 2001:db8:1::1 dev veth0 &>/dev/null
  599. local ret2=$?
  600. [[ $ret1 == 0 || $ret2 != 0 ]] && log_test_failed "${desc}" \
  601. || log_test_passed "${desc}"
  602. ip -netns $ioam_node_alpha \
  603. route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
  604. }
  605. local_route_tunsrc()
  606. {
  607. ##############################################################################
  608. # Make sure the Tunnel Source is only (and possibly) used with encap mode. #
  609. ##############################################################################
  610. local desc
  611. local mode
  612. local mode_tunsrc
  613. [ -z $1 ] && return
  614. if [ "$1" == "encap" ]
  615. then
  616. desc="Optional Tunnel Source"
  617. mode="$1 tundst 2001:db8:2::2"
  618. mode_tunsrc="$1 tunsrc 2001:db8:1::50 tundst 2001:db8:2::2"
  619. else
  620. desc="Unneeded Tunnel Source"
  621. mode="$1"
  622. mode_tunsrc="$1 tunsrc 2001:db8:1::50"
  623. fi
  624. ip -netns $ioam_node_alpha \
  625. route change 2001:db8:2::/64 \
  626. encap ioam6 mode $mode trace prealloc type 0x800000 ns 0 size 4 \
  627. via 2001:db8:1::1 dev veth0 &>/dev/null
  628. local ret1=$?
  629. ip -netns $ioam_node_alpha \
  630. route change 2001:db8:2::/64 \
  631. encap ioam6 mode $mode_tunsrc trace prealloc type 0x800000 ns 0 size 4 \
  632. via 2001:db8:1::1 dev veth0 &>/dev/null
  633. local ret2=$?
  634. if [ "$1" == "encap" ]
  635. then
  636. [[ $ret1 != 0 || $ret2 != 0 ]] && log_test_failed "${desc}" \
  637. || log_test_passed "${desc}"
  638. else
  639. [[ $ret1 != 0 || $ret2 == 0 ]] && log_test_failed "${desc}" \
  640. || log_test_passed "${desc}"
  641. fi
  642. ip -netns $ioam_node_alpha \
  643. route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
  644. }
  645. local_route_tundst()
  646. {
  647. ##############################################################################
  648. # Make sure the Tunnel Destination is only (and always) used with encap mode.#
  649. ##############################################################################
  650. local desc
  651. [ -z $1 ] && return
  652. [ "$1" == "encap" ] && desc="Mandatory Tunnel Destination" \
  653. || desc="Unneeded Tunnel Destination"
  654. local mode="$1"
  655. local mode_tundst="$1 tundst 2001:db8:2::2"
  656. ip -netns $ioam_node_alpha \
  657. route change 2001:db8:2::/64 \
  658. encap ioam6 mode $mode trace prealloc type 0x800000 ns 0 size 4 \
  659. via 2001:db8:1::1 dev veth0 &>/dev/null
  660. local ret1=$?
  661. ip -netns $ioam_node_alpha \
  662. route change 2001:db8:2::/64 \
  663. encap ioam6 mode $mode_tundst trace prealloc type 0x800000 ns 0 size 4 \
  664. via 2001:db8:1::1 dev veth0 &>/dev/null
  665. local ret2=$?
  666. if [ "$1" == "encap" ]
  667. then
  668. [[ $ret1 == 0 || $ret2 != 0 ]] && log_test_failed "${desc}" \
  669. || log_test_passed "${desc}"
  670. else
  671. [[ $ret1 != 0 || $ret2 == 0 ]] && log_test_failed "${desc}" \
  672. || log_test_passed "${desc}"
  673. fi
  674. ip -netns $ioam_node_alpha \
  675. route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
  676. }
  677. local_route_trace_type()
  678. {
  679. ##############################################################################
  680. # Make sure the Trace Type is always provided, whatever the mode. #
  681. ##############################################################################
  682. local desc="Mandatory Trace Type"
  683. local mode
  684. [ -z $1 ] && return
  685. [ "$1" == "encap" ] && mode="$1 tundst 2001:db8:2::2" || mode="$1"
  686. ip -netns $ioam_node_alpha \
  687. route change 2001:db8:2::/64 \
  688. encap ioam6 mode $mode trace prealloc ns 0 size 4 \
  689. via 2001:db8:1::1 dev veth0 &>/dev/null
  690. local ret1=$?
  691. ip -netns $ioam_node_alpha \
  692. route change 2001:db8:2::/64 \
  693. encap ioam6 mode $mode trace prealloc type 0x800000 ns 0 size 4 \
  694. via 2001:db8:1::1 dev veth0 &>/dev/null
  695. local ret2=$?
  696. [[ $ret1 == 0 || $ret2 != 0 ]] && log_test_failed "${desc}" \
  697. || log_test_passed "${desc}"
  698. ip -netns $ioam_node_alpha \
  699. route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
  700. }
  701. local_route_trace_size()
  702. {
  703. ##############################################################################
  704. # Make sure the Trace Size is always provided, whatever the mode. #
  705. ##############################################################################
  706. local desc="Mandatory Trace Size"
  707. local mode
  708. [ -z $1 ] && return
  709. [ "$1" == "encap" ] && mode="$1 tundst 2001:db8:2::2" || mode="$1"
  710. ip -netns $ioam_node_alpha \
  711. route change 2001:db8:2::/64 \
  712. encap ioam6 mode $mode trace prealloc type 0x800000 ns 0 \
  713. via 2001:db8:1::1 dev veth0 &>/dev/null
  714. local ret1=$?
  715. ip -netns $ioam_node_alpha \
  716. route change 2001:db8:2::/64 \
  717. encap ioam6 mode $mode trace prealloc type 0x800000 ns 0 size 4 \
  718. via 2001:db8:1::1 dev veth0 &>/dev/null
  719. local ret2=$?
  720. [[ $ret1 == 0 || $ret2 != 0 ]] && log_test_failed "${desc}" \
  721. || log_test_passed "${desc}"
  722. ip -netns $ioam_node_alpha \
  723. route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
  724. }
  725. local_route_trace_type_bits()
  726. {
  727. ##############################################################################
  728. # Make sure only allowed bits (0-11 and 22) are accepted. #
  729. ##############################################################################
  730. local desc="Trace Type bits"
  731. local mode
  732. [ -z $1 ] && return
  733. [ "$1" == "encap" ] && mode="$1 tundst 2001:db8:2::2" || mode="$1"
  734. local i
  735. for i in {0..23}
  736. do
  737. ip -netns $ioam_node_alpha \
  738. route change 2001:db8:2::/64 \
  739. encap ioam6 mode $mode trace prealloc type ${bit2type[$i]} ns 0 size 4 \
  740. via 2001:db8:1::1 dev veth0 &>/dev/null
  741. if [[ ($? == 0 && (($i -ge 12 && $i -le 21) || $i == 23)) ||
  742. ($? != 0 && (($i -ge 0 && $i -le 11) || $i == 22)) ]]
  743. then
  744. local err=1
  745. break
  746. fi
  747. done
  748. [ -z $err ] && log_test_passed "${desc}" || log_test_failed "${desc}"
  749. ip -netns $ioam_node_alpha \
  750. route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
  751. }
  752. local_route_trace_size_values()
  753. {
  754. ##############################################################################
  755. # Make sure only allowed sizes (multiples of four in [4,244]) are accepted. #
  756. ##############################################################################
  757. local desc="Trace Size values"
  758. local mode
  759. [ -z $1 ] && return
  760. [ "$1" == "encap" ] && mode="$1 tundst 2001:db8:2::2" || mode="$1"
  761. # we also try the next multiple of four after the MAX to check it's refused
  762. local i
  763. for i in {0..248}
  764. do
  765. ip -netns $ioam_node_alpha \
  766. route change 2001:db8:2::/64 \
  767. encap ioam6 mode $mode trace prealloc type 0x800000 ns 0 size $i \
  768. via 2001:db8:1::1 dev veth0 &>/dev/null
  769. if [[ ($? == 0 && ($i == 0 || $i == 248 || $(( $i % 4 )) != 0)) ||
  770. ($? != 0 && $i != 0 && $i != 248 && $(( $i % 4 )) == 0) ]]
  771. then
  772. local err=1
  773. break
  774. fi
  775. done
  776. [ -z $err ] && log_test_passed "${desc}" || log_test_failed "${desc}"
  777. ip -netns $ioam_node_alpha \
  778. route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
  779. }
  780. ################################################################################
  781. # #
  782. # OUTPUT tests #
  783. # #
  784. ################################################################################
  785. output_undef_ns()
  786. {
  787. ##############################################################################
  788. # Make sure an IOAM encapsulating node does NOT fill the trace when the #
  789. # corresponding IOAM Namespace-ID is not configured locally. #
  790. ##############################################################################
  791. local desc="Unknown IOAM Namespace-ID"
  792. local ns=0
  793. local tr_type=0x800000
  794. local tr_size=4
  795. local mode="$1"
  796. local saddr="2001:db8:1::2"
  797. if [ "$1" == "encap" ]
  798. then
  799. if [ $encap_tests != 0 ]
  800. then
  801. log_test_skipped "${desc}"
  802. return
  803. fi
  804. if [ "$2" == "tunsrc" ]
  805. then
  806. saddr="2001:db8:1::50"
  807. mode+=" tunsrc 2001:db8:1::50"
  808. fi
  809. mode+=" tundst 2001:db8:2::2"
  810. ip -netns $ioam_node_gamma link set ip6tnl0 up &>/dev/null
  811. fi
  812. ip -netns $ioam_node_alpha \
  813. route change 2001:db8:2::/64 \
  814. encap ioam6 mode $mode trace prealloc type $tr_type ns $ns size $tr_size \
  815. via 2001:db8:1::1 dev veth0 &>/dev/null
  816. if [ $? == 0 ]
  817. then
  818. run_test ${FUNCNAME[0]} "${desc}" $saddr $tr_type $tr_size $ns $1
  819. else
  820. log_test_failed "${desc}"
  821. fi
  822. ip -netns $ioam_node_alpha \
  823. route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
  824. [ "$1" == "encap" ] && ip -netns $ioam_node_gamma \
  825. link set ip6tnl0 down &>/dev/null
  826. }
  827. output_no_room()
  828. {
  829. ##############################################################################
  830. # Make sure an IOAM encapsulating node does NOT fill the trace AND sets the #
  831. # Overflow flag when there is not enough room for its data. #
  832. ##############################################################################
  833. local desc="Missing room for data"
  834. local ns=123
  835. local tr_type=0xc00000
  836. local tr_size=4
  837. local mode="$1"
  838. local saddr="2001:db8:1::2"
  839. if [ "$1" == "encap" ]
  840. then
  841. if [ $encap_tests != 0 ]
  842. then
  843. log_test_skipped "${desc}"
  844. return
  845. fi
  846. if [ "$2" == "tunsrc" ]
  847. then
  848. saddr="2001:db8:1::50"
  849. mode+=" tunsrc 2001:db8:1::50"
  850. fi
  851. mode+=" tundst 2001:db8:2::2"
  852. ip -netns $ioam_node_gamma link set ip6tnl0 up &>/dev/null
  853. fi
  854. ip -netns $ioam_node_alpha \
  855. route change 2001:db8:2::/64 \
  856. encap ioam6 mode $mode trace prealloc type $tr_type ns $ns size $tr_size \
  857. via 2001:db8:1::1 dev veth0 &>/dev/null
  858. if [ $? == 0 ]
  859. then
  860. run_test ${FUNCNAME[0]} "${desc}" $saddr $tr_type $tr_size $ns $1
  861. else
  862. log_test_failed "${desc}"
  863. fi
  864. ip -netns $ioam_node_alpha \
  865. route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
  866. [ "$1" == "encap" ] && ip -netns $ioam_node_gamma \
  867. link set ip6tnl0 down &>/dev/null
  868. }
  869. output_no_room_oss()
  870. {
  871. ##############################################################################
  872. # Make sure an IOAM encapsulating node does NOT fill the trace AND sets the #
  873. # Overflow flag when there is not enough room for the Opaque State Snapshot. #
  874. ##############################################################################
  875. local desc="Missing room for Opaque State Snapshot"
  876. local ns=123
  877. local tr_type=0x000002
  878. local tr_size=4
  879. local mode="$1"
  880. local saddr="2001:db8:1::2"
  881. if [ "$1" == "encap" ]
  882. then
  883. if [ $encap_tests != 0 ]
  884. then
  885. log_test_skipped "${desc}"
  886. return
  887. fi
  888. if [ "$2" == "tunsrc" ]
  889. then
  890. saddr="2001:db8:1::50"
  891. mode+=" tunsrc 2001:db8:1::50"
  892. fi
  893. mode+=" tundst 2001:db8:2::2"
  894. ip -netns $ioam_node_gamma link set ip6tnl0 up &>/dev/null
  895. fi
  896. ip -netns $ioam_node_alpha \
  897. route change 2001:db8:2::/64 \
  898. encap ioam6 mode $mode trace prealloc type $tr_type ns $ns size $tr_size \
  899. via 2001:db8:1::1 dev veth0 &>/dev/null
  900. if [ $? == 0 ]
  901. then
  902. run_test ${FUNCNAME[0]} "${desc}" $saddr $tr_type $tr_size $ns $1
  903. else
  904. log_test_failed "${desc}"
  905. fi
  906. ip -netns $ioam_node_alpha \
  907. route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
  908. [ "$1" == "encap" ] && ip -netns $ioam_node_gamma \
  909. link set ip6tnl0 down &>/dev/null
  910. }
  911. output_bits()
  912. {
  913. ##############################################################################
  914. # Make sure an IOAM encapsulating node implements all supported bits by #
  915. # checking it correctly fills the trace with its data. #
  916. ##############################################################################
  917. local desc="Trace Type with supported bit <n> only"
  918. local ns=123
  919. local mode="$1"
  920. local saddr="2001:db8:1::2"
  921. if [ "$1" == "encap" ]
  922. then
  923. if [ "$2" == "tunsrc" ]
  924. then
  925. saddr="2001:db8:1::50"
  926. mode+=" tunsrc 2001:db8:1::50"
  927. fi
  928. mode+=" tundst 2001:db8:2::2"
  929. ip -netns $ioam_node_gamma link set ip6tnl0 up &>/dev/null
  930. fi
  931. local tmp=${bit2size[22]}
  932. bit2size[22]=$(( $tmp + ${#ALPHA[9]} + ((4 - (${#ALPHA[9]} % 4)) % 4) ))
  933. local i
  934. for i in {0..11} {22..22}
  935. do
  936. local descr="${desc/<n>/$i}"
  937. if [[ "$1" == "encap" && $encap_tests != 0 ]]
  938. then
  939. log_test_skipped "${descr}"
  940. continue
  941. fi
  942. ip -netns $ioam_node_alpha \
  943. route change 2001:db8:2::/64 \
  944. encap ioam6 mode $mode trace prealloc \
  945. type ${bit2type[$i]} ns $ns size ${bit2size[$i]} \
  946. via 2001:db8:1::1 dev veth0 &>/dev/null
  947. if [ $? == 0 ]
  948. then
  949. run_test "output_bit$i" "${descr}" $saddr \
  950. ${bit2type[$i]} ${bit2size[$i]} $ns $1
  951. else
  952. log_test_failed "${descr}"
  953. fi
  954. done
  955. ip -netns $ioam_node_alpha \
  956. route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
  957. [ "$1" == "encap" ] && ip -netns $ioam_node_gamma \
  958. link set ip6tnl0 down &>/dev/null
  959. bit2size[22]=$tmp
  960. }
  961. output_sizes()
  962. {
  963. ##############################################################################
  964. # Make sure an IOAM encapsulating node allocates supported sizes correctly. #
  965. ##############################################################################
  966. local desc="Trace Size of <n> bytes"
  967. local ns=0
  968. local tr_type=0x800000
  969. local mode="$1"
  970. local saddr="2001:db8:1::2"
  971. if [ "$1" == "encap" ]
  972. then
  973. if [ "$2" == "tunsrc" ]
  974. then
  975. saddr="2001:db8:1::50"
  976. mode+=" tunsrc 2001:db8:1::50"
  977. fi
  978. mode+=" tundst 2001:db8:2::2"
  979. ip -netns $ioam_node_gamma link set ip6tnl0 up &>/dev/null
  980. fi
  981. local i
  982. for i in $(seq 4 4 244)
  983. do
  984. local descr="${desc/<n>/$i}"
  985. if [[ "$1" == "encap" && $encap_tests != 0 ]]
  986. then
  987. log_test_skipped "${descr}"
  988. continue
  989. fi
  990. ip -netns $ioam_node_alpha \
  991. route change 2001:db8:2::/64 \
  992. encap ioam6 mode $mode trace prealloc type $tr_type ns $ns size $i \
  993. via 2001:db8:1::1 dev veth0 &>/dev/null
  994. if [ $? == 0 ]
  995. then
  996. run_test "output_size$i" "${descr}" $saddr $tr_type $i $ns $1
  997. else
  998. log_test_failed "${descr}"
  999. fi
  1000. done
  1001. ip -netns $ioam_node_alpha \
  1002. route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
  1003. [ "$1" == "encap" ] && ip -netns $ioam_node_gamma \
  1004. link set ip6tnl0 down &>/dev/null
  1005. }
  1006. output_full_supp_trace()
  1007. {
  1008. ##############################################################################
  1009. # Make sure an IOAM encapsulating node correctly fills a trace when all #
  1010. # supported bits are set. #
  1011. ##############################################################################
  1012. local desc="Full supported trace"
  1013. local ns=123
  1014. local tr_type=0xfff002
  1015. local tr_size
  1016. local mode="$1"
  1017. local saddr="2001:db8:1::2"
  1018. if [ "$1" == "encap" ]
  1019. then
  1020. if [ $encap_tests != 0 ]
  1021. then
  1022. log_test_skipped "${desc}"
  1023. return
  1024. fi
  1025. if [ "$2" == "tunsrc" ]
  1026. then
  1027. saddr="2001:db8:1::50"
  1028. mode+=" tunsrc 2001:db8:1::50"
  1029. fi
  1030. mode+=" tundst 2001:db8:2::2"
  1031. ip -netns $ioam_node_gamma link set ip6tnl0 up &>/dev/null
  1032. fi
  1033. local i
  1034. tr_size=$(( ${#ALPHA[9]} + ((4 - (${#ALPHA[9]} % 4)) % 4) ))
  1035. for i in {0..11} {22..22}
  1036. do
  1037. tr_size=$((tr_size + bit2size[$i]))
  1038. done
  1039. ip -netns $ioam_node_alpha \
  1040. route change 2001:db8:2::/64 \
  1041. encap ioam6 mode $mode trace prealloc type $tr_type ns $ns size $tr_size \
  1042. via 2001:db8:1::1 dev veth0 &>/dev/null
  1043. if [ $? == 0 ]
  1044. then
  1045. run_test ${FUNCNAME[0]} "${desc}" $saddr $tr_type $tr_size $ns $1
  1046. else
  1047. log_test_failed "${desc}"
  1048. fi
  1049. ip -netns $ioam_node_alpha \
  1050. route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
  1051. [ "$1" == "encap" ] && ip -netns $ioam_node_gamma \
  1052. link set ip6tnl0 down &>/dev/null
  1053. }
  1054. ################################################################################
  1055. # #
  1056. # INPUT tests #
  1057. # #
  1058. ################################################################################
  1059. input_undef_ns()
  1060. {
  1061. ##############################################################################
  1062. # Make sure an IOAM node does NOT fill the trace when the corresponding IOAM #
  1063. # Namespace-ID is not configured locally. #
  1064. ##############################################################################
  1065. local desc="Unknown IOAM Namespace-ID"
  1066. local ns=0
  1067. local tr_type=0x800000
  1068. local tr_size=4
  1069. local mode="$1"
  1070. if [ "$1" == "encap" ]
  1071. then
  1072. if [ $encap_tests != 0 ]
  1073. then
  1074. log_test_skipped "${desc}"
  1075. return
  1076. fi
  1077. mode+=" tundst 2001:db8:2::2"
  1078. ip -netns $ioam_node_gamma link set ip6tnl0 up &>/dev/null
  1079. fi
  1080. ip -netns $ioam_node_alpha \
  1081. route change 2001:db8:2::/64 \
  1082. encap ioam6 mode $mode trace prealloc type $tr_type ns $ns size $tr_size \
  1083. via 2001:db8:1::1 dev veth0 &>/dev/null
  1084. if [ $? == 0 ]
  1085. then
  1086. run_test ${FUNCNAME[0]} "${desc}" 2001:db8:1::2 $tr_type $tr_size $ns $1
  1087. else
  1088. log_test_failed "${desc}"
  1089. fi
  1090. ip -netns $ioam_node_alpha \
  1091. route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
  1092. [ "$1" == "encap" ] && ip -netns $ioam_node_gamma \
  1093. link set ip6tnl0 down &>/dev/null
  1094. }
  1095. input_no_room()
  1096. {
  1097. ##############################################################################
  1098. # Make sure an IOAM node does NOT fill the trace AND sets the Overflow flag #
  1099. # when there is not enough room for its data. #
  1100. ##############################################################################
  1101. local desc="Missing room for data"
  1102. local ns=123
  1103. local tr_type=0xc00000
  1104. local tr_size=4
  1105. local mode="$1"
  1106. if [ "$1" == "encap" ]
  1107. then
  1108. if [ $encap_tests != 0 ]
  1109. then
  1110. log_test_skipped "${desc}"
  1111. return
  1112. fi
  1113. mode+=" tundst 2001:db8:2::2"
  1114. ip -netns $ioam_node_gamma link set ip6tnl0 up &>/dev/null
  1115. fi
  1116. ip -netns $ioam_node_alpha \
  1117. route change 2001:db8:2::/64 \
  1118. encap ioam6 mode $mode trace prealloc type $tr_type ns $ns size $tr_size \
  1119. via 2001:db8:1::1 dev veth0 &>/dev/null
  1120. if [ $? == 0 ]
  1121. then
  1122. run_test ${FUNCNAME[0]} "${desc}" 2001:db8:1::2 $tr_type $tr_size $ns $1
  1123. else
  1124. log_test_failed "${desc}"
  1125. fi
  1126. ip -netns $ioam_node_alpha \
  1127. route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
  1128. [ "$1" == "encap" ] && ip -netns $ioam_node_gamma \
  1129. link set ip6tnl0 down &>/dev/null
  1130. }
  1131. input_no_room_oss()
  1132. {
  1133. ##############################################################################
  1134. # Make sure an IOAM node does NOT fill the trace AND sets the Overflow flag #
  1135. # when there is not enough room for the Opaque State Snapshot. #
  1136. ##############################################################################
  1137. local desc="Missing room for Opaque State Snapshot"
  1138. local ns=123
  1139. local tr_type=0x000002
  1140. local tr_size=4
  1141. local mode="$1"
  1142. if [ "$1" == "encap" ]
  1143. then
  1144. if [ $encap_tests != 0 ]
  1145. then
  1146. log_test_skipped "${desc}"
  1147. return
  1148. fi
  1149. mode+=" tundst 2001:db8:2::2"
  1150. ip -netns $ioam_node_gamma link set ip6tnl0 up &>/dev/null
  1151. fi
  1152. ip -netns $ioam_node_alpha \
  1153. route change 2001:db8:2::/64 \
  1154. encap ioam6 mode $mode trace prealloc type $tr_type ns $ns size $tr_size \
  1155. via 2001:db8:1::1 dev veth0 &>/dev/null
  1156. if [ $? == 0 ]
  1157. then
  1158. run_test ${FUNCNAME[0]} "${desc}" 2001:db8:1::2 $tr_type $tr_size $ns $1
  1159. else
  1160. log_test_failed "${desc}"
  1161. fi
  1162. ip -netns $ioam_node_alpha \
  1163. route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
  1164. [ "$1" == "encap" ] && ip -netns $ioam_node_gamma \
  1165. link set ip6tnl0 down &>/dev/null
  1166. }
  1167. input_disabled()
  1168. {
  1169. ##############################################################################
  1170. # Make sure an IOAM node does NOT fill the trace when IOAM is not enabled on #
  1171. # the corresponding (ingress) interface. #
  1172. ##############################################################################
  1173. local desc="IOAM disabled on ingress interface"
  1174. local ns=123
  1175. local tr_type=0x800000
  1176. local tr_size=4
  1177. local mode="$1"
  1178. if [ "$1" == "encap" ]
  1179. then
  1180. if [ $encap_tests != 0 ]
  1181. then
  1182. log_test_skipped "${desc}"
  1183. return
  1184. fi
  1185. mode+=" tundst 2001:db8:2::2"
  1186. ip -netns $ioam_node_gamma link set ip6tnl0 up &>/dev/null
  1187. fi
  1188. # Exception: disable IOAM on ingress interface
  1189. ip netns exec $ioam_node_beta \
  1190. sysctl -wq net.ipv6.conf.veth0.ioam6_enabled=0 &>/dev/null
  1191. local ret=$?
  1192. ip -netns $ioam_node_alpha \
  1193. route change 2001:db8:2::/64 \
  1194. encap ioam6 mode $mode trace prealloc type $tr_type ns $ns size $tr_size \
  1195. via 2001:db8:1::1 dev veth0 &>/dev/null
  1196. ret=$((ret + $?))
  1197. if [ $ret == 0 ]
  1198. then
  1199. run_test ${FUNCNAME[0]} "${desc}" 2001:db8:1::2 $tr_type $tr_size $ns $1
  1200. else
  1201. log_test_failed "${desc}"
  1202. fi
  1203. # Clean Exception
  1204. ip netns exec $ioam_node_beta \
  1205. sysctl -wq net.ipv6.conf.veth0.ioam6_enabled=1 &>/dev/null
  1206. ip -netns $ioam_node_alpha \
  1207. route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
  1208. [ "$1" == "encap" ] && ip -netns $ioam_node_gamma \
  1209. link set ip6tnl0 down &>/dev/null
  1210. }
  1211. input_oflag()
  1212. {
  1213. ##############################################################################
  1214. # Make sure an IOAM node does NOT fill the trace when the Overflow flag is #
  1215. # set. #
  1216. ##############################################################################
  1217. local desc="Overflow flag is set"
  1218. local ns=123
  1219. local tr_type=0xc00000
  1220. local tr_size=4
  1221. local mode="$1"
  1222. if [ "$1" == "encap" ]
  1223. then
  1224. if [ $encap_tests != 0 ]
  1225. then
  1226. log_test_skipped "${desc}"
  1227. return
  1228. fi
  1229. mode+=" tundst 2001:db8:2::2"
  1230. ip -netns $ioam_node_gamma link set ip6tnl0 up &>/dev/null
  1231. fi
  1232. # Exception:
  1233. # Here, we need the sender to set the Overflow flag. For that, we will add
  1234. # back the IOAM namespace that was previously configured on the sender.
  1235. ip -netns $ioam_node_alpha ioam namespace add 123 &>/dev/null
  1236. local ret=$?
  1237. ip -netns $ioam_node_alpha \
  1238. route change 2001:db8:2::/64 \
  1239. encap ioam6 mode $mode trace prealloc type $tr_type ns $ns size $tr_size \
  1240. via 2001:db8:1::1 dev veth0 &>/dev/null
  1241. ret=$((ret + $?))
  1242. if [ $ret == 0 ]
  1243. then
  1244. run_test ${FUNCNAME[0]} "${desc}" 2001:db8:1::2 $tr_type $tr_size $ns $1
  1245. else
  1246. log_test_failed "${desc}"
  1247. fi
  1248. # Clean Exception
  1249. ip -netns $ioam_node_alpha ioam namespace del 123 &>/dev/null
  1250. ip -netns $ioam_node_alpha \
  1251. route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
  1252. [ "$1" == "encap" ] && ip -netns $ioam_node_gamma \
  1253. link set ip6tnl0 down &>/dev/null
  1254. }
  1255. input_bits()
  1256. {
  1257. ##############################################################################
  1258. # Make sure an IOAM node implements all supported bits by checking it #
  1259. # correctly fills the trace with its data. #
  1260. ##############################################################################
  1261. local desc="Trace Type with supported bit <n> only"
  1262. local ns=123
  1263. local mode="$1"
  1264. if [ "$1" == "encap" ]
  1265. then
  1266. mode+=" tundst 2001:db8:2::2"
  1267. ip -netns $ioam_node_gamma link set ip6tnl0 up &>/dev/null
  1268. fi
  1269. local tmp=${bit2size[22]}
  1270. bit2size[22]=$(( $tmp + ${#BETA[9]} + ((4 - (${#BETA[9]} % 4)) % 4) ))
  1271. local i
  1272. for i in {0..11} {22..22}
  1273. do
  1274. local descr="${desc/<n>/$i}"
  1275. if [[ "$1" == "encap" && $encap_tests != 0 ]]
  1276. then
  1277. log_test_skipped "${descr}"
  1278. continue
  1279. fi
  1280. ip -netns $ioam_node_alpha \
  1281. route change 2001:db8:2::/64 \
  1282. encap ioam6 mode $mode trace prealloc \
  1283. type ${bit2type[$i]} ns $ns size ${bit2size[$i]} \
  1284. via 2001:db8:1::1 dev veth0 &>/dev/null
  1285. if [ $? == 0 ]
  1286. then
  1287. run_test "input_bit$i" "${descr}" 2001:db8:1::2 \
  1288. ${bit2type[$i]} ${bit2size[$i]} $ns $1
  1289. else
  1290. log_test_failed "${descr}"
  1291. fi
  1292. done
  1293. ip -netns $ioam_node_alpha \
  1294. route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
  1295. [ "$1" == "encap" ] && ip -netns $ioam_node_gamma \
  1296. link set ip6tnl0 down &>/dev/null
  1297. bit2size[22]=$tmp
  1298. }
  1299. input_sizes()
  1300. {
  1301. ##############################################################################
  1302. # Make sure an IOAM node handles all supported sizes correctly. #
  1303. ##############################################################################
  1304. local desc="Trace Size of <n> bytes"
  1305. local ns=123
  1306. local tr_type=0x800000
  1307. local mode="$1"
  1308. if [ "$1" == "encap" ]
  1309. then
  1310. mode+=" tundst 2001:db8:2::2"
  1311. ip -netns $ioam_node_gamma link set ip6tnl0 up &>/dev/null
  1312. fi
  1313. local i
  1314. for i in $(seq 4 4 244)
  1315. do
  1316. local descr="${desc/<n>/$i}"
  1317. if [[ "$1" == "encap" && $encap_tests != 0 ]]
  1318. then
  1319. log_test_skipped "${descr}"
  1320. continue
  1321. fi
  1322. ip -netns $ioam_node_alpha \
  1323. route change 2001:db8:2::/64 \
  1324. encap ioam6 mode $mode trace prealloc type $tr_type ns $ns size $i \
  1325. via 2001:db8:1::1 dev veth0 &>/dev/null
  1326. if [ $? == 0 ]
  1327. then
  1328. run_test "input_size$i" "${descr}" 2001:db8:1::2 $tr_type $i $ns $1
  1329. else
  1330. log_test_failed "${descr}"
  1331. fi
  1332. done
  1333. ip -netns $ioam_node_alpha \
  1334. route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
  1335. [ "$1" == "encap" ] && ip -netns $ioam_node_gamma \
  1336. link set ip6tnl0 down &>/dev/null
  1337. }
  1338. input_full_supp_trace()
  1339. {
  1340. ##############################################################################
  1341. # Make sure an IOAM node correctly fills a trace when all supported bits are #
  1342. # set. #
  1343. ##############################################################################
  1344. local desc="Full supported trace"
  1345. local ns=123
  1346. local tr_type=0xfff002
  1347. local tr_size
  1348. local mode="$1"
  1349. if [ "$1" == "encap" ]
  1350. then
  1351. if [ $encap_tests != 0 ]
  1352. then
  1353. log_test_skipped "${desc}"
  1354. return
  1355. fi
  1356. mode+=" tundst 2001:db8:2::2"
  1357. ip -netns $ioam_node_gamma link set ip6tnl0 up &>/dev/null
  1358. fi
  1359. local i
  1360. tr_size=$(( ${#BETA[9]} + ((4 - (${#BETA[9]} % 4)) % 4) ))
  1361. for i in {0..11} {22..22}
  1362. do
  1363. tr_size=$((tr_size + bit2size[$i]))
  1364. done
  1365. ip -netns $ioam_node_alpha \
  1366. route change 2001:db8:2::/64 \
  1367. encap ioam6 mode $mode trace prealloc type $tr_type ns $ns size $tr_size \
  1368. via 2001:db8:1::1 dev veth0 &>/dev/null
  1369. if [ $? == 0 ]
  1370. then
  1371. run_test ${FUNCNAME[0]} "${desc}" 2001:db8:1::2 $tr_type $tr_size $ns $1
  1372. else
  1373. log_test_failed "${desc}"
  1374. fi
  1375. ip -netns $ioam_node_alpha \
  1376. route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
  1377. [ "$1" == "encap" ] && ip -netns $ioam_node_gamma \
  1378. link set ip6tnl0 down &>/dev/null
  1379. }
  1380. ################################################################################
  1381. # #
  1382. # MAIN #
  1383. # #
  1384. ################################################################################
  1385. npassed=0
  1386. nskipped=0
  1387. nfailed=0
  1388. if [ "$(id -u)" -ne 0 ]
  1389. then
  1390. echo "SKIP: Need root privileges."
  1391. exit $ksft_skip
  1392. fi
  1393. if [ ! -x "$(command -v ip)" ]
  1394. then
  1395. echo "SKIP: Could not run test without ip tool."
  1396. exit $ksft_skip
  1397. fi
  1398. check_kernel_compatibility
  1399. setup
  1400. run
  1401. cleanup
  1402. if [ $nfailed != 0 ]
  1403. then
  1404. exit $ksft_fail
  1405. fi
  1406. exit $ksft_pass