From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: passt.top; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: passt.top; dkim=pass (2048-bit key; secure) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.a=rsa-sha256 header.s=202508 header.b=pVEs7k7d; dkim-atps=neutral Received: from mail.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3]) by passt.top (Postfix) with ESMTPS id 9DABC5A027B for ; Wed, 13 Aug 2025 05:27:09 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=202508; t=1755055626; bh=EtwDU3TUJeaBesoIEr1Q5eYj6JfGvrO89eLWdshqKnw=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=pVEs7k7dyvpie81hCwMldwlg2yAVmM+DBpjvTpmkl3+bFLdrFolk6aMxUN+VWgDAi kCq6n7nXR7dDCQQqBfM4R5CfopGE6UXVPkGwRDErBOcQTUyraSf2UQ+18wUIB+pHe8 07nEK3v8y5OjeRAM6Ze4UDCHtfLe6QCGkkaxcree9fn+TGxddAuQ3tmMilbX9vqhHz kuV3e2yoqBHf36sx5WTyGPx596C6AQ2YwwzATH02femDRs3Y0OoVNXUepplcQ8pRDD Wc9Gq79NP+r3BTPPck143u8NM7VjSiFHu7PZsUmJ7zqZx40s+ea2qH3otYzylMCUOA wX2Pco6o7dbuQ== Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4c1v1k5F4gz4xQV; Wed, 13 Aug 2025 13:27:06 +1000 (AEST) Date: Wed, 13 Aug 2025 13:20:21 +1000 From: David Gibson To: Laurent Vivier Subject: Re: [PATCH v9 18/30] ip: Use iov_tail in ipv6_l4hdr() Message-ID: References: <20250808140142.3404325-1-lvivier@redhat.com> <20250808140142.3404325-19-lvivier@redhat.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="iDemD/bhr35x8zXy" Content-Disposition: inline In-Reply-To: <20250808140142.3404325-19-lvivier@redhat.com> Message-ID-Hash: U6LZF2WA4YERNZHK6O3UTWFLUXVGGBKX X-Message-ID-Hash: U6LZF2WA4YERNZHK6O3UTWFLUXVGGBKX X-MailFrom: dgibson@gandalf.ozlabs.org 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 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: --iDemD/bhr35x8zXy Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Fri, Aug 08, 2025 at 04:01:30PM +0200, Laurent Vivier wrote: > Use packet_data() and extract headers using IOV_REMOVE_HEADER() > and IOV_PEEK_HEADER() rather than packet_get(). >=20 > Signed-off-by: Laurent Vivier Reviewed-by: David Gibson > --- > ip.c | 33 +++++++++++++++------------------ > ip.h | 3 +-- > packet.c | 1 + > tap.c | 4 +++- > 4 files changed, 20 insertions(+), 21 deletions(-) >=20 > diff --git a/ip.c b/ip.c > index 2cc7f6548aff..a886cb3dbba6 100644 > --- a/ip.c > +++ b/ip.c > @@ -23,50 +23,47 @@ > =20 > /** > * ipv6_l4hdr() - Find pointer to L4 header in IPv6 packet and extract p= rotocol > - * @p: Packet pool, packet number @idx has IPv6 header at @offset > - * @idx: Index of packet in pool > - * @offset: Pre-calculated IPv6 header offset > + * @data: IPv6 packet > * @proto: Filled with L4 protocol number > * @dlen: Data length (payload excluding header extensions), set on retu= rn > * > - * Return: pointer to L4 header, NULL if not found > + * Return: true if the L4 header is found and @data, @proto, @dlen are s= et, > + * false on error. Outputs are indeterminate on failure. > */ > -char *ipv6_l4hdr(const struct pool *p, int idx, size_t offset, uint8_t *= proto, > - size_t *dlen) > +bool ipv6_l4hdr(struct iov_tail *data, uint8_t *proto, size_t *dlen) > { > + struct ipv6_opt_hdr o_storage; > const struct ipv6_opt_hdr *o; > + struct ipv6hdr ip6h_storage; > const struct ipv6hdr *ip6h; > - char *base; > int hdrlen; > uint8_t nh; > =20 > - base =3D packet_get(p, idx, 0, 0, NULL); > - ip6h =3D packet_get(p, idx, offset, sizeof(*ip6h), dlen); > + ip6h =3D IOV_REMOVE_HEADER(data, ip6h_storage); > if (!ip6h) > - return NULL; > - > - offset +=3D sizeof(*ip6h); > + return false; > =20 > nh =3D ip6h->nexthdr; > if (!IPV6_NH_OPT(nh)) > goto found; > =20 > - while ((o =3D packet_get_try(p, idx, offset, sizeof(*o), dlen))) { > + while ((o =3D IOV_PEEK_HEADER(data, o_storage))) { > nh =3D o->nexthdr; > hdrlen =3D (o->hdrlen + 1) * 8; > =20 > if (IPV6_NH_OPT(nh)) > - offset +=3D hdrlen; > + iov_tail_drop(data, hdrlen); > else > goto found; > } > =20 > - return NULL; > + return false; > =20 > found: > - if (nh =3D=3D 59) > - return NULL; > + if (nh =3D=3D IPPROTO_NONE) > + return false; > =20 > + *dlen =3D iov_tail_size(data); > *proto =3D nh; > - return base + offset; > + return true; > } > diff --git a/ip.h b/ip.h > index 24509d9c11cd..5830b92302e2 100644 > --- a/ip.h > +++ b/ip.h > @@ -115,8 +115,7 @@ static inline uint32_t ip6_get_flow_lbl(const struct = ipv6hdr *ip6h) > ip6h->flow_lbl[2]; > } > =20 > -char *ipv6_l4hdr(const struct pool *p, int idx, size_t offset, uint8_t *= proto, > - size_t *dlen); > +bool ipv6_l4hdr(struct iov_tail *data, uint8_t *proto, size_t *dlen); > =20 > /* IPv6 link-local all-nodes multicast address, ff02::1 */ > static const struct in6_addr in6addr_ll_all_nodes =3D { > diff --git a/packet.c b/packet.c > index 34b1722b9a03..014b353cdf8b 100644 > --- a/packet.c > +++ b/packet.c > @@ -133,6 +133,7 @@ void packet_add_do(struct pool *p, struct iov_tail *d= ata, > * > * Return: pointer to start of data range, NULL on invalid range or desc= riptor > */ > +/* cppcheck-suppress [staticFunction] */ > void *packet_get_try_do(const struct pool *p, size_t idx, size_t offset, > size_t len, size_t *left, const char *func, int line) > { > diff --git a/tap.c b/tap.c > index 8d2b118152f1..d7852fad6069 100644 > --- a/tap.c > +++ b/tap.c > @@ -911,8 +911,10 @@ resume: > if (plen !=3D check) > continue; > =20 > - if (!(l4h =3D ipv6_l4hdr(in, i, sizeof(*eh), &proto, &l4len))) > + data =3D IOV_TAIL_FROM_BUF(ip6h, sizeof(*ip6h) + check, 0); > + if (!ipv6_l4hdr(&data, &proto, &l4len)) > continue; > + l4h =3D (char *)data.iov[0].iov_base + data.off; > =20 > if (IN6_IS_ADDR_LOOPBACK(saddr) || IN6_IS_ADDR_LOOPBACK(daddr)) { > char sstr[INET6_ADDRSTRLEN], dstr[INET6_ADDRSTRLEN]; --=20 David Gibson (he or they) | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you, not the other way | around. http://www.ozlabs.org/~dgibson --iDemD/bhr35x8zXy Content-Type: application/pgp-signature; name=signature.asc -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEEO+dNsU4E3yXUXRK2zQJF27ox2GcFAmicBHQACgkQzQJF27ox 2GePoQ//XCAl/Wf3oR4p/JbFK9XdCzDaQlDQyWJUWjtd2VvPnA+V2U/wbBBQGhW1 mhyH/0wGFVUZi7bww9kKf+mxl3NS/yRwgyctfG7tlrwD9NbeF1AvhmpAJSiDDZ86 vZGF6Wo4365R/pGbsvguCErpUGqaDl/BMg033bCyw6g/v6d38a2PcS0HvTGwDbhY G93hNsDT9/Vzuei04mtDfxVVAy4c0oXN+iMFPxGwYnb1EcF6RYHzh9VHAiQooPj4 O3lXEtCvUnCoZpreBed25Qkc/QRmLjMMDvYFmORZih7TCdhiySNhJhAoz8shbZ4Z nKV5bMl0WLx++NKNj5cRb/2VowO8Bzw4Dw7QztLgyKCJdA04PwnGUBWFEHQmBViy 01IrdunXItYHUjjbYnRByCIH4WCqOemN5Qbin1JYHKQy9mBQpEJyQwbe4ISahou6 YED33LrbQQFp7636C/S+l7X5WH0nDquJPF8xI3sYTch2HUyGQXI4Goog/MTMjoec SY6alXuuX5lMhFc3ucuQvlyVSWqB/3hS9FCTXrfEKnt+rCH0Uh/oz602mTNGOWue vXBNt6VsBPTTIOsw9cyUdMlNV9UrPc/he4xkzbMGI744gJ6iX9PGVsPQTcFi7N1K jpdVW+hzZOWOWNWrDDQ0iGmkMyTIgkZjKigBlgxkjHOPlSW/FT8= =MYkS -----END PGP SIGNATURE----- --iDemD/bhr35x8zXy--