[dpdk-dev] [PATCH v2 04/12] net: add function to calculate a checksum in a mbuf

Maxime Coquelin maxime.coquelin at redhat.com
Tue Oct 11 15:25:34 CEST 2016



On 10/03/2016 11:00 AM, Olivier Matz wrote:
> This function can be used to calculate the checksum of data embedded in
> mbuf, that can be composed of several segments.
>
> This function will be used by the virtio pmd in next commits to calculate
> the checksum in software in case the protocol is not recognized.
>
> Signed-off-by: Olivier Matz <olivier.matz at 6wind.com>
> ---
>  doc/guides/rel_notes/release_16_11.rst |  5 +++
>  lib/librte_net/rte_ip.h                | 60 ++++++++++++++++++++++++++++++++++
>  2 files changed, 65 insertions(+)
>
> diff --git a/doc/guides/rel_notes/release_16_11.rst b/doc/guides/rel_notes/release_16_11.rst
> index 3d3c417..f29b44c 100644
> --- a/doc/guides/rel_notes/release_16_11.rst
> +++ b/doc/guides/rel_notes/release_16_11.rst
> @@ -55,6 +55,11 @@ New Features
>    Added two new functions ``rte_get_rx_ol_flag_list()`` and
>    ``rte_get_tx_ol_flag_list()`` to dump offload flags as a string.
>
> +* **Added a functions to calculate the checksum of data in a mbuf.**
> +
> +  Added a new function ``rte_raw_cksum_mbuf()`` to process the checksum of
> +  data embedded in an mbuf chain.
> +
>  Resolved Issues
>  ---------------
>
> diff --git a/lib/librte_net/rte_ip.h b/lib/librte_net/rte_ip.h
> index 5b7554a..8499356 100644
> --- a/lib/librte_net/rte_ip.h
> +++ b/lib/librte_net/rte_ip.h
> @@ -230,6 +230,66 @@ rte_raw_cksum(const void *buf, size_t len)
>  }
>
>  /**
> + * Compute the raw (non complemented) checksum of a packet.
> + *
> + * @param m
> + *   The pointer to the mbuf.
> + * @param off
> + *   The offset in bytes to start the checksum.
> + * @param len
> + *   The length in bytes of the data to ckecksum.
> + */
> +static inline uint16_t
> +rte_raw_cksum_mbuf(const struct rte_mbuf *m, uint32_t off, uint32_t len)
> +{
> +	const struct rte_mbuf *seg;
> +	const char *buf;
> +	uint32_t sum, tmp;
> +	uint32_t seglen, done;
> +
> +	/* easy case: all data in the first segment */
> +	if (off + len <= rte_pktmbuf_data_len(m))
> +		return rte_raw_cksum(rte_pktmbuf_mtod_offset(m,
> +				const char *, off), len);
> +
> +	if (off + len > rte_pktmbuf_pkt_len(m))
unlikely?
> +		return 0; /* invalid params, return a dummy value */
Couldn't be better to return an error, so that the caller has a chance
to see it is passing wrong arguments?
The csum would be passed as an arg.

Thanks,
Maxime


More information about the dev mailing list