FPS 0.0.3

Flow processing system (under construction).
/*
 * main.c
 *
 *  Created on: 2015. 10. 17.
 *      Author: KHL
 */

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