diff --git a/lib/include/srslte/interfaces/enb_interfaces.h b/lib/include/srslte/interfaces/enb_interfaces.h index bb75a8025..c1e14bef8 100644 --- a/lib/include/srslte/interfaces/enb_interfaces.h +++ b/lib/include/srslte/interfaces/enb_interfaces.h @@ -199,9 +199,8 @@ public: * * @param rnti identifier of the user * @param pcell_index Primary cell (PCell) index - * @param is_temporal Indicates whether the UE is temporal */ - virtual int add_rnti(uint16_t rnti, uint32_t pcell_index, bool is_temporal) = 0; + virtual int add_rnti(uint16_t rnti, uint32_t pcell_index) = 0; /** * Removes an RNTI context from all the physical layer components, including secondary cells @@ -209,6 +208,14 @@ public: */ virtual void rem_rnti(uint16_t rnti) = 0; + /** + * Pregenerates the scrambling sequences for a given RNTI. + * WARNING: This function make take several ms to complete. + * + * @param rnti identifier of the user + */ + virtual int pregen_sequences(uint16_t rnti) = 0; + /** * * @param stop diff --git a/srsenb/hdr/phy/cc_worker.h b/srsenb/hdr/phy/cc_worker.h index bb63dd5a6..cd64810ca 100644 --- a/srsenb/hdr/phy/cc_worker.h +++ b/srsenb/hdr/phy/cc_worker.h @@ -42,8 +42,9 @@ public: cf_t* get_buffer_tx(uint32_t antenna_idx); void set_tti(uint32_t tti); - int add_rnti(uint16_t rnti, bool is_temporal); + int add_rnti(uint16_t rnti); void rem_rnti(uint16_t rnti); + int pregen_sequences(uint16_t rnti); uint32_t get_nof_rnti(); /* These are used by the GUI plotting tools */ diff --git a/srsenb/hdr/phy/phy.h b/srsenb/hdr/phy/phy.h index da73c68cb..7e1100786 100644 --- a/srsenb/hdr/phy/phy.h +++ b/srsenb/hdr/phy/phy.h @@ -51,8 +51,9 @@ public: std::string get_type() override { return "lte"; }; /* MAC->PHY interface */ - int add_rnti(uint16_t rnti, uint32_t pcell_index, bool is_temporal) override; + int add_rnti(uint16_t rnti, uint32_t pcell_index) override; void rem_rnti(uint16_t rnti) final; + int pregen_sequences(uint16_t rnti) override; void set_mch_period_stop(uint32_t stop) final; void set_activation_deactivation_scell(uint16_t rnti, const std::array& activation) override; diff --git a/srsenb/hdr/phy/sf_worker.h b/srsenb/hdr/phy/sf_worker.h index 8ca54130e..c41de4e8e 100644 --- a/srsenb/hdr/phy/sf_worker.h +++ b/srsenb/hdr/phy/sf_worker.h @@ -41,8 +41,9 @@ public: cf_t* get_buffer_rx(uint32_t cc_idx, uint32_t antenna_idx); void set_time(uint32_t tti, uint32_t tx_worker_cnt, srslte_timestamp_t tx_time); - int add_rnti(uint16_t rnti, uint32_t cc_idx, bool is_temporal); + int add_rnti(uint16_t rnti, uint32_t cc_idx); void rem_rnti(uint16_t rnti); + int pregen_sequences(uint16_t rnti); uint32_t get_nof_rnti(); /* These are used by the GUI plotting tools */ diff --git a/srsenb/src/phy/cc_worker.cc b/srsenb/src/phy/cc_worker.cc index 599935e9c..130deb787 100644 --- a/srsenb/src/phy/cc_worker.cc +++ b/srsenb/src/phy/cc_worker.cc @@ -127,14 +127,14 @@ void cc_worker::init(phy_common* phy_, srslte::log* log_h_, uint32_t cc_idx_) } /* Setup SI-RNTI in PHY */ - add_rnti(SRSLTE_SIRNTI, false); + add_rnti(SRSLTE_SIRNTI); /* Setup P-RNTI in PHY */ - add_rnti(SRSLTE_PRNTI, false); + add_rnti(SRSLTE_PRNTI); /* Setup RA-RNTI in PHY */ for (int i = SRSLTE_RARNTI_START; i <= SRSLTE_RARNTI_END; i++) { - add_rnti(i, false); + add_rnti(i); } if (srslte_softbuffer_tx_init(&temp_mbsfn_softbuffer, nof_prb)) { @@ -180,25 +180,25 @@ void cc_worker::set_tti(uint32_t tti_) tti_tx_ul = TTI_RX_ACK(tti_rx); } -int cc_worker::add_rnti(uint16_t rnti, bool is_temporal) +int cc_worker::pregen_sequences(uint16_t rnti) { - - if (not is_temporal) { - if (srslte_enb_dl_add_rnti(&enb_dl, rnti)) { - return -1; - } - if (srslte_enb_ul_add_rnti(&enb_ul, rnti)) { - return -1; - } + if (srslte_enb_dl_add_rnti(&enb_dl, rnti)) { + return -1; } + if (srslte_enb_ul_add_rnti(&enb_ul, rnti)) { + return -1; + } + return SRSLTE_SUCCESS; +} + +int cc_worker::add_rnti(uint16_t rnti) +{ + std::unique_lock lock(mutex); - mutex.lock(); // Create user unless already exists if (ue_db.count(rnti) == 0) { ue_db[rnti] = new ue(rnti); } - mutex.unlock(); - return SRSLTE_SUCCESS; } diff --git a/srsenb/src/phy/phy.cc b/srsenb/src/phy/phy.cc index 30165dc8a..6a061dcc9 100644 --- a/srsenb/src/phy/phy.cc +++ b/srsenb/src/phy/phy.cc @@ -150,7 +150,7 @@ void phy::stop() } /***** MAC->PHY interface **********/ -int phy::add_rnti(uint16_t rnti, uint32_t pcell_index, bool is_temporal) +int phy::add_rnti(uint16_t rnti, uint32_t pcell_index) { if (SRSLTE_RNTI_ISUSER(rnti)) { // Create default PHY configuration with the desired PCell index @@ -161,7 +161,7 @@ int phy::add_rnti(uint16_t rnti, uint32_t pcell_index, bool is_temporal) } for (uint32_t i = 0; i < nof_workers; i++) { - if (workers[i].add_rnti(rnti, pcell_index, is_temporal) != SRSLTE_SUCCESS) { + if (workers[i].add_rnti(rnti, pcell_index) != SRSLTE_SUCCESS) { return SRSLTE_ERROR; } } @@ -183,6 +183,16 @@ void phy::rem_rnti(uint16_t rnti) } } +int phy::pregen_sequences(uint16_t rnti) +{ + for (uint32_t i = 0; i < nof_workers; i++) { + if (workers[i].pregen_sequences(rnti) != SRSLTE_SUCCESS) { + return SRSLTE_ERROR; + } + } + return SRSLTE_SUCCESS; +} + void phy::set_mch_period_stop(uint32_t stop) { workers_common.set_mch_period_stop(stop); @@ -241,7 +251,7 @@ void phy::set_config_dedicated(uint16_t rnti, const phy_rrc_dedicated_list_t& de if (config.configured) { // Add RNTI to all SF workers for (uint32_t w = 0; w < nof_workers; w++) { - workers[w].add_rnti(rnti, config.enb_cc_idx, false); + workers[w].add_rnti(rnti, config.enb_cc_idx); } } } diff --git a/srsenb/src/phy/sf_worker.cc b/srsenb/src/phy/sf_worker.cc index 98ba0769c..b1be21ef0 100644 --- a/srsenb/src/phy/sf_worker.cc +++ b/srsenb/src/phy/sf_worker.cc @@ -129,12 +129,22 @@ void sf_worker::set_time(uint32_t tti_, uint32_t tx_worker_cnt_, srslte_timestam } } -int sf_worker::add_rnti(uint16_t rnti, uint32_t cc_idx, bool is_temporal) +int sf_worker::pregen_sequences(uint16_t rnti) +{ + for (auto& w : cc_workers) { + if (w->pregen_sequences(rnti)) { + return SRSLTE_ERROR; + } + } + return SRSLTE_SUCCESS; +} + +int sf_worker::add_rnti(uint16_t rnti, uint32_t cc_idx) { int ret = SRSLTE_ERROR; if (cc_idx < cc_workers.size()) { - cc_workers[cc_idx]->add_rnti(rnti, is_temporal); + cc_workers[cc_idx]->add_rnti(rnti); ret = SRSLTE_SUCCESS; } diff --git a/srsenb/src/stack/mac/mac.cc b/srsenb/src/stack/mac/mac.cc index 4ef080f3f..73206626f 100644 --- a/srsenb/src/stack/mac/mac.cc +++ b/srsenb/src/stack/mac/mac.cc @@ -212,8 +212,8 @@ int mac::ue_cfg(uint16_t rnti, sched_interface::ue_cfg_t* cfg) if (not ue_ptr->is_phy_added) { Info("Registering RNTI=0x%X to PHY...\n", rnti); // Register new user in PHY with first CC index - if (phy_h->add_rnti(rnti, (SRSLTE_MRNTI) ? 0 : cfg->supported_cc_list.front().enb_cc_idx, false) == SRSLTE_ERROR) { - Error("Registering new UE RNTI=0x%X to PHY\n", rnti); + if (phy_h->pregen_sequences(rnti) == SRSLTE_ERROR) { + Error("Generating sequences for UE RNTI=0x%X\n", rnti); } Info("Done registering RNTI=0x%X to PHY...\n", rnti); ue_ptr->is_phy_added = true; @@ -524,7 +524,7 @@ void mac::rach_detected(uint32_t tti, uint32_t enb_cc_idx, uint32_t preamble_idx rrc_h->add_user(rnti, ue_cfg); // Add temporal rnti to the PHY - if (phy_h->add_rnti(rnti, enb_cc_idx, true) != SRSLTE_SUCCESS) { + if (phy_h->add_rnti(rnti, enb_cc_idx) != SRSLTE_SUCCESS) { Error("Registering temporal-rnti=0x%x to PHY\n", rnti); return; }