blob: 944d857348527ec494859dab9e79ed0c2e8a683a [file] [log] [blame]
Pau Espin Pedrol53aa61d2023-12-21 19:10:45 +01001/* 3GPP TS 24.301, EPC (Evolved Packet Core) NAS (Non-Access Stratum) templates in TTCN-3
Harald Weltefc5f6372019-07-09 14:10:05 +08002 * (C) 2019 Harald Welte <laforge@gnumonks.org>
3 * All rights reserved.
4 *
5 * Released under the terms of GNU General Public License, Version 2 or
6 * (at your option) any later version.
7 *
8 * SPDX-License-Identifier: GPL-2.0-or-later
9 */
10
11module NAS_Templates {
12
13import from General_Types all;
14import from NAS_EPS_Types all;
15
16template (value) PDU_NAS_EPS
17ts_NAS_SM(template (value) EPS_SessionManagement sm) := {
18 protocolDiscriminator := '0010'B,
19 ePS_messages := {
20 ePS_SessionManagement := sm
21 }
22}
23template (present) PDU_NAS_EPS
24tr_NAS_SM(template (present) EPS_SessionManagement sm) := {
25 protocolDiscriminator := '0010'B,
26 ePS_messages := {
27 ePS_SessionManagement := sm
28 }
29}
30
31template (value) PDU_NAS_EPS
32ts_NAS_MM(template (value) EPS_MobilityManagement mm) := {
33 protocolDiscriminator := c_EPS_NAS_PD_EMM,
34 ePS_messages := {
35 ePS_MobilityManagement := mm
36 }
37}
38template (present) PDU_NAS_EPS
39tr_NAS_MM(template (present) EPS_MobilityManagement mm) := {
40 protocolDiscriminator := c_EPS_NAS_PD_EMM,
41 ePS_messages := {
42 ePS_MobilityManagement := mm
43 }
44}
45
46const BIT4 c_EPS_SEC_NONE := '0000'B;
47const BIT4 c_EPS_NAS_PD_EMM := '0111'B;
48const BIT4 c_EPS_NAS_PD_ESM := '0010'B;
49
50private template (value) ESM_MessageContainerLVE
51ts_NAS_EsmMsgContLVE(template (value) octetstring inp) := {
52 lengthIndicator := 0,
53 content := inp
54}
55private template (present) ESM_MessageContainerLVE
56tr_NAS_EsmMsgContLVE(template (present) octetstring inp) := {
57 lengthIndicator := ?,
58 content := inp
59}
60
61private template (value) MobileIdentityLV
62ts_NAS_MobileIdLV(template (value) MobileIdentityV mid) := {
63 lengthIndicator := 0,
64 mobileIdentityV := mid
65}
66private template (present) MobileIdentityLV
67tr_NAS_MobileIdLV(template (present) MobileIdentityV mid) := {
68 lengthIndicator := ?,
69 mobileIdentityV := mid
70}
71
72private function f_enc_IMSI_NAS(hexstring digits) return IMSI {
73 var IMSI l3;
74 var integer len := lengthof(digits);
75 if (len rem 2 == 1) { /* modulo remainder */
76 l3.oddevenIndicator := '1'B;
77 l3.fillerDigit := omit;
78 } else {
79 l3.oddevenIndicator := '0'B;
80 l3.fillerDigit := '1111'B;
81 }
82 l3.digits := digits;
83 return l3;
84}
85
86private function f_enc_IMEI_NAS(hexstring digits) return IMEI {
87 var IMEI l3;
88 var integer len := lengthof(digits);
89 if (len rem 2 == 1) { /* modulo remainder */
90 l3.oddevenIndicator := '1'B;
91 } else {
92 l3.oddevenIndicator := '0'B;
93 }
94 l3.digits := digits;
95 return l3;
96}
97
98private function f_enc_IMEI_SV(hexstring digits) return IMEI_SV {
99 var IMEI_SV l3;
100 var integer len := lengthof(digits);
101 if (len rem 2 == 1) { /* modulo remainder */
102 l3.oddevenIndicator := '1'B;
103 } else {
104 l3.oddevenIndicator := '0'B;
105 }
106 l3.digits := digits;
107 l3.fillerDigit := '1111'B;
108 return l3;
109}
110
111template (value) GUTI ts_NAS_GUTI(hexstring mcc_mnc, OCT2 mmegi, OCT1 mmec, OCT4 tmsi) := {
112 oddevenIndicator := '0'B,
113 spare := '1111'B,
Philipp Maier68cf9472023-08-31 17:42:13 +0200114 /* use the mcc_mnc format as specified in 3GPP TS 24.301, figure 9.9.3.12.1.
115 * Example: mcc=262, mnc=42 => 262f42.
116 * mcc=001, mnc=01 => 001f01. */
Harald Weltefc5f6372019-07-09 14:10:05 +0800117 mccDigit1 := mcc_mnc[0],
118 mccDigit2 := mcc_mnc[1],
119 mccDigit3 := mcc_mnc[2],
Philipp Maier68cf9472023-08-31 17:42:13 +0200120 mncDigit3 := mcc_mnc[3],
121 mncDigit1 := mcc_mnc[4],
122 mncDigit2 := mcc_mnc[5],
Harald Weltefc5f6372019-07-09 14:10:05 +0800123 mMEGI := mmegi,
124 mMEC := mmec,
125 mTMSI := tmsi
126}
127
128template (value) EPS_MobileIdentityV
129ts_NAS_MobileId_IMSI(hexstring imsi) := {
130 typeOfIdentity := '001'B,
131 oddEvenInd_identity := {
132 imsi := f_enc_IMSI_NAS(imsi)
133 }
134}
135
136template (value) EPS_MobileIdentityV
137ts_NAS_MobileId_IMEI(hexstring imei) := {
138 typeOfIdentity := '011'B,
139 oddEvenInd_identity := {
140 imei := f_enc_IMEI_NAS(imei)
141 }
142}
143
144template (value) EPS_MobileIdentityV
Pau Espin Pedrola94e8232024-01-09 10:27:16 +0100145ts_NAS_MobileId_GUTI_fields(hexstring mcc_mnc, OCT2 mmegi, OCT1 mmec, OCT4 tmsi) := {
Harald Weltefc5f6372019-07-09 14:10:05 +0800146 typeOfIdentity := '110'B,
147 oddEvenInd_identity := {
148 guti := ts_NAS_GUTI(mcc_mnc, mmegi, mmec, tmsi)
149 }
150}
151
Pau Espin Pedrola94e8232024-01-09 10:27:16 +0100152template (value) EPS_MobileIdentityV
153ts_NAS_MobileId_GUTI(template (value) GUTI guti) := {
154 typeOfIdentity := '110'B,
155 oddEvenInd_identity := {
156 guti := guti
157 }
158}
159
Philipp Maier3e582452023-08-31 17:47:50 +0200160/* 9.9.3.12 EPS mobile identity */
161template (value) EPS_MobileIdentityLV
162ts_EPS_MobileId_IMSI(hexstring imsi) := {
163 ePS_MobileIdentity := ts_NAS_MobileId_IMSI(imsi)
164}
165
166template (value) EPS_MobileIdentityLV
167ts_EPS_MobileId_IMEI(hexstring imei) := {
168 ePS_MobileIdentity := ts_NAS_MobileId_IMEI(imei)
169}
170
171template (value) EPS_MobileIdentityLV
172ts_EPS_MobileId_GUTI(hexstring mcc_mnc, OCT2 mmegi, OCT1 mmec, OCT4 tmsi) := {
Pau Espin Pedrola94e8232024-01-09 10:27:16 +0100173 ePS_MobileIdentity := ts_NAS_MobileId_GUTI_fields(mcc_mnc, mmegi, mmec, tmsi)
174}
175
176template (value) EPS_MobileIdentityLV
177ts_EPS_MobileId_GUTI_(template (value) GUTI guti) := {
178 ePS_MobileIdentity := ts_NAS_MobileId_GUTI(guti)
179}
180
181/* 9.9.3.26 P-TMSI signature */
182template (value) P_TMSISignatureTV
183ts_PTMSI_SignatureTV(template (value) OCT3 ptmsi_sig) := {
184 elementIdentifier := '19'O,
185 valueField := ptmsi_sig
186}
187
188/* 9.9.3.45 GUTI Type */
189const BIT1 GUTI_TYPE_NATIVE := '0'B;
190const BIT1 GUTI_TYPE_MAPPED := '1'B;
191template (value) GUTI_TypeTV
192ts_GUTI_TypeTV(template (value) BIT1 guti_type) := {
193 gUTI_Type := guti_type,
194 spare := '000'B,
195 elementIdentifier := '1110'B
Philipp Maier3e582452023-08-31 17:47:50 +0200196}
197
Harald Weltefc5f6372019-07-09 14:10:05 +0800198template (value) PDU_NAS_EPS
199ts_NAS_EMM_SecurityProtected(BIT4 sec_hdr_t, integer seq_nr, octetstring inner_nas) := {
200 protocolDiscriminator := c_EPS_NAS_PD_EMM,
201 ePS_messages := {
202 ePS_MobilityManagement := {
203 pDU_NAS_EPS_SecurityProtectedNASMessage := {
204 securityHeaderType := sec_hdr_t,
205 messageAuthenticationCode := '00000000'O,
206 sequenceNumber := seq_nr,
207 nAS_Message := inner_nas
208 }
209 }
210 }
211}
212template (present) PDU_NAS_EPS
213tr_NAS_EMM_SecurityProtected := {
214 protocolDiscriminator := c_EPS_NAS_PD_EMM,
215 ePS_messages := {
216 ePS_MobilityManagement := {
217 pDU_NAS_EPS_SecurityProtectedNASMessage := ?
218 }
219 }
220}
221
222const BIT3 NAS_PDN_T_IPv4 := '001'B;
223const BIT3 NAS_PDN_T_IPv6 := '010'B;
224const BIT3 NAS_PDN_T_IPv4v6 := '011'B;
225const BIT3 NAS_PDN_T_NonIP := '101'B;
226
227
228/*********************************************************************************
229 * Mobility Management
230 *********************************************************************************/
231
232/* 8.2.1 Attach Accept */
233template (value) PDU_NAS_EPS
234ts_NAS_AttachAccept(template (value) EPS_AttachResultV result,
235 template (value) GPRSTimerV t3412,
236 template (value) TAI_Lists tai_lists,
237 template (value) octetstring esm_enc) := {
238 protocolDiscriminator := c_EPS_NAS_PD_EMM,
239 ePS_messages := {
240 ePS_MobilityManagement := {
241 pDU_NAS_EPS_AttachAccept := {
242 securityHeaderType := c_EPS_SEC_NONE,
243 messageType := '01000010'B,
244 ePS_AttachResult := result,
245 spare := '0000'B,
246 t3412 := t3412,
247 tAI_List := {
248 lengthIndicator := 0,
249 trackingAreaIdentityLists := tai_lists
250 },
251 eSM_MessageContainer := ts_NAS_EsmMsgContLVE(esm_enc),
252 gUTI := omit,
253 locationAreaIdentification := omit,
254 msIdentity := omit,
255 eMMCause := omit,
256 t3402 := omit,
257 t3423 := omit,
258 equivalentPLMNs := omit,
259 emergencyNumberList := omit,
260 ePS_NetworkFeatureSupport := omit,
261 additionalUpdateResult := omit,
262 t3412_Extended := omit,
263 t3324 := omit,
264 extendedDRXParameters := omit,
265 dNCID := omit,
266 sMS_ServiceStatus := omit,
267 non3GPP_NW_ProvidedPolicies := omit,
268 t3448 := omit,
269 networkPolicy := omit,
270 t3447 := omit,
271 extendedEmergencyNumberList := omit
272 }
273 }
274 }
275}
276template (present) PDU_NAS_EPS
277tr_NAS_AttachAccept(template (present) EPS_AttachResultV result := ?,
278 template (present) GPRSTimerV t3412 := ?,
279 template (present) TAI_Lists tai_lists := ?,
280 template (present) octetstring esm_enc := ?) := {
281 protocolDiscriminator := c_EPS_NAS_PD_EMM,
282 ePS_messages := {
283 ePS_MobilityManagement := {
284 pDU_NAS_EPS_AttachAccept := {
285 securityHeaderType := c_EPS_SEC_NONE,
286 messageType := '01000010'B,
287 ePS_AttachResult := result,
288 spare := ?,
289 t3412 := t3412,
290 tAI_List := {
291 lengthIndicator := ?,
292 trackingAreaIdentityLists := tai_lists
293 },
294 eSM_MessageContainer := tr_NAS_EsmMsgContLVE(esm_enc),
295 gUTI := *,
296 locationAreaIdentification := *,
297 msIdentity := *,
298 eMMCause := *,
299 t3402 := *,
300 t3423 := *,
301 equivalentPLMNs := *,
302 emergencyNumberList := *,
303 ePS_NetworkFeatureSupport := *,
304 additionalUpdateResult := *,
305 t3412_Extended := *,
306 t3324 := *,
307 extendedDRXParameters := *,
308 dNCID := *,
309 sMS_ServiceStatus := *,
310 non3GPP_NW_ProvidedPolicies := *,
311 t3448 := *,
312 networkPolicy := *,
313 t3447 := *,
314 extendedEmergencyNumberList := *
315 }
316 }
317 }
318}
319
320
321/* 8.2.2 Attach Complete */
322template (value) PDU_NAS_EPS
323ts_NAS_AttachComplete(template (value) octetstring esm_enc) := {
324 protocolDiscriminator := c_EPS_NAS_PD_EMM,
325 ePS_messages := {
326 ePS_MobilityManagement := {
327 pDU_NAS_EPS_AttachComplete := {
328 securityHeaderType := c_EPS_SEC_NONE,
329 messageType := '01000011'B,
330 eSM_MessageContainer := ts_NAS_EsmMsgContLVE(esm_enc)
331 }
332 }
333 }
334}
335template (present) PDU_NAS_EPS
336tr_NAS_AttachComplete(template (present) octetstring esm_enc := ?) := {
337 protocolDiscriminator := c_EPS_NAS_PD_EMM,
338 ePS_messages := {
339 ePS_MobilityManagement := {
340 pDU_NAS_EPS_AttachComplete := {
341 securityHeaderType := c_EPS_SEC_NONE,
342 messageType := '01000011'B,
343 eSM_MessageContainer := tr_NAS_EsmMsgContLVE(esm_enc)
344 }
345 }
346 }
347}
348
Philipp Maier9e796582023-08-31 17:52:42 +0200349/* 9.9.3.14 EPS update type */
350const BIT3 c_EPS_UPD_TYPE_TA_UPD := '000'B;
351const BIT3 c_EPS_UPD_TYPE_COMB_TA_LA_UPD := '001'B;
352const BIT3 c_EPS_UPD_TYPE_COMB_TA_LA_UPD_IMSI_ATTACH := '010'B;
353const BIT3 c_EPS_UPD_TYPE_TA_UPD_PERIODIC := '011'B;
354template (value) EPS_UpdateTypeV ts_EPS_UpdateTypeV(BIT3 typeOfUpdate := c_EPS_UPD_TYPE_TA_UPD, BIT1 activeFlag := '0'B) := {
355 typeOfUpdate := typeOfUpdate,
356 activeFlag := activeFlag
357}
Harald Weltefc5f6372019-07-09 14:10:05 +0800358
Philipp Maier64bfc892023-08-31 17:54:28 +0200359/* 9.9.3.21 NAS key set identifier */
360const BIT3 c_NAS_KEY_SET_ID_NO_KEY := '111'B;
361const BIT1 c_NAS_TSC_NATIVE_SEC_CTX := '0'B;
362const BIT1 c_NAS_TSC_MAPPED_SEC_CTX := '1'B;
363template (value) NAS_KeySetIdentifierV ts_NAS_KeySetIdentifierV(BIT3 identifier := c_NAS_KEY_SET_ID_NO_KEY, BIT1 tSC := c_NAS_TSC_NATIVE_SEC_CTX) := {
364 identifier := identifier,
365 tSC := tSC
366}
367
Pau Espin Pedrolb5ad4ae2024-01-09 10:28:02 +0100368/* 8.2.26 Tracking Area Update Accept */
369template (present) PDU_NAS_EPS
370tr_PDU_NAS_EPS_TrackingAreaUpdateAccept := {
371 protocolDiscriminator := c_EPS_NAS_PD_EMM,
372 ePS_messages := {
373 ePS_MobilityManagement := {
374 pDU_NAS_EPS_TrackingAreaUpdateAccept := {
375 securityHeaderType := c_EPS_SEC_NONE,
376 messageType := '01001001'B,
377 updateResult := {
378 valueOfUpdateResult := ?,
379 spare := '0'B
380 },
381 spareHalfOctet := '0000'B,
382 t3412 := *,
383 gUTI := *,
384 tAI_List := *,
385 ePSBearerContextStatus := *,
386 locationAreaIdentification := *,
387 msIdentity := *,
388 eMMCause := *,
389 t3402 := *,
390 t3423 := *,
391 equivalentPLMNs := *,
392 emergencyNumberList := *,
393 ePS_NetworkFeatureSupport := *,
394 additionalUpdateResult := *,
395 t3412_Extended := *,
396 t3324 := *,
397 extendedDRXParameters := *,
398 headerCompressionConfigurationStatus := *,
399 dNCID := *,
400 sMS_ServiceStatus := *,
401 non3GPP_NW_ProvidedPolicies := *,
402 t3448 := *,
403 networkPolicy := *,
404 t3447 := *,
405 extendedEmergencyNumberList := *
406 }
407 }
408 }
409}
410
Philipp Maierc1d9ef02023-09-01 14:41:55 +0200411/* 8.2.28 Tracking Area Update Reject */
412template (present) PDU_NAS_EPS
413tr_PDU_NAS_EPS_TrackingAreaUpdateReject(template (present) EMM_CauseV cause := ?) := {
414 protocolDiscriminator := c_EPS_NAS_PD_EMM,
415 ePS_messages := {
416 ePS_MobilityManagement := {
417 pDU_NAS_EPS_TrackingAreaUpdateReject := {
418 securityHeaderType := c_EPS_SEC_NONE,
419 messageType := '01001011'B,
420 emmCause := cause,
421 t3346 := *,
422 extendedEmmCause := *
423 }
424 }
425 }
426}
427
Philipp Maierf155f6f2023-08-31 17:55:29 +0200428/* 8.2.29 Tracking Area Update Request */
429template (value) PDU_NAS_EPS
Pau Espin Pedrola94e8232024-01-09 10:27:16 +0100430ts_PDU_NAS_EPS_TrackingAreaUpdateRequest(template (value) EPS_MobileIdentityLV old_guti,
431 template (omit) P_TMSISignatureTV old_ptmsi_sig := omit,
432 template (omit) GUTI_TypeTV old_guti_type := omit) := {
Philipp Maierf155f6f2023-08-31 17:55:29 +0200433 protocolDiscriminator := c_EPS_NAS_PD_EMM,
434 ePS_messages := {
435 ePS_MobilityManagement := {
436 pDU_NAS_EPS_TrackingAreaUpdateRequest := {
437 securityHeaderType := c_EPS_SEC_NONE,
438 messageType := '01001000'B,
439 ePSupdateType := ts_EPS_UpdateTypeV,
440 nasKeySetId := ts_NAS_KeySetIdentifierV,
441 oldGUTI := old_guti,
442 nonCurrentNative_nasKeySetId := omit,
443 gprsCipheringKeySequenceNumber := omit,
Pau Espin Pedrola94e8232024-01-09 10:27:16 +0100444 old_P_TMSISignature := old_ptmsi_sig,
Philipp Maierf155f6f2023-08-31 17:55:29 +0200445 additionalGUTI := omit,
446 nonce := omit,
447 uENetworkCapability := omit,
448 lastVisitedRegisteredTAI := omit,
449 dRXParameter := omit,
450 uE_RadioCapabilityInfoUpdateNeeded := omit,
451 ePSBearerContextStatus := omit,
452 mSNetworkCapability := omit,
453 oldLocationAreaIdentification := omit,
454 tMSIStatusTV := omit,
455 mobileStationClassmark2 := omit,
456 mobileStationClassmark3 := omit,
457 supportedCodecList := omit,
458 additionalUpdateType := omit,
459 voiceDomainPrefandUEsettings := omit,
Pau Espin Pedrola94e8232024-01-09 10:27:16 +0100460 oldGUTI_Type := old_guti_type,
Philipp Maierf155f6f2023-08-31 17:55:29 +0200461 deviceProperties := omit,
462 mS_NetworkFeatureSupport := omit,
463 tMSIBasedNRIContainer := omit,
464 t3324 := omit,
465 t3412_Extended := omit,
466 extendedDRXParameters := omit,
467 uEAdditionalSecurityCapability := omit,
468 uEStatus := omit
469 }
470 }
471 }
472}
473
Harald Weltefc5f6372019-07-09 14:10:05 +0800474/* 8.2.3 Attach Reject */
475template (value) PDU_NAS_EPS
476ts_NAS_AttachReject(template (value) EMM_CauseV cause) := {
477 protocolDiscriminator := c_EPS_NAS_PD_EMM,
478 ePS_messages := {
479 ePS_MobilityManagement := {
480 pDU_NAS_EPS_AttachReject := {
481 securityHeaderType := c_EPS_SEC_NONE,
482 messageType := '01000100'B,
483 emmCause := cause,
484 eSM_MessageContainer := omit,
485 t3346 := omit,
486 t3402 := omit,
487 extendedEmmCause := omit
488 }
489 }
490 }
491}
492template (present) PDU_NAS_EPS
493tr_NAS_AttachReject(template (present) EMM_CauseV cause := ?) := {
494 protocolDiscriminator := c_EPS_NAS_PD_EMM,
495 ePS_messages := {
496 ePS_MobilityManagement := {
497 pDU_NAS_EPS_AttachReject := {
498 securityHeaderType := c_EPS_SEC_NONE,
499 messageType := '01000100'B,
500 emmCause := cause,
501 eSM_MessageContainer := omit,
502 t3346 := omit,
503 t3402 := omit,
504 extendedEmmCause := omit
505 }
506 }
507 }
508}
509
510/* 8.2.4 Attach Request */
511template (value) PDU_NAS_EPS
512ts_NAS_AttachRequest(template (value) BIT3 att_type,
513 template (value) BIT3 kset_id,
514 template (value) EPS_MobileIdentityV mobile_id,
515 template (value) UENetworkCapabilityV ue_net_cap,
516 template (value) octetstring esm_enc) := {
517 protocolDiscriminator := c_EPS_NAS_PD_EMM,
518 ePS_messages := {
519 ePS_MobilityManagement := {
520 pDU_NAS_EPS_AttachRequest := {
521 securityHeaderType := c_EPS_SEC_NONE,
522 messageType := '01000001'B,
523 ePS_attachType := {
524 typeOfAttach := att_type,
525 spare := '0'B
526 },
527 nasKeySetId := {
528 identifier := kset_id,
529 tSC := '1'B
530 },
531 ePSMobileId := {
532 lengthIndicator := 0,
533 ePS_MobileIdentity := mobile_id
534 },
535 uENetworkCapability := {
536 lengthIndicator := 0,
537 uENetworkCapabilityV := ue_net_cap
538 },
539 eSM_MessageContainer := ts_NAS_EsmMsgContLVE(esm_enc),
540 old_P_TMSISignature := omit,
541 additionalGUTI := omit,
542 lastVisitedRegisteredTAI := omit,
543 dRXParameter := omit,
544 mSNetworkCapability := omit,
545 oldLocationAreaIdentification := omit,
546 tMSIStatusTV := omit,
547 mobileStationClassmark2 := omit,
548 mobileStationClassmark3 := omit,
549 supportedCodecList := omit,
550 additionalUpdateType := omit,
551 voiceDomainPrefandUEsettings := omit,
552 deviceProperties := omit,
553 oldGUTI_Type := omit,
554 mS_NetworkFeatureSupport := omit,
555 tMSIBasedNRIContainer := omit,
556 t3324 := omit,
557 t3412_Extended := omit,
558 extendedDRXParameters := omit,
559 uEAdditionalSecurityCapability := omit
560 }
561 }
562 }
563}
564template (present) PDU_NAS_EPS
565tr_NAS_AttachRequest(template (present) BIT3 att_type := ?,
566 template (present) BIT3 kset_id := ?,
567 template (present) EPS_MobileIdentityV mobile_id := ?,
568 template (present) UENetworkCapabilityV ue_net_cap := ?,
569 template (present) octetstring esm_enc := ?) := {
570 protocolDiscriminator := c_EPS_NAS_PD_EMM,
571 ePS_messages := {
572 ePS_MobilityManagement := {
573 pDU_NAS_EPS_AttachRequest := {
574 securityHeaderType := ?,
575 messageType := '01000001'B,
576 ePS_attachType := {
577 typeOfAttach := att_type,
578 spare := ?
579 },
580 nasKeySetId := {
581 identifier := kset_id,
582 tSC := ?
583 },
584 ePSMobileId := {
585 lengthIndicator := ?,
586 ePS_MobileIdentity := mobile_id
587 },
588 uENetworkCapability := {
589 lengthIndicator := ?,
590 uENetworkCapabilityV := ue_net_cap
591 },
592 eSM_MessageContainer := tr_NAS_EsmMsgContLVE(esm_enc),
593 old_P_TMSISignature := *,
594 additionalGUTI := *,
595 lastVisitedRegisteredTAI := *,
596 dRXParameter := *,
597 mSNetworkCapability := *,
598 oldLocationAreaIdentification := *,
599 tMSIStatusTV := *,
600 mobileStationClassmark2 := *,
601 mobileStationClassmark3 := *,
602 supportedCodecList := *,
603 additionalUpdateType := *,
604 voiceDomainPrefandUEsettings := *,
605 deviceProperties := *,
606 oldGUTI_Type := *,
607 mS_NetworkFeatureSupport := *,
608 tMSIBasedNRIContainer := *,
609 t3324 := *,
610 t3412_Extended := *,
611 extendedDRXParameters := *,
612 uEAdditionalSecurityCapability := *
613 }
614 }
615 }
616}
617
618
619/* 8.2.5 Authentication Failure */
620template (value) PDU_NAS_EPS
621ts_NAS_AuthFail(template (value) EMM_CauseV cause /* template (omit) OCT14 auth_fail_par */) := {
622 protocolDiscriminator := c_EPS_NAS_PD_EMM,
623 ePS_messages := {
624 ePS_MobilityManagement := {
625 pDU_NAS_EPS_AuthenticationFailure := {
626 securityHeaderType := c_EPS_SEC_NONE,
627 messageType := '01011100'B,
628 emmCause := cause,
629 authenticationFailureParameter := omit
630 }
631 }
632 }
633}
634template (value) PDU_NAS_EPS
635ts_NAS_AuthFail_par(template (value) EMM_CauseV cause,
636 template (value) OCT14 auth_fail_par) := {
637 protocolDiscriminator := c_EPS_NAS_PD_EMM,
638 ePS_messages := {
639 ePS_MobilityManagement := {
640 pDU_NAS_EPS_AuthenticationFailure := {
641 securityHeaderType := c_EPS_SEC_NONE,
642 messageType := '01011100'B,
643 emmCause := cause,
644 authenticationFailureParameter := {
645 elementIdentifier := '30'O,
646 lengthIndicator := lengthof(auth_fail_par),
647 authenticationFailureParameter := auth_fail_par
648 }
649 }
650 }
651 }
652}
653
654/* 8.2.6 Authentication Reject */
655template (value) PDU_NAS_EPS
656ts_NAS_AuthRej := {
657 protocolDiscriminator := c_EPS_NAS_PD_EMM,
658 ePS_messages := {
659 ePS_MobilityManagement := {
660 pDU_NAS_EPS_AuthenticationReject := {
661 securityHeaderType := c_EPS_SEC_NONE,
662 messageType := '01010100'B
663 }
664 }
665 }
666}
667template (present) PDU_NAS_EPS
668tr_NAS_AuthRej := {
669 protocolDiscriminator := c_EPS_NAS_PD_EMM,
670 ePS_messages := {
671 ePS_MobilityManagement := {
672 pDU_NAS_EPS_AuthenticationReject := {
673 securityHeaderType := ?,
674 messageType := '01010100'B
675 }
676 }
677 }
678}
679
680/* 8.2.7 Authentication Request */
681template (value) PDU_NAS_EPS
682ts_NAS_AuthReq(template (value) NAS_KeySetIdentifierV kset_id,
683 OCT16 rand, OCT16 autn) := {
684 protocolDiscriminator := c_EPS_NAS_PD_EMM,
685 ePS_messages := {
686 ePS_MobilityManagement := {
687 pDU_NAS_EPS_AuthenticationRequest := {
688 securityHeaderType := c_EPS_SEC_NONE,
689 messageType := '01010010'B,
690 nasKeySetId := kset_id,
691 spare := '0000'B,
692 authenticationParameterRAND := {
693 rAND := rand
694 },
695 authenticationParameterAUTN := {
696 lengthIndicator := lengthof(autn),
697 aUTN := autn
698 }
699 }
700 }
701 }
702}
703template (present) PDU_NAS_EPS
704tr_NAS_AuthReq(template (present) NAS_KeySetIdentifierV kset_id := ?,
705 template (present) OCT16 rand := ?,
706 template (present) OCT16 autn := ?) := {
707 protocolDiscriminator := c_EPS_NAS_PD_EMM,
708 ePS_messages := {
709 ePS_MobilityManagement := {
710 pDU_NAS_EPS_AuthenticationRequest := {
711 securityHeaderType := ?,
712 messageType := '01010010'B,
713 nasKeySetId := kset_id,
714 spare := '0000'B,
715 authenticationParameterRAND := {
716 rAND := rand
717 },
718 authenticationParameterAUTN := {
719 lengthIndicator := ?,
720 aUTN := autn
721 }
722 }
723 }
724 }
725}
726
727/* 8.2.8 Authentication Response */
728template (value) PDU_NAS_EPS
729ts_NAS_AuthResp(octetstring res) := {
730 protocolDiscriminator := c_EPS_NAS_PD_EMM,
731 ePS_messages := {
732 ePS_MobilityManagement := {
733 pDU_NAS_EPS_AuthenticationResponse := {
734 securityHeaderType := c_EPS_SEC_NONE,
735 messageType := '01010011'B,
736 authenticationResponseParameter := {
737 lengthIndicator := lengthof(res),
738 authenticationResponseParameter := {
739 rES := res
740 }
741 }
742 }
743 }
744 }
745}
746template (present) PDU_NAS_EPS
747tr_NAS_AuthResp(template OCT16 res := ?) := {
748 protocolDiscriminator := c_EPS_NAS_PD_EMM,
749 ePS_messages := {
750 ePS_MobilityManagement := {
751 pDU_NAS_EPS_AuthenticationResponse := {
752 securityHeaderType := ?,
753 messageType := '01010011'B,
754 authenticationResponseParameter := {
755 lengthIndicator := ?,
756 authenticationResponseParameter := {
757 rES := res
758 }
759 }
760 }
761 }
762 }
763}
764
Pau Espin Pedrol53aa61d2023-12-21 19:10:45 +0100765/* 8.2.13 EMM information */
766template (present) PDU_NAS_EPS
767tr_NAS_EMMInformation := {
768 protocolDiscriminator := c_EPS_NAS_PD_EMM,
769 ePS_messages := {
770 ePS_MobilityManagement := {
771 pDU_NAS_EPS_EMM_Information := {
772 securityHeaderType := ?,
773 messageType := '01100001'B,
774 fullNameForNetwork := *,
775 shortNameForNetwork := *,
776 localTimeZone := *,
777 universalTimeAndLocalTimeZone := *,
778 networkDaylightSavingTime := *
779 }
780 }
781 }
782}
783
Harald Weltefc5f6372019-07-09 14:10:05 +0800784/* 8.2.18 Identity Request */
785template (value) PDU_NAS_EPS
786ts_NAS_IdentityReq(template (value) IdentityType2V id_type) := {
787 protocolDiscriminator := c_EPS_NAS_PD_EMM,
788 ePS_messages := {
789 ePS_MobilityManagement := {
790 pDU_NAS_EPS_IdentityRequest := {
791 securityHeaderType := c_EPS_SEC_NONE,
792 messageType := '01010101'B,
793 identityType := id_type,
794 spareHalfOctet := '0000'B
795 }
796 }
797 }
798}
799template (present) PDU_NAS_EPS
800tr_NAS_IdentityReq(template (present) IdentityType2V id_type := ?) := {
801 protocolDiscriminator := c_EPS_NAS_PD_EMM,
802 ePS_messages := {
803 ePS_MobilityManagement := {
804 pDU_NAS_EPS_IdentityRequest := {
805 securityHeaderType := c_EPS_SEC_NONE,
806 messageType := '01010101'B,
807 identityType := id_type,
808 spareHalfOctet := ?
809 }
810 }
811 }
812}
813
814/* 8.2.19 Identity Response */
815template (value) PDU_NAS_EPS
816ts_NAS_IdentityResp(template (value) MobileIdentityV mobile_id) := {
817 protocolDiscriminator := c_EPS_NAS_PD_EMM,
818 ePS_messages := {
819 ePS_MobilityManagement := {
820 pDU_NAS_EPS_IdentityResponse := {
821 securityHeaderType := c_EPS_SEC_NONE,
822 messageType := '01010110'B,
823 mobileIdentity := ts_NAS_MobileIdLV(mobile_id)
824 }
825 }
826 }
827}
828template (present) PDU_NAS_EPS
829tr_NAS_IdentityResp(template (present) MobileIdentityV mobile_id := ?) := {
830 protocolDiscriminator := c_EPS_NAS_PD_EMM,
831 ePS_messages := {
832 ePS_MobilityManagement := {
833 pDU_NAS_EPS_IdentityResponse := {
834 securityHeaderType := c_EPS_SEC_NONE,
835 messageType := '01010110'B,
836 mobileIdentity := tr_NAS_MobileIdLV(mobile_id)
837 }
838 }
839 }
840}
841
842
843
844
845/* 8.2.20 Security Mode Command */
846template (value) PDU_NAS_EPS
847ts_NAS_SecModeCmd(template (value) NAS_SecurityAlgorithmsV alg,
848 template (value) NAS_KeySetIdentifierV kset_id,
849 template (value) UESecurityCapabilityLV ue_sec_cap) := {
850 protocolDiscriminator := c_EPS_NAS_PD_EMM,
851 ePS_messages := {
852 ePS_MobilityManagement := {
853 pDU_NAS_EPS_SecurityModeCommand := {
854 securityHeaderType := c_EPS_SEC_NONE,
855 messageType := '01011101'B,
856 selected_NAS_SecurityAlgorithms := alg,
857 nasKeySetId := kset_id,
858 spareHalfOctet := '0000'B,
859 replayed_UE_SecurityCapability := ue_sec_cap,
860 iMEISV_Request := omit,
861 replayedNonceUE := omit,
862 nonceMME := omit,
863 hashMME := omit,
864 uEAdditionalSecurityCapability := omit
865 }
866 }
867 }
868}
869template (present) PDU_NAS_EPS
870tr_NAS_SecModeCmd(template (present) NAS_SecurityAlgorithmsV alg := ?,
871 template (present) NAS_KeySetIdentifierV kset_id := ?,
872 template (present) UESecurityCapabilityLV ue_sec_cap := ?) := {
873 protocolDiscriminator := c_EPS_NAS_PD_EMM,
874 ePS_messages := {
875 ePS_MobilityManagement := {
876 pDU_NAS_EPS_SecurityModeCommand := {
877 securityHeaderType := c_EPS_SEC_NONE,
878 messageType := '01011101'B,
879 selected_NAS_SecurityAlgorithms := alg,
880 nasKeySetId := kset_id,
881 spareHalfOctet := ?,
882 replayed_UE_SecurityCapability := ue_sec_cap,
883 iMEISV_Request := *,
884 replayedNonceUE := *,
885 nonceMME := *,
886 hashMME := *,
887 uEAdditionalSecurityCapability := *
888 }
889 }
890 }
891}
892
893/* 8.2.21 Security Mode Complete */
894template (value) PDU_NAS_EPS
895ts_NAS_SecModeCmpl := {
896 protocolDiscriminator := c_EPS_NAS_PD_EMM,
897 ePS_messages := {
898 ePS_MobilityManagement := {
899 pDU_NAS_EPS_SecurityModeComplete := {
900 securityHeaderType := c_EPS_SEC_NONE,
901 messageType := '01011110'B,
902 iMEISV := omit,
903 replayedNASMessageContainer := omit
904 }
905 }
906 }
907}
908template (present) PDU_NAS_EPS
909tr_NAS_SecModeCmpl := {
910 protocolDiscriminator := c_EPS_NAS_PD_EMM,
911 ePS_messages := {
912 ePS_MobilityManagement := {
913 pDU_NAS_EPS_SecurityModeComplete := {
914 securityHeaderType := c_EPS_SEC_NONE,
915 messageType := '01011110'B,
916 iMEISV := *,
917 replayedNASMessageContainer := *
918 }
919 }
920 }
921}
922
923/*********************************************************************************
924 * Session Management
925 *********************************************************************************/
926
927/* 9.9.4.11 - 10.5.6.3/24.008 */
928private function ts_NAS_PCO_TLV(template (omit) ProtocolConfigOptionsV pco)
929return template (omit) ProtocolConfigOptionsTLV {
930 var template (value) ProtocolConfigOptionsTLV ret;
931 if (istemplatekind(pco, "omit")) {
932 return omit;
933 }
934 ret := {
935 elementIdentifier := '27'O,
936 protocolConfigOptions := {
937 lengthIndicator := 0,
938 protocolConfigOptionsV := pco
939 }
940 }
941 return ret;
942}
943private function tr_NAS_PCO_TLV(template ProtocolConfigOptionsV pco := ?)
944return template ProtocolConfigOptionsTLV {
945 var template ProtocolConfigOptionsTLV ret := {
946 elementIdentifier := '27'O,
947 protocolConfigOptions := {
948 lengthIndicator := ?,
949 protocolConfigOptionsV := pco
950 }
951 }
952 if (istemplatekind(pco, "omit")) {
953 return omit;
954 } else if (istemplatekind(pco, "*")) {
955 return *;
956 } else {
957 return ret;
958 }
959}
960
961
962
963/* 8.3.20 PDN Connectivity Request */
964template (value) PDU_NAS_EPS
965ts_NAS_PdnConnReq(template (value) BIT4 bearer_id,
966 template (value) BIT8 proc_tid,
967 template (value) BIT3 pdn_type,
968 template (value) BIT3 req_type) := {
969 protocolDiscriminator := c_EPS_NAS_PD_ESM,
970 ePS_messages := {
971 ePS_SessionManagement := {
972 pDU_NAS_EPS_PDN_ConnectivityRequest := {
973 ePSBearerIdentity := bearer_id,
974 procedureTransactionIdentifier := proc_tid,
975 messageType := '11010000'B,
976 requestType := {
977 requestTypeValue := req_type,
978 spare := '0'B
979 },
980 pDN_Type := {
981 pDN_TypeValue := pdn_type,
982 spare := '0'B
983 },
984 eSM_InformationTransferFlag := omit,
985 accessPointName := omit,
986 protocolConfigOptions := omit,
987 deviceProperties := omit,
988 nBIFOMContainer := omit,
989 headerCompressinConfiguration := omit,
990 extendedProtocolConfigurationOptions := omit
991 }
992 }
993 }
994}
995template (present) PDU_NAS_EPS
996tr_NAS_PdnConnReq(template (present) BIT4 bearer_id := ?,
997 template (present) BIT8 proc_tid := ?,
998 template (present) BIT3 pdn_type := ?,
999 template (present) BIT3 req_type := ?) := {
1000 protocolDiscriminator := c_EPS_NAS_PD_ESM,
1001 ePS_messages := {
1002 ePS_SessionManagement := {
1003 pDU_NAS_EPS_PDN_ConnectivityRequest := {
1004 ePSBearerIdentity := bearer_id,
1005 procedureTransactionIdentifier := proc_tid,
1006 messageType := '11010000'B,
1007 requestType := {
1008 requestTypeValue := req_type,
1009 spare := '0'B
1010 },
1011 pDN_Type := {
1012 pDN_TypeValue := pdn_type,
1013 spare := '0'B
1014 },
1015 eSM_InformationTransferFlag := omit,
1016 accessPointName := omit,
1017 protocolConfigOptions := omit,
1018 deviceProperties := omit,
1019 nBIFOMContainer := omit,
1020 headerCompressinConfiguration := omit,
1021 extendedProtocolConfigurationOptions := omit
1022 }
1023 }
1024 }
1025}
1026
1027/* 8.3.19 PDN Connectivity Reject */
1028template (value) PDU_NAS_EPS
1029ts_NAS_PdnConnRej(template (value) BIT4 bearer_id,
1030 template (value) BIT8 proc_tid,
1031 template (value) ESM_CauseV cause) := {
1032 protocolDiscriminator := c_EPS_NAS_PD_ESM,
1033 ePS_messages := {
1034 ePS_SessionManagement := {
1035 pDU_NAS_EPS_PDN_ConnectivityReject := {
1036 ePSBearerIdentity := bearer_id,
1037 procedureTransactionIdentifier := proc_tid,
1038 messageType := '11010001'B,
1039 esmCause := cause,
1040 protocolConfigOptions := omit,
1041 backOffTimer := omit,
1042 reAttemptIndicator := omit,
1043 nBIFOMContainer := omit,
1044 extendedProtocolConfigurationOptions := omit
1045 }
1046 }
1047 }
1048}
1049template (present) PDU_NAS_EPS
1050tr_NAS_PdnConnRej(template (present) BIT4 bearer_id := ?,
1051 template (present) BIT8 proc_tid := ?,
1052 template (present) ESM_CauseV cause := ?) := {
1053 protocolDiscriminator := c_EPS_NAS_PD_ESM,
1054 ePS_messages := {
1055 ePS_SessionManagement := {
1056 pDU_NAS_EPS_PDN_ConnectivityReject := {
1057 ePSBearerIdentity := bearer_id,
1058 procedureTransactionIdentifier := proc_tid,
1059 messageType := '11010001'B,
1060 esmCause := cause,
1061 protocolConfigOptions := *,
1062 backOffTimer := *,
1063 reAttemptIndicator := *,
1064 nBIFOMContainer := *,
1065 extendedProtocolConfigurationOptions := *
1066 }
1067 }
1068 }
1069}
1070
1071
1072/* 8.3.6 Activate Default EPS Bearer Context Request */
1073template (value) PDU_NAS_EPS
1074ts_NAS_ActDefEpsBearCtxReq(template (value) BIT4 bearer_id,
1075 template (value) BIT8 proc_tid,
1076 template (value) EPS_QualityOfServiceV qos,
1077 template (value) octetstring apn,
1078 template (value) BIT3 addr_type,
1079 template (value) octetstring addr_info) := {
1080 protocolDiscriminator := c_EPS_NAS_PD_ESM,
1081 ePS_messages := {
1082 ePS_SessionManagement := {
1083 pDU_NAS_EPS_ActDefEPSBearerContextRequest := {
1084 ePSBearerIdentity := bearer_id,
1085 procedureTransactionIdentifier := proc_tid,
1086 messageType := '11000001'B,
1087 ePS_QoS := {
1088 lengthIndicator := 0,
1089 ePS_QualityOfServiceV := qos
1090 },
1091 accessPointName := {
1092 lengthIndicator := 0,
1093 accessPointNameValue := apn
1094 },
1095 pDN_Address := {
1096 lengthIndicator := 0,
1097 typeValue := addr_type,
1098 spare := '00000'B,
1099 addressInformation := addr_info
1100 },
1101 transactionIdentifier := omit,
1102 negotiatedQoS := omit,
1103 negotiated_LLC_SAPI := omit,
1104 radioPriority := omit,
1105 packetFlowID := omit,
1106 aPN_AMBR := omit,
1107 esmCause := omit,
1108 protocolConfigOptions := omit,
1109 connectivityType := omit,
1110 wLANOffloadIndication := omit,
1111 nBIFOMContainer := omit,
1112 headerCompressinConfiguration := omit,
1113 controlPlaneOnlyIndication := omit,
1114 extendedProtocolConfigurationOptions := omit,
1115 servingPLMNRateControl := omit,
1116 extended_APN_AMBR := omit,
1117 extendedQoS := omit
1118 }
1119 }
1120 }
1121}
Pau Espin Pedrolecfc7d62023-12-13 18:49:29 +01001122template (present) PDU_NAS_EPS
1123tr_NAS_ActDefEpsBearCtxReq(template (present) BIT4 bearer_id := ?,
1124 template (present) BIT8 proc_tid := ?,
1125 template (present) EPS_QualityOfServiceV qos := ?,
1126 template (present) octetstring apn := ?,
1127 template (present) BIT3 addr_type := ?,
1128 template (present) octetstring addr_info := ?) := {
1129 protocolDiscriminator := c_EPS_NAS_PD_ESM,
1130 ePS_messages := {
1131 ePS_SessionManagement := {
1132 pDU_NAS_EPS_ActDefEPSBearerContextRequest := {
1133 ePSBearerIdentity := bearer_id,
1134 procedureTransactionIdentifier := proc_tid,
1135 messageType := '11000001'B,
1136 ePS_QoS := {
1137 lengthIndicator := ?,
1138 ePS_QualityOfServiceV := qos
1139 },
1140 accessPointName := {
1141 lengthIndicator := 0,
1142 accessPointNameValue := apn
1143 },
1144 pDN_Address := {
1145 lengthIndicator := 0,
1146 typeValue := addr_type,
1147 spare := '00000'B,
1148 addressInformation := addr_info
1149 },
1150 transactionIdentifier := *,
1151 negotiatedQoS := *,
1152 negotiated_LLC_SAPI := *,
1153 radioPriority := *,
1154 packetFlowID := *,
1155 aPN_AMBR := *,
1156 esmCause := *,
1157 protocolConfigOptions := *,
1158 connectivityType := *,
1159 wLANOffloadIndication := *,
1160 nBIFOMContainer := *,
1161 headerCompressinConfiguration := *,
1162 controlPlaneOnlyIndication := *,
1163 extendedProtocolConfigurationOptions := *,
1164 servingPLMNRateControl := *,
1165 extended_APN_AMBR := *,
1166 extendedQoS := *
1167 }
1168 }
1169 }
1170}
Harald Weltefc5f6372019-07-09 14:10:05 +08001171
1172/* 8.3.4 Activate Default EPS Bearer Context Accept */
1173template (value) PDU_NAS_EPS
1174ts_NAS_ActDefEpsBearCtxAck(template (value) BIT4 bearer_id,
1175 template (value) BIT8 proc_tid,
1176 template (omit) ProtocolConfigOptionsV pco) := {
1177 protocolDiscriminator := c_EPS_NAS_PD_ESM,
1178 ePS_messages := {
1179 ePS_SessionManagement := {
1180 pDU_NAS_EPS_ActDefEPSBearerContextAccept := {
1181 ePSBearerIdentity := bearer_id,
1182 procedureTransactionIdentifier := proc_tid,
1183 messageType := '11000010'B,
1184 protocolConfigOptions := ts_NAS_PCO_TLV(pco),
1185 extendedProtocolConfigurationOptions := omit
1186 }
1187 }
1188 }
1189}
1190template (present) PDU_NAS_EPS
1191tr_NAS_ActDefEpsBearCtxAck(template (present) BIT4 bearer_id := ?,
1192 template (present) BIT8 proc_tid := ?,
1193 template ProtocolConfigOptionsV pco := *) := {
1194 protocolDiscriminator := c_EPS_NAS_PD_ESM,
1195 ePS_messages := {
1196 ePS_SessionManagement := {
1197 pDU_NAS_EPS_ActDefEPSBearerContextAccept := {
1198 ePSBearerIdentity := bearer_id,
1199 procedureTransactionIdentifier := proc_tid,
1200 messageType := '11000010'B,
1201 protocolConfigOptions := tr_NAS_PCO_TLV(pco),
1202 extendedProtocolConfigurationOptions := *
1203 }
1204 }
1205 }
1206}
1207
1208
1209/* 8.3.5 Activate Default EPS Bearer Context Reject */
1210template (value) PDU_NAS_EPS
1211ts_NAS_ActDefEpsBearCtxRej(template (value) BIT4 bearer_id,
1212 template (value) BIT8 proc_tid,
1213 template (value) ESM_CauseV cause) := {
1214 protocolDiscriminator := c_EPS_NAS_PD_ESM,
1215 ePS_messages := {
1216 ePS_SessionManagement := {
1217 pDU_NAS_EPS_ActDefEPSBearerContextReject := {
1218 ePSBearerIdentity := bearer_id,
1219 procedureTransactionIdentifier := proc_tid,
1220 messageType := '11000011'B,
1221 esmCause := cause,
1222 protocolConfigOptions := omit,
1223 extendedProtocolConfigurationOptions := omit
1224 }
1225 }
1226 }
1227}
1228template (present) PDU_NAS_EPS
1229tr_NAS_ActDefEpsBearCtxRej(template (present) BIT4 bearer_id := ?,
1230 template (present) BIT8 proc_tid := ?,
1231 template (present) ESM_CauseV cause := ?) := {
1232 protocolDiscriminator := c_EPS_NAS_PD_ESM,
1233 ePS_messages := {
1234 ePS_SessionManagement := {
1235 pDU_NAS_EPS_ActDefEPSBearerContextReject := {
1236 ePSBearerIdentity := bearer_id,
1237 procedureTransactionIdentifier := proc_tid,
1238 messageType := '11000011'B,
1239 esmCause := cause,
1240 protocolConfigOptions := *,
1241 extendedProtocolConfigurationOptions := *
1242 }
1243 }
1244 }
1245}
1246
1247
1248
1249
1250
1251}