#include <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);
}
