diff --git a/src/smf_app/smf_context.cpp b/src/smf_app/smf_context.cpp index 79dc584f800d58560e96aaa1ac5d30d5cfe8677e..afdb2249aa15230865c0d07f2f53be5eb0c448ee 100644 --- a/src/smf_app/smf_context.cpp +++ b/src/smf_app/smf_context.cpp @@ -48,6 +48,7 @@ extern "C" { #include "Ngap_PDUSessionResourceSetupResponseTransfer.h" #include "Ngap_PDUSessionResourceModifyResponseTransfer.h" #include "Ngap_PDUSessionResourceReleaseResponseTransfer.h" +#include "Ngap_PDUSessionResourceSetupUnsuccessfulTransfer.h" #include "Ngap_GTPTunnel.h" #include "Ngap_AssociatedQosFlowItem.h" #include "Ngap_QosFlowAddOrModifyResponseList.h" @@ -1069,7 +1070,6 @@ void smf_context::handle_pdu_session_create_sm_context_request( } //pending session?? - //Step 4. check if supi is authenticated //TODO: if "Integrity Protection is required", check UE Integrity Protection Maximum Data Rate //TODO: (Optional) Secondary authentication/authorization @@ -1956,6 +1956,48 @@ void smf_context::handle_pdu_session_update_sm_context_request( } break; + //PDU Session Establishment procedure + //PDU Session Resource Setup Unsuccessful Transfer + case n2_sm_info_type_e::PDU_RES_SETUP_FAIL: { + Logger::smf_app().info("PDU Session Resource Setup Unsuccessful Transfer"); + + //Ngap_PDUSessionResourceSetupUnsuccessfulTransfer + std::shared_ptr<Ngap_PDUSessionResourceSetupUnsuccessfulTransfer_t> decoded_msg = + std::make_shared<Ngap_PDUSessionResourceSetupUnsuccessfulTransfer_t>(); + int decode_status = smf_n1_n2_inst.decode_n2_sm_information( + decoded_msg, n2_sm_information); + + if (decode_status == RETURNerror) { + Logger::smf_app().warn( + "Decode N2 SM (Ngap_PDUSessionResourceSetupUnsuccessfulTransfer) failed!"); + problem_details.setCause( + pdu_session_application_error_e2str[PDU_SESSION_APPLICATION_ERROR_N2_SM_ERROR]); + smContextUpdateError.setError(problem_details); + smf_n11_inst->send_pdu_session_update_sm_context_response( + smreq->http_response, smContextUpdateError, + Pistache::Http::Code::Forbidden); + return; + } + + //Logger::smf_app().info("PDU Session Resource Setup Unsuccessful Transfer cause %d",decoded_msg->cause ); + problem_details.setCause( + pdu_session_application_error_e2str[PDU_SESSION_APPLICATION_ERROR_UE_NOT_RESPONDING]); + smContextUpdateError.setError(problem_details); + refToBinaryData.setContentId(N1_SM_CONTENT_ID); + smContextUpdateError.setN1SmMsg(refToBinaryData); + //PDU Session Establishment Reject, 24.501 cause "#26 Insufficient resources" + smf_n1_n2_inst.create_n1_sm_container( + smreq->req, PDU_SESSION_ESTABLISHMENT_REJECT, n1_sm_msg, + cause_value_5gsm_e::CAUSE_26_INSUFFICIENT_RESOURCES); + smf_app_inst->convert_string_2_hex(n1_sm_msg, n1_sm_msg_hex); + smf_n11_inst->send_pdu_session_update_sm_context_response( + smreq->http_response, smContextUpdateError, + Pistache::Http::Code::Forbidden, n1_sm_msg_hex); + //TODO: Need release established resources? + return; + } + break; + //PDU Session Modification procedure (UE-initiated, Section 4.3.3.2@3GPP TS 23.502 or SMF-Requested)(Step 2) case n2_sm_info_type_e::PDU_RES_MOD_RSP: { Logger::smf_app().info( diff --git a/src/smf_app/smf_n1_n2.cpp b/src/smf_app/smf_n1_n2.cpp index 6b663d40dd21cfce78da811bbbfc8ca2bf53f722..8e0087183450b3f09870f8158cf23628412e9e93 100644 --- a/src/smf_app/smf_n1_n2.cpp +++ b/src/smf_app/smf_n1_n2.cpp @@ -1684,3 +1684,34 @@ int smf_n1_n2::decode_n2_sm_information( } + + +//--------------------------------------------------------------------------------------------- +int smf_n1_n2::decode_n2_sm_information( + std::shared_ptr<Ngap_PDUSessionResourceSetupUnsuccessfulTransfer_t> &ngap_IE, + std::string &n2_sm_info) { + Logger::smf_app().info( + "Decode NGAP message (Ngap_PDUSessionResourceSetupUnsuccessfulTransfer) from N2 SM Information"); + + unsigned int data_len = n2_sm_info.length(); + unsigned char *data = (unsigned char*) malloc(data_len + 1); + memset(data, 0, data_len + 1); + memcpy((void*) data, (void*) n2_sm_info.c_str(), data_len); + + //Ngap_PDUSessionResourceSetupUnsuccessfulTransfer + asn_dec_rval_t rc = asn_decode( + nullptr, ATS_ALIGNED_CANONICAL_PER, + &asn_DEF_Ngap_PDUSessionResourceSetupUnsuccessfulTransfer, + (void**) &ngap_IE, (void*) data, data_len); + + //free memory + free_wrapper((void**) &data); + + if (rc.code != RC_OK) { + Logger::smf_app().warn("asn_decode failed with code %d", rc.code); + + return RETURNerror ; + } + return RETURNok ; + +} diff --git a/src/smf_app/smf_n1_n2.hpp b/src/smf_app/smf_n1_n2.hpp index e864c32a17e18f907f5c5510af1b95aea11f1f90..037200647fe609eff9957628c29d458eead48675 100644 --- a/src/smf_app/smf_n1_n2.hpp +++ b/src/smf_app/smf_n1_n2.hpp @@ -57,6 +57,7 @@ extern "C" { #include "Ngap_PDUSessionResourceSetupResponseTransfer.h" #include "Ngap_PDUSessionResourceModifyResponseTransfer.h" #include "Ngap_PDUSessionResourceReleaseResponseTransfer.h" +#include "Ngap_PDUSessionResourceSetupUnsuccessfulTransfer.h" } namespace smf { @@ -132,6 +133,17 @@ class smf_n1_n2 { std::shared_ptr<Ngap_PDUSessionResourceReleaseResponseTransfer_t> &ngap_IE, std::string &n2_sm_info); + /* + * Decode N2 SM Information Ngap_PDUSessionResourceSetupUnsuccessfulTransfer + * @param [std::shared_ptr<Ngap_PDUSessionResourceSetupUnsuccessfulTransfer_t>&] ngap_IE Store decoded NGAP message + * @param [std::string&] n2_sm_info N2 SM Information + * @return status of the decode process + */ + int decode_n2_sm_information( + std::shared_ptr<Ngap_PDUSessionResourceSetupUnsuccessfulTransfer_t> &ngap_IE, + std::string &n2_sm_info); + + }; } // namespace smf