Skip to content

Commit 5e1b86e

Browse files
alvasMancodebot
authored andcommitted
cu_up: make sure local teid is allocated before pdu session creation
1 parent c0b2d1f commit 5e1b86e

File tree

2 files changed

+20
-20
lines changed

2 files changed

+20
-20
lines changed

lib/cu_up/pdu_session.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,14 @@ namespace srs_cu_up {
2626
/// \brief Context for PDU session with session-wide parameters and all contained DRBs.
2727
struct pdu_session {
2828
pdu_session(const e1ap_pdu_session_res_to_setup_item& session,
29-
gtpu_demux_ctrl& gtpu_rx_demux_,
30-
gtpu_teid_pool& n3_teid_allocator_) :
29+
gtpu_teid_t local_teid_, // the local teid used by the gNB for this PDU session
30+
gtpu_demux_ctrl& gtpu_rx_demux_,
31+
gtpu_teid_pool& n3_teid_allocator_) :
3132
pdu_session_id(session.pdu_session_id),
3233
session_type(session.pdu_session_type),
3334
snssai(session.snssai),
3435
security_ind(session.security_ind),
36+
local_teid(local_teid_),
3537
ul_tunnel_info(session.ng_ul_up_tnl_info),
3638
gtpu_rx_demux(gtpu_rx_demux_),
3739
n3_teid_allocator(n3_teid_allocator_)
@@ -45,10 +47,8 @@ struct pdu_session {
4547
void stop()
4648
{
4749
if (not stopped) {
48-
if (local_teid.has_value()) {
49-
gtpu_rx_demux.remove_tunnel(local_teid.value());
50-
n3_teid_allocator.release_teid(local_teid.value());
51-
}
50+
gtpu_rx_demux.remove_tunnel(local_teid);
51+
n3_teid_allocator.release_teid(local_teid);
5252

5353
gtpu->stop();
5454

@@ -77,10 +77,10 @@ struct pdu_session {
7777
uint64_t pdu_session_res_ambr = 0;
7878

7979
// Tunneling info used by all DRBs/QoS flows in this PDU session
80-
up_transport_layer_info ul_tunnel_info; // the peer GTP-U address and TEID
81-
std::optional<gtpu_teid_t> local_teid; // the local teid used by the gNB for this PDU session
82-
gtpu_demux_ctrl& gtpu_rx_demux; // The demux entity to register/remove the tunnel.
83-
gtpu_teid_pool& n3_teid_allocator; // Pool to de-allocate TEID on release
80+
gtpu_teid_t local_teid; // the local teid used by the gNB for this PDU session
81+
up_transport_layer_info ul_tunnel_info; // the peer GTP-U address and TEID
82+
gtpu_demux_ctrl& gtpu_rx_demux; // The demux entity to register/remove the tunnel.
83+
gtpu_teid_pool& n3_teid_allocator; // Pool to de-allocate TEID on release
8484

8585
drb_context* default_drb = nullptr; // non-owning pointer to default DRB, if any
8686

lib/cu_up/pdu_session_manager_impl.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -84,16 +84,16 @@ pdu_session_setup_result pdu_session_manager_impl::setup_pdu_session(const e1ap_
8484
}
8585

8686
// Allocate local TEID
87-
expected<gtpu_teid_t> ret = n3_teid_allocator.request_teid();
88-
if (ret.is_error()) {
87+
expected<gtpu_teid_t> local_teid = n3_teid_allocator.request_teid();
88+
if (local_teid.is_error()) {
8989
logger.log_warning("Failed to create PDU session. Cause: could not allocate local TEID. {}",
9090
session.pdu_session_id);
9191
return pdu_session_result;
9292
}
9393

94-
std::unique_ptr<pdu_session> new_session = std::make_unique<pdu_session>(session, gtpu_rx_demux, n3_teid_allocator);
95-
const auto& ul_tunnel_info = new_session->ul_tunnel_info;
96-
new_session->local_teid = ret.value();
94+
std::unique_ptr<pdu_session> new_session =
95+
std::make_unique<pdu_session>(session, local_teid.value(), gtpu_rx_demux, n3_teid_allocator);
96+
const auto& ul_tunnel_info = new_session->ul_tunnel_info;
9797

9898
// Get uplink transport address
9999
logger.log_debug("PDU session uplink tunnel info: {} local_teid={} peer_teid={} peer_addr={}",
@@ -107,7 +107,7 @@ pdu_session_setup_result pdu_session_manager_impl::setup_pdu_session(const e1ap_
107107
? net_config.n3_bind_addr
108108
: net_config.n3_ext_addr;
109109
pdu_session_result.gtp_tunnel =
110-
up_transport_layer_info(transport_layer_address::create_from_string(n3_addr), *new_session->local_teid);
110+
up_transport_layer_info(transport_layer_address::create_from_string(n3_addr), new_session->local_teid);
111111

112112
// Create SDAP entity
113113
sdap_entity_creation_message sdap_msg = {ue_index, session.pdu_session_id, &new_session->sdap_to_gtpu_adapter};
@@ -119,7 +119,7 @@ pdu_session_setup_result pdu_session_manager_impl::setup_pdu_session(const e1ap_
119119
msg.cfg.tx.peer_teid = int_to_gtpu_teid(ul_tunnel_info.gtp_teid.value());
120120
msg.cfg.tx.peer_addr = ul_tunnel_info.tp_address.to_string();
121121
msg.cfg.tx.peer_port = net_config.upf_port;
122-
msg.cfg.rx.local_teid = *new_session->local_teid;
122+
msg.cfg.rx.local_teid = new_session->local_teid;
123123
msg.cfg.rx.t_reordering = n3_config.gtpu_reordering_timer;
124124
msg.cfg.rx.warn_expired_t_reordering = n3_config.warn_on_drop;
125125
msg.rx_lower = &new_session->gtpu_to_sdap_adapter;
@@ -134,7 +134,7 @@ pdu_session_setup_result pdu_session_manager_impl::setup_pdu_session(const e1ap_
134134

135135
// Register tunnel at demux
136136
if (!gtpu_rx_demux.add_tunnel(
137-
*new_session->local_teid, ue_dl_exec, new_session->gtpu->get_rx_upper_layer_interface())) {
137+
new_session->local_teid, ue_dl_exec, new_session->gtpu->get_rx_upper_layer_interface())) {
138138
logger.log_error(
139139
"PDU Session {} cannot be created. TEID {} already exists", session.pdu_session_id, new_session->local_teid);
140140
return pdu_session_result;
@@ -353,7 +353,7 @@ drb_setup_result pdu_session_manager_impl::handle_drb_to_setup_item(pdu_session&
353353

354354
pdu_session_modification_result
355355
pdu_session_manager_impl::modify_pdu_session(const e1ap_pdu_session_res_to_modify_item& session,
356-
bool new_tnl_info_required)
356+
bool new_ul_tnl_info_required)
357357
{
358358
pdu_session_modification_result pdu_session_result;
359359
pdu_session_result.success = false;
@@ -395,7 +395,7 @@ pdu_session_manager_impl::modify_pdu_session(const e1ap_pdu_session_res_to_modif
395395
drb_iter->second->drb_id);
396396

397397
auto& drb = drb_iter->second;
398-
if (new_tnl_info_required) {
398+
if (new_ul_tnl_info_required) {
399399
// Allocate new UL TEID for DRB
400400
expected<gtpu_teid_t> ret = f1u_teid_allocator.request_teid();
401401
if (not ret.has_value()) {

0 commit comments

Comments
 (0)