blob: 19ef811c4dda4f64fd9f82466032b5b74653fb12 [file] [log] [blame]
#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);
}