pespin submitted this change.

View Change

Approvals: Jenkins Builder: Verified fixeria: Looks good to me, but someone else must approve laforge: Looks good to me, approved
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(-)

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;
+ }
+ }
+}
+
}

To view, visit change 40891. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-MessageType: merged
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: I49cb6d7fe9f18734c49bb49ecceb671e8122ce88
Gerrit-Change-Number: 40891
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin@sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de>
Gerrit-Reviewer: laforge <laforge@osmocom.org>
Gerrit-Reviewer: pespin <pespin@sysmocom.de>