pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40445?usp=email )
Change subject: WIP: PDU Session Req ......................................................................
WIP: PDU Session Req
Change-Id: If0769afd07a4bae7778d7a7c347cebaa5909b5f8 --- M 5gc/C5G_Tests.ttcn M deps/Makefile M library/NGAP_Functions.ttcn M library/NG_NAS_Osmo_Templates.ttcn M library/ngap/NGAP_Templates.ttcn 5 files changed, 273 insertions(+), 6 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/45/40445/1
diff --git a/5gc/C5G_Tests.ttcn b/5gc/C5G_Tests.ttcn index cd7007b..f997e7b 100644 --- a/5gc/C5G_Tests.ttcn +++ b/5gc/C5G_Tests.ttcn @@ -19,6 +19,8 @@ import from Osmocom_Types all; import from GSM_Types all;
+import from DNS_Helpers all; + import from Milenage_Functions all;
import from NGAP_PDU_Descriptions all; @@ -62,6 +64,7 @@ octetstring mp_usim_key := '762a2206fe0b4151ace403c86a11e479'O; octetstring mp_usim_opc := '3c6e0b8a9c15224a8228b9a98ca1531d'O; uint24_t mp_tac := 1; + charstring mp_apn := "internet"; }
/* parameters of emulated gNB / ng-eNB */ @@ -383,7 +386,6 @@ ngiaCap := '40'O /* ONLY NIA1 supported */);
[] NGAP.receive(cr_NG_SECURITY_MODE_COMMAND(p_UECap := ue_sec_cap)) -> value rx_nas { - log("Rx inner NAS: ", rx_nas); /* Configure integrity protection: */ cfg := { set_nas_alg_int := NG_NAS_ALG_IP_NIA1 @@ -417,6 +419,66 @@ } }
+private function f_pdu_sess_establish() runs on ConnHdlr { + var template (value) NG_NAS_UL_Message_Type nas_ul_msg; + var NGAP_PDU rx_ngap; + var NG_NAS_DL_Message_Type rx_nas; + var NAS_PDU nas_pdu; + + nas_ul_msg := cs_NG_PDU_SESSION_ESTABLISHMENT_REQUEST(cs_NG_PDU_SessionIdV('01'O), '01'O, + p_IntegrityProtMaxDataRate := cs_IntegrityProtMaxDataRateV('FF'O, 'FF'O), + p_PDU_SessionType := cs_PDU_SessionTypeTV('001'B), /* IPv4 */ + p_SSC_Mode := cs_SSC_ModeTV('001'B)); + nas_pdu := enc_NG_NAS_UL_Message_Type(valueof(nas_ul_msg)); + nas_ul_msg := cs_NG_UL_NAS_TRANSPORT(cs_PayloadContainerType(tsc_PayloadContainerESMMsg), + cs_PayloadContainerLV(nas_pdu), + p_PDU_SessionId := cs_NG_PDU_SessionIdTV('01'O), + p_RequestType := cs_NG_Request_TypeTV('001'B), + p_DNN := cs_DNN_TLV(f_enc_dns_hostname(mp_apn))); + NGAP.send(nas_ul_msg); + + NGAP.receive(mw_ngap_initMsg(mw_n2_InitialContextSetupRequest_withPDUSessionList)) -> value rx_ngap; + NGAP.receive(cr_NG_DL_NAS_TRANSPORT) -> value rx_nas; + log("PESPIN: Rx DL_NAST_TRANSPORT: ", rx_nas); + + var NG_NAS_DL_Message_Type inner_nas := dec_NG_NAS_DL_Message_Type(rx_nas.dl_Nas_Transport.payload.payload); + log("PESPIN: Rx inner NAS: ", inner_nas); + + /* TODO: the above is being decoded wrong; +19:49:40.663833 1901 NGAP_Emulation.ttcn:570 Sent on NGAP_CLIENT to TC_ng_register0(4) @NG_NAS_MsgContainers.NG_NAS_DL_Message_Type : { + dl_Nas_Transport := { + protocolDiscriminator := '01111110'B, + spareHalfOctet := '0'H, + securityHeaderType := '0000'B, + messageType := '01101000'B, + spareHalfOctet2 := '0'H, + payloadContainerType := { + iei := omit, + container := '0001'B + }, + payload := { + iei := omit, + iel := '3500'O, + payload := '2E0101C211000901000631310101FF010603F42403F4242905010A2D0002220101790006012041010109250908696E7465726E65741201'O + }, + pduSessionId := omit, + additionalInfo := omit, + gmmCause := omit, + backOffTimerValue := omit, + lowerBoundTimerValue := omit + } +} + + dl_Nas_Transport := { + The last '1201'O in .payload.payload should actually end up decoded in pduSessionId!!!! Looks like a bug in TTCN3? +*/ + + /* TODO: we should also decode ngap.initiatingMessage.value_.initialContextSetupRequest.protocolIEs[id==id_PDUSessionResourceSetupListCxtReq].value_.pDUSessionResourceSetupListCxtReq.pDUSessionResourceSetupRequestTransfer */ + + /* TODO: answer with InitialContextSetupResponse */ + f_sleep(5.0); +} + private function f_register() runs on ConnHdlr { var template (value) NGAP_PDU tx_pdu; var template (value) NG_NAS_UL_Message_Type nas_ul_msg; @@ -454,8 +516,7 @@
as_ngap_handle_configuration_update();
- /* TODO: PDU session establishment request */ - f_sleep(5.0); + f_pdu_sess_establish(); }
/* NG Setup procedure to 5GC using a Global gNB ID containing unknown/foreign PLMN. diff --git a/deps/Makefile b/deps/Makefile index 0792c09..37922d4 100644 --- a/deps/Makefile +++ b/deps/Makefile @@ -85,7 +85,7 @@ # Do not put references to branches here, except for local testing: this breaks the caching # logic of docker containers, which only invalidate their cached ttcn3 dependencies if this # file changed. -nas_commit= eff069b772a53e16773638f07599e7936ffcdd9a +nas_commit= a51e51b2739d93ed3212a3dd85878627676137ea titan.Libraries.TCCUsefulFunctions_commit= R.35.B-6-gb3687da titan.ProtocolEmulations.M3UA_commit= b58f92046e48a7b1ed531e243a2319ebca53bf4c titan.ProtocolEmulations.SCCP_commit= 750a3e836831e58eae59d4757ef5d0c759f9ca5d diff --git a/library/NGAP_Functions.ttcn b/library/NGAP_Functions.ttcn index 523754e..f6c1389 100644 --- a/library/NGAP_Functions.ttcn +++ b/library/NGAP_Functions.ttcn @@ -25,6 +25,9 @@ case (id_DownlinkNASTransport) { return im.value_.downlinkNASTransport.protocolIEs[0].value_.aMF_UE_NGAP_ID; } + case (id_InitialContextSetup) { + return im.value_.initialContextSetupRequest.protocolIEs[0].value_.aMF_UE_NGAP_ID; + } case (id_UEContextRelease) { return im.value_.uEContextReleaseCommand.protocolIEs[0].value_.uE_NGAP_IDs.uE_NGAP_ID_pair.aMF_UE_NGAP_ID; } @@ -65,8 +68,11 @@ case (id_DownlinkNASTransport) { return im.value_.downlinkNASTransport.protocolIEs[1].value_.RAN_UE_NGAP_ID; } + case (id_InitialContextSetup) { + return im.value_.initialContextSetupRequest.protocolIEs[1].value_.RAN_UE_NGAP_ID; + } case (id_UEContextRelease) { - return im.value_.uEContextReleaseCommand.protocolIEs[0].value_.uE_NGAP_IDs.uE_NGAP_ID_pair.rAN_UE_NGAP_ID; + return im.value_.uEContextReleaseCommand.protocolIEs[1].value_.uE_NGAP_IDs.uE_NGAP_ID_pair.rAN_UE_NGAP_ID; } /* TODO */ } @@ -126,6 +132,19 @@ } return omit; } + case (id_InitialContextSetup) { + var InitialContextSetupRequest msg := im.value_.initialContextSetupRequest; + for (i := 0; i < lengthof(msg.protocolIEs); i := i+1) { + if (msg.protocolIEs[i].id == id_PDUSessionResourceSetupListCxtReq) { + var PDUSessionResourceSetupListCxtReq req_li := msg.protocolIEs[i].value_.pDUSessionResourceSetupListCxtReq; + for (j := 0; j < lengthof(req_li); j := j+1) { + return req_li[j].nAS_PDU; + /* FIXME: we should be returning req_li[j].pDUSessionResourceSetupRequestTransfer too... */ + } + } + } + return omit; + } } } return omit; diff --git a/library/NG_NAS_Osmo_Templates.ttcn b/library/NG_NAS_Osmo_Templates.ttcn index 9e61249..eaa8eda 100644 --- a/library/NG_NAS_Osmo_Templates.ttcn +++ b/library/NG_NAS_Osmo_Templates.ttcn @@ -101,6 +101,75 @@ resultValue := p_Result };
+/* 24.501 cl. 9.11.3.21 */ +template (value) DNN +cs_DNN_TLV(template (value) octetstring p_DNN) := +{ + iei := '25'O, + iel := '00'O, /* overwritten by RAW encoder */ + dnnValue := p_DNN +}; + +/* 24.501 cl. 9.11.3.39 */ +template (value) PayloadContainer +cs_PayloadContainerLV(octetstring p_EncodedGSMMsg) := +{ + iei := omit, + iel := '0000'O, /* overwritten by RAW encoder */ + payload := p_EncodedGSMMsg +}; + +/* 24.501 cl. 9.11.3.41 */ +template (value) NG_PDU_SessionId +cs_NG_PDU_SessionIdV(template (value) O1_Type p_Id := '00'O) := // @sic R5s190338 sic@ +{ + iei := omit, + sessionId := p_Id +}; +template (value) NG_PDU_SessionId +cs_NG_PDU_SessionIdTV(template (value) O1_Type p_Id := '00'O) := // @sic R5s190338 sic@ +{ + iei := '12'O, + sessionId := p_Id +}; + +/* 24.501 cl. 9.11.3.47 */ +template (value) NG_Request_Type cs_NG_Request_TypeTV(B3_Type p_RequestValue) := +{ + iei := '8'H, + spare := tsc_Spare1, + requestValue := p_RequestValue +}; + + +/* 24.501 cl. 9.11.4.7 */ +template (value) IntegrityProtMaxDataRate +cs_IntegrityProtMaxDataRateV(template (value) O1_Type maxDataRateUL, + template (value) O1_Type maxDataRateD) := +{ + iei := omit, + maxDataRateUL := maxDataRateUL, + maxDataRateDL := maxDataRateD +}; + +/* 24.501 cl. 9.11.4.11 */ +template (value) PDU_SessionType +cs_PDU_SessionTypeTV(template (value) B3_Type p_Type) := +{ + iei := '9'H, + spare := tsc_Spare1, + typeValue := p_Type +}; + +/* 24.501 cl. 9.11.4.16 */ +template (value) SSC_Mode +cs_SSC_ModeTV(B3_Type p_SSCMode) := +{ + iei := 'A'H, + spare := tsc_Spare1, + sscModeValue := p_SSCMode +}; + /* 24.501 cl. 8.2.1 */ template (present) NG_NAS_DL_Message_Type cr_NG_AUTHENTICATION_REQUEST(template (present) NAS_KsiValue p_KeySetId := ?, @@ -278,6 +347,64 @@ } }
+/* 24.501 cl. 8.2.10 */ +template (value) NG_NAS_UL_Message_Type +cs_NG_UL_NAS_TRANSPORT(template (value) PayloadContainerType p_PayloadContainerType, + template (value) PayloadContainer p_PayloadContainer, + template (omit) NG_PDU_SessionId p_PDU_SessionId := omit, + template (omit) NG_PDU_SessionId p_OldPDU_SessionId := omit, + template (omit) NG_Request_Type p_RequestType := omit, + template (omit) S_NSSAI_Type p_S_NSSAI := omit, + template (omit) DNN p_DNN := omit, + template (omit) AdditionalInformation p_AdditionalInfo := omit, + template (omit) MA_PDUSessionInfo p_MA_PDUSessionInfo := omit, + template (omit) ReleaseAssistanceInd p_ReleaseAssistanceInd := omit) := +{ + ul_Nas_Transport := { + protocolDiscriminator := tsc_EPD_GMM, /* cl. 9.2 M V 1 */ + spareHalfOctet := tsc_SpareHalfOctet, /* cl. 9.3 M V 1/2 */ + securityHeaderType := tsc_SHT_NoSecurityProtection, + messageType := tsc_MT_NG_UL_NASTransport, /* cl. 9.7 M V 1 */ + spareHalfOctet2 := tsc_SpareHalfOctet, /* cl. 9.5 M V 1/2 */ + payloadContainerType := p_PayloadContainerType, /* cl. 9.11.3.40 M V 1/2 */ + payload := p_PayloadContainer, /* cl. 9.11.3.39 M LV-E 3-65537 */ + pduSessionId := p_PDU_SessionId, /* cl. 9.11.3.41 C TV 2 IEI=70 */ + oldPDUSessionId := p_OldPDU_SessionId, /* cl. 9.11.3.41 O TV 3 IEI=61 */ + requestType := p_RequestType, /* cl. 9.`0.3.47 O TV 1 IEI=8 */ + s_NSSAI := p_S_NSSAI, /* cl. 9.11.2.8 O TLV 3-10 IEI=22 */ + dnn := p_DNN, /* cl. 9.11.3.21 O TLV 3-102 IEI=25 */ + additionalInfo := p_AdditionalInfo, /* cl. 9.11.2.1 O TLV 3-n IEI=24 */ + maPDUSessionInfo := p_MA_PDUSessionInfo, /* cl. 9.11.3.31A O TV 1 IEI=A Sep20 @sic R5s201387 Baseline Moving sic@ */ + releaseAssistanceInd := p_ReleaseAssistanceInd /* cl. 9.11.3.46A O TV 1 IEI=F Sep20 @sic R5s201387 Baseline Moving sic@ */ + } +} + +/* 24.501 cl. 8.2.11 */ +template (present) NG_NAS_DL_Message_Type +cr_NG_DL_NAS_TRANSPORT(template (present) PayloadContainerType p_PayloadContainerType := ?, + template (present) PayloadContainer p_Payload := ?, + template NG_PDU_SessionId p_PDU_SessionId := *, + template AdditionalInformation p_AdditionalInfo := *, + template GMM_GSM_Cause p_Cause := *, + template GPRS_Timer3 p_BackOff := *, + template GPRS_Timer3 p_LowerBoundTimerValue := *) := +{ + dl_Nas_Transport := { + protocolDiscriminator := tsc_EPD_GMM, /* cl. 9.2 M V 1 */ + spareHalfOctet := tsc_SpareHalfOctet, /* cl. 9.3 M V 1/2 */ + securityHeaderType := tsc_SHT_NoSecurityProtection, + messageType := tsc_MT_NG_DL_NASTransport, /* cl. 9.7 M V 1 */ + spareHalfOctet2 := tsc_SpareHalfOctet, /* cl. 9.5 M V 1/2 */ + payloadContainerType := p_PayloadContainerType, /* cl. 9.11.3.40 M V 1/2 */ + payload := p_Payload, /* cl. 9.11.3.39 M LV-E 3-65537 */ + pduSessionId := p_PDU_SessionId, /* cl. 9.11.3.41 C TV 2 IEI=70 */ + additionalInfo := p_AdditionalInfo, /* cl. 9.11.2.1 O TLV 3-n IEI=24 */ + gmmCause := p_Cause, /* cl. 9.11.3.2 O TV 2 IEI=58 */ + backOffTimerValue := p_BackOff, /* cl. 9.11.2.5 O TLV 3 IEI=37 */ + lowerBoundTimerValue := p_LowerBoundTimerValue /* cl. 9.11.2.5 O TLV 3 IEI=3A Sep22 @sic R5s221179 Baseline Moving sic@ */ + } +} + /* 24.501 cl. 8.2.19 */ template (present) NG_NAS_DL_Message_Type cr_NG_CONFIGURATION_UPDATE_COMMAND(template ConfigUpdateInd p_ConfigUpdateInd := *, @@ -453,4 +580,52 @@ } }
+/* 24.501 cl. 8.3.1 */ +template (omit) NG_NAS_UL_Message_Type +cs_NG_PDU_SESSION_ESTABLISHMENT_REQUEST(template (value) NG_PDU_SessionId p_PDU_SessionId, + template (value) ProcedureTransactionIdentifier p_PTI, + template (omit) IntegrityProtMaxDataRate p_IntegrityProtMaxDataRate := omit, + template (omit) PDU_SessionType p_PDU_SessionType := omit, + template (omit) SSC_Mode p_SSC_Mode := omit, + template (omit) NG_UE_SM_Cap p_UECap := omit, + template (omit) MaxNumPacketFilters p_MaxNumPacketFilters := omit, + template (omit) AlwaysOnPDUSessionReq p_AlwaysOnPDUSessionReq := omit, + template (omit) SM_PDU_DN_RequestContainer p_PDUReq := omit, + template (omit) ExtdProtocolConfigOptions p_ExtdPCO := omit, + template (omit) IPHeaderCompressionConfig p_IPHeaderCompConfig := omit, + template (omit) DS_TT_EthernetPortMACAddr p_DS_TT_EthernetPortMACAddr := omit, + template (omit) UE_DS_TT_ResidenceTime p_UE_DS_TT_ResidenceTime := omit, + template (omit) PortManagementInfoContainer p_PortManagementInfoContainer := omit, + template (omit) EthernetHeaderCompressConfig p_EthernetHeaderCompConfig := omit, + template (omit) PDU_Address p_SuggestedInterfaceId := omit, + template (omit) ServiceLvlAAContainer p_ServiceLvlAA := omit, + template (omit) RequestedMBSContainer p_RequestedMBS := omit, + template (omit) PDUSessionPairId p_PduSessionPairId := omit, + template (omit) RSN p_RSN := omit) := { + pdu_Session_Establishment_Request := { + protocolDiscriminator := tsc_EPD_GSM, /* cl. 9.2 M V 1 */ + pduSessionId := p_PDU_SessionId, /* cl. 9.4 M V 1 */ + procedureTransactionIdentifier := p_PTI, /* cl. 9.6 M V 1 */ + messageType := tsc_MT_NG_PDUSessionEstablishmentRequest, /* cl. 9.7 M V 1 */ + integrityProtMaxDataRate := p_IntegrityProtMaxDataRate, /* cl. 9.11.4.7 M V 2 */ + pduSessionType := p_PDU_SessionType, /* cl. 9.11.4.11 O TV 1 IEI=9 */ + sscMode := p_SSC_Mode, /* cl. 9.11.4.16 O TV 1 IEI=A */ + smCapability := p_UECap, /* cl. 9.11.4.1 O TLV 3-15 IEI=28 */ + maxNumPacketFilters := p_MaxNumPacketFilters, /* cl. 9.11.4.6 O TV 3 IEI=55 */ + alwaysOnPDUSessionReq := p_AlwaysOnPDUSessionReq, /* cl. 9.11.4.4 O TV 1 IEI=B */ + smPDU_RequestContainer := p_PDUReq, /* cl. 9.11.4.15 O TLV ? ? */ + extdProtocolConfigurationOptions := p_ExtdPCO, /* cl. 9.11.4.6 O TLV-E 4-65538 IEI=0x7B */ + ipHeaderCompressionConfig := p_IPHeaderCompConfig, /* cl. 9.11.4.24 O TLV 5-257 IEI=66 Sep20 @sic R5s201387 Baseline Moving sic@ */ + ds_TT_EthernetPortMACAddr := p_DS_TT_EthernetPortMACAddr, /* cl. 9.11.4.25 O TLV 8 IEI=6E Sep20 @sic R5s201387 Baseline Moving sic@ */ + ueDS_TT_ResidenceTime := p_UE_DS_TT_ResidenceTime, /* cl. 9.11.4.26 O TLV 10 IEI=6F Sep20 @sic R5s201387 Baseline Moving sic@ */ + portManagementInfoContainer := p_PortManagementInfoContainer, /* cl. 9.11.4.27 O TLV-E 8-65538 IEI=7C Sep20 @sic R5s201387 Baseline Moving sic@ */ + ethernetHeaderCompressConfig := p_EthernetHeaderCompConfig, /* cl. 9.11.4.28 O TLV 3 IEI=1F Sep20 @sic R5s201387 Baseline Moving sic@ */ + suggestedInterfaceId := p_SuggestedInterfaceId, /* cl. 9.11.4.10 O TLV 11 IEI=29 Sep20 @sic R5s201387 Baseline Moving sic@ */ + serviceLvlAA := p_ServiceLvlAA, /* cl. 9.11.2.10 O TLV-E 6-n IEI=72 Sep22 @sic R5s221179 Baseline Moving sic@ */ + requestedMBS := p_RequestedMBS, /* cl. 9.11.4.30 O TLV-E 8-65538 IEI=70 Sep22 @sic R5s221179 Baseline Moving sic@ */ + pduSessionPairId := p_PduSessionPairId, /* cl. 9.11.4.32 O TLV 3 IEI=34 Sep22 @sic R5s221179 Baseline Moving sic@ */ + rsn := p_RSN /* cl. 9.11.4.33 O TLV 3 IEI=35 Sep22 @sic R5s221179 Baseline Moving sic@ */ + } +} + } diff --git a/library/ngap/NGAP_Templates.ttcn b/library/ngap/NGAP_Templates.ttcn index dde7844..e9cd7a7 100644 --- a/library/ngap/NGAP_Templates.ttcn +++ b/library/ngap/NGAP_Templates.ttcn @@ -1380,11 +1380,13 @@ template (present) InitiatingMessage mw_n2_InitialContextSetupRequest_withPDUSessionList( template (present) AMF_UE_NGAP_ID p_amfUeNgapID := ?, template (present) RAN_UE_NGAP_ID p_ranUeNgapID := ?, + template (present) UEAggregateMaximumBitRate p_uEAggregateMaximumBitRate := ?, template (present) GUAMI p_gUAMI := ?, template (present) PDUSessionResourceSetupListCxtReq p_pDUSessionResourceSetupListCxtReq := ?, template (present) AllowedNSSAI p_allowedNSSAI := ?, template (present) UESecurityCapabilities p_uESecurityCapabilities := ?, - template (present) SecurityKey p_nextHopNH := ? + template (present) SecurityKey p_nextHopNH := ?, + template (present) MaskedIMEISV p_maskedIMEISV := ? ) := { procedureCode := id_InitialContextSetup, criticality := reject, @@ -1402,6 +1404,11 @@ value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } }, { + id := id_UEAggregateMaximumBitRate, + criticality := reject, + value_ := { UEAggregateMaximumBitRate := p_uEAggregateMaximumBitRate } + }, + { id := id_GUAMI, criticality := reject, value_ := { GUAMI := p_gUAMI } @@ -1425,6 +1432,11 @@ id := id_SecurityKey, criticality := reject, value_ := { SecurityKey := p_nextHopNH } + }, + { /* Optional: */ + id := id_MaskedIMEISV, + criticality := ignore, + value_ := { maskedIMEISV := p_maskedIMEISV } } } }