#
 # Tests currently implemented:
 #
-# - test_pmtu_vti6_exception
+# - pmtu_vti6_exception
 #      Set up vti6 tunnel on top of veth, with xfrm states and policies, in two
 #      namespaces with matching endpoints. Check that route exception is
 #      created by exceeding link layer MTU with ping to other endpoint. Then
 #      decrease and increase MTU of tunnel, checking that route exception PMTU
 #      changes accordingly
 
+tests="
+       pmtu_vti6_exception     vti6: PMTU exceptions"
+
 NS_A="ns-$(mktemp -u XXXXXX)"
 NS_B="ns-$(mktemp -u XXXXXX)"
 ns_a="ip netns exec ${NS_A}"
 vti6_b_addr="fd00:2::b"
 vti6_mask="64"
 
+cleanup_done=1
+err_buf=
+
+err() {
+       err_buf="${err_buf}${1}
+"
+}
+
+err_flush() {
+       echo -n "${err_buf}"
+       err_buf=
+}
+
 setup_namespaces() {
        ip netns add ${NS_A} || return 1
        ip netns add ${NS_B}
 }
 
 setup() {
-       tunnel_type="$1"
-
-       [ "$(id -u)" -ne 0 ] && echo "SKIP: need to run as root" && exit 0
-
-       setup_namespaces || { echo "SKIP: namespaces not supported"; exit 0; }
-       setup_veth || { echo "SKIP: veth not supported"; exit 0; }
+       [ "$(id -u)" -ne 0 ] && echo "  need to run as root" && return 1
 
-       case ${tunnel_type} in
-       "vti6")
-               setup_vti6 || { echo "SKIP: vti6 not supported"; exit 0; }
-               setup_xfrm || { echo "SKIP: xfrm not supported"; exit 0; }
-               ;;
-       *)
-               ;;
-       esac
+       cleanup_done=0
+       for arg do
+               eval setup_${arg} || { echo "  ${arg} not supported"; return 1; }
+       done
 }
 
 cleanup() {
+       [ ${cleanup_done} -eq 1 ] && return
        ip netns del ${NS_A} 2 > /dev/null
        ip netns del ${NS_B} 2 > /dev/null
+       cleanup_done=1
 }
 
 mtu() {
 }
 
 test_pmtu_vti6_exception() {
-       setup vti6
+       setup namespaces veth vti6 xfrm || return 2
+       fail=0
 
        # Create route exception by exceeding link layer MTU
        mtu "${ns_a}" veth_a 4000
 
        # Check that exception was created
        if [ "$(route_get_dst_pmtu_from_exception "${ns_a}" ${vti6_b_addr})" = "" ]; then
-               echo "FAIL: Tunnel exceeding link layer MTU didn't create route exception"
-               exit 1
+               err "  tunnel exceeding link layer MTU didn't create route exception"
+               return 1
        fi
 
        # Decrease tunnel MTU, check for PMTU decrease in route exception
        mtu "${ns_a}" vti_a 3000
 
        if [ "$(route_get_dst_pmtu_from_exception "${ns_a}" ${vti6_b_addr})" -ne 3000 ]; then
-               echo "FAIL: Decreasing tunnel MTU didn't decrease route exception PMTU"
-               exit 1
+               err "  decreasing tunnel MTU didn't decrease route exception PMTU"
+               fail=1
        fi
 
        # Increase tunnel MTU, check for PMTU increase in route exception
        mtu "${ns_a}" vti_a 9000
        if [ "$(route_get_dst_pmtu_from_exception "${ns_a}" ${vti6_b_addr})" -ne 9000 ]; then
-               echo "FAIL: Increasing tunnel MTU didn't increase route exception PMTU"
-               exit 1
+               err "  increasing tunnel MTU didn't increase route exception PMTU"
+               fail=1
        fi
 
-       echo "PASS"
+       return ${fail}
 }
 
 trap cleanup EXIT
 
-test_pmtu_vti6_exception
-
-exit 0
+exitcode=0
+desc=0
+IFS="  
+"
+for t in ${tests}; do
+       [ $desc -eq 0 ] && name="${t}" && desc=1 && continue || desc=0
+
+       (
+               unset IFS
+               eval test_${name}
+               ret=$?
+               cleanup
+
+               if [ $ret -eq 0 ]; then
+                       printf "TEST: %-60s  [ OK ]\n" "${t}"
+               elif [ $ret -eq 1 ]; then
+                       printf "TEST: %-60s  [FAIL]\n" "${t}"
+                       err_flush
+                       exit 1
+               elif [ $ret -eq 2 ]; then
+                       printf "TEST: %-60s  [SKIP]\n" "${t}"
+                       err_flush
+               fi
+       )
+       [ $? -ne 0 ] && exitcode=1
+done
+
+exit ${exitcode}