blob: ee1437ca7b22b1eaec4cc0b0a8801eee958113f1 [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
770
771 template BVCI t_BSSGP_BVCI(template BssgpBvci bvci) := {
772 iEI := '04'O,
773 ext := '1'B,
774 lengthIndicator := {
775 length1 := 2
776 },
777 unstructured_value := f_oct_or_wc(bvci, 2)
778 }
779
Harald Welte23989a62019-03-21 21:32:45 +0100780 template (value) TLLI_BSSGP ts_BSSGP_TLLI(template (value) GprsTlli tlli) := {
781 iEI := '1F'O,
782 ext := '1'B,
783 lengthIndicator := {
784 length1 := 4
785 },
786 tLLI_Value := tlli
787 }
788 template TLLI_BSSGP tr_BSSGP_TLLI(template GprsTlli tlli) := {
789 iEI := '1F'O,
790 ext := '1'B,
791 lengthIndicator := {
792 length1 := 4
793 },
794 tLLI_Value := tlli
795 }
796
797 template (value) Suspend_Reference_Number ts_BSSGP_SUSP_REF(template (value) OCT1 susp_ref) := {
798 iEI := '1D'O,
799 ext := '1'B,
800 lengthIndicator := {
801 length1 := 1
802 },
803 suspend_Reference_Number_value := susp_ref
804 }
805 template Suspend_Reference_Number tr_BSSGP_SUSP_REF(template OCT1 susp_ref) := {
806 iEI := '1D'O,
807 ext := '1'B,
808 lengthIndicator := {
809 length1 := 1
810 },
811 suspend_Reference_Number_value := susp_ref
812 }
813
Harald Weltee0abc472018-02-05 09:13:31 +0100814 template IMSI_BSSGP tr_BSSGP_IMSI(template hexstring imsi) := {
815 iEI := '0D'O,
816 ext := '1'B,
817 lengthIndicator := ?,
818 type_of_Identity := '001'B,
819 oddevenIndicator := ?,
820 digits := imsi
821 }
822
823 template IMSI_BSSGP ts_BSSGP_IMSI(hexstring imsi) := {
824 iEI := '0D'O,
825 ext := '1'B,
826 lengthIndicator := { length1 := 0 /* overwritten */ },
827 type_of_Identity := '001'B,
828 oddevenIndicator := f_hex_is_odd_length(imsi),
829 digits := imsi
830 }
831
832 template TMSI_BSSGP ts_BSSGP_TMSI(GsmTmsi tmsi) := {
833 iEI := '20'O,
834 ext := '1'B,
835 lengthIndicator := { length1 := 4 },
836 tMSI_Value := int2oct(tmsi, 4)
837 }
838
839 function f_bssgp_length_ind(integer len) return LIN2_2a {
840 var LIN2_2a ret;
841 if (len > 255) {
842 ret := { length2 := len };
843 } else {
844 ret := { length1 := len };
845 }
846 return ret;
847 }
848
849 template LLC_PDU ts_BSSGP_LLC_PDU(octetstring pdu) := {
850 iEI := '0D'O,
851 ext := '1'B,
852 lengthIndicator := f_bssgp_length_ind(lengthof(pdu)),
853 lLC_PDU := pdu
854 }
855
856 template LLC_PDU tr_BSSGP_LLC_PDU(template octetstring pdu := ?) := {
Harald Welte7024baa2018-03-02 23:37:51 +0100857 iEI := '0E'O,
858 ext := ?,
Harald Weltee0abc472018-02-05 09:13:31 +0100859 lengthIndicator := ?,
860 lLC_PDU := pdu
861 }
862
Harald Welte23989a62019-03-21 21:32:45 +0100863 function ts_BSSGP_CAUSE(template (omit) BssgpCause cause) return template (omit) Cause_BSSGP {
864 var template (omit) Cause_BSSGP ret;
865 if (istemplatekind(cause, "omit")) {
866 ret := omit;
867 } else {
868 ret.iEI := '07'O;
869 ret.ext := '1'B;
870 ret.lengthIndicator := { length1 := 1 };
871 ret.cause_Value := int2oct(enum2int(valueof(cause)), 1);
872 }
873 return ret;
874 }
Harald Weltee0abc472018-02-05 09:13:31 +0100875 function t_BSSGP_CAUSE(template BssgpCause cause) return template Cause_BSSGP {
876 var template Cause_BSSGP ret;
Harald Weltebacca282018-03-02 16:03:59 +0100877 ret.iEI := '07'O;
Harald Weltee0abc472018-02-05 09:13:31 +0100878 ret.ext := '1'B;
879 ret.lengthIndicator := { length1 := 1 };
880 if (isvalue(cause)) {
881 ret.cause_Value := int2oct(enum2int(valueof(cause)), 1);
882 } else {
883 ret.cause_Value := ?
884 }
885 return ret;
886 }
887
888 function t_BSSGP_IE_CellId(template BssgpCellId cid) return template Cell_Identifier {
889 var template Cell_Identifier ret := {
890 iEI := '08'O,
891 ext := '1'B,
892 lengthIndicator := { length1 := 8 },
893 mccDigit1 := ?,
894 mccDigit2 := ?,
895 mccDigit3 := ?,
896 mncDigit3 := ?,
897 mncDigit1 := ?,
898 mncDigit2 := ?,
899 lac := ?,
900 rac := ?,
901 cI_value := ?
902 }
903 if (istemplatekind(cid, "omit")) {
904 return omit;
905 } else if (istemplatekind(cid, "*")) {
906 return *;
907 } else if (istemplatekind(cid, "?")) {
908 return ?;
909 }
910 if (isvalue(cid) and isvalue(cid.ra_id) and isvalue(cid.ra_id.lai)) {
911 if (isvalue(cid.ra_id.lai.mcc_mnc)) {
912 ret.mccDigit1 := cid.ra_id.lai.mcc_mnc[0];
913 ret.mccDigit2 := cid.ra_id.lai.mcc_mnc[1];
914 ret.mccDigit3 := cid.ra_id.lai.mcc_mnc[2];
Harald Welte797ab3a2019-03-21 21:33:28 +0100915 ret.mncDigit3 := cid.ra_id.lai.mcc_mnc[3];
Harald Welte797ab3a2019-03-21 21:33:28 +0100916 ret.mncDigit1 := cid.ra_id.lai.mcc_mnc[4];
Alexander Couzensc7dddbd2019-04-11 19:18:35 +0200917 ret.mncDigit2 := cid.ra_id.lai.mcc_mnc[5];
Harald Weltee0abc472018-02-05 09:13:31 +0100918 }
919 if (isvalue(cid.ra_id.lai.lac)) {
920 ret.lac := f_oct_or_wc(cid.ra_id.lai.lac, 2);
921 }
922 }
923 if (isvalue(cid) and isvalue(cid.ra_id)) {
924 ret.rac := f_oct_or_wc(cid.ra_id.rac, 1);
925 }
926 if (isvalue(cid)) {
927 ret.cI_value := f_oct_or_wc(cid.cell_id, 2);
928 }
929 return ret;
930 }
931
932 template PDU_BSSGP ts_BVC_RESET(BssgpCause cause, BssgpBvci bvci,
933 template BssgpCellId cell_id) := {
934 pDU_BSSGP_BVC_RESET := {
935 bssgpPduType := '22'O,
936 bVCI := t_BSSGP_BVCI(bvci),
Harald Welte23989a62019-03-21 21:32:45 +0100937 cause := ts_BSSGP_CAUSE(cause),
Harald Weltee0abc472018-02-05 09:13:31 +0100938 cell_Identifier := t_BSSGP_IE_CellId(cell_id),
939 feature_bitmap := omit,
940 extended_Feature_Bitmap := omit
941 }
942 }
943
944 template PDU_BSSGP tr_BVC_RESET(template BssgpCause cause, template BssgpBvci bvci,
945 template BssgpCellId cell_id) := {
946 pDU_BSSGP_BVC_RESET := {
947 bssgpPduType := '22'O,
948 bVCI := t_BSSGP_BVCI(bvci),
949 cause := t_BSSGP_CAUSE(cause),
950 cell_Identifier := t_BSSGP_IE_CellId(cell_id),
951 feature_bitmap := *,
952 extended_Feature_Bitmap := *
953 }
954 }
955
956 template PDU_BSSGP ts_BVC_RESET_ACK(BssgpBvci bvci, template BssgpCellId cell_id) := {
957 pDU_BSSGP_BVC_RESET_ACK := {
958 bssgpPduType := '23'O,
959 bVCI := t_BSSGP_BVCI(bvci),
960 cell_Identifier := t_BSSGP_IE_CellId(cell_id),
961 feature_bitmap := omit,
962 extended_Feature_Bitmap := omit
963 }
964 }
965
966 template PDU_BSSGP tr_BVC_RESET_ACK(template BssgpBvci bvci, template BssgpCellId cell_id) := {
967 pDU_BSSGP_BVC_RESET_ACK := {
968 bssgpPduType := '23'O,
969 bVCI := t_BSSGP_BVCI(bvci),
970 cell_Identifier := t_BSSGP_IE_CellId(cell_id),
971 feature_bitmap := *,
972 extended_Feature_Bitmap := *
973 }
974 }
975
976
977 template PDU_BSSGP t_BVC_UNBLOCK(template BssgpBvci bvci) := {
978 pDU_BSSGP_BVC_UNBLOCK := {
979 bssgpPduType := '24'O,
980 bVCI := t_BSSGP_BVCI(bvci)
981 }
982 }
983
984 template PDU_BSSGP t_BVC_UNBLOCK_ACK(template BssgpBvci bvci) := {
985 pDU_BSSGP_BVC_UNBLOCK_ACK := {
986 bssgpPduType := '25'O,
987 bVCI := t_BSSGP_BVCI(bvci)
988 }
989 }
990
991 template PDU_BSSGP t_BVC_BLOCK(template BssgpBvci bvci, template BssgpCause cause) := {
992 pDU_BSSGP_BVC_BLOCK := {
993 bssgpPduType := '20'O,
994 bVCI := t_BSSGP_BVCI(bvci),
995 cause := t_BSSGP_CAUSE(cause)
996 }
997 }
998
999 template PDU_BSSGP t_BVC_BLOCK_ACK(template BssgpBvci bvci) := {
1000 pDU_BSSGP_BVC_BLOCK_ACK := {
1001 bssgpPduType := '21'O,
1002 bVCI := t_BSSGP_BVCI(bvci)
1003 }
1004 }
1005
1006 template PDU_BSSGP t_BVC_FC_BVC(uint16_t bmax, uint16_t bucket_leak_rate,
1007 uint16_t bmax_default_ms, uint16_t r_default_ms, OCT1 tag) := {
1008 pDU_BSSGP_FLOW_CONTROL_BVC := {
1009 bssgpPduType := '26'O,
1010 tag := {
1011 iEI := '1E'O,
1012 ext := '1'B,
1013 lengthIndicator := {
Harald Welteedcdd902018-03-02 22:04:54 +01001014 length1 := 1
Harald Weltee0abc472018-02-05 09:13:31 +01001015 },
1016 unstructured_Value := tag
1017 },
1018 bVC_Bucket_Size := {
1019 iEI := '05'O,
1020 ext := '1'B,
1021 lengthIndicator := {
1022 length1 := 2
1023 },
1024 bmax := f_oct_or_wc(bmax, 2)
1025 },
1026 bucket_Leak_Rate := {
1027 iEI := '03'O,
1028 ext := '1'B,
1029 lengthIndicator := {
Harald Welteedcdd902018-03-02 22:04:54 +01001030 length1 := 2
Harald Weltee0abc472018-02-05 09:13:31 +01001031 },
1032 r_Value := f_oct_or_wc(bucket_leak_rate, 2)
1033 },
1034 bmax_default_MS := {
1035 iEI := '01'O,
1036 ext := '1'B,
1037 lengthIndicator := {
1038 length1 := 2
1039 },
1040 bmax := f_oct_or_wc(bmax_default_ms, 2)
1041 },
1042 r_default_MS := {
1043 iEI := '1C'O,
1044 ext := '1'B,
1045 lengthIndicator := {
1046 length1 := 2
1047 },
1048 r_default_MS_value := f_oct_or_wc(r_default_ms, 2)
1049 },
1050 bucket_Full_Ratio := omit,
1051 bVC_Measurement := omit,
1052 flow_Control_Granularity := omit
1053 }
1054 }
Harald Welteedcdd902018-03-02 22:04:54 +01001055 template PDU_BSSGP tr_BVC_FC_BVC(template uint16_t bmax := ?,
1056 template uint16_t bucket_leak_rate := ?,
1057 template uint16_t bmax_default_ms := ?,
1058 template uint16_t r_default_ms := ?,
1059 template OCT1 tag := ?) := {
1060 pDU_BSSGP_FLOW_CONTROL_BVC := {
1061 bssgpPduType := '26'O,
1062 tag := {
1063 iEI := '1E'O,
1064 ext := '1'B,
1065 lengthIndicator := {
1066 length1 := 1
1067 },
1068 unstructured_Value := tag
1069 },
1070 bVC_Bucket_Size := {
1071 iEI := '05'O,
1072 ext := '1'B,
1073 lengthIndicator := {
1074 length1 := 2
1075 },
1076 bmax := f_oct_or_wc(bmax, 2)
1077 },
1078 bucket_Leak_Rate := {
1079 iEI := '03'O,
1080 ext := '1'B,
1081 lengthIndicator := {
1082 length1 := 2
1083 },
1084 r_Value := f_oct_or_wc(bucket_leak_rate, 2)
1085 },
1086 bmax_default_MS := {
1087 iEI := '01'O,
1088 ext := '1'B,
1089 lengthIndicator := {
1090 length1 := 2
1091 },
1092 bmax := f_oct_or_wc(bmax_default_ms, 2)
1093 },
1094 r_default_MS := {
1095 iEI := '1C'O,
1096 ext := '1'B,
1097 lengthIndicator := {
1098 length1 := 2
1099 },
1100 r_default_MS_value := f_oct_or_wc(r_default_ms, 2)
1101 },
1102 bucket_Full_Ratio := *,
1103 bVC_Measurement := *,
1104 flow_Control_Granularity := *
1105 }
1106 }
1107
Harald Weltee0abc472018-02-05 09:13:31 +01001108 template PDU_BSSGP t_BVC_FC_BVC_ACK(template OCT1 tag) := {
1109 pDU_BSSGP_FLOW_CONTROL_BVC_ACK := {
1110 bssgpPduType := '27'O,
1111 tag := {
1112 iEI := '1E'O,
1113 ext := '1'B,
1114 lengthIndicator := {
1115 length1 := 2
1116 },
1117 unstructured_Value := tag
1118 }
1119 }
1120 }
1121
1122 template PDU_BSSGP ts_BSSGP_STATUS(template BssgpBvci bvci, template BssgpCause cause,
1123 PDU_BSSGP pdu) := {
1124 pDU_BSSGP_STATUS := {
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02001125 bssgpPduType := '41'O,
Harald Weltee0abc472018-02-05 09:13:31 +01001126 cause := t_BSSGP_CAUSE(cause),
1127 bVCI := t_BSSGP_BVCI(bvci),
1128 pDU_in_Error := {
1129 iEI := '15'O,
1130 ext := '1'B,
1131 lengthIndicator := {
1132 length1 := 0 /* overwritten */
1133 },
1134 erroneous_BSSGP_PDU := enc_PDU_BSSGP(pdu)
1135 }
1136 }
1137 }
1138
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02001139 template PDU_BSSGP tr_BSSGP_STATUS(template BVCI bvci := ?, template BssgpCause cause := ?,
1140 template octetstring pdu := ?) := {
1141 pDU_BSSGP_STATUS := {
1142 bssgpPduType := '41'O,
1143 cause := t_BSSGP_CAUSE(cause),
1144 bVCI := bvci,
1145 pDU_in_Error := {
1146 iEI := '15'O,
1147 ext := '1'B,
1148 lengthIndicator := {
1149 length1 := ?
1150 },
1151 erroneous_BSSGP_PDU := pdu
1152 }
1153 }
1154 }
1155
Pau Espin Pedrol1860bf82020-04-25 16:23:35 +02001156 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 +01001157 if (istemplatekind(mscap_gprs, "omit")) {
1158 return '0'B;
1159 }
1160 return '1'B;
1161 }
Pau Espin Pedrol1860bf82020-04-25 16:23:35 +02001162 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 +01001163 if (istemplatekind(mscap_egprs, "omit")) {
1164 return '0'B;
1165 }
1166 return '1'B;
1167 }
1168 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) := {
1169 mSRACapabilityValues := {
1170 mSRACapabilityValuesExclude1111 := {
1171 accessTechnType := att, /* E-GSM */
1172 accessCapabilities := {
1173 lengthIndicator := 0, /* overwritten */
1174 accessCapabilities := {
1175 rfPowerCapability := '001'B, /* FIXME */
1176 presenceBitA5 := '0'B,
1177 a5bits := omit,
1178 esind := '1'B,
1179 psbit := '0'B,
1180 vgcs := '0'B,
1181 vbs := '0'B,
1182 presenceBitMultislot := '1'B,
1183 multislotcap := {
1184 presenceBitHscsd := '0'B,
1185 hscsdmultislotclass := omit,
Pau Espin Pedrol1860bf82020-04-25 16:23:35 +02001186 presenceBitGprs := f_presence_bit_MultislotCap_GPRS_BSSGP(mscap_gprs),
Pau Espin Pedrol2422d1f2020-01-23 17:51:04 +01001187 gprsmultislot := mscap_gprs,
1188 presenceBitSms := '0'B,
1189 multislotCap_SMS := omit,
1190 multislotCapAdditionsAfterRel97 := {
1191 presenceBitEcsdmulti := '0'B,
1192 ecsdmultislotclass := omit,
Pau Espin Pedrol1860bf82020-04-25 16:23:35 +02001193 presenceBitEgprsmulti := f_presence_bit_MultislotCap_EGPRS_BSSGP(mscap_egprs),
Pau Espin Pedrol2422d1f2020-01-23 17:51:04 +01001194 multislotCap_EGPRS := mscap_egprs,
1195 presenceBitDtmGprsmulti := '0'B,
1196 multislotCapdtmgprsmultislotsubclass := omit
1197 }
1198 },
1199 accessCapAdditionsAfterRel97 := omit
1200 },
1201 spare_bits := omit
1202 }
1203 }
1204 },
1205 presenceBitMSRACap := '0'B
1206 };
1207
Harald Weltee0abc472018-02-05 09:13:31 +01001208 template QoS_Profile_V t_defaultQos := {
1209 peak_Bit_Rate := int2oct(80, 2),
1210 precedence := '000'B,
1211 a_bit := '0'B,
1212 t_bit := '0'B,
1213 c_r_bit := '0'B,
1214 peakBitRateGranularity := '00'B
1215 }
1216
1217 template QoS_Profile ts_QoS_TLV(template QoS_Profile_V qos) := {
1218 iEI := '18'O,
1219 ext := '1'B,
1220 lengthIndicator := { length1 := 3 },
1221 peak_Bit_Rate := qos.peak_Bit_Rate,
1222 precedence := qos.precedence,
1223 a_bit := qos.a_bit,
1224 t_bit := qos.t_bit,
1225 c_r_bit := qos.c_r_bit,
1226 peakBitRateGranularity := qos.peakBitRateGranularity
1227 }
1228
1229 template PDU_Lifetime t_DefaultLifetime(uint16_t delay := 65535) := {
1230 iEI := '16'O,
1231 ext := '1'B,
1232 lengthIndicator := {
1233 length1 := 2
1234 },
1235 delay_Value := f_oct_or_wc(delay, 2)
1236 }
1237
Pau Espin Pedrol88bf5372019-12-09 21:12:28 +01001238 template DRX_Parameters t_defaultDRXparam := {
1239 iEI := '0A'O,
1240 ext := '1'B,
1241 lengthIndicator := {
1242 length1 := 2
1243 },
1244 splitPG_CycleCode := '00'O,
1245 nonDRXTimer := '000'B,
1246 splitOnCCCH := '0'B,
1247 cnSpecificDRXCycleLength := '0000'B
1248 }
1249
Pau Espin Pedrol2422d1f2020-01-23 17:51:04 +01001250 function ts_BSSGP_IE_MSRAcap_omit(template (omit) MSRadioAccessCapabilityV_BSSGP racap) return template (omit) MS_Radio_Access_Capability {
1251 var template (omit) MS_Radio_Access_Capability ret;
1252 if (istemplatekind(racap, "omit")) {
1253 return omit;
1254 } else {
1255 ret := {
1256 iEI := '00'O,
1257 ext := '1'B,
1258 lengthIndicator := {
1259 length1 := 1
1260 },
1261 mSRadioAccessCapabilityV_BSSGP := racap
1262 }
1263 return ret;
1264 }
1265 }
1266
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02001267 template PDU_BSSGP ts_BSSGP_DL_UD(GprsTlli tlli, octetstring pdu,
1268 template (omit) MSRadioAccessCapabilityV_BSSGP racap := omit,
1269 template (omit) IMSI_BSSGP imsi := omit) := {
Harald Weltee0abc472018-02-05 09:13:31 +01001270 pDU_BSSGP_DL_UNITDATA := {
1271 bssgpPduType := '00'O,
Harald Welteacc93ab2018-03-02 21:39:09 +01001272 tLLI_current := tlli,
Harald Weltee0abc472018-02-05 09:13:31 +01001273 qoS_Profile := t_defaultQos,
1274 pDU_Lifetime := t_DefaultLifetime(65535),
Pau Espin Pedrol2422d1f2020-01-23 17:51:04 +01001275 mS_Radio_Access_Capability := ts_BSSGP_IE_MSRAcap_omit(racap),
Harald Weltee0abc472018-02-05 09:13:31 +01001276 priority := omit,
1277 dRX_Parameters := omit,
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02001278 iMSI := imsi,
Harald Weltee0abc472018-02-05 09:13:31 +01001279 tLLI_old := omit,
1280 pFI := omit,
1281 lSA_Information := omit,
1282 service_UTRAN_CCO := omit,
1283 service_Class_Indicator := omit,
1284 subscriber_Profile_ID_For_RAT_Priority := omit,
1285 redirection_Indication := omit,
1286 redirection_Completed := omit,
1287 unconfirmed_Send_State_Variable := omit,
1288 sCI := omit,
1289 gGSN_PGW_Location := omit,
1290 eDRX_Paremeters := omit,
1291 old_Routing_Area_Identification := omit,
1292 attach_Indicator := omit,
1293 alignment_octets := omit,
1294 lLC_PDU := ts_BSSGP_LLC_PDU(pdu),
1295 initialLLC_PDU := omit
1296 }
1297 }
1298
1299 template PDU_BSSGP tr_BSSGP_DL_UD := {
1300 pDU_BSSGP_DL_UNITDATA := {
1301 bssgpPduType := '00'O,
1302 tLLI_current := ?,
1303 qoS_Profile := ?,
1304 pDU_Lifetime := ?,
1305 mS_Radio_Access_Capability := *,
1306 priority := *,
1307 dRX_Parameters := *,
1308 iMSI := *,
1309 tLLI_old := *,
1310 pFI := *,
1311 lSA_Information := *,
1312 service_UTRAN_CCO := *,
1313 service_Class_Indicator := *,
1314 subscriber_Profile_ID_For_RAT_Priority := *,
1315 redirection_Indication := *,
1316 redirection_Completed := *,
1317 unconfirmed_Send_State_Variable := *,
1318 sCI := *,
1319 gGSN_PGW_Location := *,
1320 eDRX_Paremeters := *,
1321 old_Routing_Area_Identification := *,
1322 attach_Indicator := *,
1323 alignment_octets := *,
1324 lLC_PDU := tr_BSSGP_LLC_PDU,
1325 initialLLC_PDU := *
1326 }
1327 }
1328
Harald Welteacc93ab2018-03-02 21:39:09 +01001329 template PDU_BSSGP ts_BSSGP_UL_UD(GprsTlli tlli, BssgpCellId cell_id, octetstring payload) := {
Harald Welte78d9f272018-02-16 18:13:45 +01001330 pDU_BSSGP_UL_UNITDATA := {
1331 bssgpPduType := '01'O,
1332 tLLI := tlli,
1333 qoS_Profile := t_defaultQos,
1334 cell_Identifier := t_BSSGP_IE_CellId(cell_id),
1335 pFI := omit,
1336 lSA_Identifier_List := omit,
1337 redirect_Attempt_Flag := omit,
1338 iMSI_BSSGP := omit,
1339 unconfirmed_Send_State_Variable := omit,
1340 selected_PLMN_ID := omit,
1341 selected_Operator := omit,
1342 cS_Registered_Operator := omit,
1343 alignment_octets := omit,
1344 lLC_PDU := ts_BSSGP_LLC_PDU(payload)
1345 }
1346 }
1347
Harald Weltee0abc472018-02-05 09:13:31 +01001348 template PDU_BSSGP tr_BSSGP_UL_UD(template GprsTlli tlli := ?, template BssgpCellId cell_id := ?,
1349 template octetstring payload := ?) := {
1350 pDU_BSSGP_UL_UNITDATA := {
1351 bssgpPduType := '01'O,
Harald Welteacc93ab2018-03-02 21:39:09 +01001352 tLLI := tlli,
Harald Weltee0abc472018-02-05 09:13:31 +01001353 qoS_Profile := ?,
1354 cell_Identifier := t_BSSGP_IE_CellId(cell_id),
1355 pFI := *,
1356 lSA_Identifier_List := *,
1357 redirect_Attempt_Flag := *,
1358 iMSI_BSSGP := *,
1359 unconfirmed_Send_State_Variable := *,
1360 selected_PLMN_ID := *,
1361 selected_Operator := *,
1362 cS_Registered_Operator := *,
1363 alignment_octets := *,
1364 lLC_PDU := tr_BSSGP_LLC_PDU(payload)
1365 }
1366 }
1367
Pau Espin Pedrol88bf5372019-12-09 21:12:28 +01001368 template PDU_BSSGP tr_BSSGP_CS_PAGING(BssgpBvci bvci) := {
1369 pDU_BSSGP_PAGING_CS := {
1370 bssgpPduType := '07'O,
1371 iMSI := ?,
1372 dRX_Parameters := ?,
1373 paging_Field4 := {
1374 bVCI := t_BSSGP_BVCI(bvci)
1375 },
1376 tLLI := *,
1377 channel_needed := *,
1378 eMLPP_Priority := *,
1379 tMSI := *,
1380 global_CN_Id := *
1381 }
1382 }
1383
1384 template PDU_BSSGP ts_BSSGP_CS_PAGING_IMSI(BssgpBvci bvci, hexstring imsi) := {
1385 pDU_BSSGP_PAGING_CS := {
1386 bssgpPduType := '07'O,
1387 iMSI := ts_BSSGP_IMSI(imsi),
1388 dRX_Parameters := t_defaultDRXparam,
1389 paging_Field4 := {
1390 bVCI := t_BSSGP_BVCI(bvci)
1391 },
1392 tLLI := omit,
1393 channel_needed := omit,
1394 eMLPP_Priority := omit,
1395 tMSI := omit,
1396 global_CN_Id := omit
1397 }
1398 }
1399
Vadim Yanitskiy7b224212020-03-26 02:43:55 +07001400 template PDU_BSSGP ts_BSSGP_CS_PAGING_PTMSI(BssgpBvci bvci, hexstring imsi, GsmTmsi tmsi) := {
1401 pDU_BSSGP_PAGING_CS := {
1402 bssgpPduType := '07'O,
1403 iMSI := ts_BSSGP_IMSI(imsi),
1404 dRX_Parameters := t_defaultDRXparam,
1405 paging_Field4 := {
1406 bVCI := t_BSSGP_BVCI(bvci)
1407 },
1408 tLLI := omit,
1409 channel_needed := omit,
1410 eMLPP_Priority := omit,
1411 tMSI := ts_BSSGP_TMSI(tmsi),
1412 global_CN_Id := omit
1413 }
1414 }
1415
Harald Weltea36b2462020-06-17 22:11:08 +02001416 template PDU_BSSGP tr_BSSGP_PS_PAGING(template BssgpBvci bvci) := {
Harald Welte78d9f272018-02-16 18:13:45 +01001417 pDU_BSSGP_PAGING_PS := {
1418 bssgpPduType := '06'O,
1419 iMSI := ?,
1420 dRX_Parameters := *,
1421 paging_Field4 := {
1422 bVCI := t_BSSGP_BVCI(bvci)
1423 },
1424 pFI := *,
1425 aBQP := *,
1426 qoS_Profile := ?,
1427 pTMSI := *,
1428 eDRX_Paremeters := *
1429 }
1430 }
1431
Harald Weltee0abc472018-02-05 09:13:31 +01001432 template PDU_BSSGP ts_BSSGP_PS_PAGING_IMSI(BssgpBvci bvci, hexstring imsi) := {
1433 pDU_BSSGP_PAGING_PS := {
1434 bssgpPduType := '06'O,
1435 iMSI := ts_BSSGP_IMSI(imsi),
1436 dRX_Parameters := omit,
1437 paging_Field4 := {
1438 bVCI := t_BSSGP_BVCI(bvci)
1439 },
1440 pFI := omit,
1441 aBQP := omit,
1442 qoS_Profile := ts_QoS_TLV(t_defaultQos),
1443 pTMSI := omit,
1444 eDRX_Paremeters := omit
1445 }
1446 }
1447
1448 template PDU_BSSGP ts_BSSGP_PS_PAGING_PTMSI(BssgpBvci bvci, hexstring imsi, GsmTmsi tmsi) := {
1449 pDU_BSSGP_PAGING_PS := {
1450 bssgpPduType := '06'O,
1451 iMSI := ts_BSSGP_IMSI(imsi),
1452 dRX_Parameters := omit,
1453 paging_Field4 := {
1454 bVCI := t_BSSGP_BVCI(bvci)
1455 },
1456 pFI := omit,
1457 aBQP := omit,
1458 qoS_Profile := ts_QoS_TLV(t_defaultQos),
1459 pTMSI := ts_BSSGP_TMSI(tmsi),
1460 eDRX_Paremeters := omit
1461 }
1462 }
1463
Harald Welte23989a62019-03-21 21:32:45 +01001464 template (value) Routeing_Area ts_BSSGP_RA_ID(RoutingAreaIdentification input) := {
1465 iEI := '1B'O,
1466 ext := '1'B,
1467 lengthIndicator := {
1468 length1 := 6
1469 },
1470 mccDigit1 := input.lai.mcc_mnc[0],
1471 mccDigit2 := input.lai.mcc_mnc[1],
1472 mccDigit3 := input.lai.mcc_mnc[2],
1473 mncDigit3 := input.lai.mcc_mnc[3],
1474 mncDigit1 := input.lai.mcc_mnc[4],
1475 mncDigit2 := input.lai.mcc_mnc[5],
1476 lac := int2oct(input.lai.lac, 2),
1477 rac := int2oct(input.rac, 1)
1478 }
1479
1480 template (value) PDU_BSSGP ts_BSSGP_SUSPEND(GprsTlli tlli, RoutingAreaIdentification ra_id) := {
1481 pDU_BSSGP_SUSPEND := {
1482 bssgpPduType := '0B'O,
1483 tLLI := ts_BSSGP_TLLI(tlli),
1484 routeing_Area := ts_BSSGP_RA_ID(ra_id)
1485 }
1486 }
1487 template PDU_BSSGP tr_BSSGP_SUSPEND(template GprsTlli tlli, RoutingAreaIdentification ra_id) := {
1488 pDU_BSSGP_SUSPEND := {
1489 bssgpPduType := '0B'O,
1490 tLLI := tr_BSSGP_TLLI(tlli),
1491 routeing_Area := ts_BSSGP_RA_ID(ra_id)
1492 }
1493 }
1494
1495 template (value) PDU_BSSGP ts_BSSGP_SUSPEND_ACK(GprsTlli tlli, RoutingAreaIdentification ra_id,
1496 template (value) OCT1 susp_ref) := {
1497 pDU_BSSGP_SUSPEND_ACK := {
1498 bssgpPduType := '0C'O,
1499 tLLI := ts_BSSGP_TLLI(tlli),
1500 routeing_Area := ts_BSSGP_RA_ID(ra_id),
1501 suspend_Reference_Number := ts_BSSGP_SUSP_REF(susp_ref)
1502 }
1503 }
1504 template PDU_BSSGP tr_BSSGP_SUSPEND_ACK(GprsTlli tlli, RoutingAreaIdentification ra_id,
1505 template OCT1 susp_ref) := {
1506 pDU_BSSGP_SUSPEND_ACK := {
1507 bssgpPduType := '0C'O,
1508 tLLI := tr_BSSGP_TLLI(tlli),
1509 routeing_Area := ts_BSSGP_RA_ID(ra_id),
1510 suspend_Reference_Number := tr_BSSGP_SUSP_REF(susp_ref)
1511 }
1512 }
1513
1514 template (value) PDU_BSSGP ts_BSSGP_SUSPEND_NACK(GprsTlli tlli, RoutingAreaIdentification ra_id,
1515 template (omit) BssgpCause cause) := {
1516 pDU_BSSGP_SUSPEND_NACK := {
1517 bssgpPduType := '0D'O,
1518 tLLI := ts_BSSGP_TLLI(tlli),
1519 routeing_Area := ts_BSSGP_RA_ID(ra_id),
1520 cause := ts_BSSGP_CAUSE(cause)
1521 }
1522 }
1523 template PDU_BSSGP tr_BSSGP_SUSPEND_NACK(GprsTlli tlli, RoutingAreaIdentification ra_id,
1524 template BssgpCause cause) := {
1525 pDU_BSSGP_SUSPEND_NACK := {
1526 bssgpPduType := '0D'O,
1527 tLLI := tr_BSSGP_TLLI(tlli),
1528 routeing_Area := ts_BSSGP_RA_ID(ra_id),
1529 cause := t_BSSGP_CAUSE(cause)
1530 }
1531 }
1532
1533
1534
1535 template (value) PDU_BSSGP ts_BSSGP_RESUME(GprsTlli tlli, RoutingAreaIdentification ra_id,
1536 OCT1 susp_ref) := {
1537 pDU_BSSGP_RESUME := {
1538 bssgpPduType := '0E'O,
1539 tLLI := ts_BSSGP_TLLI(tlli),
1540 routeing_Area := ts_BSSGP_RA_ID(ra_id),
1541 suspend_Reference_Number := ts_BSSGP_SUSP_REF(susp_ref)
1542 }
1543 }
1544 template PDU_BSSGP tr_BSSGP_RESUME(template GprsTlli tlli, RoutingAreaIdentification ra_id,
1545 template OCT1 susp_ref) := {
1546 pDU_BSSGP_RESUME := {
1547 bssgpPduType := '0E'O,
1548 tLLI := tr_BSSGP_TLLI(tlli),
1549 routeing_Area := ts_BSSGP_RA_ID(ra_id),
1550 suspend_Reference_Number := tr_BSSGP_SUSP_REF(susp_ref)
1551 }
1552 }
1553
1554 template (value) PDU_BSSGP ts_BSSGP_RESUME_ACK(GprsTlli tlli, RoutingAreaIdentification ra_id)
1555 := {
1556 pDU_BSSGP_RESUME_ACK := {
1557 bssgpPduType := '0F'O,
1558 tLLI := ts_BSSGP_TLLI(tlli),
1559 routeing_Area := ts_BSSGP_RA_ID(ra_id)
1560 }
1561 }
1562 template PDU_BSSGP tr_BSSGP_RESUME_ACK(template GprsTlli tlli,
1563 RoutingAreaIdentification ra_id) := {
1564 pDU_BSSGP_RESUME_ACK := {
1565 bssgpPduType := '0F'O,
1566 tLLI := tr_BSSGP_TLLI(tlli),
1567 routeing_Area := ts_BSSGP_RA_ID(ra_id)
1568 }
1569 }
1570
1571 template (value) PDU_BSSGP ts_BSSGP_RESUME_NACK(GprsTlli tlli, RoutingAreaIdentification ra_id,
1572 template (omit) BssgpCause cause) := {
1573 pDU_BSSGP_RESUME_NACK := {
1574 bssgpPduType := '10'O,
1575 tLLI := ts_BSSGP_TLLI(tlli),
1576 routeing_Area := ts_BSSGP_RA_ID(ra_id),
1577 cause := ts_BSSGP_CAUSE(cause)
1578 }
1579 }
1580 template PDU_BSSGP tr_BSSGP_RESUME_NACK(template GprsTlli tlli,
1581 RoutingAreaIdentification ra_id,
1582 template BssgpCause cause) := {
1583 pDU_BSSGP_RESUME_NACK := {
1584 bssgpPduType := '10'O,
1585 tLLI := tr_BSSGP_TLLI(tlli),
1586 routeing_Area := ts_BSSGP_RA_ID(ra_id),
1587 cause := t_BSSGP_CAUSE(cause)
1588 }
1589 }
1590
1591
Harald Weltecb14e062020-10-05 12:27:41 +02001592/* PDU permitted on PTP BVC only (TS 48.018 Section 5.4.1) */
1593template (present) PDU_BSSGP tr_BSSGP_PERMITTED_PTP_ONLY := (
1594 {pDU_BSSGP_DL_UNITDATA := ?},
1595 {pDU_BSSGP_UL_UNITDATA := ?},
1596 {pDU_BSSGP_RA_CAPABILITY := ?},
1597 {pDU_BSSGP_RA_CAPABILITY_UPDATE := ?},
1598 {pDU_BSSGP_RA_CAPABILITY_UPDATE_ACK := ?},
1599 {pDU_BSSGP_RADIO_STATUS := ?},
1600 {pDU_BSSGP_FLOW_CONTROL_BVC := ?},
1601 {pDU_BSSGP_FLOW_CONTROL_BVC_ACK := ?},
1602 {pDU_BSSGP_FLOW_CONTROL_MS := ?},
1603 {pDU_BSSGP_FLOW_CONTROL_MS_ACK := ?},
1604 {pDU_BSSGP_FLOW_CONTROL_PFC := ?},
1605 {pDU_BSSGP_FLOW_CONTROL_PFC_ACK := ?},
1606 {pDU_BSSGP_DOWNLOAD_BSS_PFC := ?},
1607 {pDU_BSSGP_CREATE_BSS_PFC := ?},
1608 {pDU_BSSGP_CREATE_BSS_PFC_ACK := ?},
1609 {pDU_BSSGP_CREATE_BSS_PFC_NACK := ?},
1610 {pDU_BSSGP_MODIFY_BSS_PFC := ?},
1611 {pDU_BSSGP_MODIFY_BSS_PFC_ACK := ?},
1612 {pDU_BSSGP_DELETE_BSS_PFC := ?},
1613 {pDU_BSSGP_DELETE_BSS_PFC_ACK := ?},
1614 {pDU_BSSGP_DELETE_BSS_PFC_REQ := ?},
1615 {pDU_BSSGP_PS_HANDOVER_REQUIRED := ?},
1616 {pDU_BSSGP_PS_HANDOVER_REQUIRED_ACK := ?},
1617 {pDU_BSSGP_PS_HANDOVER_REQUIRED_NACK := ?},
1618 {pDU_BSSGP_PS_HANDOVER_REQUEST := ?},
1619 {pDU_BSSGP_PS_HANDOVER_REQUEST_ACK := ?},
1620 {pDU_BSSGP_PS_HANDOVER_REQUEST_NACK := ?},
1621 {pDU_BSSGP_PS_HANDOVER_COMPLETE := ?},
1622 {pDU_BSSGP_PS_HANDOVER_COMPLETE_ACK := ?},
1623 {pDU_BSSGP_PS_HANDOVER_CANCEL := ?}
1624);
1625
1626template (present) PDU_BSSGP tr_BSSGP_PERMITTED_PTP := (
1627 tr_BSSGP_PERMITTED_PTP_ONLY,
1628 {pDU_BSSGP_PAGING_PS := ?},
1629 {pDU_BSSGP_PAGING_CS := ?},
1630 {pDU_BSSGP_STATUS := ?}
1631);
1632
1633/* PDU permitted on Signaling BVC only (TS 48.018 Section 5.4.1) */
1634template (present) PDU_BSSGP tr_BSSGP_PERMITTED_SIGN_ONLY := (
1635 {pDU_BSSGP_SUSPEND := ?},
1636 {pDU_BSSGP_SUSPEND_ACK := ?},
1637 {pDU_BSSGP_SUSPEND_NACK := ?},
1638 {pDU_BSSGP_RESUME := ?},
1639 {pDU_BSSGP_RESUME_ACK := ?},
1640 {pDU_BSSGP_RESUME_NACK := ?},
1641 {pDU_BSSGP_FLUSH_LL := ?},
1642 {pDU_BSSGP_FLUSH_LL_ACK := ?},
1643 {pDU_BSSGP_LLC_DISCARDED := ?},
1644 {pDU_BSSGP_BVC_BLOCK := ?},
1645 {pDU_BSSGP_BVC_BLOCK_ACK := ?},
1646 {pDU_BSSGP_BVC_UNBLOCK := ?},
1647 {pDU_BSSGP_BVC_UNBLOCK_ACK := ?},
1648 {pDU_BSSGP_BVC_RESET := ?},
1649 {pDU_BSSGP_BVC_RESET_ACK := ?},
1650 {pDU_BSSGP_SGSN_INVOKE_TRACE := ?},
1651 {pDU_BSSGP_PERFORM_LOCATION_REQUEST := ?},
1652 {pDU_BSSGP_PERFORM_LOCATION_RESPONSE := ?},
1653 {pDU_BSSGP_PERFORM_LOCATION_ABORT := ?},
1654 {pDU_BSSGP_POSITION_COMMAND := ?},
1655 {pDU_BSSGP_POSITION_RESPONSE := ?},
1656 {pDU_BSSGP_RAN_INFORMATION := ?},
1657 {pDU_BSSGP_RAN_INFORMATION_REQUEST := ?},
1658 {pDU_BSSGP_RAN_INFORMATION_ACK := ?},
1659 {pDU_BSSGP_RAN_INFORMATION_ERROR := ?},
1660 {pDU_BSSGP_RAN_INFORMATION_APPLICATION_ERROR := ?},
1661 {pDU_BSSGP_MBMS_SESSION_START_REQUEST := ?},
1662 {pDU_BSSGP_MBMS_SESSION_START_RESPONSE := ?},
1663 {pDU_BSSGP_MBMS_SESSION_STOP_REQUEST := ?},
1664 {pDU_BSSGP_MBMS_STOP_RESPONSE := ?},
1665 {pDU_BSSGP_SESSION_UPDATE_REQUEST := ?},
1666 {pDU_BSSGP_SESSION_UPDATE_RESPONSE := ?}
1667);
1668
1669template (present) PDU_BSSGP tr_BSSGP_PERMITTED_SIGN := (
1670 tr_BSSGP_PERMITTED_SIGN_ONLY,
1671 {pDU_BSSGP_PAGING_PS := ?},
1672 {pDU_BSSGP_PAGING_CS := ?},
1673 {pDU_BSSGP_SUSPEND := ?},
1674 {pDU_BSSGP_STATUS := ?}
1675);
1676
1677/* PDU permitted on PTM BVC only (TS 48.018 Section 5.4.1) */
1678template (present) PDU_BSSGP tr_BSSGP_PERMITTED_PTM_ONLY := (
1679 {pDU_BSSGP_DL_MBMS_UNITDATA := ?},
1680 {pDU_BSSGP_UL_MBMS_UNITDATA := ?}
1681);
1682
1683template (present) PDU_BSSGP tr_BSSGP_PERMITTED_PTM := (
1684 tr_BSSGP_PERMITTED_PTM_ONLY,
1685 {pDU_BSSGP_STATUS := ?}
1686);
1687
1688
1689/* Template for any PTP BVCI IE */
1690template (present) BVCI tr_BSSGP_IE_PtpBvci := {
1691 iEI := '04'O,
1692 ext := '1'B,
1693 lengthIndicator := {
1694 length1 := 2
1695 },
1696 unstructured_value := complement ('0000'O, '0001'O)
1697}
1698
1699/* message on signaling PTP but containing a ptp BVC */
1700/*
1701template PDU_BSSGP tr_BSSGP_SIG_FOR_PTP(template Bvci bvci) := (
1702 {pDU_BSSGP_FLUSH_LL:{?,?,tr_BSSGP_IE_PtpBvci, *, *}},
1703 {pDU_BSSGP_FLUSH_LL_ACK:{?,?,?,tr_BSSGP_IE_PtpBvci, ?, *}},
1704 {pDU_BSSGP_LLC_DISCARDED:{?,?,?,tr_BSSGP_IE_PtpBvci, ?, *}},
1705 {pDU_BSSGP_BVC_BLOCK:{?,tr_BSSGP_IE_PtpBvci, ?}},
1706 {pDU_BSSGP_BVC_BLOCK_ACK:{?,tr_BSSGP_IE_PtpBvci}},
1707 {pDU_BSSGP_BVC_UNBLOCK:{?,tr_BSSGP_IE_PtpBvci}},
1708 {pDU_BSSGP_BVC_UNBLOCK_ACK:{?,tr_BSSGP_IE_PtpBvci}},
1709 {pDU_BSSGP_BVC_RESET:{?,tr_BSSGP_IE_PtpBvci,?,*,*,*}},
1710 {pDU_BSSGP_BVC_RESET_ACK:{?,tr_BSSGP_IE_PtpBvci,*,*,*}},
1711 {pDU_BSSGP_STATUS:{?,?,tr_BSSGP_IE_PtpBvci,*}},
1712 {pDU_BSSGP_PERFORM_LOCATION_REQUEST:{?,?,?,*,tr_BSSGP_IE_PtpBvci,?,?,?,*,*,*,*,*,*,*,*,*}},
1713 {pDU_BSSGP_PERFORM_LOCATION_RESPONSE:{?,?,tr_BSSGP_IE_PtpBvci,*,*,*,*,*,*}},
1714 {pDU_BSSGP_PERFORM_LOCATION_ABORT:{?,?,tr_BSSGP_IE_PtpBvci,?}},
1715 {pDU_BSSGP_POSITION_COMMAND:{
1716);
1717*/
1718
Harald Welte5339b2e2020-10-04 22:52:56 +02001719/* extract the BVCI IE of given PDU + return it */
1720function f_BSSGP_BVCI_IE_get(PDU_BSSGP pdu) return template (omit) BVCI {
1721 select (pdu) {
1722 case (PDU_BSSGP:{pDU_BSSGP_FLUSH_LL:=?}) {
1723 return pdu.pDU_BSSGP_FLUSH_LL.bVCI_old;
1724 }
1725 case (PDU_BSSGP:{pDU_BSSGP_FLUSH_LL_ACK:=?}) {
1726 return pdu.pDU_BSSGP_FLUSH_LL_ACK.bVCI_new;
1727 }
1728 case (PDU_BSSGP:{pDU_BSSGP_LLC_DISCARDED:=?}) {
1729 return pdu.pDU_BSSGP_LLC_DISCARDED.bVCI;
1730 }
1731 case (PDU_BSSGP:{pDU_BSSGP_BVC_BLOCK:=?}) {
1732 return pdu.pDU_BSSGP_BVC_BLOCK.bVCI;
1733 }
1734 case (PDU_BSSGP:{pDU_BSSGP_BVC_BLOCK_ACK:=?}) {
1735 return pdu.pDU_BSSGP_BVC_BLOCK_ACK.bVCI;
1736 }
1737 case (PDU_BSSGP:{pDU_BSSGP_BVC_UNBLOCK:=?}) {
1738 return pdu.pDU_BSSGP_BVC_UNBLOCK.bVCI;
1739 }
1740 case (PDU_BSSGP:{pDU_BSSGP_BVC_UNBLOCK_ACK:=?}) {
1741 return pdu.pDU_BSSGP_BVC_UNBLOCK_ACK.bVCI;
1742 }
1743 case (PDU_BSSGP:{pDU_BSSGP_BVC_RESET:=?}) {
1744 return pdu.pDU_BSSGP_BVC_RESET.bVCI;
1745 }
1746 case (PDU_BSSGP:{pDU_BSSGP_BVC_RESET_ACK:=?}) {
1747 return pdu.pDU_BSSGP_BVC_RESET_ACK.bVCI;
1748 }
1749 case (PDU_BSSGP:{pDU_BSSGP_STATUS:=?}) {
1750 return pdu.pDU_BSSGP_STATUS.bVCI;
1751 }
1752 case (PDU_BSSGP:{pDU_BSSGP_PERFORM_LOCATION_REQUEST:=?}) {
1753 return pdu.pDU_BSSGP_PERFORM_LOCATION_REQUEST.bVCI;
1754 }
1755 case (PDU_BSSGP:{pDU_BSSGP_PERFORM_LOCATION_RESPONSE:=?}) {
1756 return pdu.pDU_BSSGP_PERFORM_LOCATION_RESPONSE.bVCI;
1757 }
1758 case (PDU_BSSGP:{pDU_BSSGP_PERFORM_LOCATION_ABORT:=?}) {
1759 return pdu.pDU_BSSGP_PERFORM_LOCATION_ABORT.bVCI;
1760 }
1761 case (PDU_BSSGP:{pDU_BSSGP_POSITION_COMMAND:=?}) {
1762 return pdu.pDU_BSSGP_POSITION_COMMAND.bVCI;
1763 }
1764 case (PDU_BSSGP:{pDU_BSSGP_POSITION_RESPONSE:=?}) {
1765 return pdu.pDU_BSSGP_POSITION_RESPONSE.bVCI;
1766 }
1767 case (PDU_BSSGP:{pDU_BSSGP_PAGING_PS:={?,?,*,{bVCI:=?},*,*,?,*,*}}) {
1768 return pdu.pDU_BSSGP_PAGING_PS.paging_Field4.bVCI;
1769 }
1770 case (PDU_BSSGP:{pDU_BSSGP_PAGING_CS:={?,?,?,{bVCI:=?},*,*,*,*,*}}) {
1771 return pdu.pDU_BSSGP_PAGING_CS.paging_Field4.bVCI;
1772 }
1773 case else {
1774 return omit;
1775 }
1776 }
1777}
1778
1779/* extract the BVCI IE of given PDU + convert it to integer value */
1780function f_BSSGP_BVCI_get(PDU_BSSGP pdu) return template (omit) BssgpBvci {
1781 var template (omit) BVCI bvci_raw := f_BSSGP_BVCI_IE_get(pdu);
1782 if (istemplatekind(bvci_raw, "omit")) {
1783 return omit;
1784 }
1785 return oct2int(valueof(bvci_raw.unstructured_value));
1786}
Harald Welte23989a62019-03-21 21:32:45 +01001787
Harald Welte8f66af12020-11-12 17:27:58 +01001788/* 3GPP TS 23.003 2.6 */
1789type enumerated TlliType {
1790 TLLI_LOCAL,
1791 TLLI_FOREIGN,
1792 TLLI_RANDOM,
1793 TLLI_AUXILIARY,
1794 TLLI_RESERVED,
1795 TLLI_G_RNTI,
1796 TLLI_RAND_G_RNTI
1797}
1798
1799/* 3GPP TS 23.003 2.6 */
1800function f_gprs_tlli_type(OCT4 tlli) return TlliType {
1801 var bitstring tllib := oct2bit(tlli);
1802 if (substr(tllib, 0, 2) == '11'B) {
1803 return TLLI_LOCAL;
1804 } else if (substr(tllib, 0, 2) == '10'B) {
1805 return TLLI_FOREIGN;
1806 } else if (substr(tllib, 0, 5) == '01111'B) {
1807 return TLLI_RANDOM;
1808 } else if (substr(tllib, 0, 4) == '0110'B) {
1809 return TLLI_RESERVED;
1810 } else if (substr(tllib, 0, 3) == '010'B) {
1811 return TLLI_RESERVED;
1812 } else if (substr(tllib, 0, 4) == '0000'B) {
1813 return TLLI_G_RNTI;
1814 } else if (substr(tllib, 0, 4) == '0001'B) {
1815 return TLLI_RAND_G_RNTI;
1816 } else {
1817 setverdict(fail, "Unknonw TLLI Type ", tllib);
1818 mtc.stop;
1819 }
1820}
1821
1822function f_gprs_tlli_random() return OCT4 {
1823 var OCT4 tlli := f_rnd_octstring(4);
1824 return tlli or4b 'c0000000'O;
1825}
1826
1827
Harald Weltee0abc472018-02-05 09:13:31 +01001828
1829} with { encode "RAW" };