diff --git a/executables/nr-ue.c b/executables/nr-ue.c index 6e668c8901..431794abe2 100644 --- a/executables/nr-ue.c +++ b/executables/nr-ue.c @@ -310,16 +310,13 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg) int CC_id = 0; uint8_t gNB_id = 0; - nr_uplink_indication_t ul_info; int slots_per_frame = 20; //30 kHZ subcarrier spacing int slot_ahead = 2; // TODO: Make this dynamic - ul_info.cc_id = CC_id; - ul_info.gNB_index = gNB_id; - ul_info.module_id = mod_id; - ul_info.frame_rx = frame; - ul_info.slot_rx = slot; - ul_info.slot_tx = (slot + slot_ahead) % slots_per_frame; - ul_info.frame_tx = (ul_info.slot_rx + slot_ahead >= slots_per_frame) ? ul_info.frame_rx + 1 : ul_info.frame_rx; + 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(); @@ -330,8 +327,7 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg) free_and_zero(ch_info); } - if (is_nr_DL_slot(mac->tdd_UL_DL_ConfigurationCommon, - ul_info.slot_rx)) { + if (is_nr_DL_slot(mac->tdd_UL_DL_ConfigurationCommon, slot)) { memset(&mac->dl_info, 0, sizeof(mac->dl_info)); mac->dl_info.cc_id = CC_id; mac->dl_info.gNB_index = gNB_id; @@ -345,9 +341,8 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg) if (pthread_mutex_unlock(&mac->mutex_dl_info)) abort(); - if (is_nr_UL_slot(mac->tdd_UL_DL_ConfigurationCommon, - ul_info.slot_tx, mac->frame_type)) { - LOG_D(NR_MAC, "Slot %d. calling nr_ue_ul_ind()\n", ul_info.slot_tx); + if (is_nr_UL_slot(mac->tdd_UL_DL_ConfigurationCommon, ul_info.slot, mac->frame_type)) { + LOG_D(NR_MAC, "Slot %d. calling nr_ue_ul_ind()\n", ul_info.slot); nr_ue_ul_scheduler(&ul_info); } process_queued_nr_nfapi_msgs(mac, sfn_slot); @@ -587,17 +582,12 @@ void processSlotTX(void *arg) { // [TODO] mapping right after NR initial sync if(UE->if_inst != NULL && UE->if_inst->ul_indication != NULL) { start_meas(&UE->ue_ul_indication_stats); - nr_uplink_indication_t ul_indication; - memset((void*)&ul_indication, 0, sizeof(ul_indication)); - - ul_indication.module_id = UE->Mod_id; - ul_indication.gNB_index = proc->gNB_id; - ul_indication.cc_id = UE->CC_id; - ul_indication.frame_rx = proc->frame_rx; - ul_indication.slot_rx = proc->nr_slot_rx; - ul_indication.frame_tx = proc->frame_tx; - ul_indication.slot_tx = proc->nr_slot_tx; - ul_indication.phy_data = &phy_data; + nr_uplink_indication_t ul_indication = {.module_id = UE->Mod_id, + .gNB_index = proc->gNB_id, + .cc_id = UE->CC_id, + .frame = proc->frame_tx, + .slot = proc->nr_slot_tx, + .phy_data = &phy_data}; UE->if_inst->ul_indication(&ul_indication); stop_meas(&UE->ue_ul_indication_stats); diff --git a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h index 70ef3d978f..b5a7a297c3 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h @@ -401,14 +401,13 @@ typedef struct { } fapi_nr_ul_config_request_pdu_t; typedef struct { - uint16_t sfn; - uint16_t slot; - uint8_t number_pdus; + int frame; + int slot; + int number_pdus; fapi_nr_ul_config_request_pdu_t ul_config_list[FAPI_NR_UL_CONFIG_LIST_NUM]; pthread_mutex_t mutex_ul_config; } fapi_nr_ul_config_request_t; - typedef struct { uint16_t rnti; uint16_t BWPSize; diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index f57d3f8479..834163d8ed 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -268,8 +268,6 @@ typedef enum { #endif typedef struct { int nb_search_space; - uint16_t sfn; - uint16_t slot; fapi_nr_dl_config_dci_dl_pdu_rel15_t pdcch_config[FAPI_NR_MAX_SS]; } NR_UE_PDCCH_CONFIG; @@ -330,7 +328,7 @@ typedef struct UE_NR_SCAN_INFO_s { } UE_NR_SCAN_INFO_t; /// Top-level PHY Data Structure for UE -typedef struct { +typedef struct PHY_VARS_NR_UE_s { /// \brief Module ID indicator for this instance uint8_t Mod_id; /// \brief Component carrier ID for this PHY instance diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c index 4272485c4b..20b5b81c95 100644 --- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c +++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c @@ -106,6 +106,8 @@ int8_t nr_ue_scheduled_response_stub(nr_scheduled_response_t *scheduled_response if(scheduled_response != NULL) { if (scheduled_response->ul_config != NULL) { + int frame = scheduled_response->ul_config->frame; + int slot = scheduled_response->ul_config->slot; fapi_nr_ul_config_request_t *ul_config = scheduled_response->ul_config; AssertFatal(ul_config->number_pdus < sizeof(ul_config->ul_config_list) / sizeof(ul_config->ul_config_list[0]), "Too many ul_config pdus %d", ul_config->number_pdus); @@ -118,8 +120,8 @@ int8_t nr_ue_scheduled_response_stub(nr_scheduled_response_t *scheduled_response case FAPI_NR_UL_CONFIG_TYPE_PRACH: { fapi_nr_ul_config_prach_pdu *prach_pdu = &ul_config->ul_config_list[i].prach_config_pdu; nfapi_nr_rach_indication_t *rach_ind = CALLOC(1, sizeof(*rach_ind)); - rach_ind->sfn = scheduled_response->frame; - rach_ind->slot = scheduled_response->slot; + 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)); @@ -151,12 +153,13 @@ int8_t nr_ue_scheduled_response_stub(nr_scheduled_response_t *scheduled_response nfapi_nr_crc_indication_t *crc_ind = CALLOC(1, sizeof(*crc_ind)); nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu = &ul_config->ul_config_list[i].pusch_config_pdu; if (scheduled_response->tx_request) { - AssertFatal(scheduled_response->tx_request->number_of_pdus < - sizeof(scheduled_response->tx_request->tx_request_body) / sizeof(scheduled_response->tx_request->tx_request_body[0]), - "Too many tx_req pdus %d", scheduled_response->tx_request->number_of_pdus); + AssertFatal( + scheduled_response->tx_request->number_of_pdus < sizeofArray(scheduled_response->tx_request->tx_request_body), + "Too many tx_req pdus %d", + scheduled_response->tx_request->number_of_pdus); rx_ind->header.message_id = NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION; - rx_ind->sfn = scheduled_response->ul_config->sfn; - rx_ind->slot = scheduled_response->ul_config->slot; + rx_ind->sfn = frame; + rx_ind->slot = slot; rx_ind->number_of_pdus = scheduled_response->tx_request->number_of_pdus; 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++) { @@ -176,15 +179,14 @@ int8_t nr_ue_scheduled_response_stub(nr_scheduled_response_t *scheduled_response crc_ind->header.message_id = NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION; crc_ind->number_crcs = scheduled_response->ul_config->number_pdus; - crc_ind->sfn = scheduled_response->ul_config->sfn; - crc_ind->slot = scheduled_response->ul_config->slot; + 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", - scheduled_response->frame, scheduled_response->slot, crc_ind->sfn, crc_ind->slot); + 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; @@ -192,9 +194,15 @@ int8_t nr_ue_scheduled_response_stub(nr_scheduled_response_t *scheduled_response crc_ind->crc_list[j].ul_cqi = 255; AssertFatal(mac->nr_ue_emul_l1.harq[crc_ind->crc_list[j].harq_id].active_ul_harq_sfn_slot == -1, "We did not send an active CRC when we should have!\n"); - mac->nr_ue_emul_l1.harq[crc_ind->crc_list[j].harq_id].active_ul_harq_sfn_slot = NFAPI_SFNSLOT2HEX(crc_ind->sfn, 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", - scheduled_response->frame, scheduled_response->slot, crc_ind->sfn, crc_ind->slot,pusch_config_pdu->mcs_index); + mac->nr_ue_emul_l1.harq[crc_ind->crc_list[j].harq_id].active_ul_harq_sfn_slot = + NFAPI_SFNSLOT2HEX(crc_ind->sfn, 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)) { @@ -225,8 +233,8 @@ int8_t nr_ue_scheduled_response_stub(nr_scheduled_response_t *scheduled_response 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 = scheduled_response->frame; - uci_ind->slot = scheduled_response->slot; + 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++) { @@ -294,7 +302,7 @@ int8_t nr_ue_scheduled_response_stub(nr_scheduled_response_t *scheduled_response static void configure_dlsch(NR_UE_DLSCH_t *dlsch0, NR_DL_UE_HARQ_t *harq_list, fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu, - module_id_t module_id, + NR_UE_MAC_INST_t *mac, int rnti) { const uint8_t current_harq_pid = dlsch_config_pdu->harq_process_nbr; @@ -316,7 +324,7 @@ static void configure_dlsch(NR_UE_DLSCH_t *dlsch0, // dlsch0_harq->status not ACTIVE due to false retransmission // Reset the following flag to skip PDSCH procedures in that case and retrasmit harq status dlsch0->active = false; - update_harq_status(module_id, current_harq_pid, dlsch0_harq->ack); + update_harq_status(mac, current_harq_pid, dlsch0_harq->ack); } } @@ -383,7 +391,6 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ module_id_t module_id = scheduled_response->module_id; uint8_t cc_id = scheduled_response->CC_id; - int slot = scheduled_response->slot; // Note: we have to handle the thread IDs for this. To be revisited completely. NR_UE_CSI_IM *csiim_vars = PHY_vars_UE_g[module_id][cc_id]->csiim_vars[0]; @@ -392,6 +399,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ if(scheduled_response->dl_config != NULL){ fapi_nr_dl_config_request_t *dl_config = scheduled_response->dl_config; + int slot = dl_config->slot; fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu; fapi_nr_dl_config_dci_dl_pdu_rel15_t *pdcch_config; fapi_nr_dl_config_csiim_pdu_rel15_t *csiim_config_pdu; @@ -400,8 +408,11 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ for (int i = 0; i < dl_config->number_pdus; ++i){ AssertFatal(dl_config->number_pdus < FAPI_NR_DL_CONFIG_LIST_NUM,"dl_config->number_pdus %d out of bounds\n",dl_config->number_pdus); AssertFatal(dl_config->dl_config_list[i].pdu_type<=FAPI_NR_DL_CONFIG_TYPES,"pdu_type %d > 2\n",dl_config->dl_config_list[i].pdu_type); - LOG_D(PHY, "In %s: frame %d slot %d received 1 DL %s PDU of %d total DL PDUs:\n", - __FUNCTION__, scheduled_response->frame, slot, dl_pdu_type[dl_config->dl_config_list[i].pdu_type - 1], dl_config->number_pdus); + LOG_D(PHY, + "slot %d received 1 DL %s PDU of %d total DL PDUs:\n", + slot, + dl_pdu_type[dl_config->dl_config_list[i].pdu_type - 1], + dl_config->number_pdus); switch(dl_config->dl_config_list[i].pdu_type) { case FAPI_NR_DL_CONFIG_TYPE_DCI: @@ -412,8 +423,6 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ pdcch_config = &dl_config->dl_config_list[i].dci_config_pdu.dci_config_rel15; memcpy((void*)&phy_pdcch_config->pdcch_config[phy_pdcch_config->nb_search_space],(void*)pdcch_config,sizeof(*pdcch_config)); phy_pdcch_config->nb_search_space = phy_pdcch_config->nb_search_space + 1; - phy_pdcch_config->sfn = scheduled_response->frame; - phy_pdcch_config->slot = slot; LOG_D(PHY,"Number of DCI SearchSpaces %d\n",phy_pdcch_config->nb_search_space); break; case FAPI_NR_DL_CONFIG_TYPE_CSI_IM: @@ -431,7 +440,10 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ NR_UE_DLSCH_t *dlsch0 = &((nr_phy_data_t *)scheduled_response->phy_data)->dlsch[0]; dlsch0->rnti_type = TYPE_RA_RNTI_; dlsch0->dlsch_config = *dlsch_config_pdu; - configure_dlsch(dlsch0, PHY_vars_UE_g[module_id][cc_id]->dl_harq_processes[0], dlsch_config_pdu, module_id, + configure_dlsch(dlsch0, + PHY_vars_UE_g[module_id][cc_id]->dl_harq_processes[0], + dlsch_config_pdu, + get_mac_inst(0), dl_config->dl_config_list[i].dlsch_config_pdu.rnti); } break; case FAPI_NR_DL_CONFIG_TYPE_SI_DLSCH: { @@ -439,7 +451,10 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ NR_UE_DLSCH_t *dlsch0 = &((nr_phy_data_t *)scheduled_response->phy_data)->dlsch[0]; dlsch0->rnti_type = TYPE_SI_RNTI_; dlsch0->dlsch_config = *dlsch_config_pdu; - configure_dlsch(dlsch0, PHY_vars_UE_g[module_id][cc_id]->dl_harq_processes[0], dlsch_config_pdu, module_id, + configure_dlsch(dlsch0, + PHY_vars_UE_g[module_id][cc_id]->dl_harq_processes[0], + dlsch_config_pdu, + get_mac_inst(0), dl_config->dl_config_list[i].dlsch_config_pdu.rnti); } break; case FAPI_NR_DL_CONFIG_TYPE_DLSCH: { @@ -447,7 +462,10 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ NR_UE_DLSCH_t *dlsch0 = &((nr_phy_data_t *)scheduled_response->phy_data)->dlsch[0]; dlsch0->rnti_type = TYPE_C_RNTI_; dlsch0->dlsch_config = *dlsch_config_pdu; - configure_dlsch(dlsch0, PHY_vars_UE_g[module_id][cc_id]->dl_harq_processes[0], dlsch_config_pdu, module_id, + configure_dlsch(dlsch0, + PHY_vars_UE_g[module_id][cc_id]->dl_harq_processes[0], + dlsch_config_pdu, + get_mac_inst(0), dl_config->dl_config_list[i].dlsch_config_pdu.rnti); } break; case FAPI_NR_CONFIG_TA_COMMAND: @@ -461,15 +479,28 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ if (scheduled_response->ul_config != NULL){ fapi_nr_ul_config_request_t *ul_config = scheduled_response->ul_config; + int slot = ul_config->slot; int pdu_done = 0; pthread_mutex_lock(&ul_config->mutex_ul_config); - LOG_D(PHY, "%d.%d ul S ul_config %p pdu_done %d number_pdus %d\n", scheduled_response->frame, slot, ul_config, pdu_done, ul_config->number_pdus); + LOG_D(PHY, + "%d.%d ul S ul_config %p pdu_done %d number_pdus %d\n", + ul_config->frame, + slot, + ul_config, + pdu_done, + ul_config->number_pdus); for (int i = 0; i < ul_config->number_pdus; ++i){ AssertFatal(ul_config->ul_config_list[i].pdu_type <= FAPI_NR_UL_CONFIG_TYPES,"pdu_type %d out of bounds\n",ul_config->ul_config_list[i].pdu_type); - LOG_D(PHY, "[%d.%d] i %d: processing %s PDU of %d total UL PDUs (ul_config %p) \n", - scheduled_response->frame, slot, i, ul_pdu_type[ul_config->ul_config_list[i].pdu_type - 1], ul_config->number_pdus, ul_config); + LOG_D(PHY, + "[%d.%d] i %d: processing %s PDU of %d total UL PDUs (ul_config %p) \n", + ul_config->frame, + slot, + i, + ul_pdu_type[ul_config->ul_config_list[i].pdu_type - 1], + ul_config->number_pdus, + ul_config); uint8_t pdu_type = ul_config->ul_config_list[i].pdu_type, current_harq_pid, gNB_id = 0; /* PRACH */ @@ -478,7 +509,14 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu; /* PUCCH */ fapi_nr_ul_config_pucch_pdu *pucch_config_pdu; - LOG_D(PHY, "%d.%d ul B ul_config %p t %d pdu_done %d number_pdus %d\n", scheduled_response->frame, slot, ul_config, pdu_type, pdu_done, ul_config->number_pdus); + LOG_D(PHY, + "%d.%d ul B ul_config %p t %d pdu_done %d number_pdus %d\n", + ul_config->frame, + slot, + ul_config, + pdu_type, + pdu_done, + ul_config->number_pdus); /* SRS */ fapi_nr_ul_config_srs_pdu *srs_config_pdu; @@ -505,7 +543,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ if ((tx_req_body->pdu_index == i) && (tx_req_body->pdu_length > 0)) { LOG_D(PHY, "%d.%d Copying %d bytes to harq_process_ul_ue->a (harq_pid %d)\n", - scheduled_response->frame, + ul_config->frame, slot, tx_req_body->pdu_length, current_harq_pid); @@ -519,7 +557,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ pdu_done++; LOG_D(PHY, "%d.%d ul A ul_config %p t %d pdu_done %d number_pdus %d\n", - scheduled_response->frame, + ul_config->frame, slot, ul_config, pdu_type, @@ -538,7 +576,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ pucch_config_pdu = &ul_config->ul_config_list[i].pucch_config_pdu; for (int j = 0; j < 2; j++) { if (pucch_vars->active[j] == false) { - LOG_D(PHY, "%d.%d Copying pucch pdu to UE PHY\n", scheduled_response->frame, slot); + LOG_D(PHY, "%d.%d Copying pucch pdu to UE PHY\n", ul_config->frame, slot); memcpy((void *)&(pucch_vars->pucch_pdu[j]), (void *)pucch_config_pdu, sizeof(fapi_nr_ul_config_pucch_pdu)); pucch_vars->active[j] = true; found = true; @@ -546,7 +584,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ pdu_done++; LOG_D(PHY, "%d.%d ul A ul_config %p t %d pdu_done %d number_pdus %d\n", - scheduled_response->frame, + ul_config->frame, slot, ul_config, pdu_type, @@ -570,7 +608,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ pdu_done++; LOG_D(PHY, "%d.%d ul A ul_config %p t %d pdu_done %d number_pdus %d\n", - scheduled_response->frame, + ul_config->frame, slot, ul_config, pdu_type, @@ -582,7 +620,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ pdu_done++; // count the no of pdu processed LOG_D(PHY, "%d.%d ul A ul_config %p t %d pdu_done %d number_pdus %d\n", - scheduled_response->frame, + ul_config->frame, slot, ul_config, pdu_type, @@ -606,7 +644,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ pdu_done++; // count the no of pdu processed LOG_D(PHY, "%d.%d ul A ul_config %p t %d pdu_done %d number_pdus %d\n", - scheduled_response->frame, + ul_config->frame, slot, ul_config, pdu_type, @@ -621,10 +659,10 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ if (pdu_done == ul_config->number_pdus) { if (scheduled_response->tx_request) scheduled_response->tx_request->number_of_pdus = 0; - ul_config->sfn = 0; + ul_config->frame = 0; ul_config->slot = 0; ul_config->number_pdus = 0; - LOG_D(PHY, "%d.%d clear ul_config %p\n", scheduled_response->frame, slot, ul_config); + LOG_D(PHY, "%d.%d clear ul_config %p\n", ul_config->frame, slot, ul_config); memset(ul_config->ul_config_list, 0, sizeof(ul_config->ul_config_list)); } diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.h b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.h index d83c014fa6..65ca845526 100644 --- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.h +++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.h @@ -51,6 +51,6 @@ int8_t nr_ue_phy_config_request(nr_phy_config_t *phy_config); \param synch_request including target_Nid_cell*/ void nr_ue_synch_request(nr_synch_request_t *synch_request); -void update_harq_status(module_id_t module_id, uint8_t harq_pid, uint8_t ack_nack); +void update_harq_status(NR_UE_MAC_INST_t *mac, uint8_t harq_pid, uint8_t ack_nack); #endif diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c index 8ce2e3f116..e802adda22 100644 --- a/openair1/SIMULATION/NR_PHY/dlsim.c +++ b/openair1/SIMULATION/NR_PHY/dlsim.c @@ -874,23 +874,9 @@ int main(int argc, char **argv) UE_mac->ra.ra_state = RA_SUCCEEDED; nr_dcireq_t dcireq; - nr_scheduled_response_t scheduled_response; nr_phy_data_t phy_data = {0}; - - memset((void*)&dcireq,0,sizeof(dcireq)); - memset((void*)&scheduled_response,0,sizeof(scheduled_response)); - dcireq.module_id = 0; - dcireq.gNB_index = 0; - dcireq.cc_id = 0; - - scheduled_response.dl_config = &dcireq.dl_config_req; - scheduled_response.ul_config = &dcireq.ul_config_req; - scheduled_response.tx_request = NULL; - scheduled_response.module_id = 0; - scheduled_response.CC_id = 0; - scheduled_response.frame = frame; - scheduled_response.slot = slot; - scheduled_response.phy_data = &phy_data; + fapi_nr_dl_config_request_t dl_config = {.sfn = frame, .slot = slot}; + nr_scheduled_response_t scheduled_response = {.dl_config = &dl_config, .phy_data = &phy_data, .mac = UE_mac}; nr_ue_phy_config_request(&UE_mac->phy_config); //NR_COMMON_channels_t *cc = RC.nrmac[0]->common_channels; diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index 9b227f3b7a..dfa2c5a996 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -718,7 +718,6 @@ int main(int argc, char *argv[]) uint32_t errors_decoding = 0; - nr_scheduled_response_t scheduled_response={0}; fapi_nr_ul_config_request_t ul_config={0}; fapi_nr_tx_request_t tx_req={0}; @@ -1073,15 +1072,9 @@ int main(int argc, char *argv[]) nr_schedule_response(Sched_INFO); // --------- setting parameters for UE -------- - - scheduled_response.module_id = 0; - scheduled_response.CC_id = 0; - scheduled_response.frame = frame; - scheduled_response.slot = slot; - scheduled_response.dl_config = NULL; - scheduled_response.ul_config = &ul_config; - scheduled_response.tx_request = &tx_req; - scheduled_response.phy_data = (void *)&phy_data; + nr_scheduled_response_t scheduled_response = {.ul_config = &ul_config, + .tx_request = &tx_req, + .phy_data = (void *)&phy_data}; // Config UL TX PDU tx_req.slot = slot; diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h index 378411abca..756273769c 100644 --- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h +++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h @@ -450,7 +450,7 @@ typedef struct { } NR_BWP_PDCCH_t; /*!\brief Top level UE MAC structure */ -typedef struct { +typedef struct NR_UE_MAC_INST_s { module_id_t ue_id; NR_UE_L2_STATE_t state; int servCellIndex; diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c index 354d6f0b88..bb65c03c56 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c @@ -64,22 +64,33 @@ void fill_ul_config(fapi_nr_ul_config_request_t *ul_config, frame_t frame_tx, in AssertFatal(ul_config->number_pdus < sizeof(ul_config->ul_config_list) / sizeof(ul_config->ul_config_list[0]), "Number of PDUS in ul_config = %d > ul_config_list num elements", ul_config->number_pdus); // clear ul_config for new frame/slot - if ((ul_config->slot != slot_tx || ul_config->sfn != frame_tx) && - ul_config->number_pdus != 0 && - !get_softmodem_params()->emulate_l1) { - LOG_D(MAC, "%d.%d %d.%d f clear ul_config %p t %d pdu %d\n", frame_tx, slot_tx, ul_config->sfn, ul_config->slot, ul_config, pdu_type, ul_config->number_pdus); + if ((ul_config->slot != slot_tx || ul_config->frame != frame_tx) && ul_config->number_pdus != 0 + && !get_softmodem_params()->emulate_l1) { + LOG_D(MAC, + "%d.%d %d.%d f clear ul_config %p t %d pdu %d\n", + frame_tx, + slot_tx, + ul_config->frame, + ul_config->slot, + ul_config, + pdu_type, + ul_config->number_pdus); ul_config->number_pdus = 0; - memset(ul_config->ul_config_list, 0, sizeof(ul_config->ul_config_list)); + memset(ul_config->ul_config_list, 0, sizeof(ul_config->ul_config_list)); } ul_config->ul_config_list[ul_config->number_pdus].pdu_type = pdu_type; //ul_config->slot = slot_tx; //ul_config->sfn = frame_tx; ul_config->slot = slot_tx; - ul_config->sfn = frame_tx; + ul_config->frame = frame_tx; ul_config->number_pdus++; - LOG_D(NR_MAC, "In %s: Set config request for UL transmission in [%d.%d], number of UL PDUs: %d\n", __FUNCTION__, ul_config->sfn, ul_config->slot, ul_config->number_pdus); - + LOG_D(NR_MAC, + "In %s: Set config request for UL transmission in [%d.%d], number of UL PDUs: %d\n", + __FUNCTION__, + ul_config->frame, + ul_config->slot, + ul_config->number_pdus); } void fill_scheduled_response(nr_scheduled_response_t *scheduled_response, @@ -97,8 +108,14 @@ void fill_scheduled_response(nr_scheduled_response_t *scheduled_response, scheduled_response->tx_request = tx_request; scheduled_response->module_id = mod_id; scheduled_response->CC_id = cc_id; - scheduled_response->frame = frame; - scheduled_response->slot = slot; + if (dl_config) { + dl_config->sfn = frame; + dl_config->slot = slot; + } + if (ul_config) { + ul_config->frame = frame; + ul_config->slot = slot; + } scheduled_response->phy_data = phy_data; } @@ -988,8 +1005,8 @@ void nr_ue_dl_scheduler(nr_downlink_indication_t *dl_info) void nr_ue_ul_scheduler(nr_uplink_indication_t *ul_info) { int cc_id = ul_info->cc_id; - frame_t frame_tx = ul_info->frame_tx; - slot_t slot_tx = ul_info->slot_tx; + frame_t frame_tx = ul_info->frame; + slot_t slot_tx = ul_info->slot; module_id_t mod_id = ul_info->module_id; uint32_t gNB_index = ul_info->gNB_index; @@ -1013,9 +1030,14 @@ void nr_ue_ul_scheduler(nr_uplink_indication_t *ul_info) // AND if a UL grant (UL DCI or Msg3) has been received (as indicated by num_pdus) if (ul_config) { pthread_mutex_lock(&ul_config->mutex_ul_config); - if ((ul_info->slot_tx == ul_config->slot && ul_info->frame_tx == ul_config->sfn) && ul_config->number_pdus > 0){ - - LOG_D(NR_MAC, "[%d.%d]: number of UL PDUs: %d with UL transmission in [%d.%d]\n", frame_tx, slot_tx, ul_config->number_pdus, ul_config->sfn, ul_config->slot); + if (frame_tx == ul_config->frame && ul_config->number_pdus > 0) { + LOG_D(NR_MAC, + "[%d.%d]: number of UL PDUs: %d with UL transmission in [%d.%d]\n", + frame_tx, + slot_tx, + ul_config->number_pdus, + ul_config->frame, + ul_config->slot); uint8_t ulsch_input_buffer_array[NFAPI_MAX_NUM_UL_PDU][MAX_ULSCH_PAYLOAD_BYTES]; nr_scheduled_response_t scheduled_response; @@ -1062,11 +1084,11 @@ void nr_ue_ul_scheduler(nr_uplink_indication_t *ul_info) if (ra->ra_state == WAIT_CONTENTION_RESOLUTION && !ra->cfra){ LOG_I(NR_MAC,"[RAPROC][%d.%d] RA-Msg3 retransmitted\n", frame_tx, slot_tx); // 38.321 restart the ra-ContentionResolutionTimer at each HARQ retransmission in the first symbol after the end of the Msg3 transmission - nr_Msg3_transmitted(ul_info->module_id, ul_info->cc_id, ul_info->frame_tx, ul_info->slot_tx, ul_info->gNB_index); + nr_Msg3_transmitted(ul_info->module_id, ul_info->cc_id, ul_info->frame, ul_info->slot, ul_info->gNB_index); } if (ra->ra_state == WAIT_RAR && !ra->cfra){ LOG_A(NR_MAC, "[RAPROC][%d.%d] RA-Msg3 transmitted\n", frame_tx, slot_tx); - nr_Msg3_transmitted(ul_info->module_id, ul_info->cc_id, ul_info->frame_tx, ul_info->slot_tx, ul_info->gNB_index); + nr_Msg3_transmitted(ul_info->module_id, ul_info->cc_id, frame_tx, slot_tx, ul_info->gNB_index); } } } diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c index 1a53d360f5..ae3914ba3c 100644 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c @@ -747,11 +747,8 @@ void check_and_process_dci(nfapi_nr_dl_tti_request_t *dl_tti_request, mac->frame_type) && mac->ra.ra_state != RA_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 = { - .frame_rx = frame, - .slot_rx = slot, - .slot_tx = (slot + slot_ahead) % slots_per_frame, - .frame_tx = (ul_info.slot_rx + slot_ahead >= slots_per_frame) ? ul_info.frame_rx + 1 : ul_info.frame_rx}; + 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(&ul_info); } } @@ -1033,11 +1030,16 @@ void *nrue_standalone_pnf_task(void *context) } // L2 Abstraction Layer -int handle_bcch_bch(module_id_t module_id, int cc_id, - unsigned int gNB_index, void *phy_data, uint8_t *pduP, - unsigned int additional_bits, - uint32_t ssb_index, uint32_t ssb_length, - uint16_t ssb_start_subcarrier, uint16_t cell_id) +static int handle_bcch_bch(module_id_t module_id, + int cc_id, + unsigned int gNB_index, + void *phy_data, + uint8_t *pduP, + unsigned int additional_bits, + uint32_t ssb_index, + uint32_t ssb_length, + uint16_t ssb_start_subcarrier, + uint16_t cell_id) { NR_UE_MAC_INST_t *mac = get_mac_inst(module_id); mac->mib_ssb = ssb_index; @@ -1052,19 +1054,28 @@ int handle_bcch_bch(module_id_t module_id, int cc_id, } // L2 Abstraction Layer -int handle_bcch_dlsch(module_id_t module_id, int cc_id, unsigned int gNB_index, uint8_t ack_nack, uint8_t *pduP, uint32_t pdu_len) +static int handle_bcch_dlsch(module_id_t module_id, + int cc_id, + unsigned int gNB_index, + uint8_t ack_nack, + uint8_t *pduP, + uint32_t pdu_len) { return nr_ue_decode_BCCH_DL_SCH(module_id, cc_id, gNB_index, ack_nack, pduP, pdu_len); } // L2 Abstraction Layer -int handle_dci(module_id_t module_id, int cc_id, unsigned int gNB_index, frame_t frame, int slot, fapi_nr_dci_indication_pdu_t *dci){ - +static int handle_dci(module_id_t module_id, + int cc_id, + unsigned int gNB_index, + frame_t frame, + int slot, + fapi_nr_dci_indication_pdu_t *dci) +{ return nr_ue_process_dci_indication_pdu(module_id, cc_id, gNB_index, frame, slot, dci); - } -void handle_ssb_meas(NR_UE_MAC_INST_t *mac, uint8_t ssb_index, int16_t rsrp_dbm) +static void handle_ssb_meas(NR_UE_MAC_INST_t *mac, uint8_t ssb_index, int16_t rsrp_dbm) { mac->ssb_measurements.ssb_index = ssb_index; mac->ssb_measurements.ssb_rsrp_dBm = rsrp_dbm; @@ -1072,7 +1083,7 @@ void handle_ssb_meas(NR_UE_MAC_INST_t *mac, uint8_t ssb_index, int16_t rsrp_dbm) // L2 Abstraction Layer // Note: sdu should always be processed because data and timing advance updates are transmitted by the UE -static int8_t handle_dlsch(nr_downlink_indication_t *dl_info, int pdu_id) +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 @@ -1081,7 +1092,7 @@ static int8_t handle_dlsch(nr_downlink_indication_t *dl_info, int pdu_id) if (get_softmodem_params()->emulate_l1) dl_info->rx_ind->rx_indication_body[pdu_id].pdsch_pdu.harq_pid = g_harq_pid; - update_harq_status(dl_info->module_id, + update_harq_status(mac, dl_info->rx_ind->rx_indication_body[pdu_id].pdsch_pdu.harq_pid, dl_info->rx_ind->rx_indication_body[pdu_id].pdsch_pdu.ack_nack); if(dl_info->rx_ind->rx_indication_body[pdu_id].pdsch_pdu.ack_nack) @@ -1090,7 +1101,7 @@ static int8_t handle_dlsch(nr_downlink_indication_t *dl_info, int pdu_id) return 0; } -void handle_rlm(rlm_t rlm_result, int frame, module_id_t module_id) +static void handle_rlm(rlm_t rlm_result, int frame, module_id_t module_id) { if (rlm_result == RLM_no_monitoring) return; @@ -1098,15 +1109,17 @@ void handle_rlm(rlm_t rlm_result, int frame, module_id_t module_id) nr_mac_rrc_sync_ind(module_id, frame, is_sync); } -int8_t handle_csirs_measurements(module_id_t module_id, frame_t frame, int slot, fapi_nr_csirs_measurements_t *csirs_measurements) +static int8_t handle_csirs_measurements(module_id_t module_id, + frame_t frame, + int slot, + fapi_nr_csirs_measurements_t *csirs_measurements) { handle_rlm(csirs_measurements->radiolink_monitoring, frame, module_id); return nr_ue_process_csirs_measurements(module_id, frame, slot, csirs_measurements); } -void update_harq_status(module_id_t module_id, uint8_t harq_pid, uint8_t ack_nack) +void update_harq_status(NR_UE_MAC_INST_t *mac, uint8_t harq_pid, uint8_t ack_nack) { - NR_UE_MAC_INST_t *mac = get_mac_inst(module_id); NR_UE_HARQ_STATUS_t *current_harq = &mac->dl_harq_info[harq_pid]; if (current_harq->active) { @@ -1127,8 +1140,9 @@ void update_harq_status(module_id_t module_id, uint8_t harq_pid, uint8_t ack_nac int nr_ue_ul_indication(nr_uplink_indication_t *ul_info) { - - pthread_mutex_lock(&mac_IF_mutex); + int ret = pthread_mutex_lock(&mac_IF_mutex); + AssertFatal(!ret, "mutex failed %d\n", ret); + LOG_D(PHY, "Locked in ul, slot %d\n", ul_info->slot); module_id_t module_id = ul_info->module_id; NR_UE_MAC_INST_t *mac = get_mac_inst(module_id); @@ -1136,9 +1150,8 @@ int nr_ue_ul_indication(nr_uplink_indication_t *ul_info) LOG_T(NR_MAC, "In %s():%d not calling scheduler mac->ra.ra_state = %d\n", __FUNCTION__, __LINE__, mac->ra.ra_state); - if (mac->phy_config_request_sent && is_nr_UL_slot(mac->tdd_UL_DL_ConfigurationCommon, ul_info->slot_tx, mac->frame_type)) + if (mac->phy_config_request_sent && is_nr_UL_slot(mac->tdd_UL_DL_ConfigurationCommon, ul_info->slot, mac->frame_type)) nr_ue_ul_scheduler(ul_info); - pthread_mutex_unlock(&mac_IF_mutex); return 0; @@ -1195,7 +1208,9 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info) for (int i = 0; i < dl_info->rx_ind->number_pdus; ++i) { fapi_nr_rx_indication_body_t rx_indication_body = dl_info->rx_ind->rx_indication_body[i]; - LOG_D(NR_MAC, "Sending DL indication to MAC. 1 PDU type %d of %d total number of PDUs \n", + LOG_D(NR_MAC, + "slot %d Sending DL indication to MAC. 1 PDU type %d of %d total number of PDUs \n", + dl_info->slot, rx_indication_body.pdu_type, dl_info->rx_ind->number_pdus); @@ -1225,10 +1240,10 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info) rx_indication_body.pdsch_pdu.pdu_length)) << FAPI_NR_RX_PDU_TYPE_SIB; break; case FAPI_NR_RX_PDU_TYPE_DLSCH: - ret_mask |= (handle_dlsch(dl_info, i)) << FAPI_NR_RX_PDU_TYPE_DLSCH; + ret_mask |= (handle_dlsch(mac, dl_info, i)) << FAPI_NR_RX_PDU_TYPE_DLSCH; break; case FAPI_NR_RX_PDU_TYPE_RAR: - ret_mask |= (handle_dlsch(dl_info, i)) << FAPI_NR_RX_PDU_TYPE_RAR; + ret_mask |= (handle_dlsch(mac, dl_info, i)) << FAPI_NR_RX_PDU_TYPE_RAR; if (!dl_info->rx_ind->rx_indication_body[i].pdsch_pdu.ack_nack) LOG_W(PHY, "Received a RAR-Msg2 but LDPC decode failed\n"); else diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h index 5be2d3c03c..b07b527fa1 100644 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h @@ -95,14 +95,10 @@ typedef struct { uint32_t gNB_index; /// component carrier id int cc_id; - /// frame - frame_t frame_rx; - /// slot rx - uint32_t slot_rx; /// frame tx - frame_t frame_tx; + frame_t frame; /// slot tx - uint32_t slot_tx; + uint32_t slot; /// dci reception indication structure fapi_nr_dci_indication_t *dci_ind; @@ -142,17 +138,13 @@ typedef struct { // Downlink subframe P7 - +struct PHY_VARS_NR_UE_s; +struct NR_UE_MAC_INST_s; typedef struct { /// module id module_id_t module_id; /// component carrier id int CC_id; - /// frame - frame_t frame; - /// slot - int slot; - /// NR UE FAPI-like P7 message, direction: L2 to L1 /// downlink transmission configuration request structure fapi_nr_dl_config_request_t *dl_config; @@ -172,6 +164,7 @@ typedef struct { /// PHY data structure initially passed on to L2 via the nr_downlink_indication_t and /// returned to L1 via nr_scheduled_response_t void *phy_data; + struct NR_UE_MAC_INST_s *mac; } nr_scheduled_response_t; typedef struct { @@ -335,33 +328,5 @@ int nr_ue_ul_indication(nr_uplink_indication_t *ul_info); int nr_ue_dcireq(nr_dcireq_t *dcireq); -// TODO check -/**\brief handle BCCH-BCH message from dl_indication - \param phy_data PHY structure to be filled in by the callee in the FAPI call (L1 caller -> indication to L2 -> FAPI call to L1 callee) - \param pduP pointer to bch pdu - \param additional_bits corresponding to 38.212 ch.7 - \param ssb_index SSB index within 0 - (L_ssb-1) corresponding to 38.331 ch.13 parameter i - \param ssb_length corresponding to L1 parameter L_ssb - \param cell_id cell id */ -int handle_bcch_bch(module_id_t module_id, - int cc_id, - unsigned int gNB_index, - void *phy_data, - uint8_t *pduP, - unsigned int additional_bits, - uint32_t ssb_index, - uint32_t ssb_length, - uint16_t ssb_start_subcarrier, - uint16_t cell_id); - -// TODO check -/**\brief handle BCCH-DL-SCH message from dl_indication - \param pdu_len length(bytes) of pdu - \param pduP pointer to pdu*/ -int handle_bcch_dlsch(module_id_t module_id, int cc_id, unsigned int gNB_index, uint8_t ack_nack, uint8_t *pduP, uint32_t pdu_len); - -int handle_dci(module_id_t module_id, int cc_id, unsigned int gNB_index, frame_t frame, int slot, fapi_nr_dci_indication_pdu_t *dci); - - #endif