mirror of
https://github.com/open5gs/open5gs.git
synced 2025-11-03 13:33:26 +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