UE Msg2 reception review
- enhancement of DL indication flow for Msg2 (RAR) - merging interface procedures to handle DLSCH and RAR together - better separation of MAC and PHY functionalities - cleanup of double ambiguous functions to process RAR - merging functions to process TA command into the ue_ta_procedures function - enhancement of logging and formatting in the process
This commit is contained in:
@@ -748,7 +748,7 @@ typedef struct NR_UL_TIME_ALIGNMENT {
|
|||||||
int16_t ta_frame;
|
int16_t ta_frame;
|
||||||
char ta_slot;
|
char ta_slot;
|
||||||
/// TA command and TAGID received from the gNB
|
/// TA command and TAGID received from the gNB
|
||||||
uint8_t ta_command;
|
uint16_t ta_command;
|
||||||
uint8_t tag_id;
|
uint8_t tag_id;
|
||||||
} NR_UL_TIME_ALIGNMENT_t;
|
} NR_UL_TIME_ALIGNMENT_t;
|
||||||
|
|
||||||
|
|||||||
@@ -301,15 +301,6 @@ int8_t nr_find_ue(uint16_t rnti, PHY_VARS_eNB *phy_vars_eNB);
|
|||||||
*/
|
*/
|
||||||
void ue_ta_procedures(PHY_VARS_NR_UE *ue, int slot_tx, int frame_tx);
|
void ue_ta_procedures(PHY_VARS_NR_UE *ue, int slot_tx, int frame_tx);
|
||||||
|
|
||||||
/*! \brief Compute the timing adjustment at UE side from the old TA offset and the new received TA command
|
|
||||||
@param Mod_id Local UE index on which to act
|
|
||||||
@param CC_id Component Carrier Index
|
|
||||||
@param ta_command TA command received from the network
|
|
||||||
@param mu numerology index (0,1,2..)
|
|
||||||
*/
|
|
||||||
void nr_process_timing_advance(module_id_t Mod_id,uint8_t CC_id,uint8_t ta_command, uint8_t mu, uint16_t bwp_ul_NB_RB);
|
|
||||||
void nr_process_timing_advance_rar(PHY_VARS_NR_UE *ue, int frame_rx, int nr_slot_rx, uint16_t ta_command);
|
|
||||||
|
|
||||||
unsigned int nr_get_tx_amp(int power_dBm, int power_max_dBm, int N_RB_UL, int nb_rb);
|
unsigned int nr_get_tx_amp(int power_dBm, int power_max_dBm, int N_RB_UL, int nb_rb);
|
||||||
|
|
||||||
void phy_reset_ue(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_index);
|
void phy_reset_ue(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_index);
|
||||||
@@ -343,6 +334,8 @@ uint16_t nr_get_n1_pucch(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
*/
|
*/
|
||||||
UE_MODE_t get_nrUE_mode(uint8_t Mod_id,uint8_t CC_id,uint8_t gNB_index);
|
UE_MODE_t get_nrUE_mode(uint8_t Mod_id,uint8_t CC_id,uint8_t gNB_index);
|
||||||
|
|
||||||
|
uint8_t get_ra_PreambleIndex(uint8_t Mod_id, uint8_t CC_id, uint8_t gNB_id);
|
||||||
|
|
||||||
/*! \brief This function implements the power control mechanism for PUCCH from 36.213.
|
/*! \brief This function implements the power control mechanism for PUCCH from 36.213.
|
||||||
@param phy_vars_ue PHY variables
|
@param phy_vars_ue PHY variables
|
||||||
@param proc Pointer to proc descriptor
|
@param proc Pointer to proc descriptor
|
||||||
|
|||||||
@@ -138,6 +138,7 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind,
|
|||||||
|
|
||||||
switch (pdu_type){
|
switch (pdu_type){
|
||||||
case FAPI_NR_RX_PDU_TYPE_DLSCH:
|
case FAPI_NR_RX_PDU_TYPE_DLSCH:
|
||||||
|
case FAPI_NR_RX_PDU_TYPE_RAR:
|
||||||
harq_pid = dlsch0->current_harq_pid;
|
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 = 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;
|
rx_ind->rx_indication_body[n_pdus - 1].pdsch_pdu.pdu_length = dlsch0->harq_processes[harq_pid]->TBS / 8;
|
||||||
@@ -200,6 +201,13 @@ UE_MODE_t get_nrUE_mode(uint8_t Mod_id,uint8_t CC_id,uint8_t gNB_id){
|
|||||||
return(PHY_vars_UE_g[Mod_id][CC_id]->UE_mode[gNB_id]);
|
return(PHY_vars_UE_g[Mod_id][CC_id]->UE_mode[gNB_id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t get_ra_PreambleIndex(uint8_t Mod_id, uint8_t CC_id, uint8_t gNB_id){
|
||||||
|
|
||||||
|
return PHY_vars_UE_g[Mod_id][CC_id]->prach_resources[gNB_id]->ra_PreambleIndex;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// scale the 16 factor in N_TA calculation in 38.213 section 4.2 according to the used FFT size
|
// scale the 16 factor in N_TA calculation in 38.213 section 4.2 according to the used FFT size
|
||||||
uint16_t get_bw_scaling(uint16_t nb_rb){
|
uint16_t get_bw_scaling(uint16_t nb_rb){
|
||||||
uint16_t bw_scaling;
|
uint16_t bw_scaling;
|
||||||
@@ -215,9 +223,12 @@ uint16_t get_bw_scaling(uint16_t nb_rb){
|
|||||||
return bw_scaling;
|
return bw_scaling;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* UL time alignment
|
// UL time alignment procedures:
|
||||||
// If the current tx frame and slot match the TA configuration in ul_time_alignment
|
// - If the current tx frame and slot match the TA configuration in ul_time_alignment
|
||||||
// then timing advance is processed and set to be applied in the next UL transmission */
|
// then timing advance is processed and set to be applied in the next UL transmission
|
||||||
|
// - Application of timing adjustment according to TS 38.213 p4.2
|
||||||
|
// todo:
|
||||||
|
// - handle RAR TA application as per ch 4.2 TS 38.213
|
||||||
void ue_ta_procedures(PHY_VARS_NR_UE *ue, int slot_tx, int frame_tx){
|
void ue_ta_procedures(PHY_VARS_NR_UE *ue, int slot_tx, int frame_tx){
|
||||||
|
|
||||||
if (ue->mac_enabled == 1) {
|
if (ue->mac_enabled == 1) {
|
||||||
@@ -229,10 +240,36 @@ void ue_ta_procedures(PHY_VARS_NR_UE *ue, int slot_tx, int frame_tx){
|
|||||||
|
|
||||||
uint8_t numerology = ue->frame_parms.numerology_index;
|
uint8_t numerology = ue->frame_parms.numerology_index;
|
||||||
uint16_t bwp_ul_NB_RB = ue->frame_parms.N_RB_UL;
|
uint16_t bwp_ul_NB_RB = ue->frame_parms.N_RB_UL;
|
||||||
|
int factor_mu = 1 << numerology;
|
||||||
|
uint16_t bw_scaling = get_bw_scaling(bwp_ul_NB_RB);
|
||||||
|
|
||||||
LOG_D(PHY, "In %s: applying timing advance -- frame %d -- slot %d\n", __FUNCTION__, frame_tx, slot_tx);
|
LOG_D(PHY, "In %s: applying timing advance -- frame %d -- slot %d\n", __FUNCTION__, frame_tx, slot_tx);
|
||||||
|
|
||||||
nr_process_timing_advance(ue->Mod_id, ue->CC_id, ul_time_alignment->ta_command, numerology, bwp_ul_NB_RB);
|
if (ue->UE_mode[gNB_id] == RA_RESPONSE){
|
||||||
|
|
||||||
|
ue->timing_advance = ul_time_alignment->ta_command * bw_scaling / factor_mu;
|
||||||
|
|
||||||
|
LOG_D(PHY, "In %s: [UE %d] [%d.%d] Received (RAR) timing advance command %d new value is %u \n",
|
||||||
|
__FUNCTION__,
|
||||||
|
ue->Mod_id,
|
||||||
|
frame_tx,
|
||||||
|
slot_tx,
|
||||||
|
ul_time_alignment->ta_command,
|
||||||
|
ue->timing_advance);
|
||||||
|
|
||||||
|
} else if (ue->UE_mode[gNB_id] == PUSCH){
|
||||||
|
|
||||||
|
ue->timing_advance += (ul_time_alignment->ta_command - 31) * bw_scaling / factor_mu;
|
||||||
|
|
||||||
|
LOG_D(PHY, "In %s: [UE %d] [%d.%d] Got timing advance command %u from MAC, new value is %d\n",
|
||||||
|
__FUNCTION__,
|
||||||
|
ue->Mod_id,
|
||||||
|
frame_tx,
|
||||||
|
slot_tx,
|
||||||
|
ul_time_alignment->ta_command,
|
||||||
|
ue->timing_advance);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
ul_time_alignment->ta_frame = -1;
|
ul_time_alignment->ta_frame = -1;
|
||||||
ul_time_alignment->ta_slot = -1;
|
ul_time_alignment->ta_slot = -1;
|
||||||
@@ -241,32 +278,6 @@ void ue_ta_procedures(PHY_VARS_NR_UE *ue, int slot_tx, int frame_tx){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void nr_process_timing_advance(module_id_t Mod_id, uint8_t CC_id, uint8_t ta_command, uint8_t mu, uint16_t bwp_ul_NB_RB){
|
|
||||||
|
|
||||||
// 3GPP TS 38.213 p4.2
|
|
||||||
// scale by the scs numerology
|
|
||||||
int factor_mu = 1 << mu;
|
|
||||||
uint16_t bw_scaling = get_bw_scaling(bwp_ul_NB_RB);
|
|
||||||
|
|
||||||
PHY_vars_UE_g[Mod_id][CC_id]->timing_advance += (ta_command - 31) * bw_scaling / factor_mu;
|
|
||||||
|
|
||||||
LOG_D(PHY, "[UE %d] Got timing advance command %u from MAC, new value is %d\n", Mod_id, ta_command, PHY_vars_UE_g[Mod_id][CC_id]->timing_advance);
|
|
||||||
}
|
|
||||||
|
|
||||||
// WIP
|
|
||||||
// - todo: handle TA application as per ch 4.2 TS 38.213
|
|
||||||
void nr_process_timing_advance_rar(PHY_VARS_NR_UE *ue, int frame_rx, int nr_slot_rx, uint16_t ta_command) {
|
|
||||||
|
|
||||||
int factor_mu = 1 << ue->frame_parms.numerology_index;
|
|
||||||
uint16_t bwp_ul_NB_RB = ue->frame_parms.N_RB_UL;
|
|
||||||
uint16_t bw_scaling = get_bw_scaling(bwp_ul_NB_RB);
|
|
||||||
|
|
||||||
// Transmission timing adjustment (TS 38.213 p4.2)
|
|
||||||
ue->timing_advance = bw_scaling / factor_mu;
|
|
||||||
|
|
||||||
LOG_D(PHY, "[UE %d] Frame %d Slot %d, Received (RAR) timing advance command %d new value is %u \n", ue->Mod_id, frame_rx, nr_slot_rx, ta_command, ue->timing_advance);
|
|
||||||
}
|
|
||||||
|
|
||||||
void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue,
|
void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue,
|
||||||
UE_nr_rxtx_proc_t *proc,
|
UE_nr_rxtx_proc_t *proc,
|
||||||
uint8_t gNB_id) {
|
uint8_t gNB_id) {
|
||||||
@@ -888,60 +899,6 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// WIP fix:
|
|
||||||
// - time domain indication hardcoded to 0 for k2 offset
|
|
||||||
// - extend TS 38.213 ch 8.3 Msg3 PUSCH
|
|
||||||
// - b buffer
|
|
||||||
// - ulsch power offset
|
|
||||||
// - UE_mode == PUSCH case (should be handled by TA updates)
|
|
||||||
// - harq
|
|
||||||
// - optimize: mu_pusch, j and table_6_1_2_1_1_2_time_dom_res_alloc_A are already defined in nr_ue_procedures
|
|
||||||
void nr_process_rar(nr_downlink_indication_t *dl_info) {
|
|
||||||
|
|
||||||
module_id_t module_id = dl_info->module_id;
|
|
||||||
int cc_id = dl_info->cc_id, frame_rx = dl_info->frame, nr_slot_rx = dl_info->slot, ta_command;
|
|
||||||
uint8_t gNB_index = dl_info->gNB_index; // *rar;
|
|
||||||
PHY_VARS_NR_UE *ue = PHY_vars_UE_g[module_id][cc_id];
|
|
||||||
NR_UE_DLSCH_t *dlsch0 = ue->dlsch_ra[gNB_index];
|
|
||||||
UE_MODE_t UE_mode = ue->UE_mode[gNB_index];
|
|
||||||
NR_PRACH_RESOURCES_t *prach_resources = ue->prach_resources[gNB_index];
|
|
||||||
|
|
||||||
if (ue->mac_enabled == 1) {
|
|
||||||
|
|
||||||
LOG_D(PHY,"[UE %d][RAPROC] Frame %d slot %d Received RAR mode %d\n", module_id, frame_rx, nr_slot_rx, UE_mode);
|
|
||||||
|
|
||||||
if ((UE_mode != PUSCH) && (prach_resources->Msg3 != NULL)) {
|
|
||||||
|
|
||||||
LOG_D(PHY,"[UE %d][RAPROC] Frame %d slot %d Invoking MAC for RAR (current preamble %d)\n", module_id, frame_rx, nr_slot_rx, prach_resources->ra_PreambleIndex);
|
|
||||||
|
|
||||||
ta_command = nr_ue_process_rar(ue->Mod_id,
|
|
||||||
cc_id,
|
|
||||||
frame_rx,
|
|
||||||
nr_slot_rx,
|
|
||||||
dlsch0->harq_processes[0]->b,
|
|
||||||
&ue->pdcch_vars[dl_info->thread_id][gNB_index]->pdcch_config[0].rnti,
|
|
||||||
prach_resources->ra_PreambleIndex,
|
|
||||||
dlsch0->harq_processes[0]->b); // alter the 'b' buffer so it contains only the selected RAR header and RAR payload
|
|
||||||
|
|
||||||
if (ta_command != 0xffff) {
|
|
||||||
LOG_D(PHY,"[UE %d][RAPROC] Frame %d slot %d Got Temporary C-RNTI %x and timing advance %d from RAR\n",
|
|
||||||
ue->Mod_id,
|
|
||||||
frame_rx,
|
|
||||||
nr_slot_rx,
|
|
||||||
ue->pdcch_vars[dl_info->thread_id][gNB_index]->pdcch_config[0].rnti,
|
|
||||||
ta_command);
|
|
||||||
|
|
||||||
nr_process_timing_advance_rar(ue, frame_rx, nr_slot_rx, ta_command);
|
|
||||||
|
|
||||||
ue->UE_mode[gNB_index] = RA_RESPONSE;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
LOG_W(PHY,"[UE %d][RAPROC] Received RAR preamble (%d) doesn't match !!!\n", ue->Mod_id, prach_resources->ra_PreambleIndex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// if contention resolution fails, go back to UE mode PRACH
|
// if contention resolution fails, go back to UE mode PRACH
|
||||||
void nr_ra_failed(uint8_t Mod_id, uint8_t CC_id, uint8_t gNB_index) {
|
void nr_ra_failed(uint8_t Mod_id, uint8_t CC_id, uint8_t gNB_index) {
|
||||||
|
|
||||||
@@ -1245,8 +1202,16 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
switch (pdsch) {
|
switch (pdsch) {
|
||||||
case RA_PDSCH:
|
case RA_PDSCH:
|
||||||
|
|
||||||
|
if(!ue->mac_enabled){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
nr_fill_dl_indication(&dl_indication, NULL, &rx_ind, proc, ue, eNB_id);
|
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);
|
nr_fill_rx_indication(&rx_ind, FAPI_NR_RX_PDU_TYPE_RAR, eNB_id, ue, dlsch0, number_pdus);
|
||||||
|
|
||||||
|
ue->UE_mode[eNB_id] = RA_RESPONSE;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case PDSCH:
|
case PDSCH:
|
||||||
nr_fill_dl_indication(&dl_indication, NULL, &rx_ind, proc, ue, eNB_id);
|
nr_fill_dl_indication(&dl_indication, NULL, &rx_ind, proc, ue, eNB_id);
|
||||||
@@ -1620,7 +1585,7 @@ void *UE_thread_slot1_dl_processing(void *arg) {
|
|||||||
abstraction_flag);
|
abstraction_flag);
|
||||||
}
|
}
|
||||||
// do procedures for RA-RNTI
|
// do procedures for RA-RNTI
|
||||||
if ((ue->dlsch_ra[eNB_id]) && (ue->dlsch_ra[eNB_id]->active == 1)) {
|
if ((ue->dlsch_ra[eNB_id]) && (ue->dlsch_ra[eNB_id]->active == 1) && (UE_mode != PUSCH)) {
|
||||||
ue_pdsch_procedures(ue,
|
ue_pdsch_procedures(ue,
|
||||||
proc,
|
proc,
|
||||||
eNB_id,
|
eNB_id,
|
||||||
@@ -1968,7 +1933,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// do procedures for RA-RNTI
|
// do procedures for RA-RNTI
|
||||||
if ((ue->dlsch_ra[gNB_id]) && (ue->dlsch_ra[gNB_id]->active == 1)) {
|
if ((ue->dlsch_ra[gNB_id]) && (ue->dlsch_ra[gNB_id]->active == 1) && (ue->UE_mode[gNB_id] != PUSCH)) {
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_RA, VCD_FUNCTION_IN);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_RA, VCD_FUNCTION_IN);
|
||||||
nr_ue_pdsch_procedures(ue,
|
nr_ue_pdsch_procedures(ue,
|
||||||
proc,
|
proc,
|
||||||
|
|||||||
@@ -131,33 +131,18 @@ uint32_t get_ssb_slot(uint32_t ssb_index);
|
|||||||
uint32_t mr_ue_get_SR(module_id_t module_idP, int CC_id, frame_t frameP, uint8_t eNB_id, uint16_t rnti, sub_frame_t subframe);
|
uint32_t mr_ue_get_SR(module_id_t module_idP, int CC_id, frame_t frameP, uint8_t eNB_id, uint16_t rnti, sub_frame_t subframe);
|
||||||
|
|
||||||
/* \brief Get payload (MAC PDU) from UE PHY
|
/* \brief Get payload (MAC PDU) from UE PHY
|
||||||
@param module_idP Instance id of UE in machine
|
@param dl_info pointer to dl indication
|
||||||
@param CC_id Component Carrier index
|
@param ul_time_alignment pointer to timing advance parameters
|
||||||
@param frameP Current Rx frame
|
@param pdu_id index of DL PDU
|
||||||
@param slotP Current Rx slot
|
|
||||||
@param pdu Pointer to the MAC PDU
|
|
||||||
@param pdu_len Length of the MAC PDU
|
|
||||||
@param gNB_id Index of gNB that UE is attached to
|
|
||||||
@param ul_time_alignment of struct handling the timing advance parameters
|
|
||||||
@returns void
|
@returns void
|
||||||
*/
|
*/
|
||||||
void nr_ue_send_sdu(module_id_t module_idP,
|
void nr_ue_send_sdu(nr_downlink_indication_t *dl_info,
|
||||||
uint8_t CC_id,
|
NR_UL_TIME_ALIGNMENT_t *ul_time_alignment,
|
||||||
frame_t frameP,
|
int pdu_id);
|
||||||
int slotP,
|
|
||||||
uint8_t * pdu,
|
|
||||||
uint16_t pdu_len,
|
|
||||||
uint8_t gNB_index,
|
|
||||||
NR_UL_TIME_ALIGNMENT_t *ul_time_alignment);
|
|
||||||
|
|
||||||
void nr_ue_process_mac_pdu(module_id_t module_idP,
|
|
||||||
uint8_t CC_id,
|
|
||||||
frame_t frameP,
|
|
||||||
uint8_t *pduP,
|
|
||||||
uint16_t mac_pdu_len,
|
|
||||||
uint8_t gNB_index,
|
|
||||||
NR_UL_TIME_ALIGNMENT_t *ul_time_alignment);
|
|
||||||
|
|
||||||
|
void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info,
|
||||||
|
NR_UL_TIME_ALIGNMENT_t *ul_time_alignment,
|
||||||
|
int pdu_id);
|
||||||
|
|
||||||
uint16_t nr_generate_ulsch_pdu(uint8_t *sdus_payload,
|
uint16_t nr_generate_ulsch_pdu(uint8_t *sdus_payload,
|
||||||
uint8_t *pdu,
|
uint8_t *pdu,
|
||||||
@@ -239,14 +224,7 @@ random-access procedure
|
|||||||
@param selected_rar_buffer the output buffer for storing the selected RAR header and RAR payload
|
@param selected_rar_buffer the output buffer for storing the selected RAR header and RAR payload
|
||||||
@returns timing advance or 0xffff if preamble doesn't match
|
@returns timing advance or 0xffff if preamble doesn't match
|
||||||
*/
|
*/
|
||||||
uint16_t nr_ue_process_rar(module_id_t mod_id,
|
void nr_ue_process_rar(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *ul_time_alignment, int pdu_id);
|
||||||
int CC_id,
|
|
||||||
frame_t frameP,
|
|
||||||
sub_frame_t slotP,
|
|
||||||
uint8_t * dlsch_buffer,
|
|
||||||
rnti_t * t_crnti,
|
|
||||||
uint8_t preamble_index,
|
|
||||||
uint8_t * selected_rar_buffer);
|
|
||||||
|
|
||||||
void nr_process_rar(nr_downlink_indication_t *dl_info);
|
void nr_process_rar(nr_downlink_indication_t *dl_info);
|
||||||
|
|
||||||
|
|||||||
@@ -3358,28 +3358,10 @@ int8_t nr_ue_get_SR(module_id_t module_idP, int CC_id, frame_t frameP, uint8_t e
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void nr_ue_send_sdu(module_id_t module_idP,
|
void nr_ue_send_sdu(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *ul_time_alignment, int pdu_id){
|
||||||
uint8_t CC_id,
|
|
||||||
frame_t frameP,
|
|
||||||
int slotP,
|
|
||||||
uint8_t * pdu, uint16_t pdu_len, uint8_t gNB_index,
|
|
||||||
NR_UL_TIME_ALIGNMENT_t *ul_time_alignment){
|
|
||||||
|
|
||||||
LOG_D(MAC, "Handling PDU frame %d slot %d\n", frameP, slotP);
|
|
||||||
|
|
||||||
uint8_t * pduP = pdu;
|
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_SDU, VCD_FUNCTION_IN);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_SDU, VCD_FUNCTION_IN);
|
||||||
|
|
||||||
//LOG_D(MAC,"sdu: %x.%x.%x\n",sdu[0],sdu[1],sdu[2]);
|
|
||||||
|
|
||||||
/*
|
|
||||||
#ifdef DEBUG_HEADER_PARSING
|
|
||||||
LOG_D(MAC, "[UE %d] ue_send_sdu : Frame %d gNB_index %d : num_ce %d num_sdu %d\n",
|
|
||||||
module_idP, frameP, gNB_index, num_ce, num_sdu);
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined(ENABLE_MAC_PAYLOAD_DEBUG)
|
#if defined(ENABLE_MAC_PAYLOAD_DEBUG)
|
||||||
LOG_T(MAC, "[UE %d] First 32 bytes of DLSCH : \n", module_idP);
|
LOG_T(MAC, "[UE %d] First 32 bytes of DLSCH : \n", module_idP);
|
||||||
for (i = 0; i < 32; i++) {
|
for (i = 0; i < 32; i++) {
|
||||||
@@ -3388,10 +3370,20 @@ void nr_ue_send_sdu(module_id_t module_idP,
|
|||||||
LOG_T(MAC, "\n");
|
LOG_T(MAC, "\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
LOG_D(MAC, "In %s [%d.%d] Handling DLSCH PDU...\n", __FUNCTION__, dl_info->frame, dl_info->slot);
|
||||||
|
|
||||||
// Processing MAC PDU
|
// Processing MAC PDU
|
||||||
// it parses MAC CEs subheaders, MAC CEs, SDU subheaderds and SDUs
|
// it parses MAC CEs subheaders, MAC CEs, SDU subheaderds and SDUs
|
||||||
if (pduP != NULL)
|
switch (dl_info->rx_ind->rx_indication_body[pdu_id].pdu_type){
|
||||||
nr_ue_process_mac_pdu(module_idP, CC_id, frameP, pduP, pdu_len, gNB_index, ul_time_alignment);
|
case FAPI_NR_RX_PDU_TYPE_DLSCH:
|
||||||
|
nr_ue_process_mac_pdu(dl_info, ul_time_alignment, pdu_id);
|
||||||
|
break;
|
||||||
|
case FAPI_NR_RX_PDU_TYPE_RAR:
|
||||||
|
nr_ue_process_rar(dl_info, ul_time_alignment, pdu_id);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_SDU, VCD_FUNCTION_OUT);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_SDU, VCD_FUNCTION_OUT);
|
||||||
|
|
||||||
@@ -3988,58 +3980,67 @@ int nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
|
|||||||
return dci_format;
|
return dci_format;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////
|
||||||
|
// brief: nr_ue_process_mac_pdu
|
||||||
|
// function: parsing DL PDU header
|
||||||
|
///////////////////////////////////
|
||||||
|
// Header for DLSCH:
|
||||||
|
// Except:
|
||||||
|
// - DL-SCH: fixed-size MAC CE(known by LCID)
|
||||||
|
// - DL-SCH: padding
|
||||||
|
//
|
||||||
|
// |0|1|2|3|4|5|6|7| bit-wise
|
||||||
|
// |R|F| LCID |
|
||||||
|
// | L |
|
||||||
|
// |0|1|2|3|4|5|6|7| bit-wise
|
||||||
|
// |R|F| LCID |
|
||||||
|
// | L |
|
||||||
|
// | L |
|
||||||
|
////////////////////////////////
|
||||||
|
// Header for DLSCH:
|
||||||
|
// - DLSCH: fixed-size MAC CE(known by LCID)
|
||||||
|
// - DLSCH: padding, for single/multiple 1-oct padding CE(s)
|
||||||
|
//
|
||||||
|
// |0|1|2|3|4|5|6|7| bit-wise
|
||||||
|
// |R|R| LCID |
|
||||||
|
// LCID: The Logical Channel ID field identifies the logical channel instance of the corresponding MAC SDU or the type of the corresponding MAC CE or padding as described
|
||||||
|
// in Tables 6.2.1-1 and 6.2.1-2 for the DL-SCH and UL-SCH respectively. There is one LCID field per MAC subheader. The LCID field size is 6 bits;
|
||||||
|
// L: The Length field indicates the length of the corresponding MAC SDU or variable-sized MAC CE in bytes. There is one L field per MAC subheader except for subheaders
|
||||||
|
// corresponding to fixed-sized MAC CEs and padding. The size of the L field is indicated by the F field;
|
||||||
|
// F: lenght of L is 0:8 or 1:16 bits wide
|
||||||
|
// R: Reserved bit, set to zero.
|
||||||
|
////////////////////////////////
|
||||||
|
void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info,
|
||||||
|
NR_UL_TIME_ALIGNMENT_t *ul_time_alignment,
|
||||||
|
int pdu_id){
|
||||||
|
|
||||||
void nr_ue_process_mac_pdu(module_id_t module_idP,
|
uint8_t rx_lcid;
|
||||||
uint8_t CC_id,
|
uint16_t mac_ce_len;
|
||||||
frame_t frameP,
|
uint16_t mac_subheader_len;
|
||||||
uint8_t *pduP,
|
uint16_t mac_sdu_len;
|
||||||
uint16_t mac_pdu_len,
|
module_id_t module_idP = dl_info->module_id;
|
||||||
uint8_t gNB_index,
|
frame_t frameP = dl_info->frame;
|
||||||
NR_UL_TIME_ALIGNMENT_t *ul_time_alignment){
|
int slot = dl_info->slot;
|
||||||
|
uint8_t *pduP = (dl_info->rx_ind->rx_indication_body + pdu_id)->pdsch_pdu.pdu;
|
||||||
|
uint16_t pdu_len = (dl_info->rx_ind->rx_indication_body + pdu_id)->pdsch_pdu.pdu_length;
|
||||||
|
uint8_t gNB_index = dl_info->gNB_index;
|
||||||
|
uint8_t CC_id = dl_info->cc_id;
|
||||||
|
uint8_t done = 0;
|
||||||
|
NR_UE_MAC_INST_t *mac = get_mac_inst(module_idP);
|
||||||
|
|
||||||
// This function is adapting code from the old
|
if (!pduP){
|
||||||
// parse_header(...) and ue_send_sdu(...) functions of OAI LTE
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t *pdu_ptr = pduP, rx_lcid, done = 0;
|
LOG_D(MAC, "In %s [%d.%d]: processing PDU %d of %d total number of PDUs...\n", __FUNCTION__, frameP, slot, pdu_id, dl_info->rx_ind->number_pdus);
|
||||||
int pdu_len = mac_pdu_len;
|
|
||||||
uint16_t mac_ce_len, mac_subheader_len, mac_sdu_len;
|
|
||||||
NR_UE_MAC_INST_t *mac = get_mac_inst(module_idP);
|
|
||||||
|
|
||||||
//NR_UE_MAC_INST_t *UE_mac_inst = get_mac_inst(module_idP);
|
|
||||||
//uint8_t scs = UE_mac_inst->mib->subCarrierSpacingCommon;
|
|
||||||
//uint16_t bwp_ul_NB_RB = UE_mac_inst->initial_bwp_ul.N_RB;
|
|
||||||
|
|
||||||
// For both DL/UL-SCH
|
|
||||||
// Except:
|
|
||||||
// - UL/DL-SCH: fixed-size MAC CE(known by LCID)
|
|
||||||
// - UL/DL-SCH: padding
|
|
||||||
// - UL-SCH: MSG3 48-bits
|
|
||||||
// |0|1|2|3|4|5|6|7| bit-wise
|
|
||||||
// |R|F| LCID |
|
|
||||||
// | L |
|
|
||||||
// |0|1|2|3|4|5|6|7| bit-wise
|
|
||||||
// |R|F| LCID |
|
|
||||||
// | L |
|
|
||||||
// | L |
|
|
||||||
|
|
||||||
// For both DL/UL-SCH
|
|
||||||
// For:
|
|
||||||
// - UL/DL-SCH: fixed-size MAC CE(known by LCID)
|
|
||||||
// - UL/DL-SCH: padding, for single/multiple 1-oct padding CE(s)
|
|
||||||
// - UL-SCH: MSG3 48-bits
|
|
||||||
// |0|1|2|3|4|5|6|7| bit-wise
|
|
||||||
// |R|R| LCID |
|
|
||||||
// LCID: The Logical Channel ID field identifies the logical channel instance of the corresponding MAC SDU or the type of the corresponding MAC CE or padding as described in Tables 6.2.1-1 and 6.2.1-2 for the DL-SCH and UL-SCH respectively. There is one LCID field per MAC subheader. The LCID field size is 6 bits;
|
|
||||||
// L: The Length field indicates the length of the corresponding MAC SDU or variable-sized MAC CE in bytes. There is one L field per MAC subheader except for subheaders corresponding to fixed-sized MAC CEs and padding. The size of the L field is indicated by the F field;
|
|
||||||
// F: lenght of L is 0:8 or 1:16 bits wide
|
|
||||||
// R: Reserved bit, set to zero.
|
|
||||||
while (!done && pdu_len > 0){
|
while (!done && pdu_len > 0){
|
||||||
mac_ce_len = 0x0000;
|
mac_ce_len = 0x0000;
|
||||||
mac_subheader_len = 0x0001; // default to fixed-length subheader = 1-oct
|
mac_subheader_len = 0x0001; // default to fixed-length subheader = 1-oct
|
||||||
mac_sdu_len = 0x0000;
|
mac_sdu_len = 0x0000;
|
||||||
rx_lcid = ((NR_MAC_SUBHEADER_FIXED *)pdu_ptr)->LCID;
|
rx_lcid = ((NR_MAC_SUBHEADER_FIXED *)pduP)->LCID;
|
||||||
//#ifdef DEBUG_HEADER_PARSING
|
//#ifdef DEBUG_HEADER_PARSING
|
||||||
LOG_D(MAC, "[UE] LCID %d, PDU length %d\n", ((NR_MAC_SUBHEADER_FIXED *)pdu_ptr)->LCID, pdu_len);
|
LOG_D(MAC, "[UE] LCID %d, PDU length %d\n", ((NR_MAC_SUBHEADER_FIXED *)pduP)->LCID, pdu_len);
|
||||||
//#endif
|
//#endif
|
||||||
|
|
||||||
LOG_D(MAC, "[UE] LCID %d, PDU length %d\n", rx_lcid, pdu_len);
|
LOG_D(MAC, "[UE] LCID %d, PDU length %d\n", rx_lcid, pdu_len);
|
||||||
@@ -4049,10 +4050,10 @@ void nr_ue_process_mac_pdu(module_id_t module_idP,
|
|||||||
case DL_SCH_LCID_CCCH:
|
case DL_SCH_LCID_CCCH:
|
||||||
// MSG4 RRC Connection Setup 38.331
|
// MSG4 RRC Connection Setup 38.331
|
||||||
// varialbe length
|
// varialbe length
|
||||||
mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->L;
|
mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
|
||||||
mac_subheader_len = 2;
|
mac_subheader_len = 2;
|
||||||
if(((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->F){
|
if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
|
||||||
mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pdu_ptr)->L2)<<8;
|
mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
|
||||||
mac_subheader_len = 3;
|
mac_subheader_len = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4062,40 +4063,40 @@ void nr_ue_process_mac_pdu(module_id_t module_idP,
|
|||||||
|
|
||||||
// 38.321 Ch6.1.3.14
|
// 38.321 Ch6.1.3.14
|
||||||
// varialbe length
|
// varialbe length
|
||||||
mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->L;
|
mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
|
||||||
mac_subheader_len = 2;
|
mac_subheader_len = 2;
|
||||||
if(((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->F){
|
if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
|
||||||
mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pdu_ptr)->L2)<<8;
|
mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
|
||||||
mac_subheader_len = 3;
|
mac_subheader_len = 3;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DL_SCH_LCID_APERIODIC_CSI_TRI_STATE_SUBSEL:
|
case DL_SCH_LCID_APERIODIC_CSI_TRI_STATE_SUBSEL:
|
||||||
// 38.321 Ch6.1.3.13
|
// 38.321 Ch6.1.3.13
|
||||||
// varialbe length
|
// varialbe length
|
||||||
mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->L;
|
mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
|
||||||
mac_subheader_len = 2;
|
mac_subheader_len = 2;
|
||||||
if(((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->F){
|
if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
|
||||||
mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pdu_ptr)->L2)<<8;
|
mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
|
||||||
mac_subheader_len = 3;
|
mac_subheader_len = 3;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DL_SCH_LCID_SP_CSI_RS_CSI_IM_RES_SET_ACT:
|
case DL_SCH_LCID_SP_CSI_RS_CSI_IM_RES_SET_ACT:
|
||||||
// 38.321 Ch6.1.3.12
|
// 38.321 Ch6.1.3.12
|
||||||
// varialbe length
|
// varialbe length
|
||||||
mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->L;
|
mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
|
||||||
mac_subheader_len = 2;
|
mac_subheader_len = 2;
|
||||||
if(((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->F){
|
if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
|
||||||
mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pdu_ptr)->L2)<<8;
|
mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
|
||||||
mac_subheader_len = 3;
|
mac_subheader_len = 3;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DL_SCH_LCID_SP_SRS_ACTIVATION:
|
case DL_SCH_LCID_SP_SRS_ACTIVATION:
|
||||||
// 38.321 Ch6.1.3.17
|
// 38.321 Ch6.1.3.17
|
||||||
// varialbe length
|
// varialbe length
|
||||||
mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->L;
|
mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
|
||||||
mac_subheader_len = 2;
|
mac_subheader_len = 2;
|
||||||
if(((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->F){
|
if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
|
||||||
mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pdu_ptr)->L2)<<8;
|
mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
|
||||||
mac_subheader_len = 3;
|
mac_subheader_len = 3;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -4146,16 +4147,16 @@ void nr_ue_process_mac_pdu(module_id_t module_idP,
|
|||||||
// 38.321 Ch6.1.3.4
|
// 38.321 Ch6.1.3.4
|
||||||
mac_ce_len = 1;
|
mac_ce_len = 1;
|
||||||
|
|
||||||
/*uint8_t ta_command = ((NR_MAC_CE_TA *)pdu_ptr)[1].TA_COMMAND;
|
/*uint8_t ta_command = ((NR_MAC_CE_TA *)pduP)[1].TA_COMMAND;
|
||||||
uint8_t tag_id = ((NR_MAC_CE_TA *)pdu_ptr)[1].TAGID;*/
|
uint8_t tag_id = ((NR_MAC_CE_TA *)pduP)[1].TAGID;*/
|
||||||
|
|
||||||
ul_time_alignment->apply_ta = 1;
|
ul_time_alignment->apply_ta = 1;
|
||||||
ul_time_alignment->ta_command = ((NR_MAC_CE_TA *)pdu_ptr)[1].TA_COMMAND;
|
ul_time_alignment->ta_command = ((NR_MAC_CE_TA *)pduP)[1].TA_COMMAND;
|
||||||
ul_time_alignment->tag_id = ((NR_MAC_CE_TA *)pdu_ptr)[1].TAGID;
|
ul_time_alignment->tag_id = ((NR_MAC_CE_TA *)pduP)[1].TAGID;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
#ifdef DEBUG_HEADER_PARSING
|
#ifdef DEBUG_HEADER_PARSING
|
||||||
LOG_D(MAC, "[UE] CE %d : UE Timing Advance : %d\n", i, pdu_ptr[1]);
|
LOG_D(MAC, "[UE] CE %d : UE Timing Advance : %d\n", i, pduP[1]);
|
||||||
#endif
|
#endif
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -4167,7 +4168,7 @@ void nr_ue_process_mac_pdu(module_id_t module_idP,
|
|||||||
// WIP todo: handle CCCH_pdu
|
// WIP todo: handle CCCH_pdu
|
||||||
mac_ce_len = 6;
|
mac_ce_len = 6;
|
||||||
|
|
||||||
LOG_I(MAC, "[UE %d][RAPROC] Frame %d : received contention resolution msg: %x.%x.%x.%x.%x.%x, Terminating RA procedure\n", module_idP, frameP, pdu_ptr[0], pdu_ptr[1], pdu_ptr[2], pdu_ptr[3], pdu_ptr[4], pdu_ptr[5]);
|
LOG_I(MAC, "[UE %d][RAPROC] Frame %d : received contention resolution msg: %x.%x.%x.%x.%x.%x, Terminating RA procedure\n", module_idP, frameP, pduP[0], pduP[1], pduP[2], pduP[3], pduP[4], pduP[5]);
|
||||||
|
|
||||||
if (mac->RA_active == 1) {
|
if (mac->RA_active == 1) {
|
||||||
LOG_I(MAC, "[UE %d][RAPROC] Frame %d : Clearing RA_active flag\n", module_idP, frameP);
|
LOG_I(MAC, "[UE %d][RAPROC] Frame %d : Clearing RA_active flag\n", module_idP, frameP);
|
||||||
@@ -4208,14 +4209,14 @@ void nr_ue_process_mac_pdu(module_id_t module_idP,
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
// check if LCID is valid at current time.
|
// check if LCID is valid at current time.
|
||||||
if(((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->F){
|
if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
|
||||||
//mac_sdu_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pdu_ptr)->L2)<<8;
|
//mac_sdu_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
|
||||||
mac_subheader_len = 3;
|
mac_subheader_len = 3;
|
||||||
mac_sdu_len = ((uint16_t)(((NR_MAC_SUBHEADER_LONG *) pdu_ptr)->L1 & 0x7f) << 8)
|
mac_sdu_len = ((uint16_t)(((NR_MAC_SUBHEADER_LONG *) pduP)->L1 & 0x7f) << 8)
|
||||||
| ((uint16_t)((NR_MAC_SUBHEADER_LONG *) pdu_ptr)->L2 & 0xff);
|
| ((uint16_t)((NR_MAC_SUBHEADER_LONG *) pduP)->L2 & 0xff);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
mac_sdu_len = (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->L;
|
mac_sdu_len = (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
|
||||||
mac_subheader_len = 2;
|
mac_subheader_len = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4225,7 +4226,7 @@ void nr_ue_process_mac_pdu(module_id_t module_idP,
|
|||||||
LOG_T(MAC, "[UE %d] First 32 bytes of DLSCH : \n", module_idP);
|
LOG_T(MAC, "[UE %d] First 32 bytes of DLSCH : \n", module_idP);
|
||||||
|
|
||||||
for (i = 0; i < 32; i++)
|
for (i = 0; i < 32; i++)
|
||||||
LOG_T(MAC, "%x.", (pdu_ptr + mac_subheader_len)[i]);
|
LOG_T(MAC, "%x.", (pduP + mac_subheader_len)[i]);
|
||||||
|
|
||||||
LOG_T(MAC, "\n");
|
LOG_T(MAC, "\n");
|
||||||
#endif
|
#endif
|
||||||
@@ -4240,7 +4241,7 @@ void nr_ue_process_mac_pdu(module_id_t module_idP,
|
|||||||
ENB_FLAG_NO,
|
ENB_FLAG_NO,
|
||||||
MBMS_FLAG_NO,
|
MBMS_FLAG_NO,
|
||||||
rx_lcid,
|
rx_lcid,
|
||||||
(char *) (pdu_ptr + mac_subheader_len),
|
(char *) (pduP + mac_subheader_len),
|
||||||
mac_sdu_len,
|
mac_sdu_len,
|
||||||
1,
|
1,
|
||||||
NULL);
|
NULL);
|
||||||
@@ -4251,7 +4252,7 @@ void nr_ue_process_mac_pdu(module_id_t module_idP,
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
pdu_ptr += ( mac_subheader_len + mac_ce_len + mac_sdu_len );
|
pduP += ( mac_subheader_len + mac_ce_len + mac_sdu_len );
|
||||||
pdu_len -= ( mac_subheader_len + mac_ce_len + mac_sdu_len );
|
pdu_len -= ( mac_subheader_len + mac_ce_len + mac_sdu_len );
|
||||||
if (pdu_len < 0)
|
if (pdu_len < 0)
|
||||||
LOG_E(MAC, "[MAC] nr_ue_process_mac_pdu, residual mac pdu length %d < 0!\n", pdu_len);
|
LOG_E(MAC, "[MAC] nr_ue_process_mac_pdu, residual mac pdu length %d < 0!\n", pdu_len);
|
||||||
|
|||||||
@@ -223,135 +223,140 @@ void nr_config_Msg3_pdu(NR_UE_MAC_INST_t *mac,
|
|||||||
// TbD WIP Msg3 development ongoing
|
// TbD WIP Msg3 development ongoing
|
||||||
// - apply UL grant freq alloc & time alloc as per 8.2 TS 38.213
|
// - apply UL grant freq alloc & time alloc as per 8.2 TS 38.213
|
||||||
// - apply tpc command
|
// - apply tpc command
|
||||||
uint16_t nr_ue_process_rar(module_id_t mod_id,
|
// WIP fix:
|
||||||
int CC_id,
|
// - time domain indication hardcoded to 0 for k2 offset
|
||||||
frame_t frame,
|
// - extend TS 38.213 ch 8.3 Msg3 PUSCH
|
||||||
sub_frame_t slot,
|
// - b buffer
|
||||||
uint8_t * dlsch_buffer,
|
// - ulsch power offset
|
||||||
rnti_t * t_crnti,
|
// - optimize: mu_pusch, j and table_6_1_2_1_1_2_time_dom_res_alloc_A are already defined in nr_ue_procedures
|
||||||
uint8_t preamble_index,
|
void nr_ue_process_rar(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *ul_time_alignment, int pdu_id){
|
||||||
uint8_t * selected_rar_buffer){
|
|
||||||
|
|
||||||
NR_UE_MAC_INST_t *ue_mac = get_mac_inst(mod_id);
|
module_id_t mod_id = dl_info->module_id;
|
||||||
NR_RA_HEADER_RAPID *rarh = (NR_RA_HEADER_RAPID *) dlsch_buffer; // RAR subheader pointer
|
frame_t frame = dl_info->frame;
|
||||||
NR_MAC_RAR *rar = (NR_MAC_RAR *) (dlsch_buffer + 1); // RAR subPDU pointer
|
int slot = dl_info->slot;
|
||||||
uint8_t n_subPDUs = 0; // number of RAR payloads
|
int cc_id = dl_info->cc_id;
|
||||||
uint8_t n_subheaders = 0; // number of MAC RAR subheaders
|
uint8_t gNB_id = dl_info->gNB_index;
|
||||||
uint16_t ta_command = 0;
|
NR_UE_MAC_INST_t *ue_mac = get_mac_inst(mod_id);
|
||||||
|
uint8_t n_subPDUs = 0; // number of RAR payloads
|
||||||
|
uint8_t n_subheaders = 0; // number of MAC RAR subheaders
|
||||||
|
uint8_t *dlsch_buffer = dl_info->rx_ind->rx_indication_body[pdu_id].pdsch_pdu.pdu;
|
||||||
|
NR_RA_HEADER_RAPID *rarh = (NR_RA_HEADER_RAPID *) dlsch_buffer; // RAR subheader pointer
|
||||||
|
NR_MAC_RAR *rar = (NR_MAC_RAR *) (dlsch_buffer + 1); // RAR subPDU pointer
|
||||||
|
uint8_t preamble_index = get_ra_PreambleIndex(mod_id, cc_id, gNB_id); //prach_resources->ra_PreambleIndex;
|
||||||
|
|
||||||
AssertFatal(CC_id == 0, "RAR reception on secondary CCs is not supported yet\n");
|
LOG_D(MAC, "In %s:[%d.%d]: [UE %d][RAPROC] invoking MAC for received RAR (current preamble %d)\n", __FUNCTION__, frame, slot, mod_id, preamble_index);
|
||||||
|
|
||||||
while (1) {
|
|
||||||
n_subheaders++;
|
|
||||||
if (rarh->T == 1) {
|
|
||||||
n_subPDUs++;
|
|
||||||
LOG_D(MAC, "[UE %d][RAPROC] Got RAPID RAR subPDU\n", mod_id);
|
|
||||||
} else {
|
|
||||||
n_subPDUs++;
|
|
||||||
ue_mac->RA_backoff_indicator = table_7_2_1[((NR_RA_HEADER_BI *)rarh)->BI];
|
|
||||||
ue_mac->RA_BI_found = 1;
|
|
||||||
LOG_D(MAC, "[UE %d][RAPROC] Got BI RAR subPDU %d\n", mod_id, ue_mac->RA_backoff_indicator);
|
|
||||||
}
|
|
||||||
if (rarh->RAPID == preamble_index) {
|
|
||||||
LOG_I(PHY, "[UE %d][RAPROC][%d.%d] Found RAR with the intended RAPID %d\n", mod_id, frame, slot, rarh->RAPID);
|
|
||||||
rar = (NR_MAC_RAR *) (dlsch_buffer + n_subheaders + (n_subPDUs - 1) * sizeof(NR_MAC_RAR));
|
|
||||||
ue_mac->RA_RAPID_found = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (rarh->E == 0) {
|
|
||||||
LOG_I(PHY, "No RAR found with the intended RAPID. \n");
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
rarh += sizeof(NR_MAC_RAR) + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef DEBUG_RAR
|
|
||||||
LOG_D(MAC, "[DEBUG_RAR] (%d,%d) number of RAR subheader %d; number of RAR pyloads %d\n", frame, slot, n_subheaders, n_subPDUs);
|
|
||||||
LOG_D(MAC, "[DEBUG_RAR] Received RAR (%02x|%02x.%02x.%02x.%02x.%02x.%02x) for preamble %d/%d\n", *(uint8_t *) rarh, rar[0], rar[1], rar[2], rar[3], rar[4], rar[5], rarh->RAPID, preamble_index);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (ue_mac->RA_RAPID_found) {
|
|
||||||
|
|
||||||
uint8_t freq_hopping, mcs, Msg3_t_alloc, Msg3_f_alloc;
|
|
||||||
unsigned char tpc_command;
|
|
||||||
#ifdef DEBUG_RAR
|
|
||||||
unsigned char csi_req;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// TC-RNTI
|
|
||||||
*t_crnti = rar->TCRNTI_2 + (rar->TCRNTI_1 << 8);
|
|
||||||
ue_mac->t_crnti = *t_crnti;
|
|
||||||
// TA command
|
|
||||||
ta_command = rar->TA2 + (rar->TA1 << 5);
|
|
||||||
|
|
||||||
#ifdef DEBUG_RAR
|
|
||||||
// CSI
|
|
||||||
csi_req = (unsigned char) (rar->UL_GRANT_4 & 0x01);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// TPC
|
|
||||||
tpc_command = (unsigned char) ((rar->UL_GRANT_4 >> 1) & 0x07);
|
|
||||||
switch (tpc_command){
|
|
||||||
case 0:
|
|
||||||
ue_mac->Msg3_TPC = -6;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
ue_mac->Msg3_TPC = -4;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
ue_mac->Msg3_TPC = -2;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
ue_mac->Msg3_TPC = 0;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
ue_mac->Msg3_TPC = 2;
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
ue_mac->Msg3_TPC = 4;
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
ue_mac->Msg3_TPC = 6;
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
ue_mac->Msg3_TPC = 8;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// MCS
|
|
||||||
mcs = (unsigned char) (rar->UL_GRANT_4 >> 4);
|
|
||||||
// time alloc
|
|
||||||
Msg3_t_alloc = (unsigned char) (rar->UL_GRANT_3 & 0x07);
|
|
||||||
// frequency alloc
|
|
||||||
Msg3_f_alloc = (uint16_t) ((rar->UL_GRANT_3 >> 4) | (rar->UL_GRANT_2 << 4) | ((rar->UL_GRANT_1 & 0x03) << 12));
|
|
||||||
// frequency hopping
|
|
||||||
freq_hopping = (unsigned char) (rar->UL_GRANT_1 >> 2);
|
|
||||||
|
|
||||||
#ifdef DEBUG_RAR
|
|
||||||
LOG_D(MAC, "[DEBUG_RAR] Received RAR with t_alloc %d f_alloc %d ta_command %d mcs %d freq_hopping %d tpc_command %d csi_req %d t_crnti %x \n",
|
|
||||||
Msg3_t_alloc,
|
|
||||||
Msg3_f_alloc,
|
|
||||||
ta_command,
|
|
||||||
mcs,
|
|
||||||
freq_hopping,
|
|
||||||
tpc_command,
|
|
||||||
csi_req,
|
|
||||||
ue_mac->t_crnti);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Config Msg3 PDU
|
|
||||||
nr_config_Msg3_pdu(ue_mac, Msg3_f_alloc, Msg3_t_alloc, mcs, freq_hopping);
|
|
||||||
// Schedule Msg3
|
|
||||||
nr_ue_msg3_scheduler(ue_mac, frame, slot, Msg3_t_alloc);
|
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
n_subheaders++;
|
||||||
|
if (rarh->T == 1) {
|
||||||
|
n_subPDUs++;
|
||||||
|
LOG_D(MAC, "[UE %d][RAPROC] Got RAPID RAR subPDU\n", mod_id);
|
||||||
} else {
|
} else {
|
||||||
ue_mac->t_crnti = 0;
|
n_subPDUs++;
|
||||||
ta_command = (0xffff);
|
ue_mac->RA_backoff_indicator = table_7_2_1[((NR_RA_HEADER_BI *)rarh)->BI];
|
||||||
|
ue_mac->RA_BI_found = 1;
|
||||||
|
LOG_D(MAC, "[UE %d][RAPROC] Got BI RAR subPDU %d\n", mod_id, ue_mac->RA_backoff_indicator);
|
||||||
}
|
}
|
||||||
|
if (rarh->RAPID == preamble_index) {
|
||||||
|
LOG_I(MAC, "[UE %d][RAPROC][%d.%d] Found RAR with the intended RAPID %d\n", mod_id, frame, slot, rarh->RAPID);
|
||||||
|
rar = (NR_MAC_RAR *) (dlsch_buffer + n_subheaders + (n_subPDUs - 1) * sizeof(NR_MAC_RAR));
|
||||||
|
ue_mac->RA_RAPID_found = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (rarh->E == 0) {
|
||||||
|
LOG_W(PHY,"[UE %d][RAPROC] Received RAR preamble (%d) doesn't match the intended RAPID...\n", mod_id, preamble_index);
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
rarh += sizeof(NR_MAC_RAR) + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// move the selected RAR to the front of the RA_PDSCH buffer
|
#ifdef DEBUG_RAR
|
||||||
memcpy((void *) (selected_rar_buffer + 0), (void *) rarh, 1);
|
LOG_D(MAC, "[DEBUG_RAR] (%d,%d) number of RAR subheader %d; number of RAR pyloads %d\n", frame, slot, n_subheaders, n_subPDUs);
|
||||||
memcpy((void *) (selected_rar_buffer + 1), (void *) rar, sizeof(NR_MAC_RAR));
|
LOG_D(MAC, "[DEBUG_RAR] Received RAR (%02x|%02x.%02x.%02x.%02x.%02x.%02x) for preamble %d/%d\n", *(uint8_t *) rarh, rar[0], rar[1], rar[2], rar[3], rar[4], rar[5], rarh->RAPID, preamble_index);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (ue_mac->RA_RAPID_found) {
|
||||||
|
|
||||||
|
uint8_t freq_hopping, mcs, Msg3_t_alloc, Msg3_f_alloc;
|
||||||
|
unsigned char tpc_command;
|
||||||
|
#ifdef DEBUG_RAR
|
||||||
|
unsigned char csi_req;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// TC-RNTI
|
||||||
|
ue_mac->t_crnti = rar->TCRNTI_2 + (rar->TCRNTI_1 << 8);
|
||||||
|
|
||||||
|
// TA command
|
||||||
|
ul_time_alignment->apply_ta = 1;
|
||||||
|
ul_time_alignment->ta_command = rar->TA2 + (rar->TA1 << 5);
|
||||||
|
|
||||||
|
#ifdef DEBUG_RAR
|
||||||
|
// CSI
|
||||||
|
csi_req = (unsigned char) (rar->UL_GRANT_4 & 0x01);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// TPC
|
||||||
|
tpc_command = (unsigned char) ((rar->UL_GRANT_4 >> 1) & 0x07);
|
||||||
|
switch (tpc_command){
|
||||||
|
case 0:
|
||||||
|
ue_mac->Msg3_TPC = -6;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
ue_mac->Msg3_TPC = -4;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
ue_mac->Msg3_TPC = -2;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
ue_mac->Msg3_TPC = 0;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
ue_mac->Msg3_TPC = 2;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
ue_mac->Msg3_TPC = 4;
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
ue_mac->Msg3_TPC = 6;
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
ue_mac->Msg3_TPC = 8;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// MCS
|
||||||
|
mcs = (unsigned char) (rar->UL_GRANT_4 >> 4);
|
||||||
|
// time alloc
|
||||||
|
Msg3_t_alloc = (unsigned char) (rar->UL_GRANT_3 & 0x07);
|
||||||
|
// frequency alloc
|
||||||
|
Msg3_f_alloc = (uint16_t) ((rar->UL_GRANT_3 >> 4) | (rar->UL_GRANT_2 << 4) | ((rar->UL_GRANT_1 & 0x03) << 12));
|
||||||
|
// frequency hopping
|
||||||
|
freq_hopping = (unsigned char) (rar->UL_GRANT_1 >> 2);
|
||||||
|
|
||||||
|
#ifdef DEBUG_RAR
|
||||||
|
LOG_D(MAC, "In %s:[%d.%d]: [UE %d] Received RAR with t_alloc %d f_alloc %d ta_command %d mcs %d freq_hopping %d tpc_command %d csi_req %d t_crnti %x \n",
|
||||||
|
__FUNCTION__,
|
||||||
|
frame,
|
||||||
|
slot,
|
||||||
|
mod_id,
|
||||||
|
Msg3_t_alloc,
|
||||||
|
Msg3_f_alloc,
|
||||||
|
ul_time_alignment->ta_command,
|
||||||
|
mcs,
|
||||||
|
freq_hopping,
|
||||||
|
tpc_command,
|
||||||
|
csi_req,
|
||||||
|
ue_mac->t_crnti);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Config Msg3 PDU
|
||||||
|
nr_config_Msg3_pdu(ue_mac, Msg3_f_alloc, Msg3_t_alloc, mcs, freq_hopping);
|
||||||
|
// Schedule Msg3
|
||||||
|
nr_ue_msg3_scheduler(ue_mac, frame, slot, Msg3_t_alloc);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
ue_mac->t_crnti = 0;
|
||||||
|
ul_time_alignment->ta_command = (0xffff);
|
||||||
|
}
|
||||||
|
|
||||||
return ta_command;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1025,7 +1025,7 @@ void nr_fill_rar(uint8_t Mod_idP,
|
|||||||
uint8_t * dlsch_buffer,
|
uint8_t * dlsch_buffer,
|
||||||
nfapi_nr_pusch_pdu_t *pusch_pdu){
|
nfapi_nr_pusch_pdu_t *pusch_pdu){
|
||||||
|
|
||||||
LOG_I(MAC, "[gNB] Generate RAR MAC PDU frame %d slot %d preamble index %u\n", ra->Msg2_frame, ra-> Msg2_slot, ra->preamble_index);
|
LOG_I(MAC, "[gNB] Generate RAR MAC PDU frame %d slot %d preamble index %u TA command %d \n", ra->Msg2_frame, ra-> Msg2_slot, ra->preamble_index, ra->timing_offset);
|
||||||
NR_RA_HEADER_RAPID *rarh = (NR_RA_HEADER_RAPID *) dlsch_buffer;
|
NR_RA_HEADER_RAPID *rarh = (NR_RA_HEADER_RAPID *) dlsch_buffer;
|
||||||
NR_MAC_RAR *rar = (NR_MAC_RAR *) (dlsch_buffer + 1);
|
NR_MAC_RAR *rar = (NR_MAC_RAR *) (dlsch_buffer + 1);
|
||||||
unsigned char csi_req = 0, tpc_command;
|
unsigned char csi_req = 0, tpc_command;
|
||||||
|
|||||||
@@ -42,6 +42,8 @@
|
|||||||
|
|
||||||
#define MAX_IF_MODULES 100
|
#define MAX_IF_MODULES 100
|
||||||
|
|
||||||
|
const char *dl_indication_type[] = {"MIB", "SIB", "DLSCH", "DCI", "RAR"};
|
||||||
|
|
||||||
static nr_ue_if_module_t *nr_ue_if_module_inst[MAX_IF_MODULES];
|
static nr_ue_if_module_t *nr_ue_if_module_inst[MAX_IF_MODULES];
|
||||||
|
|
||||||
// L2 Abstraction Layer
|
// L2 Abstraction Layer
|
||||||
@@ -69,26 +71,13 @@ int handle_dci(module_id_t module_id, int cc_id, unsigned int gNB_index, frame_t
|
|||||||
return nr_ue_process_dci_indication_pdu(module_id, cc_id, gNB_index, frame, slot, dci);
|
return nr_ue_process_dci_indication_pdu(module_id, cc_id, gNB_index, frame, slot, dci);
|
||||||
|
|
||||||
}
|
}
|
||||||
// L2 Abstraction Layer
|
|
||||||
int8_t handle_dlsch (module_id_t module_id, int cc_id, uint8_t gNB_index, fapi_nr_dci_indication_t *dci_ind, uint8_t *pduP, uint32_t pdu_len, frame_t frame, int slot, NR_UL_TIME_ALIGNMENT_t *ul_time_alignment){
|
|
||||||
|
|
||||||
LOG_D(MAC, "handle_dlsch at MAC layer \n");
|
// L2 Abstraction Layer
|
||||||
//if (IS_SOFTMODEM_NOS1 || IS_SOFTMODEM_RFSIM)
|
// Note: sdu should always be processed because data and timing advance updates are transmitted by the UE
|
||||||
// sdu should be processed even when is S1 mode because data and timing advance updates are transmitted by the UE
|
int8_t handle_dlsch (nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *ul_time_alignment, int pdu_id){
|
||||||
nr_ue_send_sdu(module_id, cc_id, frame, slot,
|
|
||||||
pduP,
|
|
||||||
pdu_len,
|
|
||||||
gNB_index,
|
|
||||||
ul_time_alignment);
|
|
||||||
|
|
||||||
return 0;
|
nr_ue_send_sdu(dl_info, ul_time_alignment, pdu_id);
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
int8_t handle_rar (nr_downlink_indication_t *dl_info){
|
|
||||||
|
|
||||||
LOG_D(MAC, "handling RAR at MAC layer \n");
|
|
||||||
nr_process_rar (dl_info);
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -157,12 +146,15 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_
|
|||||||
|
|
||||||
if(dl_info->rx_ind != NULL){
|
if(dl_info->rx_ind != NULL){
|
||||||
|
|
||||||
LOG_D(MAC,"[L2][IF MODULE][DL INDICATION][RX_IND], Number of PDUs: %d \n", dl_info->rx_ind->number_pdus);
|
|
||||||
|
|
||||||
for(i=0; i<dl_info->rx_ind->number_pdus; ++i){
|
for(i=0; i<dl_info->rx_ind->number_pdus; ++i){
|
||||||
|
|
||||||
switch(dl_info->rx_ind->rx_indication_body[i].pdu_type){
|
switch(dl_info->rx_ind->rx_indication_body[i].pdu_type){
|
||||||
|
|
||||||
|
LOG_D(MAC, "In %s sending DL indication to MAC. 1 PDU type %s of %d total number of PDUs \n",
|
||||||
|
__FUNCTION__,
|
||||||
|
dl_indication_type[dl_info->rx_ind->rx_indication_body[i].pdu_type - 1],
|
||||||
|
dl_info->rx_ind->number_pdus);
|
||||||
|
|
||||||
case FAPI_NR_RX_PDU_TYPE_MIB:
|
case FAPI_NR_RX_PDU_TYPE_MIB:
|
||||||
ret_mask |= (handle_bcch_bch(dl_info->module_id, dl_info->cc_id, dl_info->gNB_index,
|
ret_mask |= (handle_bcch_bch(dl_info->module_id, dl_info->cc_id, dl_info->gNB_index,
|
||||||
(dl_info->rx_ind->rx_indication_body+i)->mib_pdu.pdu,
|
(dl_info->rx_ind->rx_indication_body+i)->mib_pdu.pdu,
|
||||||
@@ -171,8 +163,6 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_
|
|||||||
(dl_info->rx_ind->rx_indication_body+i)->mib_pdu.ssb_length,
|
(dl_info->rx_ind->rx_indication_body+i)->mib_pdu.ssb_length,
|
||||||
(dl_info->rx_ind->rx_indication_body+i)->mib_pdu.cell_id)) << FAPI_NR_RX_PDU_TYPE_MIB;
|
(dl_info->rx_ind->rx_indication_body+i)->mib_pdu.cell_id)) << FAPI_NR_RX_PDU_TYPE_MIB;
|
||||||
|
|
||||||
LOG_D(MAC,"[L2][IF MODULE][DL INDICATION][RX_IND], MIB case Number of PDUs: %d \n", dl_info->rx_ind->number_pdus);
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FAPI_NR_RX_PDU_TYPE_SIB:
|
case FAPI_NR_RX_PDU_TYPE_SIB:
|
||||||
@@ -187,21 +177,13 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_
|
|||||||
|
|
||||||
case FAPI_NR_RX_PDU_TYPE_DLSCH:
|
case FAPI_NR_RX_PDU_TYPE_DLSCH:
|
||||||
|
|
||||||
ret_mask |= (handle_dlsch(dl_info->module_id, dl_info->cc_id, dl_info->gNB_index,
|
ret_mask |= (handle_dlsch(dl_info, ul_time_alignment, i)) << FAPI_NR_RX_PDU_TYPE_DLSCH;
|
||||||
dl_info->dci_ind,
|
|
||||||
(dl_info->rx_ind->rx_indication_body+i)->pdsch_pdu.pdu,
|
|
||||||
(dl_info->rx_ind->rx_indication_body+i)->pdsch_pdu.pdu_length,
|
|
||||||
dl_info->frame,
|
|
||||||
dl_info->slot,
|
|
||||||
ul_time_alignment)) << FAPI_NR_RX_PDU_TYPE_DLSCH;
|
|
||||||
|
|
||||||
LOG_D(MAC,"[L2][IF MODULE][DL INDICATION][RX_IND], DLSCH case Number of PDUs: %d \n", dl_info->rx_ind->number_pdus);
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FAPI_NR_RX_PDU_TYPE_RAR:
|
case FAPI_NR_RX_PDU_TYPE_RAR:
|
||||||
|
|
||||||
ret_mask |= (handle_rar(dl_info)) << FAPI_NR_RX_PDU_TYPE_RAR;
|
ret_mask |= (handle_dlsch(dl_info, ul_time_alignment, i)) << FAPI_NR_RX_PDU_TYPE_RAR;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user