/* GPRS RLC/MAC Control Messages as per 3GPP TS 44.060 manually transcribed from the CSN.1 syntax, as no CSN.1
 * tool for Eclipse TITAN could be found.  Implements only the minimum necessary messages for Osmocom teseting
 * purposes. */

/* (C) 2017-2018 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 RLCMAC_CSN1_Templates {
	import from General_Types all;
	import from Osmocom_Types all;
	import from GSM_Types all;
	import from MobileL3_GMM_SM_Types all;
	import from RLCMAC_CSN1_Types all;

	template (value) RlcmacUlCtrlMsg ts_RlcMacUlCtrl_PKT_CTRL_ACK(GprsTlli tlli,
						CtrlAck ack := MS_RCVD_TWO_RLC_SAME_RTI_DIFF_RBSN) := {
		msg_type := PACKET_CONTROL_ACK,
		u := {
			ctrl_ack := {
				tlli := tlli,
				ctrl_ack := ack
			}
		}
	}

	const ILevel iNone := {
		presence := '0'B,
		i_level := omit
	}
	const ChannelQualityReport c_ChQualRep_default := {
		c_value := 0,
		rxqual := 0,
		sign_var := 0,
		i_levels := { iNone, iNone, iNone, iNone, iNone, iNone, iNone, iNone }
	}
	template (value) RlcmacUlCtrlMsg ts_RlcMacUlCtrl_PKT_DL_ACK(uint5_t dl_tfi,
								    AckNackDescription andesc,
					ChannelQualityReport qual_rep := c_ChQualRep_default) := {
		msg_type := PACKET_DL_ACK_NACK,
		u := {
			dl_ack_nack := {
				dl_tfi := dl_tfi,
				ack_nack_desc := andesc,
				chreq_desc_presence := '0'B,
				chreq_desc := omit,
				ch_qual_rep := qual_rep
			}
		}
	}

	private function f_presence_bit_MSRadioAccessCapabilityV(template (omit) MSRadioAccessCapabilityV ms_rac) return BIT1 {
		if (istemplatekind(ms_rac, "omit")) {
			return '0'B;
		}
		return '1'B;
	}

	private function f_template_MSRadioAccessCapabilityV_to_MSRadioAccCap2(template (omit) MSRadioAccessCapabilityV ms_rac) return template (omit) MSRadioAccCap2 {
		var template (omit) MSRadioAccCap2 ms_rac2 := omit;
		if (istemplatekind(ms_rac, "omit")) {
			return ms_rac2;
		}
		ms_rac2 := { msRadioAccessCapabilityV := ms_rac };
		return ms_rac2;
	}

	const ChannelReqDescription c_ChReqDesc_default := {
		peak_tput_class := 0,
		priority := 0,
		rlc_mode := RLC_MODE_ACKNOWLEDGED,
		llc_pdu_type := LLC_PDU_IS_NOT_SACK_OR_ACK,
		RlcOctetCount := 0
	}

	/* TS 44.060 sec 11.2.16 */
	template (value) RlcmacUlCtrlMsg ts_RlcMacUlCtrl_PKT_RES_REQ(GprsTlli tlli,
						     template (omit) MSRadioAccessCapabilityV ms_rac,
						     ChannelReqDescription ch_req_desc := c_ChReqDesc_default,
						     RlcAccessType acc_type := RLC_ACC_TYPE_TWO_PHASE)
	:= {
		msg_type := PACKET_RESOURCE_REQUEST,
		u := {
			resource_req := {
				acc_type_presence := '1'B,
				acc_type := acc_type,
				id_type := '1'B,
				id := { tlli := tlli },
				ms_rac2_presence := f_presence_bit_MSRadioAccessCapabilityV(ms_rac),
				ms_rac2 := f_template_MSRadioAccessCapabilityV_to_MSRadioAccCap2(ms_rac),
				ch_req_desc := ch_req_desc,
				change_mark_presence := '0'B,
				change_mark := omit,
				C_val := '000000'B,
				sign_var_presence := '0'B,
				sign_var := omit,
				I_levels := {
					iNone, iNone, iNone, iNone,
					iNone, iNone, iNone, iNone
				}
			}
		}
	};

	const CCNMesurementReport ccn_meas_rep_def := {
		rxlev_servig_cell := 0,
		zero := '0'B,
		num_meas := 0,
		meas := { }
	}

	/* TS 44.060 sec 11.2.3a */
	template (value) RlcmacUlCtrlMsg ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(uint5_t tfi,
						GsmArfcn arfcn,
						uint6_t bsic,
						template (value) CCNMesurementReport ccn_meas_rep := ccn_meas_rep_def)
	:= {
		msg_type := PACKET_CELL_CHANGE_NOTIFICATION,
		u := {
			cell_chg_notif := {
				gtfi := {
					is_dl_tfi := false,
					tfi := tfi
				},
				arfcn_bsic_presence := '0'B,
				arfcn := arfcn,
				bsic := bsic,
				ba_psi3_presence := '0'B,
				ba_used := '0'B,
				psi3_change_mark := omit,
				pmo_used := '0'B,
				pccn_sending := '0'B,
				ccn_meas_rep := ccn_meas_rep
			}
		}
	};

	/* TS 44.060 sec 11.2.2a */
	template RlcmacDlCtrlMsg tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE(template GlobalTfi tfi := ?)
	:= {
		msg_type := PACKET_CELL_CHANGE_CONTINUE,
		u := {
			cell_chg_continue := {
				page_mode := ?,
				zero := '0'B,
				gtfi := tfi,
				arfcn_bsic_presence := ?,
				arfcn := *,
				bsic := *,
				container_id := *
			}
		}
	};

	/* TS 44.060 sec 11.2.9 */
	template (value) NCMeasurement ts_NCMeasurement(uint6_t frequency_n, BIT6 bsic, uint6_t rxlev)
	:= {
		frequency_n := frequency_n,
		bsic_n_presence := '1'B,
		bsic_n := bsic,
		rxlev_n := rxlev
	};
	template (value) NCMeasurementReport ts_NCMeasurementReport(BIT1 nc_mode,
							    uint6_t rxlev_serving_cell,
							    template (value) NCMeasurementList nc_meas_list := {})
	:= {
		nc_mode := nc_mode,
		rxlev_serving_cell := rxlev_serving_cell,
		zero := '0'B,
		num_nc_measurements := 0, /* automatically updated */
		nm_measurements := nc_meas_list
	};
	template RlcmacUlCtrlMsg ts_RlcMacUlCtrl_PKT_MEAS_REPORT(template (value) GprsTlli tlli,
								template (value) NCMeasurementReport nc_meas_rep)
	:= {
		msg_type := PACKET_MEASUREMENT_REPORT,
		u := {
			meas_report := {
				tlli := tlli,
				psi5_change_mark_presence := '0'B,
				psi5_change_mark := omit,
				additions_99 := '0'B,
				nc_meas_report := nc_meas_rep
			}
		}
	};

	/* TS 44.060 sec 11.2.9b */
	template RepeatedAddFrequencyItem tr_RepeatedAddFrequencyItem(template (present) uint10_t start_frequency := ?,
								      template (present) uint6_t bsic := ?)
	:= {
		presence := '1'B,
		item := {
			start_frequency := start_frequency,
			bsic := bsic,
			cell_sel_par_present := ?,
			cell_sel_par := *,
			nr_of_frequencies := 0,
			freq_diff_length := ?
			/* TODO: support Frequency diff list */
		}
	};
	template NCFrequencyList tr_NCFrequencyList(template FreqIndexList removed_freq_index := *, template RepeatedAddFrequencyItemList repeated_add_frequency := *)
	:= {
		removed_freq_present := ?,
		nr_of_removed_freq := *,
		removed_freq_index := removed_freq_index,
		repeated_add_frequency := repeated_add_frequency,
		repeated_add_frequency_term := '0'B
	};
	template NCMeasurementParameters tr_NCMeasurementParameters(template (present) NetworkControlOrder nco := ?,
								    template uint3_t nc_non_drx_period := *,
								    template uint3_t nc_reporting_period_i := *,
								    template uint3_t nc_reporting_period_t := *,
								    template NCFrequencyList nc_freq_list := *)
	:= {
		nco := nco,
		nc_period_present := ?,
		nc_non_drx_period := nc_non_drx_period,
		nc_reporting_period_i := nc_reporting_period_i,
		nc_reporting_period_t := nc_reporting_period_t,
		nc_freq_list_present := ?,
		nc_freq_list := nc_freq_list
	};
	/* This template is used by osmo-pcu to reset the GSM Neighbour Cell List of the MS */
	template (value) NCMeasurementParameters ts_NCMeasurementParametersRESET
	:= {
		nco := NC_RESET,
		nc_period_present := '0'B,
		nc_non_drx_period := omit,
		nc_reporting_period_i := omit,
		nc_reporting_period_t := omit,
		nc_freq_list_present := '0'B,
		nc_freq_list := omit
	};
	template RlcmacDlCtrlMsg tr_RlcMacDlCtrl_PKT_MEAS_ORDER(template (present) GlobalTfiOrTlli tfi_or_tlli := ?,
								template (present) uint3_t pmo_index := ?,
								template (present) uint3_t pmo_count := ?,
								template (present) NCMeasurementParameters nc_meas_param := ?)
	:= {
		msg_type := PACKET_MEASUREMENT_ORDER,
		u := {
			meas_order := {
				page_mode := ?,
				tfi_or_tlli := tfi_or_tlli,
				pmo_index := pmo_index,
				pmo_count := pmo_count,
				nc_meas_param_present := '1'B,
				nc_meas_param := nc_meas_param,
				zero := '0'B
			}
		}
	};

	/* TS 44.060 sec 11.2.9e */
	template RlcmacDlCtrlMsg tr_RlcMacDlCtrl_PKT_NEIGH_CELL_DATA(template (present) GlobalTfi tfi := ?,
								     template (present) uint5_t container_index := ?)
	:= {
		msg_type := PACKET_NEIGHBOUR_CELL_DATA,
		u := {
			neighbour_cell_data := {
				page_mode := ?,
				zero := '0'B,
				gtfi := tfi,
				container_id := ?,
				spare := '0'B,
				container_index := container_index,
				arfcn_bsic_presence := ?,
				arfcn := *,
				bsic := *,
				container_list := ?
			}
		}
	};

	private function f_presence_bit_tfi(template uint5_t tfi) return BIT1 {
		if (istemplatekind(tfi, "omit")) {
			return '0'B;
		}
		return '1'B;
	}

	template DynamicAllocation tr_DynamicAllocation(template uint5_t tfi:= ?) := {
		extd_dyn_alloc := ?,
		p0_present := ?,
		p0 := *,
		pr_mode := *,
		usf_granularity := ?,
		ul_tfi_ass_present := f_presence_bit_tfi(tfi),
		ul_tfi_assignment := tfi,
		reserved := '0'B,
		tbf_starting_time_present := ?,
		tbf_starting_time := *,
		ts_allocation := ?
	};

	template PktUlAssGprs tr_PktUlAssGprsDynamic(template DynamicAllocation dyn_alloc := ?) := {
		ch_coding_cmd := ?,
		tlli_block_chan_coding := ?,
		pkt_ta := ?,
		freq_par_present := ?,
		freq_par := *,
		alloc_present := '01'B,
		dyn_block_alloc := dyn_alloc,
		sgl_block_alloc := omit
	};

	template PktUlAssEgprs tr_PktUlAssEgprsDynamic(template DynamicAllocation dyn_alloc := ?) := {
		dual_carrier := '00'B,
		tlli_present := ?,
		tlli := *,
		compact_reduced_ma_present := ?,
		compact_reduced_ma := *,
		chan_coding_cmd := ?,
		resegment := ?,
		window_size := ?,
		ats_present := ?,
		ats := *, /* ? */
		arac_retrans_req := ?,
		tlli_block_chan_coding := ?,
		bep_period2_present := ?,
		bep_period2 := *,
		pkt_ta := ?,
		pkt_ext_ta_present := ?,
		pkt_ext_ta := *,
		freq_par_present := ?,
		freq_par := *,
		alloc_present := ?,
		dyn_block_alloc := dyn_alloc,
		multi_block_alloc := omit
	};

	template AckNackDescription tr_AckNackDescription(template BIT1 final_ack := ?) := {
		final_ack := final_ack,
		starting_seq_nr := ?,
		receive_block_bitmap := ?
	};

	template UlAckNackGprsAdditionsRel99 tr_UlAckNackGprsAdditionsRel99(template boolean tbf_est := ?) := {
		ext_pkt_ta_present := ?,
		ext_pkt_ta := *,
		tbf_est := tbf_est
	};

	template UlAckNackGprs tr_UlAckNackGprs(template GprsTlli tlli := *,
						template AckNackDescription acknack_desc := ?,
						template UlAckNackGprsAdditionsRel99 rel99 := *) := {
		ch_coding_cmd := ?,
		ack_nack_desc := acknack_desc,
		cont_res_tlli_present := ?,
		cont_res_tlli := tlli,
		pkt_ta_present := ?,
		pkt_ta := *,
		pwr_ctrl_present := ?,
		pwr_ctrl := *,
		extension_bits_present := ?,
		extension_bits := *,
		not_used := '0'B,
		rel99_present := ?,
		rel99 := rel99
	};

	template UlAckNackEgprs tr_UlAckNackEgprs(template GprsTlli tlli := *) := {
		msg_excape := '00'B,
		ch_coding_cmd := ?,
		resegment := ?,
		preemptive_tx := ?,
		prr_retrans_req := ?,
		arac_retrans_req := ?,
		cont_res_tlli_present := ?,
		cont_res_tlli := tlli,
		tbf_est := ?,
		pkt_ta_present := ?,
		pkt_ta := *,
		pkt_ext_ta_present := ?,
		pkt_ext_ta := *,
		pwr_ctrl_present := ?,
		pwr_ctrl := *
	};

	template (value) EgprsAckNackDescriptionIE ts_EgprsAckNackDescriptionIE(template (value) EgprsAckNackDescription andesc) := {
		len_present := '1'B,
		len := 0, /* Overwritten by RAW encoder */
		acknack_desc := andesc
	}

} with { encode "RAW"; variant "FIELDORDER(msb)" variant "BYTEORDER(last)" };
