rewriting downlink harq process function
This commit is contained in:
@@ -155,7 +155,7 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint
|
|||||||
if (dlsch->harq_processes[i]) {
|
if (dlsch->harq_processes[i]) {
|
||||||
memset(dlsch->harq_processes[i],0,sizeof(NR_DL_UE_HARQ_t));
|
memset(dlsch->harq_processes[i],0,sizeof(NR_DL_UE_HARQ_t));
|
||||||
init_downlink_harq_status(dlsch->harq_processes[i]);
|
init_downlink_harq_status(dlsch->harq_processes[i]);
|
||||||
dlsch->harq_processes[i]->first_tx=1;
|
dlsch->harq_processes[i]->first_rx=1;
|
||||||
dlsch->harq_processes[i]->b = (uint8_t *)malloc16(dlsch_bytes);
|
dlsch->harq_processes[i]->b = (uint8_t *)malloc16(dlsch_bytes);
|
||||||
|
|
||||||
if (dlsch->harq_processes[i]->b)
|
if (dlsch->harq_processes[i]->b)
|
||||||
@@ -358,7 +358,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (harq_process->round == 0) {
|
if (harq_process->first_rx == 1) {
|
||||||
// This is a new packet, so compute quantities regarding segmentation
|
// This is a new packet, so compute quantities regarding segmentation
|
||||||
if (A > NR_MAX_PDSCH_TBS)
|
if (A > NR_MAX_PDSCH_TBS)
|
||||||
harq_process->B = A+24;
|
harq_process->B = A+24;
|
||||||
@@ -448,7 +448,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
harq_process->w[r],
|
harq_process->w[r],
|
||||||
harq_process->C,
|
harq_process->C,
|
||||||
harq_process->rvidx,
|
harq_process->rvidx,
|
||||||
(harq_process->round==0)?1:0,
|
(harq_process->first_rx==1)?1:0,
|
||||||
E,
|
E,
|
||||||
harq_process->F,
|
harq_process->F,
|
||||||
Kr-harq_process->F-2*(p_decParams->Z))==-1) {
|
Kr-harq_process->F-2*(p_decParams->Z))==-1) {
|
||||||
@@ -771,7 +771,7 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (harq_process->round == 0) {
|
if (harq_process->first_rx == 1) {
|
||||||
// This is a new packet, so compute quantities regarding segmentation
|
// This is a new packet, so compute quantities regarding segmentation
|
||||||
if (A > NR_MAX_PDSCH_TBS)
|
if (A > NR_MAX_PDSCH_TBS)
|
||||||
harq_process->B = A+24;
|
harq_process->B = A+24;
|
||||||
@@ -909,7 +909,7 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
harq_process->w[r],
|
harq_process->w[r],
|
||||||
harq_process->C,
|
harq_process->C,
|
||||||
harq_process->rvidx,
|
harq_process->rvidx,
|
||||||
(harq_process->round==0)?1:0,
|
(harq_process->first_rx==1)?1:0,
|
||||||
E,
|
E,
|
||||||
harq_process->F,
|
harq_process->F,
|
||||||
Kr-harq_process->F-2*(p_decParams->Z))==-1) {
|
Kr-harq_process->F-2*(p_decParams->Z))==-1) {
|
||||||
@@ -1229,25 +1229,23 @@ void nr_dlsch_decoding_process(void *arg) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
harq_process->round =0;
|
if (harq_process->first_rx == 1) {
|
||||||
|
// This is a new packet, so compute quantities regarding segmentation
|
||||||
|
if (A > NR_MAX_PDSCH_TBS)
|
||||||
|
harq_process->B = A+24;
|
||||||
|
else
|
||||||
|
harq_process->B = A+16;
|
||||||
|
|
||||||
// if (harq_process->round == 0) {
|
nr_segmentation(NULL,
|
||||||
// This is a new packet, so compute quantities regarding segmentation
|
NULL,
|
||||||
if (A > NR_MAX_PDSCH_TBS)
|
harq_process->B,
|
||||||
harq_process->B = A+24;
|
&harq_process->C,
|
||||||
else
|
&harq_process->K,
|
||||||
harq_process->B = A+16;
|
&harq_process->Z,
|
||||||
|
&harq_process->F,
|
||||||
nr_segmentation(NULL,
|
p_decParams->BG);
|
||||||
NULL,
|
p_decParams->Z = harq_process->Z;
|
||||||
harq_process->B,
|
}
|
||||||
&harq_process->C,
|
|
||||||
&harq_process->K,
|
|
||||||
&harq_process->Z,
|
|
||||||
&harq_process->F,
|
|
||||||
p_decParams->BG);
|
|
||||||
p_decParams->Z = harq_process->Z;
|
|
||||||
// }
|
|
||||||
LOG_D(PHY,"round %d Z %d K %d BG %d\n", harq_process->round, p_decParams->Z, harq_process->K, p_decParams->BG);
|
LOG_D(PHY,"round %d Z %d K %d BG %d\n", harq_process->round, p_decParams->Z, harq_process->K, p_decParams->BG);
|
||||||
p_decParams->numMaxIter = dlsch->max_ldpc_iterations;
|
p_decParams->numMaxIter = dlsch->max_ldpc_iterations;
|
||||||
p_decParams->outMode= 0;
|
p_decParams->outMode= 0;
|
||||||
@@ -1314,7 +1312,7 @@ void nr_dlsch_decoding_process(void *arg) {
|
|||||||
harq_process->w[r],
|
harq_process->w[r],
|
||||||
harq_process->C,
|
harq_process->C,
|
||||||
harq_process->rvidx,
|
harq_process->rvidx,
|
||||||
(harq_process->round==0)?1:0,
|
(harq_process->first_rx==1)?1:0,
|
||||||
E,
|
E,
|
||||||
harq_process->F,
|
harq_process->F,
|
||||||
Kr-harq_process->F-2*(p_decParams->Z))==-1) {
|
Kr-harq_process->F-2*(p_decParams->Z))==-1) {
|
||||||
|
|||||||
@@ -206,8 +206,8 @@ typedef struct {
|
|||||||
} NR_UE_ULSCH_t;
|
} NR_UE_ULSCH_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
/// Indicator of first transmission
|
/// Indicator of first reception
|
||||||
uint8_t first_tx;
|
uint8_t first_rx;
|
||||||
/// Last Ndi received for this process on DCI (used for C-RNTI only)
|
/// Last Ndi received for this process on DCI (used for C-RNTI only)
|
||||||
uint8_t DCINdi;
|
uint8_t DCINdi;
|
||||||
/// DLSCH status flag indicating
|
/// DLSCH status flag indicating
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
|
|||||||
}
|
}
|
||||||
dlsch0_harq->Nl = Nl;
|
dlsch0_harq->Nl = Nl;
|
||||||
dlsch0_harq->mcs_table=dlsch_config_pdu->mcs_table;
|
dlsch0_harq->mcs_table=dlsch_config_pdu->mcs_table;
|
||||||
downlink_harq_process(dlsch0_harq, dlsch0->current_harq_pid, dlsch_config_pdu->ndi, dlsch0->rnti_type);
|
downlink_harq_process(dlsch0_harq, dlsch0->current_harq_pid, dlsch_config_pdu->ndi, dlsch_config_pdu->rv, dlsch0->rnti_type);
|
||||||
if (dlsch0_harq->status != ACTIVE) {
|
if (dlsch0_harq->status != ACTIVE) {
|
||||||
// dlsch0_harq->status not ACTIVE may be due to false retransmission. Reset the
|
// dlsch0_harq->status not ACTIVE may be due to false retransmission. Reset the
|
||||||
// following flag to skip PDSCH procedures in that case.
|
// following flag to skip PDSCH procedures in that case.
|
||||||
|
|||||||
@@ -306,7 +306,7 @@ harq_result_t uplink_harq_process(NR_UE_ULSCH_t *ulsch, int harq_pid, int ndi, u
|
|||||||
void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq)
|
void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq)
|
||||||
{
|
{
|
||||||
dl_harq->status = SCH_IDLE;
|
dl_harq->status = SCH_IDLE;
|
||||||
dl_harq->first_tx = 1;
|
dl_harq->first_rx = 1;
|
||||||
dl_harq->round = 0;
|
dl_harq->round = 0;
|
||||||
dl_harq->ack = DL_ACKNACK_NO_SET;
|
dl_harq->ack = DL_ACKNACK_NO_SET;
|
||||||
}
|
}
|
||||||
@@ -328,39 +328,63 @@ void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq)
|
|||||||
*
|
*
|
||||||
*********************************************************************/
|
*********************************************************************/
|
||||||
|
|
||||||
void downlink_harq_process(NR_DL_UE_HARQ_t *dl_harq, int harq_pid, int ndi, uint8_t rnti_type) {
|
void downlink_harq_process(NR_DL_UE_HARQ_t *dl_harq, int harq_pid, int ndi, int rv, uint8_t rnti_type) {
|
||||||
|
|
||||||
if (rnti_type == _CS_RNTI_) {
|
|
||||||
LOG_E(PHY, "Fatal error in HARQ entity due to not supported CS_RNTI at line %d in function %s of file %s \n", __LINE__ , __func__, __FILE__);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else if ((rnti_type != _C_RNTI_) && (rnti_type != _TC_RNTI_)) {
|
|
||||||
/* harq mechanism is not relevant for other rnti */
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dl_harq->first_tx == 1) {
|
if (rnti_type == _SI_RNTI_ ||
|
||||||
|
rnti_type == _P_RNTI_ ||
|
||||||
|
rnti_type == _RA_RNTI_) {
|
||||||
dl_harq->round = 0;
|
dl_harq->round = 0;
|
||||||
dl_harq->status = ACTIVE;
|
dl_harq->status = ACTIVE;
|
||||||
dl_harq->DCINdi = ndi;
|
dl_harq->first_rx = 1;
|
||||||
dl_harq->first_tx = 0;
|
|
||||||
|
|
||||||
LOG_D(PHY, "[HARQ-DL-PDSCH harqId : %d] first new reception \n", harq_pid);
|
|
||||||
}
|
}
|
||||||
else if (dl_harq->DCINdi != ndi) {
|
else{
|
||||||
dl_harq->round = 0;
|
switch(rv){
|
||||||
dl_harq->status = ACTIVE;
|
case 0:
|
||||||
dl_harq->DCINdi = ndi;
|
dl_harq->round = 0;
|
||||||
|
dl_harq->status = ACTIVE;
|
||||||
LOG_D(PHY, "[HARQ-DL-PDSCH harqId : %d] new reception due to toogle of ndi \n", harq_pid);
|
dl_harq->first_rx = 1;
|
||||||
|
if (dl_harq->DCINdi == ndi)
|
||||||
|
LOG_E(PHY,"Warning! rv %d indicates new transmission but new ndi %d is the same as old ndi %d\n",rv,ndi,dl_harq->DCINdi);
|
||||||
|
dl_harq->DCINdi = ndi;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
dl_harq->round = 2;
|
||||||
|
if (dl_harq->DCINdi != ndi) {
|
||||||
|
LOG_E(PHY,"Missed previous DCI detections. NDI toggled but rv %d does not correspond to first reception\n",rv);
|
||||||
|
dl_harq->status = ACTIVE;
|
||||||
|
dl_harq->first_rx = 1;
|
||||||
|
dl_harq->DCINdi = ndi;
|
||||||
|
}
|
||||||
|
else if (dl_harq->ack)
|
||||||
|
dl_harq->status = SCH_IDLE;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
dl_harq->round = 1;
|
||||||
|
if (dl_harq->DCINdi != ndi) {
|
||||||
|
LOG_E(PHY,"Missed previous DCI detections. NDI toggled but rv %d does not correspond to first reception\n",rv);
|
||||||
|
dl_harq->status = ACTIVE;
|
||||||
|
dl_harq->first_rx = 1;
|
||||||
|
dl_harq->DCINdi = ndi;
|
||||||
|
}
|
||||||
|
else if (dl_harq->ack)
|
||||||
|
dl_harq->status = SCH_IDLE;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
dl_harq->round = 3;
|
||||||
|
if (dl_harq->DCINdi != ndi) {
|
||||||
|
LOG_E(PHY,"Missed previous DCI detections. NDI toggled but rv %d does not correspond to first reception\n",rv);
|
||||||
|
dl_harq->status = ACTIVE;
|
||||||
|
dl_harq->first_rx = 1;
|
||||||
|
dl_harq->DCINdi = ndi;
|
||||||
|
}
|
||||||
|
else if (dl_harq->ack)
|
||||||
|
dl_harq->status = SCH_IDLE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
AssertFatal(1==0,"Invalid value for rv %d\n",rv);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
|
|
||||||
dl_harq->round++;
|
|
||||||
|
|
||||||
if (dl_harq->ack) dl_harq->status = SCH_IDLE;
|
|
||||||
|
|
||||||
LOG_D(PHY, "[HARQ-DL-PDSCH harqId : %d] reception of a retransmission \n", harq_pid);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq);
|
|||||||
@param rnti_type type of rnti
|
@param rnti_type type of rnti
|
||||||
@returns retransmission or new transmission */
|
@returns retransmission or new transmission */
|
||||||
|
|
||||||
void downlink_harq_process(NR_DL_UE_HARQ_t *dlsch, int harq_pid, int ndi, uint8_t rnti_type);
|
void downlink_harq_process(NR_DL_UE_HARQ_t *dlsch, int harq_pid, int ndi, int rv, uint8_t rnti_type);
|
||||||
|
|
||||||
#undef EXTERN
|
#undef EXTERN
|
||||||
#undef INIT_VARIABLES_HARQ_NR_H
|
#undef INIT_VARIABLES_HARQ_NR_H
|
||||||
|
|||||||
Reference in New Issue
Block a user