mirror of
				https://github.com/open5gs/open5gs.git
				synced 2025-11-04 05:53:18 +00:00 
			
		
		
		
	[AMF] fix UEContextReleaseCommand encode fail (#3388)
UEContextReleaseCommand fails to encode as an ASN.1 message if the Group is 0. This is added because there is currently no exception handling when the gNB sends a Group of 0.
This commit is contained in:
		@@ -217,6 +217,12 @@ struct ran_ue_s {
 | 
			
		||||
        uint16_t    activated; /* Activated PSI Mask */
 | 
			
		||||
    } psimask;
 | 
			
		||||
 | 
			
		||||
    /* UEContextReleaseRequest or InitialContextSetupFailure */
 | 
			
		||||
    struct {
 | 
			
		||||
        NGAP_Cause_PR group;
 | 
			
		||||
        long cause;
 | 
			
		||||
    } deactivation;
 | 
			
		||||
 | 
			
		||||
    /* Related Context */
 | 
			
		||||
    ogs_pool_id_t   gnb_id;
 | 
			
		||||
    ogs_pool_id_t   amf_ue_id;
 | 
			
		||||
@@ -514,12 +520,6 @@ struct amf_ue_s {
 | 
			
		||||
    /* UE Radio Capability */
 | 
			
		||||
    OCTET_STRING_t  ueRadioCapability;
 | 
			
		||||
 | 
			
		||||
    /* UEContextReleaseRequest or InitialContextSetupFailure */
 | 
			
		||||
    struct {
 | 
			
		||||
        NGAP_Cause_PR group;
 | 
			
		||||
        long cause;
 | 
			
		||||
    } deactivation;
 | 
			
		||||
 | 
			
		||||
    /* Handover Info */
 | 
			
		||||
    struct {
 | 
			
		||||
        NGAP_HandoverType_t type;
 | 
			
		||||
 
 | 
			
		||||
@@ -1279,8 +1279,8 @@ void ngap_handle_initial_context_setup_failure(
 | 
			
		||||
 | 
			
		||||
        old_xact_count = amf_sess_xact_count(amf_ue);
 | 
			
		||||
 | 
			
		||||
        amf_ue->deactivation.group = NGAP_Cause_PR_nas;
 | 
			
		||||
        amf_ue->deactivation.cause = NGAP_CauseNas_normal_release;
 | 
			
		||||
        ran_ue->deactivation.group = NGAP_Cause_PR_nas;
 | 
			
		||||
        ran_ue->deactivation.cause = NGAP_CauseNas_normal_release;
 | 
			
		||||
 | 
			
		||||
        amf_sbi_send_deactivate_all_sessions(
 | 
			
		||||
                ran_ue, amf_ue, AMF_UPDATE_SM_CONTEXT_DEACTIVATED,
 | 
			
		||||
@@ -1566,8 +1566,13 @@ void ngap_handle_ue_context_release_request(
 | 
			
		||||
        ogs_warn("NAS-Cause[%d]", (int)Cause->choice.nas);
 | 
			
		||||
        break;
 | 
			
		||||
    default:
 | 
			
		||||
        ogs_warn("Invalid cause group[%d]", Cause->present);
 | 
			
		||||
        break;
 | 
			
		||||
        ogs_error("Invalid cause group [%d]", Cause->present);
 | 
			
		||||
        r = ngap_send_error_indication(
 | 
			
		||||
                gnb, &ran_ue->ran_ue_ngap_id, &ran_ue->amf_ue_ngap_id,
 | 
			
		||||
                NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
 | 
			
		||||
        ogs_expect(r == OGS_OK);
 | 
			
		||||
        ogs_assert(r != OGS_ERROR);
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    amf_ue = amf_ue_find_by_id(ran_ue->amf_ue_id);
 | 
			
		||||
@@ -1582,8 +1587,8 @@ void ngap_handle_ue_context_release_request(
 | 
			
		||||
    } else {
 | 
			
		||||
        int xact_count = amf_sess_xact_count(amf_ue);
 | 
			
		||||
 | 
			
		||||
        amf_ue->deactivation.group = Cause->present;
 | 
			
		||||
        amf_ue->deactivation.cause = (int)Cause->choice.radioNetwork;
 | 
			
		||||
        ran_ue->deactivation.group = Cause->present;
 | 
			
		||||
        ran_ue->deactivation.cause = (int)Cause->choice.radioNetwork;
 | 
			
		||||
 | 
			
		||||
        if (!PDUSessionList) {
 | 
			
		||||
            amf_sbi_send_deactivate_all_sessions(
 | 
			
		||||
@@ -2154,8 +2159,8 @@ void ngap_handle_pdu_session_resource_setup_response(
 | 
			
		||||
            param.n2SmInfoType = OpenAPI_n2_sm_info_type_PDU_RES_SETUP_FAIL;
 | 
			
		||||
            ogs_pkbuf_put_data(param.n2smbuf, transfer->buf, transfer->size);
 | 
			
		||||
 | 
			
		||||
            amf_ue->deactivation.group = NGAP_Cause_PR_nas;
 | 
			
		||||
            amf_ue->deactivation.cause = NGAP_CauseNas_normal_release;
 | 
			
		||||
            ran_ue->deactivation.group = NGAP_Cause_PR_nas;
 | 
			
		||||
            ran_ue->deactivation.cause = NGAP_CauseNas_normal_release;
 | 
			
		||||
 | 
			
		||||
            r = amf_sess_sbi_discover_and_send(
 | 
			
		||||
                    OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
 | 
			
		||||
 
 | 
			
		||||
@@ -584,11 +584,12 @@ int amf_nsmf_pdusession_handle_update_sm_context(
 | 
			
		||||
                 * 6. UEContextReleaseComplete
 | 
			
		||||
                 */
 | 
			
		||||
                ogs_warn("PDUSessionResourceSetupResponse(Unsuccessful)");
 | 
			
		||||
                ogs_assert(amf_ue->deactivation.group);
 | 
			
		||||
                ogs_assert(ran_ue);
 | 
			
		||||
                ogs_assert(ran_ue->deactivation.group);
 | 
			
		||||
 | 
			
		||||
                r = ngap_send_ran_ue_context_release_command(ran_ue,
 | 
			
		||||
                        amf_ue->deactivation.group,
 | 
			
		||||
                        amf_ue->deactivation.cause,
 | 
			
		||||
                        ran_ue->deactivation.group,
 | 
			
		||||
                        ran_ue->deactivation.cause,
 | 
			
		||||
                        NGAP_UE_CTX_REL_NG_REMOVE_AND_UNLINK, 0);
 | 
			
		||||
                ogs_expect(r == OGS_OK);
 | 
			
		||||
                ogs_assert(r != OGS_ERROR);
 | 
			
		||||
@@ -622,11 +623,12 @@ int amf_nsmf_pdusession_handle_update_sm_context(
 | 
			
		||||
                 */
 | 
			
		||||
 | 
			
		||||
                if (AMF_SESSION_SYNC_DONE(amf_ue, state)) {
 | 
			
		||||
                    ogs_assert(amf_ue->deactivation.group);
 | 
			
		||||
                    ogs_assert(ran_ue);
 | 
			
		||||
                    ogs_assert(ran_ue->deactivation.group);
 | 
			
		||||
 | 
			
		||||
                    r = ngap_send_ran_ue_context_release_command(ran_ue,
 | 
			
		||||
                            amf_ue->deactivation.group,
 | 
			
		||||
                            amf_ue->deactivation.cause,
 | 
			
		||||
                            ran_ue->deactivation.group,
 | 
			
		||||
                            ran_ue->deactivation.cause,
 | 
			
		||||
                            NGAP_UE_CTX_REL_NG_REMOVE_AND_UNLINK, 0);
 | 
			
		||||
                    ogs_expect(r == OGS_OK);
 | 
			
		||||
                    ogs_assert(r != OGS_ERROR);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user