blob: 1628f3a649546e43f26bba3e422c8ef98ae10eb9 [file] [log] [blame]
Harald Weltee0abc472018-02-05 09:13:31 +01001module Osmocom_Gb_Types {
2
3 /* This module contains additional definitions and templates that we use on top of the
4 * TITAN NS + BSSGP modules */
5
6 import from General_Types all;
7 import from Osmocom_Types all;
8 import from GSM_Types all;
Harald Weltee0abc472018-02-05 09:13:31 +01009 import from BSSGP_Types all
10 import from NS_Types all
Harald Weltef4bf1312018-06-30 11:05:20 +020011 import from Native_Functions all;
Harald Weltee0abc472018-02-05 09:13:31 +010012
13 type uint16_t Nsvci;
14 type uint16_t Nsei;
15 type uint16_t BssgpBvci;
16
17 /* TS 48.016 10.3.7 */
18 type enumerated NsPduType {
19 NS_PDUT_NS_UNITDATA ('00000000'B),
20 NS_PDUT_NS_RESET ('00000010'B),
21 NS_PDUT_NS_RESET_ACK ('00000011'B),
22 NS_PDUT_NS_BLOCK ('00000100'B),
23 NS_PDUT_NS_BLOCK_ACK ('00000101'B),
24 NS_PDUT_NS_UNBLOCK ('00000110'B),
25 NS_PDUT_NS_UNBLOCK_ACK ('00000111'B),
26 NS_PDUT_NS_STATUS ('00001000'B),
27 NS_PDUT_NS_ALIVE ('00001010'B),
28 NS_PDUT_NS_ALIVE_ACK ('00001011'B)
29 /* FIXME: SNS */
30 } with { variant "FIELDLENGTH(8)" };
31
32 /* TS 48.016 10.3 */
33 type enumerated NsIEI {
34 NS_IEI_CAUSE ('00000000'B),
35 NS_IEI_NSVCI ('00000001'B),
36 NS_IEI_NS_PDU ('00000010'B),
37 NS_IEI_BVCI ('00000011'B),
38 NS_IEI_NSEI ('00000100'B),
39 NS_IEI_LIST_IPv4 ('00000101'B),
40 NS_IEI_LIST_IPv6 ('00000110'B),
41 NS_IEI_MAX_NUM_NSVC ('00000111'B),
42 NS_IEI_NUM_IPv4_EP ('00001000'B),
43 NS_IEI_NUM_IPv6_EP ('00001001'B),
44 NS_IEI_RESET_FLAG ('00001010'B),
45 NS_IEI_IP_ADDRESS ('00001011'B)
46 } with { variant "FIELDLENGTH(8)" };
47
48 /* TS 48.016 10.3.2 */
49 type enumerated NsCause {
50 NS_CAUSE_TRANSIT_NETWORK_FAILURE ('00000000'B),
51 NS_CAUSE_OM_INTERVENTION ('00000001'B),
52 NS_CAUSE_EQUIPMENT_FAILURE ('00000010'B),
53 NS_CAUSE_NSVC_BLOCKED ('00000011'B),
54 NS_CAUSE_NSVC_UNKNOWN ('00000100'B),
55 NS_CAUSE_BVCI_UNKNOWN_AT_NSE ('00000101'B),
56 NS_CAUSE_SEMANTICALLY_INCORRECT_PDU ('00001000'B),
57 NS_CAUSE_PDU_NOT_COMPATIBLE_WITH_PROTOCOL_STATE ('00001010'B),
58 NS_CAUSE_PROTOCOL_ERROR_UNSPEIFIED ('00001011'B),
59 NS_CAUSE_INVALID_ESSENTIAL_IE ('00001100'B),
60 NS_CAUSE_MISSING_ESSENTIAL_IE ('00001101'B),
61 NS_CAUSE_INVALID_NR_OF_IPv4_ENDPOINTS ('00001110'B),
62 NS_CAUSE_INVALID_NR_OF_IPv6_ENDPOINTS ('00001111'B),
63 NS_CAUSE_INVALID_NR_OF_NSVCS ('00010000'B),
64 NS_CAUSE_INVALID_WEIGHTS ('00010001'B),
65 NS_CAUSE_UNKNOWN_IP_ENDPOINT ('00010010'B),
66 NS_CAUSE_UNKNOWN_IP_ADDRESS ('00010011'B),
67 NS_CAUSE_IP_TEST_FAILEDA ('00010100'B)
68 } with { variant "FIELDLENGTH(8)" };
69
Harald Welte387ab372018-06-30 10:27:06 +020070 template (value) NS_SDU_ControlBits t_SduCtrlB := {
Harald Weltee0abc472018-02-05 09:13:31 +010071 rBit := '0'B,
72 cBit := '0'B,
73 spare := '000000'B
74 }
75
Harald Welte387ab372018-06-30 10:27:06 +020076 template (value) CauseNS ts_NS_IE_CAUSE(NsCause cause) := {
77 iEI := '00'O,
78 ext := '1'B,
79 lengthIndicator := {
80 length1 := 1
81 },
82 cause := int2oct(enum2int(valueof(cause)), 1)
83 }
Harald Weltef4bf1312018-06-30 11:05:20 +020084 function ts_NS_IE_CAUSE_omit(template (omit) NsCause cause) return template (omit) CauseNS {
85 var template (omit) CauseNS ret;
86 if (istemplatekind(cause, "omit")) {
87 return omit;
88 } else {
89 ret := {
90 iEI := '00'O,
91 ext := '1'B,
92 lengthIndicator := {
93 length1 := 1
94 },
95 cause := int2oct(enum2int(valueof(cause)), 1)
96 }
97 return ret;
98 }
99 }
Harald Welte387ab372018-06-30 10:27:06 +0200100
101 function tr_NS_IE_CAUSE(template NsCause cause) return template CauseNS {
Harald Weltee0abc472018-02-05 09:13:31 +0100102 var template CauseNS ret;
103 ret.iEI := '00'O;
104 ret.ext := '1'B;
105 ret.lengthIndicator := { length1 := 1 };
Harald Weltef4bf1312018-06-30 11:05:20 +0200106 if (istemplatekind(cause, "omit")) {
107 return omit;
108 } else if (istemplatekind(cause, "*")) {
109 return *;
110 } else if (istemplatekind(cause, "?")) {
Harald Weltee0abc472018-02-05 09:13:31 +0100111 ret.cause := ?
Harald Weltef4bf1312018-06-30 11:05:20 +0200112 } else {
113 ret.cause := int2oct(enum2int(valueof(cause)), 1);
Harald Weltee0abc472018-02-05 09:13:31 +0100114 }
115 return ret;
116 }
117
Harald Welte630d0e62019-02-22 23:26:40 +0100118 function ts_SNS_IP_ADDR(template (omit) IPAddress ip) return template (omit) IP_Address_NS {
119 var template (omit) IP_Address_NS ret;
120 if (istemplatekind(ip, "omit")) {
121 return omit;
122 } else {
123 ret.iEI := '0B'O;
124 ret.ipAddress := ip;
125 if (ischosen(ip.ip4Address)) {
126 ret.addressType := '01'O;
127 } else {
128 ret.addressType := '02'O;
129 }
130 }
131 return ret;
132 }
133 function tr_SNS_IP_ADDR(template IPAddress ip) return template IP_Address_NS {
134 var template IP_Address_NS ret;
135 ret.iEI := '0B'O;
136 if (istemplatekind(ip, "omit")) {
137 return omit;
138 } else if (istemplatekind(ip, "*")) {
139 return *;
140 } else if (istemplatekind(ip, "?")) {
141 return ?;
142 } else {
143 ret.ipAddress := ip;
144 if (ischosen(ip.ip4Address)) {
145 ret.addressType := '01'O;
146 } else {
147 ret.addressType := '02'O;
148 }
149 }
150 return ret;
151 }
152
Harald Weltee0abc472018-02-05 09:13:31 +0100153 private function f_oct_or_wc(template integer inp, integer len) return template octetstring {
Harald Weltef4bf1312018-06-30 11:05:20 +0200154 if (istemplatekind(inp, "omit")) {
155 return omit;
156 } else if (istemplatekind(inp, "*")) {
157 return *;
158 } else if (istemplatekind(inp, "?")) {
159 return ?;
Harald Weltee0abc472018-02-05 09:13:31 +0100160 }
Harald Weltef4bf1312018-06-30 11:05:20 +0200161 return int2oct(valueof(inp), len);
Harald Weltee0abc472018-02-05 09:13:31 +0100162 }
163
Harald Welte387ab372018-06-30 10:27:06 +0200164 template (value) NS_VCI ts_NS_IE_NSVCI(Nsvci nsvci) := {
165 iEI := '01'O,
166 ext := '1'B,
167 lengthIndicator := {
168 length1 := 2
169 },
170 nS_VCI := int2oct(nsvci, 2)
171 }
172 template NS_VCI tr_NS_IE_NSVCI(template Nsvci nsvci) := {
Harald Weltee0abc472018-02-05 09:13:31 +0100173 iEI := '01'O,
174 ext := '1'B,
175 lengthIndicator := {
176 length1 := 2
177 },
178 nS_VCI := f_oct_or_wc(nsvci, 2)
179 }
180
Harald Welte387ab372018-06-30 10:27:06 +0200181 template (value) NSEI_NS ts_NS_IE_NSEI(Nsei nsei) := {
182 iEI:= '04'O,
183 ext := '1'B,
184 lengthIndicator := {
185 length1 := 2
186 },
187 nSEI := int2oct(nsei, 2)
188 }
189 template NSEI_NS tr_NS_IE_NSEI(template Nsei nsei) := {
Harald Weltee0abc472018-02-05 09:13:31 +0100190 iEI:= '04'O,
191 ext := '1'B,
192 lengthIndicator := {
193 length1 := 2
194 },
195 nSEI := f_oct_or_wc(nsei, 2)
196 }
197
Harald Weltef4bf1312018-06-30 11:05:20 +0200198 template (value) IP4_Element ts_SNS_IPv4(charstring ip, integer udp_port,
199 uint8_t sig_weight := 1, uint8_t data_weight := 1) := {
200 ipAddress := f_inet_addr(ip),
201 uDP_Port := int2oct(udp_port, 2),
202 signallingWeight := int2oct(sig_weight, 1),
203 dataWeight := int2oct(data_weight, 1)
204 }
205 function tr_SNS_IPv4(template charstring ip, template integer udp_port,
206 template uint8_t sig_weight := ?, template uint8_t data_weight := ?)
207 return template IP4_Element {
208 var template IP4_Element e;
209 if (istemplatekind(ip, "?")) {
210 e.ipAddress := ?;
211 } else {
212 e.ipAddress := f_inet_addr(valueof(ip));
213 }
214 if (istemplatekind(udp_port, "?")) {
215 e.uDP_Port := ?;
216 } else {
217 e.uDP_Port := int2oct(valueof(udp_port), 2);
218 }
219 if (istemplatekind(sig_weight, "?")) {
220 e.signallingWeight := ?;
221 } else {
222 e.signallingWeight := int2oct(valueof(sig_weight), 1);
223 }
224 if (istemplatekind(data_weight, "?")) {
225 e.dataWeight := ?;
226 } else {
227 e.dataWeight := int2oct(valueof(data_weight), 1);
228 }
229 return e;
230 }
231
Alexander Couzens7b1e44f2020-08-25 23:33:17 +0200232 template (value) IP6_Element ts_SNS_IPv6(charstring ip, integer udp_port,
233 uint8_t sig_weight := 1, uint8_t data_weight := 1) := {
234 ipAddress := f_inet6_addr(ip),
235 uDP_Port := int2oct(udp_port, 2),
236 signallingWeight := int2oct(sig_weight, 1),
237 dataWeight := int2oct(data_weight, 1)
238 }
239 function tr_SNS_IPv6(template charstring ip, template integer udp_port,
240 template uint8_t sig_weight := ?, template uint8_t data_weight := ?)
241 return template IP6_Element {
242 var template IP6_Element e;
243 if (istemplatekind(ip, "?")) {
244 e.ipAddress := ?;
245 } else {
246 e.ipAddress := f_inet6_addr(valueof(ip));
247 }
248 if (istemplatekind(udp_port, "?")) {
249 e.uDP_Port := ?;
250 } else {
251 e.uDP_Port := int2oct(valueof(udp_port), 2);
252 }
253 if (istemplatekind(sig_weight, "?")) {
254 e.signallingWeight := ?;
255 } else {
256 e.signallingWeight := int2oct(valueof(sig_weight), 1);
257 }
258 if (istemplatekind(data_weight, "?")) {
259 e.dataWeight := ?;
260 } else {
261 e.dataWeight := int2oct(valueof(data_weight), 1);
262 }
263 return e;
264 }
265
Harald Welte387ab372018-06-30 10:27:06 +0200266
267 template (value) PDU_NS ts_NS_RESET(NsCause cause, Nsvci nsvci, Nsei nsei) := {
Harald Weltee0abc472018-02-05 09:13:31 +0100268 pDU_NS_Reset := {
269 nsPduType := '02'O,
Harald Welte387ab372018-06-30 10:27:06 +0200270 causeNS := ts_NS_IE_CAUSE(cause),
271 nS_VCI := ts_NS_IE_NSVCI(nsvci),
272 nSEI_NS := ts_NS_IE_NSEI(nsei)
273 }
274 }
275 template PDU_NS tr_NS_RESET(template NsCause cause, template Nsvci nsvci, template Nsei nsei) := {
276 pDU_NS_Reset := {
277 nsPduType := '02'O,
278 causeNS := tr_NS_IE_CAUSE(cause),
279 nS_VCI := tr_NS_IE_NSVCI(nsvci),
280 nSEI_NS := tr_NS_IE_NSEI(nsei)
Harald Weltee0abc472018-02-05 09:13:31 +0100281 }
282 }
283
Harald Welte387ab372018-06-30 10:27:06 +0200284 template (value) PDU_NS ts_NS_RESET_ACK(Nsvci nsvci, Nsei nsei) := {
Harald Weltee0abc472018-02-05 09:13:31 +0100285 pDU_NS_Reset_Ack := {
286 nsPduType := '03'O,
Harald Welte387ab372018-06-30 10:27:06 +0200287 nS_VCI := ts_NS_IE_NSVCI(nsvci),
288 nSEI_NS := ts_NS_IE_NSEI(nsei)
289 }
290 }
291 template PDU_NS tr_NS_RESET_ACK(template Nsvci nsvci, template Nsei nsei) := {
292 pDU_NS_Reset_Ack := {
293 nsPduType := '03'O,
294 nS_VCI := tr_NS_IE_NSVCI(nsvci),
295 nSEI_NS := tr_NS_IE_NSEI(nsei)
Harald Weltee0abc472018-02-05 09:13:31 +0100296 }
297 }
298
Harald Welte387ab372018-06-30 10:27:06 +0200299 template (value) PDU_NS ts_NS_BLOCK(NsCause cause, Nsvci nsvci) := {
Harald Weltee0abc472018-02-05 09:13:31 +0100300 pDU_NS_Block := {
301 nsPduType := '04'O,
Harald Welte387ab372018-06-30 10:27:06 +0200302 causeNS := ts_NS_IE_CAUSE(cause),
303 nS_VCI := ts_NS_IE_NSVCI(nsvci)
304 }
305 }
306 template PDU_NS tr_NS_BLOCK(template NsCause cause, template Nsvci nsvci) := {
307 pDU_NS_Block := {
308 nsPduType := '04'O,
309 causeNS := tr_NS_IE_CAUSE(cause),
310 nS_VCI := tr_NS_IE_NSVCI(nsvci)
Harald Weltee0abc472018-02-05 09:13:31 +0100311 }
312 }
313
Harald Welte387ab372018-06-30 10:27:06 +0200314 template (value) PDU_NS ts_NS_BLOCK_ACK(Nsvci nsvci) := {
Harald Weltee0abc472018-02-05 09:13:31 +0100315 pDU_NS_Block_Ack := {
316 nsPduType := '05'O,
Harald Welte387ab372018-06-30 10:27:06 +0200317 nS_VCI := ts_NS_IE_NSVCI(nsvci)
318 }
319 }
320 template PDU_NS tr_NS_BLOCK_ACK(template Nsvci nsvci) := {
321 pDU_NS_Block_Ack := {
322 nsPduType := '05'O,
323 nS_VCI := tr_NS_IE_NSVCI(nsvci)
Harald Weltee0abc472018-02-05 09:13:31 +0100324 }
325 }
326
327 template PDU_NS t_NS_UNBLOCK := {
328 pDU_NS_Unblock := {
329 nsPduType := '06'O
330 }
331 }
332
333 template PDU_NS t_NS_UNBLOCK_ACK := {
334 pDU_NS_Unblock_Ack := {
335 nsPduType := '07'O
336 }
337 }
338
339 template PDU_NS t_NS_ALIVE := {
340 pDU_NS_Alive := {
341 nsPduType := '0A'O
342 }
343 }
344
345 template PDU_NS t_NS_ALIVE_ACK := {
346 pDU_NS_Alive_Ack := {
347 nsPduType := '0B'O
348 }
349 }
350
Harald Welte387ab372018-06-30 10:27:06 +0200351 template (value) PDU_NS ts_NS_STATUS(NsCause cause, PDU_NS pdu) := {
Harald Weltee0abc472018-02-05 09:13:31 +0100352 pDU_NS_Status := {
353 nsPduType := '08'O,
Harald Welte387ab372018-06-30 10:27:06 +0200354 causeNS := ts_NS_IE_CAUSE(cause),
Harald Weltee0abc472018-02-05 09:13:31 +0100355 nS_VCI := omit,
356 nS_PDU := {
357 iEI := '02'O,
358 ext := '1'B,
359 lengthIndicator := {
360 length1 := 0 /* overwritten */
361 },
362 ns_PDU := enc_PDU_NS(pdu)
363 },
364 bVCI_NS := omit,
365 listofIP4Elements := omit,
366 listofIP6Elements := omit
367 }
368 }
369
Alexander Couzens9843b662020-09-07 05:20:54 +0200370 template PDU_NS tr_NS_STATUS(template NsCause cause) := {
371 pDU_NS_Status := {
372 nsPduType := '08'O,
373 causeNS := tr_NS_IE_CAUSE(cause),
374 nS_VCI := *,
375 nS_PDU := *,
376 bVCI_NS := *,
377 listofIP4Elements := *,
378 listofIP6Elements := *
379 }
380 }
381
Harald Welte387ab372018-06-30 10:27:06 +0200382 template (value) PDU_NS ts_NS_UNITDATA(template (value) NS_SDU_ControlBits bits, BssgpBvci bvci, octetstring sdu) := {
383 pDU_NS_Unitdata := {
384 nsPduType := '00'O,
385 nS_SDU_ControlBits := bits,
386 bVCI := int2oct(bvci, 2),
387 nS_SDU := sdu
388 }
389 }
390 template PDU_NS tr_NS_UNITDATA(template NS_SDU_ControlBits bits, template BssgpBvci bvci, template
Harald Weltee0abc472018-02-05 09:13:31 +0100391octetstring sdu) := {
392 pDU_NS_Unitdata := {
393 nsPduType := '00'O,
394 nS_SDU_ControlBits := bits,
395 bVCI := f_oct_or_wc(bvci, 2),
396 nS_SDU := sdu
397 }
398 }
399
400
Harald Weltef4bf1312018-06-30 11:05:20 +0200401
402 private function ts_num_of_ep(OCT1 iei, template (omit) uint16_t num_ep)
403 return template (omit) NumberOfIP_Endpoints {
404 var template (omit) NumberOfIP_Endpoints t;
405 if (istemplatekind(num_ep, "omit")) {
406 return omit;
407 } else {
408 t.iEI := iei;
409 t.numberOfIP_Endpoints := int2oct(valueof(num_ep), 2);
410 return t;
411 }
412 }
413 private function tr_num_of_ep(OCT1 iei, template uint16_t num_ep)
414 return template NumberOfIP_Endpoints {
415 var template NumberOfIP_Endpoints t;
416 if (istemplatekind(num_ep, "omit")) {
417 return omit;
418 } else if (istemplatekind(num_ep, "*")) {
419 return *;
420 } else if (istemplatekind(num_ep, "?")) {
421 return ?;
422 } else {
423 t.iEI := iei;
424 t.numberOfIP_Endpoints := int2oct(valueof(num_ep), 2);
425 return t;
426 }
427 }
428
429
430 template (value) ResetFlag ts_SNS_IE_ResetFlag(boolean rst) := {
431 iEI := '0A'O,
432 resetBIT := bool2bit(rst),
433 spare := '0000000'B
434 }
435 template ResetFlag tr_SNS_IE_ResetFlag(template boolean rst) := {
436 iEI := '0A'O,
437 resetBIT := bool2bit_tmpl(rst),
438 spare := '0000000'B
439 }
440
441 template (value) EndFlag ts_SNS_IE_EndFlag(boolean end) := {
442 eBIT := bool2bit(end),
443 spare := '0000000'B
444 }
445 template EndFlag tr_SNS_IE_EndFlag(template boolean end) := {
446 eBIT := bool2bit_tmpl(end),
447 spare := '0000000'B
448 }
449
450 template (value) MaxNumberOfNSVCs ts_SNS_IE_MaxNumOfNSVCs(uint16_t num) := {
451 iEI := '07'O,
452 maxNumberOfNSVCs := int2oct(num, 2)
453 }
454 template MaxNumberOfNSVCs tr_SNS_IE_MaxNumOfNSVCs(template uint16_t num) := {
455 iEI := '07'O,
456 maxNumberOfNSVCs := f_oct_or_wc(num, 2)
457 }
458
459 template (value) PDU_NS ts_SNS_SIZE(Nsei nsei, boolean rst_flag := true,
460 uint16_t max_nsvcs := 2,
461 template (omit) uint16_t num_v4 := 1,
462 template (omit) uint16_t num_v6 := omit) := {
463 pDU_SNS_Size := {
464 nsPduType := '12'O,
465 nSEI_NS := ts_NS_IE_NSEI(nsei),
466 resetFlag := ts_SNS_IE_ResetFlag(rst_flag),
467 maxNumberOfNSVCs := ts_SNS_IE_MaxNumOfNSVCs(max_nsvcs),
468 numberOfIP4_Endpoints := ts_num_of_ep('08'O, num_v4),
469 numberOfIP6_Endpoints := ts_num_of_ep('09'O, num_v6)
470 }
471 }
472 template PDU_NS tr_SNS_SIZE(template Nsei nsei, template boolean rst_flag := ?,
473 template uint16_t max_nsvcs := ?,
474 template uint16_t num_v4 := ?,
475 template uint16_t num_v6 := *) := {
476 pDU_SNS_Size := {
477 nsPduType := '12'O,
478 nSEI_NS := tr_NS_IE_NSEI(nsei),
479 resetFlag := tr_SNS_IE_ResetFlag(rst_flag),
480 maxNumberOfNSVCs := tr_SNS_IE_MaxNumOfNSVCs(max_nsvcs),
481 numberOfIP4_Endpoints := tr_num_of_ep('08'O, num_v4),
482 numberOfIP6_Endpoints := tr_num_of_ep('09'O, num_v6)
483 }
484 }
485
486 template PDU_NS ts_SNS_SIZE_ACK(Nsei nsei, template (omit) NsCause cause) := {
487 pDU_SNS_Size_Ack := {
488 nsPduType := '13'O,
489 nSEI_NS := ts_NS_IE_NSEI(nsei),
490 causeNS := ts_NS_IE_CAUSE_omit(cause)
491 }
492 }
493 template PDU_NS tr_SNS_SIZE_ACK(template Nsei nsei, template NsCause cause) := {
494 pDU_SNS_Size_Ack := {
495 nsPduType := '13'O,
496 nSEI_NS := tr_NS_IE_NSEI(nsei),
497 causeNS := tr_NS_IE_CAUSE(cause)
498 }
499 }
500
501 private function ts_SNS_IE_ListIP4(template (omit) IP4_Elements elem)
502 return template (omit) ListofIP4Elements {
503 var template (omit) ListofIP4Elements r;
504 if (istemplatekind(elem, "omit")) {
505 return omit;
506 } else {
507 r := {
508 iEI := '05'O,
509 ext := '1'B,
510 lengthIndicator := {
511 length1 := 0 /* overwritten */
512 },
513 iP4_Elements := elem
514 }
515 return r;
516 }
517 }
518 private function tr_SNS_IE_ListIP4(template IP4_Elements elem)
519 return template ListofIP4Elements {
520 var template ListofIP4Elements r;
521 if (istemplatekind(elem, "omit")) {
522 return omit;
523 } else {
524 r := {
525 iEI := '05'O,
526 ext := '1'B,
527 lengthIndicator := {
528 length1 := ? /* overwritten */
529 },
530 iP4_Elements := elem
531 }
532 return r;
533 }
534 }
535
536 private function ts_SNS_IE_ListIP6(template (omit) IP6_Elements elem)
537 return template (omit) ListofIP6Elements {
538 var template (omit) ListofIP6Elements r;
539 if (istemplatekind(elem, "omit")) {
540 return omit;
541 } else {
542 r := {
543 iEI := '06'O,
544 ext := '1'B,
545 lengthIndicator := {
546 length1 := 0 /* overwritten */
547 },
548 iP6_Elements := elem
549 }
550 return r;
551 }
552 }
553 private function tr_SNS_IE_ListIP6(template IP6_Elements elem)
554 return template ListofIP6Elements {
555 var template ListofIP6Elements r;
556 if (istemplatekind(elem, "omit")) {
557 return omit;
Harald Welte630d0e62019-02-22 23:26:40 +0100558 } else if (istemplatekind(elem, "*")) {
559 return *;
Harald Weltef4bf1312018-06-30 11:05:20 +0200560 } else {
561 r := {
562 iEI := '06'O,
563 ext := '1'B,
564 lengthIndicator := {
565 length1 := ? /* overwritten */
566 },
567 iP6_Elements := elem
568 }
569 return r;
570 }
571 }
572
573 template (value) PDU_NS ts_SNS_CONFIG(Nsei nsei, boolean end_flag,
Alexander Couzens7b1e44f2020-08-25 23:33:17 +0200574 template (omit) IP4_Elements v4 := omit,
Harald Weltef4bf1312018-06-30 11:05:20 +0200575 template (omit) IP6_Elements v6 := omit) := {
576 pDU_SNS_Config := {
577 nsPduType := '0F'O,
578 endFlag := ts_SNS_IE_EndFlag(end_flag),
579 nSEI_NS := ts_NS_IE_NSEI(nsei),
580 listofIP4Elements := ts_SNS_IE_ListIP4(v4),
581 listofIP6Elements := ts_SNS_IE_ListIP6(v6)
582 }
583 }
584 template PDU_NS tr_SNS_CONFIG(template Nsei nsei, template boolean end_flag,
Alexander Couzens7b1e44f2020-08-25 23:33:17 +0200585 template IP4_Elements v4 := omit,
Harald Weltef4bf1312018-06-30 11:05:20 +0200586 template IP6_Elements v6 := omit) := {
587 pDU_SNS_Config := {
588 nsPduType := '0F'O,
589 endFlag := tr_SNS_IE_EndFlag(end_flag),
590 nSEI_NS := tr_NS_IE_NSEI(nsei),
591 listofIP4Elements := tr_SNS_IE_ListIP4(v4),
592 listofIP6Elements := tr_SNS_IE_ListIP6(v6)
593 }
594 }
595
596 template (value) PDU_NS ts_SNS_CONFIG_ACK(Nsei nsei, template (omit) NsCause cause) := {
597 pDU_SNS_Config_Ack := {
598 nsPduType := '10'O,
599 nSEI_NS := ts_NS_IE_NSEI(nsei),
600 causeNS := ts_NS_IE_CAUSE_omit(cause)
601 }
602 }
603 template PDU_NS tr_SNS_CONFIG_ACK(template Nsei nsei, template NsCause cause) := {
604 pDU_SNS_Config_Ack := {
605 nsPduType := '10'O,
606 nSEI_NS := tr_NS_IE_NSEI(nsei),
607 causeNS := tr_NS_IE_CAUSE(cause)
608 }
609 }
610
Harald Welte630d0e62019-02-22 23:26:40 +0100611 template (value) PDU_NS ts_SNS_ADD(Nsei nsei, uint8_t trans_id,
612 template (omit) IP4_Elements v4,
613 template (omit) IP6_Elements v6 := omit) := {
614 pDU_SNS_Add := {
615 nsPduType := '0D'O,
616 nSEI_NS := ts_NS_IE_NSEI(nsei),
617 transactionID := trans_id,
618 listofIP4Elements := ts_SNS_IE_ListIP4(v4),
619 listofIP6Elements := ts_SNS_IE_ListIP6(v6)
620 }
621 }
622 template PDU_NS tr_SNS_ADD(template Nsei nsei, template uint8_t trans_id,
623 template IP4_Elements v4,
624 template IP6_Elements v6 := omit) := {
625 pDU_SNS_Add := {
626 nsPduType := '0D'O,
627 nSEI_NS := tr_NS_IE_NSEI(nsei),
628 transactionID := trans_id,
629 listofIP4Elements := tr_SNS_IE_ListIP4(v4),
630 listofIP6Elements := tr_SNS_IE_ListIP6(v6)
631 }
632 }
633
634 template (value) PDU_NS ts_SNS_DEL(Nsei nsei, uint8_t trans_id,
635 template (omit) IPAddress ip_sns,
636 template (omit) IP4_Elements v4,
637 template (omit) IP6_Elements v6 := omit) := {
638 pDU_SNS_Delete := {
639 nsPduType := '11'O,
640 nSEI_NS := ts_NS_IE_NSEI(nsei),
641 transactionID := trans_id,
642 iP_Address_NS := ts_SNS_IP_ADDR(ip_sns),
643 listofIP4Elements := ts_SNS_IE_ListIP4(v4),
644 listofIP6Elements := ts_SNS_IE_ListIP6(v6)
645 }
646 }
647 template PDU_NS tr_SNS_DEL(template Nsei nsei, template uint8_t trans_id,
648 template IPAddress ip_sns,
649 template IP4_Elements v4,
650 template IP6_Elements v6 := omit) := {
651 pDU_SNS_Delete := {
652 nsPduType := '11'O,
653 nSEI_NS := tr_NS_IE_NSEI(nsei),
654 transactionID := trans_id,
655 iP_Address_NS := tr_SNS_IP_ADDR(ip_sns),
656 listofIP4Elements := tr_SNS_IE_ListIP4(v4),
657 listofIP6Elements := tr_SNS_IE_ListIP6(v6)
658 }
659 }
660
Harald Welte72099552019-02-23 15:09:22 +0100661 template (value) PDU_NS ts_SNS_CHG_WEIGHT(Nsei nsei, uint8_t trans_id,
662 template (omit) IP4_Elements v4,
663 template (omit) IP6_Elements v6 := omit) := {
664 pDU_SNS_ChangeWeight := {
665 nsPduType := '0E'O,
666 nSEI_NS := ts_NS_IE_NSEI(nsei),
667 transactionID := trans_id,
668 listofIP4Elements := ts_SNS_IE_ListIP4(v4),
669 listofIP6Elements := ts_SNS_IE_ListIP6(v6)
670 }
671 }
672 template PDU_NS tr_SNS_CHG_WEIGHT(template Nsei nsei, template uint8_t trans_id,
673 template IP4_Elements v4,
674 template IP6_Elements v6 := omit) := {
675 pDU_SNS_ChangeWeight := {
676 nsPduType := '0E'O,
677 nSEI_NS := tr_NS_IE_NSEI(nsei),
678 transactionID := trans_id,
679 listofIP4Elements := tr_SNS_IE_ListIP4(v4),
680 listofIP6Elements := tr_SNS_IE_ListIP6(v6)
681 }
682 }
683
Harald Welte630d0e62019-02-22 23:26:40 +0100684
685 template (value) PDU_NS ts_SNS_ACK(Nsei nsei, uint8_t trans_id,
686 template (omit) NsCause cause := omit,
687 template (omit) IP4_Elements v4 := omit,
688 template (omit) IP6_Elements v6 := omit) := {
689 pDU_SNS_Ack := {
690 nsPduType := '0C'O,
691 nSEI_NS := ts_NS_IE_NSEI(nsei),
692 transactionID := trans_id,
693 causeNS := ts_NS_IE_CAUSE_omit(cause),
694 iP_Address_NS := omit,
695 listofIP4Elements := ts_SNS_IE_ListIP4(v4),
696 listofIP6Elements := ts_SNS_IE_ListIP6(v6)
697 }
698 }
699 template PDU_NS tr_SNS_ACK(template Nsei nsei, template uint8_t trans_id := ?,
700 template NsCause cause := omit,
701 template IP4_Elements v4 := *,
702 template IP6_Elements v6 := *) := {
703 pDU_SNS_Ack := {
704 nsPduType := '0C'O,
705 nSEI_NS := tr_NS_IE_NSEI(nsei),
706 transactionID := trans_id,
707 causeNS := tr_NS_IE_CAUSE(cause),
708 iP_Address_NS := omit,
709 listofIP4Elements := tr_SNS_IE_ListIP4(v4),
710 listofIP6Elements := tr_SNS_IE_ListIP6(v6)
711 }
712 }
713
714
715
716
717
718
719
Harald Weltee0abc472018-02-05 09:13:31 +0100720 type record BssgpCellId {
721 RoutingAreaIdentification ra_id,
722 CellIdentity cell_id
723 } with { variant "" };
724
725 type enumerated BssgpCause {
726 BSSGP_CAUSE_PROC_OVERLOAD ('00'H),
727 BSSGP_CAUSE_EQUIMENT_FAILURE ('01'H),
728 BSSGP_CAUSE_TRANSIT_NETWORK_FAILURE ('02'H),
729 BSSGP_CAUSE_NET_SV_CAP_MOD_GT_ZERO_KBPS ('03'H),
730 BSSGP_CAUSE_UNKNOWN_MS ('04'H),
731 BSSGP_CAUSE_BVCI_UNKNOWN ('05'H),
732 BSSGP_CAUSE_CELL_TRAFFIC_CONGESTION ('06'H),
733 BSSGP_CAUSE_SGSN_CONGESTION ('07'H),
734 BSSGP_CAUSE_OM_INTERVENTION ('08'H),
735 BSSGP_CAUSE_BVCI_BLOCKED ('09'H),
736 BSSGP_CAUSE_PFC_CREATE_FAILURE ('0a'H),
737 BSSGP_CAUSE_PFC_PREEMPTED ('0b'H),
738 BSSGP_CAUSE_ABQP_NO_MORE_SUPPORTED ('0c'H),
739 BSSGP_CAUSE_SEMANTICALLY_INCORRECT_PDU ('20'H),
740 BSSGP_CAUSE_INVALID_MANDATORY_IE ('21'H),
741 BSSGP_CAUSE_MISSING_MANDATORY_IE ('22'H),
742 BSSGP_CAUSE_MISSING_CONDITIONAL_IE ('23'H),
743 BSSGP_CAUSE_UNEXPECTED_CONDITIONAL_IE ('24'H),
744 BSSGP_CAUSE_CONDITIONAL_IE_ERROR ('25'H),
745 BSSGP_CAUSE_PDU_NOT_COMPATIBLE_WITH_PROTOCOL_STATE ('26'H),
746 BSSGP_CAUSE_PROTOCOL_ERROR_UNSPECIFIED ('27'H),
747 BSSGP_CAUSE_PDU_NOT_COMPATIBLE_WITH_FEATURE_SET ('28'H),
748 BSSGP_CAUSE_REQUESTED_INFO_NOT_AVAILABLE ('29'H),
749 BSSGP_CAUSE_UNKNOWN_DESTINATION_ADDRESS ('2a'H),
750 BSSGP_CAUSE_UNKNOWN_RIM_APP_IDENTITY ('2b'H),
751 BSSGP_CAUSE_INVALID_CONTAINER_UNIT_INFO ('2c'H),
752 BSSGP_CAUSE_PFC_QUEUING ('2d'H),
753 BSSGP_CAUSE_PFC_CREATED_SUCCESSFULLY ('2e'H),
754 BSSGP_CAUSE_T12_EXPIRY ('2f'H),
755 BSSGP_CAUSE_MS_UNDER_PS_HANDOVER_TREATMENT ('30'H),
756 BSSGP_CAUSE_UPLINK_QUALITY ('31'H),
757 BSSGP_CAUSE_UPLINK_STRENGTH ('32'H),
758 BSSGP_CAUSE_DOWNLINK_QUALITY ('33'H),
759 BSSGP_CAUSE_DOWNLINK_STRENGTH ('34'H),
760 BSSGP_CAUSE_DISTANCE ('35'H),
761 BSSGP_CAUSE_BETTER_CELL ('36'H),
762 BSSGP_CAUSE_TRAFFIC ('37'H),
763 BSSGP_CAUSE_OM_INTERVENTION2 ('38'H),
764 BSSGP_CAUSE_MS_BACK_ON_OLD_CHANNEL ('39'H),
765 BSSGP_CAUSE_T13_EXPIRY ('3a'H),
766 BSSGP_CAUSE_T14_EXPIRY ('3b'H),
767 BSSGP_CAUSE_NOT_ALL_REQUESTED_PFC_CREATED ('3c'H)
768 } with { variant "FIELDLENGTH(8)" };
769
Daniel Willmann7f1d78e2020-11-24 14:42:40 +0100770 private function t_FLUSH_ACTION(template OCT1 act)
771 return template Flush_Action {
772 var template Flush_Action r;
773 if (istemplatekind(act, "omit")) {
774 return omit;
775 } else if (istemplatekind(act, "*")) {
776 return *;
777 } else {
778 r := {
779 iEI := '0C'O,
780 ext := '1'B,
781 lengthIndicator := {
782 length1 := 1
783 },
784 actionValue := act
785 }
786 return r;
787 }
788 }
789 private function t_NO_OCT_AFF(template integer oct_aff)
790 return template Number_of_octets_affected {
791 var template Number_of_octets_affected r;
792 if (istemplatekind(oct_aff, "omit")) {
793 return omit;
794 } else if (istemplatekind(oct_aff, "*")) {
795 return *;
796 } else {
797 r := {
798 iEI := '25'O,
799 ext := '1'B,
800 lengthIndicator := {
801 length1 := 3
802 },
803 number_of_octets_transfered_or_deleted := f_oct_or_wc(oct_aff, 3)
804 }
805 return r;
806 }
807 }
Harald Weltee0abc472018-02-05 09:13:31 +0100808
Daniel Willmann379fc252020-11-20 18:34:22 +0100809 private function t_BSSGP_BVCI(template BssgpBvci bvci)
810 return template BVCI {
811 var template BVCI r;
812 if (istemplatekind(bvci, "omit")) {
813 return omit;
814 } else if (istemplatekind(bvci, "*")) {
815 return *;
816 } else {
817 r := {
818 iEI := '04'O,
819 ext := '1'B,
820 lengthIndicator := {
821 length1 := 2
822 },
823 unstructured_value := f_oct_or_wc(bvci, 2)
824 }
825 return r;
826 }
827 }
828 private function t_BSSGP_NSEI(template Nsei nsei)
829 return template NSEI_BSSGP {
830 var template NSEI_BSSGP r;
831 if (istemplatekind(nsei, "omit")) {
832 return omit;
833 } else if (istemplatekind(nsei, "*")) {
834 return *;
835 } else {
836 r := {
837 iEI:= '3E'O,
838 ext := '1'B,
839 lengthIndicator := {
840 length1 := 2
841 },
842 nSEI := f_oct_or_wc(nsei, 2)
843 }
844 return r;
845 }
Harald Weltee0abc472018-02-05 09:13:31 +0100846 }
847
Harald Welte23989a62019-03-21 21:32:45 +0100848 template (value) TLLI_BSSGP ts_BSSGP_TLLI(template (value) GprsTlli tlli) := {
849 iEI := '1F'O,
850 ext := '1'B,
851 lengthIndicator := {
852 length1 := 4
853 },
854 tLLI_Value := tlli
855 }
856 template TLLI_BSSGP tr_BSSGP_TLLI(template GprsTlli tlli) := {
857 iEI := '1F'O,
858 ext := '1'B,
859 lengthIndicator := {
860 length1 := 4
861 },
862 tLLI_Value := tlli
863 }
864
865 template (value) Suspend_Reference_Number ts_BSSGP_SUSP_REF(template (value) OCT1 susp_ref) := {
866 iEI := '1D'O,
867 ext := '1'B,
868 lengthIndicator := {
869 length1 := 1
870 },
871 suspend_Reference_Number_value := susp_ref
872 }
873 template Suspend_Reference_Number tr_BSSGP_SUSP_REF(template OCT1 susp_ref) := {
874 iEI := '1D'O,
875 ext := '1'B,
876 lengthIndicator := {
877 length1 := 1
878 },
879 suspend_Reference_Number_value := susp_ref
880 }
881
Harald Weltee0abc472018-02-05 09:13:31 +0100882 template IMSI_BSSGP tr_BSSGP_IMSI(template hexstring imsi) := {
883 iEI := '0D'O,
884 ext := '1'B,
885 lengthIndicator := ?,
886 type_of_Identity := '001'B,
887 oddevenIndicator := ?,
888 digits := imsi
889 }
890
891 template IMSI_BSSGP ts_BSSGP_IMSI(hexstring imsi) := {
892 iEI := '0D'O,
893 ext := '1'B,
894 lengthIndicator := { length1 := 0 /* overwritten */ },
895 type_of_Identity := '001'B,
896 oddevenIndicator := f_hex_is_odd_length(imsi),
897 digits := imsi
898 }
899
Harald Welte0e188242020-11-22 21:46:48 +0100900 template (present) TMSI_BSSGP tr_BSSGP_TMSI(GsmTmsi tmsi) := {
901 iEI := '20'O,
902 ext := '1'B,
903 lengthIndicator := { length1 := 4 },
904 tMSI_Value := int2oct(tmsi, 4)
905 }
906
Harald Weltee0abc472018-02-05 09:13:31 +0100907 template TMSI_BSSGP ts_BSSGP_TMSI(GsmTmsi tmsi) := {
908 iEI := '20'O,
909 ext := '1'B,
910 lengthIndicator := { length1 := 4 },
911 tMSI_Value := int2oct(tmsi, 4)
912 }
913
914 function f_bssgp_length_ind(integer len) return LIN2_2a {
915 var LIN2_2a ret;
916 if (len > 255) {
917 ret := { length2 := len };
918 } else {
919 ret := { length1 := len };
920 }
921 return ret;
922 }
923
924 template LLC_PDU ts_BSSGP_LLC_PDU(octetstring pdu) := {
925 iEI := '0D'O,
926 ext := '1'B,
927 lengthIndicator := f_bssgp_length_ind(lengthof(pdu)),
928 lLC_PDU := pdu
929 }
930
931 template LLC_PDU tr_BSSGP_LLC_PDU(template octetstring pdu := ?) := {
Harald Welte7024baa2018-03-02 23:37:51 +0100932 iEI := '0E'O,
933 ext := ?,
Harald Weltee0abc472018-02-05 09:13:31 +0100934 lengthIndicator := ?,
935 lLC_PDU := pdu
936 }
937
Harald Welte23989a62019-03-21 21:32:45 +0100938 function ts_BSSGP_CAUSE(template (omit) BssgpCause cause) return template (omit) Cause_BSSGP {
939 var template (omit) Cause_BSSGP ret;
940 if (istemplatekind(cause, "omit")) {
941 ret := omit;
942 } else {
943 ret.iEI := '07'O;
944 ret.ext := '1'B;
945 ret.lengthIndicator := { length1 := 1 };
946 ret.cause_Value := int2oct(enum2int(valueof(cause)), 1);
947 }
948 return ret;
949 }
Harald Weltee0abc472018-02-05 09:13:31 +0100950 function t_BSSGP_CAUSE(template BssgpCause cause) return template Cause_BSSGP {
951 var template Cause_BSSGP ret;
Harald Weltebacca282018-03-02 16:03:59 +0100952 ret.iEI := '07'O;
Harald Weltee0abc472018-02-05 09:13:31 +0100953 ret.ext := '1'B;
954 ret.lengthIndicator := { length1 := 1 };
955 if (isvalue(cause)) {
956 ret.cause_Value := int2oct(enum2int(valueof(cause)), 1);
957 } else {
958 ret.cause_Value := ?
959 }
960 return ret;
961 }
962
963 function t_BSSGP_IE_CellId(template BssgpCellId cid) return template Cell_Identifier {
964 var template Cell_Identifier ret := {
965 iEI := '08'O,
966 ext := '1'B,
967 lengthIndicator := { length1 := 8 },
968 mccDigit1 := ?,
969 mccDigit2 := ?,
970 mccDigit3 := ?,
971 mncDigit3 := ?,
972 mncDigit1 := ?,
973 mncDigit2 := ?,
974 lac := ?,
975 rac := ?,
976 cI_value := ?
977 }
978 if (istemplatekind(cid, "omit")) {
979 return omit;
980 } else if (istemplatekind(cid, "*")) {
981 return *;
982 } else if (istemplatekind(cid, "?")) {
983 return ?;
984 }
985 if (isvalue(cid) and isvalue(cid.ra_id) and isvalue(cid.ra_id.lai)) {
986 if (isvalue(cid.ra_id.lai.mcc_mnc)) {
987 ret.mccDigit1 := cid.ra_id.lai.mcc_mnc[0];
988 ret.mccDigit2 := cid.ra_id.lai.mcc_mnc[1];
989 ret.mccDigit3 := cid.ra_id.lai.mcc_mnc[2];
Harald Welte797ab3a2019-03-21 21:33:28 +0100990 ret.mncDigit3 := cid.ra_id.lai.mcc_mnc[3];
Harald Welte797ab3a2019-03-21 21:33:28 +0100991 ret.mncDigit1 := cid.ra_id.lai.mcc_mnc[4];
Alexander Couzensc7dddbd2019-04-11 19:18:35 +0200992 ret.mncDigit2 := cid.ra_id.lai.mcc_mnc[5];
Harald Weltee0abc472018-02-05 09:13:31 +0100993 }
994 if (isvalue(cid.ra_id.lai.lac)) {
995 ret.lac := f_oct_or_wc(cid.ra_id.lai.lac, 2);
996 }
997 }
998 if (isvalue(cid) and isvalue(cid.ra_id)) {
999 ret.rac := f_oct_or_wc(cid.ra_id.rac, 1);
1000 }
1001 if (isvalue(cid)) {
1002 ret.cI_value := f_oct_or_wc(cid.cell_id, 2);
1003 }
1004 return ret;
1005 }
1006
Daniel Willmann670bbc02020-11-19 16:39:39 +01001007 template (value) Tag ts_BSSGP_IE_Tag(OCT1 tag) := {
1008 iEI := '1E'O,
1009 ext := '1'B,
1010 lengthIndicator := {
1011 length1 := 1
1012 },
1013 unstructured_Value := tag
1014 }
Harald Welte6dc2ac42020-11-16 09:16:17 +01001015
Daniel Willmann670bbc02020-11-19 16:39:39 +01001016 template (present) Tag tr_BSSGP_IE_Tag(template (present) OCT1 tag) := {
1017 iEI := '1E'O,
1018 ext := '1'B,
1019 lengthIndicator := {
1020 length1 := 1
1021 },
1022 unstructured_Value := tag
1023 }
Harald Welte6dc2ac42020-11-16 09:16:17 +01001024
Daniel Willmann670bbc02020-11-19 16:39:39 +01001025 template (value) RA_Cap_UPD_CAUSE ts_BSSGP_IE_RACU_Cause(template (value) OCT1 cause) := {
1026 iEI := '1A'O,
1027 ext := '1'B,
1028 lengthIndicator := {
1029 length1 := 1
1030 },
1031 rA_CAP_UPD_Cause_value := cause
1032 }
Harald Welte6dc2ac42020-11-16 09:16:17 +01001033
Daniel Willmann670bbc02020-11-19 16:39:39 +01001034 template (present) RA_Cap_UPD_CAUSE tr_BSSGP_IE_RACU_Cause(template (present) OCT1 cause) := {
1035 iEI := '1A'O,
1036 ext := '1'B,
1037 lengthIndicator := {
1038 length1 := 1
1039 },
1040 rA_CAP_UPD_Cause_value := cause
1041 }
Harald Welte6dc2ac42020-11-16 09:16:17 +01001042
1043
Harald Weltee0abc472018-02-05 09:13:31 +01001044 template PDU_BSSGP ts_BVC_RESET(BssgpCause cause, BssgpBvci bvci,
1045 template BssgpCellId cell_id) := {
1046 pDU_BSSGP_BVC_RESET := {
1047 bssgpPduType := '22'O,
1048 bVCI := t_BSSGP_BVCI(bvci),
Harald Welte23989a62019-03-21 21:32:45 +01001049 cause := ts_BSSGP_CAUSE(cause),
Harald Weltee0abc472018-02-05 09:13:31 +01001050 cell_Identifier := t_BSSGP_IE_CellId(cell_id),
1051 feature_bitmap := omit,
1052 extended_Feature_Bitmap := omit
1053 }
1054 }
1055
1056 template PDU_BSSGP tr_BVC_RESET(template BssgpCause cause, template BssgpBvci bvci,
1057 template BssgpCellId cell_id) := {
1058 pDU_BSSGP_BVC_RESET := {
1059 bssgpPduType := '22'O,
1060 bVCI := t_BSSGP_BVCI(bvci),
1061 cause := t_BSSGP_CAUSE(cause),
1062 cell_Identifier := t_BSSGP_IE_CellId(cell_id),
1063 feature_bitmap := *,
1064 extended_Feature_Bitmap := *
1065 }
1066 }
1067
1068 template PDU_BSSGP ts_BVC_RESET_ACK(BssgpBvci bvci, template BssgpCellId cell_id) := {
1069 pDU_BSSGP_BVC_RESET_ACK := {
1070 bssgpPduType := '23'O,
1071 bVCI := t_BSSGP_BVCI(bvci),
1072 cell_Identifier := t_BSSGP_IE_CellId(cell_id),
1073 feature_bitmap := omit,
1074 extended_Feature_Bitmap := omit
1075 }
1076 }
1077
1078 template PDU_BSSGP tr_BVC_RESET_ACK(template BssgpBvci bvci, template BssgpCellId cell_id) := {
1079 pDU_BSSGP_BVC_RESET_ACK := {
1080 bssgpPduType := '23'O,
1081 bVCI := t_BSSGP_BVCI(bvci),
1082 cell_Identifier := t_BSSGP_IE_CellId(cell_id),
1083 feature_bitmap := *,
1084 extended_Feature_Bitmap := *
1085 }
1086 }
1087
1088
1089 template PDU_BSSGP t_BVC_UNBLOCK(template BssgpBvci bvci) := {
1090 pDU_BSSGP_BVC_UNBLOCK := {
1091 bssgpPduType := '24'O,
1092 bVCI := t_BSSGP_BVCI(bvci)
1093 }
1094 }
1095
1096 template PDU_BSSGP t_BVC_UNBLOCK_ACK(template BssgpBvci bvci) := {
1097 pDU_BSSGP_BVC_UNBLOCK_ACK := {
1098 bssgpPduType := '25'O,
1099 bVCI := t_BSSGP_BVCI(bvci)
1100 }
1101 }
1102
1103 template PDU_BSSGP t_BVC_BLOCK(template BssgpBvci bvci, template BssgpCause cause) := {
1104 pDU_BSSGP_BVC_BLOCK := {
1105 bssgpPduType := '20'O,
1106 bVCI := t_BSSGP_BVCI(bvci),
1107 cause := t_BSSGP_CAUSE(cause)
1108 }
1109 }
1110
1111 template PDU_BSSGP t_BVC_BLOCK_ACK(template BssgpBvci bvci) := {
1112 pDU_BSSGP_BVC_BLOCK_ACK := {
1113 bssgpPduType := '21'O,
1114 bVCI := t_BSSGP_BVCI(bvci)
1115 }
1116 }
1117
1118 template PDU_BSSGP t_BVC_FC_BVC(uint16_t bmax, uint16_t bucket_leak_rate,
1119 uint16_t bmax_default_ms, uint16_t r_default_ms, OCT1 tag) := {
1120 pDU_BSSGP_FLOW_CONTROL_BVC := {
1121 bssgpPduType := '26'O,
1122 tag := {
1123 iEI := '1E'O,
1124 ext := '1'B,
1125 lengthIndicator := {
Harald Welteedcdd902018-03-02 22:04:54 +01001126 length1 := 1
Harald Weltee0abc472018-02-05 09:13:31 +01001127 },
1128 unstructured_Value := tag
1129 },
1130 bVC_Bucket_Size := {
1131 iEI := '05'O,
1132 ext := '1'B,
1133 lengthIndicator := {
1134 length1 := 2
1135 },
1136 bmax := f_oct_or_wc(bmax, 2)
1137 },
1138 bucket_Leak_Rate := {
1139 iEI := '03'O,
1140 ext := '1'B,
1141 lengthIndicator := {
Harald Welteedcdd902018-03-02 22:04:54 +01001142 length1 := 2
Harald Weltee0abc472018-02-05 09:13:31 +01001143 },
1144 r_Value := f_oct_or_wc(bucket_leak_rate, 2)
1145 },
1146 bmax_default_MS := {
1147 iEI := '01'O,
1148 ext := '1'B,
1149 lengthIndicator := {
1150 length1 := 2
1151 },
1152 bmax := f_oct_or_wc(bmax_default_ms, 2)
1153 },
1154 r_default_MS := {
1155 iEI := '1C'O,
1156 ext := '1'B,
1157 lengthIndicator := {
1158 length1 := 2
1159 },
1160 r_default_MS_value := f_oct_or_wc(r_default_ms, 2)
1161 },
1162 bucket_Full_Ratio := omit,
1163 bVC_Measurement := omit,
1164 flow_Control_Granularity := omit
1165 }
1166 }
Harald Welteedcdd902018-03-02 22:04:54 +01001167 template PDU_BSSGP tr_BVC_FC_BVC(template uint16_t bmax := ?,
1168 template uint16_t bucket_leak_rate := ?,
1169 template uint16_t bmax_default_ms := ?,
1170 template uint16_t r_default_ms := ?,
1171 template OCT1 tag := ?) := {
1172 pDU_BSSGP_FLOW_CONTROL_BVC := {
1173 bssgpPduType := '26'O,
1174 tag := {
1175 iEI := '1E'O,
1176 ext := '1'B,
1177 lengthIndicator := {
1178 length1 := 1
1179 },
1180 unstructured_Value := tag
1181 },
1182 bVC_Bucket_Size := {
1183 iEI := '05'O,
1184 ext := '1'B,
1185 lengthIndicator := {
1186 length1 := 2
1187 },
1188 bmax := f_oct_or_wc(bmax, 2)
1189 },
1190 bucket_Leak_Rate := {
1191 iEI := '03'O,
1192 ext := '1'B,
1193 lengthIndicator := {
1194 length1 := 2
1195 },
1196 r_Value := f_oct_or_wc(bucket_leak_rate, 2)
1197 },
1198 bmax_default_MS := {
1199 iEI := '01'O,
1200 ext := '1'B,
1201 lengthIndicator := {
1202 length1 := 2
1203 },
1204 bmax := f_oct_or_wc(bmax_default_ms, 2)
1205 },
1206 r_default_MS := {
1207 iEI := '1C'O,
1208 ext := '1'B,
1209 lengthIndicator := {
1210 length1 := 2
1211 },
1212 r_default_MS_value := f_oct_or_wc(r_default_ms, 2)
1213 },
1214 bucket_Full_Ratio := *,
1215 bVC_Measurement := *,
1216 flow_Control_Granularity := *
1217 }
1218 }
1219
Harald Weltee0abc472018-02-05 09:13:31 +01001220 template PDU_BSSGP t_BVC_FC_BVC_ACK(template OCT1 tag) := {
1221 pDU_BSSGP_FLOW_CONTROL_BVC_ACK := {
1222 bssgpPduType := '27'O,
1223 tag := {
1224 iEI := '1E'O,
1225 ext := '1'B,
1226 lengthIndicator := {
1227 length1 := 2
1228 },
1229 unstructured_Value := tag
1230 }
1231 }
1232 }
1233
1234 template PDU_BSSGP ts_BSSGP_STATUS(template BssgpBvci bvci, template BssgpCause cause,
1235 PDU_BSSGP pdu) := {
1236 pDU_BSSGP_STATUS := {
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02001237 bssgpPduType := '41'O,
Harald Weltee0abc472018-02-05 09:13:31 +01001238 cause := t_BSSGP_CAUSE(cause),
1239 bVCI := t_BSSGP_BVCI(bvci),
1240 pDU_in_Error := {
1241 iEI := '15'O,
1242 ext := '1'B,
1243 lengthIndicator := {
1244 length1 := 0 /* overwritten */
1245 },
1246 erroneous_BSSGP_PDU := enc_PDU_BSSGP(pdu)
1247 }
1248 }
1249 }
1250
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02001251 template PDU_BSSGP tr_BSSGP_STATUS(template BVCI bvci := ?, template BssgpCause cause := ?,
1252 template octetstring pdu := ?) := {
1253 pDU_BSSGP_STATUS := {
1254 bssgpPduType := '41'O,
1255 cause := t_BSSGP_CAUSE(cause),
1256 bVCI := bvci,
1257 pDU_in_Error := {
1258 iEI := '15'O,
1259 ext := '1'B,
1260 lengthIndicator := {
1261 length1 := ?
1262 },
1263 erroneous_BSSGP_PDU := pdu
1264 }
1265 }
1266 }
1267
Pau Espin Pedrol1860bf82020-04-25 16:23:35 +02001268 private function f_presence_bit_MultislotCap_GPRS_BSSGP(template (omit) MultislotCap_GPRS_BSSGP mscap_gprs) return BIT1 {
Pau Espin Pedrol2422d1f2020-01-23 17:51:04 +01001269 if (istemplatekind(mscap_gprs, "omit")) {
1270 return '0'B;
1271 }
1272 return '1'B;
1273 }
Pau Espin Pedrol1860bf82020-04-25 16:23:35 +02001274 private function f_presence_bit_MultislotCap_EGPRS_BSSGP(template (omit) MultislotCap_EGPRS_BSSGP mscap_egprs) return BIT1 {
Pau Espin Pedrol2422d1f2020-01-23 17:51:04 +01001275 if (istemplatekind(mscap_egprs, "omit")) {
1276 return '0'B;
1277 }
1278 return '1'B;
1279 }
1280 template (value) MSRACapabilityValuesRecord_BSSGP ts_RaCapRec_BSSGP(BIT4 att := '0001'B /* E-GSM */, template (omit) MultislotCap_GPRS_BSSGP mscap_gprs := omit, template (omit) MultislotCap_EGPRS_BSSGP mscap_egprs := omit) := {
1281 mSRACapabilityValues := {
1282 mSRACapabilityValuesExclude1111 := {
1283 accessTechnType := att, /* E-GSM */
1284 accessCapabilities := {
1285 lengthIndicator := 0, /* overwritten */
1286 accessCapabilities := {
1287 rfPowerCapability := '001'B, /* FIXME */
1288 presenceBitA5 := '0'B,
1289 a5bits := omit,
1290 esind := '1'B,
1291 psbit := '0'B,
1292 vgcs := '0'B,
1293 vbs := '0'B,
1294 presenceBitMultislot := '1'B,
1295 multislotcap := {
1296 presenceBitHscsd := '0'B,
1297 hscsdmultislotclass := omit,
Pau Espin Pedrol1860bf82020-04-25 16:23:35 +02001298 presenceBitGprs := f_presence_bit_MultislotCap_GPRS_BSSGP(mscap_gprs),
Pau Espin Pedrol2422d1f2020-01-23 17:51:04 +01001299 gprsmultislot := mscap_gprs,
1300 presenceBitSms := '0'B,
1301 multislotCap_SMS := omit,
1302 multislotCapAdditionsAfterRel97 := {
1303 presenceBitEcsdmulti := '0'B,
1304 ecsdmultislotclass := omit,
Pau Espin Pedrol1860bf82020-04-25 16:23:35 +02001305 presenceBitEgprsmulti := f_presence_bit_MultislotCap_EGPRS_BSSGP(mscap_egprs),
Pau Espin Pedrol2422d1f2020-01-23 17:51:04 +01001306 multislotCap_EGPRS := mscap_egprs,
1307 presenceBitDtmGprsmulti := '0'B,
1308 multislotCapdtmgprsmultislotsubclass := omit
1309 }
1310 },
1311 accessCapAdditionsAfterRel97 := omit
1312 },
1313 spare_bits := omit
1314 }
1315 }
1316 },
1317 presenceBitMSRACap := '0'B
1318 };
Harald Welte6dc2ac42020-11-16 09:16:17 +01001319 template (present) MSRACapabilityValuesRecord_BSSGP
1320 tr_RaCapRec_BSSGP(template (present) BIT4 att := '0001'B /* E-GSM */, template MultislotCap_GPRS_BSSGP mscap_gprs := *,
1321 template MultislotCap_EGPRS_BSSGP mscap_egprs := *) := {
1322 mSRACapabilityValues := {
1323 mSRACapabilityValuesExclude1111 := {
1324 accessTechnType := att, /* E-GSM */
1325 accessCapabilities := {
1326 lengthIndicator := ?, /* overwritten */
1327 accessCapabilities := {
1328 rfPowerCapability := '001'B, /* FIXME */
1329 presenceBitA5 := ?,
1330 a5bits := *,
1331 esind := '1'B,
1332 psbit := '0'B,
1333 vgcs := '0'B,
1334 vbs := '0'B,
1335 presenceBitMultislot := '1'B,
1336 multislotcap := {
1337 presenceBitHscsd := '0'B,
1338 hscsdmultislotclass := omit,
1339 presenceBitGprs := ?,
1340 gprsmultislot := mscap_gprs,
1341 presenceBitSms := '0'B,
1342 multislotCap_SMS := omit,
1343 multislotCapAdditionsAfterRel97 := {
1344 presenceBitEcsdmulti := '0'B,
1345 ecsdmultislotclass := *,
1346 presenceBitEgprsmulti := ?,
1347 multislotCap_EGPRS := mscap_egprs,
1348 presenceBitDtmGprsmulti := ?,
1349 multislotCapdtmgprsmultislotsubclass := *
1350 }
1351 },
1352 accessCapAdditionsAfterRel97 := *
1353 },
1354 spare_bits := *
1355 }
1356 }
1357 },
1358 presenceBitMSRACap := '0'B
1359 };
1360
Pau Espin Pedrol2422d1f2020-01-23 17:51:04 +01001361
Harald Weltee0abc472018-02-05 09:13:31 +01001362 template QoS_Profile_V t_defaultQos := {
1363 peak_Bit_Rate := int2oct(80, 2),
1364 precedence := '000'B,
1365 a_bit := '0'B,
1366 t_bit := '0'B,
1367 c_r_bit := '0'B,
1368 peakBitRateGranularity := '00'B
1369 }
1370
1371 template QoS_Profile ts_QoS_TLV(template QoS_Profile_V qos) := {
1372 iEI := '18'O,
1373 ext := '1'B,
1374 lengthIndicator := { length1 := 3 },
1375 peak_Bit_Rate := qos.peak_Bit_Rate,
1376 precedence := qos.precedence,
1377 a_bit := qos.a_bit,
1378 t_bit := qos.t_bit,
1379 c_r_bit := qos.c_r_bit,
1380 peakBitRateGranularity := qos.peakBitRateGranularity
1381 }
1382
1383 template PDU_Lifetime t_DefaultLifetime(uint16_t delay := 65535) := {
1384 iEI := '16'O,
1385 ext := '1'B,
1386 lengthIndicator := {
1387 length1 := 2
1388 },
1389 delay_Value := f_oct_or_wc(delay, 2)
1390 }
1391
Pau Espin Pedrol88bf5372019-12-09 21:12:28 +01001392 template DRX_Parameters t_defaultDRXparam := {
1393 iEI := '0A'O,
1394 ext := '1'B,
1395 lengthIndicator := {
1396 length1 := 2
1397 },
1398 splitPG_CycleCode := '00'O,
1399 nonDRXTimer := '000'B,
1400 splitOnCCCH := '0'B,
1401 cnSpecificDRXCycleLength := '0000'B
1402 }
1403
Pau Espin Pedrol2422d1f2020-01-23 17:51:04 +01001404 function ts_BSSGP_IE_MSRAcap_omit(template (omit) MSRadioAccessCapabilityV_BSSGP racap) return template (omit) MS_Radio_Access_Capability {
1405 var template (omit) MS_Radio_Access_Capability ret;
1406 if (istemplatekind(racap, "omit")) {
1407 return omit;
1408 } else {
1409 ret := {
Harald Welte6dc2ac42020-11-16 09:16:17 +01001410 iEI := '13'O,
Pau Espin Pedrol2422d1f2020-01-23 17:51:04 +01001411 ext := '1'B,
1412 lengthIndicator := {
1413 length1 := 1
1414 },
1415 mSRadioAccessCapabilityV_BSSGP := racap
1416 }
1417 return ret;
1418 }
1419 }
1420
Harald Welte6dc2ac42020-11-16 09:16:17 +01001421 function tr_BSSGP_IE_MSRAcap(template MSRadioAccessCapabilityV_BSSGP racap) return template MS_Radio_Access_Capability {
1422 var template MS_Radio_Access_Capability ret;
1423 if (istemplatekind(racap, "omit")) {
1424 return omit;
1425 } else {
1426 ret := {
1427 iEI := '13'O,
1428 ext := ?,
1429 lengthIndicator := ?,
1430 mSRadioAccessCapabilityV_BSSGP := racap
1431 }
1432 return ret;
1433 }
1434 }
1435
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02001436 template PDU_BSSGP ts_BSSGP_DL_UD(GprsTlli tlli, octetstring pdu,
1437 template (omit) MSRadioAccessCapabilityV_BSSGP racap := omit,
1438 template (omit) IMSI_BSSGP imsi := omit) := {
Harald Weltee0abc472018-02-05 09:13:31 +01001439 pDU_BSSGP_DL_UNITDATA := {
1440 bssgpPduType := '00'O,
Harald Welteacc93ab2018-03-02 21:39:09 +01001441 tLLI_current := tlli,
Harald Weltee0abc472018-02-05 09:13:31 +01001442 qoS_Profile := t_defaultQos,
1443 pDU_Lifetime := t_DefaultLifetime(65535),
Pau Espin Pedrol2422d1f2020-01-23 17:51:04 +01001444 mS_Radio_Access_Capability := ts_BSSGP_IE_MSRAcap_omit(racap),
Harald Weltee0abc472018-02-05 09:13:31 +01001445 priority := omit,
1446 dRX_Parameters := omit,
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02001447 iMSI := imsi,
Harald Weltee0abc472018-02-05 09:13:31 +01001448 tLLI_old := omit,
1449 pFI := omit,
1450 lSA_Information := omit,
1451 service_UTRAN_CCO := omit,
1452 service_Class_Indicator := omit,
1453 subscriber_Profile_ID_For_RAT_Priority := omit,
1454 redirection_Indication := omit,
1455 redirection_Completed := omit,
1456 unconfirmed_Send_State_Variable := omit,
1457 sCI := omit,
1458 gGSN_PGW_Location := omit,
1459 eDRX_Paremeters := omit,
1460 old_Routing_Area_Identification := omit,
1461 attach_Indicator := omit,
1462 alignment_octets := omit,
1463 lLC_PDU := ts_BSSGP_LLC_PDU(pdu),
1464 initialLLC_PDU := omit
1465 }
1466 }
1467
Harald Welte2436fb52020-11-15 22:38:47 +01001468 template PDU_BSSGP tr_BSSGP_DL_UD(template (present) GprsTlli tlli, template (present) octetstring pdu,
1469 template IMSI_BSSGP imsi := omit) := {
Harald Weltee0abc472018-02-05 09:13:31 +01001470 pDU_BSSGP_DL_UNITDATA := {
1471 bssgpPduType := '00'O,
Harald Welte2436fb52020-11-15 22:38:47 +01001472 tLLI_current := tlli,
Harald Weltee0abc472018-02-05 09:13:31 +01001473 qoS_Profile := ?,
1474 pDU_Lifetime := ?,
1475 mS_Radio_Access_Capability := *,
1476 priority := *,
1477 dRX_Parameters := *,
Harald Welte2436fb52020-11-15 22:38:47 +01001478 iMSI := imsi,
Harald Weltee0abc472018-02-05 09:13:31 +01001479 tLLI_old := *,
1480 pFI := *,
1481 lSA_Information := *,
1482 service_UTRAN_CCO := *,
1483 service_Class_Indicator := *,
1484 subscriber_Profile_ID_For_RAT_Priority := *,
1485 redirection_Indication := *,
1486 redirection_Completed := *,
1487 unconfirmed_Send_State_Variable := *,
1488 sCI := *,
1489 gGSN_PGW_Location := *,
1490 eDRX_Paremeters := *,
1491 old_Routing_Area_Identification := *,
1492 attach_Indicator := *,
1493 alignment_octets := *,
Harald Welte2436fb52020-11-15 22:38:47 +01001494 lLC_PDU := tr_BSSGP_LLC_PDU(pdu),
Harald Weltee0abc472018-02-05 09:13:31 +01001495 initialLLC_PDU := *
1496 }
1497 }
1498
Harald Welteacc93ab2018-03-02 21:39:09 +01001499 template PDU_BSSGP ts_BSSGP_UL_UD(GprsTlli tlli, BssgpCellId cell_id, octetstring payload) := {
Harald Welte78d9f272018-02-16 18:13:45 +01001500 pDU_BSSGP_UL_UNITDATA := {
1501 bssgpPduType := '01'O,
1502 tLLI := tlli,
1503 qoS_Profile := t_defaultQos,
1504 cell_Identifier := t_BSSGP_IE_CellId(cell_id),
1505 pFI := omit,
1506 lSA_Identifier_List := omit,
1507 redirect_Attempt_Flag := omit,
1508 iMSI_BSSGP := omit,
1509 unconfirmed_Send_State_Variable := omit,
1510 selected_PLMN_ID := omit,
1511 selected_Operator := omit,
1512 cS_Registered_Operator := omit,
1513 alignment_octets := omit,
1514 lLC_PDU := ts_BSSGP_LLC_PDU(payload)
1515 }
1516 }
1517
Harald Weltee0abc472018-02-05 09:13:31 +01001518 template PDU_BSSGP tr_BSSGP_UL_UD(template GprsTlli tlli := ?, template BssgpCellId cell_id := ?,
1519 template octetstring payload := ?) := {
1520 pDU_BSSGP_UL_UNITDATA := {
1521 bssgpPduType := '01'O,
Harald Welteacc93ab2018-03-02 21:39:09 +01001522 tLLI := tlli,
Harald Weltee0abc472018-02-05 09:13:31 +01001523 qoS_Profile := ?,
1524 cell_Identifier := t_BSSGP_IE_CellId(cell_id),
1525 pFI := *,
1526 lSA_Identifier_List := *,
1527 redirect_Attempt_Flag := *,
1528 iMSI_BSSGP := *,
1529 unconfirmed_Send_State_Variable := *,
1530 selected_PLMN_ID := *,
1531 selected_Operator := *,
1532 cS_Registered_Operator := *,
1533 alignment_octets := *,
1534 lLC_PDU := tr_BSSGP_LLC_PDU(payload)
1535 }
1536 }
1537
Pau Espin Pedrol88bf5372019-12-09 21:12:28 +01001538 template PDU_BSSGP tr_BSSGP_CS_PAGING(BssgpBvci bvci) := {
1539 pDU_BSSGP_PAGING_CS := {
1540 bssgpPduType := '07'O,
1541 iMSI := ?,
1542 dRX_Parameters := ?,
1543 paging_Field4 := {
1544 bVCI := t_BSSGP_BVCI(bvci)
1545 },
1546 tLLI := *,
1547 channel_needed := *,
1548 eMLPP_Priority := *,
1549 tMSI := *,
1550 global_CN_Id := *
1551 }
1552 }
1553
1554 template PDU_BSSGP ts_BSSGP_CS_PAGING_IMSI(BssgpBvci bvci, hexstring imsi) := {
1555 pDU_BSSGP_PAGING_CS := {
1556 bssgpPduType := '07'O,
1557 iMSI := ts_BSSGP_IMSI(imsi),
1558 dRX_Parameters := t_defaultDRXparam,
1559 paging_Field4 := {
1560 bVCI := t_BSSGP_BVCI(bvci)
1561 },
1562 tLLI := omit,
1563 channel_needed := omit,
1564 eMLPP_Priority := omit,
1565 tMSI := omit,
1566 global_CN_Id := omit
1567 }
1568 }
1569
Vadim Yanitskiy7b224212020-03-26 02:43:55 +07001570 template PDU_BSSGP ts_BSSGP_CS_PAGING_PTMSI(BssgpBvci bvci, hexstring imsi, GsmTmsi tmsi) := {
1571 pDU_BSSGP_PAGING_CS := {
1572 bssgpPduType := '07'O,
1573 iMSI := ts_BSSGP_IMSI(imsi),
1574 dRX_Parameters := t_defaultDRXparam,
1575 paging_Field4 := {
1576 bVCI := t_BSSGP_BVCI(bvci)
1577 },
1578 tLLI := omit,
1579 channel_needed := omit,
1580 eMLPP_Priority := omit,
1581 tMSI := ts_BSSGP_TMSI(tmsi),
1582 global_CN_Id := omit
1583 }
1584 }
1585
Harald Weltea36b2462020-06-17 22:11:08 +02001586 template PDU_BSSGP tr_BSSGP_PS_PAGING(template BssgpBvci bvci) := {
Harald Welte78d9f272018-02-16 18:13:45 +01001587 pDU_BSSGP_PAGING_PS := {
1588 bssgpPduType := '06'O,
1589 iMSI := ?,
1590 dRX_Parameters := *,
1591 paging_Field4 := {
1592 bVCI := t_BSSGP_BVCI(bvci)
1593 },
1594 pFI := *,
1595 aBQP := *,
1596 qoS_Profile := ?,
1597 pTMSI := *,
1598 eDRX_Paremeters := *
1599 }
1600 }
1601
Harald Weltee0abc472018-02-05 09:13:31 +01001602 template PDU_BSSGP ts_BSSGP_PS_PAGING_IMSI(BssgpBvci bvci, hexstring imsi) := {
1603 pDU_BSSGP_PAGING_PS := {
1604 bssgpPduType := '06'O,
1605 iMSI := ts_BSSGP_IMSI(imsi),
1606 dRX_Parameters := omit,
1607 paging_Field4 := {
1608 bVCI := t_BSSGP_BVCI(bvci)
1609 },
1610 pFI := omit,
1611 aBQP := omit,
1612 qoS_Profile := ts_QoS_TLV(t_defaultQos),
1613 pTMSI := omit,
1614 eDRX_Paremeters := omit
1615 }
1616 }
1617
1618 template PDU_BSSGP ts_BSSGP_PS_PAGING_PTMSI(BssgpBvci bvci, hexstring imsi, GsmTmsi tmsi) := {
1619 pDU_BSSGP_PAGING_PS := {
1620 bssgpPduType := '06'O,
1621 iMSI := ts_BSSGP_IMSI(imsi),
1622 dRX_Parameters := omit,
1623 paging_Field4 := {
1624 bVCI := t_BSSGP_BVCI(bvci)
1625 },
1626 pFI := omit,
1627 aBQP := omit,
1628 qoS_Profile := ts_QoS_TLV(t_defaultQos),
1629 pTMSI := ts_BSSGP_TMSI(tmsi),
1630 eDRX_Paremeters := omit
1631 }
1632 }
1633
Harald Welte0e188242020-11-22 21:46:48 +01001634 template (value) Paging_Field4 ts_BssgpP4BssArea := {
1635 bSS_Area_Indication := {
1636 iEI := '02'O,
1637 ext := '1'B,
1638 lengthIndicator := {
1639 length1 := 1
1640 },
1641 bSS_indicator := '00'O
1642 }
1643 }
1644
1645 template (value) Paging_Field4 ts_BssgpP4LAC(GSM_Types.LocationAreaIdentification lai) := {
1646 location_Area := ts_BSSGP_LA_ID(lai)
1647 }
1648
1649 template (value) Paging_Field4 ts_BssgpP4RAC(GSM_Types.RoutingAreaIdentification rai) := {
1650 routeing_Area := ts_BSSGP_RA_ID(rai)
1651 }
1652
1653 template (value) Paging_Field4 ts_BssgpP4Bvci(BssgpBvci bvci) := {
1654 bVCI := t_BSSGP_BVCI(bvci)
1655 }
1656
1657 template (value) Location_Area ts_BSSGP_LA_ID(GSM_Types.LocationAreaIdentification input) := {
1658 iEI := '10'O,
1659 ext := '1'B,
1660 lengthIndicator := {
1661 length1 := 5
1662 },
1663 mccDigit1 := input.mcc_mnc[0],
1664 mccDigit2 := input.mcc_mnc[1],
1665 mccDigit3 := input.mcc_mnc[2],
1666 mncDigit3 := input.mcc_mnc[3],
1667 mncDigit1 := input.mcc_mnc[4],
1668 mncDigit2 := input.mcc_mnc[5],
1669 lac := int2oct(input.lac, 2)
1670 }
1671
1672 template (value) Routeing_Area ts_BSSGP_RA_ID(GSM_Types.RoutingAreaIdentification input) := {
Harald Welte23989a62019-03-21 21:32:45 +01001673 iEI := '1B'O,
1674 ext := '1'B,
1675 lengthIndicator := {
1676 length1 := 6
1677 },
1678 mccDigit1 := input.lai.mcc_mnc[0],
1679 mccDigit2 := input.lai.mcc_mnc[1],
1680 mccDigit3 := input.lai.mcc_mnc[2],
1681 mncDigit3 := input.lai.mcc_mnc[3],
1682 mncDigit1 := input.lai.mcc_mnc[4],
1683 mncDigit2 := input.lai.mcc_mnc[5],
1684 lac := int2oct(input.lai.lac, 2),
1685 rac := int2oct(input.rac, 1)
1686 }
1687
1688 template (value) PDU_BSSGP ts_BSSGP_SUSPEND(GprsTlli tlli, RoutingAreaIdentification ra_id) := {
1689 pDU_BSSGP_SUSPEND := {
1690 bssgpPduType := '0B'O,
1691 tLLI := ts_BSSGP_TLLI(tlli),
1692 routeing_Area := ts_BSSGP_RA_ID(ra_id)
1693 }
1694 }
1695 template PDU_BSSGP tr_BSSGP_SUSPEND(template GprsTlli tlli, RoutingAreaIdentification ra_id) := {
1696 pDU_BSSGP_SUSPEND := {
1697 bssgpPduType := '0B'O,
1698 tLLI := tr_BSSGP_TLLI(tlli),
1699 routeing_Area := ts_BSSGP_RA_ID(ra_id)
1700 }
1701 }
1702
1703 template (value) PDU_BSSGP ts_BSSGP_SUSPEND_ACK(GprsTlli tlli, RoutingAreaIdentification ra_id,
1704 template (value) OCT1 susp_ref) := {
1705 pDU_BSSGP_SUSPEND_ACK := {
1706 bssgpPduType := '0C'O,
1707 tLLI := ts_BSSGP_TLLI(tlli),
1708 routeing_Area := ts_BSSGP_RA_ID(ra_id),
1709 suspend_Reference_Number := ts_BSSGP_SUSP_REF(susp_ref)
1710 }
1711 }
1712 template PDU_BSSGP tr_BSSGP_SUSPEND_ACK(GprsTlli tlli, RoutingAreaIdentification ra_id,
1713 template OCT1 susp_ref) := {
1714 pDU_BSSGP_SUSPEND_ACK := {
1715 bssgpPduType := '0C'O,
1716 tLLI := tr_BSSGP_TLLI(tlli),
1717 routeing_Area := ts_BSSGP_RA_ID(ra_id),
1718 suspend_Reference_Number := tr_BSSGP_SUSP_REF(susp_ref)
1719 }
1720 }
1721
1722 template (value) PDU_BSSGP ts_BSSGP_SUSPEND_NACK(GprsTlli tlli, RoutingAreaIdentification ra_id,
1723 template (omit) BssgpCause cause) := {
1724 pDU_BSSGP_SUSPEND_NACK := {
1725 bssgpPduType := '0D'O,
1726 tLLI := ts_BSSGP_TLLI(tlli),
1727 routeing_Area := ts_BSSGP_RA_ID(ra_id),
1728 cause := ts_BSSGP_CAUSE(cause)
1729 }
1730 }
1731 template PDU_BSSGP tr_BSSGP_SUSPEND_NACK(GprsTlli tlli, RoutingAreaIdentification ra_id,
1732 template BssgpCause cause) := {
1733 pDU_BSSGP_SUSPEND_NACK := {
1734 bssgpPduType := '0D'O,
1735 tLLI := tr_BSSGP_TLLI(tlli),
1736 routeing_Area := ts_BSSGP_RA_ID(ra_id),
1737 cause := t_BSSGP_CAUSE(cause)
1738 }
1739 }
1740
1741
1742
1743 template (value) PDU_BSSGP ts_BSSGP_RESUME(GprsTlli tlli, RoutingAreaIdentification ra_id,
1744 OCT1 susp_ref) := {
1745 pDU_BSSGP_RESUME := {
1746 bssgpPduType := '0E'O,
1747 tLLI := ts_BSSGP_TLLI(tlli),
1748 routeing_Area := ts_BSSGP_RA_ID(ra_id),
1749 suspend_Reference_Number := ts_BSSGP_SUSP_REF(susp_ref)
1750 }
1751 }
1752 template PDU_BSSGP tr_BSSGP_RESUME(template GprsTlli tlli, RoutingAreaIdentification ra_id,
1753 template OCT1 susp_ref) := {
1754 pDU_BSSGP_RESUME := {
1755 bssgpPduType := '0E'O,
1756 tLLI := tr_BSSGP_TLLI(tlli),
1757 routeing_Area := ts_BSSGP_RA_ID(ra_id),
1758 suspend_Reference_Number := tr_BSSGP_SUSP_REF(susp_ref)
1759 }
1760 }
1761
1762 template (value) PDU_BSSGP ts_BSSGP_RESUME_ACK(GprsTlli tlli, RoutingAreaIdentification ra_id)
1763 := {
1764 pDU_BSSGP_RESUME_ACK := {
1765 bssgpPduType := '0F'O,
1766 tLLI := ts_BSSGP_TLLI(tlli),
1767 routeing_Area := ts_BSSGP_RA_ID(ra_id)
1768 }
1769 }
1770 template PDU_BSSGP tr_BSSGP_RESUME_ACK(template GprsTlli tlli,
1771 RoutingAreaIdentification ra_id) := {
1772 pDU_BSSGP_RESUME_ACK := {
1773 bssgpPduType := '0F'O,
1774 tLLI := tr_BSSGP_TLLI(tlli),
1775 routeing_Area := ts_BSSGP_RA_ID(ra_id)
1776 }
1777 }
1778
1779 template (value) PDU_BSSGP ts_BSSGP_RESUME_NACK(GprsTlli tlli, RoutingAreaIdentification ra_id,
1780 template (omit) BssgpCause cause) := {
1781 pDU_BSSGP_RESUME_NACK := {
1782 bssgpPduType := '10'O,
1783 tLLI := ts_BSSGP_TLLI(tlli),
1784 routeing_Area := ts_BSSGP_RA_ID(ra_id),
1785 cause := ts_BSSGP_CAUSE(cause)
1786 }
1787 }
1788 template PDU_BSSGP tr_BSSGP_RESUME_NACK(template GprsTlli tlli,
1789 RoutingAreaIdentification ra_id,
1790 template BssgpCause cause) := {
1791 pDU_BSSGP_RESUME_NACK := {
1792 bssgpPduType := '10'O,
1793 tLLI := tr_BSSGP_TLLI(tlli),
1794 routeing_Area := ts_BSSGP_RA_ID(ra_id),
1795 cause := t_BSSGP_CAUSE(cause)
1796 }
1797 }
1798
Daniel Willmann379fc252020-11-20 18:34:22 +01001799 /* 10.4.1 */
1800 template (value) PDU_BSSGP ts_BSSGP_FLUSH_LL(GprsTlli tlli, template (value) BssgpBvci bvci_old,
1801 template (omit) BssgpBvci bvci_new := omit,
1802 template (omit) Nsei nsei := omit) := {
1803 pDU_BSSGP_FLUSH_LL := {
1804 bssgpPduType := '2A'O,
1805 tLLI := ts_BSSGP_TLLI(tlli),
1806 bVCI_old := t_BSSGP_BVCI(bvci_old),
1807 bVCI_new := t_BSSGP_BVCI(bvci_new),
1808 nSEI := t_BSSGP_NSEI(nsei)
1809 }
1810 }
1811 template PDU_BSSGP tr_BSSGP_FLUSH_LL(template GprsTlli tlli, template BssgpBvci bvci_old,
1812 template (omit) BssgpBvci bvci_new := omit,
1813 template (omit) Nsei nsei := omit) := {
1814 pDU_BSSGP_FLUSH_LL := {
1815 bssgpPduType := '2A'O,
1816 tLLI := tr_BSSGP_TLLI(tlli),
1817 bVCI_old := t_BSSGP_BVCI(bvci_old),
1818 bVCI_new := t_BSSGP_BVCI(bvci_new),
1819 nSEI := t_BSSGP_NSEI(nsei)
1820 }
1821 }
1822
Daniel Willmann7f1d78e2020-11-24 14:42:40 +01001823 /* 10.4.2 */
1824 template (value) PDU_BSSGP ts_BSSGP_FLUSH_LL_ACK(GprsTlli tlli, template (value) OCT1 act,
1825 template (value) integer oct_affected,
1826 template (omit) BssgpBvci bvci_new := omit,
1827 template (omit) Nsei nsei := omit) := {
1828 pDU_BSSGP_FLUSH_LL_ACK := {
1829 bssgpPduType := '2B'O,
1830 tLLI := ts_BSSGP_TLLI(tlli),
1831 flush_Action := t_FLUSH_ACTION(act),
1832 bVCI_new := t_BSSGP_BVCI(bvci_new),
1833 number_of_octets_affected := t_NO_OCT_AFF(oct_affected),
1834 nSEI := t_BSSGP_NSEI(nsei)
1835 }
1836 }
1837 template PDU_BSSGP tr_BSSGP_FLUSH_LL_ACK(template GprsTlli tlli, template OCT1 act,
1838 template integer oct_affected,
1839 template (omit) BssgpBvci bvci_new := omit,
1840 template (omit) Nsei nsei := omit) := {
1841 pDU_BSSGP_FLUSH_LL_ACK := {
1842 bssgpPduType := '2B'O,
1843 tLLI := ts_BSSGP_TLLI(tlli),
1844 flush_Action := t_FLUSH_ACTION(act),
1845 bVCI_new := t_BSSGP_BVCI(bvci_new),
1846 number_of_octets_affected := t_NO_OCT_AFF(oct_affected),
1847 nSEI := t_BSSGP_NSEI(nsei)
1848 }
1849 }
1850
Daniel Willmann670bbc02020-11-19 16:39:39 +01001851 /* 10.2.3 */
1852 template (value) PDU_BSSGP ts_BSSGP_RA_CAP(GprsTlli tlli,
1853 template (omit) MSRadioAccessCapabilityV_BSSGP racap := omit) := {
1854 pDU_BSSGP_RA_CAPABILITY := {
1855 bssgpPduType := '02'O,
1856 tLLI := ts_BSSGP_TLLI(tlli),
1857 mS_Radio_Access_Capability := ts_BSSGP_IE_MSRAcap_omit(racap)
1858 }
Harald Welte6dc2ac42020-11-16 09:16:17 +01001859 }
Daniel Willmann670bbc02020-11-19 16:39:39 +01001860 template (present) PDU_BSSGP tr_BSSGP_RA_CAP(template (present) GprsTlli tlli,
1861 template MSRadioAccessCapabilityV_BSSGP racap) := {
1862 pDU_BSSGP_RA_CAPABILITY := {
1863 bssgpPduType := '02'O,
1864 tLLI := ts_BSSGP_TLLI(tlli),
1865 mS_Radio_Access_Capability := tr_BSSGP_IE_MSRAcap(racap)
1866 }
Harald Welte6dc2ac42020-11-16 09:16:17 +01001867 }
Harald Welte6dc2ac42020-11-16 09:16:17 +01001868
1869
Daniel Willmann670bbc02020-11-19 16:39:39 +01001870 /* 10.3.3 */
1871 template (value) PDU_BSSGP ts_BSSGP_RA_CAP_UPD(GprsTlli tlli, OCT1 tag) := {
1872 pDU_BSSGP_RA_CAPABILITY_UPDATE := {
1873 bssgpPduType := '08'O,
1874 tLLI := ts_BSSGP_TLLI(tlli),
1875 tag := ts_BSSGP_IE_Tag(tag)
1876 }
Harald Welte6dc2ac42020-11-16 09:16:17 +01001877 }
Daniel Willmann670bbc02020-11-19 16:39:39 +01001878 template (present) PDU_BSSGP tr_BSSGP_RA_CAP_UPD(template (present) GprsTlli tlli,
1879 template OCT1 tag) := {
1880 pDU_BSSGP_RA_CAPABILITY_UPDATE := {
1881 bssgpPduType := '08'O,
1882 tLLI := ts_BSSGP_TLLI(tlli),
1883 tag := tr_BSSGP_IE_Tag(tag)
1884 }
Daniel Willmannace3ece2020-11-16 19:53:26 +01001885 }
Daniel Willmannace3ece2020-11-16 19:53:26 +01001886
Harald Welte6dc2ac42020-11-16 09:16:17 +01001887
Daniel Willmann670bbc02020-11-19 16:39:39 +01001888 /* 10.3.4 */
1889 template (value) PDU_BSSGP
1890 ts_BSSGP_RA_CAP_UPD_ACK(GprsTlli tlli, OCT1 tag, template (value) OCT1 cause,
1891 template (omit) MSRadioAccessCapabilityV_BSSGP racap := omit) := {
1892 pDU_BSSGP_RA_CAPABILITY_UPDATE_ACK := {
1893 bssgpPduType := '09'O,
1894 tLLI := ts_BSSGP_TLLI(tlli),
1895 tag := ts_BSSGP_IE_Tag(tag),
1896 iMSI := omit,
1897 rA_Cap_UPDATE_CAUSE := ts_BSSGP_IE_RACU_Cause(cause),
1898 mS_Radio_Access_Capability := ts_BSSGP_IE_MSRAcap_omit(racap)
1899 }
Harald Welte6dc2ac42020-11-16 09:16:17 +01001900 }
Daniel Willmann670bbc02020-11-19 16:39:39 +01001901 template (present) PDU_BSSGP
1902 tr_BSSGP_RA_CAP_UPD_ACK(template (present) GprsTlli tlli, template OCT1 tag, template (present) OCT1 cause,
1903 template MSRadioAccessCapabilityV_BSSGP racap := omit) := {
1904 pDU_BSSGP_RA_CAPABILITY_UPDATE_ACK := {
1905 bssgpPduType := '09'O,
1906 tLLI := ts_BSSGP_TLLI(tlli),
1907 tag := tr_BSSGP_IE_Tag(tag),
1908 iMSI := omit,
1909 rA_Cap_UPDATE_CAUSE := tr_BSSGP_IE_RACU_Cause(cause),
1910 mS_Radio_Access_Capability := tr_BSSGP_IE_MSRAcap(racap)
1911 }
Daniel Willmannace3ece2020-11-16 19:53:26 +01001912 }
Harald Welte6dc2ac42020-11-16 09:16:17 +01001913
Daniel Willmann670bbc02020-11-19 16:39:39 +01001914 type enumerated BssgpRadioCause {
1915 BSSGP_RADIO_CAUSE_CONTACT_LOST ('00'H),
1916 BSSGP_RADIO_CAUSE_LINK_QUAL_INSUFF ('01'H),
1917 BSSGP_RADIO_CAUSE_CELL_RESEL_ORDERED ('02'H),
1918 BSSGP_RADIO_CAUSE_CELL_RESEL_PREPARE ('03'H),
1919 BSSGP_RADIO_CAUSE_CELL_RESEL_FAILURE ('04'H)
1920 } with { variant "FIELDLENGTH(8)" };
Harald Welte6dc2ac42020-11-16 09:16:17 +01001921
Harald Welte0e188242020-11-22 21:46:48 +01001922 function ts_BSSGP_RADIO_CAUSE(template (omit) BssgpRadioCause cause) return template (omit) Radio_Cause {
Daniel Willmann670bbc02020-11-19 16:39:39 +01001923 var template (omit) Radio_Cause ret;
1924 if (istemplatekind(cause, "omit")) {
1925 ret := omit;
1926 } else {
1927 ret.iEI := '19'O;
1928 ret.ext := '1'B;
1929 ret.lengthIndicator := { length1 := 1 };
1930 ret.radio_Cause_Value := int2oct(enum2int(valueof(cause)), 1);
1931 }
1932 return ret;
1933 }
1934 function tr_BSSGP_RADIO_CAUSE(template BssgpRadioCause cause) return template (present) Radio_Cause {
1935 var template Radio_Cause ret;
Daniel Willmann05d46382020-11-19 14:20:33 +01001936 ret.iEI := '19'O;
1937 ret.ext := '1'B;
1938 ret.lengthIndicator := { length1 := 1 };
Daniel Willmann670bbc02020-11-19 16:39:39 +01001939 if (isvalue(cause)) {
1940 ret.radio_Cause_Value := int2oct(enum2int(valueof(cause)), 1);
1941 } else {
1942 ret.radio_Cause_Value := ?
1943 }
1944 return ret;
Daniel Willmann05d46382020-11-19 14:20:33 +01001945 }
Daniel Willmann05d46382020-11-19 14:20:33 +01001946
Daniel Willmann670bbc02020-11-19 16:39:39 +01001947 /* 10.3.5 */
1948 template (value) PDU_BSSGP
1949 ts_BSSGP_RADIO_STATUS(GprsTlli tlli, template (value) BssgpRadioCause cause) := {
1950 pDU_BSSGP_RADIO_STATUS := {
1951 bssgpPduType := '0a'O,
1952 tLLI := ts_BSSGP_TLLI(tlli),
1953 tMSI := omit,
1954 iMSI := omit,
1955 radio_Cause := ts_BSSGP_RADIO_CAUSE(cause)
Harald Welte5339b2e2020-10-04 22:52:56 +02001956 }
1957 }
Daniel Willmann670bbc02020-11-19 16:39:39 +01001958 template (present) PDU_BSSGP
1959 tr_BSSGP_RADIO_STATUS(template (present) GprsTlli tlli, template (present) BssgpRadioCause cause) := {
1960 pDU_BSSGP_RADIO_STATUS := {
1961 bssgpPduType := '0a'O,
1962 tLLI := ts_BSSGP_TLLI(tlli),
1963 tMSI := omit,
1964 iMSI := omit,
1965 radio_Cause := tr_BSSGP_RADIO_CAUSE(cause)
1966 }
Harald Welte5339b2e2020-10-04 22:52:56 +02001967 }
Harald Welte23989a62019-03-21 21:32:45 +01001968
Harald Welte8f66af12020-11-12 17:27:58 +01001969
Daniel Willmann670bbc02020-11-19 16:39:39 +01001970
1971 /* PDU permitted on PTP BVC only (TS 48.018 Section 5.4.1) */
1972 template (present) PDU_BSSGP tr_BSSGP_PERMITTED_PTP_ONLY := (
1973 {pDU_BSSGP_DL_UNITDATA := ?},
1974 {pDU_BSSGP_UL_UNITDATA := ?},
1975 {pDU_BSSGP_RA_CAPABILITY := ?},
1976 {pDU_BSSGP_RA_CAPABILITY_UPDATE := ?},
1977 {pDU_BSSGP_RA_CAPABILITY_UPDATE_ACK := ?},
1978 {pDU_BSSGP_RADIO_STATUS := ?},
1979 {pDU_BSSGP_FLOW_CONTROL_BVC := ?},
1980 {pDU_BSSGP_FLOW_CONTROL_BVC_ACK := ?},
1981 {pDU_BSSGP_FLOW_CONTROL_MS := ?},
1982 {pDU_BSSGP_FLOW_CONTROL_MS_ACK := ?},
1983 {pDU_BSSGP_FLOW_CONTROL_PFC := ?},
1984 {pDU_BSSGP_FLOW_CONTROL_PFC_ACK := ?},
1985 {pDU_BSSGP_DOWNLOAD_BSS_PFC := ?},
1986 {pDU_BSSGP_CREATE_BSS_PFC := ?},
1987 {pDU_BSSGP_CREATE_BSS_PFC_ACK := ?},
1988 {pDU_BSSGP_CREATE_BSS_PFC_NACK := ?},
1989 {pDU_BSSGP_MODIFY_BSS_PFC := ?},
1990 {pDU_BSSGP_MODIFY_BSS_PFC_ACK := ?},
1991 {pDU_BSSGP_DELETE_BSS_PFC := ?},
1992 {pDU_BSSGP_DELETE_BSS_PFC_ACK := ?},
1993 {pDU_BSSGP_DELETE_BSS_PFC_REQ := ?},
1994 {pDU_BSSGP_PS_HANDOVER_REQUIRED := ?},
1995 {pDU_BSSGP_PS_HANDOVER_REQUIRED_ACK := ?},
1996 {pDU_BSSGP_PS_HANDOVER_REQUIRED_NACK := ?},
1997 {pDU_BSSGP_PS_HANDOVER_REQUEST := ?},
1998 {pDU_BSSGP_PS_HANDOVER_REQUEST_ACK := ?},
1999 {pDU_BSSGP_PS_HANDOVER_REQUEST_NACK := ?},
2000 {pDU_BSSGP_PS_HANDOVER_COMPLETE := ?},
2001 {pDU_BSSGP_PS_HANDOVER_COMPLETE_ACK := ?},
2002 {pDU_BSSGP_PS_HANDOVER_CANCEL := ?}
2003 );
2004
2005 template (present) PDU_BSSGP tr_BSSGP_PERMITTED_PTP := (
2006 tr_BSSGP_PERMITTED_PTP_ONLY,
2007 {pDU_BSSGP_PAGING_PS := ?},
2008 {pDU_BSSGP_PAGING_CS := ?},
2009 {pDU_BSSGP_STATUS := ?}
2010 );
2011
2012 /* PDU permitted on Signaling BVC only (TS 48.018 Section 5.4.1) */
2013 template (present) PDU_BSSGP tr_BSSGP_PERMITTED_SIGN_ONLY := (
2014 {pDU_BSSGP_SUSPEND := ?},
2015 {pDU_BSSGP_SUSPEND_ACK := ?},
2016 {pDU_BSSGP_SUSPEND_NACK := ?},
2017 {pDU_BSSGP_RESUME := ?},
2018 {pDU_BSSGP_RESUME_ACK := ?},
2019 {pDU_BSSGP_RESUME_NACK := ?},
2020 {pDU_BSSGP_FLUSH_LL := ?},
2021 {pDU_BSSGP_FLUSH_LL_ACK := ?},
2022 {pDU_BSSGP_LLC_DISCARDED := ?},
2023 {pDU_BSSGP_BVC_BLOCK := ?},
2024 {pDU_BSSGP_BVC_BLOCK_ACK := ?},
2025 {pDU_BSSGP_BVC_UNBLOCK := ?},
2026 {pDU_BSSGP_BVC_UNBLOCK_ACK := ?},
2027 {pDU_BSSGP_BVC_RESET := ?},
2028 {pDU_BSSGP_BVC_RESET_ACK := ?},
2029 {pDU_BSSGP_SGSN_INVOKE_TRACE := ?},
2030 {pDU_BSSGP_PERFORM_LOCATION_REQUEST := ?},
2031 {pDU_BSSGP_PERFORM_LOCATION_RESPONSE := ?},
2032 {pDU_BSSGP_PERFORM_LOCATION_ABORT := ?},
2033 {pDU_BSSGP_POSITION_COMMAND := ?},
2034 {pDU_BSSGP_POSITION_RESPONSE := ?},
2035 {pDU_BSSGP_RAN_INFORMATION := ?},
2036 {pDU_BSSGP_RAN_INFORMATION_REQUEST := ?},
2037 {pDU_BSSGP_RAN_INFORMATION_ACK := ?},
2038 {pDU_BSSGP_RAN_INFORMATION_ERROR := ?},
2039 {pDU_BSSGP_RAN_INFORMATION_APPLICATION_ERROR := ?},
2040 {pDU_BSSGP_MBMS_SESSION_START_REQUEST := ?},
2041 {pDU_BSSGP_MBMS_SESSION_START_RESPONSE := ?},
2042 {pDU_BSSGP_MBMS_SESSION_STOP_REQUEST := ?},
2043 {pDU_BSSGP_MBMS_STOP_RESPONSE := ?},
2044 {pDU_BSSGP_SESSION_UPDATE_REQUEST := ?},
2045 {pDU_BSSGP_SESSION_UPDATE_RESPONSE := ?}
2046 );
2047
2048 template (present) PDU_BSSGP tr_BSSGP_PERMITTED_SIGN := (
2049 tr_BSSGP_PERMITTED_SIGN_ONLY,
2050 {pDU_BSSGP_PAGING_PS := ?},
2051 {pDU_BSSGP_PAGING_CS := ?},
2052 {pDU_BSSGP_SUSPEND := ?},
2053 {pDU_BSSGP_STATUS := ?}
2054 );
2055
2056 /* PDU permitted on PTM BVC only (TS 48.018 Section 5.4.1) */
2057 template (present) PDU_BSSGP tr_BSSGP_PERMITTED_PTM_ONLY := (
2058 {pDU_BSSGP_DL_MBMS_UNITDATA := ?},
2059 {pDU_BSSGP_UL_MBMS_UNITDATA := ?}
2060 );
2061
2062 template (present) PDU_BSSGP tr_BSSGP_PERMITTED_PTM := (
2063 tr_BSSGP_PERMITTED_PTM_ONLY,
2064 {pDU_BSSGP_STATUS := ?}
2065 );
2066
2067
2068 /* Template for any PTP BVCI IE */
2069 template (present) BVCI tr_BSSGP_IE_PtpBvci := {
2070 iEI := '04'O,
2071 ext := '1'B,
2072 lengthIndicator := {
2073 length1 := 2
2074 },
2075 unstructured_value := complement ('0000'O, '0001'O)
Harald Welte8f66af12020-11-12 17:27:58 +01002076 }
Harald Welte8f66af12020-11-12 17:27:58 +01002077
Daniel Willmann670bbc02020-11-19 16:39:39 +01002078 /* message on signaling PTP but containing a ptp BVC */
2079 /*
2080 template PDU_BSSGP tr_BSSGP_SIG_FOR_PTP(template Bvci bvci) := (
2081 {pDU_BSSGP_FLUSH_LL:{?,?,tr_BSSGP_IE_PtpBvci, *, *}},
2082 {pDU_BSSGP_FLUSH_LL_ACK:{?,?,?,tr_BSSGP_IE_PtpBvci, ?, *}},
2083 {pDU_BSSGP_LLC_DISCARDED:{?,?,?,tr_BSSGP_IE_PtpBvci, ?, *}},
2084 {pDU_BSSGP_BVC_BLOCK:{?,tr_BSSGP_IE_PtpBvci, ?}},
2085 {pDU_BSSGP_BVC_BLOCK_ACK:{?,tr_BSSGP_IE_PtpBvci}},
2086 {pDU_BSSGP_BVC_UNBLOCK:{?,tr_BSSGP_IE_PtpBvci}},
2087 {pDU_BSSGP_BVC_UNBLOCK_ACK:{?,tr_BSSGP_IE_PtpBvci}},
2088 {pDU_BSSGP_BVC_RESET:{?,tr_BSSGP_IE_PtpBvci,?,*,*,*}},
2089 {pDU_BSSGP_BVC_RESET_ACK:{?,tr_BSSGP_IE_PtpBvci,*,*,*}},
2090 {pDU_BSSGP_STATUS:{?,?,tr_BSSGP_IE_PtpBvci,*}},
2091 {pDU_BSSGP_PERFORM_LOCATION_REQUEST:{?,?,?,*,tr_BSSGP_IE_PtpBvci,?,?,?,*,*,*,*,*,*,*,*,*}},
2092 {pDU_BSSGP_PERFORM_LOCATION_RESPONSE:{?,?,tr_BSSGP_IE_PtpBvci,*,*,*,*,*,*}},
2093 {pDU_BSSGP_PERFORM_LOCATION_ABORT:{?,?,tr_BSSGP_IE_PtpBvci,?}},
2094 {pDU_BSSGP_POSITION_COMMAND:{
2095 );
2096 */
Harald Welte8f66af12020-11-12 17:27:58 +01002097
Daniel Willmann670bbc02020-11-19 16:39:39 +01002098 /* extract the BVCI IE of given PDU + return it */
2099 function f_BSSGP_BVCI_IE_get(PDU_BSSGP pdu) return template (omit) BVCI {
2100 select (pdu) {
2101 case (PDU_BSSGP:{pDU_BSSGP_FLUSH_LL:=?}) {
2102 return pdu.pDU_BSSGP_FLUSH_LL.bVCI_old;
2103 }
2104 case (PDU_BSSGP:{pDU_BSSGP_FLUSH_LL_ACK:=?}) {
2105 return pdu.pDU_BSSGP_FLUSH_LL_ACK.bVCI_new;
2106 }
2107 case (PDU_BSSGP:{pDU_BSSGP_LLC_DISCARDED:=?}) {
2108 return pdu.pDU_BSSGP_LLC_DISCARDED.bVCI;
2109 }
2110 case (PDU_BSSGP:{pDU_BSSGP_BVC_BLOCK:=?}) {
2111 return pdu.pDU_BSSGP_BVC_BLOCK.bVCI;
2112 }
2113 case (PDU_BSSGP:{pDU_BSSGP_BVC_BLOCK_ACK:=?}) {
2114 return pdu.pDU_BSSGP_BVC_BLOCK_ACK.bVCI;
2115 }
2116 case (PDU_BSSGP:{pDU_BSSGP_BVC_UNBLOCK:=?}) {
2117 return pdu.pDU_BSSGP_BVC_UNBLOCK.bVCI;
2118 }
2119 case (PDU_BSSGP:{pDU_BSSGP_BVC_UNBLOCK_ACK:=?}) {
2120 return pdu.pDU_BSSGP_BVC_UNBLOCK_ACK.bVCI;
2121 }
2122 case (PDU_BSSGP:{pDU_BSSGP_BVC_RESET:=?}) {
2123 return pdu.pDU_BSSGP_BVC_RESET.bVCI;
2124 }
2125 case (PDU_BSSGP:{pDU_BSSGP_BVC_RESET_ACK:=?}) {
2126 return pdu.pDU_BSSGP_BVC_RESET_ACK.bVCI;
2127 }
2128 case (PDU_BSSGP:{pDU_BSSGP_STATUS:=?}) {
2129 return pdu.pDU_BSSGP_STATUS.bVCI;
2130 }
2131 case (PDU_BSSGP:{pDU_BSSGP_PERFORM_LOCATION_REQUEST:=?}) {
2132 return pdu.pDU_BSSGP_PERFORM_LOCATION_REQUEST.bVCI;
2133 }
2134 case (PDU_BSSGP:{pDU_BSSGP_PERFORM_LOCATION_RESPONSE:=?}) {
2135 return pdu.pDU_BSSGP_PERFORM_LOCATION_RESPONSE.bVCI;
2136 }
2137 case (PDU_BSSGP:{pDU_BSSGP_PERFORM_LOCATION_ABORT:=?}) {
2138 return pdu.pDU_BSSGP_PERFORM_LOCATION_ABORT.bVCI;
2139 }
2140 case (PDU_BSSGP:{pDU_BSSGP_POSITION_COMMAND:=?}) {
2141 return pdu.pDU_BSSGP_POSITION_COMMAND.bVCI;
2142 }
2143 case (PDU_BSSGP:{pDU_BSSGP_POSITION_RESPONSE:=?}) {
2144 return pdu.pDU_BSSGP_POSITION_RESPONSE.bVCI;
2145 }
2146 case (PDU_BSSGP:{pDU_BSSGP_PAGING_PS:={?,?,*,{bVCI:=?},*,*,?,*,*}}) {
2147 return pdu.pDU_BSSGP_PAGING_PS.paging_Field4.bVCI;
2148 }
2149 case (PDU_BSSGP:{pDU_BSSGP_PAGING_CS:={?,?,?,{bVCI:=?},*,*,*,*,*}}) {
2150 return pdu.pDU_BSSGP_PAGING_CS.paging_Field4.bVCI;
2151 }
2152 case else {
2153 return omit;
2154 }
2155 }
2156 }
Harald Welte8f66af12020-11-12 17:27:58 +01002157
Daniel Willmann670bbc02020-11-19 16:39:39 +01002158 /* extract the BVCI IE of given PDU + convert it to integer value */
2159 function f_BSSGP_BVCI_get(PDU_BSSGP pdu) return template (omit) BssgpBvci {
2160 var template (omit) BVCI bvci_raw := f_BSSGP_BVCI_IE_get(pdu);
2161 if (istemplatekind(bvci_raw, "omit")) {
2162 return omit;
2163 }
2164 return oct2int(valueof(bvci_raw.unstructured_value));
2165 }
2166
2167 /* 3GPP TS 23.003 2.6 */
2168 type enumerated TlliType {
2169 TLLI_LOCAL,
2170 TLLI_FOREIGN,
2171 TLLI_RANDOM,
2172 TLLI_AUXILIARY,
2173 TLLI_RESERVED,
2174 TLLI_G_RNTI,
2175 TLLI_RAND_G_RNTI
2176 }
2177
2178 /* 3GPP TS 23.003 2.6 */
2179 function f_gprs_tlli_type(OCT4 tlli) return TlliType {
2180 var bitstring tllib := oct2bit(tlli);
2181 if (substr(tllib, 0, 2) == '11'B) {
2182 return TLLI_LOCAL;
2183 } else if (substr(tllib, 0, 2) == '10'B) {
2184 return TLLI_FOREIGN;
2185 } else if (substr(tllib, 0, 5) == '01111'B) {
2186 return TLLI_RANDOM;
2187 } else if (substr(tllib, 0, 4) == '0110'B) {
2188 return TLLI_RESERVED;
2189 } else if (substr(tllib, 0, 3) == '010'B) {
2190 return TLLI_RESERVED;
2191 } else if (substr(tllib, 0, 4) == '0000'B) {
2192 return TLLI_G_RNTI;
2193 } else if (substr(tllib, 0, 4) == '0001'B) {
2194 return TLLI_RAND_G_RNTI;
2195 } else {
2196 setverdict(fail, "Unknonw TLLI Type ", tllib);
2197 mtc.stop;
2198 }
2199 }
2200
2201 function f_gprs_tlli_random() return OCT4 {
2202 var OCT4 tlli := f_rnd_octstring(4);
2203 return tlli or4b 'c0000000'O;
2204 }
Harald Weltee0abc472018-02-05 09:13:31 +01002205
2206} with { encode "RAW" };