From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by passt.top (Postfix) with ESMTP id 463195A026D for ; Mon, 11 Dec 2023 10:01:11 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1702285270; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=S5L0Smy4q7YDqTmnXISkiu/KAGemSa61qoEUkSB4CgA=; b=PvZuRWxgVFoFjImDr52VY3NglQJ/wQAIgLCph8NGjaRb4C5hndQbiajMPzRG1uN08gF7CM GaXCpXs6ks0AgrijEAlLve9iyVOchwp9rgEn0RppAJCS4syk/LAUIiw9YzjFVJUJ1/UGn9 B1zON9oE9LRnu4fbRSCxoscK9xY4XXg= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-126-bs9AYCHfP1C6KalX9MEySQ-1; Mon, 11 Dec 2023 04:01:06 -0500 X-MC-Unique: bs9AYCHfP1C6KalX9MEySQ-1 Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.rdu2.redhat.com [10.11.54.9]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 5B56387DC01; Mon, 11 Dec 2023 09:01:06 +0000 (UTC) Received: from elisabeth (unknown [10.39.208.32]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 602E6492BC8; Mon, 11 Dec 2023 09:01:05 +0000 (UTC) Date: Mon, 11 Dec 2023 10:00:58 +0100 From: Stefano Brivio To: David Gibson Subject: Re: [PATCH] test: Select first reported IPv6 address for guest/host comparison Message-ID: <20231211100058.45a546b2@elisabeth> In-Reply-To: References: <20231208174932.3390897-1-sbrivio@redhat.com> Organization: Red Hat MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.9 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Message-ID-Hash: VT2XKRUIGT7UEFVMEREYL4CMCKZ74MN2 X-Message-ID-Hash: VT2XKRUIGT7UEFVMEREYL4CMCKZ74MN2 X-MailFrom: sbrivio@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: passt-dev@passt.top, Jon Maloy X-Mailman-Version: 3.3.8 Precedence: list List-Id: Development discussion and patches for passt Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: On Mon, 11 Dec 2023 13:05:20 +1100 David Gibson wrote: > On Fri, Dec 08, 2023 at 06:49:32PM +0100, Stefano Brivio wrote: > > If we run passt nested (a guest connected via passt to a guest > > connected via passt to the host), the first guest (L1) typically has > > two IPv6 addresses: one formed from the prefix assigned via SLAAC, > > and another one assigned via DHCPv6 (to match the address on the > > host). > > Hmm... it can't be just that there are multible IPv6 addresses here > that's the problem. I usually have multiple IPv6 unicast addresses on > my laptop (one for the wifi, one for wired) and I already got that > working. > > Possibly it's that there are multiple addresses on the same interface? Yes, the guest has a single interface and multiple addresses for it, I'll change the commit message. > But see below.. > > > When we select addresses for comparison, in this case, we have > > multiple global unicast addresses. Selecting the first reported one > > on both host and guest is not entirely correct (in theory, the order > > might differ), but works reasonably well. > > That approach seems good, in principle > > > Use the trick from 5beef085978e ("test: Only select a single > > interface or gateway in tests") to ask jq(1) for the first address > > returned by the query. > > But that patch was selecting gateways, not local addresses, so I don't > think the same syntax makes sense. > > > > > Signed-off-by: Stefano Brivio > > --- > > test/passt/dhcp | 8 ++++---- > > test/passt/ndp | 4 ++-- > > test/pasta/dhcp | 8 ++++---- > > test/pasta/ndp | 4 ++-- > > test/two_guests/basic | 6 +++--- > > 5 files changed, 15 insertions(+), 15 deletions(-) > > > > diff --git a/test/passt/dhcp b/test/passt/dhcp > > index 7272755..b428064 100644 > > --- a/test/passt/dhcp > > +++ b/test/passt/dhcp > > @@ -22,8 +22,8 @@ check [ -n "__IFNAME__" ] > > > > test DHCP: address > > guest /sbin/dhclient -4 __IFNAME__ > > -gout ADDR ip -j -4 addr show|jq -rM '.[] | select(.ifname == "__IFNAME__").addr_info[0].local' > > -hout HOST_ADDR ip -j -4 addr show|jq -rM '.[] | select(.ifname == "__HOST_IFNAME__").addr_info[0].local' > > +gout ADDR ip -j -4 addr show|jq -rM '[.[] | select(.ifname == "__IFNAME__").addr_info[0].local] | .[0]' > > +hout HOST_ADDR ip -j -4 addr show|jq -rM '[.[] | select(.ifname == "__HOST_IFNAME__").addr_info[0].local] | .[0]' > > I'm confused by this. The 'addr_info[0]' should already be selecting > the first address from each interface, so the outer '.[0]' would only > be doing something if multiple interfaces are selected, and I'm not > quite sure why that would happen. > > In fact, I suspect this one was right all along... Right, this doesn't make sense, I just went too far with the copy and paste. Same as for the pasta/dhcp change below. There are actually no issues with IPv4. I'll drop those. > > check [ "__ADDR__" = "__HOST_ADDR__" ] > > > > test DHCP: route > > @@ -49,8 +49,8 @@ check [ "__SEARCH__" = "__HOST_SEARCH__" ] > > > > test DHCPv6: address > > guest /sbin/dhclient -6 __IFNAME__ > > -gout ADDR6 ip -j -6 addr show|jq -rM '.[] | select(.ifname == "__IFNAME__").addr_info[] | select(.prefixlen == 128).local' > > -hout HOST_ADDR6 ip -j -6 addr show|jq -rM '.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope == "global").local' > > +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").local] > > | .[0]' > > ... but this one isn't, because it is .addr_info[]. Previously the > second 'select' has picked out only one, but not in this situation. > So here the change makes sense to me. Here we want to use .addr_info[] because we want to filter further on prefixlen or scope. But once we've done that, if we have two addresses, we have to pick one. > > check [ "__ADDR6__" = "__HOST_ADDR6__" ] > > > > test DHCPv6: route > > diff --git a/test/passt/ndp b/test/passt/ndp > > index 6de4081..7b2dbfe 100644 > > --- a/test/passt/ndp > > +++ b/test/passt/ndp > > @@ -21,9 +21,9 @@ hout HOST_IFNAME6 ip -j -6 route show|jq -rM '[.[] | select(.dst == "default").d > > check [ -n "__IFNAME__" ] > > > > test SLAAC: prefix > > -gout ADDR6 ip -j -6 addr show|jq -rM '.[] | select(.ifname == "__IFNAME__").addr_info[] | select(.scope == "global" and .prefixlen == 64).local' > > +gout ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__IFNAME__").addr_info[] | select(.scope == "global" and .prefixlen == 64).local] | .[0]' > > gout PREFIX6 sipcalc __ADDR6__/64 | grep prefix | cut -d' ' -f4 > > -hout HOST_ADDR6 ip -j -6 addr show|jq -rM '.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope == "global").local' > > +hout HOST_ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope == "global").local] | .[0]' > > hout HOST_PREFIX6 sipcalc __HOST_ADDR6__/64 | grep prefix | cut -d' ' -f4 > > check [ "__PREFIX6__" = "__HOST_PREFIX6__" ] > > > > diff --git a/test/pasta/dhcp b/test/pasta/dhcp > > index 309001b..b4f6f60 100644 > > --- a/test/pasta/dhcp > > +++ b/test/pasta/dhcp > > @@ -20,8 +20,8 @@ check [ -n "__IFNAME__" ] > > > > test DHCP: address > > ns /sbin/dhclient -4 --no-pid __IFNAME__ > > -nsout ADDR ip -j -4 addr show|jq -rM '.[] | select(.ifname == "__IFNAME__").addr_info[0].local' > > -hout HOST_ADDR ip -j -4 addr show|jq -rM '.[] | select(.ifname == "__IFNAME__").addr_info[0].local' > > +nsout ADDR ip -j -4 addr show|jq -rM '[.[] | select(.ifname == "__IFNAME__").addr_info[0].local] | .[0]' > > +hout HOST_ADDR ip -j -4 addr show|jq -rM '[.[] | select(.ifname == "__IFNAME__").addr_info[0].local] | .[0]' > > check [ __ADDR__ = __HOST_ADDR__ ] > > > > test DHCP: route > > @@ -36,8 +36,8 @@ check [ __MTU__ = 65520 ] > > test DHCPv6: address > > ns /sbin/dhclient -6 --no-pid __IFNAME__ > > 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' > > -hout HOST_ADDR6 ip -j -6 addr show|jq -rM '.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope == "global").local' > > +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").local] | .[0]' > > check [ __ADDR6__ = __HOST_ADDR6__ ] > > > > test DHCPv6: route > > diff --git a/test/pasta/ndp b/test/pasta/ndp > > index bb33110..2a8afe6 100644 > > --- a/test/pasta/ndp > > +++ b/test/pasta/ndp > > @@ -21,9 +21,9 @@ ns ip link set dev __IFNAME__ up > > sleep 2 > > > > test SLAAC: prefix > > -nsout ADDR6 ip -j -6 addr show|jq -rM '.[] | select(.ifname == "__IFNAME__").addr_info[] | select(.scope == "global" and .prefixlen == 64).local' > > +nsout ADDR6 ip -j -6 addr show|jq -rM '[.[] | select(.ifname == "__IFNAME__").addr_info[] | select(.scope == "global" and .prefixlen == 64).local] | .[0]' > > nsout PREFIX6 sipcalc __ADDR6__/64 | grep prefix | cut -d' ' -f4 > > -hout HOST_ADDR6 ip -j -6 addr show|jq -rM '.[] | select(.ifname == "__IFNAME__").addr_info[] | select(.scope == "global").local' > > +hout HOST_ADDR6 ip -j -6 addr show|jq -rM ['.[] | select(.ifname == "__IFNAME__").addr_info[] | select(.scope == "global").local] | .[0]' > > hout HOST_PREFIX6 sipcalc __HOST_ADDR6__/64 | grep prefix | cut -d' ' -f4 > > check [ "__PREFIX6__" = "__HOST_PREFIX6__" ] > > > > diff --git a/test/two_guests/basic b/test/two_guests/basic > > index 09fbd3e..fa0608b 100644 > > --- a/test/two_guests/basic > > +++ b/test/two_guests/basic > > @@ -39,9 +39,9 @@ test DHCPv6: addresses > > sleep 2 > > guest1 /sbin/dhclient -6 __IFNAME1__ > > guest2 /sbin/dhclient -6 __IFNAME2__ > > -g1out ADDR1_6 ip -j -6 addr show|jq -rM '.[] | select(.ifname == "__IFNAME1__").addr_info[] | select(.prefixlen == 128).local' > > -g2out ADDR2_6 ip -j -6 addr show|jq -rM '.[] | select(.ifname == "__IFNAME2__").addr_info[] | select(.prefixlen == 128).local' > > -hout HOST_ADDR6 ip -j -6 addr show|jq -rM '.[] | select(.ifname == "__HOST_IFNAME6__").addr_info[] | select(.scope == "global").local' > > +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").local] | .[0]' > > check [ "__ADDR1_6__" = "__HOST_ADDR6__" ] > > check [ "__ADDR2_6__" = "__HOST_ADDR6__" ] -- Stefano