Skip to content

Commit 807e0b9

Browse files
frankistcodebot
authored andcommitted
cu-cp: fix failing cu-cp paging tests
1 parent eaf2cf1 commit 807e0b9

File tree

3 files changed

+61
-30
lines changed

3 files changed

+61
-30
lines changed

lib/cu_cp/du_processor/du_processor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class du_processor_cell_info_interface
7171
virtual bool has_cell(nr_cell_global_id_t cgi) = 0;
7272

7373
/// \brief Get DU configuration context.
74-
virtual const du_configuration_context& get_context() const = 0;
74+
virtual const du_configuration_context* get_context() const = 0;
7575
};
7676

7777
/// Interface to notify RRC DU about UE management procedures.

lib/cu_cp/du_processor/du_processor_impl.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,10 @@ class du_processor_impl : public du_processor, public du_metrics_handler, public
5353
// du_processor_cell_info_interface
5454
bool has_cell(pci_t pci) override;
5555
bool has_cell(nr_cell_global_id_t cgi) override;
56-
const du_configuration_context& get_context() const override { return cfg.du_cfg_hdlr->get_context(); }
56+
const du_configuration_context* get_context() const override
57+
{
58+
return cfg.du_cfg_hdlr->has_context() ? &cfg.du_cfg_hdlr->get_context() : nullptr;
59+
}
5760

5861
metrics_report::du_info handle_du_metrics_report_request() const override;
5962

lib/cu_cp/paging/paging_message_handler.cpp

Lines changed: 56 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
3663
bool 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

Comments
 (0)