@@ -33,44 +33,72 @@ void paging_message_handler::handle_paging_message(const cu_cp_paging_message& m
3333 }
3434}
3535
36+ static bool is_tac_in_list (span<const cu_cp_tai_list_for_paging_item> tai_list, unsigned tac)
37+ {
38+ return std::any_of (tai_list.begin (), tai_list.end (), [&tac](const auto & tai) { return tai.tai .tac == tac; });
39+ }
40+
41+ // / Remove recommended cells that do not match any TAC in the TAI list or that do not belong to this DU.
42+ static void remove_non_applicable_recommended_cells (cu_cp_paging_message& msg, const du_configuration_context& du_cfg)
43+ {
44+ auto & recommended_cells = msg.assist_data_for_paging .value ()
45+ .assist_data_for_recommended_cells .value ()
46+ .recommended_cells_for_paging .recommended_cell_list ;
47+
48+ auto is_bad_recommended_cell = [&](const cu_cp_recommended_cell_item& recommended_cell) {
49+ auto cell_it = std::find_if (du_cfg.served_cells .begin (),
50+ du_cfg.served_cells .end (),
51+ [&recommended_cell](const auto & c) { return recommended_cell.ngran_cgi == c.cgi ; });
52+ if (cell_it == du_cfg.served_cells .end ()) {
53+ // Recommended cell not found for this DU.
54+ return true ;
55+ }
56+ return not is_tac_in_list (msg.tai_list_for_paging , cell_it->tac );
57+ };
58+
59+ recommended_cells.erase (std::remove_if (recommended_cells.begin (), recommended_cells.end (), is_bad_recommended_cell),
60+ recommended_cells.end ());
61+ }
62+
3663bool paging_message_handler::handle_du_paging_message (du_index_t du_index, const cu_cp_paging_message& msg_before)
3764{
3865 du_processor& du = dus.get_du_processor (du_index);
39- const du_configuration_context& du_cfg = du.get_context ();
66+ const du_configuration_context* du_cfg = du.get_context ();
67+ if (du_cfg == nullptr ) {
68+ // DU has not completed F1 Setup.
69+ return false ;
70+ }
4071
4172 // Recommended cells will be added to the original paging message.
42- cu_cp_paging_message msg_expanded {msg_before};
43- if (not msg_expanded .assist_data_for_paging .has_value ()) {
44- msg_expanded .assist_data_for_paging .emplace ();
73+ cu_cp_paging_message msg_filtered {msg_before};
74+ if (not msg_filtered .assist_data_for_paging .has_value ()) {
75+ msg_filtered .assist_data_for_paging .emplace ();
4576 }
46- if (not msg_expanded .assist_data_for_paging .value ().assist_data_for_recommended_cells .has_value ()) {
47- msg_expanded .assist_data_for_paging .value ().assist_data_for_recommended_cells .emplace ();
77+ if (not msg_filtered .assist_data_for_paging .value ().assist_data_for_recommended_cells .has_value ()) {
78+ msg_filtered .assist_data_for_paging .value ().assist_data_for_recommended_cells .emplace ();
4879 }
49- auto & recommended_cells = msg_expanded .assist_data_for_paging .value ()
80+ auto & recommended_cells = msg_filtered .assist_data_for_paging .value ()
5081 .assist_data_for_recommended_cells .value ()
5182 .recommended_cells_for_paging .recommended_cell_list ;
5283
53- for (const auto & tai_list_item : msg_expanded.tai_list_for_paging ) {
54- for (const du_cell_configuration& cell : du_cfg.served_cells ) {
55- if (cell.tac != tai_list_item.tai .tac ) {
56- // Only add cells with matching TAC.
57- continue ;
58- }
59-
60- // Check if cell already exists in the list of recommended.
61- for (auto & recommended_cell : recommended_cells) {
62- if (recommended_cell.ngran_cgi == cell.cgi ) {
63- // NR CGI for TAC is already present. Continue with next cell.
64- continue ;
65- break ;
66- }
67- }
68-
69- // Setup recommended cell item to add in case it doesn't exist
70- cu_cp_recommended_cell_item cell_item;
71- cell_item.ngran_cgi = cell.cgi ;
72- recommended_cells.push_back (cell_item);
84+ // Clear recommended cells not matching any TAC in the tai_list_for_paging or that do not belong to this DU.
85+ remove_non_applicable_recommended_cells (msg_filtered, *du_cfg);
86+
87+ for (const du_cell_configuration& cell : du_cfg->served_cells ) {
88+ // Check if cell already exists in the list of recommended.
89+ if (std::any_of (recommended_cells.begin (), recommended_cells.end (), [&cell](const auto & c) {
90+ return c.ngran_cgi == cell.cgi ;
91+ })) {
92+ continue ;
7393 }
94+ if (not is_tac_in_list (msg_filtered.tai_list_for_paging , cell.tac )) {
95+ continue ;
96+ }
97+
98+ // Setup recommended cell item to add in case it doesn't exist
99+ cu_cp_recommended_cell_item cell_item;
100+ cell_item.ngran_cgi = cell.cgi ;
101+ recommended_cells.push_back (cell_item);
74102 }
75103
76104 if (recommended_cells.empty ()) {
@@ -79,7 +107,7 @@ bool paging_message_handler::handle_du_paging_message(du_index_t du_index, const
79107 }
80108
81109 // Forward message to F1AP of the respective DU.
82- du.get_f1ap_handler ().get_f1ap_paging_manager ().handle_paging (msg_expanded );
110+ du.get_f1ap_handler ().get_f1ap_paging_manager ().handle_paging (msg_filtered );
83111
84112 return true ;
85113}
0 commit comments