0001
0002
0003
0004
0005
0006 ret=0
0007
0008 ksft_skip=4
0009
0010
0011 TESTS="gre_gso"
0012
0013 VERBOSE=0
0014 PAUSE_ON_FAIL=no
0015 PAUSE=no
0016 IP="ip -netns ns1"
0017 NS_EXEC="ip netns exec ns1"
0018 TMPFILE=`mktemp`
0019 PID=
0020
0021 log_test()
0022 {
0023 local rc=$1
0024 local expected=$2
0025 local msg="$3"
0026
0027 if [ ${rc} -eq ${expected} ]; then
0028 printf " TEST: %-60s [ OK ]\n" "${msg}"
0029 nsuccess=$((nsuccess+1))
0030 else
0031 ret=1
0032 nfail=$((nfail+1))
0033 printf " TEST: %-60s [FAIL]\n" "${msg}"
0034 if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
0035 echo
0036 echo "hit enter to continue, 'q' to quit"
0037 read a
0038 [ "$a" = "q" ] && exit 1
0039 fi
0040 fi
0041
0042 if [ "${PAUSE}" = "yes" ]; then
0043 echo
0044 echo "hit enter to continue, 'q' to quit"
0045 read a
0046 [ "$a" = "q" ] && exit 1
0047 fi
0048 }
0049
0050 setup()
0051 {
0052 set -e
0053 ip netns add ns1
0054 ip netns set ns1 auto
0055 $IP link set dev lo up
0056
0057 ip link add veth0 type veth peer name veth1
0058 ip link set veth0 up
0059 ip link set veth1 netns ns1
0060 $IP link set veth1 name veth0
0061 $IP link set veth0 up
0062
0063 dd if=/dev/urandom of=$TMPFILE bs=1024 count=2048 &>/dev/null
0064 set +e
0065 }
0066
0067 cleanup()
0068 {
0069 rm -rf $TMPFILE
0070 [ -n "$PID" ] && kill $PID
0071 ip link del dev gre1 &> /dev/null
0072 ip link del dev veth0 &> /dev/null
0073 ip netns del ns1
0074 }
0075
0076 get_linklocal()
0077 {
0078 local dev=$1
0079 local ns=$2
0080 local addr
0081
0082 [ -n "$ns" ] && ns="-netns $ns"
0083
0084 addr=$(ip -6 -br $ns addr show dev ${dev} | \
0085 awk '{
0086 for (i = 3; i <= NF; ++i) {
0087 if ($i ~ /^fe80/)
0088 print $i
0089 }
0090 }'
0091 )
0092 addr=${addr/\/*}
0093
0094 [ -z "$addr" ] && return 1
0095
0096 echo $addr
0097
0098 return 0
0099 }
0100
0101 gre_create_tun()
0102 {
0103 local a1=$1
0104 local a2=$2
0105 local mode
0106
0107 [[ $a1 =~ ^[0-9.]*$ ]] && mode=gre || mode=ip6gre
0108
0109 ip tunnel add gre1 mode $mode local $a1 remote $a2 dev veth0
0110 ip link set gre1 up
0111 $IP tunnel add gre1 mode $mode local $a2 remote $a1 dev veth0
0112 $IP link set gre1 up
0113 }
0114
0115 gre_gst_test_checks()
0116 {
0117 local name=$1
0118 local addr=$2
0119 local proto=$3
0120
0121 [ "$proto" == 6 ] && addr="[$addr]"
0122
0123 $NS_EXEC socat - tcp${proto}-listen:$port,reuseaddr,fork >/dev/null &
0124 PID=$!
0125 while ! $NS_EXEC ss -ltn | grep -q $port; do ((i++)); sleep 0.01; done
0126
0127 cat $TMPFILE | timeout 1 socat -u STDIN TCP:$addr:$port
0128 log_test $? 0 "$name - copy file w/ TSO"
0129
0130 ethtool -K veth0 tso off
0131
0132 cat $TMPFILE | timeout 1 socat -u STDIN TCP:$addr:$port
0133 log_test $? 0 "$name - copy file w/ GSO"
0134
0135 ethtool -K veth0 tso on
0136
0137 kill $PID
0138 PID=
0139 }
0140
0141 gre6_gso_test()
0142 {
0143 local port=7777
0144
0145 setup
0146
0147 a1=$(get_linklocal veth0)
0148 a2=$(get_linklocal veth0 ns1)
0149
0150 gre_create_tun $a1 $a2
0151
0152 ip addr add 172.16.2.1/24 dev gre1
0153 $IP addr add 172.16.2.2/24 dev gre1
0154
0155 ip -6 addr add 2001:db8:1::1/64 dev gre1 nodad
0156 $IP -6 addr add 2001:db8:1::2/64 dev gre1 nodad
0157
0158 sleep 2
0159
0160 gre_gst_test_checks GREv6/v4 172.16.2.2 4
0161 gre_gst_test_checks GREv6/v6 2001:db8:1::2 6
0162
0163 cleanup
0164 }
0165
0166 gre_gso_test()
0167 {
0168 gre6_gso_test
0169 }
0170
0171
0172
0173
0174 usage()
0175 {
0176 cat <<EOF
0177 usage: ${0
0178
0179 -t <test> Test(s) to run (default: all)
0180 (options: $TESTS)
0181 -p Pause on fail
0182 -P Pause after each test before cleanup
0183 -v verbose mode (show commands and output)
0184 EOF
0185 }
0186
0187
0188
0189
0190 while getopts :t:pPhv o
0191 do
0192 case $o in
0193 t) TESTS=$OPTARG;;
0194 p) PAUSE_ON_FAIL=yes;;
0195 P) PAUSE=yes;;
0196 v) VERBOSE=$(($VERBOSE + 1));;
0197 h) usage; exit 0;;
0198 *) usage; exit 1;;
0199 esac
0200 done
0201
0202 PEER_CMD="ip netns exec ${PEER_NS}"
0203
0204
0205 [ "${PAUSE}" = "yes" ] && PAUSE_ON_FAIL=no
0206
0207 if [ "$(id -u)" -ne 0 ];then
0208 echo "SKIP: Need root privileges"
0209 exit $ksft_skip;
0210 fi
0211
0212 if [ ! -x "$(command -v ip)" ]; then
0213 echo "SKIP: Could not run test without ip tool"
0214 exit $ksft_skip
0215 fi
0216
0217 if [ ! -x "$(command -v socat)" ]; then
0218 echo "SKIP: Could not run test without socat tool"
0219 exit $ksft_skip
0220 fi
0221
0222
0223 cleanup &> /dev/null
0224
0225 for t in $TESTS
0226 do
0227 case $t in
0228 gre_gso) gre_gso_test;;
0229
0230 help) echo "Test names: $TESTS"; exit 0;;
0231 esac
0232 done
0233
0234 if [ "$TESTS" != "none" ]; then
0235 printf "\nTests passed: %3d\n" ${nsuccess}
0236 printf "Tests failed: %3d\n" ${nfail}
0237 fi
0238
0239 exit $ret