pespin has submitted this change. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40891?usp=email )
Change subject: 5gc: Obtain amf_id from NGAP_Emulation ......................................................................
5gc: Obtain amf_id from NGAP_Emulation
This will be needed in a follow-up commit in order to be able to transmit UE Context Release Request.
Change-Id: I49cb6d7fe9f18734c49bb49ecceb671e8122ce88 --- M 5gc/C5G_Tests.ttcn M 5gc/ConnHdlr.ttcn M library/NGAP_Emulation.ttcn 3 files changed, 52 insertions(+), 13 deletions(-)
Approvals: Jenkins Builder: Verified fixeria: Looks good to me, but someone else must approve laforge: Looks good to me, approved
diff --git a/5gc/C5G_Tests.ttcn b/5gc/C5G_Tests.ttcn index 0b71059..608bcf8 100644 --- a/5gc/C5G_Tests.ttcn +++ b/5gc/C5G_Tests.ttcn @@ -86,6 +86,8 @@ usim_key := mp_usim_key, usim_opc := mp_usim_opc, apn := mp_apn, + ran_id := idx, + amf_id := omit, run_prog_pars := ts_RunProgParams(idx), ran_gtpu_ip := mp_local_gtpu_ip, ran_gtpu_teid := int2oct(idx + 1, 4), diff --git a/5gc/ConnHdlr.ttcn b/5gc/ConnHdlr.ttcn index 01dcb1a..2f3344b 100644 --- a/5gc/ConnHdlr.ttcn +++ b/5gc/ConnHdlr.ttcn @@ -73,6 +73,8 @@ octetstring usim_key, octetstring usim_opc, charstring apn, + RAN_UE_NGAP_ID ran_id, + AMF_UE_NGAP_ID amf_id optional, RunProgParams run_prog_pars, charstring ran_gtpu_ip, OCT4 ran_gtpu_teid, @@ -308,10 +310,11 @@
private altstep as_ngap_handle_InitialCtxReq_withPDUSessionList() runs on ConnHdlr { var NGAP_PDU rx_ngap; + var template (present) NGAP_PDU exp_ngap := + mw_ngap_initMsg(mw_n2_InitialContextSetupRequest_withPDUSessionList(g_pars.ue_pars.amf_id, + g_pars.ue_pars.ran_id));
- [] 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)); + [] NGAP.receive(exp_ngap) -> value rx_ngap { var InitialContextSetupRequest ctx_setup_req := rx_ngap.initiatingMessage.value_.initialContextSetupRequest; var PDUSessionResourceSetupListCxtRes resources;
@@ -322,7 +325,9 @@ 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))); + NGAP.send(m_ngap_succMsg(m_n2_InitialContextSetupResponse(g_pars.ue_pars.amf_id, + g_pars.ue_pars.ran_id, + resources))); } }
@@ -369,7 +374,7 @@ 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.ue_pars.idx, + tx_pdu := m_ngap_initMsg(m_n2_initialUeMessage(g_pars.ue_pars.ran_id, nas_pdu, /* Registration request */ f_ULI(), mo_Signalling)); @@ -388,6 +393,9 @@ as_ngap_handle_auth(); as_ngap_handle_sec_mode();
+ /* After receiving DL NAS Transport above, the UE-AMF-Id became known in NGAP_Emulation: */ + g_pars.ue_pars.amf_id := f_ngap_obtain_amf_id(); + NGAP.receive(cr_NG_REGISTRATION_ACCEPT) -> value rx_nas; g_pars.ue_pars.guti := rx_nas.registration_Accept.guti.otherDigits; NGAP.send(cs_NG_REGISTRATION_COMPLETE); @@ -443,11 +451,16 @@ /* 3GPP TS 38.413 8.3.3 UE Context Release (AMF initiated) */ private altstep as_ngap_handle_UeContextReleaseCmd() runs on ConnHdlr { var NGAP_PDU rx_ngap; + var template (present) NGAP_PDU exp_ngap := + mw_ngap_initMsg(mw_n2_UEContextReleaseCommand( + mw_uE_NGAP_IDs_uE_NGAP_ID_pair( + mw_uE_NGAP_ID_pair(g_pars.ue_pars.amf_id, + g_pars.ue_pars.ran_id))));
- [] NGAP.receive(mw_ngap_initMsg(mw_n2_UEContextReleaseCommand)) -> 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)); - NGAP.send(m_ngap_succMsg(f_ts_n2_UEContextReleaseComplete(amf_id, ran_id, f_ULI()))); + [] NGAP.receive(exp_ngap) -> value rx_ngap { + NGAP.send(m_ngap_succMsg(f_ts_n2_UEContextReleaseComplete(g_pars.ue_pars.amf_id, + g_pars.ue_pars.ran_id, + f_ULI()))); } }
@@ -484,10 +497,12 @@
private altstep as_ngap_handle_PDUSessionReleaseCommand() runs on ConnHdlr { var NGAP_PDU rx_ngap; + var template (present) NGAP_PDU exp_ngap := + mw_ngap_initMsg(f_tr_n2_PDUSessionResourceReleaseCommand(g_pars.ue_pars.amf_id, + g_pars.ue_pars.ran_id, + ?, ?));
- [] NGAP.receive(mw_ngap_initMsg(f_tr_n2_PDUSessionResourceReleaseCommand(?, ?, ?, ?))) -> 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)); + [] NGAP.receive(exp_ngap) -> value rx_ngap { var PDUSessionResourceReleaseCommand rel_cmd := rx_ngap.initiatingMessage.value_.PDUSessionResourceReleaseCommand; var PDUSessionResourceReleasedListRelRes resources;
@@ -498,7 +513,9 @@ var PDUSessionResourceToReleaseListRelCmd li := rel_cmd.protocolIEs[i].value_.pDUSessionResourceToReleaseListRelCmd; resources := f_pdu_handle_session_resource_released_list(li); } - NGAP.send(m_ngap_succMsg(m_n2_PDUSessionResourceReleaseResponse(amf_id, ran_id, resources))); + NGAP.send(m_ngap_succMsg(m_n2_PDUSessionResourceReleaseResponse(g_pars.ue_pars.amf_id, + g_pars.ue_pars.ran_id, + resources))); } }
diff --git a/library/NGAP_Emulation.ttcn b/library/NGAP_Emulation.ttcn index aa4b485..3034fab 100644 --- a/library/NGAP_Emulation.ttcn +++ b/library/NGAP_Emulation.ttcn @@ -116,11 +116,13 @@
signature NGAPEM_register(in AMF_UE_NGAP_ID amf_id, in RAN_UE_NGAP_ID ran_id, in NGAP_ConnHdlr hdlr); signature NGAPEM_register_proc(in integer procedureCode, in NGAP_ConnHdlr hdlr); +signature NGAPEM_obtain_amf_id() return AMF_UE_NGAP_ID; //signature NGAPEM_derive_nas_token(in octetstring kasme, in NGAP_ConnHdlr hdlr, out OCT32 nas_token);
type port NGAPEM_PROC_PT procedure { inout NGAPEM_register; inout NGAPEM_register_proc; + inout NGAPEM_obtain_amf_id; //inout NGAPEM_derive_nas_token; } with { extension "internal" };
@@ -605,6 +607,11 @@ f_create_expect_proc(procedureCode, vc_conn); NGAP_PROC.reply(NGAPEM_register_proc:{procedureCode, vc_conn}) to vc_conn; } + [] NGAP_PROC.getcall(NGAPEM_obtain_amf_id:{}) -> sender vc_conn { + var integer i := f_assoc_id_by_comp(vc_conn); + amf_id := NGapAssociationTable[i].amf_ue_ngap_id; + NGAP_PROC.reply(NGAPEM_obtain_amf_id:{} value amf_id) to vc_conn; + } // [] NGAP_PROC.getcall(NGAPEM_derive_nas_token:{?, ?, -}) -> param(kasme, vc_conn) { // var integer assoc_id := f_assoc_id_by_comp(vc_conn); // var OCT32 nas_token := f_kdf_nas_token(kasme, NGapAssociationTable[assoc_id].nus.tx_count) @@ -701,4 +708,17 @@ } }
+/* ConnHdlr function to obtain AMF_ID internally stored in association table. + * This is needed because we don't receive NGAP layer of DownlinkNasTransport in + * ConnHdlr from Emulation, so there's no direct way to obtain it early during + * registration procedure. */ +function f_ngap_obtain_amf_id() runs on NGAP_ConnHdlr return AMF_UE_NGAP_ID { + var AMF_UE_NGAP_ID amf_id; + NGAP_PROC.call(NGAPEM_obtain_amf_id:{}) { + [] NGAP_PROC.getreply(NGAPEM_obtain_amf_id:{}) -> value amf_id { + return amf_id; + } + } +} + }