summaryrefslogtreecommitdiffstats
path: root/powerpc-ipv6.patch
diff options
context:
space:
mode:
Diffstat (limited to 'powerpc-ipv6.patch')
-rw-r--r--powerpc-ipv6.patch44
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
+