Skip to content

Commit 268a4e8

Browse files
FabianEckermannFabian Eckermann
authored andcommitted
cu_up,pdu_session_manager: Add prefixed logger
1 parent 296b211 commit 268a4e8

File tree

7 files changed

+114
-49
lines changed

7 files changed

+114
-49
lines changed

lib/cu_up/cu_up_impl.cpp

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ cu_up::cu_up(const cu_up_configuration& config_) : cfg(config_), main_ctrl_loop(
6767

6868
// Bind/open the gateway, start handling of incoming traffic from UPF, e.g. echo
6969
if (not ngu_gw->create_and_bind()) {
70-
logger.error("Failed to create and connect NG-U gateway.");
70+
logger.error("Failed to create and connect NG-U gateway");
7171
}
7272
cfg.epoll_broker->register_fd(ngu_gw->get_socket_fd(), [this](int fd) { ngu_gw->receive(); });
7373

@@ -110,7 +110,7 @@ void cu_up::start()
110110

111111
std::unique_lock<std::mutex> lock(mutex);
112112
if (std::exchange(running, true)) {
113-
logger.warning("CU-UP already started. Ignoring start request.");
113+
logger.warning("CU-UP already started. Ignoring start request");
114114
return;
115115
}
116116

@@ -136,7 +136,7 @@ void cu_up::start()
136136
// Block waiting for CU-UP setup to complete.
137137
fut.wait();
138138

139-
logger.info("CU-UP started successfully.");
139+
logger.info("CU-UP started successfully");
140140
}
141141

142142
void cu_up::stop()
@@ -166,7 +166,7 @@ void cu_up::stop()
166166
// Wait until the all tasks of the main loop are completed and main loop has stopped.
167167
while (not main_loop_stopped) {
168168
if (not cfg.cu_up_executor->execute(stop_cu_up_main_loop)) {
169-
logger.error("Unable to stop CU-UP.");
169+
logger.error("Unable to stop CU-UP");
170170
return;
171171
}
172172
std::this_thread::sleep_for(std::chrono::milliseconds(10));
@@ -306,7 +306,7 @@ cu_up::handle_bearer_context_setup_request(const e1ap_bearer_context_setup_reque
306306
logger.error("Could not create UE context");
307307
return response;
308308
}
309-
logger.info("ue={} UE Created", ue_ctxt->get_index());
309+
ue_ctxt->get_logger().log_info("UE created");
310310

311311
// 2. Handle bearer context setup request
312312
for (const auto& pdu_session : msg.pdu_session_res_to_setup_list) {
@@ -334,14 +334,14 @@ cu_up::handle_bearer_context_setup_request(const e1ap_bearer_context_setup_reque
334334
e1ap_bearer_context_modification_response
335335
cu_up::handle_bearer_context_modification_request(const e1ap_bearer_context_modification_request& msg)
336336
{
337-
logger.debug("Handling bearer context modification request ue={}", msg.ue_index);
338-
339337
ue_context* ue_ctxt = ue_mng->find_ue(msg.ue_index);
340338
if (ue_ctxt == nullptr) {
341339
logger.error("Could not find UE context");
342340
return {};
343341
}
344342

343+
ue_ctxt->get_logger().log_debug("Handling bearer context modification request");
344+
345345
e1ap_bearer_context_modification_response response = {};
346346
response.ue_index = ue_ctxt->get_index();
347347
response.success = true;
@@ -352,34 +352,34 @@ cu_up::handle_bearer_context_modification_request(const e1ap_bearer_context_modi
352352
// Traverse list of PDU sessions to be setup/modified
353353
for (const auto& pdu_session_item :
354354
msg.ng_ran_bearer_context_mod_request.value().pdu_session_res_to_setup_mod_list) {
355-
logger.debug("Setup/Modification of psi={}", pdu_session_item.pdu_session_id);
355+
ue_ctxt->get_logger().log_debug("Setup/Modification of psi={}", pdu_session_item.pdu_session_id);
356356
pdu_session_setup_result session_result = ue_ctxt->setup_pdu_session(pdu_session_item);
357357
process_successful_pdu_resource_setup_mod_outcome(response.pdu_session_resource_setup_list, session_result);
358358
response.success &= session_result.success; // Update final result.
359359
}
360360

361361
// Traverse list of PDU sessions to be modified.
362362
for (const auto& pdu_session_item : msg.ng_ran_bearer_context_mod_request.value().pdu_session_res_to_modify_list) {
363-
logger.debug("Modifying psi={}", pdu_session_item.pdu_session_id);
363+
ue_ctxt->get_logger().log_debug("Modifying psi={}", pdu_session_item.pdu_session_id);
364364
pdu_session_modification_result session_result =
365365
ue_ctxt->modify_pdu_session(pdu_session_item, new_ul_tnl_info_required);
366366
process_successful_pdu_resource_modification_outcome(response.pdu_session_resource_modified_list,
367367
response.pdu_session_resource_failed_to_modify_list,
368368
session_result,
369369
logger);
370-
logger.debug("Modification {}", session_result.success ? "successful" : "failed");
370+
ue_ctxt->get_logger().log_debug("Modification {}", session_result.success ? "successful" : "failed");
371371

372372
response.success &= session_result.success; // Update final result.
373373
}
374374

375375
// Traverse list of PDU sessions to be removed.
376376
for (const auto& pdu_session_item : msg.ng_ran_bearer_context_mod_request.value().pdu_session_res_to_rem_list) {
377-
logger.info("Removing psi={}", pdu_session_item);
377+
ue_ctxt->get_logger().log_info("Removing psi={}", pdu_session_item);
378378
ue_ctxt->remove_pdu_session(pdu_session_item);
379379
// There is no IE to confirm successful removal.
380380
}
381381
} else {
382-
logger.warning("Ignoring empty Bearer Context Modification Request.");
382+
ue_ctxt->get_logger().log_warning("Ignoring empty Bearer Context Modification Request");
383383
}
384384

385385
// 3. Create response
@@ -393,9 +393,12 @@ void cu_up::handle_bearer_context_release_command(const e1ap_bearer_context_rele
393393
{
394394
ue_context* ue_ctxt = ue_mng->find_ue(msg.ue_index);
395395
if (ue_ctxt == nullptr) {
396-
logger.error("ue={} not found. Discarding E1 Bearer Context Release Command.", msg.ue_index);
396+
logger.error("ue={}: Discarding E1 Bearer Context Release Command. UE context not found", msg.ue_index);
397397
return;
398398
}
399+
400+
ue_ctxt->get_logger().log_debug("Received E1 Bearer Context Release Command");
401+
399402
ue_mng->remove_ue(msg.ue_index);
400403
}
401404

lib/cu_up/cu_up_ue_logger.h

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*
2+
*
3+
* Copyright 2021-2023 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+
#pragma once
11+
12+
#include "srsran/cu_up/cu_up_types.h"
13+
#include "srsran/support/prefixed_logger.h"
14+
#include "fmt/format.h"
15+
16+
namespace srsran {
17+
namespace srs_cu_up {
18+
19+
class cu_up_log_prefix
20+
{
21+
public:
22+
cu_up_log_prefix(ue_index_t ue_index)
23+
{
24+
fmt::memory_buffer buffer;
25+
fmt::format_to(buffer, "ue={}: ", ue_index);
26+
prefix = srsran::to_c_str(buffer);
27+
}
28+
const char* to_c_str() const { return prefix.c_str(); }
29+
30+
private:
31+
std::string prefix;
32+
};
33+
34+
using cu_up_ue_logger = prefixed_logger<cu_up_log_prefix>;
35+
36+
} // namespace srs_cu_up
37+
} // namespace srsran
38+
39+
namespace fmt {
40+
41+
// associated formatter
42+
template <>
43+
struct formatter<srsran::srs_cu_up::cu_up_log_prefix> {
44+
template <typename ParseContext>
45+
auto parse(ParseContext& ctx) -> decltype(ctx.begin())
46+
{
47+
return ctx.begin();
48+
}
49+
50+
template <typename FormatContext>
51+
auto format(srsran::srs_cu_up::cu_up_log_prefix o, FormatContext& ctx)
52+
-> decltype(std::declval<FormatContext>().out())
53+
{
54+
return format_to(ctx.out(), "{}", o.to_c_str());
55+
}
56+
};
57+
} // namespace fmt

lib/cu_up/pdu_session_manager_impl.cpp

Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ pdu_session_manager_impl::pdu_session_manager_impl(ue_index_t
2323
const security::sec_as_config& security_info_,
2424
network_interface_config& net_config_,
2525
n3_interface_config& n3_config_,
26-
srslog::basic_logger& logger_,
26+
cu_up_ue_logger& logger_,
2727
unique_timer& ue_inactivity_timer_,
2828
timer_factory timers_,
2929
f1u_cu_up_gateway& f1u_gw_,
@@ -102,7 +102,7 @@ drb_setup_result pdu_session_manager_impl::handle_drb_to_setup_item(pdu_session&
102102
// Create F1-U bearer
103103
expected<gtpu_teid_t> ret = f1u_teid_allocator.request_teid();
104104
if (not ret.has_value()) {
105-
logger.error("ue={} could not allocate ul_teid", ue_index);
105+
logger.log_error("Could not allocate ul_teid");
106106
return drb_result;
107107
}
108108
gtpu_teid_t f1u_ul_teid = ret.value();
@@ -136,8 +136,7 @@ drb_setup_result pdu_session_manager_impl::handle_drb_to_setup_item(pdu_session&
136136
auto& qos_flow = qos_flow_info;
137137
new_drb->qos_flows[qos_flow.qos_flow_id] = std::make_unique<qos_flow_context>(qos_flow);
138138
auto& new_qos_flow = new_drb->qos_flows[qos_flow.qos_flow_id];
139-
logger.debug(
140-
"Created QoS flow with qos_flow_id={} and five_qi={}", new_qos_flow->qos_flow_id, new_qos_flow->five_qi);
139+
logger.log_debug("Created QoS flow with {} and {}", new_qos_flow->qos_flow_id, new_qos_flow->five_qi);
141140

142141
sdap_config sdap_cfg = make_sdap_drb_config(drb_to_setup.sdap_cfg);
143142
new_session.sdap->add_mapping(
@@ -164,12 +163,13 @@ pdu_session_setup_result pdu_session_manager_impl::setup_pdu_session(const e1ap_
164163
pdu_session_result.cause = cause_radio_network_t::unspecified;
165164

166165
if (pdu_sessions.find(session.pdu_session_id) != pdu_sessions.end()) {
167-
logger.error("PDU Session {} already exists", session.pdu_session_id);
166+
logger.log_error("PDU Session with psi={} already exists", session.pdu_session_id);
168167
return pdu_session_result;
169168
}
170169

171170
if (pdu_sessions.size() >= MAX_NUM_PDU_SESSIONS_PER_UE) {
172-
logger.error("PDU Session {} cannot be created, max number of PDU sessions reached", session.pdu_session_id);
171+
logger.log_error("PDU Session for psi={} cannot be created. Max number of PDU sessions reached",
172+
session.pdu_session_id);
173173
return pdu_session_result;
174174
}
175175

@@ -178,10 +178,10 @@ pdu_session_setup_result pdu_session_manager_impl::setup_pdu_session(const e1ap_
178178
const auto& ul_tunnel_info = new_session->ul_tunnel_info;
179179

180180
// Get uplink transport address
181-
logger.debug("PDU session {} uplink tunnel info: TEID={}, address={}",
182-
session.pdu_session_id,
183-
ul_tunnel_info.gtp_teid.value(),
184-
ul_tunnel_info.tp_address);
181+
logger.log_debug("PDU session uplink tunnel info: psi={} teid={} addr={}",
182+
session.pdu_session_id,
183+
ul_tunnel_info.gtp_teid.value(),
184+
ul_tunnel_info.tp_address);
185185

186186
// Allocate local TEID
187187
new_session->local_teid = allocate_local_teid(new_session->pdu_session_id);
@@ -216,7 +216,7 @@ pdu_session_setup_result pdu_session_manager_impl::setup_pdu_session(const e1ap_
216216

217217
// Register tunnel at demux
218218
if (!gtpu_rx_demux.add_tunnel(new_session->local_teid, new_session->gtpu->get_rx_upper_layer_interface())) {
219-
logger.error(
219+
logger.log_error(
220220
"PDU Session {} cannot be created. TEID {} already exists", session.pdu_session_id, new_session->local_teid);
221221
return pdu_session_result;
222222
}
@@ -261,7 +261,7 @@ pdu_session_manager_impl::modify_pdu_session(const e1ap_pdu_session_res_to_modif
261261
pdu_session_result.cause = cause_radio_network_t::unspecified;
262262

263263
if (pdu_sessions.find(session.pdu_session_id) == pdu_sessions.end()) {
264-
logger.error("PDU Session {} doesn't exists", session.pdu_session_id);
264+
logger.log_error("PDU Session {} doesn't exists", session.pdu_session_id);
265265
return pdu_session_result;
266266
}
267267

@@ -284,7 +284,7 @@ pdu_session_manager_impl::modify_pdu_session(const e1ap_pdu_session_res_to_modif
284284
// find DRB in PDU session
285285
auto drb_iter = pdu_session->drbs.find(drb_to_mod.drb_id);
286286
if (drb_iter == pdu_session->drbs.end()) {
287-
logger.warning("Cannot modify {} not found in psi={}", drb_to_mod.drb_id, session.pdu_session_id);
287+
logger.log_warning("Cannot modify {} not found in psi={}", drb_to_mod.drb_id, session.pdu_session_id);
288288
pdu_session_result.drb_setup_results.push_back(drb_result);
289289
continue;
290290
}
@@ -297,13 +297,13 @@ pdu_session_manager_impl::modify_pdu_session(const e1ap_pdu_session_res_to_modif
297297
auto& drb = drb_iter->second;
298298
if (new_tnl_info_required) {
299299
if (not f1u_teid_allocator.release_teid(drb->f1u_ul_teid)) {
300-
logger.error("ue={} could not free old ul_teid={}", ue_index, drb->f1u_ul_teid);
300+
logger.log_error("Could not free old ul_teid={}", drb->f1u_ul_teid);
301301
}
302302

303303
// Allocate new UL TEID for DRB
304304
expected<gtpu_teid_t> ret = f1u_teid_allocator.request_teid();
305305
if (not ret.has_value()) {
306-
logger.error("ue={} could not allocate ul_teid", ue_index);
306+
logger.log_error("Could not allocate ul_teid");
307307
continue;
308308
}
309309
drb->f1u_ul_teid = ret.value();
@@ -359,12 +359,12 @@ pdu_session_manager_impl::modify_pdu_session(const e1ap_pdu_session_res_to_modif
359359
: security::ciphering_enabled::on);
360360
}
361361

362-
logger.info("Modified {}, psi={}, f1u_teid={}.", drb_to_mod.drb_id, session.pdu_session_id, drb->f1u_ul_teid);
362+
logger.log_info("Modified {}. psi={} f1u_teid={}", drb_to_mod.drb_id, session.pdu_session_id, drb->f1u_ul_teid);
363363

364364
// Apply QoS flows
365365
for (auto& qos_flow_info : drb_to_mod.flow_map_info) {
366366
// TODO
367-
logger.warning("Unsupported modification of QoS flow. qos_flow_id={}", qos_flow_info.qos_flow_id);
367+
logger.log_warning("Unsupported modification of QoS flow for {}", qos_flow_info.qos_flow_id);
368368
}
369369

370370
// Add result
@@ -380,22 +380,22 @@ pdu_session_manager_impl::modify_pdu_session(const e1ap_pdu_session_res_to_modif
380380
// find DRB in PDU session
381381
auto drb_iter = pdu_session->drbs.find(drb_to_rem);
382382
if (drb_iter == pdu_session->drbs.end()) {
383-
logger.warning("Cannot remove DRB: drb_id={} not found in pdu_session_id={}", drb_to_rem, session.pdu_session_id);
383+
logger.log_warning("Cannot remove {}. DRB not found in psi={}", drb_to_rem, session.pdu_session_id);
384384
continue;
385385
}
386386
srsran_assert(drb_to_rem == drb_iter->second->drb_id,
387-
"Query for drb_id={} in pdu_session_id={} provided different drb_id={}",
387+
"Query for {} in psi={} provided different drb_id={}",
388388
drb_to_rem,
389389
session.pdu_session_id,
390390
drb_iter->second->drb_id);
391391

392392
// remove DRB (this will automatically disconnect from F1-U gateway)
393393
if (not f1u_teid_allocator.release_teid(drb_iter->second->f1u_ul_teid)) {
394-
logger.error("ue={} psi={} drb_id={} could not free ul_teid={}", ue_index, session.pdu_session_id, drb_to_rem);
394+
logger.log_error("psi={} drb_id={} could not free ul_teid={}", session.pdu_session_id, drb_to_rem);
395395
}
396396
pdu_session->drbs.erase(drb_iter);
397397

398-
logger.info("Removed DRB. drb_id={}, pdu_session_id={}.", drb_to_rem, session.pdu_session_id);
398+
logger.log_info("Removed {} for psi={}", drb_to_rem, session.pdu_session_id);
399399
}
400400

401401
pdu_session_result.success = true;
@@ -405,28 +405,27 @@ pdu_session_manager_impl::modify_pdu_session(const e1ap_pdu_session_res_to_modif
405405
void pdu_session_manager_impl::remove_pdu_session(pdu_session_id_t pdu_session_id)
406406
{
407407
if (pdu_sessions.find(pdu_session_id) == pdu_sessions.end()) {
408-
logger.error("PDU session {} not found", pdu_session_id);
408+
logger.log_error("PDU session {} not found", pdu_session_id);
409409
return;
410410
}
411411

412412
// Disconnect all UL tunnels for this PDU session.
413413
auto& pdu_session = pdu_sessions.at(pdu_session_id);
414414
for (const auto& drb : pdu_session->drbs) {
415-
logger.debug("Disconnecting CU bearer with UL-TEID={}", drb.second->f1u_ul_teid);
415+
logger.log_debug("Disconnecting CU bearer with UL-TEID={}", drb.second->f1u_ul_teid);
416416
up_transport_layer_info f1u_ul_tunnel_addr;
417417
f1u_ul_tunnel_addr.tp_address.from_string(net_config.f1u_bind_addr);
418418
f1u_ul_tunnel_addr.gtp_teid = drb.second->f1u_ul_teid;
419419
f1u_gw.disconnect_cu_bearer(f1u_ul_tunnel_addr);
420420
if (f1u_teid_allocator.release_teid(drb.second->f1u_ul_teid)) {
421-
logger.error("ue={} psi={} could not remove ul_teid at session termination. ul_teid={}",
422-
ue_index,
423-
pdu_session_id,
424-
drb.second->f1u_ul_teid);
421+
logger.log_error("psi={} could not remove ul_teid at session termination. ul_teid={}",
422+
pdu_session_id,
423+
drb.second->f1u_ul_teid);
425424
}
426425
}
427426

428427
pdu_sessions.erase(pdu_session_id);
429-
logger.info("Removing PDU session {}", pdu_session_id);
428+
logger.log_info("Removing PDU session with psi={}", pdu_session_id);
430429
}
431430

432431
size_t pdu_session_manager_impl::get_nof_pdu_sessions()

lib/cu_up/pdu_session_manager_impl.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#pragma once
1212

13+
#include "cu_up_ue_logger.h"
1314
#include "pdu_session.h"
1415
#include "pdu_session_manager.h"
1516
#include "srsran/cu_up/cu_up_configuration.h"
@@ -33,7 +34,7 @@ class pdu_session_manager_impl final : public pdu_session_manager_ctrl
3334
const security::sec_as_config& security_info_,
3435
network_interface_config& net_config_,
3536
n3_interface_config& n3_config_,
36-
srslog::basic_logger& logger_,
37+
cu_up_ue_logger& logger_,
3738
unique_timer& ue_inactivity_timer,
3839
timer_factory timers_,
3940
f1u_cu_up_gateway& f1u_gw_,
@@ -64,7 +65,7 @@ class pdu_session_manager_impl final : public pdu_session_manager_ctrl
6465
const security::sec_as_config& security_info;
6566
network_interface_config& net_config;
6667
n3_interface_config& n3_config;
67-
srslog::basic_logger& logger;
68+
cu_up_ue_logger& logger;
6869
unique_timer& ue_inactivity_timer;
6970
timer_factory timers;
7071
gtpu_tunnel_tx_upper_layer_notifier& gtpu_tx_notifier;

0 commit comments

Comments
 (0)