#include <assert.h>
#include "kernel.h"
#include "../kernel-module/nft_rtpengine.h"

int main(void) {
	int ret;

	ret = kernel_setup_table(0);
	assert(ret == 0);

	struct rtpengine_target_info reti;
	struct rtpengine_destination_info redi;

	reti = (struct rtpengine_target_info) {
		.local = {
			.family = AF_INET,
			.u.ipv4 = htonl(0x7f000001),
			.port = 4444,
		},
		.expected_src = {
			.family = AF_INET,
			.u.ipv4 = htonl(0x7f000001),
			.port = 5555,
		},
		.src_mismatch = MSM_IGNORE,
		.num_destinations = 1,
		.decrypt = {
			.cipher = REC_AEAD_AES_GCM_256,
			.hmac = REH_NULL,
			.master_key_len = 32,
			.master_salt_len = 12,
			.session_key_len = 32,
			.session_salt_len = 12,
			.master_key = {
				0xb8, 0x9a, 0x55, 0xee, 0xd9, 0xb6, 0x6f, 0xca, 0x76, 0xd3, 0x2a, 0x7e,
				0x49, 0xfb, 0x8e, 0xa7, 0xff, 0xa7, 0xa9, 0xcd, 0x46, 0x42, 0x93, 0xf2,
				0xd6, 0x23, 0x2c, 0x65, 0x77, 0x06, 0xdc, 0x71
			},
			.master_salt = {
				0xc5, 0xd5, 0x69, 0x14, 0x90, 0x6a, 0x15, 0xfc, 0x52, 0x7b, 0x0a, 0xdb
			},
		},
		.rtp = 1,
		.rtcp_mux = 1,
		.dtls = 1,
		.stun = 1,
		.ssrc = { 0x12345678, 0, },
		.num_payload_types = 8,
		.pt_input = {
			{ 97, 90000, },
			{ 98, 90000, },
			{ 120, 90000, },
			{ 121, 90000, },
			{ 124, 90000, },
			{ 125, 90000, },
			{ 126, 90000, },
			{ 127, 90000, },
			{ 0, },
		},
	};

	redi = (struct rtpengine_destination_info) {
		.local = {
			.family = AF_INET,
			.u.ipv4 = htonl(0x7f000001),
			.port = 4444,
		},
		.num = 0,
		.output = {
			.src_addr = {
				.family = AF_INET,
				.u.ipv4 = htonl(0x7f000001),
				.port = 6666,
			},
			.dst_addr = {
				.family = AF_INET,
				.u.ipv4 = htonl(0x7f000001),
				.port = 7777,
			},
			.encrypt = {
				.cipher = REC_AEAD_AES_GCM_256,
				.hmac = REH_NULL,
				.master_key_len = 32,
				.master_salt_len = 12,
				.session_key_len = 32,
				.session_salt_len = 12,
				.master_key = {
					0xb8, 0x9a, 0x55, 0xee, 0xd9, 0xb6, 0x6f, 0xca, 0x76, 0xd3, 0x2a, 0x7e,
					0x49, 0xfb, 0x8e, 0xa7, 0xff, 0xa7, 0xa9, 0xcd, 0x46, 0x42, 0x93, 0xf2,
					0xd6, 0x23, 0x2c, 0x65, 0x77, 0x06, 0xdc, 0x71
				},
				.master_salt = {
					0xc5, 0xd5, 0x69, 0x14, 0x90, 0x6a, 0x15, 0xfc, 0x52, 0x7b, 0x0a, 0xdb
				},
			},
			.ssrc_out = { 0x54321, 0, },
		},
	};

	ret = kernel_add_stream(&reti);
	assert(ret == 0);
	ret = kernel_add_destination(&redi);
	assert(ret == 0);

	reti.local.port = 4446;
	redi.local.port = 4446;
	ret = kernel_add_stream(&reti);
	assert(ret == 0);
	ret = kernel_add_destination(&redi);
	assert(ret == 0);

	reti.local.port = 4448;
	redi.local.port = 4448;
	ret = kernel_add_stream(&reti);
	assert(ret == 0);
	ret = kernel_add_destination(&redi);
	assert(ret == 0);

	reti.local.port = 4450;
	redi.local.port = 4450;
	ret = kernel_add_stream(&reti);
	assert(ret == 0);
	ret = kernel_add_destination(&redi);
	assert(ret == 0);

	return 0;
}

int get_local_log_level(unsigned int u) {
	return -1;
}
