Review of UE DL indication
- moved fill_dl_indication to phy procedures - introduced a new function to fill the RX indication - replaced redundant configuration code with the fill functions - extended the function to fill the rx indication - handling different dl pdus types - cleanup of redundant code
This commit is contained in:
+1
-14
@@ -111,19 +111,6 @@ void init_nr_ue_vars(PHY_VARS_NR_UE *ue,
|
|||||||
init_N_TA_offset(ue);
|
init_N_TA_offset(ue);
|
||||||
}
|
}
|
||||||
|
|
||||||
void fill_dl_indication(nr_downlink_indication_t *dl_ind, UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *UE, uint8_t gNB_id){
|
|
||||||
|
|
||||||
memset((void*)dl_ind, 0, sizeof(nr_downlink_indication_t));
|
|
||||||
|
|
||||||
dl_ind->module_id = UE->Mod_id;
|
|
||||||
dl_ind->gNB_index = gNB_id;
|
|
||||||
dl_ind->cc_id = UE->CC_id;
|
|
||||||
dl_ind->frame = proc->frame_rx;
|
|
||||||
dl_ind->slot = proc->nr_slot_rx;
|
|
||||||
dl_ind->thread_id = proc->thread_id;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* It performs band scanning and synchonization.
|
* It performs band scanning and synchonization.
|
||||||
* \param arg is a pointer to a \ref PHY_VARS_NR_UE structure.
|
* \param arg is a pointer to a \ref PHY_VARS_NR_UE structure.
|
||||||
@@ -352,7 +339,7 @@ void processSlotRX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
|
|||||||
|
|
||||||
if(UE->if_inst != NULL && UE->if_inst->dl_indication != NULL) {
|
if(UE->if_inst != NULL && UE->if_inst->dl_indication != NULL) {
|
||||||
nr_downlink_indication_t dl_indication;
|
nr_downlink_indication_t dl_indication;
|
||||||
fill_dl_indication(&dl_indication, proc, UE, gNB_id);
|
nr_fill_dl_indication(&dl_indication, NULL, NULL, proc, UE, gNB_id);
|
||||||
UE->if_inst->dl_indication(&dl_indication, NULL);
|
UE->if_inst->dl_indication(&dl_indication, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -35,6 +35,7 @@
|
|||||||
#include "PHY/sse_intrin.h"
|
#include "PHY/sse_intrin.h"
|
||||||
#include "PHY/LTE_REFSIG/lte_refsig.h"
|
#include "PHY/LTE_REFSIG/lte_refsig.h"
|
||||||
#include "PHY/INIT/phy_init.h"
|
#include "PHY/INIT/phy_init.h"
|
||||||
|
#include "openair1/SCHED_NR_UE/defs.h"
|
||||||
|
|
||||||
//#define DEBUG_PBCH
|
//#define DEBUG_PBCH
|
||||||
//#define DEBUG_PBCH_ENCODING
|
//#define DEBUG_PBCH_ENCODING
|
||||||
@@ -608,23 +609,10 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
nr_downlink_indication_t dl_indication;
|
nr_downlink_indication_t dl_indication;
|
||||||
fapi_nr_rx_indication_t rx_ind;
|
fapi_nr_rx_indication_t rx_ind;
|
||||||
|
uint16_t number_pdus = 1;
|
||||||
dl_indication.module_id = ue->Mod_id;
|
|
||||||
dl_indication.gNB_index = gNB_id;
|
|
||||||
dl_indication.cc_id = proc->CC_id;
|
|
||||||
dl_indication.frame = proc->frame_rx;
|
|
||||||
dl_indication.slot = proc->nr_slot_rx;
|
|
||||||
dl_indication.thread_id = proc->thread_id;
|
|
||||||
dl_indication.rx_ind = &rx_ind; // hang on rx_ind instance
|
|
||||||
dl_indication.dci_ind = NULL;
|
|
||||||
|
|
||||||
rx_ind.rx_indication_body[0].pdu_type = FAPI_NR_RX_PDU_TYPE_MIB;
|
nr_fill_dl_indication(&dl_indication, NULL, &rx_ind, proc, ue, gNB_id);
|
||||||
rx_ind.rx_indication_body[0].mib_pdu.pdu = &decoded_output[0]; //not good as it is pointing to a memory that can change
|
nr_fill_rx_indication(&rx_ind, FAPI_NR_RX_PDU_TYPE_MIB, gNB_id, ue, NULL, number_pdus);
|
||||||
rx_ind.rx_indication_body[0].mib_pdu.additional_bits = nr_ue_pbch_vars->xtra_byte;
|
|
||||||
rx_ind.rx_indication_body[0].mib_pdu.ssb_index = i_ssb; // confirm with TCL
|
|
||||||
rx_ind.rx_indication_body[0].mib_pdu.ssb_length = Lmax; // confirm with TCL
|
|
||||||
rx_ind.rx_indication_body[0].mib_pdu.cell_id = frame_parms->Nid_cell; // confirm with TCL
|
|
||||||
rx_ind.number_pdus = 1; //rx_ind.number_pdus++;
|
|
||||||
|
|
||||||
if (ue->if_inst && ue->if_inst->dl_indication)
|
if (ue->if_inst && ue->if_inst->dl_indication)
|
||||||
ue->if_inst->dl_indication(&dl_indication, NULL);
|
ue->if_inst->dl_indication(&dl_indication, NULL);
|
||||||
|
|||||||
@@ -392,8 +392,34 @@ int get_tx_harq_id(NR_UE_ULSCH_t *ulsch, int slot_tx);
|
|||||||
int is_pbch_in_slot(fapi_nr_config_request_t *config, int frame, int slot, NR_DL_FRAME_PARMS *fp);
|
int is_pbch_in_slot(fapi_nr_config_request_t *config, int frame, int slot, NR_DL_FRAME_PARMS *fp);
|
||||||
int is_ssb_in_slot(fapi_nr_config_request_t *config, int frame, int slot, NR_DL_FRAME_PARMS *fp);
|
int is_ssb_in_slot(fapi_nr_config_request_t *config, int frame, int slot, NR_DL_FRAME_PARMS *fp);
|
||||||
|
|
||||||
|
/*! \brief This function prepares the dl indication to pass to the MAC
|
||||||
|
@param
|
||||||
|
@param
|
||||||
|
@param
|
||||||
|
@param
|
||||||
|
*/
|
||||||
|
void nr_fill_dl_indication(nr_downlink_indication_t *dl_ind,
|
||||||
|
fapi_nr_dci_indication_t *dci_ind,
|
||||||
|
fapi_nr_rx_indication_t *rx_ind,
|
||||||
|
UE_nr_rxtx_proc_t *proc,
|
||||||
|
PHY_VARS_NR_UE *ue,
|
||||||
|
uint8_t gNB_id);
|
||||||
|
|
||||||
/*@}*/
|
/*@}*/
|
||||||
|
|
||||||
|
/*! \brief This function prepares the dl rx indication
|
||||||
|
@param
|
||||||
|
@param
|
||||||
|
@param
|
||||||
|
@param
|
||||||
|
*/
|
||||||
|
void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind,
|
||||||
|
uint8_t pdu_type,
|
||||||
|
uint8_t gNB_id,
|
||||||
|
PHY_VARS_NR_UE *ue,
|
||||||
|
NR_UE_DLSCH_t *dlsch0,
|
||||||
|
uint16_t n_pdus);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -92,6 +92,72 @@ extern uint64_t downlink_frequency[MAX_NUM_CCs][4];
|
|||||||
|
|
||||||
unsigned int gain_table[31] = {100,112,126,141,158,178,200,224,251,282,316,359,398,447,501,562,631,708,794,891,1000,1122,1258,1412,1585,1778,1995,2239,2512,2818,3162};
|
unsigned int gain_table[31] = {100,112,126,141,158,178,200,224,251,282,316,359,398,447,501,562,631,708,794,891,1000,1122,1258,1412,1585,1778,1995,2239,2512,2818,3162};
|
||||||
|
|
||||||
|
void nr_fill_dl_indication(nr_downlink_indication_t *dl_ind,
|
||||||
|
fapi_nr_dci_indication_t *dci_ind,
|
||||||
|
fapi_nr_rx_indication_t *rx_ind,
|
||||||
|
UE_nr_rxtx_proc_t *proc,
|
||||||
|
PHY_VARS_NR_UE *ue,
|
||||||
|
uint8_t gNB_id){
|
||||||
|
|
||||||
|
memset((void*)dl_ind, 0, sizeof(nr_downlink_indication_t));
|
||||||
|
|
||||||
|
dl_ind->gNB_index = gNB_id;
|
||||||
|
dl_ind->module_id = ue->Mod_id;
|
||||||
|
dl_ind->cc_id = ue->CC_id;
|
||||||
|
dl_ind->frame = proc->frame_rx;
|
||||||
|
dl_ind->slot = proc->nr_slot_rx;
|
||||||
|
dl_ind->thread_id = proc->thread_id;
|
||||||
|
|
||||||
|
if (dci_ind) {
|
||||||
|
|
||||||
|
dl_ind->rx_ind = NULL; //no data, only dci for now
|
||||||
|
dl_ind->dci_ind = dci_ind;
|
||||||
|
|
||||||
|
} else if (rx_ind) {
|
||||||
|
|
||||||
|
dl_ind->rx_ind = rx_ind; // hang on rx_ind instance
|
||||||
|
dl_ind->dci_ind = NULL;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind,
|
||||||
|
uint8_t pdu_type,
|
||||||
|
uint8_t gNB_id,
|
||||||
|
PHY_VARS_NR_UE *ue,
|
||||||
|
NR_UE_DLSCH_t *dlsch0,
|
||||||
|
uint16_t n_pdus){
|
||||||
|
|
||||||
|
int harq_pid;
|
||||||
|
NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
|
||||||
|
|
||||||
|
if (n_pdus > 1){
|
||||||
|
LOG_E(PHY, "In %s: multiple number of DL PDUs not supported yet...\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (pdu_type){
|
||||||
|
case FAPI_NR_RX_PDU_TYPE_DLSCH:
|
||||||
|
harq_pid = dlsch0->current_harq_pid;
|
||||||
|
rx_ind->rx_indication_body[n_pdus - 1].pdsch_pdu.pdu = dlsch0->harq_processes[harq_pid]->b;
|
||||||
|
rx_ind->rx_indication_body[n_pdus - 1].pdsch_pdu.pdu_length = dlsch0->harq_processes[harq_pid]->TBS / 8;
|
||||||
|
break;
|
||||||
|
case FAPI_NR_RX_PDU_TYPE_MIB:
|
||||||
|
rx_ind->rx_indication_body[n_pdus - 1].mib_pdu.pdu = ue->pbch_vars[gNB_id]->decoded_output;
|
||||||
|
rx_ind->rx_indication_body[n_pdus - 1].mib_pdu.additional_bits = ue->pbch_vars[gNB_id]->xtra_byte;
|
||||||
|
rx_ind->rx_indication_body[n_pdus - 1].mib_pdu.ssb_index = frame_parms->ssb_index;
|
||||||
|
rx_ind->rx_indication_body[n_pdus - 1].mib_pdu.ssb_length = frame_parms->Lmax;
|
||||||
|
rx_ind->rx_indication_body[n_pdus - 1].mib_pdu.cell_id = frame_parms->Nid_cell;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
rx_ind->rx_indication_body[n_pdus -1].pdu_type = pdu_type;
|
||||||
|
rx_ind->number_pdus = n_pdus;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
int get_tx_amp_prach(int power_dBm, int power_max_dBm, int N_RB_UL){
|
int get_tx_amp_prach(int power_dBm, int power_max_dBm, int N_RB_UL){
|
||||||
|
|
||||||
int gain_dB = power_dBm - power_max_dBm, amp_x_100 = -1;
|
int gain_dB = power_dBm - power_max_dBm, amp_x_100 = -1;
|
||||||
@@ -432,6 +498,8 @@ int nr_ue_pdcch_procedures(uint8_t gNB_id,
|
|||||||
int frame_rx = proc->frame_rx;
|
int frame_rx = proc->frame_rx;
|
||||||
int nr_slot_rx = proc->nr_slot_rx;
|
int nr_slot_rx = proc->nr_slot_rx;
|
||||||
unsigned int dci_cnt=0;
|
unsigned int dci_cnt=0;
|
||||||
|
fapi_nr_dci_indication_t dci_ind = {0};
|
||||||
|
nr_downlink_indication_t dl_indication;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
// unsigned int dci_cnt=0, i; //removed for nr_ue_pdcch_procedures and added in the loop for nb_coreset_active
|
// unsigned int dci_cnt=0, i; //removed for nr_ue_pdcch_procedures and added in the loop for nb_coreset_active
|
||||||
@@ -628,8 +696,6 @@ int nr_ue_pdcch_procedures(uint8_t gNB_id,
|
|||||||
pdcch_vars->nb_search_space);
|
pdcch_vars->nb_search_space);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
fapi_nr_dci_indication_t dci_ind={0};
|
|
||||||
nr_downlink_indication_t dl_indication={0};
|
|
||||||
dci_cnt = nr_dci_decoding_procedure(ue, proc, &dci_ind);
|
dci_cnt = nr_dci_decoding_procedure(ue, proc, &dci_ind);
|
||||||
|
|
||||||
#ifdef NR_PDCCH_SCHED_DEBUG
|
#ifdef NR_PDCCH_SCHED_DEBUG
|
||||||
@@ -687,15 +753,7 @@ int nr_ue_pdcch_procedures(uint8_t gNB_id,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// fill dl_indication message
|
// fill dl_indication message
|
||||||
dl_indication.module_id = ue->Mod_id;
|
nr_fill_dl_indication(&dl_indication, &dci_ind, NULL, proc, ue, gNB_id);
|
||||||
dl_indication.cc_id = ue->CC_id;
|
|
||||||
dl_indication.gNB_index = gNB_id;
|
|
||||||
dl_indication.frame = frame_rx;
|
|
||||||
dl_indication.slot = nr_slot_rx;
|
|
||||||
dl_indication.thread_id = proc->thread_id;
|
|
||||||
dl_indication.rx_ind = NULL; //no data, only dci for now
|
|
||||||
dl_indication.dci_ind = &dci_ind;
|
|
||||||
|
|
||||||
// send to mac
|
// send to mac
|
||||||
ue->if_inst->dl_indication(&dl_indication, NULL);
|
ue->if_inst->dl_indication(&dl_indication, NULL);
|
||||||
|
|
||||||
@@ -928,6 +986,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
|
|||||||
uint16_t nb_symb_sch = 9;
|
uint16_t nb_symb_sch = 9;
|
||||||
nr_downlink_indication_t dl_indication;
|
nr_downlink_indication_t dl_indication;
|
||||||
fapi_nr_rx_indication_t rx_ind;
|
fapi_nr_rx_indication_t rx_ind;
|
||||||
|
uint16_t number_pdus = 1;
|
||||||
// params for UL time alignment procedure
|
// params for UL time alignment procedure
|
||||||
NR_UL_TIME_ALIGNMENT_t *ul_time_alignment = &ue->ul_time_alignment[eNB_id];
|
NR_UL_TIME_ALIGNMENT_t *ul_time_alignment = &ue->ul_time_alignment[eNB_id];
|
||||||
uint16_t slots_per_frame = ue->frame_parms.slots_per_frame;
|
uint16_t slots_per_frame = ue->frame_parms.slots_per_frame;
|
||||||
@@ -1181,39 +1240,28 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
LOG_D(PHY," ------ end ldpc decoder for AbsSubframe %d.%d ------ \n", frame_rx, nr_slot_rx);
|
LOG_D(PHY," ------ end ldpc decoder for AbsSubframe %d.%d ------ \n", frame_rx, nr_slot_rx);
|
||||||
LOG_D(PHY, "harq_pid: %d, TBS expected dlsch0: %d \n",harq_pid, dlsch0->harq_processes[harq_pid]->TBS);
|
LOG_D(PHY, "harq_pid: %d, TBS expected dlsch0: %d \n",harq_pid, dlsch0->harq_processes[harq_pid]->TBS);
|
||||||
|
|
||||||
if(ret<dlsch0->max_ldpc_iterations+1){
|
if(ret<dlsch0->max_ldpc_iterations+1){
|
||||||
|
|
||||||
// fill dl_indication message
|
|
||||||
dl_indication.module_id = ue->Mod_id;
|
|
||||||
dl_indication.cc_id = ue->CC_id;
|
|
||||||
dl_indication.gNB_index = eNB_id;
|
|
||||||
dl_indication.frame = frame_rx;
|
|
||||||
dl_indication.slot = nr_slot_rx;
|
|
||||||
dl_indication.thread_id = proc->thread_id;
|
|
||||||
dl_indication.rx_ind = &rx_ind; // hang on rx_ind instance
|
|
||||||
dl_indication.dci_ind = NULL;
|
|
||||||
|
|
||||||
//dl_indication.rx_ind->number_pdus
|
|
||||||
switch (pdsch) {
|
switch (pdsch) {
|
||||||
case RA_PDSCH:
|
case RA_PDSCH:
|
||||||
rx_ind.rx_indication_body[0].pdu_type = FAPI_NR_RX_PDU_TYPE_RAR;
|
nr_fill_dl_indication(&dl_indication, NULL, &rx_ind, proc, ue, eNB_id);
|
||||||
|
nr_fill_rx_indication(&rx_ind, FAPI_NR_RX_PDU_TYPE_RAR, eNB_id, ue, dlsch0, number_pdus);
|
||||||
break;
|
break;
|
||||||
case PDSCH:
|
case PDSCH:
|
||||||
rx_ind.rx_indication_body[0].pdu_type = FAPI_NR_RX_PDU_TYPE_DLSCH;
|
nr_fill_dl_indication(&dl_indication, NULL, &rx_ind, proc, ue, eNB_id);
|
||||||
|
nr_fill_rx_indication(&rx_ind, FAPI_NR_RX_PDU_TYPE_DLSCH, eNB_id, ue, dlsch0, number_pdus);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
rx_ind.rx_indication_body[0].pdsch_pdu.pdu = dlsch0->harq_processes[harq_pid]->b;
|
LOG_D(PHY, "In %s DL PDU length in bits: %d, in bytes: %d \n", __FUNCTION__, dlsch0->harq_processes[harq_pid]->TBS, dlsch0->harq_processes[harq_pid]->TBS / 8);
|
||||||
rx_ind.rx_indication_body[0].pdsch_pdu.pdu_length = dlsch0->harq_processes[harq_pid]->TBS>>3;
|
|
||||||
LOG_D(PHY, "PDU length in bits: %d, in bytes: %d \n", dlsch0->harq_processes[harq_pid]->TBS, rx_ind.rx_indication_body[0].pdsch_pdu.pdu_length);
|
|
||||||
rx_ind.number_pdus = 1;
|
|
||||||
|
|
||||||
// send to mac
|
// send to mac
|
||||||
if (ue->if_inst && ue->if_inst->dl_indication)
|
if (ue->if_inst && ue->if_inst->dl_indication) {
|
||||||
ue->if_inst->dl_indication(&dl_indication, ul_time_alignment);
|
ue->if_inst->dl_indication(&dl_indication, ul_time_alignment);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO CRC check for CW0
|
// TODO CRC check for CW0
|
||||||
|
|||||||
Reference in New Issue
Block a user