Message ID | 20240229-fix_sparse_errors_checksum_tests-v11-1-f608d9ec7574@rivosinc.com (mailing list archive) |
---|---|
State | Accepted, archived |
Headers | show |
Series | [v11] lib: checksum: Use aligned accesses for ip_fast_csum and csum_ipv6_magic tests | expand |
+CC netdev ARM Russell Le 29/02/2024 à 23:46, Charlie Jenkins a écrit : > The test cases for ip_fast_csum and csum_ipv6_magic were not properly > aligning the IP header, which were causing failures on architectures > that do not support misaligned accesses like some ARM platforms. To > solve this, align the data along (14 + NET_IP_ALIGN) bytes which is the > standard alignment of an IP header and must be supported by the > architecture. In your description, please provide more details on platforms that have a problem, what the problem is exactly (Failed calculation, slowliness, kernel Oops, panic, ....) on each platform. And please copy maintainers and lists of platforms your are specifically addressing with this change. And as this is network related, netdev list should have been copied as well. I still think that your patch is not the good approach, it looks like you are ignoring all the discussion. Below is a quote of what Geert said and I fully agree with that: IMHO the tests should validate the expected functionality. If a test fails, either functionality is missing or behaves wrong, or the test is wrong. What is the point of writing tests for a core functionality like network checksumming that do not match the expected functionality? So we all agree that there is something to fix, because today's test does odd-address accesses which is unexpected for those functions, but 2-byte alignments should be supported hence tested by the test. Limiting the test to a 16-bytes alignment deeply reduces the usefullness of the test. Christophe
On Fri, Mar 01, 2024 at 07:17:38AM +0000, Christophe Leroy wrote: > +CC netdev ARM Russell > > Le 29/02/2024 à 23:46, Charlie Jenkins a écrit : > > The test cases for ip_fast_csum and csum_ipv6_magic were not properly > > aligning the IP header, which were causing failures on architectures > > that do not support misaligned accesses like some ARM platforms. To > > solve this, align the data along (14 + NET_IP_ALIGN) bytes which is the > > standard alignment of an IP header and must be supported by the > > architecture. > > In your description, please provide more details on platforms that have > a problem, what the problem is exactly (Failed calculation, slowliness, > kernel Oops, panic, ....) on each platform. > > And please copy maintainers and lists of platforms your are specifically > addressing with this change. And as this is network related, netdev list > should have been copied as well. > > I still think that your patch is not the good approach, it looks like > you are ignoring all the discussion. Below is a quote of what Geert said > and I fully agree with that: > > IMHO the tests should validate the expected functionality. If a test > fails, either functionality is missing or behaves wrong, or the test > is wrong. > > What is the point of writing tests for a core functionality like network > checksumming that do not match the expected functionality? > > > So we all agree that there is something to fix, because today's test > does odd-address accesses which is unexpected for those functions, but > 2-byte alignments should be supported hence tested by the test. Limiting > the test to a 16-bytes alignment deeply reduces the usefullness of the test. > Maybe I am lost in the conversations. This isn't limited to 16-bytes alignment? It aligns along 14 + NET_IP_ALIGN. That is 16 on some platforms and 14 on platforms where unaligned accesses are desired. These functions are expected to be called with this offset. Testing with any other alignment is not the expected behavior. These tests are testing the expected functionality. - Charlie > Christophe
From: Charlie Jenkins > Sent: 01 March 2024 17:09 > > On Fri, Mar 01, 2024 at 07:17:38AM +0000, Christophe Leroy wrote: > > +CC netdev ARM Russell > > > > Le 29/02/2024 à 23:46, Charlie Jenkins a écrit : > > > The test cases for ip_fast_csum and csum_ipv6_magic were not properly > > > aligning the IP header, which were causing failures on architectures > > > that do not support misaligned accesses like some ARM platforms. To > > > solve this, align the data along (14 + NET_IP_ALIGN) bytes which is the > > > standard alignment of an IP header and must be supported by the > > > architecture. > > > > In your description, please provide more details on platforms that have > > a problem, what the problem is exactly (Failed calculation, slowliness, > > kernel Oops, panic, ....) on each platform. > > > > And please copy maintainers and lists of platforms your are specifically > > addressing with this change. And as this is network related, netdev list > > should have been copied as well. > > > > I still think that your patch is not the good approach, it looks like > > you are ignoring all the discussion. Below is a quote of what Geert said > > and I fully agree with that: > > > > IMHO the tests should validate the expected functionality. If a test > > fails, either functionality is missing or behaves wrong, or the test > > is wrong. > > > > What is the point of writing tests for a core functionality like network > > checksumming that do not match the expected functionality? > > > > > > So we all agree that there is something to fix, because today's test > > does odd-address accesses which is unexpected for those functions, but > > 2-byte alignments should be supported hence tested by the test. Limiting > > the test to a 16-bytes alignment deeply reduces the usefullness of the test. > > > > Maybe I am lost in the conversations. This isn't limited to 16-bytes > alignment? It aligns along 14 + NET_IP_ALIGN. That is 16 on some > platforms and 14 on platforms where unaligned accesses are desired. > These functions are expected to be called with this offset. Testing with > any other alignment is not the expected behavior. These tests are > testing the expected functionality. Aligned received frames can have a 4 byte VLAN header (or two) removed. So the alignment of the IP header is either 4n or 4n+2. If the cpu fault misaligned accesses you really want the alignment to be 4n. You pretty much never want to trap and fixup a misaligned access. Especially in the network stack. I suspect it is better to do a realignment copy of the entire frame. At some point the data will be copied again, although you may want a CBU (crystal ball unit) to decide whether to align on an 8n or 8n+4 boundary to optimise a later copy. CPU that support misaligned transfers just make coders sloppy :-) David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)
On Fri, Mar 01, 2024 at 05:24:39PM +0000, David Laight wrote: > From: Charlie Jenkins > > Sent: 01 March 2024 17:09 > > > > On Fri, Mar 01, 2024 at 07:17:38AM +0000, Christophe Leroy wrote: > > > +CC netdev ARM Russell > > > > > > Le 29/02/2024 à 23:46, Charlie Jenkins a écrit : > > > > The test cases for ip_fast_csum and csum_ipv6_magic were not properly > > > > aligning the IP header, which were causing failures on architectures > > > > that do not support misaligned accesses like some ARM platforms. To > > > > solve this, align the data along (14 + NET_IP_ALIGN) bytes which is the > > > > standard alignment of an IP header and must be supported by the > > > > architecture. > > > > > > In your description, please provide more details on platforms that have > > > a problem, what the problem is exactly (Failed calculation, slowliness, > > > kernel Oops, panic, ....) on each platform. > > > > > > And please copy maintainers and lists of platforms your are specifically > > > addressing with this change. And as this is network related, netdev list > > > should have been copied as well. > > > > > > I still think that your patch is not the good approach, it looks like > > > you are ignoring all the discussion. Below is a quote of what Geert said > > > and I fully agree with that: > > > > > > IMHO the tests should validate the expected functionality. If a test > > > fails, either functionality is missing or behaves wrong, or the test > > > is wrong. > > > > > > What is the point of writing tests for a core functionality like network > > > checksumming that do not match the expected functionality? > > > > > > > > > So we all agree that there is something to fix, because today's test > > > does odd-address accesses which is unexpected for those functions, but > > > 2-byte alignments should be supported hence tested by the test. Limiting > > > the test to a 16-bytes alignment deeply reduces the usefullness of the test. > > > > > > > Maybe I am lost in the conversations. This isn't limited to 16-bytes > > alignment? It aligns along 14 + NET_IP_ALIGN. That is 16 on some > > platforms and 14 on platforms where unaligned accesses are desired. > > These functions are expected to be called with this offset. Testing with > > any other alignment is not the expected behavior. These tests are > > testing the expected functionality. > > Aligned received frames can have a 4 byte VLAN header (or two) removed. > So the alignment of the IP header is either 4n or 4n+2. > If the cpu fault misaligned accesses you really want the alignment > to be 4n. > > You pretty much never want to trap and fixup a misaligned access. > Especially in the network stack. > I suspect it is better to do a realignment copy of the entire frame. > At some point the data will be copied again, although you may want > a CBU (crystal ball unit) to decide whether to align on an 8n > or 8n+4 boundary to optimise a later copy. > > CPU that support misaligned transfers just make coders sloppy :-) > > David > > - > Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK > Registration No: 1397386 (Wales) > Can you elaborate on how exactly you suggest the tests to be changed to accomidate what you are saying here? I don't understand how what I have proposed doesn't represent the use case of these functions. - Charlie
On 2/29/24 14:46, Charlie Jenkins wrote: > The test cases for ip_fast_csum and csum_ipv6_magic were not properly > aligning the IP header, which were causing failures on architectures > that do not support misaligned accesses like some ARM platforms. To > solve this, align the data along (14 + NET_IP_ALIGN) bytes which is the > standard alignment of an IP header and must be supported by the > architecture. > > Furthermore, all architectures except the m68k pad "struct > csum_ipv6_magic_data" to 44 bytes. To make compatible with the m68k, > manually pad this structure to 44 bytes. > > Fixes: 6f4c45cbcb00 ("kunit: Add tests for csum_ipv6_magic and ip_fast_csum") > Signed-off-by: Charlie Jenkins <charlie@rivosinc.com> > Reviewed-by: Guenter Roeck <linux@roeck-us.net> > Acked-by: Palmer Dabbelt <palmer@rivosinc.com> > --- > The ip_fast_csum and csum_ipv6_magic tests did not work on all > architectures due to differences in misaligned access support. > Fix those issues by changing endianness of data and aligning the data. > > This patch relies upon a patch from Christophe: > > [PATCH net] kunit: Fix again checksum tests on big endian CPUs > Various test results: On v6.8-rc6-120-g87adedeba51a (current mainline), without this patch - mps2-an385:mps2_defconfig crashes in IPv6 checksum tests - ipv6 checksum tests fail on parisc, parisc64, sh, and sheb. The previously seen problems on big endian systems are still seen with v6.8-rc6, but are gone after commit 3d6423ef8d51 ("kunit: Fix again checksum tests on big endian CPUs") has been applied upstream. This includes the test failures seen with m68k. The parisc/parisc64 test failures are independent of this patch. Fixes are available in linux-next and pending in qemu. The sh/sheb failures are due to upstream commit cadc4e1a2b4 and are no longer seen after reverting that patch. This leaves the mps2-an385:mps2_defconfig crash, which is avoided by this patch. My understanding, which may be wrong, is that arm images with thumb instructions do not support unaligned accesses (maybe I should say do not support unaligned accesses with the mps2-an385 qemu emulation; I did not test with real hardware, after all). Given all that, the continued discussion around the subject, and the lack of agreement if unaligned accesses should be tested or not, I don't really see a path forward for this patch. The remaining known problem is arm with thumb instructions. I don't think that is going to be fixed. I suspect that no one but me even tries to run that code (or any arm:nommu images, for that matter). I'd suggest to drop this patch, and I'll stop testing IP checksum generation for mps2-an385:mps2_defconfig. Sorry for all the noise this has generated. Thanks, Guenter
On Fri, Mar 01, 2024 at 10:32:36AM -0800, Guenter Roeck wrote: > On 2/29/24 14:46, Charlie Jenkins wrote: > > The test cases for ip_fast_csum and csum_ipv6_magic were not properly > > aligning the IP header, which were causing failures on architectures > > that do not support misaligned accesses like some ARM platforms. To > > solve this, align the data along (14 + NET_IP_ALIGN) bytes which is the > > standard alignment of an IP header and must be supported by the > > architecture. > > > > Furthermore, all architectures except the m68k pad "struct > > csum_ipv6_magic_data" to 44 bytes. To make compatible with the m68k, > > manually pad this structure to 44 bytes. > > > > Fixes: 6f4c45cbcb00 ("kunit: Add tests for csum_ipv6_magic and ip_fast_csum") > > Signed-off-by: Charlie Jenkins <charlie@rivosinc.com> > > Reviewed-by: Guenter Roeck <linux@roeck-us.net> > > Acked-by: Palmer Dabbelt <palmer@rivosinc.com> > > --- > > The ip_fast_csum and csum_ipv6_magic tests did not work on all > > architectures due to differences in misaligned access support. > > Fix those issues by changing endianness of data and aligning the data. > > > > This patch relies upon a patch from Christophe: > > > > [PATCH net] kunit: Fix again checksum tests on big endian CPUs > > > > Various test results: > > On v6.8-rc6-120-g87adedeba51a (current mainline), without this patch > > - mps2-an385:mps2_defconfig crashes in IPv6 checksum tests > - ipv6 checksum tests fail on parisc, parisc64, sh, and sheb. > > The previously seen problems on big endian systems are still seen with > v6.8-rc6, but are gone after commit 3d6423ef8d51 ("kunit: Fix again > checksum tests on big endian CPUs") has been applied upstream. This includes > the test failures seen with m68k. > > The parisc/parisc64 test failures are independent of this patch. Fixes are > available in linux-next and pending in qemu. The sh/sheb failures are due > to upstream commit cadc4e1a2b4 and are no longer seen after reverting that > patch. > > This leaves the mps2-an385:mps2_defconfig crash, which is avoided by this patch. > My understanding, which may be wrong, is that arm images with thumb instructions > do not support unaligned accesses (maybe I should say do not support unaligned > accesses with the mps2-an385 qemu emulation; I did not test with real hardware, > after all). > > Given all that, the continued discussion around the subject, and the lack > of agreement if unaligned accesses should be tested or not, I don't really > see a path forward for this patch. The remaining known problem is arm with > thumb instructions. I don't think that is going to be fixed. I suspect that > no one but me even tries to run that code (or any arm:nommu images, for that > matter). I'd suggest to drop this patch, and I'll stop testing IP checksum > generation for mps2-an385:mps2_defconfig. > > Sorry for all the noise this has generated. > > Thanks, > Guenter If that's what people want. I still don't understand why there is any problem with relying on NET_IP_ALIGN as that seems like that macro was defined to create an expected alignment. It would be nice to use the struct csum_ipv6_magic_data instead of doing manual alignment and restricting len to 16 bits. I can send a patch that only covers that if people are interested. This was my first foray into writing generic test cases and it drew a significant amount of criticism. I appreciate Guenter's efforts to make the tests have more expected behavior across all supported platforms, but the community obviously doesn't agree that is a reasonable goal. Makes my life easier though, because then I can just not upstream test cases and focus on feature work... - Charlie >
Le 01/03/2024 à 19:32, Guenter Roeck a écrit : > This leaves the mps2-an385:mps2_defconfig crash, which is avoided by > this patch. > My understanding, which may be wrong, is that arm images with thumb > instructions > do not support unaligned accesses (maybe I should say do not support > unaligned > accesses with the mps2-an385 qemu emulation; I did not test with real > hardware, > after all). > > Given all that, the continued discussion around the subject, and the lack > of agreement if unaligned accesses should be tested or not, I don't really > see a path forward for this patch. The remaining known problem is arm with > thumb instructions. I don't think that is going to be fixed. I suspect that > no one but me even tries to run that code (or any arm:nommu images, for > that > matter). I'd suggest to drop this patch, and I'll stop testing IP checksum > generation for mps2-an385:mps2_defconfig. I'm trying to run an ARM kernel built with GCC 13.2 and mps2_defconfig on the mps2-an385 qemu emulation, and I get the following fatal error. $ qemu-system-arm -M mps2-an385 -kernel vmlinux qemu: fatal: Lockup: can't escalate 3 to HardFault (current priority -1) R00=00000000 R01=00000000 R02=00000000 R03=00000000 R04=00000000 R05=00000000 R06=00000000 R07=00000000 R08=00000000 R09=00000000 R10=00000000 R11=00000000 R12=00000000 R13=ffffffe0 R14=fffffff9 R15=00000000 XPSR=40000003 -Z-- A handler FPSCR: 00000000 Abandon (core dumped) Can you tell how to proceed ? Thanks Christophe
On 3/3/24 02:20, Christophe Leroy wrote: > > > Le 01/03/2024 à 19:32, Guenter Roeck a écrit : >> This leaves the mps2-an385:mps2_defconfig crash, which is avoided by >> this patch. >> My understanding, which may be wrong, is that arm images with thumb >> instructions >> do not support unaligned accesses (maybe I should say do not support >> unaligned >> accesses with the mps2-an385 qemu emulation; I did not test with real >> hardware, >> after all). >> >> Given all that, the continued discussion around the subject, and the lack >> of agreement if unaligned accesses should be tested or not, I don't really >> see a path forward for this patch. The remaining known problem is arm with >> thumb instructions. I don't think that is going to be fixed. I suspect that >> no one but me even tries to run that code (or any arm:nommu images, for >> that >> matter). I'd suggest to drop this patch, and I'll stop testing IP checksum >> generation for mps2-an385:mps2_defconfig. > > I'm trying to run an ARM kernel built with GCC 13.2 and mps2_defconfig > on the mps2-an385 qemu emulation, and I get the following fatal error. > > $ qemu-system-arm -M mps2-an385 -kernel vmlinux > qemu: fatal: Lockup: can't escalate 3 to HardFault (current priority -1) > > R00=00000000 R01=00000000 R02=00000000 R03=00000000 > R04=00000000 R05=00000000 R06=00000000 R07=00000000 > R08=00000000 R09=00000000 R10=00000000 R11=00000000 > R12=00000000 R13=ffffffe0 R14=fffffff9 R15=00000000 > XPSR=40000003 -Z-- A handler > FPSCR: 00000000 > Abandon (core dumped) > > Can you tell how to proceed ? > You can't run it directly. mps2-an385 is one of the platforms where the qemu maintainers insisted that qemu shall not initialize the CPU. You have to provide a shim such as https://github.com/groeck/linux-build-test/blob/master/rootfs/arm/mps2-boot.axf as bios. You also have to provide the dtb file. On top of that, you would need a customized version of qemu which actually reads the command line, the bios file, and the dtb. See https://github.com/groeck/linux-build-test/tree/master/qemu branch v8.2.1-local or v8.1.5-local. It might be possible to find a bootloader which does all that and prepares the emulation for running Linux, but I don't know if that exists somewhere. Guenter
Hi Russell and Guenter, Le 03/03/2024 à 16:26, Guenter Roeck a écrit : > On 3/3/24 02:20, Christophe Leroy wrote: >> >> >> Le 01/03/2024 à 19:32, Guenter Roeck a écrit : >>> This leaves the mps2-an385:mps2_defconfig crash, which is avoided by >>> this patch. >>> My understanding, which may be wrong, is that arm images with thumb >>> instructions >>> do not support unaligned accesses (maybe I should say do not support >>> unaligned >>> accesses with the mps2-an385 qemu emulation; I did not test with real >>> hardware, >>> after all). ... >> >> Can you tell how to proceed ? >> > > You can't run it directly. mps2-an385 is one of the platforms where > the qemu maintainers insisted that qemu shall not initialize the CPU. > You have to provide a shim such as > https://github.com/groeck/linux-build-test/blob/master/rootfs/arm/mps2-boot.axf > as bios. You also have to provide the dtb file. > > On top of that, you would need a customized version of qemu which > actually reads the command line, the bios file, and the dtb. See > https://github.com/groeck/linux-build-test/tree/master/qemu > branch v8.2.1-local or v8.1.5-local. > Many thanks for your guidance. So, I did the test and what I can say: ip_fast_csum() works whatever the alignment is. csum_ipv6_magic() is the problem with unaligned ipv6 source or destination addresses: [ 0.503757] KTAP version 1 [ 0.503854] 1..1 [ 0.504156] KTAP version 1 [ 0.504251] # Subtest: checksum [ 0.504563] # module: checksum_kunit [ 0.504730] 1..5 [ 0.546418] ok 1 test_csum_fixed_random_inputs [ 0.627853] ok 2 test_csum_all_carry_inputs [ 0.704918] ok 3 test_csum_no_carry_inputs [ 0.705845] ok 4 test_ip_fast_csum [ 0.706320] [ 0.706320] Unhandled exception: IPSR = 00000006 LR = fffffff1 [ 0.706796] CPU: 0 PID: 28 Comm: kunit_try_catch Tainted: G N 6.8.0-rc1-00609-g9c0b7a2e25f0 #649 [ 0.707177] Hardware name: Generic DT based system [ 0.707400] PC is at __csum_ipv6_magic+0x8/0xb4 [ 0.708170] LR is at test_csum_ipv6_magic+0x3d/0xa4 [ 0.708415] pc : [<211b0da8>] lr : [<210e3bf5>] psr: 0100020b [ 0.708692] sp : 2153debc ip : 46c7f0d2 fp : 00000000 [ 0.708919] r10: 00000000 r9 : 2141dc48 r8 : 211e0e20 [ 0.709148] r7 : 00003085 r6 : 00000001 r5 : 2141dd24 r4 : 211e0c2e [ 0.709422] r3 : 2c000000 r2 : 1ac7f0d2 r1 : 211e0c19 r0 : 211e0c09 [ 0.709704] xPSR: 0100020b I don't know much about ARM instruction set, seems like the ldr instruction used in ip_fast_csum() doesn't mind unaligned accesses while ldmia instruction used in csum_ipv6_magic() minds. Or is it a wrong behaviour of QEMU ? If I change the test as follows to only use word aligned IPv6 addresses, it works: diff --git a/lib/checksum_kunit.c b/lib/checksum_kunit.c index 225bb7701460..4d86fc8ccd78 100644 --- a/lib/checksum_kunit.c +++ b/lib/checksum_kunit.c @@ -607,7 +607,7 @@ static void test_csum_ipv6_magic(struct kunit *test) const int csum_offset = sizeof(struct in6_addr) + sizeof(struct in6_addr) + sizeof(int) + sizeof(char); - for (int i = 0; i < NUM_IPv6_TESTS; i++) { + for (int i = 0; i < NUM_IPv6_TESTS; i += 4) { saddr = (const struct in6_addr *)(random_buf + i); daddr = (const struct in6_addr *)(random_buf + i + daddr_offset); If I change csum_ipv6_magic() as follows to use instruction ldr instead of ldmia, it also works without any change to the test: diff --git a/arch/arm/lib/csumipv6.S b/arch/arm/lib/csumipv6.S index 3559d515144c..a312d0836b95 100644 --- a/arch/arm/lib/csumipv6.S +++ b/arch/arm/lib/csumipv6.S @@ -12,12 +12,18 @@ ENTRY(__csum_ipv6_magic) str lr, [sp, #-4]! adds ip, r2, r3 - ldmia r1, {r1 - r3, lr} + ldr r2, [r1], #4 + ldr r3, [r1], #4 + ldr lr, [r1], #4 + ldr r1, [r1] adcs ip, ip, r1 adcs ip, ip, r2 adcs ip, ip, r3 adcs ip, ip, lr - ldmia r0, {r0 - r3} + ldr r1, [r0], #4 + ldr r2, [r0], #4 + ldr r3, [r0], #4 + ldr r0, [r0] adcs r0, ip, r0 adcs r0, r0, r1 adcs r0, r0, r2 So now we are back to the initial question, should checksumming on unaligned addresses be supported or not ? Russell I understand from previous answers from you that half-word alignment should be supported, in that case should ARM version of csum_ipv6_magic() be modified ? In that case can you propose the most optimised fix ? If not, then the test has to be fixed to only use word-aligned IPv6 addresses. Thanks Christophe
On Mon, Mar 4, 2024, at 12:39, Christophe Leroy wrote: > Le 03/03/2024 à 16:26, Guenter Roeck a écrit : >> On 3/3/24 02:20, Christophe Leroy wrote: > > I don't know much about ARM instruction set, seems like the ldr > instruction used in ip_fast_csum() doesn't mind unaligned accesses while > ldmia instruction used in csum_ipv6_magic() minds. Or is it a wrong > behaviour of QEMU ? Correct. On ARMv6 and newer, accessing normal unaligned memory with ldr/str does not trap, and that covers most unaligned accesses. Some of the cases that don't allow unaligned access include: - ARMv4/ARMv5 cannot access unaligned memory with the same instructions. Apparently the same is true for ARMv7-M. - multi-word accesses (ldrd/strd and ldm/stm) require 32-bit alignment. These are generated for most 64-bit variables and some arrays - unaligned access on MMIO registers (__iomem pointers) always trap - atomic access (ldrex/strex) requires aligned data - The C standard disallows casting to a type with larger alignment requirements, and gcc is known to produce code that doesn't work with this (and other) undefined behavior. > If I change the test as follows to only use word aligned IPv6 addresses, > it works: > > diff --git a/lib/checksum_kunit.c b/lib/checksum_kunit.c > index 225bb7701460..4d86fc8ccd78 100644 > --- a/lib/checksum_kunit.c > +++ b/lib/checksum_kunit.c > @@ -607,7 +607,7 @@ static void test_csum_ipv6_magic(struct kunit *test) > const int csum_offset = sizeof(struct in6_addr) + sizeof(struct > in6_addr) + > sizeof(int) + sizeof(char); > > - for (int i = 0; i < NUM_IPv6_TESTS; i++) { > + for (int i = 0; i < NUM_IPv6_TESTS; i += 4) { > saddr = (const struct in6_addr *)(random_buf + i); > daddr = (const struct in6_addr *)(random_buf + i + > daddr_offset); > > > If I change csum_ipv6_magic() as follows to use instruction ldr instead > of ldmia, it also works without any change to the test: > > diff --git a/arch/arm/lib/csumipv6.S b/arch/arm/lib/csumipv6.S > index 3559d515144c..a312d0836b95 100644 > --- a/arch/arm/lib/csumipv6.S > +++ b/arch/arm/lib/csumipv6.S > @@ -12,12 +12,18 @@ > ENTRY(__csum_ipv6_magic) > str lr, [sp, #-4]! > adds ip, r2, r3 > - ldmia r1, {r1 - r3, lr} > + ldr r2, [r1], #4 > + ldr r3, [r1], #4 > + ldr lr, [r1], #4 > + ldr r1, [r1] > > So now we are back to the initial question, should checksumming on > unaligned addresses be supported or not ? > > Russell I understand from previous answers from you that half-word > alignment should be supported, in that case should ARM version of > csum_ipv6_magic() be modified ? In that case can you propose the most > optimised fix ? The csumipv6.S code predates ARMv6 and is indeed suboptimal on v6/v7 processors with unaligned ipv6 headers. Your workaround looks like it should be much better, but it would at the same time make the ARMv5 case much more expensive because it traps four times instead of just one. > If not, then the test has to be fixed to only use word-aligned IPv6 > addresses. Because of the gcc issue I mentioned, net/ipv6/ip6_checksum.c and anything else that accesses misaligned ipv6 headers may need to be changed as well. Marking in6_addr as '__packed __aligned(2)' should be sufficient for that. This will prevent gcc from issuing ldm or ldrd on ARMv6+ as well as making optimization based on the two lower bits of the address being zero on x86 and others. The downside is that it forces 16-bit loads and stores to be used on architectures that don't have efficient unaligned access (armv5, alpha, mips, sparc and xtensa among others) even when the IP headers are fully aligned. Arnd
From: Arnd Bergmann > Sent: 04 March 2024 13:40 ... > > If not, then the test has to be fixed to only use word-aligned IPv6 > > addresses. > > Because of the gcc issue I mentioned, net/ipv6/ip6_checksum.c > and anything else that accesses misaligned ipv6 headers may need > to be changed as well. Marking in6_addr as '__packed __aligned(2)' > should be sufficient for that. This will prevent gcc from issuing > ldm or ldrd on ARMv6+ as well as making optimization based on > the two lower bits of the address being zero on x86 and others. Eh? x86 pretty much doesn't care unless you are using AVX. > The downside is that it forces 16-bit loads and stores to be > used on architectures that don't have efficient unaligned > access (armv5, alpha, mips, sparc and xtensa among others) > even when the IP headers are fully aligned. Aren't the later accesses to the header also going to fault? IIRC there is an skb_pull() call to ensure all the IP header is in the linear skb fragment? Perhaps there should be an skb_pull_aligned() that will ensure the data is 32bit aligned on systems where the misaligned accesses fault? There might still need to be something to stop gcc generating ldm/ldrd which can fault on systems where a normal register read wouldn't. Do any recent arm cpu have the strongarm 'feature' than ldm always took 16 clocks? David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)
Le 01/03/2024 à 19:58, Charlie Jenkins a écrit : > On Fri, Mar 01, 2024 at 10:32:36AM -0800, Guenter Roeck wrote: >> On 2/29/24 14:46, Charlie Jenkins wrote: >>> The test cases for ip_fast_csum and csum_ipv6_magic were not properly >>> aligning the IP header, which were causing failures on architectures >>> that do not support misaligned accesses like some ARM platforms. To >>> solve this, align the data along (14 + NET_IP_ALIGN) bytes which is the >>> standard alignment of an IP header and must be supported by the >>> architecture. >>> >>> Furthermore, all architectures except the m68k pad "struct >>> csum_ipv6_magic_data" to 44 bytes. To make compatible with the m68k, >>> manually pad this structure to 44 bytes. >>> >>> Fixes: 6f4c45cbcb00 ("kunit: Add tests for csum_ipv6_magic and ip_fast_csum") >>> Signed-off-by: Charlie Jenkins <charlie@rivosinc.com> >>> Reviewed-by: Guenter Roeck <linux@roeck-us.net> >>> Acked-by: Palmer Dabbelt <palmer@rivosinc.com> >>> --- >>> The ip_fast_csum and csum_ipv6_magic tests did not work on all >>> architectures due to differences in misaligned access support. >>> Fix those issues by changing endianness of data and aligning the data. >>> >>> This patch relies upon a patch from Christophe: >>> >>> [PATCH net] kunit: Fix again checksum tests on big endian CPUs >>> >> >> Various test results: >> >> On v6.8-rc6-120-g87adedeba51a (current mainline), without this patch >> >> - mps2-an385:mps2_defconfig crashes in IPv6 checksum tests >> - ipv6 checksum tests fail on parisc, parisc64, sh, and sheb. >> >> The previously seen problems on big endian systems are still seen with >> v6.8-rc6, but are gone after commit 3d6423ef8d51 ("kunit: Fix again >> checksum tests on big endian CPUs") has been applied upstream. This includes >> the test failures seen with m68k. >> >> The parisc/parisc64 test failures are independent of this patch. Fixes are >> available in linux-next and pending in qemu. The sh/sheb failures are due >> to upstream commit cadc4e1a2b4 and are no longer seen after reverting that >> patch. >> >> This leaves the mps2-an385:mps2_defconfig crash, which is avoided by this patch. >> My understanding, which may be wrong, is that arm images with thumb instructions >> do not support unaligned accesses (maybe I should say do not support unaligned >> accesses with the mps2-an385 qemu emulation; I did not test with real hardware, >> after all). >> >> Given all that, the continued discussion around the subject, and the lack >> of agreement if unaligned accesses should be tested or not, I don't really >> see a path forward for this patch. The remaining known problem is arm with >> thumb instructions. I don't think that is going to be fixed. I suspect that >> no one but me even tries to run that code (or any arm:nommu images, for that >> matter). I'd suggest to drop this patch, and I'll stop testing IP checksum >> generation for mps2-an385:mps2_defconfig. >> >> Sorry for all the noise this has generated. >> >> Thanks, >> Guenter > > If that's what people want. I still don't understand why there is any > problem with relying on NET_IP_ALIGN as that seems like that macro was > defined to create an expected alignment. > > It would be nice to use the struct csum_ipv6_magic_data instead of doing > manual alignment and restricting len to 16 bits. I can send a patch that > only covers that if people are interested. > > This was my first foray into writing generic test cases and it drew a > significant amount of criticism. I appreciate Guenter's efforts to make > the tests have more expected behavior across all supported platforms, > but the community obviously doesn't agree that is a reasonable goal. > Makes my life easier though, because then I can just not upstream test > cases and focus on feature work... Hi Charlie, Do not get discouraged. Your additional kunit checksum tests are very valuable and usefull, and as far as I understand they have allowed to identify and fix problems that had gone unnoticed until now. I myself would have been very happy to have such tests available when I inlined ip_fast_csum() and implemented csum_ipv6_magic() for powerpc. The thing which brought you criticism (from myself at least) is that your rencent tentative fixes distort your original work and makes it much less useful than it originally was. I fear that if your test had been like that at the begining, they wouldn't have allowed to discover and fix the same problems. So yes your tests are very welcome for upstreaming and I encourage you to continue upstreaming good tests as the one you initialy upstreamed for checksum tests. If you have not already done, I recommend you to read the guidance about patch submission: https://docs.kernel.org/process/6.Followthrough.html https://docs.kernel.org/process/submitting-patches.html And especially https://docs.kernel.org/process/submitting-patches.html#respond-to-review-comments and https://docs.kernel.org/process/submitting-patches.html#don-t-get-discouraged-or-impatient Christophe
diff --git a/lib/checksum_kunit.c b/lib/checksum_kunit.c index bf70850035c7..11a7d6975bb9 100644 --- a/lib/checksum_kunit.c +++ b/lib/checksum_kunit.c @@ -13,8 +13,9 @@ #define IPv4_MIN_WORDS 5 #define IPv4_MAX_WORDS 15 -#define NUM_IPv6_TESTS 200 -#define NUM_IP_FAST_CSUM_TESTS 181 +#define WORD_ALIGNMENT 4 +/* Ethernet headers are 14 bytes and NET_IP_ALIGN is used to align them */ +#define IP_ALIGNMENT (14 + NET_IP_ALIGN) /* Values for a little endian CPU. Byte swap each half on big endian CPU. */ static const u32 random_init_sum = 0x2847aab; @@ -216,234 +217,106 @@ static const u32 init_sums_no_overflow[] = { }; static const u16 expected_csum_ipv6_magic[] = { - 0x18d4, 0x3085, 0x2e4b, 0xd9f4, 0xbdc8, 0x78f, 0x1034, 0x8422, 0x6fc0, - 0xd2f6, 0xbeb5, 0x9d3, 0x7e2a, 0x312e, 0x778e, 0xc1bb, 0x7cf2, 0x9d1e, - 0xca21, 0xf3ff, 0x7569, 0xb02e, 0xca86, 0x7e76, 0x4539, 0x45e3, 0xf28d, - 0xdf81, 0x8fd5, 0x3b5d, 0x8324, 0xf471, 0x83be, 0x1daf, 0x8c46, 0xe682, - 0xd1fb, 0x6b2e, 0xe687, 0x2a33, 0x4833, 0x2d67, 0x660f, 0x2e79, 0xd65e, - 0x6b62, 0x6672, 0x5dbd, 0x8680, 0xbaa5, 0x2229, 0x2125, 0x2d01, 0x1cc0, - 0x6d36, 0x33c0, 0xee36, 0xd832, 0x9820, 0x8a31, 0x53c5, 0x2e2, 0xdb0e, - 0x49ed, 0x17a7, 0x77a0, 0xd72e, 0x3d72, 0x7dc8, 0x5b17, 0xf55d, 0xa4d9, - 0x1446, 0x5d56, 0x6b2e, 0x69a5, 0xadb6, 0xff2a, 0x92e, 0xe044, 0x3402, - 0xbb60, 0xec7f, 0xe7e6, 0x1986, 0x32f4, 0x8f8, 0x5e00, 0x47c6, 0x3059, - 0x3969, 0xe957, 0x4388, 0x2854, 0x3334, 0xea71, 0xa6de, 0x33f9, 0x83fc, - 0x37b4, 0x5531, 0x3404, 0x1010, 0xed30, 0x610a, 0xc95, 0x9aed, 0x6ff, - 0x5136, 0x2741, 0x660e, 0x8b80, 0xf71, 0xa263, 0x88af, 0x7a73, 0x3c37, - 0x1908, 0x6db5, 0x2e92, 0x1cd2, 0x70c8, 0xee16, 0xe80, 0xcd55, 0x6e6, - 0x6434, 0x127, 0x655d, 0x2ea0, 0xb4f4, 0xdc20, 0x5671, 0xe462, 0xe52b, - 0xdb44, 0x3589, 0xc48f, 0xe60b, 0xd2d2, 0x66ad, 0x498, 0x436, 0xb917, - 0xf0ca, 0x1a6e, 0x1cb7, 0xbf61, 0x2870, 0xc7e8, 0x5b30, 0xe4a5, 0x168, - 0xadfc, 0xd035, 0xe690, 0xe283, 0xfb27, 0xe4ad, 0xb1a5, 0xf2d5, 0xc4b6, - 0x8a30, 0xd7d5, 0x7df9, 0x91d5, 0x63ed, 0x2d21, 0x312b, 0xab19, 0xa632, - 0x8d2e, 0xef06, 0x57b9, 0xc373, 0xbd1f, 0xa41f, 0x8444, 0x9975, 0x90cb, - 0xc49c, 0xe965, 0x4eff, 0x5a, 0xef6d, 0xe81a, 0xe260, 0x853a, 0xff7a, - 0x99aa, 0xb06b, 0xee19, 0xcc2c, 0xf34c, 0x7c49, 0xdac3, 0xa71e, 0xc988, - 0x3845, 0x1014 + 0x5b4a, 0x686d, 0xea7a, 0xa07e, 0x8794, 0x1038, 0xde27, 0x63bc, 0xfd51, + 0x3fe4, 0x14ac, 0x00af, 0x5398, 0xdaa9, 0xbf3b, 0x4741, 0x8c5a, 0xc20c, + 0xb72c, 0xb012, 0xd4fc, 0x6b97, 0xb716, 0x43bd, 0xaf02, 0xfdc6, 0x03fd, + 0xe2a7, 0xaa7f, 0xb289, 0x02c7, 0xde65, 0x497c, 0xdcfa, 0x2664, 0xef4a, + 0x555d, 0x0a5e, 0xf1d7, 0x2727, 0xfa3c, 0xac89, 0x61fd, 0x2294, 0x0003, + 0xe3f6, 0x4c61, 0x968d, 0x8105, 0xaccc, 0xc311, 0x8ab0, 0xcf3d, 0xac01, + 0x0306, 0xa5a4, 0x7166, 0xfbde, 0x8072, 0x7079, 0xdf72, 0x22be, 0x340e, + 0x02c3, 0x3421, 0x2137, 0xfaf2, 0x874f, 0xe764, 0x9bf2, 0x0415, 0x7bb0, + 0x09ab, 0xdec0, 0x5bd4, 0x37f4, 0x0a14, 0xd8e8, 0x6a5b, 0x2f3b, 0x908b, + 0x26c7, 0xd871, 0xf24d, 0xd2bf, 0xfe4e, 0xa5cf, 0x1969, 0x6615, 0xfdb2, + 0xf3f0, 0x9e12, 0x19d0, 0xdf37, 0x7ef6, 0xb229, 0xb216, 0x676f, 0x2aeb, + 0x2bb3, 0x92b8, 0x0542, 0x091b, 0xc28f, 0xdbe5, 0x9980, 0x51ab, 0x4f0c, + 0xe1ac, 0x19e3, 0xdce0, 0xe641, 0xa90d, 0x96c5, 0xdb6e, 0xc4ec, 0x853a, }; static const u16 expected_fast_csum[] = { - 0xda83, 0x45da, 0x4f46, 0x4e4f, 0x34e, 0xe902, 0xa5e9, 0x87a5, 0x7187, - 0x5671, 0xf556, 0x6df5, 0x816d, 0x8f81, 0xbb8f, 0xfbba, 0x5afb, 0xbe5a, - 0xedbe, 0xabee, 0x6aac, 0xe6b, 0xea0d, 0x67ea, 0x7e68, 0x8a7e, 0x6f8a, - 0x3a70, 0x9f3a, 0xe89e, 0x75e8, 0x7976, 0xfa79, 0x2cfa, 0x3c2c, 0x463c, - 0x7146, 0x7a71, 0x547a, 0xfd53, 0x99fc, 0xb699, 0x92b6, 0xdb91, 0xe8da, - 0x5fe9, 0x1e60, 0xae1d, 0x39ae, 0xf439, 0xa1f4, 0xdda1, 0xede, 0x790f, - 0x579, 0x1206, 0x9012, 0x2490, 0xd224, 0x5cd2, 0xa65d, 0xca7, 0x220d, - 0xf922, 0xbf9, 0x920b, 0x1b92, 0x361c, 0x2e36, 0x4d2e, 0x24d, 0x2, - 0xcfff, 0x90cf, 0xa591, 0x93a5, 0x7993, 0x9579, 0xc894, 0x50c8, 0x5f50, - 0xd55e, 0xcad5, 0xf3c9, 0x8f4, 0x4409, 0x5043, 0x5b50, 0x55b, 0x2205, - 0x1e22, 0x801e, 0x3780, 0xe137, 0x7ee0, 0xf67d, 0x3cf6, 0xa53c, 0x2ea5, - 0x472e, 0x5147, 0xcf51, 0x1bcf, 0x951c, 0x1e95, 0xc71e, 0xe4c7, 0xc3e4, - 0x3dc3, 0xee3d, 0xa4ed, 0xf9a4, 0xcbf8, 0x75cb, 0xb375, 0x50b4, 0x3551, - 0xf835, 0x19f8, 0x8c1a, 0x538c, 0xad52, 0xa3ac, 0xb0a3, 0x5cb0, 0x6c5c, - 0x5b6c, 0xc05a, 0x92c0, 0x4792, 0xbe47, 0x53be, 0x1554, 0x5715, 0x4b57, - 0xe54a, 0x20e5, 0x21, 0xd500, 0xa1d4, 0xa8a1, 0x57a9, 0xca57, 0x5ca, - 0x1c06, 0x4f1c, 0xe24e, 0xd9e2, 0xf0d9, 0x4af1, 0x474b, 0x8146, 0xe81, - 0xfd0e, 0x84fd, 0x7c85, 0xba7c, 0x17ba, 0x4a17, 0x964a, 0xf595, 0xff5, - 0x5310, 0x3253, 0x6432, 0x4263, 0x2242, 0xe121, 0x32e1, 0xf632, 0xc5f5, - 0x21c6, 0x7d22, 0x8e7c, 0x418e, 0x5641, 0x3156, 0x7c31, 0x737c, 0x373, - 0x2503, 0xc22a, 0x3c2, 0x4a04, 0x8549, 0x5285, 0xa352, 0xe8a3, 0x6fe8, - 0x1a6f, 0x211a, 0xe021, 0x38e0, 0x7638, 0xf575, 0x9df5, 0x169e, 0xf116, - 0x23f1, 0xcd23, 0xece, 0x660f, 0x4866, 0x6a48, 0x716a, 0xee71, 0xa2ee, - 0xb8a2, 0x61b9, 0xa361, 0xf7a2, 0x26f7, 0x1127, 0x6611, 0xe065, 0x36e0, - 0x1837, 0x3018, 0x1c30, 0x721b, 0x3e71, 0xe43d, 0x99e4, 0x9e9a, 0xb79d, - 0xa9b7, 0xcaa, 0xeb0c, 0x4eb, 0x1305, 0x8813, 0xb687, 0xa9b6, 0xfba9, - 0xd7fb, 0xccd8, 0x2ecd, 0x652f, 0xae65, 0x3fae, 0x3a40, 0x563a, 0x7556, - 0x2776, 0x1228, 0xef12, 0xf9ee, 0xcef9, 0x56cf, 0xa956, 0x24a9, 0xba24, - 0x5fba, 0x665f, 0xf465, 0x8ff4, 0x6d8f, 0x346d, 0x5f34, 0x385f, 0xd137, - 0xb8d0, 0xacb8, 0x55ac, 0x7455, 0xe874, 0x89e8, 0xd189, 0xa0d1, 0xb2a0, - 0xb8b2, 0x36b8, 0x5636, 0xd355, 0x8d3, 0x1908, 0x2118, 0xc21, 0x990c, - 0x8b99, 0x158c, 0x7815, 0x9e78, 0x6f9e, 0x4470, 0x1d44, 0x341d, 0x2634, - 0x3f26, 0x793e, 0xc79, 0xcc0b, 0x26cc, 0xd126, 0x1fd1, 0xb41f, 0xb6b4, - 0x22b7, 0xa122, 0xa1, 0x7f01, 0x837e, 0x3b83, 0xaf3b, 0x6fae, 0x916f, - 0xb490, 0xffb3, 0xceff, 0x50cf, 0x7550, 0x7275, 0x1272, 0x2613, 0xaa26, - 0xd5aa, 0x7d5, 0x9607, 0x96, 0xb100, 0xf8b0, 0x4bf8, 0xdd4c, 0xeddd, - 0x98ed, 0x2599, 0x9325, 0xeb92, 0x8feb, 0xcc8f, 0x2acd, 0x392b, 0x3b39, - 0xcb3b, 0x6acb, 0xd46a, 0xb8d4, 0x6ab8, 0x106a, 0x2f10, 0x892f, 0x789, - 0xc806, 0x45c8, 0x7445, 0x3c74, 0x3a3c, 0xcf39, 0xd7ce, 0x58d8, 0x6e58, - 0x336e, 0x1034, 0xee10, 0xe9ed, 0xc2e9, 0x3fc2, 0xd53e, 0xd2d4, 0xead2, - 0x8fea, 0x2190, 0x1162, 0xbe11, 0x8cbe, 0x6d8c, 0xfb6c, 0x6dfb, 0xd36e, - 0x3ad3, 0xf3a, 0x870e, 0xc287, 0x53c3, 0xc54, 0x5b0c, 0x7d5a, 0x797d, - 0xec79, 0x5dec, 0x4d5e, 0x184e, 0xd618, 0x60d6, 0xb360, 0x98b3, 0xf298, - 0xb1f2, 0x69b1, 0xf969, 0xef9, 0xab0e, 0x21ab, 0xe321, 0x24e3, 0x8224, - 0x5481, 0x5954, 0x7a59, 0xff7a, 0x7dff, 0x1a7d, 0xa51a, 0x46a5, 0x6b47, - 0xe6b, 0x830e, 0xa083, 0xff9f, 0xd0ff, 0xffd0, 0xe6ff, 0x7de7, 0xc67d, - 0xd0c6, 0x61d1, 0x3a62, 0xc3b, 0x150c, 0x1715, 0x4517, 0x5345, 0x3954, - 0xdd39, 0xdadd, 0x32db, 0x6a33, 0xd169, 0x86d1, 0xb687, 0x3fb6, 0x883f, - 0xa487, 0x39a4, 0x2139, 0xbe20, 0xffbe, 0xedfe, 0x8ded, 0x368e, 0xc335, - 0x51c3, 0x9851, 0xf297, 0xd6f2, 0xb9d6, 0x95ba, 0x2096, 0xea1f, 0x76e9, - 0x4e76, 0xe04d, 0xd0df, 0x80d0, 0xa280, 0xfca2, 0x75fc, 0xef75, 0x32ef, - 0x6833, 0xdf68, 0xc4df, 0x76c4, 0xb77, 0xb10a, 0xbfb1, 0x58bf, 0x5258, - 0x4d52, 0x6c4d, 0x7e6c, 0xb67e, 0xccb5, 0x8ccc, 0xbe8c, 0xc8bd, 0x9ac8, - 0xa99b, 0x52a9, 0x2f53, 0xc30, 0x3e0c, 0xb83d, 0x83b7, 0x5383, 0x7e53, - 0x4f7e, 0xe24e, 0xb3e1, 0x8db3, 0x618e, 0xc861, 0xfcc8, 0x34fc, 0x9b35, - 0xaa9b, 0xb1aa, 0x5eb1, 0x395e, 0x8639, 0xd486, 0x8bd4, 0x558b, 0x2156, - 0xf721, 0x4ef6, 0x14f, 0x7301, 0xdd72, 0x49de, 0x894a, 0x9889, 0x8898, - 0x7788, 0x7b77, 0x637b, 0xb963, 0xabb9, 0x7cab, 0xc87b, 0x21c8, 0xcb21, - 0xdfca, 0xbfdf, 0xf2bf, 0x6af2, 0x626b, 0xb261, 0x3cb2, 0xc63c, 0xc9c6, - 0xc9c9, 0xb4c9, 0xf9b4, 0x91f9, 0x4091, 0x3a40, 0xcc39, 0xd1cb, 0x7ed1, - 0x537f, 0x6753, 0xa167, 0xba49, 0x88ba, 0x7789, 0x3877, 0xf037, 0xd3ef, - 0xb5d4, 0x55b6, 0xa555, 0xeca4, 0xa1ec, 0xb6a2, 0x7b7, 0x9507, 0xfd94, - 0x82fd, 0x5c83, 0x765c, 0x9676, 0x3f97, 0xda3f, 0x6fda, 0x646f, 0x3064, - 0x5e30, 0x655e, 0x6465, 0xcb64, 0xcdca, 0x4ccd, 0x3f4c, 0x243f, 0x6f24, - 0x656f, 0x6065, 0x3560, 0x3b36, 0xac3b, 0x4aac, 0x714a, 0x7e71, 0xda7e, - 0x7fda, 0xda7f, 0x6fda, 0xff6f, 0xc6ff, 0xedc6, 0xd4ed, 0x70d5, 0xeb70, - 0xa3eb, 0x80a3, 0xca80, 0x3fcb, 0x2540, 0xf825, 0x7ef8, 0xf87e, 0x73f8, - 0xb474, 0xb4b4, 0x92b5, 0x9293, 0x93, 0x3500, 0x7134, 0x9071, 0xfa8f, - 0x51fa, 0x1452, 0xba13, 0x7ab9, 0x957a, 0x8a95, 0x6e8a, 0x6d6e, 0x7c6d, - 0x447c, 0x9744, 0x4597, 0x8945, 0xef88, 0x8fee, 0x3190, 0x4831, 0x8447, - 0xa183, 0x1da1, 0xd41d, 0x2dd4, 0x4f2e, 0xc94e, 0xcbc9, 0xc9cb, 0x9ec9, - 0x319e, 0xd531, 0x20d5, 0x4021, 0xb23f, 0x29b2, 0xd828, 0xecd8, 0x5ded, - 0xfc5d, 0x4dfc, 0xd24d, 0x6bd2, 0x5f6b, 0xb35e, 0x7fb3, 0xee7e, 0x56ee, - 0xa657, 0x68a6, 0x8768, 0x7787, 0xb077, 0x4cb1, 0x764c, 0xb175, 0x7b1, - 0x3d07, 0x603d, 0x3560, 0x3e35, 0xb03d, 0xd6b0, 0xc8d6, 0xd8c8, 0x8bd8, - 0x3e8c, 0x303f, 0xd530, 0xf1d4, 0x42f1, 0xca42, 0xddca, 0x41dd, 0x3141, - 0x132, 0xe901, 0x8e9, 0xbe09, 0xe0bd, 0x2ce0, 0x862d, 0x3986, 0x9139, - 0x6d91, 0x6a6d, 0x8d6a, 0x1b8d, 0xac1b, 0xedab, 0x54ed, 0xc054, 0xcebf, - 0xc1ce, 0x5c2, 0x3805, 0x6038, 0x5960, 0xd359, 0xdd3, 0xbe0d, 0xafbd, - 0x6daf, 0x206d, 0x2c20, 0x862c, 0x8e86, 0xec8d, 0xa2ec, 0xa3a2, 0x51a3, - 0x8051, 0xfd7f, 0x91fd, 0xa292, 0xaf14, 0xeeae, 0x59ef, 0x535a, 0x8653, - 0x3986, 0x9539, 0xb895, 0xa0b8, 0x26a0, 0x2227, 0xc022, 0x77c0, 0xad77, - 0x46ad, 0xaa46, 0x60aa, 0x8560, 0x4785, 0xd747, 0x45d7, 0x2346, 0x5f23, - 0x25f, 0x1d02, 0x71d, 0x8206, 0xc82, 0x180c, 0x3018, 0x4b30, 0x4b, - 0x3001, 0x1230, 0x2d12, 0x8c2d, 0x148d, 0x4015, 0x5f3f, 0x3d5f, 0x6b3d, - 0x396b, 0x473a, 0xf746, 0x44f7, 0x8945, 0x3489, 0xcb34, 0x84ca, 0xd984, - 0xf0d9, 0xbcf0, 0x63bd, 0x3264, 0xf332, 0x45f3, 0x7346, 0x5673, 0xb056, - 0xd3b0, 0x4ad4, 0x184b, 0x7d18, 0x6c7d, 0xbb6c, 0xfeba, 0xe0fe, 0x10e1, - 0x5410, 0x2954, 0x9f28, 0x3a9f, 0x5a3a, 0xdb59, 0xbdc, 0xb40b, 0x1ab4, - 0x131b, 0x5d12, 0x6d5c, 0xe16c, 0xb0e0, 0x89b0, 0xba88, 0xbb, 0x3c01, - 0xe13b, 0x6fe1, 0x446f, 0xa344, 0x81a3, 0xfe81, 0xc7fd, 0x38c8, 0xb38, - 0x1a0b, 0x6d19, 0xf36c, 0x47f3, 0x6d48, 0xb76d, 0xd3b7, 0xd8d2, 0x52d9, - 0x4b53, 0xa54a, 0x34a5, 0xc534, 0x9bc4, 0xed9b, 0xbeed, 0x3ebe, 0x233e, - 0x9f22, 0x4a9f, 0x774b, 0x4577, 0xa545, 0x64a5, 0xb65, 0x870b, 0x487, - 0x9204, 0x5f91, 0xd55f, 0x35d5, 0x1a35, 0x71a, 0x7a07, 0x4e7a, 0xfc4e, - 0x1efc, 0x481f, 0x7448, 0xde74, 0xa7dd, 0x1ea7, 0xaa1e, 0xcfaa, 0xfbcf, - 0xedfb, 0x6eee, 0x386f, 0x4538, 0x6e45, 0xd96d, 0x11d9, 0x7912, 0x4b79, - 0x494b, 0x6049, 0xac5f, 0x65ac, 0x1366, 0x5913, 0xe458, 0x7ae4, 0x387a, - 0x3c38, 0xb03c, 0x76b0, 0x9376, 0xe193, 0x42e1, 0x7742, 0x6476, 0x3564, - 0x3c35, 0x6a3c, 0xcc69, 0x94cc, 0x5d95, 0xe5e, 0xee0d, 0x4ced, 0xce4c, - 0x52ce, 0xaa52, 0xdaaa, 0xe4da, 0x1de5, 0x4530, 0x5445, 0x3954, 0xb639, - 0x81b6, 0x7381, 0x1574, 0xc215, 0x10c2, 0x3f10, 0x6b3f, 0xe76b, 0x7be7, - 0xbc7b, 0xf7bb, 0x41f7, 0xcc41, 0x38cc, 0x4239, 0xa942, 0x4a9, 0xc504, - 0x7cc4, 0x437c, 0x6743, 0xea67, 0x8dea, 0xe88d, 0xd8e8, 0xdcd8, 0x17dd, - 0x5718, 0x958, 0xa609, 0x41a5, 0x5842, 0x159, 0x9f01, 0x269f, 0x5a26, - 0x405a, 0xc340, 0xb4c3, 0xd4b4, 0xf4d3, 0xf1f4, 0x39f2, 0xe439, 0x67e4, - 0x4168, 0xa441, 0xdda3, 0xdedd, 0x9df, 0xab0a, 0xa5ab, 0x9a6, 0xba09, - 0x9ab9, 0xad9a, 0x5ae, 0xe205, 0xece2, 0xecec, 0x14ed, 0xd614, 0x6bd5, - 0x916c, 0x3391, 0x6f33, 0x206f, 0x8020, 0x780, 0x7207, 0x2472, 0x8a23, - 0xb689, 0x3ab6, 0xf739, 0x97f6, 0xb097, 0xa4b0, 0xe6a4, 0x88e6, 0x2789, - 0xb28, 0x350b, 0x1f35, 0x431e, 0x1043, 0xc30f, 0x79c3, 0x379, 0x5703, - 0x3256, 0x4732, 0x7247, 0x9d72, 0x489d, 0xd348, 0xa4d3, 0x7ca4, 0xbf7b, - 0x45c0, 0x7b45, 0x337b, 0x4034, 0x843f, 0xd083, 0x35d0, 0x6335, 0x4d63, - 0xe14c, 0xcce0, 0xfecc, 0x35ff, 0x5636, 0xf856, 0xeef8, 0x2def, 0xfc2d, - 0x4fc, 0x6e04, 0xb66d, 0x78b6, 0xbb78, 0x3dbb, 0x9a3d, 0x839a, 0x9283, - 0x593, 0xd504, 0x23d5, 0x5424, 0xd054, 0x61d0, 0xdb61, 0x17db, 0x1f18, - 0x381f, 0x9e37, 0x679e, 0x1d68, 0x381d, 0x8038, 0x917f, 0x491, 0xbb04, - 0x23bb, 0x4124, 0xd41, 0xa30c, 0x8ba3, 0x8b8b, 0xc68b, 0xd2c6, 0xebd2, - 0x93eb, 0xbd93, 0x99bd, 0x1a99, 0xea19, 0x58ea, 0xcf58, 0x73cf, 0x1073, - 0x9e10, 0x139e, 0xea13, 0xcde9, 0x3ecd, 0x883f, 0xf89, 0x180f, 0x2a18, - 0x212a, 0xce20, 0x73ce, 0xf373, 0x60f3, 0xad60, 0x4093, 0x8e40, 0xb98e, - 0xbfb9, 0xf1bf, 0x8bf1, 0x5e8c, 0xe95e, 0x14e9, 0x4e14, 0x1c4e, 0x7f1c, - 0xe77e, 0x6fe7, 0xf26f, 0x13f2, 0x8b13, 0xda8a, 0x5fda, 0xea5f, 0x4eea, - 0xa84f, 0x88a8, 0x1f88, 0x2820, 0x9728, 0x5a97, 0x3f5b, 0xb23f, 0x70b2, - 0x2c70, 0x232d, 0xf623, 0x4f6, 0x905, 0x7509, 0xd675, 0x28d7, 0x9428, - 0x3794, 0xf036, 0x2bf0, 0xba2c, 0xedb9, 0xd7ed, 0x59d8, 0xed59, 0x4ed, - 0xe304, 0x18e3, 0x5c19, 0x3d5c, 0x753d, 0x6d75, 0x956d, 0x7f95, 0xc47f, - 0x83c4, 0xa84, 0x2e0a, 0x5f2e, 0xb95f, 0x77b9, 0x6d78, 0xf46d, 0x1bf4, - 0xed1b, 0xd6ed, 0xe0d6, 0x5e1, 0x3905, 0x5638, 0xa355, 0x99a2, 0xbe99, - 0xb4bd, 0x85b4, 0x2e86, 0x542e, 0x6654, 0xd765, 0x73d7, 0x3a74, 0x383a, - 0x2638, 0x7826, 0x7677, 0x9a76, 0x7e99, 0x2e7e, 0xea2d, 0xa6ea, 0x8a7, - 0x109, 0x3300, 0xad32, 0x5fad, 0x465f, 0x2f46, 0xc62f, 0xd4c5, 0xad5, - 0xcb0a, 0x4cb, 0xb004, 0x7baf, 0xe47b, 0x92e4, 0x8e92, 0x638e, 0x1763, - 0xc17, 0xf20b, 0x1ff2, 0x8920, 0x5889, 0xcb58, 0xf8cb, 0xcaf8, 0x84cb, - 0x9f84, 0x8a9f, 0x918a, 0x4991, 0x8249, 0xff81, 0x46ff, 0x5046, 0x5f50, - 0x725f, 0xf772, 0x8ef7, 0xe08f, 0xc1e0, 0x1fc2, 0x9e1f, 0x8b9d, 0x108b, - 0x411, 0x2b04, 0xb02a, 0x1fb0, 0x1020, 0x7a0f, 0x587a, 0x8958, 0xb188, - 0xb1b1, 0x49b2, 0xb949, 0x7ab9, 0x917a, 0xfc91, 0xe6fc, 0x47e7, 0xbc47, - 0x8fbb, 0xea8e, 0x34ea, 0x2635, 0x1726, 0x9616, 0xc196, 0xa6c1, 0xf3a6, - 0x11f3, 0x4811, 0x3e48, 0xeb3e, 0xf7ea, 0x1bf8, 0xdb1c, 0x8adb, 0xe18a, - 0x42e1, 0x9d42, 0x5d9c, 0x6e5d, 0x286e, 0x4928, 0x9a49, 0xb09c, 0xa6b0, - 0x2a7, 0xe702, 0xf5e6, 0x9af5, 0xf9b, 0x810f, 0x8080, 0x180, 0x1702, - 0x5117, 0xa650, 0x11a6, 0x1011, 0x550f, 0xd554, 0xbdd5, 0x6bbe, 0xc66b, - 0xfc7, 0x5510, 0x5555, 0x7655, 0x177, 0x2b02, 0x6f2a, 0xb70, 0x9f0b, - 0xcf9e, 0xf3cf, 0x3ff4, 0xcb40, 0x8ecb, 0x768e, 0x5277, 0x8652, 0x9186, - 0x9991, 0x5099, 0xd350, 0x93d3, 0x6d94, 0xe6d, 0x530e, 0x3153, 0xa531, - 0x64a5, 0x7964, 0x7c79, 0x467c, 0x1746, 0x3017, 0x3730, 0x538, 0x5, - 0x1e00, 0x5b1e, 0x955a, 0xae95, 0x3eaf, 0xff3e, 0xf8ff, 0xb2f9, 0xa1b3, - 0xb2a1, 0x5b2, 0xad05, 0x7cac, 0x2d7c, 0xd32c, 0x80d2, 0x7280, 0x8d72, - 0x1b8e, 0x831b, 0xac82, 0xfdac, 0xa7fd, 0x15a8, 0xd614, 0xe0d5, 0x7be0, - 0xb37b, 0x61b3, 0x9661, 0x9d95, 0xc79d, 0x83c7, 0xd883, 0xead7, 0xceb, - 0xf60c, 0xa9f5, 0x19a9, 0xa019, 0x8f9f, 0xd48f, 0x3ad5, 0x853a, 0x985, - 0x5309, 0x6f52, 0x1370, 0x6e13, 0xa96d, 0x98a9, 0x5198, 0x9f51, 0xb69f, - 0xa1b6, 0x2ea1, 0x672e, 0x2067, 0x6520, 0xaf65, 0x6eaf, 0x7e6f, 0xee7e, - 0x17ef, 0xa917, 0xcea8, 0x9ace, 0xff99, 0x5dff, 0xdf5d, 0x38df, 0xa39, - 0x1c0b, 0xe01b, 0x46e0, 0xcb46, 0x90cb, 0xba90, 0x4bb, 0x9104, 0x9d90, - 0xc89c, 0xf6c8, 0x6cf6, 0x886c, 0x1789, 0xbd17, 0x70bc, 0x7e71, 0x17e, - 0x1f01, 0xa01f, 0xbaa0, 0x14bb, 0xfc14, 0x7afb, 0xa07a, 0x3da0, 0xbf3d, - 0x48bf, 0x8c48, 0x968b, 0x9d96, 0xfd9d, 0x96fd, 0x9796, 0x6b97, 0xd16b, - 0xf4d1, 0x3bf4, 0x253c, 0x9125, 0x6691, 0xc166, 0x34c1, 0x5735, 0x1a57, - 0xdc19, 0x77db, 0x8577, 0x4a85, 0x824a, 0x9182, 0x7f91, 0xfd7f, 0xb4c3, - 0xb5b4, 0xb3b5, 0x7eb3, 0x617e, 0x4e61, 0xa4f, 0x530a, 0x3f52, 0xa33e, - 0x34a3, 0x9234, 0xf091, 0xf4f0, 0x1bf5, 0x311b, 0x9631, 0x6a96, 0x386b, - 0x1d39, 0xe91d, 0xe8e9, 0x69e8, 0x426a, 0xee42, 0x89ee, 0x368a, 0x2837, - 0x7428, 0x5974, 0x6159, 0x1d62, 0x7b1d, 0xf77a, 0x7bf7, 0x6b7c, 0x696c, - 0xf969, 0x4cf9, 0x714c, 0x4e71, 0x6b4e, 0x256c, 0x6e25, 0xe96d, 0x94e9, - 0x8f94, 0x3e8f, 0x343e, 0x4634, 0xb646, 0x97b5, 0x8997, 0xe8a, 0x900e, - 0x8090, 0xfd80, 0xa0fd, 0x16a1, 0xf416, 0xebf4, 0x95ec, 0x1196, 0x8911, - 0x3d89, 0xda3c, 0x9fd9, 0xd79f, 0x4bd7, 0x214c, 0x3021, 0x4f30, 0x994e, - 0x5c99, 0x6f5d, 0x326f, 0xab31, 0x6aab, 0xe969, 0x90e9, 0x1190, 0xff10, - 0xa2fe, 0xe0a2, 0x66e1, 0x4067, 0x9e3f, 0x2d9e, 0x712d, 0x8170, 0xd180, - 0xffd1, 0x25ff, 0x3826, 0x2538, 0x5f24, 0xc45e, 0x1cc4, 0xdf1c, 0x93df, - 0xc793, 0x80c7, 0x2380, 0xd223, 0x7ed2, 0xfc7e, 0x22fd, 0x7422, 0x1474, - 0xb714, 0x7db6, 0x857d, 0xa85, 0xa60a, 0x88a6, 0x4289, 0x7842, 0xc278, - 0xf7c2, 0xcdf7, 0x84cd, 0xae84, 0x8cae, 0xb98c, 0x1aba, 0x4d1a, 0x884c, - 0x4688, 0xcc46, 0xd8cb, 0x2bd9, 0xbe2b, 0xa2be, 0x72a2, 0xf772, 0xd2f6, - 0x75d2, 0xc075, 0xa3c0, 0x63a3, 0xae63, 0x8fae, 0x2a90, 0x5f2a, 0xef5f, - 0x5cef, 0xa05c, 0x89a0, 0x5e89, 0x6b5e, 0x736b, 0x773, 0x9d07, 0xe99c, - 0x27ea, 0x2028, 0xc20, 0x980b, 0x4797, 0x2848, 0x9828, 0xc197, 0x48c2, - 0x2449, 0x7024, 0x570, 0x3e05, 0xd3e, 0xf60c, 0xbbf5, 0x69bb, 0x3f6a, - 0x740, 0xf006, 0xe0ef, 0xbbe0, 0xadbb, 0x56ad, 0xcf56, 0xbfce, 0xa9bf, - 0x205b, 0x6920, 0xae69, 0x50ae, 0x2050, 0xf01f, 0x27f0, 0x9427, 0x8993, - 0x8689, 0x4087, 0x6e40, 0xb16e, 0xa1b1, 0xe8a1, 0x87e8, 0x6f88, 0xfe6f, - 0x4cfe, 0xe94d, 0xd5e9, 0x47d6, 0x3148, 0x5f31, 0xc35f, 0x13c4, 0xa413, - 0x5a5, 0x2405, 0xc223, 0x66c2, 0x3667, 0x5e37, 0x5f5e, 0x2f5f, 0x8c2f, - 0xe48c, 0xd0e4, 0x4d1, 0xd104, 0xe4d0, 0xcee4, 0xfcf, 0x480f, 0xa447, - 0x5ea4, 0xff5e, 0xbefe, 0x8dbe, 0x1d8e, 0x411d, 0x1841, 0x6918, 0x5469, - 0x1155, 0xc611, 0xaac6, 0x37ab, 0x2f37, 0xca2e, 0x87ca, 0xbd87, 0xabbd, - 0xb3ab, 0xcb4, 0xce0c, 0xfccd, 0xa5fd, 0x72a5, 0xf072, 0x83f0, 0xfe83, - 0x97fd, 0xc997, 0xb0c9, 0xadb0, 0xe6ac, 0x88e6, 0x1088, 0xbe10, 0x16be, - 0xa916, 0xa3a8, 0x46a3, 0x5447, 0xe953, 0x84e8, 0x2085, 0xa11f, 0xfa1, - 0xdd0f, 0xbedc, 0x5abe, 0x805a, 0xc97f, 0x6dc9, 0x826d, 0x4a82, 0x934a, - 0x5293, 0xd852, 0xd3d8, 0xadd3, 0xf4ad, 0xf3f4, 0xfcf3, 0xfefc, 0xcafe, - 0xb7ca, 0x3cb8, 0xa13c, 0x18a1, 0x1418, 0xea13, 0x91ea, 0xf891, 0x53f8, - 0xa254, 0xe9a2, 0x87ea, 0x4188, 0x1c41, 0xdc1b, 0xf5db, 0xcaf5, 0x45ca, - 0x6d45, 0x396d, 0xde39, 0x90dd, 0x1e91, 0x1e, 0x7b00, 0x6a7b, 0xa46a, - 0xc9a3, 0x9bc9, 0x389b, 0x1139, 0x5211, 0x1f52, 0xeb1f, 0xabeb, 0x48ab, - 0x9348, 0xb392, 0x17b3, 0x1618, 0x5b16, 0x175b, 0xdc17, 0xdedb, 0x1cdf, - 0xeb1c, 0xd1ea, 0x4ad2, 0xd4b, 0xc20c, 0x24c2, 0x7b25, 0x137b, 0x8b13, - 0x618b, 0xa061, 0xff9f, 0xfffe, 0x72ff, 0xf572, 0xe2f5, 0xcfe2, 0xd2cf, - 0x75d3, 0x6a76, 0xc469, 0x1ec4, 0xfc1d, 0x59fb, 0x455a, 0x7a45, 0xa479, - 0xb7a4 + 0xda83, 0xc22a, 0x1162, 0xba49, 0xaf14, 0x4530, 0x4093, 0xb09c, 0xb4c3, + 0x205b, 0xdf2c, 0x034e, 0x5285, 0xfb6c, 0xf037, 0x8653, 0x81b6, 0xf1bf, + 0xf5e6, 0x617e, 0x2050, 0x6a91, 0x7187, 0x1a6f, 0x0f3a, 0xa555, 0xa0b8, + 0x10c2, 0x14e9, 0x8080, 0x3f52, 0x8993, 0x4a70, 0x816d, 0x7638, 0x0c54, + 0x07b7, 0x77c0, 0x7be7, 0xe77e, 0xa650, 0xf091, 0xb16e, 0x8ac5, 0x5afb, + 0xf116, 0xec79, 0x5c83, 0x60aa, 0xcc41, 0x8b13, 0xd554, 0x9631, 0x6f88, + 0x5c54, 0x6aac, 0x660f, 0xd618, 0xda3f, 0x45d7, 0x04a9, 0x4eea, 0x0fc7, + 0xe91d, 0xd5e9, 0xab06, 0x7e68, 0xee71, 0xf298, 0x5e30, 0x1d02, 0x6743, + 0x2820, 0x0177, 0xee42, 0xc35f, 0x733c, 0x9f3a, 0xa361, 0x0ef9, 0xcdca, + 0x180c, 0xd8e8, 0xb23f, 0x9f0b, 0x7428, 0x2405, 0x071f, 0xfa79, 0x6611, + 0x24e3, 0x6f24, 0x3001, 0x0958, 0xf623, 0xcb40, 0x7b1d, 0x5e37, 0xd957, + 0x7146, 0x3018, 0x7a59, 0x3b36, 0x148d, 0x0159, 0xd675, 0x8652, 0x696c, + 0xe48c, 0x7aec, 0x99fc, 0xe43d, 0xa51a, 0x7e71, 0x6b3d, 0x405a, 0xf036, + 0xd350, 0x4e71, 0xe4d0, 0x9faa, 0xe8da, 0xa9b7, 0x830e, 0x6fda, 0x44f7, + 0xf4d3, 0xd7ed, 0x530e, 0xe96d, 0xa447, 0xfdc7, 0x39ae, 0x1305, 0xffd0, + 0xd4ed, 0x84ca, 0x67e4, 0xe304, 0x7964, 0x343e, 0x8dbe, 0x6d3f, 0x0ede, + 0xfba9, 0xd0c6, 0x80a3, 0x63bd, 0xdedd, 0x753d, 0x3017, 0x8997, 0x6918, + 0x165e, 0x9012, 0x652f, 0x150c, 0xf825, 0x7346, 0x09a6, 0xc47f, 0x1e00, + 0xfd80, 0xaac6, 0x469c, 0xa65d, 0x563a, 0x3954, 0xb474, 0x4ad4, 0x05ae, + 0x5f2e, 0x3eaf, 0xebf4, 0x87ca, 0x56f5, 0x0bf9, 0xef12, 0x6a33, 0x0093, + 0xbb6c, 0x14ed, 0xf46d, 0xa1b3, 0x3d89, 0x0cb4, 0x3382, 0x2e36, 0xa956, + 0x3fb6, 0xfa8f, 0x5410, 0x3391, 0xe0d6, 0x7cac, 0x4bd7, 0x72a5, 0x7154, + 0xcfff, 0x665f, 0x2139, 0x7ab9, 0x5a3a, 0x0780, 0xa355, 0x7280, 0x994e, + 0x97fd, 0xd378, 0x7993, 0x346d, 0x8ded, 0x6d6e, 0x1ab4, 0xb689, 0x85b4, + 0xac82, 0xab31, 0xe6ac, 0xebda, 0x5f50, 0xb8d0, 0x9851, 0x4597, 0xe16c, + 0xb097, 0xd765, 0xd614, 0x1190, 0x16be, 0x0424, 0x08f4, 0xe874, 0x95ba, + 0x3190, 0x00bb, 0x2789, 0x2638, 0x61b3, 0x66e1, 0x5447, 0x8439, 0x055b, + 0xb2a0, 0x4e76, 0x1da1, 0x446f, 0x431e, 0x7e99, 0x83c7, 0x712d, 0xa11f, + 0xd5de, 0x3780, 0xd355, 0xa280, 0xc94e, 0xc7fd, 0x0379, 0x08a7, 0xf60c, + 0x25ff, 0x5abe, 0x18cd, 0x3cf6, 0x0c21, 0x32ef, 0x319e, 0x6d19, 0x7247, + 0x5fad, 0x8f9f, 0xc45e, 0x826d, 0x932c, 0x5147, 0x7815, 0x76c4, 0xb23f, + 0xb76d, 0xa4d3, 0xd4c5, 0x0985, 0xc793, 0xd852, 0x4d75, 0x1e95, 0x1d44, + 0x58bf, 0x5ded, 0x4b53, 0x7b45, 0xb004, 0x6e13, 0x7ed2, 0xf3f4, 0x974b, + 0x3dc3, 0x793e, 0x7e6c, 0x6bd2, 0x9bc4, 0xd083, 0x8e92, 0x9f51, 0x1474, + 0xb7ca, 0xc15d, 0xcbf8, 0xd126, 0xbe8c, 0xee7e, 0x233e, 0xe14c, 0xf20b, + 0x672e, 0x0a85, 0x1418, 0xefcd, 0x3551, 0x22b7, 0x52a9, 0x8768, 0x4577, + 0x5636, 0xcb58, 0x6eaf, 0x7842, 0x53f8, 0x10b3, 0x538c, 0x837e, 0xb83d, + 0x764c, 0x870b, 0xfc2d, 0x9f84, 0xa917, 0x84cd, 0x4188, 0xf1c3, 0x5cb0, + 0x916f, 0x4f7e, 0x603d, 0xd55f, 0x78b6, 0x8249, 0x5dff, 0x1aba, 0xcaf5, + 0xdce8, 0x92c0, 0x50cf, 0x618e, 0xd6b0, 0x7a07, 0x839a, 0x5f50, 0x1c0b, + 0xcc46, 0xde39, 0xb67b, 0x1554, 0x2613, 0x9b35, 0x3e8c, 0x481f, 0x23d5, + 0xe08f, 0x90cb, 0xa2be, 0x7b00, 0xa0f7, 0x20e5, 0x9607, 0x395e, 0x42f1, + 0x1ea7, 0xdb61, 0x8b9d, 0x9d90, 0x75d2, 0x9bc9, 0x0cb8, 0xa8a1, 0x4bf8, + 0x558b, 0x3141, 0xedfb, 0x9e37, 0xb02a, 0x886c, 0xae63, 0x1f52, 0xc33a, + 0x1c06, 0x2599, 0x014f, 0xbe09, 0x6e45, 0x8038, 0x587a, 0x7e71, 0xef5f, + 0x9348, 0x8fd5, 0xf0d9, 0xcc8f, 0x894a, 0x3986, 0x4b79, 0x23bb, 0x49b2, + 0xbaa0, 0x5e89, 0x5b16, 0xdaed, 0x0e81, 0xcb3b, 0x7b77, 0x8d6a, 0x65ac, + 0x8ba3, 0xfc91, 0xa07a, 0x9d07, 0x1cdf, 0x1e0a, 0xba7c, 0x6ab8, 0x7cab, + 0x54ed, 0x7ae4, 0xebd2, 0x8fbb, 0x8c48, 0x0c20, 0x0d4b, 0x889d, 0xf595, + 0x0789, 0xdfca, 0x05c2, 0x76b0, 0x1a99, 0x1726, 0x96fd, 0x9828, 0x137b, + 0xa2f6, 0x6432, 0x3c74, 0x626b, 0xd359, 0x7742, 0x73cf, 0xf3a6, 0xf4d1, + 0x7024, 0xff9f, 0xec88, 0x32e1, 0x58d8, 0xc9c6, 0x6daf, 0x6a3c, 0xea13, + 0xeb3e, 0x6691, 0xf60c, 0xe2f5, 0x462c, 0x7d22, 0xee10, 0x91f9, 0x8e86, + 0x0e5e, 0x0f89, 0x8adb, 0x1a57, 0x0740, 0x6a76, 0x16b6, 0x3156, 0xd53e, + 0xd1cb, 0x51a3, 0x52ce, 0xce20, 0x5d9c, 0x4a85, 0xadbb, 0x59fb, 0x67e0, + 0x2503, 0x2190, 0xa167, 0xa292, 0x1de5, 0xad60, 0x9a49, 0xfd7f, 0xa9bf, + 0xb7a4, 0xd378, 0x0f9d, 0x8f74, 0x909f, 0x0bf2, 0x9b6d, 0x8856, 0xeb8c, + 0x97cc, 0xa5b1, 0xc185, 0x49ee, 0xb732, 0xb85d, 0x33b0, 0xc32b, 0xb014, + 0x134b, 0xbf8a, 0xcd6f, 0xe943, 0x71ac, 0xd9e4, 0x9266, 0x0db9, 0x9d34, + 0x8a1d, 0xed53, 0x9993, 0xa778, 0xc34c, 0x4bb5, 0xb3ed, 0x4e5a, 0x9cca, + 0x2c46, 0x192f, 0x7c65, 0x28a5, 0x368a, 0x525e, 0xdac6, 0x42ff, 0xdd6b, + 0x714b, 0x885d, 0x7546, 0xd87c, 0x84bc, 0x92a1, 0xae75, 0x36de, 0x9f16, + 0x3983, 0xcd62, 0x207d, 0x78b9, 0xdbef, 0x882f, 0x9614, 0xb1e8, 0x3a51, + 0xa289, 0x3cf6, 0xd0d5, 0x23f0, 0x357c, 0x5c18, 0x0858, 0x163d, 0x3211, + 0xba79, 0x22b2, 0xbd1e, 0x50fe, 0xa418, 0xb5a4, 0xc30d, 0x072d, 0x1512, + 0x30e6, 0xb94e, 0x2187, 0xbbf3, 0x4fd3, 0xa2ed, 0xb479, 0xc1e2, 0x71a6, + 0x99bf, 0xb593, 0x3dfc, 0xa634, 0x40a1, 0xd480, 0x279b, 0x3927, 0x4690, + 0xf653, 0x23e6, 0x2618, 0xae80, 0x16b9, 0xb125, 0x4505, 0x981f, 0xa9ab, + 0xb714, 0x66d8, 0x946a, 0xa5fe, 0xc197, 0x29d0, 0xc43c, 0x581c, 0xab36, + 0xbcc2, 0xca2b, 0x79ef, 0xa781, 0xb915, 0xd950, 0xc699, 0x6106, 0xf4e5, + 0x4800, 0x598c, 0x66f5, 0x16b9, 0x444b, 0x55df, 0x761a, 0xdd70, 0xb4c6, + 0x48a6, 0x9bc0, 0xad4c, 0xbab5, 0x6a79, 0x980b, 0xa99f, 0xc9da, 0x3131, + 0xcb00, 0x3ac1, 0x8ddb, 0x9f67, 0xacd0, 0x5c94, 0x8a26, 0x9bba, 0xbbf5, + 0x234c, 0xbd1b, 0x92d9, 0x7207, 0x8393, 0x90fc, 0x40c0, 0x6e52, 0x7fe6, + 0xa021, 0x0778, 0xa147, 0x7705, 0xcda4, 0xfb2a, 0x0894, 0xb857, 0xe5e9, + 0xf77d, 0x17b9, 0x7f0f, 0x18df, 0xee9c, 0x453c, 0xaf9a, 0xa05b, 0x501f, + 0x7db1, 0x8f45, 0xaf80, 0x16d7, 0xb0a6, 0x8664, 0xdd03, 0x4762, 0x54ce, + 0xb5b2, 0xe344, 0xf4d8, 0x1514, 0x7c6a, 0x163a, 0xebf7, 0x4297, 0xacf5, + 0xba61, 0x4bc4, 0x4f65, 0x60f9, 0x8134, 0xe88a, 0x825a, 0x5818, 0xaeb7, + 0x1916, 0x2682, 0xb7e4, 0x2019, 0x0ddf, 0x2e1a, 0x9570, 0x2f40, 0x04fe, + 0x5b9d, 0xc5fb, 0xd367, 0x64ca, 0xccfe, 0xea68, 0x1c8e, 0x83e4, 0x1db4, + 0xf371, 0x4a11, 0xb46f, 0xc1db, 0x533e, 0xbb72, 0xd8dc, 0x246b, 0x767b, + 0x104b, 0xe608, 0x3ca8, 0xa706, 0xb472, 0x45d5, 0xae09, 0xcb73, 0x1702, + 0x0396, }; static u8 tmp_buf[TEST_BUFLEN]; @@ -579,14 +452,19 @@ static void test_ip_fast_csum(struct kunit *test) { __sum16 csum_result; u16 expected; + int num_tests = (MAX_LEN / WORD_ALIGNMENT - IPv4_MAX_WORDS * WORD_ALIGNMENT); - for (int len = IPv4_MIN_WORDS; len < IPv4_MAX_WORDS; len++) { - for (int index = 0; index < NUM_IP_FAST_CSUM_TESTS; index++) { - csum_result = ip_fast_csum(random_buf + index, len); - expected = - expected_fast_csum[(len - IPv4_MIN_WORDS) * - NUM_IP_FAST_CSUM_TESTS + - index]; + for (int i = 0; i < num_tests; i++) { + memcpy(&tmp_buf[IP_ALIGNMENT], + random_buf + (i * WORD_ALIGNMENT), + IPv4_MAX_WORDS * WORD_ALIGNMENT); + + for (int len = IPv4_MIN_WORDS; len <= IPv4_MAX_WORDS; len++) { + int index = (len - IPv4_MIN_WORDS) + + i * ((IPv4_MAX_WORDS - IPv4_MIN_WORDS) + 1); + + expected = expected_fast_csum[index]; + csum_result = ip_fast_csum(tmp_buf + IP_ALIGNMENT, len); CHECK_EQ(to_sum16(expected), csum_result); } } @@ -595,28 +473,35 @@ static void test_ip_fast_csum(struct kunit *test) static void test_csum_ipv6_magic(struct kunit *test) { #if defined(CONFIG_NET) - const struct in6_addr *saddr; - const struct in6_addr *daddr; + struct csum_ipv6_magic_data { + const struct in6_addr saddr; + const struct in6_addr daddr; + __le16 len; + unsigned char pad[2]; + __wsum csum; + unsigned char proto; + unsigned char pad2[3]; + } *data; unsigned int len; - unsigned char proto; - __wsum csum; - - const int daddr_offset = sizeof(struct in6_addr); - const int len_offset = sizeof(struct in6_addr) + sizeof(struct in6_addr); - const int proto_offset = sizeof(struct in6_addr) + sizeof(struct in6_addr) + - sizeof(int); - const int csum_offset = sizeof(struct in6_addr) + sizeof(struct in6_addr) + - sizeof(int) + sizeof(char); - - for (int i = 0; i < NUM_IPv6_TESTS; i++) { - saddr = (const struct in6_addr *)(random_buf + i); - daddr = (const struct in6_addr *)(random_buf + i + - daddr_offset); - len = le32_to_cpu(*(__le32 *)(random_buf + i + len_offset)); - proto = *(random_buf + i + proto_offset); - csum = *(__wsum *)(random_buf + i + csum_offset); + __sum16 csum_result; + int ipv6_num_tests = ((MAX_LEN - sizeof(struct csum_ipv6_magic_data)) / WORD_ALIGNMENT); + + /* + * Alignment of struct is used to collect deterministic values from + * random_buf. + */ + BUILD_BUG_ON_MSG(sizeof(struct csum_ipv6_magic_data) != 44, + "Size of struct csum_ipv6_magic_data must be 44 bytes."); + + for (int i = 0; i < ipv6_num_tests; i++) { + int index = i * WORD_ALIGNMENT; + + data = (struct csum_ipv6_magic_data *)(random_buf + index); + len = le16_to_cpu(data->len); + csum_result = csum_ipv6_magic(&data->saddr, &data->daddr, len, + data->proto, data->csum); CHECK_EQ(to_sum16(expected_csum_ipv6_magic[i]), - csum_ipv6_magic(saddr, daddr, len, proto, csum)); + csum_result); } #endif /* !CONFIG_NET */ }