> From: dev [mailto:[email protected]] On Behalf Of Hongzhi Guo > Sent: Friday, July 10, 2020 1:43 PM > > With current code, the checksum of odd-length buffers is wrong on > big endian CPUs: the last byte is not properly summed to the > accumulator. > > Fix this by left-shifting the remaining byte by 8. For instance, > if the last byte is 0x42, we should add 0x4200 to the accumulator > on big endian CPUs. > > This change is similar to what is suggested in Errata 3133 of > RFC 1071. > > Fixes: 6006818cfb26("net: new checksum functions") > Cc: [email protected] > > Signed-off-by: Hongzhi Guo <[email protected]> > --- > v2: > * Explain the logic in the commit log > * Fixed commit title > --- > --- > lib/librte_net/rte_ip.h | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/lib/librte_net/rte_ip.h b/lib/librte_net/rte_ip.h > index 292f63fd7..4fb0e314a 100644 > --- a/lib/librte_net/rte_ip.h > +++ b/lib/librte_net/rte_ip.h > @@ -139,8 +139,11 @@ __rte_raw_cksum(const void *buf, size_t len, > uint32_t sum) > } > > /* if length is in odd bytes */ > - if (len == 1) > - sum += *((const uint8_t *)u16_buf); > + if (len == 1) { > + uint16_t left = 0; > + *(uint8_t *)&left = *(const uint8_t *)u16_buf; > + sum += left; > + } > > return sum; > } > -- > 2.21.0.windows.1 >
This is correct for both big and little endian CPUs. Reviewed-by: Morten Brørup <[email protected]>

