Acked-by: Jarno Rajahalme <ja...@ovn.org>

> On Dec 8, 2016, at 6:50 PM, Daniele Di Proietto <diproiet...@vmware.com> 
> wrote:
> 
> Even though it reads 16 bits at a time, csum_continue() is almost
> neutral to endianness (see RFC 1071 1.2 (B), "Byte Order Independence").
> 
> Consider a buffer like the following:
> 
> 00000000: XX YY XX YY XX YY XX YY ZZ
> 
> Each couple of bytes is interpreted on little endian as:
> 
> *data = 0xYYXX
> 
> while on big endian
> 
> *data = 0xXXYY
> 
> The last byte "ZZ" should be treated as the two bytes "ZZ 00"
> little endian:
> 
> *data = 0x00ZZ
> 
> big endian:
> 
> *data = 0xZZ00
> 
> which means that the last byte (for odd buffers) should be left shifted
> by 8 bits on big endian platforms.
> 
> This fixes a couple of connection tracking tests in userspace for big
> endian platforms.
> 
> I guess RFC1071 4.1 (implementation example of the checksum in C), would
> manifest the same problem on big endian.
> 
> Reported-at: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=840770
> Signed-off-by: Daniele Di Proietto <diproiet...@vmware.com>
> ---
> lib/csum.c | 4 ++++
> 1 file changed, 4 insertions(+)
> 
> diff --git a/lib/csum.c b/lib/csum.c
> index a0e9967..5951576 100644
> --- a/lib/csum.c
> +++ b/lib/csum.c
> @@ -44,7 +44,11 @@ csum_continue(uint32_t partial, const void *data_, size_t 
> n)
>         partial = csum_add16(partial, get_unaligned_be16(data));
>     }
>     if (n) {
> +#ifdef WORDS_BIGENDIAN
> +        partial += (*(uint8_t *) data) << 8;
> +#else
>         partial += *(uint8_t *) data;
> +#endif
>     }
>     return partial;
> }
> -- 
> 2.10.2
> 
> _______________________________________________
> dev mailing list
> d...@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to