]> git.baikalelectronics.ru Git - kernel.git/commitdiff
selftests: add simple GSO GRE test
authorJakub Kicinski <kuba@kernel.org>
Wed, 1 Sep 2021 15:55:01 +0000 (08:55 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 2 Sep 2021 10:33:28 +0000 (11:33 +0100)
Test case for commit a6e3f2985a80 ("ip6_tunnel: fix GRE6 segmentation").

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
tools/testing/selftests/net/Makefile
tools/testing/selftests/net/gre_gso.sh [new file with mode: 0755]

index 378c0aac5a1a824f27fa54488f2f9d0858a94db0..492b273743b4e74cf8275db56e50f4acd3e9d22b 100644 (file)
@@ -27,6 +27,7 @@ TEST_PROGS += udpgro_fwd.sh
 TEST_PROGS += veth.sh
 TEST_PROGS += ioam6.sh
 TEST_PROGS += gro.sh
+TEST_PROGS += gre_gso.sh
 TEST_PROGS_EXTENDED := in_netns.sh
 TEST_GEN_FILES =  socket nettest
 TEST_GEN_FILES += psock_fanout psock_tpacket msg_zerocopy reuseport_addr_any
diff --git a/tools/testing/selftests/net/gre_gso.sh b/tools/testing/selftests/net/gre_gso.sh
new file mode 100755 (executable)
index 0000000..facbb0c
--- /dev/null
@@ -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