Skip to content

Commit 8ce2f2d

Browse files
AlaiaLcodebot
authored andcommitted
app_unit: added the translator and factory to the CU-UP application unit
1 parent 66c6857 commit 8ce2f2d

14 files changed

+398
-113
lines changed

apps/gnb/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ install(TARGETS gnb
2222
target_link_libraries(gnb
2323
srsran_app_services
2424
srsgnb_app_f1u_connector
25-
srsran_cu_up
2625
srsran_cu_cp
2726
srsran_network
2827
srsran_ngap

apps/gnb/gnb.cpp

Lines changed: 11 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
#include "../units/cu_cp/pcap_factory.h"
6969
#include "../units/cu_up/pcap_factory.h"
7070
#include "../units/flexible_du/du_high/pcap_factory.h"
71+
#include "apps/units/cu_up/cu_up_builder.h"
7172
#include "apps/units/flexible_du/split_dynamic/dynamic_du_unit_cli11_schema.h"
7273
#include "apps/units/flexible_du/split_dynamic/dynamic_du_unit_config_validator.h"
7374
#include "apps/units/flexible_du/split_dynamic/dynamic_du_unit_logger_registrator.h"
@@ -430,34 +431,15 @@ int main(int argc, char** argv)
430431
report_error("CU-CP failed to connect to AMF");
431432
}
432433

433-
// Create CU-UP config.
434-
srsran::srs_cu_up::cu_up_configuration cu_up_cfg = generate_cu_up_config(cu_up_config);
435-
cu_up_cfg.ctrl_executor = workers.cu_up_ctrl_exec;
436-
cu_up_cfg.cu_up_e2_exec = workers.cu_up_e2_exec;
437-
cu_up_cfg.ue_exec_pool = workers.cu_up_exec_mapper.get();
438-
cu_up_cfg.io_ul_executor = workers.cu_up_io_ul_exec; // Optionally select separate exec for UL IO
439-
cu_up_cfg.e1ap.e1ap_conn_client = &e1ap_gw;
440-
cu_up_cfg.f1u_gateway = f1u_conn->get_f1u_cu_up_gateway();
441-
cu_up_cfg.gtpu_pcap = cu_up_pcaps[modules::cu_up::to_value(modules::cu_up::pcap_type::GTPU)].get();
442-
cu_up_cfg.timers = cu_timers;
443-
cu_up_cfg.qos = generate_cu_up_qos_config(cu_up_config, du_unit_cfg.du_high_cfg.config);
444-
445-
// Create NG-U gateway.
446-
std::unique_ptr<srs_cu_up::ngu_gateway> ngu_gw;
447-
if (not cu_up_config.amf_cfg.no_core) {
448-
udp_network_gateway_config ngu_gw_config = {};
449-
ngu_gw_config.bind_address = cu_up_cfg.net_cfg.n3_bind_addr;
450-
ngu_gw_config.bind_port = cu_up_cfg.net_cfg.n3_bind_port;
451-
ngu_gw_config.bind_interface = cu_up_cfg.net_cfg.n3_bind_interface;
452-
ngu_gw_config.rx_max_mmsg = cu_up_cfg.net_cfg.n3_rx_max_mmsg;
453-
ngu_gw = srs_cu_up::create_udp_ngu_gateway(ngu_gw_config, *epoll_broker, *workers.cu_up_io_ul_exec);
454-
} else {
455-
ngu_gw = srs_cu_up::create_no_core_ngu_gateway();
456-
}
457-
cu_up_cfg.ngu_gw = ngu_gw.get();
458-
459-
// create and start CU-UP
460-
std::unique_ptr<srsran::srs_cu_up::cu_up_interface> cu_up_obj = create_cu_up(cu_up_cfg);
434+
// Create and start CU-UP
435+
std::unique_ptr<srs_cu_up::cu_up_interface> cu_up_obj =
436+
build_cu_up(cu_up_config,
437+
workers,
438+
e1ap_gw,
439+
*f1u_conn->get_f1u_cu_up_gateway(),
440+
*cu_up_pcaps[modules::cu_up::to_value(modules::cu_up::pcap_type::GTPU)].get(),
441+
*cu_timers,
442+
*epoll_broker);
461443
cu_up_obj->start();
462444

463445
std::vector<du_cell_config> du_cells = generate_du_cell_config(du_unit_cfg.du_high_cfg.config);
@@ -532,7 +514,7 @@ int main(int argc, char** argv)
532514

533515
for (unsigned sector_id = 0, sector_end = du_inst.size(); sector_id != sector_end; ++sector_id) {
534516
auto& du = du_inst[sector_id];
535-
auto& upper = du->get_du_low_wrapper().get_du_low().get_upper_phy(sector_id);
517+
auto& upper = du->get_du_low_wrapper().get_du_low().get_upper_phy(0);
536518

537519
// Make connections between DU and RU.
538520
ru_ul_adapt.map_handler(sector_id, upper.get_rx_symbol_handler());

apps/gnb/gnb_appconfig_translators.cpp

Lines changed: 0 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -407,25 +407,6 @@ srs_cu_cp::cu_cp_configuration srsran::generate_cu_cp_config(const du_high_unit_
407407
return out_cfg;
408408
}
409409

410-
srs_cu_up::cu_up_configuration srsran::generate_cu_up_config(const cu_up_unit_config& config)
411-
{
412-
srs_cu_up::cu_up_configuration out_cfg;
413-
out_cfg.statistics_report_period = std::chrono::seconds{config.metrics.cu_up_statistics_report_period};
414-
out_cfg.n3_cfg.gtpu_reordering_timer = std::chrono::milliseconds{config.gtpu_reordering_timer_ms};
415-
out_cfg.n3_cfg.warn_on_drop = config.warn_on_drop;
416-
417-
if (config.amf_cfg.n3_bind_addr == "auto") {
418-
out_cfg.net_cfg.n3_bind_addr = config.amf_cfg.bind_addr;
419-
} else {
420-
out_cfg.net_cfg.n3_bind_addr = config.amf_cfg.n3_bind_addr;
421-
}
422-
out_cfg.net_cfg.n3_ext_addr = config.amf_cfg.n3_ext_addr;
423-
out_cfg.net_cfg.n3_bind_interface = config.amf_cfg.n3_bind_interface;
424-
out_cfg.net_cfg.n3_rx_max_mmsg = config.amf_cfg.udp_rx_max_msgs;
425-
out_cfg.net_cfg.f1u_bind_addr = config.amf_cfg.bind_addr; // FIXME: check if this can be removed for co-located case
426-
return out_cfg;
427-
}
428-
429410
static pcch_config generate_pcch_config(const du_high_unit_base_cell_config& cell)
430411
{
431412
pcch_config cfg{};
@@ -1024,52 +1005,6 @@ std::vector<du_cell_config> srsran::generate_du_cell_config(const du_high_unit_c
10241005
return out_cfg;
10251006
}
10261007

1027-
std::map<five_qi_t, srs_cu_up::cu_up_qos_config>
1028-
srsran::generate_cu_up_qos_config(const cu_up_unit_config& cu_up_config, const du_high_unit_config& du_cfg)
1029-
{
1030-
std::map<five_qi_t, srs_cu_up::cu_up_qos_config> out_cfg = {};
1031-
if (cu_up_config.qos_cfg.empty()) {
1032-
out_cfg = config_helpers::make_default_cu_up_qos_config_list(
1033-
cu_up_config.warn_on_drop, timer_duration(cu_up_config.metrics.pdcp.report_period));
1034-
return out_cfg;
1035-
}
1036-
1037-
// Generate a temporary DU QoS config to obtain custom config parameters from the RLC counterpart
1038-
std::map<five_qi_t, du_qos_config> du_qos = generate_du_qos_config(du_cfg);
1039-
1040-
for (const auto& qos : cu_up_config.qos_cfg) {
1041-
if (out_cfg.find(qos.five_qi) != out_cfg.end()) {
1042-
report_error("Duplicate 5QI configuration: {}\n", qos.five_qi);
1043-
}
1044-
if (du_qos.find(qos.five_qi) == du_qos.end()) {
1045-
report_error("Cannot create CU-UP config: No entry for {} in DU QoS config\n", qos.five_qi);
1046-
}
1047-
// Convert PDCP custom config
1048-
pdcp_custom_config& out_pdcp_custom = out_cfg[qos.five_qi].pdcp_custom_cfg;
1049-
out_pdcp_custom.tx.warn_on_drop = cu_up_config.warn_on_drop;
1050-
out_pdcp_custom.metrics_period = timer_duration(cu_up_config.metrics.pdcp.report_period);
1051-
1052-
// Obtain RLC config parameters from the respective RLC mode
1053-
const auto& du_five_qi = du_qos[qos.five_qi];
1054-
if (du_five_qi.rlc.mode == rlc_mode::um_bidir) {
1055-
// Take from UM config
1056-
out_pdcp_custom.tx.rlc_sdu_queue = du_five_qi.rlc.um.tx.queue_size;
1057-
} else if (du_five_qi.rlc.mode == rlc_mode::am) {
1058-
// Take from AM config
1059-
out_pdcp_custom.tx.rlc_sdu_queue = du_five_qi.rlc.am.tx.queue_size;
1060-
} else {
1061-
report_error("Cannot create CU-UP config: Unsupported rlc_mode={} for {} in DU QoS config\n.",
1062-
du_five_qi.rlc.mode,
1063-
qos.five_qi);
1064-
}
1065-
1066-
// Convert F1-U config
1067-
srs_cu_up::f1u_config& f1u_cfg = out_cfg[qos.five_qi].f1u_cfg;
1068-
f1u_cfg.warn_on_drop = cu_up_config.warn_on_drop;
1069-
}
1070-
return out_cfg;
1071-
}
1072-
10731008
static rlc_am_config generate_du_rlc_am_config(const du_high_unit_rlc_am_config& in_cfg)
10741009
{
10751010
rlc_am_config out_rlc;

apps/gnb/gnb_appconfig_translators.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,9 @@ srsran::sctp_network_connector_config generate_ngap_nw_config(const cu_cp_unit_a
4949
srs_cu_cp::cu_cp_configuration generate_cu_cp_config(const du_high_unit_config& config,
5050
const cu_cp_unit_config& cu_cfg);
5151

52-
/// Converts and returns the given gnb application configuration to a CU-UP configuration.
53-
srs_cu_up::cu_up_configuration generate_cu_up_config(const cu_up_unit_config& config);
54-
5552
/// Converts and returns the given gnb application configuration to a DU cell configuration.
5653
std::vector<du_cell_config> generate_du_cell_config(const du_high_unit_config& config);
5754

58-
/// Converts and returns the given gnb application QoS configuration to a CU-UP configuration.
59-
std::map<five_qi_t, srs_cu_up::cu_up_qos_config> generate_cu_up_qos_config(const cu_up_unit_config& cu_up_config,
60-
const du_high_unit_config& du_cfg);
61-
6255
/// Converts and returns the given gnb application QoS configuration to a DU QoS list configuration.
6356
std::map<five_qi_t, du_qos_config> generate_du_qos_config(const du_high_unit_config& config);
6457

apps/units/cu_up/CMakeLists.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,12 @@
88

99
set(SOURCES
1010
cu_up_application_unit_impl.cpp
11+
cu_up_builder.cpp
12+
cu_up_unit_config_cli11_schema.cpp
13+
cu_up_unit_config_translators.cpp
1114
cu_up_unit_config_validator.cpp
12-
cu_up_unit_config_cli11_schema.cpp)
15+
cu_up_wrapper.cpp)
1316

1417
add_library(srsran_cu_up_app_unit STATIC ${SOURCES})
1518
target_include_directories(srsran_cu_up_app_unit PRIVATE ${CMAKE_SOURCE_DIR})
19+
target_link_libraries(srsran_cu_up_app_unit srsran_cu_up)

apps/units/cu_up/cu_up_builder.cpp

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/*
2+
*
3+
* Copyright 2021-2024 Software Radio Systems Limited
4+
*
5+
* By using this file, you agree to the terms and conditions set
6+
* forth in the LICENSE file which can be found at the top level of
7+
* the distribution.
8+
*
9+
*/
10+
11+
#include "cu_up_builder.h"
12+
#include "apps/services/worker_manager.h"
13+
#include "cu_up_unit_config.h"
14+
#include "cu_up_unit_config_translators.h"
15+
#include "cu_up_wrapper.h"
16+
#include "srsran/cu_up/cu_up_factory.h"
17+
18+
using namespace srsran;
19+
20+
std::unique_ptr<srs_cu_up::cu_up_interface> srsran::build_cu_up(const cu_up_unit_config& unit_cfg,
21+
worker_manager& workers,
22+
srs_cu_up::e1ap_connection_client& e1ap_conn_client,
23+
f1u_cu_up_gateway& f1u_gateway,
24+
dlt_pcap& gtpu_pcap,
25+
timer_manager& timers,
26+
io_broker& io_brk)
27+
{
28+
srs_cu_up::cu_up_configuration config = generate_cu_up_config(unit_cfg);
29+
config.ctrl_executor = workers.cu_up_ctrl_exec;
30+
config.cu_up_e2_exec = workers.cu_up_e2_exec;
31+
config.ue_exec_pool = workers.cu_up_exec_mapper.get();
32+
config.io_ul_executor = workers.cu_up_io_ul_exec; // Optionally select separate exec for UL IO
33+
config.e1ap.e1ap_conn_client = &e1ap_conn_client;
34+
config.f1u_gateway = &f1u_gateway;
35+
config.gtpu_pcap = &gtpu_pcap;
36+
config.timers = &timers;
37+
config.qos = generate_cu_up_qos_config(unit_cfg);
38+
39+
// Create NG-U gateway.
40+
std::unique_ptr<srs_cu_up::ngu_gateway> ngu_gw;
41+
if (not unit_cfg.upf_cfg.no_core) {
42+
udp_network_gateway_config ngu_gw_config = {};
43+
ngu_gw_config.bind_address = config.net_cfg.n3_bind_addr;
44+
ngu_gw_config.bind_port = config.net_cfg.n3_bind_port;
45+
ngu_gw_config.bind_interface = config.net_cfg.n3_bind_interface;
46+
ngu_gw_config.rx_max_mmsg = config.net_cfg.n3_rx_max_mmsg;
47+
ngu_gw = srs_cu_up::create_udp_ngu_gateway(ngu_gw_config, io_brk, *workers.cu_up_io_ul_exec);
48+
} else {
49+
ngu_gw = srs_cu_up::create_no_core_ngu_gateway();
50+
}
51+
config.ngu_gw = ngu_gw.get();
52+
53+
return std::make_unique<cu_up_wrapper>(std::move(ngu_gw), create_cu_up(config));
54+
}

apps/units/cu_up/cu_up_builder.h

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
*
3+
* Copyright 2021-2024 Software Radio Systems Limited
4+
*
5+
* By using this file, you agree to the terms and conditions set
6+
* forth in the LICENSE file which can be found at the top level of
7+
* the distribution.
8+
*
9+
*/
10+
11+
#pragma once
12+
13+
#include "srsran/cu_up/cu_up.h"
14+
#include <memory>
15+
16+
namespace srsran {
17+
18+
namespace srs_cu_up {
19+
class e1ap_connection_client;
20+
}
21+
22+
struct cu_up_unit_config;
23+
class dlt_pcap;
24+
class f1u_cu_up_gateway;
25+
class io_broker;
26+
struct worker_manager;
27+
28+
/// Builds the CU UP using the given arguments.
29+
std::unique_ptr<srs_cu_up::cu_up_interface> build_cu_up(const cu_up_unit_config& unit_cfg,
30+
worker_manager& workers,
31+
srs_cu_up::e1ap_connection_client& e1ap_conn_client,
32+
f1u_cu_up_gateway& f1u_gateway,
33+
dlt_pcap& gtpu_pcap,
34+
timer_manager& timers,
35+
io_broker& io_brk);
36+
37+
} // namespace srsran

apps/units/cu_up/cu_up_unit_config.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ struct cu_up_unit_upf_config {
3535

3636
/// QoS configuration.
3737
struct cu_up_unit_qos_config {
38-
five_qi_t five_qi = uint_to_five_qi(9);
38+
five_qi_t five_qi = uint_to_five_qi(9);
39+
std::string mode = "am";
40+
unsigned rlc_sdu_queue = 4096;
3941
};
4042

4143
/// CU-UP application unit configuration.
@@ -44,7 +46,7 @@ struct cu_up_unit_config {
4446
unsigned gtpu_reordering_timer_ms = 0;
4547
bool warn_on_drop = false;
4648
/// UPF configuration.
47-
cu_up_unit_upf_config amf_cfg;
49+
cu_up_unit_upf_config upf_cfg;
4850
/// Metrics.
4951
cu_up_unit_metrics_config metrics;
5052
/// Loggers.

apps/units/cu_up/cu_up_unit_config_cli11_schema.cpp

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,29 +64,58 @@ static void configure_cli11_metrics_args(CLI::App& app, cu_up_unit_metrics_confi
6464
->capture_default_str();
6565
}
6666

67-
static void configure_cli11_amf_args(CLI::App& app, cu_up_unit_upf_config& amf_params)
67+
static void configure_cli11_upf_args(CLI::App& app, cu_up_unit_upf_config& upf_params)
6868
{
6969
add_option(app,
7070
"--bind_addr",
71-
amf_params.bind_addr,
71+
upf_params.bind_addr,
7272
"Default local IP address interfaces bind to, unless a specific bind address is specified")
7373
->check(CLI::ValidIPV4);
74-
add_option(app, "--n3_bind_addr", amf_params.n3_bind_addr, "Local IP address to bind for N3 interface")
74+
add_option(app, "--n3_bind_addr", upf_params.n3_bind_addr, "Local IP address to bind for N3 interface")
7575
->check(CLI::ValidIPV4);
76-
add_option(app, "--n3_bind_interface", amf_params.n3_bind_interface, "Network device to bind for N3 interface")
76+
add_option(app, "--n3_bind_interface", upf_params.n3_bind_interface, "Network device to bind for N3 interface")
7777
->capture_default_str();
7878
add_option(app,
7979
"--n3_ext_addr",
80-
amf_params.n3_ext_addr,
80+
upf_params.n3_ext_addr,
8181
"External IP address that is advertised to receive GTP-U packets from UPF via N3 interface")
8282
->check(CLI::ValidIPV4);
83-
add_option(app, "--udp_max_rx_msgs", amf_params.udp_rx_max_msgs, "Maximum amount of messages RX in a single syscall");
84-
add_option(app, "--no_core", amf_params.no_core, "Allow gNB to run without a core");
83+
add_option(app, "--udp_max_rx_msgs", upf_params.udp_rx_max_msgs, "Maximum amount of messages RX in a single syscall");
84+
add_option(app, "--no_core", upf_params.no_core, "Allow gNB to run without a core");
85+
}
86+
87+
static void configure_cli11_rlc_am_args(CLI::App& app, uint32_t& queue_size)
88+
{
89+
CLI::App* tx_subcmd = app.add_subcommand("tx", "AM TX parameters");
90+
add_option(*tx_subcmd, "--queue-size", queue_size, "RLC AM TX SDU queue size")->capture_default_str();
91+
}
92+
93+
static void configure_cli11_rlc_um_args(CLI::App& app, uint32_t& queue_size)
94+
{
95+
CLI::App* rlc_tx_um_subcmd = app.add_subcommand("tx", "UM TX parameters");
96+
rlc_tx_um_subcmd->add_option("--queue-size", queue_size, "RLC UM TX SDU queue size")->capture_default_str();
97+
}
98+
99+
static void configure_cli11_rlc_args(CLI::App& app, cu_up_unit_qos_config& qos_params)
100+
{
101+
add_option(app, "--mode", qos_params.mode, "RLC mode")->capture_default_str();
102+
103+
// UM section.
104+
CLI::App* rlc_um_subcmd = app.add_subcommand("um-bidir", "UM parameters");
105+
configure_cli11_rlc_um_args(*rlc_um_subcmd, qos_params.rlc_sdu_queue);
106+
107+
// AM section.
108+
CLI::App* rlc_am_subcmd = app.add_subcommand("am", "AM parameters");
109+
configure_cli11_rlc_am_args(*rlc_am_subcmd, qos_params.rlc_sdu_queue);
85110
}
86111

87112
static void configure_cli11_qos_args(CLI::App& app, cu_up_unit_qos_config& qos_params)
88113
{
89114
add_option(app, "--five_qi", qos_params.five_qi, "5QI")->capture_default_str()->check(CLI::Range(0, 255));
115+
116+
// RLC section.
117+
CLI::App* rlc_subcmd = app.add_subcommand("rlc", "RLC parameters");
118+
configure_cli11_rlc_args(*rlc_subcmd, qos_params);
90119
}
91120

92121
void srsran::configure_cli11_with_cu_up_unit_config_schema(CLI::App& app, cu_up_unit_config& unit_cfg)
@@ -105,7 +134,7 @@ void srsran::configure_cli11_with_cu_up_unit_config_schema(CLI::App& app, cu_up_
105134

106135
// AMF section.
107136
CLI::App* amf_subcmd = add_subcommand(app, "amf", "AMF parameters")->configurable();
108-
configure_cli11_amf_args(*amf_subcmd, unit_cfg.amf_cfg);
137+
configure_cli11_upf_args(*amf_subcmd, unit_cfg.upf_cfg);
109138

110139
// QoS section.
111140
auto qos_lambda = [&unit_cfg](const std::vector<std::string>& values) {

0 commit comments

Comments
 (0)