/*
 * BSC NAT Message filtering
 *
 * (C) 2010-2013 by Holger Hans Peter Freyther <zecke@selfish.org>
 * (C) 2010-2013 by On-Waves
 *
 * All Rights Reserved
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */


#include <openbsc/debug.h>
#include <openbsc/gsm_data.h>
#include <openbsc/bsc_nat.h>
#include <openbsc/bsc_nat_sccp.h>

#include <osmocom/core/application.h>
#include <osmocom/core/backtrace.h>
#include <osmocom/core/talloc.h>

#include <osmocom/sccp/sccp.h>
#include <osmocom/gsm/protocol/gsm_08_08.h>

#include <stdio.h>

/* test messages for ipa */
static uint8_t ipa_id[] = {
	0x00, 0x01, 0xfe, 0x06,
};

/* SCCP messages are below */
static uint8_t gsm_reset[] = {
	0x00, 0x12, 0xfd,
	0x09, 0x00, 0x03, 0x05, 0x07, 0x02, 0x42, 0xfe,
	0x02, 0x42, 0xfe, 0x06, 0x00, 0x04, 0x30, 0x04,
	0x01, 0x20,
};

static const uint8_t gsm_reset_ack[] = {
	0x00, 0x13, 0xfd,
	0x09, 0x00, 0x03, 0x07, 0x0b, 0x04, 0x43, 0x01,
	0x00, 0xfe, 0x04, 0x43, 0x5c, 0x00, 0xfe, 0x03,
	0x00, 0x01, 0x31,
};

static const uint8_t gsm_paging[] = {
	0x00, 0x20, 0xfd,
	0x09, 0x00, 0x03, 0x07, 0x0b, 0x04, 0x43, 0x01,
	0x00, 0xfe, 0x04, 0x43, 0x5c, 0x00, 0xfe, 0x10,
	0x00, 0x0e, 0x52, 0x08, 0x08, 0x29, 0x47, 0x10,
	0x02, 0x01, 0x31, 0x97, 0x61, 0x1a, 0x01, 0x06,
};

/* BSC -> MSC connection open */
static const uint8_t bssmap_cr[] = {
	0x00, 0x2c, 0xfd,
	0x01, 0x01, 0x02, 0x03, 0x02, 0x02, 0x04, 0x02,
	0x42, 0xfe, 0x0f, 0x1f, 0x00, 0x1d, 0x57, 0x05,
	0x08, 0x00, 0x72, 0xf4, 0x80, 0x20, 0x12, 0xc3,
	0x50, 0x17, 0x10, 0x05, 0x24, 0x11, 0x03, 0x33,
	0x19, 0xa2, 0x08, 0x29, 0x47, 0x10, 0x02, 0x01,
	0x31, 0x97, 0x61, 0x00
};

/* MSC -> BSC connection confirm */
static const uint8_t bssmap_cc[] = {
	0x00, 0x0a, 0xfd,
	0x02, 0x01, 0x02, 0x03, 0x00, 0x00, 0x03, 0x02, 0x01, 0x00,
};

/* MSC -> BSC released */
static const uint8_t bssmap_released[] = {
	0x00, 0x0e, 0xfd,
	0x04, 0x00, 0x00, 0x03, 0x01, 0x02, 0x03, 0x00, 0x01, 0x0f,
	0x02, 0x23, 0x42, 0x00,
};

/* BSC -> MSC released */
static const uint8_t bssmap_release_complete[] = {
	0x00, 0x07, 0xfd,
	0x05, 0x01, 0x02, 0x03, 0x00, 0x00, 0x03
};

/* both directions IT timer */
static const uint8_t connnection_it[] = {
	0x00, 0x0b, 0xfd,
	0x10, 0x01, 0x02, 0x03, 0x01, 0x02, 0x03,
	0x00, 0x00, 0x00, 0x00,
};

/* error in both directions */
static const uint8_t proto_error[] = {
	0x00, 0x05, 0xfd,
	0x0f, 0x22, 0x33, 0x44, 0x00,
};

/* MGCP wrap... */
static const uint8_t mgcp_msg[] = {
	0x00, 0x03, 0xfc,
	0x20, 0x20, 0x20,
};

/* location updating request */
static const uint8_t bss_lu[] = {
	0x00, 0x2e, 0xfd,
	0x01, 0x91, 0x45, 0x14, 0x02, 0x02, 0x04, 0x02,
	0x42, 0xfe, 0x0f, 0x21, 0x00, 0x1f, 0x57, 0x05,
	0x08, 0x00, 0x72, 0xf4, 0x80, 0x20, 0x14, 0xc3,
	0x50, 0x17, 0x12, 0x05, 0x08, 0x70, 0x72, 0xf4,
	0x80, 0xff, 0xfe, 0x30, 0x08, 0x29, 0x44, 0x50,
	0x12, 0x03, 0x24, 0x01, 0x95, 0x00
};

/* paging response */
static const uint8_t pag_resp[] = {
	0x00, 0x2c, 0xfd, 0x01, 0xe5, 0x68,
	0x14, 0x02, 0x02, 0x04, 0x02, 0x42, 0xfe, 0x0f,
	0x1f, 0x00, 0x1d, 0x57, 0x05, 0x08, 0x00, 0x72,
	0xf4, 0x80, 0x20, 0x16, 0xc3, 0x50, 0x17, 0x10,
	0x06, 0x27, 0x01, 0x03, 0x30, 0x18, 0x96, 0x08,
	0x29, 0x26, 0x30, 0x32, 0x11, 0x42, 0x01, 0x19,
	0x00
};

struct filter_result {
	const uint8_t *data;
	const uint16_t length;
	const int dir;
	const int result;
};

static const struct filter_result results[] = {
	{
		.data = ipa_id,
		.length = ARRAY_SIZE(ipa_id),
		.dir = DIR_MSC,
		.result = 1,
	},
	{
		.data = gsm_reset,
		.length = ARRAY_SIZE(gsm_reset),
		.dir = DIR_MSC,
		.result = 1,
	},
	{
		.data = gsm_reset_ack,
		.length = ARRAY_SIZE(gsm_reset_ack),
		.dir = DIR_BSC,
		.result = 1,
	},
	{
		.data = gsm_paging,
		.length = ARRAY_SIZE(gsm_paging),
		.dir = DIR_BSC,
		.result = 0,
	},
	{
		.data = bssmap_cr,
		.length = ARRAY_SIZE(bssmap_cr),
		.dir = DIR_MSC,
		.result = 0,
	},
	{
		.data = bssmap_cc,
		.length = ARRAY_SIZE(bssmap_cc),
		.dir = DIR_BSC,
		.result = 0,
	},
	{
		.data = bssmap_released,
		.length = ARRAY_SIZE(bssmap_released),
		.dir = DIR_MSC,
		.result = 0,
	},
	{
		.data = bssmap_release_complete,
		.length = ARRAY_SIZE(bssmap_release_complete),
		.dir = DIR_BSC,
		.result = 0,
	},
	{
		.data = mgcp_msg,
		.length = ARRAY_SIZE(mgcp_msg),
		.dir = DIR_MSC,
		.result = 0,
	},
	{
		.data = connnection_it,
		.length = ARRAY_SIZE(connnection_it),
		.dir = DIR_BSC,
		.result = 0,
	},
	{
		.data = connnection_it,
		.length = ARRAY_SIZE(connnection_it),
		.dir = DIR_MSC,
		.result = 0,
	},
	{
		.data = proto_error,
		.length = ARRAY_SIZE(proto_error),
		.dir = DIR_BSC,
		.result = 0,
	},
	{
		.data = proto_error,
		.length = ARRAY_SIZE(proto_error),
		.dir = DIR_MSC,
		.result = 0,
	},

};

static void test_filter(void)
{
	int i;


	/* start testinh with proper messages */
	printf("Testing BSS Filtering.\n");
	for (i = 0; i < ARRAY_SIZE(results); ++i) {
		int result;
		struct bsc_nat_parsed *parsed;
		struct msgb *msg = msgb_alloc(4096, "test-message");

		printf("Going to test item: %d\n", i);
		memcpy(msg->data, results[i].data, results[i].length);
		msg->l2h = msgb_put(msg, results[i].length);

		parsed = bsc_nat_parse(msg);
		if (!parsed) {
			printf("FAIL: Failed to parse the message\n");
			continue;
		}

		result = bsc_nat_filter_ipa(results[i].dir, msg, parsed);
		if (result != results[i].result) {
			printf("FAIL: Not the expected result got: %d wanted: %d\n",
				result, results[i].result);
		}

		msgb_free(msg);
	}
}

#include "bsc_data.c"

static void copy_to_msg(struct msgb *msg, const uint8_t *data, unsigned int length)
{
	msgb_reset(msg);
	msg->l2h = msgb_put(msg, length);
	memcpy(msg->l2h, data, msgb_l2len(msg));
}

static void verify_msg(struct msgb *out, const uint8_t *ref, int ref_len)
{
	if (out->len != ref_len) {
		printf("FAIL: The size should match: %d vs. %d\n",
			out->len, ref_len);
		printf("%s\n", osmo_hexdump(out->data, out->len));
		printf("Wanted\n");
		printf("%s\n", osmo_hexdump(ref, ref_len));
		abort();
	}

	if (memcmp(out->data, ref, out->len) != 0) {
		printf("FAIL: the data should be changed.\n");
		printf("%s\n", osmo_hexdump(out->data, out->len));
		printf("Wanted\n");
		printf("%s\n", osmo_hexdump(ref, ref_len));
		abort();
	}
}


#define VERIFY(con_found, con, msg, ver, str) \
	if (!con_found) {						\
		printf("Failed to find connection.\n");			\
		abort();						\
	}								\
	if (con_found->bsc != con) {					\
		printf("Got connection of the wrong BSC: %d\n",		\
			con_found->bsc->cfg->nr);			\
		abort();						\
	}								\
	if (memcmp(msg->data, ver, sizeof(ver)) != 0) { \
		printf("Failed to patch the %s msg.\n", str); 		\
		abort(); \
	}

/* test conn tracking once */
static void test_contrack()
{
	struct bsc_nat *nat;
	struct bsc_connection *con;
	struct nat_sccp_connection *con_found;
	struct nat_sccp_connection *rc_con;
	struct bsc_nat_parsed *parsed;
	struct msgb *msg;

	printf("Testing connection tracking.\n");
	nat = bsc_nat_alloc();
	con = bsc_connection_alloc(nat);
	con->cfg = bsc_config_alloc(nat, "foo");
	bsc_config_add_lac(con->cfg, 23);
	bsc_config_add_lac(con->cfg, 49);
	bsc_config_add_lac(con->cfg, 42);
	bsc_config_del_lac(con->cfg, 49);
	bsc_config_add_lac(con->cfg, 1111);
	msg = msgb_alloc(4096, "test");

	/* 1.) create a connection */
	copy_to_msg(msg, bsc_cr, sizeof(bsc_cr));
	parsed = bsc_nat_parse(msg);
	con_found = patch_sccp_src_ref_to_msc(msg, parsed, con);
	if (con_found != NULL) {
		printf("Con should not exist realref(%u)\n",
		       sccp_src_ref_to_int(&con_found->real_ref));
		abort();
	}
	rc_con = create_sccp_src_ref(con, parsed);
	if (!rc_con) {
		printf("Failed to create a ref\n");
		abort();
	}
	con_found = patch_sccp_src_ref_to_msc(msg, parsed, con);
	if (!con_found) {
		printf("Failed to find connection.\n");
		abort();
	}
	if (con_found->bsc != con) {
		printf("Got connection of the wrong BSC: %d\n",
			con_found->bsc->cfg->nr);
		abort();
	}
	if (con_found != rc_con) {
		printf("Failed to find the right connection.\n");
		abort();
	}
	if (memcmp(msg->data, bsc_cr_patched, sizeof(bsc_cr_patched)) != 0) {
		printf("Failed to patch the BSC CR msg.\n");
		abort();
	}
	talloc_free(parsed);

	/* 2.) get the cc */
	copy_to_msg(msg, msc_cc, sizeof(msc_cc));
	parsed = bsc_nat_parse(msg);
	con_found = patch_sccp_src_ref_to_bsc(msg, parsed, nat);
	VERIFY(con_found, con, msg, msc_cc_patched, "MSC CC");
	if (update_sccp_src_ref(con_found, parsed) != 0) {
		printf("Failed to update the SCCP con.\n");
		abort();
	}

	/* 3.) send some data */
	copy_to_msg(msg, bsc_dtap, sizeof(bsc_dtap));
	parsed = bsc_nat_parse(msg);
	con_found = patch_sccp_src_ref_to_msc(msg, parsed, con);
	VERIFY(con_found, con, msg, bsc_dtap_patched, "BSC DTAP");

	/* 4.) receive some data */
	copy_to_msg(msg, msc_dtap, sizeof(msc_dtap));
	parsed = bsc_nat_parse(msg);
	con_found = patch_sccp_src_ref_to_bsc(msg, parsed, nat);
	VERIFY(con_found, con, msg, msc_dtap_patched, "MSC DTAP");

	/* 5.) close the connection */
	copy_to_msg(msg, msc_rlsd, sizeof(msc_rlsd));
	parsed = bsc_nat_parse(msg);
	con_found = patch_sccp_src_ref_to_bsc(msg, parsed, nat);
	VERIFY(con_found, con, msg, msc_rlsd_patched, "MSC RLSD");

	/* 6.) confirm the connection close */
	copy_to_msg(msg, bsc_rlc, sizeof(bsc_rlc));
	parsed = bsc_nat_parse(msg);
	con_found = patch_sccp_src_ref_to_msc(msg, parsed, con);
	if (!con_found) {
		printf("Failed to find connection.\n");
		abort();
	}
	if (con_found->bsc != con) {
		printf("Got connection of the wrong BSC: %d\n",
			con_found->bsc->cfg->nr);
		abort();
	}
	if (memcmp(msg->data, bsc_rlc_patched, sizeof(bsc_rlc_patched)) != 0) {
		printf("Failed to patch the BSC CR msg.\n");
		abort();
	}
	remove_sccp_src_ref(con, msg, parsed);
	talloc_free(parsed);

	copy_to_msg(msg, bsc_rlc, sizeof(bsc_rlc));
	parsed = bsc_nat_parse(msg);
	con_found = patch_sccp_src_ref_to_msc(msg, parsed, con);

	/* verify that it is gone */
	if (con_found != NULL) {
		printf("Con should not exist real_ref(%u)\n",
		       sccp_src_ref_to_int(&con_found->real_ref));
		abort();
	}
	talloc_free(parsed);


	bsc_config_free(con->cfg);
	talloc_free(nat);
	msgb_free(msg);
}

static void test_paging(void)
{
	struct bsc_nat *nat;
	struct bsc_connection *con;
	struct bsc_config *cfg;

	printf("Testing paging by lac.\n");

	nat = bsc_nat_alloc();
	con = bsc_connection_alloc(nat);
	cfg = bsc_config_alloc(nat, "unknown");
	con->cfg = cfg;
	bsc_config_add_lac(cfg, 23);
	con->authenticated = 1;
	llist_add(&con->list_entry, &nat->bsc_connections);

	/* Test it by not finding it */
	if (bsc_config_handles_lac(cfg, 8213) != 0) {
		printf("Should not be handled.\n");
		abort();
	}

	/* Test by finding it */
	bsc_config_del_lac(cfg, 23);
	bsc_config_add_lac(cfg, 8213);
	if (bsc_config_handles_lac(cfg, 8213) == 0) {
		printf("Should have found it.\n");
		abort();
	}
}

static void test_mgcp_allocations(void)
{
#if 0
	struct bsc_connection *bsc;
	struct bsc_nat *nat;
	struct nat_sccp_connection con;
	int i, j, multiplex;

	printf("Testing MGCP.\n");
	memset(&con, 0, sizeof(con));

	nat = bsc_nat_alloc();
	nat->bsc_endpoints = talloc_zero_array(nat,
					       struct bsc_endpoint,
					       65);
	nat->mgcp_cfg = mgcp_config_alloc();
	nat->mgcp_cfg->trunk.number_endpoints = 64;

	bsc = bsc_connection_alloc(nat);
	bsc->cfg = bsc_config_alloc(nat, "foo");
	bsc->cfg->max_endpoints = 60;
	bsc_config_add_lac(bsc->cfg, 2323);
	bsc->last_endpoint = 0x22;
	con.bsc = bsc;

	bsc_init_endps_if_needed(bsc);

	i  = 1;
	do {
		if (bsc_assign_endpoint(bsc, &con) != 0) {
			printf("failed to allocate... on iteration %d\n", i);
			break;
		}
		++i;
	} while(1);

	multiplex = bsc_mgcp_nr_multiplexes(bsc->cfg->max_endpoints);
	for (i = 0; i < multiplex; ++i) {
		for (j = 0; j < 32; ++j)
			printf("%d", bsc->_endpoint_status[i*32 + j]);
		printf(": %d of %d\n", i*32 + 32, 32 * 8);
	}
#endif
}

static void test_mgcp_ass_tracking(void)
{
	struct bsc_connection *bsc;
	struct bsc_nat *nat;
	struct nat_sccp_connection con;
	struct bsc_nat_parsed *parsed;
	struct msgb *msg;

	printf("Testing MGCP.\n");
	memset(&con, 0, sizeof(con));

	nat = bsc_nat_alloc();
	nat->bsc_endpoints = talloc_zero_array(nat,
					       struct bsc_endpoint,
					       33);
	nat->mgcp_cfg = mgcp_config_alloc();
	nat->mgcp_cfg->trunk.number_endpoints = 64;
	mgcp_endpoints_allocate(&nat->mgcp_cfg->trunk);

	bsc = bsc_connection_alloc(nat);
	bsc->cfg = bsc_config_alloc(nat, "foo");
	bsc_config_add_lac(bsc->cfg, 2323);
	bsc->last_endpoint = 0x1e;
	con.bsc = bsc;

	msg = msgb_alloc(4096, "foo");
	copy_to_msg(msg, ass_cmd, sizeof(ass_cmd));
	parsed = bsc_nat_parse(msg);

	if (msg->l2h[16] != 0 ||
	    msg->l2h[17] != 0x1) {
		printf("Input is not as expected.. %s 0x%x\n",
			osmo_hexdump(msg->l2h, msgb_l2len(msg)),
			msg->l2h[17]);
		abort();
	}

	if (bsc_mgcp_assign_patch(&con, msg) != 0) {
		printf("Failed to handle assignment.\n");
		abort();
	}

	if (con.msc_endp != 1) {
		printf("Timeslot should be 1.\n");
		abort();
	}

	if (con.bsc_endp != 0x1) {
		printf("Assigned timeslot should have been 1.\n");
		abort();
	}
	if (con.bsc->_endpoint_status[0x1] != 1) {
		printf("The status on the BSC is wrong.\n");
		abort();
	}

	int multiplex, timeslot;
	mgcp_endpoint_to_timeslot(0x1, &multiplex, &timeslot);

	uint16_t cic = htons(timeslot & 0x1f);
	if (memcmp(&cic, &msg->l2h[16], sizeof(cic)) != 0) {
		printf("Message was not patched properly\n");
		printf("data cic: 0x%x %s\n", cic, osmo_hexdump(msg->l2h, msgb_l2len(msg)));
		abort();
	}

	talloc_free(parsed);

	bsc_mgcp_dlcx(&con);
	if (con.bsc_endp != -1 || con.msc_endp != -1 ||
	    con.bsc->_endpoint_status[1] != 0 || con.bsc->last_endpoint != 0x1) {
		printf("Clearing should remove the mapping.\n");
		abort();
	}

	bsc_config_free(bsc->cfg);
	talloc_free(nat);
}

/* test the code to find a given connection */
static void test_mgcp_find(void)
{
	struct bsc_nat *nat;
	struct bsc_connection *con;
	struct nat_sccp_connection *sccp_con;

	printf("Testing finding of a BSC Connection\n");

	nat = bsc_nat_alloc();
	con = bsc_connection_alloc(nat);
	llist_add(&con->list_entry, &nat->bsc_connections);

	sccp_con = talloc_zero(con, struct nat_sccp_connection);
	sccp_con->msc_endp = 12;
	sccp_con->bsc_endp = 12;
	sccp_con->bsc = con;
	llist_add(&sccp_con->list_entry, &nat->sccp_connections);

	if (bsc_mgcp_find_con(nat, 11) != NULL) {
		printf("Found the wrong connection.\n");
		abort();
	}

	if (bsc_mgcp_find_con(nat, 12) != sccp_con) {
		printf("Didn't find the connection\n");
		abort();
	}

	/* free everything */
	talloc_free(nat);
}

static void test_mgcp_rewrite(void)
{
	int i;
	struct msgb *output;
	printf("Testing rewriting MGCP messages.\n");

	for (i = 0; i < ARRAY_SIZE(mgcp_messages); ++i) {
		const char *orig = mgcp_messages[i].orig;
		const char *patc = mgcp_messages[i].patch;
		const char *ip = mgcp_messages[i].ip;
		const int port = mgcp_messages[i].port;

		char *input = strdup(orig);

		output = bsc_mgcp_rewrite(input, strlen(input), 0x1e, ip, port);
		if (msgb_l2len(output) != strlen(patc)) {
			printf("Wrong sizes for test: %d  %d != %d != %d\n", i, msgb_l2len(output), strlen(patc), strlen(orig));
			printf("String '%s' vs '%s'\n", (const char *) output->l2h, patc);
			abort();
		}

		if (memcmp(output->l2h, patc, msgb_l2len(output)) != 0) {
			printf("Broken on %d msg: '%s'\n", i, (const char *) output->l2h);
			abort();
		}

		msgb_free(output);
		free(input);
	}
}

static void test_mgcp_parse(void)
{
	int code, ci;
	char transaction[60];

	printf("Testing MGCP response parsing.\n");

	if (bsc_mgcp_parse_response(crcx_resp, &code, transaction) != 0) {
		printf("Failed to parse CRCX resp.\n");
		abort();
	}

	if (code != 200) {
		printf("Failed to parse the CODE properly. Got: %d\n", code);
		abort();
	}

	if (strcmp(transaction, "23265295") != 0) {
		printf("Failed to parse transaction id: '%s'\n", transaction);
		abort();
	}

	ci = bsc_mgcp_extract_ci(crcx_resp);
	if (ci != 1) {
		printf("Failed to parse the CI. Got: %d\n", ci);
		abort();
	}
}

struct cr_filter {
	const uint8_t *data;
	int length;
	int result;
	int contype;

	const char *bsc_imsi_allow;
	const char *bsc_imsi_deny;
	const char *nat_imsi_deny;
};

static struct cr_filter cr_filter[] = {
	{
		.data = bssmap_cr,
		.length = sizeof(bssmap_cr),
		.result = 1,
		.contype = NAT_CON_TYPE_CM_SERV_REQ,
	},
	{
		.data = bss_lu,
		.length = sizeof(bss_lu),
		.result = 1,
		.contype = NAT_CON_TYPE_LU,
	},
	{
		.data = pag_resp,
		.length = sizeof(pag_resp),
		.result = 1,
		.contype = NAT_CON_TYPE_PAG_RESP,
	},
	{
		/* nat deny is before blank/null BSC */
		.data = bss_lu,
		.length = sizeof(bss_lu),
		.result = -3,
		.nat_imsi_deny = "[0-9]*",
		.contype = NAT_CON_TYPE_LU,
	},
	{
		/* BSC allow is before NAT deny */
		.data = bss_lu,
		.length = sizeof(bss_lu),
		.result = 1,
		.nat_imsi_deny = "[0-9]*",
		.bsc_imsi_allow = "2440[0-9]*",
		.contype = NAT_CON_TYPE_LU,
	},
	{
		/* BSC allow is before NAT deny */
		.data = bss_lu,
		.length = sizeof(bss_lu),
		.result = 1,
		.bsc_imsi_allow = "[0-9]*",
		.nat_imsi_deny = "[0-9]*",
		.contype = NAT_CON_TYPE_LU,
	},
	{
		/* filter as deny is first */
		.data = bss_lu,
		.length = sizeof(bss_lu),
		.result = 1,
		.bsc_imsi_deny = "[0-9]*",
		.bsc_imsi_allow = "[0-9]*",
		.nat_imsi_deny = "[0-9]*",
		.contype = NAT_CON_TYPE_LU,
	},
	{
		/* deny by nat rule */
		.data = bss_lu,
		.length = sizeof(bss_lu),
		.result = -3,
		.bsc_imsi_deny = "000[0-9]*",
		.nat_imsi_deny = "[0-9]*",
		.contype = NAT_CON_TYPE_LU,
	},
	{
		/* deny by bsc rule */
		.data = bss_lu,
		.length = sizeof(bss_lu),
		.result = -2,
		.bsc_imsi_deny = "[0-9]*",
		.contype = NAT_CON_TYPE_LU,
	},

};

static void test_cr_filter()
{
	int i, res, contype;
	struct msgb *msg = msgb_alloc(4096, "test_cr_filter");
	struct bsc_nat_parsed *parsed;
	struct bsc_nat_acc_lst *nat_lst, *bsc_lst;
	struct bsc_nat_acc_lst_entry *nat_entry, *bsc_entry;
	struct bsc_nat_reject_cause cause;

	struct bsc_nat *nat = bsc_nat_alloc();
	struct bsc_connection *bsc = bsc_connection_alloc(nat);
	bsc->cfg = bsc_config_alloc(nat, "foo");
	bsc_config_add_lac(bsc->cfg, 1234);
	bsc->cfg->acc_lst_name = "bsc";
	nat->acc_lst_name = "nat";

	nat_lst = bsc_nat_acc_lst_get(nat, "nat");
	bsc_lst = bsc_nat_acc_lst_get(nat, "bsc");

	bsc_entry = bsc_nat_acc_lst_entry_create(bsc_lst);
	nat_entry = bsc_nat_acc_lst_entry_create(nat_lst);

	for (i = 0; i < ARRAY_SIZE(cr_filter); ++i) {
		char *imsi;
		msgb_reset(msg);
		copy_to_msg(msg, cr_filter[i].data, cr_filter[i].length);

		if (gsm_parse_reg(nat_entry, &nat_entry->imsi_deny_re, &nat_entry->imsi_deny,
			      cr_filter[i].nat_imsi_deny ? 1 : 0,
			      &cr_filter[i].nat_imsi_deny) != 0)
			abort();
		if (gsm_parse_reg(bsc_entry, &bsc_entry->imsi_allow_re, &bsc_entry->imsi_allow,
			      cr_filter[i].bsc_imsi_allow ? 1 : 0,
			      &cr_filter[i].bsc_imsi_allow) != 0)
			abort();
		if (gsm_parse_reg(bsc_entry, &bsc_entry->imsi_deny_re, &bsc_entry->imsi_deny,
			      cr_filter[i].bsc_imsi_deny ? 1 : 0,
			      &cr_filter[i].bsc_imsi_deny) != 0)
			abort();

		parsed = bsc_nat_parse(msg);
		if (!parsed) {
			printf("FAIL: Failed to parse the message\n");
			abort();
		}

		memset(&cause, 0, sizeof(cause));
		res = bsc_nat_filter_sccp_cr(bsc, msg, parsed, &contype, &imsi, &cause);
		if (res != cr_filter[i].result) {
			printf("FAIL: Wrong result %d for test %d.\n", res, i);
			abort();
		}

		if (contype != cr_filter[i].contype) {
			printf("FAIL: Wrong contype %d for test %d.\n", res, contype);
			abort();
		}

		talloc_steal(parsed, imsi);
		talloc_free(parsed);
	}

	msgb_free(msg);
}

static void test_dt_filter()
{
	int i;
	struct msgb *msg = msgb_alloc(4096, "test_dt_filter");
	struct bsc_nat_parsed *parsed;
	struct bsc_nat_reject_cause cause;

	struct bsc_nat *nat = bsc_nat_alloc();
	struct bsc_connection *bsc = bsc_connection_alloc(nat);
	struct nat_sccp_connection *con = talloc_zero(0, struct nat_sccp_connection);

	bsc->cfg = bsc_config_alloc(nat, "foo");
	bsc_config_add_lac(bsc->cfg, 23);
	con->bsc = bsc;

	msgb_reset(msg);
	copy_to_msg(msg, id_resp, ARRAY_SIZE(id_resp));

	parsed = bsc_nat_parse(msg);
	if (!parsed) {
		printf("FAIL: Could not parse ID resp\n");
		abort();
	}

	if (parsed->bssap != BSSAP_MSG_DTAP) {
		printf("FAIL: It should be dtap\n");
		abort();
	}

	/* gsm_type is actually the size of the dtap */
	if (parsed->gsm_type < msgb_l3len(msg) - 3) {
		printf("FAIL: Not enough space for the content\n");
		abort();
	}

	memset(&cause, 0, sizeof(cause));
	if (bsc_nat_filter_dt(bsc, msg, con, parsed, &cause) != 1) {
		printf("FAIL: Should have passed..\n");
		abort();
	}

	/* just some basic length checking... */
	for (i = ARRAY_SIZE(id_resp); i >= 0; --i) {
		msgb_reset(msg);
		copy_to_msg(msg, id_resp, ARRAY_SIZE(id_resp));

		parsed = bsc_nat_parse(msg);
		if (!parsed)
			continue;

		con->imsi_checked = 0;
		memset(&cause, 0, sizeof(cause));
		bsc_nat_filter_dt(bsc, msg, con, parsed, &cause);
	}
}

static void test_setup_rewrite()
{
	struct msgb *msg = msgb_alloc(4096, "test_dt_filter");
	struct msgb *out;
	struct bsc_nat_parsed *parsed;
	const char *imsi = "27408000001234";

	struct bsc_nat *nat = bsc_nat_alloc();

	/* a fake list */
	struct osmo_config_list entries;
	struct osmo_config_entry entry;

	INIT_LLIST_HEAD(&entries.entry);
	entry.mcc = "274";
	entry.mnc = "08";
	entry.option = "^0([1-9])";
	entry.text = "0049";
	llist_add_tail(&entry.list, &entries.entry);
	bsc_nat_num_rewr_entry_adapt(nat, &nat->num_rewr, &entries);

	/* verify that nothing changed */
	msgb_reset(msg);
	copy_to_msg(msg, cc_setup_international, ARRAY_SIZE(cc_setup_international));
	parsed = bsc_nat_parse(msg);
	if (!parsed) {
		printf("FAIL: Could not parse ID resp\n");
		abort();
	}

	out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);
	if (msg != out) {
		printf("FAIL: The message should not have been changed\n");
		abort();
	}

	verify_msg(out, cc_setup_international, ARRAY_SIZE(cc_setup_international));
	talloc_free(parsed);

	/* verify that something in the message changes */
	msgb_reset(msg);
	copy_to_msg(msg, cc_setup_national, ARRAY_SIZE(cc_setup_national));
	parsed = bsc_nat_parse(msg);
	if (!parsed) {
		printf("FAIL: Could not parse ID resp\n");
		abort();
	}

	out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);
	if (!out) {
		printf("FAIL: A new message should be created.\n");
		abort();
	}

	if (msg == out) {
		printf("FAIL: The message should have changed\n");
		abort();
	}

	verify_msg(out, cc_setup_national_patched, ARRAY_SIZE(cc_setup_national_patched));
	msgb_free(out);

	/* Make sure that a wildcard is matching */
	entry.mnc = "*";
	bsc_nat_num_rewr_entry_adapt(nat, &nat->num_rewr, &entries);
	msg = msgb_alloc(4096, "test_dt_filter");
	copy_to_msg(msg, cc_setup_national, ARRAY_SIZE(cc_setup_national));
	parsed = bsc_nat_parse(msg);
	if (!parsed) {
		printf("FAIL: Could not parse ID resp\n");
		abort();
	}

	out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);
	if (!out) {
		printf("FAIL: A new message should be created.\n");
		abort();
	}

	if (msg == out) {
		printf("FAIL: The message should have changed\n");
		abort();
	}

	verify_msg(out, cc_setup_national_patched, ARRAY_SIZE(cc_setup_national_patched));
	msgb_free(out);

	/* Make sure that a wildcard is matching */
	entry.mnc = "09";
	bsc_nat_num_rewr_entry_adapt(nat, &nat->num_rewr, &entries);
	msg = msgb_alloc(4096, "test_dt_filter");
	copy_to_msg(msg, cc_setup_national, ARRAY_SIZE(cc_setup_national));
	parsed = bsc_nat_parse(msg);
	if (!parsed) {
		printf("FAIL: Could not parse ID resp\n");
		abort();
	}

	out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);
	if (out != msg) {
		printf("FAIL: The message should be unchanged.\n");
		abort();
	}

	verify_msg(out, cc_setup_national, ARRAY_SIZE(cc_setup_national));
	msgb_free(out);

	/* Now see what happens to an international number */
	entry.mnc = "*";
	entry.option = "^\\+[0-9][0-9]([1-9])";
	entry.text = "0036";
	bsc_nat_num_rewr_entry_adapt(nat, &nat->num_rewr, &entries);
	msg = msgb_alloc(4096, "test_dt_filter");
	copy_to_msg(msg, cc_setup_national_patched, ARRAY_SIZE(cc_setup_national_patched));
	parsed = bsc_nat_parse(msg);
	if (!parsed) {
		printf("FAIL: Could not parse ID resp %d\n", __LINE__);
		abort();
	}

	out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);
	if (!out) {
		printf("FAIL: A new message should be created %d.\n", __LINE__);
		abort();
	}

	if (msg == out) {
		printf("FAIL: The message should have changed %d\n", __LINE__);
		abort();
	}

	verify_msg(out, cc_setup_national_patched_patched,
			ARRAY_SIZE(cc_setup_national_patched_patched));
	msgb_free(out);

	/* go from international back to national */
	entry.mnc = "*";
	entry.option = "^\\+([0-9])";
	entry.text = "36";
	bsc_nat_num_rewr_entry_adapt(nat, &nat->num_rewr, &entries);
	msg = msgb_alloc(4096, "test_dt_filter");
	copy_to_msg(msg, cc_setup_national_patched, ARRAY_SIZE(cc_setup_national_patched));
	parsed = bsc_nat_parse(msg);
	if (!parsed) {
		printf("FAIL: Could not parse ID resp %d\n", __LINE__);
		abort();
	}

	out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);
	if (!out) {
		printf("FAIL: A new message should be created %d.\n", __LINE__);
		abort();
	}

	if (msg == out) {
		printf("FAIL: The message should have changed %d\n", __LINE__);
		abort();
	}

	verify_msg(out, cc_setup_national_again,
			ARRAY_SIZE(cc_setup_national_again));
	msgb_free(out);
}

static void test_sms_smsc_rewrite()
{
	struct msgb *msg = msgb_alloc(4096, "SMSC rewrite"), *out;
	struct bsc_nat_parsed *parsed;
	const char *imsi = "515039900406700";

	struct bsc_nat *nat = bsc_nat_alloc();

	/* a fake list */
	struct osmo_config_list smsc_entries, dest_entries, clear_entries;
	struct osmo_config_entry smsc_entry, dest_entry, clear_entry;

	INIT_LLIST_HEAD(&smsc_entries.entry);
	INIT_LLIST_HEAD(&dest_entries.entry);
	INIT_LLIST_HEAD(&clear_entries.entry);
	smsc_entry.mcc = "^515039";
	smsc_entry.option = "639180000105()";
	smsc_entry.text   = "6666666666667";
	llist_add_tail(&smsc_entry.list, &smsc_entries.entry);
	dest_entry.mcc = "515";
	dest_entry.mnc = "03";
	dest_entry.option = "^0049";
	dest_entry.text   = "";
	llist_add_tail(&dest_entry.list, &dest_entries.entry);
	clear_entry.mcc = "^515039";
	clear_entry.option = "^0049";
	clear_entry.text   = "";
	llist_add_tail(&clear_entry.list, &clear_entries.entry);

	bsc_nat_num_rewr_entry_adapt(nat, &nat->smsc_rewr, &smsc_entries);
	bsc_nat_num_rewr_entry_adapt(nat, &nat->tpdest_match, &dest_entries);
	bsc_nat_num_rewr_entry_adapt(nat, &nat->sms_clear_tp_srr, &clear_entries);

	printf("Testing SMSC rewriting.\n");

	/*
	 * Check if the SMSC address is changed
	 */
	copy_to_msg(msg, smsc_rewrite, ARRAY_SIZE(smsc_rewrite));
	parsed = bsc_nat_parse(msg);
	if (!parsed) {
		printf("FAIL: Could not parse SMS\n");
		abort();
	}

	out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);
	if (out == msg) {
		printf("FAIL: This should have changed.\n");
		abort();
	}

	verify_msg(out, smsc_rewrite_patched, ARRAY_SIZE(smsc_rewrite_patched));
	msgb_free(out);

	/* clear out the filter for SMSC */
	printf("Attempting to only rewrite the HDR\n");
	bsc_nat_num_rewr_entry_adapt(nat, &nat->smsc_rewr, NULL);
	msg = msgb_alloc(4096, "SMSC rewrite");
	copy_to_msg(msg, smsc_rewrite, ARRAY_SIZE(smsc_rewrite));
	parsed = bsc_nat_parse(msg);
	if (!parsed) {
		printf("FAIL: Could not parse SMS\n");
		abort();
	}

	out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);
	if (out == msg) {
		printf("FAIL: This should have changed.\n");
		abort();
	}

	verify_msg(out, smsc_rewrite_patched_hdr, ARRAY_SIZE(smsc_rewrite_patched_hdr));
	msgb_free(out);

	/* clear out the next filter */
	printf("Attempting to change nothing.\n");
	bsc_nat_num_rewr_entry_adapt(nat, &nat->sms_clear_tp_srr, NULL);
	msg = msgb_alloc(4096, "SMSC rewrite");
	copy_to_msg(msg, smsc_rewrite, ARRAY_SIZE(smsc_rewrite));
	parsed = bsc_nat_parse(msg);
	if (!parsed) {
		printf("FAIL: Could not parse SMS\n");
		abort();
	}

	out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);
	if (out != msg) {
		printf("FAIL: This should not have changed.\n");
		abort();
	}

	verify_msg(out, smsc_rewrite, ARRAY_SIZE(smsc_rewrite));
	msgb_free(out);
}

static void test_sms_number_rewrite(void)
{
	struct msgb *msg, *out;
	struct bsc_nat_parsed *parsed;
	const char *imsi = "515039900406700";

	struct bsc_nat *nat = bsc_nat_alloc();

	/* a fake list */
	struct osmo_config_list num_entries, clear_entries;
	struct osmo_config_entry num_entry, clear_entry;

	INIT_LLIST_HEAD(&num_entries.entry);
	num_entry.mcc = "^515039";
	num_entry.option = "^0049()";
	num_entry.text   = "0032";
	llist_add_tail(&num_entry.list, &num_entries.entry);

	bsc_nat_num_rewr_entry_adapt(nat, &nat->sms_num_rewr, &num_entries);

	printf("Testing SMS TP-DA rewriting.\n");

	/*
	 * Check if the SMSC address is changed
	 */
 	msg = msgb_alloc(4096, "SMSC rewrite");
	copy_to_msg(msg, smsc_rewrite, ARRAY_SIZE(smsc_rewrite));
	parsed = bsc_nat_parse(msg);
	if (!parsed) {
		printf("FAIL: Could not parse SMS\n");
		abort();
	}

	out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);
	if (out == msg) {
		printf("FAIL: This should have changed.\n");
		abort();
	}

	verify_msg(out, smsc_rewrite_num_patched,
		   ARRAY_SIZE(smsc_rewrite_num_patched));
	msgb_free(out);

	/*
	 * Now with TP-SRR rewriting enabled
	 */
	INIT_LLIST_HEAD(&clear_entries.entry);
	clear_entry.mcc = "^515039";
	clear_entry.option = "";
	clear_entry.text   = "";
	llist_add_tail(&clear_entry.list, &clear_entries.entry);
	bsc_nat_num_rewr_entry_adapt(nat, &nat->sms_clear_tp_srr, &clear_entries);

 	msg = msgb_alloc(4096, "SMSC rewrite");
	copy_to_msg(msg, smsc_rewrite, ARRAY_SIZE(smsc_rewrite));
	parsed = bsc_nat_parse(msg);
	if (!parsed) {
		printf("FAIL: Could not parse SMS\n");
		abort();
	}

	out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);
	if (out == msg) {
		printf("FAIL: This should have changed.\n");
		abort();
	}

	verify_msg(out, smsc_rewrite_num_patched_tp_srr,
		   ARRAY_SIZE(smsc_rewrite_num_patched_tp_srr));
	msgb_free(out);
}

static void test_barr_list_parsing(void)
{
	int rc;
	int cm, lu;
	struct rb_node *node;
	struct rb_root root = RB_ROOT;
	struct osmo_config_list *lst = osmo_config_list_parse(NULL, "barr.cfg");
	if (lst == NULL)
		abort();

	rc = bsc_nat_barr_adapt(NULL, &root, lst);
	if (rc != 0)
		abort();
	talloc_free(lst);


	for (node = rb_first(&root); node; node = rb_next(node)) {
		struct bsc_nat_barr_entry *entry;
		entry = rb_entry(node, struct bsc_nat_barr_entry, node);
		printf("IMSI: %s CM: %d LU: %d\n", entry->imsi,
			entry->cm_reject_cause, entry->lu_reject_cause);
	}

	/* do the look up now.. */
	rc = bsc_nat_barr_find(&root, "12123119", &cm, &lu);
	if (!rc) {
		printf("Failed to find the IMSI.\n");
		abort();
	}

	if (cm != 3 || lu != 4) {
		printf("Found CM(%d) and LU(%d)\n", cm, lu);
		abort();
	}

	/* empty and check that it is empty */
	bsc_nat_barr_adapt(NULL, &root, NULL);
	if (!RB_EMPTY_ROOT(&root)) {
		printf("Failed to empty the list.\n");
		abort();
	}

	/* check that dup results in an error */
	lst = osmo_config_list_parse(NULL, "barr_dup.cfg");
	if (lst == NULL) {
		printf("Failed to parse list with dups\n");
		abort();
	}

	rc = bsc_nat_barr_adapt(NULL, &root, lst);
	if (rc != -1) {
		printf("It should have failed due dup\n");
		abort();
	}
	talloc_free(lst);

	/* dump for reference */
	for (node = rb_first(&root); node; node = rb_next(node)) {
		struct bsc_nat_barr_entry *entry;
		entry = rb_entry(node, struct bsc_nat_barr_entry, node);
		printf("IMSI: %s CM: %d LU: %d\n", entry->imsi,
			entry->cm_reject_cause, entry->lu_reject_cause);

	}
}

static void test_nat_extract_lac()
{
	int res;
	struct bsc_connection *bsc;
	struct bsc_nat *nat;
	struct nat_sccp_connection con;
	struct bsc_nat_parsed *parsed;
	struct msgb *msg = msgb_alloc(4096, "test-message");

	printf("Testing LAC extraction from SCCP CR\n");

	/* initialize the testcase */
	nat = bsc_nat_alloc();
	bsc = bsc_connection_alloc(nat);
	bsc->cfg = bsc_config_alloc(nat, "foo");

	memset(&con, 0, sizeof(con));
	con.bsc = bsc;

	/* create the SCCP CR */
	msg->l2h = msgb_put(msg, ARRAY_SIZE(bssmap_cr));
	memcpy(msg->l2h, bssmap_cr, ARRAY_SIZE(bssmap_cr));

	/* parse it and pass it on */
	parsed = bsc_nat_parse(msg);
	res = bsc_nat_extract_lac(bsc, &con, parsed, msg);
	OSMO_ASSERT(res == 0);

	/* verify the LAC */
	OSMO_ASSERT(con.lac == 8210);
	OSMO_ASSERT(con.ci == 50000);
}

int main(int argc, char **argv)
{
	sccp_set_log_area(DSCCP);
	osmo_init_logging(&log_info);

	test_filter();
	test_contrack();
	test_paging();
	test_mgcp_ass_tracking();
	test_mgcp_find();
	test_mgcp_rewrite();
	test_mgcp_parse();
	test_cr_filter();
	test_dt_filter();
	test_setup_rewrite();
	test_sms_smsc_rewrite();
	test_sms_number_rewrite();
	test_mgcp_allocations();
	test_barr_list_parsing();
	test_nat_extract_lac();

	printf("Testing execution completed.\n");
	return 0;
}

/* stub */
void bsc_nat_send_mgcp_to_msc(struct bsc_nat *nat, struct msgb *msg)
{
	abort();
}
