public inbox for passt-dev@passt.top
 help / color / mirror / code / Atom feed
* [PATCH] netlink: Don't require address to be global, just not link local
@ 2025-09-30  5:49 David Gibson
  2025-09-30 11:14 ` Stefano Brivio
  0 siblings, 1 reply; 3+ messages in thread
From: David Gibson @ 2025-09-30  5:49 UTC (permalink / raw)
  To: passt-dev, Stefano Brivio; +Cc: David Gibson, Xun Gu

nl_addr_get() will only pick up global IPv6 addresses (RT_SCOPE_UNIVERSE).
This is because link-local addresses aren't suitable.  However site-local
addresses (in the rare occassions they're used) would be fine for our
purposes.  In fact, anything wider than link scope is fine, so update the
check to reflect that.

Change the logic in the test scripts to match as well.

Reported-by: Xun Gu <xugu@redhat.com>
Link: https://bugs.passt.top/show_bug.cgi?id=122

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 netlink.c                     | 2 +-
 test/demo/podman              | 4 ++--
 test/migrate/basic            | 2 +-
 test/migrate/basic_fin        | 2 +-
 test/migrate/iperf3_bidir6    | 2 +-
 test/migrate/iperf3_in6       | 2 +-
 test/migrate/iperf3_many_out6 | 2 +-
 test/migrate/iperf3_out6      | 2 +-
 test/migrate/rampstream_in    | 2 +-
 test/migrate/rampstream_out   | 2 +-
 test/passt/dhcp               | 2 +-
 test/passt/ndp                | 2 +-
 test/passt_in_ns/dhcp         | 2 +-
 test/pasta/dhcp               | 2 +-
 test/pasta/ndp                | 2 +-
 test/perf/pasta_tcp           | 2 +-
 test/perf/pasta_udp           | 2 +-
 test/two_guests/basic         | 2 +-
 18 files changed, 19 insertions(+), 19 deletions(-)

diff --git a/netlink.c b/netlink.c
index c4367807..9fe70f2c 100644
--- a/netlink.c
+++ b/netlink.c
@@ -786,7 +786,7 @@ int nl_addr_get(int s, unsigned int ifi, sa_family_t af,
 
 				prefix_max = *prefix_len = ifa->ifa_prefixlen;
 			} else if (af == AF_INET6 && addr &&
-				   ifa->ifa_scope == RT_SCOPE_UNIVERSE &&
+				   ifa->ifa_scope < RT_SCOPE_LINK &&
 				   ifa->ifa_prefixlen > prefix_max) {
 				memcpy(addr, RTA_DATA(rta), RTA_PAYLOAD(rta));
 
diff --git a/test/demo/podman b/test/demo/podman
index edd403a1..393691ca 100644
--- a/test/demo/podman
+++ b/test/demo/podman
@@ -310,8 +310,8 @@ nl
 say	Everything is set now, let's start
 sleep	2
 hout	IFNAME ip -j link show | jq -rM '.[] | select(.link_type == "ether").ifname'
-hout	ADDR4 ip -j -4 addr show|jq -rM '.[] | select(.ifname == "__IFNAME__").addr_info[] | select(.scope == "global").local'
-hout	ADDR6 ip -j -6 addr show|jq -rM '.[] | select(.ifname == "__IFNAME__").addr_info[] | select(.scope == "global").local'
+hout	ADDR4 ip -j -4 addr show|jq -rM '.[] | select(.ifname == "__IFNAME__").addr_info[] | select(.scope != "host" and .scope != "link").local'
+hout	ADDR6 ip -j -6 addr show|jq -rM '.[] | select(.ifname == "__IFNAME__").addr_info[] | select(.scope != "host" and .scope != "link").local'
 hout	GW4 ip -j -4 route show|jq -rM '.[] | select(.dst == "default").gateway'
 hout	GW6 ip -j -6 route show|jq -rM '.[] | select(.dst == "default").gateway'
 
diff --git a/test/migrate/basic b/test/migrate/basic
index 3f11f7d8..c22fee80 100644
--- a/test/migrate/basic
+++ b/test/migrate/basic
@@ -39,7 +39,7 @@ guest1	/sbin/dhclient -6 __IFNAME1__
 # Wait for DAD to complete on the DHCP address
 guest1	while ip -j -6 addr show tentative | jq -e '.[].addr_info'; do sleep 0.1; done
 g1out	ADDR1_6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__IFNAME1__").addr_info[] | select(.prefixlen == 128).local] | .[0]'
-hout	HOST_ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope == "global" and .deprecated != true).local] | .[0]'
+hout	HOST_ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope != "host" and .scope != "link" and .deprecated != true).local] | .[0]'
 check	[ "__ADDR1_6__" = "__HOST_ADDR6__" ]
 
 test	TCP/IPv4: guest1/guest2 > host
diff --git a/test/migrate/basic_fin b/test/migrate/basic_fin
index aa61ec5a..c35c2690 100644
--- a/test/migrate/basic_fin
+++ b/test/migrate/basic_fin
@@ -39,7 +39,7 @@ guest1	/sbin/dhclient -6 __IFNAME1__
 # Wait for DAD to complete on the DHCP address
 guest1	while ip -j -6 addr show tentative | jq -e '.[].addr_info'; do sleep 0.1; done
 g1out	ADDR1_6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__IFNAME1__").addr_info[] | select(.prefixlen == 128).local] | .[0]'
-hout	HOST_ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope == "global" and .deprecated != true).local] | .[0]'
+hout	HOST_ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope != "host" and .scope != "link" and .deprecated != true).local] | .[0]'
 check	[ "__ADDR1_6__" = "__HOST_ADDR6__" ]
 
 test	TCP/IPv4: guest1, half-close, guest2 > host
diff --git a/test/migrate/iperf3_bidir6 b/test/migrate/iperf3_bidir6
index 4bfefb58..60b2a9b2 100644
--- a/test/migrate/iperf3_bidir6
+++ b/test/migrate/iperf3_bidir6
@@ -44,7 +44,7 @@ guest1	/sbin/dhclient -6 __IFNAME1__
 # Wait for DAD to complete on the DHCP address
 guest1	while ip -j -6 addr show tentative | jq -e '.[].addr_info'; do sleep 0.1; done
 g1out	ADDR1_6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__IFNAME1__").addr_info[] | select(.prefixlen == 128).local] | .[0]'
-hout	HOST_ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope == "global" and .deprecated != true).local] | .[0]'
+hout	HOST_ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope != "host" and .scope != "link" and .deprecated != true).local] | .[0]'
 check	[ "__ADDR1_6__" = "__HOST_ADDR6__" ]
 
 test	TCP/IPv6 host <-> guest flood, many flows, during migration
diff --git a/test/migrate/iperf3_in6 b/test/migrate/iperf3_in6
index 16cf504f..9b7f2c60 100644
--- a/test/migrate/iperf3_in6
+++ b/test/migrate/iperf3_in6
@@ -44,7 +44,7 @@ guest1	/sbin/dhclient -6 __IFNAME1__
 # Wait for DAD to complete on the DHCP address
 guest1	while ip -j -6 addr show tentative | jq -e '.[].addr_info'; do sleep 0.1; done
 g1out	ADDR1_6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__IFNAME1__").addr_info[] | select(.prefixlen == 128).local] | .[0]'
-hout	HOST_ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope == "global" and .deprecated != true).local] | .[0]'
+hout	HOST_ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope != "host" and .scope != "link" and .deprecated != true).local] | .[0]'
 check	[ "__ADDR1_6__" = "__HOST_ADDR6__" ]
 
 test	TCP/IPv6 host to guest throughput during migration
diff --git a/test/migrate/iperf3_many_out6 b/test/migrate/iperf3_many_out6
index 88133f26..9b3095f6 100644
--- a/test/migrate/iperf3_many_out6
+++ b/test/migrate/iperf3_many_out6
@@ -44,7 +44,7 @@ guest1	/sbin/dhclient -6 __IFNAME1__
 # Wait for DAD to complete on the DHCP address
 guest1	while ip -j -6 addr show tentative | jq -e '.[].addr_info'; do sleep 0.1; done
 g1out	ADDR1_6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__IFNAME1__").addr_info[] | select(.prefixlen == 128).local] | .[0]'
-hout	HOST_ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope == "global" and .deprecated != true).local] | .[0]'
+hout	HOST_ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope != "host" and .scope != "link" and .deprecated != true).local] | .[0]'
 check	[ "__ADDR1_6__" = "__HOST_ADDR6__" ]
 
 test	TCP/IPv6 guest to host flood, many flows, during migration
diff --git a/test/migrate/iperf3_out6 b/test/migrate/iperf3_out6
index 21fbfcd6..b94a70c2 100644
--- a/test/migrate/iperf3_out6
+++ b/test/migrate/iperf3_out6
@@ -44,7 +44,7 @@ guest1	/sbin/dhclient -6 __IFNAME1__
 # Wait for DAD to complete on the DHCP address
 guest1	while ip -j -6 addr show tentative | jq -e '.[].addr_info'; do sleep 0.1; done
 g1out	ADDR1_6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__IFNAME1__").addr_info[] | select(.prefixlen == 128).local] | .[0]'
-hout	HOST_ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope == "global" and .deprecated != true).local] | .[0]'
+hout	HOST_ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope != "host" and .scope != "link" and .deprecated != true).local] | .[0]'
 check	[ "__ADDR1_6__" = "__HOST_ADDR6__" ]
 
 test	TCP/IPv6 guest to host throughput during migration
diff --git a/test/migrate/rampstream_in b/test/migrate/rampstream_in
index df333ba5..3c7fd200 100644
--- a/test/migrate/rampstream_in
+++ b/test/migrate/rampstream_in
@@ -40,7 +40,7 @@ guest1	/sbin/dhclient -6 __IFNAME1__
 # Wait for DAD to complete on the DHCP address
 guest1	while ip -j -6 addr show tentative | jq -e '.[].addr_info'; do sleep 0.1; done
 g1out	ADDR1_6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__IFNAME1__").addr_info[] | select(.prefixlen == 128).local] | .[0]'
-hout	HOST_ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope == "global" and .deprecated != true).local] | .[0]'
+hout	HOST_ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope != "host" and .scope != "link" and .deprecated != true).local] | .[0]'
 check	[ "__ADDR1_6__" = "__HOST_ADDR6__" ]
 
 test	TCP/IPv4: sequence check, ramps, inbound
diff --git a/test/migrate/rampstream_out b/test/migrate/rampstream_out
index 8ed3229b..8cff6d9c 100644
--- a/test/migrate/rampstream_out
+++ b/test/migrate/rampstream_out
@@ -40,7 +40,7 @@ guest1	/sbin/dhclient -6 __IFNAME1__
 # Wait for DAD to complete on the DHCP address
 guest1	while ip -j -6 addr show tentative | jq -e '.[].addr_info'; do sleep 0.1; done
 g1out	ADDR1_6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__IFNAME1__").addr_info[] | select(.prefixlen == 128).local] | .[0]'
-hout	HOST_ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope == "global" and .deprecated != true).local] | .[0]'
+hout	HOST_ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope != "host" and .scope != "link" and .deprecated != true).local] | .[0]'
 check	[ "__ADDR1_6__" = "__HOST_ADDR6__" ]
 
 test	TCP/IPv4: sequence check, ramps, outbound
diff --git a/test/passt/dhcp b/test/passt/dhcp
index 145f1baa..dc6b880f 100644
--- a/test/passt/dhcp
+++ b/test/passt/dhcp
@@ -61,7 +61,7 @@ guest	/sbin/dhclient -6 __IFNAME__
 # Wait for DAD to complete
 guest	while ip -j -6 addr show tentative | jq -e '.[].addr_info'; do sleep 0.1; done
 gout	ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__IFNAME__").addr_info[] | select(.prefixlen == 128).local] | .[0]'
-hout	HOST_ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope == "global" and .deprecated != true).local] | .[0]'
+hout	HOST_ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope != "host" and .scope != "link" and .deprecated != true).local] | .[0]'
 check	[ "__ADDR6__" = "__HOST_ADDR6__" ]
 
 test	DHCPv6: route
diff --git a/test/passt/ndp b/test/passt/ndp
index 516cd6b8..df77cdcc 100644
--- a/test/passt/ndp
+++ b/test/passt/ndp
@@ -25,7 +25,7 @@ check	[ -n "__IFNAME__" ]
 test	SLAAC: prefix
 gout	ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__IFNAME__").addr_info[] | select(.protocol == "kernel_ra") | .local + "/" + (.prefixlen | tostring)] | .[0]'
 gout	PREFIX6 sipcalc __ADDR6__ | grep prefix | cut -d' ' -f4
-hout	HOST_ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope == "global" and .deprecated != true).local] | .[0]'
+hout	HOST_ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope != "host" and .scope != "link" and .deprecated != true).local] | .[0]'
 hout	HOST_PREFIX6 sipcalc __HOST_ADDR6__/64 | grep prefix | cut -d' ' -f4
 check	[ "__PREFIX6__" = "__HOST_PREFIX6__" ]
 
diff --git a/test/passt_in_ns/dhcp b/test/passt_in_ns/dhcp
index a38a6908..0ccb4800 100644
--- a/test/passt_in_ns/dhcp
+++ b/test/passt_in_ns/dhcp
@@ -55,7 +55,7 @@ guest	/sbin/dhclient -6 __IFNAME__
 # Wait for DAD to complete
 guest	while ip -j -6 addr show tentative | jq -e '.[].addr_info'; do sleep 0.1; done
 gout	ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__IFNAME__").addr_info[] | select(.prefixlen == 128).local] | .[0]'
-hout	HOST_ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope == "global" and .deprecated != true).local] | .[0]'
+hout	HOST_ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope != "host" and .scope != "link" and .deprecated != true).local] | .[0]'
 check	[ "__ADDR6__" = "__HOST_ADDR6__" ]
 
 test	DHCPv6: route
diff --git a/test/pasta/dhcp b/test/pasta/dhcp
index d4f3ad58..e1c66be6 100644
--- a/test/pasta/dhcp
+++ b/test/pasta/dhcp
@@ -39,7 +39,7 @@ ns	/sbin/dhclient -6 --no-pid __IFNAME__
 ns	while ip -j -6 addr show tentative | jq -e '.[].addr_info'; do sleep 0.1; done
 hout	HOST_IFNAME6 ip -j -6 route show|jq -rM '[.[] | select(.dst == "default").dev] | .[0]'
 nsout	ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__IFNAME__").addr_info[] | select(.prefixlen == 128).local] | .[0]'
-hout	HOST_ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope == "global" and .deprecated != true).local] | .[0]'
+hout	HOST_ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope != "host" and .scope != "link" and .deprecated != true).local] | .[0]'
 check	[ __ADDR6__ = __HOST_ADDR6__ ]
 
 test	DHCPv6: route
diff --git a/test/pasta/ndp b/test/pasta/ndp
index 952c1eab..e4828765 100644
--- a/test/pasta/ndp
+++ b/test/pasta/ndp
@@ -24,7 +24,7 @@ ns	while ! ip -j -6 addr show dev __IFNAME__ | jq -e '.[].addr_info.[] | select(
 test	SLAAC: prefix
 nsout	ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__IFNAME__").addr_info[] | select(.protocol == "kernel_ra") | .local + "/" + (.prefixlen | tostring)] | .[0]'
 nsout	PREFIX6 sipcalc __ADDR6__ | grep prefix | cut -d' ' -f4
-hout	HOST_ADDR6 ip -j -6 addr show|jq -rM ['.[] | select(.ifname == "__IFNAME__").addr_info[] | select(.scope == "global" and .deprecated != true).local] | .[0]'
+hout	HOST_ADDR6 ip -j -6 addr show|jq -rM ['.[] | select(.ifname == "__IFNAME__").addr_info[] | select(.scope != "host" and .scope != "link" and .deprecated != true).local] | .[0]'
 hout	HOST_PREFIX6 sipcalc __HOST_ADDR6__/64 | grep prefix | cut -d' ' -f4
 check	[ "__PREFIX6__" = "__HOST_PREFIX6__" ]
 
diff --git a/test/perf/pasta_tcp b/test/perf/pasta_tcp
index bc0de3c4..496d0fec 100644
--- a/test/perf/pasta_tcp
+++ b/test/perf/pasta_tcp
@@ -211,7 +211,7 @@ tr	TCP throughput over IPv6: host to ns
 iperf3s	ns 10002
 
 nsout	IFNAME ip -j link show | jq -rM '.[] | select(.link_type == "ether").ifname'
-nsout	ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__IFNAME__").addr_info[] | select(.scope == "global").local] | .[0]'
+nsout	ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__IFNAME__").addr_info[] | select(.scope != "host" and .scope != "link").local] | .[0]'
 bw	-
 bw	-
 bw	-
diff --git a/test/perf/pasta_udp b/test/perf/pasta_udp
index ab2f3e89..3a7054c9 100644
--- a/test/perf/pasta_udp
+++ b/test/perf/pasta_udp
@@ -196,7 +196,7 @@ tr	UDP throughput over IPv6: host to ns
 iperf3s	ns 10002
 
 nsout	IFNAME ip -j link show | jq -rM '.[] | select(.link_type == "ether").ifname'
-nsout	ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__IFNAME__").addr_info[] | select(.scope == "global").local] | .[0]'
+nsout	ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__IFNAME__").addr_info[] | select(.scope != "host" and .scope != "link").local] | .[0]'
 iperf3	BW host __ADDR6__ 10002 __TIME__ __OPTS__ -b 8G -l 1472
 bw	__BW__ 0.3 0.5
 iperf3	BW host __ADDR6__ 10002 __TIME__ __OPTS__ -b 12G -l 3972
diff --git a/test/two_guests/basic b/test/two_guests/basic
index e2338ffd..a9625f3e 100644
--- a/test/two_guests/basic
+++ b/test/two_guests/basic
@@ -45,7 +45,7 @@ guest1	while ip -j -6 addr show tentative | jq -e '.[].addr_info'; do sleep 0.1;
 guest2	while ip -j -6 addr show tentative | jq -e '.[].addr_info'; do sleep 0.1; done
 g1out	ADDR1_6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__IFNAME1__").addr_info[] | select(.prefixlen == 128).local] | .[0]'
 g2out	ADDR2_6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__IFNAME2__").addr_info[] | select(.prefixlen == 128).local] | .[0]'
-hout	HOST_ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope == "global" and .deprecated != true).local] | .[0]'
+hout	HOST_ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope != "host" and .scope != "link" and .deprecated != true).local] | .[0]'
 check	[ "__ADDR1_6__" = "__HOST_ADDR6__" ]
 check	[ "__ADDR2_6__" = "__HOST_ADDR6__" ]
 
-- 
2.51.0


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2025-10-01  0:28 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-09-30  5:49 [PATCH] netlink: Don't require address to be global, just not link local David Gibson
2025-09-30 11:14 ` Stefano Brivio
2025-10-01  0:26   ` David Gibson

Code repositories for project(s) associated with this public inbox

	https://passt.top/passt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for IMAP folder(s).