[PATCH dpdk v5 01/17] net: split raw checksum functions in separate header
Robin Jarry
rjarry at redhat.com
Fri Oct 18 16:05:37 CEST 2024
The checksum functions are used by both ipv4 and ipv6 functions. In
preparation of moving ipv6 symbols to a new header, move the checksum
related symbols to another dedicated header.
Update doxygen index accordingly.
Signed-off-by: Robin Jarry <rjarry at redhat.com>
Acked-by: Stephen Hemminger <stephen at networkplumber.org>
---
doc/api/doxy-api-index.md | 1 +
lib/net/meson.build | 1 +
lib/net/rte_cksum.h | 180 ++++++++++++++++++++++++++++++++++++++
lib/net/rte_ip.h | 148 +------------------------------
4 files changed, 183 insertions(+), 147 deletions(-)
create mode 100644 lib/net/rte_cksum.h
diff --git a/doc/api/doxy-api-index.md b/doc/api/doxy-api-index.md
index 27e66d1406c8..8b83af53a863 100644
--- a/doc/api/doxy-api-index.md
+++ b/doc/api/doxy-api-index.md
@@ -221,6 +221,7 @@ The public API headers are grouped by topics:
[bitops](@ref rte_bitops.h),
[approx fraction](@ref rte_approx.h),
[random](@ref rte_random.h),
+ [checksum](@ref rte_cksum.h),
[config file](@ref rte_cfgfile.h),
[key/value args](@ref rte_kvargs.h),
[argument parsing](@ref rte_argparse.h),
diff --git a/lib/net/meson.build b/lib/net/meson.build
index 06da7338ba97..ac76acd6a934 100644
--- a/lib/net/meson.build
+++ b/lib/net/meson.build
@@ -2,6 +2,7 @@
# Copyright(c) 2017-2020 Intel Corporation
headers = files(
+ 'rte_cksum.h',
'rte_ip.h',
'rte_tcp.h',
'rte_udp.h',
diff --git a/lib/net/rte_cksum.h b/lib/net/rte_cksum.h
new file mode 100644
index 000000000000..a8e8927952df
--- /dev/null
+++ b/lib/net/rte_cksum.h
@@ -0,0 +1,180 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 1982, 1986, 1990, 1993
+ * The Regents of the University of California.
+ * Copyright(c) 2010-2014 Intel Corporation.
+ * Copyright(c) 2014 6WIND S.A.
+ * All rights reserved.
+ */
+
+#ifndef _RTE_CKSUM_H_
+#define _RTE_CKSUM_H_
+
+/**
+ * @file
+ *
+ * Protocol independent checksum utilities.
+ */
+
+#include <stdint.h>
+
+#include <rte_byteorder.h>
+#include <rte_common.h>
+#include <rte_mbuf.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * @internal Calculate a sum of all words in the buffer.
+ * Helper routine for the rte_raw_cksum().
+ *
+ * @param buf
+ * Pointer to the buffer.
+ * @param len
+ * Length of the buffer.
+ * @param sum
+ * Initial value of the sum.
+ * @return
+ * sum += Sum of all words in the buffer.
+ */
+static inline uint32_t
+__rte_raw_cksum(const void *buf, size_t len, uint32_t sum)
+{
+ const void *end;
+
+ for (end = RTE_PTR_ADD(buf, RTE_ALIGN_FLOOR(len, sizeof(uint16_t)));
+ buf != end; buf = RTE_PTR_ADD(buf, sizeof(uint16_t))) {
+ uint16_t v;
+
+ memcpy(&v, buf, sizeof(uint16_t));
+ sum += v;
+ }
+
+ /* if length is odd, keeping it byte order independent */
+ if (unlikely(len % 2)) {
+ uint16_t left = 0;
+
+ memcpy(&left, end, 1);
+ sum += left;
+ }
+
+ return sum;
+}
+
+/**
+ * @internal Reduce a sum to the non-complemented checksum.
+ * Helper routine for the rte_raw_cksum().
+ *
+ * @param sum
+ * Value of the sum.
+ * @return
+ * The non-complemented checksum.
+ */
+static inline uint16_t
+__rte_raw_cksum_reduce(uint32_t sum)
+{
+ sum = ((sum & 0xffff0000) >> 16) + (sum & 0xffff);
+ sum = ((sum & 0xffff0000) >> 16) + (sum & 0xffff);
+ return (uint16_t)sum;
+}
+
+/**
+ * Process the non-complemented checksum of a buffer.
+ *
+ * @param buf
+ * Pointer to the buffer.
+ * @param len
+ * Length of the buffer.
+ * @return
+ * The non-complemented checksum.
+ */
+static inline uint16_t
+rte_raw_cksum(const void *buf, size_t len)
+{
+ uint32_t sum;
+
+ sum = __rte_raw_cksum(buf, len, 0);
+ return __rte_raw_cksum_reduce(sum);
+}
+
+/**
+ * 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 checksum.
+ * @param cksum
+ * A pointer to the checksum, filled on success.
+ * @return
+ * 0 on success, -1 on error (bad length or offset).
+ */
+static inline int
+rte_raw_cksum_mbuf(const struct rte_mbuf *m, uint32_t off, uint32_t len,
+ uint16_t *cksum)
+{
+ 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)) {
+ *cksum = rte_raw_cksum(rte_pktmbuf_mtod_offset(m,
+ const char *, off), len);
+ return 0;
+ }
+
+ if (unlikely(off + len > rte_pktmbuf_pkt_len(m)))
+ return -1; /* invalid params, return a dummy value */
+
+ /* else browse the segment to find offset */
+ seglen = 0;
+ for (seg = m; seg != NULL; seg = seg->next) {
+ seglen = rte_pktmbuf_data_len(seg);
+ if (off < seglen)
+ break;
+ off -= seglen;
+ }
+ RTE_ASSERT(seg != NULL);
+ if (seg == NULL)
+ return -1;
+ seglen -= off;
+ buf = rte_pktmbuf_mtod_offset(seg, const char *, off);
+ if (seglen >= len) {
+ /* all in one segment */
+ *cksum = rte_raw_cksum(buf, len);
+ return 0;
+ }
+
+ /* hard case: process checksum of several segments */
+ sum = 0;
+ done = 0;
+ for (;;) {
+ tmp = __rte_raw_cksum(buf, seglen, 0);
+ if (done & 1)
+ tmp = rte_bswap16((uint16_t)tmp);
+ sum += tmp;
+ done += seglen;
+ if (done == len)
+ break;
+ seg = seg->next;
+ buf = rte_pktmbuf_mtod(seg, const char *);
+ seglen = rte_pktmbuf_data_len(seg);
+ if (seglen > len - done)
+ seglen = len - done;
+ }
+
+ *cksum = __rte_raw_cksum_reduce(sum);
+ return 0;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RTE_CKSUM_H_ */
diff --git a/lib/net/rte_ip.h b/lib/net/rte_ip.h
index 0d103d4127e8..5cfe51955bcd 100644
--- a/lib/net/rte_ip.h
+++ b/lib/net/rte_ip.h
@@ -29,6 +29,7 @@
#endif
#include <rte_byteorder.h>
+#include <rte_cksum.h>
#include <rte_mbuf.h>
#ifdef __cplusplus
@@ -144,153 +145,6 @@ rte_ipv4_hdr_len(const struct rte_ipv4_hdr *ipv4_hdr)
RTE_IPV4_IHL_MULTIPLIER);
}
-/**
- * @internal Calculate a sum of all words in the buffer.
- * Helper routine for the rte_raw_cksum().
- *
- * @param buf
- * Pointer to the buffer.
- * @param len
- * Length of the buffer.
- * @param sum
- * Initial value of the sum.
- * @return
- * sum += Sum of all words in the buffer.
- */
-static inline uint32_t
-__rte_raw_cksum(const void *buf, size_t len, uint32_t sum)
-{
- const void *end;
-
- for (end = RTE_PTR_ADD(buf, RTE_ALIGN_FLOOR(len, sizeof(uint16_t)));
- buf != end; buf = RTE_PTR_ADD(buf, sizeof(uint16_t))) {
- uint16_t v;
-
- memcpy(&v, buf, sizeof(uint16_t));
- sum += v;
- }
-
- /* if length is odd, keeping it byte order independent */
- if (unlikely(len % 2)) {
- uint16_t left = 0;
-
- memcpy(&left, end, 1);
- sum += left;
- }
-
- return sum;
-}
-
-/**
- * @internal Reduce a sum to the non-complemented checksum.
- * Helper routine for the rte_raw_cksum().
- *
- * @param sum
- * Value of the sum.
- * @return
- * The non-complemented checksum.
- */
-static inline uint16_t
-__rte_raw_cksum_reduce(uint32_t sum)
-{
- sum = ((sum & 0xffff0000) >> 16) + (sum & 0xffff);
- sum = ((sum & 0xffff0000) >> 16) + (sum & 0xffff);
- return (uint16_t)sum;
-}
-
-/**
- * Process the non-complemented checksum of a buffer.
- *
- * @param buf
- * Pointer to the buffer.
- * @param len
- * Length of the buffer.
- * @return
- * The non-complemented checksum.
- */
-static inline uint16_t
-rte_raw_cksum(const void *buf, size_t len)
-{
- uint32_t sum;
-
- sum = __rte_raw_cksum(buf, len, 0);
- return __rte_raw_cksum_reduce(sum);
-}
-
-/**
- * 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 checksum.
- * @param cksum
- * A pointer to the checksum, filled on success.
- * @return
- * 0 on success, -1 on error (bad length or offset).
- */
-static inline int
-rte_raw_cksum_mbuf(const struct rte_mbuf *m, uint32_t off, uint32_t len,
- uint16_t *cksum)
-{
- 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)) {
- *cksum = rte_raw_cksum(rte_pktmbuf_mtod_offset(m,
- const char *, off), len);
- return 0;
- }
-
- if (unlikely(off + len > rte_pktmbuf_pkt_len(m)))
- return -1; /* invalid params, return a dummy value */
-
- /* else browse the segment to find offset */
- seglen = 0;
- for (seg = m; seg != NULL; seg = seg->next) {
- seglen = rte_pktmbuf_data_len(seg);
- if (off < seglen)
- break;
- off -= seglen;
- }
- RTE_ASSERT(seg != NULL);
- if (seg == NULL)
- return -1;
- seglen -= off;
- buf = rte_pktmbuf_mtod_offset(seg, const char *, off);
- if (seglen >= len) {
- /* all in one segment */
- *cksum = rte_raw_cksum(buf, len);
- return 0;
- }
-
- /* hard case: process checksum of several segments */
- sum = 0;
- done = 0;
- for (;;) {
- tmp = __rte_raw_cksum(buf, seglen, 0);
- if (done & 1)
- tmp = rte_bswap16((uint16_t)tmp);
- sum += tmp;
- done += seglen;
- if (done == len)
- break;
- seg = seg->next;
- buf = rte_pktmbuf_mtod(seg, const char *);
- seglen = rte_pktmbuf_data_len(seg);
- if (seglen > len - done)
- seglen = len - done;
- }
-
- *cksum = __rte_raw_cksum_reduce(sum);
- return 0;
-}
-
/**
* Process the IPv4 checksum of an IPv4 header.
*
--
2.47.0
More information about the dev
mailing list