Merge remote-tracking branch 'origin/e1ap-issue-878' into integration_2025_w04 (!3171)

- Refactor SCTP Association Response Handling
  - Unified function for both CU-CP and CU-UP handling
  - CU-CP: Notifies RRC of E1 connection loss with CU-UP
  - CU-UP: Initiates a new SCTP association request to regain E1 connection
  - this fix will prevent issue #878 from happening

- Send list of PDU Session Resources to Failed Setup in the (PDU Session
  Resource/Initial Context) Setup Response
  - depending on different failure scenarios
  - e.g. (#878) when No CU-UP is associated and still the CU-CP receives a PDU
    Session Setup Request
  - add relevant functions to handle NGAP Setup Response messages with failed
    list of items
  - this is an extra failure handling to make #878 is handled if it ever happens
    again

- NGAP Cause Refactoring
  - Refactor struct for NGAP cause group and value
  - Add extended radio network cause enumeration values
  - Refactor redundant code into a new NGAP cause encoding function

- Minor logging, function descriptions improvements

Closes #878
This commit is contained in:
Jaroslava Fiedlerova
2025-01-23 17:50:55 +01:00
24 changed files with 345 additions and 282 deletions
+35
View File
@@ -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;
}
}
+3 -1
View File
@@ -36,10 +36,10 @@
#ifndef NGAP_COMMON_H_
#define NGAP_COMMON_H_
#include <netinet/sctp.h>
#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_ */
@@ -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) {
+2 -2
View File
@@ -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);
+5 -120
View File
@@ -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;
+1 -1
View File
@@ -68,7 +68,7 @@ int sctp_itti_send_association_resp(task_id_t task_id,
instance_t instance,
sctp_assoc_t assoc_id,
uint16_t cnx_id,
enum sctp_state_e state,
sctp_state_e state,
uint16_t out_streams,
uint16_t in_streams)
{
+1 -1
View File
@@ -35,7 +35,7 @@ int sctp_itti_send_association_resp(task_id_t task_id,
instance_t instance,
sctp_assoc_t assoc_id,
uint16_t cnx_id,
enum sctp_state_e state,
sctp_state_e state,
uint16_t out_streams,
uint16_t in_streams);