mirror of
https://github.com/intel/isa-l.git
synced 2025-01-19 04:26:08 +01:00
crc: Create a combined crc32 check test
Change-Id: Idae7634007363cfb59cca15270bd82c37fae26ea Signed-off-by: Roy Oursler <roy.j.oursler@intel.com>
This commit is contained in:
parent
148898c6ba
commit
3371542dce
@ -204,11 +204,9 @@ checks = \
|
||||
pq_check_test.exe \
|
||||
crc16_t10dif_test.exe \
|
||||
crc16_t10dif_copy_test.exe \
|
||||
crc32_ieee_test.exe \
|
||||
crc32_iscsi_test.exe \
|
||||
crc32_funcs_test.exe \
|
||||
crc64_funcs_test.exe \
|
||||
igzip_rand_test.exe \
|
||||
crc32_gzip_refl_test.exe
|
||||
igzip_rand_test.exe
|
||||
|
||||
checks: lib $(checks)
|
||||
$(checks): $(@B).obj
|
||||
|
@ -57,9 +57,10 @@ extern_hdrs += include/crc.h include/crc64.h
|
||||
|
||||
other_src += include/reg_sizes.asm include/types.h include/test.h
|
||||
|
||||
check_tests += crc/crc16_t10dif_test crc/crc32_ieee_test crc/crc32_iscsi_test \
|
||||
check_tests += crc/crc16_t10dif_test \
|
||||
crc/crc16_t10dif_copy_test \
|
||||
crc/crc64_funcs_test crc/crc32_gzip_refl_test
|
||||
crc/crc64_funcs_test \
|
||||
crc/crc32_funcs_test
|
||||
|
||||
perf_tests += crc/crc16_t10dif_perf crc/crc16_t10dif_copy_perf \
|
||||
crc/crc16_t10dif_op_perf \
|
||||
|
295
crc/crc32_funcs_test.c
Normal file
295
crc/crc32_funcs_test.c
Normal file
@ -0,0 +1,295 @@
|
||||
/**********************************************************************
|
||||
Copyright(c) 2011-2018 Intel Corporation All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of Intel Corporation nor the names of its
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
**********************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include "crc.h"
|
||||
#include "types.h"
|
||||
|
||||
#ifndef TEST_SEED
|
||||
# define TEST_SEED 0x1234
|
||||
#endif
|
||||
|
||||
#define MAX_BUF 512
|
||||
#define TEST_SIZE 20
|
||||
|
||||
typedef uint32_t(*crc32_func_t) (uint32_t, const uint8_t *, uint64_t);
|
||||
typedef uint32_t(*crc32_func_t_base) (uint32_t, uint8_t *, uint64_t);
|
||||
|
||||
typedef struct func_case {
|
||||
char *note;
|
||||
crc32_func_t crc32_func_call;
|
||||
crc32_func_t_base crc32_ref_call;
|
||||
} func_case_t;
|
||||
|
||||
uint32_t crc32_iscsi_wrap(uint32_t seed, const uint8_t * buf, uint64_t len)
|
||||
{
|
||||
return crc32_iscsi((uint8_t *) buf, len, seed);
|
||||
}
|
||||
|
||||
uint32_t crc32_iscsi_base_wrap(uint32_t seed, uint8_t * buf, uint64_t len)
|
||||
{
|
||||
return crc32_iscsi_base(buf, len, seed);
|
||||
}
|
||||
|
||||
func_case_t test_funcs[] = {
|
||||
{"crc32_ieee", crc32_ieee, crc32_ieee_base}
|
||||
,
|
||||
{"crc32_gzip_refl", crc32_gzip_refl, crc32_gzip_refl_base}
|
||||
,
|
||||
{"crc32_iscsi", crc32_iscsi_wrap, crc32_iscsi_base_wrap}
|
||||
};
|
||||
|
||||
// Generates pseudo-random data
|
||||
|
||||
void rand_buffer(unsigned char *buf, long buffer_size)
|
||||
{
|
||||
long i;
|
||||
for (i = 0; i < buffer_size; i++)
|
||||
buf[i] = rand();
|
||||
}
|
||||
|
||||
// Test cases
|
||||
int zeros_test(func_case_t * test_func);
|
||||
|
||||
int simple_pattern_test(func_case_t * test_func);
|
||||
|
||||
int seeds_sizes_test(func_case_t * test_func);
|
||||
|
||||
int eob_test(func_case_t * test_func);
|
||||
|
||||
int update_test(func_case_t * test_func);
|
||||
|
||||
int verbose = 0;
|
||||
void *buf_alloc = NULL;
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int fail = 0, fail_case;
|
||||
int i, ret;
|
||||
func_case_t *test_func;
|
||||
|
||||
verbose = argc - 1;
|
||||
|
||||
// Align to MAX_BUF boundary
|
||||
ret = posix_memalign(&buf_alloc, MAX_BUF, MAX_BUF * TEST_SIZE);
|
||||
if (ret) {
|
||||
printf("alloc error: Fail");
|
||||
return -1;
|
||||
}
|
||||
srand(TEST_SEED);
|
||||
printf("CRC32 Tests\n");
|
||||
|
||||
for (i = 0; i < sizeof(test_funcs) / sizeof(test_funcs[0]); i++) {
|
||||
fail_case = 0;
|
||||
test_func = &test_funcs[i];
|
||||
|
||||
printf("Test %s ", test_func->note);
|
||||
fail_case += zeros_test(test_func);
|
||||
fail_case += simple_pattern_test(test_func);
|
||||
fail_case += seeds_sizes_test(test_func);
|
||||
fail_case += eob_test(test_func);
|
||||
fail_case += update_test(test_func);
|
||||
printf("Test %s done: %s\n", test_func->note, fail_case ? "Fail" : "Pass");
|
||||
|
||||
if (fail_case) {
|
||||
printf("\n%s Failed %d tests\n", test_func->note, fail_case);
|
||||
fail++;
|
||||
}
|
||||
}
|
||||
|
||||
printf("CRC32 Tests all done: %s\n", fail ? "Fail" : "Pass");
|
||||
|
||||
return fail;
|
||||
}
|
||||
|
||||
// Test of all zeros
|
||||
int zeros_test(func_case_t * test_func)
|
||||
{
|
||||
uint32_t crc, crc_ref;
|
||||
int fail = 0;
|
||||
unsigned char *buf = NULL;
|
||||
|
||||
buf = (unsigned char *)buf_alloc;
|
||||
memset(buf, 0, MAX_BUF * 10);
|
||||
crc = test_func->crc32_func_call(TEST_SEED, buf, MAX_BUF * 10);
|
||||
crc_ref = test_func->crc32_ref_call(TEST_SEED, buf, MAX_BUF * 10);
|
||||
|
||||
if (crc != crc_ref) {
|
||||
fail++;
|
||||
printf("\n opt ref\n");
|
||||
printf(" ------ ------\n");
|
||||
printf("crc zero = 0x%8x 0x%8x \n", crc, crc_ref);
|
||||
} else
|
||||
printf(".");
|
||||
|
||||
return fail;
|
||||
}
|
||||
|
||||
// Another simple test pattern
|
||||
int simple_pattern_test(func_case_t * test_func)
|
||||
{
|
||||
uint32_t crc, crc_ref;
|
||||
int fail = 0;
|
||||
unsigned char *buf = NULL;
|
||||
|
||||
buf = (unsigned char *)buf_alloc;
|
||||
memset(buf, 0x8a, MAX_BUF);
|
||||
crc = test_func->crc32_func_call(TEST_SEED, buf, MAX_BUF);
|
||||
crc_ref = test_func->crc32_ref_call(TEST_SEED, buf, MAX_BUF);
|
||||
if (crc != crc_ref)
|
||||
fail++;
|
||||
if (verbose)
|
||||
printf("crc all 8a = 0x%8x 0x%8x\n", crc, crc_ref);
|
||||
else
|
||||
printf(".");
|
||||
|
||||
return fail;
|
||||
}
|
||||
|
||||
int seeds_sizes_test(func_case_t * test_func)
|
||||
{
|
||||
uint32_t crc, crc_ref;
|
||||
int fail = 0;
|
||||
int i;
|
||||
uint64_t r, s;
|
||||
unsigned char *buf = NULL;
|
||||
|
||||
// Do a few random tests
|
||||
buf = (unsigned char *)buf_alloc; //reset buf
|
||||
r = rand();
|
||||
rand_buffer(buf, MAX_BUF * TEST_SIZE);
|
||||
|
||||
for (i = 0; i < TEST_SIZE; i++) {
|
||||
crc = test_func->crc32_func_call(r, buf, MAX_BUF);
|
||||
crc_ref = test_func->crc32_ref_call(r, buf, MAX_BUF);
|
||||
if (crc != crc_ref)
|
||||
fail++;
|
||||
if (verbose)
|
||||
printf("crc rand%3d = 0x%8x 0x%8x\n", i, crc, crc_ref);
|
||||
else
|
||||
printf(".");
|
||||
buf += MAX_BUF;
|
||||
}
|
||||
|
||||
// Do a few random sizes
|
||||
buf = (unsigned char *)buf_alloc; //reset buf
|
||||
r = rand();
|
||||
|
||||
for (i = MAX_BUF; i >= 0; i--) {
|
||||
crc = test_func->crc32_func_call(r, buf, i);
|
||||
crc_ref = test_func->crc32_ref_call(r, buf, i);
|
||||
if (crc != crc_ref) {
|
||||
fail++;
|
||||
printf("fail random size%i 0x%8x 0x%8x\n", i, crc, crc_ref);
|
||||
} else
|
||||
printf(".");
|
||||
}
|
||||
|
||||
// Try different seeds
|
||||
for (s = 0; s < 20; s++) {
|
||||
buf = (unsigned char *)buf_alloc; //reset buf
|
||||
|
||||
r = rand(); // just to get a new seed
|
||||
rand_buffer(buf, MAX_BUF * TEST_SIZE); // new pseudo-rand data
|
||||
|
||||
if (verbose)
|
||||
printf("seed = 0x%lx\n", r);
|
||||
|
||||
for (i = 0; i < TEST_SIZE; i++) {
|
||||
crc = test_func->crc32_func_call(r, buf, MAX_BUF);
|
||||
crc_ref = test_func->crc32_ref_call(r, buf, MAX_BUF);
|
||||
if (crc != crc_ref)
|
||||
fail++;
|
||||
if (verbose)
|
||||
printf("crc rand%3d = 0x%8x 0x%8x\n", i, crc, crc_ref);
|
||||
else
|
||||
printf(".");
|
||||
buf += MAX_BUF;
|
||||
}
|
||||
}
|
||||
|
||||
return fail;
|
||||
}
|
||||
|
||||
// Run tests at end of buffer
|
||||
int eob_test(func_case_t * test_func)
|
||||
{
|
||||
uint32_t crc, crc_ref;
|
||||
int fail = 0;
|
||||
int i;
|
||||
unsigned char *buf = NULL;
|
||||
|
||||
buf = (unsigned char *)buf_alloc; //reset buf
|
||||
buf = buf + ((MAX_BUF - 1) * TEST_SIZE); //Line up TEST_SIZE from end
|
||||
for (i = 0; i < TEST_SIZE; i++) {
|
||||
crc = test_func->crc32_func_call(TEST_SEED, buf + i, TEST_SIZE - i);
|
||||
crc_ref = test_func->crc32_ref_call(TEST_SEED, buf + i, TEST_SIZE - i);
|
||||
if (crc != crc_ref)
|
||||
fail++;
|
||||
if (verbose)
|
||||
printf("crc eob rand%3d = 0x%8x 0x%8x\n", i, crc, crc_ref);
|
||||
else
|
||||
printf(".");
|
||||
}
|
||||
|
||||
return fail;
|
||||
}
|
||||
|
||||
int update_test(func_case_t * test_func)
|
||||
{
|
||||
uint32_t crc, crc_ref;
|
||||
int fail = 0;
|
||||
int i;
|
||||
uint64_t r;
|
||||
unsigned char *buf = NULL;
|
||||
|
||||
buf = (unsigned char *)buf_alloc; //reset buf
|
||||
r = rand();
|
||||
// Process the whole buf with reference func single call.
|
||||
crc_ref = test_func->crc32_ref_call(r, buf, MAX_BUF * TEST_SIZE);
|
||||
// Process buf with update method.
|
||||
for (i = 0; i < TEST_SIZE; i++) {
|
||||
crc = test_func->crc32_func_call(r, buf, MAX_BUF);
|
||||
// Update crc seeds and buf pointer.
|
||||
r = crc;
|
||||
buf += MAX_BUF;
|
||||
}
|
||||
|
||||
if (crc != crc_ref)
|
||||
fail++;
|
||||
if (verbose)
|
||||
printf("crc rand%3d = 0x%8x 0x%8x\n", i, crc, crc_ref);
|
||||
else
|
||||
printf(".");
|
||||
|
||||
return fail;
|
||||
}
|
@ -1,174 +0,0 @@
|
||||
/**********************************************************************
|
||||
Copyright(c) 2011-2017 Intel Corporation All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of Intel Corporation nor the names of its
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
**********************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include "crc.h"
|
||||
#include "types.h"
|
||||
|
||||
#ifndef TEST_SEED
|
||||
# define TEST_SEED 0x1234
|
||||
#endif
|
||||
|
||||
#define MAX_BUF 512
|
||||
#define TEST_SIZE 20
|
||||
|
||||
typedef uint64_t u64;
|
||||
typedef uint32_t u32;
|
||||
typedef uint16_t u16;
|
||||
typedef uint8_t u8;
|
||||
|
||||
// Generates pseudo-random data
|
||||
|
||||
void rand_buffer(unsigned char *buf, long buffer_size)
|
||||
{
|
||||
long i;
|
||||
for (i = 0; i < buffer_size; i++)
|
||||
buf[i] = rand();
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int fail = 0;
|
||||
u32 r;
|
||||
int verbose = argc - 1;
|
||||
int i, s, ret;
|
||||
void *buf_alloc;
|
||||
unsigned char *buf;
|
||||
|
||||
printf("Test crc32_gzip_refl ");
|
||||
|
||||
// Align to MAX_BUF boundary
|
||||
ret = posix_memalign(&buf_alloc, MAX_BUF, MAX_BUF * TEST_SIZE);
|
||||
if (ret) {
|
||||
printf("alloc error: Fail");
|
||||
return -1;
|
||||
}
|
||||
buf = (unsigned char *)buf_alloc;
|
||||
|
||||
srand(TEST_SEED);
|
||||
|
||||
// Test of all zeros
|
||||
memset(buf, 0, MAX_BUF * 10);
|
||||
u32 crc = crc32_gzip_refl(TEST_SEED, buf, MAX_BUF);
|
||||
u32 crc_ref = crc32_gzip_refl_base(TEST_SEED, buf, MAX_BUF);
|
||||
if (crc != crc_ref) {
|
||||
fail++;
|
||||
printf("\n opt ref\n");
|
||||
printf(" ------ ------\n");
|
||||
printf("crc zero = 0x%8x 0x%8x \n", crc, crc_ref);
|
||||
} else
|
||||
printf(".");
|
||||
|
||||
// Another simple test pattern
|
||||
memset(buf, 0x8a, MAX_BUF);
|
||||
crc = crc32_gzip_refl(TEST_SEED, buf, MAX_BUF);
|
||||
crc_ref = crc32_gzip_refl_base(TEST_SEED, buf, MAX_BUF);
|
||||
if (crc != crc_ref)
|
||||
fail++;
|
||||
if (verbose)
|
||||
printf("crc all 8a = 0x%8x 0x%8x\n", crc, crc_ref);
|
||||
else
|
||||
printf(".");
|
||||
|
||||
// Do a few random tests
|
||||
r = rand();
|
||||
rand_buffer(buf, MAX_BUF * TEST_SIZE);
|
||||
|
||||
for (i = 0; i < TEST_SIZE; i++) {
|
||||
crc = crc32_gzip_refl(r, buf, MAX_BUF);
|
||||
crc_ref = crc32_gzip_refl_base(r, buf, MAX_BUF);
|
||||
if (crc != crc_ref)
|
||||
fail++;
|
||||
if (verbose)
|
||||
printf("crc rand%3d = 0x%8x 0x%8x\n", i, crc, crc_ref);
|
||||
else
|
||||
printf(".");
|
||||
buf += MAX_BUF;
|
||||
}
|
||||
|
||||
// Do a few random sizes
|
||||
buf = (unsigned char *)buf_alloc; //reset buf
|
||||
r = rand();
|
||||
|
||||
for (i = MAX_BUF; i >= 0; i--) {
|
||||
crc = crc32_gzip_refl(r, buf, i);
|
||||
crc_ref = crc32_gzip_refl_base(r, buf, i);
|
||||
if (crc != crc_ref) {
|
||||
fail++;
|
||||
printf("fail random size%i 0x%8x 0x%8x\n", i, crc, crc_ref);
|
||||
} else
|
||||
printf(".");
|
||||
}
|
||||
|
||||
// Try different seeds
|
||||
for (s = 0; s < 20; s++) {
|
||||
buf = (unsigned char *)buf_alloc; //reset buf
|
||||
|
||||
r = rand(); // just to get a new seed
|
||||
rand_buffer(buf, MAX_BUF * TEST_SIZE); // new pseudo-rand data
|
||||
|
||||
if (verbose)
|
||||
printf("seed = 0x%x\n", r);
|
||||
|
||||
for (i = 0; i < TEST_SIZE; i++) {
|
||||
crc = crc32_gzip_refl(r, buf, MAX_BUF);
|
||||
crc_ref = crc32_gzip_refl_base(r, buf, MAX_BUF);
|
||||
if (crc != crc_ref)
|
||||
fail++;
|
||||
if (verbose)
|
||||
printf("crc rand%3d = 0x%8x 0x%8x\n", i, crc, crc_ref);
|
||||
else
|
||||
printf(".");
|
||||
buf += MAX_BUF;
|
||||
}
|
||||
}
|
||||
|
||||
// Run tests at end of buffer
|
||||
buf = (unsigned char *)buf_alloc; //reset buf
|
||||
buf = buf + ((MAX_BUF - 1) * TEST_SIZE); //Line up TEST_SIZE from end
|
||||
for (i = 0; i < TEST_SIZE; i++) {
|
||||
crc = crc32_gzip_refl(TEST_SEED, buf + i, TEST_SIZE - i);
|
||||
crc_ref = crc32_gzip_refl_base(TEST_SEED, buf + i, TEST_SIZE - i);
|
||||
if (crc != crc_ref)
|
||||
fail++;
|
||||
if (verbose)
|
||||
printf("crc eob rand%3d = 0x%4x 0x%4x\n", i, crc, crc_ref);
|
||||
else
|
||||
printf(".");
|
||||
}
|
||||
|
||||
printf("Test done: %s\n", fail ? "Fail" : "Pass");
|
||||
if (fail)
|
||||
printf("\nFailed %d tests\n", fail);
|
||||
|
||||
return fail;
|
||||
}
|
@ -1,174 +0,0 @@
|
||||
/**********************************************************************
|
||||
Copyright(c) 2011-2015 Intel Corporation All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of Intel Corporation nor the names of its
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
**********************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include "crc.h"
|
||||
#include "types.h"
|
||||
|
||||
#ifndef TEST_SEED
|
||||
# define TEST_SEED 0x1234
|
||||
#endif
|
||||
|
||||
#define MAX_BUF 512
|
||||
#define TEST_SIZE 20
|
||||
|
||||
typedef uint64_t u64;
|
||||
typedef uint32_t u32;
|
||||
typedef uint16_t u16;
|
||||
typedef uint8_t u8;
|
||||
|
||||
// Generates pseudo-random data
|
||||
|
||||
void rand_buffer(unsigned char *buf, long buffer_size)
|
||||
{
|
||||
long i;
|
||||
for (i = 0; i < buffer_size; i++)
|
||||
buf[i] = rand();
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int fail = 0;
|
||||
u32 r;
|
||||
int verbose = argc - 1;
|
||||
int i, s, ret;
|
||||
void *buf_alloc;
|
||||
unsigned char *buf;
|
||||
|
||||
printf("Test crc32_ieee ");
|
||||
|
||||
// Align to MAX_BUF boundary
|
||||
ret = posix_memalign(&buf_alloc, MAX_BUF, MAX_BUF * TEST_SIZE);
|
||||
if (ret) {
|
||||
printf("alloc error: Fail");
|
||||
return -1;
|
||||
}
|
||||
buf = (unsigned char *)buf_alloc;
|
||||
|
||||
srand(TEST_SEED);
|
||||
|
||||
// Test of all zeros
|
||||
memset(buf, 0, MAX_BUF * 10);
|
||||
u32 crc = crc32_ieee(TEST_SEED, buf, MAX_BUF);
|
||||
u32 crc_ref = crc32_ieee_base(TEST_SEED, buf, MAX_BUF);
|
||||
if (crc != crc_ref) {
|
||||
fail++;
|
||||
printf("\n opt ref\n");
|
||||
printf(" ------ ------\n");
|
||||
printf("crc zero = 0x%8x 0x%8x \n", crc, crc_ref);
|
||||
} else
|
||||
printf(".");
|
||||
|
||||
// Another simple test pattern
|
||||
memset(buf, 0x8a, MAX_BUF);
|
||||
crc = crc32_ieee(TEST_SEED, buf, MAX_BUF);
|
||||
crc_ref = crc32_ieee_base(TEST_SEED, buf, MAX_BUF);
|
||||
if (crc != crc_ref)
|
||||
fail++;
|
||||
if (verbose)
|
||||
printf("crc all 8a = 0x%8x 0x%8x\n", crc, crc_ref);
|
||||
else
|
||||
printf(".");
|
||||
|
||||
// Do a few random tests
|
||||
r = rand();
|
||||
rand_buffer(buf, MAX_BUF * TEST_SIZE);
|
||||
|
||||
for (i = 0; i < TEST_SIZE; i++) {
|
||||
crc = crc32_ieee(r, buf, MAX_BUF);
|
||||
crc_ref = crc32_ieee_base(r, buf, MAX_BUF);
|
||||
if (crc != crc_ref)
|
||||
fail++;
|
||||
if (verbose)
|
||||
printf("crc rand%3d = 0x%8x 0x%8x\n", i, crc, crc_ref);
|
||||
else
|
||||
printf(".");
|
||||
buf += MAX_BUF;
|
||||
}
|
||||
|
||||
// Do a few random sizes
|
||||
buf = (unsigned char *)buf_alloc; //reset buf
|
||||
r = rand();
|
||||
|
||||
for (i = MAX_BUF; i >= 0; i--) {
|
||||
crc = crc32_ieee(r, buf, i);
|
||||
crc_ref = crc32_ieee_base(r, buf, i);
|
||||
if (crc != crc_ref) {
|
||||
fail++;
|
||||
printf("fail random size%i 0x%8x 0x%8x\n", i, crc, crc_ref);
|
||||
} else
|
||||
printf(".");
|
||||
}
|
||||
|
||||
// Try different seeds
|
||||
for (s = 0; s < 20; s++) {
|
||||
buf = (unsigned char *)buf_alloc; //reset buf
|
||||
|
||||
r = rand(); // just to get a new seed
|
||||
rand_buffer(buf, MAX_BUF * TEST_SIZE); // new pseudo-rand data
|
||||
|
||||
if (verbose)
|
||||
printf("seed = 0x%x\n", r);
|
||||
|
||||
for (i = 0; i < TEST_SIZE; i++) {
|
||||
crc = crc32_ieee(r, buf, MAX_BUF);
|
||||
crc_ref = crc32_ieee_base(r, buf, MAX_BUF);
|
||||
if (crc != crc_ref)
|
||||
fail++;
|
||||
if (verbose)
|
||||
printf("crc rand%3d = 0x%8x 0x%8x\n", i, crc, crc_ref);
|
||||
else
|
||||
printf(".");
|
||||
buf += MAX_BUF;
|
||||
}
|
||||
}
|
||||
|
||||
// Run tests at end of buffer
|
||||
buf = (unsigned char *)buf_alloc; //reset buf
|
||||
buf = buf + ((MAX_BUF - 1) * TEST_SIZE); //Line up TEST_SIZE from end
|
||||
for (i = 0; i < TEST_SIZE; i++) {
|
||||
crc = crc32_ieee(TEST_SEED, buf + i, TEST_SIZE - i);
|
||||
crc_ref = crc32_ieee_base(TEST_SEED, buf + i, TEST_SIZE - i);
|
||||
if (crc != crc_ref)
|
||||
fail++;
|
||||
if (verbose)
|
||||
printf("crc eob rand%3d = 0x%4x 0x%4x\n", i, crc, crc_ref);
|
||||
else
|
||||
printf(".");
|
||||
}
|
||||
|
||||
printf("Test done: %s\n", fail ? "Fail" : "Pass");
|
||||
if (fail)
|
||||
printf("\nFailed %d tests\n", fail);
|
||||
|
||||
return fail;
|
||||
}
|
@ -1,171 +0,0 @@
|
||||
/**********************************************************************
|
||||
Copyright(c) 2011-2015 Intel Corporation All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of Intel Corporation nor the names of its
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
**********************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "crc.h"
|
||||
#include "types.h"
|
||||
|
||||
unsigned long crc32_table_iscsi[256] = {
|
||||
0x00000000, 0xF26B8303, 0xE13B70F7, 0x1350F3F4,
|
||||
0xC79A971F, 0x35F1141C, 0x26A1E7E8, 0xD4CA64EB,
|
||||
0x8AD958CF, 0x78B2DBCC, 0x6BE22838, 0x9989AB3B,
|
||||
0x4D43CFD0, 0xBF284CD3, 0xAC78BF27, 0x5E133C24,
|
||||
0x105EC76F, 0xE235446C, 0xF165B798, 0x030E349B,
|
||||
0xD7C45070, 0x25AFD373, 0x36FF2087, 0xC494A384,
|
||||
0x9A879FA0, 0x68EC1CA3, 0x7BBCEF57, 0x89D76C54,
|
||||
0x5D1D08BF, 0xAF768BBC, 0xBC267848, 0x4E4DFB4B,
|
||||
0x20BD8EDE, 0xD2D60DDD, 0xC186FE29, 0x33ED7D2A,
|
||||
0xE72719C1, 0x154C9AC2, 0x061C6936, 0xF477EA35,
|
||||
0xAA64D611, 0x580F5512, 0x4B5FA6E6, 0xB93425E5,
|
||||
0x6DFE410E, 0x9F95C20D, 0x8CC531F9, 0x7EAEB2FA,
|
||||
0x30E349B1, 0xC288CAB2, 0xD1D83946, 0x23B3BA45,
|
||||
0xF779DEAE, 0x05125DAD, 0x1642AE59, 0xE4292D5A,
|
||||
0xBA3A117E, 0x4851927D, 0x5B016189, 0xA96AE28A,
|
||||
0x7DA08661, 0x8FCB0562, 0x9C9BF696, 0x6EF07595,
|
||||
0x417B1DBC, 0xB3109EBF, 0xA0406D4B, 0x522BEE48,
|
||||
0x86E18AA3, 0x748A09A0, 0x67DAFA54, 0x95B17957,
|
||||
0xCBA24573, 0x39C9C670, 0x2A993584, 0xD8F2B687,
|
||||
0x0C38D26C, 0xFE53516F, 0xED03A29B, 0x1F682198,
|
||||
0x5125DAD3, 0xA34E59D0, 0xB01EAA24, 0x42752927,
|
||||
0x96BF4DCC, 0x64D4CECF, 0x77843D3B, 0x85EFBE38,
|
||||
0xDBFC821C, 0x2997011F, 0x3AC7F2EB, 0xC8AC71E8,
|
||||
0x1C661503, 0xEE0D9600, 0xFD5D65F4, 0x0F36E6F7,
|
||||
0x61C69362, 0x93AD1061, 0x80FDE395, 0x72966096,
|
||||
0xA65C047D, 0x5437877E, 0x4767748A, 0xB50CF789,
|
||||
0xEB1FCBAD, 0x197448AE, 0x0A24BB5A, 0xF84F3859,
|
||||
0x2C855CB2, 0xDEEEDFB1, 0xCDBE2C45, 0x3FD5AF46,
|
||||
0x7198540D, 0x83F3D70E, 0x90A324FA, 0x62C8A7F9,
|
||||
0xB602C312, 0x44694011, 0x5739B3E5, 0xA55230E6,
|
||||
0xFB410CC2, 0x092A8FC1, 0x1A7A7C35, 0xE811FF36,
|
||||
0x3CDB9BDD, 0xCEB018DE, 0xDDE0EB2A, 0x2F8B6829,
|
||||
0x82F63B78, 0x709DB87B, 0x63CD4B8F, 0x91A6C88C,
|
||||
0x456CAC67, 0xB7072F64, 0xA457DC90, 0x563C5F93,
|
||||
0x082F63B7, 0xFA44E0B4, 0xE9141340, 0x1B7F9043,
|
||||
0xCFB5F4A8, 0x3DDE77AB, 0x2E8E845F, 0xDCE5075C,
|
||||
0x92A8FC17, 0x60C37F14, 0x73938CE0, 0x81F80FE3,
|
||||
0x55326B08, 0xA759E80B, 0xB4091BFF, 0x466298FC,
|
||||
0x1871A4D8, 0xEA1A27DB, 0xF94AD42F, 0x0B21572C,
|
||||
0xDFEB33C7, 0x2D80B0C4, 0x3ED04330, 0xCCBBC033,
|
||||
0xA24BB5A6, 0x502036A5, 0x4370C551, 0xB11B4652,
|
||||
0x65D122B9, 0x97BAA1BA, 0x84EA524E, 0x7681D14D,
|
||||
0x2892ED69, 0xDAF96E6A, 0xC9A99D9E, 0x3BC21E9D,
|
||||
0xEF087A76, 0x1D63F975, 0x0E330A81, 0xFC588982,
|
||||
0xB21572C9, 0x407EF1CA, 0x532E023E, 0xA145813D,
|
||||
0x758FE5D6, 0x87E466D5, 0x94B49521, 0x66DF1622,
|
||||
0x38CC2A06, 0xCAA7A905, 0xD9F75AF1, 0x2B9CD9F2,
|
||||
0xFF56BD19, 0x0D3D3E1A, 0x1E6DCDEE, 0xEC064EED,
|
||||
0xC38D26C4, 0x31E6A5C7, 0x22B65633, 0xD0DDD530,
|
||||
0x0417B1DB, 0xF67C32D8, 0xE52CC12C, 0x1747422F,
|
||||
0x49547E0B, 0xBB3FFD08, 0xA86F0EFC, 0x5A048DFF,
|
||||
0x8ECEE914, 0x7CA56A17, 0x6FF599E3, 0x9D9E1AE0,
|
||||
0xD3D3E1AB, 0x21B862A8, 0x32E8915C, 0xC083125F,
|
||||
0x144976B4, 0xE622F5B7, 0xF5720643, 0x07198540,
|
||||
0x590AB964, 0xAB613A67, 0xB831C993, 0x4A5A4A90,
|
||||
0x9E902E7B, 0x6CFBAD78, 0x7FAB5E8C, 0x8DC0DD8F,
|
||||
0xE330A81A, 0x115B2B19, 0x020BD8ED, 0xF0605BEE,
|
||||
0x24AA3F05, 0xD6C1BC06, 0xC5914FF2, 0x37FACCF1,
|
||||
0x69E9F0D5, 0x9B8273D6, 0x88D28022, 0x7AB90321,
|
||||
0xAE7367CA, 0x5C18E4C9, 0x4F48173D, 0xBD23943E,
|
||||
0xF36E6F75, 0x0105EC76, 0x12551F82, 0xE03E9C81,
|
||||
0x34F4F86A, 0xC69F7B69, 0xD5CF889D, 0x27A40B9E,
|
||||
0x79B737BA, 0x8BDCB4B9, 0x988C474D, 0x6AE7C44E,
|
||||
0xBE2DA0A5, 0x4C4623A6, 0x5F16D052, 0xAD7D5351,
|
||||
};
|
||||
|
||||
#define PAGESIZE 10240
|
||||
|
||||
int main(void)
|
||||
{
|
||||
unsigned int i, j, good, test, init_crc = 1;
|
||||
|
||||
printf("crc32_iscsi_test: ");
|
||||
|
||||
unsigned char *q_buf = malloc(PAGESIZE);
|
||||
if (q_buf == NULL) {
|
||||
printf("alloc of q_buf failed\n");
|
||||
return -1;
|
||||
}
|
||||
// fill q_buf with semi-random data
|
||||
for (i = 0; i < PAGESIZE; i++)
|
||||
q_buf[i] = (unsigned char)(i ^ (13 + (i >> 8)) ^ ((i >> 16) - 13));
|
||||
|
||||
// Test case 1: Compare against base/simple crc32 implementation and
|
||||
// try all offsets/alignments of buffer.
|
||||
|
||||
for (j = 0; j < 128; j++) {
|
||||
for (i = 0; i < PAGESIZE - j; i++) {
|
||||
good = crc32_iscsi_base(q_buf + j, i, -1);
|
||||
test = crc32_iscsi(q_buf + j, i, -1);
|
||||
if (good != test) {
|
||||
printf("Error for size %d offset %d, %08X should be %08X\n",
|
||||
i, j, test, good);
|
||||
return -1;
|
||||
}
|
||||
} // end for i
|
||||
putchar('.');
|
||||
fflush(0);
|
||||
} // end for j
|
||||
|
||||
// Test case 2: Also vary initial CRC
|
||||
|
||||
for (j = 0; j < 128; j++) { // do all offsets
|
||||
for (i = 0; i < PAGESIZE - j; i++) {
|
||||
good = crc32_iscsi_base(q_buf + j, i, init_crc);
|
||||
test = crc32_iscsi(q_buf + j, i, init_crc);
|
||||
if (good != test) {
|
||||
printf("Error for size %d offset %d, %08X should be %08X\n",
|
||||
i, j, test, good);
|
||||
return -1;
|
||||
}
|
||||
// modify init_crc semi-randomly
|
||||
init_crc ^= 1 << ((i * 3 + j * 5) & 31);
|
||||
} // end for i
|
||||
putchar('.');
|
||||
fflush(0);
|
||||
} // end for j
|
||||
|
||||
// Test case 3: do end of buffer
|
||||
|
||||
for (i = 0; i < PAGESIZE; i++) {
|
||||
good = crc32_iscsi_base(q_buf + i, PAGESIZE - i, -1);
|
||||
test = crc32_iscsi(q_buf + i, PAGESIZE - i, -1);
|
||||
if (good != test) {
|
||||
printf("Error for size %d at eob, %08X should be %08X\n",
|
||||
i, test, good);
|
||||
return -1;
|
||||
}
|
||||
} // end for i
|
||||
putchar('.');
|
||||
fflush(0);
|
||||
|
||||
printf("Pass\n");
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user