[PATCH] powerpc: fix csum_ipv6_magic() on little endian platforms

Subsystems: linux for powerpc (32-bit and 64-bit), the rest

STALE2909d

4 messages, 3 authors, 2018-09-21 · open the first message on its own page

[PATCH] powerpc: fix csum_ipv6_magic() on little endian platforms

From: Christophe Leroy <hidden>
Date: 2018-09-10 06:09:09

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 <redacted>
Reported-by: Xin Long <lucien.xin@gmail.com>
Cc: <redacted> # 4.18+
Signed-off-by: Christophe Leroy <redacted>
---
 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

Re: [PATCH] powerpc: fix csum_ipv6_magic() on little endian platforms

From: Xin Long <lucien.xin@gmail.com>
Date: 2018-09-10 14:28:23

On Mon, Sep 10, 2018 at 2:09 PM Christophe Leroy
[off-list ref] wrote:
quoted hunk
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 <redacted>
Reported-by: Xin Long <lucien.xin@gmail.com>
Cc: <redacted> # 4.18+
Signed-off-by: Christophe Leroy <redacted>
---
 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@gmail.com>

Re: [PATCH] powerpc: fix csum_ipv6_magic() on little endian platforms

From: Christophe LEROY <hidden>
Date: 2018-09-17 12:27:16

Hi Michael,

Le 10/09/2018 à 16:28, Xin Long a écrit :
On Mon, Sep 10, 2018 at 2:09 PM Christophe Leroy
[off-list ref] wrote:
quoted
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 <redacted>
Reported-by: Xin Long <lucien.xin@gmail.com>
Cc: <redacted> # 4.18+
Signed-off-by: Christophe Leroy <redacted>
---
  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@gmail.com>
Could you take this fix for 4.19 ?

Unless someone takes it through the netdev tree ?

Thanks
Christophe

Re: powerpc: fix csum_ipv6_magic() on little endian platforms

From: Michael Ellerman <hidden>
Date: 2018-09-21 11:59:42

On Mon, 2018-09-10 at 06:09:04 UTC, Christophe Leroy 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 <redacted>
Reported-by: Xin Long <lucien.xin@gmail.com>
Cc: <redacted> # 4.18+
Signed-off-by: Christophe Leroy <redacted>
Tested-by: Xin Long <lucien.xin@gmail.com>
Applied to powerpc fixes, thanks.

https://git.kernel.org/powerpc/c/85682a7e3b9c664995ad477520f917

cheers
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help