#include "fps.h"
#include <stdio.h>
#include <string.h>
#include <memory.h>
static void prepare_packet1(volatile uint8_t buf[PACKET_BUFFER_SIZE])
{
const uint8_t data[] = {
0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xBC, 0xBC,
0xBC, 0xBC, 0xBC, 0xBC, 0x08, 0x00, 0x45, 0x00,
0x00, 0x28, 0x00, 0x00, 0x40, 0x00, 0x40, 0x06,
0x6F, 0x1D, 0xC0, 0xA8, 0x00, 0x07, 0x0A, 0x00,
0x01, 0x04, 0x56, 0xCE, 0x30, 0x39, 0xFF, 0xFF,
0xF2, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x50, 0x02,
0xC8, 0x00, 0xA2, 0xB8, 0x00, 0x00};
memcpy(buf, data, sizeof(data));
}
int test1()
{
volatile uint8_t buf[PACKET_BUFFER_SIZE];
n_packet packet = wrap_packet(buf, PACKET_BUFFER_SIZE);
if(packet == 0)
return -1;
unwrap_packet(packet);
return 0;
}
int test2()
{
volatile uint8_t buf[PACKET_BUFFER_SIZE];
uint64_t ret = 0;
int err = 0;
n_packet packet = wrap_packet(buf, PACKET_BUFFER_SIZE);
{
ret = write_packet_context_u8(packet, "test_field_u8", 17);
err += (ret != 0);
ret = read_packet_context_u8(packet, "test_field_u8");
err += (ret != 17);
ret = read_packet_context_u8(packet, "not_exist");
err += (ret != 0);
ret = write_packet_context_u8(packet, "test_field_u8", 31);
err += (ret != 17);
ret = read_packet_context_u8(packet, "test_field_u8");
err += (ret != 31);
}
{
ret = write_packet_context_u16(packet, "test_field_u16", 17);
err += (ret != 0);
ret = read_packet_context_u16(packet, "test_field_u16");
err += (ret != 17);
ret = read_packet_context_u16(packet, "not_exist");
err += (ret != 0);
ret = write_packet_context_u16(packet, "test_field_u16", 31);
err += (ret != 17);
ret = read_packet_context_u16(packet, "test_field_u16");
err += (ret != 31);
}
{
ret = write_packet_context_u32(packet, "test_field_u32", 17);
err += (ret != 0);
ret = read_packet_context_u32(packet, "test_field_u32");
err += (ret != 17);
ret = read_packet_context_u32(packet, "not_exist");
err += (ret != 0);
ret = write_packet_context_u32(packet, "test_field_u32", 31);
err += (ret != 17);
ret = read_packet_context_u32(packet, "test_field_u32");
err += (ret != 31);
}
{
ret = write_packet_context_u64(packet, "test_field_u64", 17);
err += (ret != 0);
ret = read_packet_context_u64(packet, "test_field_u64");
err += (ret != 17);
ret = read_packet_context_u64(packet, "not_exist");
err += (ret != 0);
ret = write_packet_context_u64(packet, "test_field_u64", 31);
err += (ret != 17);
ret = read_packet_context_u64(packet, "test_field_u64");
err += (ret != 31);
}
{
ret = write_packet_context_usize(packet, "test_field_usize", 17);
err += (ret != 0);
ret = read_packet_context_usize(packet, "test_field_usize");
err += (ret != 17);
ret = read_packet_context_usize(packet, "not_exist");
err += (ret != 0);
ret = write_packet_context_usize(packet, "test_field_usize", 31);
err += (ret != 17);
ret = read_packet_context_usize(packet, "test_field_usize");
err += (ret != 31);
}
{
const char* first_string = "First String";
const char* second_string = "Second String";
char string_buffer[MAX_FIELD_NAME];
ret = write_packet_context_string(packet, "test_field_string",
first_string, strlen(first_string));
err += (ret != strlen(first_string));
ret = read_packet_context_string(packet, "test_field_string",
string_buffer, sizeof(string_buffer));
err += (ret != strlen(first_string));
err += (strcmp(first_string, string_buffer) != 0);
ret = read_packet_context_string(packet, "not_exist",
string_buffer, sizeof(string_buffer));
err += (ret != 0);
ret = write_packet_context_string(packet, "test_field_string",
second_string, strlen(second_string));
err += (ret != strlen(second_string));
ret = read_packet_context_string(packet, "test_field_string",
string_buffer, sizeof(string_buffer));
err += (ret != strlen(second_string));
err += (strcmp(second_string, string_buffer) != 0);
}
unwrap_packet(packet);
return err;
}
int test3()
{
volatile uint8_t buf[PACKET_BUFFER_SIZE];
uint8_t field_buf[PACKET_BUFFER_SIZE];
const uint8_t old_dst[] = {0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,};
const uint8_t old_src[] = {0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC,};
const uint16_t old_proto = 0x0800;
const uint16_t new_proto = 0xFFEE;
prepare_packet1(buf);
n_packet packet = wrap_packet(buf, PACKET_BUFFER_SIZE);
if(packet == 0)
return -1;
int err = 0;
packet = process_packet(packet, "phy::extract");
packet = process_packet(packet, "ethernet::extract");
packet = process_packet(packet, "ethernet::extract_protocol_u16");
{
size_t len = read_packet_context_field(packet, "ethernet::destination",
field_buf, sizeof(field_buf));
err += (len != 6);
err += (memcmp(old_dst, field_buf, len) != 0);
len = read_packet_context_field(packet, "ethernet::source",
field_buf, sizeof(field_buf));
err += (len != 6);
err += (memcmp(old_src, field_buf, len) != 0);
err += (old_proto !=
read_packet_context_u16(packet, "ethernet::protocol_u16"));
field_buf[0] = 0xFF;
field_buf[1] = 0xEE;
len = write_packet_context_field(packet, "ethernet::protocol",
field_buf, sizeof(field_buf));
err += (len != 2);
}
packet = process_packet(packet, "ethernet::swap_address");
unwrap_packet(packet);
packet = wrap_packet(buf, PACKET_BUFFER_SIZE);
packet = process_packet(packet, "phy::extract");
packet = process_packet(packet, "ethernet::extract");
packet = process_packet(packet, "ethernet::extract_protocol_u16");
{
size_t len = read_packet_context_field(packet, "ethernet::destination",
field_buf, sizeof(field_buf));
err += (len != 6);
err += (memcmp(old_src, field_buf, len) != 0);
len = read_packet_context_field(packet, "ethernet::source",
field_buf, sizeof(field_buf));
err += (len != 6);
err += (memcmp(old_dst, field_buf, len) != 0);
err += (new_proto !=
read_packet_context_u16(packet, "ethernet::protocol_u16"));
}
unwrap_packet(packet);
return err;
}
int bench1(size_t repeat)
{
volatile uint8_t buf[PACKET_BUFFER_SIZE];
prepare_packet1(buf);
n_packet packet = wrap_packet(buf, PACKET_BUFFER_SIZE);
packet = process_packet(packet, "phy::extract");
packet = process_packet(packet, "ethernet::extract");
size_t k;
for(k=0; k<repeat; k++)
{
packet = process_packet(packet, "ethernet::swap_address");
}
unwrap_packet(packet);
return 0;
}
int bench2(size_t repeat)
{
volatile uint8_t buf[PACKET_BUFFER_SIZE];
uint8_t temp_buf[6];
prepare_packet1(buf);
size_t k;
for(k=0; k<repeat; k++)
{
memcpy(buf, temp_buf, 6);
memcpy(buf+6, buf, 6);
memcpy(temp_buf, buf+6, 6);
}
return 0;
}
int c_extern_test(int test_no)
{
switch(test_no)
{
case 1:
return test1();
case 2:
return test2();
case 3:
return test3();
default:
return -1;
}
}
int c_extern_bench(int bench_no, size_t repeat)
{
switch(bench_no)
{
case 1:
return bench1(repeat);
case 2:
return bench2(repeat);
default:
return -1;
}
}