brintos

brintos / linux-shallow public Read only

0
0
Text · 28.4 KiB · 1249185 Raw
772 lines · bash
1#!/bin/bash2# 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 data7# consistency directly inside packets on the receiver side. Tests are divided8# into three categories: OUTPUT (evaluates the IOAM processing by the sender),9# INPUT (evaluates the IOAM processing by a receiver) and GLOBAL (evaluates10# wider use cases that do not fall into the other two categories). Both OUTPUT11# and INPUT tests only use a two-node topology (alpha and beta), while GLOBAL12# tests use the entire three-node topology (alpha, beta, gamma). Each test is13# 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 120source lib.sh121 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 130ALPHA=(131	1					# ID132	11111111				# Wide ID133	0xffff					# Ingress ID134	0xffffffff				# Ingress Wide ID135	101					# Egress ID136	101101					# Egress Wide ID137	0xdeadbee0				# Namespace Data138	0xcafec0caf00dc0de			# Namespace Wide Data139	777					# Schema ID (0xffffff = None)140	"something that will be 4n-aligned"	# Schema Data141)142 143BETA=(144	2145	22222222146	201147	201201148	202149	202202150	0xdeadbee1151	0xcafec0caf11dc0de152	666153	"Hello there -Obi"154)155 156GAMMA=(157	3158	33333333159	301160	301301161	0xffff162	0xffffffff163	0xdeadbee2164	0xcafec0caf22dc0de165	0xffffff166	""167)168 169TESTS_OUTPUT="170	out_undef_ns171	out_no_room172	out_bits173	out_full_supp_trace174"175 176TESTS_INPUT="177	in_undef_ns178	in_no_room179	in_oflag180	in_bits181	in_full_supp_trace182"183 184TESTS_GLOBAL="185	fwd_full_supp_trace186"187 188 189################################################################################190#                                                                              #191#                                   LIBRARY                                    #192#                                                                              #193################################################################################194 195check_kernel_compatibility()196{197  setup_ns ioam_tmp_node198  ip link add name veth0 netns $ioam_tmp_node type veth \199         peer name veth1 netns $ioam_tmp_node200 201  ip -netns $ioam_tmp_node link set veth0 up202  ip -netns $ioam_tmp_node link set veth1 up203 204  ip -netns $ioam_tmp_node ioam namespace add 0205  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  then212    echo "SKIP: kernel version probably too old, missing ioam support"213    ip link del veth0 2>/dev/null || true214    cleanup_ns $ioam_tmp_node || true215    exit $ksft_skip216  fi217 218  ip -netns $ioam_tmp_node route add db02::/64 encap ioam6 mode inline \219         trace prealloc type 0x800000 ns 0 size 4 dev veth0220  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  then227    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 || true230    cleanup_ns $ioam_tmp_node || true231    exit $ksft_skip232  fi233 234  ip link del veth0 2>/dev/null || true235  cleanup_ns $ioam_tmp_node || true236 237  lsmod | grep -q "ip6_tunnel"238  ip6tnl_loaded=$?239 240  if [ $ip6tnl_loaded = 0 ]241  then242    encap_tests=0243  else244    modprobe ip6_tunnel &>/dev/null245    lsmod | grep -q "ip6_tunnel"246    encap_tests=$?247 248    if [ $encap_tests != 0 ]249    then250      ip a | grep -q "ip6tnl0"251      encap_tests=$?252 253      if [ $encap_tests != 0 ]254      then255        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      fi258    fi259  fi260}261 262cleanup()263{264  ip link del ioam-veth-alpha 2>/dev/null || true265  ip link del ioam-veth-gamma 2>/dev/null || true266 267  cleanup_ns $ioam_node_alpha $ioam_node_beta $ioam_node_gamma || true268 269  if [ $ip6tnl_loaded != 0 ]270  then271    modprobe -r ip6_tunnel 2>/dev/null || true272  fi273}274 275setup()276{277  setup_ns ioam_node_alpha ioam_node_beta ioam_node_gamma278 279  ip link add name ioam-veth-alpha netns $ioam_node_alpha type veth \280         peer name ioam-veth-betaL netns $ioam_node_beta281  ip link add name ioam-veth-betaR netns $ioam_node_beta type veth \282         peer name ioam-veth-gamma netns $ioam_node_gamma283 284  ip -netns $ioam_node_alpha link set ioam-veth-alpha name veth0285  ip -netns $ioam_node_beta link set ioam-veth-betaL name veth0286  ip -netns $ioam_node_beta link set ioam-veth-betaR name veth1287  ip -netns $ioam_node_gamma link set ioam-veth-gamma name veth0288 289  ip -netns $ioam_node_alpha addr add db01::2/64 dev veth0290  ip -netns $ioam_node_alpha link set veth0 up291  ip -netns $ioam_node_alpha link set lo up292  ip -netns $ioam_node_alpha route add db02::/64 via db01::1 dev veth0293  ip -netns $ioam_node_alpha route del db01::/64294  ip -netns $ioam_node_alpha route add db01::/64 dev veth0295 296  ip -netns $ioam_node_beta addr add db01::1/64 dev veth0297  ip -netns $ioam_node_beta addr add db02::1/64 dev veth1298  ip -netns $ioam_node_beta link set veth0 up299  ip -netns $ioam_node_beta link set veth1 up300  ip -netns $ioam_node_beta link set lo up301 302  ip -netns $ioam_node_gamma addr add db02::2/64 dev veth0303  ip -netns $ioam_node_gamma link set veth0 up304  ip -netns $ioam_node_gamma link set lo up305  ip -netns $ioam_node_gamma route add db01::/64 via db02::1 dev veth0306 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=1317  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=1320  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=1331  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 1336 337  ip netns exec $ioam_node_alpha ping6 -c 5 -W 1 db02::2 &>/dev/null338  if [ $? != 0 ]339  then340    echo "Setup FAILED"341    cleanup &>/dev/null342    exit 0343  fi344}345 346log_test_passed()347{348  local desc=$1349  printf "TEST: %-60s  [ OK ]\n" "${desc}"350}351 352log_test_failed()353{354  local desc=$1355  printf "TEST: %-60s  [FAIL]\n" "${desc}"356}357 358log_results()359{360  echo "- Tests passed: ${npassed}"361  echo "- Tests failed: ${nfailed}"362}363 364run_test()365{366  local name=$1367  local desc=$2368  local node_src=$3369  local node_dst=$4370  local ip6_dst=$5371  local trace_type=$6372  local ioam_ns=$7373  local type=$8374 375  ip netns exec $node_dst ./ioam6_parser $name $trace_type $ioam_ns $type &376  local spid=$!377  sleep 0.1378 379  ip netns exec $node_src ping6 -t 64 -c 1 -W 1 $ip6_dst &>/dev/null380  if [ $? != 0 ]381  then382    nfailed=$((nfailed+1))383    log_test_failed "${desc}"384    kill -2 $spid &>/dev/null385  else386    wait $spid387    if [ $? = 0 ]388    then389      npassed=$((npassed+1))390      log_test_passed "${desc}"391    else392      nfailed=$((nfailed+1))393      log_test_failed "${desc}"394    fi395  fi396}397 398run()399{400  echo401  printf "%0.s-" {1..74}402  echo403  echo "OUTPUT tests"404  printf "%0.s-" {1..74}405  echo406 407  # set OUTPUT settings408  ip netns exec $ioam_node_beta sysctl -wq net.ipv6.conf.veth0.ioam6_enabled=0409 410  for t in $TESTS_OUTPUT411  do412    $t "inline"413    [ $encap_tests = 0 ] && $t "encap"414  done415 416  # clean OUTPUT settings417  ip netns exec $ioam_node_beta sysctl -wq net.ipv6.conf.veth0.ioam6_enabled=1418  ip -netns $ioam_node_alpha route change db01::/64 dev veth0419 420 421  echo422  printf "%0.s-" {1..74}423  echo424  echo "INPUT tests"425  printf "%0.s-" {1..74}426  echo427 428  # set INPUT settings429  ip -netns $ioam_node_alpha ioam namespace del 123430 431  for t in $TESTS_INPUT432  do433    $t "inline"434    [ $encap_tests = 0 ] && $t "encap"435  done436 437  # clean INPUT settings438  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 veth0442 443  echo444  printf "%0.s-" {1..74}445  echo446  echo "GLOBAL tests"447  printf "%0.s-" {1..74}448  echo449 450  for t in $TESTS_GLOBAL451  do452    $t "inline"453    [ $encap_tests = 0 ] && $t "encap"454  done455 456  echo457  log_results458}459 460bit2type=(461  0x800000 0x400000 0x200000 0x100000 0x080000 0x040000 0x020000 0x010000462  0x008000 0x004000 0x002000 0x001000 0x000800 0x000400 0x000200 0x000100463  0x000080 0x000040 0x000020 0x000010 0x000008 0x000004 0x000002464)465bit2size=( 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 475out_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 up485 486  ip -netns $ioam_node_alpha route change db01::/64 encap ioam6 mode $mode \487         trace prealloc type 0x800000 ns 0 size 4 dev veth0488 489  run_test ${FUNCNAME[0]} "${desc} ($1 mode)" $ioam_node_alpha $ioam_node_beta \490         db01::1 0x800000 0 $1491 492  [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 down493}494 495out_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 up505 506  ip -netns $ioam_node_alpha route change db01::/64 encap ioam6 mode $mode \507         trace prealloc type 0xc00000 ns 123 size 4 dev veth0508 509  run_test ${FUNCNAME[0]} "${desc} ($1 mode)" $ioam_node_alpha $ioam_node_beta \510         db01::1 0xc00000 123 $1511 512  [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 down513}514 515out_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 up529 530  for i in {0..22}531  do532    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/null535 536    local cmd_res=$?537    local descr="${desc/<n>/$i}"538 539    if [[ $i -ge 12 && $i -le 21 ]]540    then541      if [ $cmd_res != 0 ]542      then543        npassed=$((npassed+1))544        log_test_passed "$descr ($1 mode)"545      else546        nfailed=$((nfailed+1))547        log_test_failed "$descr ($1 mode)"548      fi549    else550	run_test "out_bit$i" "$descr ($1 mode)" $ioam_node_alpha \551           $ioam_node_beta db01::1 ${bit2type[$i]} 123 $1552    fi553  done554 555  [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 down556 557  bit2size[22]=$tmp558}559 560out_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 up570 571  ip -netns $ioam_node_alpha route change db01::/64 encap ioam6 mode $mode \572         trace prealloc type 0xfff002 ns 123 size 100 dev veth0573 574  run_test ${FUNCNAME[0]} "${desc} ($1 mode)" $ioam_node_alpha $ioam_node_beta \575         db01::1 0xfff002 123 $1576 577  [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 down578}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 590in_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 up600 601  ip -netns $ioam_node_alpha route change db01::/64 encap ioam6 mode $mode \602         trace prealloc type 0x800000 ns 0 size 4 dev veth0603 604  run_test ${FUNCNAME[0]} "${desc} ($1 mode)" $ioam_node_alpha $ioam_node_beta \605         db01::1 0x800000 0 $1606 607  [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 down608}609 610in_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 up620 621  ip -netns $ioam_node_alpha route change db01::/64 encap ioam6 mode $mode \622         trace prealloc type 0xc00000 ns 123 size 4 dev veth0623 624  run_test ${FUNCNAME[0]} "${desc} ($1 mode)" $ioam_node_alpha $ioam_node_beta \625         db01::1 0xc00000 123 $1626 627  [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 down628}629 630in_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 up644 645  for i in {0..11} {22..22}646  do647    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 veth0650 651    run_test "in_bit$i" "${desc/<n>/$i} ($1 mode)" $ioam_node_alpha \652           $ioam_node_beta db01::1 ${bit2type[$i]} 123 $1653  done654 655  [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 down656 657  bit2size[22]=$tmp658}659 660in_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 add670  #   back the IOAM namespace that was previously configured on the sender.671  ip -netns $ioam_node_alpha ioam namespace add 123672 673  [ "$1" = "encap" ] && mode="$1 tundst db01::1" || mode="$1"674  [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 up675 676  ip -netns $ioam_node_alpha route change db01::/64 encap ioam6 mode $mode \677         trace prealloc type 0xc00000 ns 123 size 4 dev veth0678 679  run_test ${FUNCNAME[0]} "${desc} ($1 mode)" $ioam_node_alpha $ioam_node_beta \680         db01::1 0xc00000 123 $1681 682  [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 down683 684  # And we clean the exception for this test to get things back to normal for685  # other INPUT tests686  ip -netns $ioam_node_alpha ioam namespace del 123687}688 689in_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 up699 700  ip -netns $ioam_node_alpha route change db01::/64 encap ioam6 mode $mode \701         trace prealloc type 0xfff002 ns 123 size 80 dev veth0702 703  run_test ${FUNCNAME[0]} "${desc} ($1 mode)" $ioam_node_alpha $ioam_node_beta \704         db01::1 0xfff002 123 $1705 706  [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 down707}708 709 710################################################################################711#                                                                              #712#                              GLOBAL tests                                    #713#                                                                              #714#   Three nodes (sender/router/receiver), IOAM fully enabled on every node.    #715################################################################################716 717fwd_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 up727 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 veth0730 731  run_test ${FUNCNAME[0]} "${desc} ($1 mode)" $ioam_node_alpha $ioam_node_gamma \732         db02::2 0xfff002 123 $1733 734  [ "$1" = "encap" ] && ip -netns $ioam_node_gamma link set ip6tnl0 down735}736 737 738################################################################################739#                                                                              #740#                                     MAIN                                     #741#                                                                              #742################################################################################743 744npassed=0745nfailed=0746 747if [ "$(id -u)" -ne 0 ]748then749  echo "SKIP: Need root privileges"750  exit $ksft_skip751fi752 753if [ ! -x "$(command -v ip)" ]754then755  echo "SKIP: Could not run test without ip tool"756  exit $ksft_skip757fi758 759ip ioam &>/dev/null760if [ $? = 1 ]761then762  echo "SKIP: iproute2 too old, missing ioam command"763  exit $ksft_skip764fi765 766check_kernel_compatibility767 768cleanup &>/dev/null769setup770run771cleanup &>/dev/null772