From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <olivier.matz@6wind.com>
Received: from proxy.6wind.com (host.76.145.23.62.rev.coltfrance.com
 [62.23.145.76]) by dpdk.org (Postfix) with ESMTP id 6417058C5
 for <dev@dpdk.org>; Thu, 13 Oct 2016 16:02:54 +0200 (CEST)
Received: from [10.16.0.195] (unknown [10.16.0.195])
 by proxy.6wind.com (Postfix) with ESMTP id BF1A22018B;
 Thu, 13 Oct 2016 16:02:51 +0200 (CEST)
To: Yuanhan Liu <yuanhan.liu@linux.intel.com>
References: <1475485223-30566-1-git-send-email-olivier.matz@6wind.com>
 <1475485223-30566-13-git-send-email-olivier.matz@6wind.com>
 <20161013081839.GT16751@yliu-dev.sh.intel.com>
Cc: dev@dpdk.org, konstantin.ananyev@intel.com, sugesh.chandran@intel.com,
 bruce.richardson@intel.com, jianfeng.tan@intel.com, helin.zhang@intel.com,
 adrien.mazarguil@6wind.com, stephen@networkplumber.org, dprovan@bivio.net,
 xiao.w.wang@intel.com
From: Olivier MATZ <olivier.matz@6wind.com>
Message-ID: <57FF9409.2090205@6wind.com>
Date: Thu, 13 Oct 2016 16:02:49 +0200
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101
 Icedove/38.6.0
MIME-Version: 1.0
In-Reply-To: <20161013081839.GT16751@yliu-dev.sh.intel.com>
Content-Type: text/plain; charset=windows-1252; format=flowed
Content-Transfer-Encoding: 7bit
Subject: Re: [dpdk-dev] [PATCH v2 12/12] virtio: add Tso support
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: patches and discussions about DPDK <dev.dpdk.org>
List-Unsubscribe: <http://dpdk.org/ml/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://dpdk.org/ml/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <http://dpdk.org/ml/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
X-List-Received-Date: Thu, 13 Oct 2016 14:02:54 -0000



On 10/13/2016 10:18 AM, Yuanhan Liu wrote:
> On Mon, Oct 03, 2016 at 11:00:23AM +0200, Olivier Matz wrote:
>> +/* When doing TSO, the IP length is not included in the pseudo header
>> + * checksum of the packet given to the PMD, but for virtio it is
>> + * expected.
>> + */
>> +static void
>> +virtio_tso_fix_cksum(struct rte_mbuf *m)
>> +{
>> +	/* common case: header is not fragmented */
>> +	if (likely(rte_pktmbuf_data_len(m) >= m->l2_len + m->l3_len +
>> +			m->l4_len)) {
> ...
>> +		/* replace it in the packet */
>> +		th->cksum = new_cksum;
>> +	} else {
> ...
>> +		/* replace it in the packet */
>> +		*rte_pktmbuf_mtod_offset(m, uint8_t *,
>> +			m->l2_len + m->l3_len + 16) = new_cksum.u8[0];
>> +		*rte_pktmbuf_mtod_offset(m, uint8_t *,
>> +			m->l2_len + m->l3_len + 17) = new_cksum.u8[1];
>> +	}
>
> The tcp header will always be in the mbuf, right? Otherwise, you can't
> update the cksum field here. What's the point of introducing the "else
> clause" then?

Sorry, I don't see the problem you're pointing out here.

What I want to solve here is to support the cases where the mbuf is 
segmented in the middle of the network header (which is probably a rare 
case).

In the "else" part, I only access the mbuf byte by byte using the 
rte_pktmbuf_mtod_offset() accessor. An alternative would have been to 
copy the header in a linear buffer, fix the checksum, then copy it again 
in the packet, but there is no mbuf helpers to do these copies for now.

Regards,
Olivier