/*
 * LlcTest.cpp
 *
 * Copyright (C) 2015 by Sysmocom s.f.m.c. GmbH
 *
 * 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/>.
 *
 */

extern "C" {
	#include <osmocom/core/linuxlist.h>
}

#include "gprs_debug.h"
#include "bts.h"

extern "C" {
#include "pcu_vty.h"
#include "gprs_pcu.h"
#include "llc.h"
#include "gprs_ms.h"

#include <osmocom/core/application.h>
#include <osmocom/core/msgb.h>
#include <osmocom/core/talloc.h>
#include <osmocom/core/utils.h>
#include <osmocom/core/timer.h>
#include <osmocom/vty/vty.h>
}


void *tall_pcu_ctx;
int16_t spoof_mnc = 0, spoof_mcc = 0;
bool spoof_mnc_3_digits = false;
static struct timespec *clk_mono_override_time;

static struct gprs_llc_queue *prepare_queue(void)
{
	the_pcu = gprs_pcu_alloc(tall_pcu_ctx);
	the_pcu->vty.llc_codel_interval_msec = LLC_CODEL_DISABLE;
	struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);
	struct GprsMs *ms = bts_alloc_ms(bts, 0, 0);
	return ms_llc_queue(ms);
}

static void enqueue_data(gprs_llc_queue *queue, const uint8_t *data, size_t len,
			 const struct timespec *expire_time)
{
	struct timespec *tv;
	uint8_t *msg_data;
	struct msgb *llc_msg = msgb_alloc(len + sizeof(*tv) * 2,
		"llc_pdu_queue");

	msg_data = (uint8_t *)msgb_put(llc_msg, len);

	memcpy(msg_data, data, len);

	llc_queue_enqueue(queue, llc_msg, expire_time);
}

static void dequeue_and_check(gprs_llc_queue *queue, const uint8_t *exp_data,
	size_t len, const MetaInfo *exp_info)
{
	struct msgb *llc_msg;
	const MetaInfo *info_res;

	llc_msg = llc_queue_dequeue(queue);
	OSMO_ASSERT(llc_msg != NULL);
	info_res = (struct MetaInfo *)&llc_msg->cb[0];

	fprintf(stderr, "dequeued msg, length %u (expected %zu), data %s\n",
		msgb_length(llc_msg), len, msgb_hexdump(llc_msg));

	if (!msgb_eq_data_print(llc_msg, exp_data, len))
		fprintf(stderr, "check failed!\n");

	if (exp_info) {
		OSMO_ASSERT(memcmp(&exp_info->recv_time, &info_res->recv_time, sizeof(info_res->recv_time)) == 0);
		OSMO_ASSERT(memcmp(&exp_info->expire_time, &info_res->expire_time, sizeof(info_res->expire_time)) == 0);
	}
	msgb_free(llc_msg);
}

static void enqueue_data(gprs_llc_queue *queue, const char *message,
			 const struct timespec *expire_time)
{
	enqueue_data(queue, (uint8_t *)(message), strlen(message), expire_time);
}

static void dequeue_and_check(gprs_llc_queue *queue, const char *exp_message,
	const MetaInfo *exp_info = 0)
{
	dequeue_and_check(queue,
		(uint8_t *)(exp_message), strlen(exp_message), exp_info);
}

static void test_llc_queue()
{
	gprs_llc_queue *queue = prepare_queue();
	struct timespec expire_time = {0};

	printf("=== start %s ===\n", __func__);

	OSMO_ASSERT(llc_queue_size(queue) == 0);
	OSMO_ASSERT(llc_queue_octets(queue) == 0);

	enqueue_data(queue, "LLC message", &expire_time);
	OSMO_ASSERT(llc_queue_size(queue) == 1);
	OSMO_ASSERT(llc_queue_octets(queue) == 11);

	enqueue_data(queue, "other LLC message", &expire_time);
	OSMO_ASSERT(llc_queue_size(queue) == 2);
	OSMO_ASSERT(llc_queue_octets(queue) == 28);

	dequeue_and_check(queue, "LLC message");
	OSMO_ASSERT(llc_queue_size(queue) == 1);
	OSMO_ASSERT(llc_queue_octets(queue) == 17);

	dequeue_and_check(queue, "other LLC message");
	OSMO_ASSERT(llc_queue_size(queue) == 0);
	OSMO_ASSERT(llc_queue_octets(queue) == 0);

	enqueue_data(queue, "LLC",  &expire_time);
	OSMO_ASSERT(llc_queue_size(queue) == 1);
	OSMO_ASSERT(llc_queue_octets(queue) == 3);

	llc_queue_clear(queue, NULL);
	OSMO_ASSERT(llc_queue_size(queue) == 0);
	OSMO_ASSERT(llc_queue_octets(queue) == 0);

	printf("=== end %s ===\n", __func__);
	TALLOC_FREE(the_pcu);
}

static void test_llc_meta()
{
	gprs_llc_queue *queue = prepare_queue();
	MetaInfo info1 = {0};
	MetaInfo info2 = {0};

	printf("=== start %s ===\n", __func__);

	OSMO_ASSERT(llc_queue_size(queue) == 0);
	OSMO_ASSERT(llc_queue_octets(queue) == 0);

	info1.recv_time.tv_sec = 123456777;
	info1.recv_time.tv_nsec = 123456000;
	info1.expire_time.tv_sec = 123456789;
	info1.expire_time.tv_nsec = 987654000;
	*clk_mono_override_time = info1.recv_time;
	enqueue_data(queue, "LLC message 1", &info1.expire_time);

	info2.recv_time.tv_sec = 123458000;
	info2.recv_time.tv_nsec = 547352000;
	info2.expire_time.tv_sec = 123458006;
	info2.expire_time.tv_nsec = 867252000;
	*clk_mono_override_time = info2.recv_time;
	enqueue_data(queue, "LLC message 2", &info2.expire_time);

	clk_mono_override_time->tv_sec = info1.expire_time.tv_sec - 1;
	clk_mono_override_time->tv_nsec = info1.expire_time.tv_nsec;

	dequeue_and_check(queue, "LLC message 1", &info1);
	dequeue_and_check(queue, "LLC message 2", &info2);

	llc_queue_clear(queue, NULL);
	OSMO_ASSERT(llc_queue_size(queue) == 0);
	OSMO_ASSERT(llc_queue_octets(queue) == 0);

	printf("=== end %s ===\n", __func__);
	TALLOC_FREE(the_pcu);
}

/* Test PDU lifetime is taken into account and packet is dropped if dequeued too
 * late */
static void test_llc_meta_pdu_life_expire()
{
	gprs_llc_queue *queue = prepare_queue();
	MetaInfo info1 = {0};
	MetaInfo info2 = {0};

	printf("=== start %s ===\n", __func__);

	OSMO_ASSERT(llc_queue_size(queue) == 0);
	OSMO_ASSERT(llc_queue_octets(queue) == 0);

	info1.recv_time.tv_sec = 123456777;
	info1.recv_time.tv_nsec = 123456000;
	info1.expire_time.tv_sec = 123456789;
	info1.expire_time.tv_nsec = 987654000;
	*clk_mono_override_time = info1.recv_time;
	enqueue_data(queue, "LLC message 1", &info1.expire_time);

	info2.recv_time.tv_sec = 123458000;
	info2.recv_time.tv_nsec = 547352000;
	info2.expire_time.tv_sec = 123458006;
	info2.expire_time.tv_nsec = 867252000;
	*clk_mono_override_time = info2.recv_time;
	enqueue_data(queue, "LLC message 2", &info2.expire_time);

	clk_mono_override_time->tv_sec = info1.expire_time.tv_sec + 1;
	clk_mono_override_time->tv_nsec = info1.expire_time.tv_nsec;

	dequeue_and_check(queue, "LLC message 2", &info2);

	OSMO_ASSERT(llc_queue_size(queue) == 0);
	OSMO_ASSERT(llc_queue_octets(queue) == 0);
	llc_queue_clear(queue, NULL);

	printf("=== end %s ===\n", __func__);
	TALLOC_FREE(the_pcu);
}

/* Test codel entering in action */
static void test_llc_codel()
{
	clk_mono_override_time->tv_sec = 1000;
	clk_mono_override_time->tv_nsec = 0;

	the_pcu = gprs_pcu_alloc(tall_pcu_ctx);
	the_pcu->vty.llc_codel_interval_msec = LLC_CODEL_USE_DEFAULT;
	/* DEFAULT should be resolved to GPRS_CODEL_SLOW_INTERVAL_MS 4000 */
	#define GPRS_CODEL_SLOW_INTERVAL_MS 4000
	struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);
	struct GprsMs *ms = bts_alloc_ms(bts, 0, 0);
	gprs_llc_queue *queue = ms_llc_queue(ms);
	unsigned int i;

	for (i = 0; i < ARRAY_SIZE(queue->pq); i++) {
		gprs_codel_set_maxpacket(&queue->pq[i].codel_state, 8);
	}

	MetaInfo info1 = {0};

	printf("=== start %s ===\n", __func__);

	for (i = 0; i < 10; i++) {
		char buf[256];

		snprintf(buf, sizeof(buf), "LLC message %u", i);
		info1.recv_time.tv_sec = clk_mono_override_time->tv_sec;
		info1.recv_time.tv_nsec = clk_mono_override_time->tv_nsec;
		info1.expire_time.tv_sec = clk_mono_override_time->tv_sec + 500;
		info1.expire_time.tv_nsec = clk_mono_override_time->tv_nsec;
		clk_mono_override_time->tv_sec += 1;
		enqueue_data(queue, buf, &info1.expire_time);
	}

	OSMO_ASSERT(llc_queue_size(queue) == 10);
	OSMO_ASSERT(llc_queue_octets(queue) != 0);

	dequeue_and_check(queue, "LLC message 0", NULL);
	OSMO_ASSERT(queue->pq[LLC_QUEUE_PRIO_OTHER].codel_state.first_above_time.tv_sec ==
				clk_mono_override_time->tv_sec + GPRS_CODEL_SLOW_INTERVAL_MS/1000);
	dequeue_and_check(queue, "LLC message 1", NULL);
	clk_mono_override_time->tv_sec += 7;
	dequeue_and_check(queue, "LLC message 2", NULL); /*recently == 0*/
	OSMO_ASSERT(queue->pq[LLC_QUEUE_PRIO_OTHER].codel_state.dropping == 0);
	OSMO_ASSERT(queue->pq[LLC_QUEUE_PRIO_OTHER].codel_state.count == 0);
	clk_mono_override_time->tv_sec += GPRS_CODEL_SLOW_INTERVAL_MS/1000 + 1;
	dequeue_and_check(queue, "LLC message 4", NULL); /* recently = 1, message 3 is dropped here */
	OSMO_ASSERT(queue->pq[LLC_QUEUE_PRIO_OTHER].codel_state.dropping == 1);
	OSMO_ASSERT(queue->pq[LLC_QUEUE_PRIO_OTHER].codel_state.count == 1);
	dequeue_and_check(queue, "LLC message 5", NULL);
	OSMO_ASSERT(queue->pq[LLC_QUEUE_PRIO_OTHER].codel_state.dropping == 1);
	OSMO_ASSERT(queue->pq[LLC_QUEUE_PRIO_OTHER].codel_state.count == 1);
	dequeue_and_check(queue, "LLC message 6", NULL);
	OSMO_ASSERT(queue->pq[LLC_QUEUE_PRIO_OTHER].codel_state.dropping == 1);
	dequeue_and_check(queue, "LLC message 7", NULL);
	OSMO_ASSERT(queue->pq[LLC_QUEUE_PRIO_OTHER].codel_state.dropping == 1);
	dequeue_and_check(queue, "LLC message 8", NULL);
	OSMO_ASSERT(queue->pq[LLC_QUEUE_PRIO_OTHER].codel_state.dropping == 1);
	dequeue_and_check(queue, "LLC message 9", NULL);
	OSMO_ASSERT(queue->pq[LLC_QUEUE_PRIO_OTHER].codel_state.dropping == 0);

	OSMO_ASSERT(llc_queue_size(queue) == 0);
	OSMO_ASSERT(llc_queue_octets(queue) == 0);
	llc_queue_clear(queue, NULL);

	printf("=== end %s ===\n", __func__);
	TALLOC_FREE(the_pcu);
}

static void test_llc_merge()
{
	gprs_llc_queue *queue1 = prepare_queue();
	struct GprsMs *ms = bts_alloc_ms(queue1->ms->bts, 0, 0);
	gprs_llc_queue *queue2 = ms_llc_queue(ms);
	struct timespec expire_time = {0};

	printf("=== start %s ===\n", __func__);

	clk_mono_override_time->tv_sec += 1;
	enqueue_data(queue1, "*A*", &expire_time);

	clk_mono_override_time->tv_sec += 1;
	enqueue_data(queue1, "*B*", &expire_time);

	clk_mono_override_time->tv_sec += 1;
	enqueue_data(queue2, "*C*", &expire_time);

	clk_mono_override_time->tv_sec += 1;
	enqueue_data(queue1, "*D*", &expire_time);

	clk_mono_override_time->tv_sec += 1;
	enqueue_data(queue2, "*E*", &expire_time);

	OSMO_ASSERT(llc_queue_size(queue1) == 3);
	OSMO_ASSERT(llc_queue_octets(queue1) == 9);
	OSMO_ASSERT(llc_queue_size(queue2) == 2);
	OSMO_ASSERT(llc_queue_octets(queue2) == 6);

	llc_queue_move_and_merge(queue2, queue1);

	OSMO_ASSERT(llc_queue_size(queue1) == 0);
	OSMO_ASSERT(llc_queue_octets(queue1) == 0);
	OSMO_ASSERT(llc_queue_size(queue2) == 5);
	OSMO_ASSERT(llc_queue_octets(queue2) == 15);

	dequeue_and_check(queue2, "*A*");
	dequeue_and_check(queue2, "*B*");
	dequeue_and_check(queue2, "*C*");
	dequeue_and_check(queue2, "*D*");
	dequeue_and_check(queue2, "*E*");

	OSMO_ASSERT(llc_queue_size(queue2) == 0);
	OSMO_ASSERT(llc_queue_octets(queue2) == 0);

	printf("=== end %s ===\n", __func__);
	TALLOC_FREE(the_pcu);
}

int main(int argc, char **argv)
{
	struct vty_app_info pcu_vty_info = {0};

	tall_pcu_ctx = talloc_named_const(NULL, 1, "LlcTest context");
	if (!tall_pcu_ctx)
		abort();

	msgb_talloc_ctx_init(tall_pcu_ctx, 0);
	osmo_init_logging2(tall_pcu_ctx, &gprs_log_info);
	log_set_use_color(osmo_stderr_target, 0);
	log_set_print_filename2(osmo_stderr_target, LOG_FILENAME_NONE);
	log_set_log_level(osmo_stderr_target, LOGL_INFO);
	log_parse_category_mask(osmo_stderr_target, "DPCU,3:DLGLOBAL,1:");

	vty_init(&pcu_vty_info);
	pcu_vty_init();

	osmo_clock_override_enable(CLOCK_MONOTONIC, true);
	clk_mono_override_time = osmo_clock_override_gettimespec(CLOCK_MONOTONIC);
	clk_mono_override_time->tv_sec = 123456777;
	clk_mono_override_time->tv_nsec = 123456000;

	test_llc_queue();
	test_llc_meta();
	test_llc_meta_pdu_life_expire();
	test_llc_codel();
	test_llc_merge();

	if (getenv("TALLOC_REPORT_FULL"))
		talloc_report_full(tall_pcu_ctx, stderr);

	return EXIT_SUCCESS;
}

extern "C" {
void l1if_pdch_req() { abort(); }
void l1if_connect_pdch() { abort(); }
void l1if_close_pdch() { abort(); }
void l1if_open_pdch() { abort(); }
}
