[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:
Sukchan Lee
2024-08-15 20:56:35 +09:00
parent 1a22479977
commit a7d594c2b7
3 changed files with 27 additions and 20 deletions

View File

@@ -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;

View File

@@ -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,

View File

@@ -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);