openvswitch.sh 4.1 KB

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