blob: 98f6dd5dcea99de6159e377dfcdbc9a58d1db1c0 [file] [log] [blame]
Harald Weltea082a692017-07-15 15:58:13 +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_Types {
7
8 import from General_Types all;
9 import from Osmocom_Types all;
10
Harald Weltebdc5dbd2017-07-16 00:00:43 +020011 type integer GsmArfcn (0..1023);
12 type integer UmtsArfcn (0..16383);
13 type integer UmtsScramblingCode (0..511);
Harald Welted2e342f2017-07-16 07:34:13 +020014 const integer GsmMaxFrameNumber := 26*51*2048;
15 type integer GsmFrameNumber (0..GsmMaxFrameNumber);
16 type integer GsmRxLev (0..63);
17 type integer GsmTsc (0..7) with { variant "FIELDLENGTH(8)" };
18 type uint32_t GsmTmsi;
Harald Weltebdc5dbd2017-07-16 00:00:43 +020019
Harald Weltea082a692017-07-15 15:58:13 +020020 /* Table 10.4.1 of Section 10.4 / 3GPP TS 44.018 */
21 type enumerated RrMessageType {
22 ADDITIONAL_ASSIGNMENT ('00111011'B),
23 IMMEDIATE_ASSIGNMENT ('00111111'B),
24 IMMEDIATE_ASSIGNMENT_EXTENDED ('00111001'B),
25 IMMEDIATE_ASSIGNMENT_REJECT ('00111010'B),
26 IMMEDIATE_PACKET_ASSIGNMENT ('01101001'B),
27
28 CIPHERING_MODE_COMMAND ('00110101'B),
29 CIPHERING_MODE_COMPLETE ('00110010'B),
30
31 CONFIGURATION_CHANGE_COMMAND ('00110000'B),
32 CONFIGURATION_CHANGE_ACK ('00110001'B),
33 CONFIGURATION_CHANGE_REJECT ('00110011'B),
34
35 ASSIGNMENT_COMMAND ('00101110'B),
36 ASSIGNMENT_COMPLETE ('00101001'B),
37 ASSIGNMENT_FAILURE ('00101111'B),
38 HANDOVER_COMMAND ('00101011'B),
39 HANDOVER_COMPLETE ('00101100'B),
40 HANDOVER_FAILURE ('00101000'B),
41 PHYSICAL_INFORMATION ('00101101'B),
42
43 CHANNEL_RELEASE ('00001101'B),
44 PARTIAL_RELEASE ('00001010'B),
45 PARTIAL_RELEASE_COMPLETE ('00001111'B),
46
47 PAGING_REQUEST_TYPE_1 ('00100001'B),
48 PAGING_REQUEST_TYPE_2 ('00100010'B),
49 PAGING_REQUEST_TYPE_3 ('00100100'B),
50 PAGING_RESPONSE ('00100111'B),
51 NOTIFICATION_NCH ('00100000'B),
52 NOTIFICATION_RESPOSNE ('00100110'B),
53
54 SYSTEM_INFORMATION_TYPE_8 ('00011000'B),
55 SYSTEM_INFORMATION_TYPE_1 ('00011001'B),
56 SYSTEM_INFORMATION_TYPE_2 ('00011010'B),
57 SYSTEM_INFORMATION_TYPE_3 ('00011011'B),
58 SYSTEM_INFORMATION_TYPE_4 ('00011100'B),
59 SYSTEM_INFORMATION_TYPE_5 ('00011101'B),
60 SYSTEM_INFORMATION_TYPE_6 ('00011110'B),
61 SYSTEM_INFORMATION_TYPE_7 ('00011111'B),
62 SYSTEM_INFORMATION_TYPE_2bis ('00000010'B),
63 SYSTEM_INFORMATION_TYPE_2ter ('00000011'B),
64 SYSTEM_INFORMATION_TYPE_2quater ('00000111'B),
65 SYSTEM_INFORMATION_TYPE_5bis ('00000101'B),
66 SYSTEM_INFORMATION_TYPE_5ter ('00000110'B),
67 SYSTEM_INFORMATION_TYPE_9 ('00000100'B),
68 SYSTEM_INFORMATION_TYPE_13 ('00000000'B),
69
70 SYSTEM_INFORMATION_TYPE_16 ('00111101'B),
71 SYSTEM_INFORMATION_TYPE_17 ('00111110'B),
72
73 CHANNEL_MODE_MODIFY ('00010000'B),
74 RR_STATUS ('00010010'B),
75 CHANNEL_MODE_MODIFY_ACKNOWLEDGE ('00010111'B),
76 FREQUENCY_REDEFINITION ('00010100'B),
77 MEASUREMENT_REPORT ('00010101'B),
78 CLASSMARK_CHANGE ('00010110'B),
79 CLASSMARK_ENQUIRY ('00010011'B),
80 EXTENDED_MEASUREMENT_REPORT ('00110110'B),
81 EXTENDED_MEASUREMENT_ORDER ('00110111'B),
82 GPRS_SUSPENSION_REQUEST ('00110100'B),
83 //MBMS_ANNOUNCEMENT ('00010110'B), duplicate?
84 //SERVICE_INFORMATION ('00110110'B), duplicate?
85
86 APPLICATION_INFORMATION ('00111000'B),
87
88 SYSTEM_INFORMATION_TYPE_14 ('00000001'B),
89 SYSTEM_INFORMATION_TYPE_15 ('01000011'B),
90 SYSTEM_INFORMATION_TYPE_18 ('01000000'B),
91 SYSTEM_INFORMATION_TYPE_19 ('01000001'B),
92 SYSTEM_INFORMATION_TYPE_20 ('01000010'B),
93 SYSTEM_INFORMATION_TYPE_13alt ('01000100'B),
94 SYSTEM_INFORMATION_TYPE_2n ('01000101'B),
95 SYSTEM_INFORMATION_TYPE_21 ('01000110'B),
96 SYSTEM_INFORMATION_TYPE_22 ('01000111'B),
97 SYSTEM_INFORMATION_TYPE_23 ('01001111'B),
98
99 DTM_ASSIGNMENT_FAILURE ('01001000'B),
100 DTM_REJECT ('01001001'B),
101 DTM_REQUEST ('01001010'B),
102 PACKET_ASSIGNMENT ('01001011'B),
103 DTM_ASSIGNMENT_COMMAND ('01001100'B),
104 DTM_INFORMATION ('01001101'B),
105 PACKET_INFORMATION ('01001110'B),
106
107 UTRAN_CLASSMARK_CHANGE ('01100000'B),
108 CDMA2000_CLASSMARK_CHANGE ('01100010'B),
109 INTERSYS_TO_UTRAN_HO_CMD ('01100011'B),
110 INTERSYS_TO_CDMA2000_HO_CMD ('01100100'B),
111 GERAN_IU_MODE_CLASSMARK_CHG ('01100101'B),
112 INTERSYS_TO_EUTRAN_HO_CMD ('01100110'B)
113 } with { variant "FIELDLENGTH(8)" };
114
Harald Welted2e342f2017-07-16 07:34:13 +0200115 type octetstring RestOctets with { variant "PADDING(yes), PADDING_PATTERN('00101011'B)" };
116 type hexstring GsmBcdString with { variant "HEXORDER(low)" };
117 type GsmBcdString BcdMccMnc with { variant "FIELDLENGTH(6)" };
118
119 type record L2PseudoLength {
120 uint6_t l2_plen,
121 BIT2 zero_one
122 } with { variant "" };
123
124 template L2PseudoLength t_L2Pseudolength(template uint6_t len) := {
125 l2_plen := len,
126 zero_one := '01'B
127 };
128
129 type record RrHeader {
130 L2PseudoLength l2_plen,
131 uint4_t skip_indicator,
132 uint4_t rr_protocol_discriminator,
133 RrMessageType message_type
134 } with { variant "" };
135
136 template RrHeader t_RrHeader(RrMessageType msg_type, template uint6_t len) := {
137 l2_plen := t_L2Pseudolength(len),
138 skip_indicator := 0,
139 rr_protocol_discriminator := 6,
140 message_type := msg_type
141 };
142
143 type record RrL3Header {
144 uint4_t skip_indicator,
145 uint4_t rr_protocol_discriminator,
146 RrMessageType message_type
147 } with { variant "" };
148
149 type record MaioHsn {
150 } with { variant "" };
151
152 /* TS 24.008 10.5.1.2 */
153 type uint4_t CipheringKeySeqNr (0..7);
154
155 /* 24.008 10.5.1.3 */
156 type record LocationAreaIdentification {
157 BcdMccMnc mcc_mnc,
158 uint16_t lac
159 } with { variant "" };
160
161 /* TS 24.008 10.5.1.4 */
162 type enumerated MobileIdentityType {
163 MI_TYPE_NONE (0),
164 MI_TYPE_IMSI,
165 MI_TYPE_IMEI,
166 MI_TYPE_IMEISV,
167 MI_TYPE_TMSI,
168 MI_TYPE_TMGI
169 } with { variant "FIELDLENGTH(3)" };
170
171 type record MobileIdentityBCD {
172 MobileIdentityType mi_type (MI_TYPE_IMSI, MI_TYPE_IMEI, MI_TYPE_IMEISV),
173 boolean odd,
174 hexstring digits
175 } with { variant "" };
176
177 type record MobileIdentityTMSI {
Harald Welted2e342f2017-07-16 07:34:13 +0200178 BIT4 pad ('1111'B),
Harald Welte57a31502017-07-16 21:03:47 +0200179 boolean odd (false),
180 MobileIdentityType mi_type (MI_TYPE_TMSI),
Harald Welted2e342f2017-07-16 07:34:13 +0200181 GsmTmsi tmsi
182 } with { variant "" };
183
Harald Welte57a31502017-07-16 21:03:47 +0200184 type record MobileIdentityNone {
185 BIT4 pad ('1111'B),
186 boolean odd (false),
187 MobileIdentityType mi_type (MI_TYPE_NONE)
188 } with { variant "" };
189
Harald Welted2e342f2017-07-16 07:34:13 +0200190 type union MobileIdentity {
191 MobileIdentityBCD bcd,
Harald Welte57a31502017-07-16 21:03:47 +0200192 MobileIdentityTMSI tmsi,
193 MobileIdentityNone unused
Harald Welted2e342f2017-07-16 07:34:13 +0200194 } with { variant "TAG(bcd, mi_type = MI_TYPE_IMSI;
195 bcd, mi_type = MI_TYPE_IMEI;
196 bcd, mi_type = MI_TYPE_IMEISV;
Harald Welte57a31502017-07-16 21:03:47 +0200197 tmsi, mi_type = MI_TYPE_TMSI;
198 unused, mi_type = MI_TYPE_NONE)" };
Harald Welted2e342f2017-07-16 07:34:13 +0200199
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
Harald Welted2e342f2017-07-16 07:34:13 +0200249 /* 44.018 10.5.2.5 */
250 type record ChannelDescription {
Harald Weltead091b62017-07-16 21:03:17 +0200251 RslChannelNr chan_nr,
Harald Welted2e342f2017-07-16 07:34:13 +0200252 uint3_t tsc,
253 boolean h,
254 uint12_t arfcn optional,
255 MaioHsn maio_hsn optional
Harald Weltead091b62017-07-16 21:03:17 +0200256 } 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 "" };
Harald Welted2e342f2017-07-16 07:34:13 +0200263
264 /* 10.5.2.8 */
265 type enumerated ChannelNeeded {
266 CHAN_NEED_ANY (0),
267 CHAN_NEED_SDCCH (1),
268 CHAN_NEED_TCH_F (2),
269 CHAN_NEED_TCH_H (3)
270 } with { variant "FIELDLENGTH(2)" };
271 type record ChannelNeeded12 {
272 ChannelNeeded second,
273 ChannelNeeded first
274 } with { variant "" };
275
276 /* 10.5.2.21 */
277 type record MobileAllocation {
278 uint8_t len,
279 bitstring ma
280 } with { variant (len) "LENGTHTO(ma)" };
281
282 /* 10.5.2.25a */
283 type OCT3 PacketChannelDescription;
284
285 /* 10.5.2.25b */
286 type record DedicatedModeOrTbf {
287 BIT1 spare,
288 boolean tma,
289 boolean downlink,
290 boolean tbf
291 } with { variant "" };
292
293 /* 10.5.2.26 */
294 type enumerated PageMode {
295 PAGE_MODE_NORMAL,
296 PAGE_MODE_EXTENDED,
297 PAGE_MODE_REORGANIZATION,
298 PAGE_MODE_SAME_AS_BEFORE
299 } with { variant "FIELDLENGTH(4)" };
300
301 /* 10.5.2.30 */
302 type record RequestReference {
303 bitstring ra length(8),
304 uint5_t t1p,
305 uint6_t t3,
306 uint5_t t1
307 } with { variant "" };
308
309 /* 10.5.2.40 */
310 type integer TimingAdvance (0..219);
311
312 /* 10.5.2.43 */
313 type uint8_t WaitIndication;
314
315 /* 10.5.2.76 */
316 type record FeatureIndicator {
317 BIT2 spare,
318 boolean cs_ir,
319 boolean ps_ir
320 } with { variant "" };
321
322
323 /* 9.1.18 */
324 type record ImmediateAssignment {
325 DedicatedModeOrTbf ded_or_tbf,
326 PageMode page_mode,
327 ChannelDescription chan_desc optional,
328 PacketChannelDescription pkt_chan_desc optional,
329 RequestReference req_ref,
330 TimingAdvance timing_advance,
331 MobileAllocation mobile_allocation
332 } with { variant (chan_desc) "PRESENCE(ded_or_tbf.tbf = false)"
333 variant (pkt_chan_desc) "PRESENCE(ded_or_tbf.tbf = true)" };
334
335 /* 9.1.20 */
336 type record ReqRefWaitInd {
337 RequestReference req_ref,
338 WaitIndication wait_ind
339 } with { variant "" };
340 type record length(4) of ReqRefWaitInd ReqRefWaitInd4;
341 type record ImmediateAssignmentReject {
342 FeatureIndicator feature_ind,
343 PageMode page_mode,
344 ReqRefWaitInd4 payload
345 } with { variant "" };
346
347 /* 9.1.22 */
348 type record PagingRequestType1 {
349 ChannelNeeded12 chan_needed,
350 PageMode page_mode,
351 MobileIdentityLV mi1,
352 MobileIdentityTLV mi2 optional,
353 RestOctets rest_octets
354 } with { variant "TAG(mi2, tag = 23)" };
355
356 /* 9.1.23 */
357 type record PagingRequestType2 {
358 ChannelNeeded12 chan_needed,
359 PageMode page_mode,
360 GsmTmsi mi1,
361 GsmTmsi mi2,
362 MobileIdentityTLV mi3 optional,
363 RestOctets rest_octets
364 } with { variant "TAG(mi3, tag = 23)" };
365
366 /* 9.1.24 */
367 type record length(4) of GsmTmsi GsmTmsi4;
368 type record PagingRequestType3 {
369 ChannelNeeded12 chan_needed,
370 PageMode page_mode,
371 GsmTmsi4 mi,
372 RestOctets rest_octets
373 } with { variant "" };
374
375
376 type union RrUnion {
377/*
378 SystemInformationType1 si1,
379 SystemInformationType2 si2,
380 SystemInformationType2bis si2bis,
381 SystemInformationType2ter si2ter,
382 SystemInformationType3 si3,
383 SystemInformationType4 si4,
384 SystemInformationType5 si5,
385 SystemInformationType5bis si5bis,
386 SystemInformationType5ter si5ter,
387 SystemInformationType6 si6,
388*/
389 ImmediateAssignment imm_ass,
390 ImmediateAssignmentReject imm_ass_rej,
391 PagingRequestType1 pag_req_1,
392 PagingRequestType2 pag_req_2,
393 PagingRequestType3 pag_req_3,
394 octetstring other
395 } with { variant "" };
396
397 /* Special RR Message on BCCH / CCCH Dowlink */
398
399 type record GsmRrMessage {
400 RrHeader header,
401 RrUnion payload
402 } with { variant (payload) "CROSSTAG(
403/*
404 si1, header.message_type = SYSTEM_INFORMATION_TYPE_1;
405 si2, header.message_type = SYSTEM_INFORMATION_TYPE_2;
406 si2bis, header.message_type = SYSTEM_INFORMATION_TYPE_2bis;
407 si2ter, header.message_type = SYSTEM_INFORMATION_TYPE_2ter;
408 si3, header.message_type = SYSTEM_INFORMATION_TYPE_3;
409 si4, header.message_type = SYSTEM_INFORMATION_TYPE_4;
410 si5, header.message_type = SYSTEM_INFORMATION_TYPE_5;
411 si5bis, header.message_type = SYSTEM_INFORMATION_TYPE_5bis;
412 si5ter, header.message_type = SYSTEM_INFORMATION_TYPE_5ter;
413 si6, header.message_type = SYSTEM_INFORMATION_TYPE_6;
414*/
415 imm_ass, header.message_type = IMMEDIATE_ASSIGNMENT;
416 imm_ass_rej, header.message_type = IMMEDIATE_ASSIGNMENT_REJECT;
417 pag_req_1, header.message_type = PAGING_REQUEST_TYPE_1;
418 pag_req_2, header.message_type = PAGING_REQUEST_TYPE_2;
419 pag_req_3, header.message_type = PAGING_REQUEST_TYPE_3;
420 other, OTHERWISE;
421 )" };
422
Harald Welte0b1e5b82017-07-16 18:53:17 +0200423 external function enc_GsmRrMessage(in GsmRrMessage msg) return octetstring
424 with { extension "prototype(convert) encode(RAW)" };
425 external function dec_GsmRrMessage(in octetstring stream) return GsmRrMessage
426 with { extension "prototype(convert) decode(RAW)" };
427
Harald Welted2e342f2017-07-16 07:34:13 +0200428 /* Normal L3 Message on Dedicated Channel */
429
430 /* 9.1.25 Paging Response */
431 type record PagingResponse {
432 uint4_t spare_half_octet,
433 CipheringKeySeqNr cksn,
434 MsClassmark2LV cm2,
435 MobileIdentityLV mi,
436 uint8_t addl_upd_par optional
437 } with { variant "" };
438
439 type union RrL3Union {
440 PagingResponse paging_response,
441 octetstring other
442 };
443
444 type record GsmRrL3Message {
445 RrL3Header header,
446 RrL3Union payload
447 } with { variant (payload) "CROSSTAG(
448 paging_response, header.message_type = PAGING_RESPONSE;
449
450 other, OTHERWISE;
451 )" }
452
Harald Welte0c8d5c02017-07-16 18:53:58 +0200453 /* TS 48.058 9.3.1 Channel Number IE */
454 type enumerated RslChanNr0 {
455 RSL_CHAN_NR_INVALID ('00'H),
456 RSL_CHAN_NR_Bm_ACCH ('01'H),
457 RSL_CHAN_NR_BCCH ('10'H),
458 RSL_CHAN_NR_RACH ('11'H),
459 RSL_CHAN_NR_PCH_AGCH ('12'H)
460 } with { variant "FIELDLENGTH(5)" };
461
462 type record RslChanNr2 {
463 BIT4 tag ('0001'B),
464 uint1_t sub_chan
465 } with { variant "FIELDLENGTH(5)" };
466
467 type record RslChanNr4 {
468 BIT3 tag ('001'B),
469 uint2_t sub_chan
470 } with { variant "FIELDLENGTH(5)" };
471
472 type record RslChanNr8 {
473 BIT2 tag ('01'B),
474 uint3_t sub_chan
475 } with { variant "FIELDLENGTH(5)" };
476
477 type union RslChanNrU {
478 RslChanNr0 ch0,
479 RslChanNr2 lm,
480 RslChanNr4 sdcch4,
481 RslChanNr8 sdcch8
482 } with {
483 variant "TAG(lm, tag = '0001'B;
484 sdcch4, tag = '001'B;
485 sdcch8, tag = '01'B;
486 ch0, OTHERWISE)"
487 variant "FIELDLENGTH(5)"
488 };
489
490 type record RslChannelNr {
491 RslChanNrU u,
492 uint3_t tn
493 } with { variant "FIELDLENGTH(8)" };
494
495 template RslChannelNr t_RslChanNr0(template uint3_t tn, template RslChanNr0 cht) := {
496 u := { ch0 := cht },
497 tn := tn
498 }
499
500 template RslChannelNr t_RslChanNr_RACH(template uint3_t tn) := t_RslChanNr0(tn, RSL_CHAN_NR_RACH);
501 template RslChannelNr t_RslChanNr_BCCH(template uint3_t tn) := t_RslChanNr0(tn, RSL_CHAN_NR_BCCH);
502 template RslChannelNr t_RslChanNr_PCH_AGCH(template uint3_t tn) := t_RslChanNr0(tn, RSL_CHAN_NR_PCH_AGCH);
503 template RslChannelNr t_RslChanNr_Bm(template uint3_t tn) := t_RslChanNr0(tn, RSL_CHAN_NR_Bm_ACCH);
504 template RslChannelNr t_RslChanNr_Lm(template uint3_t tn, uint1_t sub_slot) := {
505 u := { lm := { tag := '0001'B, sub_chan := sub_slot } },
506 tn := tn
507 }
508 template RslChannelNr t_RslChanNr_SDCCH4(template uint3_t tn, template uint2_t sub_slot) := {
509 u := { sdcch4 := { tag := '001'B, sub_chan := sub_slot } },
510 tn := tn
511 }
512 template RslChannelNr t_RslChanNr_SDCCH8(template uint3_t tn, template uint3_t sub_slot) := {
513 u := { sdcch8 := { tag := '01'B, sub_chan := sub_slot } },
514 tn := tn
515 }
Harald Welted2e342f2017-07-16 07:34:13 +0200516
Harald Welteb33e7272017-07-16 21:04:12 +0200517 /* TS 48.058 9.3.2 Link ID */
518 type enumerated RslLinkIdC {
519 FACCH_SDCCH (0),
520 SACCH (1)
521 } with { variant "FIELDLENGTH(2)" };
522
523 type enumerated RslSapi0Prio {
524 SAPI0_PRIO_NORMAL (0),
525 SAPI0_PRIO_HIGH (1),
526 SAPI0_PRIO_LOW (2)
527 } with { variant "FIELDLENGTH(2)" };
528
529 type uint3_t GsmSapi;
530
531 type record RslLinkId {
532 RslLinkIdC c,
533 boolean na,
534 RslSapi0Prio prio,
535 GsmSapi sapi
536 } with { variant "" };
537
538 template RslLinkId tr_RslLinkId := {
539 c := ?,
540 na := ?,
541 prio := ?,
542 sapi := ?
543 };
544
545 template RslLinkId tr_RslLinkID_DCCH(template GsmSapi sapi) modifies tr_RslLinkId := {
546 c := FACCH_SDCCH,
547 na := false,
548 sapi := sapi
549 };
550
551 template RslLinkId tr_RslLinkID_SACCH(template GsmSapi sapi) modifies tr_RslLinkId := {
552 c := SACCH,
553 na := false,
554 sapi := sapi
555 };
556
557 template RslLinkId ts_RslLinkID_DCCH(GsmSapi sapi) := {
558 c := FACCH_SDCCH,
559 na := false,
560 prio := SAPI0_PRIO_NORMAL,
561 sapi := sapi
562 };
563
564 template RslLinkId ts_RslLinkID_SACCH(template GsmSapi sapi) modifies tr_RslLinkID_SACCH := {
565 prio := SAPI0_PRIO_NORMAL
566 };
567
Harald Weltea082a692017-07-15 15:58:13 +0200568} with { encode "RAW"; variant "FIELDORDER(msb)" }