blob: 64c709a7430be78c8c0f61a344cd7e388f9ca614 [file] [log] [blame]
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +02001/* GPRS RLC/MAC Control Messages as per 3GPP TS 44.060 manually transcribed from the CSN.1 syntax, as no CSN.1
2 * tool for Eclipse TITAN could be found. Implements only the minimum necessary messages for Osmocom teseting
3 * purposes. */
4
5/* (C) 2017-2018 Harald Welte <laforge@gnumonks.org>
6 * contributions by sysmocom - s.f.m.c. GmbH
7 * All rights reserved.
8 *
9 * Released under the terms of GNU General Public License, Version 2 or
10 * (at your option) any later version.
11 *
12 * SPDX-License-Identifier: GPL-2.0-or-later
13 */
14
15module RLCMAC_CSN1_Templates {
16 import from General_Types all;
17 import from Osmocom_Types all;
18 import from GSM_Types all;
19 import from MobileL3_GMM_SM_Types all;
20 import from RLCMAC_CSN1_Types all;
21
22 template (value) RlcmacUlCtrlMsg ts_RlcMacUlCtrl_PKT_CTRL_ACK(GprsTlli tlli,
23 CtrlAck ack := MS_RCVD_TWO_RLC_SAME_RTI_DIFF_RBSN) := {
24 msg_type := PACKET_CONTROL_ACK,
25 u := {
26 ctrl_ack := {
27 tlli := tlli,
28 ctrl_ack := ack
29 }
30 }
31 }
32
33 const ILevel iNone := {
34 presence := '0'B,
35 i_level := omit
36 }
37 const ChannelQualityReport c_ChQualRep_default := {
38 c_value := 0,
39 rxqual := 0,
40 sign_var := 0,
41 i_levels := { iNone, iNone, iNone, iNone, iNone, iNone, iNone, iNone }
42 }
43 template (value) RlcmacUlCtrlMsg ts_RlcMacUlCtrl_PKT_DL_ACK(uint5_t dl_tfi,
44 AckNackDescription andesc,
45 ChannelQualityReport qual_rep := c_ChQualRep_default) := {
46 msg_type := PACKET_DL_ACK_NACK,
47 u := {
48 dl_ack_nack := {
49 dl_tfi := dl_tfi,
50 ack_nack_desc := andesc,
51 chreq_desc_presence := '0'B,
52 chreq_desc := omit,
53 ch_qual_rep := qual_rep
54 }
55 }
56 }
57
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +020058 private function f_presence_bit_MSRadioAccessCapabilityV(template (omit) MSRadioAccessCapabilityV ms_rac) return BIT1 {
59 if (istemplatekind(ms_rac, "omit")) {
60 return '0'B;
61 }
62 return '1'B;
63 }
64
65 private function f_template_MSRadioAccessCapabilityV_to_MSRadioAccCap2(template (omit) MSRadioAccessCapabilityV ms_rac) return template (omit) MSRadioAccCap2 {
66 var template (omit) MSRadioAccCap2 ms_rac2 := omit;
67 if (istemplatekind(ms_rac, "omit")) {
68 return ms_rac2;
69 }
70 ms_rac2 := { msRadioAccessCapabilityV := ms_rac };
71 return ms_rac2;
72 }
73
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +020074 const ChannelReqDescription c_ChReqDesc_default := {
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +020075 peak_tput_class := 0,
76 priority := 0,
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +020077 rlc_mode := RLC_MODE_ACKNOWLEDGED,
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +020078 llc_pdu_type := LLC_PDU_IS_NOT_SACK_OR_ACK,
79 RlcOctetCount := 0
80 }
81
82 /* TS 44.060 sec 11.2.16 */
83 template (value) RlcmacUlCtrlMsg ts_RlcMacUlCtrl_PKT_RES_REQ(GprsTlli tlli,
84 template (omit) MSRadioAccessCapabilityV ms_rac,
85 ChannelReqDescription ch_req_desc := c_ChReqDesc_default,
86 RlcAccessType acc_type := RLC_ACC_TYPE_TWO_PHASE)
87 := {
88 msg_type := PACKET_RESOURCE_REQUEST,
89 u := {
90 resource_req := {
91 acc_type_presence := '1'B,
92 acc_type := acc_type,
93 id_type := '1'B,
94 id := { tlli := tlli },
95 ms_rac2_presence := f_presence_bit_MSRadioAccessCapabilityV(ms_rac),
96 ms_rac2 := f_template_MSRadioAccessCapabilityV_to_MSRadioAccCap2(ms_rac),
97 ch_req_desc := ch_req_desc,
98 change_mark_presence := '0'B,
99 change_mark := omit,
100 C_val := '000000'B,
101 sign_var_presence := '0'B,
102 sign_var := omit,
103 I_levels := {
104 iNone, iNone, iNone, iNone,
105 iNone, iNone, iNone, iNone
106 }
107 }
108 }
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +0200109 };
110
111 private function f_presence_bit_tfi(template uint5_t tfi) return BIT1 {
112 if (istemplatekind(tfi, "omit")) {
113 return '0'B;
114 }
115 return '1'B;
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +0200116 }
117
Pau Espin Pedrol45b664b2020-05-14 15:16:40 +0200118 template DynamicAllocation tr_DynamicAllocation(template uint5_t tfi:= ?) := {
119 extd_dyn_alloc := ?,
120 p0_present := ?,
121 p0 := *,
122 pr_mode := *,
123 usf_granularity := ?,
124 ul_tfi_ass_present := f_presence_bit_tfi(tfi),
125 ul_tfi_assignment := tfi,
126 reserved := '0'B,
127 tbf_starting_time_present := ?,
128 tbf_starting_time := *,
129 ts_allocation := ?
130 };
131
132 template PktUlAssGprs tr_PktUlAssGprsDynamic(template DynamicAllocation dyn_alloc := ?) := {
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +0200133 ch_coding_cmd := ?,
134 tlli_block_chan_coding := ?,
135 pkt_ta := ?,
136 freq_par_present := ?,
137 freq_par := *,
138 alloc_present := '01'B,
Pau Espin Pedrol45b664b2020-05-14 15:16:40 +0200139 dyn_block_alloc := dyn_alloc,
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +0200140 sgl_block_alloc := omit
141 };
142
Pau Espin Pedrol45b664b2020-05-14 15:16:40 +0200143 template PktUlAssEgprs tr_PktUlAssEgprsDynamic(template DynamicAllocation dyn_alloc := ?) := {
144 dual_carrier := '00'B,
145 tlli_present := ?,
146 tlli := *,
147 compact_reduced_ma_present := ?,
148 compact_reduced_ma := *,
149 chan_coding_cmd := ?,
150 resegment := ?,
151 window_size := ?,
152 ats_present := ?,
153 ats := *, /* ? */
154 arac_retrans_req := ?,
155 tlli_block_chan_coding := ?,
156 bep_period2_present := ?,
157 bep_period2 := *,
158 pkt_ta := ?,
159 pkt_ext_ta_present := ?,
160 pkt_ext_ta := *,
161 freq_par_present := ?,
162 freq_par := *,
163 alloc_present := ?,
164 dyn_block_alloc := dyn_alloc,
165 multi_block_alloc := omit
166 };
167
Pau Espin Pedrol630c1cf2020-07-08 13:34:53 +0200168 template AckNackDescription tr_AckNackDescription(template BIT1 final_ack := ?) := {
169 final_ack := final_ack,
170 starting_seq_nr := ?,
171 receive_block_bitmap := ?
172 };
173
174 template UlAckNackGprsAdditionsRel99 tr_UlAckNackGprsAdditionsRel99(template boolean tbf_est := ?) := {
175 ext_pkt_ta_present := ?,
176 ext_pkt_ta := *,
177 tbf_est := tbf_est
178 };
179
180 template UlAckNackGprs tr_UlAckNackGprs(template GprsTlli tlli := *,
181 template AckNackDescription acknack_desc := ?,
182 template UlAckNackGprsAdditionsRel99 rel99 := *) := {
Pau Espin Pedrol692222c2020-05-17 00:25:37 +0200183 ch_coding_cmd := ?,
Pau Espin Pedrol630c1cf2020-07-08 13:34:53 +0200184 ack_nack_desc := acknack_desc,
Pau Espin Pedrol692222c2020-05-17 00:25:37 +0200185 cont_res_tlli_present := ?,
186 cont_res_tlli := tlli,
187 pkt_ta_present := ?,
188 pkt_ta := *,
189 pwr_ctrl_present := ?,
Pau Espin Pedrol630c1cf2020-07-08 13:34:53 +0200190 pwr_ctrl := *,
191 extension_bits_present := ?,
192 extension_bits := *,
193 not_used := '0'B,
194 rel99_present := ?,
195 rel99 := rel99
Pau Espin Pedrol692222c2020-05-17 00:25:37 +0200196 };
197
198 template UlAckNackEgprs tr_UlAckNackEgprs(template GprsTlli tlli := *) := {
Pau Espin Pedrolf8fe2d22020-11-10 18:39:25 +0100199 msg_excape := '00'B,
Pau Espin Pedrol692222c2020-05-17 00:25:37 +0200200 ch_coding_cmd := ?,
201 resegment := ?,
202 preemptive_tx := ?,
203 prr_retrans_req := ?,
204 arac_retrans_req := ?,
205 cont_res_tlli_present := ?,
206 cont_res_tlli := tlli,
207 tbf_est := ?,
208 pkt_ta_present := ?,
209 pkt_ta := *,
210 pkt_ext_ta_present := ?,
211 pkt_ext_ta := *,
212 pwr_ctrl_present := ?,
213 pwr_ctrl := *
214 };
215
Pau Espin Pedrolafdd28d2020-11-12 21:02:18 +0100216 template EgprsAckNackDescriptionIE ts_EgprsAckNackDescriptionIE(template EgprsAckNackDescription andesc) := {
217 len_present := '1'B,
218 len := 0, /* Overwritten by RAW encoder */
219 acknack_desc := andesc
220 }
221
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +0200222} with { encode "RAW"; variant "FIELDORDER(msb)" variant "BYTEORDER(last)" };