diff --git a/doc/L2NFAPI.md b/doc/L2NFAPI.md index d9f0ad0435..282e6eeedf 100644 --- a/doc/L2NFAPI.md +++ b/doc/L2NFAPI.md @@ -40,48 +40,7 @@ Normally it should be fine to run both executables on the same host using the `l **2022/03/08: Starting the `2022.w01` tag on the `develop` branch, the L2 nFAPI simulation is using a proxy.** -## 5G L2 nFAPI simulator - -**Note: L2 simulator does not work anymore.** - -### Download and Build the Proxy Server (from EpiSci) - -```bash -$ cd ~ -$ git clone https://github.com/EpiSci/oai-lte-5g-multi-ue-proxy.git -$ cd oai-lte-multi-ue-proxy -$ make -``` - -### Start Proxy Server -Set the number of UEs to connect to server as 1 and the mode is SA. -```bash -$ number_of_ues=1 -$ sudo -E ./build/proxy $number_of_ues --nr -``` - -### Start gNB -```bash -$ sudo -E ./nr-softmodem -O ../ci-scripts/conf_files/episci/proxy_rcc.band78.tm1.106PRB.nfapi.conf --nfapi VNF --noS1 --emulate-l1 -``` -### Start UE -```bash -$ sudo -E ./nr-uesoftmodem -O ../ci-scripts/conf_files/nrue.uicc.conf --nfapi STANDALONE_PNF --node-number 2 --emulate-l1 -``` ### EpiSci's Documentation A more detailed tutorial is available on the [EpiSci GitHub Repository](https://github.com/EpiSci/oai-lte-5g-multi-ue-proxy#readme). -This proxy allows to perform L2 nFAPI simulator for: - -* LTE -* 5G-NSA -* 5G-SA - -### L2 Simulator as Docker Containers - -There used to be docker deployment with L2sim that was run in the CI. Since L2 -simulator does not work anymore, it has been removed. However, you can see the -old `README.md` from tag `2024.w44` -[here](https://gitlab.eurecom.fr/oai/openairinterface5g/-/blob/2024.w44/ci-scripts/yaml_files/5g_l2sim_tdd/README.md). -In the same directory is a `docker-compose.yaml` file that can be used to run -L2sim. +Since 5G code has been removed, this proxy allows to perform L2 nFAPI simulator for LTE only. diff --git a/executables/create_tasks.c b/executables/create_tasks.c index ad81beca09..a36cf410e5 100644 --- a/executables/create_tasks.c +++ b/executables/create_tasks.c @@ -52,7 +52,7 @@ int create_tasks(uint32_t enb_nb) { rrc_enb_init(); itti_mark_task_ready(TASK_RRC_ENB); - if (get_softmodem_params()->emulate_l1 || !IS_SOFTMODEM_NOS1) { + if (!IS_SOFTMODEM_NOS1) { rc = itti_create_task(TASK_SCTP, sctp_eNB_task, NULL); AssertFatal(rc >= 0, "Create task for SCTP failed\n"); } diff --git a/executables/nr-ue.c b/executables/nr-ue.c index 588465133b..f789484465 100644 --- a/executables/nr-ue.c +++ b/executables/nr-ue.c @@ -31,13 +31,10 @@ #include "SCHED_NR_UE/defs.h" #include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h" #include "executables/softmodem-common.h" -#include "PHY/NR_REFSIG/refsig_defs_ue.h" #include "radio/COMMON/common_lib.h" #include "LAYER2/nr_pdcp/nr_pdcp_oai_api.h" #include "LAYER2/nr_rlc/nr_rlc_oai_api.h" -#include "RRC/NR/MESSAGES/asn1_msg.h" #include "openair1/PHY/TOOLS/phy_scope_interface.h" -#include "PHY/MODULATION/nr_modulation.h" #include "instrumentation.h" #include "common/utils/threadPool/notified_fifo.h" #include "position_interface.h" @@ -102,8 +99,6 @@ * */ -static void *NRUE_phy_stub_standalone_pnf_task(void *arg); - static void start_process_slot_tx(void* arg) { notifiedFIFO_elt_t *newTx = arg; nr_rxtx_thread_data_t *curMsgTx = NotifiedFifoData(newTx); @@ -194,189 +189,6 @@ void init_nr_ue_vars(PHY_VARS_NR_UE *ue, uint8_t UE_id) ue->ta_slot = -1; } -void init_nrUE_standalone_thread(int ue_idx) -{ - int standalone_tx_port = 3611 + ue_idx * 2; - int standalone_rx_port = 3612 + ue_idx * 2; - nrue_init_standalone_socket(standalone_tx_port, standalone_rx_port); - - NR_UE_MAC_INST_t *mac = get_mac_inst(0); - pthread_mutex_init(&mac->mutex_dl_info, NULL); - - pthread_t thread; - if (pthread_create(&thread, NULL, nrue_standalone_pnf_task, NULL) != 0) { - LOG_E(NR_MAC, "pthread_create failed for calling nrue_standalone_pnf_task"); - } - pthread_setname_np(thread, "oai:nrue-stand"); - pthread_t phy_thread; - if (pthread_create(&phy_thread, NULL, NRUE_phy_stub_standalone_pnf_task, NULL) != 0) { - LOG_E(NR_MAC, "pthread_create failed for calling NRUE_phy_stub_standalone_pnf_task"); - } - pthread_setname_np(phy_thread, "oai:nrue-stand-phy"); -} - -static void process_queued_nr_nfapi_msgs(NR_UE_MAC_INST_t *mac, int sfn, int slot) -{ - struct sfn_slot_s sfn_slot = {.sfn = sfn, .slot = slot}; - nfapi_nr_rach_indication_t *rach_ind = unqueue_matching(&nr_rach_ind_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &sfn_slot); - nfapi_nr_dl_tti_request_t *dl_tti_request = get_queue(&nr_dl_tti_req_queue); - nfapi_nr_ul_dci_request_t *ul_dci_request = get_queue(&nr_ul_dci_req_queue); - - for (int i = 0; i < NR_MAX_HARQ_PROCESSES; i++) { - LOG_D(NR_MAC, - "Try to get a ul_tti_req by matching CRC active sfn/slot %d.%d from queue with %lu items\n", - sfn, - slot, - nr_ul_tti_req_queue.num_items); - struct sfn_slot_s sfn_sf = {.sfn = mac->nr_ue_emul_l1.harq[i].active_ul_harq_sfn, .slot = mac->nr_ue_emul_l1.harq[i].active_ul_harq_slot }; - nfapi_nr_ul_tti_request_t *ul_tti_request_crc = unqueue_matching(&nr_ul_tti_req_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &sfn_sf); - if (ul_tti_request_crc && ul_tti_request_crc->n_pdus > 0) { - check_and_process_dci(NULL, NULL, NULL, ul_tti_request_crc); - free_and_zero(ul_tti_request_crc); - } - } - - if (rach_ind && rach_ind->number_of_pdus > 0) { - NR_UL_IND_t UL_INFO = { - .rach_ind = *rach_ind, - }; - send_nsa_standalone_msg(&UL_INFO, rach_ind->header.message_id); - free_and_zero(rach_ind->pdu_list); - free_and_zero(rach_ind); - } - if (dl_tti_request) { - struct sfn_slot_s sfn_slot = {.sfn = dl_tti_request->SFN, .slot = dl_tti_request->Slot}; - nfapi_nr_tx_data_request_t *tx_data_request = unqueue_matching(&nr_tx_req_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &sfn_slot); - if (!tx_data_request) { - LOG_E(NR_MAC, "[%d.%d] No corresponding tx_data_request for given dl_tti_request sfn/slot\n", - dl_tti_request->SFN, dl_tti_request->Slot); - if (get_softmodem_params()->nsa) - save_nr_measurement_info(dl_tti_request); - free_and_zero(dl_tti_request); - } - else if (dl_tti_request->dl_tti_request_body.nPDUs > 0 && tx_data_request->Number_of_PDUs > 0) { - if (get_softmodem_params()->nsa) - save_nr_measurement_info(dl_tti_request); - check_and_process_dci(dl_tti_request, tx_data_request, NULL, NULL); - free_and_zero(dl_tti_request); - free_and_zero(tx_data_request); - } - else { - AssertFatal(false, "We dont have PDUs in either dl_tti %d or tx_req %d\n", - dl_tti_request->dl_tti_request_body.nPDUs, tx_data_request->Number_of_PDUs); - } - } - if (ul_dci_request && ul_dci_request->numPdus > 0) { - check_and_process_dci(NULL, NULL, ul_dci_request, NULL); - free_and_zero(ul_dci_request); - } -} - -static void *NRUE_phy_stub_standalone_pnf_task(void *arg) -{ - LOG_I(MAC, "Clearing Queues\n"); - reset_queue(&nr_rach_ind_queue); - reset_queue(&nr_rx_ind_queue); - reset_queue(&nr_crc_ind_queue); - reset_queue(&nr_uci_ind_queue); - reset_queue(&nr_dl_tti_req_queue); - reset_queue(&nr_tx_req_queue); - reset_queue(&nr_ul_dci_req_queue); - reset_queue(&nr_ul_tti_req_queue); - - int last_sfn_slot = -1; - uint16_t sfn_slot = 0; - - module_id_t mod_id = 0; - NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id); - for (int i = 0; i < NR_MAX_HARQ_PROCESSES; i++) { - mac->nr_ue_emul_l1.harq[i].active = false; - mac->nr_ue_emul_l1.harq[i].active_ul_harq_sfn = -1; - mac->nr_ue_emul_l1.harq[i].active_ul_harq_slot = -1; - } - - while (!oai_exit) { - if (sem_wait(&sfn_slot_semaphore) != 0) { - LOG_E(NR_MAC, "sem_wait() error\n"); - abort(); - } - uint16_t *slot_ind = get_queue(&nr_sfn_slot_queue); - nr_phy_channel_params_t *ch_info = get_queue(&nr_chan_param_queue); - if (!slot_ind && !ch_info) { - LOG_D(MAC, "get nr_sfn_slot_queue and nr_chan_param_queue == NULL!\n"); - continue; - } - if (slot_ind) { - sfn_slot = *slot_ind; - free_and_zero(slot_ind); - } - else if (ch_info) { - sfn_slot = ch_info->sfn_slot; - free_and_zero(ch_info); - } - - int mu = 1; // NR-UE emul-L1 is hardcoded to 30kHZ, see check_and_process_dci() - frame_t frame = NFAPI_SFNSLOTDEC2SFN(mu, sfn_slot); - int slot = NFAPI_SFNSLOTDEC2SLOT(mu, sfn_slot); - if (sfn_slot == last_sfn_slot) { - LOG_D(NR_MAC, "repeated sfn_sf = %d.%d\n", - frame, slot); - continue; - } - last_sfn_slot = sfn_slot; - - LOG_D(NR_MAC, "The received sfn/slot [%d %d] from proxy\n", - frame, slot); - - if (IS_SA_MODE(get_softmodem_params()) && mac->mib == NULL) { - LOG_D(NR_MAC, "We haven't gotten MIB. Lets see if we received it\n"); - nr_ue_dl_indication(&mac->dl_info); - process_queued_nr_nfapi_msgs(mac, frame, slot); - } - - int CC_id = 0; - uint8_t gNB_id = 0; - int slots_per_frame = 20; //30 kHZ subcarrier spacing - int slot_ahead = 2; // TODO: Make this dynamic - nr_uplink_indication_t ul_info = {.cc_id = CC_id, - .gNB_index = gNB_id, - .module_id = mod_id, - .slot = (slot + slot_ahead) % slots_per_frame, - .frame = (slot + slot_ahead >= slots_per_frame) ? (frame + 1) % 1024 : frame}; - - if (pthread_mutex_lock(&mac->mutex_dl_info)) abort(); - - if (ch_info) { - mac->nr_ue_emul_l1.pmi = ch_info->csi[0].pmi; - mac->nr_ue_emul_l1.ri = ch_info->csi[0].ri; - mac->nr_ue_emul_l1.cqi = ch_info->csi[0].cqi; - free_and_zero(ch_info); - } - - if (is_dl_slot(slot, &mac->frame_structure)) { - memset(&mac->dl_info, 0, sizeof(mac->dl_info)); - mac->dl_info.cc_id = CC_id; - mac->dl_info.gNB_index = gNB_id; - mac->dl_info.module_id = mod_id; - mac->dl_info.frame = frame; - mac->dl_info.slot = slot; - mac->dl_info.dci_ind = NULL; - mac->dl_info.rx_ind = NULL; - nr_ue_dl_indication(&mac->dl_info); - } - - if (pthread_mutex_unlock(&mac->mutex_dl_info)) abort(); - - if (is_ul_slot(ul_info.slot, &mac->frame_structure)) { - LOG_D(NR_MAC, "Slot %d. calling nr_ue_ul_ind()\n", ul_info.slot); - nr_ue_ul_scheduler(mac, &ul_info); - } - process_queued_nr_nfapi_msgs(mac, frame, slot); - } - return NULL; -} - - /*! * It performs band scanning and synchonization. * \param arg is a pointer to a \ref PHY_VARS_NR_UE structure. diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c index ac7b23382f..fb740781cd 100644 --- a/executables/nr-uesoftmodem.c +++ b/executables/nr-uesoftmodem.c @@ -93,15 +93,6 @@ unsigned short config_frames[4] = {2,9,11,13}; THREAD_STRUCT thread_struct; nrUE_params_t nrUE_params = {0}; -// Thread variables -pthread_cond_t nfapi_sync_cond; -pthread_mutex_t nfapi_sync_mutex; -int nfapi_sync_var=-1; //!< protected by mutex \ref nfapi_sync_mutex -pthread_cond_t sync_cond; -pthread_mutex_t sync_mutex; -int sync_var=-1; //!< protected by mutex \ref sync_mutex. -int config_sync_var=-1; - // not used in UE instance_t CUuniqInstance=0; instance_t DUuniqInstance=0; @@ -111,7 +102,6 @@ int get_node_type() {return -1;} RAN_CONTEXT_t RC; int oai_exit = 0; - static int tx_max_power[MAX_NUM_CCs] = {0}; double rx_gain_off = 0.0; @@ -121,10 +111,7 @@ int32_t uplink_frequency_offset[MAX_NUM_CCs][4]; uint64_t sidelink_frequency[MAX_NUM_CCs][4]; // UE and OAI config variables -int16_t node_synch_ref[MAX_NUM_CCs]; -int otg_enabled; double cpuf; -uint32_t N_RB_DL = 106; int create_tasks_nrue(uint32_t ue_nb) { LOG_D(NR_RRC, "%s(ue_nb:%d)\n", __FUNCTION__, ue_nb); @@ -342,40 +329,6 @@ static void trigger_deregistration(int sig) } } -static void get_channel_model_mode(configmodule_interface_t *cfg) -{ - paramdef_t GNBParams[] = GNBPARAMS_DESC; - config_get(cfg, GNBParams, sizeofArray(GNBParams), NULL); - int num_xp_antennas = *GNBParams[GNB_PDSCH_ANTENNAPORTS_XP_IDX].iptr; - - if (num_xp_antennas == 2) - init_nr_bler_table("NR_MIMO2x2_AWGN_RESULTS_DIR"); - else - init_nr_bler_table("NR_AWGN_RESULTS_DIR"); -} - -void start_oai_nrue_threads() -{ - init_queue(&nr_rach_ind_queue); - init_queue(&nr_rx_ind_queue); - init_queue(&nr_crc_ind_queue); - init_queue(&nr_uci_ind_queue); - init_queue(&nr_sfn_slot_queue); - init_queue(&nr_chan_param_queue); - init_queue(&nr_dl_tti_req_queue); - init_queue(&nr_tx_req_queue); - init_queue(&nr_ul_dci_req_queue); - init_queue(&nr_ul_tti_req_queue); - - if (sem_init(&sfn_slot_semaphore, 0, 0) != 0) - { - LOG_E(MAC, "sem_init() error\n"); - abort(); - } - - init_nrUE_standalone_thread(ue_id_g); -} - int NB_UE_INST = 1; configmodule_interface_t *uniqCfg = NULL; nrLDPC_coding_interface_t nrLDPC_coding_interface = {0}; @@ -455,11 +408,6 @@ int main(int argc, char **argv) init_NR_UE(NB_UE_INST, get_nrUE_params()->uecap_file, get_nrUE_params()->reconfig_file, get_nrUE_params()->rbconfig_file); - if (get_softmodem_params()->emulate_l1) { - RCconfig_nr_ue_macrlc(); - get_channel_model_mode(uniqCfg); - } - // start time manager with some reasonable default for the running mode // (may be overwritten in configuration file or command line) void nr_pdcp_ms_tick(void); @@ -475,97 +423,90 @@ int main(int argc, char **argv) IS_SOFTMODEM_RFSIM ? TIME_SOURCE_IQ_SAMPLES : TIME_SOURCE_REALTIME); - if (!get_softmodem_params()->nsa && get_softmodem_params()->emulate_l1) - start_oai_nrue_threads(); - - if (!get_softmodem_params()->emulate_l1) { - for (int inst = 0; inst < NB_UE_INST; inst++) { - PHY_VARS_NR_UE *UE[MAX_NUM_CCs]; - for (int CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { - UE[CC_id] = PHY_vars_UE_g[inst][CC_id]; - - set_options(CC_id, UE[CC_id]); - NR_UE_MAC_INST_t *mac = get_mac_inst(inst); - init_nr_ue_phy_cpu_stats(&UE[CC_id]->phy_cpu_stats); - - if (IS_SA_MODE(get_softmodem_params()) || get_softmodem_params()->sl_mode) { // set frame config to initial values from command line - // and assume that the SSB is centered on the grid - uint16_t nr_band = get_softmodem_params()->band; - mac->nr_band = nr_band; - mac->ssb_start_subcarrier = UE[CC_id]->frame_parms.ssb_start_subcarrier; - nr_init_frame_parms_ue_sa(&UE[CC_id]->frame_parms, - downlink_frequency[CC_id][0], - uplink_frequency_offset[CC_id][0], - get_softmodem_params()->numerology, - nr_band); - } else { - do { - notifiedFIFO_elt_t *elt = pollNotifiedFIFO(&mac->input_nf); - if (!elt) { - break; - } - process_msg_rcc_to_mac(NotifiedFifoData(elt), inst); - delNotifiedFIFO_elt(elt); - } while (true); - fapi_nr_config_request_t *nrUE_config = &UE[CC_id]->nrUE_config; - nr_init_frame_parms_ue(&UE[CC_id]->frame_parms, nrUE_config, mac->nr_band); - } - - UE[CC_id]->sl_mode = get_softmodem_params()->sl_mode; - init_actor(&UE[CC_id]->sync_actor, "SYNC_", -1); - if (get_nrUE_params()->num_dl_actors > 0) { - UE[CC_id]->dl_actors = calloc_or_fail(get_nrUE_params()->num_dl_actors, sizeof(*UE[CC_id]->dl_actors)); - for (int i = 0; i < get_nrUE_params()->num_dl_actors; i++) { - init_actor(&UE[CC_id]->dl_actors[i], "DL_", -1); + for (int inst = 0; inst < NB_UE_INST; inst++) { + PHY_VARS_NR_UE *UE[MAX_NUM_CCs]; + for (int CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + UE[CC_id] = PHY_vars_UE_g[inst][CC_id]; + set_options(CC_id, UE[CC_id]); + NR_UE_MAC_INST_t *mac = get_mac_inst(inst); + init_nr_ue_phy_cpu_stats(&UE[CC_id]->phy_cpu_stats); + // set frame config to initial values from command line and assume that the SSB is centered on the grid + if (IS_SA_MODE(get_softmodem_params()) || get_softmodem_params()->sl_mode) { + uint16_t nr_band = get_softmodem_params()->band; + mac->nr_band = nr_band; + mac->ssb_start_subcarrier = UE[CC_id]->frame_parms.ssb_start_subcarrier; + nr_init_frame_parms_ue_sa(&UE[CC_id]->frame_parms, + downlink_frequency[CC_id][0], + uplink_frequency_offset[CC_id][0], + get_softmodem_params()->numerology, + nr_band); + } else { + do { + notifiedFIFO_elt_t *elt = pollNotifiedFIFO(&mac->input_nf); + if (!elt) { + break; } - } - if (get_nrUE_params()->num_ul_actors > 0) { - UE[CC_id]->ul_actors = calloc_or_fail(get_nrUE_params()->num_ul_actors, sizeof(*UE[CC_id]->ul_actors)); - for (int i = 0; i < get_nrUE_params()->num_ul_actors; i++) { - init_actor(&UE[CC_id]->ul_actors[i], "UL_", -1); - } - } - init_nr_ue_vars(UE[CC_id], inst); - - if (UE[CC_id]->sl_mode) { - AssertFatal(UE[CC_id]->sl_mode == 2, "Only Sidelink mode 2 supported. Mode 1 not yet supported\n"); - DevAssert(mac->if_module != NULL && mac->if_module->sl_phy_config_request != NULL); - nr_sl_phy_config_t *phycfg = &mac->SL_MAC_PARAMS->sl_phy_config; - phycfg->sl_config_req.sl_carrier_config.sl_num_rx_ant = get_nrUE_params()->nb_antennas_rx; - phycfg->sl_config_req.sl_carrier_config.sl_num_tx_ant = get_nrUE_params()->nb_antennas_tx; - mac->if_module->sl_phy_config_request(phycfg); - sl_nr_ue_phy_params_t *sl_phy = &UE[CC_id]->SL_UE_PHY_PARAMS; - nr_init_frame_parms_ue_sl(&sl_phy->sl_frame_params, - &sl_phy->sl_config, - get_softmodem_params()->threequarter_fs, - get_nrUE_params()->ofdm_offset_divisor); - sl_ue_phy_init(UE[CC_id]); - } - init_openair0(UE[CC_id]); + process_msg_rcc_to_mac(NotifiedFifoData(elt), inst); + delNotifiedFIFO_elt(elt); + } while (true); + fapi_nr_config_request_t *nrUE_config = &UE[CC_id]->nrUE_config; + nr_init_frame_parms_ue(&UE[CC_id]->frame_parms, nrUE_config, mac->nr_band); } - } - lock_memory_to_ram(); + UE[CC_id]->sl_mode = get_softmodem_params()->sl_mode; + init_actor(&UE[CC_id]->sync_actor, "SYNC_", -1); + if (get_nrUE_params()->num_dl_actors > 0) { + UE[CC_id]->dl_actors = calloc_or_fail(get_nrUE_params()->num_dl_actors, sizeof(*UE[CC_id]->dl_actors)); + for (int i = 0; i < get_nrUE_params()->num_dl_actors; i++) { + init_actor(&UE[CC_id]->dl_actors[i], "DL_", -1); + } + } + if (get_nrUE_params()->num_ul_actors > 0) { + UE[CC_id]->ul_actors = calloc_or_fail(get_nrUE_params()->num_ul_actors, sizeof(*UE[CC_id]->ul_actors)); + for (int i = 0; i < get_nrUE_params()->num_ul_actors; i++) { + init_actor(&UE[CC_id]->ul_actors[i], "UL_", -1); + } + } + init_nr_ue_vars(UE[CC_id], inst); - if (IS_SOFTMODEM_DOSCOPE) { - load_softscope("nr", PHY_vars_UE_g[0][0]); + if (UE[CC_id]->sl_mode) { + AssertFatal(UE[CC_id]->sl_mode == 2, "Only Sidelink mode 2 supported. Mode 1 not yet supported\n"); + DevAssert(mac->if_module != NULL && mac->if_module->sl_phy_config_request != NULL); + nr_sl_phy_config_t *phycfg = &mac->SL_MAC_PARAMS->sl_phy_config; + phycfg->sl_config_req.sl_carrier_config.sl_num_rx_ant = get_nrUE_params()->nb_antennas_rx; + phycfg->sl_config_req.sl_carrier_config.sl_num_tx_ant = get_nrUE_params()->nb_antennas_tx; + mac->if_module->sl_phy_config_request(phycfg); + sl_nr_ue_phy_params_t *sl_phy = &UE[CC_id]->SL_UE_PHY_PARAMS; + nr_init_frame_parms_ue_sl(&sl_phy->sl_frame_params, + &sl_phy->sl_config, + get_softmodem_params()->threequarter_fs, + get_nrUE_params()->ofdm_offset_divisor); + sl_ue_phy_init(UE[CC_id]); + } + init_openair0(UE[CC_id]); } - if (IS_SOFTMODEM_IMSCOPE_ENABLED) { - load_softscope("im", PHY_vars_UE_g[0][0]); - } - AssertFatal(!(IS_SOFTMODEM_IMSCOPE_ENABLED && IS_SOFTMODEM_IMSCOPE_RECORD_ENABLED), - "Data recoding and ImScope cannot be enabled at the same time\n"); - if (IS_SOFTMODEM_IMSCOPE_RECORD_ENABLED) { - load_module_shlib("imscope_record", NULL, 0, PHY_vars_UE_g[0][0]); - } - - for (int inst = 0; inst < NB_UE_INST; inst++) { - LOG_I(PHY,"Intializing UE Threads for instance %d ...\n", inst); - init_NR_UE_threads(PHY_vars_UE_g[inst][0]); - } - printf("UE threads created by %ld\n", gettid()); } + lock_memory_to_ram(); + + if (IS_SOFTMODEM_DOSCOPE) { + load_softscope("nr", PHY_vars_UE_g[0][0]); + } + if (IS_SOFTMODEM_IMSCOPE_ENABLED) { + load_softscope("im", PHY_vars_UE_g[0][0]); + } + AssertFatal(!(IS_SOFTMODEM_IMSCOPE_ENABLED && IS_SOFTMODEM_IMSCOPE_RECORD_ENABLED), + "Data recoding and ImScope cannot be enabled at the same time\n"); + if (IS_SOFTMODEM_IMSCOPE_RECORD_ENABLED) { + load_module_shlib("imscope_record", NULL, 0, PHY_vars_UE_g[0][0]); + } + + for (int inst = 0; inst < NB_UE_INST; inst++) { + LOG_I(PHY,"Intializing UE Threads for instance %d ...\n", inst); + init_NR_UE_threads(PHY_vars_UE_g[inst][0]); + } + printf("UE threads created by %ld\n", gettid()); + // wait for end of program printf("TYPE TO TERMINATE\n"); diff --git a/executables/nr-uesoftmodem.h b/executables/nr-uesoftmodem.h index 3ceb3e479e..df13e2e02e 100644 --- a/executables/nr-uesoftmodem.h +++ b/executables/nr-uesoftmodem.h @@ -137,8 +137,6 @@ extern int setup_nr_ue_buffers(PHY_VARS_NR_UE **phy_vars_ue, openair0_config_t * extern void fill_ue_band_info(void); extern void init_NR_UE(int, char *, char *, char *); extern void init_NR_UE_threads(PHY_VARS_NR_UE *ue); -void start_oai_nrue_threads(void); void *UE_thread(void *arg); void init_nr_ue_vars(PHY_VARS_NR_UE *ue, uint8_t UE_id); -void init_nrUE_standalone_thread(int ue_idx); #endif diff --git a/executables/softmodem-common.h b/executables/softmodem-common.h index d122b1a1d5..4dfa5eb680 100644 --- a/executables/softmodem-common.h +++ b/executables/softmodem-common.h @@ -105,7 +105,6 @@ extern "C" #define CONFIG_HLP_DISABLNBIOT "disable nb-iot, even if defined in config\n" #define CONFIG_HLP_USRP_THREAD "having extra thead for usrp tx\n" #define CONFIG_HLP_NFAPI "Change the nFAPI mode for NR 'MONOLITHIC', 'PNF', 'VNF', 'AERIAL','UE_STUB_PNF','UE_STUB_OFFNET','STANDALONE_PNF'\n" -#define CONFIG_L1_EMULATOR "Run in L1 emulated mode (disable PHY layer)\n" #define CONFIG_HLP_CONTINUOUS_TX "perform continuous transmission, even in TDD mode (to work around USRP issues)\n" #define CONFIG_HLP_STATS_DISABLE "disable globally the stats generation and persistence" #define CONFIG_HLP_NOITTI "Do not start itti threads, call queue processing in place, inside the caller thread" @@ -137,7 +136,6 @@ extern "C" #define NSA softmodem_params.nsa #define NODE_NUMBER softmodem_params.node_number #define NON_STOP softmodem_params.non_stop -#define EMULATE_L1 softmodem_params.emulate_l1 #define CONTINUOUS_TX softmodem_params.continuous_tx #define SYNC_REF softmodem_params.sync_ref #define DEFAULT_PDU_ID softmodem_params.default_pdu_session_id @@ -174,7 +172,6 @@ extern int usrp_tx_thread; {"usrp-tx-thread-config", CONFIG_HLP_USRP_THREAD, 0, .iptr=&usrp_tx_thread, .defstrval=0, TYPE_INT, 0}, \ {"nfapi", CONFIG_HLP_NFAPI, 0, .strptr=NULL, .defstrval="MONOLITHIC", TYPE_STRING, 0}, \ {"non-stop", CONFIG_HLP_NONSTOP, PARAMFLAG_BOOL, .iptr=&NON_STOP, .defintval=0, TYPE_INT, 0}, \ - {"emulate-l1", CONFIG_L1_EMULATOR, PARAMFLAG_BOOL, .iptr=&EMULATE_L1, .defintval=0, TYPE_INT, 0}, \ {"continuous-tx", CONFIG_HLP_CONTINUOUS_TX, PARAMFLAG_BOOL, .iptr=&CONTINUOUS_TX, .defintval=0, TYPE_INT, 0}, \ {"disable-stats", CONFIG_HLP_STATS_DISABLE, PARAMFLAG_BOOL, .iptr=&stats_disabled, .defintval=0, TYPE_INT, 0}, \ {"no-itti-threads", CONFIG_HLP_NOITTI, PARAMFLAG_BOOL, .iptr=&softmodem_params.no_itti, .defintval=0, TYPE_INT, 0}, \ @@ -228,7 +225,6 @@ extern int usrp_tx_thread; { .s5 = { NULL } }, \ { .s5 = { NULL } }, \ { .s5 = { NULL } }, \ - { .s5 = { NULL } }, \ } // clang-format on @@ -331,7 +327,6 @@ typedef struct { int nsa; uint16_t node_number; int non_stop; - int emulate_l1; int continuous_tx; uint32_t sync_ref; int no_itti; diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c index 52d5033457..92da66fdd6 100644 --- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c +++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c @@ -31,7 +31,6 @@ */ #include - #include "fapi_nr_ue_interface.h" #include "fapi_nr_ue_l1.h" #include "harq_nr.h" @@ -39,247 +38,11 @@ #include "PHY/defs_nr_UE.h" #include "PHY/impl_defs_nr.h" #include "utils.h" -#include "openair2/PHY_INTERFACE/queue_t.h" #include "SCHED_NR_UE/phy_sch_processing_time.h" #include "openair1/PHY/phy_extern_nr_ue.h" const char *const dl_pdu_type[] = {"DCI", "DLSCH", "RA_DLSCH", "SI_DLSCH", "P_DLSCH", "CSI_RS", "CSI_IM", "TA"}; const char *const ul_pdu_type[] = {"PRACH", "PUCCH", "PUSCH", "SRS"}; -queue_t nr_rx_ind_queue; -queue_t nr_crc_ind_queue; -queue_t nr_uci_ind_queue; -queue_t nr_rach_ind_queue; - -static void fill_uci_2_3_4(nfapi_nr_uci_pucch_pdu_format_2_3_4_t *pdu_2_3_4, - fapi_nr_ul_config_pucch_pdu *pucch_pdu) -{ - NR_UE_MAC_INST_t *mac = get_mac_inst(0); - memset(pdu_2_3_4, 0, sizeof(*pdu_2_3_4)); - pdu_2_3_4->handle = 0; - pdu_2_3_4->rnti = pucch_pdu->rnti; - pdu_2_3_4->pucch_format = 2; - pdu_2_3_4->ul_cqi = 255; - pdu_2_3_4->timing_advance = 0; - pdu_2_3_4->rssi = 0; - // TODO: Eventually check 38.212:Sect.631 to know when to use csi_part2, for now only using csi_part1 - pdu_2_3_4->pduBitmap = 4; - pdu_2_3_4->csi_part1.csi_part1_bit_len = mac->nr_ue_emul_l1.num_csi_reports; - int csi_part1_byte_len = (int)((pdu_2_3_4->csi_part1.csi_part1_bit_len / 8) + 1); - AssertFatal(!pdu_2_3_4->csi_part1.csi_part1_payload, "pdu_2_3_4->csi_part1.csi_part1_payload != NULL\n"); - pdu_2_3_4->csi_part1.csi_part1_payload = CALLOC(csi_part1_byte_len, - sizeof(pdu_2_3_4->csi_part1.csi_part1_payload)); - for (int k = 0; k < csi_part1_byte_len; k++) - { - pdu_2_3_4->csi_part1.csi_part1_payload[k] = (pucch_pdu->payload >> (k * 8)) & 0xff; - } - pdu_2_3_4->csi_part1.csi_part1_crc = 0; -} - -static void free_uci_inds(nfapi_nr_uci_indication_t *uci_ind) -{ - for (int k = 0; k < uci_ind->num_ucis; k++) - { - if (uci_ind->uci_list[k].pdu_type == NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE) - { - //nfapi_nr_uci_pucch_pdu_format_0_1_t *pdu_0_1 = &uci_ind->uci_list[k].pucch_pdu_format_0_1; - // Warning: pdu_0_1 is unused - } - if (uci_ind->uci_list[k].pdu_type == NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE) - { - nfapi_nr_uci_pucch_pdu_format_2_3_4_t *pdu_2_3_4 = &uci_ind->uci_list[k].pucch_pdu_format_2_3_4; - free(pdu_2_3_4->sr.sr_payload); - pdu_2_3_4->sr.sr_payload = NULL; - free(pdu_2_3_4->harq.harq_payload); - pdu_2_3_4->harq.harq_payload = NULL; - } - } - free(uci_ind->uci_list); - uci_ind->uci_list = NULL; - free(uci_ind); -} - -int8_t nr_ue_scheduled_response_stub(nr_scheduled_response_t *scheduled_response) { - - NR_UE_MAC_INST_t *mac = get_mac_inst(0); - - if (scheduled_response && scheduled_response->ul_config) { - int frame = scheduled_response->ul_config->frame; - int slot = scheduled_response->ul_config->slot; - fapi_nr_ul_config_request_pdu_t *it = fapiLockIterator(scheduled_response->ul_config, frame, slot); - while (it->pdu_type != FAPI_NR_END) { - switch (it->pdu_type) { - case FAPI_NR_UL_CONFIG_TYPE_PRACH: { - fapi_nr_ul_config_prach_pdu *prach_pdu = &it->prach_config_pdu; - nfapi_nr_rach_indication_t *rach_ind = CALLOC(1, sizeof(*rach_ind)); - rach_ind->sfn = frame; - rach_ind->slot = slot; - rach_ind->header.message_id = NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION; - uint8_t pdu_index = 0; - rach_ind->pdu_list = CALLOC(1, sizeof(*rach_ind->pdu_list)); - rach_ind->number_of_pdus = 1; - rach_ind->pdu_list[pdu_index].phy_cell_id = prach_pdu->phys_cell_id; - rach_ind->pdu_list[pdu_index].symbol_index = prach_pdu->prach_start_symbol; - rach_ind->pdu_list[pdu_index].slot_index = prach_pdu->prach_slot; - rach_ind->pdu_list[pdu_index].freq_index = prach_pdu->num_ra; - rach_ind->pdu_list[pdu_index].avg_rssi = 128; - rach_ind->pdu_list[pdu_index].avg_snr = 0xff; // invalid for now - const int num_p = rach_ind->pdu_list[pdu_index].num_preamble; - AssertFatal(num_p == 1, "can handle only one preamble in preamble_list\n"); - rach_ind->pdu_list[pdu_index].num_preamble = 1; - rach_ind->pdu_list[pdu_index].preamble_list[0].preamble_index = prach_pdu->ra_PreambleIndex; - rach_ind->pdu_list[pdu_index].preamble_list[0].timing_advance = 0; - rach_ind->pdu_list[pdu_index].preamble_list[0].preamble_pwr = 0xffffffff; - - if (!put_queue(&nr_rach_ind_queue, rach_ind)) { - free(rach_ind->pdu_list); - free(rach_ind); - } - LOG_D(NR_MAC, "We have successfully filled the rach_ind queue with the recently filled rach ind\n"); - break; - } - case (FAPI_NR_UL_CONFIG_TYPE_PUSCH): { - nfapi_nr_rx_data_indication_t *rx_ind = CALLOC(1, sizeof(*rx_ind)); - nfapi_nr_crc_indication_t *crc_ind = CALLOC(1, sizeof(*crc_ind)); - nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu = &it->pusch_config_pdu; - if (pusch_config_pdu->tx_request_body.fapiTxPdu) { - rx_ind->header.message_id = NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION; - rx_ind->sfn = frame; - rx_ind->slot = slot; - rx_ind->number_of_pdus = 1; - rx_ind->pdu_list = CALLOC(rx_ind->number_of_pdus, sizeof(*rx_ind->pdu_list)); - for (int j = 0; j < rx_ind->number_of_pdus; j++) { - fapi_nr_tx_request_body_t *tx_req_body = &pusch_config_pdu->tx_request_body; - rx_ind->pdu_list[j].handle = pusch_config_pdu->handle; - rx_ind->pdu_list[j].harq_id = pusch_config_pdu->pusch_data.harq_process_id; - rx_ind->pdu_list[j].pdu_length = tx_req_body->pdu_length; - rx_ind->pdu_list[j].pdu = CALLOC(tx_req_body->pdu_length, sizeof(*rx_ind->pdu_list[j].pdu)); - memcpy(rx_ind->pdu_list[j].pdu, tx_req_body->fapiTxPdu, tx_req_body->pdu_length * sizeof(*rx_ind->pdu_list[j].pdu)); - rx_ind->pdu_list[j].rnti = pusch_config_pdu->rnti; - /* TODO: Implement channel modeling to abstract TA and CQI. For now, - we hard code the values below since they are set in L1 and we are - abstracting L1. */ - rx_ind->pdu_list[j].timing_advance = 31; - rx_ind->pdu_list[j].ul_cqi = 255; - } - - crc_ind->header.message_id = NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION; - crc_ind->number_crcs = rx_ind->number_of_pdus; - crc_ind->sfn = frame; - crc_ind->slot = slot; - crc_ind->crc_list = CALLOC(crc_ind->number_crcs, sizeof(*crc_ind->crc_list)); - for (int j = 0; j < crc_ind->number_crcs; j++) { - crc_ind->crc_list[j].handle = pusch_config_pdu->handle; - crc_ind->crc_list[j].harq_id = pusch_config_pdu->pusch_data.harq_process_id; - LOG_D(NR_MAC, "This is the harq pid %d for crc_list[%d]\n", crc_ind->crc_list[j].harq_id, j); - LOG_D(NR_MAC, "This is sched sfn/sl [%d %d] and crc sfn/sl [%d %d]\n", frame, slot, crc_ind->sfn, crc_ind->slot); - crc_ind->crc_list[j].num_cb = pusch_config_pdu->pusch_data.num_cb; - crc_ind->crc_list[j].rnti = pusch_config_pdu->rnti; - crc_ind->crc_list[j].tb_crc_status = 0; - crc_ind->crc_list[j].timing_advance = 31; - crc_ind->crc_list[j].ul_cqi = 255; - emul_l1_harq_t *harq = &mac->nr_ue_emul_l1.harq[crc_ind->crc_list[j].harq_id]; - AssertFatal(harq->active_ul_harq_sfn == -1 && harq->active_ul_harq_slot == -1, - "We did not send an active CRC when we should have!\n"); - harq->active_ul_harq_sfn = crc_ind->sfn; - harq->active_ul_harq_slot = crc_ind->slot; - LOG_D(NR_MAC, - "This is sched sfn/sl [%d %d] and crc sfn/sl [%d %d] with mcs_index in ul_cqi -> %d\n", - frame, - slot, - crc_ind->sfn, - crc_ind->slot, - pusch_config_pdu->mcs_index); - } - - if (!put_queue(&nr_rx_ind_queue, rx_ind)) { - LOG_E(NR_MAC, "Put_queue failed for rx_ind\n"); - for (int i = 0; i < rx_ind->number_of_pdus; i++) { - free(rx_ind->pdu_list[i].pdu); - rx_ind->pdu_list[i].pdu = NULL; - } - - free(rx_ind->pdu_list); - rx_ind->pdu_list = NULL; - free(rx_ind); - rx_ind = NULL; - } - if (!put_queue(&nr_crc_ind_queue, crc_ind)) { - LOG_E(NR_MAC, "Put_queue failed for crc_ind\n"); - free(crc_ind->crc_list); - crc_ind->crc_list = NULL; - free(crc_ind); - crc_ind = NULL; - } - - LOG_D(PHY, "In %s: Filled queue rx/crc_ind which was filled by ulconfig. \n", __FUNCTION__); - } - break; - } - case FAPI_NR_UL_CONFIG_TYPE_PUCCH: { - nfapi_nr_uci_indication_t *uci_ind = CALLOC(1, sizeof(*uci_ind)); - uci_ind->header.message_id = NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION; - uci_ind->sfn = frame; - uci_ind->slot = slot; - uci_ind->num_ucis = 1; - uci_ind->uci_list = CALLOC(uci_ind->num_ucis, sizeof(*uci_ind->uci_list)); - for (int j = 0; j < uci_ind->num_ucis; j++) { - LOG_D(NR_MAC, "pucch_config_pdu.n_bit = %d\n", it->pucch_config_pdu.n_bit); - if (it->pucch_config_pdu.n_bit > 3 && mac->nr_ue_emul_l1.num_csi_reports > 0) { - uci_ind->uci_list[j].pdu_type = NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE; - uci_ind->uci_list[j].pdu_size = sizeof(nfapi_nr_uci_pucch_pdu_format_2_3_4_t); - nfapi_nr_uci_pucch_pdu_format_2_3_4_t *pdu_2_3_4 = &uci_ind->uci_list[j].pucch_pdu_format_2_3_4; - fill_uci_2_3_4(pdu_2_3_4, &it->pucch_config_pdu); - } else { - nfapi_nr_uci_pucch_pdu_format_0_1_t *pdu_0_1 = &uci_ind->uci_list[j].pucch_pdu_format_0_1; - uci_ind->uci_list[j].pdu_type = NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE; - uci_ind->uci_list[j].pdu_size = sizeof(nfapi_nr_uci_pucch_pdu_format_0_1_t); - memset(pdu_0_1, 0, sizeof(*pdu_0_1)); - pdu_0_1->handle = 0; - pdu_0_1->rnti = it->pucch_config_pdu.rnti; - pdu_0_1->pucch_format = 1; - pdu_0_1->ul_cqi = 255; - pdu_0_1->timing_advance = 0; - pdu_0_1->rssi = 0; - if (mac->nr_ue_emul_l1.num_harqs > 0) { - int harq_index = 0; - pdu_0_1->pduBitmap = 2; // (value->pduBitmap >> 1) & 0x01) == HARQ and (value->pduBitmap) & 0x01) == SR - pdu_0_1->harq.num_harq = mac->nr_ue_emul_l1.num_harqs; - pdu_0_1->harq.harq_confidence_level = 0; - int harq_pid = -1; - for (int k = 0; k < NR_MAX_HARQ_PROCESSES; k++) { - if (mac->nr_ue_emul_l1.harq[k].active && mac->nr_ue_emul_l1.harq[k].active_dl_harq_sfn == uci_ind->sfn - && mac->nr_ue_emul_l1.harq[k].active_dl_harq_slot == uci_ind->slot) { - mac->nr_ue_emul_l1.harq[k].active = false; - harq_pid = k; - AssertFatal(harq_index < pdu_0_1->harq.num_harq, "Invalid harq_index %d\n", harq_index); - pdu_0_1->harq.harq_list[harq_index].harq_value = !mac->dl_harq_info[k].ack; - harq_index++; - } - } - AssertFatal(harq_pid != -1, "No active harq_pid, sfn_slot = %u.%u", uci_ind->sfn, uci_ind->slot); - } - } - } - - LOG_D(NR_PHY, "Sending UCI with %d PDUs in sfn.slot %d/%d\n", uci_ind->num_ucis, uci_ind->sfn, uci_ind->slot); - NR_UL_IND_t ul_info = { - .uci_ind = *uci_ind, - }; - send_nsa_standalone_msg(&ul_info, uci_ind->header.message_id); - free_uci_inds(uci_ind); - break; - } - - default: - LOG_W(NR_MAC, "Unknown ul_config->pdu_type %d\n", it->pdu_type); - break; - } - it++; - } - release_ul_config(it, true); - } - return 0; -} static void configure_dlsch(NR_UE_DLSCH_t *dlsch0, NR_DL_UE_HARQ_t *harq_list, diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h index 68182ab9ec..6e73a0f855 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h @@ -320,35 +320,6 @@ typedef struct { uint8_t nbits; } dci_field_t; -typedef struct { - /* The active harq sfn/slot field was created to save the - scheduled SFN/Slot transmission for the ACK/NAK. If we - do not save it, then we have to calculate it again as the - NRUE MAC layer already does in get_downlink_ack(). */ - int active_dl_harq_sfn; - int active_dl_harq_slot; - int active_ul_harq_sfn; - int active_ul_harq_slot; - bool active; -} emul_l1_harq_t; - -typedef struct { - bool expected_sib; - bool index_has_sib[NR_MAX_HARQ_PROCESSES]; - bool expected_rar; - bool index_has_rar[NR_MAX_HARQ_PROCESSES]; - bool expected_dci; - bool index_has_dci[NR_MAX_HARQ_PROCESSES]; - emul_l1_harq_t harq[NR_MAX_HARQ_PROCESSES]; - int active_uci_sfn_slot; - int num_srs; - int num_harqs; - int num_csi_reports; - uint8_t pmi; - uint8_t ri; - uint8_t cqi; -} nr_emulated_l1_t; - typedef struct { uint8_t format_indicator; //1 bit diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c index bb37c3d582..f592423c5a 100644 --- a/openair2/LAYER2/NR_MAC_UE/config_ue.c +++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c @@ -1942,8 +1942,7 @@ void nr_rrc_mac_config_req_sib1(module_id_t module_id, int cc_idP, NR_SIB1_t *si if (mac->state == UE_RECEIVING_SIB && can_start_ra) mac->state = UE_PERFORMING_RA; - if (!get_softmodem_params()->emulate_l1) - mac->if_module->phy_config_request(&mac->phy_config); + mac->if_module->phy_config_request(&mac->phy_config); ret = pthread_mutex_unlock(&mac->if_mutex); AssertFatal(!ret, "mutex failed %d\n", ret); } @@ -2002,13 +2001,11 @@ static void handle_reconfiguration_with_sync(NR_UE_MAC_INST_t *mac, ra->ra_state = nrRA_UE_IDLE; nr_ue_mac_default_configs(mac); - if (!get_softmodem_params()->emulate_l1) { - mac->synch_request.Mod_id = mac->ue_id; - mac->synch_request.CC_id = cc_idP; - mac->synch_request.synch_req.target_Nid_cell = mac->physCellId; - mac->if_module->synch_request(&mac->synch_request); - mac->if_module->phy_config_request(&mac->phy_config); - } + mac->synch_request.Mod_id = mac->ue_id; + mac->synch_request.CC_id = cc_idP; + mac->synch_request.synch_req.target_Nid_cell = mac->physCellId; + mac->if_module->synch_request(&mac->synch_request); + mac->if_module->phy_config_request(&mac->phy_config); } static void configure_physicalcellgroup(NR_UE_MAC_INST_t *mac, diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h index 3e41ec0980..b7ebd5a651 100644 --- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h +++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h @@ -646,8 +646,6 @@ typedef struct NR_UE_MAC_INST_s { NR_TimeAlignmentTimer_t timeAlignmentTimerCommon; NR_timer_t time_alignment_timer; - nr_emulated_l1_t nr_ue_emul_l1; - pthread_mutex_t mutex_dl_info; //SIDELINK MAC PARAMETERS diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c index 3f3df90cde..c6385e765c 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c @@ -1253,7 +1253,6 @@ void prepare_msg4_msgb_feedback(NR_UE_MAC_INST_t *mac, int pid, int ack_nack) NR_UE_DL_HARQ_STATUS_t *current_harq = &mac->dl_harq_info[pid]; int sched_slot = current_harq->ul_slot; int sched_frame = current_harq->ul_frame; - mac->nr_ue_emul_l1.num_harqs = 1; PUCCH_sched_t pucch = {.n_CCE = current_harq->n_CCE, .N_CCE = current_harq->N_CCE, .ack_payload = ack_nack, diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index f2f783869c..0b1d7dfaa9 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -2420,11 +2420,6 @@ bool get_downlink_ack(NR_UE_MAC_INST_t *mac, frame_t frame, int slot, PUCCH_sche dl_harq_pid, current_harq->ul_frame, current_harq->ul_slot); /* check if current tx slot should transmit downlink acknowlegment */ if (current_harq->ul_frame == frame && current_harq->ul_slot == slot) { - if (get_softmodem_params()->emulate_l1) { - mac->nr_ue_emul_l1.harq[dl_harq_pid].active = true; - mac->nr_ue_emul_l1.harq[dl_harq_pid].active_dl_harq_sfn = frame; - mac->nr_ue_emul_l1.harq[dl_harq_pid].active_dl_harq_slot = slot; - } if (res_ind != -1 && res_ind != current_harq->pucch_resource_indicator) LOG_E(NR_MAC, "Value of pucch_resource_indicator %d not matching with what set before %d (Possibly due to a false DCI) \n", @@ -3037,18 +3032,6 @@ static csi_payload_t get_csirs_RI_PMI_CQI_payload(NR_UE_MAC_INST_t *mac, int pmi_x1_bitlen = csi_report->csi_meas_bitlen.pmi_x1_bitlen[mac->l1_measurements.rank_indicator]; int pmi_x2_bitlen = csi_report->csi_meas_bitlen.pmi_x2_bitlen[mac->l1_measurements.rank_indicator]; int cqi_bitlen = csi_report->csi_meas_bitlen.cqi_bitlen[mac->l1_measurements.rank_indicator]; - - if (get_softmodem_params()->emulate_l1) { - static const uint8_t mcs_to_cqi[] = {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, - 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15}; - CHECK_INDEX(nr_bler_data, NR_NUM_MCS - 1); - int mcs = get_mcs_from_sinr(nr_bler_data, (mac->nr_ue_emul_l1.cqi - 640) * 0.1); - CHECK_INDEX(mcs_to_cqi, mcs); - mac->l1_measurements.rank_indicator = mac->nr_ue_emul_l1.ri; - mac->l1_measurements.i1 = mac->nr_ue_emul_l1.pmi; - mac->l1_measurements.cqi = mcs_to_cqi[mcs]; - } - int padding_bitlen = 0; // TODO: Improvements will be needed to cri_bitlen>0 and pmi_x1_bitlen>0 if (mapping_type == ON_PUSCH) { @@ -4291,21 +4274,6 @@ static void nr_ue_process_rar(NR_UE_MAC_INST_t *mac, nr_downlink_indication_t *d handle_rar_reception(mac, rar, frame, slot); if (ra->cfra) nr_ra_succeeded(mac, dl_info->gNB_index, frame, slot); - if (get_softmodem_params()->emulate_l1) { - /* When we are emulating L1 with multiple UEs, the rx_indication will have - multiple RAR PDUs. The code would previously handle each of these PDUs, - but it should only be handling the single RAR that matches the current - UE. */ - LOG_I(NR_MAC, "RAR PDU found for our UE with PDU index %d\n", pdu_id); - dl_info->rx_ind->number_pdus = 1; - if (pdu_id != 0) { - memcpy(&dl_info->rx_ind->rx_indication_body[0], - &dl_info->rx_ind->rx_indication_body[pdu_id], - sizeof(fapi_nr_rx_indication_body_t)); - } - mac->nr_ue_emul_l1.expected_rar = false; - memset(mac->nr_ue_emul_l1.index_has_rar, 0, sizeof(mac->nr_ue_emul_l1.index_has_rar)); - } break; } if (rarh->E == 0) { diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c index 16af9b4883..03bd8b6fd4 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c @@ -1718,10 +1718,6 @@ static bool schedule_uci_on_pusch(NR_UE_MAC_INST_t *mac, static void nr_ue_pucch_scheduler(NR_UE_MAC_INST_t *mac, frame_t frame, int slot) { PUCCH_sched_t pucch[3] = {0}; // TODO the size might change in the future in case of multiple SR or multiple CSI in a slot - - mac->nr_ue_emul_l1.num_srs = 0; - mac->nr_ue_emul_l1.num_harqs = 0; - mac->nr_ue_emul_l1.num_csi_reports = 0; int num_res = 0; if (mac->ra.ra_pucch) { @@ -1771,9 +1767,6 @@ static void nr_ue_pucch_scheduler(NR_UE_MAC_INST_t *mac, frame_t frame, int slot pucch[j].n_harq, pucch[j].n_sr, pucch[j].n_csi); - mac->nr_ue_emul_l1.num_srs = pucch[j].n_sr; - mac->nr_ue_emul_l1.num_harqs = pucch[j].n_harq; - mac->nr_ue_emul_l1.num_csi_reports = pucch[j].n_csi; // checking if we need to schedule pucch[j] on PUSCH if (schedule_uci_on_pusch(mac, frame, slot, &pucch[j], mac->current_UL_BWP)) @@ -1784,9 +1777,6 @@ static void nr_ue_pucch_scheduler(NR_UE_MAC_INST_t *mac, frame_t frame, int slot LOG_E(NR_MAC, "Error in pucch allocation\n"); return; } - DevAssert(mac->current_DL_BWP != NULL); - int mu = mac->current_DL_BWP->scs; - mac->nr_ue_emul_l1.active_uci_sfn_slot = NFAPI_SFNSLOT2DEC(mu, frame, slot); int ret = nr_ue_configure_pucch(mac, slot, frame, diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c index f93044f9cd..e0afa1ee35 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c @@ -1262,7 +1262,7 @@ pdcp_run ( // IP/NAS -> PDCP traffic : TX, read the pkt from the upper layer buffer // if (LINK_ENB_PDCP_TO_GTPV1U && ctxt_pP->enb_flag == ENB_FLAG_NO) { - if (!get_softmodem_params()->emulate_l1 && (IS_SOFTMODEM_NOS1 || ctxt_pP->enb_flag == ENB_FLAG_NO)) { + if (IS_SOFTMODEM_NOS1 || ctxt_pP->enb_flag == ENB_FLAG_NO) { pdcp_fifo_read_input_sdus(ctxt_pP); } @@ -1272,9 +1272,7 @@ pdcp_run ( } else { start_meas(&UE_pdcp_stats[ctxt_pP->module_id].pdcp_ip); } - if (!get_softmodem_params()->emulate_l1) { - pdcp_fifo_flush_sdus(ctxt_pP); - } + pdcp_fifo_flush_sdus(ctxt_pP); if (ctxt_pP->enb_flag) { stop_meas(&eNB_pdcp_stats[ctxt_pP->module_id].pdcp_ip); diff --git a/openair2/NR_PHY_INTERFACE/NR_IF_Module.h b/openair2/NR_PHY_INTERFACE/NR_IF_Module.h index ce6acffc2c..52a0f28871 100644 --- a/openair2/NR_PHY_INTERFACE/NR_IF_Module.h +++ b/openair2/NR_PHY_INTERFACE/NR_IF_Module.h @@ -138,8 +138,6 @@ void NR_IF_Module_kill(int Mod_id); void NR_UL_indication(NR_UL_IND_t *UL_INFO); -void RCconfig_nr_ue_macrlc(void); - /*Interface for Downlink, transmitting the DLSCH SDU, DCI SDU*/ void NR_Schedule_Response(NR_Sched_Rsp_t *Sched_INFO); diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c index 1f86c61be5..23cd60b25f 100644 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c @@ -30,41 +30,16 @@ * \warning */ -#include -#include -#include - #include "PHY/defs_nr_UE.h" #include "NR_IF_Module.h" #include "NR_MAC_UE/mac_proto.h" #include "assertions.h" #include "SCHED_NR_UE/fapi_nr_ue_l1.h" -#include "executables/softmodem-common.h" #include "openair2/RRC/NR_UE/L2_interface_ue.h" -#include "openair2/GNB_APP/L1_nr_paramdef.h" -#include "openair2/GNB_APP/gnb_paramdef.h" -#include "radio/ETHERNET/if_defs.h" -#include -#include "openair2/GNB_APP/MACRLC_nr_paramdef.h" #define MAX_IF_MODULES 100 -UL_IND_t *UL_INFO = NULL; - -static eth_params_t stub_eth_params; static nr_ue_if_module_t *nr_ue_if_module_inst[MAX_IF_MODULES]; -static int ue_tx_sock_descriptor = -1; -static int ue_rx_sock_descriptor = -1; -static int g_harq_pid; -sem_t sfn_slot_semaphore; - -queue_t nr_sfn_slot_queue; -queue_t nr_chan_param_queue; -queue_t nr_dl_tti_req_queue; -queue_t nr_tx_req_queue; -queue_t nr_ul_dci_req_queue; -queue_t nr_ul_tti_req_queue; -static void save_pdsch_pdu_for_crnti(nfapi_nr_dl_tti_request_t *dl_tti_request); void print_ue_mac_stats(const module_id_t mod, const int frame_rx, const int slot_rx) { @@ -126,956 +101,6 @@ void print_ue_mac_stats(const module_id_t mod, const int frame_rx, const int slo AssertFatal(!ret, "mutex failed %d\n", ret); } -void nrue_init_standalone_socket(int tx_port, int rx_port) -{ - { - struct sockaddr_in server_address; - int addr_len = sizeof(server_address); - memset(&server_address, 0, addr_len); - server_address.sin_family = AF_INET; - server_address.sin_port = htons(tx_port); - - int sd = socket(server_address.sin_family, SOCK_DGRAM, 0); - if (sd < 0) - { - LOG_E(NR_MAC, "Socket creation error standalone PNF\n"); - return; - } - - if (inet_pton(server_address.sin_family, stub_eth_params.remote_addr, &server_address.sin_addr) <= 0) - { - LOG_E(NR_MAC, "Invalid standalone PNF Address\n"); - close(sd); - return; - } - - // Using connect to use send() instead of sendto() - if (connect(sd, (struct sockaddr *)&server_address, addr_len) < 0) - { - LOG_E(NR_MAC, "Connection to standalone PNF failed: %s\n", strerror(errno)); - close(sd); - return; - } - assert(ue_tx_sock_descriptor == -1); - ue_tx_sock_descriptor = sd; - LOG_T(NR_RRC, "Successfully set up tx_socket in %s.\n", __FUNCTION__); - } - - { - struct sockaddr_in server_address; - int addr_len = sizeof(server_address); - memset(&server_address, 0, addr_len); - server_address.sin_family = AF_INET; - server_address.sin_addr.s_addr = INADDR_ANY; - server_address.sin_port = htons(rx_port); - - int sd = socket(server_address.sin_family, SOCK_DGRAM, 0); - if (sd < 0) - { - LOG_E(MAC, "Socket creation error standalone PNF\n"); - return; - } - - if (bind(sd, (struct sockaddr *)&server_address, addr_len) < 0) - { - LOG_E(NR_MAC, "Connection to standalone PNF failed: %s\n", strerror(errno)); - close(sd); - return; - } - assert(ue_rx_sock_descriptor == -1); - ue_rx_sock_descriptor = sd; - LOG_T(NR_RRC, "Successfully set up rx_socket in %s.\n", __FUNCTION__); - } - LOG_D(NR_RRC, "NRUE standalone socket info: tx_port %d rx_port %d on %s.\n", - tx_port, rx_port, stub_eth_params.remote_addr); -} - -void send_nsa_standalone_msg(NR_UL_IND_t *UL_INFO, uint16_t msg_id) -{ - switch(msg_id) - { - case NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION: - { - char buffer[NFAPI_MAX_PACKED_MESSAGE_SIZE]; - LOG_T(NR_MAC, "RACH header id :%d\n", UL_INFO->rach_ind.header.message_id); - int encoded_size = nfapi_nr_p7_message_pack(&UL_INFO->rach_ind, buffer, sizeof(buffer), NULL); - if (encoded_size <= 0) - { - LOG_E(NR_MAC, "nfapi_nr_p7_message_pack has failed. Encoded size = %d\n", encoded_size); - return; - } - - LOG_D(NR_MAC, "NR_RACH_IND sent to Proxy, Size: %d Frame %d Slot %d Num PDUS %d\n", encoded_size, - UL_INFO->rach_ind.sfn, UL_INFO->rach_ind.slot, UL_INFO->rach_ind.number_of_pdus); - if (send(ue_tx_sock_descriptor, buffer, encoded_size, 0) < 0) - { - LOG_E(NR_MAC, "Send Proxy NR_UE failed\n"); - return; - } - break; - } - case NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION: - { - char buffer[NFAPI_MAX_PACKED_MESSAGE_SIZE]; - LOG_T(NR_MAC, "RX header id :%d\n", UL_INFO->rx_ind.header.message_id); - int encoded_size = nfapi_nr_p7_message_pack(&UL_INFO->rx_ind, buffer, sizeof(buffer), NULL); - if (encoded_size <= 0) - { - LOG_E(NR_MAC, "nfapi_nr_p7_message_pack has failed. Encoded size = %d\n", encoded_size); - return; - } - - LOG_D(NR_MAC, "NR_RX_IND sent to Proxy, Size: %d Frame %d Slot %d Num PDUS %d\n", encoded_size, - UL_INFO->rx_ind.sfn, UL_INFO->rx_ind.slot, UL_INFO->rx_ind.number_of_pdus); - if (send(ue_tx_sock_descriptor, buffer, encoded_size, 0) < 0) - { - LOG_E(NR_MAC, "Send Proxy NR_UE failed\n"); - return; - } - break; - } - case NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION: - { - char buffer[NFAPI_MAX_PACKED_MESSAGE_SIZE]; - LOG_T(NR_MAC, "CRC header id :%d\n", UL_INFO->crc_ind.header.message_id); - int encoded_size = nfapi_nr_p7_message_pack(&UL_INFO->crc_ind, buffer, sizeof(buffer), NULL); - if (encoded_size <= 0) - { - LOG_E(NR_MAC, "nfapi_nr_p7_message_pack has failed. Encoded size = %d\n", encoded_size); - return; - } - - LOG_D(NR_MAC, "NR_CRC_IND sent to Proxy, Size: %d Frame %d Slot %d Num PDUS %d\n", encoded_size, - UL_INFO->crc_ind.sfn, UL_INFO->crc_ind.slot, UL_INFO->crc_ind.number_crcs); - if (send(ue_tx_sock_descriptor, buffer, encoded_size, 0) < 0) - { - LOG_E(NR_MAC, "Send Proxy NR_UE failed\n"); - return; - } - break; - } - case NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION: - { - char buffer[NFAPI_MAX_PACKED_MESSAGE_SIZE]; - LOG_D(NR_MAC, "UCI header id :%d\n", UL_INFO->uci_ind.header.message_id); - int encoded_size = nfapi_nr_p7_message_pack(&UL_INFO->uci_ind, buffer, sizeof(buffer), NULL); - if (encoded_size <= 0) - { - LOG_E(NR_MAC, "nfapi_nr_p7_message_pack has failed. Encoded size = %d\n", encoded_size); - return; - } - - LOG_D(NR_MAC, "NR_UCI_IND sent to Proxy, Size: %d Frame %d Slot %d Num PDUS %d\n", encoded_size, - UL_INFO->uci_ind.sfn, UL_INFO->uci_ind.slot, UL_INFO->uci_ind.num_ucis); - if (send(ue_tx_sock_descriptor, buffer, encoded_size, 0) < 0) - { - LOG_E(NR_MAC, "Send Proxy NR_UE failed\n"); - return; - } - break; - } - case NFAPI_NR_PHY_MSG_TYPE_SRS_INDICATION: - break; - default: - break; - } -} - -bool sfn_slot_matcher(void *sfn_slot_s, void *candidate) -{ - nfapi_p7_message_header_t *msg = candidate; - const struct sfn_slot_s *sfn_sf = (const struct sfn_slot_s *)sfn_slot_s; - - switch (msg->message_id) - { - case NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION: - { - nfapi_nr_rach_indication_t *ind = candidate; - return sfn_sf->sfn == ind->sfn && sfn_sf->slot == ind->slot; - } - - case NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION: - { - nfapi_nr_rx_data_indication_t *ind = candidate; - return sfn_sf->sfn == ind->sfn && sfn_sf->slot == ind->slot; - } - - case NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION: - { - nfapi_nr_crc_indication_t *ind = candidate; - return sfn_sf->sfn == ind->sfn && sfn_sf->slot == ind->slot; - } - - case NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION: - { - nfapi_nr_uci_indication_t *ind = candidate; - return sfn_sf->sfn == ind->sfn && sfn_sf->slot == ind->slot; - } - - case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST: - { - nfapi_nr_dl_tti_request_t *ind = candidate; - return sfn_sf->sfn == ind->SFN && sfn_sf->slot == ind->Slot; - } - - case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST: - { - nfapi_nr_tx_data_request_t *ind = candidate; - return sfn_sf->sfn == ind->SFN && sfn_sf->slot == ind->Slot; - } - - case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST: - { - nfapi_nr_ul_dci_request_t *ind = candidate; - return sfn_sf->sfn == ind->SFN && sfn_sf->slot == ind->Slot; - } - - case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST: - { - nfapi_nr_ul_tti_request_t *ind = candidate; - return sfn_sf->sfn == ind->SFN && sfn_sf->slot == ind->Slot; - } - - default: - LOG_E(NR_MAC, "sfn_slot_match bad ID: %d\n", msg->message_id); - - } - - return false; -} - -static void fill_dl_info_with_pdcch(fapi_nr_dci_indication_t *dci, nfapi_nr_dl_dci_pdu_t *rx_dci, int idx) -{ - int num_bytes = (rx_dci->PayloadSizeBits + 7) / 8; - LOG_D(NR_PHY, "[%d, %d] PDCCH DCI (Payload) for rnti %x with PayloadSizeBits %d, num_bytes %d\n", - dci->SFN, dci->slot, rx_dci->RNTI, rx_dci->PayloadSizeBits, num_bytes); - for (int k = 0; k < num_bytes; k++) - { - LOG_D(NR_MAC, "PDCCH DCI PDU payload[%d] = %d\n", k, rx_dci->Payload[k]); - dci->dci_list[idx].payloadBits[k] = rx_dci->Payload[k]; - } - dci->dci_list[idx].payloadSize = rx_dci->PayloadSizeBits; - dci->dci_list[idx].rnti = rx_dci->RNTI; - dci->dci_list[idx].n_CCE = rx_dci->CceIndex; - dci->dci_list[idx].N_CCE = rx_dci->AggregationLevel; - dci->number_of_dcis = idx + 1; -} - -static void fill_mib_in_rx_ind(nfapi_nr_dl_tti_request_pdu_t *pdu_list, fapi_nr_rx_indication_t *rx_ind, int pdu_idx, int pdu_type) -{ - AssertFatal(pdu_idx < sizeof(rx_ind->rx_indication_body) / sizeof(rx_ind->rx_indication_body[0]), - "pdu_index (%d) is greater than rx_indication_body size!\n", pdu_idx); - AssertFatal(pdu_idx == rx_ind->number_pdus, "Invalid pdu_idx %d!\n", pdu_idx); - - LOG_T(NR_MAC, "Recevied an SSB and are filling rx_ind with the MIB!\n"); - - nfapi_nr_dl_tti_ssb_pdu_rel15_t *ssb_pdu = &pdu_list->ssb_pdu.ssb_pdu_rel15; - rx_ind->rx_indication_body[pdu_idx].ssb_pdu.cell_id = ssb_pdu->PhysCellId; - rx_ind->rx_indication_body[pdu_idx].ssb_pdu.pdu[0] = (ssb_pdu->bchPayload) & 0xff; - rx_ind->rx_indication_body[pdu_idx].ssb_pdu.pdu[1] = (ssb_pdu->bchPayload >> 8) & 0xff; - rx_ind->rx_indication_body[pdu_idx].ssb_pdu.pdu[2] = (ssb_pdu->bchPayload >> 16) & 0xff; - rx_ind->rx_indication_body[pdu_idx].ssb_pdu.ssb_index = ssb_pdu->SsbBlockIndex; - rx_ind->rx_indication_body[pdu_idx].ssb_pdu.ssb_length = pdu_list->PDUSize; - rx_ind->rx_indication_body[pdu_idx].ssb_pdu.ssb_start_subcarrier = ssb_pdu->SsbSubcarrierOffset; - rx_ind->rx_indication_body[pdu_idx].ssb_pdu.decoded_pdu = true; - rx_ind->rx_indication_body[pdu_idx].pdu_type = pdu_type; - rx_ind->number_pdus = pdu_idx + 1; -} - -static bool is_my_dci(NR_UE_MAC_INST_t *mac, nfapi_nr_dl_dci_pdu_t *received_pdu) -{ - /* For multiple UEs, we need to be able to filter the rx'd messages by - the RNTI. The filtering is different between NSA mode and SA mode. - NSA mode has a two step CFRA procedure and SA has a 4 step procedure. - We only need to check if the rx'd RNTI doesnt match the CRNTI if the RAR - has been processed already, in NSA mode. - In SA, depending on the RA state, we can have a SIB (0xffff), RAR (0x10b), - Msg3 (TC_RNTI) or an actual DCI message (CRNTI). When we get Msg3, the - MAC instance of the UE still has a CRNTI = 0. We should only check if the - CRNTI doesnt match the received RNTI in SA mode if Msg3 has been processed - already. Only once the RA procedure succeeds is the CRNTI value updated - to the TC_RNTI. */ - if (get_softmodem_params()->nsa) { - if (received_pdu->RNTI != mac->crnti && (received_pdu->RNTI != mac->ra.ra_rnti)) - return false; - } - if (IS_SA_MODE(get_softmodem_params())) { - if (mac->state == UE_NOT_SYNC) - return false; - if (received_pdu->RNTI == 0xFFFF) - return false; - if (received_pdu->RNTI != mac->crnti && mac->ra.ra_state == nrRA_SUCCEEDED) - return false; - if (received_pdu->RNTI != mac->ra.t_crnti && mac->ra.ra_state == nrRA_WAIT_CONTENTION_RESOLUTION) - return false; - if (received_pdu->RNTI != 0x10b && mac->ra.ra_state == nrRA_WAIT_RAR) - return false; - if (received_pdu->RNTI != 0xFFFF && mac->ra.ra_state <= nrRA_GENERATE_PREAMBLE) - return false; - } - return true; -} - -static void copy_dl_tti_req_to_dl_info(nr_downlink_indication_t *dl_info, nfapi_nr_dl_tti_request_t *dl_tti_request) -{ - NR_UE_MAC_INST_t *mac = get_mac_inst(dl_info->module_id); - mac->nr_ue_emul_l1.expected_sib = false; - memset(mac->nr_ue_emul_l1.index_has_sib, 0, sizeof(mac->nr_ue_emul_l1.index_has_sib)); - mac->nr_ue_emul_l1.expected_rar = false; - memset(mac->nr_ue_emul_l1.index_has_rar, 0, sizeof(mac->nr_ue_emul_l1.index_has_rar)); - mac->nr_ue_emul_l1.expected_dci = false; - memset(mac->nr_ue_emul_l1.index_has_dci, 0, sizeof(mac->nr_ue_emul_l1.index_has_dci)); - int pdu_idx = 0; - - int num_pdus = dl_tti_request->dl_tti_request_body.nPDUs; - AssertFatal(num_pdus >= 0, "Invalid dl_tti_request number of PDUS\n"); - - for (int i = 0; i < num_pdus; i++) - { - nfapi_nr_dl_tti_request_pdu_t *pdu_list = &dl_tti_request->dl_tti_request_body.dl_tti_pdu_list[i]; - if (pdu_list->PDUType == NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE) - { - LOG_D(NR_PHY, "[%d, %d] PDSCH PDU for rnti %x\n", - dl_tti_request->SFN, dl_tti_request->Slot, pdu_list->pdsch_pdu.pdsch_pdu_rel15.rnti); - } - - if (pdu_list->PDUType == NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE) - { - LOG_D(NR_PHY, "[%d, %d] PDCCH DCI PDU (Format for incoming PDSCH PDU)\n", - dl_tti_request->SFN, dl_tti_request->Slot); - uint16_t num_dcis = pdu_list->pdcch_pdu.pdcch_pdu_rel15.numDlDci; - if (num_dcis > 0) - { - if (!dl_info->dci_ind) - { - dl_info->dci_ind = CALLOC(1, sizeof(fapi_nr_dci_indication_t)); - } - dl_info->dci_ind->SFN = dl_tti_request->SFN; - dl_info->dci_ind->slot = dl_tti_request->Slot; - AssertFatal(num_dcis <= sizeof(dl_info->dci_ind->dci_list) / sizeof(dl_info->dci_ind->dci_list[0]), - "The number of DCIs is greater than dci_list"); - for (int j = 0; j < num_dcis; j++) - { - nfapi_nr_dl_dci_pdu_t *dci_pdu_list = &pdu_list->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[j]; - if (!is_my_dci(mac, dci_pdu_list)) - { - continue; - } - fill_dl_info_with_pdcch(dl_info->dci_ind, dci_pdu_list, pdu_idx); - if (dci_pdu_list->RNTI == 0xffff) - { - mac->nr_ue_emul_l1.expected_sib = true; - mac->nr_ue_emul_l1.index_has_sib[j] = true; - LOG_T(NR_MAC, "Setting index_has_sib[%d] = true\n", j); - } - else if (dci_pdu_list->RNTI == mac->ra.ra_rnti) - { - mac->nr_ue_emul_l1.expected_rar = true; - mac->nr_ue_emul_l1.index_has_rar[j] = true; - LOG_T(NR_MAC, "Setting index_has_rar[%d] = true\n", j); - } - else - { - mac->nr_ue_emul_l1.expected_dci = true; - mac->nr_ue_emul_l1.index_has_dci[j] = true; - LOG_T(NR_MAC, "Setting index_has_dci[%d] = true\n", j); - } - pdu_idx++; - } - } - } - if (pdu_list->PDUType == NFAPI_NR_DL_TTI_SSB_PDU_TYPE) - { - /* If we get a MIB, we want to handle it right away and then come back. - The MIB and SIB come in the same dl_tti_req but the MIB should be - processed first and then the DCI and payload of the SIB1 can be - processed. The MIB should be handled first and then the rx_ind - will be freed after handling. This is why the PDU index will - always be zero for the RX_IND becasue we should not have more than - one MIB. */ - if (!dl_info->rx_ind) - { - dl_info->rx_ind = CALLOC(1, sizeof(*dl_info->rx_ind)); - } - fapi_nr_rx_indication_t *rx_ind = dl_info->rx_ind; - rx_ind->sfn = dl_tti_request->SFN; - rx_ind->slot = dl_tti_request->Slot; - fill_mib_in_rx_ind(pdu_list, rx_ind, 0, FAPI_NR_RX_PDU_TYPE_SSB); - nr_ue_dl_indication(&mac->dl_info); - } - } - dl_info->slot = dl_tti_request->Slot; - dl_info->frame = dl_tti_request->SFN; -} - -static void fill_rx_ind(nfapi_nr_pdu_t *pdu_list, fapi_nr_rx_indication_t *rx_ind, int pdu_idx, int pdu_type) -{ - NR_UE_MAC_INST_t *mac = get_mac_inst(0); - AssertFatal(pdu_list->num_TLV < sizeof(pdu_list->TLVs) / sizeof(pdu_list->TLVs[0]), "Num TLVs exceeds TLV array size"); - int length = 0; - for (int j = 0; j < pdu_list->num_TLV; j++) - { - length += pdu_list->TLVs[j].length; - } - LOG_D(NR_PHY, "%s: num_tlv %d and length %d, pdu index %d\n", - __FUNCTION__, pdu_list->num_TLV, length, pdu_idx); - uint8_t *pdu = malloc(length); - AssertFatal(pdu != NULL, "%s: Out of memory in malloc", __FUNCTION__); - rx_ind->rx_indication_body[pdu_idx].pdsch_pdu.pdu = pdu; - for (int j = 0; j < pdu_list->num_TLV; j++) - { - const uint32_t *ptr; - if (pdu_list->TLVs[j].tag) - ptr = pdu_list->TLVs[j].value.ptr; - else - ptr = pdu_list->TLVs[j].value.direct; - memcpy(pdu, ptr, pdu_list->TLVs[j].length); - pdu += pdu_list->TLVs[j].length; - } - bool ack_nack = true; - if (mac->ra.ra_state >= nrRA_SUCCEEDED && should_drop_transport_block(rx_ind->slot, mac->crnti)) { - ack_nack = false; - } - rx_ind->rx_indication_body[pdu_idx].pdsch_pdu.ack_nack = ack_nack; - rx_ind->rx_indication_body[pdu_idx].pdsch_pdu.pdu_length = length; - rx_ind->rx_indication_body[pdu_idx].pdu_type = pdu_type; - -} - - -static void copy_tx_data_req_to_dl_info(nr_downlink_indication_t *dl_info, nfapi_nr_tx_data_request_t *tx_data_request) -{ - NR_UE_MAC_INST_t *mac = get_mac_inst(dl_info->module_id); - int num_pdus = tx_data_request->Number_of_PDUs; - AssertFatal(num_pdus >= 0, "Invalid tx_data_request number of PDUS\n"); - - if (!dl_info->rx_ind) - { - dl_info->rx_ind = CALLOC(num_pdus, sizeof(fapi_nr_rx_indication_t)); - } - AssertFatal(dl_info->rx_ind != NULL, "%s: Out of memory in calloc", __FUNCTION__); - fapi_nr_rx_indication_t *rx_ind = dl_info->rx_ind; - rx_ind->sfn = tx_data_request->SFN; - rx_ind->slot = tx_data_request->Slot; - - int pdu_idx = 0; - - for (int i = 0; i < num_pdus; i++) - { - nfapi_nr_pdu_t *pdu_list = &tx_data_request->pdu_list[i]; - if (mac->nr_ue_emul_l1.index_has_sib[i]) - { - AssertFatal(!get_softmodem_params()->nsa, - "Should not be processing SIB in NSA mode, something bad happened\n"); - fill_rx_ind(pdu_list, rx_ind, pdu_idx, FAPI_NR_RX_PDU_TYPE_SIB); - pdu_idx++; - } - else if (mac->nr_ue_emul_l1.index_has_rar[i]) - { - fill_rx_ind(pdu_list, rx_ind, pdu_idx, FAPI_NR_RX_PDU_TYPE_RAR); - pdu_idx++; - } - else if (mac->nr_ue_emul_l1.index_has_dci[i]) - { - fill_rx_ind(pdu_list, rx_ind, pdu_idx, FAPI_NR_RX_PDU_TYPE_DLSCH); - pdu_idx++; - } - else - { - LOG_T(NR_MAC, "mac->nr_ue_emul_l1.index_has_dci[%d] = 0, so this index contained a DCI for a different UE\n", i); - } - - } - dl_info->slot = tx_data_request->Slot; - dl_info->frame = tx_data_request->SFN; - dl_info->rx_ind->number_pdus = pdu_idx; -} - -static void copy_ul_dci_data_req_to_dl_info(nr_downlink_indication_t *dl_info, nfapi_nr_ul_dci_request_t *ul_dci_req) -{ - NR_UE_MAC_INST_t *mac = get_mac_inst(dl_info->module_id); - int pdu_idx = 0; - - int num_pdus = ul_dci_req->numPdus; - AssertFatal(num_pdus >= 0, "Invalid ul_dci_request number of PDUS\n"); - - for (int i = 0; i < num_pdus; i++) - { - nfapi_nr_ul_dci_request_pdus_t *pdu_list = &ul_dci_req->ul_dci_pdu_list[i]; - AssertFatal(pdu_list->PDUType == 0, "ul_dci_req pdu type != PUCCH"); - LOG_D(NR_PHY, "[%d %d] PUCCH PDU in ul_dci for rnti %x and numDLDCI = %d\n", - ul_dci_req->SFN, ul_dci_req->Slot, pdu_list->pdcch_pdu.pdcch_pdu_rel15.dci_pdu->RNTI, - pdu_list->pdcch_pdu.pdcch_pdu_rel15.numDlDci); - uint16_t num_dci = pdu_list->pdcch_pdu.pdcch_pdu_rel15.numDlDci; - if (num_dci > 0) - { - if (!dl_info->dci_ind) - { - dl_info->dci_ind = CALLOC(1, sizeof(fapi_nr_dci_indication_t)); - } - AssertFatal(dl_info->dci_ind != NULL, "%s: Out of memory in calloc", __FUNCTION__); - dl_info->dci_ind->SFN = ul_dci_req->SFN; - dl_info->dci_ind->slot = ul_dci_req->Slot; - AssertFatal(num_dci < sizeof(dl_info->dci_ind->dci_list) / sizeof(dl_info->dci_ind->dci_list[0]), "The number of DCIs is greater than dci_list"); - for (int j = 0; j < num_dci; j++) - { - nfapi_nr_dl_dci_pdu_t *dci_pdu_list = &pdu_list->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[j]; - if (dci_pdu_list->RNTI != mac->crnti) - { - LOG_T(NR_MAC, "dci_pdu_list->RNTI (%x) != mac->crnti (%x)\n", dci_pdu_list->RNTI, mac->crnti); - continue; - } - fill_dl_info_with_pdcch(dl_info->dci_ind, dci_pdu_list, pdu_idx); - pdu_idx++; - } - } - } - dl_info->frame = ul_dci_req->SFN; - dl_info->slot = ul_dci_req->Slot; -} - -static bool send_crc_ind_and_rx_ind(int sfn, int slot) -{ - bool sent_crc_rx = true; - - struct sfn_slot_s sfn_slot = {.sfn = sfn, .slot = slot}; - nfapi_nr_rx_data_indication_t *rx_ind = unqueue_matching(&nr_rx_ind_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &sfn_slot); - nfapi_nr_crc_indication_t *crc_ind = unqueue_matching(&nr_crc_ind_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &sfn_slot); - - if (crc_ind && crc_ind->number_crcs > 0) - { - NR_UE_MAC_INST_t *mac = get_mac_inst(0); - for (int i = 0; i < crc_ind->number_crcs; i++) { - int harq_pid = crc_ind->crc_list[i].harq_id; - LOG_T(NR_MAC, "Resetting harq_pid %d active_ul_harq_sfn/slot\n", harq_pid); - mac->nr_ue_emul_l1.harq[harq_pid].active_ul_harq_sfn = -1; - mac->nr_ue_emul_l1.harq[harq_pid].active_ul_harq_slot = -1; - } - NR_UL_IND_t UL_INFO = { - .crc_ind = *crc_ind, - }; - send_nsa_standalone_msg(&UL_INFO, crc_ind->header.message_id); - free(crc_ind->crc_list); - free(crc_ind); - } - if (rx_ind && rx_ind->number_of_pdus > 0) - { - NR_UL_IND_t UL_INFO = { - .rx_ind = *rx_ind, - }; - send_nsa_standalone_msg(&UL_INFO, rx_ind->header.message_id); - free(rx_ind->pdu_list); - free(rx_ind); - } - else - { - sent_crc_rx = false; - } - return sent_crc_rx; -} - -static void copy_ul_tti_data_req_to_dl_info(nr_downlink_indication_t *dl_info, nfapi_nr_ul_tti_request_t *ul_tti_req) -{ - int num_pdus = ul_tti_req->n_pdus; - AssertFatal(num_pdus >= 0, "Invalid ul_tti_request number of PDUS\n"); - AssertFatal(num_pdus <= sizeof(ul_tti_req->pdus_list) / sizeof(ul_tti_req->pdus_list[0]), - "Too many pdus %d in ul_tti_req\n", num_pdus); - - if (!send_crc_ind_and_rx_ind(ul_tti_req->SFN, ul_tti_req->Slot)) - { - LOG_T(NR_MAC, "CRC_RX ind not sent\n"); - if (!put_queue(&nr_ul_tti_req_queue, ul_tti_req)) - { - LOG_E(NR_PHY, "put_queue failed for ul_tti_req.\n"); - } - return; - } -} - -static void fill_dci_from_dl_config(nr_downlink_indication_t*dl_ind, fapi_nr_dl_config_request_t *dl_config) -{ - - if (!dl_ind->dci_ind) - return; - - AssertFatal(dl_config->number_pdus < sizeof(dl_config->dl_config_list) / sizeof(dl_config->dl_config_list[0]), - "Too many dl_config pdus %d", dl_config->number_pdus); - for (int i = 0; i < dl_config->number_pdus; i++) { - LOG_D(PHY, "Filling DCI with a total of %d total DL PDUs (dl_config %p) \n", - dl_config->number_pdus, dl_config); - fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15_dci = &dl_config->dl_config_list[i].dci_config_pdu.dci_config_rel15; - int num_dci_options = rel15_dci->num_dci_options; - if (num_dci_options <= 0) - LOG_D(NR_MAC, "num_dci_opts = %d for pdu[%d] in dl_config_list\n", rel15_dci->num_dci_options, i); - AssertFatal(num_dci_options <= sizeof(rel15_dci->dci_length_options) / sizeof(rel15_dci->dci_length_options[0]), - "num_dci_options %d > dci_length_options array\n", num_dci_options); - AssertFatal(num_dci_options <= sizeof(rel15_dci->dci_format_options) / sizeof(rel15_dci->dci_format_options[0]), - "num_dci_options %d > dci_format_options array\n", num_dci_options); - - for (int j = 0; j < num_dci_options; j++) { - int num_dcis = dl_ind->dci_ind->number_of_dcis; - AssertFatal(num_dcis <= sizeof(dl_ind->dci_ind->dci_list) / sizeof(dl_ind->dci_ind->dci_list[0]), - "dl_config->number_pdus %d > dci_ind->dci_list array\n", num_dcis); - for (int k = 0; k < num_dcis; k++) { - LOG_T(NR_PHY, "Received len %d, length options[%d] %d, format assigned %d, format options[%d] %d\n", - dl_ind->dci_ind->dci_list[k].payloadSize, j, rel15_dci->dci_length_options[j], - dl_ind->dci_ind->dci_list[k].dci_format, j, rel15_dci->dci_format_options[j]); - if (rel15_dci->dci_length_options[j] == dl_ind->dci_ind->dci_list[k].payloadSize) { - dl_ind->dci_ind->dci_list[k].dci_format = rel15_dci->dci_format_options[j]; - dl_ind->dci_ind->dci_list[k].ss_type = rel15_dci->ss_type_options[j]; - dl_ind->dci_ind->dci_list[k].coreset_type = rel15_dci->coreset.CoreSetType; - LOG_D(NR_PHY, "format assigned dl_ind->dci_ind->dci_list[k].dci_format %d\n", - dl_ind->dci_ind->dci_list[k].dci_format); - } - } - } - } -} - -// This piece of code is not used in "normal" ue, but in "fapi mode" -void check_and_process_dci(nfapi_nr_dl_tti_request_t *dl_tti_request, - nfapi_nr_tx_data_request_t *tx_data_request, - nfapi_nr_ul_dci_request_t *ul_dci_request, - nfapi_nr_ul_tti_request_t *ul_tti_request) -{ - frame_t frame = 0; - int slot = 0; - NR_UE_MAC_INST_t *mac = get_mac_inst(0); - - if (pthread_mutex_lock(&mac->mutex_dl_info)) abort(); - - if (dl_tti_request) { - frame = dl_tti_request->SFN; - slot = dl_tti_request->Slot; - LOG_D(NR_PHY, "[%d, %d] dl_tti_request\n", frame, slot); - copy_dl_tti_req_to_dl_info(&mac->dl_info, dl_tti_request); - } - /* This checks if the previously recevied DCI matches our current RNTI - value. The assumption is that if the DCI matches our RNTI, then the - incoming tx_data_request is also destined for the current UE. If the - RAR hasn't been processed yet, we do not want to be filtering the - tx_data_requests. */ - if (tx_data_request) { - if (mac->nr_ue_emul_l1.expected_sib || - mac->nr_ue_emul_l1.expected_rar || - mac->nr_ue_emul_l1.expected_dci) { - frame = tx_data_request->SFN; - slot = tx_data_request->Slot; - LOG_D(NR_PHY, "[%d, %d] PDSCH in tx_request\n", frame, slot); - copy_tx_data_req_to_dl_info(&mac->dl_info, tx_data_request); - } - else { - LOG_D(NR_MAC, "Unexpected tx_data_req\n"); - } - } - else if (ul_dci_request) { - frame = ul_dci_request->SFN; - slot = ul_dci_request->Slot; - LOG_D(NR_PHY, "[%d, %d] ul_dci_request\n", frame, slot); - copy_ul_dci_data_req_to_dl_info(&mac->dl_info, ul_dci_request); - } - else if (ul_tti_request) { - frame = ul_tti_request->SFN; - slot = ul_tti_request->Slot; - LOG_T(NR_PHY, "[%d, %d] ul_tti_request\n", frame, slot); - copy_ul_tti_data_req_to_dl_info(&mac->dl_info, ul_tti_request); - } - else { - if (pthread_mutex_unlock(&mac->mutex_dl_info)) abort(); - LOG_T(NR_MAC, "All indications were NULL in %s\n", __FUNCTION__); - return; - } - - if (dl_tti_request || tx_data_request || ul_dci_request) { - fapi_nr_dl_config_request_t *dl_config = get_dl_config_request(mac, slot); - fill_dci_from_dl_config(&mac->dl_info, dl_config); - } - nr_ue_dl_scheduler(mac, &mac->dl_info); - nr_ue_dl_indication(&mac->dl_info); - - if (pthread_mutex_unlock(&mac->mutex_dl_info)) - abort(); - int slots_per_frame = 20; //30 kHZ subcarrier spacing - int slot_ahead = 2; // TODO: Make this dynamic - - if (is_ul_slot((slot + slot_ahead) % slots_per_frame, &mac->frame_structure) - && mac->ra.ra_state != nrRA_SUCCEEDED) { - // If we filled dl_info AFTER we got the slot indication, we want to check if we should fill tx_req: - nr_uplink_indication_t ul_info = {.slot = (slot + slot_ahead) % slots_per_frame, - .frame = slot + slot_ahead >= slots_per_frame ? (frame + 1) % 1024 : frame}; - nr_ue_ul_scheduler(mac, &ul_info); - } -} - -void save_nr_measurement_info(nfapi_nr_dl_tti_request_t *dl_tti_request) -{ - int num_pdus = dl_tti_request->dl_tti_request_body.nPDUs; - char buffer[MAX_MESSAGE_SIZE]; - if (num_pdus <= 0) - { - LOG_E(NR_PHY, "%s: dl_tti_request number of PDUS <= 0\n", __FUNCTION__); - abort(); - } - LOG_T(NR_PHY, "%s: dl_tti_request number of PDUS: %d\n", __FUNCTION__, num_pdus); - for (int i = 0; i < num_pdus; i++) - { - nfapi_nr_dl_tti_request_pdu_t *pdu_list = &dl_tti_request->dl_tti_request_body.dl_tti_pdu_list[i]; - if (pdu_list->PDUType == NFAPI_NR_DL_TTI_SSB_PDU_TYPE) - { - LOG_T(NR_PHY, "Cell_id: %d, the ssb_block_idx %d, sc_offset: %d and payload %d\n", - pdu_list->ssb_pdu.ssb_pdu_rel15.PhysCellId, - pdu_list->ssb_pdu.ssb_pdu_rel15.SsbBlockIndex, - pdu_list->ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset, - pdu_list->ssb_pdu.ssb_pdu_rel15.bchPayload); - pdu_list->ssb_pdu.ssb_pdu_rel15.ssbRsrp = 60; - LOG_T(NR_RRC, "Setting pdulist[%d].ssbRsrp to %d\n", i, pdu_list->ssb_pdu.ssb_pdu_rel15.ssbRsrp); - } - } - - size_t pack_len = nfapi_nr_p7_message_pack((void *)dl_tti_request, - buffer, - sizeof(buffer), - NULL); - if (pack_len < 0) - { - LOG_E(NR_PHY, "%s: Error packing nr p7 message.\n", __FUNCTION__); - } - nsa_sendmsg_to_lte_ue(buffer, pack_len, NR_UE_RRC_MEASUREMENT); - LOG_A(NR_RRC, "Populated NR_UE_RRC_MEASUREMENT information and sent to LTE UE\n"); -} - -static void enqueue_nr_nfapi_msg(void *buffer, ssize_t len, nfapi_p7_message_header_t header) -{ - NR_UE_MAC_INST_t *mac = get_mac_inst(0); - switch (header.message_id) - { - case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST: - { - nfapi_nr_dl_tti_request_t *dl_tti_request = malloc16(sizeof(*dl_tti_request)); - const bool result = nfapi_nr_p7_message_unpack(buffer, len, dl_tti_request, sizeof(*dl_tti_request), NULL); - if (!result) { - LOG_E(NR_PHY, "Message dl_tti_request failed to unpack\n"); - break; - } - LOG_D(NR_PHY, "Received an NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST message in sfn/slot %d %d. \n", - dl_tti_request->SFN, dl_tti_request->Slot); - - if (is_channel_modeling()) - save_pdsch_pdu_for_crnti(dl_tti_request); - - if (!put_queue(&nr_dl_tti_req_queue, dl_tti_request)) - { - LOG_E(NR_PHY, "put_queue failed for dl_tti_request.\n"); - free(dl_tti_request); - dl_tti_request = NULL; - } - break; - } - - case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST: - { - nfapi_nr_tx_data_request_t *tx_data_request = malloc16(sizeof(*tx_data_request)); - const bool result = nfapi_nr_p7_message_unpack(buffer, len, tx_data_request, sizeof(*tx_data_request), NULL); - if (!result) { - LOG_E(NR_PHY, "Message tx_data_request failed to unpack\n"); - break; - } - LOG_D(NR_PHY, "Received an NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST message in SFN/slot %d %d. \n", - tx_data_request->SFN, tx_data_request->Slot); - if (!put_queue(&nr_tx_req_queue, tx_data_request)) - { - LOG_E(NR_PHY, "put_queue failed for tx_request.\n"); - free(tx_data_request); - tx_data_request = NULL; - } - break; - } - - case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST: - { - nfapi_nr_ul_dci_request_t *ul_dci_request = malloc16(sizeof(*ul_dci_request)); - const bool result = nfapi_nr_p7_message_unpack(buffer, len, ul_dci_request, sizeof(*ul_dci_request), NULL); - if (!result) { - LOG_E(NR_PHY, "Message ul_dci_request failed to unpack\n"); - break; - } - LOG_D(NR_PHY, "Received an NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST message in SFN/slot %d %d. \n", - ul_dci_request->SFN, ul_dci_request->Slot); - if (!put_queue(&nr_ul_dci_req_queue, ul_dci_request)) - { - LOG_E(NR_PHY, "put_queue failed for ul_dci_request.\n"); - free(ul_dci_request); - ul_dci_request = NULL; - } - break; - } - - case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST: - { - nfapi_nr_ul_tti_request_t *ul_tti_request = malloc16(sizeof(*ul_tti_request)); - const bool result = nfapi_nr_p7_message_unpack(buffer, len, ul_tti_request, sizeof(*ul_tti_request), NULL); - if (!result) { - LOG_E(NR_PHY, "Message ul_tti_request failed to unpack\n"); - break; - } - /* We are filtering UL_TTI_REQs below. We only care about UL_TTI_REQs that - will trigger sending a ul_harq (CRC/RX pair). This UL_TTI_REQ will have - NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE. If we have not yet completed the CBRA/ - CFRA procedure, we need to queue all UL_TTI_REQs. */ - for (int i = 0; i < ul_tti_request->n_pdus; i++) { - if (ul_tti_request->pdus_list[i].pdu_type == NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE - && mac->ra.ra_state >= nrRA_SUCCEEDED) { - if (!put_queue(&nr_ul_tti_req_queue, ul_tti_request)) { - LOG_D(NR_PHY, "put_queue failed for ul_tti_request, calling put_queue_replace.\n"); - nfapi_nr_ul_tti_request_t *evicted_ul_tti_req = put_queue_replace(&nr_ul_tti_req_queue, ul_tti_request); - free(evicted_ul_tti_req); - } - break; - } else if (mac->ra.ra_state < nrRA_SUCCEEDED) { - if (!put_queue(&nr_ul_tti_req_queue, ul_tti_request)) { - LOG_D(NR_PHY, "put_queue failed for ul_tti_request, calling put_queue_replace.\n"); - nfapi_nr_ul_tti_request_t *evicted_ul_tti_req = put_queue_replace(&nr_ul_tti_req_queue, ul_tti_request); - free(evicted_ul_tti_req); - } - break; - } - } - break; - } - - default: - LOG_E(NR_PHY, "Invalid nFAPI message. Header ID %d\n", - header.message_id); - break; - } - return; -} - -static void save_pdsch_pdu_for_crnti(nfapi_nr_dl_tti_request_t *dl_tti_request) -{ - int count_sent = 0; - NR_UE_MAC_INST_t *mac = get_mac_inst(0); - int number_of_pdu = dl_tti_request->dl_tti_request_body.nPDUs; - if (number_of_pdu <= 0) - { - LOG_E(NR_MAC, "%s: dl_tti_request pdu size <= 0\n", __FUNCTION__); - abort(); - } - - for (int i = 0; i < number_of_pdu; i++) - { - const nfapi_nr_dl_tti_request_pdu_t *pdu_list = &dl_tti_request->dl_tti_request_body.dl_tti_pdu_list[i]; - - if (pdu_list->PDUType == NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE) - { - const nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu = &pdu_list->pdsch_pdu.pdsch_pdu_rel15; - if (pdsch_pdu->rnti == mac->crnti && mac->ra.ra_state == nrRA_SUCCEEDED) { - read_channel_param(pdsch_pdu, dl_tti_request->Slot, count_sent); - count_sent++; - LOG_T(NR_MAC, "pdsch_pdu->rnti %x mac->crnti %x mac->ra.ra_state %d count_sent %d\n", - pdsch_pdu->rnti, mac->crnti, mac->ra.ra_state, count_sent); - } - } - } -} - -static uint16_t get_message_id(const uint8_t *buffer, ssize_t len) -{ - if (len < 4) - return 0; - - // Unpack 2 bytes message_id from buffer. - uint16_t v; - memcpy(&v, buffer + 2, sizeof(v)); - return ntohs(v); -} - -void *nrue_standalone_pnf_task(void *context) -{ - struct sockaddr_in server_address; - socklen_t addr_len = sizeof(server_address); - int sd = ue_rx_sock_descriptor; - assert(sd > 0); - - char buffer[NFAPI_MAX_PACKED_MESSAGE_SIZE]; - - LOG_I(NR_RRC, "Successfully started %s.\n", __FUNCTION__); - - while (true) - { - ssize_t len = recvfrom(sd, buffer, sizeof(buffer), MSG_TRUNC, (struct sockaddr *)&server_address, &addr_len); - if (len == -1) - { - LOG_E(NR_PHY, "reading from standalone pnf sctp socket failed \n"); - continue; - } - if (len > sizeof(buffer)) - { - LOG_E(NR_PHY, "%s(%d). Message truncated. %zd\n", __FUNCTION__, __LINE__, len); - continue; - } - if (len == sizeof(uint16_t)) - { - uint16_t *sfn_slot = CALLOC(1, sizeof(*sfn_slot)); - memcpy(sfn_slot, buffer, sizeof(*sfn_slot)); - - LOG_D(NR_PHY, "Received from proxy sfn_slot %x\n", *sfn_slot); - - if (!put_queue(&nr_sfn_slot_queue, sfn_slot)) - { - LOG_E(NR_PHY, "put_queue failed for sfn slot.\n"); - } - - if (sem_post(&sfn_slot_semaphore) != 0) - { - LOG_E(NR_PHY, "sem_post() error\n"); - abort(); - } - } - else if (get_message_id((const uint8_t *)buffer, len) == 0x0FFF) // 0x0FFF : channel info identifier. - { - nr_phy_channel_params_t *ch_info = CALLOC(1, sizeof(*ch_info)); - memcpy(ch_info, buffer, sizeof(*ch_info)); - - if (ch_info->nb_of_csi > 1) - LOG_W(NR_PHY, "Expecting only one CSI report.\n"); - - // TODO: Update sinr field of slot_rnti_mcs to be array. - for (int i = 0; i < ch_info->nb_of_csi; ++i) - { - int mu = 1; // NR-UE emul-L1 is hardcoded to 30kHZ, see check_and_process_dci() - int frame = NFAPI_SFNSLOTDEC2SFN(mu, ch_info->sfn_slot); - int slot = NFAPI_SFNSLOTDEC2SLOT(mu, ch_info->sfn_slot); - slot_rnti_mcs[slot].sinr = ch_info->csi[i].sinr; - slot_rnti_mcs[slot].area_code = ch_info->csi[i].area_code; - - LOG_D(NR_PHY, "Received_SINR[%d] = %f, sfn:slot %d:%d\n", i, ch_info->csi[i].sinr, frame, slot); - } - - if (!put_queue(&nr_chan_param_queue, ch_info)) - { - LOG_E(NR_PHY, "put_queue failed for sfn slot.\n"); - } - - if (sem_post(&sfn_slot_semaphore) != 0) - { - LOG_E(NR_MAC, "sem_post() error\n"); - abort(); - } - } - else - { - nfapi_p7_message_header_t header; - if (nfapi_p7_message_header_unpack(buffer, len, &header, sizeof(header), NULL) < 0) - { - LOG_E(NR_PHY, "Header unpack failed for nrue_standalone pnf\n"); - continue; - } - enqueue_nr_nfapi_msg(buffer, len, header); - } - } //while(true) -} - // L2 Abstraction Layer static int handle_bcch_bch(NR_UE_MAC_INST_t *mac, int cc_id, @@ -1141,13 +166,6 @@ static nr_dci_format_t handle_dci(NR_UE_MAC_INST_t *mac, // Note: sdu should always be processed because data and timing advance updates are transmitted by the UE static int8_t handle_dlsch(NR_UE_MAC_INST_t *mac, nr_downlink_indication_t *dl_info, int pdu_id) { - /* L1 assigns harq_pid, but in emulated L1 mode we need to assign - the harq_pid based on the saved global g_harq_pid. Because we are - emulating L1, no antenna measurements are conducted to calculate - a harq_pid, therefore we must set it here. */ - if (get_softmodem_params()->emulate_l1) - dl_info->rx_ind->rx_indication_body[pdu_id].pdsch_pdu.harq_pid = g_harq_pid; - if (mac->ra.ra_state != nrRA_WAIT_RAR) // no HARQ for MSG2 update_harq_status(mac, dl_info->rx_ind->rx_indication_body[pdu_id].pdsch_pdu.harq_pid, @@ -1232,9 +250,6 @@ static uint32_t nr_ue_dl_processing(NR_UE_MAC_INST_t *mac, nr_downlink_indicatio continue; } dci_pdu_rel15_t *def_dci_pdu_rel15 = &mac->def_dci_pdu_rel15[dl_info->slot][dci_format]; - g_harq_pid = def_dci_pdu_rel15->harq_pid.val; - LOG_T(NR_MAC, "Setting harq_pid = %d and dci_index = %d (based on format)\n", g_harq_pid, dci_format); - ret_mask |= (1 << FAPI_NR_DCI_IND); AssertFatal(nr_ue_if_module_inst[dl_info->module_id] != NULL, "IF module is NULL!\n"); fapi_nr_dl_config_request_t *dl_config = get_dl_config_request(mac, dl_info->slot); @@ -1362,45 +377,14 @@ nr_ue_if_module_t *nr_ue_if_module_init(uint32_t module_id) nr_ue_if_module_inst[module_id]->sl_phy_config_request = nr_ue_sl_phy_config_request; nr_ue_if_module_inst[module_id]->sl_indication = nr_ue_sl_indication; } - if (get_softmodem_params()->emulate_l1) - nr_ue_if_module_inst[module_id]->scheduled_response = nr_ue_scheduled_response_stub; - else - nr_ue_if_module_inst[module_id]->scheduled_response = nr_ue_scheduled_response; + nr_ue_if_module_inst[module_id]->scheduled_response = nr_ue_scheduled_response; nr_ue_if_module_inst[module_id]->dl_indication = nr_ue_dl_indication; nr_ue_if_module_inst[module_id]->ul_indication = nr_ue_ul_indication; nr_ue_if_module_inst[module_id]->slot_indication = nr_ue_slot_indication; } - return nr_ue_if_module_inst[module_id]; } -void RCconfig_nr_ue_macrlc(void) { - int j; - paramdef_t MACRLC_Params[] = MACRLCPARAMS_DESC; - paramlist_def_t MACRLC_ParamList = {CONFIG_STRING_MACRLC_LIST, NULL, 0}; - - config_getlist(config_get_if(), &MACRLC_ParamList, MACRLC_Params, sizeofArray(MACRLC_Params), NULL); - if (MACRLC_ParamList.numelt > 0) { - for (j = 0; j < MACRLC_ParamList.numelt; j++) { - if (strcmp(*(MACRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr), "nfapi") == 0) { - stub_eth_params.my_addr = strdup( - *(MACRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_ADDRESS_IDX].strptr)); - stub_eth_params.remote_addr = strdup( - *(MACRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_ADDRESS_IDX].strptr)); - stub_eth_params.my_portc = - *(MACRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_PORTC_IDX].iptr); - stub_eth_params.remote_portc = - *(MACRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_PORTC_IDX].iptr); - stub_eth_params.my_portd = - *(MACRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_PORTD_IDX].iptr); - stub_eth_params.remote_portd = - *(MACRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_PORTD_IDX].iptr); - stub_eth_params.transp_preference = ETH_UDP_MODE; - } - } - } -} - static void handle_sl_bch(int ue_id, sl_nr_ue_mac_params_t *sl_mac, uint8_t *const sl_mib, diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h index 2bbd97db84..a1175282f0 100644 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h @@ -34,11 +34,8 @@ #define __NR_IF_MODULE_H__ #include "common/platform_types.h" -#include #include "fapi_nr_ue_interface.h" -#include "openair2/PHY_INTERFACE/queue_t.h" #include "openair2/NR_PHY_INTERFACE/NR_IF_Module.h" -#include "NR_Packet_Drop.h" #include "nfapi/open-nFAPI/nfapi/public_inc/sidelink_nr_ue_interface.h" typedef enum sl_sidelink_slot_type { @@ -50,19 +47,6 @@ typedef enum sl_sidelink_slot_type { } sl_sidelink_slot_type_t; -extern queue_t nr_rach_ind_queue; -extern queue_t nr_rx_ind_queue; -extern queue_t nr_crc_ind_queue; -extern queue_t nr_uci_ind_queue; -extern queue_t nr_sfn_slot_queue; -extern queue_t nr_chan_param_queue; -extern queue_t nr_dl_tti_req_queue; -extern queue_t nr_tx_req_queue; -extern queue_t nr_ul_dci_req_queue; -extern queue_t nr_ul_tti_req_queue; - -extern slot_rnti_mcs_s slot_rnti_mcs[NUM_NFAPI_SLOT]; - typedef struct NR_UL_TIME_ALIGNMENT NR_UL_TIME_ALIGNMENT_t; typedef struct { @@ -292,32 +276,6 @@ typedef struct nr_ue_if_module_s { \param module_id module id*/ nr_ue_if_module_t *nr_ue_if_module_init(uint32_t module_id); -void nrue_init_standalone_socket(int tx_port, int rx_port); - -void *nrue_standalone_pnf_task(void *context); -extern sem_t sfn_slot_semaphore; - -typedef struct nfapi_dl_tti_config_req_tx_data_req_t -{ - nfapi_nr_dl_tti_request_pdu_t *dl_itti_config_req; - nfapi_nr_tx_data_request_t *tx_data_req_pdu_list; -} nfapi_dl_tti_config_req_tx_data_req_t; - -void send_nsa_standalone_msg(NR_UL_IND_t *UL_INFO, uint16_t msg_id); - -void save_nr_measurement_info(nfapi_nr_dl_tti_request_t *dl_tti_request); - -void check_and_process_dci(nfapi_nr_dl_tti_request_t *dl_tti_request, - nfapi_nr_tx_data_request_t *tx_data_request, - nfapi_nr_ul_dci_request_t *ul_dci_request, - nfapi_nr_ul_tti_request_t *ul_tti_request); - -struct sfn_slot_s { - int sfn; - int slot; -}; -bool sfn_slot_matcher(void *sfn_slot_s, void *candidate); - /**\brief interface between L1/L2, indicating the downlink related information, like dci_ind and rx_req \param dl_info including dci_ind and rx_request messages*/ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info); diff --git a/openair2/RRC/LTE/rrc_eNB.c b/openair2/RRC/LTE/rrc_eNB.c index 90b2d3b86f..4ddd7fc625 100644 --- a/openair2/RRC/LTE/rrc_eNB.c +++ b/openair2/RRC/LTE/rrc_eNB.c @@ -6354,7 +6354,7 @@ rrc_eNB_decode_dcch( /*NN: revise the condition */ /*FK: left the condition as is for the case MME is used (S1 mode) but setting dedicated_DRB = 1 otherwise (noS1 mode) so that no second RRCReconfiguration message activationg more DRB is sent as this causes problems with the nasmesh driver.*/ - if (!IS_SOFTMODEM_NOS1 || get_softmodem_params()->emulate_l1) { + if (!IS_SOFTMODEM_NOS1) { if (ue_context_p->ue_context.StatusRrc == RRC_RECONFIGURED) { dedicated_DRB = 1; LOG_I(RRC, diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c index c167982859..0544637975 100644 --- a/openair2/RRC/NR_UE/rrc_UE.c +++ b/openair2/RRC/NR_UE/rrc_UE.c @@ -2921,7 +2921,7 @@ static void process_lte_nsa_msg(NR_UE_RRC_INST_t *rrc, nsa_msg_t *msg, int msg_l LOG_D(NR_RRC, "NR carrierFreq_r15 (ssb): %ld and sub carrier spacing:%ld\n", nr_meas_obj->measObject.choice.measObjectNR_r15.carrierFreq_r15, nr_meas_obj->measObject.choice.measObjectNR_r15.rs_ConfigSSB_r15.subcarrierSpacingSSB_r15); - start_oai_nrue_threads(); + //start_oai_nrue_threads(); break; } diff --git a/openair2/RRC/NR_UE/rrc_proto.h b/openair2/RRC/NR_UE/rrc_proto.h index d332ca5175..cdcf1966b4 100644 --- a/openair2/RRC/NR_UE/rrc_proto.h +++ b/openair2/RRC/NR_UE/rrc_proto.h @@ -74,8 +74,6 @@ void *recv_msgs_from_lte_ue(void *args_p); void init_connections_with_lte_ue(void); -extern void start_oai_nrue_threads(void); - int get_from_lte_ue_fd(); void nr_rrc_SI_timers(NR_UE_RRC_SI_INFO *SInfo);