lists.osmocom.org
Sign In Sign Up
Manage this list Sign In Sign Up

Keyboard Shortcuts

Thread View

  • j: Next unread message
  • k: Previous unread message
  • j a: Jump to all threads
  • j l: Jump to MailingList overview

gerrit-log

Thread Start a new thread
Download
Threads by month
  • ----- 2026 -----
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2025 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2024 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2023 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2022 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
gerrit-log@lists.osmocom.org

July 2025

  • 1 participants
  • 1492 discussions
[M] Change in osmo-ttcn3-hacks[master]: pgw: Move to library/ high level APIs to run commands over UECUPS
by pespin 25 Jul '25

25 Jul '25
Hello Jenkins Builder, I'd like you to reexamine a change. Please visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40753?usp=email to look at the new patch set (#3). The following approvals got outdated and were removed: Verified+1 by Jenkins Builder Change subject: pgw: Move to library/ high level APIs to run commands over UECUPS ...................................................................... pgw: Move to library/ high level APIs to run commands over UECUPS This way the code can be reused by other testsuites more easily. Change-Id: I49c98fd423e47e16ddfb9ae4612b18db21ca3fa4 --- M library/GTPv1U_Emulation.ttcnpp M pgw/PGW_Tests.ttcn 2 files changed, 98 insertions(+), 62 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/53/40753/3 -- To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40753?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: newpatchset Gerrit-Project: osmo-ttcn3-hacks Gerrit-Branch: master Gerrit-Change-Id: I49c98fd423e47e16ddfb9ae4612b18db21ca3fa4 Gerrit-Change-Number: 40753 Gerrit-PatchSet: 3 Gerrit-Owner: pespin <pespin(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder
1 0
0 0
[L] Change in osmo-ttcn3-hacks[master]: 5gc: Support PDU Session Establishment procedure
by pespin 25 Jul '25

25 Jul '25
pespin has submitted this change. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40445?usp=email ) Change subject: 5gc: Support PDU Session Establishment procedure ...................................................................... 5gc: Support PDU Session Establishment procedure This commit adds initial support to issue a successful PDU Session Establishment procedure towards the 5GC, getting a ready-to-use GTPU session with IPv4 addr + TEID + UE IP address. commit has to our nas.git fork is updated in order to have multiple fixes and improvements needed to have everything working fine. Related: SYS#7073 Change-Id: If0769afd07a4bae7778d7a7c347cebaa5909b5f8 --- M 5gc/C5G_Tests.ttcn M 5gc/gen_links.sh M deps/Makefile M library/NGAP_Functions.ttcn M library/NG_NAS_Functions.ttcn M library/NG_NAS_Osmo_Templates.ttcn A library/NG_NAS_Osmo_Types.ttcn M library/ngap/NGAP_EncDec.cc M library/ngap/NGAP_Templates.ttcn M library/ngap/NGAP_Types.ttcn 10 files changed, 490 insertions(+), 12 deletions(-) Approvals: pespin: Looks good to me, approved Jenkins Builder: Verified jolly: Looks good to me, but someone else must approve diff --git a/5gc/C5G_Tests.ttcn b/5gc/C5G_Tests.ttcn index cd7007b..f5b0931 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,8 @@ octetstring mp_usim_key := '762a2206fe0b4151ace403c86a11e479'O; octetstring mp_usim_opc := '3c6e0b8a9c15224a8228b9a98ca1531d'O; uint24_t mp_tac := 1; + charstring mp_apn := "internet"; + charstring mp_local_gtpu_ip := "127.0.0.1"; } /* parameters of emulated gNB / ng-eNB */ @@ -77,7 +81,11 @@ HEX16n imeisv, octetstring usim_key, octetstring usim_opc, - charstring ue_ip, + charstring ran_gtpu_ip, + OCT4 ran_gtpu_teid, + charstring cn_gtpu_ip optional, + OCT4 cn_gtpu_teid optional, + charstring ue_ip optional, OCT32 kausf optional, OCT32 kseaf optional, OCT32 kamf optional @@ -89,7 +97,11 @@ imeisv := f_rnd_imeisv(), usim_key := mp_usim_key, usim_opc := mp_usim_opc, - ue_ip := "192.168.123.50", + ran_gtpu_ip := mp_local_gtpu_ip, + ran_gtpu_teid := int2oct(imsi_suffix, 4), + cn_gtpu_ip := omit, + cn_gtpu_teid := omit, + ue_ip := omit, kausf := omit, kseaf := omit, kamf := omit @@ -321,7 +333,6 @@ var NG_NAS_DL_Message_Type rx_nas; var template (present) NAS_KeySetIdentifier kset_id := f_tr_ConnHdlr_kset_id(); [] NGAP.receive(cr_NG_AUTHENTICATION_REQUEST) -> value rx_nas { - log("Rx NAS message: ", rx_nas); var integer ret; var integer my_sqn := 0; /* TODO: move to a ConnHdlr state attribute? */ var OCT16 rand := bit2oct(rx_nas.authentication_Request.rand.randValue); @@ -383,7 +394,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 +427,99 @@ } } +/* Handle a PDUSessionResourceSetupRequestTransfer contained inside NGAP InitialContextSetupRequest and return a Result for InitialContextSetupResponse */ +private function f_pdu_handle_session_resource_setup_item(PDUSessionResourceSetupItemCxtReq req) runs on ConnHdlr return PDUSessionResourceSetupItemCxtRes +{ + var PDUSessionResourceSetupItemCxtRes resp; + var octetstring setup_trans_enc; + var NGAP_IEs.PDUSessionResourceSetupRequestTransfer setup_req_transf; + var NGAP_IEs.PDUSessionResourceSetupResponseTransfer setup_resp_transf; + var template (value) UPTransportLayerInformation utla; + var template (value) QosFlowPerTNLInformation qos; + + /* Parse PDUSessionResourceSetupRequestTransfer contained inside InitialContextSetupRequest's PDUSessionResourceSetup Item: */ + setup_req_transf := dec_NGAP_PDUSessionResourceSetupRequestTransfer(req.pDUSessionResourceSetupRequestTransfer); + for (var integer i := 0; i < lengthof(setup_req_transf.protocolIEs); i := i + 1) { + if (setup_req_transf.protocolIEs[i].id == id_UL_NGU_UP_TNLInformation) { + var UPTransportLayerInformation utli := setup_req_transf.protocolIEs[i].value_.uPTransportLayerInformation; + g_pars.ue_pars.cn_gtpu_ip := f_inet_ntoa(bit2oct(utli.gTPTunnel.transportLayerAddress)); + g_pars.ue_pars.cn_gtpu_teid := utli.gTPTunnel.gTP_TEID; + } + } + + /* Prepare Response for it: */ + utla := m_uPTransportLayerInformation_gTPTunnel( + m_gTPTunnel(p_tla := oct2bit(f_inet_addr(g_pars.ue_pars.ran_gtpu_ip)), + p_gtp_teid := g_pars.ue_pars.ran_gtpu_teid)); + qos := m_qosFlowPerTNLInformation(utla, { m_associatedQosFlowItem(1) }); + setup_resp_transf := valueof(m_pDUSessionResourceSetupResponseTransfer(qos)); + setup_trans_enc := enc_NGAP_PDUSessionResourceSetupResponseTransfer(setup_resp_transf) + resp := valueof(m_pDUSessionResourceSetupItemCxtRes(req.pDUSessionID, setup_trans_enc)); + return resp; +} + +private function f_pdu_handle_session_resource_setup_list(PDUSessionResourceSetupListCxtReq li_req) runs on ConnHdlr return PDUSessionResourceSetupListCxtRes +{ + var PDUSessionResourceSetupListCxtRes li_resp; + for (var integer i := 0; i < lengthof(li_req); i := i + 1) { + var PDUSessionResourceSetupItemCxtRes it_resp; + it_resp := f_pdu_handle_session_resource_setup_item(li_req[i]); + if (i == 0) { /* min 1 item in list doesn't allow previously allocating an empty list */ + li_resp := { it_resp }; + } else { + li_resp := li_resp & { it_resp }; + } + } + return li_resp; +} + +private altstep as_ngap_handle_InitialCtxReq_withPDUSessionList() runs on ConnHdlr { + var NGAP_PDU rx_ngap; + + [] NGAP.receive(mw_ngap_initMsg(mw_n2_InitialContextSetupRequest_withPDUSessionList)) -> value rx_ngap { + var AMF_UE_NGAP_ID amf_id := valueof(f_NGAP_get_AMF_UE_NGAP_ID(rx_ngap)); + var RAN_UE_NGAP_ID ran_id := valueof(f_NGAP_get_RAN_UE_NGAP_ID(rx_ngap)); + var InitialContextSetupRequest ctx_setup_req := rx_ngap.initiatingMessage.value_.initialContextSetupRequest; + var PDUSessionResourceSetupListCxtRes resources; + + for (var integer i := 0; i < lengthof(ctx_setup_req.protocolIEs); i := i + 1) { + if (ctx_setup_req.protocolIEs[i].id != id_PDUSessionResourceSetupListCxtReq) { + continue; + } + var PDUSessionResourceSetupListCxtReq li := ctx_setup_req.protocolIEs[i].value_.pDUSessionResourceSetupListCxtReq; + resources := f_pdu_handle_session_resource_setup_list(li); + } + NGAP.send(m_ngap_succMsg(m_n2_InitialContextSetupResponse(amf_id, ran_id, resources))); + } +} + +private function f_pdu_sess_establish() runs on ConnHdlr { + var template (value) NG_NAS_UL_Message_Type nas_ul_msg; + var NAS_PDU nas_pdu; + var NG_NAS_DL_Message_Type rx_nas, inner_nas; + + 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); + as_ngap_handle_InitialCtxReq_withPDUSessionList(); + + /* PDU Session Establishment Accept: This DL NAS arrives contained in InitialCtxReq handled above: */ + NGAP.receive(cr_NG_DL_NAS_TRANSPORT) -> value rx_nas; + inner_nas := f_dec_NG_NAS_DL_Message_Payload_Container(rx_nas.dl_Nas_Transport.payloadContainerType.container, + rx_nas.dl_Nas_Transport.payload.payload); + g_pars.ue_pars.ue_ip := f_inet_ntoa(inner_nas.pdu_Session_Establishment_Accept.pduAddress.adressInfo); + log("5GC assigned CN GTPU Address: ", g_pars.ue_pars.cn_gtpu_ip, " TEID: ", g_pars.ue_pars.cn_gtpu_teid); + log("5GC assigned UE IP address: ", g_pars.ue_pars.ue_ip); +} + 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 +557,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/5gc/gen_links.sh b/5gc/gen_links.sh index ee09250..43a679b 100755 --- a/5gc/gen_links.sh +++ b/5gc/gen_links.sh @@ -78,7 +78,7 @@ FILES+="SCTP_Templates.ttcn " FILES+="DNS_Helpers.ttcn " FILES+="NGAP_CodecPort.ttcn NGAP_CodecPort_CtrlFunctDef.cc NGAP_CodecPort_CtrlFunct.ttcn NGAP_Functions.ttcn NGAP_Emulation.ttcn " -FILES+="NG_NAS_Osmo_Templates.ttcn NG_NAS_Functions.ttcn " +FILES+="NG_NAS_Osmo_Types.ttcn NG_NAS_Osmo_Templates.ttcn NG_NAS_Functions.ttcn " FILES+="NG_CryptoFunctionDefs.cc NG_CryptoFunctions.ttcn " gen_links $DIR $FILES diff --git a/deps/Makefile b/deps/Makefile index 8739abc..0f710e8 100644 --- a/deps/Makefile +++ b/deps/Makefile @@ -72,7 +72,7 @@ # Use tag names from 'git describe --tags' or commit hashes. This way we get # exact commits of deps when doing regression testing. -nas_commit= eff069b772a53e16773638f07599e7936ffcdd9a +nas_commit= 320d388e3aaee6c4f81488e6b5a8a27e7947b690 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_Functions.ttcn b/library/NG_NAS_Functions.ttcn index 4f0e4da..0fbfa75 100644 --- a/library/NG_NAS_Functions.ttcn +++ b/library/NG_NAS_Functions.ttcn @@ -13,16 +13,67 @@ import from NG_NAS_TypeDefs all; import from EAP_TypeDefs all; +import from General_Types all; +import from Misc_Helpers all; + +import from NG_NAS_Osmo_Types all; + external function enc_NG_NAS_UL_Message_Type(in NG_NAS_UL_Message_Type pdu) return octetstring with { extension "prototype(convert)" extension "encode(RAW)" } - external function dec_NG_NAS_UL_Message_Type(in octetstring stream) return NG_NAS_UL_Message_Type with { extension "prototype(convert)" extension "decode(RAW)" } external function enc_NG_NAS_DL_Message_Type(in NG_NAS_DL_Message_Type pdu) return octetstring with { extension "prototype(convert)" extension "encode(RAW)" } - external function dec_NG_NAS_DL_Message_Type(in octetstring stream) return NG_NAS_DL_Message_Type with { extension "prototype(convert)" extension "decode(RAW)" } +external function enc_NG_NAS_DL_SM_Message_Type(in NG_NAS_DL_SM_Message_Type pdu) return octetstring +with { extension "prototype(convert)" extension "encode(RAW)" } +external function dec_NG_NAS_DL_SM_Message_Type(in octetstring stream) return NG_NAS_DL_SM_Message_Type +with { extension "prototype(convert)" extension "decode(RAW)" } + + +/* Decode 3GPP TS 24.501 9.11.3.39 Payload container based on 9.11.3.40 Payload container type. + * Trying to decode it directly through dec_NG_NAS_DL_Message_Type() may end up with unexpected + * union choice due to circumstancial match in previous field securityHeaderType. + * pct = PayloadContainerType.container, payload = PayloadContainer.payload + */ +function f_dec_NG_NAS_DL_Message_Payload_Container(BIT4 pct, octetstring payload) return NG_NAS_DL_Message_Type +{ + var NG_NAS_DL_Message_Type ret; + select (pct) { + case (c_PayloadContainer_N1_SM_Info) { + var NG_NAS_DL_SM_Message_Type sm := dec_NG_NAS_DL_SM_Message_Type(payload); + if (ischosen(sm.pdu_Session_Authentication_Command)) { + ret.pdu_Session_Authentication_Command := sm.pdu_Session_Authentication_Command; + } else if (ischosen(sm.pdu_Session_Authentication_Result)) { + ret.pdu_Session_Authentication_Result := sm.pdu_Session_Authentication_Result; + } else if (ischosen(sm.pdu_Session_Establishment_Accept)) { + ret.pdu_Session_Establishment_Accept := sm.pdu_Session_Establishment_Accept; + } else if (ischosen(sm.pdu_Session_Establishment_Reject)) { + ret.pdu_Session_Establishment_Reject := sm.pdu_Session_Establishment_Reject; + } else if (ischosen(sm.pdu_Session_Modification_Command)) { + ret.pdu_Session_Modification_Command := sm.pdu_Session_Modification_Command; + } else if (ischosen(sm.pdu_Session_Modification_Reject)) { + ret.pdu_Session_Release_Command := sm.pdu_Session_Release_Command; + } else if (ischosen(sm.pdu_Session_Release_Reject)) { + ret.pdu_Session_Release_Reject := sm.pdu_Session_Release_Reject; + } else if (ischosen(sm.gsm_Status)) { + ret.gsm_Status := sm.gsm_Status; + } else { + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, + log2str("Unexpected decoded Payload Container ", sm)); + } + return ret; + } + case else { + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, + log2str("Unimplemented decoding of Payload Container Type ", + pct, ", Payload Container ", payload)); + } + } + return ret; +} + } diff --git a/library/NG_NAS_Osmo_Templates.ttcn b/library/NG_NAS_Osmo_Templates.ttcn index 9e61249..f417fcc 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 (value) 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/NG_NAS_Osmo_Types.ttcn b/library/NG_NAS_Osmo_Types.ttcn new file mode 100644 index 0000000..1e76a98 --- /dev/null +++ b/library/NG_NAS_Osmo_Types.ttcn @@ -0,0 +1,70 @@ +/* Our own NG NAS Types on top of + * deps/nas/ttcn/Lib3GPP/NG_NAS/NG_NAS_TypesDefs.ttcn, NG_NAS_MsgContainers.ttcn, + * etc. */ +module NG_NAS_Osmo_Types { + +/* (C) 2025 by sysmocom - s.f.m.c. GmbH <info(a)sysmocom.de> + * All rights reserved. + * + * Released under the terms of GNU General Public License, Version 2 or + * (at your option) any later version. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +import from CommonDefs all; +import from NAS_CommonTypeDefs all; +import from NAS_CommonTemplates all; +import from NG_NAS_Common all; +import from NG_NAS_TypeDefs all; +import from NG_NAS_Templates all; +import from NG_NAS_MsgContainers all; + +import from General_Types all; + +/* 3GPP TS 24.501 9.11.3.40 Payload container type */ +const BIT4 c_PayloadContainer_N1_SM_Info := '0001'B; +const BIT4 c_PayloadContainer_SMS := '0010'B; +const BIT4 c_PayloadContainer_LPP_Msg_Container := '0011'B; +const BIT4 c_PayloadContainer_SOR_Transp_Container := '0100'B; +const BIT4 c_PayloadContainer_UE_Policy_Container := '0101'B; +const BIT4 c_PayloadContainer_UE_Pars_Upd_Transp_Container := '0110'B; +const BIT4 c_PayloadContainer_Loc_Services_Msg_Container := '0110'B; +const BIT4 c_PayloadContainer_CIoT_User_Data_Container := '0111'B; +const BIT4 c_PayloadContainer_Serv_Lvl_AA_Container := '1001'B; +const BIT4 c_PayloadContainer_Event_Notification := '1010'B; +const BIT4 c_PayloadContainer_UPP_CMI_Container := '1011'B; +const BIT4 c_PayloadContainer_SLPP_Message_Container := '1100'B; +const BIT4 c_PayloadContainer_Multiple_Payloads := '1111'B; + +/* This is a subset of the msgs in NG_NAS_DL_Message_Type. The subset is formed + * by Session Management messages, see 3GPP TS 24.501 clause 6 and clause 8.3. + * This is needed to properly decode 3GPP TS 24.501 9.11.3.39 Payload container, + * whose content changes based on 9.11.3.40 Payload container type. Trying to decode + * it through dec_NG_NAS_DL_Message_Type() may end up with unexpected union choice + * due to circumstancial match in previous field securityHeaderType. */ +type union NG_NAS_DL_SM_Message_Type { /* NAS message with direction 'network to UE' or 'both' */ + NG_PDU_SESSION_AUTHENTICATION_COMMAND pdu_Session_Authentication_Command, + NG_PDU_SESSION_AUTHENTICATION_RESULT pdu_Session_Authentication_Result, + NG_PDU_SESSION_ESTABLISHMENT_ACCEPT pdu_Session_Establishment_Accept, + NG_PDU_SESSION_ESTABLISHMENT_REJECT pdu_Session_Establishment_Reject, + NG_PDU_SESSION_MODIFICATION_COMMAND pdu_Session_Modification_Command, + NG_PDU_SESSION_MODIFICATION_REJECT pdu_Session_Modification_Reject, + NG_PDU_SESSION_RELEASE_COMMAND pdu_Session_Release_Command, + NG_PDU_SESSION_RELEASE_REJECT pdu_Session_Release_Reject, + NG_GSM_STATUS gsm_Status + } with { + variant "TAG( + pdu_Session_Authentication_Command, messageType = '11000101'B; + pdu_Session_Authentication_Result, messageType = '11000111'B; + pdu_Session_Establishment_Accept, messageType = '11000010'B; + pdu_Session_Establishment_Reject, messageType = '11000011'B; + pdu_Session_Modification_Command, messageType = '11001011'B; + pdu_Session_Modification_Reject, messageType = '11001010'B; + pdu_Session_Release_Command, messageType = '11010011'B; + pdu_Session_Release_Reject, messageType = '11010010'B; + gsm_Status, messageType = '11010110'B; + )" +}; + +} with { encode "RAW" } diff --git a/library/ngap/NGAP_EncDec.cc b/library/ngap/NGAP_EncDec.cc index c54868a..ccdfe83 100644 --- a/library/ngap/NGAP_EncDec.cc +++ b/library/ngap/NGAP_EncDec.cc @@ -1,6 +1,7 @@ #include <string.h> #include <stdarg.h> +#include "NGAP_IEs.hh" #include "NGAP_PDU_Descriptions.hh" namespace NGAP__Types { @@ -27,4 +28,45 @@ return pdu; } +OCTETSTRING enc__NGAP__PDUSessionResourceSetupRequestTransfer(const NGAP__IEs::PDUSessionResourceSetupRequestTransfer &p) +{ + TTCN_Buffer TTCN_buf; + TTCN_buf.clear(); + p.encode(NGAP__IEs::PDUSessionResourceSetupRequestTransfer_descr_, TTCN_buf, + TTCN_EncDec::CT_PER, PER_ALIGNED); + return OCTETSTRING(TTCN_buf.get_len(), TTCN_buf.get_data()); +} + +NGAP__IEs::PDUSessionResourceSetupRequestTransfer dec__NGAP__PDUSessionResourceSetupRequestTransfer(const OCTETSTRING &stream) +{ + NGAP__IEs::PDUSessionResourceSetupRequestTransfer ret; + TTCN_Buffer TTCN_buf; + TTCN_buf.clear(); + TTCN_buf.put_os(stream); + ret.decode(NGAP__IEs::PDUSessionResourceSetupRequestTransfer_descr_, TTCN_buf, + TTCN_EncDec::CT_PER, PER_ALIGNED); + return ret; + +} + +OCTETSTRING enc__NGAP__PDUSessionResourceSetupResponseTransfer(const NGAP__IEs::PDUSessionResourceSetupResponseTransfer &p) +{ + TTCN_Buffer TTCN_buf; + TTCN_buf.clear(); + p.encode(NGAP__IEs::PDUSessionResourceSetupResponseTransfer_descr_, TTCN_buf, + TTCN_EncDec::CT_PER, PER_ALIGNED); + return OCTETSTRING(TTCN_buf.get_len(), TTCN_buf.get_data()); +} + +NGAP__IEs::PDUSessionResourceSetupResponseTransfer dec__NGAP__PDUSessionResourceSetupResponseTransfer(const OCTETSTRING &stream) +{ + NGAP__IEs::PDUSessionResourceSetupResponseTransfer ret; + TTCN_Buffer TTCN_buf; + TTCN_buf.clear(); + TTCN_buf.put_os(stream); + ret.decode(NGAP__IEs::PDUSessionResourceSetupResponseTransfer_descr_, TTCN_buf, + TTCN_EncDec::CT_PER, PER_ALIGNED); + return ret; +} + } diff --git a/library/ngap/NGAP_Templates.ttcn b/library/ngap/NGAP_Templates.ttcn index 697709b..32ee82c 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 } } } } diff --git a/library/ngap/NGAP_Types.ttcn b/library/ngap/NGAP_Types.ttcn index bddb921..dfa6586 100644 --- a/library/ngap/NGAP_Types.ttcn +++ b/library/ngap/NGAP_Types.ttcn @@ -1,7 +1,14 @@ module NGAP_Types { + import from NGAP_IEs language "ASN.1:2002" all; import from NGAP_PDU_Descriptions language "ASN.1:2002" all; external function enc_NGAP_PDU(in NGAP_PDU pdu) return octetstring; external function dec_NGAP_PDU(in octetstring stream) return NGAP_PDU; + + external function enc_NGAP_PDUSessionResourceSetupRequestTransfer(NGAP_IEs.PDUSessionResourceSetupRequestTransfer p) return octetstring; + external function dec_NGAP_PDUSessionResourceSetupRequestTransfer(in octetstring pdu) return NGAP_IEs.PDUSessionResourceSetupRequestTransfer; + + external function enc_NGAP_PDUSessionResourceSetupResponseTransfer(NGAP_IEs.PDUSessionResourceSetupResponseTransfer p) return octetstring; + external function dec_NGAP_PDUSessionResourceSetupResponseTransfer(in octetstring pdu) return NGAP_IEs.PDUSessionResourceSetupResponseTransfer; } -- To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40445?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: merged Gerrit-Project: osmo-ttcn3-hacks Gerrit-Branch: master Gerrit-Change-Id: If0769afd07a4bae7778d7a7c347cebaa5909b5f8 Gerrit-Change-Number: 40445 Gerrit-PatchSet: 7 Gerrit-Owner: pespin <pespin(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: jolly <andreas(a)eversberg.eu> Gerrit-Reviewer: osmith <osmith(a)sysmocom.de> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-CC: laforge <laforge(a)osmocom.org>
1 0
0 0
[L] Change in osmo-ttcn3-hacks[master]: 5gc: Support PDU Session Establishment procedure
by pespin 25 Jul '25

25 Jul '25
Attention is currently required from: fixeria, laforge, osmith. pespin has posted comments on this change by pespin. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40445?usp=email ) Change subject: 5gc: Support PDU Session Establishment procedure ...................................................................... Patch Set 7: Code-Review+2 -- To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40445?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: comment Gerrit-Project: osmo-ttcn3-hacks Gerrit-Branch: master Gerrit-Change-Id: If0769afd07a4bae7778d7a7c347cebaa5909b5f8 Gerrit-Change-Number: 40445 Gerrit-PatchSet: 7 Gerrit-Owner: pespin <pespin(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: jolly <andreas(a)eversberg.eu> Gerrit-Reviewer: osmith <osmith(a)sysmocom.de> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-CC: laforge <laforge(a)osmocom.org> Gerrit-Attention: osmith <osmith(a)sysmocom.de> Gerrit-Attention: laforge <laforge(a)osmocom.org> Gerrit-Attention: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Comment-Date: Fri, 25 Jul 2025 14:11:07 +0000 Gerrit-HasComments: No Gerrit-Has-Labels: Yes
1 0
0 0
[M] Change in osmo-ttcn3-hacks[master]: pgw: Move to library/ high level APIs to run commands over UECUPS
by pespin 25 Jul '25

25 Jul '25
Hello Jenkins Builder, I'd like you to reexamine a change. Please visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40753?usp=email to look at the new patch set (#2). The following approvals got outdated and were removed: Verified+1 by Jenkins Builder Change subject: pgw: Move to library/ high level APIs to run commands over UECUPS ...................................................................... pgw: Move to library/ high level APIs to run commands over UECUPS This way the code can be reused by other testsuites more easily. Change-Id: I49c98fd423e47e16ddfb9ae4612b18db21ca3fa4 --- M library/GTPv1U_Emulation.ttcnpp M pgw/PGW_Tests.ttcn 2 files changed, 98 insertions(+), 62 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/53/40753/2 -- To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40753?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: newpatchset Gerrit-Project: osmo-ttcn3-hacks Gerrit-Branch: master Gerrit-Change-Id: I49c98fd423e47e16ddfb9ae4612b18db21ca3fa4 Gerrit-Change-Number: 40753 Gerrit-PatchSet: 2 Gerrit-Owner: pespin <pespin(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder
1 0
0 0
[M] Change in osmo-ttcn3-hacks[master]: pgw: Move to library/ high level APIs to run commands over UECUPS
by pespin 25 Jul '25

25 Jul '25
pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40753?usp=email ) Change subject: pgw: Move to library/ high level APIs to run commands over UECUPS ...................................................................... pgw: Move to library/ high level APIs to run commands over UECUPS This way the code can be reused by other testsuites more easily. Change-Id: I49c98fd423e47e16ddfb9ae4612b18db21ca3fa4 --- M library/GTPv1U_Emulation.ttcnpp M pgw/PGW_Tests.ttcn 2 files changed, 98 insertions(+), 62 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/53/40753/1 diff --git a/library/GTPv1U_Emulation.ttcnpp b/library/GTPv1U_Emulation.ttcnpp index 8b76379..657d094 100644 --- a/library/GTPv1U_Emulation.ttcnpp +++ b/library/GTPv1U_Emulation.ttcnpp @@ -389,6 +389,89 @@ } return res; } + +/*********************************************************************** + * High level APIs for user convenience + ***********************************************************************/ +/* start a program on the user plane side; return its PID */ +function f_gtp1u_start_prog(UECUPS_StartProgram sprog, + boolean redirect_output := false, + charstring redirect_output_path_prefix := "gtp1u_run_prog", + integer port_idx := 0) +runs on GTP1U_ConnHdlr return integer +{ + var charstring cmd := sprog.command; + /* Redirect stdout/stderr to the user-specified location */ + if (redirect_output) { + sprog.command := cmd & " 1>>" & redirect_output_path_prefix & ".prog.stdout"; + sprog.command := cmd & " 2>>" & redirect_output_path_prefix & ".prog.stderr"; + } + + log("Starting a program: ", cmd); + var UECUPS_StartProgramRes res := f_gtp1u_start_program(sprog, port_idx := port_idx); + if (res.result != OK) { + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, + log2str("Unable to start program '", cmd, "'")); + } + log("Started program '", cmd, "' with PID ", res.pid); + return res.pid; +} + +/* wait for termination of a given PID with specified exit_code */ +function f_gtp1u_wait_term(integer pid, template (present) integer exit_code := 0, + float tout := 10.0, + integer port_idx := 0) runs on GTP1U_ConnHdlr +{ + var UECUPS_ProgramTermInd pti; + timer T := tout; + + T.start; + alt { + [] GTP1U[port_idx].receive(UECUPS_ProgramTermInd:{pid := pid, exit_code := exit_code}) { + setverdict(pass); + } + [] GTP1U[port_idx].receive(UECUPS_ProgramTermInd:?) -> value pti { + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, + log2str("Received unexpected ProgramTermInd := ", pti)); + } + [] T.timeout { + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, + log2str("timeout (", tout, " seconds) waiting for user-plane program PID ", pid, " termination")); + } + } +} + +/* execute a program and wait for result */ +function f_gtp1u_start_prog_wait(UECUPS_StartProgram sprog, + template integer exit_code := 0, + float tout := 10.0, + boolean redirect_output := false, + charstring redirect_output_path_prefix := "gtp1u_run_prog", + integer port_idx := 0) +runs on GTP1U_ConnHdlr +{ + var integer pid := f_gtp1u_start_prog(sprog, redirect_output, redirect_output_path_prefix, port_idx); + f_gtp1u_wait_term(pid, exit_code, tout, port_idx); +} + +/* execute ping command and wait for result. sprog.command is filled in based on params. */ +function f_gtp1u_ping4(UECUPS_StartProgram sprog, + charstring host, integer interval := 1, integer count := 10, + template (omit) charstring src_ip := omit, + boolean redirect_output := false, + charstring redirect_output_path_prefix := "gtp1u_run_prog", + integer port_idx := 0) runs on GTP1U_ConnHdlr +{ + var charstring ping :="ping -c " & int2str(count) & " -i " & int2str(interval); + + if (isvalue(src_ip)) { + ping := ping & " -I " & valueof(src_ip); + } + ping := ping & " " & host; + sprog.command := ping; + f_gtp1u_start_prog_wait(sprog, 0, int2float(5 + interval*count), + redirect_output, redirect_output_path_prefix, port_idx); +} #endif } diff --git a/pgw/PGW_Tests.ttcn b/pgw/PGW_Tests.ttcn index 16ac9ee..c63568e 100644 --- a/pgw/PGW_Tests.ttcn +++ b/pgw/PGW_Tests.ttcn @@ -898,9 +898,8 @@ } } -/* start a program on the user plane side; return its PID */ -private function f_start_prog(charstring command, boolean redirect_output := true) -runs on PGW_Session_CT return integer + +private function f_run_prog_init(charstring command) runs on PGW_Session_CT return UECUPS_StartProgram { var UECUPS_StartProgram sprog := { command := command, @@ -908,76 +907,30 @@ run_as_user := mp_run_prog_as_user, tun_netns_name := g_pars.tun_netns_name }; + return sprog; +} + +private function f_run_prog_unique_log_path() runs on PGW_Session_CT return charstring +{ + var charstring id := testcasename() & "-" & hex2str(g_pars.imsi) & "-" & int2str(g_start_prog_count); + var charstring prefix := mp_run_prog_log_path & "/" & id; g_start_prog_count := g_start_prog_count + 1; - - /* Redirect stdout/stderr to the user-specified location */ - if (redirect_output) { - var charstring id := testcasename() & "-" & hex2str(g_pars.imsi) & "-" & int2str(g_start_prog_count); - var charstring prefix := mp_run_prog_log_path & "/" & id; - sprog.command := sprog.command & " 1>>" & prefix & ".prog.stdout"; - sprog.command := sprog.command & " 2>>" & prefix & ".prog.stderr"; - } - - log("Starting a program: ", command); - var UECUPS_StartProgramRes res := f_gtp1u_start_program(sprog); - if (res.result != OK) { - Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, - log2str("Unable to start program '", command, "'")); - } - log("Started program '", command, "' with PID ", res.pid); - return res.pid; -} - -/* wait for termination of a given PID with specified exit_code */ -private function f_wait_term(integer pid, template (present) integer exit_code := 0, - float tout := 10.0) runs on PGW_Session_CT -{ - var UECUPS_ProgramTermInd pti; - timer T := tout; - - T.start; - alt { - [] GTP1U[0].receive(UECUPS_ProgramTermInd:{pid := pid, exit_code := exit_code}) { - setverdict(pass); - } - [] GTP1U[0].receive(UECUPS_ProgramTermInd:?) -> value pti { - Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, - log2str("Received unexpected ProgramTermInd := ", pti)); - } - [] T.timeout { - Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, - log2str("timeout (", tout, " seconds) waiting for user-plane program PID ", pid, " termination")); - } - } -} - -/* execute a program and wait for result */ -private function f_start_prog_wait(charstring command, - template integer exit_code := 0, - float tout := 10.0, - boolean redirect_output := true) -runs on PGW_Session_CT -{ - var integer pid := f_start_prog(command, redirect_output); - f_wait_term(pid, exit_code, tout); + return prefix; } /* execute ping command and wait for result */ private function f_ping4(charstring host, integer interval := 1, integer count := 10) runs on PGW_Session_CT { - var charstring ping :="ping -c " & int2str(count) & " -i " & int2str(interval); - if (not isbound(g_ip4_addr)) { Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "f_ping4(): g_ip4_addr is unset!"); } - ping := ping & " -I " & f_inet_ntoa(g_ip4_addr); - ping := ping & " " & host; - f_start_prog_wait(ping, tout := int2float(5 + interval*count)); + /* command will be filled in by f_gtp1u_ping4() below: */ + var UECUPS_StartProgram sprog := f_run_prog_init(""); + f_gtp1u_ping4(sprog, host, interval, count, f_inet_ntoa(g_ip4_addr), + redirect_output := true, + redirect_output_path_prefix := f_run_prog_unique_log_path()); } - - - /* send echo request; expect response */ testcase TC_tx_echo() runs on PGW_Test_CT { timer T := 5.0; -- To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40753?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: newchange Gerrit-Project: osmo-ttcn3-hacks Gerrit-Branch: master Gerrit-Change-Id: I49c98fd423e47e16ddfb9ae4612b18db21ca3fa4 Gerrit-Change-Number: 40753 Gerrit-PatchSet: 1 Gerrit-Owner: pespin <pespin(a)sysmocom.de>
1 0
0 0
[L] Change in osmo-ttcn3-hacks[master]: Move ConnHdlr logic to its own file
by pespin 25 Jul '25

25 Jul '25
Hello Jenkins Builder, I'd like you to reexamine a change. Please visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40752?usp=email to look at the new patch set (#2). The following approvals got outdated and were removed: Verified+1 by Jenkins Builder Change subject: Move ConnHdlr logic to its own file ...................................................................... Move ConnHdlr logic to its own file Similar to what we do in other testsuites, since we start to have considrable amount of logic. Change-Id: If7edf8ee63c71fbf949e2d340cf3881fd8e3ba41 --- M 5gc/C5G_Tests.ttcn A 5gc/ConnHdlr.ttcn 2 files changed, 375 insertions(+), 324 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/52/40752/2 -- To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40752?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: newpatchset Gerrit-Project: osmo-ttcn3-hacks Gerrit-Branch: master Gerrit-Change-Id: If7edf8ee63c71fbf949e2d340cf3881fd8e3ba41 Gerrit-Change-Number: 40752 Gerrit-PatchSet: 2 Gerrit-Owner: pespin <pespin(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder
1 0
0 0
[S] Change in osmo-ttcn3-hacks[master]: 5gc: C5G_Tests.cfg: Set module name of multiple module params
by pespin 25 Jul '25

25 Jul '25
pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40751?usp=email ) Change subject: 5gc: C5G_Tests.cfg: Set module name of multiple module params ...................................................................... 5gc: C5G_Tests.cfg: Set module name of multiple module params Change-Id: I936240af988d4727516b5722dd360a907d70eee7 --- M 5gc/C5G_Tests.cfg 1 file changed, 7 insertions(+), 7 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/51/40751/1 diff --git a/5gc/C5G_Tests.cfg b/5gc/C5G_Tests.cfg index d45b963..ec6f129 100644 --- a/5gc/C5G_Tests.cfg +++ b/5gc/C5G_Tests.cfg @@ -12,13 +12,13 @@ [MODULE_PARAMETERS] # S1 interface -mp_5gc_ngap_ip := "127.0.0.5"; -mp_5gc_ngap_port := 38412; -mp_local_ngap_ip := "127.0.0.202"; -mp_local_ngap_port := 50000; -mp_imsi := '999700000000000'H; -mp_usim_key := '762a2206fe0b4151ace403c86a11e479'O; -mp_usim_opc := '3c6e0b8a9c15224a8228b9a98ca1531d'O; +C5G_Tests.mp_5gc_ngap_ip := "127.0.0.5"; +C5G_Tests.mp_5gc_ngap_port := 38412; +C5G_Tests.mp_local_ngap_ip := "127.0.0.202"; +C5G_Tests.mp_local_ngap_port := 50000; +C5G_Tests.mp_imsi := '999700000000000'H; +C5G_Tests.mp_usim_key := '762a2206fe0b4151ace403c86a11e479'O; +C5G_Tests.mp_usim_opc := '3c6e0b8a9c15224a8228b9a98ca1531d'O; [MAIN_CONTROLLER] -- To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40751?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: newchange Gerrit-Project: osmo-ttcn3-hacks Gerrit-Branch: master Gerrit-Change-Id: I936240af988d4727516b5722dd360a907d70eee7 Gerrit-Change-Number: 40751 Gerrit-PatchSet: 1 Gerrit-Owner: pespin <pespin(a)sysmocom.de>
1 0
0 0
[L] Change in osmo-ttcn3-hacks[master]: Move ConnHdlr logic to its own file
by pespin 25 Jul '25

25 Jul '25
pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40752?usp=email ) Change subject: Move ConnHdlr logic to its own file ...................................................................... Move ConnHdlr logic to its own file Similar to what we do in other testsuites, since we start to have considrable amount of logic. Change-Id: If7edf8ee63c71fbf949e2d340cf3881fd8e3ba41 --- M 5gc/C5G_Tests.ttcn A 5gc/ConnHdlr.ttcn 2 files changed, 379 insertions(+), 321 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/52/40752/1 diff --git a/5gc/C5G_Tests.ttcn b/5gc/C5G_Tests.ttcn index 3b84a58..5fc5d4d 100644 --- a/5gc/C5G_Tests.ttcn +++ b/5gc/C5G_Tests.ttcn @@ -45,6 +45,8 @@ import from NG_NAS_Functions all; import from NG_CryptoFunctions all; +import from ConnHdlr all; + /* (maximum) number of emulated eNBs */ const integer NUM_NGRAN := 1; @@ -68,35 +70,13 @@ charstring mp_local_gtpu_ip := "127.0.0.1"; } -/* parameters of emulated gNB / ng-eNB */ -type record NGRANParams { - GlobalRANNodeID global_ngran_id, - NGRAN_CGI cell_identity, - SupportedTAList supported_ta_list -} - -/* parameters of emulated UE */ -type record UeParams { - HEX15n imsi, - HEX16n imeisv, - octetstring usim_key, - octetstring usim_opc, - charstring ran_gtpu_ip, - OCT4 ran_gtpu_teid, - charstring cn_gtpu_ip optional, - OCT4 cn_gtpu_teid optional, - charstring ue_ip optional, - OCT32 kausf optional, - OCT32 kseaf optional, - OCT32 kamf optional -} - template (value) UeParams ts_UeParams(integer imsi_suffix) := { imsi := f_concat_pad(lengthof(mp_imsi), substr(mp_imsi, 0, lengthof(mp_imsi) - 6), imsi_suffix), imeisv := f_rnd_imeisv(), usim_key := mp_usim_key, usim_opc := mp_usim_opc, + apn := mp_apn, ran_gtpu_ip := mp_local_gtpu_ip, ran_gtpu_teid := int2oct(imsi_suffix, 4), cn_gtpu_ip := omit, @@ -119,21 +99,6 @@ var UeParams g_ue_pars[NUM_UE]; } -type component ConnHdlr extends NGAP_ConnHdlr { - var ConnHdlrPars g_pars; -} - -type record ConnHdlrPars { - /* copied over from MTC_CT on start of component */ - NGRANParams ngran_pars[NUM_NGRAN], - /* copied over from MTC_CT on start of component */ - UeParams ue_pars, - /* currently used 5GC (index into ngran_pars, NGAP, ...) */ - integer c5g_idx, - /* Currently set KSI */ - NAS_KeySetIdentifier kset_id -} - /* send incoming unit data messages (like reset) to global NGAP_UNIT port */ private function NGapForwardUnitdataCallback(NGAP_PDU msg) runs on NGAP_Emulation_CT return template NGAP_PDU { @@ -213,8 +178,6 @@ return pars; } -type function void_fn() runs on ConnHdlr; - /* start a connection handler with given parameters */ private function f_start_handler_with_pars(void_fn fn, ConnHdlrPars pars, integer ngap_idx := 0) runs on MTC_CT return ConnHdlr { @@ -245,44 +208,6 @@ fn.apply(); } -private template (value) NGAP_IEs.TAI ts_ngran_NGAP_TAI(NGRANParams ngran_pars) := { - pLMNIdentity := ngran_pars.global_ngran_id.globalGNB_ID.pLMNIdentity, - tAC := ngran_pars.supported_ta_list[0].tAC, - iE_Extensions := omit -} - -private function f_imsi_plmn_id() runs on ConnHdlr return PLMNIdentity { - var hexstring imsi := g_pars.ue_pars.imsi; - var GsmMcc mcc := substr(imsi, 0, 3); - var GsmMnc mnc := substr(imsi, 3, 2); - return f_enc_mcc_mnc(mcc, mnc); -} - -private function f_SUCI_IMSI() runs on ConnHdlr return octetstring { - var hexstring imsi := g_pars.ue_pars.imsi; - var PLMNIdentity plmn_id := f_imsi_plmn_id(); - var octetstring imsi_suffix := imsi_hex2oct(substr(imsi, lengthof(imsi) - 10, 10)); - return plmn_id & '21430001'O & imsi_suffix; -} - -private function f_UE_SecurityCapability() runs on ConnHdlr return NG_UE_SecurityCapability { - var template (value) NG_UE_SecurityCapability ue_sec_cap; - ue_sec_cap := cs_NG_UE_SecurityCapabilityTLV(ngeaCap := '80'O, /* ONLY NEA0 (no encryption) for now */ - ngiaCap := '40'O /* ONLY NIA1 supported */); - return valueof(ue_sec_cap); -} - -private function f_ULI() runs on ConnHdlr return UserLocationInformation { - var template (value) UserLocationInformation p_ueLocInf - p_ueLocInf := m_uPTransportLayerInformation_userLocationInformationNR( - m_userLocationInformationNR( - g_pars.ngran_pars[g_pars.c5g_idx].cell_identity.nR_CGI, - ts_ngran_NGAP_TAI(g_pars.ngran_pars[g_pars.c5g_idx]) - - )); - return valueof(p_ueLocInf); -} - private function f_ngap_setup(integer idx := 0, template (omit) NGAP_IEs.Cause cause := omit) runs on MTC_CT { var template (present) NGAP_IEs.Cause exp_cause := ?; var boolean exp_fail := false; @@ -323,249 +248,6 @@ } } -private function f_tr_ConnHdlr_kset_id() runs on ConnHdlr return template (present) NAS_KeySetIdentifier { - /* KSI not yet set, expect whatever assignment from network: */ - if (g_pars.kset_id.nasKeySetId == tsc_NasKsi_NoKey) { - return cr_NAS_KeySetIdentifier(?, ?); - } else { - /* Expect specific kset_id. Upon transmitting it UE->Network, f_attach() - * has updated it to the expected value. */ - return g_pars.kset_id; - } -} - -/* 3GPP TS 24.501 5.4.1.3.2, 3GPP TS 33.501 6.1.3.2 */ -private altstep as_ngap_handle_auth(boolean allow_resync := true) runs on ConnHdlr { - var NG_NAS_DL_Message_Type rx_nas; - var template (present) NAS_KeySetIdentifier kset_id := f_tr_ConnHdlr_kset_id(); - [] NGAP.receive(cr_NG_AUTHENTICATION_REQUEST) -> value rx_nas { - var integer ret; - var integer my_sqn := 0; /* TODO: move to a ConnHdlr state attribute? */ - var OCT16 rand := bit2oct(rx_nas.authentication_Request.rand.randValue); - var OCT16 autn := bit2oct(rx_nas.authentication_Request.autn.aUTN); - var OCT2 abba := rx_nas.authentication_Request.abba.abbaValue; - var OCT16 ik; - var OCT16 ck; - var OCT8 res; - var OCT14 auts; - - g_pars.kset_id := rx_nas.authentication_Request.ngNasKeySetId; - - ret := f_milenage_check(g_pars.ue_pars.usim_key, - g_pars.ue_pars.usim_opc, - int2oct(my_sqn, 8), - rand, autn, ik, ck, res, auts); - if (ret == -1) { - Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, - log2str("fx_milenage_check() failed! -1")); - } - if (ret == -2) { - if (not allow_resync) { - Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, - log2str("fx_milenage_check() unexpected Resync!")); - } - log("Milenage: RX-SQN differs from SIM SQN: Re-Sync! AUTS=", auts); - /* 3GPP TS 24.501 5.4.1.3.6 d) */ - NGAP.send(cs_NG_AUTHENTICATION_FAILURE(cs_GMM_GSM_Cause(omit, int2bit(21, 8)), - cs_AuthFailParam(oct2bit(auts)))); - as_ngap_handle_auth(allow_resync := false); - return; - } - - var octetstring ssn := f_NG_NAS_ServingNetworkName_OCT(f_imsi_plmn_id(), omit); - g_pars.ue_pars.kausf := f_kdf_kausf(ck, ik, ssn, autn); - g_pars.ue_pars.kseaf := f_kdf_kseaf(g_pars.ue_pars.kausf, ssn); - g_pars.ue_pars.kamf := f_kdf_kamf(g_pars.ue_pars.kseaf, char2oct(hex2str(g_pars.ue_pars.imsi)), abba); - - var NGAPEM_Config cfg := { - set_nas_keys := { - k_nas_int := f_kdf_ng_nas_int(g_pars.ue_pars.kamf, NG_NAS_ALG_IP_NIA1), - k_nas_enc := f_kdf_ng_nas_enc(g_pars.ue_pars.kamf, NG_NAS_ALG_ENC_NEA0) - } - }; - NGAP.send(cfg); - - /* Derive (X)RES* from (X)RES, 3GPP TS 33.501 A.4 */ - var OCT16 res_star := f_kdf_xres_star(ssn, ck, ik, rand, res); - NGAP.send(cs_NG_AUTHENTICATION_RESPONSE(cs_AuthenticationResponseParameter(oct2bit(res_star)))); - } -} - -private altstep as_ngap_handle_sec_mode() runs on ConnHdlr { - var NGAPEM_Config cfg; - var NG_NAS_DL_Message_Type rx_nas; - /* Make sure network selected specific algos we requested: */ - var template (present) NG_UE_SecurityCapability ue_sec_cap := - cr_NG_UE_SecurityCapabilityLV(ngeaCap := '80'O, /* ONLY NEA0 (no encryption) for now */ - ngiaCap := '40'O /* ONLY NIA1 supported */); - - [] NGAP.receive(cr_NG_SECURITY_MODE_COMMAND(p_UECap := ue_sec_cap)) -> value rx_nas { - /* Configure integrity protection: */ - cfg := { - set_nas_alg_int := NG_NAS_ALG_IP_NIA1 - }; - NGAP.send(cfg); - /* Configure Ciphering: */ - cfg := { - set_nas_alg_enc := NG_NAS_ALG_ENC_NEA0 - }; - NGAP.send(cfg); - - var template (value) NG_NAS_UL_Message_Type nas_ul_msg; - var NAS_PDU nas_pdu; - nas_ul_msg := cs_NG_REGISTRATION_REQUEST(cs_RegistrationType(tsc_NG_RegistrationInitial, '1'B), - g_pars.kset_id.nasKeySetId, - g_pars.kset_id.tsc, - cs_NG_MobileIdentitySUCI('0000'B /* Type IMSI */, - f_SUCI_IMSI()), - p_UESecurityCap := f_UE_SecurityCapability()); - nas_pdu := enc_NG_NAS_UL_Message_Type(valueof(nas_ul_msg)); - NGAP.send(cs_NG_SECURITY_MODE_COMPLETE(cs_NG_MobileIdentityTLV_IMEISV(hex2oct(g_pars.ue_pars.imeisv)), - cs_ReplayedNASMessageContainerTLV(nas_pdu))); - } -} - -private altstep as_ngap_handle_configuration_update() runs on ConnHdlr { - var NG_NAS_DL_Message_Type rx_nas; - - [] NGAP.receive(cr_NG_CONFIGURATION_UPDATE_COMMAND) -> value rx_nas { - NGAP.send(cs_NG_CONFIGURATION_UPDATE_COMPLETE); - } -} - -/* Handle a PDUSessionResourceSetupRequestTransfer contained inside NGAP InitialContextSetupRequest and return a Result for InitialContextSetupResponse */ -private function f_pdu_handle_session_resource_setup_item(PDUSessionResourceSetupItemCxtReq req) runs on ConnHdlr return PDUSessionResourceSetupItemCxtRes -{ - var PDUSessionResourceSetupItemCxtRes resp; - var octetstring setup_trans_enc; - var NGAP_IEs.PDUSessionResourceSetupRequestTransfer setup_req_transf; - var NGAP_IEs.PDUSessionResourceSetupResponseTransfer setup_resp_transf; - var template (value) UPTransportLayerInformation utla; - var template (value) QosFlowPerTNLInformation qos; - - /* Parse PDUSessionResourceSetupRequestTransfer contained inside InitialContextSetupRequest's PDUSessionResourceSetup Item: */ - setup_req_transf := dec_NGAP_PDUSessionResourceSetupRequestTransfer(req.pDUSessionResourceSetupRequestTransfer); - for (var integer i := 0; i < lengthof(setup_req_transf.protocolIEs); i := i + 1) { - if (setup_req_transf.protocolIEs[i].id == id_UL_NGU_UP_TNLInformation) { - var UPTransportLayerInformation utli := setup_req_transf.protocolIEs[i].value_.uPTransportLayerInformation; - g_pars.ue_pars.cn_gtpu_ip := f_inet_ntoa(bit2oct(utli.gTPTunnel.transportLayerAddress)); - g_pars.ue_pars.cn_gtpu_teid := utli.gTPTunnel.gTP_TEID; - } - } - - /* Prepare Response for it: */ - utla := m_uPTransportLayerInformation_gTPTunnel( - m_gTPTunnel(p_tla := oct2bit(f_inet_addr(g_pars.ue_pars.ran_gtpu_ip)), - p_gtp_teid := g_pars.ue_pars.ran_gtpu_teid)); - qos := m_qosFlowPerTNLInformation(utla, { m_associatedQosFlowItem(1) }); - setup_resp_transf := valueof(m_pDUSessionResourceSetupResponseTransfer(qos)); - setup_trans_enc := enc_NGAP_PDUSessionResourceSetupResponseTransfer(setup_resp_transf) - resp := valueof(m_pDUSessionResourceSetupItemCxtRes(req.pDUSessionID, setup_trans_enc)); - return resp; -} - -private function f_pdu_handle_session_resource_setup_list(PDUSessionResourceSetupListCxtReq li_req) runs on ConnHdlr return PDUSessionResourceSetupListCxtRes -{ - var PDUSessionResourceSetupListCxtRes li_resp; - for (var integer i := 0; i < lengthof(li_req); i := i + 1) { - var PDUSessionResourceSetupItemCxtRes it_resp; - it_resp := f_pdu_handle_session_resource_setup_item(li_req[i]); - if (i == 0) { /* min 1 item in list doesn't allow previously allocating an empty list */ - li_resp := { it_resp }; - } else { - li_resp := li_resp & { it_resp }; - } - } - return li_resp; -} - -private altstep as_ngap_handle_InitialCtxReq_withPDUSessionList() runs on ConnHdlr { - var NGAP_PDU rx_ngap; - - [] NGAP.receive(mw_ngap_initMsg(mw_n2_InitialContextSetupRequest_withPDUSessionList)) -> value rx_ngap { - var AMF_UE_NGAP_ID amf_id := valueof(f_NGAP_get_AMF_UE_NGAP_ID(rx_ngap)); - var RAN_UE_NGAP_ID ran_id := valueof(f_NGAP_get_RAN_UE_NGAP_ID(rx_ngap)); - var InitialContextSetupRequest ctx_setup_req := rx_ngap.initiatingMessage.value_.initialContextSetupRequest; - var PDUSessionResourceSetupListCxtRes resources; - - for (var integer i := 0; i < lengthof(ctx_setup_req.protocolIEs); i := i + 1) { - if (ctx_setup_req.protocolIEs[i].id != id_PDUSessionResourceSetupListCxtReq) { - continue; - } - var PDUSessionResourceSetupListCxtReq li := ctx_setup_req.protocolIEs[i].value_.pDUSessionResourceSetupListCxtReq; - resources := f_pdu_handle_session_resource_setup_list(li); - } - NGAP.send(m_ngap_succMsg(m_n2_InitialContextSetupResponse(amf_id, ran_id, resources))); - } -} - -private function f_pdu_sess_establish() runs on ConnHdlr { - var template (value) NG_NAS_UL_Message_Type nas_ul_msg; - var NAS_PDU nas_pdu; - var NG_NAS_DL_Message_Type rx_nas, inner_nas; - - 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); - as_ngap_handle_InitialCtxReq_withPDUSessionList(); - - /* PDU Session Establishment Accept: This DL NAS arrives contained in InitialCtxReq handled above: */ - NGAP.receive(cr_NG_DL_NAS_TRANSPORT) -> value rx_nas; - inner_nas := f_dec_NG_NAS_DL_Message_Payload_Container(rx_nas.dl_Nas_Transport.payloadContainerType.container, - rx_nas.dl_Nas_Transport.payload.payload); - g_pars.ue_pars.ue_ip := f_inet_ntoa(inner_nas.pdu_Session_Establishment_Accept.pduAddress.adressInfo); - log("5GC assigned CN GTPU Address: ", g_pars.ue_pars.cn_gtpu_ip, " TEID: ", g_pars.ue_pars.cn_gtpu_teid); - log("5GC assigned UE IP address: ", g_pars.ue_pars.ue_ip); -} - -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; - var NAS_PDU nas_pdu; - var NG_NAS_DL_Message_Type rx_nas; - - nas_ul_msg := cs_NG_REGISTRATION_REQUEST(cs_RegistrationType(tsc_NG_RegistrationInitial, '1'B), - g_pars.kset_id.nasKeySetId, - g_pars.kset_id.tsc, - cs_NG_MobileIdentitySUCI('0000'B /* Type IMSI */, - f_SUCI_IMSI()), - p_UESecurityCap := f_UE_SecurityCapability()); - nas_pdu := enc_NG_NAS_UL_Message_Type(valueof(nas_ul_msg)); - tx_pdu := m_ngap_initMsg(m_n2_initialUeMessage(g_pars.c5g_idx, - nas_pdu, /* Registration request */ - f_ULI(), - mo_Signalling)); - NGAP.send(tx_pdu); - - /* Expect updated KSI from network following 5G Core standards - *(open5gs.git 70310979c58fe186e9eaa06bec9d9a31f24ff7a1): */ - if (g_pars.kset_id.nasKeySetId != tsc_NasKsi_NoKey) { - if (g_pars.kset_id.nasKeySetId == '110'B) { - g_pars.kset_id.nasKeySetId := '000'B; - } else { - g_pars.kset_id.nasKeySetId := int2bit(bit2int(g_pars.kset_id.nasKeySetId) + 1, 3); - } - } - - as_ngap_handle_auth(); - as_ngap_handle_sec_mode(); - - NGAP.receive(cr_NG_REGISTRATION_ACCEPT) -> value rx_nas; - NGAP.send(cs_NG_REGISTRATION_COMPLETE); - - as_ngap_handle_configuration_update(); - - f_pdu_sess_establish(); -} - /* NG Setup procedure to 5GC using a Global gNB ID containing unknown/foreign PLMN. * Related: https://github.com/open5gs/open5gs/issues/3544 */ testcase TC_ng_setup_unknown_global_gnb_id_plmn() runs on MTC_CT { diff --git a/5gc/ConnHdlr.ttcn b/5gc/ConnHdlr.ttcn new file mode 100644 index 0000000..0f06447 --- /dev/null +++ b/5gc/ConnHdlr.ttcn @@ -0,0 +1,376 @@ +/* 5GC (55G Core) test suite in TTCN-3, ConnHdlr + * (C) 2025 by sysmocom - s.f.m.c. GmbH <info(a)sysmocom.de> + * All rights reserved. + * Author: Pau Espin Pedrol <pespin(a)sysmocom.de> + * + * Released under the terms of GNU General Public License, Version 2 or + * (at your option) any later version. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +module ConnHdlr { + +import from General_Types all; +import from Native_Functions all; +import from IPL4asp_Types all; +import from Misc_Helpers all; + +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; +import from NGAP_IEs all; +import from NGAP_PDU_Contents all; +import from NGAP_Constants all; + +import from NGAP_Types all; +import from NGAP_Pixits all; +import from NGAP_Templates all; +import from NGAP_Functions all; +import from NGAP_Emulation all; + +import from NAS_CommonTypeDefs all; +import from NAS_CommonTemplates all; +import from NG_NAS_Common all; +import from NG_NAS_TypeDefs all; +import from NG_NAS_MsgContainers all; +import from NG_NAS_Templates all; + +import from NG_NAS_Osmo_Templates all; +import from NG_NAS_Functions all; +import from NG_CryptoFunctions all; + +/* (maximum) number of emulated eNBs */ +const integer NUM_NGRAN := 1; + +/* (maximum) number of emulated UEs */ +const integer NUM_UE := 1; + +/* parameters of emulated gNB / ng-eNB */ +type record NGRANParams { + GlobalRANNodeID global_ngran_id, + NGRAN_CGI cell_identity, + SupportedTAList supported_ta_list +} + +/* parameters of emulated UE */ +type record UeParams { + HEX15n imsi, + HEX16n imeisv, + octetstring usim_key, + octetstring usim_opc, + charstring apn, + charstring ran_gtpu_ip, + OCT4 ran_gtpu_teid, + charstring cn_gtpu_ip optional, + OCT4 cn_gtpu_teid optional, + charstring ue_ip optional, + OCT32 kausf optional, + OCT32 kseaf optional, + OCT32 kamf optional +} + +type record ConnHdlrPars { + /* copied over from MTC_CT on start of component */ + NGRANParams ngran_pars[NUM_NGRAN], + /* copied over from MTC_CT on start of component */ + UeParams ue_pars, + /* currently used 5GC (index into ngran_pars, NGAP, ...) */ + integer c5g_idx, + /* Currently set KSI */ + NAS_KeySetIdentifier kset_id +} + +type component ConnHdlr extends NGAP_ConnHdlr { + var ConnHdlrPars g_pars; +} + +type function void_fn() runs on ConnHdlr; + +private template (value) NGAP_IEs.TAI ts_ngran_NGAP_TAI(NGRANParams ngran_pars) := { + pLMNIdentity := ngran_pars.global_ngran_id.globalGNB_ID.pLMNIdentity, + tAC := ngran_pars.supported_ta_list[0].tAC, + iE_Extensions := omit +} + +private function f_imsi_plmn_id() runs on ConnHdlr return PLMNIdentity { + var hexstring imsi := g_pars.ue_pars.imsi; + var GsmMcc mcc := substr(imsi, 0, 3); + var GsmMnc mnc := substr(imsi, 3, 2); + return f_enc_mcc_mnc(mcc, mnc); +} + +private function f_SUCI_IMSI() runs on ConnHdlr return octetstring { + var hexstring imsi := g_pars.ue_pars.imsi; + var PLMNIdentity plmn_id := f_imsi_plmn_id(); + var octetstring imsi_suffix := imsi_hex2oct(substr(imsi, lengthof(imsi) - 10, 10)); + return plmn_id & '21430001'O & imsi_suffix; +} + +private function f_UE_SecurityCapability() runs on ConnHdlr return NG_UE_SecurityCapability { + var template (value) NG_UE_SecurityCapability ue_sec_cap; + ue_sec_cap := cs_NG_UE_SecurityCapabilityTLV(ngeaCap := '80'O, /* ONLY NEA0 (no encryption) for now */ + ngiaCap := '40'O /* ONLY NIA1 supported */); + return valueof(ue_sec_cap); +} + +private function f_ULI() runs on ConnHdlr return UserLocationInformation { + var template (value) UserLocationInformation p_ueLocInf + p_ueLocInf := m_uPTransportLayerInformation_userLocationInformationNR( + m_userLocationInformationNR( + g_pars.ngran_pars[g_pars.c5g_idx].cell_identity.nR_CGI, + ts_ngran_NGAP_TAI(g_pars.ngran_pars[g_pars.c5g_idx]) + + )); + return valueof(p_ueLocInf); +} + +private function f_tr_ConnHdlr_kset_id() runs on ConnHdlr return template (present) NAS_KeySetIdentifier { + /* KSI not yet set, expect whatever assignment from network: */ + if (g_pars.kset_id.nasKeySetId == tsc_NasKsi_NoKey) { + return cr_NAS_KeySetIdentifier(?, ?); + } else { + /* Expect specific kset_id. Upon transmitting it UE->Network, f_attach() + * has updated it to the expected value. */ + return g_pars.kset_id; + } +} + +/* 3GPP TS 24.501 5.4.1.3.2, 3GPP TS 33.501 6.1.3.2 */ +private altstep as_ngap_handle_auth(boolean allow_resync := true) runs on ConnHdlr { + var NG_NAS_DL_Message_Type rx_nas; + var template (present) NAS_KeySetIdentifier kset_id := f_tr_ConnHdlr_kset_id(); + [] NGAP.receive(cr_NG_AUTHENTICATION_REQUEST) -> value rx_nas { + var integer ret; + var integer my_sqn := 0; /* TODO: move to a ConnHdlr state attribute? */ + var OCT16 rand := bit2oct(rx_nas.authentication_Request.rand.randValue); + var OCT16 autn := bit2oct(rx_nas.authentication_Request.autn.aUTN); + var OCT2 abba := rx_nas.authentication_Request.abba.abbaValue; + var OCT16 ik; + var OCT16 ck; + var OCT8 res; + var OCT14 auts; + + g_pars.kset_id := rx_nas.authentication_Request.ngNasKeySetId; + + ret := f_milenage_check(g_pars.ue_pars.usim_key, + g_pars.ue_pars.usim_opc, + int2oct(my_sqn, 8), + rand, autn, ik, ck, res, auts); + if (ret == -1) { + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, + log2str("fx_milenage_check() failed! -1")); + } + if (ret == -2) { + if (not allow_resync) { + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, + log2str("fx_milenage_check() unexpected Resync!")); + } + log("Milenage: RX-SQN differs from SIM SQN: Re-Sync! AUTS=", auts); + /* 3GPP TS 24.501 5.4.1.3.6 d) */ + NGAP.send(cs_NG_AUTHENTICATION_FAILURE(cs_GMM_GSM_Cause(omit, int2bit(21, 8)), + cs_AuthFailParam(oct2bit(auts)))); + as_ngap_handle_auth(allow_resync := false); + return; + } + + var octetstring ssn := f_NG_NAS_ServingNetworkName_OCT(f_imsi_plmn_id(), omit); + g_pars.ue_pars.kausf := f_kdf_kausf(ck, ik, ssn, autn); + g_pars.ue_pars.kseaf := f_kdf_kseaf(g_pars.ue_pars.kausf, ssn); + g_pars.ue_pars.kamf := f_kdf_kamf(g_pars.ue_pars.kseaf, char2oct(hex2str(g_pars.ue_pars.imsi)), abba); + + var NGAPEM_Config cfg := { + set_nas_keys := { + k_nas_int := f_kdf_ng_nas_int(g_pars.ue_pars.kamf, NG_NAS_ALG_IP_NIA1), + k_nas_enc := f_kdf_ng_nas_enc(g_pars.ue_pars.kamf, NG_NAS_ALG_ENC_NEA0) + } + }; + NGAP.send(cfg); + + /* Derive (X)RES* from (X)RES, 3GPP TS 33.501 A.4 */ + var OCT16 res_star := f_kdf_xres_star(ssn, ck, ik, rand, res); + NGAP.send(cs_NG_AUTHENTICATION_RESPONSE(cs_AuthenticationResponseParameter(oct2bit(res_star)))); + } +} + +private altstep as_ngap_handle_sec_mode() runs on ConnHdlr { + var NGAPEM_Config cfg; + var NG_NAS_DL_Message_Type rx_nas; + /* Make sure network selected specific algos we requested: */ + var template (present) NG_UE_SecurityCapability ue_sec_cap := + cr_NG_UE_SecurityCapabilityLV(ngeaCap := '80'O, /* ONLY NEA0 (no encryption) for now */ + ngiaCap := '40'O /* ONLY NIA1 supported */); + + [] NGAP.receive(cr_NG_SECURITY_MODE_COMMAND(p_UECap := ue_sec_cap)) -> value rx_nas { + /* Configure integrity protection: */ + cfg := { + set_nas_alg_int := NG_NAS_ALG_IP_NIA1 + }; + NGAP.send(cfg); + /* Configure Ciphering: */ + cfg := { + set_nas_alg_enc := NG_NAS_ALG_ENC_NEA0 + }; + NGAP.send(cfg); + + var template (value) NG_NAS_UL_Message_Type nas_ul_msg; + var NAS_PDU nas_pdu; + nas_ul_msg := cs_NG_REGISTRATION_REQUEST(cs_RegistrationType(tsc_NG_RegistrationInitial, '1'B), + g_pars.kset_id.nasKeySetId, + g_pars.kset_id.tsc, + cs_NG_MobileIdentitySUCI('0000'B /* Type IMSI */, + f_SUCI_IMSI()), + p_UESecurityCap := f_UE_SecurityCapability()); + nas_pdu := enc_NG_NAS_UL_Message_Type(valueof(nas_ul_msg)); + NGAP.send(cs_NG_SECURITY_MODE_COMPLETE(cs_NG_MobileIdentityTLV_IMEISV(hex2oct(g_pars.ue_pars.imeisv)), + cs_ReplayedNASMessageContainerTLV(nas_pdu))); + } +} + +private altstep as_ngap_handle_configuration_update() runs on ConnHdlr { + var NG_NAS_DL_Message_Type rx_nas; + + [] NGAP.receive(cr_NG_CONFIGURATION_UPDATE_COMMAND) -> value rx_nas { + NGAP.send(cs_NG_CONFIGURATION_UPDATE_COMPLETE); + } +} + +/* Handle a PDUSessionResourceSetupRequestTransfer contained inside NGAP InitialContextSetupRequest and return a Result for InitialContextSetupResponse */ +private function f_pdu_handle_session_resource_setup_item(PDUSessionResourceSetupItemCxtReq req) runs on ConnHdlr return PDUSessionResourceSetupItemCxtRes +{ + var PDUSessionResourceSetupItemCxtRes resp; + var octetstring setup_trans_enc; + var NGAP_IEs.PDUSessionResourceSetupRequestTransfer setup_req_transf; + var NGAP_IEs.PDUSessionResourceSetupResponseTransfer setup_resp_transf; + var template (value) UPTransportLayerInformation utla; + var template (value) QosFlowPerTNLInformation qos; + + /* Parse PDUSessionResourceSetupRequestTransfer contained inside InitialContextSetupRequest's PDUSessionResourceSetup Item: */ + setup_req_transf := dec_NGAP_PDUSessionResourceSetupRequestTransfer(req.pDUSessionResourceSetupRequestTransfer); + for (var integer i := 0; i < lengthof(setup_req_transf.protocolIEs); i := i + 1) { + if (setup_req_transf.protocolIEs[i].id == id_UL_NGU_UP_TNLInformation) { + var UPTransportLayerInformation utli := setup_req_transf.protocolIEs[i].value_.uPTransportLayerInformation; + g_pars.ue_pars.cn_gtpu_ip := f_inet_ntoa(bit2oct(utli.gTPTunnel.transportLayerAddress)); + g_pars.ue_pars.cn_gtpu_teid := utli.gTPTunnel.gTP_TEID; + } + } + + /* Prepare Response for it: */ + utla := m_uPTransportLayerInformation_gTPTunnel( + m_gTPTunnel(p_tla := oct2bit(f_inet_addr(g_pars.ue_pars.ran_gtpu_ip)), + p_gtp_teid := g_pars.ue_pars.ran_gtpu_teid)); + qos := m_qosFlowPerTNLInformation(utla, { m_associatedQosFlowItem(1) }); + setup_resp_transf := valueof(m_pDUSessionResourceSetupResponseTransfer(qos)); + setup_trans_enc := enc_NGAP_PDUSessionResourceSetupResponseTransfer(setup_resp_transf) + resp := valueof(m_pDUSessionResourceSetupItemCxtRes(req.pDUSessionID, setup_trans_enc)); + return resp; +} + +private function f_pdu_handle_session_resource_setup_list(PDUSessionResourceSetupListCxtReq li_req) runs on ConnHdlr return PDUSessionResourceSetupListCxtRes +{ + var PDUSessionResourceSetupListCxtRes li_resp; + for (var integer i := 0; i < lengthof(li_req); i := i + 1) { + var PDUSessionResourceSetupItemCxtRes it_resp; + it_resp := f_pdu_handle_session_resource_setup_item(li_req[i]); + if (i == 0) { /* min 1 item in list doesn't allow previously allocating an empty list */ + li_resp := { it_resp }; + } else { + li_resp := li_resp & { it_resp }; + } + } + return li_resp; +} + +private altstep as_ngap_handle_InitialCtxReq_withPDUSessionList() runs on ConnHdlr { + var NGAP_PDU rx_ngap; + + [] NGAP.receive(mw_ngap_initMsg(mw_n2_InitialContextSetupRequest_withPDUSessionList)) -> value rx_ngap { + var AMF_UE_NGAP_ID amf_id := valueof(f_NGAP_get_AMF_UE_NGAP_ID(rx_ngap)); + var RAN_UE_NGAP_ID ran_id := valueof(f_NGAP_get_RAN_UE_NGAP_ID(rx_ngap)); + var InitialContextSetupRequest ctx_setup_req := rx_ngap.initiatingMessage.value_.initialContextSetupRequest; + var PDUSessionResourceSetupListCxtRes resources; + + for (var integer i := 0; i < lengthof(ctx_setup_req.protocolIEs); i := i + 1) { + if (ctx_setup_req.protocolIEs[i].id != id_PDUSessionResourceSetupListCxtReq) { + continue; + } + var PDUSessionResourceSetupListCxtReq li := ctx_setup_req.protocolIEs[i].value_.pDUSessionResourceSetupListCxtReq; + resources := f_pdu_handle_session_resource_setup_list(li); + } + NGAP.send(m_ngap_succMsg(m_n2_InitialContextSetupResponse(amf_id, ran_id, resources))); + } +} + +private function f_pdu_sess_establish() runs on ConnHdlr { + var template (value) NG_NAS_UL_Message_Type nas_ul_msg; + var NAS_PDU nas_pdu; + var NG_NAS_DL_Message_Type rx_nas, inner_nas; + + 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(g_pars.ue_pars.apn))); + NGAP.send(nas_ul_msg); + as_ngap_handle_InitialCtxReq_withPDUSessionList(); + + /* PDU Session Establishment Accept: This DL NAS arrives contained in InitialCtxReq handled above: */ + NGAP.receive(cr_NG_DL_NAS_TRANSPORT) -> value rx_nas; + inner_nas := f_dec_NG_NAS_DL_Message_Payload_Container(rx_nas.dl_Nas_Transport.payloadContainerType.container, + rx_nas.dl_Nas_Transport.payload.payload); + g_pars.ue_pars.ue_ip := f_inet_ntoa(inner_nas.pdu_Session_Establishment_Accept.pduAddress.adressInfo); + log("5GC assigned CN GTPU Address: ", g_pars.ue_pars.cn_gtpu_ip, " TEID: ", g_pars.ue_pars.cn_gtpu_teid); + log("5GC assigned UE IP address: ", g_pars.ue_pars.ue_ip); +} + +function f_register() runs on ConnHdlr { + var template (value) NGAP_PDU tx_pdu; + var template (value) NG_NAS_UL_Message_Type nas_ul_msg; + var NAS_PDU nas_pdu; + var NG_NAS_DL_Message_Type rx_nas; + + nas_ul_msg := cs_NG_REGISTRATION_REQUEST(cs_RegistrationType(tsc_NG_RegistrationInitial, '1'B), + g_pars.kset_id.nasKeySetId, + g_pars.kset_id.tsc, + cs_NG_MobileIdentitySUCI('0000'B /* Type IMSI */, + f_SUCI_IMSI()), + p_UESecurityCap := f_UE_SecurityCapability()); + nas_pdu := enc_NG_NAS_UL_Message_Type(valueof(nas_ul_msg)); + tx_pdu := m_ngap_initMsg(m_n2_initialUeMessage(g_pars.c5g_idx, + nas_pdu, /* Registration request */ + f_ULI(), + mo_Signalling)); + NGAP.send(tx_pdu); + + /* Expect updated KSI from network following 5G Core standards + *(open5gs.git 70310979c58fe186e9eaa06bec9d9a31f24ff7a1): */ + if (g_pars.kset_id.nasKeySetId != tsc_NasKsi_NoKey) { + if (g_pars.kset_id.nasKeySetId == '110'B) { + g_pars.kset_id.nasKeySetId := '000'B; + } else { + g_pars.kset_id.nasKeySetId := int2bit(bit2int(g_pars.kset_id.nasKeySetId) + 1, 3); + } + } + + as_ngap_handle_auth(); + as_ngap_handle_sec_mode(); + + NGAP.receive(cr_NG_REGISTRATION_ACCEPT) -> value rx_nas; + NGAP.send(cs_NG_REGISTRATION_COMPLETE); + + as_ngap_handle_configuration_update(); + + f_pdu_sess_establish(); +} + +} -- To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40752?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: newchange Gerrit-Project: osmo-ttcn3-hacks Gerrit-Branch: master Gerrit-Change-Id: If7edf8ee63c71fbf949e2d340cf3881fd8e3ba41 Gerrit-Change-Number: 40752 Gerrit-PatchSet: 1 Gerrit-Owner: pespin <pespin(a)sysmocom.de>
1 0
0 0
[M] Change in osmo-ttcn3-hacks[master]: 5gc: Rework init code
by pespin 25 Jul '25

25 Jul '25
Hello Jenkins Builder, I'd like you to reexamine a change. Please visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40750?usp=email to look at the new patch set (#3). The following approvals got outdated and were removed: Verified+1 by Jenkins Builder Change subject: 5gc: Rework init code ...................................................................... 5gc: Rework init code * Move T_Guard to MTC, there's no need to have multiple of them (one per ConnHdlr). * Call f_init_handler() internally so it doesn't need to be called by each ConnHdlr test. * Change function attribute friend to private Change-Id: I71e5d552a6c0089345982a403285f66a92397413 --- M 5gc/C5G_Tests.ttcn 1 file changed, 28 insertions(+), 23 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/50/40750/3 -- To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40750?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: newpatchset Gerrit-Project: osmo-ttcn3-hacks Gerrit-Branch: master Gerrit-Change-Id: I71e5d552a6c0089345982a403285f66a92397413 Gerrit-Change-Number: 40750 Gerrit-PatchSet: 3 Gerrit-Owner: pespin <pespin(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder
1 0
0 0
[S] Change in osmo-ttcn3-hacks[master]: 5gc: Rework init code
by pespin 25 Jul '25

25 Jul '25
pespin has uploaded a new patch set (#2). ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40750?usp=email ) Change subject: 5gc: Rework init code ...................................................................... 5gc: Rework init code * Move T_Guard to MTC, there's no need to have multiple of them (one per ConnHdlr). * Call f_init_handler() internally so it doesn't need to be called by each ConnHdlr test. * Change function attribute friend to private Change-Id: I71e5d552a6c0089345982a403285f66a92397413 --- M 5gc/C5G_Tests.ttcn 1 file changed, 24 insertions(+), 19 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/50/40750/2 -- To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40750?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: newpatchset Gerrit-Project: osmo-ttcn3-hacks Gerrit-Branch: master Gerrit-Change-Id: I71e5d552a6c0089345982a403285f66a92397413 Gerrit-Change-Number: 40750 Gerrit-PatchSet: 2 Gerrit-Owner: pespin <pespin(a)sysmocom.de>
1 0
0 0
  • ← Newer
  • 1
  • ...
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • ...
  • 150
  • Older →

HyperKitty Powered by HyperKitty version 1.3.12.