blob: 6bd3ba6c5dae025f00ef8f7437b99185033b66a0 [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,
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
148
Harald Welte0f7d03a2019-07-16 19:43:32 +0900149/* 8.4-1 */
Harald Welte0f7d03a2019-07-16 19:43:32 +0900150type enumerated GTP2C_Cause {
151 Local_Detach (2),
152 Complete_Detach (3),
153 RAT_changed_from_3GPP_to_Non_3GPP (4),
154 ISR_deactivation (5),
Pau Espin Pedrol1344e472023-10-23 19:54:29 +0200155 Error_Ind_from_RNC_eNB_SGSN_MME (6),
Harald Welte0f7d03a2019-07-16 19:43:32 +0900156 IMSI_Detach_Only (7),
157 Reactivation_Required (8),
Pau Espin Pedrol1344e472023-10-23 19:54:29 +0200158 PDN_reconnection_to_APN_disallowed (9),
159 Access_changed_from_Non_3GPP_to_3GPP (10),
160 PDN_connection_inactivity_timer_expires (11),
161 PGW_not_responding (12),
162 Network_Failure (13),
163 QoS_parameter_mismatch (14),
164 EPS_to_5GS_Mobility (15),
165 Request_accepted (16),
166 Request_accepted_partially (17),
167 New_PDN_type_due_to_network_preference (18),
168 New_PDN_type_due_to_single_address_bearer_only (19),
169 /* ... */
170 Context_Not_Found (64)
171} 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
286
287
Harald Welte0f7d03a2019-07-16 19:43:32 +0900288/* 8.14 */
289template (value) PDN_AddressAllocation
290ts_GTP2C_PdnAddrAlloc(template (value) BIT3 pdn_type,
291 template (value) PDN_Address_and_Prefix addr_pfx) := {
292 elementIdentifier := '4F'O,
293 lengthIndicator := 0, /* overwritten */
294 instance := '0000'B,
295 spare := '0000'B,
296 pDN_Type := pdn_type,
297 spare2 := '00000'B,
298 pDN_Address_and_Prefix := addr_pfx
299}
300template (present) PDN_AddressAllocation
301tr_GTP2C_PdnAddrAlloc(template (present) BIT3 pdn_type,
302 template (present) PDN_Address_and_Prefix addr_pfx) := {
303 elementIdentifier := '4F'O,
304 lengthIndicator := ?,
305 instance := ?,
306 spare := '0000'B,
307 pDN_Type := pdn_type,
308 spare2 := '00000'B,
309 pDN_Address_and_Prefix := addr_pfx
310}
311template (value) PDN_AddressAllocation
312ts_GTP2C_PdnAddrAlloc_v4(template (value) OCT4 addr) :=
313 ts_GTP2C_PdnAddrAlloc('001'B, {iPv4_Address:=addr});
314template (present) PDN_AddressAllocation
315tr_GTP2C_PdnAddrAlloc_v4(template (present) OCT4 addr) :=
316 ts_GTP2C_PdnAddrAlloc('001'B, {iPv4_Address:=addr});
317
Harald Welte88b3ccb2020-03-12 21:36:32 +0100318/* 8.15 */
319template (value) Bearer_QoS
320ts_GTP2C_BearerQos(template (value) OCT1 qci,
321 uint40_t max_br_ul, uint40_t max_br_dl,
322 uint40_t g_br_ul, uint40_t g_br_dl,
323 template (value) BIT4 prio_lvl := '1001'B,
324 template (value) BIT1 pe_vuln := '0'B,
325 template (value) BIT1 pe_capa := '0'B) := {
326 elementIdentifier := '50'O,
327 lengthIndicator := 0, /* overwritten */
328 instance := '0000'B,
329 spare := '0000'B,
330 pVI := pe_vuln,
331 spare2 := '0'B,
332 pL := prio_lvl,
333 pCI := pe_capa,
334 spare3 := '0'B,
335 labelQCI := qci,
336 maxBitrateUplink := int2oct(max_br_ul, 5),
337 maxBitrateDownLink := int2oct(max_br_dl, 5),
338 guaranteedBitrateUplink := int2oct(g_br_ul, 5),
339 guaranteedBitrateDownLink := int2oct(g_br_dl, 5),
340 additionalOctets := omit
341}
342
Harald Welte0f7d03a2019-07-16 19:43:32 +0900343/* 8.17 */
344template (value) RAT_Type ts_GTP2C_RatType(template (value) integer rat) := {
Pau Espin Pedrol2a2e8542023-10-19 13:39:45 +0200345 elementIdentifier := '52'O,
Harald Welte0f7d03a2019-07-16 19:43:32 +0900346 lengthIndicator := 0, /* overwritten */
347 instance := '0000'B,
348 spare := '0000'B,
349 rAT_TypeValue := rat,
350 additionalOctets := omit
351}
352template (present) RAT_Type tr_GTP2C_RatType(template (present) integer rat) := {
Pau Espin Pedrol2a2e8542023-10-19 13:39:45 +0200353 elementIdentifier := '52'O,
Harald Welte0f7d03a2019-07-16 19:43:32 +0900354 lengthIndicator := ?,
355 instance := ?,
356 spare := '0000'B,
357 rAT_TypeValue := rat,
358 additionalOctets := *
359}
360
Harald Welte88b3ccb2020-03-12 21:36:32 +0100361/* 8.21 */
362function ts_GTP2C_UserLocInfo(template (omit) CGI cgi := omit,
363 template (omit) SAI sai := omit,
364 template (omit) RAI rai := omit,
365 template (omit) TAI tai := omit,
366 template (omit) ECGI ecgi := omit,
367 template (omit) LAI lai := omit)
368return template (value) UserLocationInfo {
369 var template (value) UserLocationInfo uli;
370 uli.elementIdentifier := '56'O;
371 uli.lengthIndicator := 0; // overwritten
372 uli.instance := '0000'B;
373 uli.spare := '0000'B;
374 uli.spare2 := '00'B;
375 uli.additionalOctets := omit;
376
377 if (istemplatekind(cgi, "omit")) {
378 uli.cGI_Flag := '0'B;
379 } else {
380 uli.cGI_Flag := '1'B;
381 }
382 uli.cGI := cgi;
383
384 if (istemplatekind(sai, "omit")) {
385 uli.sAI_Flag := '0'B;
386 } else {
387 uli.sAI_Flag := '1'B;
388 }
389 uli.sAI := sai;
390
391 if (istemplatekind(rai, "omit")) {
392 uli.rAI_Flag := '0'B;
393 } else {
394 uli.rAI_Flag := '1'B;
395 }
396 uli.rAI := rai
397
398 if (istemplatekind(tai, "omit")) {
399 uli.tAI_Flag := '0'B;
400 } else {
401 uli.tAI_Flag := '1'B;
402 }
403 uli.tAI := tai
404
405 if (istemplatekind(ecgi, "omit")) {
406 uli.eCGI_Flag := '0'B;
407 } else {
408 uli.eCGI_Flag := '1'B;
409 }
410 uli.eCGI := ecgi;
411
412 if (istemplatekind(lai, "omit")) {
413 uli.lAI_Flag := '0'B;
414 } else {
415 uli.lAI_Flag := '1'B;
416 }
417 uli.lAI := lai
418
419 return uli;
420}
Harald Welte0f7d03a2019-07-16 19:43:32 +0900421
422/* 8.22 */
423private function f_bit4oct(template (omit) octetstring os) return BIT1
424{
425 if (istemplatekind(os, "omit")) {
426 return '0'B;
427 } else {
428 return '1'B;
429 }
430}
Harald Welte88b3ccb2020-03-12 21:36:32 +0100431type enumerated FteidInterface {
432 FTEID_IF_S1U_eNodeB_GTPU (0),
433 FTEID_IF_S1U_SGW_GTPU (1),
434 FTEID_IF_S12_RNC_GTPU (2),
435 FTEID_IF_S12_SGW_GTPU (3),
436 FTEID_IF_S5S8_SGW_GTPU (4),
437 FTEID_IF_S5S8_PGW_GTPU (5),
438 FTEID_IF_S5S8_SGW_GTPC (6),
439 FTEID_IF_S5S8_PGW_GTPC (7),
440 FTEID_IF_S5S8_SGW_PMIPv6 (8),
441 FTEID_IF_S5S8_PGW_PMIPv6 (9),
442 FTEID_IF_S11_MME_GTPC (10),
443 FTEID_IF_S11S4_SGW_GTPC (11),
444 FTEID_IF_S10ND26_MME_GTPC (12),
445 FTEID_IF_S3_MME_GTPC (13),
446 FTEID_IF_S3_SGSN_GTPC (14),
447 FTEID_IF_S4_SGSN_GTPU (15),
448 FTEID_IF_S4_SGW_GTPU (16),
449 FTEID_IF_S16_SGSN_GTPC (18),
450 FTEID_IF_eNB_GTPU_DL_DATA_FW (19),
451 FTEID_IF_eNB_GTPU_UL_DATA_FW (20),
452 FTEID_IF_RNC_GTPU_DATA_FW (21),
453 FTEID_IF_SGSN_GTPU_DATA_FW (22),
454 FTEID_IF_SGWUPF_GTPU_DL_DATA_FW (23),
455 FTEID_IF_Sm_MMBS_GW_GTPC (24),
456 FTEID_IF_Sn_MMBS_GW_GTPC (25),
457 FTEID_IF_Sm_MME_GTPC (26),
458 FTEID_IF_Sn_MME_GTPC (27),
459 FTEID_IF_SGW_GTPU_UL_DATA_FW (28),
460 FTEID_IF_Sn_SGSN_GTPU (29),
461 FTEID_IF_S2b_ePDG_GTPC (30),
462 FTEID_IF_S2bU_ePDG_GTPU (31),
463 FTEID_IF_S2b_PGW_GTPC (32),
464 FTEID_IF_S2bU_PGW_GTPU (33),
465 FTEID_IF_S2a_TWAN_GTPU (34),
466 FTEID_IF_S2a_TWAN_GTPC (35),
467 FTEID_IF_S2a_PGW_GTPC (36),
468 FTEID_IF_S2a_PGW_GTPU (37),
469 FTEID_IF_S11_MME_GTPU (38),
470 FTEID_IF_S11_SGW_GTPU (39),
471 FTEID_IF_N26_AMF_GTPC (40)
472};
Harald Welte0f7d03a2019-07-16 19:43:32 +0900473template (value) FullyQualifiedTEID
Harald Welte88b3ccb2020-03-12 21:36:32 +0100474ts_GTP2C_FTEID(FteidInterface if_type, OCT4 teid, uint4_t instance := 0,
475 template (omit) OCT4 v4_addr := omit,
Harald Welte0f7d03a2019-07-16 19:43:32 +0900476 template (omit) OCT16 v6_addr := omit) := {
477 elementIdentifier := '57'O,
478 lengthIndicator := 0, /* overwritten */
Harald Welte88b3ccb2020-03-12 21:36:32 +0100479 instance := int2bit(instance, 4),
Harald Welte0f7d03a2019-07-16 19:43:32 +0900480 spare := '0000'B,
Harald Welte88b3ccb2020-03-12 21:36:32 +0100481 interfaceType := enum2int(if_type),
482 v6_Flag := f_bit4oct(v6_addr),
483 v4_Flag := f_bit4oct(v4_addr),
Harald Welte0f7d03a2019-07-16 19:43:32 +0900484 tEID_GRE_Key := teid,
485 iPv4_Address := v4_addr,
486 iPv6_Address := v6_addr,
487 additionalOctets := omit
488}
489template (present) FullyQualifiedTEID
490tr_GTP2C_FTEID(template (present) integer if_type, template (present) OCT4 teid,
Harald Welte88b3ccb2020-03-12 21:36:32 +0100491 template BIT4 instance := ?,
Harald Welte0f7d03a2019-07-16 19:43:32 +0900492 template OCT4 v4_addr := omit,
493 template OCT16 v6_addr := omit) := {
494 elementIdentifier := '57'O,
495 lengthIndicator := ?,
Harald Welte88b3ccb2020-03-12 21:36:32 +0100496 instance := instance,
Harald Welte0f7d03a2019-07-16 19:43:32 +0900497 spare := '0000'B,
498 interfaceType := if_type,
499 v6_Flag := ?,
500 v4_Flag := ?,
501 tEID_GRE_Key := teid,
502 iPv4_Address := v4_addr,
503 iPv6_Address := v6_addr,
504 additionalOctets := omit
505}
506
Harald Welte88b3ccb2020-03-12 21:36:32 +0100507/* 8.28 */
508template (value) BearerContextGrouped
509ts_GTP2C_BcGrouped(template (value) BearerContextIEs ies) := {
510 elementIdentifier := '5D'O,
511 lengthIndicator := 0, /* overwritten */
512 instance := '0000'B,
513 spare := '0000'B,
514 bearerContextIEs := ies
515}
516template (present) BearerContextGrouped
517tr_GTP2C_BcGrouped(template (present) BearerContextIEs ies) := {
518 elementIdentifier := '5D'O,
519 lengthIndicator := ?, /* overwritten */
520 instance := '0000'B,
521 spare := '0000'B,
522 bearerContextIEs := ies
523}
524
525
526
527/* 8.30 */
528template (value) ChargingCharacteristics
529ts_GTP2C_ChargingCaracteristics(template (value) OCT2 cc) := {
530 elementIdentifier := '5F'O,
531 lengthIndicator := 0, /* overwritten */
532 instance := '0000'B,
533 spare := '0000'B,
534 chargingCharacteristicsValue := cc,
535 additionalOctets := omit
536}
537template (present) ChargingCharacteristics
538tr_GTP2C_ChargingCaracteristics(template (present) OCT2 cc) := {
539 elementIdentifier := '5F'O,
540 lengthIndicator := ?, /* overwritten */
541 instance := '0000'B,
542 spare := '0000'B,
543 chargingCharacteristicsValue := cc,
544 additionalOctets := omit
545}
546
547
548/* 8.34 */
549template (value) PDN_Type
550ts_GTP2C_PdnType(template (value) BIT3 pdn_type) := {
551 elementIdentifier := '63'O,
552 lengthIndicator := 0,
553 instance := '0000'B,
554 spare := '0000'B,
555 pDN_TypeValue := pdn_type,
556 spare2 := '00000'B,
557 additionalOctets := omit
558}
559template (present) PDN_Type
560tr_GTP2C_PdnType(template (present) BIT3 pdn_type) := {
561 elementIdentifier := '63'O,
562 lengthIndicator := ?,
563 instance := ?,
564 spare := ?,
565 pDN_TypeValue := pdn_type,
566 spare2 := ?,
567 additionalOctets := *
568}
569
570/* 8.35 */
571template (value) ProcedureTransactionID
572ts_GTP2C_ProcTransId(template (value) integer pti) := {
573 elementIdentifier := '64'O,
574 lengthIndicator := 0,
575 instance := '0000'B,
576 spare := '0000'B,
577 pTI_Value := pti,
578 additionalOctets := omit
579}
580template (present) ProcedureTransactionID
581tr_GTP2C_ProcTransId(template (present) integer pti) := {
582 elementIdentifier := '64'O,
583 lengthIndicator := ?,
584 instance :=?,
585 spare := ?,
586 pTI_Value := pti,
587 additionalOctets := *
588}
589
590
591/* 8.57 */
592template (value) APN_Restriction
593ts_GTP2C_ApnRestriction(template (value) integer val) := {
594 elementIdentifier := '7F'O,
595 lengthIndicator := 0,
596 instance := '0000'B,
597 spare := '0000'B,
598 restrictionTypeValue := val,
599 additionalOctets := omit
600}
601template (present) APN_Restriction
602tr_GTP2C_ApnRestriction(template (present) integer val) := {
603 elementIdentifier := '7F'O,
604 lengthIndicator := ?,
605 instance := '0000'B,
606 spare := ?,
607 restrictionTypeValue := val,
608 additionalOctets := *
609}
610
611
612/* 8.58 */
613template (value) SelectionMode
614ts_GTP2C_SelectionMode(template (value) integer mode) := {
615 elementIdentifier := '80'O,
616 lengthIndicator := 0, /* overwritten */
617 instance := '0000'B,
618 spare := '0000'B,
619 selectionModeValue := mode,
620 spare2 := '000000'B,
621 additionalOctets := omit
622}
623template (present) SelectionMode
624tr_GTP2C_SelectionMode(template (present) integer mode) := {
625 elementIdentifier := '80'O,
626 lengthIndicator := ?,
627 instance := ?,
628 spare := ?,
629 selectionModeValue := mode,
630 spare2 := ?,
631 additionalOctets := *
632}
633
634
Harald Welte0f7d03a2019-07-16 19:43:32 +0900635
636
637template (value) PDU_GTPCv2 ts_PDU_GTP2C(template (omit) OCT4 teid, template (value) OCT3 seq,
638 template (value) OCT1 msg_type,
639 template (value) GTPCv2_PDUs pdus,
640 template (omit) PDU_GTPCv2 piggyback := omit) := {
641 spare := '000'B,
642 t_Bit := fs_GTP2C_t_bit(teid),
643 p_Bit := fs_GTP2C_p_bit(piggyback),
644 version := '010'B,
645 messageType := msg_type,
646 lengthf := 0, /* overwritten */
647 tEID := teid,
648 sequenceNumber := seq,
649 spare3 := '00'O,
650 gtpcv2_pdu := pdus,
651 piggybackPDU_GTPCv2 := piggyback
652}
653
654
Harald Welte88b3ccb2020-03-12 21:36:32 +0100655template (value) PDU_GTPCv2
656ts_GTP2C_EchoReq(template (value) integer rec_val) :=
657ts_PDU_GTP2C(omit, '000000'O, '01'O, {
658 echoRequest := {
659 recovery := {
660 elementIdentifier := '03'O,
661 lengthIndicator := 0,
662 instance := '0000'B,
663 spare := '0000'B,
664 recoveryValue := rec_val
665 },
666 sendingNodeFeatures := omit,
667 privateExtension := omit
668 }});
Harald Welte0f7d03a2019-07-16 19:43:32 +0900669template (present) PDU_GTPCv2
Harald Welte88b3ccb2020-03-12 21:36:32 +0100670tr_GTP2C_EchoReq(template (present) OCT3 seq := ?) :=
671tr_PDU_GTP2C(omit, seq, { echoRequest := ? }, omit);
672
673template (value) PDU_GTPCv2
674ts_GTP2C_EchoResp(template (value) integer rec_val) :=
675ts_PDU_GTP2C(omit, '000000'O, '02'O, {
676 echoRequest := {
677 recovery := {
678 elementIdentifier := '03'O,
679 lengthIndicator := 0,
680 instance := '0000'B,
681 spare := '0000'B,
682 recoveryValue := rec_val
683 },
684 sendingNodeFeatures := omit,
685 privateExtension := omit
686 }});
687template (present) PDU_GTPCv2
688tr_GTP2C_EchoResp(template (present) OCT3 seq := ?) :=
689tr_PDU_GTP2C(omit, seq, { echoResponse := ? }, omit);
690
691
692
693template (present) PDU_GTPCv2
694ts_GTP2C_CreateSessionReq(template (value) hexstring imsi, template (omit) hexstring msisdn,
695 integer rat_type, template (value) FullyQualifiedTEID sender_fteid,
696 template (value) octetstring apn, template (value) BIT3 pdn_type,
697 template (omit) FullyQualifiedTEID_List teid_list,
698 template (value) OCT2 chg_car, template (value) uint4_t bearer_id,
699 template (value) Bearer_QoS qos := ts_GTP2C_BearerQos('09'O, 0,0,0,0)) :=
700ts_PDU_GTP2C('00000000'O, '000000'O, '20'O, {
701 createSessionRequest := {
702 iMSI := ts_GTP2C_Imsi(imsi),
703 mSISDN := fs_GTP2C_msisdn(msisdn),
704 mEI := omit,
705 userLocationInfo := omit,
706 servingNetwork := omit,
707 rAT_Type := ts_GTP2C_RatType(rat_type),
708 indication := omit,
709 fullyQualifiedTEID := { sender_fteid },
710 accessPointName := ts_GTP2C_APN(apn),
711 selectionMode := ts_GTP2C_SelectionMode(0),
712 pDN_Type := ts_GTP2C_PdnType(pdn_type),
713 pDN_AddressAllocation := ts_GTP2C_PdnAddrAlloc('001'B, {iPv4_Address:='00000000'O}),
714 maxAPN_Restriction := ts_GTP2C_ApnRestriction(0),
715 ambr := ts_GTP2C_Ambr(102400, 102400),
716 linkedEPS_Bearer_ID := omit,
717 trustedWLANModeIndication := omit,
718 protocolConfigOptions := omit,
719 bearerContextGrouped := {
720 ts_GTP2C_BcGrouped({
721 ePS_Bearer_ID := ts_GTP2C_EpsBearerId(bearer_id),
722 cause := omit,
723 ePS_Bearer_TFT := omit,
724 fullyQualifiedTEID := teid_list,
725 bearerLevel_QoS := qos,
726 chargingID := omit,
727 bearerFlags := omit,
728 transactionIdentifier := omit,
729 protocolConfigOptions := omit,
730 rAN_NASCause := omit,
731 additionalProtocolConfigOptions := omit,
732 extendedProtocolConfigOptions := omit
733 })
734 },
735 traceInformation := omit,
736 recovery := omit,
737 csid := omit,
738 uE_TimeZone := omit,
739 user_CSG_Information := omit,
740 chargingCharacteristics := ts_GTP2C_ChargingCaracteristics(chg_car),
741 lDN := omit,
742 signallingPriorityIndication := omit,
743 iP_Addr := omit,
744 portNumber := omit,
745 aPCO := omit,
746 trustedWLANAccessNetworkIdentifier := omit,
747 cNOperatorSelectionEntity := omit,
748 presenceReportingAreaInformation := omit,
749 overloadControlInformationGrouped := omit,
750 originationTimeStamp := omit,
751 maximumWaitTime := omit,
752 wLANLocationTimestamp := omit,
753 nBIFOMContainer := omit,
754 remoteUEContextGrouped := omit,
755 nodeIdentifier := omit,
756 extendedProtocolConfigOptions := omit,
757 servingPLMNRateControl := omit,
758 counter := omit,
759 privateExtension := omit
760 }});
761
762
763template (present) PDU_GTPCv2
Pau Espin Pedrol90a46c42023-10-19 13:44:44 +0200764tr_GTP2C_CreateSessionReq(template (present) hexstring imsi := ?, template (present) octetstring apn := ?) :=
Harald Welte88b3ccb2020-03-12 21:36:32 +0100765tr_PDU_GTP2C('00000000'O, ?, {
Harald Welte0f7d03a2019-07-16 19:43:32 +0900766 createSessionRequest := {
767 iMSI := tr_GTP2C_Imsi(imsi),
768 mSISDN := *,
769 mEI := *,
Pau Espin Pedrol90a46c42023-10-19 13:44:44 +0200770 userLocationInfo := *,
771 servingNetwork := *,
772 rAT_Type := tr_GTP2C_RatType(?),
Harald Welte0f7d03a2019-07-16 19:43:32 +0900773 indication := *,
774 fullyQualifiedTEID := ?,
Pau Espin Pedrol90a46c42023-10-19 13:44:44 +0200775 accessPointName := tr_GTP2C_APN(apn), // '*'
Harald Welte0f7d03a2019-07-16 19:43:32 +0900776 selectionMode := ?,
Pau Espin Pedrol90a46c42023-10-19 13:44:44 +0200777 pDN_Type := *,
Harald Welte0f7d03a2019-07-16 19:43:32 +0900778 pDN_AddressAllocation := ?,
Pau Espin Pedrol90a46c42023-10-19 13:44:44 +0200779 maxAPN_Restriction := *,
Harald Welte0f7d03a2019-07-16 19:43:32 +0900780 ambr := *,
781 linkedEPS_Bearer_ID := omit,
782 trustedWLANModeIndication := omit,
783 protocolConfigOptions := omit,
784 bearerContextGrouped := ?,
785 traceInformation := *,
Pau Espin Pedrol90a46c42023-10-19 13:44:44 +0200786 recovery := *,
Harald Welte0f7d03a2019-07-16 19:43:32 +0900787 csid := omit,
Pau Espin Pedrol90a46c42023-10-19 13:44:44 +0200788 uE_TimeZone := *,
Harald Welte0f7d03a2019-07-16 19:43:32 +0900789 user_CSG_Information := omit,
Pau Espin Pedrol90a46c42023-10-19 13:44:44 +0200790 chargingCharacteristics := *,
Harald Welte0f7d03a2019-07-16 19:43:32 +0900791 lDN := omit,
792 signallingPriorityIndication := *,
793 iP_Addr := omit,
794 portNumber := omit,
Pau Espin Pedrol90a46c42023-10-19 13:44:44 +0200795 aPCO := *,
Harald Welte0f7d03a2019-07-16 19:43:32 +0900796 trustedWLANAccessNetworkIdentifier := omit,
797 cNOperatorSelectionEntity := omit,
798 presenceReportingAreaInformation := omit,
799 overloadControlInformationGrouped := omit,
800 originationTimeStamp := *,
801 maximumWaitTime := *,
802 wLANLocationTimestamp := omit,
803 nBIFOMContainer := omit,
804 remoteUEContextGrouped := *,
805 nodeIdentifier := *,
806 extendedProtocolConfigOptions := omit,
807 servingPLMNRateControl := omit,
808 counter := omit,
809 privateExtension := omit
810 }});
811
812template (value) PDU_GTPCv2
813ts_GTP2C_CreateSessionResp(template (value) FullyQualifiedTEID_List fteids,
814 template (value) PDN_AddressAllocation addr) :=
Harald Welte88b3ccb2020-03-12 21:36:32 +0100815ts_PDU_GTP2C('00000000'O, '000000'O, '21'O, {
Harald Welte0f7d03a2019-07-16 19:43:32 +0900816 createSessionResponse := {
Pau Espin Pedrol1344e472023-10-23 19:54:29 +0200817 cause := ts_GTP2C_Cause(Request_accepted, '0'B),
Harald Welte0f7d03a2019-07-16 19:43:32 +0900818 changeReportingAction := omit,
819 cSG_InformationReportingAction := omit,
820 heNBInformationReporting := omit,
821 fullyQualifiedTEID := fteids,
822 pDN_AddressAllocation := addr,
823 aPN_Restriction := omit,
824 ambr := omit,
825 linkedEPS_Bearer_ID := omit,
826 protocolConfigOptions := omit,
827 bearerContextGrouped := omit,
828 recovery := omit,
829 chargingGatewayName := omit,
830 chargingGatewayAddress := omit,
831 csid := omit,
832 lDN := omit,
833 pGW_Back_OffTime := omit,
834 aPCO := omit,
835 trustedWLANIPv4Parameters := omit,
836 indicationFlags := omit,
837 presenceReportingAreaAction := omit,
838 loadControlInformationGrouped := omit,
839 overloadControlInformationGrouped := omit,
840 nBIFOMContainer := omit,
841 pDNConnectionChargingID := omit,
842 extendedProtocolConfigOptions := omit,
843 privateExtension := omit
844 }});
Harald Welte88b3ccb2020-03-12 21:36:32 +0100845template (present) PDU_GTPCv2
846tr_GTP2C_CreateSessionResp(template (present) OCT4 d_teid := ?,
847 template (present) OCT3 seq := ?,
Pau Espin Pedrol1344e472023-10-23 19:54:29 +0200848 template (present) GTP2C_Cause cause := ?,
Harald Welte88b3ccb2020-03-12 21:36:32 +0100849 template FullyQualifiedTEID_List fteids := *,
850 template PDN_AddressAllocation addr := *,
851 template BearerContextGrouped_List bctxg := *) :=
852tr_PDU_GTP2C(d_teid, seq, {
853 createSessionResponse := {
854 cause := tr_GTP2C_Cause(cause),
855 changeReportingAction := *,
856 cSG_InformationReportingAction := *,
857 heNBInformationReporting := *,
858 fullyQualifiedTEID := fteids,
859 pDN_AddressAllocation := addr,
860 aPN_Restriction := ?,
861 ambr := *,
862 linkedEPS_Bearer_ID := *,
863 protocolConfigOptions := *,
864 bearerContextGrouped := bctxg,
865 recovery := *,
866 chargingGatewayName := *,
867 chargingGatewayAddress := *,
868 csid := *,
869 lDN := *,
870 pGW_Back_OffTime := *,
871 aPCO := *,
872 trustedWLANIPv4Parameters := *,
873 indicationFlags := *,
874 presenceReportingAreaAction := *,
875 loadControlInformationGrouped := *,
876 overloadControlInformationGrouped := *,
877 nBIFOMContainer := *,
878 pDNConnectionChargingID := *,
879 extendedProtocolConfigOptions := *,
880 privateExtension := *
881 }});
882
883
884template (value) PDU_GTPCv2
885ts_GTP2C_DeleteSessionReq(template (value) OCT4 d_teid,
Pau Espin Pedrol1344e472023-10-23 19:54:29 +0200886 template (omit) GTP2C_Cause cause := omit,
Harald Welte88b3ccb2020-03-12 21:36:32 +0100887 template (value) FullyQualifiedTEID sender_fteid,
888 template (omit) FullyQualifiedTEID_List teid_list := omit,
889 template (value) uint4_t bearer_id) :=
890ts_PDU_GTP2C(d_teid, '000000'O, '24'O, {
891 deleteSessionRequest := {
892 cause := fs_GTP2C_Cause(cause, '0'B),
893 linkedEPS_Bearer_ID := ts_GTP2C_EpsBearerId(bearer_id),
894 uLI := omit,
895 indicationFlags := omit,
896 protocolConfigOptions := omit,
897 originatingNode := omit,
898 fullyQualifiedTEID := sender_fteid,
899 uE_TimeZone := omit,
900 uLITimestamp := omit,
901 rANNASReleaseCause := omit,
902 trustedWLANAccessNetworkIdentifier := omit,
903 tWANIdentifierTimestamp := omit,
904 overloadControlInformationGrouped := omit,
905 uELocalIP_Addr := omit,
906 portNumber := omit,
907 extendedProtocolConfigOptions := omit,
908 privateExtension := omit
909 }});
910template (present) PDU_GTPCv2
911tr_GTP2C_DeleteSessionReq(template (present) OCT4 d_teid,
912 template (present) OCT3 seq := ?,
Pau Espin Pedrol1344e472023-10-23 19:54:29 +0200913 template (omit) GTP2C_Cause cause,
Harald Welte88b3ccb2020-03-12 21:36:32 +0100914 template (present) FullyQualifiedTEID sender_fteid,
915 template FullyQualifiedTEID_List teid_list,
916 template (present) uint4_t bearer_id) :=
917tr_PDU_GTP2C(d_teid, seq, {
918 deleteSessionRequest := {
919 cause := fr_GTP2C_Cause(cause),
920 linkedEPS_Bearer_ID := tr_GTP2C_EpsBearerId(bearer_id),
921 uLI := *,
922 indicationFlags := *,
923 protocolConfigOptions := *,
924 originatingNode := *,
925 fullyQualifiedTEID := sender_fteid,
926 uE_TimeZone := *,
927 uLITimestamp := *,
928 rANNASReleaseCause := *,
929 trustedWLANAccessNetworkIdentifier := *,
930 tWANIdentifierTimestamp := *,
931 overloadControlInformationGrouped := *,
932 uELocalIP_Addr := *,
933 portNumber := *,
934 extendedProtocolConfigOptions := *,
935 privateExtension := *
936 }});
937
938
939template (value) PDU_GTPCv2
940ts_GTP2C_DeleteSessionResp(template (value) OCT4 d_teid,
941 template (value) OCT3 seq,
Pau Espin Pedrol1344e472023-10-23 19:54:29 +0200942 template (value) GTP2C_Cause cause) :=
Harald Welte88b3ccb2020-03-12 21:36:32 +0100943ts_PDU_GTP2C(d_teid, '000000'O, '25'O, {
944 deleteSessionResponse := {
945 cause := ts_GTP2C_Cause(cause, '0'B),
946 recovery := omit,
947 protocolConfigOptions := omit,
948 indicationFlags := omit,
949 loadControlInformationGrouped := omit,
950 overloadControlInformationGrouped := omit,
951 extendedProtocolConfigOptions := omit,
952 privateExtension := omit
953
954 }});
955template (present) PDU_GTPCv2
956tr_GTP2C_DeleteSessionResp(template (present) OCT4 d_teid,
957 template (present) OCT3 seq := ?,
Pau Espin Pedrol1344e472023-10-23 19:54:29 +0200958 template (present) GTP2C_Cause cause := ?
Harald Welte88b3ccb2020-03-12 21:36:32 +0100959 ) :=
960tr_PDU_GTP2C(d_teid, seq, {
961 deleteSessionResponse := {
962 cause := tr_GTP2C_Cause(cause),
963 recovery := *,
964 protocolConfigOptions := *,
965 indicationFlags := *,
966 loadControlInformationGrouped := *,
967 overloadControlInformationGrouped := *,
968 extendedProtocolConfigOptions := *,
969 privateExtension := *
970 }});
971
972template (value) PDU_GTPCv2
973ts_GTP2C_CreateBearerReq(template (value) OCT4 d_teid,
974 template (value) integer proc_trans_id,
975 template (value) uint4_t linked_id,
976 template (value) uint4_t bearer_id,
977 template (omit) FullyQualifiedTEID_List teid_list,
978 template (value) Bearer_QoS qos := ts_GTP2C_BearerQos('09'O, 0,0,0,0)) :=
979ts_PDU_GTP2C(d_teid, '000000'O, '5F'O, {
980 createBearerRequest := {
981 procedureTransactionID := ts_GTP2C_ProcTransId(proc_trans_id),
982 linkedEPS_BearerID := ts_GTP2C_EpsBearerId(linked_id),
983 protocolConfigOptions := omit,
984 bearerContextGrouped := {
985 ts_GTP2C_BcGrouped({
986 ePS_Bearer_ID := ts_GTP2C_EpsBearerId(bearer_id),
987 cause := omit,
988 ePS_Bearer_TFT := omit,
989 fullyQualifiedTEID := teid_list,
990 bearerLevel_QoS := qos,
991 chargingID := omit,
992 bearerFlags := omit,
993 transactionIdentifier := omit,
994 protocolConfigOptions := omit,
995 rAN_NASCause := omit,
996 additionalProtocolConfigOptions := omit,
997 extendedProtocolConfigOptions := omit
998 })
999 },
1000 csid := omit,
1001 changeReportingAction := omit,
1002 cSG_InformationReportingAction := omit,
1003 heNBInformationReporting := omit,
1004 presenceReportingAreaAction := omit,
1005 indicationFlags := omit,
1006 loadControlInformationGrouped := omit,
1007 overloadControlInformationGrouped := omit,
1008 nBIFOMContainer := omit,
1009 privateExtension := omit
1010 }});
1011
1012
1013template (value) PDU_GTPCv2
1014ts_GTP2C_DeleteBearerReq(template (value) OCT4 d_teid,
1015 template (value) integer proc_trans_id,
1016 template (value) uint4_t bearer_id,
Pau Espin Pedrol1344e472023-10-23 19:54:29 +02001017 template (value) GTP2C_Cause cause) :=
Harald Welte88b3ccb2020-03-12 21:36:32 +01001018ts_PDU_GTP2C(d_teid, '000000'O, '63'O, {
1019 deleteBearerRequest := {
1020 epsBearerIdentity := { ts_GTP2C_EpsBearerId(bearer_id) },
1021 bearerContextGrouped := omit,
1022 procedureTransactionID := ts_GTP2C_ProcTransId(proc_trans_id),
1023 protocolConfigOptions := omit,
1024 csid := omit,
1025 cause := ts_GTP2C_Cause(cause, '0'B),
1026 indicationFlags := omit,
1027 loadControlInformationGrouped := omit,
1028 overloadControlInformationGrouped := omit,
1029 nBIFOMContainer := omit,
1030 extendedProtocolConfigOptions := omit,
1031 privateExtension := omit
1032 }});
1033
1034
1035template (present) PDU_GTPCv2
1036tr_GTP2C_DeleteBearerResp(template (present) OCT4 d_teid,
1037 template (present) OCT3 seq := ?,
Pau Espin Pedrol1344e472023-10-23 19:54:29 +02001038 template (present) GTP2C_Cause cause := ?) :=
Harald Welte88b3ccb2020-03-12 21:36:32 +01001039tr_PDU_GTP2C(d_teid, seq, {
1040 deleteBearerResponse := {
1041 cause := tr_GTP2C_Cause(cause),
1042 linkedBearerIdentity := *,
1043 bearerContextGrouped := *,
1044 recovery := *,
1045 csid := *,
1046 protocolConfigOptions := *,
1047 uE_TimeZone := *,
1048 uLI := *,
1049 uLITimestamp := *,
1050 trustedWLANAccessNetworkIdentifier := *,
1051 tWANIdentifierTimestamp := *,
1052 overloadControlInformationGrouped := *,
1053 iP_Addr := *,
1054 portNumber := *,
1055 nBIFOMContainer := *,
1056 privateExtension := *
1057 }});
Harald Welte0f7d03a2019-07-16 19:43:32 +09001058
Vadim Yanitskiybada3c92022-01-20 18:59:07 +06001059/* 8.18 */
1060template (value) ServingNetwork
1061ts_GTP2C_ServingNetwork(template (value) hexstring mcc,
1062 template (value) hexstring mnc,
1063 template (value) BIT4 instance := '0000'B) :=
1064{
1065 elementIdentifier := '53'O,
1066 lengthIndicator := 0, /* overwritten */
1067 instance := instance,
1068 spare := '0000'B,
1069 mccDigit1 := mcc[0],
1070 mccDigit2 := mcc[1],
1071 mccDigit3 := mcc[2],
1072 mncDigit3 := mnc[2], /* 'F'H for 2 digit MNC */
1073 mncDigit1 := mnc[0],
1074 mncDigit2 := mnc[1],
1075 additionalOctets := omit
1076}
1077
Harald Welte0f7d03a2019-07-16 19:43:32 +09001078
1079
1080}