diff --git a/CMakeLists.txt b/CMakeLists.txt index 9907b9ff42..3baed46f20 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -346,6 +346,7 @@ set(NGAP_DIR ${OPENAIR3_DIR}/NGAP) include_directories ("${NGAP_DIR}") add_library(ngap ${NGAP_DIR}/ngap_gNB.c + ${NGAP_DIR}/ngap_common.c ${NGAP_DIR}/ngap_gNB_context_management_procedures.c ${NGAP_DIR}/ngap_gNB_decoder.c ${NGAP_DIR}/ngap_gNB_encoder.c diff --git a/openair2/COMMON/ngap_messages_types.h b/openair2/COMMON/ngap_messages_types.h index c4d2cd011a..6ea778fbd4 100644 --- a/openair2/COMMON/ngap_messages_types.h +++ b/openair2/COMMON/ngap_messages_types.h @@ -336,19 +336,21 @@ typedef struct pdusession_modify_s { qos_flow_tobe_modified_t qos[QOSFLOW_MAX_VALUE]; } pdusession_modify_t; -typedef enum ngap_Cause_e { - NGAP_CAUSE_NOTHING, /* No components present */ +/* Cause (9.3.1.2 of 3GPP TS 38.413) */ +typedef enum ngap_cause_group_e { + NGAP_CAUSE_NOTHING, /* No components present */ NGAP_CAUSE_RADIO_NETWORK, NGAP_CAUSE_TRANSPORT, NGAP_CAUSE_NAS, NGAP_CAUSE_PROTOCOL, NGAP_CAUSE_MISC, - NGAP_Cause_PR_choice_ExtensionS, - //Evilish manual duplicate of asn.1 grammar - //because it is human work, whereas it can be generated by machine - //and because humans manual copy creates bugs - //and we create multiple names for the same thing, that is a source of confusion -} ngap_Cause_t; +} ngap_cause_group_t; + +/* Cause (9.3.1.2 of 3GPP TS 38.413) */ +typedef struct ngap_cause_s { + ngap_cause_group_t type; + uint8_t value; +} ngap_cause_t; typedef enum ngap_Cause_radio_network_e { NGAP_CAUSE_RADIO_NETWORK_UNSPECIFIED, @@ -378,7 +380,7 @@ typedef enum ngap_Cause_radio_network_e { NGAP_CAUSE_RADIO_NETWORK_FAILURE_IN_RADIO_INTERFACE_PROCEDURE, NGAP_CAUSE_RADIO_NETWORK_INTERACTION_WITH_OTHER_PROCEDURE, NGAP_CAUSE_RADIO_NETWORK_UNKNOWN_PDU_SESSION_ID, - NGAP_CAUSE_RADIO_NETWORK_UNKOWN_QOS_FLOW_ID, + NGAP_CAUSE_RADIO_NETWORK_UNKNOWN_QOS_FLOW_ID, NGAP_CAUSE_RADIO_NETWORK_MULTIPLE_PDU_SESSION_ID_INSTANCES, NGAP_CAUSE_RADIO_NETWORK_MULTIPLE_QOS_FLOW_ID_INSTANCES, NGAP_CAUSE_RADIO_NETWORK_ENCRYPTION_AND_OR_INTEGRITY_PROTECTION_ALGORITHMS_NOT_SUPPORTED, @@ -398,8 +400,12 @@ typedef enum ngap_Cause_radio_network_e { NGAP_CAUSE_RADIO_NETWORK_RELEASE_DUE_TO_CN_DETECTED_MOBILITY, NGAP_CAUSE_RADIO_NETWORK_N26_INTERFACE_NOT_AVAILABLE, NGAP_CAUSE_RADIO_NETWORK_RELEASE_DUE_TO_PRE_EMPTION, - NGAP_CAUSE_RADIO_NETWORK_MULTIPLE_LOCATION_REPORTING_REFERENCE_ID_INSTANCES -} ngap_Cause_radio_network_t; + NGAP_CAUSE_RADIO_NETWORK_MULTIPLE_LOCATION_REPORTING_REFERENCE_ID_INSTANCES, + NGAP_CAUSE_RADIO_NETWORK_RSN_NOT_AVAILABLE_FOR_THE_UP, + NGAP_CAUSE_RADIO_NETWORK_NPN_ACCESS_DENIED, + NGAP_CAUSE_RADIO_NETWORK_CAG_ONLY_ACCESS_DENIED, + NGAP_CAUSE_RADIO_NETWORK_INSUFFICIENT_UE_CAPABILITIES +} ngap_cause_radio_network_t; /** * NGAP protocol cause values as per 9.3.1.2 `Cause` section in 3GPP TS 38.413. @@ -418,8 +424,7 @@ typedef struct pdusession_failed_s { /* Unique pdusession_id for the UE. */ uint8_t pdusession_id; /* Cause of the failure */ - ngap_Cause_t cause; - uint8_t cause_value; + ngap_cause_t cause; } pdusession_failed_t; typedef enum ngap_ue_ctxt_modification_present_s { @@ -557,8 +562,7 @@ typedef struct ngap_initial_context_setup_fail_s { uint64_t amf_ue_ngap_id; - ngap_Cause_t cause; - long cause_value; + ngap_cause_t cause; } ngap_initial_context_setup_fail_t, ngap_ue_ctxt_modification_fail_t, ngap_pdusession_setup_req_fail_t; typedef struct ngap_nas_non_delivery_ind_s { @@ -803,8 +807,7 @@ typedef struct ngap_ue_release_req_s { uint8_t nb_of_pdusessions; /* list of pdusession resource by RRC layers */ pdusession_release_t pdusessions[NGAP_MAX_PDUSESSION]; - ngap_Cause_t cause; - long cause_value; + ngap_cause_t cause; } ngap_ue_release_req_t, ngap_ue_release_resp_t; typedef struct ngap_pdusession_modify_req_s { diff --git a/openair2/RRC/NR/nr_rrc_defs.h b/openair2/RRC/NR/nr_rrc_defs.h index b33b2c158c..953f723853 100644 --- a/openair2/RRC/NR/nr_rrc_defs.h +++ b/openair2/RRC/NR/nr_rrc_defs.h @@ -116,8 +116,7 @@ typedef struct pdu_session_param_s { pdusession_t param; pdu_session_status_t status; uint8_t xid; // transaction_id - ngap_Cause_t cause; - uint8_t cause_value; + ngap_cause_t cause; } rrc_pdu_session_param_t; /** diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c index 9e552eaa2f..ba4ed17267 100644 --- a/openair2/RRC/NR/rrc_gNB.c +++ b/openair2/RRC/NR/rrc_gNB.c @@ -594,7 +594,7 @@ void rrc_gNB_modify_dedicatedRRCReconfiguration(gNB_RRC_INST *rrc, gNB_RRC_UE_t continue; } - if (ue_p->pduSession[i].cause != NGAP_CAUSE_NOTHING) { + if (ue_p->pduSession[i].cause.type != NGAP_CAUSE_NOTHING) { // set xid of failure pdu session ue_p->pduSession[i].xid = xid; ue_p->pduSession[i].status = PDU_SESSION_STATUS_FAILED; @@ -610,10 +610,10 @@ void rrc_gNB_modify_dedicatedRRCReconfiguration(gNB_RRC_INST *rrc, gNB_RRC_UE_t } if (j == MAX_DRBS_PER_UE) { + ngap_cause_t cause = {.type = NGAP_CAUSE_RADIO_NETWORK, .value = NGAP_CauseRadioNetwork_unspecified}; ue_p->pduSession[i].xid = xid; ue_p->pduSession[i].status = PDU_SESSION_STATUS_FAILED; - ue_p->pduSession[i].cause = NGAP_CAUSE_RADIO_NETWORK; - ue_p->pduSession[i].cause_value = NGAP_CauseRadioNetwork_unspecified; + ue_p->pduSession[i].cause = cause; continue; } @@ -634,10 +634,10 @@ void rrc_gNB_modify_dedicatedRRCReconfiguration(gNB_RRC_INST *rrc, gNB_RRC_UE_t default: LOG_E(NR_RRC, "not supported 5qi %lu\n", ue_p->pduSession[i].param.qos[qos_flow_index].fiveQI); + ngap_cause_t cause = {.type = NGAP_CAUSE_RADIO_NETWORK, .value = NGAP_CauseRadioNetwork_not_supported_5QI_value}; ue_p->pduSession[i].status = PDU_SESSION_STATUS_FAILED; ue_p->pduSession[i].xid = xid; - ue_p->pduSession[i].cause = NGAP_CAUSE_RADIO_NETWORK; - ue_p->pduSession[i].cause_value = NGAP_CauseRadioNetwork_not_supported_5QI_value; + ue_p->pduSession[i].cause = cause; continue; } LOG_I(NR_RRC, @@ -1222,9 +1222,10 @@ fallback_rrc_setup: fill_random(&random_value, sizeof(random_value)); random_value = random_value & 0x7fffffffff; /* random value is 39 bits */ + ngap_cause_t cause = {.type = NGAP_CAUSE_RADIO_NETWORK, .value = ngap_cause}; /* request release of the "old" UE in case it exists */ if (ue_context_p != NULL) - rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_REQ(0, ue_context_p, NGAP_CAUSE_RADIO_NETWORK, ngap_cause); + rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_REQ(0, ue_context_p, cause); rrc_gNB_ue_context_t *new = rrc_gNB_create_ue_context(assoc_id, msg->crnti, rrc, random_value, msg->gNB_DU_ue_id); activate_srb(&new->ue_context, 1); @@ -2031,10 +2032,8 @@ static void rrc_CU_process_ue_context_release_request(MessageDef *msg_p, sctp_as /* TODO: marshall types correctly */ LOG_I(NR_RRC, "received UE Context Release Request for UE %u, forwarding to AMF\n", req->gNB_CU_ue_id); - rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_REQ(instance, - ue_context_p, - NGAP_CAUSE_RADIO_NETWORK, - NGAP_CAUSE_RADIO_NETWORK_RADIO_CONNECTION_WITH_UE_LOST); + ngap_cause_t cause = {.type = NGAP_CAUSE_RADIO_NETWORK, .value = NGAP_CAUSE_RADIO_NETWORK_RADIO_CONNECTION_WITH_UE_LOST}; + rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_REQ(instance, ue_context_p, cause); } static void rrc_delete_ue_data(gNB_RRC_UE_t *UE) diff --git a/openair2/RRC/NR/rrc_gNB_NGAP.c b/openair2/RRC/NR/rrc_gNB_NGAP.c index 2d5ff73446..86f3e82740 100644 --- a/openair2/RRC/NR/rrc_gNB_NGAP.c +++ b/openair2/RRC/NR/rrc_gNB_NGAP.c @@ -433,10 +433,10 @@ int rrc_gNB_process_NGAP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, instance_t if (ue_context_p == NULL) { /* Can not associate this message to an UE index, send a failure to NGAP and discard it! */ LOG_W(NR_RRC, "[gNB %ld] In NGAP_INITIAL_CONTEXT_SETUP_REQ: unknown UE from NGAP ids (%u)\n", instance, req->gNB_ue_ngap_id); + ngap_cause_t cause = { .type = NGAP_CAUSE_RADIO_NETWORK, .value = NGAP_CAUSE_RADIO_NETWORK_UNKNOWN_LOCAL_UE_NGAP_ID}; rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_FAIL(req->gNB_ue_ngap_id, NULL, - NGAP_CAUSE_RADIO_NETWORK, - NGAP_CAUSE_RADIO_NETWORK_UNKNOWN_LOCAL_UE_NGAP_ID); + cause); return (-1); } gNB_RRC_INST *rrc = RC.nrrrc[instance]; @@ -530,8 +530,8 @@ void rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_RESP(gNB_RRC_INST *rrc, gNB_RRC_UE_ session->status = PDU_SESSION_STATUS_FAILED; pdusession_failed_t *fail = &resp->pdusessions_failed[pdu_sessions_failed]; fail->pdusession_id = session->param.pdusession_id; - fail->cause = NGAP_CAUSE_RADIO_NETWORK; - fail->cause_value = NGAP_CauseRadioNetwork_unknown_PDU_session_ID; + fail->cause.type = NGAP_CAUSE_RADIO_NETWORK; + fail->cause.value = NGAP_CAUSE_RADIO_NETWORK_UNKNOWN_PDU_SESSION_ID; pdu_sessions_failed++; } } @@ -543,15 +543,13 @@ void rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_RESP(gNB_RRC_INST *rrc, gNB_RRC_UE_ void rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_FAIL(uint32_t gnb, const rrc_gNB_ue_context_t *const ue_context_pP, - const ngap_Cause_t causeP, - const long cause_valueP) + const ngap_cause_t causeP) { MessageDef *msg_p = itti_alloc_new_message(TASK_RRC_GNB, 0, NGAP_INITIAL_CONTEXT_SETUP_FAIL); ngap_initial_context_setup_fail_t *fail = &NGAP_INITIAL_CONTEXT_SETUP_FAIL(msg_p); memset(fail, 0, sizeof(*fail)); fail->gNB_ue_ngap_id = gnb; fail->cause = causeP; - fail->cause_value = cause_valueP; itti_send_msg_to_task(TASK_NGAP, 0, msg_p); } @@ -738,8 +736,8 @@ void rrc_gNB_send_NGAP_PDUSESSION_SETUP_RESP(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE session->status = PDU_SESSION_STATUS_FAILED; pdusession_failed_t *fail = &resp->pdusessions_failed[pdu_sessions_failed]; fail->pdusession_id = session->param.pdusession_id; - fail->cause = NGAP_CAUSE_RADIO_NETWORK; - fail->cause_value = NGAP_CauseRadioNetwork_unknown_PDU_session_ID; + fail->cause.type = NGAP_CAUSE_RADIO_NETWORK; + fail->cause.value = NGAP_CAUSE_RADIO_NETWORK_UNKNOWN_PDU_SESSION_ID; pdu_sessions_failed++; } resp->nb_of_pdusessions = pdu_sessions_done; @@ -794,8 +792,8 @@ void rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(MessageDef *msg_p, instance_t ins for (int i = 0; i < resp->nb_of_pdusessions_failed; ++i) { pdusession_failed_t *f = &resp->pdusessions_failed[i]; f->pdusession_id = msg->pdusession_setup_params[i].pdusession_id; - f->cause = NGAP_CAUSE_PROTOCOL; - f->cause_value = NGAP_CAUSE_PROTOCOL_MSG_NOT_COMPATIBLE_WITH_RECEIVER_STATE; + f->cause.type = NGAP_CAUSE_PROTOCOL; + f->cause.value = NGAP_CAUSE_PROTOCOL_MSG_NOT_COMPATIBLE_WITH_RECEIVER_STATE; } itti_send_msg_to_task(TASK_NGAP, instance, msg_resp); return; @@ -926,17 +924,18 @@ int rrc_gNB_process_NGAP_PDUSESSION_MODIFY_REQ(MessageDef *msg_p, instance_t ins UE->nb_of_pdusessions++; sess->status = PDU_SESSION_STATUS_FAILED; sess->param.pdusession_id = sessMod->pdusession_id; - sess->cause = NGAP_CAUSE_RADIO_NETWORK; - UE->pduSession[i].cause_value = NGAP_CauseRadioNetwork_unknown_PDU_session_ID; + sess->cause.type = NGAP_CAUSE_RADIO_NETWORK; + UE->pduSession[i].cause.type = NGAP_CAUSE_RADIO_NETWORK; + UE->pduSession[i].cause.value = NGAP_CAUSE_RADIO_NETWORK_UNKNOWN_PDU_SESSION_ID; } else { all_failed = false; sess->status = PDU_SESSION_STATUS_NEW; sess->param.pdusession_id = sessMod->pdusession_id; - sess->cause = NGAP_CAUSE_RADIO_NETWORK; - sess->cause_value = NGAP_CauseRadioNetwork_multiple_PDU_session_ID_instances; + sess->cause.type = NGAP_CAUSE_RADIO_NETWORK; + sess->cause.value = NGAP_CAUSE_RADIO_NETWORK_MULTIPLE_PDU_SESSION_ID_INSTANCES; sess->status = PDU_SESSION_STATUS_NEW; sess->param.pdusession_id = sessMod->pdusession_id; - sess->cause = NGAP_CAUSE_NOTHING; + sess->cause.type = NGAP_CAUSE_NOTHING; if (sessMod->nas_pdu.buffer != NULL) { UE->pduSession[i].param.nas_pdu = sessMod->nas_pdu; } @@ -964,8 +963,8 @@ int rrc_gNB_process_NGAP_PDUSESSION_MODIFY_REQ(MessageDef *msg_p, instance_t ins for (int i = 0; i < UE->nb_of_pdusessions; i++) { if (UE->pduSession[i].status == PDU_SESSION_STATUS_FAILED) { msg->pdusessions_failed[i].pdusession_id = UE->pduSession[i].param.pdusession_id; - msg->pdusessions_failed[i].cause = UE->pduSession[i].cause; - msg->pdusessions_failed[i].cause_value = UE->pduSession[i].cause_value; + msg->pdusessions_failed[i].cause.type = UE->pduSession[i].cause.type; + msg->pdusessions_failed[i].cause.value = UE->pduSession[i].cause.value; } } itti_send_msg_to_task(TASK_NGAP, instance, msg_fail_p); @@ -1000,7 +999,7 @@ int rrc_gNB_send_NGAP_PDUSESSION_MODIFY_RESP(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE LOG_I(NR_RRC, "update pdu session %d \n", pduSession->param.pdusession_id); // Update UE->pduSession pduSession->status = PDU_SESSION_STATUS_ESTABLISHED; - pduSession->cause = NGAP_CAUSE_NOTHING; + pduSession->cause.type = NGAP_CAUSE_NOTHING; for (int qos_flow_index = 0; qos_flow_index < UE->pduSession[i].param.nb_qos; qos_flow_index++) { pduSession->param.qos[qos_flow_index] = UE->pduSession[i].param.qos[qos_flow_index]; } @@ -1022,16 +1021,16 @@ int rrc_gNB_send_NGAP_PDUSESSION_MODIFY_RESP(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE } else { LOG_W(NR_RRC, "PDU SESSION modify of a not existing pdu session %d \n", UE->pduSession[i].param.pdusession_id); resp->pdusessions_failed[pdu_sessions_failed].pdusession_id = UE->pduSession[i].param.pdusession_id; - resp->pdusessions_failed[pdu_sessions_failed].cause = NGAP_CAUSE_RADIO_NETWORK; - resp->pdusessions_failed[pdu_sessions_failed].cause_value = NGAP_CauseRadioNetwork_unknown_PDU_session_ID; + ngap_cause_t cause = {.type = NGAP_CAUSE_RADIO_NETWORK, .value = NGAP_CAUSE_RADIO_NETWORK_UNKNOWN_PDU_SESSION_ID}; + resp->pdusessions_failed[pdu_sessions_failed].cause = cause; pdu_sessions_failed++; } } else if ((UE->pduSession[i].status == PDU_SESSION_STATUS_NEW) || (UE->pduSession[i].status == PDU_SESSION_STATUS_ESTABLISHED)) { LOG_D(NR_RRC, "PDU SESSION is NEW or already ESTABLISHED\n"); } else if (UE->pduSession[i].status == PDU_SESSION_STATUS_FAILED) { resp->pdusessions_failed[pdu_sessions_failed].pdusession_id = UE->pduSession[i].param.pdusession_id; - resp->pdusessions_failed[pdu_sessions_failed].cause = UE->pduSession[i].cause; - resp->pdusessions_failed[pdu_sessions_failed].cause_value = UE->pduSession[i].cause_value; + resp->pdusessions_failed[pdu_sessions_failed].cause.type = UE->pduSession[i].cause.type; + resp->pdusessions_failed[pdu_sessions_failed].cause.value = UE->pduSession[i].cause.value; pdu_sessions_failed++; } else @@ -1055,7 +1054,9 @@ int rrc_gNB_send_NGAP_PDUSESSION_MODIFY_RESP(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE } //------------------------------------------------------------------------------ -void rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_REQ(const module_id_t gnb_mod_idP, const rrc_gNB_ue_context_t *const ue_context_pP, const ngap_Cause_t causeP, const long cause_valueP) +void rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_REQ(const module_id_t gnb_mod_idP, + const rrc_gNB_ue_context_t *const ue_context_pP, + const ngap_cause_t causeP) //------------------------------------------------------------------------------ { if (ue_context_pP == NULL) { @@ -1066,8 +1067,8 @@ void rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_REQ(const module_id_t gnb_mod_idP, con ngap_ue_release_req_t *req = &NGAP_UE_CONTEXT_RELEASE_REQ(msg); memset(req, 0, sizeof(*req)); req->gNB_ue_ngap_id = UE->rrc_ue_id; - req->cause = causeP; - req->cause_value = cause_valueP; + req->cause.type = causeP.type; + req->cause.value = causeP.value; for (int i = 0; i < UE->nb_of_pdusessions; i++) { req->pdusessions[i].pdusession_id = UE->pduSession[i].param.pdusession_id; req->nb_of_pdusessions++; @@ -1268,8 +1269,8 @@ int rrc_gNB_process_NGAP_PDUSESSION_RELEASE_COMMAND(MessageDef *msg_p, instance_ int j=UE->nb_of_pdusessions++; UE->pduSession[j].status = PDU_SESSION_STATUS_FAILED; UE->pduSession[j].param.pdusession_id = cmd->pdusession_release_params[pdusession].pdusession_id; - UE->pduSession[j].cause = NGAP_CAUSE_RADIO_NETWORK; - UE->pduSession[j].cause_value = 30; + ngap_cause_t cause = {.type = NGAP_CAUSE_RADIO_NETWORK, .value = NGAP_CAUSE_RADIO_NETWORK_UNKNOWN_PDU_SESSION_ID}; + UE->pduSession[j].cause = cause; continue; } if (pduSession->status == PDU_SESSION_STATUS_FAILED) { diff --git a/openair2/RRC/NR/rrc_gNB_NGAP.h b/openair2/RRC/NR/rrc_gNB_NGAP.h index 0a0c976549..a4ccaaa41b 100644 --- a/openair2/RRC/NR/rrc_gNB_NGAP.h +++ b/openair2/RRC/NR/rrc_gNB_NGAP.h @@ -48,8 +48,7 @@ void rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_RESP(gNB_RRC_INST *rrc, gNB_RRC_UE_ void rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_FAIL(uint32_t gnb, const rrc_gNB_ue_context_t *const ue_context_pP, - const ngap_Cause_t causeP, - const long cause_valueP); + const ngap_cause_t causeP); int rrc_gNB_process_NGAP_DOWNLINK_NAS(MessageDef *msg_p, instance_t instance, mui_t *rrc_gNB_mui); @@ -65,7 +64,9 @@ int rrc_gNB_send_NGAP_PDUSESSION_MODIFY_RESP(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE void rrc_gNB_modify_dedicatedRRCReconfiguration(gNB_RRC_INST *rrc, gNB_RRC_UE_t *ue_p); -void rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_REQ(const module_id_t gnb_mod_idP, const rrc_gNB_ue_context_t *const ue_context_pP, const ngap_Cause_t causeP, const long cause_valueP); +void rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_REQ(const module_id_t gnb_mod_idP, + const rrc_gNB_ue_context_t *const ue_context_pP, + const ngap_cause_t causeP); int rrc_gNB_process_NGAP_UE_CONTEXT_RELEASE_REQ(MessageDef *msg_p, instance_t instance); diff --git a/openair2/RRC/NR/rrc_gNB_du.c b/openair2/RRC/NR/rrc_gNB_du.c index 654ef04be1..ff7a4fba59 100644 --- a/openair2/RRC/NR/rrc_gNB_du.c +++ b/openair2/RRC/NR/rrc_gNB_du.c @@ -429,10 +429,8 @@ static int invalidate_du_connections(gNB_RRC_INST *rrc, sctp_assoc_t assoc_id) cu_remove_f1_ue_data(ue_id); ue_data.du_assoc_id = 0; cu_add_f1_ue_data(ue_id, &ue_data); - rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_REQ(0, - ue_context_p, - NGAP_CAUSE_RADIO_NETWORK, - NGAP_CAUSE_RADIO_NETWORK_RADIO_CONNECTION_WITH_UE_LOST); + ngap_cause_t cause = {.type = NGAP_CAUSE_RADIO_NETWORK, .value = NGAP_CAUSE_RADIO_NETWORK_RADIO_CONNECTION_WITH_UE_LOST}; + rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_REQ(0, ue_context_p, cause); count++; } } diff --git a/openair3/NGAP/ngap_common.c b/openair3/NGAP/ngap_common.c index bded329570..385730f70d 100644 --- a/openair3/NGAP/ngap_common.c +++ b/openair3/NGAP/ngap_common.c @@ -31,3 +31,38 @@ #include "ngap_common.h" int asn1_xer_print = 0; + +void encode_ngap_cause(NGAP_Cause_t *out, const ngap_cause_t *in) +{ + switch (in->type) { + case NGAP_CAUSE_RADIO_NETWORK: + out->present = NGAP_Cause_PR_radioNetwork; + out->choice.radioNetwork = in->value; + break; + + case NGAP_CAUSE_TRANSPORT: + out->present = NGAP_Cause_PR_transport; + out->choice.transport = in->value; + break; + + case NGAP_CAUSE_NAS: + out->present = NGAP_Cause_PR_nas; + out->choice.nas = in->value; + break; + + case NGAP_CAUSE_PROTOCOL: + out->present = NGAP_Cause_PR_protocol; + out->choice.protocol = in->value; + break; + + case NGAP_CAUSE_MISC: + out->present = NGAP_Cause_PR_misc; + out->choice.misc = in->value; + break; + + case NGAP_CAUSE_NOTHING: + default: + AssertFatal(false, "Unknown failure cause %d\n", in->type); + break; + } +} diff --git a/openair3/NGAP/ngap_common.h b/openair3/NGAP/ngap_common.h index f83414e2bb..259f0cbb18 100644 --- a/openair3/NGAP/ngap_common.h +++ b/openair3/NGAP/ngap_common.h @@ -36,10 +36,10 @@ #ifndef NGAP_COMMON_H_ #define NGAP_COMMON_H_ -#include #include "common/utils/LOG/log.h" #include "oai_asn1.h" #include "ngap_msg_includes.h" +#include "openair2/COMMON/ngap_messages_types.h" /* Checking version of ASN1C compiler */ #if (ASN1C_ENVIRONMENT_VERSION < ASN1C_MINIMUM_VERSION) @@ -84,6 +84,8 @@ extern int asn1_xer_print; **/ typedef int (*ngap_message_decoded_callback)(sctp_assoc_t assoc_id, uint32_t stream, NGAP_NGAP_PDU_t *pdu); +void encode_ngap_cause(NGAP_Cause_t *out, const ngap_cause_t *in); + /** @}*/ #endif /* NGAP_COMMON_H_ */ diff --git a/openair3/NGAP/ngap_gNB_context_management_procedures.c b/openair3/NGAP/ngap_gNB_context_management_procedures.c index 524fcee6c4..7abbec2592 100644 --- a/openair3/NGAP/ngap_gNB_context_management_procedures.c +++ b/openair3/NGAP/ngap_gNB_context_management_procedures.c @@ -200,32 +200,8 @@ int ngap_ue_context_release_req(instance_t instance, ie->id = NGAP_ProtocolIE_ID_id_Cause; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_UEContextReleaseRequest_IEs__value_PR_Cause; - DevAssert(ue_release_req_p->cause <= NGAP_Cause_PR_choice_ExtensionS); - switch(ue_release_req_p->cause){ - case NGAP_CAUSE_RADIO_NETWORK: - ie->value.choice.Cause.present = NGAP_Cause_PR_radioNetwork; - ie->value.choice.Cause.choice.radioNetwork = ue_release_req_p->cause_value; - break; - case NGAP_CAUSE_TRANSPORT: - ie->value.choice.Cause.present = NGAP_Cause_PR_transport; - ie->value.choice.Cause.choice.transport = ue_release_req_p->cause_value; - break; - case NGAP_CAUSE_NAS: - ie->value.choice.Cause.present = NGAP_Cause_PR_nas; - ie->value.choice.Cause.choice.nas = ue_release_req_p->cause_value; - break; - case NGAP_CAUSE_PROTOCOL: - ie->value.choice.Cause.present = NGAP_Cause_PR_protocol; - ie->value.choice.Cause.choice.protocol = ue_release_req_p->cause_value; - break; - case NGAP_CAUSE_MISC: - ie->value.choice.Cause.present = NGAP_Cause_PR_misc; - ie->value.choice.Cause.choice.misc = ue_release_req_p->cause_value; - break; - default: - NGAP_WARN("Received NG Error indication cause NGAP_Cause_PR_choice_Extensions\n"); - break; - } + DevAssert(ue_release_req_p->cause.type <= NGAP_CAUSE_MISC); + encode_ngap_cause(&ie->value.choice.Cause, &ue_release_req_p->cause); } if (ngap_gNB_encode_pdu(&pdu, &buffer, &length) < 0) { diff --git a/openair3/NGAP/ngap_gNB_handlers.c b/openair3/NGAP/ngap_gNB_handlers.c index 2916967b83..6309485e2d 100644 --- a/openair3/NGAP/ngap_gNB_handlers.c +++ b/openair3/NGAP/ngap_gNB_handlers.c @@ -1141,8 +1141,8 @@ static int ngap_gNB_handle_pdusession_modify_request(sctp_assoc_t assoc_id, uint item_p = (NGAP_PDUSessionResourceModifyItemModReq_t *)ie->value.choice.PDUSessionResourceModifyListModReq.list.array[nb_of_pdusessions_failed]; pdusession_failed_t *tmp = &msg->pdusessions_failed[nb_of_pdusessions_failed]; tmp->pdusession_id = item_p->pDUSessionID; - tmp->cause = NGAP_CAUSE_RADIO_NETWORK; - tmp->cause_value = NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID; + tmp->cause.type = NGAP_CAUSE_RADIO_NETWORK; + tmp->cause.value = NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID; } msg->nb_of_pdusessions_failed = ie->value.choice.PDUSessionResourceModifyListModReq.list.count; ngap_gNB_pdusession_modify_resp(amf_desc_p->ngap_gNB_instance->instance,msg); diff --git a/openair3/NGAP/ngap_gNB_nas_procedures.c b/openair3/NGAP/ngap_gNB_nas_procedures.c index 86ecd6eead..83daacf758 100644 --- a/openair3/NGAP/ngap_gNB_nas_procedures.c +++ b/openair3/NGAP/ngap_gNB_nas_procedures.c @@ -681,37 +681,7 @@ int ngap_gNB_initial_ctxt_resp(instance_t instance, ngap_initial_context_setup_r item->pDUSessionID = initial_ctxt_resp_p->pdusessions_failed[i].pdusession_id; /* cause */ - switch(initial_ctxt_resp_p->pdusessions_failed[i].cause) { - case NGAP_CAUSE_RADIO_NETWORK: - pdusessionUnTransfer.cause.present = NGAP_Cause_PR_radioNetwork; - pdusessionUnTransfer.cause.choice.radioNetwork = initial_ctxt_resp_p->pdusessions_failed[i].cause_value; - break; - - case NGAP_CAUSE_TRANSPORT: - pdusessionUnTransfer.cause.present = NGAP_Cause_PR_transport; - pdusessionUnTransfer.cause.choice.transport = initial_ctxt_resp_p->pdusessions_failed[i].cause_value; - break; - - case NGAP_CAUSE_NAS: - pdusessionUnTransfer.cause.present = NGAP_Cause_PR_nas; - pdusessionUnTransfer.cause.choice.nas = initial_ctxt_resp_p->pdusessions_failed[i].cause_value; - break; - - case NGAP_CAUSE_PROTOCOL: - pdusessionUnTransfer.cause.present = NGAP_Cause_PR_protocol; - pdusessionUnTransfer.cause.choice.protocol = initial_ctxt_resp_p->pdusessions_failed[i].cause_value; - break; - - case NGAP_CAUSE_MISC: - pdusessionUnTransfer.cause.present = NGAP_Cause_PR_misc; - pdusessionUnTransfer.cause.choice.misc = initial_ctxt_resp_p->pdusessions_failed[i].cause_value; - break; - - case NGAP_CAUSE_NOTHING: - default: - AssertFatal(false, "Unknown PDU session failure cause %d\n", initial_ctxt_resp_p->pdusessions_failed[i].cause); - break; - } + encode_ngap_cause(&pdusessionUnTransfer.cause, &initial_ctxt_resp_p->pdusessions_failed[i].cause); NGAP_INFO("initial context setup response: failed pdusession ID %ld\n", item->pDUSessionID); asn_encode_to_new_buffer_result_t res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NGAP_PDUSessionResourceSetupUnsuccessfulTransfer, &pdusessionUnTransfer); @@ -812,33 +782,7 @@ int ngap_gNB_initial_ctxt_fail(instance_t instance, ngap_initial_context_setup_f ie->id = NGAP_ProtocolIE_ID_id_Cause; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_InitialContextSetupFailureIEs__value_PR_Cause; - - switch (initial_ctxt_fail->cause) { - case NGAP_CAUSE_RADIO_NETWORK: - ie->value.choice.Cause.present = NGAP_Cause_PR_radioNetwork; - ie->value.choice.Cause.choice.radioNetwork = initial_ctxt_fail->cause_value; - break; - case NGAP_CAUSE_TRANSPORT: - ie->value.choice.Cause.present = NGAP_Cause_PR_transport; - ie->value.choice.Cause.choice.transport = initial_ctxt_fail->cause_value; - break; - case NGAP_CAUSE_NAS: - ie->value.choice.Cause.present = NGAP_Cause_PR_nas; - ie->value.choice.Cause.choice.nas = initial_ctxt_fail->cause_value; - break; - case NGAP_CAUSE_PROTOCOL: - ie->value.choice.Cause.present = NGAP_Cause_PR_protocol; - ie->value.choice.Cause.choice.protocol = initial_ctxt_fail->cause_value; - break; - case NGAP_CAUSE_MISC: - ie->value.choice.Cause.present = NGAP_Cause_PR_misc; - ie->value.choice.Cause.choice.misc = initial_ctxt_fail->cause_value; - break; - case NGAP_CAUSE_NOTHING: - default: - AssertFatal(false, "Unknown NGAP Initial Context Setup failure cause %d\n", initial_ctxt_fail->cause); - break; - } + encode_ngap_cause(&ie->value.choice.Cause, &initial_ctxt_fail->cause); } if (asn1_xer_print) { xer_fprint(stdout, &asn_DEF_NGAP_NGAP_PDU, &pdu); @@ -1058,37 +1002,7 @@ int ngap_gNB_pdusession_setup_resp(instance_t instance, ngap_pdusession_setup_re item->pDUSessionID = pdusession_failed->pdusession_id; /* cause */ - switch(pdusession_failed->cause) { - case NGAP_CAUSE_RADIO_NETWORK: - pdusessionUnTransfer_p.cause.present = NGAP_Cause_PR_radioNetwork; - pdusessionUnTransfer_p.cause.choice.radioNetwork = pdusession_failed->cause_value; - break; - - case NGAP_CAUSE_TRANSPORT: - pdusessionUnTransfer_p.cause.present = NGAP_Cause_PR_transport; - pdusessionUnTransfer_p.cause.choice.transport = pdusession_failed->cause_value; - break; - - case NGAP_CAUSE_NAS: - pdusessionUnTransfer_p.cause.present = NGAP_Cause_PR_nas; - pdusessionUnTransfer_p.cause.choice.nas = pdusession_failed->cause_value; - break; - - case NGAP_CAUSE_PROTOCOL: - pdusessionUnTransfer_p.cause.present = NGAP_Cause_PR_protocol; - pdusessionUnTransfer_p.cause.choice.protocol = pdusession_failed->cause_value; - break; - - case NGAP_CAUSE_MISC: - pdusessionUnTransfer_p.cause.present = NGAP_Cause_PR_misc; - pdusessionUnTransfer_p.cause.choice.misc = pdusession_failed->cause_value; - break; - - case NGAP_CAUSE_NOTHING: - default: - AssertFatal(false, "Unknown PDU session failure cause %d\n", pdusession_failed->cause); - break; - } + encode_ngap_cause(&pdusessionUnTransfer_p.cause, &pdusession_failed->cause); NGAP_INFO("pdusession setup response: failed pdusession ID %ld\n", item->pDUSessionID); asn_encode_to_new_buffer_result_t res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NGAP_PDUSessionResourceSetupUnsuccessfulTransfer, &pdusessionUnTransfer_p); @@ -1222,37 +1136,8 @@ int ngap_gNB_pdusession_modify_resp(instance_t instance, ngap_pdusession_modify_ NGAP_PDUSessionResourceModifyUnsuccessfulTransfer_t pdusessionTransfer = {0}; - switch(pdusession_modify_resp_p->pdusessions_failed[i].cause) { - case NGAP_CAUSE_RADIO_NETWORK: - pdusessionTransfer.cause.present = NGAP_Cause_PR_radioNetwork; - pdusessionTransfer.cause.choice.radioNetwork = pdusession_modify_resp_p->pdusessions_failed[i].cause_value; - break; - - case NGAP_CAUSE_TRANSPORT: - pdusessionTransfer.cause.present = NGAP_Cause_PR_transport; - pdusessionTransfer.cause.choice.transport = pdusession_modify_resp_p->pdusessions_failed[i].cause_value; - break; - - case NGAP_CAUSE_NAS: - pdusessionTransfer.cause.present = NGAP_Cause_PR_nas; - pdusessionTransfer.cause.choice.nas = pdusession_modify_resp_p->pdusessions_failed[i].cause_value; - break; - - case NGAP_CAUSE_PROTOCOL: - pdusessionTransfer.cause.present = NGAP_Cause_PR_protocol; - pdusessionTransfer.cause.choice.protocol = pdusession_modify_resp_p->pdusessions_failed[i].cause_value; - break; - - case NGAP_CAUSE_MISC: - pdusessionTransfer.cause.present = NGAP_Cause_PR_misc; - pdusessionTransfer.cause.choice.misc = pdusession_modify_resp_p->pdusessions_failed[i].cause_value; - break; - - case NGAP_CAUSE_NOTHING: - default: - AssertFatal(false, "Unknown PDU session failure cause %d\n", pdusession_modify_resp_p->pdusessions_failed[i].cause); - break; - } + // NGAP cause + encode_ngap_cause(&pdusessionTransfer.cause, &pdusession_modify_resp_p->pdusessions_failed[i].cause); asn_encode_to_new_buffer_result_t res = {0}; NGAP_PDUSessionResourceModifyUnsuccessfulTransfer_t *pdusessionTransfer_p = NULL;