1#!/bin/sh 2# SPDX-License-Identifier: GPL-2.0 3# 4# OVS kernel module self tests 5 6trap ovs_exit_sig EXIT TERM INT ERR 7 8# Kselftest framework requirement - SKIP code is 4. 9ksft_skip=4 10 11PAUSE_ON_FAIL=no 12VERBOSE=0 13TRACING=0 14 15tests=" 16 netlink_checks ovsnl: validate netlink attrs and settings" 17 18info() { 19 [ $VERBOSE = 0 ] || echo $* 20} 21 22ovs_base=`pwd` 23sbxs= 24sbx_add () { 25 info "adding sandbox '$1'" 26 27 sbxs="$sbxs $1" 28 29 NO_BIN=0 30 31 # Create sandbox. 32 local d="$ovs_base"/$1 33 if [ -e $d ]; then 34 info "removing $d" 35 rm -rf "$d" 36 fi 37 mkdir "$d" || return 1 38 ovs_setenv $1 39} 40 41ovs_exit_sig() { 42 [ -e ${ovs_dir}/cleanup ] && . "$ovs_dir/cleanup" 43} 44 45on_exit() { 46 echo "$1" > ${ovs_dir}/cleanup.tmp 47 cat ${ovs_dir}/cleanup >> ${ovs_dir}/cleanup.tmp 48 mv ${ovs_dir}/cleanup.tmp ${ovs_dir}/cleanup 49} 50 51ovs_setenv() { 52 sandbox=$1 53 54 ovs_dir=$ovs_base${1:+/$1}; export ovs_dir 55 56 test -e ${ovs_dir}/cleanup || : > ${ovs_dir}/cleanup 57} 58 59ovs_sbx() { 60 if test "X$2" != X; then 61 (ovs_setenv $1; shift; "$@" >> ${ovs_dir}/debug.log) 62 else 63 ovs_setenv $1 64 fi 65} 66 67ovs_add_dp () { 68 info "Adding DP/Bridge IF: sbx:$1 dp:$2 {$3, $4, $5}" 69 sbxname="$1" 70 shift 71 ovs_sbx "$sbxname" python3 $ovs_base/ovs-dpctl.py add-dp $* 72 on_exit "ovs_sbx $sbxname python3 $ovs_base/ovs-dpctl.py del-dp $1;" 73} 74 75usage() { 76 echo 77 echo "$0 [OPTIONS] [TEST]..." 78 echo "If no TEST argument is given, all tests will be run." 79 echo 80 echo "Options" 81 echo " -t: capture traffic via tcpdump" 82 echo " -v: verbose" 83 echo " -p: pause on failure" 84 echo 85 echo "Available tests${tests}" 86 exit 1 87} 88 89# netlink_validation 90# - Create a dp 91# - check no warning with "old version" simulation 92test_netlink_checks () { 93 sbx_add "test_netlink_checks" || return 1 94 95 info "setting up new DP" 96 ovs_add_dp "test_netlink_checks" nv0 || return 1 97 # now try again 98 PRE_TEST=$(dmesg | grep -E "RIP: [0-9a-fA-Fx]+:ovs_dp_cmd_new\+") 99 ovs_add_dp "test_netlink_checks" nv0 -V 0 || return 1 100 POST_TEST=$(dmesg | grep -E "RIP: [0-9a-fA-Fx]+:ovs_dp_cmd_new\+") 101 if [ "$PRE_TEST" != "$POST_TEST" ]; then 102 info "failed - gen warning" 103 return 1 104 fi 105 106 return 0 107} 108 109run_test() { 110 ( 111 tname="$1" 112 tdesc="$2" 113 114 if ! lsmod | grep openvswitch >/dev/null 2>&1; then 115 stdbuf -o0 printf "TEST: %-60s [NOMOD]\n" "${tdesc}" 116 return $ksft_skip 117 fi 118 119 if python3 ovs-dpctl.py -h 2>&1 | \ 120 grep -E "Need to (install|upgrade) the python" >/dev/null 2>&1; then 121 stdbuf -o0 printf "TEST: %-60s [PYLIB]\n" "${tdesc}" 122 return $ksft_skip 123 fi 124 printf "TEST: %-60s [START]\n" "${tname}" 125 126 unset IFS 127 128 eval test_${tname} 129 ret=$? 130 131 if [ $ret -eq 0 ]; then 132 printf "TEST: %-60s [ OK ]\n" "${tdesc}" 133 ovs_exit_sig 134 rm -rf "$ovs_dir" 135 elif [ $ret -eq 1 ]; then 136 printf "TEST: %-60s [FAIL]\n" "${tdesc}" 137 if [ "${PAUSE_ON_FAIL}" = "yes" ]; then 138 echo 139 echo "Pausing. Logs in $ovs_dir/. Hit enter to continue" 140 read a 141 fi 142 ovs_exit_sig 143 [ "${PAUSE_ON_FAIL}" = "yes" ] || rm -rf "$ovs_dir" 144 exit 1 145 elif [ $ret -eq $ksft_skip ]; then 146 printf "TEST: %-60s [SKIP]\n" "${tdesc}" 147 elif [ $ret -eq 2 ]; then 148 rm -rf test_${tname} 149 run_test "$1" "$2" 150 fi 151 152 return $ret 153 ) 154 ret=$? 155 case $ret in 156 0) 157 [ $all_skipped = true ] && [ $exitcode=$ksft_skip ] && exitcode=0 158 all_skipped=false 159 ;; 160 $ksft_skip) 161 [ $all_skipped = true ] && exitcode=$ksft_skip 162 ;; 163 *) 164 all_skipped=false 165 exitcode=1 166 ;; 167 esac 168 169 return $ret 170} 171 172 173exitcode=0 174desc=0 175all_skipped=true 176 177while getopts :pvt o 178do 179 case $o in 180 p) PAUSE_ON_FAIL=yes;; 181 v) VERBOSE=1;; 182 t) if which tcpdump > /dev/null 2>&1; then 183 TRACING=1 184 else 185 echo "=== tcpdump not available, tracing disabled" 186 fi 187 ;; 188 *) usage;; 189 esac 190done 191shift $(($OPTIND-1)) 192 193IFS=" 194" 195 196for arg do 197 # Check first that all requested tests are available before running any 198 command -v > /dev/null "test_${arg}" || { echo "=== Test ${arg} not found"; usage; } 199done 200 201name="" 202desc="" 203for t in ${tests}; do 204 [ "${name}" = "" ] && name="${t}" && continue 205 [ "${desc}" = "" ] && desc="${t}" 206 207 run_this=1 208 for arg do 209 [ "${arg}" != "${arg#--*}" ] && continue 210 [ "${arg}" = "${name}" ] && run_this=1 && break 211 run_this=0 212 done 213 if [ $run_this -eq 1 ]; then 214 run_test "${name}" "${desc}" 215 fi 216 name="" 217 desc="" 218done 219 220exit ${exitcode} 221