~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/tools/testing/selftests/net/ioam6.sh

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 #!/bin/bash
  2 # SPDX-License-Identifier: GPL-2.0+
  3 #
  4 # Author: Justin Iurman <justin.iurman@uliege.be>
  5 #
  6 # This script evaluates the IOAM insertion for IPv6 by checking the IOAM data
  7 # consistency directly inside packets on the receiver side. Tests are divided
  8 # into three categories: OUTPUT (evaluates the IOAM processing by the sender),
  9 # INPUT (evaluates the IOAM processing by a receiver) and GLOBAL (evaluates
 10 # wider use cases that do not fall into the other two categories). Both OUTPUT
 11 # and INPUT tests only use a two-node topology (alpha and beta), while GLOBAL
 12 # tests use the entire three-node topology (alpha, beta, gamma). Each test is
 13 # documented inside its own handler in the code below.
 14 #
 15 # An IOAM domain is configured from Alpha to Gamma but not on the reverse path.
 16 # When either Beta or Gamma is the destination (depending on the test category),
 17 # Alpha adds an IOAM option (Pre-allocated Trace) inside a Hop-by-hop.
 18 #
 19 #
 20 #            +-------------------+            +-------------------+
 21 #            |                   |            |                   |
 22 #            |    Alpha netns    |            |    Gamma netns    |
 23 #            |                   |            |                   |
 24 #            |  +-------------+  |            |  +-------------+  |
 25 #            |  |    veth0    |  |            |  |    veth0    |  |
 26 #            |  |  db01::2/64 |  |            |  |  db02::2/64 |  |
 27 #            |  +-------------+  |            |  +-------------+  |
 28 #            |         .         |            |         .         |
 29 #            +-------------------+            +-------------------+
 30 #                      .                                .
 31 #                      .                                .
 32 #                      .                                .
 33 #            +----------------------------------------------------+
 34 #            |         .                                .         |
 35 #            |  +-------------+                  +-------------+  |
 36 #            |  |    veth0    |                  |    veth1    |  |
 37 #            |  |  db01::1/64 | ................ |  db02::1/64 |  |
 38 #            |  +-------------+                  +-------------+  |
 39 #            |                                                    |
 40 #            |                      Beta netns                    |
 41 #            |                                                    |
 42 #            +----------------------------------------------------+
 43 #
 44 #
 45 #
 46 #        =============================================================
 47 #        |                Alpha - IOAM configuration                 |
 48 #        +===========================================================+
 49 #        | Node ID             | 1                                   |
 50 #        +-----------------------------------------------------------+
 51 #        | Node Wide ID        | 11111111                            |
 52 #        +-----------------------------------------------------------+
 53 #        | Ingress ID          | 0xffff (default value)              |
 54 #        +-----------------------------------------------------------+
 55 #        | Ingress Wide ID     | 0xffffffff (default value)          |
 56 #        +-----------------------------------------------------------+
 57 #        | Egress ID           | 101                                 |
 58 #        +-----------------------------------------------------------+
 59 #        | Egress Wide ID      | 101101                              |
 60 #        +-----------------------------------------------------------+
 61 #        | Namespace Data      | 0xdeadbee0                          |
 62 #        +-----------------------------------------------------------+
 63 #        | Namespace Wide Data | 0xcafec0caf00dc0de                  |
 64 #        +-----------------------------------------------------------+
 65 #        | Schema ID           | 777                                 |
 66 #        +-----------------------------------------------------------+
 67 #        | Schema Data         | something that will be 4n-aligned   |
 68 #        +-----------------------------------------------------------+
 69 #
 70 #
 71 #        =============================================================
 72 #        |                 Beta - IOAM configuration                 |
 73 #        +===========================================================+
 74 #        | Node ID             | 2                                   |
 75 #        +-----------------------------------------------------------+
 76 #        | Node Wide ID        | 22222222                            |
 77 #        +-----------------------------------------------------------+
 78 #        | Ingress ID          | 201                                 |
 79 #        +-----------------------------------------------------------+
 80 #        | Ingress Wide ID     | 201201                              |
 81 #        +-----------------------------------------------------------+
 82 #        | Egress ID           | 202                                 |
 83 #        +-----------------------------------------------------------+
 84 #        | Egress Wide ID      | 202202                              |
 85 #        +-----------------------------------------------------------+
 86 #        | Namespace Data      | 0xdeadbee1                          |
 87 #        +-----------------------------------------------------------+
 88 #        | Namespace Wide Data | 0xcafec0caf11dc0de                  |
 89 #        +-----------------------------------------------------------+
 90 #        | Schema ID           | 666                                 |
 91 #        +-----------------------------------------------------------+
 92 #        | Schema Data         | Hello there -Obi                    |
 93 #        +-----------------------------------------------------------+
 94 #
 95 #
 96 #        =============================================================
 97 #        |                Gamma - IOAM configuration                 |
 98 #        +===========================================================+
 99 #        | Node ID             | 3                                   |
100 #        +-----------------------------------------------------------+
101 #        | Node Wide ID        | 33333333                            |
102 #        +-----------------------------------------------------------+
103 #        | Ingress ID          | 301                                 |
104 #        +-----------------------------------------------------------+
105 #        | Ingress Wide ID     | 301301                              |
106 #        +-----------------------------------------------------------+
107 #        | Egress ID           | 0xffff (default value)              |
108 #        +-----------------------------------------------------------+
109 #        | Egress Wide ID      | 0xffffffff (default value)          |
110 #        +-----------------------------------------------------------+
111 #        | Namespace Data      | 0xdeadbee2                          |
112 #        +-----------------------------------------------------------+
113 #        | Namespace Wide Data | 0xcafec0caf22dc0de                  |
114 #        +-----------------------------------------------------------+
115 #        | Schema ID           | 0xffffff (= None)                   |
116 #        +-----------------------------------------------------------+
117 #        | Schema Data         |                                     |
118 #        +-----------------------------------------------------------+
119 
120 source lib.sh
121 
122 ################################################################################
123 #                                                                              #
124 # WARNING: Be careful if you modify the block below - it MUST be kept          #
125 #          synchronized with configurations inside ioam6_parser.c and always   #
126 #          reflect the same.                                                   #
127 #                                                                              #
128 ################################################################################
129 
130 ALPHA=(
131         1                                       # ID
132         11111111                                # Wide ID
133         0xffff                                  # Ingress ID
134         0xffffffff                              # Ingress Wide ID
135         101                                     # Egress ID
136         101101                                  # Egress Wide ID
137         0xdeadbee0                              # Namespace Data
138         0xcafec0caf00dc0de                      # Namespace Wide Data
139         777                                     # Schema ID (0xffffff = None)
140         "something that will be 4n-aligned"     # Schema Data
141 )
142 
143 BETA=(
144         2
145         22222222
146         201
147         201201
148         202
149         202202
150         0xdeadbee1
151         0xcafec0caf11dc0de
152         666
153         "Hello there -Obi"
154 )
155 
156 GAMMA=(
157         3
158         33333333
159         301
160         301301
161         0xffff
162         0xffffffff
163         0xdeadbee2
164         0xcafec0caf22dc0de
165         0xffffff
166         ""
167 )
168 
169 TESTS_OUTPUT="
170         out_undef_ns
171         out_no_room
172         out_bits
173         out_full_supp_trace
174 "
175 
176 TESTS_INPUT="
177         in_undef_ns
178         in_no_room
179         in_oflag
180         in_bits
181         in_full_supp_trace
182 "
183 
184 TESTS_GLOBAL="
185         fwd_full_supp_trace
186 "
187 
188 
189 ################################################################################
190 #                                                                              #
191 #                                   LIBRARY                                    #
192 #                                                                              #
193 ################################################################################
194 
195 check_kernel_compatibility()
196 {
197   setup_ns ioam_tmp_node
198   ip link add name veth0 netns $ioam_tmp_node type veth \
199          peer name veth1 netns $ioam_tmp_node
200 
201   ip -netns $ioam_tmp_node link set veth0 up
202   ip -netns $ioam_tmp_node link set veth1 up
203 
204   ip -netns $ioam_tmp_node ioam namespace add 0
205   ns_ad=$?
206 
207   ip -netns $ioam_tmp_node ioam namespace show | grep -q "namespace 0"
208   ns_sh=$?
209 
210   if [[ $ns_ad != 0 || $ns_sh != 0 ]]
211   then
212     echo "SKIP: kernel version probably too old, missing ioam support"
213     ip link del veth0 2>/dev/null || true
214     cleanup_ns $ioam_tmp_node || true
215     exit $ksft_skip
216   fi
217 
218   ip -netns $ioam_tmp_node route add db02::/64 encap ioam6 mode inline \
219          trace prealloc type 0x800000 ns 0 size 4 dev veth0
220   tr_ad=$?
221 
222   ip -netns $ioam_tmp_node -6 route | grep -q "encap ioam6"
223   tr_sh=$?
224 
225   if [[ $tr_ad != 0 || $tr_sh != 0 ]]
226   then
227     echo "SKIP: cannot attach an ioam trace to a route, did you compile" \
228          "without CONFIG_IPV6_IOAM6_LWTUNNEL?"
229     ip link del veth0 2>/dev/null || true
230     cleanup_ns $ioam_tmp_node || true
231     exit $ksft_skip
232   fi
233 
234   ip link del veth0 2>/dev/null || true
235   cleanup_ns $ioam_tmp_node || true
236 
237   lsmod | grep -q "ip6_tunnel"
238   ip6tnl_loaded=$?
239 
240   if [ $ip6tnl_loaded = 0 ]
241   then
242     encap_tests=0
243   else
244     modprobe ip6_tunnel &>/dev/null
245     lsmod | grep -q "ip6_tunnel"
246     encap_tests=$?
247 
248     if [ $encap_tests != 0 ]
249     then
250       ip a | grep -q "ip6tnl0"
251       encap_tests=$?
252 
253       if [ $encap_tests != 0 ]
254       then
255         echo "Note: ip6_tunnel not found neither as a module nor inside the" \
256              "kernel, tests that require it (encap mode) will be omitted"
257       fi
258     fi
259   fi
260 }
261 
262 cleanup()
263 {
264   ip link del ioam-veth-alpha 2>/dev/null || true
265   ip link del ioam-veth-gamma 2>/dev/null || true
266 
267   cleanup_ns $ioam_node_alpha $ioam_node_beta $ioam_node_gamma || true
268 
269   if [ $ip6tnl_loaded != 0 ]
270   then
271     modprobe -r ip6_tunnel 2>/dev/null || true
272   fi
273 }
274 
275 setup()
276 {
277   setup_ns ioam_node_alpha ioam_node_beta ioam_node_gamma
278 
279   ip link add name ioam-veth-alpha netns $ioam_node_alpha type veth \
280          peer name ioam-veth-betaL netns $ioam_node_beta
281   ip link add name ioam-veth-betaR netns $ioam_node_beta type veth \
282          peer name ioam-veth-gamma netns $ioam_node_gamma
283 
284   ip -netns $ioam_node_alpha link set ioam-veth-alpha name veth0
285   ip -netns $ioam_node_beta link set ioam-veth-betaL name veth0
286   ip -netns $ioam_node_beta link set ioam-veth-betaR name veth1
287   ip -netns $ioam_node_gamma link set ioam-veth-gamma name veth0
288 
289   ip -netns $ioam_node_alpha addr add db01::2/64 dev veth0
290   ip -netns $ioam_node_alpha link set veth0 up
291   ip -netns $ioam_node_alpha link set lo up
292   ip -netns $ioam_node_alpha route add db02::/64 via db01::1 dev veth0
293   ip -netns $ioam_node_alpha route del db01::/64
294   ip -netns $ioam_node_alpha route add db01::/64 dev veth0
295 
296   ip -netns $ioam_node_beta addr add db01::1/64 dev veth0
297   ip -netns $ioam_node_beta addr add db02::1/64 dev veth1
298   ip -netns $ioam_node_beta link set veth0 up
299   ip -netns $ioam_node_beta link set veth1 up
300   ip -netns $ioam_node_beta link set lo up
301 
302   ip -netns $ioam_node_gamma addr add db02::2/64 dev veth0
303   ip -netns $ioam_node_gamma link set veth0 up
304   ip -netns $ioam_node_gamma link set lo up
305   ip -netns $ioam_node_gamma route add db01::/64 via db02::1 dev veth0
306 
307   # - IOAM config -
308   ip netns exec $ioam_node_alpha sysctl -wq net.ipv6.ioam6_id=${ALPHA[0]}
309   ip netns exec $ioam_node_alpha sysctl -wq net.ipv6.ioam6_id_wide=${ALPHA[1]}
310   ip netns exec $ioam_node_alpha sysctl -wq net.ipv6.conf.veth0.ioam6_id=${ALPHA[4]}
311   ip netns exec $ioam_node_alpha sysctl -wq net.ipv6.conf.veth0.ioam6_id_wide=${ALPHA[5]}
312   ip -netns $ioam_node_alpha ioam namespace add 123 data ${ALPHA[6]} wide ${ALPHA[7]}
313   ip -netns $ioam_node_alpha ioam schema add ${ALPHA[8]} "${ALPHA[9]}"
314   ip -netns $ioam_node_alpha ioam namespace set 123 schema ${ALPHA[8]}
315 
316   ip netns exec $ioam_node_beta sysctl -wq net.ipv6.conf.all.forwarding=1
317   ip netns exec $ioam_node_beta sysctl -wq net.ipv6.ioam6_id=${BETA[0]}
318   ip netns exec $ioam_node_beta sysctl -wq net.ipv6.ioam6_id_wide=${BETA[1]}
319   ip netns exec $ioam_node_beta sysctl -wq net.ipv6.conf.veth0.ioam6_enabled=1
320   ip netns exec $ioam_node_beta sysctl -wq net.ipv6.conf.veth0.ioam6_id=${BETA[2]}
321   ip netns exec $ioam_node_beta sysctl -wq net.ipv6.conf.veth0.ioam6_id_wide=${BETA[3]}
322   ip netns exec $ioam_node_beta sysctl -wq net.ipv6.conf.veth1.ioam6_id=${BETA[4]}
323   ip netns exec $ioam_node_beta sysctl -wq net.ipv6.conf.veth1.ioam6_id_wide=${BETA[5]}
324   ip -netns $ioam_node_beta ioam namespace add 123 data ${BETA[6]} wide ${BETA[7]}
325   ip -netns $ioam_node_beta ioam schema add ${BETA[8]} "${BETA[9]}"
326   ip -netns $ioam_node_beta ioam namespace set 123 schema ${BETA[8]}
327 
328   ip netns exec $ioam_node_gamma sysctl -wq net.ipv6.ioam6_id=${GAMMA[0]}
329   ip netns exec $ioam_node_gamma sysctl -wq net.ipv6.ioam6_id_wide=${GAMMA[1]}
330   ip netns exec $ioam_node_gamma sysctl -wq net.ipv6.conf.veth0.ioam6_enabled=1
331   ip netns exec $ioam_node_gamma sysctl -wq net.ipv6.conf.veth0.ioam6_id=${GAMMA[2]}
332   ip netns exec $ioam_node_gamma sysctl -wq net.ipv6.conf.veth0.ioam6_id_wide=${GAMMA[3]}
333   ip -netns $ioam_node_gamma ioam namespace add 123 data ${GAMMA[6]} wide ${GAMMA[7]}
334 
335   sleep 1
336 
337   ip netns exec $ioam_node_alpha ping6 -c 5 -W 1 db02::2 &>/dev/null
338   if [ $? != 0 ]
339   then
340     echo "Setup FAILED"
341     cleanup &>/dev/null
342     exit 0
343   fi
344 }
345 
346 log_test_passed()
347 {
348   local desc=$1
349   printf "TEST: %-60s  [ OK ]\n" "${desc}"
350 }
351 
352 log_test_failed()
353 {
354   local desc=$1
355   printf "TEST: %-60s  [FAIL]\n" "${desc}"
356 }
357 
358 log_results()
359 {
360   echo "- Tests passed: ${npassed}"
361   echo "- Tests failed: ${nfailed}"
362 }
363 
364 run_test()
365 {
366   local name=$1
367   local desc=$2
368   local node_src=$3
369   local node_dst=$4
370   local ip6_dst=$5
371   local trace_type=$6
372   local ioam_ns=$7
373   local type=$8
374 
375   ip netns exec $node_dst ./ioam6_parser $name $trace_type $ioam_ns $type &
376   local spid=$!
377   sleep 0.1
378 
379   ip netns exec $node_src ping6 -t 64 -c 1 -W 1 $ip6_dst &>/dev/null
380   if [ $? != 0 ]
381   then
382     nfailed=$((nfailed+1))
383     log_test_failed "${desc}"
384     kill -2 $spid &>/dev/null
385   else
386     wait $spid
387     if [ $? = 0 ]
388     then
389       npassed=$((npassed+1))
390       log_test_passed "${desc}"
391     else
392       nfailed=$((nfailed+1))
393       log_test_failed "${desc}"
394     fi
395   fi
396 }
397 
398 run()
399 {
400   echo
401   printf "%0.s-" {1..74}
402   echo
403   echo "OUTPUT tests"
404   printf "%0.s-" {1..74}
405   echo
406 
407   # set OUTPUT settings
408   ip netns exec $ioam_node_beta sysctl -wq net.ipv6.conf.veth0.ioam6_enabled=0
409 
410   for t in $TESTS_OUTPUT
411   do
412     $t "inline"
413     [ $encap_tests = 0 ] && $t "encap"
414   done
415 
416   # clean OUTPUT settings
417   ip netns exec $ioam_node_beta sysctl -wq net.ipv6.conf.veth0.ioam6_enabled=1
418   ip -netns $ioam_node_alpha route change db01::/64 dev veth0
419 
420 
421   echo
422   printf "%0.s-" {1..74}
423   echo
424   echo "INPUT tests"
425   printf "%0.s-" {1..74}
426   echo
427 
428   # set INPUT settings
429   ip -netns $ioam_node_alpha ioam namespace del 123
430 
431   for t in $TESTS_INPUT
432   do
433     $t "inline"
434     [ $encap_tests = 0 ] && $t "encap"
435   done
436 
437   # clean INPUT settings
438   ip -netns $ioam_node_alpha ioam namespace add 123 \
439          data ${ALPHA[6]} wide ${ALPHA[7]}
440   ip -netns $ioam_node_alpha ioam namespace set 123 schema ${ALPHA[8]}
441   ip -netns $ioam_node_alpha route change db01::/64 dev veth0
442 
443   echo
444   printf "%0.s-" {1..74}
445   echo
446   echo "GLOBAL tests"
447   printf "%0.s-" {1..74}
448   echo
449 
450   for t in $TESTS_GLOBAL
451   do
452     $t "inline"
453     [ $encap_tests = 0 ] && $t "encap"
454   done
455 
456   echo
457   log_results
458 }
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
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 )
466 
467 
468 ################################################################################
469 #                                                                              #
470 #                              OUTPUT tests                                    #
471 #                                                                              #
472 #   Two nodes (sender/receiver), IOAM disabled on ingress for the receiver.    #
473 ################################################################################
474 
475 out_undef_ns()
476 {
477   ##############################################################################
478   # Make sure that the encap node won't fill the trace if the chosen IOAM      #
479   # namespace is not configured locally.                                       #
480   ##############################################################################
481   local desc="Unknown IOAM namespace"
482 
483   [ "$1" = "encap" ] && mode="$1 tundst db01::1" || mode="$1"
484   [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 up
485 
486   ip -netns $ioam_node_alpha route change db01::/64 encap ioam6 mode $mode \
487          trace prealloc type 0x800000 ns 0 size 4 dev veth0
488 
489   run_test ${FUNCNAME[0]} "${desc} ($1 mode)" $ioam_node_alpha $ioam_node_beta \
490          db01::1 0x800000 0 $1
491 
492   [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 down
493 }
494 
495 out_no_room()
496 {
497   ##############################################################################
498   # Make sure that the encap node won't fill the trace and will set the        #
499   # Overflow flag since there is no room enough for its data.                  #
500   ##############################################################################
501   local desc="Missing trace room"
502 
503   [ "$1" = "encap" ] && mode="$1 tundst db01::1" || mode="$1"
504   [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 up
505 
506   ip -netns $ioam_node_alpha route change db01::/64 encap ioam6 mode $mode \
507          trace prealloc type 0xc00000 ns 123 size 4 dev veth0
508 
509   run_test ${FUNCNAME[0]} "${desc} ($1 mode)" $ioam_node_alpha $ioam_node_beta \
510          db01::1 0xc00000 123 $1
511 
512   [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 down
513 }
514 
515 out_bits()
516 {
517   ##############################################################################
518   # Make sure that, for each trace type bit, the encap node will either:       #
519   #  (i)  fill the trace with its data when it is a supported bit              #
520   #  (ii) not fill the trace with its data when it is an unsupported bit       #
521   ##############################################################################
522   local desc="Trace type with bit <n> only"
523 
524   local tmp=${bit2size[22]}
525   bit2size[22]=$(( $tmp + ${#ALPHA[9]} + ((4 - (${#ALPHA[9]} % 4)) % 4) ))
526 
527   [ "$1" = "encap" ] && mode="$1 tundst db01::1" || mode="$1"
528   [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 up
529 
530   for i in {0..22}
531   do
532     ip -netns $ioam_node_alpha route change db01::/64 encap ioam6 mode $mode \
533            trace prealloc type ${bit2type[$i]} ns 123 size ${bit2size[$i]} \
534            dev veth0 &>/dev/null
535 
536     local cmd_res=$?
537     local descr="${desc/<n>/$i}"
538 
539     if [[ $i -ge 12 && $i -le 21 ]]
540     then
541       if [ $cmd_res != 0 ]
542       then
543         npassed=$((npassed+1))
544         log_test_passed "$descr ($1 mode)"
545       else
546         nfailed=$((nfailed+1))
547         log_test_failed "$descr ($1 mode)"
548       fi
549     else
550         run_test "out_bit$i" "$descr ($1 mode)" $ioam_node_alpha \
551            $ioam_node_beta db01::1 ${bit2type[$i]} 123 $1
552     fi
553   done
554 
555   [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 down
556 
557   bit2size[22]=$tmp
558 }
559 
560 out_full_supp_trace()
561 {
562   ##############################################################################
563   # Make sure that the encap node will correctly fill a full trace. Be careful,#
564   # "full trace" here does NOT mean all bits (only supported ones).            #
565   ##############################################################################
566   local desc="Full supported trace"
567 
568   [ "$1" = "encap" ] && mode="$1 tundst db01::1" || mode="$1"
569   [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 up
570 
571   ip -netns $ioam_node_alpha route change db01::/64 encap ioam6 mode $mode \
572          trace prealloc type 0xfff002 ns 123 size 100 dev veth0
573 
574   run_test ${FUNCNAME[0]} "${desc} ($1 mode)" $ioam_node_alpha $ioam_node_beta \
575          db01::1 0xfff002 123 $1
576 
577   [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 down
578 }
579 
580 
581 ################################################################################
582 #                                                                              #
583 #                               INPUT tests                                    #
584 #                                                                              #
585 #     Two nodes (sender/receiver), the sender MUST NOT fill the trace upon     #
586 #     insertion -> the IOAM namespace configured on the sender is removed      #
587 #     and is used in the inserted trace to force the sender not to fill it.    #
588 ################################################################################
589 
590 in_undef_ns()
591 {
592   ##############################################################################
593   # Make sure that the receiving node won't fill the trace if the related IOAM #
594   # namespace is not configured locally.                                       #
595   ##############################################################################
596   local desc="Unknown IOAM namespace"
597 
598   [ "$1" = "encap" ] && mode="$1 tundst db01::1" || mode="$1"
599   [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 up
600 
601   ip -netns $ioam_node_alpha route change db01::/64 encap ioam6 mode $mode \
602          trace prealloc type 0x800000 ns 0 size 4 dev veth0
603 
604   run_test ${FUNCNAME[0]} "${desc} ($1 mode)" $ioam_node_alpha $ioam_node_beta \
605          db01::1 0x800000 0 $1
606 
607   [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 down
608 }
609 
610 in_no_room()
611 {
612   ##############################################################################
613   # Make sure that the receiving node won't fill the trace and will set the    #
614   # Overflow flag if there is no room enough for its data.                     #
615   ##############################################################################
616   local desc="Missing trace room"
617 
618   [ "$1" = "encap" ] && mode="$1 tundst db01::1" || mode="$1"
619   [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 up
620 
621   ip -netns $ioam_node_alpha route change db01::/64 encap ioam6 mode $mode \
622          trace prealloc type 0xc00000 ns 123 size 4 dev veth0
623 
624   run_test ${FUNCNAME[0]} "${desc} ($1 mode)" $ioam_node_alpha $ioam_node_beta \
625          db01::1 0xc00000 123 $1
626 
627   [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 down
628 }
629 
630 in_bits()
631 {
632   ##############################################################################
633   # Make sure that, for each trace type bit, the receiving node will either:   #
634   #  (i)  fill the trace with its data when it is a supported bit              #
635   #  (ii) not fill the trace with its data when it is an unsupported bit       #
636   ##############################################################################
637   local desc="Trace type with bit <n> only"
638 
639   local tmp=${bit2size[22]}
640   bit2size[22]=$(( $tmp + ${#BETA[9]} + ((4 - (${#BETA[9]} % 4)) % 4) ))
641 
642   [ "$1" = "encap" ] && mode="$1 tundst db01::1" || mode="$1"
643   [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 up
644 
645   for i in {0..11} {22..22}
646   do
647     ip -netns $ioam_node_alpha route change db01::/64 encap ioam6 mode $mode \
648            trace prealloc type ${bit2type[$i]} ns 123 size ${bit2size[$i]} \
649            dev veth0
650 
651     run_test "in_bit$i" "${desc/<n>/$i} ($1 mode)" $ioam_node_alpha \
652            $ioam_node_beta db01::1 ${bit2type[$i]} 123 $1
653   done
654 
655   [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 down
656 
657   bit2size[22]=$tmp
658 }
659 
660 in_oflag()
661 {
662   ##############################################################################
663   # Make sure that the receiving node won't fill the trace since the Overflow  #
664   # flag is set.                                                               #
665   ##############################################################################
666   local desc="Overflow flag is set"
667 
668   # Exception:
669   #   Here, we need the sender to set the Overflow flag. For that, we will add
670   #   back the IOAM namespace that was previously configured on the sender.
671   ip -netns $ioam_node_alpha ioam namespace add 123
672 
673   [ "$1" = "encap" ] && mode="$1 tundst db01::1" || mode="$1"
674   [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 up
675 
676   ip -netns $ioam_node_alpha route change db01::/64 encap ioam6 mode $mode \
677          trace prealloc type 0xc00000 ns 123 size 4 dev veth0
678 
679   run_test ${FUNCNAME[0]} "${desc} ($1 mode)" $ioam_node_alpha $ioam_node_beta \
680          db01::1 0xc00000 123 $1
681 
682   [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 down
683 
684   # And we clean the exception for this test to get things back to normal for
685   # other INPUT tests
686   ip -netns $ioam_node_alpha ioam namespace del 123
687 }
688 
689 in_full_supp_trace()
690 {
691   ##############################################################################
692   # Make sure that the receiving node will correctly fill a full trace. Be     #
693   # careful, "full trace" here does NOT mean all bits (only supported ones).   #
694   ##############################################################################
695   local desc="Full supported trace"
696 
697   [ "$1" = "encap" ] && mode="$1 tundst db01::1" || mode="$1"
698   [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 up
699 
700   ip -netns $ioam_node_alpha route change db01::/64 encap ioam6 mode $mode \
701          trace prealloc type 0xfff002 ns 123 size 80 dev veth0
702 
703   run_test ${FUNCNAME[0]} "${desc} ($1 mode)" $ioam_node_alpha $ioam_node_beta \
704          db01::1 0xfff002 123 $1
705 
706   [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 down
707 }
708 
709 
710 ################################################################################
711 #                                                                              #
712 #                              GLOBAL tests                                    #
713 #                                                                              #
714 #   Three nodes (sender/router/receiver), IOAM fully enabled on every node.    #
715 ################################################################################
716 
717 fwd_full_supp_trace()
718 {
719   ##############################################################################
720   # Make sure that all three nodes correctly filled the full supported trace   #
721   # by checking that the trace data is consistent with the predefined config.  #
722   ##############################################################################
723   local desc="Forward - Full supported trace"
724 
725   [ "$1" = "encap" ] && mode="$1 tundst db02::2" || mode="$1"
726   [ "$1" = "encap" ] && ip -netns $ioam_node_gamma link set ip6tnl0 up
727 
728   ip -netns $ioam_node_alpha route change db02::/64 encap ioam6 mode $mode \
729          trace prealloc type 0xfff002 ns 123 size 244 via db01::1 dev veth0
730 
731   run_test ${FUNCNAME[0]} "${desc} ($1 mode)" $ioam_node_alpha $ioam_node_gamma \
732          db02::2 0xfff002 123 $1
733 
734   [ "$1" = "encap" ] && ip -netns $ioam_node_gamma link set ip6tnl0 down
735 }
736 
737 
738 ################################################################################
739 #                                                                              #
740 #                                     MAIN                                     #
741 #                                                                              #
742 ################################################################################
743 
744 npassed=0
745 nfailed=0
746 
747 if [ "$(id -u)" -ne 0 ]
748 then
749   echo "SKIP: Need root privileges"
750   exit $ksft_skip
751 fi
752 
753 if [ ! -x "$(command -v ip)" ]
754 then
755   echo "SKIP: Could not run test without ip tool"
756   exit $ksft_skip
757 fi
758 
759 ip ioam &>/dev/null
760 if [ $? = 1 ]
761 then
762   echo "SKIP: iproute2 too old, missing ioam command"
763   exit $ksft_skip
764 fi
765 
766 check_kernel_compatibility
767 
768 cleanup &>/dev/null
769 setup
770 run
771 cleanup &>/dev/null

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php