On Mon, Nov 04, 2024 at 07:44:29PM +0200, Ido Schimmel wrote:
> 1. We should set the same MTU in both paths as otherwise we don't know
> which MTU will be cached and what to pass to check_pmtu_value() as the
> expected value. I did see that check_pmtu_value() accepts "any", but I
> think it's better to check for a specific value.
> 
> 2. route_get_dst_pmtu_from_exception() is not very flexible in the
> keywords it accepts for "ip route get" and we need to pass "oif". It can
> be solved by [1] (please test), but Guillaume might have a better idea.
> Then, the above hunk can be replaced by [2].

Thanks for bringing this to my attention Ido!
I fully agree with this approach (and I also fully agree with your other
feedbacks).

Nice to see this bug fixed and get a selftest!

> [1]
> diff --git a/tools/testing/selftests/net/pmtu.sh 
> b/tools/testing/selftests/net/pmtu.sh
> index 569bce8b6383..6e790d38e5d9 100755
> --- a/tools/testing/selftests/net/pmtu.sh
> +++ b/tools/testing/selftests/net/pmtu.sh
> @@ -1076,23 +1076,15 @@ link_get_mtu() {
>  }
>  
>  route_get_dst_exception() {
> -     ns_cmd="${1}"
> -     dst="${2}"
> -     dsfield="${3}"
> -
> -     if [ -z "${dsfield}" ]; then
> -             dsfield=0
> -     fi
> +     ns_cmd="${1}"; shift
>  
> -     ${ns_cmd} ip route get "${dst}" dsfield "${dsfield}"
> +     ${ns_cmd} ip route get "$@"
>  }
>  
>  route_get_dst_pmtu_from_exception() {
> -     ns_cmd="${1}"
> -     dst="${2}"
> -     dsfield="${3}"
> +     ns_cmd="${1}"; shift
>  
> -     mtu_parse "$(route_get_dst_exception "${ns_cmd}" "${dst}" "${dsfield}")"
> +     mtu_parse "$(route_get_dst_exception "${ns_cmd}" "$@")"
>  }
>  
>  check_pmtu_value() {
> @@ -1235,10 +1227,10 @@ test_pmtu_ipv4_dscp_icmp_exception() {
>       run_cmd "${ns_a}" ping -q -M want -Q "${dsfield}" -c 1 -w 1 -s "${len}" 
> "${dst2}"
>  
>       # Check that exceptions have been created with the correct PMTU
> -     pmtu_1="$(route_get_dst_pmtu_from_exception "${ns_a}" "${dst1}" 
> "${policy_mark}")"
> +     pmtu_1="$(route_get_dst_pmtu_from_exception "${ns_a}" ${dst1} dsfield 
> ${policy_mark})"
>       check_pmtu_value "1400" "${pmtu_1}" "exceeding MTU" || return 1
>  
> -     pmtu_2="$(route_get_dst_pmtu_from_exception "${ns_a}" "${dst2}" 
> "${policy_mark}")"
> +     pmtu_2="$(route_get_dst_pmtu_from_exception "${ns_a}" ${dst2} dsfield 
> ${policy_mark})"
>       check_pmtu_value "1500" "${pmtu_2}" "exceeding MTU" || return 1
>  }
>  
> @@ -1285,9 +1277,9 @@ test_pmtu_ipv4_dscp_udp_exception() {
>               UDP:"${dst2}":50000,tos="${dsfield}"
>  
>       # Check that exceptions have been created with the correct PMTU
> -     pmtu_1="$(route_get_dst_pmtu_from_exception "${ns_a}" "${dst1}" 
> "${policy_mark}")"
> +     pmtu_1="$(route_get_dst_pmtu_from_exception "${ns_a}" ${dst1} dsfield 
> ${policy_mark})"
>       check_pmtu_value "1400" "${pmtu_1}" "exceeding MTU" || return 1
> -     pmtu_2="$(route_get_dst_pmtu_from_exception "${ns_a}" "${dst2}" 
> "${policy_mark}")"
> +     pmtu_2="$(route_get_dst_pmtu_from_exception "${ns_a}" ${dst2} dsfield 
> ${policy_mark})"
>       check_pmtu_value "1500" "${pmtu_2}" "exceeding MTU" || return 1
>  }
> 
> [2]
> diff --git a/tools/testing/selftests/net/pmtu.sh 
> b/tools/testing/selftests/net/pmtu.sh
> index a3c3f7f99e5b..10b8ac2d7f47 100755
> --- a/tools/testing/selftests/net/pmtu.sh
> +++ b/tools/testing/selftests/net/pmtu.sh
> @@ -2399,19 +2399,11 @@ test_pmtu_ipv4_mp_exceptions() {
>       # Ping and expect two nexthop exceptions for two routes in nh group
>       run_cmd ${ns_a} ping -q -M want -i 0.1 -c 1 -s 1800 "${dummy4_b_addr}"
>  
> -     # Do route lookup before checking cached exceptions.
> -     # The following commands are needed for dst entries to be cached
> -     # in both paths exceptions and therefore dumped to user space
> -     run_cmd ${ns_a} ip route get ${dummy4_b_addr} oif veth_A-R1
> -     run_cmd ${ns_a} ip route get ${dummy4_b_addr} oif veth_A-R2
> -
> -     # Check cached exceptions
> -     if [ "$(${ns_a} ip -oneline route list cache | grep mtu | wc -l)" -ne 2 
> ]; then
> -             err "  there are not enough cached exceptions"
> -             fail=1
> -     fi
> -
> -     return ${fail}
> +     # Check that exceptions have been created with the correct PMTU
> +     pmtu="$(route_get_dst_pmtu_from_exception "${ns_a}" ${dummy4_b_addr} 
> oif veth_A-R1)"
> +     check_pmtu_value "1500" "${pmtu}" "exceeding MTU (veth_A-R1)" || return 
> 1
> +     pmtu="$(route_get_dst_pmtu_from_exception "${ns_a}" ${dummy4_b_addr} 
> oif veth_A-R2)"
> +     check_pmtu_value "1500" "${pmtu}" "exceeding MTU (veth_A-R2)" || return 
> 1
>  }
>  
>  usage() {
> 


Reply via email to