/* Copied from tbf.cpp
 *
 * Copyright (C) 2012 Ivan Klyuchnikov
 * Copyright (C) 2012 Andreas Eversberg <jolly@eversberg.eu>
 * Copyright (C) 2013 by Holger Hans Peter Freyther
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * 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.
 */


#include <stdio.h>

#include <osmocom/core/msgb.h>

#include "bts.h"
#include "gprs_ms.h"
#include "pcu_utils.h"
#include "llc.h"

void llc_init(struct gprs_llc *llc)
{
	llc_reset(llc);
}

/* reset LLC frame */
void llc_reset(struct gprs_llc *llc)
{
	llc->index = 0;
	llc->length = 0;

	memset(llc->frame, 0x42, sizeof(llc->frame));
}

void llc_reset_frame_space(struct gprs_llc *llc)
{
	llc->index = 0;
}

/* Put an Unconfirmed Information (UI) Dummy command, see GSM 44.064, 6.4.2.2 */
void llc_put_dummy_frame(struct gprs_llc *llc, size_t req_len)
{
	/* The shortest dummy command (the spec requests at least 6 octets) */
	static const uint8_t llc_dummy_command[] = {
		0x43, 0xc0, 0x01, 0x2b, 0x2b, 0x2b
	};
	static const size_t max_dummy_command_len = 79;

	llc_put_frame(llc, llc_dummy_command, sizeof(llc_dummy_command));

	if (req_len > max_dummy_command_len)
		req_len = max_dummy_command_len;

	/* Add further stuffing, if the requested length exceeds the minimum
	 * dummy command length */
	if (llc->length < req_len) {
		memset(&llc->frame[llc->length], 0x2b, req_len - llc->length);
		llc->length = req_len;
	}
}

void llc_put_frame(struct gprs_llc *llc, const uint8_t *data, size_t len)
{
	/* only put frames when we are empty */
	OSMO_ASSERT(llc->index == 0 && llc->length == 0);
	llc_append_frame(llc, data, len);
}

void llc_append_frame(struct gprs_llc *llc, const uint8_t *data, size_t len)
{
	/* TODO: bounds check */
	memcpy(llc->frame + llc->length, data, len);
	llc->length += len;
}

bool llc_is_user_data_frame(const uint8_t *data, size_t len)
{
	if (len < 2)
		return false;

	if ((data[0] & 0x0f) == 1 /* GPRS_SAPI_GMM */)
		return false;

	if ((data[0] & 0xe0) != 0xc0 /* LLC UI */)
		/* It is not an LLC UI frame, see TS 44.064, 6.3 */
		return false;

	return true;
}

void llc_queue_init(struct gprs_llc_queue *q, struct GprsMs *ms)
{
	unsigned int i;

	q->ms = ms;
	q->queue_size = 0;
	q->queue_octets = 0;
	q->avg_queue_delay = 0;
	for (i = 0; i < ARRAY_SIZE(q->pq); i++) {
		INIT_LLIST_HEAD(&q->pq[i].queue);
		gprs_codel_init(&q->pq[i].codel_state);
	}
}

/* interval=0 -> don't use codel in the LLC queue */
void llc_queue_set_codel_interval(struct gprs_llc_queue *q, unsigned int interval)
{
	unsigned int i;
	if (interval == LLC_CODEL_DISABLE) {
		q->use_codel = false;
		return;
	}
	q->use_codel = true;
	for (i = 0; i < ARRAY_SIZE(q->pq); i++)
		gprs_codel_set_interval(&q->pq[i].codel_state, interval);
}

static enum gprs_llc_queue_prio llc_sapi2prio(uint8_t sapi)
{
	switch (sapi) {
	case 1:
		return LLC_QUEUE_PRIO_GMM;
	case 2:
	case 7:
	case 8:
		return LLC_QUEUE_PRIO_TOM_SMS;
	default:
		return LLC_QUEUE_PRIO_OTHER;
	}
}

void llc_queue_enqueue(struct gprs_llc_queue *q, struct msgb *llc_msg, const struct timespec *expire_time)
{
	struct MetaInfo *meta_storage;
	struct gprs_llc_hdr *llc_hdr = (struct gprs_llc_hdr *)msgb_data(llc_msg);
	enum gprs_llc_queue_prio prio;

	osmo_static_assert(sizeof(*meta_storage) <= sizeof(llc_msg->cb), info_does_not_fit);

	prio = llc_sapi2prio(llc_hdr->sapi);

	q->queue_size += 1;
	q->queue_octets += msgb_length(llc_msg);

	meta_storage = (struct MetaInfo *)&llc_msg->cb[0];
	osmo_clock_gettime(CLOCK_MONOTONIC, &meta_storage->recv_time);
	meta_storage->expire_time = *expire_time;

	msgb_enqueue(&q->pq[prio].queue, llc_msg);
}

void llc_queue_clear(struct gprs_llc_queue *q, struct gprs_rlcmac_bts *bts)
{
	struct msgb *msg;
	unsigned int i;

	for (i = 0; i < ARRAY_SIZE(q->pq); i++) {
		while ((msg = msgb_dequeue(&q->pq[i].queue))) {
			if (bts)
				bts_do_rate_ctr_inc(bts, CTR_LLC_FRAME_DROPPED);
			msgb_free(msg);
		}
	}

	q->queue_size = 0;
	q->queue_octets = 0;
}

void llc_queue_move_and_merge(struct gprs_llc_queue *q, struct gprs_llc_queue *o)
{
	struct msgb *msg, *msg1 = NULL, *msg2 = NULL;
	struct llist_head new_queue;
	unsigned int i;
	size_t queue_size = 0;
	size_t queue_octets = 0;
	INIT_LLIST_HEAD(&new_queue);

	for (i = 0; i < ARRAY_SIZE(q->pq); i++) {
		while (1) {
			if (msg1 == NULL)
				msg1 = msgb_dequeue(&q->pq[i].queue);

			if (msg2 == NULL)
				msg2 = msgb_dequeue(&o->pq[i].queue);

			if (msg1 == NULL && msg2 == NULL)
				break;

			if (msg1 == NULL) {
				msg = msg2;
				msg2 = NULL;
			} else if (msg2 == NULL) {
				msg = msg1;
				msg1 = NULL;
			} else {
				const struct MetaInfo *mi1 = (struct MetaInfo *)&msg1->cb[0];
				const struct MetaInfo *mi2 = (struct MetaInfo *)&msg2->cb[0];

				if (timespeccmp(&mi2->recv_time, &mi1->recv_time, >)) {
					msg = msg1;
					msg1 = NULL;
				} else {
					msg = msg2;
					msg2 = NULL;
				}
			}

			msgb_enqueue(&new_queue, msg);
			queue_size += 1;
			queue_octets += msgb_length(msg);
		}

		OSMO_ASSERT(llist_empty(&q->pq[i].queue));
		OSMO_ASSERT(llist_empty(&o->pq[i].queue));
		llist_splice_init(&new_queue, &q->pq[i].queue);
	}

	o->queue_size = 0;
	o->queue_octets = 0;
	q->queue_size = queue_size;
	q->queue_octets = queue_octets;
}

#define ALPHA 0.5f

static struct msgb *llc_queue_pick_msg(struct gprs_llc_queue *q, enum gprs_llc_queue_prio *prio)
{
	struct msgb *msg;
	struct timespec *tv, tv_now, tv_result;
	uint32_t lifetime;
	unsigned int i;
	const struct MetaInfo *meta_storage;

	for (i = 0; i < ARRAY_SIZE(q->pq); i++) {
		if ((msg = msgb_dequeue(&q->pq[i].queue))) {
			*prio = (enum gprs_llc_queue_prio)i;
			break;
		}
	}
	if (!msg)
		return NULL;

	meta_storage = (struct MetaInfo *)&msg->cb[0];

	q->queue_size -= 1;
	q->queue_octets -= msgb_length(msg);

	/* take the second time */
	osmo_clock_gettime(CLOCK_MONOTONIC, &tv_now);
	tv = (struct timespec *)&msg->data[sizeof(*tv)];
	timespecsub(&tv_now, &meta_storage->recv_time, &tv_result);

	lifetime = tv_result.tv_sec*1000 + tv_result.tv_nsec/1000000;
	q->avg_queue_delay = q->avg_queue_delay * ALPHA + lifetime * (1-ALPHA);

	return msg;
}

struct msgb *llc_queue_dequeue(struct gprs_llc_queue *q)
{
	struct msgb *msg;
	struct timespec tv_now, tv_now2;
	uint32_t octets = 0, frames = 0;
	struct gprs_rlcmac_bts *bts = q->ms->bts;
	struct gprs_pcu *pcu = bts->pcu;
	struct timespec hyst_delta = {0, 0};
	const unsigned keep_small_thresh = 60;
	enum gprs_llc_queue_prio prio;

	if (pcu->vty.llc_discard_csec)
		csecs_to_timespec(pcu->vty.llc_discard_csec, &hyst_delta);

	osmo_clock_gettime(CLOCK_MONOTONIC, &tv_now);
	timespecadd(&tv_now, &hyst_delta, &tv_now2);

	while ((msg = llc_queue_pick_msg(q, &prio))) {
		const struct MetaInfo *info = (const struct MetaInfo *)&msg->cb[0];
		const struct timespec *tv_disc = &info->expire_time;
		const struct timespec *tv_recv = &info->recv_time;

		gprs_bssgp_update_queue_delay(tv_recv, &tv_now);

		if (q->use_codel) {
			int bytes = llc_queue_octets(q);
			if (gprs_codel_control(&q->pq[prio].codel_state, tv_recv, &tv_now, bytes))
				goto drop_frame;
		}

		/* Is the age below the low water mark? */
		if (!llc_queue_is_frame_expired(&tv_now2, tv_disc))
			break;

		/* Is the age below the high water mark */
		if (!llc_queue_is_frame_expired(&tv_now, tv_disc)) {
			/* Has the previous message not been dropped? */
			if (frames == 0)
				break;

			/* Hysteresis mode, try to discard LLC messages until
			 * the low water mark has been reached */

			/* Check whether to abort the hysteresis mode */

			/* Is the frame small, perhaps only a TCP ACK? */
			if (msg->len <= keep_small_thresh)
				break;

			/* Is it a GMM message? */
			if (!llc_is_user_data_frame(msg->data, msg->len))
				break;
		}

		bts_do_rate_ctr_inc(bts, CTR_LLC_FRAME_TIMEDOUT);
drop_frame:
		frames++;
		octets += msg->len;
		msgb_free(msg);
		bts_do_rate_ctr_inc(bts, CTR_LLC_FRAME_DROPPED);
		continue;
	}

	if (frames) {
		LOGPMS(q->ms, DTBFDL, LOGL_NOTICE, "Discarding LLC PDU "
			"because lifetime limit reached, "
			"count=%u new_queue_size=%zu\n",
			  frames, llc_queue_size(q));
		if (frames > 0xff)
			frames = 0xff;
		if (octets > 0xffffff)
			octets = 0xffffff;
		if (pcu->bssgp.bctx)
			bssgp_tx_llc_discarded(pcu->bssgp.bctx, ms_tlli(q->ms), frames, octets);
	}

	return msg;
}

void llc_queue_calc_pdu_lifetime(struct gprs_rlcmac_bts *bts, const uint16_t pdu_delay_csec, struct timespec *tv)
{
	uint16_t delay_csec;
	if (bts->pcu->vty.force_llc_lifetime)
		delay_csec = bts->pcu->vty.force_llc_lifetime;
	else
		delay_csec = pdu_delay_csec;

	/* keep timestamp at 0 for infinite delay */
	if (delay_csec == 0xffff) {
		memset(tv, 0, sizeof(*tv));
		return;
	}

	/* calculate timestamp of timeout */
	struct timespec now, csec;
	osmo_clock_gettime(CLOCK_MONOTONIC, &now);
	csecs_to_timespec(delay_csec, &csec);

	timespecadd(&now, &csec, tv);
}

bool llc_queue_is_frame_expired(const struct timespec *tv_now, const struct timespec *tv)
{
	/* Timeout is infinite */
	if (tv->tv_sec == 0 && tv->tv_nsec == 0)
		return false;

	return timespeccmp(tv_now, tv, >);
}
