blob: 644728e5f284c4cfc006176a037e19221e7d03ea [file] [log] [blame]
Harald Welte0f7d03a2019-07-16 19:43:32 +09001module GTPv2_Templates {
2
3/* (C) 2019 by Harald Welte <laforge@gnumonks.org>
4 * All rights reserved.
5 *
6 * Released under the terms of GNU General Public License, Version 2 or
7 * (at your option) any later version.
8 *
9 * SPDX-License-Identifier: GPL-2.0-or-later
10 */
11
12import from General_Types all;
13import from Osmocom_Types all;
14import from GTPv2_Types all;
15
16private function fs_GTP2C_t_bit(template (omit) OCT4 teid) return BIT1 {
17 if (istemplatekind(teid, "omit")) {
18 return '0'B;
19 } else {
20 return '1'B;
21 }
22}
23
24private function fs_GTP2C_p_bit(template (omit) PDU_GTPCv2 piggyback) return BIT1 {
25 if (istemplatekind(piggyback, "omit")) {
26 return '0'B;
27 } else {
28 return '1'B;
29 }
30}
31
32template (present) PDU_GTPCv2 tr_PDU_GTP2C(template OCT4 teid := ?,
Harald Welte88b3ccb2020-03-12 21:36:32 +010033 template (present) OCT3 seq := ?,
Harald Welte0f7d03a2019-07-16 19:43:32 +090034 template (present) GTPCv2_PDUs pdus := ?,
35 template PDU_GTPCv2 piggyback := omit) := {
36 spare := '000'B,
37 t_Bit := ?,
38 p_Bit := ?,
39 version := '010'B,
40 messageType := ?,
41 lengthf := ?,
42 tEID := teid,
Harald Welte88b3ccb2020-03-12 21:36:32 +010043 sequenceNumber := seq,
Harald Welte0f7d03a2019-07-16 19:43:32 +090044 spare3 := '00'O,
45 gtpcv2_pdu := pdus,
46 piggybackPDU_GTPCv2 := piggyback
47}
48
Harald Welte88b3ccb2020-03-12 21:36:32 +010049template (present) OCT1 gtp2_requests := (
50 '01'O, // echoRequest
51 '20'O, // createSessionRequest
52 '5F'O, // createBearerRequest
53 '22'O, // modifyBearerRequest
54 '24'O, // deleteSessionRequest
55 '63'O, // deleteBearerRequest
56 'A8'O, // deleteIndirectDataForwardingTunnelRequest
57 '61'O, // updateBearerRequest
58 '42'O, // deleteBearerCommand
59 'A6'O, // createIndirectDataForwardingTunnelRequest
60 'AA'O, // releaseAccessBearersRequest
61 'B3'O, // modifyAccessBearersRequest
62 '85'O, // forwardRelocationRequest
63 '82'O, // contextRequest
64 '80'O, // identificationRequest
65 '26'O, // changeNotificationRequest
66 '8B'O, // relocationCancelRequest
67 'A0'O, // createForwardingTunnelRequest
68 '65'O, // deletePDN_ConnectionSetRequest
69 'C8'O, // updatePDN_ConnectionSetRequest
70 '9E'O, // uE_RegistrationQueryRequest
71 'E7'O, // mBMSSessionStartRequest
72 'E9'O, // mBMSSessionUpdateRequest
73 'EB'O // mBMSSessionStopRequest
74);
75template (present) OCT1 gtp2_responses := (
76 '02'O, // echoResponse
77 '21'O, // createSessionResponse
78 '60'O, // createBearerResponse
79 '23'O, // modifyBearerResponse
80 '25'O, // deleteSessionResponse
81 '64'O, // deleteBearerResponse
82 'A9'O, // deleteIndirectDataForwardingTunnelResponse
83 '62'O, // updateBearerResponse
84 '43'O, // deleteBearerFailureIndication
85 'A7'O, // createIndirectDataForwardingTunnelResponse
86 'AB'O, // releaseAccessBearersResponse
87 'B4'O, // modifyAccessBearersResponse
88 '86'O, // forwardRelocationResponse
89 '83'O, // contextResponse
90 '81'O, // identificationResponse
91 '27'O, // changeNotificationResponse
92 '8C'O, // relocationCancelResponse
93 'A1'O, // createForwardingTunnelResponse
94 '66'O, // deletePDN_ConnectionSetResponse
95 'C9'O, // updatePDN_ConnectionSetResponse
96 '9F'O, // uE_RegistrationQueryResponse
97 'E8'O, // mBMSSessionStartResponse
98 'EA'O, // mBMSSessionUpdateResponse
99 'EC'O // mBMSSessionStopResponse
100);
101
102template (present) PDU_GTPCv2 tr_PDU_GTP2C_msgtypes(template (present) OCT1 types) := {
103 spare := '000'B,
104 t_Bit := ?,
105 p_Bit := ?,
106 version := '010'B,
107 messageType := types,
108 lengthf := ?,
109 tEID := ?,
110 sequenceNumber := ?,
111 spare3 := '00'O,
112 gtpcv2_pdu := ?,
113 piggybackPDU_GTPCv2 := *
114};
Harald Welte0f7d03a2019-07-16 19:43:32 +0900115
116/* 8.3 */
117template (value) IMSI ts_GTP2C_Imsi(template (value) hexstring imsi) := {
118 elementIdentifier := '01'O,
119 lengthIndicator := 0, /* overwritten */
120 instance := '0000'B,
121 spare := '0000'B,
122 iMSI_Value := imsi
123}
124template (present) IMSI tr_GTP2C_Imsi(template (present) hexstring imsi) := {
125 elementIdentifier := '01'O,
126 lengthIndicator := ?,
127 instance := ?,
128 spare := '0000'B,
129 iMSI_Value := imsi
130}
131
Harald Welte88b3ccb2020-03-12 21:36:32 +0100132template (present) MSISDN ts_GTP2C_msisdn(template (present) hexstring msisdn) := {
133 elementIdentifier := '4C'O,
134 lengthIndicator := 0, /* overwritten */
135 instance := '0000'B,
136 spare := '0000'B,
137 mSISDN_Value := msisdn
138}
139private function fs_GTP2C_msisdn(template (omit) hexstring msisdn) return
140template (omit) MSISDN {
141 if (istemplatekind(msisdn, "omit")) {
142 return omit;
143 } else {
144 return ts_GTP2C_msisdn(msisdn);
145 }
146}
147
148
Harald Welte0f7d03a2019-07-16 19:43:32 +0900149/* 8.4-1 */
150/*
151type enumerated GTP2C_Cause {
152 Local_Detach (2),
153 Complete_Detach (3),
154 RAT_changed_from_3GPP_to_Non_3GPP (4),
155 ISR_deactivation (5),
156 Error_Ind_from_RNC_eNB_SGSN_MME (5),
157 IMSI_Detach_Only (7),
158 Reactivation_Required (8),
159}
160*/
161
162const integer c_GTP2C_Cause_LocalDetach := 1;
163
164/* 8.4 */
165template (value) Cause ts_GTP2C_Cause(template (value) OCT1 cause,
166 template (value) BIT1 cs) := {
167 elementIdentifier := '02'O,
168 lengthIndicator := 0, /* overwritten */
169 instance := '0000'B,
170 spare := '0000'B,
171 causeValue := cause,
172 cS := cs,
173 bCE := '0'B,
174 pCE := '0'B,
175 spare2 := '00000'B,
176 typeOfOffendingIE := omit,
177 lengthIndicator2 := omit,
178 instanceOfOffendingIE := omit,
179 spare3 := omit
180}
181template (present) Cause tr_GTP2C_Cause(template (present) OCT1 cause) := {
182 elementIdentifier := '02'O,
183 lengthIndicator := ?,
184 instance := ?,
185 spare := '0000'B,
186 causeValue := cause,
187 cS := ?,
188 bCE := ?,
189 pCE := ?,
190 spare2 := '00000'B,
191 typeOfOffendingIE := *,
192 lengthIndicator2 := *,
193 instanceOfOffendingIE := *,
194 spare3 := *
195}
Harald Welte88b3ccb2020-03-12 21:36:32 +0100196private function fs_GTP2C_Cause(template (omit) OCT1 cause, template (value) BIT1 cs) return
197template (omit) Cause {
198 if (istemplatekind(cause, "omit")) {
199 return omit;
200 } else {
201 return ts_GTP2C_Cause(cause, cs);
202 }
203}
204private function fr_GTP2C_Cause(template OCT1 cause) return
205template Cause {
206 if (istemplatekind(cause, "omit")) {
207 return omit;
208 } else if (istemplatekind(cause, "*")) {
209 return *;
210 } else {
211 return tr_GTP2C_Cause(cause);
212 }
213}
214
Harald Welte0f7d03a2019-07-16 19:43:32 +0900215
216/* 8.5 */
217template (value) AccessPointName ts_GTP2C_APN(template (value) octetstring apn) := {
218 elementIdentifier := '48'O,
219 lengthIndicator := 0, /* overwritten */
220 instance := '0000'B,
221 spare := '0000'B,
222 aPN_Value := apn
223}
224template (present) AccessPointName tr_GTP2C_APN(template (present) octetstring apn) := {
225 elementIdentifier := '48'O,
226 lengthIndicator := ?,
227 instance := ?,
228 spare := '0000'B,
229 aPN_Value := apn
230}
231
Harald Welte88b3ccb2020-03-12 21:36:32 +0100232/* 8.7 */
233template (value) AggregateMaximumBitRate
234ts_GTP2C_Ambr(integer ambr_ul, integer ambr_dl) := {
235 elementIdentifier := '48'O,
236 lengthIndicator := 0, /* overwritten */
237 instance := '0000'B,
238 spare := '0000'B,
239 aPN_AMBR_for_uplink := int2oct(ambr_ul, 4),
240 aPN_AMBR_for_downlink := int2oct(ambr_dl, 4)
241}
242
243/* 8.8 */
244template (value) EPS_BearerID
245ts_GTP2C_EpsBearerId(template (value) uint4_t bid) := {
246 elementIdentifier := '49'O,
247 lengthIndicator := 0, /* overwritten */
248 instance := '0000'B,
249 spare := '0000'B,
250 ePS_Bearer_ID_Value := bid,
251 spare2 := '0000'B,
252 additionalOctets := omit
253}
254template (present) EPS_BearerID
255tr_GTP2C_EpsBearerId(template (present) uint4_t bid) := {
256 elementIdentifier := '49'O,
257 lengthIndicator := ?, /* overwritten */
258 instance := '0000'B,
259 spare := '0000'B,
260 ePS_Bearer_ID_Value := bid,
261 spare2 := '0000'B,
262 additionalOctets := *
263}
264
265
266
Harald Welte0f7d03a2019-07-16 19:43:32 +0900267/* 8.14 */
268template (value) PDN_AddressAllocation
269ts_GTP2C_PdnAddrAlloc(template (value) BIT3 pdn_type,
270 template (value) PDN_Address_and_Prefix addr_pfx) := {
271 elementIdentifier := '4F'O,
272 lengthIndicator := 0, /* overwritten */
273 instance := '0000'B,
274 spare := '0000'B,
275 pDN_Type := pdn_type,
276 spare2 := '00000'B,
277 pDN_Address_and_Prefix := addr_pfx
278}
279template (present) PDN_AddressAllocation
280tr_GTP2C_PdnAddrAlloc(template (present) BIT3 pdn_type,
281 template (present) PDN_Address_and_Prefix addr_pfx) := {
282 elementIdentifier := '4F'O,
283 lengthIndicator := ?,
284 instance := ?,
285 spare := '0000'B,
286 pDN_Type := pdn_type,
287 spare2 := '00000'B,
288 pDN_Address_and_Prefix := addr_pfx
289}
290template (value) PDN_AddressAllocation
291ts_GTP2C_PdnAddrAlloc_v4(template (value) OCT4 addr) :=
292 ts_GTP2C_PdnAddrAlloc('001'B, {iPv4_Address:=addr});
293template (present) PDN_AddressAllocation
294tr_GTP2C_PdnAddrAlloc_v4(template (present) OCT4 addr) :=
295 ts_GTP2C_PdnAddrAlloc('001'B, {iPv4_Address:=addr});
296
Harald Welte88b3ccb2020-03-12 21:36:32 +0100297/* 8.15 */
298template (value) Bearer_QoS
299ts_GTP2C_BearerQos(template (value) OCT1 qci,
300 uint40_t max_br_ul, uint40_t max_br_dl,
301 uint40_t g_br_ul, uint40_t g_br_dl,
302 template (value) BIT4 prio_lvl := '1001'B,
303 template (value) BIT1 pe_vuln := '0'B,
304 template (value) BIT1 pe_capa := '0'B) := {
305 elementIdentifier := '50'O,
306 lengthIndicator := 0, /* overwritten */
307 instance := '0000'B,
308 spare := '0000'B,
309 pVI := pe_vuln,
310 spare2 := '0'B,
311 pL := prio_lvl,
312 pCI := pe_capa,
313 spare3 := '0'B,
314 labelQCI := qci,
315 maxBitrateUplink := int2oct(max_br_ul, 5),
316 maxBitrateDownLink := int2oct(max_br_dl, 5),
317 guaranteedBitrateUplink := int2oct(g_br_ul, 5),
318 guaranteedBitrateDownLink := int2oct(g_br_dl, 5),
319 additionalOctets := omit
320}
321
Harald Welte0f7d03a2019-07-16 19:43:32 +0900322/* 8.17 */
323template (value) RAT_Type ts_GTP2C_RatType(template (value) integer rat) := {
324 elementIdentifier := '53'O,
325 lengthIndicator := 0, /* overwritten */
326 instance := '0000'B,
327 spare := '0000'B,
328 rAT_TypeValue := rat,
329 additionalOctets := omit
330}
331template (present) RAT_Type tr_GTP2C_RatType(template (present) integer rat) := {
332 elementIdentifier := '53'O,
333 lengthIndicator := ?,
334 instance := ?,
335 spare := '0000'B,
336 rAT_TypeValue := rat,
337 additionalOctets := *
338}
339
Harald Welte88b3ccb2020-03-12 21:36:32 +0100340/* 8.21 */
341function ts_GTP2C_UserLocInfo(template (omit) CGI cgi := omit,
342 template (omit) SAI sai := omit,
343 template (omit) RAI rai := omit,
344 template (omit) TAI tai := omit,
345 template (omit) ECGI ecgi := omit,
346 template (omit) LAI lai := omit)
347return template (value) UserLocationInfo {
348 var template (value) UserLocationInfo uli;
349 uli.elementIdentifier := '56'O;
350 uli.lengthIndicator := 0; // overwritten
351 uli.instance := '0000'B;
352 uli.spare := '0000'B;
353 uli.spare2 := '00'B;
354 uli.additionalOctets := omit;
355
356 if (istemplatekind(cgi, "omit")) {
357 uli.cGI_Flag := '0'B;
358 } else {
359 uli.cGI_Flag := '1'B;
360 }
361 uli.cGI := cgi;
362
363 if (istemplatekind(sai, "omit")) {
364 uli.sAI_Flag := '0'B;
365 } else {
366 uli.sAI_Flag := '1'B;
367 }
368 uli.sAI := sai;
369
370 if (istemplatekind(rai, "omit")) {
371 uli.rAI_Flag := '0'B;
372 } else {
373 uli.rAI_Flag := '1'B;
374 }
375 uli.rAI := rai
376
377 if (istemplatekind(tai, "omit")) {
378 uli.tAI_Flag := '0'B;
379 } else {
380 uli.tAI_Flag := '1'B;
381 }
382 uli.tAI := tai
383
384 if (istemplatekind(ecgi, "omit")) {
385 uli.eCGI_Flag := '0'B;
386 } else {
387 uli.eCGI_Flag := '1'B;
388 }
389 uli.eCGI := ecgi;
390
391 if (istemplatekind(lai, "omit")) {
392 uli.lAI_Flag := '0'B;
393 } else {
394 uli.lAI_Flag := '1'B;
395 }
396 uli.lAI := lai
397
398 return uli;
399}
Harald Welte0f7d03a2019-07-16 19:43:32 +0900400
401/* 8.22 */
402private function f_bit4oct(template (omit) octetstring os) return BIT1
403{
404 if (istemplatekind(os, "omit")) {
405 return '0'B;
406 } else {
407 return '1'B;
408 }
409}
Harald Welte88b3ccb2020-03-12 21:36:32 +0100410type enumerated FteidInterface {
411 FTEID_IF_S1U_eNodeB_GTPU (0),
412 FTEID_IF_S1U_SGW_GTPU (1),
413 FTEID_IF_S12_RNC_GTPU (2),
414 FTEID_IF_S12_SGW_GTPU (3),
415 FTEID_IF_S5S8_SGW_GTPU (4),
416 FTEID_IF_S5S8_PGW_GTPU (5),
417 FTEID_IF_S5S8_SGW_GTPC (6),
418 FTEID_IF_S5S8_PGW_GTPC (7),
419 FTEID_IF_S5S8_SGW_PMIPv6 (8),
420 FTEID_IF_S5S8_PGW_PMIPv6 (9),
421 FTEID_IF_S11_MME_GTPC (10),
422 FTEID_IF_S11S4_SGW_GTPC (11),
423 FTEID_IF_S10ND26_MME_GTPC (12),
424 FTEID_IF_S3_MME_GTPC (13),
425 FTEID_IF_S3_SGSN_GTPC (14),
426 FTEID_IF_S4_SGSN_GTPU (15),
427 FTEID_IF_S4_SGW_GTPU (16),
428 FTEID_IF_S16_SGSN_GTPC (18),
429 FTEID_IF_eNB_GTPU_DL_DATA_FW (19),
430 FTEID_IF_eNB_GTPU_UL_DATA_FW (20),
431 FTEID_IF_RNC_GTPU_DATA_FW (21),
432 FTEID_IF_SGSN_GTPU_DATA_FW (22),
433 FTEID_IF_SGWUPF_GTPU_DL_DATA_FW (23),
434 FTEID_IF_Sm_MMBS_GW_GTPC (24),
435 FTEID_IF_Sn_MMBS_GW_GTPC (25),
436 FTEID_IF_Sm_MME_GTPC (26),
437 FTEID_IF_Sn_MME_GTPC (27),
438 FTEID_IF_SGW_GTPU_UL_DATA_FW (28),
439 FTEID_IF_Sn_SGSN_GTPU (29),
440 FTEID_IF_S2b_ePDG_GTPC (30),
441 FTEID_IF_S2bU_ePDG_GTPU (31),
442 FTEID_IF_S2b_PGW_GTPC (32),
443 FTEID_IF_S2bU_PGW_GTPU (33),
444 FTEID_IF_S2a_TWAN_GTPU (34),
445 FTEID_IF_S2a_TWAN_GTPC (35),
446 FTEID_IF_S2a_PGW_GTPC (36),
447 FTEID_IF_S2a_PGW_GTPU (37),
448 FTEID_IF_S11_MME_GTPU (38),
449 FTEID_IF_S11_SGW_GTPU (39),
450 FTEID_IF_N26_AMF_GTPC (40)
451};
Harald Welte0f7d03a2019-07-16 19:43:32 +0900452template (value) FullyQualifiedTEID
Harald Welte88b3ccb2020-03-12 21:36:32 +0100453ts_GTP2C_FTEID(FteidInterface if_type, OCT4 teid, uint4_t instance := 0,
454 template (omit) OCT4 v4_addr := omit,
Harald Welte0f7d03a2019-07-16 19:43:32 +0900455 template (omit) OCT16 v6_addr := omit) := {
456 elementIdentifier := '57'O,
457 lengthIndicator := 0, /* overwritten */
Harald Welte88b3ccb2020-03-12 21:36:32 +0100458 instance := int2bit(instance, 4),
Harald Welte0f7d03a2019-07-16 19:43:32 +0900459 spare := '0000'B,
Harald Welte88b3ccb2020-03-12 21:36:32 +0100460 interfaceType := enum2int(if_type),
461 v6_Flag := f_bit4oct(v6_addr),
462 v4_Flag := f_bit4oct(v4_addr),
Harald Welte0f7d03a2019-07-16 19:43:32 +0900463 tEID_GRE_Key := teid,
464 iPv4_Address := v4_addr,
465 iPv6_Address := v6_addr,
466 additionalOctets := omit
467}
468template (present) FullyQualifiedTEID
469tr_GTP2C_FTEID(template (present) integer if_type, template (present) OCT4 teid,
Harald Welte88b3ccb2020-03-12 21:36:32 +0100470 template BIT4 instance := ?,
Harald Welte0f7d03a2019-07-16 19:43:32 +0900471 template OCT4 v4_addr := omit,
472 template OCT16 v6_addr := omit) := {
473 elementIdentifier := '57'O,
474 lengthIndicator := ?,
Harald Welte88b3ccb2020-03-12 21:36:32 +0100475 instance := instance,
Harald Welte0f7d03a2019-07-16 19:43:32 +0900476 spare := '0000'B,
477 interfaceType := if_type,
478 v6_Flag := ?,
479 v4_Flag := ?,
480 tEID_GRE_Key := teid,
481 iPv4_Address := v4_addr,
482 iPv6_Address := v6_addr,
483 additionalOctets := omit
484}
485
Harald Welte88b3ccb2020-03-12 21:36:32 +0100486/* 8.28 */
487template (value) BearerContextGrouped
488ts_GTP2C_BcGrouped(template (value) BearerContextIEs ies) := {
489 elementIdentifier := '5D'O,
490 lengthIndicator := 0, /* overwritten */
491 instance := '0000'B,
492 spare := '0000'B,
493 bearerContextIEs := ies
494}
495template (present) BearerContextGrouped
496tr_GTP2C_BcGrouped(template (present) BearerContextIEs ies) := {
497 elementIdentifier := '5D'O,
498 lengthIndicator := ?, /* overwritten */
499 instance := '0000'B,
500 spare := '0000'B,
501 bearerContextIEs := ies
502}
503
504
505
506/* 8.30 */
507template (value) ChargingCharacteristics
508ts_GTP2C_ChargingCaracteristics(template (value) OCT2 cc) := {
509 elementIdentifier := '5F'O,
510 lengthIndicator := 0, /* overwritten */
511 instance := '0000'B,
512 spare := '0000'B,
513 chargingCharacteristicsValue := cc,
514 additionalOctets := omit
515}
516template (present) ChargingCharacteristics
517tr_GTP2C_ChargingCaracteristics(template (present) OCT2 cc) := {
518 elementIdentifier := '5F'O,
519 lengthIndicator := ?, /* overwritten */
520 instance := '0000'B,
521 spare := '0000'B,
522 chargingCharacteristicsValue := cc,
523 additionalOctets := omit
524}
525
526
527/* 8.34 */
528template (value) PDN_Type
529ts_GTP2C_PdnType(template (value) BIT3 pdn_type) := {
530 elementIdentifier := '63'O,
531 lengthIndicator := 0,
532 instance := '0000'B,
533 spare := '0000'B,
534 pDN_TypeValue := pdn_type,
535 spare2 := '00000'B,
536 additionalOctets := omit
537}
538template (present) PDN_Type
539tr_GTP2C_PdnType(template (present) BIT3 pdn_type) := {
540 elementIdentifier := '63'O,
541 lengthIndicator := ?,
542 instance := ?,
543 spare := ?,
544 pDN_TypeValue := pdn_type,
545 spare2 := ?,
546 additionalOctets := *
547}
548
549/* 8.35 */
550template (value) ProcedureTransactionID
551ts_GTP2C_ProcTransId(template (value) integer pti) := {
552 elementIdentifier := '64'O,
553 lengthIndicator := 0,
554 instance := '0000'B,
555 spare := '0000'B,
556 pTI_Value := pti,
557 additionalOctets := omit
558}
559template (present) ProcedureTransactionID
560tr_GTP2C_ProcTransId(template (present) integer pti) := {
561 elementIdentifier := '64'O,
562 lengthIndicator := ?,
563 instance :=?,
564 spare := ?,
565 pTI_Value := pti,
566 additionalOctets := *
567}
568
569
570/* 8.57 */
571template (value) APN_Restriction
572ts_GTP2C_ApnRestriction(template (value) integer val) := {
573 elementIdentifier := '7F'O,
574 lengthIndicator := 0,
575 instance := '0000'B,
576 spare := '0000'B,
577 restrictionTypeValue := val,
578 additionalOctets := omit
579}
580template (present) APN_Restriction
581tr_GTP2C_ApnRestriction(template (present) integer val) := {
582 elementIdentifier := '7F'O,
583 lengthIndicator := ?,
584 instance := '0000'B,
585 spare := ?,
586 restrictionTypeValue := val,
587 additionalOctets := *
588}
589
590
591/* 8.58 */
592template (value) SelectionMode
593ts_GTP2C_SelectionMode(template (value) integer mode) := {
594 elementIdentifier := '80'O,
595 lengthIndicator := 0, /* overwritten */
596 instance := '0000'B,
597 spare := '0000'B,
598 selectionModeValue := mode,
599 spare2 := '000000'B,
600 additionalOctets := omit
601}
602template (present) SelectionMode
603tr_GTP2C_SelectionMode(template (present) integer mode) := {
604 elementIdentifier := '80'O,
605 lengthIndicator := ?,
606 instance := ?,
607 spare := ?,
608 selectionModeValue := mode,
609 spare2 := ?,
610 additionalOctets := *
611}
612
613
Harald Welte0f7d03a2019-07-16 19:43:32 +0900614
615
616template (value) PDU_GTPCv2 ts_PDU_GTP2C(template (omit) OCT4 teid, template (value) OCT3 seq,
617 template (value) OCT1 msg_type,
618 template (value) GTPCv2_PDUs pdus,
619 template (omit) PDU_GTPCv2 piggyback := omit) := {
620 spare := '000'B,
621 t_Bit := fs_GTP2C_t_bit(teid),
622 p_Bit := fs_GTP2C_p_bit(piggyback),
623 version := '010'B,
624 messageType := msg_type,
625 lengthf := 0, /* overwritten */
626 tEID := teid,
627 sequenceNumber := seq,
628 spare3 := '00'O,
629 gtpcv2_pdu := pdus,
630 piggybackPDU_GTPCv2 := piggyback
631}
632
633
Harald Welte88b3ccb2020-03-12 21:36:32 +0100634template (value) PDU_GTPCv2
635ts_GTP2C_EchoReq(template (value) integer rec_val) :=
636ts_PDU_GTP2C(omit, '000000'O, '01'O, {
637 echoRequest := {
638 recovery := {
639 elementIdentifier := '03'O,
640 lengthIndicator := 0,
641 instance := '0000'B,
642 spare := '0000'B,
643 recoveryValue := rec_val
644 },
645 sendingNodeFeatures := omit,
646 privateExtension := omit
647 }});
Harald Welte0f7d03a2019-07-16 19:43:32 +0900648template (present) PDU_GTPCv2
Harald Welte88b3ccb2020-03-12 21:36:32 +0100649tr_GTP2C_EchoReq(template (present) OCT3 seq := ?) :=
650tr_PDU_GTP2C(omit, seq, { echoRequest := ? }, omit);
651
652template (value) PDU_GTPCv2
653ts_GTP2C_EchoResp(template (value) integer rec_val) :=
654ts_PDU_GTP2C(omit, '000000'O, '02'O, {
655 echoRequest := {
656 recovery := {
657 elementIdentifier := '03'O,
658 lengthIndicator := 0,
659 instance := '0000'B,
660 spare := '0000'B,
661 recoveryValue := rec_val
662 },
663 sendingNodeFeatures := omit,
664 privateExtension := omit
665 }});
666template (present) PDU_GTPCv2
667tr_GTP2C_EchoResp(template (present) OCT3 seq := ?) :=
668tr_PDU_GTP2C(omit, seq, { echoResponse := ? }, omit);
669
670
671
672template (present) PDU_GTPCv2
673ts_GTP2C_CreateSessionReq(template (value) hexstring imsi, template (omit) hexstring msisdn,
674 integer rat_type, template (value) FullyQualifiedTEID sender_fteid,
675 template (value) octetstring apn, template (value) BIT3 pdn_type,
676 template (omit) FullyQualifiedTEID_List teid_list,
677 template (value) OCT2 chg_car, template (value) uint4_t bearer_id,
678 template (value) Bearer_QoS qos := ts_GTP2C_BearerQos('09'O, 0,0,0,0)) :=
679ts_PDU_GTP2C('00000000'O, '000000'O, '20'O, {
680 createSessionRequest := {
681 iMSI := ts_GTP2C_Imsi(imsi),
682 mSISDN := fs_GTP2C_msisdn(msisdn),
683 mEI := omit,
684 userLocationInfo := omit,
685 servingNetwork := omit,
686 rAT_Type := ts_GTP2C_RatType(rat_type),
687 indication := omit,
688 fullyQualifiedTEID := { sender_fteid },
689 accessPointName := ts_GTP2C_APN(apn),
690 selectionMode := ts_GTP2C_SelectionMode(0),
691 pDN_Type := ts_GTP2C_PdnType(pdn_type),
692 pDN_AddressAllocation := ts_GTP2C_PdnAddrAlloc('001'B, {iPv4_Address:='00000000'O}),
693 maxAPN_Restriction := ts_GTP2C_ApnRestriction(0),
694 ambr := ts_GTP2C_Ambr(102400, 102400),
695 linkedEPS_Bearer_ID := omit,
696 trustedWLANModeIndication := omit,
697 protocolConfigOptions := omit,
698 bearerContextGrouped := {
699 ts_GTP2C_BcGrouped({
700 ePS_Bearer_ID := ts_GTP2C_EpsBearerId(bearer_id),
701 cause := omit,
702 ePS_Bearer_TFT := omit,
703 fullyQualifiedTEID := teid_list,
704 bearerLevel_QoS := qos,
705 chargingID := omit,
706 bearerFlags := omit,
707 transactionIdentifier := omit,
708 protocolConfigOptions := omit,
709 rAN_NASCause := omit,
710 additionalProtocolConfigOptions := omit,
711 extendedProtocolConfigOptions := omit
712 })
713 },
714 traceInformation := omit,
715 recovery := omit,
716 csid := omit,
717 uE_TimeZone := omit,
718 user_CSG_Information := omit,
719 chargingCharacteristics := ts_GTP2C_ChargingCaracteristics(chg_car),
720 lDN := omit,
721 signallingPriorityIndication := omit,
722 iP_Addr := omit,
723 portNumber := omit,
724 aPCO := omit,
725 trustedWLANAccessNetworkIdentifier := omit,
726 cNOperatorSelectionEntity := omit,
727 presenceReportingAreaInformation := omit,
728 overloadControlInformationGrouped := omit,
729 originationTimeStamp := omit,
730 maximumWaitTime := omit,
731 wLANLocationTimestamp := omit,
732 nBIFOMContainer := omit,
733 remoteUEContextGrouped := omit,
734 nodeIdentifier := omit,
735 extendedProtocolConfigOptions := omit,
736 servingPLMNRateControl := omit,
737 counter := omit,
738 privateExtension := omit
739 }});
740
741
742template (present) PDU_GTPCv2
743tr_GTP2C_CreateSessionReq(template (present) hexstring imsi) :=
744tr_PDU_GTP2C('00000000'O, ?, {
Harald Welte0f7d03a2019-07-16 19:43:32 +0900745 createSessionRequest := {
746 iMSI := tr_GTP2C_Imsi(imsi),
747 mSISDN := *,
748 mEI := *,
749 userLocationInfo := ?,
750 servingNetwork := ?,
751 rAT_Type := tr_GTP2C_RatType(6),
752 indication := *,
753 fullyQualifiedTEID := ?,
754 accessPointName := tr_GTP2C_APN('012a'O), // '*'
755 selectionMode := ?,
756 pDN_Type := ?,
757 pDN_AddressAllocation := ?,
758 maxAPN_Restriction := ?,
759 ambr := *,
760 linkedEPS_Bearer_ID := omit,
761 trustedWLANModeIndication := omit,
762 protocolConfigOptions := omit,
763 bearerContextGrouped := ?,
764 traceInformation := *,
765 recovery := omit,
766 csid := omit,
767 uE_TimeZone := ?,
768 user_CSG_Information := omit,
769 chargingCharacteristics := ?,
770 lDN := omit,
771 signallingPriorityIndication := *,
772 iP_Addr := omit,
773 portNumber := omit,
774 aPCO := omit,
775 trustedWLANAccessNetworkIdentifier := omit,
776 cNOperatorSelectionEntity := omit,
777 presenceReportingAreaInformation := omit,
778 overloadControlInformationGrouped := omit,
779 originationTimeStamp := *,
780 maximumWaitTime := *,
781 wLANLocationTimestamp := omit,
782 nBIFOMContainer := omit,
783 remoteUEContextGrouped := *,
784 nodeIdentifier := *,
785 extendedProtocolConfigOptions := omit,
786 servingPLMNRateControl := omit,
787 counter := omit,
788 privateExtension := omit
789 }});
790
791template (value) PDU_GTPCv2
792ts_GTP2C_CreateSessionResp(template (value) FullyQualifiedTEID_List fteids,
793 template (value) PDN_AddressAllocation addr) :=
Harald Welte88b3ccb2020-03-12 21:36:32 +0100794ts_PDU_GTP2C('00000000'O, '000000'O, '21'O, {
Harald Welte0f7d03a2019-07-16 19:43:32 +0900795 createSessionResponse := {
796 cause := ts_GTP2C_Cause(int2oct(16, 1), '0'B),
797 changeReportingAction := omit,
798 cSG_InformationReportingAction := omit,
799 heNBInformationReporting := omit,
800 fullyQualifiedTEID := fteids,
801 pDN_AddressAllocation := addr,
802 aPN_Restriction := omit,
803 ambr := omit,
804 linkedEPS_Bearer_ID := omit,
805 protocolConfigOptions := omit,
806 bearerContextGrouped := omit,
807 recovery := omit,
808 chargingGatewayName := omit,
809 chargingGatewayAddress := omit,
810 csid := omit,
811 lDN := omit,
812 pGW_Back_OffTime := omit,
813 aPCO := omit,
814 trustedWLANIPv4Parameters := omit,
815 indicationFlags := omit,
816 presenceReportingAreaAction := omit,
817 loadControlInformationGrouped := omit,
818 overloadControlInformationGrouped := omit,
819 nBIFOMContainer := omit,
820 pDNConnectionChargingID := omit,
821 extendedProtocolConfigOptions := omit,
822 privateExtension := omit
823 }});
Harald Welte88b3ccb2020-03-12 21:36:32 +0100824template (present) PDU_GTPCv2
825tr_GTP2C_CreateSessionResp(template (present) OCT4 d_teid := ?,
826 template (present) OCT3 seq := ?,
827 template (present) OCT1 cause := ?,
828 template FullyQualifiedTEID_List fteids := *,
829 template PDN_AddressAllocation addr := *,
830 template BearerContextGrouped_List bctxg := *) :=
831tr_PDU_GTP2C(d_teid, seq, {
832 createSessionResponse := {
833 cause := tr_GTP2C_Cause(cause),
834 changeReportingAction := *,
835 cSG_InformationReportingAction := *,
836 heNBInformationReporting := *,
837 fullyQualifiedTEID := fteids,
838 pDN_AddressAllocation := addr,
839 aPN_Restriction := ?,
840 ambr := *,
841 linkedEPS_Bearer_ID := *,
842 protocolConfigOptions := *,
843 bearerContextGrouped := bctxg,
844 recovery := *,
845 chargingGatewayName := *,
846 chargingGatewayAddress := *,
847 csid := *,
848 lDN := *,
849 pGW_Back_OffTime := *,
850 aPCO := *,
851 trustedWLANIPv4Parameters := *,
852 indicationFlags := *,
853 presenceReportingAreaAction := *,
854 loadControlInformationGrouped := *,
855 overloadControlInformationGrouped := *,
856 nBIFOMContainer := *,
857 pDNConnectionChargingID := *,
858 extendedProtocolConfigOptions := *,
859 privateExtension := *
860 }});
861
862
863template (value) PDU_GTPCv2
864ts_GTP2C_DeleteSessionReq(template (value) OCT4 d_teid,
865 template (omit) OCT1 cause := omit,
866 template (value) FullyQualifiedTEID sender_fteid,
867 template (omit) FullyQualifiedTEID_List teid_list := omit,
868 template (value) uint4_t bearer_id) :=
869ts_PDU_GTP2C(d_teid, '000000'O, '24'O, {
870 deleteSessionRequest := {
871 cause := fs_GTP2C_Cause(cause, '0'B),
872 linkedEPS_Bearer_ID := ts_GTP2C_EpsBearerId(bearer_id),
873 uLI := omit,
874 indicationFlags := omit,
875 protocolConfigOptions := omit,
876 originatingNode := omit,
877 fullyQualifiedTEID := sender_fteid,
878 uE_TimeZone := omit,
879 uLITimestamp := omit,
880 rANNASReleaseCause := omit,
881 trustedWLANAccessNetworkIdentifier := omit,
882 tWANIdentifierTimestamp := omit,
883 overloadControlInformationGrouped := omit,
884 uELocalIP_Addr := omit,
885 portNumber := omit,
886 extendedProtocolConfigOptions := omit,
887 privateExtension := omit
888 }});
889template (present) PDU_GTPCv2
890tr_GTP2C_DeleteSessionReq(template (present) OCT4 d_teid,
891 template (present) OCT3 seq := ?,
892 template (omit) OCT1 cause,
893 template (present) FullyQualifiedTEID sender_fteid,
894 template FullyQualifiedTEID_List teid_list,
895 template (present) uint4_t bearer_id) :=
896tr_PDU_GTP2C(d_teid, seq, {
897 deleteSessionRequest := {
898 cause := fr_GTP2C_Cause(cause),
899 linkedEPS_Bearer_ID := tr_GTP2C_EpsBearerId(bearer_id),
900 uLI := *,
901 indicationFlags := *,
902 protocolConfigOptions := *,
903 originatingNode := *,
904 fullyQualifiedTEID := sender_fteid,
905 uE_TimeZone := *,
906 uLITimestamp := *,
907 rANNASReleaseCause := *,
908 trustedWLANAccessNetworkIdentifier := *,
909 tWANIdentifierTimestamp := *,
910 overloadControlInformationGrouped := *,
911 uELocalIP_Addr := *,
912 portNumber := *,
913 extendedProtocolConfigOptions := *,
914 privateExtension := *
915 }});
916
917
918template (value) PDU_GTPCv2
919ts_GTP2C_DeleteSessionResp(template (value) OCT4 d_teid,
920 template (value) OCT3 seq,
921 template (value) OCT1 cause) :=
922ts_PDU_GTP2C(d_teid, '000000'O, '25'O, {
923 deleteSessionResponse := {
924 cause := ts_GTP2C_Cause(cause, '0'B),
925 recovery := omit,
926 protocolConfigOptions := omit,
927 indicationFlags := omit,
928 loadControlInformationGrouped := omit,
929 overloadControlInformationGrouped := omit,
930 extendedProtocolConfigOptions := omit,
931 privateExtension := omit
932
933 }});
934template (present) PDU_GTPCv2
935tr_GTP2C_DeleteSessionResp(template (present) OCT4 d_teid,
936 template (present) OCT3 seq := ?,
937 template (present) OCT1 cause := ?
938 ) :=
939tr_PDU_GTP2C(d_teid, seq, {
940 deleteSessionResponse := {
941 cause := tr_GTP2C_Cause(cause),
942 recovery := *,
943 protocolConfigOptions := *,
944 indicationFlags := *,
945 loadControlInformationGrouped := *,
946 overloadControlInformationGrouped := *,
947 extendedProtocolConfigOptions := *,
948 privateExtension := *
949 }});
950
951template (value) PDU_GTPCv2
952ts_GTP2C_CreateBearerReq(template (value) OCT4 d_teid,
953 template (value) integer proc_trans_id,
954 template (value) uint4_t linked_id,
955 template (value) uint4_t bearer_id,
956 template (omit) FullyQualifiedTEID_List teid_list,
957 template (value) Bearer_QoS qos := ts_GTP2C_BearerQos('09'O, 0,0,0,0)) :=
958ts_PDU_GTP2C(d_teid, '000000'O, '5F'O, {
959 createBearerRequest := {
960 procedureTransactionID := ts_GTP2C_ProcTransId(proc_trans_id),
961 linkedEPS_BearerID := ts_GTP2C_EpsBearerId(linked_id),
962 protocolConfigOptions := omit,
963 bearerContextGrouped := {
964 ts_GTP2C_BcGrouped({
965 ePS_Bearer_ID := ts_GTP2C_EpsBearerId(bearer_id),
966 cause := omit,
967 ePS_Bearer_TFT := omit,
968 fullyQualifiedTEID := teid_list,
969 bearerLevel_QoS := qos,
970 chargingID := omit,
971 bearerFlags := omit,
972 transactionIdentifier := omit,
973 protocolConfigOptions := omit,
974 rAN_NASCause := omit,
975 additionalProtocolConfigOptions := omit,
976 extendedProtocolConfigOptions := omit
977 })
978 },
979 csid := omit,
980 changeReportingAction := omit,
981 cSG_InformationReportingAction := omit,
982 heNBInformationReporting := omit,
983 presenceReportingAreaAction := omit,
984 indicationFlags := omit,
985 loadControlInformationGrouped := omit,
986 overloadControlInformationGrouped := omit,
987 nBIFOMContainer := omit,
988 privateExtension := omit
989 }});
990
991
992template (value) PDU_GTPCv2
993ts_GTP2C_DeleteBearerReq(template (value) OCT4 d_teid,
994 template (value) integer proc_trans_id,
995 template (value) uint4_t bearer_id,
996 template (value) OCT1 cause) :=
997ts_PDU_GTP2C(d_teid, '000000'O, '63'O, {
998 deleteBearerRequest := {
999 epsBearerIdentity := { ts_GTP2C_EpsBearerId(bearer_id) },
1000 bearerContextGrouped := omit,
1001 procedureTransactionID := ts_GTP2C_ProcTransId(proc_trans_id),
1002 protocolConfigOptions := omit,
1003 csid := omit,
1004 cause := ts_GTP2C_Cause(cause, '0'B),
1005 indicationFlags := omit,
1006 loadControlInformationGrouped := omit,
1007 overloadControlInformationGrouped := omit,
1008 nBIFOMContainer := omit,
1009 extendedProtocolConfigOptions := omit,
1010 privateExtension := omit
1011 }});
1012
1013
1014template (present) PDU_GTPCv2
1015tr_GTP2C_DeleteBearerResp(template (present) OCT4 d_teid,
1016 template (present) OCT3 seq := ?,
1017 template (present) OCT1 cause := ?) :=
1018tr_PDU_GTP2C(d_teid, seq, {
1019 deleteBearerResponse := {
1020 cause := tr_GTP2C_Cause(cause),
1021 linkedBearerIdentity := *,
1022 bearerContextGrouped := *,
1023 recovery := *,
1024 csid := *,
1025 protocolConfigOptions := *,
1026 uE_TimeZone := *,
1027 uLI := *,
1028 uLITimestamp := *,
1029 trustedWLANAccessNetworkIdentifier := *,
1030 tWANIdentifierTimestamp := *,
1031 overloadControlInformationGrouped := *,
1032 iP_Addr := *,
1033 portNumber := *,
1034 nBIFOMContainer := *,
1035 privateExtension := *
1036 }});
Harald Welte0f7d03a2019-07-16 19:43:32 +09001037
Vadim Yanitskiybada3c92022-01-20 18:59:07 +06001038/* 8.18 */
1039template (value) ServingNetwork
1040ts_GTP2C_ServingNetwork(template (value) hexstring mcc,
1041 template (value) hexstring mnc,
1042 template (value) BIT4 instance := '0000'B) :=
1043{
1044 elementIdentifier := '53'O,
1045 lengthIndicator := 0, /* overwritten */
1046 instance := instance,
1047 spare := '0000'B,
1048 mccDigit1 := mcc[0],
1049 mccDigit2 := mcc[1],
1050 mccDigit3 := mcc[2],
1051 mncDigit3 := mnc[2], /* 'F'H for 2 digit MNC */
1052 mncDigit1 := mnc[0],
1053 mncDigit2 := mnc[1],
1054 additionalOctets := omit
1055}
1056
Harald Welte0f7d03a2019-07-16 19:43:32 +09001057
1058
1059}