diff --git a/srsenb/hdr/stack/rrc/rrc_bearer_cfg.h b/srsenb/hdr/stack/rrc/rrc_bearer_cfg.h index 099e2aa1b..9a79fcb21 100644 --- a/srsenb/hdr/stack/rrc/rrc_bearer_cfg.h +++ b/srsenb/hdr/stack/rrc/rrc_bearer_cfg.h @@ -107,7 +107,7 @@ public: std::map erabs; private: - srslog::basic_logger& logger; + srslog::basic_logger* logger; uint16_t rnti = 0; const rrc_cfg_t* cfg = nullptr; gtpu_interface_rrc* gtpu = nullptr; diff --git a/srsenb/src/stack/rrc/rrc_bearer_cfg.cc b/srsenb/src/stack/rrc/rrc_bearer_cfg.cc index 9eac4a36e..b7873fbe8 100644 --- a/srsenb/src/stack/rrc/rrc_bearer_cfg.cc +++ b/srsenb/src/stack/rrc/rrc_bearer_cfg.cc @@ -201,7 +201,7 @@ void security_cfg_handler::regenerate_keys_handover(uint32_t new_pci, uint32_t n ****************************/ bearer_cfg_handler::bearer_cfg_handler(uint16_t rnti_, const rrc_cfg_t& cfg_, gtpu_interface_rrc* gtpu_) : - rnti(rnti_), cfg(&cfg_), gtpu(gtpu_), logger(srslog::fetch_basic_logger("RRC")) + rnti(rnti_), cfg(&cfg_), gtpu(gtpu_), logger(&srslog::fetch_basic_logger("RRC")) {} int bearer_cfg_handler::add_erab(uint8_t erab_id, @@ -211,7 +211,7 @@ int bearer_cfg_handler::add_erab(uint8_t const asn1::unbounded_octstring* nas_pdu) { if (erab_id < 5) { - logger.error("ERAB id=%d is invalid", erab_id); + logger->error("ERAB id=%d is invalid", erab_id); return SRSLTE_ERROR; } uint8_t lcid = erab_id - 2; // Map e.g. E-RAB 5 to LCID 3 (==DRB1) @@ -219,11 +219,11 @@ int bearer_cfg_handler::add_erab(uint8_t auto qci_it = cfg->qci_cfg.find(qos.qci); if (qci_it == cfg->qci_cfg.end() or not qci_it->second.configured) { - logger.error("QCI=%d not configured", qos.qci); + logger->error("QCI=%d not configured", qos.qci); return SRSLTE_ERROR; } if (lcid < 3 or lcid > 10) { - logger.error("DRB logical channel ids must be within 3 and 10"); + logger->error("DRB logical channel ids must be within 3 and 10"); return SRSLTE_ERROR; } const rrc_cfg_qci_t& qci_cfg = qci_it->second; @@ -234,13 +234,13 @@ int bearer_cfg_handler::add_erab(uint8_t erabs[erab_id].teid_out = teid_out; if (addr.length() > 32) { - logger.error("Only addresses with length <= 32 are supported"); + logger->error("Only addresses with length <= 32 are supported"); return SRSLTE_ERROR; } if (nas_pdu != nullptr and nas_pdu->size() > 0) { erab_info_list[erab_id].assign(nas_pdu->data(), nas_pdu->data() + nas_pdu->size()); - logger.info( + logger->info( &erab_info_list[erab_id][0], erab_info_list[erab_id].size(), "setup_erab nas_pdu -> erab_info rnti 0x%x", rnti); } @@ -266,7 +266,7 @@ bool bearer_cfg_handler::release_erab(uint8_t erab_id) { auto it = erabs.find(erab_id); if (it == erabs.end()) { - logger.warning("The user rnti=0x%x does not contain ERAB-ID=%d", rnti, erab_id); + logger->warning("The user rnti=0x%x does not contain ERAB-ID=%d", rnti, erab_id); return false; } @@ -293,10 +293,10 @@ bool bearer_cfg_handler::modify_erab(uint8_t const asn1::s1ap::erab_level_qos_params_s& qos, const asn1::unbounded_octstring* nas_pdu) { - logger.info("Modifying E-RAB %d", erab_id); + logger->info("Modifying E-RAB %d", erab_id); std::map::iterator erab_it = erabs.find(erab_id); if (erab_it == erabs.end()) { - logger.error("Could not find E-RAB to modify"); + logger->error("Could not find E-RAB to modify"); return false; } auto address = erab_it->second.address; @@ -310,7 +310,7 @@ void bearer_cfg_handler::add_gtpu_bearer(uint32_t erab_id) { auto it = erabs.find(erab_id); if (it == erabs.end()) { - logger.error("Adding erab_id=%d to GTPU", erab_id); + logger->error("Adding erab_id=%d to GTPU", erab_id); return; } it->second.teid_in = add_gtpu_bearer(erab_id, it->second.teid_out, it->second.address.to_number(), nullptr); @@ -323,7 +323,7 @@ uint32_t bearer_cfg_handler::add_gtpu_bearer(uint32_t { auto it = erabs.find(erab_id); if (it == erabs.end()) { - logger.error("Adding erab_id=%d to GTPU", erab_id); + logger->error("Adding erab_id=%d to GTPU", erab_id); return 0; } @@ -344,7 +344,7 @@ void bearer_cfg_handler::rem_gtpu_bearer(uint32_t erab_id) // Map e.g. E-RAB 5 to LCID 3 (==DRB1) gtpu->rem_bearer(rnti, erab_id - 2); } else { - logger.error("Removing erab_id=%d to GTPU\n", erab_id); + logger->error("Removing erab_id=%d to GTPU\n", erab_id); } } @@ -366,12 +366,12 @@ void bearer_cfg_handler::fill_pending_nas_info(asn1::rrc::rrc_conn_recfg_r8_ies_ auto it = erab_info_list.find(erab_id); if (it != erab_info_list.end()) { const std::vector& erab_info = it->second; - logger.info(&erab_info[0], erab_info.size(), "connection_reconf erab_info -> nas_info rnti 0x%x", rnti); + logger->info(&erab_info[0], erab_info.size(), "connection_reconf erab_info -> nas_info rnti 0x%x", rnti); msg->ded_info_nas_list[idx].resize(erab_info.size()); memcpy(msg->ded_info_nas_list[idx].data(), &erab_info[0], erab_info.size()); erab_info_list.erase(it); } else { - logger.debug("Not adding NAS message to connection reconfiguration. E-RAB id %d", erab_id); + logger->debug("Not adding NAS message to connection reconfiguration. E-RAB id %d", erab_id); } idx++; } diff --git a/srsenb/src/stack/rrc/rrc_mobility.cc b/srsenb/src/stack/rrc/rrc_mobility.cc index 5ab3dd47b..18e124e4b 100644 --- a/srsenb/src/stack/rrc/rrc_mobility.cc +++ b/srsenb/src/stack/rrc/rrc_mobility.cc @@ -743,7 +743,7 @@ void rrc::ue::rrc_mobility::handle_ho_requested(idle_st& s, const ho_req_rx_ev& std::vector admitted_erabs; auto& fwd_tunnels = get_state()->pending_tunnels; fwd_tunnels.clear(); - for (auto& erab : rrc_ue->bearer_list.get_erabs()) { + for (const auto& erab : rrc_ue->bearer_list.get_erabs()) { admitted_erabs.emplace_back(); asn1::s1ap::erab_admitted_item_s& admitted_erab = admitted_erabs.back(); admitted_erab.erab_id = erab.second.id; @@ -907,9 +907,9 @@ void rrc::ue::rrc_mobility::handle_status_transfer(s1_target_ho_st& s, const sta rrc_enb->pdcp->set_bearer_state(rrc_ue->rnti, drb_it->lc_ch_id, drb_state); } - // Enable forwarding of GTPU SDUs to PDCP - for (auto& erab : rrc_ue->bearer_list.get_erabs()) { - rrc_enb->gtpu->set_tunnel_status(erab.second.teid_in, true); + // Enable forwarding of GTPU SDUs coming from Source eNB Tunnel to PDCP + for (uint32_t teid : s.pending_tunnels) { + rrc_enb->gtpu->set_tunnel_status(teid, true); } // Check if there is any pending Reconfiguration Complete. If there is, self-trigger diff --git a/srsenb/src/stack/rrc/rrc_ue.cc b/srsenb/src/stack/rrc/rrc_ue.cc index 7016d77c8..0f5de24d0 100644 --- a/srsenb/src/stack/rrc/rrc_ue.cc +++ b/srsenb/src/stack/rrc/rrc_ue.cc @@ -516,10 +516,7 @@ void rrc::ue::handle_rrc_con_reest_complete(rrc_conn_reest_complete_s* msg, srsl parent->pdcp->enable_encryption(rnti, RB_ID_SRB1); // Reestablish current DRBs during ConnectionReconfiguration - for (const auto& erab_pair : parent->users.at(old_reest_rnti)->bearer_list.get_erabs()) { - const bearer_cfg_handler::erab_t& erab = erab_pair.second; - bearer_list.add_erab(erab.id, erab.qos_params, erab.address, erab.teid_out, nullptr); - } + bearer_list = std::move(parent->users.at(old_reest_rnti)->bearer_list); // remove old RNTI parent->rem_user_thread(old_reest_rnti); diff --git a/srsenb/src/stack/upper/gtpu.cc b/srsenb/src/stack/upper/gtpu.cc index 6880a1cd9..e90778662 100644 --- a/srsenb/src/stack/upper/gtpu.cc +++ b/srsenb/src/stack/upper/gtpu.cc @@ -142,22 +142,23 @@ void gtpu::send_pdu_to_tunnel(tunnel& tx_tun, srslte::unique_byte_buffer_t pdu, uint32_t gtpu::add_bearer(uint16_t rnti, uint32_t lcid, uint32_t addr, uint32_t teid_out, const bearer_props* props) { // Allocate a TEID for the incoming tunnel - uint32_t teid_in = ++next_teid_in; - tunnel& new_tun = tunnels[teid_in]; - new_tun.teid_in = teid_in; - new_tun.rnti = rnti; - new_tun.lcid = lcid; - new_tun.spgw_addr = addr; - new_tun.teid_out = teid_out; + uint32_t teid_in = ++next_teid_in; + auto insert_ret = tunnels.emplace(teid_in, tunnel{}); + tunnel& new_tun = insert_ret.first->second; + new_tun.teid_in = teid_in; + new_tun.rnti = rnti; + new_tun.lcid = lcid; + new_tun.spgw_addr = addr; + new_tun.teid_out = teid_out; ue_teidin_db[rnti][lcid].push_back(teid_in); - logger.info("Adding bearer for rnti: 0x%x, lcid: %d, addr: 0x%x, teid_out: 0x%x, teid_in: 0x%x", + logger.info("New tunnel teid_in=0x%x, teid_out=0x%x, rnti=0x%x, lcid=%d, addr=%s", + teid_in, + teid_out, rnti, lcid, - addr, - teid_out, - teid_in); + srslte::gtpu_ntoa(htonl(addr)).c_str()); if (props != nullptr) { if (props->flush_before_teidin_present) { @@ -191,7 +192,7 @@ void gtpu::set_tunnel_status(uint32_t teidin, bool dl_active) } tun_it->second.dl_enabled = dl_active; if (dl_active) { - logger.info("Activing GTPU tunnel rnti=0x%x,TEID=%d. %d SDUs currently buffered", + logger.info("Activating GTPU tunnel rnti=0x%x,TEID=%d. %d SDUs currently buffered", tun_it->second.rnti, teidin, tun_it->second.buffer.size());