• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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