validate_checksum=0
 init=0
 
+declare -A all_tests
 TEST_COUNT=0
 nr_blank=40
 
        wait
 }
 
-all_tests()
-{
-       subflows_tests
-       subflows_error_tests
-       signal_address_tests
-       link_failure_tests
-       add_addr_timeout_tests
-       remove_tests
-       add_tests
-       ipv6_tests
-       v4mapped_tests
-       backup_tests
-       add_addr_ports_tests
-       syncookies_tests
-       checksum_tests
-       deny_join_id0_tests
-       fullmesh_tests
-       fastclose_tests
-       implicit_tests
-}
-
 # [$1: error message]
 usage()
 {
        fi
 
        echo "mptcp_join usage:"
-       echo "  -f subflows_tests"
-       echo "  -e subflows_error_tests"
-       echo "  -s signal_address_tests"
-       echo "  -l link_failure_tests"
-       echo "  -t add_addr_timeout_tests"
-       echo "  -r remove_tests"
-       echo "  -a add_tests"
-       echo "  -6 ipv6_tests"
-       echo "  -4 v4mapped_tests"
-       echo "  -b backup_tests"
-       echo "  -p add_addr_ports_tests"
-       echo "  -k syncookies_tests"
-       echo "  -S checksum_tests"
-       echo "  -d deny_join_id0_tests"
-       echo "  -m fullmesh_tests"
-       echo "  -z fastclose_tests"
-       echo "  -I implicit_tests"
+
+       local key
+       for key in "${!all_tests[@]}"; do
+               echo "  -${key} ${all_tests[${key}]}"
+       done
+
        echo "  -c capture pcap files"
        echo "  -C enable data checksum"
        echo "  -i use ip mptcp"
 }
 
 
+# Use a "simple" array to force an specific order we cannot have with an associative one
+all_tests_sorted=(
+       f@subflows_tests
+       e@subflows_error_tests
+       s@signal_address_tests
+       l@link_failure_tests
+       t@add_addr_timeout_tests
+       r@remove_tests
+       a@add_tests
+       6@ipv6_tests
+       4@v4mapped_tests
+       b@backup_tests
+       p@add_addr_ports_tests
+       k@syncookies_tests
+       S@checksum_tests
+       d@deny_join_id0_tests
+       m@fullmesh_tests
+       z@fastclose_tests
+       I@implicit_tests
+)
+
+all_tests_args=""
+all_tests_names=()
+for subtests in "${all_tests_sorted[@]}"; do
+       key="${subtests%@*}"
+       value="${subtests#*@}"
+
+       all_tests_args+="${key}"
+       all_tests_names+=("${value}")
+       all_tests[${key}]="${value}"
+done
+
 tests=()
-while getopts 'fesltra64bpkdmchzICSi' opt; do
+while getopts "${all_tests_args}cCih" opt; do
        case $opt in
-               f)
-                       tests+=(subflows_tests)
-                       ;;
-               e)
-                       tests+=(subflows_error_tests)
-                       ;;
-               s)
-                       tests+=(signal_address_tests)
-                       ;;
-               l)
-                       tests+=(link_failure_tests)
-                       ;;
-               t)
-                       tests+=(add_addr_timeout_tests)
-                       ;;
-               r)
-                       tests+=(remove_tests)
-                       ;;
-               a)
-                       tests+=(add_tests)
-                       ;;
-               6)
-                       tests+=(ipv6_tests)
-                       ;;
-               4)
-                       tests+=(v4mapped_tests)
-                       ;;
-               b)
-                       tests+=(backup_tests)
-                       ;;
-               p)
-                       tests+=(add_addr_ports_tests)
-                       ;;
-               k)
-                       tests+=(syncookies_tests)
-                       ;;
-               S)
-                       tests+=(checksum_tests)
-                       ;;
-               d)
-                       tests+=(deny_join_id0_tests)
-                       ;;
-               m)
-                       tests+=(fullmesh_tests)
-                       ;;
-               z)
-                       tests+=(fastclose_tests)
-                       ;;
-               I)
-                       tests+=(implicit_tests)
+               ["${all_tests_args}"])
+                       tests+=("${all_tests[${opt}]}")
                        ;;
                c)
                        capture=1
 done
 
 if [ ${#tests[@]} -eq 0 ]; then
-       all_tests
-else
-       for subtests in "${tests[@]}"; do
-               "${subtests}"
-       done
+       tests=("${all_tests_names[@]}")
 fi
 
+for subtests in "${tests[@]}"; do
+       "${subtests}"
+done
+
 exit $ret