blob: 752e85cda2fc3f162c6f5d253ccc7fc087ecec31 [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 := ?,
Pau Espin Pedrol94110822024-01-09 12:07:24 +0100109 tEID := *,
Harald Welte88b3ccb2020-03-12 21:36:32 +0100110 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,
Pau Espin Pedrol5c18a0c2023-10-19 13:41:41 +0200129 iMSI_Value := f_pad_bcd_number_tmpl(imsi)
Harald Welte0f7d03a2019-07-16 19:43:32 +0900130}
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
Harald Welte0f7d03a2019-07-16 19:43:32 +0900148/* 8.4-1 */
Harald Welte0f7d03a2019-07-16 19:43:32 +0900149type enumerated GTP2C_Cause {
150 Local_Detach (2),
151 Complete_Detach (3),
152 RAT_changed_from_3GPP_to_Non_3GPP (4),
153 ISR_deactivation (5),
Pau Espin Pedrol1344e472023-10-23 19:54:29 +0200154 Error_Ind_from_RNC_eNB_SGSN_MME (6),
Harald Welte0f7d03a2019-07-16 19:43:32 +0900155 IMSI_Detach_Only (7),
156 Reactivation_Required (8),
Pau Espin Pedrol1344e472023-10-23 19:54:29 +0200157 PDN_reconnection_to_APN_disallowed (9),
158 Access_changed_from_Non_3GPP_to_3GPP (10),
159 PDN_connection_inactivity_timer_expires (11),
160 PGW_not_responding (12),
161 Network_Failure (13),
162 QoS_parameter_mismatch (14),
163 EPS_to_5GS_Mobility (15),
164 Request_accepted (16),
165 Request_accepted_partially (17),
166 New_PDN_type_due_to_network_preference (18),
167 New_PDN_type_due_to_single_address_bearer_only (19),
168 /* ... */
Pau Espin Pedrol7b2cc922024-02-28 16:14:15 +0100169 Context_Not_Found (64),
170 APN_access_denied__no_subscription (93)
Pau Espin Pedrol1344e472023-10-23 19:54:29 +0200171} with { variant "FIELDLENGTH(8)" encode "RAW" };
Harald Welte0f7d03a2019-07-16 19:43:32 +0900172
173/* 8.4 */
Pau Espin Pedrol1344e472023-10-23 19:54:29 +0200174template (value) Cause ts_GTP2C_Cause(template (value) GTP2C_Cause cause,
Harald Welte0f7d03a2019-07-16 19:43:32 +0900175 template (value) BIT1 cs) := {
176 elementIdentifier := '02'O,
177 lengthIndicator := 0, /* overwritten */
178 instance := '0000'B,
179 spare := '0000'B,
Pau Espin Pedrol1344e472023-10-23 19:54:29 +0200180 causeValue := int2oct(enum2int(valueof(cause)), 1),
Harald Welte0f7d03a2019-07-16 19:43:32 +0900181 cS := cs,
182 bCE := '0'B,
183 pCE := '0'B,
184 spare2 := '00000'B,
185 typeOfOffendingIE := omit,
186 lengthIndicator2 := omit,
187 instanceOfOffendingIE := omit,
188 spare3 := omit
189}
Pau Espin Pedrol1344e472023-10-23 19:54:29 +0200190private function enum2int_GTP2C_Cause_tmpl(template GTP2C_Cause inp) return template integer
191{
192 if (istemplatekind(inp, "omit")) {
193 return omit;
194 } else if (istemplatekind(inp, "*")) {
195 return *;
196 } else if (istemplatekind(inp, "?")) {
197 return ?;
198 } else {
199 return enum2int(valueof(inp));
200 }
201}
202template (present) Cause tr_GTP2C_Cause(template (present) GTP2C_Cause cause) := {
Harald Welte0f7d03a2019-07-16 19:43:32 +0900203 elementIdentifier := '02'O,
204 lengthIndicator := ?,
205 instance := ?,
206 spare := '0000'B,
Pau Espin Pedrol1344e472023-10-23 19:54:29 +0200207 causeValue := int2oct_tmpl(enum2int_GTP2C_Cause_tmpl(cause), 1),
Harald Welte0f7d03a2019-07-16 19:43:32 +0900208 cS := ?,
209 bCE := ?,
210 pCE := ?,
211 spare2 := '00000'B,
212 typeOfOffendingIE := *,
213 lengthIndicator2 := *,
214 instanceOfOffendingIE := *,
215 spare3 := *
216}
Pau Espin Pedrol1344e472023-10-23 19:54:29 +0200217private function fs_GTP2C_Cause(template (omit) GTP2C_Cause cause, template (value) BIT1 cs) return
Harald Welte88b3ccb2020-03-12 21:36:32 +0100218template (omit) Cause {
219 if (istemplatekind(cause, "omit")) {
220 return omit;
221 } else {
222 return ts_GTP2C_Cause(cause, cs);
223 }
224}
Pau Espin Pedrol1344e472023-10-23 19:54:29 +0200225private function fr_GTP2C_Cause(template GTP2C_Cause cause) return
Harald Welte88b3ccb2020-03-12 21:36:32 +0100226template Cause {
227 if (istemplatekind(cause, "omit")) {
228 return omit;
229 } else if (istemplatekind(cause, "*")) {
230 return *;
231 } else {
232 return tr_GTP2C_Cause(cause);
233 }
234}
235
Harald Welte0f7d03a2019-07-16 19:43:32 +0900236
Pau Espin Pedrol2a2e8542023-10-19 13:39:45 +0200237/* 8.6 */
Harald Welte0f7d03a2019-07-16 19:43:32 +0900238template (value) AccessPointName ts_GTP2C_APN(template (value) octetstring apn) := {
Pau Espin Pedrol2a2e8542023-10-19 13:39:45 +0200239 elementIdentifier := '47'O,
Harald Welte0f7d03a2019-07-16 19:43:32 +0900240 lengthIndicator := 0, /* overwritten */
241 instance := '0000'B,
242 spare := '0000'B,
243 aPN_Value := apn
244}
245template (present) AccessPointName tr_GTP2C_APN(template (present) octetstring apn) := {
Pau Espin Pedrol2a2e8542023-10-19 13:39:45 +0200246 elementIdentifier := '47'O,
Harald Welte0f7d03a2019-07-16 19:43:32 +0900247 lengthIndicator := ?,
248 instance := ?,
249 spare := '0000'B,
250 aPN_Value := apn
251}
252
Harald Welte88b3ccb2020-03-12 21:36:32 +0100253/* 8.7 */
254template (value) AggregateMaximumBitRate
255ts_GTP2C_Ambr(integer ambr_ul, integer ambr_dl) := {
256 elementIdentifier := '48'O,
257 lengthIndicator := 0, /* overwritten */
258 instance := '0000'B,
259 spare := '0000'B,
260 aPN_AMBR_for_uplink := int2oct(ambr_ul, 4),
261 aPN_AMBR_for_downlink := int2oct(ambr_dl, 4)
262}
263
264/* 8.8 */
265template (value) EPS_BearerID
266ts_GTP2C_EpsBearerId(template (value) uint4_t bid) := {
267 elementIdentifier := '49'O,
268 lengthIndicator := 0, /* overwritten */
269 instance := '0000'B,
270 spare := '0000'B,
271 ePS_Bearer_ID_Value := bid,
272 spare2 := '0000'B,
273 additionalOctets := omit
274}
275template (present) EPS_BearerID
276tr_GTP2C_EpsBearerId(template (present) uint4_t bid) := {
277 elementIdentifier := '49'O,
278 lengthIndicator := ?, /* overwritten */
279 instance := '0000'B,
280 spare := '0000'B,
281 ePS_Bearer_ID_Value := bid,
282 spare2 := '0000'B,
283 additionalOctets := *
284}
285
Pau Espin Pedrol78c5e412023-12-21 19:50:11 +0100286/* 8.12 */
287template (present) Indication
288tr_GTP2C_Indication(template (present) BIT1 oI := ?) := {
289 elementIdentifier := '4D'O,
290 lengthIndicator := ?,
291 instance := '0000'B,
292 spare := '0000'B,
293 sGWCI := ?,
294 iSRAI := ?,
295 iSRSI := ?,
296 oI := oI,
297 dFI := ?,
298 hI := ?,
299 dTF := ?,
300 dAF := ?,
301 mSV := ?,
302 sI := ?,
303 pT := ?,
304 pBit := ?,
305 cRSI := ?,
306 cFSI := ?,
307 uIMSI := ?,
308 sQCI := ?,
309 cCRSI := *,
310 iSRAU := *,
311 mBMDT := *,
312 s4AF := *,
313 s6AF := *,
314 sRNI := *,
315 pBIC := *,
316 retLoc := *,
317 cPSR := *,
318 cLII := *,
319 cSFBI := *,
320 pPSI := *,
321 pPON_PPEI := *,
322 pPOF := *,
323 aRRL := *,
324 cPRAI := *,
325 aOPI := *,
326 aOSI := *,
327 pCRI := *,
328 pSCI := *,
329 bDWI := *,
330 dTCI := *,
331 uASI := *,
332 nSI := *,
333 wPMSI := *,
334 uNACCSI := *,
335 pNSI := *,
336 s11TF := *,
337 pMTSMI := *,
338 cPOPCI := *,
339 ePCOSI := *,
340 rOAAI := *,
341 tSPCMI := *,
342 spare_1 := *,
343 spare_2 := *,
344 spare_3 := *,
345 spare_4 := *,
346 spare_5 := *,
347 spare_6 := *,
348 spare_7 := *,
Harald Welte88b3ccb2020-03-12 21:36:32 +0100349
350
Pau Espin Pedrol78c5e412023-12-21 19:50:11 +0100351 additionalOctets := *
352}
353
Harald Welte0f7d03a2019-07-16 19:43:32 +0900354/* 8.14 */
355template (value) PDN_AddressAllocation
356ts_GTP2C_PdnAddrAlloc(template (value) BIT3 pdn_type,
357 template (value) PDN_Address_and_Prefix addr_pfx) := {
358 elementIdentifier := '4F'O,
359 lengthIndicator := 0, /* overwritten */
360 instance := '0000'B,
361 spare := '0000'B,
362 pDN_Type := pdn_type,
363 spare2 := '00000'B,
364 pDN_Address_and_Prefix := addr_pfx
365}
366template (present) PDN_AddressAllocation
367tr_GTP2C_PdnAddrAlloc(template (present) BIT3 pdn_type,
368 template (present) PDN_Address_and_Prefix addr_pfx) := {
369 elementIdentifier := '4F'O,
370 lengthIndicator := ?,
371 instance := ?,
372 spare := '0000'B,
373 pDN_Type := pdn_type,
374 spare2 := '00000'B,
375 pDN_Address_and_Prefix := addr_pfx
376}
377template (value) PDN_AddressAllocation
378ts_GTP2C_PdnAddrAlloc_v4(template (value) OCT4 addr) :=
379 ts_GTP2C_PdnAddrAlloc('001'B, {iPv4_Address:=addr});
380template (present) PDN_AddressAllocation
381tr_GTP2C_PdnAddrAlloc_v4(template (present) OCT4 addr) :=
382 ts_GTP2C_PdnAddrAlloc('001'B, {iPv4_Address:=addr});
383
Harald Welte88b3ccb2020-03-12 21:36:32 +0100384/* 8.15 */
385template (value) Bearer_QoS
386ts_GTP2C_BearerQos(template (value) OCT1 qci,
387 uint40_t max_br_ul, uint40_t max_br_dl,
388 uint40_t g_br_ul, uint40_t g_br_dl,
389 template (value) BIT4 prio_lvl := '1001'B,
390 template (value) BIT1 pe_vuln := '0'B,
391 template (value) BIT1 pe_capa := '0'B) := {
392 elementIdentifier := '50'O,
393 lengthIndicator := 0, /* overwritten */
394 instance := '0000'B,
395 spare := '0000'B,
396 pVI := pe_vuln,
397 spare2 := '0'B,
398 pL := prio_lvl,
399 pCI := pe_capa,
400 spare3 := '0'B,
401 labelQCI := qci,
402 maxBitrateUplink := int2oct(max_br_ul, 5),
403 maxBitrateDownLink := int2oct(max_br_dl, 5),
404 guaranteedBitrateUplink := int2oct(g_br_ul, 5),
405 guaranteedBitrateDownLink := int2oct(g_br_dl, 5),
406 additionalOctets := omit
407}
408
Harald Welte0f7d03a2019-07-16 19:43:32 +0900409/* 8.17 */
Pau Espin Pedrol518e24b2024-02-23 17:45:08 +0100410type enumerated GTP2C_RAT_Type {
411 GTP2C_RAT_reserved ('00'O),
412 GTP2C_RAT_UTRAN ('01'O),
413 GTP2C_RAT_GERAN ('02'O),
414 GTP2C_RAT_WLAN ('03'O),
415 GTP2C_RAT_GAN ('04'O),
416 GTP2C_RAT_HSPA_EVOLUTION ('05'O),
417 GTP2C_RAT_EUTRAN ('06'O),
418 GTP2C_RAT_Virtual ('07'O),
419 GTP2C_RAT_EUTRAN_NB_IoT ('08'O),
420 GTP2C_RAT_LTE_M ('09'O),
421 GTP2C_RAT_NR ('0A'O)
422} with { variant "FIELDLENGTH(8)" encode "RAW" };
423
Harald Welte0f7d03a2019-07-16 19:43:32 +0900424template (value) RAT_Type ts_GTP2C_RatType(template (value) integer rat) := {
Pau Espin Pedrol2a2e8542023-10-19 13:39:45 +0200425 elementIdentifier := '52'O,
Harald Welte0f7d03a2019-07-16 19:43:32 +0900426 lengthIndicator := 0, /* overwritten */
427 instance := '0000'B,
428 spare := '0000'B,
429 rAT_TypeValue := rat,
430 additionalOctets := omit
431}
432template (present) RAT_Type tr_GTP2C_RatType(template (present) integer rat) := {
Pau Espin Pedrol2a2e8542023-10-19 13:39:45 +0200433 elementIdentifier := '52'O,
Harald Welte0f7d03a2019-07-16 19:43:32 +0900434 lengthIndicator := ?,
435 instance := ?,
436 spare := '0000'B,
437 rAT_TypeValue := rat,
438 additionalOctets := *
439}
440
Harald Welte88b3ccb2020-03-12 21:36:32 +0100441/* 8.21 */
442function ts_GTP2C_UserLocInfo(template (omit) CGI cgi := omit,
443 template (omit) SAI sai := omit,
444 template (omit) RAI rai := omit,
445 template (omit) TAI tai := omit,
446 template (omit) ECGI ecgi := omit,
447 template (omit) LAI lai := omit)
448return template (value) UserLocationInfo {
449 var template (value) UserLocationInfo uli;
450 uli.elementIdentifier := '56'O;
451 uli.lengthIndicator := 0; // overwritten
452 uli.instance := '0000'B;
453 uli.spare := '0000'B;
454 uli.spare2 := '00'B;
455 uli.additionalOctets := omit;
456
457 if (istemplatekind(cgi, "omit")) {
458 uli.cGI_Flag := '0'B;
459 } else {
460 uli.cGI_Flag := '1'B;
461 }
462 uli.cGI := cgi;
463
464 if (istemplatekind(sai, "omit")) {
465 uli.sAI_Flag := '0'B;
466 } else {
467 uli.sAI_Flag := '1'B;
468 }
469 uli.sAI := sai;
470
471 if (istemplatekind(rai, "omit")) {
472 uli.rAI_Flag := '0'B;
473 } else {
474 uli.rAI_Flag := '1'B;
475 }
476 uli.rAI := rai
477
478 if (istemplatekind(tai, "omit")) {
479 uli.tAI_Flag := '0'B;
480 } else {
481 uli.tAI_Flag := '1'B;
482 }
483 uli.tAI := tai
484
485 if (istemplatekind(ecgi, "omit")) {
486 uli.eCGI_Flag := '0'B;
487 } else {
488 uli.eCGI_Flag := '1'B;
489 }
490 uli.eCGI := ecgi;
491
492 if (istemplatekind(lai, "omit")) {
493 uli.lAI_Flag := '0'B;
494 } else {
495 uli.lAI_Flag := '1'B;
496 }
497 uli.lAI := lai
498
499 return uli;
500}
Harald Welte0f7d03a2019-07-16 19:43:32 +0900501
502/* 8.22 */
503private function f_bit4oct(template (omit) octetstring os) return BIT1
504{
505 if (istemplatekind(os, "omit")) {
506 return '0'B;
507 } else {
508 return '1'B;
509 }
510}
Harald Welte88b3ccb2020-03-12 21:36:32 +0100511type enumerated FteidInterface {
512 FTEID_IF_S1U_eNodeB_GTPU (0),
513 FTEID_IF_S1U_SGW_GTPU (1),
514 FTEID_IF_S12_RNC_GTPU (2),
515 FTEID_IF_S12_SGW_GTPU (3),
516 FTEID_IF_S5S8_SGW_GTPU (4),
517 FTEID_IF_S5S8_PGW_GTPU (5),
518 FTEID_IF_S5S8_SGW_GTPC (6),
519 FTEID_IF_S5S8_PGW_GTPC (7),
520 FTEID_IF_S5S8_SGW_PMIPv6 (8),
521 FTEID_IF_S5S8_PGW_PMIPv6 (9),
522 FTEID_IF_S11_MME_GTPC (10),
523 FTEID_IF_S11S4_SGW_GTPC (11),
524 FTEID_IF_S10ND26_MME_GTPC (12),
525 FTEID_IF_S3_MME_GTPC (13),
526 FTEID_IF_S3_SGSN_GTPC (14),
527 FTEID_IF_S4_SGSN_GTPU (15),
528 FTEID_IF_S4_SGW_GTPU (16),
529 FTEID_IF_S16_SGSN_GTPC (18),
530 FTEID_IF_eNB_GTPU_DL_DATA_FW (19),
531 FTEID_IF_eNB_GTPU_UL_DATA_FW (20),
532 FTEID_IF_RNC_GTPU_DATA_FW (21),
533 FTEID_IF_SGSN_GTPU_DATA_FW (22),
534 FTEID_IF_SGWUPF_GTPU_DL_DATA_FW (23),
535 FTEID_IF_Sm_MMBS_GW_GTPC (24),
536 FTEID_IF_Sn_MMBS_GW_GTPC (25),
537 FTEID_IF_Sm_MME_GTPC (26),
538 FTEID_IF_Sn_MME_GTPC (27),
539 FTEID_IF_SGW_GTPU_UL_DATA_FW (28),
540 FTEID_IF_Sn_SGSN_GTPU (29),
541 FTEID_IF_S2b_ePDG_GTPC (30),
542 FTEID_IF_S2bU_ePDG_GTPU (31),
543 FTEID_IF_S2b_PGW_GTPC (32),
544 FTEID_IF_S2bU_PGW_GTPU (33),
545 FTEID_IF_S2a_TWAN_GTPU (34),
546 FTEID_IF_S2a_TWAN_GTPC (35),
547 FTEID_IF_S2a_PGW_GTPC (36),
548 FTEID_IF_S2a_PGW_GTPU (37),
549 FTEID_IF_S11_MME_GTPU (38),
550 FTEID_IF_S11_SGW_GTPU (39),
551 FTEID_IF_N26_AMF_GTPC (40)
552};
Harald Welte0f7d03a2019-07-16 19:43:32 +0900553template (value) FullyQualifiedTEID
Harald Welte88b3ccb2020-03-12 21:36:32 +0100554ts_GTP2C_FTEID(FteidInterface if_type, OCT4 teid, uint4_t instance := 0,
555 template (omit) OCT4 v4_addr := omit,
Harald Welte0f7d03a2019-07-16 19:43:32 +0900556 template (omit) OCT16 v6_addr := omit) := {
557 elementIdentifier := '57'O,
558 lengthIndicator := 0, /* overwritten */
Harald Welte88b3ccb2020-03-12 21:36:32 +0100559 instance := int2bit(instance, 4),
Harald Welte0f7d03a2019-07-16 19:43:32 +0900560 spare := '0000'B,
Harald Welte88b3ccb2020-03-12 21:36:32 +0100561 interfaceType := enum2int(if_type),
562 v6_Flag := f_bit4oct(v6_addr),
563 v4_Flag := f_bit4oct(v4_addr),
Harald Welte0f7d03a2019-07-16 19:43:32 +0900564 tEID_GRE_Key := teid,
565 iPv4_Address := v4_addr,
566 iPv6_Address := v6_addr,
567 additionalOctets := omit
568}
569template (present) FullyQualifiedTEID
570tr_GTP2C_FTEID(template (present) integer if_type, template (present) OCT4 teid,
Harald Welte88b3ccb2020-03-12 21:36:32 +0100571 template BIT4 instance := ?,
Harald Welte0f7d03a2019-07-16 19:43:32 +0900572 template OCT4 v4_addr := omit,
573 template OCT16 v6_addr := omit) := {
574 elementIdentifier := '57'O,
575 lengthIndicator := ?,
Harald Welte88b3ccb2020-03-12 21:36:32 +0100576 instance := instance,
Harald Welte0f7d03a2019-07-16 19:43:32 +0900577 spare := '0000'B,
578 interfaceType := if_type,
579 v6_Flag := ?,
580 v4_Flag := ?,
581 tEID_GRE_Key := teid,
582 iPv4_Address := v4_addr,
583 iPv6_Address := v6_addr,
584 additionalOctets := omit
585}
586
Harald Welte88b3ccb2020-03-12 21:36:32 +0100587/* 8.28 */
Pau Espin Pedrol8c746492023-10-23 20:56:09 +0200588template (value) BearerContextIEs
Pau Espin Pedrold4a20082023-10-23 19:59:24 +0200589ts_GTP2C_BcContextIE(template (value) uint4_t ebi,
Pau Espin Pedrol8c746492023-10-23 20:56:09 +0200590 template (omit) FullyQualifiedTEID_List teid_list := omit,
591 template (omit) Bearer_QoS qos := ts_GTP2C_BearerQos('09'O, 0,0,0,0),
592 template (omit) ChargingID charging_id := omit) := {
Pau Espin Pedrold4a20082023-10-23 19:59:24 +0200593 ePS_Bearer_ID := ts_GTP2C_EpsBearerId(ebi),
Pau Espin Pedrol8c746492023-10-23 20:56:09 +0200594 cause := ts_GTP2C_Cause(Request_accepted, '0'B),
595 ePS_Bearer_TFT := omit,
596 fullyQualifiedTEID := teid_list,
597 bearerLevel_QoS := qos,
598 chargingID := charging_id,
599 bearerFlags := omit,
600 transactionIdentifier := omit,
601 protocolConfigOptions := omit,
602 rAN_NASCause := omit,
603 additionalProtocolConfigOptions := omit,
604 extendedProtocolConfigOptions := omit
605}
606
Harald Welte88b3ccb2020-03-12 21:36:32 +0100607template (value) BearerContextGrouped
608ts_GTP2C_BcGrouped(template (value) BearerContextIEs ies) := {
609 elementIdentifier := '5D'O,
610 lengthIndicator := 0, /* overwritten */
611 instance := '0000'B,
612 spare := '0000'B,
613 bearerContextIEs := ies
614}
615template (present) BearerContextGrouped
616tr_GTP2C_BcGrouped(template (present) BearerContextIEs ies) := {
617 elementIdentifier := '5D'O,
618 lengthIndicator := ?, /* overwritten */
619 instance := '0000'B,
620 spare := '0000'B,
621 bearerContextIEs := ies
622}
623
Pau Espin Pedrol8c746492023-10-23 20:56:09 +0200624/* 8.29 */
625template (value) ChargingID
626ts_GTP2C_ChargingID(template (value) OCT4 chargingID_Value) := {
627 elementIdentifier := '5D'O,
628 lengthIndicator := 0, /* overwritten */
629 instance := '0000'B,
630 spare := '0000'B,
631 chargingID_Value := chargingID_Value,
632 additionalOctets := omit
633}
Harald Welte88b3ccb2020-03-12 21:36:32 +0100634
635/* 8.30 */
636template (value) ChargingCharacteristics
637ts_GTP2C_ChargingCaracteristics(template (value) OCT2 cc) := {
638 elementIdentifier := '5F'O,
639 lengthIndicator := 0, /* overwritten */
640 instance := '0000'B,
641 spare := '0000'B,
642 chargingCharacteristicsValue := cc,
643 additionalOctets := omit
644}
645template (present) ChargingCharacteristics
646tr_GTP2C_ChargingCaracteristics(template (present) OCT2 cc) := {
647 elementIdentifier := '5F'O,
648 lengthIndicator := ?, /* overwritten */
649 instance := '0000'B,
650 spare := '0000'B,
651 chargingCharacteristicsValue := cc,
652 additionalOctets := omit
653}
654
655
656/* 8.34 */
657template (value) PDN_Type
658ts_GTP2C_PdnType(template (value) BIT3 pdn_type) := {
659 elementIdentifier := '63'O,
660 lengthIndicator := 0,
661 instance := '0000'B,
662 spare := '0000'B,
663 pDN_TypeValue := pdn_type,
664 spare2 := '00000'B,
665 additionalOctets := omit
666}
667template (present) PDN_Type
668tr_GTP2C_PdnType(template (present) BIT3 pdn_type) := {
669 elementIdentifier := '63'O,
670 lengthIndicator := ?,
671 instance := ?,
672 spare := ?,
673 pDN_TypeValue := pdn_type,
674 spare2 := ?,
675 additionalOctets := *
676}
677
678/* 8.35 */
679template (value) ProcedureTransactionID
680ts_GTP2C_ProcTransId(template (value) integer pti) := {
681 elementIdentifier := '64'O,
682 lengthIndicator := 0,
683 instance := '0000'B,
684 spare := '0000'B,
685 pTI_Value := pti,
686 additionalOctets := omit
687}
Pau Espin Pedrol14abac52024-02-05 21:05:17 +0100688private function f_ts_GTP2C_ProcTransId_omit(template (omit) integer pti)
689return template (omit) ProcedureTransactionID {
690 if (istemplatekind(pti, "omit")) {
691 return omit;
692 }
693 return ts_GTP2C_ProcTransId(pti);
694}
Harald Welte88b3ccb2020-03-12 21:36:32 +0100695template (present) ProcedureTransactionID
696tr_GTP2C_ProcTransId(template (present) integer pti) := {
697 elementIdentifier := '64'O,
698 lengthIndicator := ?,
699 instance :=?,
700 spare := ?,
701 pTI_Value := pti,
702 additionalOctets := *
703}
704
705
706/* 8.57 */
707template (value) APN_Restriction
708ts_GTP2C_ApnRestriction(template (value) integer val) := {
709 elementIdentifier := '7F'O,
710 lengthIndicator := 0,
711 instance := '0000'B,
712 spare := '0000'B,
713 restrictionTypeValue := val,
714 additionalOctets := omit
715}
716template (present) APN_Restriction
717tr_GTP2C_ApnRestriction(template (present) integer val) := {
718 elementIdentifier := '7F'O,
719 lengthIndicator := ?,
720 instance := '0000'B,
721 spare := ?,
722 restrictionTypeValue := val,
723 additionalOctets := *
724}
725
726
727/* 8.58 */
728template (value) SelectionMode
729ts_GTP2C_SelectionMode(template (value) integer mode) := {
730 elementIdentifier := '80'O,
731 lengthIndicator := 0, /* overwritten */
732 instance := '0000'B,
733 spare := '0000'B,
734 selectionModeValue := mode,
735 spare2 := '000000'B,
736 additionalOctets := omit
737}
738template (present) SelectionMode
739tr_GTP2C_SelectionMode(template (present) integer mode) := {
740 elementIdentifier := '80'O,
741 lengthIndicator := ?,
742 instance := ?,
743 spare := ?,
744 selectionModeValue := mode,
745 spare2 := ?,
746 additionalOctets := *
747}
748
Pau Espin Pedrol14abac52024-02-05 21:05:17 +0100749/* 8.62 Fully qualified PDN Connection Set Identifier (FQ-CSID) */
750template (value) NodeID ts_GTP2C_FQCSID_NodeID_IPv4(template (value) OCT4 addr) := {
751 globalUnicastIPv4 := addr
752}
753template (value) FullyQualifiedPDN_ConnectionSetID
754ts_GTP2C_FQCSID(template (value) integer nRofCSIDs,
755 template (value) integer nodeIDType,
756 template (value) NodeID nodeID,
757 template (value) PDN_CSID_List pDN_CSID_List,
758 template (value) uint4_t instance := 0) := {
759 elementIdentifier := '84'O,
760 lengthIndicator := 0, /* overwritten */
761 instance := int2bit(valueof(instance), 4),
762 spare := '0000'B,
763 nRofCSIDs := nRofCSIDs,
764 nodeIDType := nodeIDType,
765 nodeID := nodeID,
766 pDN_CSID_List := pDN_CSID_List,
767 additionalOctets := omit
768}
769template (value) FullyQualifiedPDN_ConnectionSetID
770ts_GTP2C_FQCSID_IPv4(template (value) OCT4 addr,
771 template (value) OCT2 csid,
772 template (value) uint4_t instance := 0) :=
773ts_GTP2C_FQCSID(nRofCSIDs := 1,
774 nodeIDType := 0,
775 nodeID := ts_GTP2C_FQCSID_NodeID_IPv4(addr),
776 pDN_CSID_List := {csid},
777 instance := instance);
Harald Welte0f7d03a2019-07-16 19:43:32 +0900778
Pau Espin Pedrolcacd7072024-02-22 20:12:04 +0100779/* 8.94 Additional Protocol Configuration Options (APCO) */
780template (present) ProtocolID_or_ContainerID
781tr_GTP2C_PCO_P(template (present) OCT2 protocolID_or_ContainerID := ?,
782 template (present) octetstring protID_orContID_Contents := ?) := {
783 protocolID_or_ContainerID := protocolID_or_ContainerID,
784 lengthIndicator := ?,
785 protID_orContID_Contents := protID_orContID_Contents
786}
787template (value) ProtocolID_or_ContainerID
788ts_GTP2C_PCO_P(template (value) OCT2 protocolID_or_ContainerID,
789 template (value) octetstring protID_orContID_Contents := ''O) := {
790 protocolID_or_ContainerID := protocolID_or_ContainerID,
791 lengthIndicator := 0,
792 protID_orContID_Contents := protID_orContID_Contents
793}
794
795template (present) ProtocolID_or_ContainerID tr_GTP2C_PCO_P_DNS_IPv4(template (present) octetstring dns4 := ?) :=
796 tr_GTP2C_PCO_P('000d'O, dns4);
797template (value) ProtocolID_or_ContainerID ts_GTP2C_PCO_P_DNS_IPv4(template (value) octetstring dns4 := ''O) :=
798 ts_GTP2C_PCO_P('000d'O, dns4);
799
800template (present) ProtocolID_or_ContainerID tr_GTP2C_PCO_P_DNS_IPv6(template (present) octetstring dns6 := ?) :=
801 tr_GTP2C_PCO_P('0003'O, dns6);
802template (value) ProtocolID_or_ContainerID ts_GTP2C_PCO_P_DNS_IPv6(template (value) octetstring dns6 := ''O) :=
803 ts_GTP2C_PCO_P('0003'O, dns6);
804
805template (present) ProtocolID_or_ContainerID tr_GTP2C_PCO_P_PCSCF_IPv4(template (present) octetstring pcscf4 := ?) :=
806 tr_GTP2C_PCO_P('000C'O, pcscf4);
807template (value) ProtocolID_or_ContainerID ts_GTP2C_PCO_P_PCSCF_IPv4(template (value) octetstring pcscf4 := ''O) :=
808 ts_GTP2C_PCO_P('000C'O, pcscf4);
809
810template (present) ProtocolID_or_ContainerID tr_GTP2C_PCO_P_PCSCF_IPv6(template (present) octetstring pcscf6 := ?) :=
811 tr_GTP2C_PCO_P('0001'O, pcscf6);
812template (value) ProtocolID_or_ContainerID ts_GTP2C_PCO_P_PCSCF_IPv6(template (value) octetstring pcscf6 := ''O) :=
813 ts_GTP2C_PCO_P('0001'O, pcscf6);
814
815template (value) APCO
816ts_GTP2C_APCO(template (value) BIT4 instance := '0000'B,
817 template (value) ProtocolIDs_and_ContainerIDs protocolIDs_and_ContainerIDs := {}) := {
818 elementIdentifier := 'A3'O,
819 lengthIndicator := 0,
820 instance := instance,
821 spare := '0000'B,
822 configProtocol := '000'B,
823 spare2 := '0000'B,
824 extensionField := '1'B,
825 protocolIDs_and_ContainerIDs := protocolIDs_and_ContainerIDs,
826 additionalOctets := omit
827}
828template (present) APCO
829tr_GTP2C_APCO(template (present) BIT4 instance := ?,
830 template ProtocolIDs_and_ContainerIDs protocolIDs_and_ContainerIDs := *) := {
831 elementIdentifier := 'A3'O,
832 lengthIndicator := ?,
833 instance := instance,
834 spare := ?,
835 configProtocol := '000'B,
836 spare2 := '0000'B,
837 extensionField := '1'B,
838 protocolIDs_and_ContainerIDs := protocolIDs_and_ContainerIDs,
839 additionalOctets := *
840}
Harald Welte0f7d03a2019-07-16 19:43:32 +0900841
842template (value) PDU_GTPCv2 ts_PDU_GTP2C(template (omit) OCT4 teid, template (value) OCT3 seq,
843 template (value) OCT1 msg_type,
844 template (value) GTPCv2_PDUs pdus,
845 template (omit) PDU_GTPCv2 piggyback := omit) := {
846 spare := '000'B,
847 t_Bit := fs_GTP2C_t_bit(teid),
848 p_Bit := fs_GTP2C_p_bit(piggyback),
849 version := '010'B,
850 messageType := msg_type,
851 lengthf := 0, /* overwritten */
852 tEID := teid,
853 sequenceNumber := seq,
854 spare3 := '00'O,
855 gtpcv2_pdu := pdus,
856 piggybackPDU_GTPCv2 := piggyback
857}
858
859
Harald Welte88b3ccb2020-03-12 21:36:32 +0100860template (value) PDU_GTPCv2
861ts_GTP2C_EchoReq(template (value) integer rec_val) :=
862ts_PDU_GTP2C(omit, '000000'O, '01'O, {
863 echoRequest := {
864 recovery := {
865 elementIdentifier := '03'O,
866 lengthIndicator := 0,
867 instance := '0000'B,
868 spare := '0000'B,
869 recoveryValue := rec_val
870 },
871 sendingNodeFeatures := omit,
872 privateExtension := omit
873 }});
Harald Welte0f7d03a2019-07-16 19:43:32 +0900874template (present) PDU_GTPCv2
Harald Welte88b3ccb2020-03-12 21:36:32 +0100875tr_GTP2C_EchoReq(template (present) OCT3 seq := ?) :=
876tr_PDU_GTP2C(omit, seq, { echoRequest := ? }, omit);
877
878template (value) PDU_GTPCv2
879ts_GTP2C_EchoResp(template (value) integer rec_val) :=
880ts_PDU_GTP2C(omit, '000000'O, '02'O, {
881 echoRequest := {
882 recovery := {
883 elementIdentifier := '03'O,
884 lengthIndicator := 0,
885 instance := '0000'B,
886 spare := '0000'B,
887 recoveryValue := rec_val
888 },
889 sendingNodeFeatures := omit,
890 privateExtension := omit
891 }});
892template (present) PDU_GTPCv2
893tr_GTP2C_EchoResp(template (present) OCT3 seq := ?) :=
894tr_PDU_GTP2C(omit, seq, { echoResponse := ? }, omit);
895
896
897
898template (present) PDU_GTPCv2
899ts_GTP2C_CreateSessionReq(template (value) hexstring imsi, template (omit) hexstring msisdn,
900 integer rat_type, template (value) FullyQualifiedTEID sender_fteid,
901 template (value) octetstring apn, template (value) BIT3 pdn_type,
902 template (omit) FullyQualifiedTEID_List teid_list,
903 template (value) OCT2 chg_car, template (value) uint4_t bearer_id,
Pau Espin Pedrol355a1332024-02-23 17:44:14 +0100904 template (omit) UserLocationInfo uli := omit,
Pau Espin Pedrol4ecc8082024-02-26 15:28:12 +0100905 template (value) Bearer_QoS qos := ts_GTP2C_BearerQos('09'O, 0,0,0,0),
906 template (omit) APCO apco := omit) :=
Harald Welte88b3ccb2020-03-12 21:36:32 +0100907ts_PDU_GTP2C('00000000'O, '000000'O, '20'O, {
908 createSessionRequest := {
909 iMSI := ts_GTP2C_Imsi(imsi),
910 mSISDN := fs_GTP2C_msisdn(msisdn),
911 mEI := omit,
Pau Espin Pedrol355a1332024-02-23 17:44:14 +0100912 userLocationInfo := uli,
Harald Welte88b3ccb2020-03-12 21:36:32 +0100913 servingNetwork := omit,
914 rAT_Type := ts_GTP2C_RatType(rat_type),
915 indication := omit,
916 fullyQualifiedTEID := { sender_fteid },
917 accessPointName := ts_GTP2C_APN(apn),
918 selectionMode := ts_GTP2C_SelectionMode(0),
919 pDN_Type := ts_GTP2C_PdnType(pdn_type),
920 pDN_AddressAllocation := ts_GTP2C_PdnAddrAlloc('001'B, {iPv4_Address:='00000000'O}),
921 maxAPN_Restriction := ts_GTP2C_ApnRestriction(0),
922 ambr := ts_GTP2C_Ambr(102400, 102400),
923 linkedEPS_Bearer_ID := omit,
924 trustedWLANModeIndication := omit,
925 protocolConfigOptions := omit,
926 bearerContextGrouped := {
927 ts_GTP2C_BcGrouped({
928 ePS_Bearer_ID := ts_GTP2C_EpsBearerId(bearer_id),
929 cause := omit,
930 ePS_Bearer_TFT := omit,
931 fullyQualifiedTEID := teid_list,
932 bearerLevel_QoS := qos,
933 chargingID := omit,
934 bearerFlags := omit,
935 transactionIdentifier := omit,
936 protocolConfigOptions := omit,
937 rAN_NASCause := omit,
938 additionalProtocolConfigOptions := omit,
939 extendedProtocolConfigOptions := omit
940 })
941 },
942 traceInformation := omit,
943 recovery := omit,
944 csid := omit,
945 uE_TimeZone := omit,
946 user_CSG_Information := omit,
947 chargingCharacteristics := ts_GTP2C_ChargingCaracteristics(chg_car),
948 lDN := omit,
949 signallingPriorityIndication := omit,
950 iP_Addr := omit,
951 portNumber := omit,
Pau Espin Pedrol4ecc8082024-02-26 15:28:12 +0100952 aPCO := apco,
Harald Welte88b3ccb2020-03-12 21:36:32 +0100953 trustedWLANAccessNetworkIdentifier := omit,
954 cNOperatorSelectionEntity := omit,
955 presenceReportingAreaInformation := omit,
956 overloadControlInformationGrouped := omit,
957 originationTimeStamp := omit,
958 maximumWaitTime := omit,
959 wLANLocationTimestamp := omit,
960 nBIFOMContainer := omit,
961 remoteUEContextGrouped := omit,
962 nodeIdentifier := omit,
963 extendedProtocolConfigOptions := omit,
964 servingPLMNRateControl := omit,
965 counter := omit,
966 privateExtension := omit
967 }});
968
969
970template (present) PDU_GTPCv2
Pau Espin Pedrolcacd7072024-02-22 20:12:04 +0100971tr_GTP2C_CreateSessionReq(template (present) hexstring imsi := ?,
972 template (present) octetstring apn := ?,
973 template APCO apco := *) :=
Harald Welte88b3ccb2020-03-12 21:36:32 +0100974tr_PDU_GTP2C('00000000'O, ?, {
Harald Welte0f7d03a2019-07-16 19:43:32 +0900975 createSessionRequest := {
976 iMSI := tr_GTP2C_Imsi(imsi),
977 mSISDN := *,
978 mEI := *,
Pau Espin Pedrol90a46c42023-10-19 13:44:44 +0200979 userLocationInfo := *,
980 servingNetwork := *,
981 rAT_Type := tr_GTP2C_RatType(?),
Harald Welte0f7d03a2019-07-16 19:43:32 +0900982 indication := *,
983 fullyQualifiedTEID := ?,
Pau Espin Pedrol90a46c42023-10-19 13:44:44 +0200984 accessPointName := tr_GTP2C_APN(apn), // '*'
Harald Welte0f7d03a2019-07-16 19:43:32 +0900985 selectionMode := ?,
Pau Espin Pedrol90a46c42023-10-19 13:44:44 +0200986 pDN_Type := *,
Harald Welte0f7d03a2019-07-16 19:43:32 +0900987 pDN_AddressAllocation := ?,
Pau Espin Pedrol90a46c42023-10-19 13:44:44 +0200988 maxAPN_Restriction := *,
Harald Welte0f7d03a2019-07-16 19:43:32 +0900989 ambr := *,
990 linkedEPS_Bearer_ID := omit,
991 trustedWLANModeIndication := omit,
992 protocolConfigOptions := omit,
993 bearerContextGrouped := ?,
994 traceInformation := *,
Pau Espin Pedrol90a46c42023-10-19 13:44:44 +0200995 recovery := *,
Harald Welte0f7d03a2019-07-16 19:43:32 +0900996 csid := omit,
Pau Espin Pedrol90a46c42023-10-19 13:44:44 +0200997 uE_TimeZone := *,
Harald Welte0f7d03a2019-07-16 19:43:32 +0900998 user_CSG_Information := omit,
Pau Espin Pedrol90a46c42023-10-19 13:44:44 +0200999 chargingCharacteristics := *,
Harald Welte0f7d03a2019-07-16 19:43:32 +09001000 lDN := omit,
1001 signallingPriorityIndication := *,
1002 iP_Addr := omit,
1003 portNumber := omit,
Pau Espin Pedrolcacd7072024-02-22 20:12:04 +01001004 aPCO := apco,
Harald Welte0f7d03a2019-07-16 19:43:32 +09001005 trustedWLANAccessNetworkIdentifier := omit,
1006 cNOperatorSelectionEntity := omit,
1007 presenceReportingAreaInformation := omit,
1008 overloadControlInformationGrouped := omit,
1009 originationTimeStamp := *,
1010 maximumWaitTime := *,
1011 wLANLocationTimestamp := omit,
1012 nBIFOMContainer := omit,
1013 remoteUEContextGrouped := *,
1014 nodeIdentifier := *,
1015 extendedProtocolConfigOptions := omit,
1016 servingPLMNRateControl := omit,
1017 counter := omit,
1018 privateExtension := omit
1019 }});
1020
1021template (value) PDU_GTPCv2
Pau Espin Pedrolfa2b3842023-12-13 18:49:19 +01001022ts_GTP2C_CreateSessionResp(template (value) OCT4 d_teid,
1023 template (value) OCT3 seq,
Pau Espin Pedrol7b2cc922024-02-28 16:14:15 +01001024 template (value) GTP2C_Cause cause := Request_accepted,
1025 template (omit) FullyQualifiedTEID_List fteids := omit,
1026 template (omit) PDN_AddressAllocation addr := omit,
Pau Espin Pedrolcacd7072024-02-22 20:12:04 +01001027 template (omit) BearerContextGrouped_List bearerContextGrouped := omit,
1028 template (omit) APCO apco := omit) :=
Pau Espin Pedrolfa2b3842023-12-13 18:49:19 +01001029ts_PDU_GTP2C(d_teid, seq, '21'O, {
Harald Welte0f7d03a2019-07-16 19:43:32 +09001030 createSessionResponse := {
Pau Espin Pedrol7b2cc922024-02-28 16:14:15 +01001031 cause := ts_GTP2C_Cause(cause, '0'B),
Harald Welte0f7d03a2019-07-16 19:43:32 +09001032 changeReportingAction := omit,
1033 cSG_InformationReportingAction := omit,
1034 heNBInformationReporting := omit,
1035 fullyQualifiedTEID := fteids,
1036 pDN_AddressAllocation := addr,
1037 aPN_Restriction := omit,
1038 ambr := omit,
1039 linkedEPS_Bearer_ID := omit,
1040 protocolConfigOptions := omit,
Pau Espin Pedrol8c746492023-10-23 20:56:09 +02001041 bearerContextGrouped := bearerContextGrouped,
Harald Welte0f7d03a2019-07-16 19:43:32 +09001042 recovery := omit,
1043 chargingGatewayName := omit,
1044 chargingGatewayAddress := omit,
1045 csid := omit,
1046 lDN := omit,
1047 pGW_Back_OffTime := omit,
Pau Espin Pedrolcacd7072024-02-22 20:12:04 +01001048 aPCO := apco,
Harald Welte0f7d03a2019-07-16 19:43:32 +09001049 trustedWLANIPv4Parameters := omit,
1050 indicationFlags := omit,
1051 presenceReportingAreaAction := omit,
1052 loadControlInformationGrouped := omit,
1053 overloadControlInformationGrouped := omit,
1054 nBIFOMContainer := omit,
1055 pDNConnectionChargingID := omit,
1056 extendedProtocolConfigOptions := omit,
1057 privateExtension := omit
1058 }});
Harald Welte88b3ccb2020-03-12 21:36:32 +01001059template (present) PDU_GTPCv2
1060tr_GTP2C_CreateSessionResp(template (present) OCT4 d_teid := ?,
1061 template (present) OCT3 seq := ?,
Pau Espin Pedrol1344e472023-10-23 19:54:29 +02001062 template (present) GTP2C_Cause cause := ?,
Harald Welte88b3ccb2020-03-12 21:36:32 +01001063 template FullyQualifiedTEID_List fteids := *,
1064 template PDN_AddressAllocation addr := *,
Pau Espin Pedrol518e24b2024-02-23 17:45:08 +01001065 template APN_Restriction apn_restriction := *,
Pau Espin Pedrol4ecc8082024-02-26 15:28:12 +01001066 template BearerContextGrouped_List bctxg := *,
1067 template APCO exp_apco := *) :=
Harald Welte88b3ccb2020-03-12 21:36:32 +01001068tr_PDU_GTP2C(d_teid, seq, {
1069 createSessionResponse := {
1070 cause := tr_GTP2C_Cause(cause),
1071 changeReportingAction := *,
1072 cSG_InformationReportingAction := *,
1073 heNBInformationReporting := *,
1074 fullyQualifiedTEID := fteids,
1075 pDN_AddressAllocation := addr,
Pau Espin Pedrol518e24b2024-02-23 17:45:08 +01001076 aPN_Restriction := apn_restriction,
Harald Welte88b3ccb2020-03-12 21:36:32 +01001077 ambr := *,
1078 linkedEPS_Bearer_ID := *,
1079 protocolConfigOptions := *,
1080 bearerContextGrouped := bctxg,
1081 recovery := *,
1082 chargingGatewayName := *,
1083 chargingGatewayAddress := *,
1084 csid := *,
1085 lDN := *,
1086 pGW_Back_OffTime := *,
Pau Espin Pedrol4ecc8082024-02-26 15:28:12 +01001087 aPCO := exp_apco,
Harald Welte88b3ccb2020-03-12 21:36:32 +01001088 trustedWLANIPv4Parameters := *,
1089 indicationFlags := *,
1090 presenceReportingAreaAction := *,
1091 loadControlInformationGrouped := *,
1092 overloadControlInformationGrouped := *,
1093 nBIFOMContainer := *,
1094 pDNConnectionChargingID := *,
1095 extendedProtocolConfigOptions := *,
1096 privateExtension := *
1097 }});
1098
1099
1100template (value) PDU_GTPCv2
1101ts_GTP2C_DeleteSessionReq(template (value) OCT4 d_teid,
Pau Espin Pedrol1344e472023-10-23 19:54:29 +02001102 template (omit) GTP2C_Cause cause := omit,
Harald Welte88b3ccb2020-03-12 21:36:32 +01001103 template (value) FullyQualifiedTEID sender_fteid,
1104 template (omit) FullyQualifiedTEID_List teid_list := omit,
1105 template (value) uint4_t bearer_id) :=
1106ts_PDU_GTP2C(d_teid, '000000'O, '24'O, {
1107 deleteSessionRequest := {
1108 cause := fs_GTP2C_Cause(cause, '0'B),
1109 linkedEPS_Bearer_ID := ts_GTP2C_EpsBearerId(bearer_id),
1110 uLI := omit,
1111 indicationFlags := omit,
1112 protocolConfigOptions := omit,
1113 originatingNode := omit,
1114 fullyQualifiedTEID := sender_fteid,
1115 uE_TimeZone := omit,
1116 uLITimestamp := omit,
1117 rANNASReleaseCause := omit,
1118 trustedWLANAccessNetworkIdentifier := omit,
1119 tWANIdentifierTimestamp := omit,
1120 overloadControlInformationGrouped := omit,
1121 uELocalIP_Addr := omit,
1122 portNumber := omit,
1123 extendedProtocolConfigOptions := omit,
1124 privateExtension := omit
1125 }});
1126template (present) PDU_GTPCv2
Pau Espin Pedrol2f327072023-12-21 19:11:35 +01001127tr_GTP2C_DeleteSessionReq(template (present) OCT4 d_teid := ?,
Harald Welte88b3ccb2020-03-12 21:36:32 +01001128 template (present) OCT3 seq := ?,
Pau Espin Pedrol2f327072023-12-21 19:11:35 +01001129 template GTP2C_Cause cause := *,
1130 template (present) uint4_t bearer_id := ?,
Pau Espin Pedrol78c5e412023-12-21 19:50:11 +01001131 template Indication indicationFlags := *,
Pau Espin Pedrol2f327072023-12-21 19:11:35 +01001132 template FullyQualifiedTEID sender_fteid := *) :=
Harald Welte88b3ccb2020-03-12 21:36:32 +01001133tr_PDU_GTP2C(d_teid, seq, {
1134 deleteSessionRequest := {
1135 cause := fr_GTP2C_Cause(cause),
1136 linkedEPS_Bearer_ID := tr_GTP2C_EpsBearerId(bearer_id),
1137 uLI := *,
Pau Espin Pedrol78c5e412023-12-21 19:50:11 +01001138 indicationFlags := indicationFlags,
Harald Welte88b3ccb2020-03-12 21:36:32 +01001139 protocolConfigOptions := *,
1140 originatingNode := *,
1141 fullyQualifiedTEID := sender_fteid,
1142 uE_TimeZone := *,
1143 uLITimestamp := *,
1144 rANNASReleaseCause := *,
1145 trustedWLANAccessNetworkIdentifier := *,
1146 tWANIdentifierTimestamp := *,
1147 overloadControlInformationGrouped := *,
1148 uELocalIP_Addr := *,
1149 portNumber := *,
1150 extendedProtocolConfigOptions := *,
1151 privateExtension := *
1152 }});
1153
1154
1155template (value) PDU_GTPCv2
1156ts_GTP2C_DeleteSessionResp(template (value) OCT4 d_teid,
1157 template (value) OCT3 seq,
Pau Espin Pedrol1344e472023-10-23 19:54:29 +02001158 template (value) GTP2C_Cause cause) :=
Pau Espin Pedrol2e9988d2023-12-13 18:48:33 +01001159ts_PDU_GTP2C(d_teid, seq, '25'O, {
Harald Welte88b3ccb2020-03-12 21:36:32 +01001160 deleteSessionResponse := {
1161 cause := ts_GTP2C_Cause(cause, '0'B),
1162 recovery := omit,
1163 protocolConfigOptions := omit,
1164 indicationFlags := omit,
1165 loadControlInformationGrouped := omit,
1166 overloadControlInformationGrouped := omit,
1167 extendedProtocolConfigOptions := omit,
1168 privateExtension := omit
1169
1170 }});
1171template (present) PDU_GTPCv2
1172tr_GTP2C_DeleteSessionResp(template (present) OCT4 d_teid,
1173 template (present) OCT3 seq := ?,
Pau Espin Pedrol1344e472023-10-23 19:54:29 +02001174 template (present) GTP2C_Cause cause := ?
Harald Welte88b3ccb2020-03-12 21:36:32 +01001175 ) :=
1176tr_PDU_GTP2C(d_teid, seq, {
1177 deleteSessionResponse := {
1178 cause := tr_GTP2C_Cause(cause),
1179 recovery := *,
1180 protocolConfigOptions := *,
1181 indicationFlags := *,
1182 loadControlInformationGrouped := *,
1183 overloadControlInformationGrouped := *,
1184 extendedProtocolConfigOptions := *,
1185 privateExtension := *
1186 }});
1187
1188template (value) PDU_GTPCv2
1189ts_GTP2C_CreateBearerReq(template (value) OCT4 d_teid,
Pau Espin Pedrol14abac52024-02-05 21:05:17 +01001190 template (omit) integer proc_trans_id,
Harald Welte88b3ccb2020-03-12 21:36:32 +01001191 template (value) uint4_t linked_id,
1192 template (value) uint4_t bearer_id,
Pau Espin Pedrol14abac52024-02-05 21:05:17 +01001193 template (value) BearerContextGrouped_List bearer_ctx_list,
1194 template (omit) FullyQualifiedPDN_ConnectionSetID_List csid := omit,
Harald Welte88b3ccb2020-03-12 21:36:32 +01001195 template (value) Bearer_QoS qos := ts_GTP2C_BearerQos('09'O, 0,0,0,0)) :=
1196ts_PDU_GTP2C(d_teid, '000000'O, '5F'O, {
1197 createBearerRequest := {
Pau Espin Pedrol14abac52024-02-05 21:05:17 +01001198 procedureTransactionID := f_ts_GTP2C_ProcTransId_omit(proc_trans_id),
Harald Welte88b3ccb2020-03-12 21:36:32 +01001199 linkedEPS_BearerID := ts_GTP2C_EpsBearerId(linked_id),
1200 protocolConfigOptions := omit,
Pau Espin Pedrol14abac52024-02-05 21:05:17 +01001201 bearerContextGrouped := bearer_ctx_list,
1202 csid := csid,
Harald Welte88b3ccb2020-03-12 21:36:32 +01001203 changeReportingAction := omit,
1204 cSG_InformationReportingAction := omit,
1205 heNBInformationReporting := omit,
1206 presenceReportingAreaAction := omit,
1207 indicationFlags := omit,
1208 loadControlInformationGrouped := omit,
1209 overloadControlInformationGrouped := omit,
1210 nBIFOMContainer := omit,
1211 privateExtension := omit
1212 }});
Pau Espin Pedrol14abac52024-02-05 21:05:17 +01001213template (present) PDU_GTPCv2
1214tr_GTP2C_CreateBearerResp(template (present) OCT4 d_teid,
1215 template (present) OCT3 seq := ?,
1216 template (present) GTP2C_Cause cause := ?
1217 ) :=
1218tr_PDU_GTP2C(d_teid, seq, {
1219 createBearerResponse := {
1220 cause := tr_GTP2C_Cause(cause),
1221 bearerContextGrouped := *,
1222 recovery := *,
1223 csid := *,
1224 protocolConfigOptions := *,
1225 uE_TimeZone := *,
1226 uLI := *,
1227 trustedWLANAccessNetworkIdentifier := *,
1228 overloadControlInformationGrouped := *,
1229 presenceReportingAreaInformation := *,
1230 iP_Addr := *,
1231 wLANLocationTimestamp := *,
1232 portNumber := *,
1233 nBIFOMContainer := *,
1234 extendedProtocolConfigOptions := *,
1235 privateExtension:= *
1236 }});
Harald Welte88b3ccb2020-03-12 21:36:32 +01001237
Pau Espin Pedrolecfc7d62023-12-13 18:49:29 +01001238template (present) PDU_GTPCv2
1239tr_GTP2C_ModifyBearerReq(template (present) OCT4 d_teid := ?,
1240 template (present) OCT3 seq := ?) :=
1241tr_PDU_GTP2C(d_teid, seq, {
1242 modifyBearerRequest := {
1243 mEI := *,
1244 userLocationInfo := *,
1245 servingNetwork := *,
1246 rAT_Type := *,
1247 indicationFlags := *,
1248 fullyQualifiedTEID := *,
1249 ambr := *,
1250 delayDownlinkPacketNotificationReq := *,
1251 bearerContextGrouped := *,
1252 recovery := *,
1253 uE_TimeZone := *,
1254 csid := *,
1255 user_CSG_Information := *,
1256 iP_Addr := *,
1257 portNumber := *,
1258 lDN := *,
1259 //maxMBR_APN_AMBR := *,
1260 cNOperatorSelectionEntity := *,
1261 presenceReportingAreaInformation := *,
1262 overloadControlInformationGrouped := *,
1263 servingPLMNRateControl := *,
1264 counter := *,
1265 privateExtension := *
1266 }});
1267
1268template (value) PDU_GTPCv2
1269ts_GTP2C_ModifyBearerResp(template (value) OCT4 d_teid,
1270 template (value) OCT3 seq,
1271 template (value) GTP2C_Cause cause,
1272 template (value) uint4_t bearer_id,
1273 template (omit) BearerContextGrouped_List bearerContextGrouped := omit) :=
1274ts_PDU_GTP2C(d_teid, seq, '23'O, {
1275 modifyBearerResponse := {
1276 cause := ts_GTP2C_Cause(cause, '0'B),
1277 mSISDN := omit,
1278 linkedEPS_Bearer_ID := ts_GTP2C_EpsBearerId(bearer_id),
1279 aPN_Restriction := omit,
1280 protocolConfigOptions := omit,
1281 bearerContextGrouped := bearerContextGrouped,
1282 changeReportingAction := omit,
1283 cSG_InformationReportingAction := omit,
1284 heNBInformationReporting := omit,
1285 chargingGatewayName := omit,
1286 chargingGatewayAddress := omit,
1287 csid := omit,
1288 recovery := omit,
1289 lDN := omit,
1290 indicationFlags := omit,
1291 presenceReportingAreaAction := omit,
1292 loadControlInformationGrouped := omit,
1293 overloadControlInformationGrouped := omit,
1294 pDNConnectionChargingID := omit,
1295 privateExtension := omit
1296 }});
Harald Welte88b3ccb2020-03-12 21:36:32 +01001297
1298template (value) PDU_GTPCv2
1299ts_GTP2C_DeleteBearerReq(template (value) OCT4 d_teid,
1300 template (value) integer proc_trans_id,
1301 template (value) uint4_t bearer_id,
Pau Espin Pedrol1344e472023-10-23 19:54:29 +02001302 template (value) GTP2C_Cause cause) :=
Harald Welte88b3ccb2020-03-12 21:36:32 +01001303ts_PDU_GTP2C(d_teid, '000000'O, '63'O, {
1304 deleteBearerRequest := {
1305 epsBearerIdentity := { ts_GTP2C_EpsBearerId(bearer_id) },
1306 bearerContextGrouped := omit,
1307 procedureTransactionID := ts_GTP2C_ProcTransId(proc_trans_id),
1308 protocolConfigOptions := omit,
1309 csid := omit,
1310 cause := ts_GTP2C_Cause(cause, '0'B),
1311 indicationFlags := omit,
1312 loadControlInformationGrouped := omit,
1313 overloadControlInformationGrouped := omit,
1314 nBIFOMContainer := omit,
1315 extendedProtocolConfigOptions := omit,
1316 privateExtension := omit
1317 }});
1318
1319
1320template (present) PDU_GTPCv2
1321tr_GTP2C_DeleteBearerResp(template (present) OCT4 d_teid,
1322 template (present) OCT3 seq := ?,
Pau Espin Pedrol1344e472023-10-23 19:54:29 +02001323 template (present) GTP2C_Cause cause := ?) :=
Harald Welte88b3ccb2020-03-12 21:36:32 +01001324tr_PDU_GTP2C(d_teid, seq, {
1325 deleteBearerResponse := {
1326 cause := tr_GTP2C_Cause(cause),
1327 linkedBearerIdentity := *,
1328 bearerContextGrouped := *,
1329 recovery := *,
1330 csid := *,
1331 protocolConfigOptions := *,
1332 uE_TimeZone := *,
1333 uLI := *,
1334 uLITimestamp := *,
1335 trustedWLANAccessNetworkIdentifier := *,
1336 tWANIdentifierTimestamp := *,
1337 overloadControlInformationGrouped := *,
1338 iP_Addr := *,
1339 portNumber := *,
1340 nBIFOMContainer := *,
1341 privateExtension := *
1342 }});
Harald Welte0f7d03a2019-07-16 19:43:32 +09001343
Vadim Yanitskiybada3c92022-01-20 18:59:07 +06001344/* 8.18 */
1345template (value) ServingNetwork
1346ts_GTP2C_ServingNetwork(template (value) hexstring mcc,
1347 template (value) hexstring mnc,
1348 template (value) BIT4 instance := '0000'B) :=
1349{
1350 elementIdentifier := '53'O,
1351 lengthIndicator := 0, /* overwritten */
1352 instance := instance,
1353 spare := '0000'B,
1354 mccDigit1 := mcc[0],
1355 mccDigit2 := mcc[1],
1356 mccDigit3 := mcc[2],
1357 mncDigit3 := mnc[2], /* 'F'H for 2 digit MNC */
1358 mncDigit1 := mnc[0],
1359 mncDigit2 := mnc[1],
1360 additionalOctets := omit
1361}
1362
Harald Welte0f7d03a2019-07-16 19:43:32 +09001363
1364
1365}