[dpdk-dev] [PATCH v3] app/testpmd: fix IP checksum calculation
George Prekas
prekageo at amazon.com
Thu Jan 7 21:42:28 CET 2021
Strict-aliasing rules are violated by cast to uint16_t* in flowgen.c and
the calculated IP checksum is wrong. Use attribute __may_alias__ to fix
the problem.
Signed-off-by: George Prekas <prekageo at amazon.com>
---
v3:
* Instead of a compiler flag, use a compiler attribute.
v2:
* Instead of a compiler barrier, use a compiler flag.
---
app/test-pmd/flowgen.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/app/test-pmd/flowgen.c b/app/test-pmd/flowgen.c
index acf3e2460..cabfc688f 100644
--- a/app/test-pmd/flowgen.c
+++ b/app/test-pmd/flowgen.c
@@ -53,8 +53,11 @@ static struct rte_ether_addr cfg_ether_dst =
#define IP_DEFTTL 64 /* from RFC 1340. */
+/* Use this type to inform GCC that ip_sum violates aliasing rules. */
+typedef unaligned_uint16_t alias_int16_t __attribute__((__may_alias__));
+
static inline uint16_t
-ip_sum(const unaligned_uint16_t *hdr, int hdr_len)
+ip_sum(const alias_int16_t *hdr, int hdr_len)
{
uint32_t sum = 0;
@@ -150,7 +153,7 @@ pkt_burst_flow_gen(struct fwd_stream *fs)
next_flow);
ip_hdr->total_length = RTE_CPU_TO_BE_16(pkt_size -
sizeof(*eth_hdr));
- ip_hdr->hdr_checksum = ip_sum((unaligned_uint16_t *)ip_hdr,
+ ip_hdr->hdr_checksum = ip_sum((const alias_int16_t *)ip_hdr,
sizeof(*ip_hdr));
/* Initialize UDP header. */
--
2.17.1
More information about the dev
mailing list