Skip to content

Commit 4cb4850

Browse files
FabianEckermannasaezper
authored andcommitted
cu_cp: improve failure causes in pdu session resource setup routine
1 parent 263cf8e commit 4cb4850

File tree

2 files changed

+42
-22
lines changed

2 files changed

+42
-22
lines changed

lib/cu_cp/routines/pdu_session_resource_setup_routine.cpp

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#include "pdu_session_resource_setup_routine.h"
1212
#include "pdu_session_routine_helpers.h"
13+
#include "srsran/ran/cause/common.h"
1314
#include "srsran/ran/cause/e1ap_cause_converters.h"
1415
#include "srsran/ran/cause/ngap_cause.h"
1516

@@ -86,25 +87,34 @@ void pdu_session_resource_setup_routine::operator()(
8687
{
8788
CORO_BEGIN(ctx);
8889

89-
logger.debug("ue={}: \"{}\" initialized", setup_msg.ue_index, name());
90+
logger.debug("ue={}: \"{}\" started...", setup_msg.ue_index, name());
9091

9192
// Perform initial sanity checks on incoming message.
9293
if (!up_resource_mng.validate_request(setup_msg.pdu_session_res_setup_items)) {
9394
logger.info("ue={}: \"{}\" Invalid PduSessionResourceSetup", setup_msg.ue_index, name());
94-
CORO_EARLY_RETURN(handle_pdu_session_resource_setup_result(false));
95+
CORO_EARLY_RETURN(handle_pdu_session_resource_setup_result(
96+
false, cause_protocol_t::abstract_syntax_error_falsely_constructed_msg));
9597
}
9698

9799
{
98100
// Calculate next user-plane configuration based on incoming setup message.
99101
next_config = up_resource_mng.calculate_update(setup_msg.pdu_session_res_setup_items);
100102
}
101103

104+
// Check next configuration.
105+
if (next_config.pdu_sessions_to_setup_list.empty()) {
106+
logger.info("ue={}: \"{}\" No PDU sessions to setup", setup_msg.ue_index, name());
107+
CORO_EARLY_RETURN(
108+
handle_pdu_session_resource_setup_result(false, ngap_cause_radio_network_t::radio_res_not_available));
109+
}
110+
102111
// Sanity check passed, decide whether we have to create a Bearer Context at the CU-UP or modify an existing one.
103112
if (next_config.initial_context_creation) {
104113
// Prepare BearerContextSetupRequest.
105114
if (!fill_e1ap_bearer_context_setup_request(bearer_context_setup_request)) {
106115
logger.warning("ue={}: \"{}\" failed to fill bearer context at CU-UP", setup_msg.ue_index, name());
107-
CORO_EARLY_RETURN(handle_pdu_session_resource_setup_result(false));
116+
CORO_EARLY_RETURN(handle_pdu_session_resource_setup_result(
117+
false, cause_protocol_t::abstract_syntax_error_falsely_constructed_msg));
108118
}
109119

110120
// Call E1AP procedure.
@@ -121,7 +131,8 @@ void pdu_session_resource_setup_routine::operator()(
121131
default_security_indication,
122132
logger)) {
123133
logger.warning("ue={}: \"{}\" failed to setup bearer at CU-UP", setup_msg.ue_index, name());
124-
CORO_EARLY_RETURN(handle_pdu_session_resource_setup_result(false));
134+
CORO_EARLY_RETURN(
135+
handle_pdu_session_resource_setup_result(false, cause_protocol_t::msg_not_compatible_with_receiver_state));
125136
}
126137
} else {
127138
// Prepare BearerContextModificationRequest and modify existing bearer.
@@ -143,7 +154,8 @@ void pdu_session_resource_setup_routine::operator()(
143154
default_security_indication,
144155
logger)) {
145156
logger.warning("ue={}: \"{}\" failed to modify bearer at CU-UP", setup_msg.ue_index, name());
146-
CORO_EARLY_RETURN(handle_pdu_session_resource_setup_result(false));
157+
CORO_EARLY_RETURN(
158+
handle_pdu_session_resource_setup_result(false, cause_protocol_t::msg_not_compatible_with_receiver_state));
147159
}
148160
}
149161

@@ -169,7 +181,8 @@ void pdu_session_resource_setup_routine::operator()(
169181
next_config,
170182
logger)) {
171183
logger.warning("ue={}: \"{}\" failed to modify UE context at DU", setup_msg.ue_index, name());
172-
CORO_EARLY_RETURN(handle_pdu_session_resource_setup_result(false));
184+
CORO_EARLY_RETURN(
185+
handle_pdu_session_resource_setup_result(false, cause_protocol_t::msg_not_compatible_with_receiver_state));
173186
}
174187
}
175188

@@ -193,7 +206,8 @@ void pdu_session_resource_setup_routine::operator()(
193206
default_security_indication,
194207
logger)) {
195208
logger.warning("ue={}: \"{}\" failed to modify bearer at CU-UP", setup_msg.ue_index, name());
196-
CORO_EARLY_RETURN(handle_pdu_session_resource_setup_result(false));
209+
CORO_EARLY_RETURN(
210+
handle_pdu_session_resource_setup_result(false, cause_protocol_t::msg_not_compatible_with_receiver_state));
197211
}
198212
}
199213

@@ -228,7 +242,8 @@ void pdu_session_resource_setup_routine::operator()(
228242
std::nullopt,
229243
logger)) {
230244
logger.warning("ue={}: \"{}\" Failed to fill RrcReconfiguration", setup_msg.ue_index, name());
231-
CORO_EARLY_RETURN(handle_pdu_session_resource_setup_result(false));
245+
CORO_EARLY_RETURN(handle_pdu_session_resource_setup_result(
246+
false, cause_protocol_t::abstract_syntax_error_falsely_constructed_msg));
232247
}
233248
}
234249

@@ -240,7 +255,8 @@ void pdu_session_resource_setup_routine::operator()(
240255
// Notify NGAP to request UE context release from AMF.
241256
ue_task_sched.schedule_async_task(cu_cp_notifier.handle_ue_context_release(
242257
{setup_msg.ue_index, {}, ngap_cause_radio_network_t::release_due_to_ngran_generated_reason}));
243-
CORO_EARLY_RETURN(handle_pdu_session_resource_setup_result(false));
258+
CORO_EARLY_RETURN(handle_pdu_session_resource_setup_result(
259+
false, ngap_cause_radio_network_t::release_due_to_ngran_generated_reason));
244260
}
245261
}
246262

@@ -398,7 +414,6 @@ static bool update_setup_list_with_bearer_ctxt_setup_mod_response(
398414
/// \param[in] pdu_session_resource_failed_list Const reference to the failed PDU sessions of the Bearer Context
399415
/// Setup/Modification Response.
400416
static void update_failed_list(
401-
402417
cu_cp_pdu_session_resource_setup_response& response_msg,
403418
up_config_update& next_config,
404419
const slotted_id_vector<pdu_session_id_t, e1ap_pdu_session_resource_failed_item>& pdu_session_resource_failed_list)
@@ -635,25 +650,30 @@ bool handle_rrc_reconfiguration_response(cu_cp_pdu_session_resource_setup_respon
635650
static void mark_all_sessions_as_failed(cu_cp_pdu_session_resource_setup_response& response_msg,
636651
const cu_cp_pdu_session_resource_setup_request& setup_msg,
637652
up_config_update& next_config,
638-
e1ap_cause_t cause)
653+
ngap_cause_t cause)
639654
{
640655
slotted_id_vector<pdu_session_id_t, e1ap_pdu_session_resource_failed_item> failed_list;
641656
for (const auto& setup_item : setup_msg.pdu_session_res_setup_items) {
642-
e1ap_pdu_session_resource_failed_item fail_item;
643-
fail_item.pdu_session_id = setup_item.pdu_session_id;
644-
fail_item.cause = cause;
645-
failed_list.emplace(setup_item.pdu_session_id, fail_item);
657+
// Remove from next config.
658+
next_config.pdu_sessions_to_setup_list.erase(setup_item.pdu_session_id);
659+
response_msg.pdu_session_res_setup_response_items.erase(setup_item.pdu_session_id);
660+
661+
// Add to list taking cause received from CU-UP.
662+
cu_cp_pdu_session_res_setup_failed_item failed_item;
663+
failed_item.pdu_session_id = setup_item.pdu_session_id;
664+
failed_item.unsuccessful_transfer.cause = cause;
665+
response_msg.pdu_session_res_failed_to_setup_items.emplace(setup_item.pdu_session_id, failed_item);
646666
}
647-
update_failed_list(response_msg, next_config, failed_list);
667+
648668
// No PDU session setup can be successful at the same time.
649669
response_msg.pdu_session_res_setup_response_items.clear();
650670
}
651671

652672
cu_cp_pdu_session_resource_setup_response
653-
pdu_session_resource_setup_routine::handle_pdu_session_resource_setup_result(bool success)
673+
pdu_session_resource_setup_routine::handle_pdu_session_resource_setup_result(bool success, ngap_cause_t cause)
654674
{
655675
if (success) {
656-
logger.debug("ue={}: \"{}\" finalized", setup_msg.ue_index, name());
676+
logger.debug("ue={}: \"{}\" finished successfully", setup_msg.ue_index, name());
657677

658678
// Prepare update for UP resource manager.
659679
up_config_update_result result;
@@ -664,8 +684,7 @@ pdu_session_resource_setup_routine::handle_pdu_session_resource_setup_result(boo
664684
} else {
665685
logger.info("ue={}: \"{}\" failed", setup_msg.ue_index, name());
666686

667-
mark_all_sessions_as_failed(
668-
response_msg, setup_msg, next_config, e1ap_cause_t{e1ap_cause_radio_network_t::unspecified});
687+
mark_all_sessions_as_failed(response_msg, setup_msg, next_config, cause);
669688
}
670689

671690
return response_msg;

lib/cu_cp/routines/pdu_session_resource_setup_routine.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@
1111
#pragma once
1212

1313
#include "../cu_cp_impl_interface.h"
14-
#include "../du_processor/du_processor.h"
1514
#include "../up_resource_manager/up_resource_manager_impl.h"
1615
#include "srsran/cu_cp/ue_configuration.h"
1716
#include "srsran/cu_cp/ue_task_scheduler.h"
1817
#include "srsran/e1ap/cu_cp/e1ap_cu_cp.h"
18+
#include "srsran/ran/cause/ngap_cause.h"
1919
#include "srsran/support/async/async_task.h"
2020

2121
namespace srsran {
@@ -61,7 +61,8 @@ class pdu_session_resource_setup_routine
6161
bool fill_e1ap_bearer_context_setup_request(e1ap_bearer_context_setup_request& e1ap_request);
6262
void fill_initial_e1ap_bearer_context_modification_request(e1ap_bearer_context_modification_request& e1ap_request);
6363

64-
cu_cp_pdu_session_resource_setup_response handle_pdu_session_resource_setup_result(bool success);
64+
cu_cp_pdu_session_resource_setup_response
65+
handle_pdu_session_resource_setup_result(bool success, ngap_cause_t cause = ngap_cause_radio_network_t::unspecified);
6566

6667
const cu_cp_pdu_session_resource_setup_request setup_msg;
6768
const ue_configuration ue_cfg;

0 commit comments

Comments
 (0)