blob: 881eb399798f7b2a8131722df62673241acc0917 [file] [log] [blame]
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0+
#
# Author: Justin Iurman <justin.iurman@uliege.be>
#
# WARNING
# -------
# This is just a dummy script that triggers encap cases with possible dst cache
# reference loops in affected lwt users (see list below). Some cases are
# pathological configurations for simplicity, others are valid. Overall, we
# don't want this issue to happen, no matter what. In order to catch any
# reference loops, kmemleak MUST be used. The results alone are always blindly
# successful, don't rely on them. Note that the following tests may crash the
# kernel if the fix to prevent lwtunnel_{input|output|xmit}() reentry loops is
# not present.
#
# Affected lwt users so far (please update accordingly if needed):
# - ila_lwt (output only)
# - ioam6_iptunnel (output only)
# - rpl_iptunnel (both input and output)
# - seg6_iptunnel (both input and output)
source lib.sh
check_compatibility()
{
setup_ns tmp_node &>/dev/null
if [ $? != 0 ]; then
echo "SKIP: Cannot create netns."
exit $ksft_skip
fi
ip link add name veth0 netns $tmp_node type veth \
peer name veth1 netns $tmp_node &>/dev/null
local ret=$?
ip -netns $tmp_node link set veth0 up &>/dev/null
ret=$((ret + $?))
ip -netns $tmp_node link set veth1 up &>/dev/null
ret=$((ret + $?))
if [ $ret != 0 ]; then
echo "SKIP: Cannot configure links."
cleanup_ns $tmp_node
exit $ksft_skip
fi
lsmod 2>/dev/null | grep -q "ila"
ila_lsmod=$?
[ $ila_lsmod != 0 ] && modprobe ila &>/dev/null
ip -netns $tmp_node route add 2001:db8:1::/64 \
encap ila 1:2:3:4 csum-mode no-action ident-type luid \
hook-type output \
dev veth0 &>/dev/null
ip -netns $tmp_node route add 2001:db8:2::/64 \
encap ioam6 trace prealloc type 0x800000 ns 0 size 4 \
dev veth0 &>/dev/null
ip -netns $tmp_node route add 2001:db8:3::/64 \
encap rpl segs 2001:db8:3::1 dev veth0 &>/dev/null
ip -netns $tmp_node route add 2001:db8:4::/64 \
encap seg6 mode inline segs 2001:db8:4::1 dev veth0 &>/dev/null
ip -netns $tmp_node -6 route 2>/dev/null | grep -q "encap ila"
skip_ila=$?
ip -netns $tmp_node -6 route 2>/dev/null | grep -q "encap ioam6"
skip_ioam6=$?
ip -netns $tmp_node -6 route 2>/dev/null | grep -q "encap rpl"
skip_rpl=$?
ip -netns $tmp_node -6 route 2>/dev/null | grep -q "encap seg6"
skip_seg6=$?
cleanup_ns $tmp_node
}
setup()
{
setup_ns alpha beta gamma &>/dev/null
ip link add name veth-alpha netns $alpha type veth \
peer name veth-betaL netns $beta &>/dev/null
ip link add name veth-betaR netns $beta type veth \
peer name veth-gamma netns $gamma &>/dev/null
ip -netns $alpha link set veth-alpha name veth0 &>/dev/null
ip -netns $beta link set veth-betaL name veth0 &>/dev/null
ip -netns $beta link set veth-betaR name veth1 &>/dev/null
ip -netns $gamma link set veth-gamma name veth0 &>/dev/null
ip -netns $alpha addr add 2001:db8:1::2/64 dev veth0 &>/dev/null
ip -netns $alpha link set veth0 up &>/dev/null
ip -netns $alpha link set lo up &>/dev/null
ip -netns $alpha route add 2001:db8:2::/64 \
via 2001:db8:1::1 dev veth0 &>/dev/null
ip -netns $beta addr add 2001:db8:1::1/64 dev veth0 &>/dev/null
ip -netns $beta addr add 2001:db8:2::1/64 dev veth1 &>/dev/null
ip -netns $beta link set veth0 up &>/dev/null
ip -netns $beta link set veth1 up &>/dev/null
ip -netns $beta link set lo up &>/dev/null
ip -netns $beta route del 2001:db8:2::/64
ip -netns $beta route add 2001:db8:2::/64 dev veth1
ip netns exec $beta \
sysctl -wq net.ipv6.conf.all.forwarding=1 &>/dev/null
ip -netns $gamma addr add 2001:db8:2::2/64 dev veth0 &>/dev/null
ip -netns $gamma link set veth0 up &>/dev/null
ip -netns $gamma link set lo up &>/dev/null
ip -netns $gamma route add 2001:db8:1::/64 \
via 2001:db8:2::1 dev veth0 &>/dev/null
sleep 1
ip netns exec $alpha ping6 -c 5 -W 1 2001:db8:2::2 &>/dev/null
if [ $? != 0 ]; then
echo "SKIP: Setup failed."
exit $ksft_skip
fi
sleep 1
}
cleanup()
{
cleanup_ns $alpha $beta $gamma
[ $ila_lsmod != 0 ] && modprobe -r ila &>/dev/null
}
run_ila()
{
if [ $skip_ila != 0 ]; then
echo "SKIP: ila (output)"
return
fi
ip -netns $beta route del 2001:db8:2::/64
ip -netns $beta route add 2001:db8:2:0:0:0:0:2/128 \
encap ila 2001:db8:2:0 csum-mode no-action ident-type luid \
hook-type output \
dev veth1 &>/dev/null
sleep 1
echo "TEST: ila (output)"
ip netns exec $beta ping6 -c 2 -W 1 2001:db8:2::2 &>/dev/null
sleep 1
ip -netns $beta route del 2001:db8:2:0:0:0:0:2/128
ip -netns $beta route add 2001:db8:2::/64 dev veth1
sleep 1
}
run_ioam6()
{
if [ $skip_ioam6 != 0 ]; then
echo "SKIP: ioam6 (output)"
return
fi
ip -netns $beta route change 2001:db8:2::/64 \
encap ioam6 trace prealloc type 0x800000 ns 1 size 4 \
dev veth1 &>/dev/null
sleep 1
echo "TEST: ioam6 (output)"
ip netns exec $beta ping6 -c 2 -W 1 2001:db8:2::2 &>/dev/null
sleep 1
}
run_rpl()
{
if [ $skip_rpl != 0 ]; then
echo "SKIP: rpl (input)"
echo "SKIP: rpl (output)"
return
fi
ip -netns $beta route change 2001:db8:2::/64 \
encap rpl segs 2001:db8:2::2 \
dev veth1 &>/dev/null
sleep 1
echo "TEST: rpl (input)"
ip netns exec $alpha ping6 -c 2 -W 1 2001:db8:2::2 &>/dev/null
sleep 1
echo "TEST: rpl (output)"
ip netns exec $beta ping6 -c 2 -W 1 2001:db8:2::2 &>/dev/null
sleep 1
}
run_seg6()
{
if [ $skip_seg6 != 0 ]; then
echo "SKIP: seg6 (input)"
echo "SKIP: seg6 (output)"
return
fi
ip -netns $beta route change 2001:db8:2::/64 \
encap seg6 mode inline segs 2001:db8:2::2 \
dev veth1 &>/dev/null
sleep 1
echo "TEST: seg6 (input)"
ip netns exec $alpha ping6 -c 2 -W 1 2001:db8:2::2 &>/dev/null
sleep 1
echo "TEST: seg6 (output)"
ip netns exec $beta ping6 -c 2 -W 1 2001:db8:2::2 &>/dev/null
sleep 1
}
run()
{
run_ila
run_ioam6
run_rpl
run_seg6
}
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_compatibility
trap cleanup EXIT
setup
run
exit $ksft_pass