From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from gandalf.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3]) by passt.top (Postfix) with ESMTPS id BAEF45A0277 for ; Mon, 4 Mar 2024 01:55:02 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=202312; t=1709513696; bh=E5xpE3+kYcoVU2DlAM76mzBhT1/qW0ytSkIHEwms8LE=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=rzKT3UkMcxxnoq6uvgLP98R5Kriydt7y4Xi/JBkikg0HDyWY9AMllWPiZq0uvZ+En wC0fQQH4GQZ+zvoqDUXQmdwwQt4fBdqHGWZLfPp8lxEbnvXH6REFNGal84slsOqfxO GwfFQPqTWg3yacz2R0SGxHVQSwoUr3GFgWJsUz2IW8QWzu7COfKezUM9BHUcRPdJei knb3m4CwsW3TSHorCQA4NHIaX//r/ZVZPMuGOPVAklN583SNBmZK0ax9ys6RCvsSEp 39GWvzcOY2JUgZK3EF9+T+rLFWA9ub86c+FjQ1Hzj5tbIt7YzEDKE58m63agV1a4Gk KGpKLotJHbRmA== Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4Tp0bM741kz4wqN; Mon, 4 Mar 2024 11:54:55 +1100 (AEDT) Date: Mon, 4 Mar 2024 11:54:50 +1100 From: David Gibson To: Laurent Vivier Subject: Re: [PATCH v5 9/9] tcp: Introduce ipv4_fill_headers()/ipv6_fill_headers() Message-ID: References: <20240303135114.1023026-1-lvivier@redhat.com> <20240303135114.1023026-10-lvivier@redhat.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="YJyNIZTFItPhzQ24" Content-Disposition: inline In-Reply-To: <20240303135114.1023026-10-lvivier@redhat.com> Message-ID-Hash: EOEXOF3RSY6RIUJHSY4Y5BAEP2KQIPMQ X-Message-ID-Hash: EOEXOF3RSY6RIUJHSY4Y5BAEP2KQIPMQ 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: --YJyNIZTFItPhzQ24 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Sun, Mar 03, 2024 at 02:51:14PM +0100, Laurent Vivier wrote: > Replace the macro SET_TCP_HEADER_COMMON_V4_V6() by a new function > tcp_fill_header(). >=20 > Move IPv4 and IPv6 code from tcp_l2_buf_fill_headers() to > tcp_fill_ipv4_header() and tcp_fill_ipv6_header() >=20 > Signed-off-by: Laurent Vivier Reviewed-by: David Gibson > --- >=20 > Notes: > v5: > - update function comments > - rename tcp_fill_ipv[46]_header() to tcp_fill_headers [46]() > - add TCP header pointer in the parameters of the functions > =20 > v4: > - group all the ip6g initialisations together and > remove flow_lbl preset to 0 > - add ASSERT(a4) > =20 > v3: > - add to sub-series part 1 > =20 > v2: > - extract header filling functions from > "tcp: extract buffer management from tcp_send_flag()" > - rename them tcp_fill_flag_header()/tcp_fill_ipv4_header(), > tcp_fill_ipv6_header() > - use upside-down Christmas tree arguments order > - replace (void *) by (struct tcphdr *) >=20 > tcp.c | 156 +++++++++++++++++++++++++++++++++++++++------------------- > 1 file changed, 106 insertions(+), 50 deletions(-) >=20 > diff --git a/tcp.c b/tcp.c > index df27e2d4e33d..6cf19ba97fa8 100644 > --- a/tcp.c > +++ b/tcp.c > @@ -1327,6 +1327,108 @@ void tcp_defer_handler(struct ctx *c) > tcp_l2_data_buf_flush(c); > } > =20 > +/** > + * tcp_fill_header() - Fill the TCP header fields for a given TCP segmen= t. > + * > + * @th: Pointer to the TCP header structure > + * @conn: Pointer to the TCP connection structure > + * @seq: Sequence number > + */ > +static void tcp_fill_header(struct tcphdr *th, > + const struct tcp_tap_conn *conn, uint32_t seq) > +{ > + th->source =3D htons(conn->fport); > + th->dest =3D htons(conn->eport); > + th->seq =3D htonl(seq); > + th->ack_seq =3D htonl(conn->seq_ack_to_tap); > + if (conn->events & ESTABLISHED) { > + th->window =3D htons(conn->wnd_to_tap); > + } else { > + unsigned wnd =3D conn->wnd_to_tap << conn->ws_to_tap; > + > + th->window =3D htons(MIN(wnd, USHRT_MAX)); > + } > +} > + > +/** > + * tcp_fill_headers4() - Fill 802.3, IPv4, TCP headers in pre-cooked buf= fers > + * @c: Execution context > + * @conn: Connection pointer > + * @iph: Pointer to IPv4 header > + * @th: Pointer to TCP header > + * @plen: Payload length (including TCP header options) > + * @check: Checksum, if already known > + * @seq: Sequence number for this segment > + * > + * Return: The total length of the IPv4 packet, host order > + */ > +static size_t tcp_fill_headers4(const struct ctx *c, > + const struct tcp_tap_conn *conn, > + struct iphdr *iph, struct tcphdr *th, > + size_t plen, const uint16_t *check, > + uint32_t seq) > +{ > + size_t ip_len =3D plen + sizeof(struct iphdr) + sizeof(struct tcphdr); > + const struct in_addr *a4 =3D inany_v4(&conn->faddr); > + > + ASSERT(a4); > + > + iph->tot_len =3D htons(ip_len); > + iph->saddr =3D a4->s_addr; > + iph->daddr =3D c->ip4.addr_seen.s_addr; > + > + iph->check =3D check ? *check : > + csum_ip4_header(iph->tot_len, IPPROTO_TCP, > + *a4, c->ip4.addr_seen); > + > + tcp_fill_header(th, conn, seq); > + > + tcp_update_check_tcp4(iph, th); > + > + return ip_len; > +} > + > +/** > + * tcp_fill_headers6() - Fill 802.3, IPv6, TCP headers in pre-cooked buf= fers > + * @c: Execution context > + * @conn: Connection pointer > + * @ip6h: Pointer to IPv6 header > + * @th: Pointer to TCP header > + * @plen: Payload length (including TCP header options) > + * @check: Checksum, if already known > + * @seq: Sequence number for this segment > + * > + * Return: The total length of the IPv6 packet, host order > + */ > +static size_t tcp_fill_headers6(const struct ctx *c, > + const struct tcp_tap_conn *conn, > + struct ipv6hdr *ip6h, struct tcphdr *th, > + size_t plen, uint32_t seq) > +{ > + size_t ip_len =3D plen + sizeof(struct ipv6hdr) + sizeof(struct tcphdr); > + > + ip6h->payload_len =3D htons(plen + sizeof(struct tcphdr)); > + ip6h->saddr =3D conn->faddr.a6; > + if (IN6_IS_ADDR_LINKLOCAL(&ip6h->saddr)) > + ip6h->daddr =3D c->ip6.addr_ll_seen; > + else > + ip6h->daddr =3D c->ip6.addr_seen; > + > + ip6h->hop_limit =3D 255; > + ip6h->version =3D 6; > + ip6h->nexthdr =3D IPPROTO_TCP; > + > + ip6h->flow_lbl[0] =3D (conn->sock >> 16) & 0xf; > + ip6h->flow_lbl[1] =3D (conn->sock >> 8) & 0xff; > + ip6h->flow_lbl[2] =3D (conn->sock >> 0) & 0xff; > + > + tcp_fill_header(th, conn, seq); > + > + tcp_update_check_tcp6(ip6h, th); > + > + return ip_len; > +} > + > /** > * tcp_l2_buf_fill_headers() - Fill 802.3, IP, TCP headers in pre-cooked= buffers > * @c: Execution context > @@ -1346,67 +1448,21 @@ static size_t tcp_l2_buf_fill_headers(const struc= t ctx *c, > const struct in_addr *a4 =3D inany_v4(&conn->faddr); > size_t ip_len, tlen; > =20 > -#define SET_TCP_HEADER_COMMON_V4_V6(b, conn, seq) \ > -do { \ > - b->th.source =3D htons(conn->fport); \ > - b->th.dest =3D htons(conn->eport); \ > - b->th.seq =3D htonl(seq); \ > - b->th.ack_seq =3D htonl(conn->seq_ack_to_tap); \ > - if (conn->events & ESTABLISHED) { \ > - b->th.window =3D htons(conn->wnd_to_tap); \ > - } else { \ > - unsigned wnd =3D conn->wnd_to_tap << conn->ws_to_tap; \ > - \ > - b->th.window =3D htons(MIN(wnd, USHRT_MAX)); \ > - } \ > -} while (0) > - > if (a4) { > struct tcp4_l2_buf_t *b =3D (struct tcp4_l2_buf_t *)p; > =20 > - ip_len =3D plen + sizeof(struct iphdr) + sizeof(struct tcphdr); > - b->iph.tot_len =3D htons(ip_len); > - b->iph.saddr =3D a4->s_addr; > - b->iph.daddr =3D c->ip4.addr_seen.s_addr; > - > - b->iph.check =3D check ? *check : > - csum_ip4_header(b->iph.tot_len, IPPROTO_TCP, > - *a4, c->ip4.addr_seen); > - > - SET_TCP_HEADER_COMMON_V4_V6(b, conn, seq); > - > - tcp_update_check_tcp4(&b->iph, &b->th); > + ip_len =3D tcp_fill_headers4(c, conn, &b->iph, &b->th, plen, > + check, seq); > =20 > tlen =3D tap_iov_len(c, &b->taph, ip_len); > } else { > struct tcp6_l2_buf_t *b =3D (struct tcp6_l2_buf_t *)p; > =20 > - ip_len =3D plen + sizeof(struct ipv6hdr) + sizeof(struct tcphdr); > - > - b->ip6h.payload_len =3D htons(plen + sizeof(struct tcphdr)); > - b->ip6h.saddr =3D conn->faddr.a6; > - if (IN6_IS_ADDR_LINKLOCAL(&b->ip6h.saddr)) > - b->ip6h.daddr =3D c->ip6.addr_ll_seen; > - else > - b->ip6h.daddr =3D c->ip6.addr_seen; > - > - memset(b->ip6h.flow_lbl, 0, 3); > - > - SET_TCP_HEADER_COMMON_V4_V6(b, conn, seq); > - > - tcp_update_check_tcp6(&b->ip6h, &b->th); > - > - b->ip6h.hop_limit =3D 255; > - b->ip6h.version =3D 6; > - b->ip6h.nexthdr =3D IPPROTO_TCP; > - > - b->ip6h.flow_lbl[0] =3D (conn->sock >> 16) & 0xf; > - b->ip6h.flow_lbl[1] =3D (conn->sock >> 8) & 0xff; > - b->ip6h.flow_lbl[2] =3D (conn->sock >> 0) & 0xff; > + ip_len =3D tcp_fill_headers6(c, conn, &b->ip6h, &b->th, plen, > + seq); > =20 > tlen =3D tap_iov_len(c, &b->taph, ip_len); > } > -#undef SET_TCP_HEADER_COMMON_V4_V6 > =20 > return tlen; > } --=20 David Gibson | 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 --YJyNIZTFItPhzQ24 Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAEBCAAdFiEEO+dNsU4E3yXUXRK2zQJF27ox2GcFAmXlG9kACgkQzQJF27ox 2GfEPw//YUCyyDnnPNxlMN0SdXaIawShPBP+xuHY5LylrDHlwpsoxlIUwcg0oEax o1yI6sB8RlW1zaIQc8j1KN8BurWR1JbFr2hmzveL5xBDbmsLxLLXjBw6gFKz+bgc eNJxSg1M3CpoWOqVfFKPbSIZT/0UGJ/ULAGWk37+Ms/k+movc9g153U7yMmKGrSn 8Bl04rDiAT/4NZzCaYqIl5ENzB7huQXnfuqUNUjAsifTIZwl5ZKyia1PspnvML+M FKfVo/zgMypfg5l84VrmYhqcMReLj291BD8J9U/kS8p4p3Q+eXdbqvB7m0vTBPAY mzTWxaApejDJko30LZM8VJAKqwy1tNOlEIC0LHbNLSOYhHa96GA16b7O4Cp0eOIb jZCU3uO4bdLiU5uYRGfBVPfIMcje7/Dzvqf1oUm/QbPz50PVok8R2guP5j9kajw7 TB/6RSd4yAsnj3pO4clMwB+X/3+MQkFcTYnGvwJ+JY9bO8ESbkSgGkxANWLt3zSG 5m1CenQGpFZywuLDa+47VpORg+94njW6fmDXpP4uNxVRSOLPse3UagX10iBfy7z6 OZnMq4tb6fhJX0lyiI2xzxS0gRY8dDXVDoAFgRdnfd82FzQ3rui+RApGe2by5PFW 3EI+cz5Mvdk9gjtdn98ZDpsLYgY5MbO3UaXDHvEI3e9zKGc5DLY= =eljd -----END PGP SIGNATURE----- --YJyNIZTFItPhzQ24--