@@ -125,10 +125,36 @@ void f1ap_cu_impl::handle_dl_rrc_message_transfer(const f1ap_dl_rrc_message& msg
125125 pdu_notifier.on_new_message (f1ap_dl_rrc_msg);
126126}
127127
128+ gnb_cu_ue_f1ap_id_t f1ap_cu_impl::allocate_f1ap_id (ue_index_t ue_index)
129+ {
130+ // Only create F1AP UE context.
131+ gnb_cu_ue_f1ap_id_t cu_ue_f1ap_id = ue_ctxt_list.next_gnb_cu_ue_f1ap_id ();
132+ if (cu_ue_f1ap_id == gnb_cu_ue_f1ap_id_t ::invalid) {
133+ return cu_ue_f1ap_id;
134+ }
135+
136+ // Create UE context and store it (DU F1AP UE ID and SRBs are not available/created yet).
137+ ue_ctxt_list.add_ue (ue_index, cu_ue_f1ap_id);
138+ f1ap_ue_context& ue_ctxt = ue_ctxt_list[cu_ue_f1ap_id];
139+
140+ logger.debug (" ue={} Added UE (cu_ue_f1ap_id={}, du_ue_f1ap_id=<na>)" , ue_ctxt.ue_index , cu_ue_f1ap_id);
141+
142+ return cu_ue_f1ap_id;
143+ }
144+
128145async_task<f1ap_ue_context_setup_response>
129146f1ap_cu_impl::handle_ue_context_setup_request (const f1ap_ue_context_setup_request& request)
130147{
131- srsran_assert (ue_ctxt_list.contains (request.ue_index ), " ue={} No F1AP UE context available." , request.ue_index );
148+ if (not ue_ctxt_list.contains (request.ue_index )) {
149+ if (allocate_f1ap_id (request.ue_index ) == gnb_cu_ue_f1ap_id_t ::invalid) {
150+ logger.error (" ue={} Failed to allocate CU UE F1AP ID." , request.ue_index );
151+ return launch_async ([](coro_context<async_task<f1ap_ue_context_setup_response>>& ctx) mutable {
152+ CORO_BEGIN (ctx);
153+ CORO_RETURN (f1ap_ue_context_setup_response{});
154+ });
155+ }
156+ }
157+
132158 return launch_async<ue_context_setup_procedure>(request, ue_ctxt_list[request.ue_index ], pdu_notifier, logger);
133159}
134160
0 commit comments