* [PATCH net-next 0/5] SCTP fix/updates @ 2013-10-30 10:50 Daniel Borkmann 2013-10-30 10:50 ` [PATCH net-next 1/5] lib: crc32: clean up spacing in test cases Daniel Borkmann ` (7 more replies) 0 siblings, 8 replies; 17+ messages in thread From: Daniel Borkmann @ 2013-10-30 10:50 UTC (permalink / raw) To: davem; +Cc: netdev, linux-sctp Please see patch 5 for the main description/motivation, the rest just brings in the needed functionality for that. Although this is actually a fix, I've based it against net-next as some additional work for fixing it was needed. Thanks! Daniel Borkmann (5): lib: crc32: clean up spacing in test cases lib: crc32: add functionality to combine two crc32{,c}s in GF(2) lib: crc32: add test cases for crc32{,c}_combine routines net: skb_checksum: allow custom update/combine for walking skb net: sctp: fix and consolidate SCTP checksumming code include/linux/crc32.h | 40 ++++ include/linux/skbuff.h | 13 +- include/net/checksum.h | 6 + include/net/sctp/checksum.h | 56 ++---- lib/crc32.c | 453 +++++++++++++++++++++++++------------------- net/core/skbuff.c | 31 ++- net/sctp/output.c | 9 +- 7 files changed, 350 insertions(+), 258 deletions(-) -- 1.8.3.1 ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH net-next 1/5] lib: crc32: clean up spacing in test cases 2013-10-30 10:50 [PATCH net-next 0/5] SCTP fix/updates Daniel Borkmann @ 2013-10-30 10:50 ` Daniel Borkmann 2013-10-30 13:56 ` Joe Perches 2013-10-30 10:50 ` [PATCH net-next 2/5] lib: crc32: add functionality to combine two crc32{,c}s in GF(2) Daniel Borkmann ` (6 subsequent siblings) 7 siblings, 1 reply; 17+ messages in thread From: Daniel Borkmann @ 2013-10-30 10:50 UTC (permalink / raw) To: davem; +Cc: netdev, linux-sctp, linux-kernel This is nothing more but a whitepace cleanup, as 80 chars is not a hard but soft limit, and otherwise makes the test cases arrary really look ugly. So fix it up. Signed-off-by: Daniel Borkmann <dborkman@redhat.com> Cc: linux-kernel@vger.kernel.org --- lib/crc32.c | 300 ++++++++++++++++++++---------------------------------------- 1 file changed, 100 insertions(+), 200 deletions(-) diff --git a/lib/crc32.c b/lib/crc32.c index 410093d..429d61c 100644 --- a/lib/crc32.c +++ b/lib/crc32.c @@ -795,206 +795,106 @@ static struct crc_test { u32 crc32c_le; /* expected crc32c_le result */ } test[] = { - {0x674bf11d, 0x00000038, 0x00000542, 0x0af6d466, 0xd8b6e4c1, - 0xf6e93d6c}, - {0x35c672c6, 0x0000003a, 0x000001aa, 0xc6d3dfba, 0x28aaf3ad, - 0x0fe92aca}, - {0x496da28e, 0x00000039, 0x000005af, 0xd933660f, 0x5d57e81f, - 0x52e1ebb8}, - {0x09a9b90e, 0x00000027, 0x000001f8, 0xb45fe007, 0xf45fca9a, - 0x0798af9a}, - {0xdc97e5a9, 0x00000025, 0x000003b6, 0xf81a3562, 0xe0126ba2, - 0x18eb3152}, - {0x47c58900, 0x0000000a, 0x000000b9, 0x8e58eccf, 0xf3afc793, - 0xd00d08c7}, - {0x292561e8, 0x0000000c, 0x00000403, 0xa2ba8aaf, 0x0b797aed, - 0x8ba966bc}, - {0x415037f6, 0x00000003, 0x00000676, 0xa17d52e8, 0x7f0fdf35, - 0x11d694a2}, - {0x3466e707, 0x00000026, 0x00000042, 0x258319be, 0x75c484a2, - 0x6ab3208d}, - {0xafd1281b, 0x00000023, 0x000002ee, 0x4428eaf8, 0x06c7ad10, - 0xba4603c5}, - {0xd3857b18, 0x00000028, 0x000004a2, 0x5c430821, 0xb062b7cb, - 0xe6071c6f}, - {0x1d825a8f, 0x0000002b, 0x0000050b, 0xd2c45f0c, 0xd68634e0, - 0x179ec30a}, - {0x5033e3bc, 0x0000000b, 0x00000078, 0xa3ea4113, 0xac6d31fb, - 0x0903beb8}, - {0x94f1fb5e, 0x0000000f, 0x000003a2, 0xfbfc50b1, 0x3cfe50ed, - 0x6a7cb4fa}, - {0xc9a0fe14, 0x00000009, 0x00000473, 0x5fb61894, 0x87070591, - 0xdb535801}, - {0x88a034b1, 0x0000001c, 0x000005ad, 0xc1b16053, 0x46f95c67, - 0x92bed597}, - {0xf0f72239, 0x00000020, 0x0000026d, 0xa6fa58f3, 0xf8c2c1dd, - 0x192a3f1b}, - {0xcc20a5e3, 0x0000003b, 0x0000067a, 0x7740185a, 0x308b979a, - 0xccbaec1a}, - {0xce589c95, 0x0000002b, 0x00000641, 0xd055e987, 0x40aae25b, - 0x7eabae4d}, - {0x78edc885, 0x00000035, 0x000005be, 0xa39cb14b, 0x035b0d1f, - 0x28c72982}, - {0x9d40a377, 0x0000003b, 0x00000038, 0x1f47ccd2, 0x197fbc9d, - 0xc3cd4d18}, - {0x703d0e01, 0x0000003c, 0x000006f1, 0x88735e7c, 0xfed57c5a, - 0xbca8f0e7}, - {0x776bf505, 0x0000000f, 0x000005b2, 0x5cc4fc01, 0xf32efb97, - 0x713f60b3}, - {0x4a3e7854, 0x00000027, 0x000004b8, 0x8d923c82, 0x0cbfb4a2, - 0xebd08fd5}, - {0x209172dd, 0x0000003b, 0x00000356, 0xb89e9c2b, 0xd7868138, - 0x64406c59}, - {0x3ba4cc5b, 0x0000002f, 0x00000203, 0xe51601a9, 0x5b2a1032, - 0x7421890e}, - {0xfc62f297, 0x00000000, 0x00000079, 0x71a8e1a2, 0x5d88685f, - 0xe9347603}, - {0x64280b8b, 0x00000016, 0x000007ab, 0x0fa7a30c, 0xda3a455f, - 0x1bef9060}, - {0x97dd724b, 0x00000033, 0x000007ad, 0x5788b2f4, 0xd7326d32, - 0x34720072}, - {0x61394b52, 0x00000035, 0x00000571, 0xc66525f1, 0xcabe7fef, - 0x48310f59}, - {0x29b4faff, 0x00000024, 0x0000006e, 0xca13751e, 0x993648e0, - 0x783a4213}, - {0x29bfb1dc, 0x0000000b, 0x00000244, 0x436c43f7, 0x429f7a59, - 0x9e8efd41}, - {0x86ae934b, 0x00000035, 0x00000104, 0x0760ec93, 0x9cf7d0f4, - 0xfc3d34a5}, - {0xc4c1024e, 0x0000002e, 0x000006b1, 0x6516a3ec, 0x19321f9c, - 0x17a52ae2}, - {0x3287a80a, 0x00000026, 0x00000496, 0x0b257eb1, 0x754ebd51, - 0x886d935a}, - {0xa4db423e, 0x00000023, 0x0000045d, 0x9b3a66dc, 0x873e9f11, - 0xeaaeaeb2}, - {0x7a1078df, 0x00000015, 0x0000014a, 0x8c2484c5, 0x6a628659, - 0x8e900a4b}, - {0x6048bd5b, 0x00000006, 0x0000006a, 0x897e3559, 0xac9961af, - 0xd74662b1}, - {0xd8f9ea20, 0x0000003d, 0x00000277, 0x60eb905b, 0xed2aaf99, - 0xd26752ba}, - {0xea5ec3b4, 0x0000002a, 0x000004fe, 0x869965dc, 0x6c1f833b, - 0x8b1fcd62}, - {0x2dfb005d, 0x00000016, 0x00000345, 0x6a3b117e, 0xf05e8521, - 0xf54342fe}, - {0x5a214ade, 0x00000020, 0x000005b6, 0x467f70be, 0xcb22ccd3, - 0x5b95b988}, - {0xf0ab9cca, 0x00000032, 0x00000515, 0xed223df3, 0x7f3ef01d, - 0x2e1176be}, - {0x91b444f9, 0x0000002e, 0x000007f8, 0x84e9a983, 0x5676756f, - 0x66120546}, - {0x1b5d2ddb, 0x0000002e, 0x0000012c, 0xba638c4c, 0x3f42047b, - 0xf256a5cc}, - {0xd824d1bb, 0x0000003a, 0x000007b5, 0x6288653b, 0x3a3ebea0, - 0x4af1dd69}, - {0x0470180c, 0x00000034, 0x000001f0, 0x9d5b80d6, 0x3de08195, - 0x56f0a04a}, - {0xffaa3a3f, 0x00000036, 0x00000299, 0xf3a82ab8, 0x53e0c13d, - 0x74f6b6b2}, - {0x6406cfeb, 0x00000023, 0x00000600, 0xa920b8e8, 0xe4e2acf4, - 0x085951fd}, - {0xb24aaa38, 0x0000003e, 0x000004a1, 0x657cc328, 0x5077b2c3, - 0xc65387eb}, - {0x58b2ab7c, 0x00000039, 0x000002b4, 0x3a17ee7e, 0x9dcb3643, - 0x1ca9257b}, - {0x3db85970, 0x00000006, 0x000002b6, 0x95268b59, 0xb9812c10, - 0xfd196d76}, - {0x857830c5, 0x00000003, 0x00000590, 0x4ef439d5, 0xf042161d, - 0x5ef88339}, - {0xe1fcd978, 0x0000003e, 0x000007d8, 0xae8d8699, 0xce0a1ef5, - 0x2c3714d9}, - {0xb982a768, 0x00000016, 0x000006e0, 0x62fad3df, 0x5f8a067b, - 0x58576548}, - {0x1d581ce8, 0x0000001e, 0x0000058b, 0xf0f5da53, 0x26e39eee, - 0xfd7c57de}, - {0x2456719b, 0x00000025, 0x00000503, 0x4296ac64, 0xd50e4c14, - 0xd5fedd59}, - {0xfae6d8f2, 0x00000000, 0x0000055d, 0x057fdf2e, 0x2a31391a, - 0x1cc3b17b}, - {0xcba828e3, 0x00000039, 0x000002ce, 0xe3f22351, 0x8f00877b, - 0x270eed73}, - {0x13d25952, 0x0000000a, 0x0000072d, 0x76d4b4cc, 0x5eb67ec3, - 0x91ecbb11}, - {0x0342be3f, 0x00000015, 0x00000599, 0xec75d9f1, 0x9d4d2826, - 0x05ed8d0c}, - {0xeaa344e0, 0x00000014, 0x000004d8, 0x72a4c981, 0x2064ea06, - 0x0b09ad5b}, - {0xbbb52021, 0x0000003b, 0x00000272, 0x04af99fc, 0xaf042d35, - 0xf8d511fb}, - {0xb66384dc, 0x0000001d, 0x000007fc, 0xd7629116, 0x782bd801, - 0x5ad832cc}, - {0x616c01b6, 0x00000022, 0x000002c8, 0x5b1dab30, 0x783ce7d2, - 0x1214d196}, - {0xce2bdaad, 0x00000016, 0x0000062a, 0x932535c8, 0x3f02926d, - 0x5747218a}, - {0x00fe84d7, 0x00000005, 0x00000205, 0x850e50aa, 0x753d649c, - 0xde8f14de}, - {0xbebdcb4c, 0x00000006, 0x0000055d, 0xbeaa37a2, 0x2d8c9eba, - 0x3563b7b9}, - {0xd8b1a02a, 0x00000010, 0x00000387, 0x5017d2fc, 0x503541a5, - 0x071475d0}, - {0x3b96cad2, 0x00000036, 0x00000347, 0x1d2372ae, 0x926cd90b, - 0x54c79d60}, - {0xc94c1ed7, 0x00000005, 0x0000038b, 0x9e9fdb22, 0x144a9178, - 0x4c53eee6}, - {0x1aad454e, 0x00000025, 0x000002b2, 0xc3f6315c, 0x5c7a35b3, - 0x10137a3c}, - {0xa4fec9a6, 0x00000000, 0x000006d6, 0x90be5080, 0xa4107605, - 0xaa9d6c73}, - {0x1bbe71e2, 0x0000001f, 0x000002fd, 0x4e504c3b, 0x284ccaf1, - 0xb63d23e7}, - {0x4201c7e4, 0x00000002, 0x000002b7, 0x7822e3f9, 0x0cc912a9, - 0x7f53e9cf}, - {0x23fddc96, 0x00000003, 0x00000627, 0x8a385125, 0x07767e78, - 0x13c1cd83}, - {0xd82ba25c, 0x00000016, 0x0000063e, 0x98e4148a, 0x283330c9, - 0x49ff5867}, - {0x786f2032, 0x0000002d, 0x0000060f, 0xf201600a, 0xf561bfcd, - 0x8467f211}, - {0xfebe4e1f, 0x0000002a, 0x000004f2, 0x95e51961, 0xfd80dcab, - 0x3f9683b2}, - {0x1a6e0a39, 0x00000008, 0x00000672, 0x8af6c2a5, 0x78dd84cb, - 0x76a3f874}, - {0x56000ab8, 0x0000000e, 0x000000e5, 0x36bacb8f, 0x22ee1f77, - 0x863b702f}, - {0x4717fe0c, 0x00000000, 0x000006ec, 0x8439f342, 0x5c8e03da, - 0xdc6c58ff}, - {0xd5d5d68e, 0x0000003c, 0x000003a3, 0x46fff083, 0x177d1b39, - 0x0622cc95}, - {0xc25dd6c6, 0x00000024, 0x000006c0, 0x5ceb8eb4, 0x892b0d16, - 0xe85605cd}, - {0xe9b11300, 0x00000023, 0x00000683, 0x07a5d59a, 0x6c6a3208, - 0x31da5f06}, - {0x95cd285e, 0x00000001, 0x00000047, 0x7b3a4368, 0x0202c07e, - 0xa1f2e784}, - {0xd9245a25, 0x0000001e, 0x000003a6, 0xd33c1841, 0x1936c0d5, - 0xb07cc616}, - {0x103279db, 0x00000006, 0x0000039b, 0xca09b8a0, 0x77d62892, - 0xbf943b6c}, - {0x1cba3172, 0x00000027, 0x000001c8, 0xcb377194, 0xebe682db, - 0x2c01af1c}, - {0x8f613739, 0x0000000c, 0x000001df, 0xb4b0bc87, 0x7710bd43, - 0x0fe5f56d}, - {0x1c6aa90d, 0x0000001b, 0x0000053c, 0x70559245, 0xda7894ac, - 0xf8943b2d}, - {0xaabe5b93, 0x0000003d, 0x00000715, 0xcdbf42fa, 0x0c3b99e7, - 0xe4d89272}, - {0xf15dd038, 0x00000006, 0x000006db, 0x6e104aea, 0x8d5967f2, - 0x7c2f6bbb}, - {0x584dd49c, 0x00000020, 0x000007bc, 0x36b6cfd6, 0xad4e23b2, - 0xabbf388b}, - {0x5d8c9506, 0x00000020, 0x00000470, 0x4c62378e, 0x31d92640, - 0x1dca1f4e}, - {0xb80d17b0, 0x00000032, 0x00000346, 0x22a5bb88, 0x9a7ec89f, - 0x5c170e23}, - {0xdaf0592e, 0x00000023, 0x000007b0, 0x3cab3f99, 0x9b1fdd99, - 0xc0e9d672}, - {0x4793cc85, 0x0000000d, 0x00000706, 0xe82e04f6, 0xed3db6b7, - 0xc18bdc86}, - {0x82ebf64e, 0x00000009, 0x000007c3, 0x69d590a9, 0x9efa8499, - 0xa874fcdd}, - {0xb18a0319, 0x00000026, 0x000007db, 0x1cf98dcc, 0x8fa9ad6a, - 0x9dc0bb48}, + {0x674bf11d, 0x00000038, 0x00000542, 0x0af6d466, 0xd8b6e4c1, 0xf6e93d6c}, + {0x35c672c6, 0x0000003a, 0x000001aa, 0xc6d3dfba, 0x28aaf3ad, 0x0fe92aca}, + {0x496da28e, 0x00000039, 0x000005af, 0xd933660f, 0x5d57e81f, 0x52e1ebb8}, + {0x09a9b90e, 0x00000027, 0x000001f8, 0xb45fe007, 0xf45fca9a, 0x0798af9a}, + {0xdc97e5a9, 0x00000025, 0x000003b6, 0xf81a3562, 0xe0126ba2, 0x18eb3152}, + {0x47c58900, 0x0000000a, 0x000000b9, 0x8e58eccf, 0xf3afc793, 0xd00d08c7}, + {0x292561e8, 0x0000000c, 0x00000403, 0xa2ba8aaf, 0x0b797aed, 0x8ba966bc}, + {0x415037f6, 0x00000003, 0x00000676, 0xa17d52e8, 0x7f0fdf35, 0x11d694a2}, + {0x3466e707, 0x00000026, 0x00000042, 0x258319be, 0x75c484a2, 0x6ab3208d}, + {0xafd1281b, 0x00000023, 0x000002ee, 0x4428eaf8, 0x06c7ad10, 0xba4603c5}, + {0xd3857b18, 0x00000028, 0x000004a2, 0x5c430821, 0xb062b7cb, 0xe6071c6f}, + {0x1d825a8f, 0x0000002b, 0x0000050b, 0xd2c45f0c, 0xd68634e0, 0x179ec30a}, + {0x5033e3bc, 0x0000000b, 0x00000078, 0xa3ea4113, 0xac6d31fb, 0x0903beb8}, + {0x94f1fb5e, 0x0000000f, 0x000003a2, 0xfbfc50b1, 0x3cfe50ed, 0x6a7cb4fa}, + {0xc9a0fe14, 0x00000009, 0x00000473, 0x5fb61894, 0x87070591, 0xdb535801}, + {0x88a034b1, 0x0000001c, 0x000005ad, 0xc1b16053, 0x46f95c67, 0x92bed597}, + {0xf0f72239, 0x00000020, 0x0000026d, 0xa6fa58f3, 0xf8c2c1dd, 0x192a3f1b}, + {0xcc20a5e3, 0x0000003b, 0x0000067a, 0x7740185a, 0x308b979a, 0xccbaec1a}, + {0xce589c95, 0x0000002b, 0x00000641, 0xd055e987, 0x40aae25b, 0x7eabae4d}, + {0x78edc885, 0x00000035, 0x000005be, 0xa39cb14b, 0x035b0d1f, 0x28c72982}, + {0x9d40a377, 0x0000003b, 0x00000038, 0x1f47ccd2, 0x197fbc9d, 0xc3cd4d18}, + {0x703d0e01, 0x0000003c, 0x000006f1, 0x88735e7c, 0xfed57c5a, 0xbca8f0e7}, + {0x776bf505, 0x0000000f, 0x000005b2, 0x5cc4fc01, 0xf32efb97, 0x713f60b3}, + {0x4a3e7854, 0x00000027, 0x000004b8, 0x8d923c82, 0x0cbfb4a2, 0xebd08fd5}, + {0x209172dd, 0x0000003b, 0x00000356, 0xb89e9c2b, 0xd7868138, 0x64406c59}, + {0x3ba4cc5b, 0x0000002f, 0x00000203, 0xe51601a9, 0x5b2a1032, 0x7421890e}, + {0xfc62f297, 0x00000000, 0x00000079, 0x71a8e1a2, 0x5d88685f, 0xe9347603}, + {0x64280b8b, 0x00000016, 0x000007ab, 0x0fa7a30c, 0xda3a455f, 0x1bef9060}, + {0x97dd724b, 0x00000033, 0x000007ad, 0x5788b2f4, 0xd7326d32, 0x34720072}, + {0x61394b52, 0x00000035, 0x00000571, 0xc66525f1, 0xcabe7fef, 0x48310f59}, + {0x29b4faff, 0x00000024, 0x0000006e, 0xca13751e, 0x993648e0, 0x783a4213}, + {0x29bfb1dc, 0x0000000b, 0x00000244, 0x436c43f7, 0x429f7a59, 0x9e8efd41}, + {0x86ae934b, 0x00000035, 0x00000104, 0x0760ec93, 0x9cf7d0f4, 0xfc3d34a5}, + {0xc4c1024e, 0x0000002e, 0x000006b1, 0x6516a3ec, 0x19321f9c, 0x17a52ae2}, + {0x3287a80a, 0x00000026, 0x00000496, 0x0b257eb1, 0x754ebd51, 0x886d935a}, + {0xa4db423e, 0x00000023, 0x0000045d, 0x9b3a66dc, 0x873e9f11, 0xeaaeaeb2}, + {0x7a1078df, 0x00000015, 0x0000014a, 0x8c2484c5, 0x6a628659, 0x8e900a4b}, + {0x6048bd5b, 0x00000006, 0x0000006a, 0x897e3559, 0xac9961af, 0xd74662b1}, + {0xd8f9ea20, 0x0000003d, 0x00000277, 0x60eb905b, 0xed2aaf99, 0xd26752ba}, + {0xea5ec3b4, 0x0000002a, 0x000004fe, 0x869965dc, 0x6c1f833b, 0x8b1fcd62}, + {0x2dfb005d, 0x00000016, 0x00000345, 0x6a3b117e, 0xf05e8521, 0xf54342fe}, + {0x5a214ade, 0x00000020, 0x000005b6, 0x467f70be, 0xcb22ccd3, 0x5b95b988}, + {0xf0ab9cca, 0x00000032, 0x00000515, 0xed223df3, 0x7f3ef01d, 0x2e1176be}, + {0x91b444f9, 0x0000002e, 0x000007f8, 0x84e9a983, 0x5676756f, 0x66120546}, + {0x1b5d2ddb, 0x0000002e, 0x0000012c, 0xba638c4c, 0x3f42047b, 0xf256a5cc}, + {0xd824d1bb, 0x0000003a, 0x000007b5, 0x6288653b, 0x3a3ebea0, 0x4af1dd69}, + {0x0470180c, 0x00000034, 0x000001f0, 0x9d5b80d6, 0x3de08195, 0x56f0a04a}, + {0xffaa3a3f, 0x00000036, 0x00000299, 0xf3a82ab8, 0x53e0c13d, 0x74f6b6b2}, + {0x6406cfeb, 0x00000023, 0x00000600, 0xa920b8e8, 0xe4e2acf4, 0x085951fd}, + {0xb24aaa38, 0x0000003e, 0x000004a1, 0x657cc328, 0x5077b2c3, 0xc65387eb}, + {0x58b2ab7c, 0x00000039, 0x000002b4, 0x3a17ee7e, 0x9dcb3643, 0x1ca9257b}, + {0x3db85970, 0x00000006, 0x000002b6, 0x95268b59, 0xb9812c10, 0xfd196d76}, + {0x857830c5, 0x00000003, 0x00000590, 0x4ef439d5, 0xf042161d, 0x5ef88339}, + {0xe1fcd978, 0x0000003e, 0x000007d8, 0xae8d8699, 0xce0a1ef5, 0x2c3714d9}, + {0xb982a768, 0x00000016, 0x000006e0, 0x62fad3df, 0x5f8a067b, 0x58576548}, + {0x1d581ce8, 0x0000001e, 0x0000058b, 0xf0f5da53, 0x26e39eee, 0xfd7c57de}, + {0x2456719b, 0x00000025, 0x00000503, 0x4296ac64, 0xd50e4c14, 0xd5fedd59}, + {0xfae6d8f2, 0x00000000, 0x0000055d, 0x057fdf2e, 0x2a31391a, 0x1cc3b17b}, + {0xcba828e3, 0x00000039, 0x000002ce, 0xe3f22351, 0x8f00877b, 0x270eed73}, + {0x13d25952, 0x0000000a, 0x0000072d, 0x76d4b4cc, 0x5eb67ec3, 0x91ecbb11}, + {0x0342be3f, 0x00000015, 0x00000599, 0xec75d9f1, 0x9d4d2826, 0x05ed8d0c}, + {0xeaa344e0, 0x00000014, 0x000004d8, 0x72a4c981, 0x2064ea06, 0x0b09ad5b}, + {0xbbb52021, 0x0000003b, 0x00000272, 0x04af99fc, 0xaf042d35, 0xf8d511fb}, + {0xb66384dc, 0x0000001d, 0x000007fc, 0xd7629116, 0x782bd801, 0x5ad832cc}, + {0x616c01b6, 0x00000022, 0x000002c8, 0x5b1dab30, 0x783ce7d2, 0x1214d196}, + {0xce2bdaad, 0x00000016, 0x0000062a, 0x932535c8, 0x3f02926d, 0x5747218a}, + {0x00fe84d7, 0x00000005, 0x00000205, 0x850e50aa, 0x753d649c, 0xde8f14de}, + {0xbebdcb4c, 0x00000006, 0x0000055d, 0xbeaa37a2, 0x2d8c9eba, 0x3563b7b9}, + {0xd8b1a02a, 0x00000010, 0x00000387, 0x5017d2fc, 0x503541a5, 0x071475d0}, + {0x3b96cad2, 0x00000036, 0x00000347, 0x1d2372ae, 0x926cd90b, 0x54c79d60}, + {0xc94c1ed7, 0x00000005, 0x0000038b, 0x9e9fdb22, 0x144a9178, 0x4c53eee6}, + {0x1aad454e, 0x00000025, 0x000002b2, 0xc3f6315c, 0x5c7a35b3, 0x10137a3c}, + {0xa4fec9a6, 0x00000000, 0x000006d6, 0x90be5080, 0xa4107605, 0xaa9d6c73}, + {0x1bbe71e2, 0x0000001f, 0x000002fd, 0x4e504c3b, 0x284ccaf1, 0xb63d23e7}, + {0x4201c7e4, 0x00000002, 0x000002b7, 0x7822e3f9, 0x0cc912a9, 0x7f53e9cf}, + {0x23fddc96, 0x00000003, 0x00000627, 0x8a385125, 0x07767e78, 0x13c1cd83}, + {0xd82ba25c, 0x00000016, 0x0000063e, 0x98e4148a, 0x283330c9, 0x49ff5867}, + {0x786f2032, 0x0000002d, 0x0000060f, 0xf201600a, 0xf561bfcd, 0x8467f211}, + {0xfebe4e1f, 0x0000002a, 0x000004f2, 0x95e51961, 0xfd80dcab, 0x3f9683b2}, + {0x1a6e0a39, 0x00000008, 0x00000672, 0x8af6c2a5, 0x78dd84cb, 0x76a3f874}, + {0x56000ab8, 0x0000000e, 0x000000e5, 0x36bacb8f, 0x22ee1f77, 0x863b702f}, + {0x4717fe0c, 0x00000000, 0x000006ec, 0x8439f342, 0x5c8e03da, 0xdc6c58ff}, + {0xd5d5d68e, 0x0000003c, 0x000003a3, 0x46fff083, 0x177d1b39, 0x0622cc95}, + {0xc25dd6c6, 0x00000024, 0x000006c0, 0x5ceb8eb4, 0x892b0d16, 0xe85605cd}, + {0xe9b11300, 0x00000023, 0x00000683, 0x07a5d59a, 0x6c6a3208, 0x31da5f06}, + {0x95cd285e, 0x00000001, 0x00000047, 0x7b3a4368, 0x0202c07e, 0xa1f2e784}, + {0xd9245a25, 0x0000001e, 0x000003a6, 0xd33c1841, 0x1936c0d5, 0xb07cc616}, + {0x103279db, 0x00000006, 0x0000039b, 0xca09b8a0, 0x77d62892, 0xbf943b6c}, + {0x1cba3172, 0x00000027, 0x000001c8, 0xcb377194, 0xebe682db, 0x2c01af1c}, + {0x8f613739, 0x0000000c, 0x000001df, 0xb4b0bc87, 0x7710bd43, 0x0fe5f56d}, + {0x1c6aa90d, 0x0000001b, 0x0000053c, 0x70559245, 0xda7894ac, 0xf8943b2d}, + {0xaabe5b93, 0x0000003d, 0x00000715, 0xcdbf42fa, 0x0c3b99e7, 0xe4d89272}, + {0xf15dd038, 0x00000006, 0x000006db, 0x6e104aea, 0x8d5967f2, 0x7c2f6bbb}, + {0x584dd49c, 0x00000020, 0x000007bc, 0x36b6cfd6, 0xad4e23b2, 0xabbf388b}, + {0x5d8c9506, 0x00000020, 0x00000470, 0x4c62378e, 0x31d92640, 0x1dca1f4e}, + {0xb80d17b0, 0x00000032, 0x00000346, 0x22a5bb88, 0x9a7ec89f, 0x5c170e23}, + {0xdaf0592e, 0x00000023, 0x000007b0, 0x3cab3f99, 0x9b1fdd99, 0xc0e9d672}, + {0x4793cc85, 0x0000000d, 0x00000706, 0xe82e04f6, 0xed3db6b7, 0xc18bdc86}, + {0x82ebf64e, 0x00000009, 0x000007c3, 0x69d590a9, 0x9efa8499, 0xa874fcdd}, + {0xb18a0319, 0x00000026, 0x000007db, 0x1cf98dcc, 0x8fa9ad6a, 0x9dc0bb48}, }; #include <linux/time.h> -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH net-next 1/5] lib: crc32: clean up spacing in test cases 2013-10-30 10:50 ` [PATCH net-next 1/5] lib: crc32: clean up spacing in test cases Daniel Borkmann @ 2013-10-30 13:56 ` Joe Perches 2013-10-30 14:10 ` David Laight 0 siblings, 1 reply; 17+ messages in thread From: Joe Perches @ 2013-10-30 13:56 UTC (permalink / raw) To: Daniel Borkmann; +Cc: davem, netdev, linux-sctp, linux-kernel On Wed, 2013-10-30 at 11:50 +0100, Daniel Borkmann wrote: > This is nothing more but a whitepace cleanup, as 80 chars is not a > hard but soft limit, and otherwise makes the test cases arrary really > look ugly. So fix it up. That does look nicer. Another option might be to take the repetitive 6 leading 0's out of column 2 and the repetitive 5 leading 0's out of column 3. > diff --git a/lib/crc32.c b/lib/crc32.c [] > @@ -795,206 +795,106 @@ static struct crc_test { > u32 crc32c_le; /* expected crc32c_le result */ > } test[] = > { > - {0x674bf11d, 0x00000038, 0x00000542, 0x0af6d466, 0xd8b6e4c1, > - 0xf6e93d6c}, > - {0x35c672c6, 0x0000003a, 0x000001aa, 0xc6d3dfba, 0x28aaf3ad, > - 0x0fe92aca}, [etc...] > + {0x674bf11d, 0x00000038, 0x00000542, 0x0af6d466, 0xd8b6e4c1, 0xf6e93d6c}, > + {0x35c672c6, 0x0000003a, 0x000001aa, 0xc6d3dfba, 0x28aaf3ad, 0x0fe92aca}, these could be + {0x674bf11d, 0x38, 0x542, 0x0af6d466, 0xd8b6e4c1, 0xf6e93d6c}, + {0x35c672c6, 0x3a, 0x1aa, 0xc6d3dfba, 0x28aaf3ad, 0x0fe92aca}, etc... ^ permalink raw reply [flat|nested] 17+ messages in thread
* RE: [PATCH net-next 1/5] lib: crc32: clean up spacing in test cases 2013-10-30 13:56 ` Joe Perches @ 2013-10-30 14:10 ` David Laight 2013-10-30 14:15 ` Daniel Borkmann 0 siblings, 1 reply; 17+ messages in thread From: David Laight @ 2013-10-30 14:10 UTC (permalink / raw) To: Joe Perches, Daniel Borkmann; +Cc: davem, netdev, linux-sctp, linux-kernel > > + {0x674bf11d, 0x00000038, 0x00000542, 0x0af6d466, 0xd8b6e4c1, 0xf6e93d6c}, > > these could be > > + {0x674bf11d, 0x38, 0x542, 0x0af6d466, 0xd8b6e4c1, 0xf6e93d6c}, Or even: #define X(a, b, c, d, e, f) {0x##a, 0x##b, 0x##c, 0x##d, 0x##e. 0x##f} X(674bf11d, 38, 542, 0af6d466, d8b6e4c1, f6e93d6c), ... #undef X David ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH net-next 1/5] lib: crc32: clean up spacing in test cases 2013-10-30 14:10 ` David Laight @ 2013-10-30 14:15 ` Daniel Borkmann 2013-10-30 15:14 ` Joe Perches 0 siblings, 1 reply; 17+ messages in thread From: Daniel Borkmann @ 2013-10-30 14:15 UTC (permalink / raw) To: David Laight; +Cc: Joe Perches, davem, netdev, linux-sctp, linux-kernel On 10/30/2013 03:10 PM, David Laight wrote: >>> + {0x674bf11d, 0x00000038, 0x00000542, 0x0af6d466, 0xd8b6e4c1, 0xf6e93d6c}, >> >> these could be >> >> + {0x674bf11d, 0x38, 0x542, 0x0af6d466, 0xd8b6e4c1, 0xf6e93d6c}, > > Or even: > #define X(a, b, c, d, e, f) {0x##a, 0x##b, 0x##c, 0x##d, 0x##e. 0x##f} > X(674bf11d, 38, 542, 0af6d466, d8b6e4c1, f6e93d6c), > ... > #undef X Sure, sounds good to me. We could do that as a follow-up. > David > > > ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH net-next 1/5] lib: crc32: clean up spacing in test cases 2013-10-30 14:15 ` Daniel Borkmann @ 2013-10-30 15:14 ` Joe Perches 0 siblings, 0 replies; 17+ messages in thread From: Joe Perches @ 2013-10-30 15:14 UTC (permalink / raw) To: Daniel Borkmann; +Cc: David Laight, davem, netdev, linux-sctp, linux-kernel On Wed, 2013-10-30 at 15:15 +0100, Daniel Borkmann wrote: > On 10/30/2013 03:10 PM, David Laight wrote: > >>> + {0x674bf11d, 0x00000038, 0x00000542, 0x0af6d466, 0xd8b6e4c1, 0xf6e93d6c}, > >> these could be > >> + {0x674bf11d, 0x38, 0x542, 0x0af6d466, 0xd8b6e4c1, 0xf6e93d6c}, > > Or even: > > #define X(a, b, c, d, e, f) {0x##a, 0x##b, 0x##c, 0x##d, 0x##e. 0x##f} > > X(674bf11d, 38, 542, 0af6d466, d8b6e4c1, f6e93d6c), > > ... > > #undef X > > Sure, sounds good to me. We could do that as a follow-up. I personally don't care for that sort of token-pasting macro but, <shrug> if you want, I've no real objection either. ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH net-next 2/5] lib: crc32: add functionality to combine two crc32{,c}s in GF(2) 2013-10-30 10:50 [PATCH net-next 0/5] SCTP fix/updates Daniel Borkmann 2013-10-30 10:50 ` [PATCH net-next 1/5] lib: crc32: clean up spacing in test cases Daniel Borkmann @ 2013-10-30 10:50 ` Daniel Borkmann 2013-10-30 10:50 ` [PATCH net-next 3/5] lib: crc32: add test cases for crc32{,c}_combine routines Daniel Borkmann ` (5 subsequent siblings) 7 siblings, 0 replies; 17+ messages in thread From: Daniel Borkmann @ 2013-10-30 10:50 UTC (permalink / raw) To: davem; +Cc: netdev, linux-sctp, linux-kernel This patch adds a combinator to merge two or more crc32{,c}s into a new one. This is useful for checksum computations of fragmented skbs that use crc32/crc32c as checksums. The arithmetics for combining both in the GF(2) was taken and slightly modified from zlib. Only passing two crcs is insufficient as two crcs and the length of the second piece is needed for merging. The code is made generic, so that only polynomials need to be passed for crc32_le resp. crc32c_le. Signed-off-by: Daniel Borkmann <dborkman@redhat.com> Cc: linux-kernel@vger.kernel.org --- include/linux/crc32.h | 40 +++++++++++++++++++++++++ lib/crc32.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+) diff --git a/include/linux/crc32.h b/include/linux/crc32.h index 68267b6..7d275c4 100644 --- a/include/linux/crc32.h +++ b/include/linux/crc32.h @@ -11,8 +11,48 @@ extern u32 crc32_le(u32 crc, unsigned char const *p, size_t len); extern u32 crc32_be(u32 crc, unsigned char const *p, size_t len); +/** + * crc32_le_combine - Combine two crc32 check values into one. For two + * sequences of bytes, seq1 and seq2 with lengths len1 + * and len2, crc32_le() check values were calculated + * for each, crc1 and crc2. + * + * @crc1: crc32 of the first block + * @crc2: crc32 of the second block + * @len2: length of the second block + * + * Return: The crc32_le() check value of seq1 and seq2 concatenated, + * requiring only crc1, crc2, and len2. Note: If seq_full denotes + * the concatenated memory area of seq1 with seq2, and crc_full + * the crc32_le() value of seq_full, then crc_full == + * crc32_le_combine(crc1, crc2, len2) when crc_full was seeded + * with the same initializer as crc1, and crc2 seed was 0. See + * also crc32_combine_test(). + */ +extern u32 crc32_le_combine(u32 crc1, u32 crc2, size_t len2); + extern u32 __crc32c_le(u32 crc, unsigned char const *p, size_t len); +/** + * __crc32c_le_combine - Combine two crc32c check values into one. For two + * sequences of bytes, seq1 and seq2 with lengths len1 + * and len2, __crc32c_le() check values were calculated + * for each, crc1 and crc2. + * + * @crc1: crc32c of the first block + * @crc2: crc32c of the second block + * @len2: length of the second block + * + * Return: The __crc32c_le() check value of seq1 and seq2 concatenated, + * requiring only crc1, crc2, and len2. Note: If seq_full denotes + * the concatenated memory area of seq1 with seq2, and crc_full + * the __crc32c_le() value of seq_full, then crc_full == + * __crc32c_le_combine(crc1, crc2, len2) when crc_full was + * seeded with the same initializer as crc1, and crc2 seed + * was 0. See also crc32c_combine_test(). + */ +extern u32 __crc32c_le_combine(u32 crc1, u32 crc2, size_t len2); + #define crc32(seed, data, length) crc32_le(seed, (unsigned char const *)(data), length) /* diff --git a/lib/crc32.c b/lib/crc32.c index 429d61c..595205c 100644 --- a/lib/crc32.c +++ b/lib/crc32.c @@ -49,6 +49,30 @@ MODULE_AUTHOR("Matt Domsch <Matt_Domsch@dell.com>"); MODULE_DESCRIPTION("Various CRC32 calculations"); MODULE_LICENSE("GPL"); +#define GF2_DIM 32 + +static u32 gf2_matrix_times(u32 *mat, u32 vec) +{ + u32 sum = 0; + + while (vec) { + if (vec & 1) + sum ^= *mat; + vec >>= 1; + mat++; + } + + return sum; +} + +static void gf2_matrix_square(u32 *square, u32 *mat) +{ + int i; + + for (i = 0; i < GF2_DIM; i++) + square[i] = gf2_matrix_times(mat, mat[i]); +} + #if CRC_LE_BITS > 8 || CRC_BE_BITS > 8 /* implements slicing-by-4 or slicing-by-8 algorithm */ @@ -130,6 +154,52 @@ crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)[256]) } #endif +/* For conditions of distribution and use, see copyright notice in zlib.h */ +static u32 crc32_generic_combine(u32 crc1, u32 crc2, size_t len2, + u32 polynomial) +{ + u32 even[GF2_DIM]; /* Even-power-of-two zeros operator */ + u32 odd[GF2_DIM]; /* Odd-power-of-two zeros operator */ + u32 row; + int i; + + if (len2 <= 0) + return crc1; + + /* Put operator for one zero bit in odd */ + odd[0] = polynomial; + row = 1; + for (i = 1; i < GF2_DIM; i++) { + odd[i] = row; + row <<= 1; + } + + gf2_matrix_square(even, odd); /* Put operator for two zero bits in even */ + gf2_matrix_square(odd, even); /* Put operator for four zero bits in odd */ + + /* Apply len2 zeros to crc1 (first square will put the operator for one + * zero byte, eight zero bits, in even). + */ + do { + /* Apply zeros operator for this bit of len2 */ + gf2_matrix_square(even, odd); + if (len2 & 1) + crc1 = gf2_matrix_times(even, crc1); + len2 >>= 1; + /* If no more bits set, then done */ + if (len2 == 0) + break; + /* Another iteration of the loop with odd and even swapped */ + gf2_matrix_square(odd, even); + if (len2 & 1) + crc1 = gf2_matrix_times(odd, crc1); + len2 >>= 1; + } while (len2 != 0); + + crc1 ^= crc2; + return crc1; +} + /** * crc32_le_generic() - Calculate bitwise little-endian Ethernet AUTODIN II * CRC32/CRC32C @@ -200,8 +270,19 @@ u32 __pure __crc32c_le(u32 crc, unsigned char const *p, size_t len) (const u32 (*)[256])crc32ctable_le, CRC32C_POLY_LE); } #endif +u32 __pure crc32_le_combine(u32 crc1, u32 crc2, size_t len2) +{ + return crc32_generic_combine(crc1, crc2, len2, CRCPOLY_LE); +} + +u32 __pure __crc32c_le_combine(u32 crc1, u32 crc2, size_t len2) +{ + return crc32_generic_combine(crc1, crc2, len2, CRC32C_POLY_LE); +} EXPORT_SYMBOL(crc32_le); +EXPORT_SYMBOL(crc32_le_combine); EXPORT_SYMBOL(__crc32c_le); +EXPORT_SYMBOL(__crc32c_le_combine); /** * crc32_be_generic() - Calculate bitwise big-endian Ethernet AUTODIN II CRC32 -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH net-next 3/5] lib: crc32: add test cases for crc32{,c}_combine routines 2013-10-30 10:50 [PATCH net-next 0/5] SCTP fix/updates Daniel Borkmann 2013-10-30 10:50 ` [PATCH net-next 1/5] lib: crc32: clean up spacing in test cases Daniel Borkmann 2013-10-30 10:50 ` [PATCH net-next 2/5] lib: crc32: add functionality to combine two crc32{,c}s in GF(2) Daniel Borkmann @ 2013-10-30 10:50 ` Daniel Borkmann 2013-10-30 10:50 ` [PATCH net-next 4/5] net: skb_checksum: allow custom update/combine for walking skb Daniel Borkmann ` (4 subsequent siblings) 7 siblings, 0 replies; 17+ messages in thread From: Daniel Borkmann @ 2013-10-30 10:50 UTC (permalink / raw) To: davem; +Cc: netdev, linux-sctp, linux-kernel We already have 100 test cases for crcs itself, so split the test buffer with a-prio known checksums, and test crc of two blocks against crc of the whole block for the same results. Output/result with CONFIG_CRC32_SELFTEST=y: [ 2.687095] crc32: CRC_LE_BITS = 64, CRC_BE BITS = 64 [ 2.687097] crc32: self tests passed, processed 225944 bytes in 278177 nsec [ 2.687383] crc32c: CRC_LE_BITS = 64 [ 2.687385] crc32c: self tests passed, processed 225944 bytes in 141708 nsec [ 7.336771] crc32_combine: 113072 self tests passed [ 12.050479] crc32c_combine: 113072 self tests passed [ 17.633089] alg: No test for crc32 (crc32-pclmul) Signed-off-by: Daniel Borkmann <dborkman@redhat.com> Cc: linux-kernel@vger.kernel.org --- lib/crc32.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/lib/crc32.c b/lib/crc32.c index 595205c..69dd124 100644 --- a/lib/crc32.c +++ b/lib/crc32.c @@ -1031,6 +1031,40 @@ static int __init crc32c_test(void) return 0; } +static int __init crc32c_combine_test(void) +{ + int i, j; + int errors = 0, runs = 0; + + for (i = 0; i < 100; i++) { + u32 crc_full; + + crc_full = __crc32c_le(test[i].crc, test_buf + test[i].start, + test[i].length); + for (j = 0; j <= test[i].length; ++j) { + u32 crc1, crc2; + u32 len1 = j, len2 = test[i].length - j; + + crc1 = __crc32c_le(test[i].crc, test_buf + + test[i].start, len1); + crc2 = __crc32c_le(0, test_buf + test[i].start + + len1, len2); + + if (!(crc_full == __crc32c_le_combine(crc1, crc2, len2) && + crc_full == test[i].crc32c_le)) + errors++; + runs++; + } + } + + if (errors) + pr_warn("crc32c_combine: %d/%d self tests failed\n", errors, runs); + else + pr_info("crc32c_combine: %d self tests passed\n", runs); + + return 0; +} + static int __init crc32_test(void) { int i; @@ -1090,10 +1124,48 @@ static int __init crc32_test(void) return 0; } +static int __init crc32_combine_test(void) +{ + int i, j; + int errors = 0, runs = 0; + + for (i = 0; i < 100; i++) { + u32 crc_full; + + crc_full = crc32_le(test[i].crc, test_buf + test[i].start, + test[i].length); + for (j = 0; j <= test[i].length; ++j) { + u32 crc1, crc2; + u32 len1 = j, len2 = test[i].length - j; + + crc1 = crc32_le(test[i].crc, test_buf + + test[i].start, len1); + crc2 = crc32_le(0, test_buf + test[i].start + + len1, len2); + + if (!(crc_full == crc32_le_combine(crc1, crc2, len2) && + crc_full == test[i].crc_le)) + errors++; + runs++; + } + } + + if (errors) + pr_warn("crc32_combine: %d/%d self tests failed\n", errors, runs); + else + pr_info("crc32_combine: %d self tests passed\n", runs); + + return 0; +} + static int __init crc32test_init(void) { crc32_test(); crc32c_test(); + + crc32_combine_test(); + crc32c_combine_test(); + return 0; } -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH net-next 4/5] net: skb_checksum: allow custom update/combine for walking skb 2013-10-30 10:50 [PATCH net-next 0/5] SCTP fix/updates Daniel Borkmann ` (2 preceding siblings ...) 2013-10-30 10:50 ` [PATCH net-next 3/5] lib: crc32: add test cases for crc32{,c}_combine routines Daniel Borkmann @ 2013-10-30 10:50 ` Daniel Borkmann 2013-10-30 10:50 ` [PATCH net-next 5/5] net: sctp: fix and consolidate SCTP checksumming code Daniel Borkmann ` (3 subsequent siblings) 7 siblings, 0 replies; 17+ messages in thread From: Daniel Borkmann @ 2013-10-30 10:50 UTC (permalink / raw) To: davem; +Cc: netdev, linux-sctp Currently, skb_checksum walks over 1) linearized, 2) frags[], and 3) frag_list data and calculats the one's complement, a 32 bit result suitable for feeding into itself or csum_tcpudp_magic(), but unsuitable for SCTP as we're calculating CRC32c there. Hence, in order to not re-implement the very same function in SCTP (and maybe other protocols) over and over again, use an update() + combine() callback internally to allow for walking over the skb with different algorithms. Signed-off-by: Daniel Borkmann <dborkman@redhat.com> --- include/linux/skbuff.h | 13 ++++++++++--- include/net/checksum.h | 6 ++++++ net/core/skbuff.c | 31 +++++++++++++++++++++---------- 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 2c15497..44727b5 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -2360,8 +2360,6 @@ int skb_copy_datagram_const_iovec(const struct sk_buff *from, int offset, void skb_free_datagram(struct sock *sk, struct sk_buff *skb); void skb_free_datagram_locked(struct sock *sk, struct sk_buff *skb); int skb_kill_datagram(struct sock *sk, struct sk_buff *skb, unsigned int flags); -__wsum skb_checksum(const struct sk_buff *skb, int offset, int len, - __wsum csum); int skb_copy_bits(const struct sk_buff *skb, int offset, void *to, int len); int skb_store_bits(struct sk_buff *skb, int offset, const void *from, int len); __wsum skb_copy_and_csum_bits(const struct sk_buff *skb, int offset, u8 *to, @@ -2373,9 +2371,18 @@ void skb_copy_and_csum_dev(const struct sk_buff *skb, u8 *to); void skb_split(struct sk_buff *skb, struct sk_buff *skb1, const u32 len); int skb_shift(struct sk_buff *tgt, struct sk_buff *skb, int shiftlen); void skb_scrub_packet(struct sk_buff *skb, bool xnet); - struct sk_buff *skb_segment(struct sk_buff *skb, netdev_features_t features); +struct skb_checksum_ops { + __wsum (*update)(const void *mem, int len, __wsum wsum); + __wsum (*combine)(__wsum csum, __wsum csum2, int offset, int len); +}; + +__wsum __skb_checksum(const struct sk_buff *skb, int offset, int len, + __wsum csum, const struct skb_checksum_ops *ops); +__wsum skb_checksum(const struct sk_buff *skb, int offset, int len, + __wsum csum); + static inline void *skb_header_pointer(const struct sk_buff *skb, int offset, int len, void *buffer) { diff --git a/include/net/checksum.h b/include/net/checksum.h index 8f59ca5..15f33fd 100644 --- a/include/net/checksum.h +++ b/include/net/checksum.h @@ -79,6 +79,12 @@ csum_block_add(__wsum csum, __wsum csum2, int offset) } static inline __wsum +csum_block_add_ext(__wsum csum, __wsum csum2, int offset, int len) +{ + return csum_block_add(csum, csum2, offset); +} + +static inline __wsum csum_block_sub(__wsum csum, __wsum csum2, int offset) { u32 sum = (__force u32)csum2; diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 0ab32fa..31aab53 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -1928,9 +1928,8 @@ fault: EXPORT_SYMBOL(skb_store_bits); /* Checksum skb data. */ - -__wsum skb_checksum(const struct sk_buff *skb, int offset, - int len, __wsum csum) +__wsum __skb_checksum(const struct sk_buff *skb, int offset, int len, + __wsum csum, const struct skb_checksum_ops *ops) { int start = skb_headlen(skb); int i, copy = start - offset; @@ -1941,7 +1940,7 @@ __wsum skb_checksum(const struct sk_buff *skb, int offset, if (copy > 0) { if (copy > len) copy = len; - csum = csum_partial(skb->data + offset, copy, csum); + csum = ops->update(skb->data + offset, copy, csum); if ((len -= copy) == 0) return csum; offset += copy; @@ -1962,10 +1961,10 @@ __wsum skb_checksum(const struct sk_buff *skb, int offset, if (copy > len) copy = len; vaddr = kmap_atomic(skb_frag_page(frag)); - csum2 = csum_partial(vaddr + frag->page_offset + - offset - start, copy, 0); + csum2 = ops->update(vaddr + frag->page_offset + + offset - start, copy, 0); kunmap_atomic(vaddr); - csum = csum_block_add(csum, csum2, pos); + csum = ops->combine(csum, csum2, pos, copy); if (!(len -= copy)) return csum; offset += copy; @@ -1984,9 +1983,9 @@ __wsum skb_checksum(const struct sk_buff *skb, int offset, __wsum csum2; if (copy > len) copy = len; - csum2 = skb_checksum(frag_iter, offset - start, - copy, 0); - csum = csum_block_add(csum, csum2, pos); + csum2 = __skb_checksum(frag_iter, offset - start, + copy, 0, ops); + csum = ops->combine(csum, csum2, pos, copy); if ((len -= copy) == 0) return csum; offset += copy; @@ -1998,6 +1997,18 @@ __wsum skb_checksum(const struct sk_buff *skb, int offset, return csum; } +EXPORT_SYMBOL(__skb_checksum); + +__wsum skb_checksum(const struct sk_buff *skb, int offset, + int len, __wsum csum) +{ + const struct skb_checksum_ops ops = { + .update = csum_partial, + .combine = csum_block_add_ext, + }; + + return __skb_checksum(skb, offset, len, csum, &ops); +} EXPORT_SYMBOL(skb_checksum); /* Both of above in one bottle. */ -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH net-next 5/5] net: sctp: fix and consolidate SCTP checksumming code 2013-10-30 10:50 [PATCH net-next 0/5] SCTP fix/updates Daniel Borkmann ` (3 preceding siblings ...) 2013-10-30 10:50 ` [PATCH net-next 4/5] net: skb_checksum: allow custom update/combine for walking skb Daniel Borkmann @ 2013-10-30 10:50 ` Daniel Borkmann 2013-10-30 14:29 ` Vlad Yasevich 2013-10-30 11:29 ` [PATCH net-next 0/5] SCTP fix/updates Neil Horman ` (2 subsequent siblings) 7 siblings, 1 reply; 17+ messages in thread From: Daniel Borkmann @ 2013-10-30 10:50 UTC (permalink / raw) To: davem; +Cc: netdev, linux-sctp This fixes an outstanding bug found through IPVS, where SCTP packets with skb->data_len > 0 (non-linearized) and empty frag_list, but data accumulated in frags[] member, are forwarded with incorrect checksum letting SCTP initial handshake fail on some systems. Linearizing each SCTP skb in IPVS to prevent that would not be a good solution as this leads to an additional and unnecessary performance penalty on the load-balancer itself for no good reason (as we actually only want to update the checksum, and can do that in a different/better way presented here). The actual problem is elsewhere, namely, that SCTP's checksumming in sctp_compute_cksum() does not take frags[] into account like skb_checksum() does. So while we are fixing this up, we better reuse the existing code that we have anyway in __skb_checksum() and use it for walking through the data doing checksumming. This will not only fix this issue, but also consolidates some SCTP code with core sk_buff code, bringing it closer together and removing respectively avoiding reimplementation of skb_checksum() for no good reason. As crc32c() can use hardware implementation within the crypto layer, we leave that intact (it wraps around / falls back to e.g. slice-by-8 algorithm in __crc32c_le() otherwise); plus use the __crc32c_le_combine() combinator for crc32c blocks. Also, we remove all other SCTP checksumming code, so that we only have to use sctp_compute_cksum() from now on; for doing that, we need to transform SCTP checkumming in output path slightly, and can leave the rest intact. Signed-off-by: Daniel Borkmann <dborkman@redhat.com> --- include/net/sctp/checksum.h | 56 +++++++++++++++------------------------------ net/sctp/output.c | 9 +------- 2 files changed, 20 insertions(+), 45 deletions(-) diff --git a/include/net/sctp/checksum.h b/include/net/sctp/checksum.h index 259924d..6bd44fe 100644 --- a/include/net/sctp/checksum.h +++ b/include/net/sctp/checksum.h @@ -42,56 +42,38 @@ #include <linux/types.h> #include <net/sctp/sctp.h> #include <linux/crc32c.h> +#include <linux/crc32.h> -static inline __u32 sctp_crc32c(__u32 crc, u8 *buffer, u16 length) +static inline __wsum sctp_csum_update(const void *buff, int len, __wsum sum) { - return crc32c(crc, buffer, length); -} - -static inline __u32 sctp_start_cksum(__u8 *buffer, __u16 length) -{ - __u32 crc = ~(__u32)0; - __u8 zero[sizeof(__u32)] = {0}; - - /* Optimize this routine to be SCTP specific, knowing how - * to skip the checksum field of the SCTP header. + /* This uses the crypto implementation of crc32c, which is either + * implemented w/ hardware support or resolves to __crc32c_le(). */ - - /* Calculate CRC up to the checksum. */ - crc = sctp_crc32c(crc, buffer, sizeof(struct sctphdr) - sizeof(__u32)); - - /* Skip checksum field of the header. */ - crc = sctp_crc32c(crc, zero, sizeof(__u32)); - - /* Calculate the rest of the CRC. */ - crc = sctp_crc32c(crc, &buffer[sizeof(struct sctphdr)], - length - sizeof(struct sctphdr)); - return crc; -} - -static inline __u32 sctp_update_cksum(__u8 *buffer, __u16 length, __u32 crc32) -{ - return sctp_crc32c(crc32, buffer, length); + return crc32c(sum, buff, len); } -static inline __le32 sctp_end_cksum(__u32 crc32) +static inline __wsum sctp_csum_combine(__wsum csum, __wsum csum2, + int offset, int len) { - return cpu_to_le32(~crc32); + return __crc32c_le_combine(csum, csum2, len); } -/* Calculate the CRC32C checksum of an SCTP packet. */ static inline __le32 sctp_compute_cksum(const struct sk_buff *skb, unsigned int offset) { - const struct sk_buff *iter; + struct sctphdr *sh = sctp_hdr(skb); + __le32 ret, old = sh->checksum; + const struct skb_checksum_ops ops = { + .update = sctp_csum_update, + .combine = sctp_csum_combine, + }; - __u32 crc32 = sctp_start_cksum(skb->data + offset, - skb_headlen(skb) - offset); - skb_walk_frags(skb, iter) - crc32 = sctp_update_cksum((__u8 *) iter->data, - skb_headlen(iter), crc32); + sh->checksum = 0; + ret = cpu_to_le32(~__skb_checksum(skb, offset, skb->len - offset, + ~(__u32)0, &ops)); + sh->checksum = old; - return sctp_end_cksum(crc32); + return ret; } #endif /* __sctp_checksum_h__ */ diff --git a/net/sctp/output.c b/net/sctp/output.c index 3191373..e650978 100644 --- a/net/sctp/output.c +++ b/net/sctp/output.c @@ -390,7 +390,6 @@ int sctp_packet_transmit(struct sctp_packet *packet) __u8 has_data = 0; struct dst_entry *dst = tp->dst; unsigned char *auth = NULL; /* pointer to auth in skb data */ - __u32 cksum_buf_len = sizeof(struct sctphdr); pr_debug("%s: packet:%p\n", __func__, packet); @@ -493,7 +492,6 @@ int sctp_packet_transmit(struct sctp_packet *packet) if (chunk == packet->auth) auth = skb_tail_pointer(nskb); - cksum_buf_len += chunk->skb->len; memcpy(skb_put(nskb, chunk->skb->len), chunk->skb->data, chunk->skb->len); @@ -538,12 +536,7 @@ int sctp_packet_transmit(struct sctp_packet *packet) if (!sctp_checksum_disable) { if (!(dst->dev->features & NETIF_F_SCTP_CSUM) || (dst_xfrm(dst) != NULL) || packet->ipfragok) { - __u32 crc32 = sctp_start_cksum((__u8 *)sh, cksum_buf_len); - - /* 3) Put the resultant value into the checksum field in the - * common header, and leave the rest of the bits unchanged. - */ - sh->checksum = sctp_end_cksum(crc32); + sh->checksum = sctp_compute_cksum(nskb, 0); } else { /* no need to seed pseudo checksum for SCTP */ nskb->ip_summed = CHECKSUM_PARTIAL; -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH net-next 5/5] net: sctp: fix and consolidate SCTP checksumming code 2013-10-30 10:50 ` [PATCH net-next 5/5] net: sctp: fix and consolidate SCTP checksumming code Daniel Borkmann @ 2013-10-30 14:29 ` Vlad Yasevich 2013-11-04 12:11 ` Daniel Borkmann 0 siblings, 1 reply; 17+ messages in thread From: Vlad Yasevich @ 2013-10-30 14:29 UTC (permalink / raw) To: Daniel Borkmann, davem; +Cc: netdev, linux-sctp On 10/30/2013 06:50 AM, Daniel Borkmann wrote: > This fixes an outstanding bug found through IPVS, where SCTP packets > with skb->data_len > 0 (non-linearized) and empty frag_list, but data > accumulated in frags[] member, are forwarded with incorrect checksum > letting SCTP initial handshake fail on some systems. Linearizing each > SCTP skb in IPVS to prevent that would not be a good solution as > this leads to an additional and unnecessary performance penalty on > the load-balancer itself for no good reason (as we actually only want > to update the checksum, and can do that in a different/better way > presented here). > > The actual problem is elsewhere, namely, that SCTP's checksumming > in sctp_compute_cksum() does not take frags[] into account like > skb_checksum() does. So while we are fixing this up, we better reuse > the existing code that we have anyway in __skb_checksum() and use it > for walking through the data doing checksumming. This will not only > fix this issue, but also consolidates some SCTP code with core > sk_buff code, bringing it closer together and removing respectively > avoiding reimplementation of skb_checksum() for no good reason. > > As crc32c() can use hardware implementation within the crypto layer, > we leave that intact (it wraps around / falls back to e.g. slice-by-8 > algorithm in __crc32c_le() otherwise); plus use the __crc32c_le_combine() > combinator for crc32c blocks. > > Also, we remove all other SCTP checksumming code, so that we only > have to use sctp_compute_cksum() from now on; for doing that, we need > to transform SCTP checkumming in output path slightly, and can leave > the rest intact. > > Signed-off-by: Daniel Borkmann <dborkman@redhat.com> Daniel Here is a follow-on idea that might help even more. What if we put a pointer to skb_checksum_ops() in the skb somewhere (I was thinking of skb_shinfo). Then skb_checksum can simply use the data from there. This would allow us to get rid of all the special cases in SCTP that do checksumming. We can just set it to partial, set up the right fields and let HW or SW always do the right thing. -vlad > --- > include/net/sctp/checksum.h | 56 +++++++++++++++------------------------------ > net/sctp/output.c | 9 +------- > 2 files changed, 20 insertions(+), 45 deletions(-) > > diff --git a/include/net/sctp/checksum.h b/include/net/sctp/checksum.h > index 259924d..6bd44fe 100644 > --- a/include/net/sctp/checksum.h > +++ b/include/net/sctp/checksum.h > @@ -42,56 +42,38 @@ > #include <linux/types.h> > #include <net/sctp/sctp.h> > #include <linux/crc32c.h> > +#include <linux/crc32.h> > > -static inline __u32 sctp_crc32c(__u32 crc, u8 *buffer, u16 length) > +static inline __wsum sctp_csum_update(const void *buff, int len, __wsum sum) > { > - return crc32c(crc, buffer, length); > -} > - > -static inline __u32 sctp_start_cksum(__u8 *buffer, __u16 length) > -{ > - __u32 crc = ~(__u32)0; > - __u8 zero[sizeof(__u32)] = {0}; > - > - /* Optimize this routine to be SCTP specific, knowing how > - * to skip the checksum field of the SCTP header. > + /* This uses the crypto implementation of crc32c, which is either > + * implemented w/ hardware support or resolves to __crc32c_le(). > */ > - > - /* Calculate CRC up to the checksum. */ > - crc = sctp_crc32c(crc, buffer, sizeof(struct sctphdr) - sizeof(__u32)); > - > - /* Skip checksum field of the header. */ > - crc = sctp_crc32c(crc, zero, sizeof(__u32)); > - > - /* Calculate the rest of the CRC. */ > - crc = sctp_crc32c(crc, &buffer[sizeof(struct sctphdr)], > - length - sizeof(struct sctphdr)); > - return crc; > -} > - > -static inline __u32 sctp_update_cksum(__u8 *buffer, __u16 length, __u32 crc32) > -{ > - return sctp_crc32c(crc32, buffer, length); > + return crc32c(sum, buff, len); > } > > -static inline __le32 sctp_end_cksum(__u32 crc32) > +static inline __wsum sctp_csum_combine(__wsum csum, __wsum csum2, > + int offset, int len) > { > - return cpu_to_le32(~crc32); > + return __crc32c_le_combine(csum, csum2, len); > } > > -/* Calculate the CRC32C checksum of an SCTP packet. */ > static inline __le32 sctp_compute_cksum(const struct sk_buff *skb, > unsigned int offset) > { > - const struct sk_buff *iter; > + struct sctphdr *sh = sctp_hdr(skb); > + __le32 ret, old = sh->checksum; > + const struct skb_checksum_ops ops = { > + .update = sctp_csum_update, > + .combine = sctp_csum_combine, > + }; > > - __u32 crc32 = sctp_start_cksum(skb->data + offset, > - skb_headlen(skb) - offset); > - skb_walk_frags(skb, iter) > - crc32 = sctp_update_cksum((__u8 *) iter->data, > - skb_headlen(iter), crc32); > + sh->checksum = 0; > + ret = cpu_to_le32(~__skb_checksum(skb, offset, skb->len - offset, > + ~(__u32)0, &ops)); > + sh->checksum = old; > > - return sctp_end_cksum(crc32); > + return ret; > } > > #endif /* __sctp_checksum_h__ */ > diff --git a/net/sctp/output.c b/net/sctp/output.c > index 3191373..e650978 100644 > --- a/net/sctp/output.c > +++ b/net/sctp/output.c > @@ -390,7 +390,6 @@ int sctp_packet_transmit(struct sctp_packet *packet) > __u8 has_data = 0; > struct dst_entry *dst = tp->dst; > unsigned char *auth = NULL; /* pointer to auth in skb data */ > - __u32 cksum_buf_len = sizeof(struct sctphdr); > > pr_debug("%s: packet:%p\n", __func__, packet); > > @@ -493,7 +492,6 @@ int sctp_packet_transmit(struct sctp_packet *packet) > if (chunk == packet->auth) > auth = skb_tail_pointer(nskb); > > - cksum_buf_len += chunk->skb->len; > memcpy(skb_put(nskb, chunk->skb->len), > chunk->skb->data, chunk->skb->len); > > @@ -538,12 +536,7 @@ int sctp_packet_transmit(struct sctp_packet *packet) > if (!sctp_checksum_disable) { > if (!(dst->dev->features & NETIF_F_SCTP_CSUM) || > (dst_xfrm(dst) != NULL) || packet->ipfragok) { > - __u32 crc32 = sctp_start_cksum((__u8 *)sh, cksum_buf_len); > - > - /* 3) Put the resultant value into the checksum field in the > - * common header, and leave the rest of the bits unchanged. > - */ > - sh->checksum = sctp_end_cksum(crc32); > + sh->checksum = sctp_compute_cksum(nskb, 0); > } else { > /* no need to seed pseudo checksum for SCTP */ > nskb->ip_summed = CHECKSUM_PARTIAL; > ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH net-next 5/5] net: sctp: fix and consolidate SCTP checksumming code 2013-10-30 14:29 ` Vlad Yasevich @ 2013-11-04 12:11 ` Daniel Borkmann 2013-11-04 16:10 ` Vlad Yasevich 0 siblings, 1 reply; 17+ messages in thread From: Daniel Borkmann @ 2013-11-04 12:11 UTC (permalink / raw) To: Vlad Yasevich; +Cc: davem, netdev, linux-sctp On 10/30/2013 03:29 PM, Vlad Yasevich wrote: > On 10/30/2013 06:50 AM, Daniel Borkmann wrote: [...] > Daniel > > Here is a follow-on idea that might help even more. > What if we put a pointer to skb_checksum_ops() in the skb > somewhere (I was thinking of skb_shinfo). Then > skb_checksum can simply use the data from there. This would > allow us to get rid of all the special cases in SCTP that do > checksumming. We can just set it to partial, set up the right > fields and let HW or SW always do the right thing. I need to think about this a bit. This would certainly have the negative side-effect of a higher skb->truesize usage and thus affecting memory accounting for everyone as we extend skb_shared_info. ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH net-next 5/5] net: sctp: fix and consolidate SCTP checksumming code 2013-11-04 12:11 ` Daniel Borkmann @ 2013-11-04 16:10 ` Vlad Yasevich 2013-11-04 21:10 ` Daniel Borkmann 0 siblings, 1 reply; 17+ messages in thread From: Vlad Yasevich @ 2013-11-04 16:10 UTC (permalink / raw) To: Daniel Borkmann; +Cc: davem, netdev, linux-sctp On 11/04/2013 07:11 AM, Daniel Borkmann wrote: > On 10/30/2013 03:29 PM, Vlad Yasevich wrote: >> On 10/30/2013 06:50 AM, Daniel Borkmann wrote: > [...] >> Daniel >> >> Here is a follow-on idea that might help even more. >> What if we put a pointer to skb_checksum_ops() in the skb >> somewhere (I was thinking of skb_shinfo). Then >> skb_checksum can simply use the data from there. This would >> allow us to get rid of all the special cases in SCTP that do >> checksumming. We can just set it to partial, set up the right >> fields and let HW or SW always do the right thing. > > I need to think about this a bit. This would certainly have the > negative side-effect of a higher skb->truesize usage and thus > affecting memory accounting for everyone as we extend > skb_shared_info. You are talking a single pointer here... The alternative is to do a per-protocol table. -vlad ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH net-next 5/5] net: sctp: fix and consolidate SCTP checksumming code 2013-11-04 16:10 ` Vlad Yasevich @ 2013-11-04 21:10 ` Daniel Borkmann 0 siblings, 0 replies; 17+ messages in thread From: Daniel Borkmann @ 2013-11-04 21:10 UTC (permalink / raw) To: Vlad Yasevich; +Cc: davem, netdev, linux-sctp On 11/04/2013 05:10 PM, Vlad Yasevich wrote: > On 11/04/2013 07:11 AM, Daniel Borkmann wrote: >> On 10/30/2013 03:29 PM, Vlad Yasevich wrote: >>> On 10/30/2013 06:50 AM, Daniel Borkmann wrote: >> [...] >>> Daniel >>> >>> Here is a follow-on idea that might help even more. >>> What if we put a pointer to skb_checksum_ops() in the skb >>> somewhere (I was thinking of skb_shinfo). Then >>> skb_checksum can simply use the data from there. This would >>> allow us to get rid of all the special cases in SCTP that do >>> checksumming. We can just set it to partial, set up the right >>> fields and let HW or SW always do the right thing. >> >> I need to think about this a bit. This would certainly have the >> negative side-effect of a higher skb->truesize usage and thus >> affecting memory accounting for everyone as we extend >> skb_shared_info. > > You are talking a single pointer here... The alternative > is to do a per-protocol table. Well, that is e.g. 8 more byte per skb, right? ;) I think if we need these kind of changes in many more places than currently, then this would make sense indeed. ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH net-next 0/5] SCTP fix/updates 2013-10-30 10:50 [PATCH net-next 0/5] SCTP fix/updates Daniel Borkmann ` (4 preceding siblings ...) 2013-10-30 10:50 ` [PATCH net-next 5/5] net: sctp: fix and consolidate SCTP checksumming code Daniel Borkmann @ 2013-10-30 11:29 ` Neil Horman 2013-10-30 14:29 ` Vlad Yasevich 2013-11-04 4:07 ` David Miller 7 siblings, 0 replies; 17+ messages in thread From: Neil Horman @ 2013-10-30 11:29 UTC (permalink / raw) To: Daniel Borkmann; +Cc: davem, netdev, linux-sctp On Wed, Oct 30, 2013 at 11:50:47AM +0100, Daniel Borkmann wrote: > Please see patch 5 for the main description/motivation, the rest just > brings in the needed functionality for that. Although this is actually > a fix, I've based it against net-next as some additional work for > fixing it was needed. > > Thanks! > > Daniel Borkmann (5): > lib: crc32: clean up spacing in test cases > lib: crc32: add functionality to combine two crc32{,c}s in GF(2) > lib: crc32: add test cases for crc32{,c}_combine routines > net: skb_checksum: allow custom update/combine for walking skb > net: sctp: fix and consolidate SCTP checksumming code > > include/linux/crc32.h | 40 ++++ > include/linux/skbuff.h | 13 +- > include/net/checksum.h | 6 + > include/net/sctp/checksum.h | 56 ++---- > lib/crc32.c | 453 +++++++++++++++++++++++++------------------- > net/core/skbuff.c | 31 ++- > net/sctp/output.c | 9 +- > 7 files changed, 350 insertions(+), 258 deletions(-) > > -- > 1.8.3.1 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-sctp" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Acked-by: Neil Horman <nhorman@tuxdriver.com> ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH net-next 0/5] SCTP fix/updates 2013-10-30 10:50 [PATCH net-next 0/5] SCTP fix/updates Daniel Borkmann ` (5 preceding siblings ...) 2013-10-30 11:29 ` [PATCH net-next 0/5] SCTP fix/updates Neil Horman @ 2013-10-30 14:29 ` Vlad Yasevich 2013-11-04 4:07 ` David Miller 7 siblings, 0 replies; 17+ messages in thread From: Vlad Yasevich @ 2013-10-30 14:29 UTC (permalink / raw) To: Daniel Borkmann, davem; +Cc: netdev, linux-sctp On 10/30/2013 06:50 AM, Daniel Borkmann wrote: > Please see patch 5 for the main description/motivation, the rest just > brings in the needed functionality for that. Although this is actually > a fix, I've based it against net-next as some additional work for > fixing it was needed. > > Thanks! > > Daniel Borkmann (5): > lib: crc32: clean up spacing in test cases > lib: crc32: add functionality to combine two crc32{,c}s in GF(2) > lib: crc32: add test cases for crc32{,c}_combine routines > net: skb_checksum: allow custom update/combine for walking skb > net: sctp: fix and consolidate SCTP checksumming code > > include/linux/crc32.h | 40 ++++ > include/linux/skbuff.h | 13 +- > include/net/checksum.h | 6 + > include/net/sctp/checksum.h | 56 ++---- > lib/crc32.c | 453 +++++++++++++++++++++++++------------------- > net/core/skbuff.c | 31 ++- > net/sctp/output.c | 9 +- > 7 files changed, 350 insertions(+), 258 deletions(-) > Series Acked-by: Vlad Yasevich <vyasevich@gmail.com> -vlad ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH net-next 0/5] SCTP fix/updates 2013-10-30 10:50 [PATCH net-next 0/5] SCTP fix/updates Daniel Borkmann ` (6 preceding siblings ...) 2013-10-30 14:29 ` Vlad Yasevich @ 2013-11-04 4:07 ` David Miller 7 siblings, 0 replies; 17+ messages in thread From: David Miller @ 2013-11-04 4:07 UTC (permalink / raw) To: dborkman; +Cc: netdev, linux-sctp From: Daniel Borkmann <dborkman@redhat.com> Date: Wed, 30 Oct 2013 11:50:47 +0100 > Please see patch 5 for the main description/motivation, the rest just > brings in the needed functionality for that. Although this is actually > a fix, I've based it against net-next as some additional work for > fixing it was needed. Great work Daniel, and a long overdue simplification. Series applied, thanks! ^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2013-11-04 21:34 UTC | newest] Thread overview: 17+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-10-30 10:50 [PATCH net-next 0/5] SCTP fix/updates Daniel Borkmann 2013-10-30 10:50 ` [PATCH net-next 1/5] lib: crc32: clean up spacing in test cases Daniel Borkmann 2013-10-30 13:56 ` Joe Perches 2013-10-30 14:10 ` David Laight 2013-10-30 14:15 ` Daniel Borkmann 2013-10-30 15:14 ` Joe Perches 2013-10-30 10:50 ` [PATCH net-next 2/5] lib: crc32: add functionality to combine two crc32{,c}s in GF(2) Daniel Borkmann 2013-10-30 10:50 ` [PATCH net-next 3/5] lib: crc32: add test cases for crc32{,c}_combine routines Daniel Borkmann 2013-10-30 10:50 ` [PATCH net-next 4/5] net: skb_checksum: allow custom update/combine for walking skb Daniel Borkmann 2013-10-30 10:50 ` [PATCH net-next 5/5] net: sctp: fix and consolidate SCTP checksumming code Daniel Borkmann 2013-10-30 14:29 ` Vlad Yasevich 2013-11-04 12:11 ` Daniel Borkmann 2013-11-04 16:10 ` Vlad Yasevich 2013-11-04 21:10 ` Daniel Borkmann 2013-10-30 11:29 ` [PATCH net-next 0/5] SCTP fix/updates Neil Horman 2013-10-30 14:29 ` Vlad Yasevich 2013-11-04 4:07 ` David Miller
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).