/* dual-faced port that wraps an Unixdomain port and encodes/decodes L1CTL
 * (C) 2017-2019 Harald Welte <laforge@gnumonks.org>
 * contributions by sysmocom - s.f.m.c. GmbH
 * 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
 */

module L1CTL_PortType {
	import from L1CTL_Types all;
	import from UD_PortType all;
	import from UD_Types all;
	import from Osmocom_Types all;
	import from Osmocom_Types all;
	import from GSM_Types all;
	import from GSM_RR_Types all;
	import from L1CTL_PortType_CtrlFunct all;

	type record L1CTL_connect {
		charstring	path
	}

	type record L1CTL_connect_result {
		UD_Result_code	result_code optional,
		charstring	err optional
	}

	modulepar {
		charstring	m_l1ctl_sock_path := "/tmp/osmocom_l2";
	}

	function f_L1CTL_getMsgLen(in octetstring stream, inout ro_integer args) return integer {
		var integer stream_len := lengthof(stream);
		var integer len;
		if (stream_len < 2) {
			return -1;
		}
		len := 2 + oct2int(substr(stream, 0, 2));
		return len;
	}

	function f_L1CTL_FBSB(L1CTL_PT pt, GsmBandArfcn arfcn,
			      L1ctlCcchMode ccch_mode := CCCH_MODE_COMBINED,
			      integer rxlev_exp := 57)
	{
		timer T := 15.0;
		for (var integer i := 0; i < 10; i := i+1) {
			var L1ctlDlMessage dl;
			pt.send(ts_L1CTL_FBSB_REQ(arfcn, valueof(t_L1CTL_FBSB_F_ALL), 0, ccch_mode, rxlev_exp));
			T.start
			alt {
			[] pt.receive(tr_L1CTL_FBSB_CONF(0)) { return; };
			[i >= 9] pt.receive(tr_L1CTL_FBSB_CONF(?)) -> value dl {
				setverdict(fail, "FBSB Failed with non-zero return code ", dl.payload.fbsb_conf.result);
				mtc.stop;
				};
			[] pt.receive(tr_L1CTL_FBSB_CONF(?)) {
				f_sleep(1.0);
				}
			[] pt.receive { repeat; };
			[] T.timeout {
				setverdict(fail, "Timeout waiting for L1CTL_FBSB_CONF");
				mtc.stop;
				};
			}
		}
	}

	function f_L1CTL_CCCH_MODE(L1CTL_PT pt, L1ctlCcchMode ccch_mode) {
		timer T := 2.0;
		pt.send(ts_L1CTL_CCCH_MODE_REQ(ccch_mode));
		T.start;
		alt {
		[] pt.receive(tr_L1CTL_CCCH_MODE_CONF) { }
		[] pt.receive { repeat; }
		[] T.timeout {
			setverdict(fail, "Timeout waiting for L1CTL_CCCH_MODE_CONF");
			mtc.stop;
			}
		}
	}

	function f_L1CTL_TCH_MODE(L1CTL_PT pt, L1ctlTchMode tch_mode) {
		timer T := 2.0;
		pt.send(ts_L1CTL_TCH_MODE_REQ(tch_mode));
		T.start;
		alt {
		[] pt.receive(tr_L1CTL_MsgType(L1CTL_TCH_MODE_CONF)) { }
		[] pt.receive { repeat; }
		[] T.timeout {
			setverdict(fail, "Timeout waiting for L1CTL_TCH_MODE_CONF");
			mtc.stop;
			}
		}
	}

	function f_L1CTL_RACH(L1CTL_PT pt, uint8_t ra, uint8_t combined := 1, uint16_t offset := 0,
			      template (value) RslChannelNr chan_nr := ts_RslChanNr_RACH(0),
			      template (value) RslLinkId link_id := ts_RslLinkID_DCCH(0))
	return GsmFrameNumber {
		var L1ctlDlMessage rc;
		var GsmFrameNumber fn;
		timer T := 2.0;
		T.start
		pt.send(ts_L1CTL_RACH_REQ(ra, combined, offset, chan_nr, link_id))
		alt {
		[] pt.receive(tr_L1CTL_RACH_CONF) -> value rc { fn := rc.dl_info.frame_nr };
		[] pt.receive { repeat; };
		[] T.timeout {
			setverdict(fail, "Timeout waiting for L1CTL_RACH_CONF");
			mtc.stop;
			}
		}
		return fn;
	}

	function f_L1CTL_EXT_RACH(
		L1CTL_PT pt, uint16_t ra11, L1ctlRachSynchSeq seq,
		uint8_t combined := 1, uint16_t offset := 0
	) return GsmFrameNumber {
		var L1ctlDlMessage rc;
		var GsmFrameNumber fn;
		timer T := 2.0;

		T.start;
		pt.send(ts_L1CTL_EXT_RACH_REQ(ra11, seq, combined, offset));
		alt {
		[] pt.receive(tr_L1CTL_RACH_CONF) -> value rc { fn := rc.dl_info.frame_nr };
		[] pt.receive { repeat; };
		[] T.timeout {
			setverdict(fail, "Timeout waiting for (extended) L1CTL_RACH_CONF");
			mtc.stop;
			}
		}

		return fn;
	}

	function f_L1CTL_PARAM(L1CTL_PT pt, uint8_t ta, uint8_t tx_power) {
		pt.send(ts_L1CTL_PAR_REQ(ta, tx_power));
	}

	function f_L1CTL_WAIT_IMM_ASS(L1CTL_PT pt, uint8_t ra, GsmFrameNumber rach_fn) return ImmediateAssignment {
		var template GsmRrMessage rr_imm_ass;
		var L1ctlDlMessage dl;
		var GsmRrMessage rr;
		timer T := 10.0;

		/* Prepare generic template (for both CS and PS) */
		rr_imm_ass := tr_IMM_ASS(ra, rach_fn);
		rr_imm_ass.payload.imm_ass.ded_or_tbf := ?;
		rr_imm_ass.payload.imm_ass.pkt_chan_desc := *;
		rr_imm_ass.payload.imm_ass.chan_desc := *;

		T.start;
		alt {
		[] pt.receive(tr_L1CTL_DATA_IND(t_RslChanNr_PCH_AGCH(0))) -> value dl {
			rr := dec_GsmRrMessage(dl.payload.data_ind.payload);
			log("PCH/AGCH DL RR: ", rr);
			if (match(rr, rr_imm_ass)) {
				log("Received IMM.ASS for our RACH!");
			} else {
				repeat;
			}
		};
		[] pt.receive { repeat };
		[] T.timeout {
			setverdict(fail, "Timeout waiting for IMM ASS");
			mtc.stop;
			}
		}
		T.stop;
		return rr.payload.imm_ass;
	}

	function f_L1CTL_WAIT_IMM_ASS_TBF_DL(L1CTL_PT pt, GprsTlli tlli) return ImmediateAssignment {
		var template PacketDlAssign dl_ass := tr_PacketDlAssign(tlli);
		var template IaRestOctets rest := tr_IaRestOctets_DLAss(dl_ass);
		var L1ctlDlMessage dl;
		var GsmRrMessage rr;
		timer T := 10.0;
		T.start;
		alt {
		[] pt.receive(tr_L1CTL_DATA_IND(t_RslChanNr_PCH_AGCH(0))) -> value dl {
			/* TODO: use decmatch tr_IaRestOctets_DLAss(...) instead */
			rr := dec_GsmRrMessage(dl.payload.data_ind.payload);
			log("PCH/AGCN DL RR: ", rr);
			if (match(rr, tr_IMM_TBF_ASS(dl := true, rest := rest))) {
				log("Received IMM.ASS for our TLLI!");
			} else {
				repeat;
			}
		};
		[] pt.receive { repeat };
		[] T.timeout {
			setverdict(fail, "Timeout waiting for TBF IMM ASS");
			mtc.stop;
			}
		}
		T.stop;
		return rr.payload.imm_ass;
	}

	function f_L1CTL_TBF_CFG(L1CTL_PT pt, boolean is_uplink, TfiUsfArr tfi_usf) {
		timer T := 2.0;
		T.start;
		pt.send(ts_L1CTL_TBF_CFG_REQ(is_uplink, tfi_usf));
		alt {
		[] pt.receive(tr_L1CTL_TBF_CFG_CONF(is_uplink)) {}
		[] pt.receive { repeat };
		[] T.timeout {
			setverdict(fail, "Timeout waiting for L1CTL_TBF_CFG_CONF");
			mtc.stop;
			};
		}
		T.stop;
	}

	/* Send DM_EST_REQ from parameters derived from IMM ASS */
	function f_L1CTL_DM_EST_REQ_IA(L1CTL_PT pt, ImmediateAssignment imm_ass, L1ctlMA ma := {}) {
		/* FIXME: handle Packet Channel Description */
		if (imm_ass.ded_or_tbf.tbf == true) {
			setverdict(fail, "TBF assignment is not handled by ", __SCOPE__);
			mtc.stop;
		}

		/* Single channel or frequency hopping? */
		if (not imm_ass.chan_desc.h) {
			pt.send(ts_L1CTL_DM_EST_REQ_H0(imm_ass.chan_desc.chan_nr,
						       imm_ass.chan_desc.tsc,
						       imm_ass.chan_desc.arfcn));
		} else {
			/* TODO: we probably want to apply a bitmask from imm_ass.mobile_allocation
			 * on the list of channels, if it's present. Use all channels for now. */
			pt.send(ts_L1CTL_DM_EST_REQ_H1(imm_ass.chan_desc.chan_nr,
						       imm_ass.chan_desc.tsc,
						       imm_ass.chan_desc.maio_hsn.hsn,
						       imm_ass.chan_desc.maio_hsn.maio,
						       ma));
		}
	}

	/* Send DM_REL_REQ from parameters derived from IMM ASS */
	function f_L1CTL_DM_REL_REQ(L1CTL_PT pt, RslChannelNr chan_nr) {
		pt.send(ts_L1CTL_DM_REL_REQ(chan_nr));
	}

	function f_L1CTL_RESET(L1CTL_PT pt, L1ctlResetType res_type := L1CTL_RES_T_FULL) {
		timer T := 2.0;
		pt.send(t_L1ctlResetReq(res_type));
		T.start;
		alt {
		[] pt.receive(tr_L1CTL_MsgType(L1CTL_RESET_CONF)) { }
		[] pt.receive { repeat; }
		[] T.timeout {
			setverdict(fail, "Timeout waiting for L1CTL_RESET_CONF");
			mtc.stop;
			}
		}
	}

	function f_L1CTL_CRYPTO_REQ(L1CTL_PT pt, RslChannelNr chan_nr, uint8_t algo, octetstring key) {
		pt.send(ts_L1CTL_CRYPTO_REQ(chan_nr, algo, key));
	}

	function f_connect_reset(L1CTL_PT pt, charstring l1ctl_sock_path := m_l1ctl_sock_path) {
		var f_UD_getMsgLen vl_f := refers(f_L1CTL_getMsgLen);
		f_L1CTL_setGetMsgLen(pt, -1, vl_f, {});
		pt.send(L1CTL_connect:{path:=l1ctl_sock_path});
		pt.receive(L1CTL_connect_result:{result_code := SUCCESS, err:=omit});
		f_L1CTL_setGetMsgLen(pt, 0, vl_f, {});
		f_L1CTL_RESET(pt);
	}

	private function L1CTL_to_UD_connect(in L1CTL_connect pin, out UD_connect pout) {
		pout.path := pin.path;
		pout.id := 0;
	} with { extension "prototype(fast)" }

	private function UD_to_L1CTL_connect_result(in UD_connect_result pin, out L1CTL_connect_result pout) {
		pout.result_code := pin.result.result_code;
		pout.err := pin.result.err;
	} with { extension "prototype(fast)" }

	private function L1CTL_to_UD_ul(in L1ctlUlMessage pin, out UD_send_data pout) {
		var L1ctlUlMessageLV msg_lv := { msg := pin };
		pout.data := enc_L1ctlUlMessageLV(msg_lv);
		pout.id := 0;
	} with { extension "prototype(fast)" }

	private function UD_to_L1CTL_dl(in UD_send_data pin, out L1ctlDlMessage pout) {
		var L1ctlDlMessageLV msg_lv := dec_L1ctlDlMessageLV(pin.data);
		pout:= msg_lv.msg;
	} with { extension "prototype(fast)" }

	type port L1CTL_PT message {
		out L1ctlUlMessage
		out L1CTL_connect
		in L1ctlDlMessage
		in L1CTL_connect_result
		in UD_listen_result
		in UD_connected
	} with { extension "user UD_PT
		out(L1ctlUlMessage -> UD_send_data: function(L1CTL_to_UD_ul);
		    L1CTL_connect -> UD_connect: function(L1CTL_to_UD_connect))
		in(UD_send_data -> L1ctlDlMessage: function(UD_to_L1CTL_dl);
		   UD_connect_result -> L1CTL_connect_result: function(UD_to_L1CTL_connect_result);
		   UD_listen_result -> UD_listen_result: simple;
		   UD_connected -> UD_connected: simple
		)" }
}
