On Fri, Sep 20, 2024 at 11:56:31AM +0200, Laurent Vivier wrote: > As tcp_update_check_tcp4() and tcp_update_check_tcp6() compute the > checksum using the TCP header and the TCP payload, it is clearer > to use a pointer to tcp_payload_t that includes tcphdr and payload > rather than a pointer to tcphdr (and guessing TCP header is > followed by the payload). > > Move tcp_payload_t and tcp_flags_t to tcp_internal.h. > (They will be used also by vhost-user). > > Signed-off-by: Laurent Vivier Reviewed-by: David Gibson Of course, it will conflict with Jon's pending changes merging the payload and flags arrays. > --- > tcp.c | 42 ++++++++++++++++++++++-------------------- > tcp_buf.c | 29 ----------------------------- > tcp_internal.h | 29 +++++++++++++++++++++++++++++ > 3 files changed, 51 insertions(+), 49 deletions(-) > > diff --git a/tcp.c b/tcp.c > index 1962fcc469ed..c9472d905520 100644 > --- a/tcp.c > +++ b/tcp.c > @@ -757,32 +757,34 @@ static void tcp_sock_set_bufsize(const struct ctx *c, int s) > /** > * tcp_update_check_tcp4() - Update TCP checksum from stored one > * @iph: IPv4 header > - * @th: TCP header followed by TCP payload > + * @bp: TCP header followed by TCP payload > */ > -static void tcp_update_check_tcp4(const struct iphdr *iph, struct tcphdr *th) > +static void tcp_update_check_tcp4(const struct iphdr *iph, > + struct tcp_payload_t *bp) > { > uint16_t l4len = ntohs(iph->tot_len) - sizeof(struct iphdr); > struct in_addr saddr = { .s_addr = iph->saddr }; > struct in_addr daddr = { .s_addr = iph->daddr }; > uint32_t sum = proto_ipv4_header_psum(l4len, IPPROTO_TCP, saddr, daddr); > > - th->check = 0; > - th->check = csum(th, l4len, sum); > + bp->th.check = 0; > + bp->th.check = csum(bp, l4len, sum); > } > > /** > * tcp_update_check_tcp6() - Calculate TCP checksum for IPv6 > * @ip6h: IPv6 header > - * @th: TCP header followed by TCP payload > + * @bp: TCP header followed by TCP payload > */ > -static void tcp_update_check_tcp6(struct ipv6hdr *ip6h, struct tcphdr *th) > +static void tcp_update_check_tcp6(const struct ipv6hdr *ip6h, > + struct tcp_payload_t *bp) > { > uint16_t l4len = ntohs(ip6h->payload_len); > uint32_t sum = proto_ipv6_header_psum(l4len, IPPROTO_TCP, > &ip6h->saddr, &ip6h->daddr); > > - th->check = 0; > - th->check = csum(th, l4len, sum); > + bp->th.check = 0; > + bp->th.check = csum(bp, l4len, sum); > } > > /** > @@ -902,7 +904,7 @@ static void tcp_fill_header(struct tcphdr *th, > * @conn: Connection pointer > * @taph: tap backend specific header > * @iph: Pointer to IPv4 header > - * @th: Pointer to TCP header > + * @bp: Pointer to TCP header followed by TCP payload > * @dlen: TCP payload length > * @check: Checksum, if already known > * @seq: Sequence number for this segment > @@ -912,14 +914,14 @@ static void tcp_fill_header(struct tcphdr *th, > */ > static size_t tcp_fill_headers4(const struct tcp_tap_conn *conn, > struct tap_hdr *taph, > - struct iphdr *iph, struct tcphdr *th, > + struct iphdr *iph, struct tcp_payload_t *bp, > size_t dlen, const uint16_t *check, > uint32_t seq, bool no_tcp_csum) > { > const struct flowside *tapside = TAPFLOW(conn); > const struct in_addr *src4 = inany_v4(&tapside->oaddr); > const struct in_addr *dst4 = inany_v4(&tapside->eaddr); > - size_t l4len = dlen + sizeof(*th); > + size_t l4len = dlen + sizeof(bp->th); > size_t l3len = l4len + sizeof(*iph); > > ASSERT(src4 && dst4); > @@ -931,12 +933,12 @@ static size_t tcp_fill_headers4(const struct tcp_tap_conn *conn, > iph->check = check ? *check : > csum_ip4_header(l3len, IPPROTO_TCP, *src4, *dst4); > > - tcp_fill_header(th, conn, seq); > + tcp_fill_header(&bp->th, conn, seq); > > if (no_tcp_csum) > - th->check = 0; > + bp->th.check = 0; > else > - tcp_update_check_tcp4(iph, th); > + tcp_update_check_tcp4(iph, bp); > > tap_hdr_update(taph, l3len + sizeof(struct ethhdr)); > > @@ -948,7 +950,7 @@ static size_t tcp_fill_headers4(const struct tcp_tap_conn *conn, > * @conn: Connection pointer > * @taph: tap backend specific header > * @ip6h: Pointer to IPv6 header > - * @th: Pointer to TCP header > + * @bp: Pointer to TCP header followed by TCP payload > * @dlen: TCP payload length > * @check: Checksum, if already known > * @seq: Sequence number for this segment > @@ -958,11 +960,11 @@ static size_t tcp_fill_headers4(const struct tcp_tap_conn *conn, > */ > static size_t tcp_fill_headers6(const struct tcp_tap_conn *conn, > struct tap_hdr *taph, > - struct ipv6hdr *ip6h, struct tcphdr *th, > + struct ipv6hdr *ip6h, struct tcp_payload_t *bp, > size_t dlen, uint32_t seq, bool no_tcp_csum) > { > const struct flowside *tapside = TAPFLOW(conn); > - size_t l4len = dlen + sizeof(*th); > + size_t l4len = dlen + sizeof(bp->th); > > ip6h->payload_len = htons(l4len); > ip6h->saddr = tapside->oaddr.a6; > @@ -976,12 +978,12 @@ static size_t tcp_fill_headers6(const struct tcp_tap_conn *conn, > ip6h->flow_lbl[1] = (conn->sock >> 8) & 0xff; > ip6h->flow_lbl[2] = (conn->sock >> 0) & 0xff; > > - tcp_fill_header(th, conn, seq); > + tcp_fill_header(&bp->th, conn, seq); > > if (no_tcp_csum) > - th->check = 0; > + bp->th.check = 0; > else > - tcp_update_check_tcp6(ip6h, th); > + tcp_update_check_tcp6(ip6h, bp); > > tap_hdr_update(taph, l4len + sizeof(*ip6h) + sizeof(struct ethhdr)); > > diff --git a/tcp_buf.c b/tcp_buf.c > index ffbff5e4b485..238827b01d90 100644 > --- a/tcp_buf.c > +++ b/tcp_buf.c > @@ -38,35 +38,6 @@ > (c->mode == MODE_PASTA ? 1 : TCP_FRAMES_MEM) > > /* Static buffers */ > -/** > - * struct tcp_payload_t - TCP header and data to send segments with payload > - * @th: TCP header > - * @data: TCP data > - */ > -struct tcp_payload_t { > - struct tcphdr th; > - uint8_t data[IP_MAX_MTU - sizeof(struct tcphdr)]; > -#ifdef __AVX2__ > -} __attribute__ ((packed, aligned(32))); /* For AVX2 checksum routines */ > -#else > -} __attribute__ ((packed, aligned(__alignof__(unsigned int)))); > -#endif > - > -/** > - * struct tcp_flags_t - TCP header and data to send zero-length > - * segments (flags) > - * @th: TCP header > - * @opts TCP options > - */ > -struct tcp_flags_t { > - struct tcphdr th; > - char opts[OPT_MSS_LEN + OPT_WS_LEN + 1]; > -#ifdef __AVX2__ > -} __attribute__ ((packed, aligned(32))); > -#else > -} __attribute__ ((packed, aligned(__alignof__(unsigned int)))); > -#endif > - > /* Ethernet header for IPv4 frames */ > static struct ethhdr tcp4_eth_src; > > diff --git a/tcp_internal.h b/tcp_internal.h > index de06db1438d6..2f74ffeff8f3 100644 > --- a/tcp_internal.h > +++ b/tcp_internal.h > @@ -63,6 +63,35 @@ enum tcp_iov_parts { > TCP_NUM_IOVS > }; > > +/** > + * struct tcp_payload_t - TCP header and data to send segments with payload > + * @th: TCP header > + * @data: TCP data > + */ > +struct tcp_payload_t { > + struct tcphdr th; > + uint8_t data[IP_MAX_MTU - sizeof(struct tcphdr)]; > +#ifdef __AVX2__ > +} __attribute__ ((packed, aligned(32))); /* For AVX2 checksum routines */ > +#else > +} __attribute__ ((packed, aligned(__alignof__(unsigned int)))); > +#endif > + > +/** > + * struct tcp_flags_t - TCP header and data to send zero-length > + * segments (flags) > + * @th: TCP header > + * @opts TCP options > + */ > +struct tcp_flags_t { > + struct tcphdr th; > + char opts[OPT_MSS_LEN + OPT_WS_LEN + 1]; > +#ifdef __AVX2__ > +} __attribute__ ((packed, aligned(32))); > +#else > +} __attribute__ ((packed, aligned(__alignof__(unsigned int)))); > +#endif > + > extern char tcp_buf_discard [MAX_WINDOW]; > > void conn_flag_do(const struct ctx *c, struct tcp_tap_conn *conn, -- 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