pespin submitted this change.

View Change

Approvals: fixeria: Looks good to me, but someone else must approve pespin: Looks good to me, approved osmith: Looks good to me, but someone else must approve Jenkins Builder: Verified
5gc: Implement PDU Session Release procedure

Related: SYS#7073
Change-Id: If79cb0c97008e7a9885bb548a3d2e67e41ba170f
---
M 5gc/C5G_Tests.ttcn
M 5gc/ConnHdlr.ttcn
M library/NGAP_Functions.ttcn
M library/NG_NAS_Functions.ttcn
M library/NG_NAS_Osmo_Templates.ttcn
M library/NG_NAS_Osmo_Types.ttcn
6 files changed, 181 insertions(+), 4 deletions(-)

diff --git a/5gc/C5G_Tests.ttcn b/5gc/C5G_Tests.ttcn
index ff6e43f..4cda45f 100644
--- a/5gc/C5G_Tests.ttcn
+++ b/5gc/C5G_Tests.ttcn
@@ -315,10 +315,10 @@

private function f_TC_register_ping4() runs on ConnHdlr {
f_register();
- f_pdu_sess_create_tun();
+ f_pdu_sess_establish();
f_sleep(1.0);
f_ping4(g_pars.ue_pars.run_prog_pars.ping_hostname);
- f_pdu_sess_delete_tun();
+ f_pdu_sess_release();
}
testcase TC_ng_register_ping4() runs on MTC_CT {
f_init();
diff --git a/5gc/ConnHdlr.ttcn b/5gc/ConnHdlr.ttcn
index 2e3bedc..6c816fe 100644
--- a/5gc/ConnHdlr.ttcn
+++ b/5gc/ConnHdlr.ttcn
@@ -41,6 +41,7 @@
import from NG_NAS_MsgContainers all;
import from NG_NAS_Templates all;

+import from NG_NAS_Osmo_Types all;
import from NG_NAS_Osmo_Templates all;
import from NG_NAS_Functions all;
import from NG_CryptoFunctions all;
@@ -323,7 +324,7 @@
}
}

-private function f_pdu_sess_establish() runs on ConnHdlr {
+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;
@@ -349,6 +350,8 @@
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);
+
+ f_pdu_sess_create_tun();
}

function f_register() runs on ConnHdlr {
@@ -387,8 +390,100 @@
NGAP.send(cs_NG_REGISTRATION_COMPLETE);

as_ngap_handle_configuration_update();
+}

- f_pdu_sess_establish();
+/* Handle a PDUSessionResourceSetupRequestTransfer contained inside NGAP InitialContextSetupRequest and return a Result for InitialContextSetupResponse */
+private function f_pdu_handle_session_resource_released_item(PDUSessionResourceToReleaseItemRelCmd cmd) runs on ConnHdlr return PDUSessionResourceReleasedItemRelRes
+{
+ var PDUSessionResourceReleasedItemRelRes resp;
+ var NAS_CauseValue_Type nas_cause;
+
+ nas_cause := oct2bit(cmd.pDUSessionResourceReleaseCommandTransfer);
+
+ g_pars.ue_pars.cn_gtpu_ip := omit;
+ g_pars.ue_pars.cn_gtpu_teid := omit;
+
+ /* Prepare Response for it: */
+ resp := valueof(m_pDUSessionResourceReleasedItemRelRes(cmd.pDUSessionID, bit2oct(nas_cause)));
+ return resp;
+}
+
+private function f_pdu_handle_session_resource_released_list(PDUSessionResourceToReleaseListRelCmd li_cmd) runs on ConnHdlr return PDUSessionResourceReleasedListRelRes
+{
+ var PDUSessionResourceReleasedListRelRes li_resp;
+ for (var integer i := 0; i < lengthof(li_cmd); i := i + 1) {
+ var PDUSessionResourceReleasedItemRelRes it_resp;
+ it_resp := f_pdu_handle_session_resource_released_item(li_cmd[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_PDUSessionReleaseCommand() runs on ConnHdlr {
+ var NGAP_PDU rx_ngap;
+
+ [] 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));
+ var PDUSessionResourceReleaseCommand rel_cmd := rx_ngap.initiatingMessage.value_.PDUSessionResourceReleaseCommand;
+ var PDUSessionResourceReleasedListRelRes resources;
+
+ for (var integer i := 0; i < lengthof(rel_cmd.protocolIEs); i := i + 1) {
+ if (rel_cmd.protocolIEs[i].id != id_PDUSessionResourceToReleaseListRelCmd) {
+ continue;
+ }
+ 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)));
+ }
+}
+
+function f_pdu_sess_release() 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;
+ var OCT1 pdu_sess_id := '01'O;
+ var ProcedureTransactionIdentifier pti := '02'O;
+ var NAS_CauseValue_Type cause_val := c_5GSM_Cause_RegularDeactivation;
+
+ nas_ul_msg := cs_NG_PDU_SESSION_RELEASE_REQUEST(cs_NG_PDU_SessionIdV(pdu_sess_id), pti,
+ p_Cause := cs_GMM_GSM_Cause('59'O, cause_val));
+ 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(pdu_sess_id),
+ 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_PDUSessionReleaseCommand();
+
+ /* 5G-NAS PDU Session Release Command: This DL NAS arrives contained in NGAP PDUSessionReleaseCommand 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);
+ if (not match(inner_nas, cr_NG_PDU_SESSION_RELEASE_COMMAND(cs_NG_PDU_SessionIdV(pdu_sess_id), pti,
+ cs_GMM_GSM_Cause(omit, cause_val)))) {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+ log2str("Unexpected decoded NAS Payload Container ", inner_nas));
+ }
+
+ g_pars.ue_pars.qfi := omit;
+ g_pars.ue_pars.ue_ip := omit;
+
+ nas_ul_msg := cs_NG_PDU_SESSION_RELEASE_COMPLETE(cs_NG_PDU_SessionIdV(pdu_sess_id), pti,
+ p_Cause := cs_GMM_GSM_Cause('59'O, cause_val));
+ 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(pdu_sess_id));
+ NGAP.send(nas_ul_msg);
+
+ f_pdu_sess_delete_tun();
}

function f_pdu_sess_create_tun() runs on ConnHdlr {
diff --git a/library/NGAP_Functions.ttcn b/library/NGAP_Functions.ttcn
index 910a71f..3b19d90 100644
--- a/library/NGAP_Functions.ttcn
+++ b/library/NGAP_Functions.ttcn
@@ -31,6 +31,9 @@
case (id_UEContextRelease) {
return im.value_.uEContextReleaseCommand.protocolIEs[0].value_.uE_NGAP_IDs.uE_NGAP_ID_pair.aMF_UE_NGAP_ID;
}
+ case (id_PDUSessionResourceRelease) {
+ return im.value_.pDUSessionResourceReleaseCommand.protocolIEs[0].value_.aMF_UE_NGAP_ID;
+ }
/* TODO */
}
} else if (ischosen(ngap.successfulOutcome)) {
@@ -74,6 +77,9 @@
case (id_UEContextRelease) {
return im.value_.uEContextReleaseCommand.protocolIEs[0].value_.uE_NGAP_IDs.uE_NGAP_ID_pair.rAN_UE_NGAP_ID;
}
+ case (id_PDUSessionResourceRelease) {
+ return im.value_.pDUSessionResourceReleaseCommand.protocolIEs[1].value_.rAN_UE_NGAP_ID;
+ }
/* TODO */
}
} else if (ischosen(ngap.successfulOutcome)) {
@@ -144,7 +150,16 @@
}
}
return omit;
+ }
+ case (id_PDUSessionResourceRelease) {
+ var PDUSessionResourceReleaseCommand msg := im.value_.PDUSessionResourceReleaseCommand;
+ for (i := 0; i < lengthof(msg.protocolIEs); i := i+1) {
+ if (msg.protocolIEs[i].id == id_NAS_PDU) {
+ return msg.protocolIEs[i].value_.NAS_PDU;
+ }
}
+ return omit;
+ }
}
}
return omit;
diff --git a/library/NG_NAS_Functions.ttcn b/library/NG_NAS_Functions.ttcn
index 0fbfa75..c6ae81f 100644
--- a/library/NG_NAS_Functions.ttcn
+++ b/library/NG_NAS_Functions.ttcn
@@ -56,6 +56,8 @@
} 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_Modification_Reject := sm.pdu_Session_Modification_Reject;
+ } else if (ischosen(sm.pdu_Session_Release_Command)) {
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;
diff --git a/library/NG_NAS_Osmo_Templates.ttcn b/library/NG_NAS_Osmo_Templates.ttcn
index f417fcc..c1c8b44 100644
--- a/library/NG_NAS_Osmo_Templates.ttcn
+++ b/library/NG_NAS_Osmo_Templates.ttcn
@@ -628,4 +628,66 @@
}
}

+/* 24.501 cl. 8.3.12 */
+template (value) NG_NAS_UL_Message_Type
+cs_NG_PDU_SESSION_RELEASE_REQUEST(template (value) NG_PDU_SessionId p_PDU_SessionId,
+ template (value) ProcedureTransactionIdentifier p_PTI,
+ template (omit) GMM_GSM_Cause p_Cause := omit,
+ template (omit) ExtdProtocolConfigOptions p_ExtdPCO := omit) :=
+{
+ pdu_Session_Release_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_PDUSessionReleaseRequest, /* cl. 9.7 M V 1 */
+ gsmCause := p_Cause, /* cl. 9.11.4.2 O TV 2 IEI=59 */
+ extdProtocolConfigurationOptions := p_ExtdPCO /* cl. 9.11.4.6 O TLV-E 4-65538 IEI=0x7B */
+ }
+};
+
+/* 24.501 cl. 8.3.14 */
+template (present) NG_NAS_DL_Message_Type
+cr_NG_PDU_SESSION_RELEASE_COMMAND(template (present) NG_PDU_SessionId p_PDU_SessionId := ?,
+ template (present) ProcedureTransactionIdentifier p_PTI := ?,
+ template (present) GMM_GSM_Cause p_Cause := ?,
+ template GPRS_Timer3 p_BackOffTimer := *,
+ template EAP_Message p_EAP := *,
+ template NGSM_CongestionReattemptInd p_NGSM_CongestionReattemptInd := *, // @sic R5s190543 sic@
+ template ExtdProtocolConfigOptions p_ExtdPCO := *,
+ template AccessType p_AccessType := *,
+ template ServiceLvlAAContainer p_ServiceLvlAA := *) :=
+{
+ /* 24.501 cl. 8.3.14 */
+ pdu_Session_Release_Command := {
+ 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_PDUSessionReleaseCommand, /* cl. 9.7 M V 1 */
+ gsmCause := p_Cause, /* cl. 9.11.4.2 M V 1 */
+ backOffTimerValue := p_BackOffTimer, /* cl. 9.11.2.5 O TLV 3 IEI=37 */
+ eapMessage := p_EAP, /* cl. 9.11.2.2 O TLV-E 7-1503 IEI=78 */
+ ngsmCongestionReattemptInd := p_NGSM_CongestionReattemptInd, /* cl. 9.11.4.2A O TLV 3 IEI=61 Jun19 @sic R5s190543 sic@ */
+ extdProtocolConfigurationOptions := p_ExtdPCO, /* cl. 9.11.4.6 O TLV-E 4-65538 IEI=0x7B */
+ accessType := p_AccessType, /* cl. 9.11.2.1A O TV 1 IEI=D 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@ */
+ }
+};
+
+/* 24.501 cl. 8.3.15 */
+template (value) NG_NAS_UL_Message_Type
+cs_NG_PDU_SESSION_RELEASE_COMPLETE(template (value) NG_PDU_SessionId p_PDU_SessionId,
+ template (value) ProcedureTransactionIdentifier p_PTI,
+ template (omit) GMM_GSM_Cause p_Cause := omit,
+ template (omit) ExtdProtocolConfigOptions p_ExtdPCO := omit) :=
+{
+ pdu_Session_Release_Complete := {
+ 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_PDUSessionReleaseComplete, /* cl. 9.7 M V 1 */
+ gsmCause := p_Cause, /* cl. 9.11.4.2 O TV 2 IEI=59 */
+ extdProtocolConfigurationOptions := p_ExtdPCO /* cl. 9.11.4.6 O TLV-E 4-65538 IEI=0x7B */
+ }
+}
+
}
diff --git a/library/NG_NAS_Osmo_Types.ttcn b/library/NG_NAS_Osmo_Types.ttcn
index 1e76a98..c152ad6 100644
--- a/library/NG_NAS_Osmo_Types.ttcn
+++ b/library/NG_NAS_Osmo_Types.ttcn
@@ -37,6 +37,9 @@
const BIT4 c_PayloadContainer_SLPP_Message_Container := '1100'B;
const BIT4 c_PayloadContainer_Multiple_Payloads := '1111'B;

+const NAS_CauseValue_Type c_5GSM_Cause_RegularDeactivation := '00100100'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,

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

Gerrit-MessageType: merged
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: If79cb0c97008e7a9885bb548a3d2e67e41ba170f
Gerrit-Change-Number: 40779
Gerrit-PatchSet: 2
Gerrit-Owner: pespin <pespin@sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de>
Gerrit-Reviewer: osmith <osmith@sysmocom.de>
Gerrit-Reviewer: pespin <pespin@sysmocom.de>