]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
selftests: seg6: Add test cases for End.X with link-local nexthop
authorIdo Schimmel <idosch@nvidia.com>
Thu, 12 Jun 2025 12:23:23 +0000 (15:23 +0300)
committerJakub Kicinski <kuba@kernel.org>
Mon, 16 Jun 2025 22:31:14 +0000 (15:31 -0700)
In the current test topology, all the routers are connected to each
other via dedicated links with addresses of the form fcf0:0:x:y::/64.

The test configures rt-3 with an adjacency with rt-4 and rt-4 with an
adjacency with rt-1:

 # ip -n rt_3-IgWSBJ -6 route show tab 90 fcbb:0:300::/48
 fcbb:0:300::/48  encap seg6local action End.X nh6 fcf0:0:3:4::4 flavors next-csid lblen 32 nflen 16 dev dum0 metric 1024 pref medium
 # ip -n rt_4-JdCunK -6 route show tab 90 fcbb:0:400::/48
 fcbb:0:400::/48  encap seg6local action End.X nh6 fcf0:0:1:4::1 flavors next-csid lblen 32 nflen 16 dev dum0 metric 1024 pref medium

The routes are used when pinging hs-2 from hs-1 and vice-versa.

Extend the test to also cover End.X behavior with an IPv6 link-local
nexthop address and an output interface. Configure every router
interface with an IPv6 link-local address of the form fe80::x:y/64 and
before re-running the ping tests, replace the previous End.X routes with
routes that use the new IPv6 link-local addresses:

 # ip -n rt_3-IgWSBJ -6 route show tab 90 fcbb:0:300::/48
 fcbb:0:300::/48  encap seg6local action End.X nh6 fe80::4:3 oif veth-rt-3-4 flavors next-csid lblen 32 nflen 16 dev dum0 metric 1024 pref medium
 # ip -n rt_4-JdCunK -6 route show tab 90 fcbb:0:400::/48
 fcbb:0:400::/48  encap seg6local action End.X nh6 fe80::1:4 oif veth-rt-4-1 flavors next-csid lblen 32 nflen 16 dev dum0 metric 1024 pref medium

The new test cases fail without the previous patch ("seg6: Allow End.X
behavior to accept an oif"):

 # ./srv6_end_x_next_csid_l3vpn_test.sh
 [...]
 ################################################################################
 TEST SECTION: SRv6 VPN connectivity test hosts (h1 <-> h2, IPv6), link-local
 ################################################################################

     TEST: IPv6 Hosts connectivity: hs-1 -> hs-2                         [FAIL]

     TEST: IPv6 Hosts connectivity: hs-2 -> hs-1                         [FAIL]

 ################################################################################
 TEST SECTION: SRv6 VPN connectivity test hosts (h1 <-> h2, IPv4), link-local
 ################################################################################

     TEST: IPv4 Hosts connectivity: hs-1 -> hs-2                         [FAIL]

     TEST: IPv4 Hosts connectivity: hs-2 -> hs-1                         [FAIL]

 Tests passed:  40
 Tests failed:   4

And pass with it:

 # ./srv6_end_x_next_csid_l3vpn_test.sh
 [...]
 ################################################################################
 TEST SECTION: SRv6 VPN connectivity test hosts (h1 <-> h2, IPv6), link-local
 ################################################################################

     TEST: IPv6 Hosts connectivity: hs-1 -> hs-2                         [ OK ]

     TEST: IPv6 Hosts connectivity: hs-2 -> hs-1                         [ OK ]

 ################################################################################
 TEST SECTION: SRv6 VPN connectivity test hosts (h1 <-> h2, IPv4), link-local
 ################################################################################

     TEST: IPv4 Hosts connectivity: hs-1 -> hs-2                         [ OK ]

     TEST: IPv4 Hosts connectivity: hs-2 -> hs-1                         [ OK ]

 Tests passed:  44
 Tests failed:   0

Without the previous patch, rt-3 and rt-4 resolve the wrong routes for
the link-local nexthops, with the output interface being the input
interface:

 # perf script
 [...]
 ping    1067 [001]    37.554486: fib6:fib6_table_lookup: table 254 oif 0 iif 11 proto 41 cafe::254/0 -> fe80::4:3/0 flowlabel 0xb7973 tos 0 scope 0 flags 2 ==> dev veth-rt-3-1 gw :: err 0
 [...]
 ping    1069 [002]    41.573360: fib6:fib6_table_lookup: table 254 oif 0 iif 12 proto 41 cafe::254/0 -> fe80::1:4/0 flowlabel 0xb7973 tos 0 scope 0 flags 2 ==> dev veth-rt-4-2 gw :: err 0

But the correct routes are resolved with the patch:

 # perf script
 [...]
 ping    1066 [006]    30.672355: fib6:fib6_table_lookup: table 254 oif 13 iif 1 proto 41 cafe::254/0 -> fe80::4:3/0 flowlabel 0x85941 tos 0 scope 0 flags 6 ==> dev veth-rt-3-4 gw :: err 0
 [...]
 ping    1066 [006]    30.672411: fib6:fib6_table_lookup: table 254 oif 11 iif 1 proto 41 cafe::254/0 -> fe80::1:4/0 flowlabel 0x91de0 tos 0 scope 0 flags 6 ==> dev veth-rt-4-1 gw :: err 0

Reviewed-by: Petr Machata <petrm@nvidia.com>
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: Andrea Mayer <andrea.mayer@uniroma2.it>
Link: https://patch.msgid.link/20250612122323.584113-5-idosch@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
tools/testing/selftests/net/srv6_end_x_next_csid_l3vpn_test.sh

index 4b86040c58c61404683acbae49abca8d546ea2bc..bedf0ce885c27275cb215e3bd4140bfceebced19 100755 (executable)
@@ -72,6 +72,9 @@
 # Every fcf0:0:x:y::/64 network interconnects the SRv6 routers rt-x with rt-y in
 # the selftest network.
 #
+# In addition, every router interface connecting rt-x to rt-y is assigned an
+# IPv6 link-local address fe80::x:y/64.
+#
 # Local SID/C-SID table
 # =====================
 #
@@ -521,6 +524,9 @@ setup_rt_networking()
                ip -netns "${nsname}" addr \
                        add "${net_prefix}::${rt}/64" dev "${devname}" nodad
 
+               ip -netns "${nsname}" addr \
+                       add "fe80::${rt}:${neigh}/64" dev "${devname}" nodad
+
                ip -netns "${nsname}" link set "${devname}" up
        done
 
@@ -609,6 +615,27 @@ set_end_x_nextcsid()
                nflen "${LCNODEFUNC_BLEN}" dev "${DUMMY_DEVNAME}"
 }
 
+set_end_x_ll_nextcsid()
+{
+       local rt="$1"
+       local adj="$2"
+
+       eval nsname=\${$(get_rtname "${rt}")}
+       lcnode_func_prefix="$(build_lcnode_func_prefix "${rt}")"
+       nh6_ll_addr="fe80::${adj}:${rt}"
+       oifname="veth-rt-${rt}-${adj}"
+
+       # enabled NEXT-C-SID SRv6 End.X behavior via an IPv6 link-local nexthop
+       # address (note that "dev" is the dummy dum0 device chosen for the sake
+       # of simplicity).
+       ip -netns "${nsname}" -6 route \
+               replace "${lcnode_func_prefix}" \
+               table "${LOCALSID_TABLE_ID}" \
+               encap seg6local action End.X nh6 "${nh6_ll_addr}" \
+               oif "${oifname}" flavors next-csid lblen "${LCBLOCK_BLEN}" \
+               nflen "${LCNODEFUNC_BLEN}" dev "${DUMMY_DEVNAME}"
+}
+
 set_underlay_sids_reachability()
 {
        local rt="$1"
@@ -1016,6 +1043,27 @@ host_vpn_tests()
 
        check_and_log_hs_ipv4_connectivity 1 2
        check_and_log_hs_ipv4_connectivity 2 1
+
+       # Setup the adjacencies in the SRv6 aware routers using IPv6 link-local
+       # addresses.
+       # - rt-3 SRv6 End.X adjacency with rt-4
+       # - rt-4 SRv6 End.X adjacency with rt-1
+       set_end_x_ll_nextcsid 3 4
+       set_end_x_ll_nextcsid 4 1
+
+       log_section "SRv6 VPN connectivity test hosts (h1 <-> h2, IPv6), link-local"
+
+       check_and_log_hs_ipv6_connectivity 1 2
+       check_and_log_hs_ipv6_connectivity 2 1
+
+       log_section "SRv6 VPN connectivity test hosts (h1 <-> h2, IPv4), link-local"
+
+       check_and_log_hs_ipv4_connectivity 1 2
+       check_and_log_hs_ipv4_connectivity 2 1
+
+       # Restore the previous adjacencies.
+       set_end_x_nextcsid 3 4
+       set_end_x_nextcsid 4 1
 }
 
 __nextcsid_end_x_behavior_test()