blob: 9f53c3f387207bae94208cfd5c2ca6a3cb3b4539 [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
58 private function f_presence_bit_MultislotCap_GPRS(template (omit) MultislotCap_GPRS mscap_gprs) return BIT1 {
59 if (istemplatekind(mscap_gprs, "omit")) {
60 return '0'B;
61 }
62 return '1'B;
63 }
64 private function f_presence_bit_MultislotCap_EGPRS(template (omit) MultislotCap_EGPRS mscap_egprs) return BIT1 {
65 if (istemplatekind(mscap_egprs, "omit")) {
66 return '0'B;
67 }
68 return '1'B;
69 }
70 template (value) MSRACapabilityValuesRecord ts_RaCapRec(BIT4 att := '0001'B /* E-GSM */, template (omit) MultislotCap_GPRS mscap_gprs := omit, template (omit) MultislotCap_EGPRS mscap_egprs := omit) := {
71 mSRACapabilityValues := {
72 mSRACapabilityValuesExclude1111 := {
73 accessTechnType := att, /* E-GSM */
74 accessCapabilities := {
75 lengthIndicator := 0, /* overwritten */
76 accessCapabilities := {
77 rfPowerCapability := '001'B, /* FIXME */
78 presenceBitA5 := '0'B,
79 a5bits := omit,
80 esind := '1'B,
81 psbit := '0'B,
82 vgcs := '0'B,
83 vbs := '0'B,
84 presenceBitMultislot := '1'B,
85 multislotcap := {
86 presenceBitHscsd := '0'B,
87 hscsdmultislotclass := omit,
88 presenceBitGprs := f_presence_bit_MultislotCap_GPRS(mscap_gprs),
89 gprsmultislot := mscap_gprs,
90 presenceBitSms := '0'B,
91 multislotCap_SMS := omit,
92 multislotCapAdditionsAfterRel97 := {
93 presenceBitEcsdmulti := '0'B,
94 ecsdmultislotclass := omit,
95 presenceBitEgprsmulti := f_presence_bit_MultislotCap_EGPRS(mscap_egprs),
96 multislotCap_EGPRS := mscap_egprs,
97 presenceBitDtmGprsmulti := '0'B,
98 multislotCapdtmgprsmultislotsubclass := omit
99 }
100 },
101 accessCapAdditionsAfterRel97 := omit
102 },
103 spare_bits := omit
104 }
105 }
106 },
107 presenceBitMSRACap := '0'B
108 };
109
110 private function f_presence_bit_MSRadioAccessCapabilityV(template (omit) MSRadioAccessCapabilityV ms_rac) return BIT1 {
111 if (istemplatekind(ms_rac, "omit")) {
112 return '0'B;
113 }
114 return '1'B;
115 }
116
117 private function f_template_MSRadioAccessCapabilityV_to_MSRadioAccCap2(template (omit) MSRadioAccessCapabilityV ms_rac) return template (omit) MSRadioAccCap2 {
118 var template (omit) MSRadioAccCap2 ms_rac2 := omit;
119 if (istemplatekind(ms_rac, "omit")) {
120 return ms_rac2;
121 }
122 ms_rac2 := { msRadioAccessCapabilityV := ms_rac };
123 return ms_rac2;
124 }
125
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +0200126 const ChannelReqDescription c_ChReqDesc_default := {
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +0200127 peak_tput_class := 0,
128 priority := 0,
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +0200129 rlc_mode := RLC_MODE_ACKNOWLEDGED,
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +0200130 llc_pdu_type := LLC_PDU_IS_NOT_SACK_OR_ACK,
131 RlcOctetCount := 0
132 }
133
134 /* TS 44.060 sec 11.2.16 */
135 template (value) RlcmacUlCtrlMsg ts_RlcMacUlCtrl_PKT_RES_REQ(GprsTlli tlli,
136 template (omit) MSRadioAccessCapabilityV ms_rac,
137 ChannelReqDescription ch_req_desc := c_ChReqDesc_default,
138 RlcAccessType acc_type := RLC_ACC_TYPE_TWO_PHASE)
139 := {
140 msg_type := PACKET_RESOURCE_REQUEST,
141 u := {
142 resource_req := {
143 acc_type_presence := '1'B,
144 acc_type := acc_type,
145 id_type := '1'B,
146 id := { tlli := tlli },
147 ms_rac2_presence := f_presence_bit_MSRadioAccessCapabilityV(ms_rac),
148 ms_rac2 := f_template_MSRadioAccessCapabilityV_to_MSRadioAccCap2(ms_rac),
149 ch_req_desc := ch_req_desc,
150 change_mark_presence := '0'B,
151 change_mark := omit,
152 C_val := '000000'B,
153 sign_var_presence := '0'B,
154 sign_var := omit,
155 I_levels := {
156 iNone, iNone, iNone, iNone,
157 iNone, iNone, iNone, iNone
158 }
159 }
160 }
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +0200161 };
162
163 private function f_presence_bit_tfi(template uint5_t tfi) return BIT1 {
164 if (istemplatekind(tfi, "omit")) {
165 return '0'B;
166 }
167 return '1'B;
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +0200168 }
169
Pau Espin Pedrol45b664b2020-05-14 15:16:40 +0200170 template DynamicAllocation tr_DynamicAllocation(template uint5_t tfi:= ?) := {
171 extd_dyn_alloc := ?,
172 p0_present := ?,
173 p0 := *,
174 pr_mode := *,
175 usf_granularity := ?,
176 ul_tfi_ass_present := f_presence_bit_tfi(tfi),
177 ul_tfi_assignment := tfi,
178 reserved := '0'B,
179 tbf_starting_time_present := ?,
180 tbf_starting_time := *,
181 ts_allocation := ?
182 };
183
184 template PktUlAssGprs tr_PktUlAssGprsDynamic(template DynamicAllocation dyn_alloc := ?) := {
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +0200185 ch_coding_cmd := ?,
186 tlli_block_chan_coding := ?,
187 pkt_ta := ?,
188 freq_par_present := ?,
189 freq_par := *,
190 alloc_present := '01'B,
Pau Espin Pedrol45b664b2020-05-14 15:16:40 +0200191 dyn_block_alloc := dyn_alloc,
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +0200192 sgl_block_alloc := omit
193 };
194
Pau Espin Pedrol45b664b2020-05-14 15:16:40 +0200195 template PktUlAssEgprs tr_PktUlAssEgprsDynamic(template DynamicAllocation dyn_alloc := ?) := {
196 dual_carrier := '00'B,
197 tlli_present := ?,
198 tlli := *,
199 compact_reduced_ma_present := ?,
200 compact_reduced_ma := *,
201 chan_coding_cmd := ?,
202 resegment := ?,
203 window_size := ?,
204 ats_present := ?,
205 ats := *, /* ? */
206 arac_retrans_req := ?,
207 tlli_block_chan_coding := ?,
208 bep_period2_present := ?,
209 bep_period2 := *,
210 pkt_ta := ?,
211 pkt_ext_ta_present := ?,
212 pkt_ext_ta := *,
213 freq_par_present := ?,
214 freq_par := *,
215 alloc_present := ?,
216 dyn_block_alloc := dyn_alloc,
217 multi_block_alloc := omit
218 };
219
Pau Espin Pedrol692222c2020-05-17 00:25:37 +0200220 template UlAckNackGprs tr_UlAckNackGprs(template GprsTlli tlli := *) := {
221 ch_coding_cmd := ?,
222 ack_nack_desc := ?,
223 cont_res_tlli_present := ?,
224 cont_res_tlli := tlli,
225 pkt_ta_present := ?,
226 pkt_ta := *,
227 pwr_ctrl_present := ?,
228 pwr_ctrl := *
229 };
230
231 template UlAckNackEgprs tr_UlAckNackEgprs(template GprsTlli tlli := *) := {
232 ch_coding_cmd := ?,
233 resegment := ?,
234 preemptive_tx := ?,
235 prr_retrans_req := ?,
236 arac_retrans_req := ?,
237 cont_res_tlli_present := ?,
238 cont_res_tlli := tlli,
239 tbf_est := ?,
240 pkt_ta_present := ?,
241 pkt_ta := *,
242 pkt_ext_ta_present := ?,
243 pkt_ext_ta := *,
244 pwr_ctrl_present := ?,
245 pwr_ctrl := *
246 };
247
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +0200248} with { encode "RAW"; variant "FIELDORDER(msb)" variant "BYTEORDER(last)" };