[dpdk-dev] [PATCH v2 12/12] virtio: add Tso support

Olivier MATZ olivier.matz at 6wind.com
Thu Oct 13 16:02:49 CEST 2016



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


More information about the dev mailing list