From 3ef8acd8c351e90d12fda352668b0b8a2215dcf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20Papp?= Date: Fri, 14 Aug 2026 23:51:03 +0200 Subject: [PATCH] [client] Probe the IPv6 nexthop through raw netlink addRoute swallows EAFNOSUPPORT and EOPNOTSUPP via isOpErr, so a nil return did not prove the probe route was installed. Call netlink directly so an unsupported operation skips the test instead of passing as usable. --- .../routemanager/systemops/v6route_linux_test.go | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/client/internal/routemanager/systemops/v6route_linux_test.go b/client/internal/routemanager/systemops/v6route_linux_test.go index 9e53edc73..d8c0012d1 100644 --- a/client/internal/routemanager/systemops/v6route_linux_test.go +++ b/client/internal/routemanager/systemops/v6route_linux_test.go @@ -55,11 +55,18 @@ func requireUsableIPv6Nexthop(t *testing.T) { t.Skipf("resolve IPv6 default nexthop: %v", err) } - probe := netip.MustParsePrefix("100::64/128") - switch err := addRoute(probe, nexthop, syscall.RT_TABLE_MAIN); { + probe := &netlink.Route{ + Scope: netlink.SCOPE_UNIVERSE, + Table: syscall.RT_TABLE_MAIN, + Family: netlink.FAMILY_V6, + Dst: &net.IPNet{IP: net.ParseIP("100::64"), Mask: net.CIDRMask(128, 128)}, + } + require.NoError(t, addNextHop(nexthop, probe), "build IPv6 probe route") + + switch err := netlink.RouteAdd(probe); { case err == nil: - if err := removeRoute(probe, nexthop, syscall.RT_TABLE_MAIN); err != nil { - t.Logf("remove IPv6 probe route: %v", err) + if err := netlink.RouteDel(probe); err != nil && !errors.Is(err, syscall.ESRCH) { + t.Logf("delete IPv6 probe route: %v", err) } case errors.Is(err, syscall.EEXIST): default: