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