Make pmtu_ipv4_mp_exceptions family agnostic and add
pmtu_ipv6_mp_exceptions: one oversized ping over a multipath route
must leave PMTU exceptions on both paths.

Without the preceding fix the IPv6 test fails with both legacy
nexthops and nexthop objects:

  PMTU exception wasn't created after exceeding MTU (veth_A-R2)

Signed-off-by: Vladimir Vdovin <[email protected]>
---
 tools/testing/selftests/net/pmtu.sh | 162 +++++++++++++++++++++-------
 1 file changed, 124 insertions(+), 38 deletions(-)

diff --git a/tools/testing/selftests/net/pmtu.sh 
b/tools/testing/selftests/net/pmtu.sh
index c7cd271714ef..9ff46708fa03 100755
--- a/tools/testing/selftests/net/pmtu.sh
+++ b/tools/testing/selftests/net/pmtu.sh
@@ -203,6 +203,9 @@
 #      on host A and B on lo reachable via both routers. Host A and B
 #      addresses have multipath routes to each other, b_r1 mtu = 1500.
 #      Check that PMTU exceptions are created for both paths.
+#
+# - pmtu_ipv6_mp_exceptions
+#      Same as above but with IPv6
 
 source lib.sh
 
@@ -272,7 +275,8 @@ tests="
        list_flush_ipv6_exception       ipv6: list and flush cached exceptions  
1
        pmtu_ipv4_route_change          ipv4: PMTU exception w/route replace    
1
        pmtu_ipv6_route_change          ipv6: PMTU exception w/route replace    
1
-       pmtu_ipv4_mp_exceptions         ipv4: PMTU multipath nh exceptions      
1"
+       pmtu_ipv4_mp_exceptions         ipv4: PMTU multipath nh exceptions      
1
+       pmtu_ipv6_mp_exceptions         ipv6: PMTU multipath nh exceptions      
1"
 
 # Addressing and routing for tests with routers: four network segments, with
 # index SEGMENT between 1 and 4, a common prefix (PREFIX4 or PREFIX6) and an
@@ -352,6 +356,9 @@ tunnel6_mask="64"
 host4_a_addr="192.168.99.99"
 host4_b_addr="192.168.88.88"
 
+host6_a_addr="fc00:1000::a"
+host6_b_addr="fc00:1001::b"
+
 dummy6_0_prefix="fc00:1000::"
 dummy6_1_prefix="fc00:1001::"
 dummy6_mask="64"
@@ -994,49 +1001,112 @@ setup_ovs_bridge() {
 }
 
 setup_multipath_new() {
-       # Set up host A with multipath routes to host B host4_b_addr
-       run_cmd ${ns_a} ip addr add ${host4_a_addr} dev lo
-       run_cmd ${ns_a} ip nexthop add id 401 via ${prefix4}.${a_r1}.2 dev 
veth_A-R1
-       run_cmd ${ns_a} ip nexthop add id 402 via ${prefix4}.${a_r2}.2 dev 
veth_A-R2
-       run_cmd ${ns_a} ip nexthop add id 403 group 401/402
-       run_cmd ${ns_a} ip route add ${host4_b_addr} src ${host4_a_addr} nhid 
403
+       family=${1}
 
-       # Set up host B with multipath routes to host A host4_a_addr
-       run_cmd ${ns_b} ip addr add ${host4_b_addr} dev lo
-       run_cmd ${ns_b} ip nexthop add id 401 via ${prefix4}.${b_r1}.2 dev 
veth_B-R1
-       run_cmd ${ns_b} ip nexthop add id 402 via ${prefix4}.${b_r2}.2 dev 
veth_B-R2
-       run_cmd ${ns_b} ip nexthop add id 403 group 401/402
-       run_cmd ${ns_b} ip route add ${host4_a_addr} src ${host4_b_addr} nhid 
403
+       if [ ${family} -eq 4 ]; then
+               host_a_addr=${host4_a_addr}
+               host_b_addr=${host4_b_addr}
+               nh_a_r1=${prefix4}.${a_r1}.2
+               nh_a_r2=${prefix4}.${a_r2}.2
+               nh_b_r1=${prefix4}.${b_r1}.2
+               nh_b_r2=${prefix4}.${b_r2}.2
+       else
+               host_a_addr=${host6_a_addr}
+               host_b_addr=${host6_b_addr}
+               nh_a_r1=${prefix6}:${a_r1}::2
+               nh_a_r2=${prefix6}:${a_r2}::2
+               nh_b_r1=${prefix6}:${b_r1}::2
+               nh_b_r2=${prefix6}:${b_r2}::2
+       fi
+
+       # Set up host A with multipath routes to host B host_b_addr
+       run_cmd ${ns_a} ip addr add ${host_a_addr} dev lo
+       run_cmd ${ns_a} ip nexthop add id ${family}01 via ${nh_a_r1} dev 
veth_A-R1
+       run_cmd ${ns_a} ip nexthop add id ${family}02 via ${nh_a_r2} dev 
veth_A-R2
+       run_cmd ${ns_a} ip nexthop add id ${family}03 group 
${family}01/${family}02
+       run_cmd ${ns_a} ip route add ${host_b_addr} src ${host_a_addr} nhid 
${family}03
+
+       # Set up host B with multipath routes to host A host_a_addr
+       run_cmd ${ns_b} ip addr add ${host_b_addr} dev lo
+       run_cmd ${ns_b} ip nexthop add id ${family}01 via ${nh_b_r1} dev 
veth_B-R1
+       run_cmd ${ns_b} ip nexthop add id ${family}02 via ${nh_b_r2} dev 
veth_B-R2
+       run_cmd ${ns_b} ip nexthop add id ${family}03 group 
${family}01/${family}02
+       run_cmd ${ns_b} ip route add ${host_a_addr} src ${host_b_addr} nhid 
${family}03
 }
 
 setup_multipath_old() {
-       # Set up host A with multipath routes to host B host4_b_addr
-       run_cmd ${ns_a} ip addr add ${host4_a_addr} dev lo
-       run_cmd ${ns_a} ip route add ${host4_b_addr} \
-                       src ${host4_a_addr} \
-                       nexthop via ${prefix4}.${a_r1}.2 weight 1 \
-                       nexthop via ${prefix4}.${a_r2}.2 weight 1
+       family=${1}
 
-       # Set up host B with multipath routes to host A host4_a_addr
-       run_cmd ${ns_b} ip addr add ${host4_b_addr} dev lo
-       run_cmd ${ns_b} ip route add ${host4_a_addr} \
-                       src ${host4_b_addr} \
-                       nexthop via ${prefix4}.${b_r1}.2 weight 1 \
-                       nexthop via ${prefix4}.${b_r2}.2 weight 1
+       if [ ${family} -eq 4 ]; then
+               host_a_addr=${host4_a_addr}
+               host_b_addr=${host4_b_addr}
+               nh_a_r1=${prefix4}.${a_r1}.2
+               nh_a_r2=${prefix4}.${a_r2}.2
+               nh_b_r1=${prefix4}.${b_r1}.2
+               nh_b_r2=${prefix4}.${b_r2}.2
+       else
+               host_a_addr=${host6_a_addr}
+               host_b_addr=${host6_b_addr}
+               nh_a_r1=${prefix6}:${a_r1}::2
+               nh_a_r2=${prefix6}:${a_r2}::2
+               nh_b_r1=${prefix6}:${b_r1}::2
+               nh_b_r2=${prefix6}:${b_r2}::2
+       fi
+
+       # Set up host A with multipath routes to host B host_b_addr
+       run_cmd ${ns_a} ip addr add ${host_a_addr} dev lo
+       run_cmd ${ns_a} ip route add ${host_b_addr} \
+                       src ${host_a_addr} \
+                       nexthop via ${nh_a_r1} weight 1 \
+                       nexthop via ${nh_a_r2} weight 1
+
+       # Set up host B with multipath routes to host A host_a_addr
+       run_cmd ${ns_b} ip addr add ${host_b_addr} dev lo
+       run_cmd ${ns_b} ip route add ${host_a_addr} \
+                       src ${host_b_addr} \
+                       nexthop via ${nh_b_r1} weight 1 \
+                       nexthop via ${nh_b_r2} weight 1
 }
 
+
 setup_multipath() {
+       family="$1"
+
+       if [ ${family} -eq 4 ]; then
+               host_a_addr=${host4_a_addr}
+               host_b_addr=${host4_b_addr}
+               nh_r1_a=${prefix4}.${a_r1}.1
+               nh_r1_b=${prefix4}.${b_r1}.1
+               nh_r2_a=${prefix4}.${a_r2}.1
+               nh_r2_b=${prefix4}.${b_r2}.1
+       else
+               host_a_addr=${host6_a_addr}
+               host_b_addr=${host6_b_addr}
+               nh_r1_a=${prefix6}:${a_r1}::1
+               nh_r1_b=${prefix6}:${b_r1}::1
+               nh_r2_a=${prefix6}:${a_r2}::1
+               nh_r2_b=${prefix6}:${b_r2}::1
+       fi
+
        if [ "$USE_NH" = "yes" ]; then
-               setup_multipath_new
+               setup_multipath_new ${family}
        else
-               setup_multipath_old
+               setup_multipath_old ${family}
        fi
 
        # Set up routers with routes to dummies
-       run_cmd ${ns_r1} ip route add ${host4_a_addr} via ${prefix4}.${a_r1}.1
-       run_cmd ${ns_r2} ip route add ${host4_a_addr} via ${prefix4}.${a_r2}.1
-       run_cmd ${ns_r1} ip route add ${host4_b_addr} via ${prefix4}.${b_r1}.1
-       run_cmd ${ns_r2} ip route add ${host4_b_addr} via ${prefix4}.${b_r2}.1
+       run_cmd ${ns_r1} ip route add ${host_a_addr} via ${nh_r1_a}
+       run_cmd ${ns_r2} ip route add ${host_a_addr} via ${nh_r2_a}
+       run_cmd ${ns_r1} ip route add ${host_b_addr} via ${nh_r1_b}
+       run_cmd ${ns_r2} ip route add ${host_b_addr} via ${nh_r2_b}
+}
+
+setup_multipath4() {
+       setup_multipath 4
+}
+
+setup_multipath6() {
+       setup_multipath 6
 }
 
 setup() {
@@ -2377,8 +2447,18 @@ test_pmtu_ipv6_route_change() {
        test_pmtu_ipvX_route_change 6
 }
 
-test_pmtu_ipv4_mp_exceptions() {
-       setup namespaces routing multipath || return $ksft_skip
+test_pmtu_ipvX_mp_exceptions() {
+       family=${1}
+
+       if [ ${family} -eq 4 ]; then
+               ping=ping
+               dst="${host4_b_addr}"
+       else
+               ping=${ping6}
+               dst="${host6_b_addr}"
+       fi
+
+       setup namespaces routing multipath${family} || return $ksft_skip
 
        trace "${ns_a}"  veth_A-R1    "${ns_r1}" veth_R1-A \
              "${ns_r1}" veth_R1-B    "${ns_b}"  veth_B-R1 \
@@ -2395,18 +2475,24 @@ test_pmtu_ipv4_mp_exceptions() {
        mtu "${ns_r2}" veth_R2-A 2000
        mtu "${ns_r2}" veth_R2-B 1500
        mtu "${ns_b}"  veth_B-R2 1500
-
        # Ping and expect two nexthop exceptions for two routes
-       run_cmd ${ns_a} ping -q -M want -i 0.1 -c 1 -s 1800 "${host4_b_addr}"
+       run_cmd ${ns_a} ${ping} -q -M want -i 0.1 -c 1 -s 1800 "${dst}"
 
        # Check that exceptions have been created with the correct PMTU
-       pmtu_a_R1="$(route_get_dst_pmtu_from_exception "${ns_a}" 
"${host4_b_addr}" oif veth_A-R1)"
-       pmtu_a_R2="$(route_get_dst_pmtu_from_exception "${ns_a}" 
"${host4_b_addr}" oif veth_A-R2)"
-
+       pmtu_a_R1="$(route_get_dst_pmtu_from_exception "${ns_a}" "${dst}" oif 
veth_A-R1)"
+       pmtu_a_R2="$(route_get_dst_pmtu_from_exception "${ns_a}" "${dst}" oif 
veth_A-R2)"
        check_pmtu_value "1500" "${pmtu_a_R1}" "exceeding MTU (veth_A-R1)" || 
return 1
        check_pmtu_value "1500" "${pmtu_a_R2}" "exceeding MTU (veth_A-R2)" || 
return 1
 }
 
+test_pmtu_ipv4_mp_exceptions() {
+       test_pmtu_ipvX_mp_exceptions 4
+}
+
+test_pmtu_ipv6_mp_exceptions() {
+       test_pmtu_ipvX_mp_exceptions 6
+}
+
 usage() {
        echo
        echo "$0 [OPTIONS] [TEST]..."
-- 
2.56.0


Reply via email to