blob: a0d834981f842dc6f6e5cdaf82c25b4b30b5a093 [file] [log] [blame]
Harald Welte9419c8a2017-07-30 04:07:05 +02001/* Encoding/Decoding routines for GSM System Information messages
Harald Welte34b5a952019-05-27 11:54:11 +02002 * according to 3GPP TS 44.018 Version 12.3.0 Release 12
3 *
4 * (C) 2017-2019 Harald Welte <laforge@gnumonks.org>
5 * All rights reserved.
6 *
7 * Released under the terms of GNU General Public License, Version 2 or
8 * (at your option) any later version.
9 *
10 * SPDX-License-Identifier: GPL-2.0-or-later
11 */
Harald Welte9419c8a2017-07-30 04:07:05 +020012
13module GSM_RR_Types {
14
15 import from General_Types all;
16 import from Osmocom_Types all;
17 import from GSM_Types all;
18 import from RLCMAC_CSN1_Types all;
Vadim Yanitskiy98bb2d52020-03-28 00:57:21 +070019 import from MobileL3_CommonIE_Types all;
Harald Welte9419c8a2017-07-30 04:07:05 +020020
21 /* Table 10.4.1 of Section 10.4 / 3GPP TS 44.018 */
22 type enumerated RrMessageType {
23 ADDITIONAL_ASSIGNMENT ('00111011'B),
24 IMMEDIATE_ASSIGNMENT ('00111111'B),
25 IMMEDIATE_ASSIGNMENT_EXTENDED ('00111001'B),
26 IMMEDIATE_ASSIGNMENT_REJECT ('00111010'B),
27 IMMEDIATE_PACKET_ASSIGNMENT ('01101001'B),
28
29 CIPHERING_MODE_COMMAND ('00110101'B),
30 CIPHERING_MODE_COMPLETE ('00110010'B),
31
32 CONFIGURATION_CHANGE_COMMAND ('00110000'B),
33 CONFIGURATION_CHANGE_ACK ('00110001'B),
34 CONFIGURATION_CHANGE_REJECT ('00110011'B),
35
36 ASSIGNMENT_COMMAND ('00101110'B),
37 ASSIGNMENT_COMPLETE ('00101001'B),
38 ASSIGNMENT_FAILURE ('00101111'B),
39 HANDOVER_COMMAND ('00101011'B),
40 HANDOVER_COMPLETE ('00101100'B),
41 HANDOVER_FAILURE ('00101000'B),
42 PHYSICAL_INFORMATION ('00101101'B),
43
44 CHANNEL_RELEASE ('00001101'B),
45 PARTIAL_RELEASE ('00001010'B),
46 PARTIAL_RELEASE_COMPLETE ('00001111'B),
47
48 PAGING_REQUEST_TYPE_1 ('00100001'B),
49 PAGING_REQUEST_TYPE_2 ('00100010'B),
50 PAGING_REQUEST_TYPE_3 ('00100100'B),
51 PAGING_RESPONSE ('00100111'B),
52 NOTIFICATION_NCH ('00100000'B),
53 NOTIFICATION_RESPOSNE ('00100110'B),
54
55 SYSTEM_INFORMATION_TYPE_8 ('00011000'B),
56 SYSTEM_INFORMATION_TYPE_1 ('00011001'B),
57 SYSTEM_INFORMATION_TYPE_2 ('00011010'B),
58 SYSTEM_INFORMATION_TYPE_3 ('00011011'B),
59 SYSTEM_INFORMATION_TYPE_4 ('00011100'B),
60 SYSTEM_INFORMATION_TYPE_5 ('00011101'B),
61 SYSTEM_INFORMATION_TYPE_6 ('00011110'B),
62 SYSTEM_INFORMATION_TYPE_7 ('00011111'B),
63 SYSTEM_INFORMATION_TYPE_2bis ('00000010'B),
64 SYSTEM_INFORMATION_TYPE_2ter ('00000011'B),
65 SYSTEM_INFORMATION_TYPE_2quater ('00000111'B),
66 SYSTEM_INFORMATION_TYPE_5bis ('00000101'B),
67 SYSTEM_INFORMATION_TYPE_5ter ('00000110'B),
68 SYSTEM_INFORMATION_TYPE_9 ('00000100'B),
69 SYSTEM_INFORMATION_TYPE_13 ('00000000'B),
70
71 SYSTEM_INFORMATION_TYPE_16 ('00111101'B),
72 SYSTEM_INFORMATION_TYPE_17 ('00111110'B),
73
74 CHANNEL_MODE_MODIFY ('00010000'B),
75 RR_STATUS ('00010010'B),
76 CHANNEL_MODE_MODIFY_ACKNOWLEDGE ('00010111'B),
77 FREQUENCY_REDEFINITION ('00010100'B),
78 MEASUREMENT_REPORT ('00010101'B),
79 CLASSMARK_CHANGE ('00010110'B),
80 CLASSMARK_ENQUIRY ('00010011'B),
81 EXTENDED_MEASUREMENT_REPORT ('00110110'B),
82 EXTENDED_MEASUREMENT_ORDER ('00110111'B),
83 GPRS_SUSPENSION_REQUEST ('00110100'B),
84 //MBMS_ANNOUNCEMENT ('00010110'B), duplicate?
85 //SERVICE_INFORMATION ('00110110'B), duplicate?
86
87 APPLICATION_INFORMATION ('00111000'B),
88
89 SYSTEM_INFORMATION_TYPE_14 ('00000001'B),
90 SYSTEM_INFORMATION_TYPE_15 ('01000011'B),
91 SYSTEM_INFORMATION_TYPE_18 ('01000000'B),
92 SYSTEM_INFORMATION_TYPE_19 ('01000001'B),
93 SYSTEM_INFORMATION_TYPE_20 ('01000010'B),
94 SYSTEM_INFORMATION_TYPE_13alt ('01000100'B),
95 SYSTEM_INFORMATION_TYPE_2n ('01000101'B),
96 SYSTEM_INFORMATION_TYPE_21 ('01000110'B),
97 SYSTEM_INFORMATION_TYPE_22 ('01000111'B),
98 SYSTEM_INFORMATION_TYPE_23 ('01001111'B),
99
100 DTM_ASSIGNMENT_FAILURE ('01001000'B),
101 DTM_REJECT ('01001001'B),
102 DTM_REQUEST ('01001010'B),
103 PACKET_ASSIGNMENT ('01001011'B),
104 DTM_ASSIGNMENT_COMMAND ('01001100'B),
105 DTM_INFORMATION ('01001101'B),
106 PACKET_INFORMATION ('01001110'B),
107
108 UTRAN_CLASSMARK_CHANGE ('01100000'B),
109 CDMA2000_CLASSMARK_CHANGE ('01100010'B),
110 INTERSYS_TO_UTRAN_HO_CMD ('01100011'B),
111 INTERSYS_TO_CDMA2000_HO_CMD ('01100100'B),
112 GERAN_IU_MODE_CLASSMARK_CHG ('01100101'B),
113 INTERSYS_TO_EUTRAN_HO_CMD ('01100110'B)
114 } with { variant "FIELDLENGTH(8)" };
115
116 type octetstring RestOctets with { variant "PADDING(yes), PADDING_PATTERN('00101011'B)" };
117 type hexstring GsmBcdString with { variant "HEXORDER(low)" };
118 type GsmBcdString BcdMccMnc with { variant "FIELDLENGTH(6)" };
119
120 type record L2PseudoLength {
121 uint6_t l2_plen,
122 BIT2 zero_one
123 } with { variant "" };
124
Harald Weltef8df4cb2018-03-10 15:15:08 +0100125 template L2PseudoLength tr_L2Pseudolength(template uint6_t len) := {
126 l2_plen := len,
127 zero_one := '01'B
128 };
129
130 template (value) L2PseudoLength ts_L2Pseudolength(uint6_t len) := {
Harald Welte9419c8a2017-07-30 04:07:05 +0200131 l2_plen := len,
132 zero_one := '01'B
133 };
134
135 type record RrHeader {
136 L2PseudoLength l2_plen,
137 uint4_t skip_indicator,
138 uint4_t rr_protocol_discriminator,
139 RrMessageType message_type
140 } with { variant "" };
141
142 template RrHeader t_RrHeader(RrMessageType msg_type, template uint6_t len) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100143 l2_plen := tr_L2Pseudolength(len),
Harald Welte9419c8a2017-07-30 04:07:05 +0200144 skip_indicator := 0,
145 rr_protocol_discriminator := 6,
146 message_type := msg_type
147 };
148
Harald Weltef8df4cb2018-03-10 15:15:08 +0100149 template (value) RrHeader ts_RrHeader(RrMessageType msg_type, uint6_t len) := {
150 l2_plen := ts_L2Pseudolength(len),
151 skip_indicator := 0,
152 rr_protocol_discriminator := 6,
153 message_type := msg_type
154 };
155
156
Harald Welte9419c8a2017-07-30 04:07:05 +0200157 type record RrL3Header {
158 uint4_t skip_indicator,
159 uint4_t rr_protocol_discriminator,
160 RrMessageType message_type
161 } with { variant "" };
162
Harald Weltecbc947f2018-02-22 00:26:55 +0100163 template RrL3Header t_RrL3Header(RrMessageType msg_type) := {
164 skip_indicator := 0,
165 rr_protocol_discriminator := 6,
166 message_type := msg_type
167 }
168
Pau Espin Pedrol0aad5962018-09-28 16:03:55 +0200169 /* TS 44.004 7.2.1 */
170 type record SacchL1Header {
171 uint2_t reserved,
172 boolean fpc,
173 uint5_t ms_power_lvl,
174 uint8_t actual_ta
175 } with { variant "FIELDORDER(msb)" };
176
177 template (value) SacchL1Header ts_SacchL1Header(uint5_t ms_power_lvl, boolean fpc, uint8_t actual_ta) := {
178 reserved := 0,
179 fpc := fpc,
180 ms_power_lvl := ms_power_lvl,
181 actual_ta := actual_ta
182 };
183
Harald Welte9419c8a2017-07-30 04:07:05 +0200184 type record MaioHsn {
Vadim Yanitskiyff0072c2020-05-27 01:35:39 +0700185 uint6_t maio,
186 uint6_t hsn
Harald Welte9419c8a2017-07-30 04:07:05 +0200187 } with { variant "" };
188
Vadim Yanitskiy5bcd9192020-07-06 20:18:11 +0700189 /* It's more handy to pass HSN first, so the arguments' order is reversed. */
190 template (value) MaioHsn ts_HsnMaio(template (value) uint6_t hsn,
191 template (value) uint6_t maio) := {
192 maio := maio,
193 hsn := hsn
194 };
195 template MaioHsn tr_HsnMaio(template (present) uint6_t hsn,
196 template (present) uint6_t maio) := {
197 maio := maio,
198 hsn := hsn
199 };
200
Harald Welte9419c8a2017-07-30 04:07:05 +0200201 /* TS 24.008 10.5.1.1 */
202 type uint16_t CellIdentity;
203
204 /* TS 24.008 10.5.1.2 */
205 type uint4_t CipheringKeySeqNr (0..7);
206
207 /* 24.008 10.5.1.3 */
208 type record LocationAreaIdentification {
209 BcdMccMnc mcc_mnc,
210 uint16_t lac
Vadim Yanitskiye05d7162020-05-02 16:58:46 +0700211 } with { variant "" };
Harald Welte9419c8a2017-07-30 04:07:05 +0200212
213 /* TS 24.008 10.5.1.4 */
214 type enumerated MobileIdentityType {
215 MI_TYPE_NONE (0),
216 MI_TYPE_IMSI,
217 MI_TYPE_IMEI,
218 MI_TYPE_IMEISV,
219 MI_TYPE_TMSI,
220 MI_TYPE_TMGI
221 } with { variant "FIELDLENGTH(3)" };
222
Harald Welte9419c8a2017-07-30 04:07:05 +0200223 /* TS 24.008 10.5.1.5 */
224 type record MsClassmark1 {
225 BIT1 spare,
226 uint2_t rev_level,
227 boolean es_ind,
228 boolean a51,
229 uint3_t rf_pwr_cap
230 } with { variant "" };
231
232 /* TS 24.008 10.5.1.6 */
233 type record MsClassmark2 {
234 BIT1 spare,
235 uint2_t rev_level,
236 boolean es_ind,
237 boolean a51,
238 uint3_t rf_pwr_cap,
239 BIT1 spare1,
240 boolean ps_cap,
241 uint2_t ss_screen_ind,
242 boolean sm_cap,
243 boolean vbs,
244 boolean vgcs,
245 boolean fc,
246 boolean cm3,
247 BIT1 spare2,
248 boolean lcsva_cap,
249 boolean ucs2,
250 boolean solsa,
251 boolean cmsp,
252 boolean a53,
253 boolean a52
254 } with { variant "" };
255 type record MsClassmark2LV {
256 uint8_t len,
257 MsClassmark2 cm2
258 } with { variant (len) "LENGTHTO(cm2)" };
259
260
261 /* 44.018 10.5.2.5 */
262 type record ChannelDescription {
263 RslChannelNr chan_nr,
264 uint3_t tsc,
265 boolean h,
266 uint12_t arfcn optional,
267 MaioHsn maio_hsn optional
268 } with { variant (arfcn) "PRESENCE(h = false)"
269 variant (maio_hsn) "PRESENCE(h = true)" };
270
271 type record ChannelDescriptionTV {
272 OCT1 iei,
273 ChannelDescription v
274 } with { variant "" };
275
276 /* 10.5.2.21 */
277 type record MobileAllocation {
278 uint8_t len,
279 bitstring ma
Vadim Yanitskiy3ddb3ab2020-07-20 04:29:53 +0700280 } with {
281 variant (len) "LENGTHTO(ma)"
282 variant (ma) "BYTEORDER(last), BITORDER(msb)"
283 };
Harald Welte9419c8a2017-07-30 04:07:05 +0200284
285 /* 10.5.2.25a */
Harald Welte1b9b7702017-07-30 04:19:14 +0200286 type record PktChDesc0Ind {
287 uint6_t maio,
288 BIT1 ma_number_ind,
289 BIT1 change_mark1_valid,
290 BIT2 change_mark1
291 } with { variant "" };
292 type record PktChDesc0 {
293 BIT1 hopping,
294 BIT1 spare ('0'B),
295 uint10_t arfcn optional,
296 PktChDesc0Ind indirect optional
297 } with {
298 variant (arfcn) "PRESENCE(hopping = '0'B)"
299 variant (indirect) "PRESENCE(hopping = '1'B)"
300 };
301 type record PktChDesc1 {
302 uint6_t maio,
303 uint6_t hsn
304 } with { variant "" };
305 type record PacketChannelDescription {
306 uint5_t channel_Type_spare,
307 uint3_t tn,
308 uint3_t tsc,
309 BIT1 presence,
310 PktChDesc0 zero optional,
311 PktChDesc1 one optional
312 } with {
313 variant (zero) "PRESENCE(presence = '0'B)"
314 variant (one) "PRESENCE(presence = '1'B)"
315 };
Harald Welte9419c8a2017-07-30 04:07:05 +0200316
317 /* 10.5.2.25b */
318 type record DedicatedModeOrTbf {
319 BIT1 spare,
320 boolean tma,
321 boolean downlink,
322 boolean tbf
323 } with { variant "" };
324
325 /* 10.5.2.26 */
326 type enumerated PageMode {
327 PAGE_MODE_NORMAL,
328 PAGE_MODE_EXTENDED,
329 PAGE_MODE_REORGANIZATION,
330 PAGE_MODE_SAME_AS_BEFORE
331 } with { variant "FIELDLENGTH(4)" };
332
333 /* 10.5.2.30 */
334 type record RequestReference {
335 bitstring ra length(8),
336 uint5_t t1p,
337 uint6_t t3,
338 uint5_t t2
339 } with { variant "" };
340
341 template RequestReference t_RequestReference(template bitstring ra, template uint5_t t1p, template uint6_t t3, template uint5_t t2) := {
342 ra := ra,
343 t1p := t1p,
344 t3 := t3,
345 t2 := t2
346 }
347
348 /* compute the expected request reference for given RA + FN */
349 function f_compute_ReqRef(uint8_t ra, GsmFrameNumber fn) return RequestReference {
350 var RequestReference req_ref := { ra := int2bit(ra, 8) };
351 req_ref.t1p := (fn / 1326) mod 32;
352 req_ref.t2 := fn mod 26;
353 req_ref.t3 := fn mod 51;
354 return req_ref
355 }
Harald Weltee8d750e2018-06-10 21:41:35 +0200356 function tr_compute_ReqRef(template uint8_t ra, template GsmFrameNumber fn)
357 return template RequestReference {
358 var template RequestReference req_ref;
359 if (istemplatekind(ra, "?")) {
360 req_ref.ra := ?;
361 } else {
362 req_ref.ra := int2bit(valueof(ra), 8);
363 }
364 if (istemplatekind(fn, "?")) {
365 req_ref.t1p := ?;
366 req_ref.t2 := ?;
367 req_ref.t3 := ?;
368 } else {
369 var GsmFrameNumber fn_v := valueof(fn);
370 req_ref.t1p := (fn_v / 1326) mod 32;
371 req_ref.t2 := fn_v mod 26;
372 req_ref.t3 := fn_v mod 51;
373 }
374 return req_ref;
375 }
Harald Welte9419c8a2017-07-30 04:07:05 +0200376
377 /* 10.5.2.40 */
378 type integer TimingAdvance (0..219);
379
380 /* 10.5.2.43 */
381 type uint8_t WaitIndication;
382
383 /* 10.5.2.76 */
384 type record FeatureIndicator {
Vadim Yanitskiyc3cebd32020-05-22 02:43:22 +0700385 BIT2 peo_bcch_change_mark,
386 boolean cs_ir,
387 boolean ps_ir
388 } with {
389 variant (cs_ir) "FIELDLENGTH(1)"
390 variant (ps_ir) "FIELDLENGTH(1)"
391 };
Harald Welte9419c8a2017-07-30 04:07:05 +0200392
393 /* 24.008 10.5.5.6 */
394 type record DrxParameter {
395 uint8_t split_pg_cycle_code,
396 uint4_t drx_cycle_len_coeff,
397 boolean split_on_ccch,
398 uint3_t non_drx_timer
399 } with { variant "" };
400
401 /* 24.008 10.5.5.15 */
402 type record RoutingAreaIdentification {
403 LocationAreaIdentification lai,
404 uint8_t rac
405 } with { variant "" };
406
Harald Welteb16516c2019-03-21 21:31:41 +0100407 external function enc_RoutingAreaIdentification(RoutingAreaIdentification rai) return octetstring
408 with { extension "prototype(convert)" extension "encode(RAW)" }
409
Harald Welte9419c8a2017-07-30 04:07:05 +0200410 /* 44.018 10.5.2.16 */
411 type record IaRestOctHL {
412 uint6_t freq_par_len,
413 BIT2 padding ('00'B) optional,
414 uint6_t maio optional,
415 octetstring mobile_allocation optional
416 } with {
417 variant (freq_par_len) "LENGTHTO(mobile_allocation,maio,padding)"
418/*
419 variant (padding) "PRESENCE(freq_par_len != 0)"
420 variant (maio) "PRESENCE(freq_par_len != 0)"
421 variant (mobile_allocation) "PRESENCE(freq_par_len != 0)"
422*/
423 };
Vadim Yanitskiy7091e8d2019-09-09 01:07:37 +0200424 type record SecondPartAssign {
Vadim Yanitskiyb021ed42020-04-27 23:25:13 +0700425 BIT1 r99, /* L / H */
Vadim Yanitskiy7091e8d2019-09-09 01:07:37 +0200426 BIT1 presence optional,
427 BIT5 ext_ra optional
Harald Welte9419c8a2017-07-30 04:07:05 +0200428 } with {
Vadim Yanitskiyb021ed42020-04-27 23:25:13 +0700429 variant (r99) "CSN.1 L/H"
Vadim Yanitskiy7091e8d2019-09-09 01:07:37 +0200430 variant (presence) "PRESENCE(r99 = '1'B)" /* H */
431 variant (ext_ra) "PRESENCE(presence = '1'B)"
Vadim Yanitskiye05d7162020-05-02 16:58:46 +0700432 /* See https://bugs.eclipse.org/bugs/show_bug.cgi?id=562488 */
433 variant (ext_ra) "BYTEORDER(last)" // FIXME: should be first
Vadim Yanitskiy7091e8d2019-09-09 01:07:37 +0200434 };
435 type union PacketUlDlAssignUnion {
436 PacketUlAssign ul,
437 PacketDlAssign dl
438 };
439 type record PacketUlDlAssign {
440 BIT1 ass_disc,
441 PacketUlDlAssignUnion ass
442 } with {
443 variant (ass) "CROSSTAG(dl, ass_disc = '1'B; ul, ass_disc = '0'B)"
444 };
445 type union PacketAssignUnion {
446 SecondPartAssign spa,
447 PacketUlDlAssign uldl
448 };
449 type record IaRestOctHH {
450 /* Packet Assignment discriminator:
451 * Packet Uplink / Downlink Assignment (0)
452 * Second Part Packet Assignment (1) */
453 BIT1 pa_disc,
454 PacketAssignUnion pa
455 } with {
456 variant (pa) "CROSSTAG(spa, pa_disc = '1'B; uldl, pa_disc = '0'B)"
Harald Welte9419c8a2017-07-30 04:07:05 +0200457 };
458 type record PacketUlAssignDyn {
459 uint5_t tfi_assignment,
460 BIT1 polling,
461 BIT1 spare ('0'B),
462 uint3_t usf,
463 BIT1 usf_granularity,
464 BIT1 p0_present,
465 uint4_t p0 optional,
466 BIT1 pr_mode optional,
467 ChCodingCommand ch_coding_cmd,
468 BIT1 tlli_block_chan_coding,
469 BIT1 alpha_present,
470 uint4_t alpha optional,
471 uint5_t gamma,
472 BIT1 ta_index_present,
473 uint4_t ta_index optional,
474 BIT1 tbf_starting_time_present,
475 uint16_t tbf_starting_time optional
476 } with {
477 variant (p0) "PRESENCE(p0_present = '1'B)"
478 variant (pr_mode) "PRESENCE(p0_present = '1'B)"
479 variant (alpha) "PRESENCE(alpha_present = '1'B)"
480 variant (ta_index) "PRESENCE(ta_index_present = '1'B)"
481 variant (tbf_starting_time) "PRESENCE(tbf_starting_time_present = '1'B)"
482 };
483 type record PacketUlAssignSgl {
484 BIT1 alpha_present,
485 uint4_t alpha optional,
486 uint5_t gamma,
487 BIT2 padding ('01'B),
488 uint16_t tbf_starting_time
489 /* TODO: P0 / PR_MODE */
490 } with {
491 variant (alpha) "PRESENCE(alpha_present = '1'B)"
492 };
493 type record PacketUlAssign {
494 BIT1 presence,
495 PacketUlAssignDyn dynamic optional,
496 PacketUlAssignSgl single optional
497 /* TODO: Estended RA, PFI */
498 } with {
499 variant (dynamic) "PRESENCE(presence = '1'B)"
500 variant (single) "PRESENCE(presence = '0'B)"
501 };
502 type record PacketDlAssG1 {
503 uint5_t tfi_assignment,
504 BIT1 rlc_mode,
505 BIT1 alpha_present,
506 uint4_t alpha optional,
507 uint5_t gamma,
508 BIT1 polling,
509 BIT1 ta_valid
510 } with { variant "" };
511 type record PacketDlAssign {
512 GprsTlli tlli,
513 BIT1 group1_present,
514 PacketDlAssG1 group1 optional,
515 BIT1 ta_index_present,
516 uint4_t ta_index optional,
517 BIT1 tbf_starting_time_present,
518 uint16_t tbf_starting_time optional,
519 BIT1 p0_present,
520 uint4_t p0 optional,
521 BIT1 pr_mode optional
522 /* TODO: EGPRS window size, etc. */
523 } with {
524 variant (group1) "PRESENCE(group1_present = '1'B)"
525 variant (ta_index) "PRESENCE(ta_index_present = '1'B)"
526 variant (tbf_starting_time) "PRESENCE(tbf_starting_time_present = '1'B)"
527 variant (p0) "PRESENCE(p0_present = '1'B)"
528 variant (pr_mode) "PRESENCE(p0_present = '1'B)"
529 };
530 type record IaRestOctLL {
531 BIT1 compressed_irat_ho_info_ind
Vadim Yanitskiyb021ed42020-04-27 23:25:13 +0700532 } with {
533 variant (compressed_irat_ho_info_ind) "CSN.1 L/H"
534 };
Pau Espin Pedrol461ed612019-12-30 20:18:34 +0100535 type record EgprsUlAssignDyn {
536 uint5_t tfi_assignment,
537 BIT1 polling,
538 BIT1 spare ('0'B),
539 uint3_t usf,
540 BIT1 usf_granularity,
541 BIT1 p0_present,
542 uint4_t p0 optional,
543 BIT1 pr_mode optional,
544 EgprsChCodingCommand egprs_ch_coding_cmd,
545 BIT1 tlli_block_chan_coding,
546 BIT1 bep_period2_present,
547 BIT4 bep_period2 optional,
548 BIT1 resegment,
549 EgprsWindowSize egprs_window_size,
550 BIT1 alpha_present,
551 uint4_t alpha optional,
552 uint5_t gamma,
553 BIT1 ta_index_present,
554 uint4_t ta_index optional,
555 BIT1 tbf_starting_time_present,
556 uint16_t tbf_starting_time optional
557 /* TODO: Additions for Rel-7 */
558 } with {
559 variant (p0) "PRESENCE(p0_present = '1'B)"
560 variant (pr_mode) "PRESENCE(p0_present = '1'B)"
561 variant (bep_period2) "PRESENCE(bep_period2_present = '1'B)"
562 variant (alpha) "PRESENCE(alpha_present = '1'B)"
563 variant (ta_index) "PRESENCE(ta_index_present = '1'B)"
564 variant (tbf_starting_time) "PRESENCE(tbf_starting_time_present = '1'B)"
565 };
566 type record EgprsUlAssignMultiblock {
567 BIT1 alpha_present,
568 uint4_t alpha optional,
569 uint5_t gamma,
570 uint16_t tbf_starting_time,
571 BIT2 nr_radio_blocks_allocated,
572 BIT1 p0_present,
573 uint4_t p0 optional,
574 BIT1 spare ('0'B) optional,
575 BIT1 pr_mode optional
576 /* TDO: Additions for Rel-6 */
577 } with {
578 variant (alpha) "PRESENCE(alpha_present = '1'B)"
579 variant (p0) "PRESENCE(p0_present = '1'B)"
580 variant (spare) "PRESENCE(p0_present = '1'B)"
581 variant (pr_mode) "PRESENCE(p0_present = '1'B)"
582 };
583 /* 3GPP TS 44.018 version 13.3.2 10.5.2.16, "EGPRS Packet Uplink Assignment" */
584 type record EgprsUlAss {
585 BIT5 ext_ra,
586 BIT1 ats_present,
587 AccessTechnologiesRequestRepetition ats optional,
588 BIT1 presence,
589 EgprsUlAssignDyn dynamic optional,
590 EgprsUlAssignMultiblock multiblock optional
591 } with {
592 variant (ats) "PRESENCE(ats_present = '1'B)"
593 variant (dynamic) "PRESENCE(presence = '1'B)"
594 variant (multiblock) "PRESENCE(presence = '0'B)"
Vadim Yanitskiye05d7162020-05-02 16:58:46 +0700595 /* See https://bugs.eclipse.org/bugs/show_bug.cgi?id=562488 */
596 variant (ext_ra) "BYTEORDER(last)" // FIXME: should be first
Pau Espin Pedrol461ed612019-12-30 20:18:34 +0100597 };
598
Harald Welte9419c8a2017-07-30 04:07:05 +0200599 type octetstring MblkDlAss; /* TODO */
600 type record IaRestOctLH {
601 BIT2 presence,
602 EgprsUlAss egprs_ul optional,
603 MblkDlAss multiblock_dl_ass optional
604 } with {
605 variant (egprs_ul) "PRESENCE(presence = '00'B)"
606 variant (multiblock_dl_ass) "PRESENCE(presence = '01'B)"
607 };
608 type record IaRestOctets {
609 BIT2 presence,
610 IaRestOctLL ll optional,
611 IaRestOctLH lh optional,
612 IaRestOctHL hl optional,
Vadim Yanitskiy9b2a3e82019-09-08 15:37:15 +0200613 IaRestOctHH hh optional
Harald Welte9419c8a2017-07-30 04:07:05 +0200614 } with {
Vadim Yanitskiyb021ed42020-04-27 23:25:13 +0700615 variant (presence) "CSN.1 L/H"
Harald Welte9419c8a2017-07-30 04:07:05 +0200616 variant (ll) "PRESENCE(presence = '00'B)"
617 variant (lh) "PRESENCE(presence = '01'B)"
618 variant (hl) "PRESENCE(presence = '10'B)"
619 variant (hh) "PRESENCE(presence = '11'B)"
Vadim Yanitskiy9b2a3e82019-09-08 15:37:15 +0200620 variant "PADDING(yes), PADDING_PATTERN('00101011'B)"
Harald Welte9419c8a2017-07-30 04:07:05 +0200621 };
622
Harald Weltecbc947f2018-02-22 00:26:55 +0100623 type record MeasurementResults {
624 BIT1 ba_used,
625 BIT1 dtx_used,
626 uint6_t rxlev_full_srv_cell,
627 BIT1 threeg_ba_used,
628 BIT1 meas_valid,
629 uint6_t rxlev_sub_srv_cell,
630 BIT1 si23_ba_used,
631 uint3_t rxqual_full_srv_cell,
632 uint3_t rxqual_sub_srv_cell,
633 uint3_t no_ncell_m,
634 NcellReports ncell_reports optional
635 } with { variant (no_ncell_m) "LENGTHTO(ncell_reports)"
636 variant (no_ncell_m) "UNIT(elements)"
637 variant "PADDING(yes)"
638 variant "FIELDLENGTH(16)"
639 };
640
641 type record NcellReport {
642 uint6_t rxlev,
643 uint5_t bcch_freq,
644 uint6_t bsic
645 } with { variant ""};
646 type record of NcellReport NcellReports;
647
Harald Welte9419c8a2017-07-30 04:07:05 +0200648
649 /* 9.1.18 */
650 type record ImmediateAssignment {
651 DedicatedModeOrTbf ded_or_tbf,
652 PageMode page_mode,
653 ChannelDescription chan_desc optional,
654 PacketChannelDescription pkt_chan_desc optional,
655 RequestReference req_ref,
656 TimingAdvance timing_advance,
657 MobileAllocation mobile_allocation,
658 /* TODO: starting time TLV */
Vadim Yanitskiyf10bb452019-09-05 13:53:01 +0200659 IaRestOctets rest_octets
Harald Welte9419c8a2017-07-30 04:07:05 +0200660 } with { variant (chan_desc) "PRESENCE(ded_or_tbf.tbf = false)"
Vadim Yanitskiya4aacc22019-09-09 04:41:12 +0200661 variant (pkt_chan_desc) "PRESENCE(ded_or_tbf.tbf = true)" };
Harald Welte9419c8a2017-07-30 04:07:05 +0200662
663 /* 9.1.20 */
664 type record ReqRefWaitInd {
665 RequestReference req_ref,
666 WaitIndication wait_ind
667 } with { variant "" };
668 type record length(4) of ReqRefWaitInd ReqRefWaitInd4;
669 type record ImmediateAssignmentReject {
670 FeatureIndicator feature_ind,
671 PageMode page_mode,
Vadim Yanitskiy7ef121d2020-05-22 03:04:22 +0700672 ReqRefWaitInd4 payload,
673 IARRestOctets rest_octets
Harald Welte9419c8a2017-07-30 04:07:05 +0200674 } with { variant "" };
675
Vadim Yanitskiy7ef121d2020-05-22 03:04:22 +0700676 /* 10.5.2.17 IAR (Immediate Assignment Reject) Rest Octets */
677 type record IARRestOctets {
678 ExtRAList ext_ra_list,
679 BIT1 rel13_ind, // L/H
680 uint3_t rcc optional
681 /* Addition in Rel-15: PEO IMM Cell Group Details struct */
682 } with {
683 variant (rel13_ind) "CSN.1 L/H"
684 variant (rcc) "PRESENCE(rel13_ind = '1'B)"
685
686 /* The TITAN's RAW encoder generates an octet-aligned octetstring,
687 * so we should make sure that unused bits contain proper padding. */
688 variant "PADDING(yes), PADDING_PATTERN('00101011'B)"
689 };
690
691 /* Optional extended RA: 0 | 1 < Extended RA 1 : bit (5) > */
692 type record ExtRAOpt {
693 BIT1 presence, // L/H
694 BIT5 ext_ra optional
695 } with {
696 variant (presence) "CSN.1 L/H"
697 variant (ext_ra) "PRESENCE(presence = '1'B)"
698 /* See https://bugs.eclipse.org/bugs/show_bug.cgi?id=562488 */
699 variant (ext_ra) "BYTEORDER(last)"
700 };
701
702 type record length(4) of ExtRAOpt ExtRAList;
703
Harald Weltecbc947f2018-02-22 00:26:55 +0100704 /* 9.1.21 */
705 type record MeasurementReport {
706 MeasurementResults meas_res
707 } with { variant "" };
708
Harald Welte9419c8a2017-07-30 04:07:05 +0200709 /* 9.1.22 */
710 type record PagingRequestType1 {
711 ChannelNeeded12 chan_needed,
712 PageMode page_mode,
713 MobileIdentityLV mi1,
714 MobileIdentityTLV mi2 optional,
715 RestOctets rest_octets
Vadim Yanitskiy98bb2d52020-03-28 00:57:21 +0700716 } with { variant "TAG(mi2, elementIdentifier = '0010111'B)" };
Harald Welte9419c8a2017-07-30 04:07:05 +0200717
718 /* 9.1.23 */
719 type record PagingRequestType2 {
720 ChannelNeeded12 chan_needed,
721 PageMode page_mode,
722 GsmTmsi mi1,
723 GsmTmsi mi2,
724 MobileIdentityTLV mi3 optional,
725 RestOctets rest_octets
Vadim Yanitskiy98bb2d52020-03-28 00:57:21 +0700726 } with { variant "TAG(mi3, elementIdentifier = '0010111'B)" };
Harald Welte9419c8a2017-07-30 04:07:05 +0200727
728 /* 9.1.24 */
729 type record length(4) of GsmTmsi GsmTmsi4;
730 type record PagingRequestType3 {
731 ChannelNeeded12 chan_needed,
732 PageMode page_mode,
733 GsmTmsi4 mi,
734 RestOctets rest_octets
735 } with { variant "" };
736
Harald Welte9419c8a2017-07-30 04:07:05 +0200737 type union RrUnion {
738/*
739 SystemInformationType1 si1,
740 SystemInformationType2 si2,
741 SystemInformationType2bis si2bis,
742 SystemInformationType2ter si2ter,
Harald Welte82ccef72018-02-25 16:17:33 +0100743 SystemInformationType3 si3,
Harald Welte9419c8a2017-07-30 04:07:05 +0200744 SystemInformationType4 si4,
745 SystemInformationType5 si5,
746 SystemInformationType5bis si5bis,
747 SystemInformationType5ter si5ter,
748 SystemInformationType6 si6,
749*/
750 ImmediateAssignment imm_ass,
751 ImmediateAssignmentReject imm_ass_rej,
752 PagingRequestType1 pag_req_1,
753 PagingRequestType2 pag_req_2,
754 PagingRequestType3 pag_req_3,
755 octetstring other
756 } with { variant "" };
757
758 /* Special RR Message on BCCH / CCCH Dowlink */
759
760 type record GsmRrMessage {
761 RrHeader header,
762 RrUnion payload
763 } with { variant (payload) "CROSSTAG(
764/*
765 si1, header.message_type = SYSTEM_INFORMATION_TYPE_1;
766 si2, header.message_type = SYSTEM_INFORMATION_TYPE_2;
767 si2bis, header.message_type = SYSTEM_INFORMATION_TYPE_2bis;
768 si2ter, header.message_type = SYSTEM_INFORMATION_TYPE_2ter;
769 si3, header.message_type = SYSTEM_INFORMATION_TYPE_3;
770 si4, header.message_type = SYSTEM_INFORMATION_TYPE_4;
771 si5, header.message_type = SYSTEM_INFORMATION_TYPE_5;
772 si5bis, header.message_type = SYSTEM_INFORMATION_TYPE_5bis;
773 si5ter, header.message_type = SYSTEM_INFORMATION_TYPE_5ter;
774 si6, header.message_type = SYSTEM_INFORMATION_TYPE_6;
775*/
776 imm_ass, header.message_type = IMMEDIATE_ASSIGNMENT;
777 imm_ass_rej, header.message_type = IMMEDIATE_ASSIGNMENT_REJECT;
778 pag_req_1, header.message_type = PAGING_REQUEST_TYPE_1;
779 pag_req_2, header.message_type = PAGING_REQUEST_TYPE_2;
780 pag_req_3, header.message_type = PAGING_REQUEST_TYPE_3;
781 other, OTHERWISE;
Vadim Yanitskiya4aacc22019-09-09 04:41:12 +0200782 )"
783 /* Total message length: 184 = 23 * 8. Pad spare bits with '2B'O. */
784 variant "PADDING(184), PADDING_PATTERN('00101011'B)"
785 };
Harald Welte9419c8a2017-07-30 04:07:05 +0200786
787 external function enc_GsmRrMessage(in GsmRrMessage msg) return octetstring
788 with { extension "prototype(convert) encode(RAW)" };
789 external function dec_GsmRrMessage(in octetstring stream) return GsmRrMessage
790 with { extension "prototype(convert) decode(RAW)" };
791
792 /* Normal L3 Message on Dedicated Channel */
793
794 /* 9.1.25 Paging Response */
795 type record PagingResponse {
796 uint4_t spare_half_octet,
797 CipheringKeySeqNr cksn,
798 MsClassmark2LV cm2,
799 MobileIdentityLV mi,
800 uint8_t addl_upd_par optional
801 } with { variant "" };
802
803 type union RrL3Union {
804 PagingResponse paging_response,
Harald Weltecbc947f2018-02-22 00:26:55 +0100805 MeasurementReport meas_rep,
Harald Welte9419c8a2017-07-30 04:07:05 +0200806 octetstring other
807 };
808
809 type record GsmRrL3Message {
810 RrL3Header header,
811 RrL3Union payload
812 } with { variant (payload) "CROSSTAG(
813 paging_response, header.message_type = PAGING_RESPONSE;
Harald Weltecbc947f2018-02-22 00:26:55 +0100814 meas_rep, header.message_type = MEASUREMENT_REPORT;
Harald Welte9419c8a2017-07-30 04:07:05 +0200815 other, OTHERWISE;
816 )" }
817
Harald Weltecbc947f2018-02-22 00:26:55 +0100818 external function enc_GsmRrL3Message(in GsmRrL3Message msg) return octetstring
819 with { extension "prototype(convert) encode(RAW)" };
820 external function dec_GsmRrL3Message(in octetstring stream) return GsmRrL3Message
821 with { extension "prototype(convert) decode(RAW)" };
822
823
Vadim Yanitskiy7091e8d2019-09-09 01:07:37 +0200824 template PacketDlAssign tr_PacketDlAssign(template GprsTlli tlli) := {
825 tlli := tlli,
826 group1_present := ?,
827 group1 := *,
828 ta_index_present := ?,
829 ta_index := *,
830 tbf_starting_time_present := ?,
831 tbf_starting_time := *,
832 p0_present := ?,
833 p0 := *,
834 pr_mode := *
835 };
836
837 template IaRestOctets tr_IaRestOctets_DLAss(template PacketDlAssign dl_ass) := {
838 presence := '11'B, /* HH */
839 ll := omit, lh := omit, hl := omit,
840 hh := {
841 pa_disc := '0'B, /* Packet Assignment (0) */
842 pa := {
843 uldl := {
844 ass_disc := '1'B, /* Downlink Assignment (1) */
845 ass := { dl := dl_ass }
846 }
847 }
848 }
849 };
850
851 template PacketUlAssign tr_PacketUlDynAssign(template uint5_t tfi := ?,
852 template BIT1 polling := ?,
853 template uint3_t usf := ?,
854 template BIT1 usf_granularity := ?,
855 template ChCodingCommand cs := ?) := {
Vadim Yanitskiy06ca64d2019-09-29 20:17:10 +0700856 presence := '1'B, /* Dynamic Block Allocation */
Vadim Yanitskiy7091e8d2019-09-09 01:07:37 +0200857 dynamic := {
858 tfi_assignment := tfi,
859 polling := polling,
Vadim Yanitskiy06ca64d2019-09-29 20:17:10 +0700860 spare := '0'B, /* Dynamic Block Allocation (mandatory after Rel-4) */
Vadim Yanitskiy7091e8d2019-09-09 01:07:37 +0200861 usf := usf,
862 usf_granularity := usf_granularity,
863 p0_present := ?,
864 p0 := *,
865 pr_mode := *,
866 ch_coding_cmd := cs,
867 tlli_block_chan_coding := ?,
868 alpha_present := ?,
869 alpha := *,
870 gamma := ?,
871 /* TODO: add to parameters */
872 ta_index_present := ?,
873 ta_index := *,
874 tbf_starting_time_present := ?,
875 tbf_starting_time := *
876 },
877 single := omit
878 };
879
880 template PacketUlAssign tr_PacketUlSglAssign := {
Vadim Yanitskiy06ca64d2019-09-29 20:17:10 +0700881 presence := '0'B, /* Single Block Allocation */
Vadim Yanitskiy7091e8d2019-09-09 01:07:37 +0200882 dynamic := omit,
883 single := {
884 alpha_present := ?,
885 alpha := *,
886 gamma := ?,
887 padding := '01'B,
888 tbf_starting_time := ?
889 }
890 };
891
892 template IaRestOctets tr_IaRestOctets_ULAss(template PacketUlAssign ul_ass) := {
893 presence := '11'B, /* HH */
894 ll := omit, lh := omit, hl := omit,
895 hh := {
896 pa_disc := '0'B, /* Packet Assignment (0) */
897 pa := {
898 uldl := {
899 ass_disc := '0'B, /* Uplink Assignment (0) */
900 ass := { ul := ul_ass }
901 }
902 }
903 }
904 };
905
Vadim Yanitskiya0b47cf2020-04-02 01:50:18 +0700906 template EgprsUlAss tr_EgprsUlAssDynamic(template (present) BIT5 ext_ra := ?,
907 template EgprsUlAssignDyn dyn_ass := ?) := {
908 ext_ra := ext_ra,
909 ats_present := ?,
910 ats := *,
911 presence := '1'B,
912 dynamic := dyn_ass,
913 multiblock := omit
914 };
915 template EgprsUlAss tr_EgprsUlAssMultiblock(template (present) BIT5 ext_ra := ?,
916 template EgprsUlAssignMultiblock mb_ass := ?) := {
917 ext_ra := ext_ra,
918 ats_present := ?,
919 ats := *,
920 presence := '0'B,
921 dynamic := omit,
922 multiblock := mb_ass
923 };
924
925 template IaRestOctets tr_IaRestOctets_EGPRSULAss(template EgprsUlAss ul_ass) := {
926 presence := '01'B, /* LH */
927 ll := omit,
928 lh := {
929 presence := '00'B,
930 egprs_ul := ul_ass,
931 multiblock_dl_ass := omit
932 },
933 hl := omit,
934 hh := omit
935 };
936
Harald Weltee8d750e2018-06-10 21:41:35 +0200937 template (value) GsmRrMessage ts_IMM_ASS(uint8_t ra, GsmFrameNumber fn, TimingAdvance ta,
Harald Weltecbc947f2018-02-22 00:26:55 +0100938 ChannelDescription ch_desc, MobileAllocation ma) := {
939 header := t_RrHeader(IMMEDIATE_ASSIGNMENT, 0),
940 payload := {
941 imm_ass := {
942 ded_or_tbf := {
943 spare := '0'B,
944 tma := false,
945 downlink := false,
946 tbf := false
947 },
948 page_mode := PAGE_MODE_NORMAL,
949 chan_desc := ch_desc,
950 pkt_chan_desc := omit,
951 req_ref := f_compute_ReqRef(ra, fn),
952 timing_advance := ta,
953 mobile_allocation := ma,
Vadim Yanitskiyf10bb452019-09-05 13:53:01 +0200954 rest_octets := {
955 presence := '00'B, /* LL */
956 ll := {
Vadim Yanitskiyb021ed42020-04-27 23:25:13 +0700957 compressed_irat_ho_info_ind := '0'B /* L */
Vadim Yanitskiy9b2a3e82019-09-08 15:37:15 +0200958 },
959 lh := omit, hl := omit, hh := omit
Vadim Yanitskiyf10bb452019-09-05 13:53:01 +0200960 }
Harald Weltecbc947f2018-02-22 00:26:55 +0100961 }
962 }
963 };
964
Harald Weltee8d750e2018-06-10 21:41:35 +0200965 template GsmRrMessage tr_IMM_ASS(template uint8_t ra := ?, template GsmFrameNumber fn := ?,
966 template TimingAdvance ta := ?,
967 template ChannelDescription ch_desc := ?,
968 template MobileAllocation ma := ?) := {
Vadim Yanitskiyd4205c32019-09-09 16:15:37 +0200969 header := t_RrHeader(IMMEDIATE_ASSIGNMENT, ?),
Harald Weltee8d750e2018-06-10 21:41:35 +0200970 payload := {
971 imm_ass := {
972 ded_or_tbf := {
973 spare := '0'B,
974 tma := false,
975 downlink := false,
976 tbf := false
977 },
978 page_mode := PAGE_MODE_NORMAL,
979 chan_desc := ch_desc,
980 pkt_chan_desc := omit,
981 req_ref := tr_compute_ReqRef(ra, fn),
982 timing_advance := ta,
983 mobile_allocation := ma,
Vadim Yanitskiyf10bb452019-09-05 13:53:01 +0200984 rest_octets := ?
Harald Weltee8d750e2018-06-10 21:41:35 +0200985 }
986 }
987 };
988
Vadim Yanitskiy6edd4f52019-09-09 01:51:09 +0200989 /* TODO: implement send version of this template */
990 template GsmRrMessage tr_IMM_TBF_ASS(template boolean dl := ?,
991 template uint8_t ra := ?,
992 template GsmFrameNumber fn := ?,
993 template TimingAdvance ta := ?,
994 template PacketChannelDescription ch_desc := ?,
Vadim Yanitskiycf1ed3f2020-07-20 04:01:43 +0700995 template MobileAllocation ma := ?,
Vadim Yanitskiy6edd4f52019-09-09 01:51:09 +0200996 template IaRestOctets rest := ?) := {
997 header := t_RrHeader(IMMEDIATE_ASSIGNMENT, ?),
998 payload := {
999 imm_ass := {
1000 ded_or_tbf := {
1001 spare := ?,
1002 tma := ?,
1003 downlink := dl,
1004 tbf := true
1005 },
1006 page_mode := ?,
1007 chan_desc := omit,
1008 pkt_chan_desc := ch_desc,
1009 req_ref := tr_compute_ReqRef(ra, fn),
1010 timing_advance := ta,
Vadim Yanitskiycf1ed3f2020-07-20 04:01:43 +07001011 mobile_allocation := ma,
Vadim Yanitskiy6edd4f52019-09-09 01:51:09 +02001012 rest_octets := rest
1013 }
1014 }
1015 };
Harald Weltee8d750e2018-06-10 21:41:35 +02001016
Vadim Yanitskiy9781ecb2020-03-28 03:59:41 +07001017 template GsmRrMessage tr_PAG_REQ1(template MobileIdentityLV mi1 := ?,
1018 template MobileIdentityTLV mi2 := omit) := {
Pau Espin Pedrol88bf5372019-12-09 21:12:28 +01001019 header := t_RrHeader(PAGING_REQUEST_TYPE_1, ?),
1020 payload := {
1021 pag_req_1 := {
1022 chan_needed := {
1023 second := ?,
1024 first := ?
1025 },
1026 page_mode := PAGE_MODE_NORMAL,
1027 mi1 := mi1,
Vadim Yanitskiy9781ecb2020-03-28 03:59:41 +07001028 mi2 := mi2,
Pau Espin Pedrol88bf5372019-12-09 21:12:28 +01001029 rest_octets := ?
1030 }
1031 }
1032 };
1033
Harald Weltecbc947f2018-02-22 00:26:55 +01001034 template (value) GsmRrL3Message ts_MEAS_REP(boolean valid, uint6_t rxl_f, uint6_t rxl_s,
1035 uint3_t rxq_f, uint3_t rxq_s,
1036 template (omit) NcellReports reps) := {
1037 header := t_RrL3Header(MEASUREMENT_REPORT),
1038 payload := {
1039 meas_rep := {
1040 meas_res := {
1041 ba_used := '0'B,
1042 dtx_used := '0'B,
1043 rxlev_full_srv_cell := rxl_f,
1044 threeg_ba_used := '0'B,
Harald Welteeb1e6812018-02-22 18:43:48 +01001045 meas_valid := bool2bit(not valid),
Harald Weltecbc947f2018-02-22 00:26:55 +01001046 rxlev_sub_srv_cell := rxl_s,
1047 si23_ba_used := '0'B,
1048 rxqual_full_srv_cell := rxq_f,
1049 rxqual_sub_srv_cell := rxq_s,
1050 no_ncell_m := 0,
1051 ncell_reports := reps
1052 }
1053 }
1054 }
1055 };
1056
Vadim Yanitskiy16e24aa2020-05-22 03:32:00 +07001057 template GsmRrMessage tr_IMM_ASS_REJ(template FeatureIndicator feature_ind := ?,
1058 template ReqRefWaitInd4 rr_wi_list := ?,
1059 template IARRestOctets rest_octets := ?) := {
1060 header := t_RrHeader(IMMEDIATE_ASSIGNMENT_REJECT, ?),
1061 payload := {
1062 imm_ass_rej := {
1063 feature_ind := feature_ind,
1064 page_mode := ?,
1065 payload := rr_wi_list,
1066 rest_octets := rest_octets
1067 }
1068 }
1069 };
1070
1071 template ReqRefWaitInd tr_ReqRefWaitInd(template RequestReference ref := ?,
1072 template WaitIndication wi := ?) := {
1073 req_ref := ref,
1074 wait_ind := wi
1075 };
1076
1077 template IARRestOctets tr_IARRestOctets(template ExtRAList ext_ra_list := ?,
1078 template uint3_t rcc := ?) := {
1079 ext_ra_list := ext_ra_list,
1080 rel13_ind := ?,
1081 rcc := rcc ifpresent
1082 };
1083
1084 template ExtRAOpt tr_ExtRAOpt(template BIT5 ext_ra := ?) := {
1085 presence := '1'B, // L/H
1086 ext_ra := ext_ra
1087 };
1088
Vadim Yanitskiyf7181ed2020-07-14 20:12:02 +07001089 template (value) ChannelDescription ts_ChanDescH0(template (value) RslChannelNr chan_nr,
1090 template (value) uint12_t arfcn,
1091 template (value) uint3_t tsc := 7) := {
1092 chan_nr := chan_nr,
1093 tsc := tsc,
1094 h := false,
1095 arfcn := arfcn,
1096 maio_hsn := omit
1097 }
1098
1099 template (value) ChannelDescription ts_ChanDescH1(template (value) RslChannelNr chan_nr,
1100 template (value) MaioHsn maio_hsn,
1101 template (value) uint3_t tsc := 7) := {
1102 chan_nr := chan_nr,
1103 tsc := tsc,
1104 h := true,
1105 arfcn := omit,
1106 maio_hsn := maio_hsn
1107 }
1108
Vadim Yanitskiye05d7162020-05-02 16:58:46 +07001109} with { encode "RAW" ; variant "FIELDORDER(msb)" }