1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3 4# This test is for checking GRE GSO. 5 6ret=0 7# Kselftest framework requirement - SKIP code is 4. 8ksft_skip=4 9 10# all tests in this script. Can be overridden with -t option 11TESTS="gre_gso" 12 13VERBOSE=0 14PAUSE_ON_FAIL=no 15PAUSE=no 16IP="ip -netns ns1" 17NS_EXEC="ip netns exec ns1" 18TMPFILE=`mktemp` 19PID= 20 21log_test() 22{ 23 local rc=$1 24 local expected=$2 25 local msg="$3" 26 27 if [ ${rc} -eq ${expected} ]; then 28 printf " TEST: %-60s [ OK ]\n" "${msg}" 29 nsuccess=$((nsuccess+1)) 30 else 31 ret=1 32 nfail=$((nfail+1)) 33 printf " TEST: %-60s [FAIL]\n" "${msg}" 34 if [ "${PAUSE_ON_FAIL}" = "yes" ]; then 35 echo 36 echo "hit enter to continue, 'q' to quit" 37 read a 38 [ "$a" = "q" ] && exit 1 39 fi 40 fi 41 42 if [ "${PAUSE}" = "yes" ]; then 43 echo 44 echo "hit enter to continue, 'q' to quit" 45 read a 46 [ "$a" = "q" ] && exit 1 47 fi 48} 49 50setup() 51{ 52 set -e 53 ip netns add ns1 54 ip netns set ns1 auto 55 $IP link set dev lo up 56 57 ip link add veth0 type veth peer name veth1 58 ip link set veth0 up 59 ip link set veth1 netns ns1 60 $IP link set veth1 name veth0 61 $IP link set veth0 up 62 63 dd if=/dev/urandom of=$TMPFILE bs=1024 count=2048 &>/dev/null 64 set +e 65} 66 67cleanup() 68{ 69 rm -rf $TMPFILE 70 [ -n "$PID" ] && kill $PID 71 ip link del dev gre1 &> /dev/null 72 ip link del dev veth0 &> /dev/null 73 ip netns del ns1 74} 75 76get_linklocal() 77{ 78 local dev=$1 79 local ns=$2 80 local addr 81 82 [ -n "$ns" ] && ns="-netns $ns" 83 84 addr=$(ip -6 -br $ns addr show dev ${dev} | \ 85 awk '{ 86 for (i = 3; i <= NF; ++i) { 87 if ($i ~ /^fe80/) 88 print $i 89 } 90 }' 91 ) 92 addr=${addr/\/*} 93 94 [ -z "$addr" ] && return 1 95 96 echo $addr 97 98 return 0 99} 100 101gre_create_tun() 102{ 103 local a1=$1 104 local a2=$2 105 local mode 106 107 [[ $a1 =~ ^[0-9.]*$ ]] && mode=gre || mode=ip6gre 108 109 ip tunnel add gre1 mode $mode local $a1 remote $a2 dev veth0 110 ip link set gre1 up 111 $IP tunnel add gre1 mode $mode local $a2 remote $a1 dev veth0 112 $IP link set gre1 up 113} 114 115gre_gst_test_checks() 116{ 117 local name=$1 118 local addr=$2 119 local proto=$3 120 121 [ "$proto" == 6 ] && addr="[$addr]" 122 123 $NS_EXEC socat - tcp${proto}-listen:$port,reuseaddr,fork >/dev/null & 124 PID=$! 125 while ! $NS_EXEC ss -ltn | grep -q $port; do ((i++)); sleep 0.01; done 126 127 cat $TMPFILE | timeout 1 socat -u STDIN TCP:$addr:$port 128 log_test $? 0 "$name - copy file w/ TSO" 129 130 ethtool -K veth0 tso off 131 132 cat $TMPFILE | timeout 1 socat -u STDIN TCP:$addr:$port 133 log_test $? 0 "$name - copy file w/ GSO" 134 135 ethtool -K veth0 tso on 136 137 kill $PID 138 PID= 139} 140 141gre6_gso_test() 142{ 143 local port=7777 144 145 setup 146 147 a1=$(get_linklocal veth0) 148 a2=$(get_linklocal veth0 ns1) 149 150 gre_create_tun $a1 $a2 151 152 ip addr add 172.16.2.1/24 dev gre1 153 $IP addr add 172.16.2.2/24 dev gre1 154 155 ip -6 addr add 2001:db8:1::1/64 dev gre1 nodad 156 $IP -6 addr add 2001:db8:1::2/64 dev gre1 nodad 157 158 sleep 2 159 160 gre_gst_test_checks GREv6/v4 172.16.2.2 4 161 gre_gst_test_checks GREv6/v6 2001:db8:1::2 6 162 163 cleanup 164} 165 166gre_gso_test() 167{ 168 gre6_gso_test 169} 170 171################################################################################ 172# usage 173 174usage() 175{ 176 cat <<EOF 177usage: ${0##*/} OPTS 178 179 -t <test> Test(s) to run (default: all) 180 (options: $TESTS) 181 -p Pause on fail 182 -P Pause after each test before cleanup 183 -v verbose mode (show commands and output) 184EOF 185} 186 187################################################################################ 188# main 189 190while getopts :t:pPhv o 191do 192 case $o in 193 t) TESTS=$OPTARG;; 194 p) PAUSE_ON_FAIL=yes;; 195 P) PAUSE=yes;; 196 v) VERBOSE=$(($VERBOSE + 1));; 197 h) usage; exit 0;; 198 *) usage; exit 1;; 199 esac 200done 201 202PEER_CMD="ip netns exec ${PEER_NS}" 203 204# make sure we don't pause twice 205[ "${PAUSE}" = "yes" ] && PAUSE_ON_FAIL=no 206 207if [ "$(id -u)" -ne 0 ];then 208 echo "SKIP: Need root privileges" 209 exit $ksft_skip; 210fi 211 212if [ ! -x "$(command -v ip)" ]; then 213 echo "SKIP: Could not run test without ip tool" 214 exit $ksft_skip 215fi 216 217if [ ! -x "$(command -v socat)" ]; then 218 echo "SKIP: Could not run test without socat tool" 219 exit $ksft_skip 220fi 221 222# start clean 223cleanup &> /dev/null 224 225for t in $TESTS 226do 227 case $t in 228 gre_gso) gre_gso_test;; 229 230 help) echo "Test names: $TESTS"; exit 0;; 231 esac 232done 233 234if [ "$TESTS" != "none" ]; then 235 printf "\nTests passed: %3d\n" ${nsuccess} 236 printf "Tests failed: %3d\n" ${nfail} 237fi 238 239exit $ret 240