blob: eed58df4d06bf6b549e14d47950e45bb19be271a [file] [log] [blame]
Harald Welte9419c8a2017-07-30 04:07:05 +02001/* Encoding/Decoding routines for GSM System Information messages
2 * according to 3GPP TS 44.018 Version 12.3.0 Release 12 */
3
4/* (C) 2017 by Harald Welte <laforge@gnumonks.org> */
5
6module GSM_RR_Types {
7
8 import from General_Types all;
9 import from Osmocom_Types all;
10 import from GSM_Types all;
11 import from RLCMAC_CSN1_Types all;
12
13 /* Table 10.4.1 of Section 10.4 / 3GPP TS 44.018 */
14 type enumerated RrMessageType {
15 ADDITIONAL_ASSIGNMENT ('00111011'B),
16 IMMEDIATE_ASSIGNMENT ('00111111'B),
17 IMMEDIATE_ASSIGNMENT_EXTENDED ('00111001'B),
18 IMMEDIATE_ASSIGNMENT_REJECT ('00111010'B),
19 IMMEDIATE_PACKET_ASSIGNMENT ('01101001'B),
20
21 CIPHERING_MODE_COMMAND ('00110101'B),
22 CIPHERING_MODE_COMPLETE ('00110010'B),
23
24 CONFIGURATION_CHANGE_COMMAND ('00110000'B),
25 CONFIGURATION_CHANGE_ACK ('00110001'B),
26 CONFIGURATION_CHANGE_REJECT ('00110011'B),
27
28 ASSIGNMENT_COMMAND ('00101110'B),
29 ASSIGNMENT_COMPLETE ('00101001'B),
30 ASSIGNMENT_FAILURE ('00101111'B),
31 HANDOVER_COMMAND ('00101011'B),
32 HANDOVER_COMPLETE ('00101100'B),
33 HANDOVER_FAILURE ('00101000'B),
34 PHYSICAL_INFORMATION ('00101101'B),
35
36 CHANNEL_RELEASE ('00001101'B),
37 PARTIAL_RELEASE ('00001010'B),
38 PARTIAL_RELEASE_COMPLETE ('00001111'B),
39
40 PAGING_REQUEST_TYPE_1 ('00100001'B),
41 PAGING_REQUEST_TYPE_2 ('00100010'B),
42 PAGING_REQUEST_TYPE_3 ('00100100'B),
43 PAGING_RESPONSE ('00100111'B),
44 NOTIFICATION_NCH ('00100000'B),
45 NOTIFICATION_RESPOSNE ('00100110'B),
46
47 SYSTEM_INFORMATION_TYPE_8 ('00011000'B),
48 SYSTEM_INFORMATION_TYPE_1 ('00011001'B),
49 SYSTEM_INFORMATION_TYPE_2 ('00011010'B),
50 SYSTEM_INFORMATION_TYPE_3 ('00011011'B),
51 SYSTEM_INFORMATION_TYPE_4 ('00011100'B),
52 SYSTEM_INFORMATION_TYPE_5 ('00011101'B),
53 SYSTEM_INFORMATION_TYPE_6 ('00011110'B),
54 SYSTEM_INFORMATION_TYPE_7 ('00011111'B),
55 SYSTEM_INFORMATION_TYPE_2bis ('00000010'B),
56 SYSTEM_INFORMATION_TYPE_2ter ('00000011'B),
57 SYSTEM_INFORMATION_TYPE_2quater ('00000111'B),
58 SYSTEM_INFORMATION_TYPE_5bis ('00000101'B),
59 SYSTEM_INFORMATION_TYPE_5ter ('00000110'B),
60 SYSTEM_INFORMATION_TYPE_9 ('00000100'B),
61 SYSTEM_INFORMATION_TYPE_13 ('00000000'B),
62
63 SYSTEM_INFORMATION_TYPE_16 ('00111101'B),
64 SYSTEM_INFORMATION_TYPE_17 ('00111110'B),
65
66 CHANNEL_MODE_MODIFY ('00010000'B),
67 RR_STATUS ('00010010'B),
68 CHANNEL_MODE_MODIFY_ACKNOWLEDGE ('00010111'B),
69 FREQUENCY_REDEFINITION ('00010100'B),
70 MEASUREMENT_REPORT ('00010101'B),
71 CLASSMARK_CHANGE ('00010110'B),
72 CLASSMARK_ENQUIRY ('00010011'B),
73 EXTENDED_MEASUREMENT_REPORT ('00110110'B),
74 EXTENDED_MEASUREMENT_ORDER ('00110111'B),
75 GPRS_SUSPENSION_REQUEST ('00110100'B),
76 //MBMS_ANNOUNCEMENT ('00010110'B), duplicate?
77 //SERVICE_INFORMATION ('00110110'B), duplicate?
78
79 APPLICATION_INFORMATION ('00111000'B),
80
81 SYSTEM_INFORMATION_TYPE_14 ('00000001'B),
82 SYSTEM_INFORMATION_TYPE_15 ('01000011'B),
83 SYSTEM_INFORMATION_TYPE_18 ('01000000'B),
84 SYSTEM_INFORMATION_TYPE_19 ('01000001'B),
85 SYSTEM_INFORMATION_TYPE_20 ('01000010'B),
86 SYSTEM_INFORMATION_TYPE_13alt ('01000100'B),
87 SYSTEM_INFORMATION_TYPE_2n ('01000101'B),
88 SYSTEM_INFORMATION_TYPE_21 ('01000110'B),
89 SYSTEM_INFORMATION_TYPE_22 ('01000111'B),
90 SYSTEM_INFORMATION_TYPE_23 ('01001111'B),
91
92 DTM_ASSIGNMENT_FAILURE ('01001000'B),
93 DTM_REJECT ('01001001'B),
94 DTM_REQUEST ('01001010'B),
95 PACKET_ASSIGNMENT ('01001011'B),
96 DTM_ASSIGNMENT_COMMAND ('01001100'B),
97 DTM_INFORMATION ('01001101'B),
98 PACKET_INFORMATION ('01001110'B),
99
100 UTRAN_CLASSMARK_CHANGE ('01100000'B),
101 CDMA2000_CLASSMARK_CHANGE ('01100010'B),
102 INTERSYS_TO_UTRAN_HO_CMD ('01100011'B),
103 INTERSYS_TO_CDMA2000_HO_CMD ('01100100'B),
104 GERAN_IU_MODE_CLASSMARK_CHG ('01100101'B),
105 INTERSYS_TO_EUTRAN_HO_CMD ('01100110'B)
106 } with { variant "FIELDLENGTH(8)" };
107
108 type octetstring RestOctets with { variant "PADDING(yes), PADDING_PATTERN('00101011'B)" };
109 type hexstring GsmBcdString with { variant "HEXORDER(low)" };
110 type GsmBcdString BcdMccMnc with { variant "FIELDLENGTH(6)" };
111
112 type record L2PseudoLength {
113 uint6_t l2_plen,
114 BIT2 zero_one
115 } with { variant "" };
116
117 template L2PseudoLength t_L2Pseudolength(template uint6_t len) := {
118 l2_plen := len,
119 zero_one := '01'B
120 };
121
122 type record RrHeader {
123 L2PseudoLength l2_plen,
124 uint4_t skip_indicator,
125 uint4_t rr_protocol_discriminator,
126 RrMessageType message_type
127 } with { variant "" };
128
129 template RrHeader t_RrHeader(RrMessageType msg_type, template uint6_t len) := {
130 l2_plen := t_L2Pseudolength(len),
131 skip_indicator := 0,
132 rr_protocol_discriminator := 6,
133 message_type := msg_type
134 };
135
136 type record RrL3Header {
137 uint4_t skip_indicator,
138 uint4_t rr_protocol_discriminator,
139 RrMessageType message_type
140 } with { variant "" };
141
142 type record MaioHsn {
143 } with { variant "" };
144
145 /* TS 24.008 10.5.1.1 */
146 type uint16_t CellIdentity;
147
148 /* TS 24.008 10.5.1.2 */
149 type uint4_t CipheringKeySeqNr (0..7);
150
151 /* 24.008 10.5.1.3 */
152 type record LocationAreaIdentification {
153 BcdMccMnc mcc_mnc,
154 uint16_t lac
155 } with { variant "" };
156
157 /* TS 24.008 10.5.1.4 */
158 type enumerated MobileIdentityType {
159 MI_TYPE_NONE (0),
160 MI_TYPE_IMSI,
161 MI_TYPE_IMEI,
162 MI_TYPE_IMEISV,
163 MI_TYPE_TMSI,
164 MI_TYPE_TMGI
165 } with { variant "FIELDLENGTH(3)" };
166
167 type record MobileIdentityBCD {
168 MobileIdentityType mi_type (MI_TYPE_IMSI, MI_TYPE_IMEI, MI_TYPE_IMEISV),
169 boolean odd,
170 hexstring digits
171 } with { variant "FIELDORDER(lsb)" };
172
173 type record MobileIdentityTMSI {
174 BIT4 pad ('1111'B),
175 boolean odd (false),
176 MobileIdentityType mi_type (MI_TYPE_TMSI),
177 GsmTmsi tmsi
178 } with { variant "FIELDORDER(lsb)" };
179
180 type record MobileIdentityNone {
181 BIT4 pad ('1111'B),
182 boolean odd (false),
183 MobileIdentityType mi_type (MI_TYPE_NONE)
184 } with { variant "FIELDORDER(lsb)" };
185
186 type union MobileIdentity {
187 MobileIdentityBCD imsi,
188 MobileIdentityBCD imei,
189 MobileIdentityBCD imeisv,
190 MobileIdentityTMSI tmsi,
191 MobileIdentityNone unused
192 } with { variant "TAG(imsi, mi_type = MI_TYPE_IMSI;
193 imei, mi_type = MI_TYPE_IMEI;
194 imeisv, mi_type = MI_TYPE_IMEISV;
195 tmsi, mi_type = MI_TYPE_TMSI;
196 unused, mi_type = MI_TYPE_NONE)"
197 variant "FIELDORDER(lsb)"
198 };
199
200 type record MobileIdentityLV {
201 uint8_t len,
202 MobileIdentity mi
203 } with { variant (len) "LENGTHTO(mi)" };
204
205 type record MobileIdentityTLV {
206 uint8_t tag,
207 uint8_t len,
208 MobileIdentity mi
209 } with { variant (len) "LENGTHTO(mi)" };
210
211 /* TS 24.008 10.5.1.5 */
212 type record MsClassmark1 {
213 BIT1 spare,
214 uint2_t rev_level,
215 boolean es_ind,
216 boolean a51,
217 uint3_t rf_pwr_cap
218 } with { variant "" };
219
220 /* TS 24.008 10.5.1.6 */
221 type record MsClassmark2 {
222 BIT1 spare,
223 uint2_t rev_level,
224 boolean es_ind,
225 boolean a51,
226 uint3_t rf_pwr_cap,
227 BIT1 spare1,
228 boolean ps_cap,
229 uint2_t ss_screen_ind,
230 boolean sm_cap,
231 boolean vbs,
232 boolean vgcs,
233 boolean fc,
234 boolean cm3,
235 BIT1 spare2,
236 boolean lcsva_cap,
237 boolean ucs2,
238 boolean solsa,
239 boolean cmsp,
240 boolean a53,
241 boolean a52
242 } with { variant "" };
243 type record MsClassmark2LV {
244 uint8_t len,
245 MsClassmark2 cm2
246 } with { variant (len) "LENGTHTO(cm2)" };
247
248
249 /* 44.018 10.5.2.5 */
250 type record ChannelDescription {
251 RslChannelNr chan_nr,
252 uint3_t tsc,
253 boolean h,
254 uint12_t arfcn optional,
255 MaioHsn maio_hsn optional
256 } with { variant (arfcn) "PRESENCE(h = false)"
257 variant (maio_hsn) "PRESENCE(h = true)" };
258
259 type record ChannelDescriptionTV {
260 OCT1 iei,
261 ChannelDescription v
262 } with { variant "" };
263
264 /* 10.5.2.21 */
265 type record MobileAllocation {
266 uint8_t len,
267 bitstring ma
268 } with { variant (len) "LENGTHTO(ma)" };
269
270 /* 10.5.2.25a */
Harald Welte1b9b7702017-07-30 04:19:14 +0200271 type record PktChDesc0Ind {
272 uint6_t maio,
273 BIT1 ma_number_ind,
274 BIT1 change_mark1_valid,
275 BIT2 change_mark1
276 } with { variant "" };
277 type record PktChDesc0 {
278 BIT1 hopping,
279 BIT1 spare ('0'B),
280 uint10_t arfcn optional,
281 PktChDesc0Ind indirect optional
282 } with {
283 variant (arfcn) "PRESENCE(hopping = '0'B)"
284 variant (indirect) "PRESENCE(hopping = '1'B)"
285 };
286 type record PktChDesc1 {
287 uint6_t maio,
288 uint6_t hsn
289 } with { variant "" };
290 type record PacketChannelDescription {
291 uint5_t channel_Type_spare,
292 uint3_t tn,
293 uint3_t tsc,
294 BIT1 presence,
295 PktChDesc0 zero optional,
296 PktChDesc1 one optional
297 } with {
298 variant (zero) "PRESENCE(presence = '0'B)"
299 variant (one) "PRESENCE(presence = '1'B)"
300 };
Harald Welte9419c8a2017-07-30 04:07:05 +0200301
302 /* 10.5.2.25b */
303 type record DedicatedModeOrTbf {
304 BIT1 spare,
305 boolean tma,
306 boolean downlink,
307 boolean tbf
308 } with { variant "" };
309
310 /* 10.5.2.26 */
311 type enumerated PageMode {
312 PAGE_MODE_NORMAL,
313 PAGE_MODE_EXTENDED,
314 PAGE_MODE_REORGANIZATION,
315 PAGE_MODE_SAME_AS_BEFORE
316 } with { variant "FIELDLENGTH(4)" };
317
318 /* 10.5.2.30 */
319 type record RequestReference {
320 bitstring ra length(8),
321 uint5_t t1p,
322 uint6_t t3,
323 uint5_t t2
324 } with { variant "" };
325
326 template RequestReference t_RequestReference(template bitstring ra, template uint5_t t1p, template uint6_t t3, template uint5_t t2) := {
327 ra := ra,
328 t1p := t1p,
329 t3 := t3,
330 t2 := t2
331 }
332
333 /* compute the expected request reference for given RA + FN */
334 function f_compute_ReqRef(uint8_t ra, GsmFrameNumber fn) return RequestReference {
335 var RequestReference req_ref := { ra := int2bit(ra, 8) };
336 req_ref.t1p := (fn / 1326) mod 32;
337 req_ref.t2 := fn mod 26;
338 req_ref.t3 := fn mod 51;
339 return req_ref
340 }
341
342 /* 10.5.2.40 */
343 type integer TimingAdvance (0..219);
344
345 /* 10.5.2.43 */
346 type uint8_t WaitIndication;
347
348 /* 10.5.2.76 */
349 type record FeatureIndicator {
350 BIT2 spare,
351 boolean cs_ir,
352 boolean ps_ir
353 } with { variant "" };
354
355 /* 24.008 10.5.5.6 */
356 type record DrxParameter {
357 uint8_t split_pg_cycle_code,
358 uint4_t drx_cycle_len_coeff,
359 boolean split_on_ccch,
360 uint3_t non_drx_timer
361 } with { variant "" };
362
363 /* 24.008 10.5.5.15 */
364 type record RoutingAreaIdentification {
365 LocationAreaIdentification lai,
366 uint8_t rac
367 } with { variant "" };
368
369 /* 44.018 10.5.2.16 */
370 type record IaRestOctHL {
371 uint6_t freq_par_len,
372 BIT2 padding ('00'B) optional,
373 uint6_t maio optional,
374 octetstring mobile_allocation optional
375 } with {
376 variant (freq_par_len) "LENGTHTO(mobile_allocation,maio,padding)"
377/*
378 variant (padding) "PRESENCE(freq_par_len != 0)"
379 variant (maio) "PRESENCE(freq_par_len != 0)"
380 variant (mobile_allocation) "PRESENCE(freq_par_len != 0)"
381*/
382 };
383 type record IaRestOctHH {
384 BIT2 presence,
385 PacketUlAssign ul optional,
386 PacketDlAssign dl optional
387 } with {
388 variant (ul) "PRESENCE(presence = '00'B)"
389 variant (dl) "PRESENCE(presence = '01'B)"
390 };
391 type record PacketUlAssignDyn {
392 uint5_t tfi_assignment,
393 BIT1 polling,
394 BIT1 spare ('0'B),
395 uint3_t usf,
396 BIT1 usf_granularity,
397 BIT1 p0_present,
398 uint4_t p0 optional,
399 BIT1 pr_mode optional,
400 ChCodingCommand ch_coding_cmd,
401 BIT1 tlli_block_chan_coding,
402 BIT1 alpha_present,
403 uint4_t alpha optional,
404 uint5_t gamma,
405 BIT1 ta_index_present,
406 uint4_t ta_index optional,
407 BIT1 tbf_starting_time_present,
408 uint16_t tbf_starting_time optional
409 } with {
410 variant (p0) "PRESENCE(p0_present = '1'B)"
411 variant (pr_mode) "PRESENCE(p0_present = '1'B)"
412 variant (alpha) "PRESENCE(alpha_present = '1'B)"
413 variant (ta_index) "PRESENCE(ta_index_present = '1'B)"
414 variant (tbf_starting_time) "PRESENCE(tbf_starting_time_present = '1'B)"
415 };
416 type record PacketUlAssignSgl {
417 BIT1 alpha_present,
418 uint4_t alpha optional,
419 uint5_t gamma,
420 BIT2 padding ('01'B),
421 uint16_t tbf_starting_time
422 /* TODO: P0 / PR_MODE */
423 } with {
424 variant (alpha) "PRESENCE(alpha_present = '1'B)"
425 };
426 type record PacketUlAssign {
427 BIT1 presence,
428 PacketUlAssignDyn dynamic optional,
429 PacketUlAssignSgl single optional
430 /* TODO: Estended RA, PFI */
431 } with {
432 variant (dynamic) "PRESENCE(presence = '1'B)"
433 variant (single) "PRESENCE(presence = '0'B)"
434 };
435 type record PacketDlAssG1 {
436 uint5_t tfi_assignment,
437 BIT1 rlc_mode,
438 BIT1 alpha_present,
439 uint4_t alpha optional,
440 uint5_t gamma,
441 BIT1 polling,
442 BIT1 ta_valid
443 } with { variant "" };
444 type record PacketDlAssign {
445 GprsTlli tlli,
446 BIT1 group1_present,
447 PacketDlAssG1 group1 optional,
448 BIT1 ta_index_present,
449 uint4_t ta_index optional,
450 BIT1 tbf_starting_time_present,
451 uint16_t tbf_starting_time optional,
452 BIT1 p0_present,
453 uint4_t p0 optional,
454 BIT1 pr_mode optional
455 /* TODO: EGPRS window size, etc. */
456 } with {
457 variant (group1) "PRESENCE(group1_present = '1'B)"
458 variant (ta_index) "PRESENCE(ta_index_present = '1'B)"
459 variant (tbf_starting_time) "PRESENCE(tbf_starting_time_present = '1'B)"
460 variant (p0) "PRESENCE(p0_present = '1'B)"
461 variant (pr_mode) "PRESENCE(p0_present = '1'B)"
462 };
463 type record IaRestOctLL {
464 BIT1 compressed_irat_ho_info_ind
465 } with { variant "" };
466 type octetstring EgprsUlAss; /* TODO */
467 type octetstring MblkDlAss; /* TODO */
468 type record IaRestOctLH {
469 BIT2 presence,
470 EgprsUlAss egprs_ul optional,
471 MblkDlAss multiblock_dl_ass optional
472 } with {
473 variant (egprs_ul) "PRESENCE(presence = '00'B)"
474 variant (multiblock_dl_ass) "PRESENCE(presence = '01'B)"
475 };
476 type record IaRestOctets {
477 BIT2 presence,
478 IaRestOctLL ll optional,
479 IaRestOctLH lh optional,
480 IaRestOctHL hl optional,
481 IaRestOctHH hh optional
482 } with {
483 variant (ll) "PRESENCE(presence = '00'B)"
484 variant (lh) "PRESENCE(presence = '01'B)"
485 variant (hl) "PRESENCE(presence = '10'B)"
486 variant (hh) "PRESENCE(presence = '11'B)"
487 };
488
489
490 /* 9.1.18 */
491 type record ImmediateAssignment {
492 DedicatedModeOrTbf ded_or_tbf,
493 PageMode page_mode,
494 ChannelDescription chan_desc optional,
495 PacketChannelDescription pkt_chan_desc optional,
496 RequestReference req_ref,
497 TimingAdvance timing_advance,
498 MobileAllocation mobile_allocation,
499 /* TODO: starting time TLV */
500 IaRestOctets rest_octets
501 } with { variant (chan_desc) "PRESENCE(ded_or_tbf.tbf = false)"
502 variant (pkt_chan_desc) "PRESENCE(ded_or_tbf.tbf = true)" };
503
504 /* 9.1.20 */
505 type record ReqRefWaitInd {
506 RequestReference req_ref,
507 WaitIndication wait_ind
508 } with { variant "" };
509 type record length(4) of ReqRefWaitInd ReqRefWaitInd4;
510 type record ImmediateAssignmentReject {
511 FeatureIndicator feature_ind,
512 PageMode page_mode,
513 ReqRefWaitInd4 payload
514 } with { variant "" };
515
516 /* 9.1.22 */
517 type record PagingRequestType1 {
518 ChannelNeeded12 chan_needed,
519 PageMode page_mode,
520 MobileIdentityLV mi1,
521 MobileIdentityTLV mi2 optional,
522 RestOctets rest_octets
523 } with { variant "TAG(mi2, tag = 23)" };
524
525 /* 9.1.23 */
526 type record PagingRequestType2 {
527 ChannelNeeded12 chan_needed,
528 PageMode page_mode,
529 GsmTmsi mi1,
530 GsmTmsi mi2,
531 MobileIdentityTLV mi3 optional,
532 RestOctets rest_octets
533 } with { variant "TAG(mi3, tag = 23)" };
534
535 /* 9.1.24 */
536 type record length(4) of GsmTmsi GsmTmsi4;
537 type record PagingRequestType3 {
538 ChannelNeeded12 chan_needed,
539 PageMode page_mode,
540 GsmTmsi4 mi,
541 RestOctets rest_octets
542 } with { variant "" };
543
544
545 type union RrUnion {
546/*
547 SystemInformationType1 si1,
548 SystemInformationType2 si2,
549 SystemInformationType2bis si2bis,
550 SystemInformationType2ter si2ter,
551 SystemInformationType3 si3,
552 SystemInformationType4 si4,
553 SystemInformationType5 si5,
554 SystemInformationType5bis si5bis,
555 SystemInformationType5ter si5ter,
556 SystemInformationType6 si6,
557*/
558 ImmediateAssignment imm_ass,
559 ImmediateAssignmentReject imm_ass_rej,
560 PagingRequestType1 pag_req_1,
561 PagingRequestType2 pag_req_2,
562 PagingRequestType3 pag_req_3,
563 octetstring other
564 } with { variant "" };
565
566 /* Special RR Message on BCCH / CCCH Dowlink */
567
568 type record GsmRrMessage {
569 RrHeader header,
570 RrUnion payload
571 } with { variant (payload) "CROSSTAG(
572/*
573 si1, header.message_type = SYSTEM_INFORMATION_TYPE_1;
574 si2, header.message_type = SYSTEM_INFORMATION_TYPE_2;
575 si2bis, header.message_type = SYSTEM_INFORMATION_TYPE_2bis;
576 si2ter, header.message_type = SYSTEM_INFORMATION_TYPE_2ter;
577 si3, header.message_type = SYSTEM_INFORMATION_TYPE_3;
578 si4, header.message_type = SYSTEM_INFORMATION_TYPE_4;
579 si5, header.message_type = SYSTEM_INFORMATION_TYPE_5;
580 si5bis, header.message_type = SYSTEM_INFORMATION_TYPE_5bis;
581 si5ter, header.message_type = SYSTEM_INFORMATION_TYPE_5ter;
582 si6, header.message_type = SYSTEM_INFORMATION_TYPE_6;
583*/
584 imm_ass, header.message_type = IMMEDIATE_ASSIGNMENT;
585 imm_ass_rej, header.message_type = IMMEDIATE_ASSIGNMENT_REJECT;
586 pag_req_1, header.message_type = PAGING_REQUEST_TYPE_1;
587 pag_req_2, header.message_type = PAGING_REQUEST_TYPE_2;
588 pag_req_3, header.message_type = PAGING_REQUEST_TYPE_3;
589 other, OTHERWISE;
590 )" };
591
592 external function enc_GsmRrMessage(in GsmRrMessage msg) return octetstring
593 with { extension "prototype(convert) encode(RAW)" };
594 external function dec_GsmRrMessage(in octetstring stream) return GsmRrMessage
595 with { extension "prototype(convert) decode(RAW)" };
596
597 /* Normal L3 Message on Dedicated Channel */
598
599 /* 9.1.25 Paging Response */
600 type record PagingResponse {
601 uint4_t spare_half_octet,
602 CipheringKeySeqNr cksn,
603 MsClassmark2LV cm2,
604 MobileIdentityLV mi,
605 uint8_t addl_upd_par optional
606 } with { variant "" };
607
608 type union RrL3Union {
609 PagingResponse paging_response,
610 octetstring other
611 };
612
613 type record GsmRrL3Message {
614 RrL3Header header,
615 RrL3Union payload
616 } with { variant (payload) "CROSSTAG(
617 paging_response, header.message_type = PAGING_RESPONSE;
618
619 other, OTHERWISE;
620 )" }
621
622} with { encode "RAW" ; variant "FIELDORDER(msb)" }