From 9b96dd2a5f787fe780e68fc11ba52cbaae7e8bec Mon Sep 17 00:00:00 2001 From: Melissa Elkadi Date: Mon, 28 Jun 2021 12:39:28 -0700 Subject: [PATCH] Unqueue based on sfn_slot Also, added functionality to fill tx_req in NR UE when a DCI is received after the slot indication. --- executables/nr-ue.c | 64 ++++++++++++------- .../nfapi/public_inc/nfapi_nr_interface_scf.h | 6 ++ openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c | 37 +++++++++-- 3 files changed, 78 insertions(+), 29 deletions(-) diff --git a/executables/nr-ue.c b/executables/nr-ue.c index a216418a58..01f6ea1244 100644 --- a/executables/nr-ue.c +++ b/executables/nr-ue.c @@ -187,6 +187,27 @@ static void reset_queue(queue_t *q) } } +static bool sfn_slot_matcher(void *wanted, void *candidate) +{ + nr_queue_candidate *ind = candidate; + int sfn_sf = *(int*)wanted; + + if (NFAPI_SFNSLOT2SFN(sfn_sf) == ind->rach_ind.sfn && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->rach_ind.slot) + { + return true; + } + else if (NFAPI_SFNSLOT2SFN(sfn_sf) == ind->rx_ind.sfn && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->rx_ind.slot) + { + return true; + } + else if (NFAPI_SFNSLOT2SFN(sfn_sf) == ind->crc_ind.sfn && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->crc_ind.slot) + { + return true; + } + + return false; +} + static void *NRUE_phy_stub_standalone_pnf_task(void *arg) { LOG_I(MAC, "Clearing Queues\n"); @@ -286,11 +307,12 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg) } } - if (slot == 19) + nfapi_nr_rach_indication_t *rach_ind = unqueue_matching(&nr_rach_ind_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &sfn_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 (rach_ind && rach_ind->number_of_pdus > 0) { - nfapi_nr_rach_indication_t *rach_ind = get_queue(&nr_rach_ind_queue); - if (rach_ind != NULL && rach_ind->number_of_pdus > 0 && (rach_ind->sfn == frame && rach_ind->slot == slot)) - { NR_UL_IND_t UL_INFO = { .rach_ind = *rach_ind, }; @@ -301,30 +323,24 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg) } free(rach_ind->pdu_list); nr_Msg1_transmitted(mod_id, CC_id, frame, gNB_id); - } } - if (slot == 17) + if (rx_ind && rx_ind->number_of_pdus > 0) { - nfapi_nr_rx_data_indication_t *rx_ind = get_queue(&nr_rx_ind_queue); - if (rx_ind != NULL && rx_ind->number_of_pdus > 0 && (rx_ind->sfn == frame && rx_ind->slot == slot)) - { - 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); - } - nfapi_nr_crc_indication_t *crc_ind = get_queue(&nr_crc_ind_queue); - if (crc_ind != NULL && crc_ind->number_crcs > 0 && (crc_ind->sfn == frame && crc_ind->slot == slot)) - { - 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); - } + 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); } + if (crc_ind && crc_ind->number_crcs > 0) + { + 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); + } } return NULL; } diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h index bd4a52e55a..d1e9c9df2d 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h @@ -1761,4 +1761,10 @@ typedef struct } nfapi_nr_rach_indication_t; +typedef union { + nfapi_nr_rach_indication_t rach_ind; + nfapi_nr_rx_data_indication_t rx_ind; + nfapi_nr_crc_indication_t crc_ind; +} nr_queue_candidate; + #endif diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c index daeca818f0..d10c53400b 100644 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c @@ -376,7 +376,10 @@ static 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) { + frame_t frame = 0; + int slot = 0; NR_UE_MAC_INST_t *mac = get_mac_inst(0); + if (mac->scc == NULL) { return; @@ -384,19 +387,29 @@ static void check_and_process_dci(nfapi_nr_dl_tti_request_t *dl_tti_request, if (dl_tti_request) { - LOG_I(NR_PHY, "[%d, %d] dl_tti_request\n", dl_tti_request->SFN, dl_tti_request->Slot); + frame = dl_tti_request->SFN; + slot = dl_tti_request->Slot; + LOG_I(NR_PHY, "[%d, %d] dl_tti_request\n", frame, slot); copy_dl_tti_req_to_dl_info(&mac->dl_info, dl_tti_request); } - if (tx_data_request) + else if (tx_data_request) { - LOG_I(NR_PHY, "[%d, %d] PDSCH in tx_request\n", tx_data_request->SFN, tx_data_request->Slot); + frame = tx_data_request->SFN; + slot = tx_data_request->Slot; + LOG_I(NR_PHY, "[%d, %d] PDSCH in tx_request\n", frame, slot); copy_tx_data_req_to_dl_info(&mac->dl_info, tx_data_request); } - if (ul_dci_request) + else if (ul_dci_request) { - LOG_I(NR_PHY, "[%d, %d] ul_dci_request\n", ul_dci_request->SFN, ul_dci_request->Slot); + frame = ul_dci_request->SFN; + slot = ul_dci_request->Slot; + LOG_I(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 + { + return; + } NR_UL_TIME_ALIGNMENT_t ul_time_alignment; @@ -404,6 +417,20 @@ static void check_and_process_dci(nfapi_nr_dl_tti_request_t *dl_tti_request, fill_dci_from_dl_config(&mac->dl_info, &mac->dl_config_request); nr_ue_dl_indication(&mac->dl_info, &ul_time_alignment); + // 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; + memset(&ul_info, 0, sizeof(ul_info)); + int slots_per_frame = 20; //30 kHZ subcarrier spacing + int slot_ahead = 6; // Melissa lets make this dynamic + 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; + if (mac->scc && is_nr_UL_slot(mac->scc, ul_info.slot_tx)) + { + nr_ue_ul_indication(&ul_info); + } + #if 0 //Melissa may want to free this free(dl_info.dci_ind);