Files
linux-net/tools/testing/selftests/net/ioam6.sh
Yumei Huang cb3de96eea ipv6: preserve insertion order for same-scope addresses
IPv6 addresses with the same scope are returned in reverse insertion
order, unlike IPv4. For example, when adding a -> b -> c, the list is
reported as c -> b -> a, while IPv4 preserves the original order.

This behavior causes:

a. When using `ip -6 a save` and `ip -6 a restore`, addresses are restored
   in the opposite order from which they were saved. See example below
   showing addresses added as 1::1, 1::2, 1::3 but displayed and saved
   in reverse order.

   # ip -6 a a 1::1 dev x
   # ip -6 a a 1::2 dev x
   # ip -6 a a 1::3 dev x
   # ip -6 a s dev x
   2: x: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
       inet6 1::3/128 scope global tentative
       valid_lft forever preferred_lft forever
       inet6 1::2/128 scope global tentative
       valid_lft forever preferred_lft forever
       inet6 1::1/128 scope global tentative
       valid_lft forever preferred_lft forever
   # ip -6 a save > dump
   # ip -6 a d 1::1 dev x
   # ip -6 a d 1::2 dev x
   # ip -6 a d 1::3 dev x
   # ip a d ::1 dev lo
   # ip a restore < dump
   # ip -6 a s dev x
   2: x: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
       inet6 1::1/128 scope global tentative
       valid_lft forever preferred_lft forever
       inet6 1::2/128 scope global tentative
       valid_lft forever preferred_lft forever
       inet6 1::3/128 scope global tentative
       valid_lft forever preferred_lft forever
   # ip a showdump < dump
    if1:
        inet6 ::1/128 scope host proto kernel_lo
        valid_lft forever preferred_lft forever
    if2:
        inet6 1::3/128 scope global tentative
        valid_lft forever preferred_lft forever
    if2:
        inet6 1::2/128 scope global tentative
        valid_lft forever preferred_lft forever
    if2:
        inet6 1::1/128 scope global tentative
        valid_lft forever preferred_lft forever

b. Addresses in pasta to appear in reversed order compared to host
   addresses.

The ipv6 addresses were added in reverse order by commit e55ffac601
("[IPV6]: order addresses by scope"), then it was changed by commit
502a2ffd73 ("ipv6: convert idev_list to list macros"), and restored by
commit b54c9b98bb ("ipv6: Preserve pervious behavior in
ipv6_link_dev_addr()."). However, this reverse ordering within the same
scope causes inconsistency with IPv4 and the issues described above.

This patch aligns IPv6 address ordering with IPv4 for consistency
by changing the comparison from >= to > when inserting addresses
into the address list. Also updates the ioam6 selftest to reflect
the new address ordering behavior. Combine these two changes into
one patch for bisectability.

Link: https://bugs.passt.top/show_bug.cgi?id=175
Suggested-by: Stefano Brivio <sbrivio@redhat.com>
Signed-off-by: Yumei Huang <yuhuang@redhat.com>
Acked-by: Justin Iurman <justin.iurman@gmail.com>
Reviewed-by: David Ahern <dsahern@kernel.org>
Link: https://patch.msgid.link/20260104032357.38555-1-yuhuang@redhat.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2026-01-06 16:41:35 -08:00

1684 lines
50 KiB
Bash
Executable File

#!/bin/bash
# SPDX-License-Identifier: GPL-2.0+
#
# Author: Justin Iurman <justin.iurman@uliege.be>
#
# This script evaluates IOAM for IPv6 by checking local IOAM configurations and
# IOAM data inside packets. There are three categories of tests: LOCAL, OUTPUT,
# and INPUT. The former (LOCAL) checks all IOAM related configurations locally
# without sending packets. OUTPUT tests verify the processing of an IOAM
# encapsulating node, while INPUT tests verify the processing of an IOAM transit
# node. Both OUTPUT and INPUT tests send packets. Each test is documented inside
# its own handler.
#
# The topology used for OUTPUT and INPUT tests is made of three nodes:
# - Alpha (the IOAM encapsulating node)
# - Beta (the IOAM transit node)
# - Gamma (the receiver) **
#
# An IOAM domain is configured from Alpha to Beta, but not on the reverse path.
# Alpha adds an IOAM option (Pre-allocated Trace) inside a Hop-by-hop.
#
# ** Gamma is required because ioam6_parser.c uses a packet socket and we need
# to see IOAM data inserted by the very last node (Beta), which would happen
# _after_ we get a copy of the packet on Beta. Note that using an
# IPv6 raw socket with IPV6_RECVHOPOPTS on Beta would not be enough: we also
# need to access the IPv6 header to check some fields (e.g., source and
# destination addresses), which is not possible in that case. As a
# consequence, we need Gamma as a receiver to run ioam6_parser.c which uses a
# packet socket.
#
#
# +-----------------------+ +-----------------------+
# | | | |
# | Alpha netns | | Gamma netns |
# | | | |
# | +-------------------+ | | +-------------------+ |
# | | veth0 | | | | veth0 | |
# | | 2001:db8:1::2/64 | | | | 2001:db8:2::2/64 | |
# | +-------------------+ | | +-------------------+ |
# | . | | . |
# +-----------.-----------+ +-----------.-----------+
# . .
# . .
# . .
# +-----------.----------------------------------.-----------+
# | . . |
# | +-------------------+ +-------------------+ |
# | | veth0 | | veth1 | |
# | | 2001:db8:1::1/64 | ............ | 2001:db8:2::1/64 | |
# | +-------------------+ +-------------------+ |
# | |
# | Beta netns |
# | |
# +----------------------------------------------------------+
#
#
#
# +==========================================================+
# | Alpha - IOAM configuration |
# +=====================+====================================+
# | Node ID | 1 |
# +---------------------+------------------------------------+
# | Node Wide ID | 11111111 |
# +---------------------+------------------------------------+
# | Ingress ID | 0xffff (default value) |
# +---------------------+------------------------------------+
# | Ingress Wide ID | 0xffffffff (default value) |
# +---------------------+------------------------------------+
# | Egress ID | 101 |
# +---------------------+------------------------------------+
# | Egress Wide ID | 101101 |
# +---------------------+------------------------------------+
# | Namespace Data | 0xdeadbeef |
# +---------------------+------------------------------------+
# | Namespace Wide Data | 0xcafec0caf00dc0de |
# +---------------------+------------------------------------+
# | Schema ID | 777 |
# +---------------------+------------------------------------+
# | Schema Data | something that will be 4n-aligned |
# +---------------------+------------------------------------+
#
#
# +==========================================================+
# | Beta - IOAM configuration |
# +=====================+====================================+
# | Node ID | 2 |
# +---------------------+------------------------------------+
# | Node Wide ID | 22222222 |
# +---------------------+------------------------------------+
# | Ingress ID | 201 |
# +---------------------+------------------------------------+
# | Ingress Wide ID | 201201 |
# +---------------------+------------------------------------+
# | Egress ID | 202 |
# +---------------------+------------------------------------+
# | Egress Wide ID | 202202 |
# +---------------------+------------------------------------+
# | Namespace Data | 0xffffffff (default value) |
# +---------------------+------------------------------------+
# | Namespace Wide Data | 0xffffffffffffffff (default value) |
# +---------------------+------------------------------------+
# | Schema ID | 0xffffff (= None) |
# +---------------------+------------------------------------+
# | Schema Data | |
# +---------------------+------------------------------------+
source lib.sh
################################################################################
# #
# WARNING: Be careful if you modify the block below - it MUST be kept #
# synchronized with configurations inside ioam6_parser.c and always #
# reflect the same. #
# #
################################################################################
ALPHA=(
1 # ID
11111111 # Wide ID
0xffff # Ingress ID (default value)
0xffffffff # Ingress Wide ID (default value)
101 # Egress ID
101101 # Egress Wide ID
0xdeadbeef # Namespace Data
0xcafec0caf00dc0de # Namespace Wide Data
777 # Schema ID
"something that will be 4n-aligned" # Schema Data
)
BETA=(
2 # ID
22222222 # Wide ID
201 # Ingress ID
201201 # Ingress Wide ID
202 # Egress ID
202202 # Egress Wide ID
0xffffffff # Namespace Data (empty value)
0xffffffffffffffff # Namespace Wide Data (empty value)
0xffffff # Schema ID (empty value)
"" # Schema Data (empty value)
)
TESTS_LOCAL="
local_sysctl_ioam_id
local_sysctl_ioam_id_wide
local_sysctl_ioam_intf_id
local_sysctl_ioam_intf_id_wide
local_sysctl_ioam_intf_enabled
local_ioam_namespace
local_ioam_schema
local_ioam_schema_namespace
local_route_ns
local_route_tunsrc
local_route_tundst
local_route_trace_type
local_route_trace_size
local_route_trace_type_bits
local_route_trace_size_values
"
TESTS_OUTPUT="
output_undef_ns
output_no_room
output_no_room_oss
output_bits
output_sizes
output_full_supp_trace
"
TESTS_INPUT="
input_undef_ns
input_no_room
input_no_room_oss
input_disabled
input_oflag
input_bits
input_sizes
input_full_supp_trace
"
################################################################################
# #
# LIBRARY #
# #
################################################################################
check_kernel_compatibility()
{
setup_ns ioam_tmp_node &>/dev/null
local ret=$?
ip link add name veth0 netns $ioam_tmp_node type veth \
peer name veth1 netns $ioam_tmp_node &>/dev/null
ret=$((ret + $?))
ip -netns $ioam_tmp_node link set veth0 up &>/dev/null
ret=$((ret + $?))
ip -netns $ioam_tmp_node link set veth1 up &>/dev/null
ret=$((ret + $?))
if [ $ret != 0 ]
then
echo "SKIP: Setup failed."
cleanup_ns $ioam_tmp_node
exit $ksft_skip
fi
ip -netns $ioam_tmp_node route add 2001:db8:2::/64 \
encap ioam6 trace prealloc type 0x800000 ns 0 size 4 dev veth0 &>/dev/null
ret=$?
ip -netns $ioam_tmp_node -6 route 2>/dev/null | grep -q "encap ioam6"
ret=$((ret + $?))
if [ $ret != 0 ]
then
echo "SKIP: Cannot attach an IOAM trace to a route. Was your kernel" \
"compiled without CONFIG_IPV6_IOAM6_LWTUNNEL? Are you running an" \
"old kernel? Are you using an old version of iproute2?"
cleanup_ns $ioam_tmp_node
exit $ksft_skip
fi
cleanup_ns $ioam_tmp_node
lsmod 2>/dev/null | grep -q "ip6_tunnel"
ip6tnl_loaded=$?
if [ $ip6tnl_loaded == 0 ]
then
encap_tests=0
else
modprobe ip6_tunnel &>/dev/null
lsmod 2>/dev/null | grep -q "ip6_tunnel"
encap_tests=$?
if [ $encap_tests != 0 ]
then
ip a 2>/dev/null | grep -q "ip6tnl0"
encap_tests=$?
if [ $encap_tests != 0 ]
then
echo "Note: ip6_tunnel not found neither as a module nor inside the" \
"kernel. Any tests that require it will be skipped."
fi
fi
fi
}
cleanup()
{
cleanup_ns $ioam_node_alpha $ioam_node_beta $ioam_node_gamma
if [ $ip6tnl_loaded != 0 ]
then
modprobe -r ip6_tunnel &>/dev/null
fi
}
setup()
{
setup_ns ioam_node_alpha ioam_node_beta ioam_node_gamma &>/dev/null
ip link add name ioam-veth-alpha netns $ioam_node_alpha type veth \
peer name ioam-veth-betaL netns $ioam_node_beta &>/dev/null
ip link add name ioam-veth-betaR netns $ioam_node_beta type veth \
peer name ioam-veth-gamma netns $ioam_node_gamma &>/dev/null
ip -netns $ioam_node_alpha link set ioam-veth-alpha name veth0 &>/dev/null
ip -netns $ioam_node_beta link set ioam-veth-betaL name veth0 &>/dev/null
ip -netns $ioam_node_beta link set ioam-veth-betaR name veth1 &>/dev/null
ip -netns $ioam_node_gamma link set ioam-veth-gamma name veth0 &>/dev/null
ip -netns $ioam_node_alpha addr add 2001:db8:1::2/64 dev veth0 &>/dev/null
ip -netns $ioam_node_alpha addr add 2001:db8:1::50/64 dev veth0 &>/dev/null
ip -netns $ioam_node_alpha link set veth0 up &>/dev/null
ip -netns $ioam_node_alpha link set lo up &>/dev/null
ip -netns $ioam_node_alpha route add 2001:db8:2::/64 \
via 2001:db8:1::1 dev veth0 &>/dev/null
ip -netns $ioam_node_beta addr add 2001:db8:1::1/64 dev veth0 &>/dev/null
ip -netns $ioam_node_beta addr add 2001:db8:2::1/64 dev veth1 &>/dev/null
ip -netns $ioam_node_beta link set veth0 up &>/dev/null
ip -netns $ioam_node_beta link set veth1 up &>/dev/null
ip -netns $ioam_node_beta link set lo up &>/dev/null
ip -netns $ioam_node_gamma addr add 2001:db8:2::2/64 dev veth0 &>/dev/null
ip -netns $ioam_node_gamma link set veth0 up &>/dev/null
ip -netns $ioam_node_gamma link set lo up &>/dev/null
ip -netns $ioam_node_gamma route add 2001:db8:1::/64 \
via 2001:db8:2::1 dev veth0 &>/dev/null
# - Alpha: IOAM config -
ip netns exec $ioam_node_alpha \
sysctl -wq net.ipv6.ioam6_id=${ALPHA[0]} &>/dev/null
ip netns exec $ioam_node_alpha \
sysctl -wq net.ipv6.ioam6_id_wide=${ALPHA[1]} &>/dev/null
ip netns exec $ioam_node_alpha \
sysctl -wq net.ipv6.conf.veth0.ioam6_id=${ALPHA[4]} &>/dev/null
ip netns exec $ioam_node_alpha \
sysctl -wq net.ipv6.conf.veth0.ioam6_id_wide=${ALPHA[5]} &>/dev/null
ip -netns $ioam_node_alpha \
ioam namespace add 123 data ${ALPHA[6]} wide ${ALPHA[7]} &>/dev/null
ip -netns $ioam_node_alpha \
ioam schema add ${ALPHA[8]} "${ALPHA[9]}" &>/dev/null
ip -netns $ioam_node_alpha \
ioam namespace set 123 schema ${ALPHA[8]} &>/dev/null
# - Beta: IOAM config -
ip netns exec $ioam_node_beta \
sysctl -wq net.ipv6.conf.all.forwarding=1 &>/dev/null
ip netns exec $ioam_node_beta \
sysctl -wq net.ipv6.ioam6_id=${BETA[0]} &>/dev/null
ip netns exec $ioam_node_beta \
sysctl -wq net.ipv6.ioam6_id_wide=${BETA[1]} &>/dev/null
ip netns exec $ioam_node_beta \
sysctl -wq net.ipv6.conf.veth0.ioam6_enabled=1 &>/dev/null
ip netns exec $ioam_node_beta \
sysctl -wq net.ipv6.conf.veth0.ioam6_id=${BETA[2]} &>/dev/null
ip netns exec $ioam_node_beta \
sysctl -wq net.ipv6.conf.veth0.ioam6_id_wide=${BETA[3]} &>/dev/null
ip netns exec $ioam_node_beta \
sysctl -wq net.ipv6.conf.veth1.ioam6_id=${BETA[4]} &>/dev/null
ip netns exec $ioam_node_beta \
sysctl -wq net.ipv6.conf.veth1.ioam6_id_wide=${BETA[5]} &>/dev/null
ip -netns $ioam_node_beta ioam namespace add 123 &>/dev/null
sleep 1
ip netns exec $ioam_node_alpha ping6 -c 5 -W 1 2001:db8:2::2 &>/dev/null
if [ $? != 0 ]
then
echo "SKIP: Setup failed."
cleanup
exit $ksft_skip
fi
}
log_test_passed()
{
printf " - TEST: %-57s [ OK ]\n" "$1"
npassed=$((npassed+1))
}
log_test_skipped()
{
printf " - TEST: %-57s [SKIP]\n" "$1"
nskipped=$((nskipped+1))
}
log_test_failed()
{
printf " - TEST: %-57s [FAIL]\n" "$1"
nfailed=$((nfailed+1))
}
run_test()
{
local name=$1
local desc=$2
local ip6_src=$3
local trace_type=$4
local trace_size=$5
local ioam_ns=$6
local type=$7
ip netns exec $ioam_node_gamma \
./ioam6_parser veth0 $name $ip6_src 2001:db8:2::2 \
$trace_type $trace_size $ioam_ns $type &
local spid=$!
sleep 0.1
ip netns exec $ioam_node_alpha ping6 -t 64 -c 1 -W 1 2001:db8:2::2 &>/dev/null
if [ $? != 0 ]
then
log_test_failed "${desc}"
kill -2 $spid &>/dev/null
else
wait $spid
[ $? == 0 ] && log_test_passed "${desc}" || log_test_failed "${desc}"
fi
}
run()
{
local test
echo
printf "+"
printf "%0.s-" {1..72}
printf "+"
echo
printf "| %-28s LOCAL tests %-29s |"
echo
printf "+"
printf "%0.s-" {1..72}
printf "+"
echo
echo
echo "Global config"
for test in $TESTS_LOCAL
do
$test
done
echo
echo "Inline mode"
for test in $TESTS_LOCAL
do
$test "inline"
done
echo
echo "Encap mode"
for test in $TESTS_LOCAL
do
$test "encap"
done
echo
printf "+"
printf "%0.s-" {1..72}
printf "+"
echo
printf "| %-28s OUTPUT tests %-28s |"
echo
printf "+"
printf "%0.s-" {1..72}
printf "+"
echo
# set OUTPUT settings
ip netns exec $ioam_node_beta \
sysctl -wq net.ipv6.conf.veth0.ioam6_enabled=0 &>/dev/null
echo
echo "Inline mode"
for test in $TESTS_OUTPUT
do
$test "inline"
done
echo
echo "Encap mode"
for test in $TESTS_OUTPUT
do
$test "encap"
done
echo
echo "Encap mode (with tunsrc)"
for test in $TESTS_OUTPUT
do
$test "encap" "tunsrc"
done
# clean OUTPUT settings
ip netns exec $ioam_node_beta \
sysctl -wq net.ipv6.conf.veth0.ioam6_enabled=1 &>/dev/null
echo
printf "+"
printf "%0.s-" {1..72}
printf "+"
echo
printf "| %-28s INPUT tests %-29s |"
echo
printf "+"
printf "%0.s-" {1..72}
printf "+"
echo
# set INPUT settings
ip -netns $ioam_node_alpha ioam namespace del 123 &>/dev/null
echo
echo "Inline mode"
for test in $TESTS_INPUT
do
$test "inline"
done
echo
echo "Encap mode"
for test in $TESTS_INPUT
do
$test "encap"
done
# clean INPUT settings
ip -netns $ioam_node_alpha \
ioam namespace add 123 data ${ALPHA[6]} wide ${ALPHA[7]} &>/dev/null
ip -netns $ioam_node_alpha \
ioam namespace set 123 schema ${ALPHA[8]} &>/dev/null
echo
printf "+"
printf "%0.s-" {1..72}
printf "+"
echo
printf "| %-30s Results %-31s |"
echo
printf "+"
printf "%0.s-" {1..72}
printf "+"
echo
echo
echo "- Passed: ${npassed}"
echo "- Skipped: ${nskipped}"
echo "- Failed: ${nfailed}"
echo
}
bit2type=(
0x800000 0x400000 0x200000 0x100000 0x080000 0x040000 0x020000 0x010000
0x008000 0x004000 0x002000 0x001000 0x000800 0x000400 0x000200 0x000100
0x000080 0x000040 0x000020 0x000010 0x000008 0x000004 0x000002 0x000001
)
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 )
################################################################################
# #
# LOCAL tests #
# #
################################################################################
local_sysctl_ioam_id()
{
##############################################################################
# Make sure the sysctl "net.ipv6.ioam6_id" works as expected. #
##############################################################################
local desc="Sysctl net.ipv6.ioam6_id"
[ ! -z $1 ] && return
ip netns exec $ioam_node_alpha \
sysctl net.ipv6.ioam6_id 2>/dev/null | grep -wq ${ALPHA[0]}
[ $? == 0 ] && log_test_passed "${desc}" || log_test_failed "${desc}"
}
local_sysctl_ioam_id_wide()
{
##############################################################################
# Make sure the sysctl "net.ipv6.ioam6_id_wide" works as expected. #
##############################################################################
local desc="Sysctl net.ipv6.ioam6_id_wide"
[ ! -z $1 ] && return
ip netns exec $ioam_node_alpha \
sysctl net.ipv6.ioam6_id_wide 2>/dev/null | grep -wq ${ALPHA[1]}
[ $? == 0 ] && log_test_passed "${desc}" || log_test_failed "${desc}"
}
local_sysctl_ioam_intf_id()
{
##############################################################################
# Make sure the sysctl "net.ipv6.conf.XX.ioam6_id" works as expected. #
##############################################################################
local desc="Sysctl net.ipv6.conf.XX.ioam6_id"
[ ! -z $1 ] && return
ip netns exec $ioam_node_alpha \
sysctl net.ipv6.conf.veth0.ioam6_id 2>/dev/null | grep -wq ${ALPHA[4]}
[ $? == 0 ] && log_test_passed "${desc}" || log_test_failed "${desc}"
}
local_sysctl_ioam_intf_id_wide()
{
##############################################################################
# Make sure the sysctl "net.ipv6.conf.XX.ioam6_id_wide" works as expected. #
##############################################################################
local desc="Sysctl net.ipv6.conf.XX.ioam6_id_wide"
[ ! -z $1 ] && return
ip netns exec $ioam_node_alpha \
sysctl net.ipv6.conf.veth0.ioam6_id_wide 2>/dev/null | grep -wq ${ALPHA[5]}
[ $? == 0 ] && log_test_passed "${desc}" || log_test_failed "${desc}"
}
local_sysctl_ioam_intf_enabled()
{
##############################################################################
# Make sure the sysctl "net.ipv6.conf.XX.ioam6_enabled" works as expected. #
##############################################################################
local desc="Sysctl net.ipv6.conf.XX.ioam6_enabled"
[ ! -z $1 ] && return
ip netns exec $ioam_node_beta \
sysctl net.ipv6.conf.veth0.ioam6_enabled 2>/dev/null | grep -wq 1
[ $? == 0 ] && log_test_passed "${desc}" || log_test_failed "${desc}"
}
local_ioam_namespace()
{
##############################################################################
# Make sure the creation of an IOAM Namespace works as expected. #
##############################################################################
local desc="Create an IOAM Namespace"
[ ! -z $1 ] && return
ip -netns $ioam_node_alpha \
ioam namespace show 2>/dev/null | grep -wq 123
local ret=$?
ip -netns $ioam_node_alpha \
ioam namespace show 2>/dev/null | grep -wq ${ALPHA[6]}
ret=$((ret + $?))
ip -netns $ioam_node_alpha \
ioam namespace show 2>/dev/null | grep -wq ${ALPHA[7]}
ret=$((ret + $?))
[ $ret == 0 ] && log_test_passed "${desc}" || log_test_failed "${desc}"
}
local_ioam_schema()
{
##############################################################################
# Make sure the creation of an IOAM Schema works as expected. #
##############################################################################
local desc="Create an IOAM Schema"
[ ! -z $1 ] && return
ip -netns $ioam_node_alpha \
ioam schema show 2>/dev/null | grep -wq ${ALPHA[8]}
local ret=$?
local sc_data=$(
for i in `seq 0 $((${#ALPHA[9]}-1))`
do
chr=${ALPHA[9]:i:1}
printf "%x " "'${chr}"
done
)
ip -netns $ioam_node_alpha \
ioam schema show 2>/dev/null | grep -q "$sc_data"
ret=$((ret + $?))
[ $ret == 0 ] && log_test_passed "${desc}" || log_test_failed "${desc}"
}
local_ioam_schema_namespace()
{
##############################################################################
# Make sure the binding of a Schema to a Namespace works as expected. #
##############################################################################
local desc="Bind an IOAM Schema to an IOAM Namespace"
[ ! -z $1 ] && return
ip -netns $ioam_node_alpha \
ioam namespace show 2>/dev/null | grep -wq ${ALPHA[8]}
local ret=$?
ip -netns $ioam_node_alpha \
ioam schema show 2>/dev/null | grep -wq 123
ret=$((ret + $?))
[ $ret == 0 ] && log_test_passed "${desc}" || log_test_failed "${desc}"
}
local_route_ns()
{
##############################################################################
# Make sure the Namespace-ID is always provided, whatever the mode. #
##############################################################################
local desc="Mandatory Namespace-ID"
local mode
[ -z $1 ] && return
[ "$1" == "encap" ] && mode="$1 tundst 2001:db8:2::2" || mode="$1"
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 \
encap ioam6 mode $mode trace prealloc type 0x800000 size 4 \
via 2001:db8:1::1 dev veth0 &>/dev/null
local ret1=$?
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 \
encap ioam6 mode $mode trace prealloc type 0x800000 ns 0 size 4 \
via 2001:db8:1::1 dev veth0 &>/dev/null
local ret2=$?
[[ $ret1 == 0 || $ret2 != 0 ]] && log_test_failed "${desc}" \
|| log_test_passed "${desc}"
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
}
local_route_tunsrc()
{
##############################################################################
# Make sure the Tunnel Source is only (and possibly) used with encap mode. #
##############################################################################
local desc
local mode
local mode_tunsrc
[ -z $1 ] && return
if [ "$1" == "encap" ]
then
desc="Optional Tunnel Source"
mode="$1 tundst 2001:db8:2::2"
mode_tunsrc="$1 tunsrc 2001:db8:1::50 tundst 2001:db8:2::2"
else
desc="Unneeded Tunnel Source"
mode="$1"
mode_tunsrc="$1 tunsrc 2001:db8:1::50"
fi
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 \
encap ioam6 mode $mode trace prealloc type 0x800000 ns 0 size 4 \
via 2001:db8:1::1 dev veth0 &>/dev/null
local ret1=$?
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 \
encap ioam6 mode $mode_tunsrc trace prealloc type 0x800000 ns 0 size 4 \
via 2001:db8:1::1 dev veth0 &>/dev/null
local ret2=$?
if [ "$1" == "encap" ]
then
[[ $ret1 != 0 || $ret2 != 0 ]] && log_test_failed "${desc}" \
|| log_test_passed "${desc}"
else
[[ $ret1 != 0 || $ret2 == 0 ]] && log_test_failed "${desc}" \
|| log_test_passed "${desc}"
fi
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
}
local_route_tundst()
{
##############################################################################
# Make sure the Tunnel Destination is only (and always) used with encap mode.#
##############################################################################
local desc
[ -z $1 ] && return
[ "$1" == "encap" ] && desc="Mandatory Tunnel Destination" \
|| desc="Unneeded Tunnel Destination"
local mode="$1"
local mode_tundst="$1 tundst 2001:db8:2::2"
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 \
encap ioam6 mode $mode trace prealloc type 0x800000 ns 0 size 4 \
via 2001:db8:1::1 dev veth0 &>/dev/null
local ret1=$?
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 \
encap ioam6 mode $mode_tundst trace prealloc type 0x800000 ns 0 size 4 \
via 2001:db8:1::1 dev veth0 &>/dev/null
local ret2=$?
if [ "$1" == "encap" ]
then
[[ $ret1 == 0 || $ret2 != 0 ]] && log_test_failed "${desc}" \
|| log_test_passed "${desc}"
else
[[ $ret1 != 0 || $ret2 == 0 ]] && log_test_failed "${desc}" \
|| log_test_passed "${desc}"
fi
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
}
local_route_trace_type()
{
##############################################################################
# Make sure the Trace Type is always provided, whatever the mode. #
##############################################################################
local desc="Mandatory Trace Type"
local mode
[ -z $1 ] && return
[ "$1" == "encap" ] && mode="$1 tundst 2001:db8:2::2" || mode="$1"
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 \
encap ioam6 mode $mode trace prealloc ns 0 size 4 \
via 2001:db8:1::1 dev veth0 &>/dev/null
local ret1=$?
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 \
encap ioam6 mode $mode trace prealloc type 0x800000 ns 0 size 4 \
via 2001:db8:1::1 dev veth0 &>/dev/null
local ret2=$?
[[ $ret1 == 0 || $ret2 != 0 ]] && log_test_failed "${desc}" \
|| log_test_passed "${desc}"
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
}
local_route_trace_size()
{
##############################################################################
# Make sure the Trace Size is always provided, whatever the mode. #
##############################################################################
local desc="Mandatory Trace Size"
local mode
[ -z $1 ] && return
[ "$1" == "encap" ] && mode="$1 tundst 2001:db8:2::2" || mode="$1"
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 \
encap ioam6 mode $mode trace prealloc type 0x800000 ns 0 \
via 2001:db8:1::1 dev veth0 &>/dev/null
local ret1=$?
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 \
encap ioam6 mode $mode trace prealloc type 0x800000 ns 0 size 4 \
via 2001:db8:1::1 dev veth0 &>/dev/null
local ret2=$?
[[ $ret1 == 0 || $ret2 != 0 ]] && log_test_failed "${desc}" \
|| log_test_passed "${desc}"
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
}
local_route_trace_type_bits()
{
##############################################################################
# Make sure only allowed bits (0-11 and 22) are accepted. #
##############################################################################
local desc="Trace Type bits"
local mode
[ -z $1 ] && return
[ "$1" == "encap" ] && mode="$1 tundst 2001:db8:2::2" || mode="$1"
local i
for i in {0..23}
do
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 \
encap ioam6 mode $mode trace prealloc type ${bit2type[$i]} ns 0 size 4 \
via 2001:db8:1::1 dev veth0 &>/dev/null
if [[ ($? == 0 && (($i -ge 12 && $i -le 21) || $i == 23)) ||
($? != 0 && (($i -ge 0 && $i -le 11) || $i == 22)) ]]
then
local err=1
break
fi
done
[ -z $err ] && log_test_passed "${desc}" || log_test_failed "${desc}"
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
}
local_route_trace_size_values()
{
##############################################################################
# Make sure only allowed sizes (multiples of four in [4,244]) are accepted. #
##############################################################################
local desc="Trace Size values"
local mode
[ -z $1 ] && return
[ "$1" == "encap" ] && mode="$1 tundst 2001:db8:2::2" || mode="$1"
# we also try the next multiple of four after the MAX to check it's refused
local i
for i in {0..248}
do
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 \
encap ioam6 mode $mode trace prealloc type 0x800000 ns 0 size $i \
via 2001:db8:1::1 dev veth0 &>/dev/null
if [[ ($? == 0 && ($i == 0 || $i == 248 || $(( $i % 4 )) != 0)) ||
($? != 0 && $i != 0 && $i != 248 && $(( $i % 4 )) == 0) ]]
then
local err=1
break
fi
done
[ -z $err ] && log_test_passed "${desc}" || log_test_failed "${desc}"
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
}
################################################################################
# #
# OUTPUT tests #
# #
################################################################################
output_undef_ns()
{
##############################################################################
# Make sure an IOAM encapsulating node does NOT fill the trace when the #
# corresponding IOAM Namespace-ID is not configured locally. #
##############################################################################
local desc="Unknown IOAM Namespace-ID"
local ns=0
local tr_type=0x800000
local tr_size=4
local mode="$1"
local saddr="2001:db8:1::2"
if [ "$1" == "encap" ]
then
if [ $encap_tests != 0 ]
then
log_test_skipped "${desc}"
return
fi
if [ "$2" == "tunsrc" ]
then
saddr="2001:db8:1::50"
mode+=" tunsrc 2001:db8:1::50"
fi
mode+=" tundst 2001:db8:2::2"
ip -netns $ioam_node_gamma link set ip6tnl0 up &>/dev/null
fi
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 \
encap ioam6 mode $mode trace prealloc type $tr_type ns $ns size $tr_size \
via 2001:db8:1::1 dev veth0 &>/dev/null
if [ $? == 0 ]
then
run_test ${FUNCNAME[0]} "${desc}" $saddr $tr_type $tr_size $ns $1
else
log_test_failed "${desc}"
fi
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
[ "$1" == "encap" ] && ip -netns $ioam_node_gamma \
link set ip6tnl0 down &>/dev/null
}
output_no_room()
{
##############################################################################
# Make sure an IOAM encapsulating node does NOT fill the trace AND sets the #
# Overflow flag when there is not enough room for its data. #
##############################################################################
local desc="Missing room for data"
local ns=123
local tr_type=0xc00000
local tr_size=4
local mode="$1"
local saddr="2001:db8:1::2"
if [ "$1" == "encap" ]
then
if [ $encap_tests != 0 ]
then
log_test_skipped "${desc}"
return
fi
if [ "$2" == "tunsrc" ]
then
saddr="2001:db8:1::50"
mode+=" tunsrc 2001:db8:1::50"
fi
mode+=" tundst 2001:db8:2::2"
ip -netns $ioam_node_gamma link set ip6tnl0 up &>/dev/null
fi
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 \
encap ioam6 mode $mode trace prealloc type $tr_type ns $ns size $tr_size \
via 2001:db8:1::1 dev veth0 &>/dev/null
if [ $? == 0 ]
then
run_test ${FUNCNAME[0]} "${desc}" $saddr $tr_type $tr_size $ns $1
else
log_test_failed "${desc}"
fi
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
[ "$1" == "encap" ] && ip -netns $ioam_node_gamma \
link set ip6tnl0 down &>/dev/null
}
output_no_room_oss()
{
##############################################################################
# Make sure an IOAM encapsulating node does NOT fill the trace AND sets the #
# Overflow flag when there is not enough room for the Opaque State Snapshot. #
##############################################################################
local desc="Missing room for Opaque State Snapshot"
local ns=123
local tr_type=0x000002
local tr_size=4
local mode="$1"
local saddr="2001:db8:1::2"
if [ "$1" == "encap" ]
then
if [ $encap_tests != 0 ]
then
log_test_skipped "${desc}"
return
fi
if [ "$2" == "tunsrc" ]
then
saddr="2001:db8:1::50"
mode+=" tunsrc 2001:db8:1::50"
fi
mode+=" tundst 2001:db8:2::2"
ip -netns $ioam_node_gamma link set ip6tnl0 up &>/dev/null
fi
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 \
encap ioam6 mode $mode trace prealloc type $tr_type ns $ns size $tr_size \
via 2001:db8:1::1 dev veth0 &>/dev/null
if [ $? == 0 ]
then
run_test ${FUNCNAME[0]} "${desc}" $saddr $tr_type $tr_size $ns $1
else
log_test_failed "${desc}"
fi
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
[ "$1" == "encap" ] && ip -netns $ioam_node_gamma \
link set ip6tnl0 down &>/dev/null
}
output_bits()
{
##############################################################################
# Make sure an IOAM encapsulating node implements all supported bits by #
# checking it correctly fills the trace with its data. #
##############################################################################
local desc="Trace Type with supported bit <n> only"
local ns=123
local mode="$1"
local saddr="2001:db8:1::2"
if [ "$1" == "encap" ]
then
if [ "$2" == "tunsrc" ]
then
saddr="2001:db8:1::50"
mode+=" tunsrc 2001:db8:1::50"
fi
mode+=" tundst 2001:db8:2::2"
ip -netns $ioam_node_gamma link set ip6tnl0 up &>/dev/null
fi
local tmp=${bit2size[22]}
bit2size[22]=$(( $tmp + ${#ALPHA[9]} + ((4 - (${#ALPHA[9]} % 4)) % 4) ))
local i
for i in {0..11} {22..22}
do
local descr="${desc/<n>/$i}"
if [[ "$1" == "encap" && $encap_tests != 0 ]]
then
log_test_skipped "${descr}"
continue
fi
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 \
encap ioam6 mode $mode trace prealloc \
type ${bit2type[$i]} ns $ns size ${bit2size[$i]} \
via 2001:db8:1::1 dev veth0 &>/dev/null
if [ $? == 0 ]
then
run_test "output_bit$i" "${descr}" $saddr \
${bit2type[$i]} ${bit2size[$i]} $ns $1
else
log_test_failed "${descr}"
fi
done
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
[ "$1" == "encap" ] && ip -netns $ioam_node_gamma \
link set ip6tnl0 down &>/dev/null
bit2size[22]=$tmp
}
output_sizes()
{
##############################################################################
# Make sure an IOAM encapsulating node allocates supported sizes correctly. #
##############################################################################
local desc="Trace Size of <n> bytes"
local ns=0
local tr_type=0x800000
local mode="$1"
local saddr="2001:db8:1::2"
if [ "$1" == "encap" ]
then
if [ "$2" == "tunsrc" ]
then
saddr="2001:db8:1::50"
mode+=" tunsrc 2001:db8:1::50"
fi
mode+=" tundst 2001:db8:2::2"
ip -netns $ioam_node_gamma link set ip6tnl0 up &>/dev/null
fi
local i
for i in $(seq 4 4 244)
do
local descr="${desc/<n>/$i}"
if [[ "$1" == "encap" && $encap_tests != 0 ]]
then
log_test_skipped "${descr}"
continue
fi
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 \
encap ioam6 mode $mode trace prealloc type $tr_type ns $ns size $i \
via 2001:db8:1::1 dev veth0 &>/dev/null
if [ $? == 0 ]
then
run_test "output_size$i" "${descr}" $saddr $tr_type $i $ns $1
else
log_test_failed "${descr}"
fi
done
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
[ "$1" == "encap" ] && ip -netns $ioam_node_gamma \
link set ip6tnl0 down &>/dev/null
}
output_full_supp_trace()
{
##############################################################################
# Make sure an IOAM encapsulating node correctly fills a trace when all #
# supported bits are set. #
##############################################################################
local desc="Full supported trace"
local ns=123
local tr_type=0xfff002
local tr_size
local mode="$1"
local saddr="2001:db8:1::2"
if [ "$1" == "encap" ]
then
if [ $encap_tests != 0 ]
then
log_test_skipped "${desc}"
return
fi
if [ "$2" == "tunsrc" ]
then
saddr="2001:db8:1::50"
mode+=" tunsrc 2001:db8:1::50"
fi
mode+=" tundst 2001:db8:2::2"
ip -netns $ioam_node_gamma link set ip6tnl0 up &>/dev/null
fi
local i
tr_size=$(( ${#ALPHA[9]} + ((4 - (${#ALPHA[9]} % 4)) % 4) ))
for i in {0..11} {22..22}
do
tr_size=$((tr_size + bit2size[$i]))
done
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 \
encap ioam6 mode $mode trace prealloc type $tr_type ns $ns size $tr_size \
via 2001:db8:1::1 dev veth0 &>/dev/null
if [ $? == 0 ]
then
run_test ${FUNCNAME[0]} "${desc}" $saddr $tr_type $tr_size $ns $1
else
log_test_failed "${desc}"
fi
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
[ "$1" == "encap" ] && ip -netns $ioam_node_gamma \
link set ip6tnl0 down &>/dev/null
}
################################################################################
# #
# INPUT tests #
# #
################################################################################
input_undef_ns()
{
##############################################################################
# Make sure an IOAM node does NOT fill the trace when the corresponding IOAM #
# Namespace-ID is not configured locally. #
##############################################################################
local desc="Unknown IOAM Namespace-ID"
local ns=0
local tr_type=0x800000
local tr_size=4
local mode="$1"
if [ "$1" == "encap" ]
then
if [ $encap_tests != 0 ]
then
log_test_skipped "${desc}"
return
fi
mode+=" tundst 2001:db8:2::2"
ip -netns $ioam_node_gamma link set ip6tnl0 up &>/dev/null
fi
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 \
encap ioam6 mode $mode trace prealloc type $tr_type ns $ns size $tr_size \
via 2001:db8:1::1 dev veth0 &>/dev/null
if [ $? == 0 ]
then
run_test ${FUNCNAME[0]} "${desc}" 2001:db8:1::2 $tr_type $tr_size $ns $1
else
log_test_failed "${desc}"
fi
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
[ "$1" == "encap" ] && ip -netns $ioam_node_gamma \
link set ip6tnl0 down &>/dev/null
}
input_no_room()
{
##############################################################################
# Make sure an IOAM node does NOT fill the trace AND sets the Overflow flag #
# when there is not enough room for its data. #
##############################################################################
local desc="Missing room for data"
local ns=123
local tr_type=0xc00000
local tr_size=4
local mode="$1"
if [ "$1" == "encap" ]
then
if [ $encap_tests != 0 ]
then
log_test_skipped "${desc}"
return
fi
mode+=" tundst 2001:db8:2::2"
ip -netns $ioam_node_gamma link set ip6tnl0 up &>/dev/null
fi
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 \
encap ioam6 mode $mode trace prealloc type $tr_type ns $ns size $tr_size \
via 2001:db8:1::1 dev veth0 &>/dev/null
if [ $? == 0 ]
then
run_test ${FUNCNAME[0]} "${desc}" 2001:db8:1::2 $tr_type $tr_size $ns $1
else
log_test_failed "${desc}"
fi
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
[ "$1" == "encap" ] && ip -netns $ioam_node_gamma \
link set ip6tnl0 down &>/dev/null
}
input_no_room_oss()
{
##############################################################################
# Make sure an IOAM node does NOT fill the trace AND sets the Overflow flag #
# when there is not enough room for the Opaque State Snapshot. #
##############################################################################
local desc="Missing room for Opaque State Snapshot"
local ns=123
local tr_type=0x000002
local tr_size=4
local mode="$1"
if [ "$1" == "encap" ]
then
if [ $encap_tests != 0 ]
then
log_test_skipped "${desc}"
return
fi
mode+=" tundst 2001:db8:2::2"
ip -netns $ioam_node_gamma link set ip6tnl0 up &>/dev/null
fi
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 \
encap ioam6 mode $mode trace prealloc type $tr_type ns $ns size $tr_size \
via 2001:db8:1::1 dev veth0 &>/dev/null
if [ $? == 0 ]
then
run_test ${FUNCNAME[0]} "${desc}" 2001:db8:1::2 $tr_type $tr_size $ns $1
else
log_test_failed "${desc}"
fi
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
[ "$1" == "encap" ] && ip -netns $ioam_node_gamma \
link set ip6tnl0 down &>/dev/null
}
input_disabled()
{
##############################################################################
# Make sure an IOAM node does NOT fill the trace when IOAM is not enabled on #
# the corresponding (ingress) interface. #
##############################################################################
local desc="IOAM disabled on ingress interface"
local ns=123
local tr_type=0x800000
local tr_size=4
local mode="$1"
if [ "$1" == "encap" ]
then
if [ $encap_tests != 0 ]
then
log_test_skipped "${desc}"
return
fi
mode+=" tundst 2001:db8:2::2"
ip -netns $ioam_node_gamma link set ip6tnl0 up &>/dev/null
fi
# Exception: disable IOAM on ingress interface
ip netns exec $ioam_node_beta \
sysctl -wq net.ipv6.conf.veth0.ioam6_enabled=0 &>/dev/null
local ret=$?
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 \
encap ioam6 mode $mode trace prealloc type $tr_type ns $ns size $tr_size \
via 2001:db8:1::1 dev veth0 &>/dev/null
ret=$((ret + $?))
if [ $ret == 0 ]
then
run_test ${FUNCNAME[0]} "${desc}" 2001:db8:1::2 $tr_type $tr_size $ns $1
else
log_test_failed "${desc}"
fi
# Clean Exception
ip netns exec $ioam_node_beta \
sysctl -wq net.ipv6.conf.veth0.ioam6_enabled=1 &>/dev/null
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
[ "$1" == "encap" ] && ip -netns $ioam_node_gamma \
link set ip6tnl0 down &>/dev/null
}
input_oflag()
{
##############################################################################
# Make sure an IOAM node does NOT fill the trace when the Overflow flag is #
# set. #
##############################################################################
local desc="Overflow flag is set"
local ns=123
local tr_type=0xc00000
local tr_size=4
local mode="$1"
if [ "$1" == "encap" ]
then
if [ $encap_tests != 0 ]
then
log_test_skipped "${desc}"
return
fi
mode+=" tundst 2001:db8:2::2"
ip -netns $ioam_node_gamma link set ip6tnl0 up &>/dev/null
fi
# Exception:
# Here, we need the sender to set the Overflow flag. For that, we will add
# back the IOAM namespace that was previously configured on the sender.
ip -netns $ioam_node_alpha ioam namespace add 123 &>/dev/null
local ret=$?
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 \
encap ioam6 mode $mode trace prealloc type $tr_type ns $ns size $tr_size \
via 2001:db8:1::1 dev veth0 &>/dev/null
ret=$((ret + $?))
if [ $ret == 0 ]
then
run_test ${FUNCNAME[0]} "${desc}" 2001:db8:1::2 $tr_type $tr_size $ns $1
else
log_test_failed "${desc}"
fi
# Clean Exception
ip -netns $ioam_node_alpha ioam namespace del 123 &>/dev/null
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
[ "$1" == "encap" ] && ip -netns $ioam_node_gamma \
link set ip6tnl0 down &>/dev/null
}
input_bits()
{
##############################################################################
# Make sure an IOAM node implements all supported bits by checking it #
# correctly fills the trace with its data. #
##############################################################################
local desc="Trace Type with supported bit <n> only"
local ns=123
local mode="$1"
if [ "$1" == "encap" ]
then
mode+=" tundst 2001:db8:2::2"
ip -netns $ioam_node_gamma link set ip6tnl0 up &>/dev/null
fi
local tmp=${bit2size[22]}
bit2size[22]=$(( $tmp + ${#BETA[9]} + ((4 - (${#BETA[9]} % 4)) % 4) ))
local i
for i in {0..11} {22..22}
do
local descr="${desc/<n>/$i}"
if [[ "$1" == "encap" && $encap_tests != 0 ]]
then
log_test_skipped "${descr}"
continue
fi
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 \
encap ioam6 mode $mode trace prealloc \
type ${bit2type[$i]} ns $ns size ${bit2size[$i]} \
via 2001:db8:1::1 dev veth0 &>/dev/null
if [ $? == 0 ]
then
run_test "input_bit$i" "${descr}" 2001:db8:1::2 \
${bit2type[$i]} ${bit2size[$i]} $ns $1
else
log_test_failed "${descr}"
fi
done
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
[ "$1" == "encap" ] && ip -netns $ioam_node_gamma \
link set ip6tnl0 down &>/dev/null
bit2size[22]=$tmp
}
input_sizes()
{
##############################################################################
# Make sure an IOAM node handles all supported sizes correctly. #
##############################################################################
local desc="Trace Size of <n> bytes"
local ns=123
local tr_type=0x800000
local mode="$1"
if [ "$1" == "encap" ]
then
mode+=" tundst 2001:db8:2::2"
ip -netns $ioam_node_gamma link set ip6tnl0 up &>/dev/null
fi
local i
for i in $(seq 4 4 244)
do
local descr="${desc/<n>/$i}"
if [[ "$1" == "encap" && $encap_tests != 0 ]]
then
log_test_skipped "${descr}"
continue
fi
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 \
encap ioam6 mode $mode trace prealloc type $tr_type ns $ns size $i \
via 2001:db8:1::1 dev veth0 &>/dev/null
if [ $? == 0 ]
then
run_test "input_size$i" "${descr}" 2001:db8:1::2 $tr_type $i $ns $1
else
log_test_failed "${descr}"
fi
done
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
[ "$1" == "encap" ] && ip -netns $ioam_node_gamma \
link set ip6tnl0 down &>/dev/null
}
input_full_supp_trace()
{
##############################################################################
# Make sure an IOAM node correctly fills a trace when all supported bits are #
# set. #
##############################################################################
local desc="Full supported trace"
local ns=123
local tr_type=0xfff002
local tr_size
local mode="$1"
if [ "$1" == "encap" ]
then
if [ $encap_tests != 0 ]
then
log_test_skipped "${desc}"
return
fi
mode+=" tundst 2001:db8:2::2"
ip -netns $ioam_node_gamma link set ip6tnl0 up &>/dev/null
fi
local i
tr_size=$(( ${#BETA[9]} + ((4 - (${#BETA[9]} % 4)) % 4) ))
for i in {0..11} {22..22}
do
tr_size=$((tr_size + bit2size[$i]))
done
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 \
encap ioam6 mode $mode trace prealloc type $tr_type ns $ns size $tr_size \
via 2001:db8:1::1 dev veth0 &>/dev/null
if [ $? == 0 ]
then
run_test ${FUNCNAME[0]} "${desc}" 2001:db8:1::2 $tr_type $tr_size $ns $1
else
log_test_failed "${desc}"
fi
ip -netns $ioam_node_alpha \
route change 2001:db8:2::/64 via 2001:db8:1::1 dev veth0 &>/dev/null
[ "$1" == "encap" ] && ip -netns $ioam_node_gamma \
link set ip6tnl0 down &>/dev/null
}
################################################################################
# #
# MAIN #
# #
################################################################################
npassed=0
nskipped=0
nfailed=0
if [ "$(id -u)" -ne 0 ]
then
echo "SKIP: Need root privileges."
exit $ksft_skip
fi
if [ ! -x "$(command -v ip)" ]
then
echo "SKIP: Could not run test without ip tool."
exit $ksft_skip
fi
check_kernel_compatibility
setup
run
cleanup
if [ $nfailed != 0 ]
then
exit $ksft_fail
fi
exit $ksft_pass