[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