@@ -53,6 +53,7 @@ pdu_session_manager_impl::pdu_session_manager_impl(ue_index_t
5353 ue_ul_timer_factory(ue_ul_timer_factory_),
5454 ue_ctrl_timer_factory(ue_ctrl_timer_factory_),
5555 gtpu_tx_notifier(gtpu_tx_notifier_),
56+ n3_teid_allocator(n3_teid_allocator_),
5657 f1u_teid_allocator(f1u_teid_allocator_),
5758 gtpu_rx_demux(gtpu_rx_demux_),
5859 ue_dl_exec(ue_dl_exec_),
@@ -82,26 +83,31 @@ pdu_session_setup_result pdu_session_manager_impl::setup_pdu_session(const e1ap_
8283 return pdu_session_result;
8384 }
8485
85- pdu_sessions.emplace (session.pdu_session_id , std::make_unique<pdu_session>(session, gtpu_rx_demux));
86- std::unique_ptr<pdu_session>& new_session = pdu_sessions.at (session.pdu_session_id );
87- const auto & ul_tunnel_info = new_session->ul_tunnel_info ;
86+ // Allocate local TEID
87+ expected<gtpu_teid_t > ret = n3_teid_allocator.request_teid ();
88+ if (ret.is_error ()) {
89+ logger.log_warning (" Failed to create PDU session. Cause: could not allocate local TEID. {}" ,
90+ session.pdu_session_id );
91+ return pdu_session_result;
92+ }
93+
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 ();
8897
8998 // Get uplink transport address
90- logger.log_debug (" PDU session uplink tunnel info: {} teid ={} addr ={}" ,
99+ logger.log_debug (" PDU session uplink tunnel info: {} local_teid ={} peer_teid={} peer_addr ={}" ,
91100 session.pdu_session_id ,
101+ new_session->local_teid ,
92102 ul_tunnel_info.gtp_teid .value (),
93103 ul_tunnel_info.tp_address );
94104
95- // Allocate local TEID
96- // TODO
97- // new_session->local_teid = allocate_local_teid(new_session->pdu_session_id);
98-
99105 // Advertise either local or external IP address of N3 interface
100106 const std::string& n3_addr = net_config.n3_ext_addr .empty () || net_config.n3_ext_addr == " auto"
101107 ? net_config.n3_bind_addr
102108 : net_config.n3_ext_addr ;
103109 pdu_session_result.gtp_tunnel =
104- 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 );
105111
106112 // Create SDAP entity
107113 sdap_entity_creation_message sdap_msg = {ue_index, session.pdu_session_id , &new_session->sdap_to_gtpu_adapter };
@@ -113,7 +119,7 @@ pdu_session_setup_result pdu_session_manager_impl::setup_pdu_session(const e1ap_
113119 msg.cfg .tx .peer_teid = int_to_gtpu_teid (ul_tunnel_info.gtp_teid .value ());
114120 msg.cfg .tx .peer_addr = ul_tunnel_info.tp_address .to_string ();
115121 msg.cfg .tx .peer_port = net_config.upf_port ;
116- msg.cfg .rx .local_teid = new_session->local_teid ;
122+ msg.cfg .rx .local_teid = * new_session->local_teid ;
117123 msg.cfg .rx .t_reordering = n3_config.gtpu_reordering_timer ;
118124 msg.cfg .rx .warn_expired_t_reordering = n3_config.warn_on_drop ;
119125 msg.rx_lower = &new_session->gtpu_to_sdap_adapter ;
@@ -128,7 +134,7 @@ pdu_session_setup_result pdu_session_manager_impl::setup_pdu_session(const e1ap_
128134
129135 // Register tunnel at demux
130136 if (!gtpu_rx_demux.add_tunnel (
131- 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 ())) {
132138 logger.log_error (
133139 " PDU Session {} cannot be created. TEID {} already exists" , session.pdu_session_id , new_session->local_teid );
134140 return pdu_session_result;
@@ -160,6 +166,9 @@ pdu_session_setup_result pdu_session_manager_impl::setup_pdu_session(const e1ap_
160166 ? confidentiality_protection_result_t ::not_performed
161167 : confidentiality_protection_result_t ::performed;
162168 }
169+
170+ // PDU session creation was successful, store PDU session.
171+ pdu_sessions.emplace (session.pdu_session_id , std::move (new_session));
163172 pdu_session_result.success = true ;
164173 return pdu_session_result;
165174}
0 commit comments