forked from Minki/linux
selftests: add simple GSO GRE test
Test case for commit a6e3f2985a
("ip6_tunnel: fix GRE6 segmentation").
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
3f22bb137e
commit
025efa0a82
@ -27,6 +27,7 @@ TEST_PROGS += udpgro_fwd.sh
|
|||||||
TEST_PROGS += veth.sh
|
TEST_PROGS += veth.sh
|
||||||
TEST_PROGS += ioam6.sh
|
TEST_PROGS += ioam6.sh
|
||||||
TEST_PROGS += gro.sh
|
TEST_PROGS += gro.sh
|
||||||
|
TEST_PROGS += gre_gso.sh
|
||||||
TEST_PROGS_EXTENDED := in_netns.sh
|
TEST_PROGS_EXTENDED := in_netns.sh
|
||||||
TEST_GEN_FILES = socket nettest
|
TEST_GEN_FILES = socket nettest
|
||||||
TEST_GEN_FILES += psock_fanout psock_tpacket msg_zerocopy reuseport_addr_any
|
TEST_GEN_FILES += psock_fanout psock_tpacket msg_zerocopy reuseport_addr_any
|
||||||
|
236
tools/testing/selftests/net/gre_gso.sh
Executable file
236
tools/testing/selftests/net/gre_gso.sh
Executable file
@ -0,0 +1,236 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
|
# This test is for checking GRE GSO.
|
||||||
|
|
||||||
|
ret=0
|
||||||
|
# Kselftest framework requirement - SKIP code is 4.
|
||||||
|
ksft_skip=4
|
||||||
|
|
||||||
|
# all tests in this script. Can be overridden with -t option
|
||||||
|
TESTS="gre_gso"
|
||||||
|
|
||||||
|
VERBOSE=0
|
||||||
|
PAUSE_ON_FAIL=no
|
||||||
|
PAUSE=no
|
||||||
|
IP="ip -netns ns1"
|
||||||
|
NS_EXEC="ip netns exec ns1"
|
||||||
|
TMPFILE=`mktemp`
|
||||||
|
PID=
|
||||||
|
|
||||||
|
log_test()
|
||||||
|
{
|
||||||
|
local rc=$1
|
||||||
|
local expected=$2
|
||||||
|
local msg="$3"
|
||||||
|
|
||||||
|
if [ ${rc} -eq ${expected} ]; then
|
||||||
|
printf " TEST: %-60s [ OK ]\n" "${msg}"
|
||||||
|
nsuccess=$((nsuccess+1))
|
||||||
|
else
|
||||||
|
ret=1
|
||||||
|
nfail=$((nfail+1))
|
||||||
|
printf " TEST: %-60s [FAIL]\n" "${msg}"
|
||||||
|
if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
|
||||||
|
echo
|
||||||
|
echo "hit enter to continue, 'q' to quit"
|
||||||
|
read a
|
||||||
|
[ "$a" = "q" ] && exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${PAUSE}" = "yes" ]; then
|
||||||
|
echo
|
||||||
|
echo "hit enter to continue, 'q' to quit"
|
||||||
|
read a
|
||||||
|
[ "$a" = "q" ] && exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
setup()
|
||||||
|
{
|
||||||
|
set -e
|
||||||
|
ip netns add ns1
|
||||||
|
ip netns set ns1 auto
|
||||||
|
$IP link set dev lo up
|
||||||
|
|
||||||
|
ip link add veth0 type veth peer name veth1
|
||||||
|
ip link set veth0 up
|
||||||
|
ip link set veth1 netns ns1
|
||||||
|
$IP link set veth1 name veth0
|
||||||
|
$IP link set veth0 up
|
||||||
|
|
||||||
|
dd if=/dev/urandom of=$TMPFILE bs=1024 count=2048 &>/dev/null
|
||||||
|
set +e
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanup()
|
||||||
|
{
|
||||||
|
rm -rf $TMPFILE
|
||||||
|
[ -n "$PID" ] && kill $PID
|
||||||
|
ip link del dev gre1 &> /dev/null
|
||||||
|
ip link del dev veth0 &> /dev/null
|
||||||
|
ip netns del ns1
|
||||||
|
}
|
||||||
|
|
||||||
|
get_linklocal()
|
||||||
|
{
|
||||||
|
local dev=$1
|
||||||
|
local ns=$2
|
||||||
|
local addr
|
||||||
|
|
||||||
|
[ -n "$ns" ] && ns="-netns $ns"
|
||||||
|
|
||||||
|
addr=$(ip -6 -br $ns addr show dev ${dev} | \
|
||||||
|
awk '{
|
||||||
|
for (i = 3; i <= NF; ++i) {
|
||||||
|
if ($i ~ /^fe80/)
|
||||||
|
print $i
|
||||||
|
}
|
||||||
|
}'
|
||||||
|
)
|
||||||
|
addr=${addr/\/*}
|
||||||
|
|
||||||
|
[ -z "$addr" ] && return 1
|
||||||
|
|
||||||
|
echo $addr
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
gre_create_tun()
|
||||||
|
{
|
||||||
|
local a1=$1
|
||||||
|
local a2=$2
|
||||||
|
local mode
|
||||||
|
|
||||||
|
[[ $a1 =~ ^[0-9.]*$ ]] && mode=gre || mode=ip6gre
|
||||||
|
|
||||||
|
ip tunnel add gre1 mode $mode local $a1 remote $a2 dev veth0
|
||||||
|
ip link set gre1 up
|
||||||
|
$IP tunnel add gre1 mode $mode local $a2 remote $a1 dev veth0
|
||||||
|
$IP link set gre1 up
|
||||||
|
}
|
||||||
|
|
||||||
|
gre_gst_test_checks()
|
||||||
|
{
|
||||||
|
local name=$1
|
||||||
|
local addr=$2
|
||||||
|
|
||||||
|
$NS_EXEC nc -kl $port >/dev/null &
|
||||||
|
PID=$!
|
||||||
|
while ! $NS_EXEC ss -ltn | grep -q $port; do ((i++)); sleep 0.01; done
|
||||||
|
|
||||||
|
cat $TMPFILE | timeout 1 nc $addr $port
|
||||||
|
log_test $? 0 "$name - copy file w/ TSO"
|
||||||
|
|
||||||
|
ethtool -K veth0 tso off
|
||||||
|
|
||||||
|
cat $TMPFILE | timeout 1 nc $addr $port
|
||||||
|
log_test $? 0 "$name - copy file w/ GSO"
|
||||||
|
|
||||||
|
ethtool -K veth0 tso on
|
||||||
|
|
||||||
|
kill $PID
|
||||||
|
PID=
|
||||||
|
}
|
||||||
|
|
||||||
|
gre6_gso_test()
|
||||||
|
{
|
||||||
|
local port=7777
|
||||||
|
|
||||||
|
setup
|
||||||
|
|
||||||
|
a1=$(get_linklocal veth0)
|
||||||
|
a2=$(get_linklocal veth0 ns1)
|
||||||
|
|
||||||
|
gre_create_tun $a1 $a2
|
||||||
|
|
||||||
|
ip addr add 172.16.2.1/24 dev gre1
|
||||||
|
$IP addr add 172.16.2.2/24 dev gre1
|
||||||
|
|
||||||
|
ip -6 addr add 2001:db8:1::1/64 dev gre1 nodad
|
||||||
|
$IP -6 addr add 2001:db8:1::2/64 dev gre1 nodad
|
||||||
|
|
||||||
|
sleep 2
|
||||||
|
|
||||||
|
gre_gst_test_checks GREv6/v4 172.16.2.2
|
||||||
|
gre_gst_test_checks GREv6/v6 2001:db8:1::2
|
||||||
|
|
||||||
|
cleanup
|
||||||
|
}
|
||||||
|
|
||||||
|
gre_gso_test()
|
||||||
|
{
|
||||||
|
gre6_gso_test
|
||||||
|
}
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# usage
|
||||||
|
|
||||||
|
usage()
|
||||||
|
{
|
||||||
|
cat <<EOF
|
||||||
|
usage: ${0##*/} OPTS
|
||||||
|
|
||||||
|
-t <test> Test(s) to run (default: all)
|
||||||
|
(options: $TESTS)
|
||||||
|
-p Pause on fail
|
||||||
|
-P Pause after each test before cleanup
|
||||||
|
-v verbose mode (show commands and output)
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# main
|
||||||
|
|
||||||
|
while getopts :t:pPhv o
|
||||||
|
do
|
||||||
|
case $o in
|
||||||
|
t) TESTS=$OPTARG;;
|
||||||
|
p) PAUSE_ON_FAIL=yes;;
|
||||||
|
P) PAUSE=yes;;
|
||||||
|
v) VERBOSE=$(($VERBOSE + 1));;
|
||||||
|
h) usage; exit 0;;
|
||||||
|
*) usage; exit 1;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
PEER_CMD="ip netns exec ${PEER_NS}"
|
||||||
|
|
||||||
|
# make sure we don't pause twice
|
||||||
|
[ "${PAUSE}" = "yes" ] && PAUSE_ON_FAIL=no
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
if [ ! -x "$(command -v nc)" ]; then
|
||||||
|
echo "SKIP: Could not run test without nc tool"
|
||||||
|
exit $ksft_skip
|
||||||
|
fi
|
||||||
|
|
||||||
|
# start clean
|
||||||
|
cleanup &> /dev/null
|
||||||
|
|
||||||
|
for t in $TESTS
|
||||||
|
do
|
||||||
|
case $t in
|
||||||
|
gre_gso) gre_gso_test;;
|
||||||
|
|
||||||
|
help) echo "Test names: $TESTS"; exit 0;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$TESTS" != "none" ]; then
|
||||||
|
printf "\nTests passed: %3d\n" ${nsuccess}
|
||||||
|
printf "Tests failed: %3d\n" ${nfail}
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit $ret
|
Loading…
Reference in New Issue
Block a user