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