On Mon, Sep 10, 2018 at 2:09 PM Christophe Leroy <christophe.leroy@xxxxxx> wrote: > > On little endian platforms, csum_ipv6_magic() keeps len and proto in > CPU byte order. This generates a bad results leading to ICMPv6 packets > from other hosts being dropped by powerpc64le platforms. > > In order to fix this, len and proto should be converted to network > byte order ie bigendian byte order. However checksumming 0x12345678 > and 0x56341278 provide the exact same result so it is enough to > rotate the sum of len and proto by 1 byte. > > PPC32 only support bigendian so the fix is needed for PPC64 only > > Fixes: e9c4943a107b ("powerpc: Implement csum_ipv6_magic in assembly") > Reported-by: Jianlin Shi <jishi@xxxxxxxxxx> > Reported-by: Xin Long <lucien.xin@xxxxxxxxx> > Cc: <stable@xxxxxxxxxxxxxxx> # 4.18+ > Signed-off-by: Christophe Leroy <christophe.leroy@xxxxxx> > --- > arch/powerpc/lib/checksum_64.S | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/arch/powerpc/lib/checksum_64.S b/arch/powerpc/lib/checksum_64.S > index 886ed94b9c13..2a68c43e13f5 100644 > --- a/arch/powerpc/lib/checksum_64.S > +++ b/arch/powerpc/lib/checksum_64.S > @@ -443,6 +443,9 @@ _GLOBAL(csum_ipv6_magic) > addc r0, r8, r9 > ld r10, 0(r4) > ld r11, 8(r4) > +#ifndef CONFIG_CPU_BIG_ENDIAN > + rotldi r5, r5, 8 > +#endif > adde r0, r0, r10 > add r5, r5, r7 > adde r0, r0, r11 > -- > 2.13.3 > Tested-by: Xin Long <lucien.xin@xxxxxxxxx>