> -----Original Message----- > From: Morten Brørup <m...@smartsharesystems.com> > Sent: den 17 juni 2022 11:07 > To: Emil Berg <emil.b...@ericsson.com> > Cc: sta...@dpdk.org; bugzi...@dpdk.org; hof...@lysator.liu.se; > olivier.m...@6wind.com; dev@dpdk.org > Subject: RE: [PATCH] net: fix checksum with unaligned buffer > > > From: Morten Brørup [mailto:m...@smartsharesystems.com] > > Sent: Friday, 17 June 2022 10.45 > > > > With this patch, the checksum can be calculated on an unligned part of > > a packet buffer. > > I.e. the buf parameter is no longer required to be 16 bit aligned. > > > > The DPDK invariant that packet buffers must be 16 bit aligned remains > > unchanged. > > This invariant also defines how to calculate the 16 bit checksum on an > > unaligned part of a packet buffer. > > > > Bugzilla ID: 1035 > > Cc: sta...@dpdk.org > > > > Signed-off-by: Morten Brørup <m...@smartsharesystems.com> > > --- > > lib/net/rte_ip.h | 17 +++++++++++++++-- > > 1 file changed, 15 insertions(+), 2 deletions(-) > > > > diff --git a/lib/net/rte_ip.h b/lib/net/rte_ip.h index > > b502481670..8e301d9c26 100644 > > --- a/lib/net/rte_ip.h > > +++ b/lib/net/rte_ip.h > > @@ -162,9 +162,22 @@ __rte_raw_cksum(const void *buf, size_t len, > > uint32_t sum) { > > /* extend strict-aliasing rules */ > > typedef uint16_t __attribute__((__may_alias__)) u16_p; > > - const u16_p *u16_buf = (const u16_p *)buf; > > - const u16_p *end = u16_buf + len / sizeof(*u16_buf); > > + const u16_p *u16_buf; > > + const u16_p *end; > > + > > + /* if buffer is unaligned, keeping it byte order independent */ > > + if (unlikely((uintptr_t)buf & 1)) { > > + uint16_t first = 0; > > + if (unlikely(len == 0)) > > + return 0; > > + ((unsigned char *)&first)[1] = *(const unsigned > char *)buf; > > + sum += first; > > + buf = (const void *)((uintptr_t)buf + 1); > > + len--; > > + } > > > > + u16_buf = (const u16_p *)buf; > > + end = u16_buf + len / sizeof(*u16_buf); > > for (; u16_buf != end; ++u16_buf) > > sum += *u16_buf; > > > > -- > > 2.17.1 > > @Emil, can you please test this patch with an unaligned buffer on your > application to confirm that it produces the expected result.
All right. I'll test, perhaps on Monday.