#!/bin/sh # SPDX-License-Identifier: GPL-2.0 # # OVS kernel module self tests # Kselftest framework requirement - SKIP code is 4. ksft_skip=4 PAUSE_ON_FAIL=no VERBOSE=0 TRACING=0 tests=" netlink_checks ovsnl: validate netlink attrs and settings" info() { [ $VERBOSE = 0 ] || echo $* } ovs_base=`pwd` sbxs= sbx_add () { info "adding sandbox '$1'" sbxs="$sbxs $1" NO_BIN=0 # Create sandbox. local d="$ovs_base"/$1 if [ -e $d ]; then info "removing $d" rm -rf "$d" fi mkdir "$d" || return 1 ovs_setenv $1 } ovs_exit_sig() { [ -e ${ovs_dir}/cleanup ] && . "$ovs_dir/cleanup" } on_exit() { echo "$1" > ${ovs_dir}/cleanup.tmp cat ${ovs_dir}/cleanup >> ${ovs_dir}/cleanup.tmp mv ${ovs_dir}/cleanup.tmp ${ovs_dir}/cleanup } ovs_setenv() { sandbox=$1 ovs_dir=$ovs_base${1:+/$1}; export ovs_dir test -e ${ovs_dir}/cleanup || : > ${ovs_dir}/cleanup } ovs_sbx() { if test "X$2" != X; then (ovs_setenv $1; shift; "$@" >> ${ovs_dir}/debug.log) else ovs_setenv $1 fi } ovs_add_dp () { info "Adding DP/Bridge IF: sbx:$1 dp:$2 {$3, $4, $5}" sbxname="$1" shift ovs_sbx "$sbxname" python3 $ovs_base/ovs-dpctl.py add-dp $* on_exit "ovs_sbx $sbxname python3 $ovs_base/ovs-dpctl.py del-dp $1;" } usage() { echo echo "$0 [OPTIONS] [TEST]..." echo "If no TEST argument is given, all tests will be run." echo echo "Options" echo " -t: capture traffic via tcpdump" echo " -v: verbose" echo " -p: pause on failure" echo echo "Available tests${tests}" exit 1 } # netlink_validation # - Create a dp # - check no warning with "old version" simulation test_netlink_checks () { sbx_add "test_netlink_checks" || return 1 info "setting up new DP" ovs_add_dp "test_netlink_checks" nv0 || return 1 # now try again PRE_TEST=$(dmesg | grep -E "RIP: [0-9a-fA-Fx]+:ovs_dp_cmd_new\+") ovs_add_dp "test_netlink_checks" nv0 -V 0 || return 1 POST_TEST=$(dmesg | grep -E "RIP: [0-9a-fA-Fx]+:ovs_dp_cmd_new\+") if [ "$PRE_TEST" != "$POST_TEST" ]; then info "failed - gen warning" return 1 fi return 0 } run_test() { ( tname="$1" tdesc="$2" if ! lsmod | grep openvswitch >/dev/null 2>&1; then stdbuf -o0 printf "TEST: %-60s [NOMOD]\n" "${tdesc}" return $ksft_skip fi if python3 ovs-dpctl.py -h 2>&1 | \ grep "Need to install the python" >/dev/null 2>&1; then stdbuf -o0 printf "TEST: %-60s [PYLIB]\n" "${tdesc}" return $ksft_skip fi printf "TEST: %-60s [START]\n" "${tname}" unset IFS eval test_${tname} ret=$? if [ $ret -eq 0 ]; then printf "TEST: %-60s [ OK ]\n" "${tdesc}" ovs_exit_sig rm -rf "$ovs_dir" elif [ $ret -eq 1 ]; then printf "TEST: %-60s [FAIL]\n" "${tdesc}" if [ "${PAUSE_ON_FAIL}" = "yes" ]; then echo echo "Pausing. Logs in $ovs_dir/. Hit enter to continue" read a fi ovs_exit_sig [ "${PAUSE_ON_FAIL}" = "yes" ] || rm -rf "$ovs_dir" exit 1 elif [ $ret -eq $ksft_skip ]; then printf "TEST: %-60s [SKIP]\n" "${tdesc}" elif [ $ret -eq 2 ]; then rm -rf test_${tname} run_test "$1" "$2" fi return $ret ) ret=$? case $ret in 0) [ $all_skipped = true ] && [ $exitcode=$ksft_skip ] && exitcode=0 all_skipped=false ;; $ksft_skip) [ $all_skipped = true ] && exitcode=$ksft_skip ;; *) all_skipped=false exitcode=1 ;; esac return $ret } exitcode=0 desc=0 all_skipped=true while getopts :pvt o do case $o in p) PAUSE_ON_FAIL=yes;; v) VERBOSE=1;; t) if which tcpdump > /dev/null 2>&1; then TRACING=1 else echo "=== tcpdump not available, tracing disabled" fi ;; *) usage;; esac done shift $(($OPTIND-1)) IFS=" " for arg do # Check first that all requested tests are available before running any command -v > /dev/null "test_${arg}" || { echo "=== Test ${arg} not found"; usage; } done name="" desc="" for t in ${tests}; do [ "${name}" = "" ] && name="${t}" && continue [ "${desc}" = "" ] && desc="${t}" run_this=1 for arg do [ "${arg}" != "${arg#--*}" ] && continue [ "${arg}" = "${name}" ] && run_this=1 && break run_this=0 done if [ $run_this -eq 1 ]; then run_test "${name}" "${desc}" fi name="" desc="" done exit ${exitcode}