diff options
Diffstat (limited to 'powerpc-ipv6.patch')
-rw-r--r-- | powerpc-ipv6.patch | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/powerpc-ipv6.patch b/powerpc-ipv6.patch new file mode 100644 index 000000000..44988bd43 --- /dev/null +++ b/powerpc-ipv6.patch @@ -0,0 +1,44 @@ +From 85682a7e3b9c664995ad477520f917039afdc330 Mon Sep 17 00:00:00 2001 +From: Christophe Leroy <christophe.leroy@c-s.fr> +Date: Mon, 10 Sep 2018 06:09:04 +0000 +Subject: powerpc: fix csum_ipv6_magic() on little endian platforms + +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@redhat.com> +Reported-by: Xin Long <lucien.xin@gmail.com> +Cc: <stable@vger.kernel.org> # 4.18+ +Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> +Tested-by: Xin Long <lucien.xin@gmail.com> +Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> +--- + 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..d05c8af4ac51 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) ++#ifdef CONFIG_CPU_LITTLE_ENDIAN ++ rotldi r5, r5, 8 ++#endif + adde r0, r0, r10 + add r5, r5, r7 + adde r0, r0, r11 +-- +cgit 1.2-0.3.lf.el7 + |