* [PATCH v2] net/virtio: deduce IP length for Virtio TSO checksum [not found] <20230216123554.2628837-2-boleslav.stankevich@oktetlabs.ru> @ 2023-03-03 11:19 ` Boleslav Stankevich 2023-03-03 15:13 ` Andrew Rybchenko ` (2 more replies) 0 siblings, 3 replies; 6+ messages in thread From: Boleslav Stankevich @ 2023-03-03 11:19 UTC (permalink / raw) To: dev; +Cc: Boleslav Stankevich, stable, Andrew Rybchenko The length of TSO payload could not fit into 16 bits provided by the IPv4 total length and IPv6 payload length fields. Thus, deduce it from the length of the packet. Fixes: 696573046e9 ("net/virtio: support TSO") Cc: stable@dpdk.org Signed-off-by: Boleslav Stankevich <boleslav.stankevich@oktetlabs.ru> Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru> --- drivers/net/virtio/virtio_rxtx.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/drivers/net/virtio/virtio_rxtx.c b/drivers/net/virtio/virtio_rxtx.c index 2d0afd3302..e48ff3cca7 100644 --- a/drivers/net/virtio/virtio_rxtx.c +++ b/drivers/net/virtio/virtio_rxtx.c @@ -404,29 +404,36 @@ virtio_tso_fix_cksum(struct rte_mbuf *m) if (likely(rte_pktmbuf_data_len(m) >= m->l2_len + m->l3_len + m->l4_len)) { struct rte_ipv4_hdr *iph; - struct rte_ipv6_hdr *ip6h; struct rte_tcp_hdr *th; - uint16_t prev_cksum, new_cksum, ip_len, ip_paylen; + uint16_t prev_cksum, new_cksum; + uint32_t ip_paylen; uint32_t tmp; iph = rte_pktmbuf_mtod_offset(m, struct rte_ipv4_hdr *, m->l2_len); th = RTE_PTR_ADD(iph, m->l3_len); + + /* + * Calculate IPv4 header checksum with current total length value + * (whatever it is) to have correct checksum after update on edits + * done by TSO. + */ if ((iph->version_ihl >> 4) == 4) { iph->hdr_checksum = 0; iph->hdr_checksum = rte_ipv4_cksum(iph); - ip_len = iph->total_length; - ip_paylen = rte_cpu_to_be_16(rte_be_to_cpu_16(ip_len) - - m->l3_len); - } else { - ip6h = (struct rte_ipv6_hdr *)iph; - ip_paylen = ip6h->payload_len; } + /* + * Do not use IPv4 total length and IPv6 payload length fields to get + * TSO payload length since it could not fit into 16 bits. + */ + ip_paylen = rte_cpu_to_be_32(rte_pktmbuf_pkt_len(m) - m->l2_len - + m->l3_len); + /* calculate the new phdr checksum not including ip_paylen */ prev_cksum = th->cksum; tmp = prev_cksum; - tmp += ip_paylen; + tmp += (ip_paylen & 0xffff) + (ip_paylen >> 16); tmp = (tmp & 0xffff) + (tmp >> 16); new_cksum = tmp; -- 2.30.2 v2: * Extend Description with Fixes and CC tags. ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] net/virtio: deduce IP length for Virtio TSO checksum 2023-03-03 11:19 ` [PATCH v2] net/virtio: deduce IP length for Virtio TSO checksum Boleslav Stankevich @ 2023-03-03 15:13 ` Andrew Rybchenko 2023-03-06 6:17 ` Xia, Chenbo 2023-03-06 14:13 ` Maxime Coquelin 2023-03-06 14:20 ` Maxime Coquelin 2 siblings, 1 reply; 6+ messages in thread From: Andrew Rybchenko @ 2023-03-03 15:13 UTC (permalink / raw) To: Boleslav Stankevich, dev; +Cc: stable, Maxime Coquelin, Chenbo Xia Cc Maxime and Chenbo On 3/3/23 14:19, Boleslav Stankevich wrote: > The length of TSO payload could not fit into 16 bits provided by the > IPv4 total length and IPv6 payload length fields. Thus, deduce it > from the length of the packet. > > Fixes: 696573046e9 ("net/virtio: support TSO") > Cc: stable@dpdk.org > > Signed-off-by: Boleslav Stankevich <boleslav.stankevich@oktetlabs.ru> > Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru> > --- > drivers/net/virtio/virtio_rxtx.c | 25 ++++++++++++++++--------- > 1 file changed, 16 insertions(+), 9 deletions(-) > > diff --git a/drivers/net/virtio/virtio_rxtx.c b/drivers/net/virtio/virtio_rxtx.c > index 2d0afd3302..e48ff3cca7 100644 > --- a/drivers/net/virtio/virtio_rxtx.c > +++ b/drivers/net/virtio/virtio_rxtx.c > @@ -404,29 +404,36 @@ virtio_tso_fix_cksum(struct rte_mbuf *m) > if (likely(rte_pktmbuf_data_len(m) >= m->l2_len + m->l3_len + > m->l4_len)) { > struct rte_ipv4_hdr *iph; > - struct rte_ipv6_hdr *ip6h; > struct rte_tcp_hdr *th; > - uint16_t prev_cksum, new_cksum, ip_len, ip_paylen; > + uint16_t prev_cksum, new_cksum; > + uint32_t ip_paylen; > uint32_t tmp; > > iph = rte_pktmbuf_mtod_offset(m, > struct rte_ipv4_hdr *, m->l2_len); > th = RTE_PTR_ADD(iph, m->l3_len); > + > + /* > + * Calculate IPv4 header checksum with current total length value > + * (whatever it is) to have correct checksum after update on edits > + * done by TSO. > + */ > if ((iph->version_ihl >> 4) == 4) { > iph->hdr_checksum = 0; > iph->hdr_checksum = rte_ipv4_cksum(iph); > - ip_len = iph->total_length; > - ip_paylen = rte_cpu_to_be_16(rte_be_to_cpu_16(ip_len) - > - m->l3_len); > - } else { > - ip6h = (struct rte_ipv6_hdr *)iph; > - ip_paylen = ip6h->payload_len; > } > > + /* > + * Do not use IPv4 total length and IPv6 payload length fields to get > + * TSO payload length since it could not fit into 16 bits. > + */ > + ip_paylen = rte_cpu_to_be_32(rte_pktmbuf_pkt_len(m) - m->l2_len - > + m->l3_len); > + > /* calculate the new phdr checksum not including ip_paylen */ > prev_cksum = th->cksum; > tmp = prev_cksum; > - tmp += ip_paylen; > + tmp += (ip_paylen & 0xffff) + (ip_paylen >> 16); > tmp = (tmp & 0xffff) + (tmp >> 16); > new_cksum = tmp; > ^ permalink raw reply [flat|nested] 6+ messages in thread
* RE: [PATCH v2] net/virtio: deduce IP length for Virtio TSO checksum 2023-03-03 15:13 ` Andrew Rybchenko @ 2023-03-06 6:17 ` Xia, Chenbo 2023-03-06 10:57 ` Maxime Coquelin 0 siblings, 1 reply; 6+ messages in thread From: Xia, Chenbo @ 2023-03-06 6:17 UTC (permalink / raw) To: Andrew Rybchenko, Boleslav Stankevich, dev; +Cc: stable, Maxime Coquelin Hi Boleslav, The change seems good, but patchwork is complaining about lack of .mailmap change. http://mails.dpdk.org/archives/test-report/2023-March/363061.html Guess this is your first patch? So you need to add name and email in mailmap file. Thanks, Chenbo > -----Original Message----- > From: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru> > Sent: Friday, March 3, 2023 11:14 PM > To: Boleslav Stankevich <boleslav.stankevich@oktetlabs.ru>; dev@dpdk.org > Cc: stable@dpdk.org; Maxime Coquelin <maxime.coquelin@redhat.com>; Xia, > Chenbo <chenbo.xia@intel.com> > Subject: Re: [PATCH v2] net/virtio: deduce IP length for Virtio TSO > checksum > > Cc Maxime and Chenbo > > On 3/3/23 14:19, Boleslav Stankevich wrote: > > The length of TSO payload could not fit into 16 bits provided by the > > IPv4 total length and IPv6 payload length fields. Thus, deduce it > > from the length of the packet. > > > > Fixes: 696573046e9 ("net/virtio: support TSO") > > Cc: stable@dpdk.org > > > > Signed-off-by: Boleslav Stankevich <boleslav.stankevich@oktetlabs.ru> > > Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru> > > --- > > drivers/net/virtio/virtio_rxtx.c | 25 ++++++++++++++++--------- > > 1 file changed, 16 insertions(+), 9 deletions(-) > > > > diff --git a/drivers/net/virtio/virtio_rxtx.c > b/drivers/net/virtio/virtio_rxtx.c > > index 2d0afd3302..e48ff3cca7 100644 > > --- a/drivers/net/virtio/virtio_rxtx.c > > +++ b/drivers/net/virtio/virtio_rxtx.c > > @@ -404,29 +404,36 @@ virtio_tso_fix_cksum(struct rte_mbuf *m) > > if (likely(rte_pktmbuf_data_len(m) >= m->l2_len + m->l3_len + > > m->l4_len)) { > > struct rte_ipv4_hdr *iph; > > - struct rte_ipv6_hdr *ip6h; > > struct rte_tcp_hdr *th; > > - uint16_t prev_cksum, new_cksum, ip_len, ip_paylen; > > + uint16_t prev_cksum, new_cksum; > > + uint32_t ip_paylen; > > uint32_t tmp; > > > > iph = rte_pktmbuf_mtod_offset(m, > > struct rte_ipv4_hdr *, m->l2_len); > > th = RTE_PTR_ADD(iph, m->l3_len); > > + > > + /* > > + * Calculate IPv4 header checksum with current total length > value > > + * (whatever it is) to have correct checksum after update on > edits > > + * done by TSO. > > + */ > > if ((iph->version_ihl >> 4) == 4) { > > iph->hdr_checksum = 0; > > iph->hdr_checksum = rte_ipv4_cksum(iph); > > - ip_len = iph->total_length; > > - ip_paylen = rte_cpu_to_be_16(rte_be_to_cpu_16(ip_len) - > > - m->l3_len); > > - } else { > > - ip6h = (struct rte_ipv6_hdr *)iph; > > - ip_paylen = ip6h->payload_len; > > } > > > > + /* > > + * Do not use IPv4 total length and IPv6 payload length fields > to get > > + * TSO payload length since it could not fit into 16 bits. > > + */ > > + ip_paylen = rte_cpu_to_be_32(rte_pktmbuf_pkt_len(m) - m- > >l2_len - > > + m->l3_len); > > + > > /* calculate the new phdr checksum not including ip_paylen */ > > prev_cksum = th->cksum; > > tmp = prev_cksum; > > - tmp += ip_paylen; > > + tmp += (ip_paylen & 0xffff) + (ip_paylen >> 16); > > tmp = (tmp & 0xffff) + (tmp >> 16); > > new_cksum = tmp; > > ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] net/virtio: deduce IP length for Virtio TSO checksum 2023-03-06 6:17 ` Xia, Chenbo @ 2023-03-06 10:57 ` Maxime Coquelin 0 siblings, 0 replies; 6+ messages in thread From: Maxime Coquelin @ 2023-03-06 10:57 UTC (permalink / raw) To: Xia, Chenbo, Andrew Rybchenko, Boleslav Stankevich, dev; +Cc: stable On 3/6/23 07:17, Xia, Chenbo wrote: > Hi Boleslav, > > The change seems good, but patchwork is complaining about lack of .mailmap change. > > http://mails.dpdk.org/archives/test-report/2023-March/363061.html > > Guess this is your first patch? So you need to add name and email in mailmap file. Thanks for the heads-up, I will update the mailmap when applying. No need to submit a new revision. Thanks, Maxime > Thanks, > Chenbo > >> -----Original Message----- >> From: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru> >> Sent: Friday, March 3, 2023 11:14 PM >> To: Boleslav Stankevich <boleslav.stankevich@oktetlabs.ru>; dev@dpdk.org >> Cc: stable@dpdk.org; Maxime Coquelin <maxime.coquelin@redhat.com>; Xia, >> Chenbo <chenbo.xia@intel.com> >> Subject: Re: [PATCH v2] net/virtio: deduce IP length for Virtio TSO >> checksum >> >> Cc Maxime and Chenbo >> >> On 3/3/23 14:19, Boleslav Stankevich wrote: >>> The length of TSO payload could not fit into 16 bits provided by the >>> IPv4 total length and IPv6 payload length fields. Thus, deduce it >>> from the length of the packet. >>> >>> Fixes: 696573046e9 ("net/virtio: support TSO") >>> Cc: stable@dpdk.org >>> >>> Signed-off-by: Boleslav Stankevich <boleslav.stankevich@oktetlabs.ru> >>> Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru> >>> --- >>> drivers/net/virtio/virtio_rxtx.c | 25 ++++++++++++++++--------- >>> 1 file changed, 16 insertions(+), 9 deletions(-) >>> >>> diff --git a/drivers/net/virtio/virtio_rxtx.c >> b/drivers/net/virtio/virtio_rxtx.c >>> index 2d0afd3302..e48ff3cca7 100644 >>> --- a/drivers/net/virtio/virtio_rxtx.c >>> +++ b/drivers/net/virtio/virtio_rxtx.c >>> @@ -404,29 +404,36 @@ virtio_tso_fix_cksum(struct rte_mbuf *m) >>> if (likely(rte_pktmbuf_data_len(m) >= m->l2_len + m->l3_len + >>> m->l4_len)) { >>> struct rte_ipv4_hdr *iph; >>> - struct rte_ipv6_hdr *ip6h; >>> struct rte_tcp_hdr *th; >>> - uint16_t prev_cksum, new_cksum, ip_len, ip_paylen; >>> + uint16_t prev_cksum, new_cksum; >>> + uint32_t ip_paylen; >>> uint32_t tmp; >>> >>> iph = rte_pktmbuf_mtod_offset(m, >>> struct rte_ipv4_hdr *, m->l2_len); >>> th = RTE_PTR_ADD(iph, m->l3_len); >>> + >>> + /* >>> + * Calculate IPv4 header checksum with current total length >> value >>> + * (whatever it is) to have correct checksum after update on >> edits >>> + * done by TSO. >>> + */ >>> if ((iph->version_ihl >> 4) == 4) { >>> iph->hdr_checksum = 0; >>> iph->hdr_checksum = rte_ipv4_cksum(iph); >>> - ip_len = iph->total_length; >>> - ip_paylen = rte_cpu_to_be_16(rte_be_to_cpu_16(ip_len) - >>> - m->l3_len); >>> - } else { >>> - ip6h = (struct rte_ipv6_hdr *)iph; >>> - ip_paylen = ip6h->payload_len; >>> } >>> >>> + /* >>> + * Do not use IPv4 total length and IPv6 payload length fields >> to get >>> + * TSO payload length since it could not fit into 16 bits. >>> + */ >>> + ip_paylen = rte_cpu_to_be_32(rte_pktmbuf_pkt_len(m) - m- >>> l2_len - >>> + m->l3_len); >>> + >>> /* calculate the new phdr checksum not including ip_paylen */ >>> prev_cksum = th->cksum; >>> tmp = prev_cksum; >>> - tmp += ip_paylen; >>> + tmp += (ip_paylen & 0xffff) + (ip_paylen >> 16); >>> tmp = (tmp & 0xffff) + (tmp >> 16); >>> new_cksum = tmp; >>> > ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] net/virtio: deduce IP length for Virtio TSO checksum 2023-03-03 11:19 ` [PATCH v2] net/virtio: deduce IP length for Virtio TSO checksum Boleslav Stankevich 2023-03-03 15:13 ` Andrew Rybchenko @ 2023-03-06 14:13 ` Maxime Coquelin 2023-03-06 14:20 ` Maxime Coquelin 2 siblings, 0 replies; 6+ messages in thread From: Maxime Coquelin @ 2023-03-06 14:13 UTC (permalink / raw) To: Boleslav Stankevich, dev; +Cc: stable, Andrew Rybchenko On 3/3/23 12:19, Boleslav Stankevich wrote: > The length of TSO payload could not fit into 16 bits provided by the > IPv4 total length and IPv6 payload length fields. Thus, deduce it > from the length of the packet. > > Fixes: 696573046e9 ("net/virtio: support TSO") > Cc: stable@dpdk.org > > Signed-off-by: Boleslav Stankevich <boleslav.stankevich@oktetlabs.ru> > Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru> > --- > drivers/net/virtio/virtio_rxtx.c | 25 ++++++++++++++++--------- > 1 file changed, 16 insertions(+), 9 deletions(-) > > diff --git a/drivers/net/virtio/virtio_rxtx.c b/drivers/net/virtio/virtio_rxtx.c > index 2d0afd3302..e48ff3cca7 100644 > --- a/drivers/net/virtio/virtio_rxtx.c > +++ b/drivers/net/virtio/virtio_rxtx.c > @@ -404,29 +404,36 @@ virtio_tso_fix_cksum(struct rte_mbuf *m) > if (likely(rte_pktmbuf_data_len(m) >= m->l2_len + m->l3_len + > m->l4_len)) { > struct rte_ipv4_hdr *iph; > - struct rte_ipv6_hdr *ip6h; > struct rte_tcp_hdr *th; > - uint16_t prev_cksum, new_cksum, ip_len, ip_paylen; > + uint16_t prev_cksum, new_cksum; > + uint32_t ip_paylen; > uint32_t tmp; > > iph = rte_pktmbuf_mtod_offset(m, > struct rte_ipv4_hdr *, m->l2_len); > th = RTE_PTR_ADD(iph, m->l3_len); > + > + /* > + * Calculate IPv4 header checksum with current total length value > + * (whatever it is) to have correct checksum after update on edits > + * done by TSO. > + */ > if ((iph->version_ihl >> 4) == 4) { > iph->hdr_checksum = 0; > iph->hdr_checksum = rte_ipv4_cksum(iph); > - ip_len = iph->total_length; > - ip_paylen = rte_cpu_to_be_16(rte_be_to_cpu_16(ip_len) - > - m->l3_len); > - } else { > - ip6h = (struct rte_ipv6_hdr *)iph; > - ip_paylen = ip6h->payload_len; > } > > + /* > + * Do not use IPv4 total length and IPv6 payload length fields to get > + * TSO payload length since it could not fit into 16 bits. > + */ > + ip_paylen = rte_cpu_to_be_32(rte_pktmbuf_pkt_len(m) - m->l2_len - > + m->l3_len); > + > /* calculate the new phdr checksum not including ip_paylen */ > prev_cksum = th->cksum; > tmp = prev_cksum; > - tmp += ip_paylen; > + tmp += (ip_paylen & 0xffff) + (ip_paylen >> 16); > tmp = (tmp & 0xffff) + (tmp >> 16); > new_cksum = tmp; > Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com> Thanks, Maxime ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] net/virtio: deduce IP length for Virtio TSO checksum 2023-03-03 11:19 ` [PATCH v2] net/virtio: deduce IP length for Virtio TSO checksum Boleslav Stankevich 2023-03-03 15:13 ` Andrew Rybchenko 2023-03-06 14:13 ` Maxime Coquelin @ 2023-03-06 14:20 ` Maxime Coquelin 2 siblings, 0 replies; 6+ messages in thread From: Maxime Coquelin @ 2023-03-06 14:20 UTC (permalink / raw) To: Boleslav Stankevich, dev; +Cc: stable, Andrew Rybchenko On 3/3/23 12:19, Boleslav Stankevich wrote: > The length of TSO payload could not fit into 16 bits provided by the > IPv4 total length and IPv6 payload length fields. Thus, deduce it > from the length of the packet. > > Fixes: 696573046e9 ("net/virtio: support TSO") > Cc: stable@dpdk.org > > Signed-off-by: Boleslav Stankevich <boleslav.stankevich@oktetlabs.ru> > Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru> > --- > drivers/net/virtio/virtio_rxtx.c | 25 ++++++++++++++++--------- > 1 file changed, 16 insertions(+), 9 deletions(-) > Applied to dpdk-next-virtio/main. Thanks, Maxime ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2023-03-06 14:20 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- [not found] <20230216123554.2628837-2-boleslav.stankevich@oktetlabs.ru> 2023-03-03 11:19 ` [PATCH v2] net/virtio: deduce IP length for Virtio TSO checksum Boleslav Stankevich 2023-03-03 15:13 ` Andrew Rybchenko 2023-03-06 6:17 ` Xia, Chenbo 2023-03-06 10:57 ` Maxime Coquelin 2023-03-06 14:13 ` Maxime Coquelin 2023-03-06 14:20 ` Maxime Coquelin
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 NNTP newsgroup(s).