| #include <net/ip.h> | 
 | #include <ktest.h> | 
 | #include <linker_func.h> | 
 |  | 
 | KTEST_SUITE("NET") | 
 |  | 
 | static uint16_t simplesum(const uint8_t *buf, int len) | 
 | { | 
 | 	uint64_t hi = 0, lo = 0, sum; | 
 | 	int i; | 
 |  | 
 | 	for (i = 0; i < len; i++) { | 
 | 		if (i % 2 == 0) | 
 | 			hi += buf[i]; | 
 | 		else | 
 | 			lo += buf[i]; | 
 | 	} | 
 | 	sum = (hi << 8) + lo; | 
 | 	while (sum >> 16) | 
 | 		sum = (sum >> 16) + (sum & 0xffff); | 
 | 	return sum & 0xffff; | 
 | } | 
 |  | 
 | bool test_ptclbsum(void) | 
 | { | 
 | 	uint16_t csum, expected; | 
 | 	uint8_t buf[100]; | 
 | 	int i, j, len; | 
 |  | 
 | 	for (i = 0; i < sizeof(buf); i++) | 
 | 		buf[i] = i & 0xff; | 
 | 	for (i = 0; i < sizeof(buf); i++) { | 
 | 		for (j = i; j < sizeof(buf); j++) { | 
 | 			len = j - i + 1; | 
 | 			csum = ptclbsum(buf + i, len); | 
 | 			expected = simplesum(buf + i, len); | 
 | 			if (csum != expected) { | 
 | 				printk("i %d j %d len %d csum %04x expected %04x\n", | 
 | 					   i, j, len, csum, expected); | 
 | 				return false; | 
 | 			} | 
 | 		} | 
 | 	} | 
 | 	return true; | 
 | } | 
 |  | 
 | #define CSUM_BENCH_BUFSIZE 4000 | 
 |  | 
 | bool test_simplesum_bench(void) | 
 | { | 
 | 	uint8_t buf[CSUM_BENCH_BUFSIZE]; | 
 | 	uint16_t csum = 0; | 
 | 	int i, j, len; | 
 |  | 
 | 	for (i = 0; i < sizeof(buf); i++) | 
 | 		buf[i] = i & 0xff; | 
 | 	for (i = 0; i < sizeof(buf); i++) { | 
 | 		for (j = i; j < sizeof(buf); j++) { | 
 | 			len = j - i + 1; | 
 | 			csum += simplesum(buf + i, len); | 
 | 		} | 
 | 	} | 
 | 	return true; | 
 | } | 
 |  | 
 | bool test_ptclbsum_bench(void) | 
 | { | 
 | 	uint8_t buf[CSUM_BENCH_BUFSIZE]; | 
 | 	uint16_t csum = 0; | 
 | 	int i, j, len; | 
 |  | 
 | 	for (i = 0; i < sizeof(buf); i++) | 
 | 		buf[i] = i & 0xff; | 
 | 	for (i = 0; i < sizeof(buf); i++) { | 
 | 		for (j = i; j < sizeof(buf); j++) { | 
 | 			len = j - i + 1; | 
 | 			csum += ptclbsum(buf + i, len); | 
 | 		} | 
 | 	} | 
 | 	return true; | 
 | } | 
 |  | 
 | static struct ktest ktests[] = { | 
 | 	KTEST_REG(ptclbsum,				CONFIG_TEST_ptclbsum), | 
 | 	KTEST_REG(simplesum_bench,		CONFIG_TEST_simplesum_bench), | 
 | 	KTEST_REG(ptclbsum_bench,		CONFIG_TEST_ptclbsum_bench), | 
 | }; | 
 |  | 
 | static int num_ktests = sizeof(ktests) / sizeof(struct ktest); | 
 |  | 
 | linker_func_1(register_net_ktests) | 
 | { | 
 | 	REGISTER_KTESTS(ktests, num_ktests); | 
 | } |