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