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