From: Ferruh Yigit <ferruh.yigit@intel.com>
To: Xiaoyun Li <xiaoyun.li@intel.com>, <Aman.Deep.Singh@intel.com>,
<olivier.matz@6wind.com>, <mb@smartsharesystems.com>,
<konstantin.ananyev@intel.com>, <stephen@networkplumber.org>,
<vladimir.medvedkin@intel.com>
Cc: <dev@dpdk.org>, Sunil Pai G <sunil.pai.g@intel.com>
Subject: Re: [PATCH v5 2/2] testpmd: fix l4 sw csum over multi segments
Date: Fri, 21 Jan 2022 15:16:40 +0000 [thread overview]
Message-ID: <1c366b66-4e1a-94ba-e1af-161a1dded713@intel.com> (raw)
In-Reply-To: <20220106160333.762686-3-xiaoyun.li@intel.com>
On 1/6/2022 4:03 PM, Xiaoyun Li wrote:
> In csum forwarding mode, software UDP/TCP csum calculation only takes
> the first segment into account while using the whole packet length so
> the calculation will read invalid memory region with multi-segments
> packets and will get wrong value.
> This patch fixes this issue.
>
> Signed-off-by: Xiaoyun Li <xiaoyun.li@intel.com>
> Tested-by: Sunil Pai G <sunil.pai.g@intel.com>
Can you please check following check-git-log.sh warnings:
./devtools/check-git-log.sh -2
Wrong headline label:
testpmd: fix l4 sw csum over multi segments
Wrong headline case:
"testpmd: fix l4 sw csum over multi segments": l4 --> L4
Wrong headline case:
"testpmd: fix l4 sw csum over multi segments": sw --> SW
Missing 'Fixes' tag:
testpmd: fix l4 sw csum over multi segments
> ---
> app/test-pmd/csumonly.c | 41 ++++++++++++++++++++++++++---------------
> 1 file changed, 26 insertions(+), 15 deletions(-)
>
> diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c
> index 2aeea243b6..0fbe1f1be7 100644
> --- a/app/test-pmd/csumonly.c
> +++ b/app/test-pmd/csumonly.c
> @@ -96,12 +96,13 @@ struct simple_gre_hdr {
> } __rte_packed;
>
> static uint16_t
> -get_udptcp_checksum(void *l3_hdr, void *l4_hdr, uint16_t ethertype)
> +get_udptcp_checksum(struct rte_mbuf *m, void *l3_hdr, uint16_t l4_off,
> + uint16_t ethertype)
> {
> if (ethertype == _htons(RTE_ETHER_TYPE_IPV4))
> - return rte_ipv4_udptcp_cksum(l3_hdr, l4_hdr);
> + return rte_ipv4_udptcp_cksum_mbuf(m, l3_hdr, l4_off);
> else /* assume ethertype == RTE_ETHER_TYPE_IPV6 */
> - return rte_ipv6_udptcp_cksum(l3_hdr, l4_hdr);
> + return rte_ipv6_udptcp_cksum_mbuf(m, l3_hdr, l4_off);
> }
>
> /* Parse an IPv4 header to fill l3_len, l4_len, and l4_proto */
> @@ -460,7 +461,7 @@ parse_encap_ip(void *encap_ip, struct testpmd_offload_info *info)
> * depending on the testpmd command line configuration */
> static uint64_t
> process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info,
> - uint64_t tx_offloads)
> + uint64_t tx_offloads, struct rte_mbuf *m)
> {
> struct rte_ipv4_hdr *ipv4_hdr = l3_hdr;
> struct rte_udp_hdr *udp_hdr;
> @@ -468,6 +469,7 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info,
> struct rte_sctp_hdr *sctp_hdr;
> uint64_t ol_flags = 0;
> uint32_t max_pkt_len, tso_segsz = 0;
> + uint16_t l4_off;
>
> /* ensure packet is large enough to require tso */
> if (!info->is_tunnel) {
> @@ -510,9 +512,15 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info,
> if (tx_offloads & RTE_ETH_TX_OFFLOAD_UDP_CKSUM) {
> ol_flags |= RTE_MBUF_F_TX_UDP_CKSUM;
> } else {
> + if (info->is_tunnel)
> + l4_off = info->l2_len +
> + info->outer_l3_len +
> + info->l2_len + info->l3_len;
> + else
> + l4_off = info->l2_len + info->l3_len;
> udp_hdr->dgram_cksum = 0;
> udp_hdr->dgram_cksum =
> - get_udptcp_checksum(l3_hdr, udp_hdr,
> + get_udptcp_checksum(m, l3_hdr, l4_off,
> info->ethertype);
> }
> }
> @@ -527,9 +535,14 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info,
> else if (tx_offloads & RTE_ETH_TX_OFFLOAD_TCP_CKSUM) {
> ol_flags |= RTE_MBUF_F_TX_TCP_CKSUM;
> } else {
> + if (info->is_tunnel)
> + l4_off = info->l2_len + info->outer_l3_len +
> + info->l2_len + info->l3_len;
> + else
> + l4_off = info->l2_len + info->l3_len;
> tcp_hdr->cksum = 0;
> tcp_hdr->cksum =
> - get_udptcp_checksum(l3_hdr, tcp_hdr,
> + get_udptcp_checksum(m, l3_hdr, l4_off,
> info->ethertype);
> }
> #ifdef RTE_LIB_GSO
> @@ -557,7 +570,7 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info,
> /* Calculate the checksum of outer header */
> static uint64_t
> process_outer_cksums(void *outer_l3_hdr, struct testpmd_offload_info *info,
> - uint64_t tx_offloads, int tso_enabled)
> + uint64_t tx_offloads, int tso_enabled, struct rte_mbuf *m)
> {
> struct rte_ipv4_hdr *ipv4_hdr = outer_l3_hdr;
> struct rte_ipv6_hdr *ipv6_hdr = outer_l3_hdr;
> @@ -611,12 +624,9 @@ process_outer_cksums(void *outer_l3_hdr, struct testpmd_offload_info *info,
> /* do not recalculate udp cksum if it was 0 */
> if (udp_hdr->dgram_cksum != 0) {
> udp_hdr->dgram_cksum = 0;
> - if (info->outer_ethertype == _htons(RTE_ETHER_TYPE_IPV4))
> - udp_hdr->dgram_cksum =
> - rte_ipv4_udptcp_cksum(ipv4_hdr, udp_hdr);
> - else
> - udp_hdr->dgram_cksum =
> - rte_ipv6_udptcp_cksum(ipv6_hdr, udp_hdr);
> + udp_hdr->dgram_cksum = get_udptcp_checksum(m, outer_l3_hdr,
> + info->l2_len + info->outer_l3_len,
> + info->outer_ethertype);
> }
>
> return ol_flags;
> @@ -957,7 +967,7 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)
>
> /* process checksums of inner headers first */
> tx_ol_flags |= process_inner_cksums(l3_hdr, &info,
> - tx_offloads);
> + tx_offloads, m);
>
> /* Then process outer headers if any. Note that the software
> * checksum will be wrong if one of the inner checksums is
> @@ -965,7 +975,8 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)
> if (info.is_tunnel == 1) {
> tx_ol_flags |= process_outer_cksums(outer_l3_hdr, &info,
> tx_offloads,
> - !!(tx_ol_flags & RTE_MBUF_F_TX_TCP_SEG));
> + !!(tx_ol_flags & RTE_MBUF_F_TX_TCP_SEG),
> + m);
> }
>
> /* step 3: fill the mbuf meta data (flags and header lengths) */
next prev parent reply other threads:[~2022-01-21 15:16 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-15 5:13 [dpdk-dev] [PATCH] app/testpmd: fix l4 sw csum over multi segments Xiaoyun Li
2021-10-15 8:09 ` David Marchand
2021-10-18 2:02 ` Li, Xiaoyun
2021-10-18 2:16 ` [dpdk-dev] [PATCH v2] " Xiaoyun Li
2021-10-18 3:00 ` [dpdk-dev] [PATCH] " Stephen Hemminger
2021-10-18 3:16 ` Li, Xiaoyun
2021-10-18 4:40 ` Li, Xiaoyun
2021-10-18 10:15 ` Ananyev, Konstantin
2021-10-19 1:54 ` Li, Xiaoyun
2021-10-20 10:12 ` [dpdk-dev] [PATCH v3] " Xiaoyun Li
2021-10-27 10:48 ` Ferruh Yigit
2021-10-27 11:29 ` Morten Brørup
2021-10-29 8:29 ` Olivier Matz
2021-12-03 11:31 ` Li, Xiaoyun
2021-12-03 11:38 ` [PATCH v4 0/2] Add functions to calculate UDP/TCP cksum in mbuf Xiaoyun Li
2021-12-03 11:38 ` [PATCH v4 1/2] net: add " Xiaoyun Li
2021-12-15 11:33 ` Singh, Aman Deep
2022-01-04 15:18 ` Li, Xiaoyun
2022-01-04 15:40 ` Li, Xiaoyun
2022-01-06 12:56 ` Singh, Aman Deep
2021-12-03 11:38 ` [PATCH v4 2/2] testpmd: fix l4 sw csum over multi segments Xiaoyun Li
2021-12-08 6:10 ` [PATCH v4 0/2] Add functions to calculate UDP/TCP cksum in mbuf Pai G, Sunil
2022-01-06 16:03 ` [PATCH v5 " Xiaoyun Li
2022-01-06 16:03 ` [PATCH v5 1/2] net: add " Xiaoyun Li
2022-01-21 15:16 ` Ferruh Yigit
2022-01-06 16:03 ` [PATCH v5 2/2] testpmd: fix l4 sw csum over multi segments Xiaoyun Li
2022-01-21 15:16 ` Ferruh Yigit [this message]
2022-01-24 9:43 ` Li, Xiaoyun
2022-01-24 10:16 ` Ferruh Yigit
2022-01-21 17:09 ` Kevin Traynor
2022-01-24 9:16 ` Ferruh Yigit
2022-01-24 10:30 ` Kevin Traynor
2022-01-24 11:02 ` Ferruh Yigit
2022-01-24 12:28 ` [PATCH v6 0/2] Add functions to calculate UDP/TCP cksum in mbuf Xiaoyun Li
2022-01-24 12:28 ` [PATCH v6 1/2] net: add " Xiaoyun Li
2022-02-03 12:41 ` Ferruh Yigit
2022-01-24 12:28 ` [PATCH v6 2/2] app/testpmd: enable L4 SW csum over multi segments Xiaoyun Li
2022-02-04 13:12 ` Ferruh Yigit
2022-02-04 13:12 ` [PATCH v6 0/2] Add functions to calculate UDP/TCP cksum in mbuf Ferruh Yigit
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1c366b66-4e1a-94ba-e1af-161a1dded713@intel.com \
--to=ferruh.yigit@intel.com \
--cc=Aman.Deep.Singh@intel.com \
--cc=dev@dpdk.org \
--cc=konstantin.ananyev@intel.com \
--cc=mb@smartsharesystems.com \
--cc=olivier.matz@6wind.com \
--cc=stephen@networkplumber.org \
--cc=sunil.pai.g@intel.com \
--cc=vladimir.medvedkin@intel.com \
--cc=xiaoyun.li@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.