44 lines
1.6 KiB
Diff
44 lines
1.6 KiB
Diff
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
|
|
|