pespin has submitted this change. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40779?usp=email )
Change subject: 5gc: Implement PDU Session Release procedure ......................................................................
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(-)
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
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,