diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c index 99292994b5..3ee58f8736 100644 --- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c +++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c @@ -74,16 +74,19 @@ int8_t nr_ue_scheduled_response_stub(nr_scheduled_response_t *scheduled_response rx_ind->sfn = scheduled_response->tx_request->sfn; rx_ind->number_of_pdus = scheduled_response->tx_request->number_of_pdus; - fapi_nr_tx_request_body_t *tx_req_body = &scheduled_response->tx_request->tx_request_body[i]; - rx_ind->pdu_list = CALLOC(1, sizeof(*rx_ind->pdu_list)); - rx_ind->pdu_list[i].handle = pusch_config_pdu->handle; - rx_ind->pdu_list[i].harq_id = pusch_config_pdu->pusch_data.harq_process_id; - rx_ind->pdu_list[i].pdu = tx_req_body->pdu; - rx_ind->pdu_list[i].pdu_length = tx_req_body->pdu_length; - rx_ind->pdu_list[i].rnti = pusch_config_pdu->rnti; - rx_ind->pdu_list[i].timing_advance = 0; - rx_ind->pdu_list[i].ul_cqi = 27; - LOG_I(PHY, "In %s: Filled rx_indwith tx_req \n", __FUNCTION__); + rx_ind->pdu_list = CALLOC(1, sizeof(*rx_ind->pdu_list) * rx_ind->number_of_pdus); + for (int j = 0; j < rx_ind->number_of_pdus; j++) + { + fapi_nr_tx_request_body_t *tx_req_body = &scheduled_response->tx_request->tx_request_body[j]; + 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 = tx_req_body->pdu; + rx_ind->pdu_list[j].pdu_length = tx_req_body->pdu_length; + rx_ind->pdu_list[j].rnti = pusch_config_pdu->rnti; + rx_ind->pdu_list[j].timing_advance = scheduled_response->tx_request->tx_config.timing_advance; + rx_ind->pdu_list[j].ul_cqi = scheduled_response->tx_request->tx_config.ul_cqi; + } + LOG_I(PHY, "In %s: Filled rx_ind with tx_req \n", __FUNCTION__); scheduled_response->tx_request->number_of_pdus = 0; send_nsa_standalone_msg(&UL_INFO, rx_ind->header.message_id); @@ -97,15 +100,19 @@ int8_t nr_ue_scheduled_response_stub(nr_scheduled_response_t *scheduled_response crc_ind->sfn = scheduled_response->ul_config->sfn; crc_ind->slot = scheduled_response->ul_config->slot; - crc_ind->crc_list = CALLOC(1, sizeof(*crc_ind->crc_list)); - crc_ind->crc_list[i].handle = pusch_config_pdu->handle; - crc_ind->crc_list[i].harq_id = pusch_config_pdu->pusch_data.harq_process_id; - crc_ind->crc_list[i].num_cb = pusch_config_pdu->pusch_data.num_cb; - crc_ind->crc_list[i].rnti = pusch_config_pdu->rnti; - crc_ind->crc_list[i].tb_crc_status = 0; - crc_ind->crc_list[i].timing_advance = 0; - crc_ind->crc_list[i].ul_cqi = 27; - LOG_I(PHY, "In %s: Filled crc_indwith ulconfig\n", __FUNCTION__); + crc_ind->crc_list = CALLOC(1, sizeof(*crc_ind->crc_list) * crc_ind->number_crcs); + 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 = 1; //pusch_config_pdu->pusch_data.harq_process_id; + 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 = scheduled_response->tx_request->tx_config.timing_advance; + crc_ind->crc_list[j].ul_cqi = scheduled_response->tx_request->tx_config.ul_cqi; + } + + LOG_I(PHY, "Melissa In %s: Filled crc_ind with ulconfig. \n", __FUNCTION__); scheduled_response->ul_config->number_pdus = 0; send_nsa_standalone_msg(&UL_INFO, crc_ind->header.message_id); diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 8f7bd663a3..35cf0ce511 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -1153,10 +1153,12 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac, } else if (dci_format == NR_UL_DCI_FORMAT_0_1 || dci_format == NR_DL_DCI_FORMAT_1_1) { // In case the sizes of formats 0_1 and 1_1 happen to be the same + #if 0 if (dci_pdu_rel15->format_indicator == 0) dci_format = NR_UL_DCI_FORMAT_0_1; else dci_format = NR_DL_DCI_FORMAT_1_1; + #endif } } #ifdef DEBUG_EXTRACT_DCI diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c index 99412b7d2c..4bf9065773 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c @@ -61,7 +61,7 @@ void fill_ul_config(fapi_nr_ul_config_request_t *ul_config, frame_t frame_tx, in ul_config->sfn = frame_tx; ul_config->number_pdus++; - LOG_I(MAC, "Melissa Elkadi 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_I(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); } diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 99dca6b269..eb58a9c0a3 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -306,6 +306,24 @@ void nr_process_mac_pdu( } } +void abort_nr_ul_harq(module_id_t mod_id, int UE_id, int8_t harq_pid) +{ + NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info; + NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + NR_UE_ul_harq_t *harq = &sched_ctrl->ul_harq_processes[harq_pid]; + + harq->ndi ^= 1; + harq->round = 0; + UE_info->mac_stats[UE_id].ulsch_errors++; + add_tail_nr_list(&sched_ctrl->available_ul_harq, harq_pid); + + /* the transmission failed: the UE won't send the data we expected initially, + * so retrieve to correctly schedule after next BSR */ + sched_ctrl->sched_ul_bytes -= harq->sched_pusch.tb_size; + if (sched_ctrl->sched_ul_bytes < 0) + sched_ctrl->sched_ul_bytes = 0; +} + void handle_nr_ul_harq(module_id_t mod_id, frame_t frame, sub_frame_t slot, @@ -330,8 +348,13 @@ void handle_nr_ul_harq(module_id_t mod_id, return; remove_front_nr_list(&sched_ctrl->feedback_ul_harq); - sched_ctrl->ul_harq_processes[harq_pid].round++; - add_tail_nr_list(&sched_ctrl->retrans_ul_harq, harq_pid); + sched_ctrl->ul_harq_processes[harq_pid].is_waiting = false; + if(sched_ctrl->ul_harq_processes[harq_pid].round >= MAX_HARQ_ROUNDS - 1) { + abort_nr_ul_harq(mod_id, UE_id, harq_pid); + } else { + sched_ctrl->ul_harq_processes[harq_pid].round++; + add_tail_nr_list(&sched_ctrl->retrans_ul_harq, harq_pid); + } harq_pid = sched_ctrl->feedback_ul_harq.head; } remove_front_nr_list(&sched_ctrl->feedback_ul_harq); @@ -347,15 +370,12 @@ void handle_nr_ul_harq(module_id_t mod_id, harq_pid, crc_pdu->rnti); add_tail_nr_list(&sched_ctrl->available_ul_harq, harq_pid); - } else if (harq->round == MAX_HARQ_ROUNDS) { - harq->ndi ^= 1; - harq->round = 0; + } else if (harq->round >= MAX_HARQ_ROUNDS - 1) { + abort_nr_ul_harq(mod_id, UE_id, harq_pid); LOG_D(MAC, "RNTI %04x: Ulharq id %d crc failed in all rounds\n", crc_pdu->rnti, harq_pid); - UE_info->mac_stats[UE_id].ulsch_errors++; - add_tail_nr_list(&sched_ctrl->available_ul_harq, harq_pid); } else { harq->round++; LOG_D(MAC, @@ -984,6 +1004,7 @@ void nr_schedule_ulsch(module_id_t module_id, NR_sched_pusch_save_t *ps = &sched_ctrl->pusch_save; /* Statistics */ + AssertFatal(cur_harq->round < 8, "Indexing ulsch_rounds[%d] is out of bounds\n", cur_harq->round); UE_info->mac_stats[UE_id].ulsch_rounds[cur_harq->round]++; if (cur_harq->round == 0) { UE_info->mac_stats[UE_id].ulsch_total_bytes_scheduled += sched_pusch->tb_size; @@ -1102,6 +1123,7 @@ void nr_schedule_ulsch(module_id_t module_id, pusch_pdu->nr_of_symbols = ps->nrOfSymbols; /* PUSCH PDU */ + AssertFatal(cur_harq->round < 4, "Indexing nr_rv_round_map[%d] is out of bounds\n", cur_harq->round); pusch_pdu->pusch_data.rv_index = nr_rv_round_map[cur_harq->round]; pusch_pdu->pusch_data.harq_process_id = harq_id; pusch_pdu->pusch_data.new_data_indicator = cur_harq->ndi; diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h index ee17a230bb..ac0a04a4f0 100644 --- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h +++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h @@ -383,6 +383,8 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, const uint8_t ul_cqi, const uint16_t rssi); +void abort_nr_ul_harq(module_id_t mod_id, int UE_id, int8_t harq_pid); + void handle_nr_ul_harq(module_id_t mod_id, frame_t frame, sub_frame_t slot, diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c index 0a8cce2c25..756c84cfff 100644 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c @@ -214,7 +214,7 @@ static void copy_dl_tti_req_to_dl_info(nr_downlink_indication_t *dl_info, nfapi_ 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_I(NR_PHY, "[%d, %d] PDSCH (RAR transmission configuration)for rnti %x in \n", + LOG_I(NR_PHY, "[%d, %d] PDSCH PDU for rnti %x in \n", dl_tti_request->SFN, dl_tti_request->Slot, pdu_list->pdsch_pdu.pdsch_pdu_rel15.rnti); } @@ -230,14 +230,17 @@ static void copy_dl_tti_req_to_dl_info(nr_downlink_indication_t *dl_info, nfapi_ 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]; - LOG_I(NR_PHY, "[%d, %d] PDCCH DCI (Payload) for rnti %x.\n", - dl_tti_request->SFN, dl_tti_request->Slot, dci_pdu_list->RNTI); + LOG_I(NR_PHY, "[%d, %d] PDCCH DCI (Payload) for rnti %x with PayloadSizeBits %d\n", + dl_tti_request->SFN, dl_tti_request->Slot, dci_pdu_list->RNTI, dci_pdu_list->PayloadSizeBits); for (int k = 0; k < DCI_PAYLOAD_BYTE_LEN; k++) { - dl_info->dci_ind->dci_list->payloadBits[k] = dci_pdu_list->Payload[k]; + LOG_I(NR_MAC, "PDCCH DCI PDU payload[%d] = %d\n", k, dci_pdu_list->Payload[k]); + dl_info->dci_ind->dci_list[j].payloadBits[k] = dci_pdu_list->Payload[k]; } - dl_info->dci_ind->dci_list->payloadSize = dci_pdu_list->PayloadSizeBits; - dl_info->dci_ind->dci_list->rnti = dci_pdu_list->RNTI; + dl_info->dci_ind->dci_list[j].payloadSize = dci_pdu_list->PayloadSizeBits; + dl_info->dci_ind->dci_list[j].rnti = dci_pdu_list->RNTI; + if (dci_pdu_list->PayloadSizeBits != 37) //Melissa: hack. This size is for RAR + dl_info->dci_ind->dci_list[j].dci_format = 7; } } } @@ -271,7 +274,12 @@ static void copy_tx_data_req_to_dl_info(nr_downlink_indication_t *dl_info, nfapi else if (!pdu_list->TLVs[j].tag) dl_info->rx_ind->rx_indication_body[i].pdsch_pdu.pdu = pdu_list->TLVs[j].value.direct; dl_info->rx_ind->rx_indication_body[i].pdsch_pdu.pdu_length = pdu_list->TLVs[j].length; - dl_info->rx_ind->rx_indication_body[i].pdu_type = FAPI_NR_RX_PDU_TYPE_RAR; + if (tx_data_request->Slot == 7) { //Melissa this means we have an RAR, sorta hacky though + dl_info->rx_ind->rx_indication_body[i].pdu_type = FAPI_NR_RX_PDU_TYPE_RAR; + } + else if (tx_data_request->Slot != 7 && get_softmodem_params()->nsa) { + dl_info->rx_ind->rx_indication_body[i].pdu_type = FAPI_NR_RX_PDU_TYPE_DLSCH; + } } } dl_info->slot = tx_data_request->Slot;