Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/bash
0002 # SPDX-License-Identifier: GPL-2.0
0003 
0004 # This test is for checking GRE GSO.
0005 
0006 ret=0
0007 # Kselftest framework requirement - SKIP code is 4.
0008 ksft_skip=4
0009 
0010 # all tests in this script. Can be overridden with -t option
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 # usage
0173 
0174 usage()
0175 {
0176         cat <<EOF
0177 usage: ${0##*/} OPTS
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 # main
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 # make sure we don't pause twice
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 # start clean
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