Merge remote-tracking branch 'origin/NR_UL_scheduling' into develop_integration_2020_w36
This commit is contained in:
@@ -162,7 +162,8 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
|
|||||||
/// CRC, coding, interleaving and rate matching
|
/// CRC, coding, interleaving and rate matching
|
||||||
AssertFatal(harq->pdu!=NULL,"harq->pdu is null\n");
|
AssertFatal(harq->pdu!=NULL,"harq->pdu is null\n");
|
||||||
start_meas(dlsch_encoding_stats);
|
start_meas(dlsch_encoding_stats);
|
||||||
nr_dlsch_encoding(harq->pdu, frame, slot, dlsch, frame_parms,tinput,tprep,tparity,toutput,
|
nr_dlsch_encoding(gNB,
|
||||||
|
harq->pdu, frame, slot, dlsch, frame_parms,tinput,tprep,tparity,toutput,
|
||||||
dlsch_rate_matching_stats,
|
dlsch_rate_matching_stats,
|
||||||
dlsch_interleaving_stats,
|
dlsch_interleaving_stats,
|
||||||
dlsch_segmentation_stats);
|
dlsch_segmentation_stats);
|
||||||
@@ -338,29 +339,25 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
|
|||||||
|
|
||||||
void dump_pdsch_stats(PHY_VARS_gNB *gNB) {
|
void dump_pdsch_stats(PHY_VARS_gNB *gNB) {
|
||||||
|
|
||||||
for (int i=0;i<NUMBER_OF_NR_DLSCH_MAX;i++)
|
for (int i=0;i<NUMBER_OF_NR_SCH_STATS_MAX;i++)
|
||||||
if (gNB->dlsch[i][0]->harq_mask > 0)
|
if (gNB->dlsch_stats[i].rnti > 0)
|
||||||
LOG_I(PHY,"DLSCH RNTI %x: round_trials %d(%1.1e)/%d(%1.1e)/%d(%1.1e)/%d/%d/%d/%d/%d, current_Qm %d, current_RI %d, total_bytes TX %d\n",
|
LOG_I(PHY,"DLSCH RNTI %x: round_trials %d(%1.1e):%d(%1.1e):%d(%1.1e):%d, current_Qm %d, current_RI %d, total_bytes TX %d\n",
|
||||||
gNB->dlsch[i][0]->rnti,
|
gNB->dlsch_stats[i].rnti,
|
||||||
gNB->dlsch[i][0]->stats.round_trials[0],
|
gNB->dlsch_stats[i].round_trials[0],
|
||||||
(double)gNB->dlsch[i][0]->stats.round_trials[1]/gNB->dlsch[i][0]->stats.round_trials[0],
|
(double)gNB->dlsch_stats[i].round_trials[1]/gNB->dlsch_stats[i].round_trials[0],
|
||||||
gNB->dlsch[i][0]->stats.round_trials[1],
|
gNB->dlsch_stats[i].round_trials[1],
|
||||||
(double)gNB->dlsch[i][0]->stats.round_trials[2]/gNB->dlsch[i][0]->stats.round_trials[1],
|
(double)gNB->dlsch_stats[i].round_trials[2]/gNB->dlsch_stats[i].round_trials[0],
|
||||||
gNB->dlsch[i][0]->stats.round_trials[2],
|
gNB->dlsch_stats[i].round_trials[2],
|
||||||
(double)gNB->dlsch[i][0]->stats.round_trials[3]/gNB->dlsch[i][0]->stats.round_trials[2],
|
(double)gNB->dlsch_stats[i].round_trials[3]/gNB->dlsch_stats[i].round_trials[0],
|
||||||
gNB->dlsch[i][0]->stats.round_trials[3],
|
gNB->dlsch_stats[i].round_trials[3],
|
||||||
gNB->dlsch[i][0]->stats.round_trials[4],
|
gNB->dlsch_stats[i].current_Qm,
|
||||||
gNB->dlsch[i][0]->stats.round_trials[5],
|
gNB->dlsch_stats[i].current_RI,
|
||||||
gNB->dlsch[i][0]->stats.round_trials[6],
|
gNB->dlsch_stats[i].total_bytes_tx);
|
||||||
gNB->dlsch[i][0]->stats.round_trials[7],
|
|
||||||
gNB->dlsch[i][0]->stats.current_Qm,
|
|
||||||
gNB->dlsch[i][0]->stats.current_RI,
|
|
||||||
gNB->dlsch[i][0]->stats.total_bytes_tx);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void clear_pdsch_stats(PHY_VARS_gNB *gNB) {
|
void clear_pdsch_stats(PHY_VARS_gNB *gNB) {
|
||||||
|
|
||||||
for (int i=0;i<NUMBER_OF_NR_DLSCH_MAX;i++)
|
for (int i=0;i<NUMBER_OF_NR_DLSCH_MAX;i++)
|
||||||
memset((void*)&gNB->dlsch[i][0]->stats,0,sizeof(gNB->dlsch[i][0]->stats));
|
memset((void*)&gNB->dlsch_stats[i],0,sizeof(gNB->dlsch_stats[i]));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,7 +82,8 @@ int16_t find_nr_dlsch(uint16_t rnti, PHY_VARS_gNB *gNB,find_type_t type);
|
|||||||
|
|
||||||
NR_gNB_SCH_STATS_t *find_nr_dlsch_stats(uint16_t rnti, PHY_VARS_gNB *gNB,find_type_t type);
|
NR_gNB_SCH_STATS_t *find_nr_dlsch_stats(uint16_t rnti, PHY_VARS_gNB *gNB,find_type_t type);
|
||||||
|
|
||||||
int nr_dlsch_encoding(unsigned char *a,int frame,
|
int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
|
||||||
|
unsigned char *a,int frame,
|
||||||
uint8_t slot,
|
uint8_t slot,
|
||||||
NR_gNB_DLSCH_t *dlsch,
|
NR_gNB_DLSCH_t *dlsch,
|
||||||
NR_DL_FRAME_PARMS* frame_parms,
|
NR_DL_FRAME_PARMS* frame_parms,
|
||||||
|
|||||||
@@ -309,7 +309,8 @@ void clean_gNB_dlsch(NR_gNB_DLSCH_t *dlsch)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int nr_dlsch_encoding(unsigned char *a,
|
int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
|
||||||
|
unsigned char *a,
|
||||||
int frame,
|
int frame,
|
||||||
uint8_t slot,
|
uint8_t slot,
|
||||||
NR_gNB_DLSCH_t *dlsch,
|
NR_gNB_DLSCH_t *dlsch,
|
||||||
@@ -354,13 +355,28 @@ int nr_dlsch_encoding(unsigned char *a,
|
|||||||
|
|
||||||
A = rel15->TBSize[0]<<3;
|
A = rel15->TBSize[0]<<3;
|
||||||
|
|
||||||
if (dlsch->harq_processes[harq_pid]->round == 0){
|
NR_gNB_SCH_STATS_t *stats=NULL;
|
||||||
dlsch->stats.total_bytes_tx += rel15->TBSize[0];
|
int first_free=-1;
|
||||||
dlsch->stats.current_RI = rel15->nrOfLayers;
|
for (int i=0;i<NUMBER_OF_NR_SCH_STATS_MAX;i++) {
|
||||||
dlsch->stats.current_Qm = rel15->qamModOrder[0];
|
if (gNB->dlsch_stats[i].rnti == 0 && first_free == -1) {
|
||||||
|
first_free = i;
|
||||||
|
stats=&gNB->dlsch_stats[i];
|
||||||
|
}
|
||||||
|
if (gNB->dlsch_stats[i].rnti == dlsch->rnti) {
|
||||||
|
stats=&gNB->dlsch_stats[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
dlsch->stats.round_trials[dlsch->harq_processes[harq_pid]->round]++;
|
|
||||||
|
|
||||||
|
if (stats) {
|
||||||
|
stats->round_trials[dlsch->harq_processes[harq_pid]->round]++;
|
||||||
|
stats->rnti = dlsch->rnti;
|
||||||
|
if (dlsch->harq_processes[harq_pid]->round == 0){
|
||||||
|
stats->total_bytes_tx += rel15->TBSize[0];
|
||||||
|
stats->current_RI = rel15->nrOfLayers;
|
||||||
|
stats->current_Qm = rel15->qamModOrder[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs,mod_order,rel15->nrOfLayers);
|
G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs,mod_order,rel15->nrOfLayers);
|
||||||
|
|
||||||
LOG_D(PHY,"dlsch coding A %d G %d mod_order %d\n", A,G, mod_order);
|
LOG_D(PHY,"dlsch coding A %d G %d mod_order %d\n", A,G, mod_order);
|
||||||
|
|||||||
@@ -140,29 +140,25 @@ void nr_ulsch_unscrambling_optim(int16_t* llr,
|
|||||||
void dump_pusch_stats(PHY_VARS_gNB *gNB) {
|
void dump_pusch_stats(PHY_VARS_gNB *gNB) {
|
||||||
|
|
||||||
for (int i=0;i<NUMBER_OF_NR_ULSCH_MAX;i++)
|
for (int i=0;i<NUMBER_OF_NR_ULSCH_MAX;i++)
|
||||||
if (gNB->ulsch[i][0]->rnti>0)
|
if (gNB->ulsch_stats[i].rnti>0)
|
||||||
LOG_I(PHY,"ULSCH RNTI %x: round_trials %d(%1.1e)/%d(%1.1e)/%d(%1.1e)/%d/%d/%d/%d/%d, current_Qm %d, current_RI %d, total_bytes RX/TX %d/%d\n",
|
LOG_I(PHY,"ULSCH RNTI %x: round_trials %d(%1.1e):%d(%1.1e):%d(%1.1e):%d, current_Qm %d, current_RI %d, total_bytes RX/SCHED %d/%d\n",
|
||||||
gNB->ulsch[i][0]->rnti,
|
gNB->ulsch_stats[i].rnti,
|
||||||
gNB->ulsch[i][0]->stats.round_trials[0],
|
gNB->ulsch_stats[i].round_trials[0],
|
||||||
(double)gNB->ulsch[i][0]->stats.round_trials[1]/gNB->ulsch[i][0]->stats.round_trials[0],
|
(double)gNB->ulsch_stats[i].round_trials[1]/gNB->ulsch_stats[i].round_trials[0],
|
||||||
gNB->ulsch[i][0]->stats.round_trials[1],
|
gNB->ulsch_stats[i].round_trials[1],
|
||||||
(double)gNB->ulsch[i][0]->stats.round_trials[2]/gNB->ulsch[i][0]->stats.round_trials[1],
|
(double)gNB->ulsch_stats[i].round_trials[2]/gNB->ulsch_stats[i].round_trials[0],
|
||||||
gNB->ulsch[i][0]->stats.round_trials[2],
|
gNB->ulsch_stats[i].round_trials[2],
|
||||||
(double)gNB->ulsch[i][0]->stats.round_trials[3]/gNB->ulsch[i][0]->stats.round_trials[2],
|
(double)gNB->ulsch_stats[i].round_trials[3]/gNB->ulsch_stats[i].round_trials[0],
|
||||||
gNB->ulsch[i][0]->stats.round_trials[3],
|
gNB->ulsch_stats[i].round_trials[3],
|
||||||
gNB->ulsch[i][0]->stats.round_trials[4],
|
gNB->ulsch_stats[i].current_Qm,
|
||||||
gNB->ulsch[i][0]->stats.round_trials[5],
|
gNB->ulsch_stats[i].current_RI,
|
||||||
gNB->ulsch[i][0]->stats.round_trials[6],
|
gNB->ulsch_stats[i].total_bytes_rx,
|
||||||
gNB->ulsch[i][0]->stats.round_trials[7],
|
gNB->ulsch_stats[i].total_bytes_tx);
|
||||||
gNB->ulsch[i][0]->stats.current_Qm,
|
|
||||||
gNB->ulsch[i][0]->stats.current_RI,
|
|
||||||
gNB->ulsch[i][0]->stats.total_bytes_rx,
|
|
||||||
gNB->ulsch[i][0]->stats.total_bytes_tx);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void clear_pusch_stats(PHY_VARS_gNB *gNB) {
|
void clear_pusch_stats(PHY_VARS_gNB *gNB) {
|
||||||
|
|
||||||
for (int i=0;i<NUMBER_OF_NR_ULSCH_MAX;i++)
|
for (int i=0;i<NUMBER_OF_NR_ULSCH_MAX;i++)
|
||||||
memset((void*)&gNB->ulsch[i][0]->stats,0,sizeof(gNB->ulsch[i][0]->stats));
|
memset((void*)&gNB->ulsch_stats[i],0,sizeof(gNB->ulsch_stats[i]));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -286,7 +286,7 @@ void clean_gNB_ulsch(NR_gNB_ULSCH_t *ulsch)
|
|||||||
static uint32_t prnt_crc_cnt = 0;
|
static uint32_t prnt_crc_cnt = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
uint32_t nr_ulsch_decoding(PHY_VARS_gNB *gNB,
|
||||||
uint8_t UE_id,
|
uint8_t UE_id,
|
||||||
short *ulsch_llr,
|
short *ulsch_llr,
|
||||||
NR_DL_FRAME_PARMS *frame_parms,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
@@ -308,7 +308,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
NR_gNB_ULSCH_t *ulsch = phy_vars_gNB->ulsch[UE_id][0];
|
NR_gNB_ULSCH_t *ulsch = gNB->ulsch[UE_id][0];
|
||||||
NR_UL_gNB_HARQ_t *harq_process = ulsch->harq_processes[harq_pid];
|
NR_UL_gNB_HARQ_t *harq_process = ulsch->harq_processes[harq_pid];
|
||||||
|
|
||||||
t_nrLDPC_dec_params decParams;
|
t_nrLDPC_dec_params decParams;
|
||||||
@@ -398,14 +398,28 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ulsch->stats.round_trials[harq_process->round]++;
|
NR_gNB_SCH_STATS_t *stats=NULL;
|
||||||
|
int first_free=-1;
|
||||||
|
for (int i=0;i<NUMBER_OF_NR_SCH_STATS_MAX;i++) {
|
||||||
|
if (gNB->ulsch_stats[i].rnti == 0 && first_free == -1) {
|
||||||
|
first_free = i;
|
||||||
|
stats=&gNB->ulsch_stats[i];
|
||||||
|
}
|
||||||
|
if (gNB->ulsch_stats[i].rnti == ulsch->rnti) {
|
||||||
|
stats=&gNB->ulsch_stats[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (stats) {
|
||||||
|
stats->rnti = ulsch->rnti;
|
||||||
|
stats->round_trials[harq_process->round]++;
|
||||||
|
}
|
||||||
if (harq_process->round == 0) {
|
if (harq_process->round == 0) {
|
||||||
|
if (stats) {
|
||||||
ulsch->stats.current_Qm = Qm;
|
stats->current_Qm = Qm;
|
||||||
ulsch->stats.current_RI = n_layers;
|
stats->current_RI = n_layers;
|
||||||
ulsch->stats.total_bytes_tx += harq_process->TBS;
|
stats->total_bytes_tx += harq_process->TBS;
|
||||||
|
}
|
||||||
// This is a new packet, so compute quantities regarding segmentation
|
// This is a new packet, so compute quantities regarding segmentation
|
||||||
if (A > 3824)
|
if (A > 3824)
|
||||||
harq_process->B = A+24;
|
harq_process->B = A+24;
|
||||||
@@ -463,7 +477,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
E = nr_get_E(G, harq_process->C, Qm, n_layers, r);
|
E = nr_get_E(G, harq_process->C, Qm, n_layers, r);
|
||||||
|
|
||||||
|
|
||||||
start_meas(&phy_vars_gNB->ulsch_deinterleaving_stats);
|
start_meas(&gNB->ulsch_deinterleaving_stats);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
///////////////////////////////// nr_deinterleaving_ldpc ///////////////////////////////////
|
///////////////////////////////// nr_deinterleaving_ldpc ///////////////////////////////////
|
||||||
@@ -479,7 +493,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
//for (int i =0; i<16; i++)
|
//for (int i =0; i<16; i++)
|
||||||
// printf("rx output deinterleaving w[%d]= %d r_offset %d\n", i,harq_process->w[r][i], r_offset);
|
// printf("rx output deinterleaving w[%d]= %d r_offset %d\n", i,harq_process->w[r][i], r_offset);
|
||||||
|
|
||||||
stop_meas(&phy_vars_gNB->ulsch_deinterleaving_stats);
|
stop_meas(&gNB->ulsch_deinterleaving_stats);
|
||||||
|
|
||||||
|
|
||||||
LOG_D(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rvidx %d, round %d)...\n",
|
LOG_D(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rvidx %d, round %d)...\n",
|
||||||
@@ -500,7 +514,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
|
|
||||||
///////////////////////// harq_process->e =====> harq_process->d /////////////////////////
|
///////////////////////// harq_process->e =====> harq_process->d /////////////////////////
|
||||||
|
|
||||||
start_meas(&phy_vars_gNB->ulsch_rate_unmatching_stats);
|
start_meas(&gNB->ulsch_rate_unmatching_stats);
|
||||||
|
|
||||||
Tbslbrm = nr_compute_tbslbrm(0,nb_rb,n_layers,harq_process->C);
|
Tbslbrm = nr_compute_tbslbrm(0,nb_rb,n_layers,harq_process->C);
|
||||||
|
|
||||||
@@ -517,12 +531,12 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
harq_process->F,
|
harq_process->F,
|
||||||
Kr-harq_process->F-2*(p_decParams->Z))==-1) {
|
Kr-harq_process->F-2*(p_decParams->Z))==-1) {
|
||||||
|
|
||||||
stop_meas(&phy_vars_gNB->ulsch_rate_unmatching_stats);
|
stop_meas(&gNB->ulsch_rate_unmatching_stats);
|
||||||
|
|
||||||
LOG_E(PHY,"ulsch_decoding.c: Problem in rate_matching\n");
|
LOG_E(PHY,"ulsch_decoding.c: Problem in rate_matching\n");
|
||||||
return (ulsch->max_ldpc_iterations + 1);
|
return (ulsch->max_ldpc_iterations + 1);
|
||||||
} else {
|
} else {
|
||||||
stop_meas(&phy_vars_gNB->ulsch_rate_unmatching_stats);
|
stop_meas(&gNB->ulsch_rate_unmatching_stats);
|
||||||
}
|
}
|
||||||
|
|
||||||
r_offset += E;
|
r_offset += E;
|
||||||
@@ -560,7 +574,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
|
|
||||||
if (err_flag == 0) {
|
if (err_flag == 0) {
|
||||||
|
|
||||||
start_meas(&phy_vars_gNB->ulsch_ldpc_decoding_stats);
|
start_meas(&gNB->ulsch_ldpc_decoding_stats);
|
||||||
|
|
||||||
//LOG_E(PHY,"AbsSubframe %d.%d Start LDPC segment %d/%d A %d ",frame%1024,nr_tti_rx,r,harq_process->C-1, A);
|
//LOG_E(PHY,"AbsSubframe %d.%d Start LDPC segment %d/%d A %d ",frame%1024,nr_tti_rx,r,harq_process->C-1, A);
|
||||||
|
|
||||||
@@ -603,7 +617,6 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
LOG_I(PHY, "Segment %d CRC OK\n",r);
|
LOG_I(PHY, "Segment %d CRC OK\n",r);
|
||||||
#endif
|
#endif
|
||||||
ret = no_iteration_ldpc;
|
ret = no_iteration_ldpc;
|
||||||
ulsch->stats.total_bytes_rx += harq_process->TBS;
|
|
||||||
} else {
|
} else {
|
||||||
#ifdef PRINT_CRC_CHECK
|
#ifdef PRINT_CRC_CHECK
|
||||||
//if (prnt_crc_cnt%10 == 0)
|
//if (prnt_crc_cnt%10 == 0)
|
||||||
@@ -629,7 +642,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
//write_output("dec_output.m","dec0",harq_process->c[0],Kr_bytes,1,4);
|
//write_output("dec_output.m","dec0",harq_process->c[0],Kr_bytes,1,4);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
stop_meas(&phy_vars_gNB->ulsch_ldpc_decoding_stats);
|
stop_meas(&gNB->ulsch_ldpc_decoding_stats);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((err_flag == 0) && (ret >= (ulsch->max_ldpc_iterations + 1))) {
|
if ((err_flag == 0) && (ret >= (ulsch->max_ldpc_iterations + 1))) {
|
||||||
@@ -652,7 +665,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
|
|
||||||
#ifdef gNB_DEBUG_TRACE
|
#ifdef gNB_DEBUG_TRACE
|
||||||
LOG_I(PHY,"[gNB %d] ULSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d) Kr %d r %d\n",
|
LOG_I(PHY,"[gNB %d] ULSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d) Kr %d r %d\n",
|
||||||
phy_vars_gNB->Mod_id, frame, nr_tti_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,Kr,r);
|
gNB->Mod_id, frame, nr_tti_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,Kr,r);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// harq_process->harq_ack.ack = 0;
|
// harq_process->harq_ack.ack = 0;
|
||||||
@@ -669,7 +682,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// LOG_D(PHY,"[gNB %d] ULSCH: Setting NACK for nr_tti_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
|
// LOG_D(PHY,"[gNB %d] ULSCH: Setting NACK for nr_tti_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
|
||||||
// phy_vars_gNB->Mod_id,nr_tti_rx,harq_pid,harq_process->status,harq_process->round,ulsch->Mlimit,harq_process->TBS);
|
// gNB->Mod_id,nr_tti_rx,harq_pid,harq_process->status,harq_process->round,ulsch->Mlimit,harq_process->TBS);
|
||||||
|
|
||||||
harq_process->handled = 1;
|
harq_process->handled = 1;
|
||||||
ret = ulsch->max_ldpc_iterations + 1;
|
ret = ulsch->max_ldpc_iterations + 1;
|
||||||
@@ -678,7 +691,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
|
|
||||||
#ifdef gNB_DEBUG_TRACE
|
#ifdef gNB_DEBUG_TRACE
|
||||||
LOG_I(PHY,"[gNB %d] ULSCH: Setting ACK for nr_tti_rx %d TBS %d\n",
|
LOG_I(PHY,"[gNB %d] ULSCH: Setting ACK for nr_tti_rx %d TBS %d\n",
|
||||||
phy_vars_gNB->Mod_id,nr_tti_rx,harq_process->TBS);
|
gNB->Mod_id,nr_tti_rx,harq_process->TBS);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
harq_process->status = SCH_IDLE;
|
harq_process->status = SCH_IDLE;
|
||||||
@@ -689,7 +702,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
// harq_process->harq_ack.harq_id = harq_pid;
|
// harq_process->harq_ack.harq_id = harq_pid;
|
||||||
// harq_process->harq_ack.send_harq_status = 1;
|
// harq_process->harq_ack.send_harq_status = 1;
|
||||||
|
|
||||||
// LOG_D(PHY,"[gNB %d] ULSCH: Setting ACK for nr_tti_rx %d (pid %d, round %d, TBS %d)\n",phy_vars_gNB->Mod_id,nr_tti_rx,harq_pid,harq_process->round,harq_process->TBS);
|
// LOG_D(PHY,"[gNB %d] ULSCH: Setting ACK for nr_tti_rx %d (pid %d, round %d, TBS %d)\n",gNB->Mod_id,nr_tti_rx,harq_pid,harq_process->round,harq_process->TBS);
|
||||||
|
|
||||||
|
|
||||||
// Reassembly of Transport block here
|
// Reassembly of Transport block here
|
||||||
@@ -712,6 +725,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
if (stats) stats->total_bytes_rx += harq_process->TBS;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_ULSCH_DECODING
|
#ifdef DEBUG_ULSCH_DECODING
|
||||||
|
|||||||
@@ -125,6 +125,7 @@ typedef struct {
|
|||||||
} NR_gNB_UL_PDCCH_t;
|
} NR_gNB_UL_PDCCH_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
uint16_t rnti;
|
||||||
int round_trials[8];
|
int round_trials[8];
|
||||||
int total_bytes_tx;
|
int total_bytes_tx;
|
||||||
int total_bytes_rx;
|
int total_bytes_rx;
|
||||||
@@ -175,8 +176,6 @@ typedef struct {
|
|||||||
int16_t sqrt_rho_a;
|
int16_t sqrt_rho_a;
|
||||||
/// amplitude of PDSCH (compared to RS) in symbols containing pilots
|
/// amplitude of PDSCH (compared to RS) in symbols containing pilots
|
||||||
int16_t sqrt_rho_b;
|
int16_t sqrt_rho_b;
|
||||||
/// statistics for measurement collection
|
|
||||||
NR_gNB_SCH_STATS_t stats;
|
|
||||||
} NR_gNB_DLSCH_t;
|
} NR_gNB_DLSCH_t;
|
||||||
|
|
||||||
|
|
||||||
@@ -357,8 +356,6 @@ typedef struct {
|
|||||||
uint8_t max_ldpc_iterations;
|
uint8_t max_ldpc_iterations;
|
||||||
/// number of iterations used in last LDPC decoding
|
/// number of iterations used in last LDPC decoding
|
||||||
uint8_t last_iteration_cnt;
|
uint8_t last_iteration_cnt;
|
||||||
/// statistics for measurement collection
|
|
||||||
NR_gNB_SCH_STATS_t stats;
|
|
||||||
} NR_gNB_ULSCH_t;
|
} NR_gNB_ULSCH_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -714,6 +711,11 @@ typedef struct PHY_VARS_gNB_s {
|
|||||||
NR_gNB_ULSCH_t *ulsch[NUMBER_OF_NR_ULSCH_MAX][2]; // [Nusers times][2 codewords]
|
NR_gNB_ULSCH_t *ulsch[NUMBER_OF_NR_ULSCH_MAX][2]; // [Nusers times][2 codewords]
|
||||||
NR_gNB_DLSCH_t *dlsch_SI,*dlsch_ra,*dlsch_p;
|
NR_gNB_DLSCH_t *dlsch_SI,*dlsch_ra,*dlsch_p;
|
||||||
NR_gNB_DLSCH_t *dlsch_PCH;
|
NR_gNB_DLSCH_t *dlsch_PCH;
|
||||||
|
/// statistics for DLSCH measurement collection
|
||||||
|
NR_gNB_SCH_STATS_t dlsch_stats[NUMBER_OF_NR_SCH_STATS_MAX];
|
||||||
|
/// statistics for ULSCH measurement collection
|
||||||
|
NR_gNB_SCH_STATS_t ulsch_stats[NUMBER_OF_NR_SCH_STATS_MAX];
|
||||||
|
|
||||||
t_nrPolar_params *uci_polarParams;
|
t_nrPolar_params *uci_polarParams;
|
||||||
|
|
||||||
uint8_t pbch_configured;
|
uint8_t pbch_configured;
|
||||||
|
|||||||
@@ -574,7 +574,8 @@ void phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((frame_rx&127) == 0) dump_pusch_stats(gNB);
|
// figure out a better way to choose slot_rx, 19 is ok for a particular TDD configuration with 30kHz SCS
|
||||||
|
if ((frame_rx&127) == 0 && slot_rx==19) dump_pusch_stats(gNB);
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_UESPEC_RX,0);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_UESPEC_RX,0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,6 +62,32 @@
|
|||||||
const uint8_t slots_per_frame[5] = {10, 20, 40, 80, 160};
|
const uint8_t slots_per_frame[5] = {10, 20, 40, 80, 160};
|
||||||
uint16_t nr_pdcch_order_table[6] = { 31, 31, 511, 2047, 2047, 8191 };
|
uint16_t nr_pdcch_order_table[6] = { 31, 31, 511, 2047, 2047, 8191 };
|
||||||
|
|
||||||
|
void clear_mac_stats(gNB_MAC_INST *gNB) {
|
||||||
|
memset((void*)gNB->UE_list.mac_stats,0,MAX_MOBILES_PER_GNB*sizeof(NR_mac_stats_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
void dump_mac_stats(gNB_MAC_INST *gNB) {
|
||||||
|
|
||||||
|
NR_UE_list_t *UE_list = &gNB->UE_list;
|
||||||
|
NR_mac_stats_t *stats;
|
||||||
|
int lc_id;
|
||||||
|
|
||||||
|
for (int UE_id=0;UE_id<MAX_MOBILES_PER_GNB;UE_id++) {
|
||||||
|
if (UE_list->active[UE_id] == TRUE) {
|
||||||
|
LOG_I(MAC,"UE %x\n",UE_list->rnti[UE_id]);
|
||||||
|
stats = &UE_list->mac_stats[UE_id];
|
||||||
|
LOG_I(MAC,"dlsch_rounds %d/%d/%d/%d, dlsch_errors %d\n",stats->dlsch_rounds[0],stats->dlsch_rounds[1],stats->dlsch_rounds[2],stats->dlsch_rounds[3],stats->dlsch_errors);
|
||||||
|
LOG_I(MAC,"dlsch_total_bytes %d\n",stats->dlsch_total_bytes);
|
||||||
|
LOG_I(MAC,"ulsch_rounds %d/%d/%d/%d, ulsch_errors %d\n",stats->ulsch_rounds[0],stats->ulsch_rounds[1],stats->ulsch_rounds[2],stats->ulsch_rounds[3],stats->ulsch_errors);
|
||||||
|
LOG_I(MAC,"ulsch_total_bytes_scheduled %d, ulsch_total_bytes_received %d\n",stats->ulsch_total_bytes_scheduled,stats->ulsch_total_bytes_rx);
|
||||||
|
for (lc_id=0;lc_id<63;lc_id++) {
|
||||||
|
if (stats->lc_bytes_tx[lc_id]>0) LOG_I(MAC,"LCID %d : %d bytes TX\n",lc_id,stats->lc_bytes_tx[lc_id]);
|
||||||
|
if (stats->lc_bytes_rx[lc_id]>0) LOG_I(MAC,"LCID %d : %d bytes RX\n",lc_id,stats->lc_bytes_rx[lc_id]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void clear_nr_nfapi_information(gNB_MAC_INST * gNB,
|
void clear_nr_nfapi_information(gNB_MAC_INST * gNB,
|
||||||
int CC_idP,
|
int CC_idP,
|
||||||
frame_t frameP,
|
frame_t frameP,
|
||||||
@@ -458,6 +484,7 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
|
|||||||
} //END for (i = 0; i < MAX_MOBILES_PER_GNB; i++)
|
} //END for (i = 0; i < MAX_MOBILES_PER_GNB; i++)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
if ((slot == 0) && (frame & 127) == 0) dump_mac_stats(RC.nrmac[module_idP]);
|
||||||
// This schedules MIB
|
// This schedules MIB
|
||||||
if((slot == 0) && (frame & 7) == 0){
|
if((slot == 0) && (frame & 7) == 0){
|
||||||
schedule_nr_mib(module_idP, frame, slot);
|
schedule_nr_mib(module_idP, frame, slot);
|
||||||
|
|||||||
@@ -76,6 +76,8 @@ int nr_generate_dlsch_pdu(module_id_t module_idP,
|
|||||||
//NR_CellGroupConfig_t *config = UE_list->secondaryCellGroup[UE_id];
|
//NR_CellGroupConfig_t *config = UE_list->secondaryCellGroup[UE_id];
|
||||||
ue_sched_ctl = &(UE_list->UE_sched_ctrl[UE_id]);
|
ue_sched_ctl = &(UE_list->UE_sched_ctrl[UE_id]);
|
||||||
|
|
||||||
|
NR_mac_stats_t *mac_stats = &(UE_list->mac_stats[UE_id]);
|
||||||
|
|
||||||
// 1) Compute MAC CE and related subheaders
|
// 1) Compute MAC CE and related subheaders
|
||||||
|
|
||||||
// DRX command subheader (MAC CE size 0)
|
// DRX command subheader (MAC CE size 0)
|
||||||
@@ -112,6 +114,8 @@ int nr_generate_dlsch_pdu(module_id_t module_idP,
|
|||||||
memcpy((void *) mac_pdu_ptr, (void *) ce_ptr, mac_ce_size);
|
memcpy((void *) mac_pdu_ptr, (void *) ce_ptr, mac_ce_size);
|
||||||
ce_ptr += mac_ce_size;
|
ce_ptr += mac_ce_size;
|
||||||
mac_pdu_ptr += (unsigned char) mac_ce_size;
|
mac_pdu_ptr += (unsigned char) mac_ce_size;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Contention resolution fixed subheader and MAC CE
|
// Contention resolution fixed subheader and MAC CE
|
||||||
@@ -324,6 +328,8 @@ int nr_generate_dlsch_pdu(module_id_t module_idP,
|
|||||||
memcpy((void *) mac_pdu_ptr, (void *) dlsch_buffer_ptr, sdu_lengths[i]);
|
memcpy((void *) mac_pdu_ptr, (void *) dlsch_buffer_ptr, sdu_lengths[i]);
|
||||||
dlsch_buffer_ptr += sdu_lengths[i];
|
dlsch_buffer_ptr += sdu_lengths[i];
|
||||||
mac_pdu_ptr += sdu_lengths[i];
|
mac_pdu_ptr += sdu_lengths[i];
|
||||||
|
|
||||||
|
mac_stats->lc_bytes_tx[sdu_lcids[i]] += sdu_lengths[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4) Compute final offset for padding
|
// 4) Compute final offset for padding
|
||||||
|
|||||||
@@ -320,7 +320,7 @@ int configure_fapi_dl_pdu(int Mod_idP,
|
|||||||
pdsch_pdu_rel15->nrOfLayers = 1;
|
pdsch_pdu_rel15->nrOfLayers = 1;
|
||||||
pdsch_pdu_rel15->transmissionScheme = 0;
|
pdsch_pdu_rel15->transmissionScheme = 0;
|
||||||
pdsch_pdu_rel15->refPoint = 0; // Point A
|
pdsch_pdu_rel15->refPoint = 0; // Point A
|
||||||
|
UE_list->mac_stats[UE_id].dlsch_rounds[UE_list->UE_sched_ctrl[UE_id].harq_processes[current_harq_pid].round]++;
|
||||||
pdsch_pdu_rel15->dmrsConfigType = bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1;
|
pdsch_pdu_rel15->dmrsConfigType = bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1;
|
||||||
pdsch_pdu_rel15->dlDmrsScramblingId = *scc->physCellId;
|
pdsch_pdu_rel15->dlDmrsScramblingId = *scc->physCellId;
|
||||||
pdsch_pdu_rel15->SCID = 0;
|
pdsch_pdu_rel15->SCID = 0;
|
||||||
@@ -455,6 +455,9 @@ int configure_fapi_dl_pdu(int Mod_idP,
|
|||||||
|
|
||||||
// Hardcode it for now
|
// Hardcode it for now
|
||||||
TBS = dl_tti_pdsch_pdu->pdsch_pdu.pdsch_pdu_rel15.TBSize[0];
|
TBS = dl_tti_pdsch_pdu->pdsch_pdu.pdsch_pdu_rel15.TBSize[0];
|
||||||
|
if (UE_list->UE_sched_ctrl[UE_id].harq_processes[current_harq_pid].round==0)
|
||||||
|
UE_list->mac_stats[UE_id].dlsch_total_bytes += TBS;
|
||||||
|
|
||||||
LOG_D(MAC, "DLSCH PDU: start PRB %d n_PRB %d startSymbolAndLength %d start symbol %d nb_symbols %d nb_layers %d nb_codewords %d mcs %d TBS: %d\n",
|
LOG_D(MAC, "DLSCH PDU: start PRB %d n_PRB %d startSymbolAndLength %d start symbol %d nb_symbols %d nb_layers %d nb_codewords %d mcs %d TBS: %d\n",
|
||||||
pdsch_pdu_rel15->rbStart,
|
pdsch_pdu_rel15->rbStart,
|
||||||
pdsch_pdu_rel15->rbSize,
|
pdsch_pdu_rel15->rbSize,
|
||||||
@@ -1031,6 +1034,8 @@ void schedule_fapi_ul_pdu(int Mod_idP,
|
|||||||
0,
|
0,
|
||||||
pusch_pdu->nrOfLayers)>>3;
|
pusch_pdu->nrOfLayers)>>3;
|
||||||
|
|
||||||
|
UE_list->mac_stats[UE_id].ulsch_rounds[cur_harq->round]++;
|
||||||
|
if (cur_harq->round == 0) UE_list->mac_stats[UE_id].ulsch_total_bytes_scheduled+=pusch_pdu->pusch_data.tb_size;
|
||||||
|
|
||||||
pusch_pdu->pusch_data.num_cb = 0; //CBG not supported
|
pusch_pdu->pusch_data.num_cb = 0; //CBG not supported
|
||||||
//pusch_pdu->pusch_data.cb_present_and_position;
|
//pusch_pdu->pusch_data.cb_present_and_position;
|
||||||
|
|||||||
@@ -211,7 +211,8 @@ void nr_process_mac_pdu(
|
|||||||
}
|
}
|
||||||
|
|
||||||
LOG_D(MAC, "[UE %d] Frame %d : ULSCH -> UL-DTCH %d (gNB %d, %d bytes)\n", module_idP, frameP, rx_lcid, module_idP, mac_sdu_len);
|
LOG_D(MAC, "[UE %d] Frame %d : ULSCH -> UL-DTCH %d (gNB %d, %d bytes)\n", module_idP, frameP, rx_lcid, module_idP, mac_sdu_len);
|
||||||
|
int UE_id = find_nr_UE_id(module_idP, rnti);
|
||||||
|
RC.nrmac[module_idP]->UE_list.mac_stats[UE_id].lc_bytes_rx[rx_lcid] += mac_sdu_len;
|
||||||
#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);
|
||||||
|
|
||||||
@@ -264,7 +265,7 @@ void nr_process_mac_pdu(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_nr_ul_harq(uint16_t slot, NR_UE_sched_ctrl_t *sched_ctrl, nfapi_nr_crc_t crc_pdu) {
|
void handle_nr_ul_harq(uint16_t slot, NR_UE_sched_ctrl_t *sched_ctrl, NR_mac_stats_t *stats, nfapi_nr_crc_t crc_pdu) {
|
||||||
|
|
||||||
int max_harq_rounds = 4; // TODO define macro
|
int max_harq_rounds = 4; // TODO define macro
|
||||||
uint8_t hrq_id = crc_pdu.harq_id;
|
uint8_t hrq_id = crc_pdu.harq_id;
|
||||||
@@ -289,9 +290,8 @@ void handle_nr_ul_harq(uint16_t slot, NR_UE_sched_ctrl_t *sched_ctrl, nfapi_nr_c
|
|||||||
cur_harq->ndi ^= 1;
|
cur_harq->ndi ^= 1;
|
||||||
cur_harq->state = INACTIVE; // failed after 4 rounds -> make inactive
|
cur_harq->state = INACTIVE; // failed after 4 rounds -> make inactive
|
||||||
cur_harq->round = 0;
|
cur_harq->round = 0;
|
||||||
#ifdef UL_HARQ_PRINT
|
LOG_D(MAC,"[HARQ HANDLER] RNTI %x: Ulharq id %d crc failed in all round, freeing it for scheduler\n",crc_pdu.rnti,hrq_id);
|
||||||
printf("[HARQ HANDLER] Ulharq id %d crc failed in all round, freeing it for scheduler\n",hrq_id);
|
stats->ulsch_errors++;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
} else
|
} else
|
||||||
@@ -384,6 +384,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
|
|||||||
if (UE_id != -1) {
|
if (UE_id != -1) {
|
||||||
UE_scheduling_control = &(UE_list->UE_sched_ctrl[UE_id]);
|
UE_scheduling_control = &(UE_list->UE_sched_ctrl[UE_id]);
|
||||||
|
|
||||||
|
UE_list->mac_stats[UE_id].ulsch_total_bytes_rx += sdu_lenP;
|
||||||
LOG_D(MAC, "[gNB %d][PUSCH %d] CC_id %d %d.%d Received ULSCH sdu from PHY (rnti %x, UE_id %d) ul_cqi %d\n",
|
LOG_D(MAC, "[gNB %d][PUSCH %d] CC_id %d %d.%d Received ULSCH sdu from PHY (rnti %x, UE_id %d) ul_cqi %d\n",
|
||||||
gnb_mod_idP,
|
gnb_mod_idP,
|
||||||
harq_pid,
|
harq_pid,
|
||||||
@@ -419,6 +420,9 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
|
|||||||
LOG_D(MAC, "Received PDU at MAC gNB \n");
|
LOG_D(MAC, "Received PDU at MAC gNB \n");
|
||||||
nr_process_mac_pdu(gnb_mod_idP, current_rnti, CC_idP, frameP, sduP, sdu_lenP);
|
nr_process_mac_pdu(gnb_mod_idP, current_rnti, CC_idP, frameP, sduP, sdu_lenP);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// random access pusch with TC-RNTI
|
// random access pusch with TC-RNTI
|
||||||
|
|||||||
@@ -340,7 +340,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
|
|||||||
const uint8_t ul_cqi,
|
const uint8_t ul_cqi,
|
||||||
const uint16_t rssi);
|
const uint16_t rssi);
|
||||||
|
|
||||||
void handle_nr_ul_harq(uint16_t slot, NR_UE_sched_ctrl_t *sched_ctrl, nfapi_nr_crc_t crc_pdu);
|
void handle_nr_ul_harq(uint16_t slot, NR_UE_sched_ctrl_t *sched_ctrl, NR_mac_stats_t *stats, nfapi_nr_crc_t crc_pdu);
|
||||||
|
|
||||||
void handle_nr_uci(NR_UL_IND_t *UL_info, NR_UE_sched_ctrl_t *sched_ctrl, int target_snrx10);
|
void handle_nr_uci(NR_UL_IND_t *UL_info, NR_UE_sched_ctrl_t *sched_ctrl, int target_snrx10);
|
||||||
#endif /*__LAYER2_NR_MAC_PROTO_H__*/
|
#endif /*__LAYER2_NR_MAC_PROTO_H__*/
|
||||||
|
|||||||
@@ -304,11 +304,25 @@ typedef struct NR_preamble_ue {
|
|||||||
uint8_t *preamble_list;
|
uint8_t *preamble_list;
|
||||||
} NR_preamble_ue;
|
} NR_preamble_ue;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
|
||||||
|
int lc_bytes_tx[64];
|
||||||
|
int lc_bytes_rx[64];
|
||||||
|
int dlsch_rounds[8];
|
||||||
|
int dlsch_errors;
|
||||||
|
int dlsch_total_bytes;
|
||||||
|
int ulsch_rounds[8];
|
||||||
|
int ulsch_errors;
|
||||||
|
int ulsch_total_bytes_scheduled;
|
||||||
|
int ulsch_total_bytes_rx;
|
||||||
|
} NR_mac_stats_t;
|
||||||
|
|
||||||
/*! \brief UE list used by gNB to order UEs/CC for scheduling*/
|
/*! \brief UE list used by gNB to order UEs/CC for scheduling*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
DLSCH_PDU DLSCH_pdu[4][MAX_MOBILES_PER_GNB];
|
DLSCH_PDU DLSCH_pdu[4][MAX_MOBILES_PER_GNB];
|
||||||
/// scheduling control info
|
/// scheduling control info
|
||||||
NR_UE_sched_ctrl_t UE_sched_ctrl[MAX_MOBILES_PER_GNB];
|
NR_UE_sched_ctrl_t UE_sched_ctrl[MAX_MOBILES_PER_GNB];
|
||||||
|
NR_mac_stats_t mac_stats[MAX_MOBILES_PER_GNB];
|
||||||
int next[MAX_MOBILES_PER_GNB];
|
int next[MAX_MOBILES_PER_GNB];
|
||||||
int head;
|
int head;
|
||||||
int next_ul[MAX_MOBILES_PER_GNB];
|
int next_ul[MAX_MOBILES_PER_GNB];
|
||||||
|
|||||||
@@ -78,7 +78,8 @@ void handle_nr_rach(NR_UL_IND_t *UL_info) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void handle_nr_ulsch(NR_UL_IND_t *UL_info, NR_UE_sched_ctrl_t *sched_ctrl) {
|
void handle_nr_ulsch(NR_UL_IND_t *UL_info, NR_UE_sched_ctrl_t *sched_ctrl, NR_mac_stats_t *stats) {
|
||||||
|
|
||||||
if(nfapi_mode == 1) {
|
if(nfapi_mode == 1) {
|
||||||
if (UL_info->crc_ind.number_crcs>0) {
|
if (UL_info->crc_ind.number_crcs>0) {
|
||||||
//LOG_D(PHY,"UL_info->crc_ind.crc_indication_body.number_of_crcs:%d CRC_IND:SFN/SF:%d\n", UL_info->crc_ind.crc_indication_body.number_of_crcs, NFAPI_SFNSF2DEC(UL_info->crc_ind.sfn_sf));
|
//LOG_D(PHY,"UL_info->crc_ind.crc_indication_body.number_of_crcs:%d CRC_IND:SFN/SF:%d\n", UL_info->crc_ind.crc_indication_body.number_of_crcs, NFAPI_SFNSF2DEC(UL_info->crc_ind.sfn_sf));
|
||||||
@@ -105,7 +106,7 @@ void handle_nr_ulsch(NR_UL_IND_t *UL_info, NR_UE_sched_ctrl_t *sched_ctrl) {
|
|||||||
UL_info->rx_ind.pdu_list[i].rnti) {
|
UL_info->rx_ind.pdu_list[i].rnti) {
|
||||||
LOG_D(PHY, "UL_info->crc_ind.crc_indication_body.crc_pdu_list[%d].crc_indication_rel8.crc_flag:%d\n", j, UL_info->crc_ind.crc_list[j].tb_crc_status);
|
LOG_D(PHY, "UL_info->crc_ind.crc_indication_body.crc_pdu_list[%d].crc_indication_rel8.crc_flag:%d\n", j, UL_info->crc_ind.crc_list[j].tb_crc_status);
|
||||||
|
|
||||||
handle_nr_ul_harq(UL_info->slot, sched_ctrl, UL_info->crc_ind.crc_list[j]);
|
handle_nr_ul_harq(UL_info->slot, sched_ctrl, stats, UL_info->crc_ind.crc_list[j]);
|
||||||
|
|
||||||
if (UL_info->crc_ind.crc_list[j].tb_crc_status == 1) { // CRC error indication
|
if (UL_info->crc_ind.crc_list[j].tb_crc_status == 1) { // CRC error indication
|
||||||
LOG_D(MAC,"Frame %d, Slot %d Calling rx_sdu (CRC error) \n",UL_info->frame,UL_info->slot);
|
LOG_D(MAC,"Frame %d, Slot %d Calling rx_sdu (CRC error) \n",UL_info->frame,UL_info->slot);
|
||||||
@@ -159,7 +160,6 @@ void NR_UL_indication(NR_UL_IND_t *UL_info) {
|
|||||||
NR_Sched_Rsp_t *sched_info = &Sched_INFO[module_id][CC_id];
|
NR_Sched_Rsp_t *sched_info = &Sched_INFO[module_id][CC_id];
|
||||||
NR_IF_Module_t *ifi = if_inst[module_id];
|
NR_IF_Module_t *ifi = if_inst[module_id];
|
||||||
gNB_MAC_INST *mac = RC.nrmac[module_id];
|
gNB_MAC_INST *mac = RC.nrmac[module_id];
|
||||||
|
|
||||||
LOG_D(PHY,"SFN/SF:%d%d module_id:%d CC_id:%d UL_info[rach_pdus:%d rx_ind:%d crcs:%d]\n",
|
LOG_D(PHY,"SFN/SF:%d%d module_id:%d CC_id:%d UL_info[rach_pdus:%d rx_ind:%d crcs:%d]\n",
|
||||||
UL_info->frame,UL_info->slot,
|
UL_info->frame,UL_info->slot,
|
||||||
module_id,CC_id, UL_info->rach_ind.number_of_pdus,
|
module_id,CC_id, UL_info->rach_ind.number_of_pdus,
|
||||||
@@ -180,10 +180,11 @@ void NR_UL_indication(NR_UL_IND_t *UL_info) {
|
|||||||
// clear DL/UL info for new scheduling round
|
// clear DL/UL info for new scheduling round
|
||||||
clear_nr_nfapi_information(mac,CC_id,UL_info->frame,UL_info->slot);
|
clear_nr_nfapi_information(mac,CC_id,UL_info->frame,UL_info->slot);
|
||||||
handle_nr_rach(UL_info);
|
handle_nr_rach(UL_info);
|
||||||
|
|
||||||
handle_nr_uci(UL_info,&mac->UE_list.UE_sched_ctrl[0],mac->pucch_target_snrx10);
|
handle_nr_uci(UL_info,&mac->UE_list.UE_sched_ctrl[0],mac->pucch_target_snrx10);
|
||||||
// clear HI prior to handling ULSCH
|
// clear HI prior to handling ULSCH
|
||||||
mac->UL_dci_req[CC_id].numPdus = 0;
|
mac->UL_dci_req[CC_id].numPdus = 0;
|
||||||
handle_nr_ulsch(UL_info, &mac->UE_list.UE_sched_ctrl[0]);
|
handle_nr_ulsch(UL_info, &mac->UE_list.UE_sched_ctrl[0],&mac->UE_list.mac_stats[0]);
|
||||||
|
|
||||||
if (nfapi_mode != 1) {
|
if (nfapi_mode != 1) {
|
||||||
if (ifi->CC_mask == ((1<<MAX_NUM_CCs)-1)) {
|
if (ifi->CC_mask == ((1<<MAX_NUM_CCs)-1)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user