module PCU_Tests {

	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;

	modulepar {
		BssgpConfig mp_gb_cfg := {
			nsei := 1234,
			bvci := 1234,
			cell_id := {
				ra_id := {
					lai := {
						mcc_mnc := '26242F'H, lac := 13135
					},
					rac := 0
				},
				cell_id := 20960
			},
			sgsn_role := 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, bssgp_component:BSSGP_SP);
		connect(self:BSSGP_PROC, 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());
		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);
		} 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.send(ts_BSSGP_DL_UD(g_mmctx.tlli, enc_PDU_LLC(llc)));
	}

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

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

	/* Send PS-PAGING via BSSGP to PCU, expect it to show up on L1/Um */
	testcase TC_paging() runs on dummy_CT {
		var GsmTmsi tmsi := hex2int('01234567'H);
		g_mmctx.imsi := '262420123456789'H;
		g_mmctx.tlli := f_random_tlli();
		f_init();

		BSSGP.send(ts_BSSGP_PS_PAGING_IMSI(mp_gb_cfg.bvci, g_mmctx.imsi));
		BSSGP.send(ts_BSSGP_PS_PAGING_PTMSI(mp_gb_cfg.bvci, g_mmctx.imsi, tmsi));

		while (true) {
			var BssgpDecoded bd;
			alt {
				[] BSSGP.receive(tr_BD_L3_MT(?)) -> value bd {
					log("BSSGP Rx: ", bd);
				}
				[] BSSGP.receive(t_BssgpStsInd(?, ?, BVC_S_UNBLOCKED)) { repeat; }
				[] BSSGP.receive { repeat; }
			}
		}
	}

	/* 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");
				self.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.receive(bd_exp) {
		log("found matching BSSGP UL-UNITDATA PDU");
		}
	[] T.timeout {
		setverdict(fail, "Timeout waiting for ", bd_exp);
		}
	}
}


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_bssgp_establish();

		while (true) {
			var BssgpDecoded bd;
			alt {
				[] BSSGP.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.receive(t_BssgpStsInd(?, ?, BVC_S_UNBLOCKED)) { repeat; }
				[] BSSGP.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);
		} 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"); }
	}

	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"); }
	}

	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"); }
	}


	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")
			self.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);
	}


	control {
		execute(TC_selftest_bssgp());
		execute(TC_selftest_ns());
		execute(TC_selftest_llc());
		execute(TC_selftest_rr());
		execute(TC_selftest_rlcmac());
		execute(TC_nsem());
		execute(TC_paging());
	}
};
