<div id="editor_version_7.48.0_0Rxwdj61" style="word-break:break-word"><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="ltr" style="direction:ltr;font-size:14px">The rte_raw_cksum_mbuf function is used to compute</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">the raw checksum of a packet.</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">If the packet payload stored in multi mbuf, the function</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">will goto the hard case. In hard case,</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">the variable 'tmp' is a type of uint32_t,</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">so rte_bswap16 will drop high 16 bit.</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">Meanwhile, the variable 'sum' is a type of uint32_t,</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">so 'sum += tmp' will drop the carry when overflow.</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">Both drop will make cksum incorrect.</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">This commit fixes the above bug.</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"><br></div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">Signed-off-by: Su Sai <<a class="not-doclink" href="mailto:susai.ss@bytedance.com" target="_blank" rel="noopener noreferrer" style="text-decoration:none;color:rgb(20,86,240)">susai.ss@bytedance.com</a>></div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">---</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"> .mailmap | 1 +</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"> lib/net/rte_cksum.h | 26 +++++++++++++++++++++++---</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"> 2 files changed, 24 insertions(+), 3 deletions(-)</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"><br></div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">diff --git a/.mailmap b/.mailmap</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">index 34a99f93a1..838b544a97 100644</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">--- a/.mailmap</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">+++ b/.mailmap</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">@@ -1891,3 +1891,4 @@ Zoltan Kiss <<a class="not-doclink" href="mailto:zoltan.kiss@schaman.hu" target="_blank" rel="noopener noreferrer" style="text-decoration:none;color:rgb(20,86,240)">zoltan.kiss@schaman.hu</a>> <<a class="not-doclink" href="mailto:zoltan.kiss@linaro.org" target="_blank" rel="noopener noreferrer" style="text-decoration:none;color:rgb(20,86,240)">zoltan.kiss@linaro.org</a>></div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"> Zorik Machulsky <<a class="not-doclink" href="mailto:zorik@amazon.com" target="_blank" rel="noopener noreferrer" style="text-decoration:none;color:rgb(20,86,240)">zorik@amazon.com</a>></div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"> Zyta Szpak <<a class="not-doclink" href="mailto:zyta@marvell.com" target="_blank" rel="noopener noreferrer" style="text-decoration:none;color:rgb(20,86,240)">zyta@marvell.com</a>> <<a class="not-doclink" href="mailto:zr@semihalf.com" target="_blank" rel="noopener noreferrer" style="text-decoration:none;color:rgb(20,86,240)">zr@semihalf.com</a>></div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"> Zyta Szpak <<a class="not-doclink" href="mailto:zyta@marvell.com" target="_blank" rel="noopener noreferrer" style="text-decoration:none;color:rgb(20,86,240)">zyta@marvell.com</a>> <<a class="not-doclink" href="mailto:zyta.szpak@semihalf.com" target="_blank" rel="noopener noreferrer" style="text-decoration:none;color:rgb(20,86,240)">zyta.szpak@semihalf.com</a>></div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">+Su Sai <<a class="not-doclink" href="mailto:susai.ss@bytedance.com" target="_blank" rel="noopener noreferrer" style="text-decoration:none;color:rgb(20,86,240)">susai.ss@bytedance.com</a>></div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">diff --git a/lib/net/rte_cksum.h b/lib/net/rte_cksum.h</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">index a8e8927952..aa584d5f8d 100644</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">--- a/lib/net/rte_cksum.h</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">+++ b/lib/net/rte_cksum.h</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">@@ -80,6 +80,25 @@ __rte_raw_cksum_reduce(uint32_t sum)</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"> return (uint16_t)sum;</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"> }</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"><span>
</span></div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">+/**</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">+ * @internal Reduce a sum to the non-complemented checksum.</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">+ * Helper routine for the rte_raw_cksum_mbuf().</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">+ *</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">+ * @param sum</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">+ * Value of the sum.</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">+ * @return</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">+ * The non-complemented checksum.</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">+ */</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">+static inline uint16_t</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">+__rte_raw_cksum_reduce_u64(uint64_t sum)</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">+{</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">+ uint32_t tmp;</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">+</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">+ tmp = __rte_raw_cksum_reduce((uint32_t)sum);</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">+ tmp += __rte_raw_cksum_reduce((uint32_t)(sum >> 32));</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">+ return __rte_raw_cksum_reduce(tmp);</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">+}</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">+</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"> /**</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"> * Process the non-complemented checksum of a buffer.</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"> *</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">@@ -119,8 +138,9 @@ rte_raw_cksum_mbuf(const struct rte_mbuf *m, uint32_t off, uint32_t len,</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"> {</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"> const struct rte_mbuf *seg;</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"> const char *buf;</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">- uint32_t sum, tmp;</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">+ uint32_t tmp;</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"> uint32_t seglen, done;</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">+ uint64_t sum;</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"><span>
</span></div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"> /* easy case: all data in the first segment */</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"> if (off + len <= rte_pktmbuf_data_len(m)) {</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">@@ -157,7 +177,7 @@ rte_raw_cksum_mbuf(const struct rte_mbuf *m, uint32_t off, uint32_t len,</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"> for (;;) {</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"> tmp = __rte_raw_cksum(buf, seglen, 0);</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"> if (done & 1)</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">- tmp = rte_bswap16((uint16_t)tmp);</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">+ tmp = rte_bswap32(tmp);</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"> sum += tmp;</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"> done += seglen;</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"> if (done == len)</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">@@ -169,7 +189,7 @@ rte_raw_cksum_mbuf(const struct rte_mbuf *m, uint32_t off, uint32_t len,</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"> seglen = len - done;</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"> }</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"><span>
</span></div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">- *cksum = __rte_raw_cksum_reduce(sum);</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">+ *cksum = __rte_raw_cksum_reduce_u64(sum);</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"> return 0;</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"> }</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"><span>
</span></div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">-- </div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px">2.39.2 (Apple Git-143)</div></div><div style="margin-top:4px;margin-bottom:4px;line-height:1.6"><div dir="auto" style="font-size:14px"><br></div></div></div>