module PCU_Tests {

/* Osmocom PCU test suite in TTCN-3
 * (C) 2018-2019 Harald Welte <laforge@gnumonks.org>
 * All rights reserved.
 *
 * Released under the terms of GNU General Public License, Version 2 or
 * (at your option) any later version.
 *
 * SPDX-License-Identifier: GPL-2.0-or-later
 */

import from General_Types all;
import from Osmocom_Types all;
import from GSM_Types all;
import from GSM_RR_Types all;
import from Osmocom_Gb_Types all;
import from BSSGP_Types all;
import from BSSGP_Emulation all;
import from NS_Types all;
import from NS_Emulation all;
import from LLC_Types all;
import from LLC_Templates all;
import from RLCMAC_Types all;
import from RLCMAC_CSN1_Types all;
import from LAPDm_RAW_PT all;
import from GPRS_Context all;
import from GPRS_TBF all;
import from L1CTL_PortType all;
import from MobileL3_Types all;
import from MobileL3_CommonIE_Types all;
import from L3_Templates all;

modulepar {
	BssgpConfig mp_gb_cfg := {
		nsei := 1234,
		bvci := 1234,
		cell_id := {
			ra_id := {
				lai := {
					mcc_mnc := '262F42'H, lac := 13135
				},
				rac := 0
			},
			cell_id := 20960
		},
		sgsn_role := true
	};

	NSConfiguration mp_nsconfig := {
		local_udp_port := 23000,
		local_ip := "127.0.0.1",
		remote_udp_port := 21000,
		remote_ip := "127.0.0.1",
		nsvci := 0,
		nsei := 2342,
		role_sgsn := true,
		handle_sns := true
	};
}

type component dummy_CT extends BSSGP_Client_CT {
	var lapdm_CT lapdm_component;
	port LAPDm_PT L1;

	var NS_CT ns_component;
	var BSSGP_CT bssgp_component;

	var MmContext g_mmctx := {
		tlli := 'FFFFFFFF'O,
		n_u := 0
	};

	var boolean g_initialized := false;
}

function f_init() runs on dummy_CT {
	if (g_initialized == true) {
		return;
	}
	g_initialized := true;
	/* create a new NS component */
	ns_component := NS_CT.create;
	bssgp_component := BSSGP_CT.create;
	/* connect our BSSGP port to the BSSGP Emulation */
	connect(self:BSSGP[0], bssgp_component:BSSGP_SP);
	connect(self:BSSGP_SIG[0], bssgp_component:BSSGP_SP_SIG);
	connect(self:BSSGP_PROC[0], bssgp_component:BSSGP_PROC);
	/* connect lower-end of BSSGP with BSSGP_CODEC_PORT (maps to NS_PT*/
	connect(bssgp_component:BSCP, ns_component:NS_SP);
	/* connect lower-end of NS emulation to NS_CODEC_PORT (on top of IPl4) */
	map(ns_component:NSCP, system:NS_CODEC_PORT);
	ns_component.start(NSStart(mp_nsconfig));
	bssgp_component.start(BssgpStart(mp_gb_cfg));

	lapdm_component := lapdm_CT.create;
	connect(self:L1, lapdm_component:LAPDM_SP);
	map(lapdm_component:L1CTL, system:L1CTL);
	lapdm_component.start(LAPDmStart());

	f_bssgp_client_register(g_mmctx.imsi, g_mmctx.tlli, mp_gb_cfg.cell_id);
	f_bssgp_establish();
}

function f_exit() runs on dummy_CT {
	lapdm_component.stop;
	ns_component.stop;
	bssgp_component.stop;
}

function f_bssgp_dec_and_log(in octetstring inp) {
	log("BSSGP Input: ", inp);
	var PDU_BSSGP dec := dec_PDU_BSSGP(inp);
	log("BSSGP Decoded: ", dec);
}

testcase TC_selftest_bssgp() runs on dummy_CT {
	const octetstring c_bvc_reset_pcu := '2204820000078108088832f44000c80051e0'O;
	const octetstring c_bvc_reset_q := '2204820000078100'O;
	const octetstring c_status_pcu := '4107810515882204820000078103'O;
	const octetstring c_reset_ack_q := '2304820000'O;
	const octetstring c_reset_ack_pcu := '23048200c4'O;
	const octetstring c_unblock_pcu := '24048200c4'O;
	const octetstring c_unblock_ack_q := '25048200c4'O;
	const octetstring c_fc_bvc_pcu := '261e8101058200fa038200c8018200fa1c8200c806820000'O;
	const octetstring c_fc_bvc_ack_q := '271e8101'O;
	const octetstring c_gmm_mo_att_req := '01bb146ddd000004088832f44000c80051e000800e003b01c001080103e5e000110a0005f4fb146ddd32f44000c8001d1b53432b37159ef9090070000dd9c6321200e00019b32c642401c0002017057bf0ec'O;
	const octetstring c_gmm_mt_ac_req := '00bb146ddd0050001682ffff0a8204030e9c41c001081200102198c72477ea104895e8b959acc58b108182f4d045'O;
	const octetstring c_gmm_mo_ac_resp := '01bb146ddd000004088832f44000c80051e000800e000e01c00508130122fa361f5fdd623d'O;
	const octetstring c_gmm_mt_att_acc := '00bb146ddd0050001682ffff0a8204030e9841c005080201340432f44000c8001805f4fb146ddd0967d0'O;
	const octetstring c_gmm_mt_det_req := '00bb146ddd0050001682ffff0a8204030e8941c00908050215f0b6'O;
	const octetstring c_gmm_mo_att_cpl := '01fb146ddd000004088832f44000c80051e000800e000801c009080339d7bc'O;

	f_bssgp_dec_and_log(c_bvc_reset_pcu);
	f_bssgp_dec_and_log(c_bvc_reset_q);
	f_bssgp_dec_and_log(c_status_pcu);
	f_bssgp_dec_and_log(c_reset_ack_q);
	f_bssgp_dec_and_log(c_reset_ack_pcu);
	f_bssgp_dec_and_log(c_unblock_pcu);
	f_bssgp_dec_and_log(c_unblock_ack_q);
	f_bssgp_dec_and_log(c_fc_bvc_pcu);
	f_bssgp_dec_and_log(c_fc_bvc_ack_q);
	f_bssgp_dec_and_log(c_gmm_mo_att_req);
	f_bssgp_dec_and_log(c_gmm_mt_ac_req);
	f_bssgp_dec_and_log(c_gmm_mo_ac_resp);
	f_bssgp_dec_and_log(c_gmm_mt_att_acc);
	f_bssgp_dec_and_log(c_gmm_mt_det_req);
	f_bssgp_dec_and_log(c_gmm_mo_att_cpl);

	log(ts_BSSGP_PS_PAGING_IMSI(196, '262420123456789'H));
}

function f_ns_assert_prepr(in octetstring a, in octetstring b) {
	log("NS Input: ", a);
	log("NS Expected: ", b);

	if (a != b) {
		setverdict(fail, "Values mismatch", a, b);
		mtc.stop;
	} else {
		setverdict(pass);
	}
}

function f_ns_dec_and_log(in octetstring inp) {
	log("NS Input: ", inp);
	var PDU_NS dec := dec_PDU_NS(inp);
	log("NS Decoded: ", dec);
}

testcase TC_selftest_ns() runs on dummy_CT {
	const octetstring c_ns_reset_pcu := '000000c4271e813d'O;

	/* single byte length to two byte length */
	f_ns_assert_prepr('04058101'O, '0405000101'O);
	f_ns_assert_prepr('040589000102030405060708'O, '04050009000102030405060708'O);
	/* two byte length to two byte length */
	f_ns_assert_prepr('0405000101'O, '0405000101'O);
	/* special case: NS-UNITDATA */
	f_ns_assert_prepr('00aabbccddeeffaa29822342'O, '00aabbccddeeffaa2900022342'O);
	/* multiple TLVs */
	f_ns_assert_prepr('234281aa4382bbbb'O, '23420001aa430002bbbb'O);
	/* zero-length */
	f_ns_assert_prepr('230080'O, '23000000'O);

	f_ns_dec_and_log(c_ns_reset_pcu);
}

const octetstring gmm_auth_req := '081200102198c72477ea104895e8b959acc58b108182'O;

/* Wrap downlink GMM into LLC, encode + send it via BSSGP to PCU */
function tx_gmm(BIT1 c_r, in octetstring gmm_pdu, BIT4 sapi := c_LLC_SAPI_LLGMM) runs on dummy_CT {
	var PDU_LLC llc;

	//log("GMM Tx: ", dec_PDU_L3_SGSN_MS(gmm_pdu));

	log(c_r, g_mmctx.n_u, gmm_pdu, sapi);
	llc := valueof(ts_LLC_UI(gmm_pdu, sapi, c_r, g_mmctx.n_u));
	log(llc);
	g_mmctx.n_u := g_mmctx.n_u + 1;

	log(ts_BSSGP_DL_UD(g_mmctx.tlli, enc_PDU_LLC(llc)));

	BSSGP[0].send(ts_BSSGP_DL_UD(g_mmctx.tlli, enc_PDU_LLC(llc)));
}

/* Establish BSSGP connection to PCU */
function f_bssgp_establish() runs on BSSGP_Client_CT {
	timer T:= 10.0;

	T.start
	alt {
	[] BSSGP[0].receive(t_BssgpStsInd(?, ?, BVC_S_UNBLOCKED)) { }
	[] BSSGP[0].receive { repeat; }
	[] T.timeout {
		setverdict(fail, "Timeout establishing BSSGP connection");
		mtc.stop;
		}
	}
	T.stop
	log("BSSGP successfully initialized");
}

function f_wait_paging_req_type1(hexstring expected_tmsi) runs on dummy_CT {
	var LAPDm_ph_data ph_data;
	timer T := 5.0;

	T.start;
	alt {
	[] L1.receive(LAPDm_ph_data:{sacch:=?,sapi:=0,lapdm:={bbis:=?}}) -> value ph_data {
		var octetstring payload := substr(ph_data.lapdm.bbis.payload, 1, lengthof(ph_data.lapdm.bbis.payload) - 1);
		var PDU_ML3_NW_MS pdu;

		if (dec_PDU_ML3_NW_MS_backtrack(payload, pdu) != 0) {
			repeat;
		}

		if (not ischosen(pdu.msgs.rrm)) {
			repeat;
		}

		if (match(pdu, tr_PAGING_REQ1(tr_PAGING_REQ1_MI1_TMSI(hex2oct(expected_tmsi))))) {
			setverdict(pass);
		} else {
			repeat;
		}
	}
	[] L1.receive { repeat; }
	[] T.timeout { setverdict(fail); }
	}
}

/* Send PS-PAGING via BSSGP to PCU, expect it to show up on L1/Um */
testcase TC_paging() runs on dummy_CT {
	var hexstring tmsi_hex := '01234567'H;
	var GsmTmsi tmsi := hex2int(tmsi_hex);

	g_mmctx.imsi := '262420123456789'H;
	g_mmctx.tlli := f_random_tlli();
	f_init();

	var BCCH_tune_req tune_req := { { false, 871 }, true };
	L1.send(tune_req);
	/* FIXME: wait for confirm */

	/* Send paging on signalling BVCI 0 since osmo-pcu does not support paging on PTP yet. */
	/*
	TODO: Paging by IMSI does not work yet because osmo-pcu does not copy IMSI into paging requests.
	BSSGP_SIG[0].send(ts_BSSGP_PS_PAGING_IMSI(0, g_mmctx.imsi));
	f_wait_paging_req_type1(hex2oct(g_mmctx.imsi));
	*/

	/* Page by TMSI */
	BSSGP_SIG[0].send(ts_BSSGP_PS_PAGING_PTMSI(0, g_mmctx.imsi, tmsi));
	f_wait_paging_req_type1(tmsi_hex);
}

/* Establish an UL TBF: Tune to ARFCN, send RACH, receive AGCH, enable TBF Rx */
function f_establish_ul_tbf() runs on dummy_CT {
	timer T := 5.0;
	var BCCH_tune_req tune_req := { { false, 871 }, true };
	L1.send(tune_req);
	/* FIXME: wait for confirm */

	var TBF_UL_establish_req est_req := { tbf_nr := 0, ra := hex2int('7B'H) };
	L1.send(est_req);
	T.start;
	/* FIXME: wait for confirm */
	alt {
	[] L1.receive(TBF_UL_establish_res:?) {}
	[] L1.receive { repeat; }
	[] T.timeout {
		setverdict(fail, "Timeout establishing UL TBF");
		mtc.stop;
		}
	}
	T.stop;
}

/* compute a random TLLI; FIXME: what about TLLI prefix / local/foreign/...? */
function f_random_tlli() return GprsTlli {
	var GprsTlli tlli := f_rnd_octstring(4);
	return tlli;
}

/* Compute the frame number of the uplink block based on current fn + rrbp */
function f_rrbp_fn(GsmFrameNumber fn, MacRrbp rrbp) return GsmFrameNumber {
	var integer add;
	select (rrbp) {
	case (RRBP_Nplus13_mod_2715648) {
		add := 13;
		}
	case (RRBP_Nplus17_or_18_mod_2715648) {
		add := 17; /* FIXME: What about 'or 18'? */
		}
	case (RRBP_Nplus21_or_22_mod_2715648) {
		add := 21; /* FIXME: What about 'or 22'? */
		}
	case (RRBP_Nplus26_mod_2715648) {
		add := 26;
		}
	}
	return (fn + add) mod 2715648;
}


function f_bssgp_wait_ul_ud(template BssgpDecoded bd_exp) runs on dummy_CT {
	timer T := 5.0;
	T.start;
	alt {
	[] BSSGP[0].receive(bd_exp) {
		log("found matching BSSGP UL-UNITDATA PDU");
		}
	[] T.timeout {
		setverdict(fail, "Timeout waiting for ", bd_exp);
		mtc.stop;
		}
	}
}


function f_ul_tbf(inout UlTbfState us) runs on dummy_CT {
	var RLCMAC_ph_data_ind dl;

	/* Establish an UL-TBF */
	f_establish_ul_tbf();

	while (true) {
		var RlcmacUlBlock blk;
		if (f_ul_tbf_get_next_block(blk, us, g_mmctx, true) == false) {
			break;
		}

		/* Send the block to L1 for transmission */
		log("L1=", blk);
		L1.send(RLCMAC_ph_data_req:{dyn:={tbf_id := 0, cs := us.tbf.initial_cs, block := blk}});
	}

	alt {
	[] L1.receive(RLCMAC_ph_data_ind:{cs:=?, ts_nr:=?, fn:=?, block:=tr_RLCMAC_ACK_NACK(0, g_mmctx.tlli)}) -> value dl {
		log("found matching ACK/NACK");
		/* send CTRL ACK in uplink */
		var GsmFrameNumber ul_fn := f_rrbp_fn(dl.fn, dl.block.ctrl.mac_hdr.rrbp);
		var RlcmacUlCtrlMsg ctrl_ack := valueof(ts_RlcMacUlCtrl_PKT_CTRL_ACK(g_mmctx.tlli));
		var RlcmacUlBlock ul_block := valueof(ts_RLC_UL_CTRL_ACK(ctrl_ack));
		L1.send(ts_PH_DATA_ABS(0, CS1, dl.ts_nr, ul_fn, {false, 871}, ul_block));
		/* wait for the final ACK */
		if (dl.block.ctrl.payload.u.ul_ack_nack.gprs.ack_nack_desc.final_ack == '0'B) {
			repeat;
		}
		}
	[] L1.receive { repeat; }
	}

	for (var integer i := 0; i < sizeof(us.tbf.llc_pdus_enc); i := i+1) {
		f_bssgp_wait_ul_ud(tr_BD_BSSGP(tr_BSSGP_UL_UD(g_mmctx.tlli, ?, us.tbf.llc_pdus_enc[i])));
	}
	setverdict(pass);

	L1.send(DCCH_release_req:{});
}

testcase TC_rach() runs on dummy_CT {
	var BssgpBvci bvci := 196;
	g_mmctx.imsi := '262420123456789'H;
	g_mmctx.tlli := f_random_tlli();

	f_init();

	f_bssgp_client_register(g_mmctx.imsi, g_mmctx.tlli, mp_gb_cfg.cell_id);

	f_bssgp_establish();
}


testcase TC_nsem() runs on dummy_CT {

	f_init();
	f_bssgp_establish();

	while (true) {
		var BssgpDecoded bd;
		alt {
			[] BSSGP[0].receive(tr_BD_BSSGP(?)) -> value bd {
				log("BSSGP Rx: ", bd);
				//log("GMM Rx: ", dec_PDU_L3_MS_SGSN(pdu.payload));
				g_mmctx.tlli := bd.bssgp.pDU_BSSGP_UL_UNITDATA.tLLI;
				tx_gmm(LLC_CR_DL_CMD, gmm_auth_req);
			}
			[] BSSGP[0].receive(t_BssgpStsInd(?, ?, BVC_S_UNBLOCKED)) { repeat; }
			[] BSSGP[0].receive { repeat; }
		}
	}
}


function f_llc_dec_and_log(in octetstring inp) {
	log("LLC Input: ", inp);
	var PDU_LLC dec := dec_PDU_LLC(inp);
	log("LLC Decoded: ", dec);
}

function f_llc_assert(in octetstring a, in octetstring b) {
	log("LLC Input: ", a);
	log("LLC Expected: ", b);

	if (a != b) {
		setverdict(fail, "LLC input ", b, " != expected ", a);
		mtc.stop;
	} else {
		setverdict(pass);
	}
}


testcase TC_selftest_llc() runs on dummy_CT {
	const octetstring c_gmm_att_pcu := '01c001080103e5e000210a0005f4fb146ddd32f44000c8001d1b53432b37159ef9090070000dd9c6321200e00019b32c642401c00020170580460b'O;
	const octetstring c_gmm_att_pcu_nofcs := '01c001080103e5e000210a0005f4fb146ddd32f44000c8001d1b53432b37159ef9090070000dd9c6321200e00019b32c642401c000201705'O;

	f_llc_dec_and_log(c_gmm_att_pcu);

	//f_llc_assert(f_LLC_append_fcs(c_gmm_att_pcu_nofcs), c_gmm_att_pcu);

	log(valueof(ts_LLC_UI(gmm_auth_req, c_LLC_SAPI_LLGMM, LLC_CR_DL_CMD, g_mmctx.n_u)));
	log(ts_LLC_UI(gmm_auth_req, c_LLC_SAPI_LLGMM, LLC_CR_DL_CMD, g_mmctx.n_u));
}

testcase TC_selftest_rlcmac() runs on dummy_CT {
	var RlcmacDlCtrlBlock dcb;
	var RlcmacUlCtrlBlock ucb;
	const octetstring c_dl_ul_ack_nack := '40240080400000000000000077628dbba14b2b2b2b2b2b'O;
	const octetstring c_dl_data := '0f00007341c001081200102198c72477ea104895e8b959acc58b108182f4d0454300'O;
	const octetstring c_dl_data2 := '070002165dc0012b2b2b43c0012b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b00'O;
	const octetstring c_ul_ctrl_ack := '4006ec51b7772b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b'O;
	const octetstring c_ul_dl_ack_nack := '4008004000000000000000701000edc0000b2b2b2b2b2b'O;
	const octetstring c_dl_ul_assign := '482857628dbbaf0126e68800082b2b2b2b2b2b2b2b2b2b'O;

	log(c_dl_ul_ack_nack);
	dcb := dec_RlcmacDlCtrlBlock(c_dl_ul_ack_nack);
	log(dcb);
	//log(dec_RlcmacDlCtrlMsg(dcb.payload));

	f_rlcmac_dld_decenc(c_dl_data);

	f_rlcmac_dld_decenc(c_dl_data2);

	log(c_ul_ctrl_ack);
	ucb := dec_RlcmacUlCtrlBlock(c_ul_ctrl_ack);
	log(ucb);
	//log(dec_RlcmacUlCtrlMsg(ucb.payload));

	log(c_ul_dl_ack_nack);
	ucb := dec_RlcmacUlCtrlBlock(c_ul_dl_ack_nack);
	log(ucb);
	//log(dec_RlcmacUlCtrlMsg(ucb.payload));

	log(c_dl_ul_assign);
	dcb := dec_RlcmacDlCtrlBlock(c_dl_ul_assign);
	log(dcb);
	//log(dec_RlcmacDlCtrlMsg(dcb.payload));

	const octetstring c_uld_tlli_noext := '080101a61cab5201c001080103e5e000310a0005f4e61cab5232f44000c8001d1b00'O;
	f_rlcmac_uld_decenc(c_uld_tlli_noext);

	const octetstring c_uld_tlli_ext7pad := '0001041da61cab5200201705a96e102b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b00'O;
	log("ULD_decenc");
	f_rlcmac_uld_decenc(c_uld_tlli_ext7pad);
	log("UL_decenc");
	f_rlcmac_ul_decenc(c_uld_tlli_ext7pad);

	f_rlcmac_ul_decenc(c_ul_dl_ack_nack);
}

function f_rlcmac_ul_decenc(in octetstring buf) {
	log("==================================");
	log("In: ", buf);
	var RlcmacUlBlock udb := dec_RlcmacUlBlock(buf);
	log("Dec: ", udb);
	var octetstring enc := enc_RlcmacUlBlock(udb);
	log("Enc: ", enc);
	if (enc != buf) {
		setverdict(fail, "Re-encoded data doesn't equal input data");
		mtc.stop;
	}
}

function f_rlcmac_uld_decenc(in octetstring buf) {
	log("==================================");
	log("In: ", buf);
	var RlcmacUlDataBlock udb := dec_RlcmacUlDataBlock(buf);
	log("Dec: ", udb);
	var octetstring enc := enc_RlcmacUlDataBlock(udb);
	log("Enc: ", enc);
	if (enc != buf) {
		setverdict(fail, "Re-encoded data doesn't equal input data");
		mtc.stop;
	}
}

function f_rlcmac_dld_decenc(in octetstring buf) {
	log("==================================");
	log("In: ", buf);
	var RlcmacDlDataBlock udb := dec_RlcmacDlDataBlock(buf);
	log("Dec: ", udb);
	var octetstring enc := enc_RlcmacDlDataBlock(udb);
	log("Enc: ", enc);
	if (enc != buf) {
		setverdict(fail, "Re-encoded data doesn't equal input data");
		mtc.stop;
	}
}


testcase TC_selftest_rr() runs on dummy_CT {
	//const octetstring c_paging_none := '06210001F02B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B'O
	const octetstring c_paging_none := '1506210001F0'O;
	const octetstring c_ia_tbf := '2d063f100fe3677bd8440000c800100b2b2b2b2b2b2b2b'O
	log(c_paging_none);
	log(dec_GsmRrMessage(c_paging_none));

	log(c_ia_tbf);
	log(dec_GsmRrMessage(c_ia_tbf));
}

function f_seq_octstr(integer len) return octetstring {
	var octetstring payload := ''O;
	for (var integer i := 0; i < len; i := i+1 ) {
		payload := payload & int2oct(i mod 256, 1);
	}
	return payload;
}

testcase TC_ul_tbf_single_llc_sizes() runs on dummy_CT {
	g_mmctx.imsi := '262420123456789'H;
	g_mmctx.tlli := f_random_tlli();
	f_init();

	for (var integer len := 1; len <= 1560; len := len+1) {
		log("Testing Uplink TBF with single LLC-PDU of ", len, " bytes");
		var octetstring payload := f_seq_octstr(len);
		var UlTbfPars ul_tbf_pars := {
			ack_mode := true,
			initial_cs := CS1,
			llc_pdus := {
				valueof(ts_LLC_UI(payload, c_LLC_SAPI_LLGMM, '0'B, g_mmctx.n_u))
			}
		}
		var UlTbfState ul_tbf_state;
		f_UlTbfState_init(ul_tbf_state, ul_tbf_pars);
		f_ul_tbf(ul_tbf_state);
		f_sleep(1.0);
	}

	f_exit();
}

testcase TC_ul_tbf() runs on dummy_CT {
	g_mmctx.imsi := '262420123456789'H;
	g_mmctx.tlli := f_random_tlli();
	f_init();

	var octetstring payload := f_seq_octstr(1023);
	var UlTbfPars ul_tbf_pars := {
		ack_mode := true,
		initial_cs := CS1,
		llc_pdus := { 
			valueof(ts_LLC_UI(payload, c_LLC_SAPI_LLGMM, '0'B, g_mmctx.n_u)),
			valueof(ts_LLC_UI(payload, c_LLC_SAPI_LLGMM, '0'B, g_mmctx.n_u+1)),
			valueof(ts_LLC_UI(payload, c_LLC_SAPI_LLGMM, '0'B, g_mmctx.n_u+2)),
			valueof(ts_LLC_UI(payload, c_LLC_SAPI_LLGMM, '0'B, g_mmctx.n_u+3)),
			valueof(ts_LLC_UI(payload, c_LLC_SAPI_LLGMM, '0'B, g_mmctx.n_u+4)),
			valueof(ts_LLC_UI(payload, c_LLC_SAPI_LLGMM, '0'B, g_mmctx.n_u+5))
		}
	};
	var UlTbfState ul_tbf_state;
	f_UlTbfState_init(ul_tbf_state, ul_tbf_pars);
	f_ul_tbf(ul_tbf_state);

	f_exit();
}

testcase TC_dl_tbf() runs on dummy_CT {
	g_mmctx.imsi := '262420123456789'H;
	g_mmctx.tlli := f_random_tlli();
	f_init();

	f_establish_dl_tbf();

	f_exit();
}

function f_wait_tbf_dl(TbfNr tbf_nr, GprsTlli tlli) runs on dummy_CT return ImmediateAssignment {
	var LAPDm_ph_data ph_data;
	var GsmRrMessage rr;
	timer T := 10.0;
	T.start;
	alt {
	[] L1.receive(LAPDm_ph_data:{sacch:=?,sapi:=0,lapdm:={bbis:=?}}) -> value ph_data {
		rr := dec_GsmRrMessage(ph_data.lapdm.bbis.payload);
		log("PCH/AGCH DL RR: ", rr);
		if (match(rr, t_RR_IMM_ASS_TBF_DL(tlli))) {
			var TbfPars tbf_pars := valueof(t_TbfParsInit);
			log("Received IMM.ASS for our TLLI!");
			tbf_pars.tfi[rr.payload.imm_ass.pkt_chan_desc.tn] :=
				rr.payload.imm_ass.rest_octets.hh.dl.group1.tfi_assignment;
			L1.send(TBF_DL_establish_req:{tbf_nr, tbf_pars});
		} else {
			repeat;
		}
	}
	[] L1.receive { repeat };
	[] T.timeout {
		setverdict(fail, "Timeout waiting for IMM ASS")
		mtc.stop;
		}
	}
	T.stop;
	return rr.payload.imm_ass;
}

/* Establish an UL TBF: Tune to ARFCN, send RACH, receive AGCH, enable TBF Rx */
function f_establish_dl_tbf() runs on dummy_CT {
	timer T := 5.0;
	var BCCH_tune_req tune_req := { { false, 871 }, true };
	L1.send(tune_req);
	/* FIXME: wait for confirm */

	/* sending a GMM PDU as DL-UNITDATA should trigger Paging + DL TBF Assignment */
	tx_gmm('1'B, '01020304'O, c_LLC_SAPI_LLGMM);

	/* Expect an IMM.ASS for PDCH on the AGCH */
	f_wait_tbf_dl(0, g_mmctx.tlli);

	var RLCMAC_ph_data_ind dl;
	alt {
	[] L1.receive(RLCMAC_ph_data_ind:{cs:=?, ts_nr:=?, fn:=?, block:=tr_RLCMAC_DATA_RRBP}) -> value dl {
		var uint6_t tfi := dl.block.data.mac_hdr.hdr_ext.tfi;
		var GsmFrameNumber ul_fn := f_rrbp_fn(dl.fn, dl.block.data.mac_hdr.mac_hdr.rrbp);
		var AckNackDescription an_desc := { /* FIXME: compute this based on state */
			final_ack := '1'B,
			starting_seq_nr := 0,
			receive_block_bitmap := '0000000000000000000000000000000000000000000000000000000000000001'B
		}
		var RlcmacUlCtrlMsg ctrl_ack;
		ctrl_ack := valueof(ts_RlcMacUlCtrl_PKT_DL_ACK(tfi, an_desc));
		var RlcmacUlBlock ul_block := valueof(ts_RLC_UL_CTRL_ACK(ctrl_ack));
		L1.send(ts_PH_DATA_ABS(0, CS1, dl.ts_nr, ul_fn, {false, 871}, ul_block));
		log("Sent DL ACK: ", ul_block);
		}
	[] L1.receive { repeat; }
	}

	f_sleep(10.0);
}

/* FIXME: merge this into BSSGP_Client_CT ? */
type component bssgp_CT extends BSSGP_Client_CT {
	var NS_CT ns_component;
	var BSSGP_CT bssgp_component;
	var boolean g_initialized := false;
}

/* FIXME: merge this into BSSGP_Client_CT ? */
function f_init_bssgp() runs on bssgp_CT {
	var MmContext mmctx := {
		imsi := '262420000000001'H,
		tlli := 'FFFFFFFF'O,
		n_u := 0
	};


	if (g_initialized == true) {
		return;
	}
	g_initialized := true;

	/* create a new NS component */
	ns_component := NS_CT.create;
	bssgp_component := BSSGP_CT.create;
	/* connect our BSSGP port to the BSSGP Emulation */
	connect(self:BSSGP[0], bssgp_component:BSSGP_SP);
	connect(self:BSSGP_SIG[0], bssgp_component:BSSGP_SP_SIG);
	connect(self:BSSGP_PROC[0], bssgp_component:BSSGP_PROC);
	/* connect lower-end of BSSGP with BSSGP_CODEC_PORT (maps to NS_PT*/
	connect(bssgp_component:BSCP, ns_component:NS_SP);
	/* connect lower-end of NS emulation to NS_CODEC_PORT (on top of IPl4) */
	map(ns_component:NSCP, system:NS_CODEC_PORT);
	ns_component.start(NSStart(mp_nsconfig));
	bssgp_component.start(BssgpStart(mp_gb_cfg));

	f_bssgp_client_register(mmctx.imsi, mmctx.tlli, mp_gb_cfg.cell_id);
	f_bssgp_establish();
}



control {
	execute(TC_selftest_ns());
	execute(TC_ul_tbf_single_llc_sizes());
	execute(TC_ul_tbf());
	execute(TC_paging());
}

};
