From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 4EBC141DC7; Fri, 3 Mar 2023 12:17:44 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id E414A40687; Fri, 3 Mar 2023 12:17:43 +0100 (CET) Received: from shelob.oktetlabs.ru (shelob.oktetlabs.ru [91.220.146.113]) by mails.dpdk.org (Postfix) with ESMTP id 8FEEE400D6 for ; Fri, 3 Mar 2023 12:17:42 +0100 (CET) Received: from [192.168.38.32] (finrod.oktetlabs.ru [192.168.38.32]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by shelob.oktetlabs.ru (Postfix) with ESMTPSA id CEABE59; Fri, 3 Mar 2023 14:17:41 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 shelob.oktetlabs.ru CEABE59 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=oktetlabs.ru; s=default; t=1677842261; bh=Ttws5OfadTC0lPoCfFHkHm0yV4EZdH6qa8j3U72+ay4=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=O0tg8V8uNYmPJELNjnB72jq3x9GGic8CKqC6L9Dlr7RV5xGysRw2WDX79u7RNP+xO g4THyuniWb5UFCPBmlUI/TYU11v62onGaF2sfLlyGU+U/wYL4HxZosRTWZXE/ByhQP eqX2kvquFk30BTGzSjYOnGO9/QiV12+2qF9PIPlQ= Message-ID: Date: Fri, 3 Mar 2023 14:17:41 +0300 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.13.0 Subject: Re: [PATCH] net/virtio: deduce IP length for Virtio TSO checksum Content-Language: en-US To: Maxime Coquelin , dev@dpdk.org Cc: Andrew Rybchenko , Chenbo Xia References: <20230216123554.2628837-1-boleslav.stankevich@oktetlabs.ru> <20230216123554.2628837-2-boleslav.stankevich@oktetlabs.ru> <7c0037ad-91b8-4413-8d3a-f0191161c0e1@redhat.com> From: Boleslav Stankevich In-Reply-To: <7c0037ad-91b8-4413-8d3a-f0191161c0e1@redhat.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Hi, Maxime! Yes, it is a fix and will add missing tags in v2. Thanks, Boleslav On 02/03/2023 13:25, Maxime Coquelin wrote: > Hi Boleslav, > > On 2/16/23 13:35, 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. > > My understanding is this is a fix. > If so could you please add the Fixes tag and Cc: stable@dpdk.org? > > Thanks, > Maxime > >> Signed-off-by: Boleslav Stankevich >> Reviewed-by: Andrew Rybchenko >> --- >>   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; >