declare -A all_tests
 declare -a only_tests_ids
 declare -a only_tests_names
+declare -A failed_tests
 TEST_COUNT=0
 TEST_NAME=""
 nr_blank=40
        ip netns exec $ns2 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns2_enable
 }
 
+fail_test()
+{
+       ret=1
+       failed_tests[${TEST_COUNT}]="${TEST_NAME}"
+}
+
+get_failed_tests_ids()
+{
+       # sorted
+       local i
+       for i in "${!failed_tests[@]}"; do
+               echo "${i}"
+       done | sort -n
+}
+
 print_file_err()
 {
        ls -l "$1" 1>&2
                        echo "[ FAIL ] $what does not match (in, out):"
                        print_file_err "$in"
                        print_file_err "$out"
-                       ret=1
+                       fail_test
 
                        return 1
                else
        ip netns exec ${connector_ns} ping -q -c 1 $connect_addr >/dev/null
        if [ $? -ne 0 ] ; then
                echo "$listener_ns -> $connect_addr connectivity [ FAIL ]" 1>&2
-               ret=1
+               fail_test
        fi
 }
 
                echo "[ ok ]"
        else
                echo "[fail] expected '$expected_line' found '$line'"
-               ret=1
+               fail_test
        fi
 }
 
                cat /tmp/${connector_ns}.out
 
                cat "$capout"
-               ret=1
+               fail_test
                return 1
        fi
 
        if [ "$count" != $csum_ns1 -a $allow_multi_errors_ns1 -eq 0 ] ||
           [ "$count" -lt $csum_ns1 -a $allow_multi_errors_ns1 -eq 1 ]; then
                echo "[fail] got $count data checksum error[s] expected $csum_ns1"
-               ret=1
+               fail_test
                dump_stats=1
        else
                echo -n "[ ok ]"
        if [ "$count" != $csum_ns2 -a $allow_multi_errors_ns2 -eq 0 ] ||
           [ "$count" -lt $csum_ns2 -a $allow_multi_errors_ns2 -eq 1 ]; then
                echo "[fail] got $count data checksum error[s] expected $csum_ns2"
-               ret=1
+               fail_test
                dump_stats=1
        else
                echo "[ ok ]"
        [ -z "$count" ] && count=0
        if [ "$count" != "$fail_tx" ]; then
                echo "[fail] got $count MP_FAIL[s] TX expected $fail_tx"
-               ret=1
+               fail_test
                dump_stats=1
        else
                echo -n "[ ok ]"
        [ -z "$count" ] && count=0
        if [ "$count" != "$fail_rx" ]; then
                echo "[fail] got $count MP_FAIL[s] RX expected $fail_rx"
-               ret=1
+               fail_test
                dump_stats=1
        else
                echo "[ ok ]"
        [ -z "$count" ] && count=0
        if [ "$count" != "$fclose_tx" ]; then
                echo "[fail] got $count MP_FASTCLOSE[s] TX expected $fclose_tx"
-               ret=1
+               fail_test
                dump_stats=1
        else
                echo -n "[ ok ]"
        [ -z "$count" ] && count=0
        if [ "$count" != "$fclose_rx" ]; then
                echo "[fail] got $count MP_FASTCLOSE[s] RX expected $fclose_rx"
-               ret=1
+               fail_test
                dump_stats=1
        else
                echo "[ ok ]"
        [ -z "$count" ] && count=0
        if [ "$count" != "$rst_tx" ]; then
                echo "[fail] got $count MP_RST[s] TX expected $rst_tx"
-               ret=1
+               fail_test
                dump_stats=1
        else
                echo -n "[ ok ]"
        [ -z "$count" ] && count=0
        if [ "$count" != "$rst_rx" ]; then
                echo "[fail] got $count MP_RST[s] RX expected $rst_rx"
-               ret=1
+               fail_test
                dump_stats=1
        else
                echo -n "[ ok ]"
        [ -z "$count" ] && count=0
        if [ "$count" != "$syn_nr" ]; then
                echo "[fail] got $count JOIN[s] syn expected $syn_nr"
-               ret=1
+               fail_test
                dump_stats=1
        else
                echo -n "[ ok ]"
                        echo -n "[ ok ]"
                else
                        echo "[fail] got $count JOIN[s] synack expected $syn_ack_nr"
-                       ret=1
+                       fail_test
                        dump_stats=1
                fi
        else
        [ -z "$count" ] && count=0
        if [ "$count" != "$ack_nr" ]; then
                echo "[fail] got $count JOIN[s] ack expected $ack_nr"
-               ret=1
+               fail_test
                dump_stats=1
        else
                echo "[ ok ]"
                echo "[fail] got $stale_nr stale[s] $recover_nr recover[s], " \
                     " expected stale in range [$stale_min..$stale_max]," \
                     " stale-recover delta $stale_delta "
-               ret=1
+               fail_test
                dump_stats=1
        else
                echo "[ ok ]"
        # add addrs options, due to retransmissions
        if [ "$count" != "$add_nr" ] && [ "$timeout" -gt 1 -o "$count" -lt "$add_nr" ]; then
                echo "[fail] got $count ADD_ADDR[s] expected $add_nr"
-               ret=1
+               fail_test
                dump_stats=1
        else
                echo -n "[ ok ]"
        [ -z "$count" ] && count=0
        if [ "$count" != "$echo_nr" ]; then
                echo "[fail] got $count ADD_ADDR echo[s] expected $echo_nr"
-               ret=1
+               fail_test
                dump_stats=1
        else
                echo -n "[ ok ]"
                [ -z "$count" ] && count=0
                if [ "$count" != "$port_nr" ]; then
                        echo "[fail] got $count ADD_ADDR[s] with a port-number expected $port_nr"
-                       ret=1
+                       fail_test
                        dump_stats=1
                else
                        echo "[ ok ]"
                if [ "$count" != "$syn_nr" ]; then
                        echo "[fail] got $count JOIN[s] syn with a different \
                                port-number expected $syn_nr"
-                       ret=1
+                       fail_test
                        dump_stats=1
                else
                        echo -n "[ ok ]"
                if [ "$count" != "$syn_ack_nr" ]; then
                        echo "[fail] got $count JOIN[s] synack with a different \
                                port-number expected $syn_ack_nr"
-                       ret=1
+                       fail_test
                        dump_stats=1
                else
                        echo -n "[ ok ]"
                if [ "$count" != "$ack_nr" ]; then
                        echo "[fail] got $count JOIN[s] ack with a different \
                                port-number expected $ack_nr"
-                       ret=1
+                       fail_test
                        dump_stats=1
                else
                        echo "[ ok ]"
                if [ "$count" != "$mis_syn_nr" ]; then
                        echo "[fail] got $count JOIN[s] syn with a mismatched \
                                port-number expected $mis_syn_nr"
-                       ret=1
+                       fail_test
                        dump_stats=1
                else
                        echo -n "[ ok ]"
                if [ "$count" != "$mis_ack_nr" ]; then
                        echo "[fail] got $count JOIN[s] ack with a mismatched \
                                port-number expected $mis_ack_nr"
-                       ret=1
+                       fail_test
                        dump_stats=1
                else
                        echo "[ ok ]"
        [ -z "$count" ] && count=0
        if [ "$count" != "$rm_addr_nr" ]; then
                echo "[fail] got $count RM_ADDR[s] expected $rm_addr_nr"
-               ret=1
+               fail_test
                dump_stats=1
        else
                echo -n "[ ok ]"
                        echo "[ ok ] $suffix"
                else
                        echo "[fail] got $count RM_SUBFLOW[s] expected in range [$rm_subflow_nr:$((rm_subflow_nr*2))]"
-                       ret=1
+                       fail_test
                        dump_stats=1
                fi
                return
        fi
        if [ "$count" != "$rm_subflow_nr" ]; then
                echo "[fail] got $count RM_SUBFLOW[s] expected $rm_subflow_nr"
-               ret=1
+               fail_test
                dump_stats=1
        else
                echo -n "[ ok ]"
        [ -z "$count" ] && count=0
        if [ "$count" != "$mp_prio_nr_tx" ]; then
                echo "[fail] got $count MP_PRIO[s] TX expected $mp_prio_nr_tx"
-               ret=1
+               fail_test
                dump_stats=1
        else
                echo -n "[ ok ]"
        [ -z "$count" ] && count=0
        if [ "$count" != "$mp_prio_nr_rx" ]; then
                echo "[fail] got $count MP_PRIO[s] RX expected $mp_prio_nr_rx"
-               ret=1
+               fail_test
                dump_stats=1
        else
                echo "[ ok ]"
        if [ $tx_rate -lt $((expected_rate - $tolerance)) -o \
             $tx_rate -gt $((expected_rate + $tolerance)) ]; then
                echo "[fail] got $tx_rate% usage, expected $expected_rate%"
-               ret=1
+               fail_test
        else
                echo "[ ok ]"
        fi
        "${subtests}"
 done
 
+if [ ${ret} -ne 0 ]; then
+       echo
+       echo "${#failed_tests[@]} failure(s) has(ve) been detected:"
+       for i in $(get_failed_tests_ids); do
+               echo -e "\t- ${i}: ${failed_tests[${i}]}"
+       done
+       echo
+fi
+
 exit $ret