blob: b7e02ec4a1f019526fb105c5554e9a18c85306ec [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;
Vadim Yanitskiy27b38012020-09-01 05:14:46 +070020 import from MobileL3_RRM_Types all;
Harald Welte9419c8a2017-07-30 04:07:05 +020021
22 /* Table 10.4.1 of Section 10.4 / 3GPP TS 44.018 */
23 type enumerated RrMessageType {
24 ADDITIONAL_ASSIGNMENT ('00111011'B),
25 IMMEDIATE_ASSIGNMENT ('00111111'B),
26 IMMEDIATE_ASSIGNMENT_EXTENDED ('00111001'B),
27 IMMEDIATE_ASSIGNMENT_REJECT ('00111010'B),
28 IMMEDIATE_PACKET_ASSIGNMENT ('01101001'B),
29
30 CIPHERING_MODE_COMMAND ('00110101'B),
31 CIPHERING_MODE_COMPLETE ('00110010'B),
32
33 CONFIGURATION_CHANGE_COMMAND ('00110000'B),
34 CONFIGURATION_CHANGE_ACK ('00110001'B),
35 CONFIGURATION_CHANGE_REJECT ('00110011'B),
36
37 ASSIGNMENT_COMMAND ('00101110'B),
38 ASSIGNMENT_COMPLETE ('00101001'B),
39 ASSIGNMENT_FAILURE ('00101111'B),
40 HANDOVER_COMMAND ('00101011'B),
41 HANDOVER_COMPLETE ('00101100'B),
42 HANDOVER_FAILURE ('00101000'B),
43 PHYSICAL_INFORMATION ('00101101'B),
44
45 CHANNEL_RELEASE ('00001101'B),
46 PARTIAL_RELEASE ('00001010'B),
47 PARTIAL_RELEASE_COMPLETE ('00001111'B),
48
49 PAGING_REQUEST_TYPE_1 ('00100001'B),
50 PAGING_REQUEST_TYPE_2 ('00100010'B),
51 PAGING_REQUEST_TYPE_3 ('00100100'B),
52 PAGING_RESPONSE ('00100111'B),
53 NOTIFICATION_NCH ('00100000'B),
54 NOTIFICATION_RESPOSNE ('00100110'B),
55
56 SYSTEM_INFORMATION_TYPE_8 ('00011000'B),
57 SYSTEM_INFORMATION_TYPE_1 ('00011001'B),
58 SYSTEM_INFORMATION_TYPE_2 ('00011010'B),
59 SYSTEM_INFORMATION_TYPE_3 ('00011011'B),
60 SYSTEM_INFORMATION_TYPE_4 ('00011100'B),
61 SYSTEM_INFORMATION_TYPE_5 ('00011101'B),
62 SYSTEM_INFORMATION_TYPE_6 ('00011110'B),
63 SYSTEM_INFORMATION_TYPE_7 ('00011111'B),
64 SYSTEM_INFORMATION_TYPE_2bis ('00000010'B),
65 SYSTEM_INFORMATION_TYPE_2ter ('00000011'B),
66 SYSTEM_INFORMATION_TYPE_2quater ('00000111'B),
67 SYSTEM_INFORMATION_TYPE_5bis ('00000101'B),
68 SYSTEM_INFORMATION_TYPE_5ter ('00000110'B),
69 SYSTEM_INFORMATION_TYPE_9 ('00000100'B),
70 SYSTEM_INFORMATION_TYPE_13 ('00000000'B),
71
72 SYSTEM_INFORMATION_TYPE_16 ('00111101'B),
73 SYSTEM_INFORMATION_TYPE_17 ('00111110'B),
74
75 CHANNEL_MODE_MODIFY ('00010000'B),
76 RR_STATUS ('00010010'B),
77 CHANNEL_MODE_MODIFY_ACKNOWLEDGE ('00010111'B),
78 FREQUENCY_REDEFINITION ('00010100'B),
79 MEASUREMENT_REPORT ('00010101'B),
80 CLASSMARK_CHANGE ('00010110'B),
81 CLASSMARK_ENQUIRY ('00010011'B),
82 EXTENDED_MEASUREMENT_REPORT ('00110110'B),
83 EXTENDED_MEASUREMENT_ORDER ('00110111'B),
84 GPRS_SUSPENSION_REQUEST ('00110100'B),
85 //MBMS_ANNOUNCEMENT ('00010110'B), duplicate?
86 //SERVICE_INFORMATION ('00110110'B), duplicate?
87
88 APPLICATION_INFORMATION ('00111000'B),
89
90 SYSTEM_INFORMATION_TYPE_14 ('00000001'B),
91 SYSTEM_INFORMATION_TYPE_15 ('01000011'B),
92 SYSTEM_INFORMATION_TYPE_18 ('01000000'B),
93 SYSTEM_INFORMATION_TYPE_19 ('01000001'B),
94 SYSTEM_INFORMATION_TYPE_20 ('01000010'B),
95 SYSTEM_INFORMATION_TYPE_13alt ('01000100'B),
96 SYSTEM_INFORMATION_TYPE_2n ('01000101'B),
97 SYSTEM_INFORMATION_TYPE_21 ('01000110'B),
98 SYSTEM_INFORMATION_TYPE_22 ('01000111'B),
99 SYSTEM_INFORMATION_TYPE_23 ('01001111'B),
100
101 DTM_ASSIGNMENT_FAILURE ('01001000'B),
102 DTM_REJECT ('01001001'B),
103 DTM_REQUEST ('01001010'B),
104 PACKET_ASSIGNMENT ('01001011'B),
105 DTM_ASSIGNMENT_COMMAND ('01001100'B),
106 DTM_INFORMATION ('01001101'B),
107 PACKET_INFORMATION ('01001110'B),
108
109 UTRAN_CLASSMARK_CHANGE ('01100000'B),
110 CDMA2000_CLASSMARK_CHANGE ('01100010'B),
111 INTERSYS_TO_UTRAN_HO_CMD ('01100011'B),
112 INTERSYS_TO_CDMA2000_HO_CMD ('01100100'B),
113 GERAN_IU_MODE_CLASSMARK_CHG ('01100101'B),
114 INTERSYS_TO_EUTRAN_HO_CMD ('01100110'B)
115 } with { variant "FIELDLENGTH(8)" };
116
Neels Hofmeyr95a5edc2020-07-11 02:57:04 +0200117 type enumerated RR_Cause {
118 GSM48_RR_CAUSE_NORMAL ('00'O),
119 GSM48_RR_CAUSE_ABNORMAL_UNSPEC ('01'O),
120 GSM48_RR_CAUSE_ABNORMAL_UNACCT ('02'O),
121 GSM48_RR_CAUSE_ABNORMAL_TIMER ('03'O),
122 GSM48_RR_CAUSE_ABNORMAL_NOACT ('04'O),
123 GSM48_RR_CAUSE_PREMPTIVE_REL ('05'O),
124 GSM48_RR_CAUSE_HNDOVER_IMP ('08'O),
125 GSM48_RR_CAUSE_CHAN_MODE_UNACCT ('09'O),
126 GSM48_RR_CAUSE_FREQ_NOT_IMPL ('0a'O),
127 GSM48_RR_CAUSE_CALL_CLEARED ('41'O),
128 GSM48_RR_CAUSE_SEMANT_INCORR ('5f'O),
129 GSM48_RR_CAUSE_INVALID_MAND_INF ('60'O),
130 GSM48_RR_CAUSE_MSG_TYPE_N ('61'O),
131 GSM48_RR_CAUSE_MSG_TYPE_N_COMPAT('62'O),
132 GSM48_RR_CAUSE_COND_IE_ERROR ('64'O),
133 GSM48_RR_CAUSE_NO_CELL_ALLOC_A ('65'O),
134 GSM48_RR_CAUSE_PROT_ERROR_UNSPC ('6f'O)
135 } with { variant "FIELDLENGTH(8)" };
136
Harald Welte9419c8a2017-07-30 04:07:05 +0200137 type octetstring RestOctets with { variant "PADDING(yes), PADDING_PATTERN('00101011'B)" };
Harald Welte9419c8a2017-07-30 04:07:05 +0200138
139 type record L2PseudoLength {
140 uint6_t l2_plen,
141 BIT2 zero_one
142 } with { variant "" };
143
Harald Weltef8df4cb2018-03-10 15:15:08 +0100144 template L2PseudoLength tr_L2Pseudolength(template uint6_t len) := {
145 l2_plen := len,
146 zero_one := '01'B
147 };
148
149 template (value) L2PseudoLength ts_L2Pseudolength(uint6_t len) := {
Harald Welte9419c8a2017-07-30 04:07:05 +0200150 l2_plen := len,
151 zero_one := '01'B
152 };
153
154 type record RrHeader {
155 L2PseudoLength l2_plen,
156 uint4_t skip_indicator,
157 uint4_t rr_protocol_discriminator,
158 RrMessageType message_type
159 } with { variant "" };
160
161 template RrHeader t_RrHeader(RrMessageType msg_type, template uint6_t len) := {
Harald Weltef8df4cb2018-03-10 15:15:08 +0100162 l2_plen := tr_L2Pseudolength(len),
Harald Welte9419c8a2017-07-30 04:07:05 +0200163 skip_indicator := 0,
164 rr_protocol_discriminator := 6,
165 message_type := msg_type
166 };
167
Harald Weltef8df4cb2018-03-10 15:15:08 +0100168 template (value) RrHeader ts_RrHeader(RrMessageType msg_type, uint6_t len) := {
169 l2_plen := ts_L2Pseudolength(len),
170 skip_indicator := 0,
171 rr_protocol_discriminator := 6,
172 message_type := msg_type
173 };
174
175
Harald Welte9419c8a2017-07-30 04:07:05 +0200176 type record RrL3Header {
177 uint4_t skip_indicator,
178 uint4_t rr_protocol_discriminator,
179 RrMessageType message_type
180 } with { variant "" };
181
Harald Weltecbc947f2018-02-22 00:26:55 +0100182 template RrL3Header t_RrL3Header(RrMessageType msg_type) := {
183 skip_indicator := 0,
184 rr_protocol_discriminator := 6,
185 message_type := msg_type
186 }
187
Pau Espin Pedrol0aad5962018-09-28 16:03:55 +0200188 /* TS 44.004 7.2.1 */
189 type record SacchL1Header {
190 uint2_t reserved,
191 boolean fpc,
192 uint5_t ms_power_lvl,
193 uint8_t actual_ta
194 } with { variant "FIELDORDER(msb)" };
195
196 template (value) SacchL1Header ts_SacchL1Header(uint5_t ms_power_lvl, boolean fpc, uint8_t actual_ta) := {
197 reserved := 0,
198 fpc := fpc,
199 ms_power_lvl := ms_power_lvl,
200 actual_ta := actual_ta
201 };
202
Harald Welte9419c8a2017-07-30 04:07:05 +0200203 type record MaioHsn {
Vadim Yanitskiyff0072c2020-05-27 01:35:39 +0700204 uint6_t maio,
205 uint6_t hsn
Harald Welte9419c8a2017-07-30 04:07:05 +0200206 } with { variant "" };
207
Vadim Yanitskiy5bcd9192020-07-06 20:18:11 +0700208 /* It's more handy to pass HSN first, so the arguments' order is reversed. */
209 template (value) MaioHsn ts_HsnMaio(template (value) uint6_t hsn,
210 template (value) uint6_t maio) := {
211 maio := maio,
212 hsn := hsn
213 };
214 template MaioHsn tr_HsnMaio(template (present) uint6_t hsn,
215 template (present) uint6_t maio) := {
216 maio := maio,
217 hsn := hsn
218 };
219
Harald Welte9419c8a2017-07-30 04:07:05 +0200220 /* TS 24.008 10.5.1.2 */
221 type uint4_t CipheringKeySeqNr (0..7);
222
Harald Welte9419c8a2017-07-30 04:07:05 +0200223 /* TS 24.008 10.5.1.4 */
224 type enumerated MobileIdentityType {
225 MI_TYPE_NONE (0),
226 MI_TYPE_IMSI,
227 MI_TYPE_IMEI,
228 MI_TYPE_IMEISV,
229 MI_TYPE_TMSI,
230 MI_TYPE_TMGI
231 } with { variant "FIELDLENGTH(3)" };
232
Harald Welte9419c8a2017-07-30 04:07:05 +0200233 /* TS 24.008 10.5.1.5 */
234 type record MsClassmark1 {
235 BIT1 spare,
236 uint2_t rev_level,
237 boolean es_ind,
238 boolean a51,
239 uint3_t rf_pwr_cap
240 } with { variant "" };
241
242 /* TS 24.008 10.5.1.6 */
243 type record MsClassmark2 {
244 BIT1 spare,
245 uint2_t rev_level,
246 boolean es_ind,
247 boolean a51,
248 uint3_t rf_pwr_cap,
249 BIT1 spare1,
250 boolean ps_cap,
251 uint2_t ss_screen_ind,
252 boolean sm_cap,
253 boolean vbs,
254 boolean vgcs,
255 boolean fc,
256 boolean cm3,
257 BIT1 spare2,
258 boolean lcsva_cap,
259 boolean ucs2,
260 boolean solsa,
261 boolean cmsp,
262 boolean a53,
263 boolean a52
264 } with { variant "" };
265 type record MsClassmark2LV {
266 uint8_t len,
267 MsClassmark2 cm2
268 } with { variant (len) "LENGTHTO(cm2)" };
269
270
271 /* 44.018 10.5.2.5 */
272 type record ChannelDescription {
273 RslChannelNr chan_nr,
274 uint3_t tsc,
275 boolean h,
276 uint12_t arfcn optional,
277 MaioHsn maio_hsn optional
278 } with { variant (arfcn) "PRESENCE(h = false)"
279 variant (maio_hsn) "PRESENCE(h = true)" };
280
281 type record ChannelDescriptionTV {
282 OCT1 iei,
283 ChannelDescription v
284 } with { variant "" };
285
286 /* 10.5.2.21 */
Vadim Yanitskiy3b464a92020-08-25 03:55:32 +0700287 type record MobileAllocationLV {
Harald Welte9419c8a2017-07-30 04:07:05 +0200288 uint8_t len,
Vadim Yanitskiy7d6eef32020-08-29 02:56:58 +0700289 bitstring ma length (0..64)
Vadim Yanitskiy3ddb3ab2020-07-20 04:29:53 +0700290 } with {
291 variant (len) "LENGTHTO(ma)"
Vadim Yanitskiye2a6fdf2020-07-23 04:53:02 +0700292 variant (ma) "BYTEORDER(first), BITORDER(msb)"
Vadim Yanitskiy3ddb3ab2020-07-20 04:29:53 +0700293 };
Harald Welte9419c8a2017-07-30 04:07:05 +0200294
Vadim Yanitskiy74e1f6b2020-08-25 03:59:45 +0700295 type record MobileAllocationTLV {
296 OCT1 iei ('72'O),
297 MobileAllocationLV v
298 } with { variant "" };
299
Harald Welte9419c8a2017-07-30 04:07:05 +0200300 /* 10.5.2.25a */
Harald Welte1b9b7702017-07-30 04:19:14 +0200301 type record PktChDesc0Ind {
302 uint6_t maio,
303 BIT1 ma_number_ind,
304 BIT1 change_mark1_valid,
305 BIT2 change_mark1
306 } with { variant "" };
307 type record PktChDesc0 {
308 BIT1 hopping,
309 BIT1 spare ('0'B),
310 uint10_t arfcn optional,
311 PktChDesc0Ind indirect optional
312 } with {
313 variant (arfcn) "PRESENCE(hopping = '0'B)"
314 variant (indirect) "PRESENCE(hopping = '1'B)"
315 };
316 type record PktChDesc1 {
317 uint6_t maio,
318 uint6_t hsn
319 } with { variant "" };
320 type record PacketChannelDescription {
321 uint5_t channel_Type_spare,
322 uint3_t tn,
323 uint3_t tsc,
324 BIT1 presence,
325 PktChDesc0 zero optional,
326 PktChDesc1 one optional
327 } with {
328 variant (zero) "PRESENCE(presence = '0'B)"
329 variant (one) "PRESENCE(presence = '1'B)"
330 };
Harald Welte9419c8a2017-07-30 04:07:05 +0200331
332 /* 10.5.2.25b */
333 type record DedicatedModeOrTbf {
334 BIT1 spare,
335 boolean tma,
336 boolean downlink,
337 boolean tbf
338 } with { variant "" };
339
340 /* 10.5.2.26 */
341 type enumerated PageMode {
342 PAGE_MODE_NORMAL,
343 PAGE_MODE_EXTENDED,
344 PAGE_MODE_REORGANIZATION,
345 PAGE_MODE_SAME_AS_BEFORE
346 } with { variant "FIELDLENGTH(4)" };
347
348 /* 10.5.2.30 */
349 type record RequestReference {
350 bitstring ra length(8),
351 uint5_t t1p,
352 uint6_t t3,
353 uint5_t t2
354 } with { variant "" };
355
356 template RequestReference t_RequestReference(template bitstring ra, template uint5_t t1p, template uint6_t t3, template uint5_t t2) := {
357 ra := ra,
358 t1p := t1p,
359 t3 := t3,
360 t2 := t2
361 }
362
363 /* compute the expected request reference for given RA + FN */
364 function f_compute_ReqRef(uint8_t ra, GsmFrameNumber fn) return RequestReference {
365 var RequestReference req_ref := { ra := int2bit(ra, 8) };
366 req_ref.t1p := (fn / 1326) mod 32;
367 req_ref.t2 := fn mod 26;
368 req_ref.t3 := fn mod 51;
369 return req_ref
370 }
Harald Weltee8d750e2018-06-10 21:41:35 +0200371 function tr_compute_ReqRef(template uint8_t ra, template GsmFrameNumber fn)
372 return template RequestReference {
373 var template RequestReference req_ref;
374 if (istemplatekind(ra, "?")) {
375 req_ref.ra := ?;
376 } else {
377 req_ref.ra := int2bit(valueof(ra), 8);
378 }
379 if (istemplatekind(fn, "?")) {
380 req_ref.t1p := ?;
381 req_ref.t2 := ?;
382 req_ref.t3 := ?;
383 } else {
384 var GsmFrameNumber fn_v := valueof(fn);
385 req_ref.t1p := (fn_v / 1326) mod 32;
386 req_ref.t2 := fn_v mod 26;
387 req_ref.t3 := fn_v mod 51;
388 }
389 return req_ref;
390 }
Harald Welte9419c8a2017-07-30 04:07:05 +0200391
392 /* 10.5.2.40 */
393 type integer TimingAdvance (0..219);
394
395 /* 10.5.2.43 */
396 type uint8_t WaitIndication;
397
398 /* 10.5.2.76 */
399 type record FeatureIndicator {
Vadim Yanitskiyc3cebd32020-05-22 02:43:22 +0700400 BIT2 peo_bcch_change_mark,
401 boolean cs_ir,
402 boolean ps_ir
403 } with {
404 variant (cs_ir) "FIELDLENGTH(1)"
405 variant (ps_ir) "FIELDLENGTH(1)"
406 };
Harald Welte9419c8a2017-07-30 04:07:05 +0200407
408 /* 24.008 10.5.5.6 */
409 type record DrxParameter {
410 uint8_t split_pg_cycle_code,
411 uint4_t drx_cycle_len_coeff,
412 boolean split_on_ccch,
413 uint3_t non_drx_timer
414 } with { variant "" };
415
Harald Welte9419c8a2017-07-30 04:07:05 +0200416 /* 44.018 10.5.2.16 */
417 type record IaRestOctHL {
418 uint6_t freq_par_len,
419 BIT2 padding ('00'B) optional,
420 uint6_t maio optional,
421 octetstring mobile_allocation optional
422 } with {
423 variant (freq_par_len) "LENGTHTO(mobile_allocation,maio,padding)"
424/*
425 variant (padding) "PRESENCE(freq_par_len != 0)"
426 variant (maio) "PRESENCE(freq_par_len != 0)"
427 variant (mobile_allocation) "PRESENCE(freq_par_len != 0)"
428*/
429 };
Vadim Yanitskiy7091e8d2019-09-09 01:07:37 +0200430 type record SecondPartAssign {
Vadim Yanitskiyb021ed42020-04-27 23:25:13 +0700431 BIT1 r99, /* L / H */
Vadim Yanitskiy7091e8d2019-09-09 01:07:37 +0200432 BIT1 presence optional,
433 BIT5 ext_ra optional
Harald Welte9419c8a2017-07-30 04:07:05 +0200434 } with {
Vadim Yanitskiyb021ed42020-04-27 23:25:13 +0700435 variant (r99) "CSN.1 L/H"
Vadim Yanitskiy7091e8d2019-09-09 01:07:37 +0200436 variant (presence) "PRESENCE(r99 = '1'B)" /* H */
437 variant (ext_ra) "PRESENCE(presence = '1'B)"
Vadim Yanitskiye05d7162020-05-02 16:58:46 +0700438 /* See https://bugs.eclipse.org/bugs/show_bug.cgi?id=562488 */
439 variant (ext_ra) "BYTEORDER(last)" // FIXME: should be first
Vadim Yanitskiy7091e8d2019-09-09 01:07:37 +0200440 };
441 type union PacketUlDlAssignUnion {
442 PacketUlAssign ul,
443 PacketDlAssign dl
444 };
445 type record PacketUlDlAssign {
446 BIT1 ass_disc,
447 PacketUlDlAssignUnion ass
448 } with {
449 variant (ass) "CROSSTAG(dl, ass_disc = '1'B; ul, ass_disc = '0'B)"
450 };
451 type union PacketAssignUnion {
452 SecondPartAssign spa,
453 PacketUlDlAssign uldl
454 };
455 type record IaRestOctHH {
456 /* Packet Assignment discriminator:
457 * Packet Uplink / Downlink Assignment (0)
458 * Second Part Packet Assignment (1) */
459 BIT1 pa_disc,
460 PacketAssignUnion pa
461 } with {
462 variant (pa) "CROSSTAG(spa, pa_disc = '1'B; uldl, pa_disc = '0'B)"
Harald Welte9419c8a2017-07-30 04:07:05 +0200463 };
464 type record PacketUlAssignDyn {
465 uint5_t tfi_assignment,
466 BIT1 polling,
467 BIT1 spare ('0'B),
468 uint3_t usf,
469 BIT1 usf_granularity,
470 BIT1 p0_present,
471 uint4_t p0 optional,
472 BIT1 pr_mode optional,
473 ChCodingCommand ch_coding_cmd,
474 BIT1 tlli_block_chan_coding,
475 BIT1 alpha_present,
476 uint4_t alpha optional,
477 uint5_t gamma,
478 BIT1 ta_index_present,
479 uint4_t ta_index optional,
480 BIT1 tbf_starting_time_present,
481 uint16_t tbf_starting_time optional
482 } with {
483 variant (p0) "PRESENCE(p0_present = '1'B)"
484 variant (pr_mode) "PRESENCE(p0_present = '1'B)"
485 variant (alpha) "PRESENCE(alpha_present = '1'B)"
486 variant (ta_index) "PRESENCE(ta_index_present = '1'B)"
487 variant (tbf_starting_time) "PRESENCE(tbf_starting_time_present = '1'B)"
488 };
489 type record PacketUlAssignSgl {
490 BIT1 alpha_present,
491 uint4_t alpha optional,
492 uint5_t gamma,
493 BIT2 padding ('01'B),
494 uint16_t tbf_starting_time
495 /* TODO: P0 / PR_MODE */
496 } with {
497 variant (alpha) "PRESENCE(alpha_present = '1'B)"
498 };
499 type record PacketUlAssign {
500 BIT1 presence,
501 PacketUlAssignDyn dynamic optional,
502 PacketUlAssignSgl single optional
503 /* TODO: Estended RA, PFI */
504 } with {
505 variant (dynamic) "PRESENCE(presence = '1'B)"
506 variant (single) "PRESENCE(presence = '0'B)"
507 };
508 type record PacketDlAssG1 {
509 uint5_t tfi_assignment,
510 BIT1 rlc_mode,
511 BIT1 alpha_present,
512 uint4_t alpha optional,
513 uint5_t gamma,
514 BIT1 polling,
515 BIT1 ta_valid
516 } with { variant "" };
517 type record PacketDlAssign {
518 GprsTlli tlli,
519 BIT1 group1_present,
520 PacketDlAssG1 group1 optional,
521 BIT1 ta_index_present,
522 uint4_t ta_index optional,
523 BIT1 tbf_starting_time_present,
524 uint16_t tbf_starting_time optional,
525 BIT1 p0_present,
526 uint4_t p0 optional,
527 BIT1 pr_mode optional
528 /* TODO: EGPRS window size, etc. */
529 } with {
530 variant (group1) "PRESENCE(group1_present = '1'B)"
531 variant (ta_index) "PRESENCE(ta_index_present = '1'B)"
532 variant (tbf_starting_time) "PRESENCE(tbf_starting_time_present = '1'B)"
533 variant (p0) "PRESENCE(p0_present = '1'B)"
534 variant (pr_mode) "PRESENCE(p0_present = '1'B)"
535 };
536 type record IaRestOctLL {
537 BIT1 compressed_irat_ho_info_ind
Vadim Yanitskiyb021ed42020-04-27 23:25:13 +0700538 } with {
539 variant (compressed_irat_ho_info_ind) "CSN.1 L/H"
540 };
Pau Espin Pedrol461ed612019-12-30 20:18:34 +0100541 type record EgprsUlAssignDyn {
542 uint5_t tfi_assignment,
543 BIT1 polling,
544 BIT1 spare ('0'B),
545 uint3_t usf,
546 BIT1 usf_granularity,
547 BIT1 p0_present,
548 uint4_t p0 optional,
549 BIT1 pr_mode optional,
550 EgprsChCodingCommand egprs_ch_coding_cmd,
551 BIT1 tlli_block_chan_coding,
552 BIT1 bep_period2_present,
553 BIT4 bep_period2 optional,
554 BIT1 resegment,
555 EgprsWindowSize egprs_window_size,
556 BIT1 alpha_present,
557 uint4_t alpha optional,
558 uint5_t gamma,
559 BIT1 ta_index_present,
560 uint4_t ta_index optional,
561 BIT1 tbf_starting_time_present,
562 uint16_t tbf_starting_time optional
563 /* TODO: Additions for Rel-7 */
564 } with {
565 variant (p0) "PRESENCE(p0_present = '1'B)"
566 variant (pr_mode) "PRESENCE(p0_present = '1'B)"
567 variant (bep_period2) "PRESENCE(bep_period2_present = '1'B)"
568 variant (alpha) "PRESENCE(alpha_present = '1'B)"
569 variant (ta_index) "PRESENCE(ta_index_present = '1'B)"
570 variant (tbf_starting_time) "PRESENCE(tbf_starting_time_present = '1'B)"
571 };
572 type record EgprsUlAssignMultiblock {
573 BIT1 alpha_present,
574 uint4_t alpha optional,
575 uint5_t gamma,
576 uint16_t tbf_starting_time,
577 BIT2 nr_radio_blocks_allocated,
578 BIT1 p0_present,
579 uint4_t p0 optional,
580 BIT1 spare ('0'B) optional,
581 BIT1 pr_mode optional
582 /* TDO: Additions for Rel-6 */
583 } with {
584 variant (alpha) "PRESENCE(alpha_present = '1'B)"
585 variant (p0) "PRESENCE(p0_present = '1'B)"
586 variant (spare) "PRESENCE(p0_present = '1'B)"
587 variant (pr_mode) "PRESENCE(p0_present = '1'B)"
588 };
589 /* 3GPP TS 44.018 version 13.3.2 10.5.2.16, "EGPRS Packet Uplink Assignment" */
590 type record EgprsUlAss {
591 BIT5 ext_ra,
592 BIT1 ats_present,
593 AccessTechnologiesRequestRepetition ats optional,
594 BIT1 presence,
595 EgprsUlAssignDyn dynamic optional,
596 EgprsUlAssignMultiblock multiblock optional
597 } with {
598 variant (ats) "PRESENCE(ats_present = '1'B)"
599 variant (dynamic) "PRESENCE(presence = '1'B)"
600 variant (multiblock) "PRESENCE(presence = '0'B)"
Vadim Yanitskiye05d7162020-05-02 16:58:46 +0700601 /* See https://bugs.eclipse.org/bugs/show_bug.cgi?id=562488 */
602 variant (ext_ra) "BYTEORDER(last)" // FIXME: should be first
Pau Espin Pedrol461ed612019-12-30 20:18:34 +0100603 };
604
Harald Welte9419c8a2017-07-30 04:07:05 +0200605 type octetstring MblkDlAss; /* TODO */
606 type record IaRestOctLH {
607 BIT2 presence,
608 EgprsUlAss egprs_ul optional,
609 MblkDlAss multiblock_dl_ass optional
610 } with {
611 variant (egprs_ul) "PRESENCE(presence = '00'B)"
612 variant (multiblock_dl_ass) "PRESENCE(presence = '01'B)"
613 };
614 type record IaRestOctets {
615 BIT2 presence,
616 IaRestOctLL ll optional,
617 IaRestOctLH lh optional,
618 IaRestOctHL hl optional,
Vadim Yanitskiy9b2a3e82019-09-08 15:37:15 +0200619 IaRestOctHH hh optional
Harald Welte9419c8a2017-07-30 04:07:05 +0200620 } with {
Vadim Yanitskiyb021ed42020-04-27 23:25:13 +0700621 variant (presence) "CSN.1 L/H"
Harald Welte9419c8a2017-07-30 04:07:05 +0200622 variant (ll) "PRESENCE(presence = '00'B)"
623 variant (lh) "PRESENCE(presence = '01'B)"
624 variant (hl) "PRESENCE(presence = '10'B)"
625 variant (hh) "PRESENCE(presence = '11'B)"
Vadim Yanitskiy9b2a3e82019-09-08 15:37:15 +0200626 variant "PADDING(yes), PADDING_PATTERN('00101011'B)"
Harald Welte9419c8a2017-07-30 04:07:05 +0200627 };
628
Harald Weltecbc947f2018-02-22 00:26:55 +0100629 type record MeasurementResults {
630 BIT1 ba_used,
631 BIT1 dtx_used,
632 uint6_t rxlev_full_srv_cell,
633 BIT1 threeg_ba_used,
634 BIT1 meas_valid,
635 uint6_t rxlev_sub_srv_cell,
636 BIT1 si23_ba_used,
637 uint3_t rxqual_full_srv_cell,
638 uint3_t rxqual_sub_srv_cell,
639 uint3_t no_ncell_m,
640 NcellReports ncell_reports optional
641 } with { variant (no_ncell_m) "LENGTHTO(ncell_reports)"
642 variant (no_ncell_m) "UNIT(elements)"
643 variant "PADDING(yes)"
644 variant "FIELDLENGTH(16)"
645 };
646
647 type record NcellReport {
648 uint6_t rxlev,
649 uint5_t bcch_freq,
650 uint6_t bsic
651 } with { variant ""};
652 type record of NcellReport NcellReports;
653
Harald Welte9419c8a2017-07-30 04:07:05 +0200654
Vadim Yanitskiy27b38012020-09-01 05:14:46 +0700655 /* 3GPP TS 44.018, section 9.1.2 (minimalistic implementation) */
656 type record AssignmentCommand {
657 ChannelDescription chan_desc,
658 PowerCommand_V power_cmd,
659 FrequencyList_TLV freq_list_at optional,
660 CellChannelDescription_TV cell_chan_desc optional,
661 /* TODO: Multislot Allocation IE */
662 ChannelMode_TV chan1_mode optional,
663 ChannelMode_TV chan2_mode optional,
664 /* TODO: Mode of Channel Set 3..8 IE */
665 MobileAllocationTLV mobile_allocation optional
666 /* TODO: more optional IEs... */
667 } with {
668 variant "TAG(
669 freq_list_at, elementIdentifier = '05'O;
670 cell_chan_desc, elementIdentifier = '62'O;
671 chan1_mode, elementIdentifier = '63'O;
672 chan2_mode, elementIdentifier = '11'O;
673 mobile_allocation, iei = '72'O;
674 )"
675 };
676
Vadim Yanitskiy5fec37c2020-09-02 17:19:47 +0700677 /* 3GPP TS 44.018, section 9.1.15 (minimalistic implementation) */
678 type record HandoverCommand {
679 CellDescriptionV cell_desc,
680 ChannelDescription chan_desc,
681 OCT1 ho_ref,
682 PowerCommandAndAccesstype_V power_cmd_acc_type,
683 FrequencyList_TLV freq_list_at optional,
684 CellChannelDescription_TV cell_chan_desc optional,
685 ChannelMode_TV chan1_mode optional,
686 ChannelMode_TV chan2_mode optional,
687 /* TODO: Mode of Channel Set 3..8 IE */
688 MobileAllocationTLV mobile_allocation optional
689 /* TODO: more optional IEs... */
690 } with {
691 variant "TAG(
692 freq_list_at, elementIdentifier = '05'O;
693 cell_chan_desc, elementIdentifier = '62'O;
694 chan1_mode, elementIdentifier = '63'O;
695 chan2_mode, elementIdentifier = '11'O;
696 mobile_allocation, iei = '72'O;
697 )"
698 };
699
700 /* 10.5.2.2 Cell Description IE */
701 type record CellDescriptionV {
702 uint3_t bcc, /* PLMN colour code */
703 uint3_t ncc, /* BS colour code */
704 uint10_t bcch_arfcn
705 } with { variant "FIELDORDER(lsb)" };
706
Vadim Yanitskiy27b38012020-09-01 05:14:46 +0700707
Harald Welte9419c8a2017-07-30 04:07:05 +0200708 /* 9.1.18 */
709 type record ImmediateAssignment {
710 DedicatedModeOrTbf ded_or_tbf,
711 PageMode page_mode,
712 ChannelDescription chan_desc optional,
713 PacketChannelDescription pkt_chan_desc optional,
714 RequestReference req_ref,
715 TimingAdvance timing_advance,
Vadim Yanitskiy3b464a92020-08-25 03:55:32 +0700716 MobileAllocationLV mobile_allocation,
Harald Welte9419c8a2017-07-30 04:07:05 +0200717 /* TODO: starting time TLV */
Vadim Yanitskiyf10bb452019-09-05 13:53:01 +0200718 IaRestOctets rest_octets
Harald Welte9419c8a2017-07-30 04:07:05 +0200719 } with { variant (chan_desc) "PRESENCE(ded_or_tbf.tbf = false)"
Vadim Yanitskiya4aacc22019-09-09 04:41:12 +0200720 variant (pkt_chan_desc) "PRESENCE(ded_or_tbf.tbf = true)" };
Harald Welte9419c8a2017-07-30 04:07:05 +0200721
722 /* 9.1.20 */
723 type record ReqRefWaitInd {
724 RequestReference req_ref,
725 WaitIndication wait_ind
726 } with { variant "" };
727 type record length(4) of ReqRefWaitInd ReqRefWaitInd4;
728 type record ImmediateAssignmentReject {
729 FeatureIndicator feature_ind,
730 PageMode page_mode,
Vadim Yanitskiy7ef121d2020-05-22 03:04:22 +0700731 ReqRefWaitInd4 payload,
732 IARRestOctets rest_octets
Harald Welte9419c8a2017-07-30 04:07:05 +0200733 } with { variant "" };
734
Vadim Yanitskiy7ef121d2020-05-22 03:04:22 +0700735 /* 10.5.2.17 IAR (Immediate Assignment Reject) Rest Octets */
736 type record IARRestOctets {
737 ExtRAList ext_ra_list,
738 BIT1 rel13_ind, // L/H
739 uint3_t rcc optional
740 /* Addition in Rel-15: PEO IMM Cell Group Details struct */
741 } with {
742 variant (rel13_ind) "CSN.1 L/H"
743 variant (rcc) "PRESENCE(rel13_ind = '1'B)"
744
745 /* The TITAN's RAW encoder generates an octet-aligned octetstring,
746 * so we should make sure that unused bits contain proper padding. */
747 variant "PADDING(yes), PADDING_PATTERN('00101011'B)"
748 };
749
750 /* Optional extended RA: 0 | 1 < Extended RA 1 : bit (5) > */
751 type record ExtRAOpt {
752 BIT1 presence, // L/H
753 BIT5 ext_ra optional
754 } with {
755 variant (presence) "CSN.1 L/H"
756 variant (ext_ra) "PRESENCE(presence = '1'B)"
757 /* See https://bugs.eclipse.org/bugs/show_bug.cgi?id=562488 */
758 variant (ext_ra) "BYTEORDER(last)"
759 };
760
761 type record length(4) of ExtRAOpt ExtRAList;
762
Harald Weltecbc947f2018-02-22 00:26:55 +0100763 /* 9.1.21 */
764 type record MeasurementReport {
765 MeasurementResults meas_res
766 } with { variant "" };
767
Harald Welte9419c8a2017-07-30 04:07:05 +0200768 /* 9.1.22 */
769 type record PagingRequestType1 {
770 ChannelNeeded12 chan_needed,
771 PageMode page_mode,
772 MobileIdentityLV mi1,
773 MobileIdentityTLV mi2 optional,
774 RestOctets rest_octets
Vadim Yanitskiy98bb2d52020-03-28 00:57:21 +0700775 } with { variant "TAG(mi2, elementIdentifier = '0010111'B)" };
Harald Welte9419c8a2017-07-30 04:07:05 +0200776
777 /* 9.1.23 */
778 type record PagingRequestType2 {
779 ChannelNeeded12 chan_needed,
780 PageMode page_mode,
781 GsmTmsi mi1,
782 GsmTmsi mi2,
783 MobileIdentityTLV mi3 optional,
784 RestOctets rest_octets
Vadim Yanitskiy98bb2d52020-03-28 00:57:21 +0700785 } with { variant "TAG(mi3, elementIdentifier = '0010111'B)" };
Harald Welte9419c8a2017-07-30 04:07:05 +0200786
787 /* 9.1.24 */
788 type record length(4) of GsmTmsi GsmTmsi4;
789 type record PagingRequestType3 {
790 ChannelNeeded12 chan_needed,
791 PageMode page_mode,
792 GsmTmsi4 mi,
793 RestOctets rest_octets
794 } with { variant "" };
795
Harald Welte9419c8a2017-07-30 04:07:05 +0200796 type union RrUnion {
797/*
798 SystemInformationType1 si1,
799 SystemInformationType2 si2,
800 SystemInformationType2bis si2bis,
801 SystemInformationType2ter si2ter,
Harald Welte82ccef72018-02-25 16:17:33 +0100802 SystemInformationType3 si3,
Harald Welte9419c8a2017-07-30 04:07:05 +0200803 SystemInformationType4 si4,
804 SystemInformationType5 si5,
805 SystemInformationType5bis si5bis,
806 SystemInformationType5ter si5ter,
807 SystemInformationType6 si6,
808*/
809 ImmediateAssignment imm_ass,
810 ImmediateAssignmentReject imm_ass_rej,
811 PagingRequestType1 pag_req_1,
812 PagingRequestType2 pag_req_2,
813 PagingRequestType3 pag_req_3,
814 octetstring other
815 } with { variant "" };
816
817 /* Special RR Message on BCCH / CCCH Dowlink */
818
819 type record GsmRrMessage {
820 RrHeader header,
821 RrUnion payload
822 } with { variant (payload) "CROSSTAG(
823/*
824 si1, header.message_type = SYSTEM_INFORMATION_TYPE_1;
825 si2, header.message_type = SYSTEM_INFORMATION_TYPE_2;
826 si2bis, header.message_type = SYSTEM_INFORMATION_TYPE_2bis;
827 si2ter, header.message_type = SYSTEM_INFORMATION_TYPE_2ter;
828 si3, header.message_type = SYSTEM_INFORMATION_TYPE_3;
829 si4, header.message_type = SYSTEM_INFORMATION_TYPE_4;
830 si5, header.message_type = SYSTEM_INFORMATION_TYPE_5;
831 si5bis, header.message_type = SYSTEM_INFORMATION_TYPE_5bis;
832 si5ter, header.message_type = SYSTEM_INFORMATION_TYPE_5ter;
833 si6, header.message_type = SYSTEM_INFORMATION_TYPE_6;
834*/
835 imm_ass, header.message_type = IMMEDIATE_ASSIGNMENT;
836 imm_ass_rej, header.message_type = IMMEDIATE_ASSIGNMENT_REJECT;
837 pag_req_1, header.message_type = PAGING_REQUEST_TYPE_1;
838 pag_req_2, header.message_type = PAGING_REQUEST_TYPE_2;
839 pag_req_3, header.message_type = PAGING_REQUEST_TYPE_3;
840 other, OTHERWISE;
Vadim Yanitskiya4aacc22019-09-09 04:41:12 +0200841 )"
842 /* Total message length: 184 = 23 * 8. Pad spare bits with '2B'O. */
843 variant "PADDING(184), PADDING_PATTERN('00101011'B)"
844 };
Harald Welte9419c8a2017-07-30 04:07:05 +0200845
846 external function enc_GsmRrMessage(in GsmRrMessage msg) return octetstring
847 with { extension "prototype(convert) encode(RAW)" };
848 external function dec_GsmRrMessage(in octetstring stream) return GsmRrMessage
849 with { extension "prototype(convert) decode(RAW)" };
850
851 /* Normal L3 Message on Dedicated Channel */
852
853 /* 9.1.25 Paging Response */
854 type record PagingResponse {
855 uint4_t spare_half_octet,
856 CipheringKeySeqNr cksn,
857 MsClassmark2LV cm2,
858 MobileIdentityLV mi,
859 uint8_t addl_upd_par optional
860 } with { variant "" };
861
862 type union RrL3Union {
Vadim Yanitskiy480c2ac2020-09-01 05:43:06 +0700863 PagingResponse paging_response,
864 MeasurementReport meas_rep,
865 AssignmentCommand ass_cmd,
Vadim Yanitskiy5fec37c2020-09-02 17:19:47 +0700866 HandoverCommand ho_cmd,
Vadim Yanitskiy480c2ac2020-09-01 05:43:06 +0700867 octetstring other
Harald Welte9419c8a2017-07-30 04:07:05 +0200868 };
869
870 type record GsmRrL3Message {
871 RrL3Header header,
872 RrL3Union payload
873 } with { variant (payload) "CROSSTAG(
874 paging_response, header.message_type = PAGING_RESPONSE;
Harald Weltecbc947f2018-02-22 00:26:55 +0100875 meas_rep, header.message_type = MEASUREMENT_REPORT;
Vadim Yanitskiy27b38012020-09-01 05:14:46 +0700876 ass_cmd, header.message_type = ASSIGNMENT_COMMAND;
Vadim Yanitskiy5fec37c2020-09-02 17:19:47 +0700877 ho_cmd, header.message_type = HANDOVER_COMMAND;
Harald Welte9419c8a2017-07-30 04:07:05 +0200878 other, OTHERWISE;
879 )" }
880
Harald Weltecbc947f2018-02-22 00:26:55 +0100881 external function enc_GsmRrL3Message(in GsmRrL3Message msg) return octetstring
882 with { extension "prototype(convert) encode(RAW)" };
883 external function dec_GsmRrL3Message(in octetstring stream) return GsmRrL3Message
884 with { extension "prototype(convert) decode(RAW)" };
885
886
Vadim Yanitskiy7091e8d2019-09-09 01:07:37 +0200887 template PacketDlAssign tr_PacketDlAssign(template GprsTlli tlli) := {
888 tlli := tlli,
889 group1_present := ?,
890 group1 := *,
891 ta_index_present := ?,
892 ta_index := *,
893 tbf_starting_time_present := ?,
894 tbf_starting_time := *,
895 p0_present := ?,
896 p0 := *,
897 pr_mode := *
898 };
899
900 template IaRestOctets tr_IaRestOctets_DLAss(template PacketDlAssign dl_ass) := {
901 presence := '11'B, /* HH */
902 ll := omit, lh := omit, hl := omit,
903 hh := {
904 pa_disc := '0'B, /* Packet Assignment (0) */
905 pa := {
906 uldl := {
907 ass_disc := '1'B, /* Downlink Assignment (1) */
908 ass := { dl := dl_ass }
909 }
910 }
911 }
912 };
913
914 template PacketUlAssign tr_PacketUlDynAssign(template uint5_t tfi := ?,
915 template BIT1 polling := ?,
916 template uint3_t usf := ?,
917 template BIT1 usf_granularity := ?,
918 template ChCodingCommand cs := ?) := {
Vadim Yanitskiy06ca64d2019-09-29 20:17:10 +0700919 presence := '1'B, /* Dynamic Block Allocation */
Vadim Yanitskiy7091e8d2019-09-09 01:07:37 +0200920 dynamic := {
921 tfi_assignment := tfi,
922 polling := polling,
Vadim Yanitskiy06ca64d2019-09-29 20:17:10 +0700923 spare := '0'B, /* Dynamic Block Allocation (mandatory after Rel-4) */
Vadim Yanitskiy7091e8d2019-09-09 01:07:37 +0200924 usf := usf,
925 usf_granularity := usf_granularity,
926 p0_present := ?,
927 p0 := *,
928 pr_mode := *,
929 ch_coding_cmd := cs,
930 tlli_block_chan_coding := ?,
931 alpha_present := ?,
932 alpha := *,
933 gamma := ?,
934 /* TODO: add to parameters */
935 ta_index_present := ?,
936 ta_index := *,
937 tbf_starting_time_present := ?,
938 tbf_starting_time := *
939 },
940 single := omit
941 };
942
943 template PacketUlAssign tr_PacketUlSglAssign := {
Vadim Yanitskiy06ca64d2019-09-29 20:17:10 +0700944 presence := '0'B, /* Single Block Allocation */
Vadim Yanitskiy7091e8d2019-09-09 01:07:37 +0200945 dynamic := omit,
946 single := {
947 alpha_present := ?,
948 alpha := *,
949 gamma := ?,
950 padding := '01'B,
951 tbf_starting_time := ?
952 }
953 };
954
955 template IaRestOctets tr_IaRestOctets_ULAss(template PacketUlAssign ul_ass) := {
956 presence := '11'B, /* HH */
957 ll := omit, lh := omit, hl := omit,
958 hh := {
959 pa_disc := '0'B, /* Packet Assignment (0) */
960 pa := {
961 uldl := {
962 ass_disc := '0'B, /* Uplink Assignment (0) */
963 ass := { ul := ul_ass }
964 }
965 }
966 }
967 };
968
Vadim Yanitskiya0b47cf2020-04-02 01:50:18 +0700969 template EgprsUlAss tr_EgprsUlAssDynamic(template (present) BIT5 ext_ra := ?,
970 template EgprsUlAssignDyn dyn_ass := ?) := {
971 ext_ra := ext_ra,
972 ats_present := ?,
973 ats := *,
974 presence := '1'B,
975 dynamic := dyn_ass,
976 multiblock := omit
977 };
978 template EgprsUlAss tr_EgprsUlAssMultiblock(template (present) BIT5 ext_ra := ?,
979 template EgprsUlAssignMultiblock mb_ass := ?) := {
980 ext_ra := ext_ra,
981 ats_present := ?,
982 ats := *,
983 presence := '0'B,
984 dynamic := omit,
985 multiblock := mb_ass
986 };
987
988 template IaRestOctets tr_IaRestOctets_EGPRSULAss(template EgprsUlAss ul_ass) := {
989 presence := '01'B, /* LH */
990 ll := omit,
991 lh := {
992 presence := '00'B,
993 egprs_ul := ul_ass,
994 multiblock_dl_ass := omit
995 },
996 hl := omit,
997 hh := omit
998 };
999
Harald Weltee8d750e2018-06-10 21:41:35 +02001000 template (value) GsmRrMessage ts_IMM_ASS(uint8_t ra, GsmFrameNumber fn, TimingAdvance ta,
Vadim Yanitskiy3b464a92020-08-25 03:55:32 +07001001 ChannelDescription ch_desc, MobileAllocationLV ma) := {
Harald Weltebae6be82020-08-21 12:42:18 +02001002 header := ts_RrHeader(IMMEDIATE_ASSIGNMENT, 0),
Harald Weltecbc947f2018-02-22 00:26:55 +01001003 payload := {
1004 imm_ass := {
1005 ded_or_tbf := {
1006 spare := '0'B,
1007 tma := false,
1008 downlink := false,
1009 tbf := false
1010 },
1011 page_mode := PAGE_MODE_NORMAL,
1012 chan_desc := ch_desc,
1013 pkt_chan_desc := omit,
1014 req_ref := f_compute_ReqRef(ra, fn),
1015 timing_advance := ta,
1016 mobile_allocation := ma,
Vadim Yanitskiyf10bb452019-09-05 13:53:01 +02001017 rest_octets := {
1018 presence := '00'B, /* LL */
1019 ll := {
Vadim Yanitskiyb021ed42020-04-27 23:25:13 +07001020 compressed_irat_ho_info_ind := '0'B /* L */
Vadim Yanitskiy9b2a3e82019-09-08 15:37:15 +02001021 },
1022 lh := omit, hl := omit, hh := omit
Vadim Yanitskiyf10bb452019-09-05 13:53:01 +02001023 }
Harald Weltecbc947f2018-02-22 00:26:55 +01001024 }
1025 }
1026 };
1027
Harald Weltee8d750e2018-06-10 21:41:35 +02001028 template GsmRrMessage tr_IMM_ASS(template uint8_t ra := ?, template GsmFrameNumber fn := ?,
1029 template TimingAdvance ta := ?,
1030 template ChannelDescription ch_desc := ?,
Vadim Yanitskiy3b464a92020-08-25 03:55:32 +07001031 template MobileAllocationLV ma := ?) := {
Vadim Yanitskiyd4205c32019-09-09 16:15:37 +02001032 header := t_RrHeader(IMMEDIATE_ASSIGNMENT, ?),
Harald Weltee8d750e2018-06-10 21:41:35 +02001033 payload := {
1034 imm_ass := {
1035 ded_or_tbf := {
1036 spare := '0'B,
1037 tma := false,
1038 downlink := false,
1039 tbf := false
1040 },
1041 page_mode := PAGE_MODE_NORMAL,
1042 chan_desc := ch_desc,
1043 pkt_chan_desc := omit,
1044 req_ref := tr_compute_ReqRef(ra, fn),
1045 timing_advance := ta,
1046 mobile_allocation := ma,
Vadim Yanitskiyf10bb452019-09-05 13:53:01 +02001047 rest_octets := ?
Harald Weltee8d750e2018-06-10 21:41:35 +02001048 }
1049 }
1050 };
1051
Vadim Yanitskiy6edd4f52019-09-09 01:51:09 +02001052 /* TODO: implement send version of this template */
1053 template GsmRrMessage tr_IMM_TBF_ASS(template boolean dl := ?,
1054 template uint8_t ra := ?,
1055 template GsmFrameNumber fn := ?,
1056 template TimingAdvance ta := ?,
1057 template PacketChannelDescription ch_desc := ?,
Vadim Yanitskiy3b464a92020-08-25 03:55:32 +07001058 template MobileAllocationLV ma := ?,
Vadim Yanitskiy6edd4f52019-09-09 01:51:09 +02001059 template IaRestOctets rest := ?) := {
1060 header := t_RrHeader(IMMEDIATE_ASSIGNMENT, ?),
1061 payload := {
1062 imm_ass := {
1063 ded_or_tbf := {
1064 spare := ?,
1065 tma := ?,
1066 downlink := dl,
1067 tbf := true
1068 },
1069 page_mode := ?,
1070 chan_desc := omit,
1071 pkt_chan_desc := ch_desc,
1072 req_ref := tr_compute_ReqRef(ra, fn),
1073 timing_advance := ta,
Vadim Yanitskiycf1ed3f2020-07-20 04:01:43 +07001074 mobile_allocation := ma,
Vadim Yanitskiy6edd4f52019-09-09 01:51:09 +02001075 rest_octets := rest
1076 }
1077 }
1078 };
Harald Weltee8d750e2018-06-10 21:41:35 +02001079
Vadim Yanitskiy9781ecb2020-03-28 03:59:41 +07001080 template GsmRrMessage tr_PAG_REQ1(template MobileIdentityLV mi1 := ?,
1081 template MobileIdentityTLV mi2 := omit) := {
Pau Espin Pedrol88bf5372019-12-09 21:12:28 +01001082 header := t_RrHeader(PAGING_REQUEST_TYPE_1, ?),
1083 payload := {
1084 pag_req_1 := {
1085 chan_needed := {
1086 second := ?,
1087 first := ?
1088 },
1089 page_mode := PAGE_MODE_NORMAL,
1090 mi1 := mi1,
Vadim Yanitskiy9781ecb2020-03-28 03:59:41 +07001091 mi2 := mi2,
Pau Espin Pedrol88bf5372019-12-09 21:12:28 +01001092 rest_octets := ?
1093 }
1094 }
1095 };
1096
Harald Weltecbc947f2018-02-22 00:26:55 +01001097 template (value) GsmRrL3Message ts_MEAS_REP(boolean valid, uint6_t rxl_f, uint6_t rxl_s,
1098 uint3_t rxq_f, uint3_t rxq_s,
1099 template (omit) NcellReports reps) := {
1100 header := t_RrL3Header(MEASUREMENT_REPORT),
1101 payload := {
1102 meas_rep := {
1103 meas_res := {
1104 ba_used := '0'B,
1105 dtx_used := '0'B,
1106 rxlev_full_srv_cell := rxl_f,
1107 threeg_ba_used := '0'B,
Harald Welteeb1e6812018-02-22 18:43:48 +01001108 meas_valid := bool2bit(not valid),
Harald Weltecbc947f2018-02-22 00:26:55 +01001109 rxlev_sub_srv_cell := rxl_s,
1110 si23_ba_used := '0'B,
1111 rxqual_full_srv_cell := rxq_f,
1112 rxqual_sub_srv_cell := rxq_s,
1113 no_ncell_m := 0,
1114 ncell_reports := reps
1115 }
1116 }
1117 }
1118 };
1119
Vadim Yanitskiy16e24aa2020-05-22 03:32:00 +07001120 template GsmRrMessage tr_IMM_ASS_REJ(template FeatureIndicator feature_ind := ?,
1121 template ReqRefWaitInd4 rr_wi_list := ?,
1122 template IARRestOctets rest_octets := ?) := {
1123 header := t_RrHeader(IMMEDIATE_ASSIGNMENT_REJECT, ?),
1124 payload := {
1125 imm_ass_rej := {
1126 feature_ind := feature_ind,
1127 page_mode := ?,
1128 payload := rr_wi_list,
1129 rest_octets := rest_octets
1130 }
1131 }
1132 };
1133
1134 template ReqRefWaitInd tr_ReqRefWaitInd(template RequestReference ref := ?,
1135 template WaitIndication wi := ?) := {
1136 req_ref := ref,
1137 wait_ind := wi
1138 };
1139
1140 template IARRestOctets tr_IARRestOctets(template ExtRAList ext_ra_list := ?,
1141 template uint3_t rcc := ?) := {
1142 ext_ra_list := ext_ra_list,
1143 rel13_ind := ?,
1144 rcc := rcc ifpresent
1145 };
1146
1147 template ExtRAOpt tr_ExtRAOpt(template BIT5 ext_ra := ?) := {
1148 presence := '1'B, // L/H
1149 ext_ra := ext_ra
1150 };
1151
Vadim Yanitskiyf7181ed2020-07-14 20:12:02 +07001152 template (value) ChannelDescription ts_ChanDescH0(template (value) RslChannelNr chan_nr,
1153 template (value) uint12_t arfcn,
1154 template (value) uint3_t tsc := 7) := {
1155 chan_nr := chan_nr,
1156 tsc := tsc,
1157 h := false,
1158 arfcn := arfcn,
1159 maio_hsn := omit
1160 }
Vadim Yanitskiyc3156ed2020-08-29 17:49:27 +07001161 template ChannelDescription tr_ChanDescH0(template (present) RslChannelNr chan_nr := ?,
1162 template (present) uint12_t arfcn := ?,
1163 template (present) uint3_t tsc := ?) := {
1164 chan_nr := chan_nr,
1165 tsc := tsc,
1166 h := false,
1167 arfcn := arfcn,
1168 maio_hsn := omit
1169 }
Vadim Yanitskiyf7181ed2020-07-14 20:12:02 +07001170
1171 template (value) ChannelDescription ts_ChanDescH1(template (value) RslChannelNr chan_nr,
1172 template (value) MaioHsn maio_hsn,
1173 template (value) uint3_t tsc := 7) := {
1174 chan_nr := chan_nr,
1175 tsc := tsc,
1176 h := true,
1177 arfcn := omit,
1178 maio_hsn := maio_hsn
1179 }
Vadim Yanitskiyc3156ed2020-08-29 17:49:27 +07001180 template ChannelDescription tr_ChanDescH1(template (present) RslChannelNr chan_nr := ?,
1181 template (present) MaioHsn maio_hsn := ?,
1182 template (present) uint3_t tsc := ?) := {
1183 chan_nr := chan_nr,
1184 tsc := tsc,
1185 h := true,
1186 arfcn := omit,
1187 maio_hsn := maio_hsn
1188 }
Vadim Yanitskiyf7181ed2020-07-14 20:12:02 +07001189
Neels Hofmeyr0edf4ac2020-07-10 17:33:24 +02001190
1191 /* Templates for the RR Channel Release message's "Cell selection indicator after release of all TCH and SDCCH" IE.
1192 * See 3GPP TS 44.018 9.1.7 and 10.5.2.1e */
1193
1194 /* 3GPP TS 44.018 10.5.2.1e, Cell Selection Indicator after release of all TCH and SDCCH value part */
1195 type record CellSelIndValue {
1196 BIT3 discr,
1197 CellSelIndValueEnum value_list,
1198 BIT1 value_list_term ('0'B)
1199 } with {
1200 variant (value_list) "CROSSTAG(
1201 gsm, discr='000'B;
1202 utran_fdd, discr='001'B;
1203 utran_tdd, discr='010'B;
1204 eutran, discr='011'B;
1205 )"
1206 };
1207
1208 /* 3GPP TS 44.018 10.5.2.1e, Cell Selection Indicator after release of all TCH and SDCCH value part */
1209 private type union CellSelIndValueEnum {
1210 CellSelIndValue_GSM_Descrs gsm,
1211 CellSelIndValue_UTRAN_Descrs utran_fdd,
1212 CellSelIndValue_UTRAN_Descrs utran_tdd,
1213 CellSelIndValue_EUTRAN_Descrs eutran
1214 } with { variant "" };
1215
1216 type record of CellSelIndValue_GSM_Descr CellSelIndValue_GSM_Descrs;
1217 /* 3GPP TS 44.018 10.5.2.1e, GSM Description struct */
1218 type record CellSelIndValue_GSM_Descr {
1219 BIT1 item_ind ('1'B),
1220 BIT1 band_indicator,
1221 uint10_t arfcn,
1222 uint6_t bsic
1223 } with {
1224 variant "PRESENCE(item_ind = '1'B)"
1225 };
1226
1227 type record of CellSelIndValue_UTRAN_Descr CellSelIndValue_UTRAN_Descrs;
1228 /* 3GPP TS 44.018 10.5.2.1e, UTRAN {FDD,TDD} Description struct */
1229 type record CellSelIndValue_UTRAN_Descr {
1230 BIT1 item_ind ('1'B),
1231 BIT1 bandwidth_presence,
1232 uint3_t bandwidth optional,
1233 uint14_t arfcn,
1234 BIT1 cell_info_presence,
1235 UTRAN_CellInfo cell_info optional
1236 } with {
1237 variant "PRESENCE(item_ind = '1'B)"
1238 variant (bandwidth) "PRESENCE(bandwidth_presence = '1'B)"
1239 variant (cell_info) "PRESENCE(cell_info_presence = '1'B)"
1240 };
1241 type record UTRAN_CellInfo {
1242 BIT1 indic0,
1243 uint5_t nr_of_cells,
1244 // TODO: define cell_information_field
1245 octetstring cell_information_field
1246 } with { variant "" };
1247
1248 type record of CellSelIndValue_EUTRAN_Descr CellSelIndValue_EUTRAN_Descrs;
1249 /* 3GPP TS 44.018 10.5.2.1e, E-UTRAN Description struct */
1250 type record CellSelIndValue_EUTRAN_Descr {
1251 BIT1 item_ind ('1'B),
1252 uint16_t earfcn,
1253 BIT1 meas_bw_presence,
1254 uint3_t meas_bw optional,
1255 BIT1 not_allowed_cells_presence,
1256 // define not_allowed_cells
1257 octetstring not_allowed_cells optional,
1258 BIT1 target_pcid_presence,
1259 uint9_t target_pcid optional
1260 } with {
1261 variant "PRESENCE(item_ind = '1'B)"
1262 variant (meas_bw) "PRESENCE(meas_bw_presence = '1'B)"
1263 variant (not_allowed_cells) "PRESENCE(not_allowed_cells_presence = '1'B)"
1264 variant (target_pcid) "PRESENCE(target_pcid_presence = '1'B)"
1265 };
1266
1267 template CellSelIndValue tr_CellSelIndValue_EUTRAN(
1268 template CellSelIndValue_EUTRAN_Descrs cells := {})
1269 := {
1270 discr := '011'B,
1271 value_list := {
1272 eutran := cells
1273 },
1274 value_list_term := '0'B
1275 };
1276
1277 template CellSelIndValue_EUTRAN_Descr tr_CellSelIndValue_EUTRAN_Descr(
1278 template (present) uint16_t earfcn,
1279 template (present) BIT1 meas_bw_presence := ?,
1280 template uint3_t meas_bw := *)
1281 := {
1282 item_ind := '1'B,
1283 earfcn := earfcn,
1284 meas_bw_presence := meas_bw_presence,
1285 meas_bw := meas_bw,
1286 not_allowed_cells_presence := '0'B,
1287 not_allowed_cells := omit,
1288 target_pcid_presence := '0'B,
1289 target_pcid := omit
1290 };
1291
1292 external function enc_CellSelIndValue(in CellSelIndValue ro) return octetstring
1293 with { extension "prototype(convert) encode(RAW)" };
1294 external function dec_CellSelIndValue(in octetstring stream) return CellSelIndValue
1295 with { extension "prototype(convert) decode(RAW)" };
1296
Vadim Yanitskiye05d7162020-05-02 16:58:46 +07001297} with { encode "RAW" ; variant "FIELDORDER(msb)" }