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.
400416static 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
635650static 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
652672cu_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;
0 commit comments