integration_2021_wk36
MR !1252 : Bugfix nr rlc w36 Fix a bug about segmentation present in both NR RLC AM and NR RLC UM. MR !1253 : minor: T tracer: be more verbose for DLSCH DCI MR !1254 : fix for pointa computation in sib1 Fix computation of pointA in SIB1 MR !1217 : fix-physim-run-script-on-cluster oai-nr-dlsim may seem fine but in fact, test21 may or may not be executed. On some run example, we do not have finished message on nr-dlsim pod. MR !1255 : Attempt to fix nr-dlsim Test 21 (4x4 MIMO, 2 Layers)
This commit is contained in:
@@ -16,7 +16,7 @@ ID = ENB_PHY_DL_TICK
|
|||||||
ID = ENB_PHY_DLSCH_UE_DCI
|
ID = ENB_PHY_DLSCH_UE_DCI
|
||||||
DESC = eNodeB downlink UE specific DCI as sent by the PHY layer
|
DESC = eNodeB downlink UE specific DCI as sent by the PHY layer
|
||||||
GROUP = ALL:PHY:GRAPHIC:ENB
|
GROUP = ALL:PHY:GRAPHIC:ENB
|
||||||
FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,dci_format : int,harq_pid : int,mcs : int,TBS
|
FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,dci_format : int,harq_pid : int,mcs : int,TBS : int,ndi : int,rv : int,rbc : int,nb_rb : int,rb_alloc
|
||||||
ID = ENB_PHY_DLSCH_UE_ACK
|
ID = ENB_PHY_DLSCH_UE_ACK
|
||||||
DESC = eNodeB downlink UE ACK as seen by the PHY layer in process_HARQ_feedback
|
DESC = eNodeB downlink UE ACK as seen by the PHY layer in process_HARQ_feedback
|
||||||
GROUP = ALL:PHY:GRAPHIC:ENB
|
GROUP = ALL:PHY:GRAPHIC:ENB
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ RUN yum update -y && \
|
|||||||
nettle \
|
nettle \
|
||||||
net-tools \
|
net-tools \
|
||||||
iputils \
|
iputils \
|
||||||
|
iproute \
|
||||||
atlas \
|
atlas \
|
||||||
libXpm \
|
libXpm \
|
||||||
libX11 \
|
libX11 \
|
||||||
|
|||||||
@@ -1527,7 +1527,9 @@ void fill_dci_and_dlsch(PHY_VARS_eNB *eNB,
|
|||||||
if (dlsch0->active)
|
if (dlsch0->active)
|
||||||
T(T_ENB_PHY_DLSCH_UE_DCI, T_INT(0), T_INT(frame), T_INT(subframe),
|
T(T_ENB_PHY_DLSCH_UE_DCI, T_INT(0), T_INT(frame), T_INT(subframe),
|
||||||
T_INT(rel8->rnti), T_INT(rel8->dci_format), T_INT(rel8->harq_process),
|
T_INT(rel8->rnti), T_INT(rel8->dci_format), T_INT(rel8->harq_process),
|
||||||
T_INT(rel8->mcs_1), T_INT(dlsch0_harq->TBS));
|
T_INT(rel8->mcs_1), T_INT(dlsch0_harq->TBS), T_INT(rel8->new_data_indicator_1),
|
||||||
|
T_INT(rel8->redundancy_version_1), T_INT(rel8->resource_block_coding),
|
||||||
|
T_INT(dlsch0_harq->nb_rb), T_INT(dlsch0_harq->rb_alloc[0]));
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -267,6 +267,8 @@ void nr_dlsim_preprocessor(module_id_t module_id,
|
|||||||
|
|
||||||
NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
|
NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
|
||||||
|
|
||||||
|
ps->nrOfLayers = g_nrOfLayers;
|
||||||
|
|
||||||
nr_set_pdsch_semi_static(scc,
|
nr_set_pdsch_semi_static(scc,
|
||||||
UE_info->CellGroup[0],
|
UE_info->CellGroup[0],
|
||||||
sched_ctrl->active_bwp,
|
sched_ctrl->active_bwp,
|
||||||
@@ -282,7 +284,6 @@ void nr_dlsim_preprocessor(module_id_t module_id,
|
|||||||
* configuration */
|
* configuration */
|
||||||
ps->mcsTableIdx = g_mcsTableIdx;
|
ps->mcsTableIdx = g_mcsTableIdx;
|
||||||
|
|
||||||
sched_pdsch->nrOfLayers = g_nrOfLayers;
|
|
||||||
sched_pdsch->Qm = nr_get_Qm_dl(sched_pdsch->mcs, ps->mcsTableIdx);
|
sched_pdsch->Qm = nr_get_Qm_dl(sched_pdsch->mcs, ps->mcsTableIdx);
|
||||||
sched_pdsch->R = nr_get_code_rate_dl(sched_pdsch->mcs, ps->mcsTableIdx);
|
sched_pdsch->R = nr_get_code_rate_dl(sched_pdsch->mcs, ps->mcsTableIdx);
|
||||||
sched_pdsch->tb_size = nr_compute_tbs(sched_pdsch->Qm,
|
sched_pdsch->tb_size = nr_compute_tbs(sched_pdsch->Qm,
|
||||||
@@ -292,7 +293,7 @@ void nr_dlsim_preprocessor(module_id_t module_id,
|
|||||||
ps->N_PRB_DMRS * ps->N_DMRS_SLOT,
|
ps->N_PRB_DMRS * ps->N_DMRS_SLOT,
|
||||||
0 /* N_PRB_oh, 0 for initialBWP */,
|
0 /* N_PRB_oh, 0 for initialBWP */,
|
||||||
0 /* tb_scaling */,
|
0 /* tb_scaling */,
|
||||||
sched_pdsch->nrOfLayers)
|
ps->nrOfLayers)
|
||||||
>> 3;
|
>> 3;
|
||||||
|
|
||||||
/* the simulator assumes the HARQ PID is equal to the slot number */
|
/* the simulator assumes the HARQ PID is equal to the slot number */
|
||||||
|
|||||||
@@ -455,9 +455,7 @@ bool allocate_dl_retransmission(module_id_t module_id,
|
|||||||
int rbStart = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
|
int rbStart = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
|
||||||
|
|
||||||
NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
|
NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
|
||||||
const long f = sched_ctrl->search_space->searchSpaceType->choice.ue_Specific->dci_Formats;
|
const long f = sched_ctrl->active_bwp ? sched_ctrl->search_space->searchSpaceType->choice.ue_Specific->dci_Formats : 0;
|
||||||
const uint8_t num_dmrs_cdm_grps_no_data = sched_ctrl->active_bwp ? (f ? 1 : (ps->nrOfSymbols == 2 ? 1 : 2)) : (ps->nrOfSymbols == 2 ? 1 : 2);
|
|
||||||
|
|
||||||
int rbSize = 0;
|
int rbSize = 0;
|
||||||
const int tda = sched_ctrl->active_bwp ? RC.nrmac[module_id]->preferred_dl_tda[sched_ctrl->active_bwp->bwp_Id][slot] : 1;
|
const int tda = sched_ctrl->active_bwp ? RC.nrmac[module_id]->preferred_dl_tda[sched_ctrl->active_bwp->bwp_Id][slot] : 1;
|
||||||
if (tda == retInfo->time_domain_allocation) {
|
if (tda == retInfo->time_domain_allocation) {
|
||||||
@@ -476,9 +474,8 @@ bool allocate_dl_retransmission(module_id_t module_id,
|
|||||||
}
|
}
|
||||||
/* check whether we need to switch the TDA allocation since the last
|
/* check whether we need to switch the TDA allocation since the last
|
||||||
* (re-)transmission */
|
* (re-)transmission */
|
||||||
if (ps->time_domain_allocation != tda || ps->numDmrsCdmGrpsNoData != num_dmrs_cdm_grps_no_data)
|
if (ps->time_domain_allocation != tda)
|
||||||
nr_set_pdsch_semi_static(
|
nr_set_pdsch_semi_static(scc, UE_info->CellGroup[UE_id], sched_ctrl->active_bwp, tda, f, ps);
|
||||||
scc, UE_info->CellGroup[UE_id], sched_ctrl->active_bwp, tda, num_dmrs_cdm_grps_no_data, ps);
|
|
||||||
} else {
|
} else {
|
||||||
/* the retransmission will use a different time domain allocation, check
|
/* the retransmission will use a different time domain allocation, check
|
||||||
* that we have enough resources */
|
* that we have enough resources */
|
||||||
@@ -487,8 +484,8 @@ bool allocate_dl_retransmission(module_id_t module_id,
|
|||||||
while (rbStart + rbSize < bwpSize && rballoc_mask[rbStart + rbSize])
|
while (rbStart + rbSize < bwpSize && rballoc_mask[rbStart + rbSize])
|
||||||
rbSize++;
|
rbSize++;
|
||||||
NR_pdsch_semi_static_t temp_ps;
|
NR_pdsch_semi_static_t temp_ps;
|
||||||
nr_set_pdsch_semi_static(
|
temp_ps.nrOfLayers = 1;
|
||||||
scc, UE_info->CellGroup[UE_id], sched_ctrl->active_bwp, tda, num_dmrs_cdm_grps_no_data, &temp_ps);
|
nr_set_pdsch_semi_static(scc, UE_info->CellGroup[UE_id], sched_ctrl->active_bwp, tda, f, &temp_ps);
|
||||||
uint32_t new_tbs;
|
uint32_t new_tbs;
|
||||||
uint16_t new_rbSize;
|
uint16_t new_rbSize;
|
||||||
bool success = nr_find_nb_rb(retInfo->Qm,
|
bool success = nr_find_nb_rb(retInfo->Qm,
|
||||||
@@ -604,7 +601,7 @@ void pf_dl(module_id_t module_id,
|
|||||||
|
|
||||||
/* Calculate coeff */
|
/* Calculate coeff */
|
||||||
sched_pdsch->mcs = 9;
|
sched_pdsch->mcs = 9;
|
||||||
sched_pdsch->nrOfLayers = 1;
|
ps->nrOfLayers = 1;
|
||||||
uint32_t tbs = pf_tbs[ps->mcsTableIdx][sched_pdsch->mcs];
|
uint32_t tbs = pf_tbs[ps->mcsTableIdx][sched_pdsch->mcs];
|
||||||
coeff_ue[UE_id] = (float) tbs / thr_ue[UE_id];
|
coeff_ue[UE_id] = (float) tbs / thr_ue[UE_id];
|
||||||
LOG_D(NR_MAC,"b %d, thr_ue[%d] %f, tbs %d, coeff_ue[%d] %f\n",
|
LOG_D(NR_MAC,"b %d, thr_ue[%d] %f, tbs %d, coeff_ue[%d] %f\n",
|
||||||
@@ -684,11 +681,9 @@ void pf_dl(module_id_t module_id,
|
|||||||
const int tda = sched_ctrl->active_bwp ? RC.nrmac[module_id]->preferred_dl_tda[sched_ctrl->active_bwp->bwp_Id][slot] : 1;
|
const int tda = sched_ctrl->active_bwp ? RC.nrmac[module_id]->preferred_dl_tda[sched_ctrl->active_bwp->bwp_Id][slot] : 1;
|
||||||
NR_sched_pdsch_t *sched_pdsch = &sched_ctrl->sched_pdsch;
|
NR_sched_pdsch_t *sched_pdsch = &sched_ctrl->sched_pdsch;
|
||||||
NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
|
NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
|
||||||
const long f = sched_ctrl->search_space->searchSpaceType->choice.ue_Specific->dci_Formats;
|
const long f = sched_ctrl->active_bwp ? sched_ctrl->search_space->searchSpaceType->choice.ue_Specific->dci_Formats : 0;
|
||||||
const uint8_t num_dmrs_cdm_grps_no_data = sched_ctrl->active_bwp ? (f ? 1 : (ps->nrOfSymbols == 2 ? 1 : 2)) : (ps->nrOfSymbols == 2 ? 1 : 2);
|
if (ps->time_domain_allocation != tda)
|
||||||
if (ps->time_domain_allocation != tda || ps->numDmrsCdmGrpsNoData != num_dmrs_cdm_grps_no_data)
|
nr_set_pdsch_semi_static(scc, UE_info->CellGroup[UE_id], sched_ctrl->active_bwp, tda, f, ps);
|
||||||
nr_set_pdsch_semi_static(
|
|
||||||
scc, UE_info->CellGroup[UE_id], sched_ctrl->active_bwp, tda, num_dmrs_cdm_grps_no_data, ps);
|
|
||||||
sched_pdsch->Qm = nr_get_Qm_dl(sched_pdsch->mcs, ps->mcsTableIdx);
|
sched_pdsch->Qm = nr_get_Qm_dl(sched_pdsch->mcs, ps->mcsTableIdx);
|
||||||
sched_pdsch->R = nr_get_code_rate_dl(sched_pdsch->mcs, ps->mcsTableIdx);
|
sched_pdsch->R = nr_get_code_rate_dl(sched_pdsch->mcs, ps->mcsTableIdx);
|
||||||
sched_pdsch->pucch_allocation = alloc;
|
sched_pdsch->pucch_allocation = alloc;
|
||||||
@@ -822,17 +817,17 @@ void nr_schedule_ue_spec(module_id_t module_id,
|
|||||||
|
|
||||||
const rnti_t rnti = UE_info->rnti[UE_id];
|
const rnti_t rnti = UE_info->rnti[UE_id];
|
||||||
|
|
||||||
/* POST processing */
|
|
||||||
const uint8_t nrOfLayers = sched_pdsch->nrOfLayers;
|
|
||||||
const uint16_t R = sched_pdsch->R;
|
|
||||||
const uint8_t Qm = sched_pdsch->Qm;
|
|
||||||
const uint32_t TBS = sched_pdsch->tb_size;
|
|
||||||
|
|
||||||
/* pre-computed PDSCH values that only change if time domain
|
/* pre-computed PDSCH values that only change if time domain
|
||||||
* allocation/DMRS parameters change. Updated in the preprocessor through
|
* allocation/DMRS parameters change. Updated in the preprocessor through
|
||||||
* nr_set_pdsch_semi_static() */
|
* nr_set_pdsch_semi_static() */
|
||||||
NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
|
NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
|
||||||
|
|
||||||
|
/* POST processing */
|
||||||
|
const uint8_t nrOfLayers = ps->nrOfLayers;
|
||||||
|
const uint16_t R = sched_pdsch->R;
|
||||||
|
const uint8_t Qm = sched_pdsch->Qm;
|
||||||
|
const uint32_t TBS = sched_pdsch->tb_size;
|
||||||
|
|
||||||
int8_t current_harq_pid = sched_pdsch->dl_harq_pid;
|
int8_t current_harq_pid = sched_pdsch->dl_harq_pid;
|
||||||
if (current_harq_pid < 0) {
|
if (current_harq_pid < 0) {
|
||||||
/* PP has not selected a specific HARQ Process, get a new one */
|
/* PP has not selected a specific HARQ Process, get a new one */
|
||||||
@@ -943,7 +938,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
|
|||||||
pdsch_pdu->dlDmrsScramblingId = *scc->physCellId;
|
pdsch_pdu->dlDmrsScramblingId = *scc->physCellId;
|
||||||
pdsch_pdu->SCID = 0;
|
pdsch_pdu->SCID = 0;
|
||||||
pdsch_pdu->numDmrsCdmGrpsNoData = ps->numDmrsCdmGrpsNoData;
|
pdsch_pdu->numDmrsCdmGrpsNoData = ps->numDmrsCdmGrpsNoData;
|
||||||
pdsch_pdu->dmrsPorts = 1;
|
pdsch_pdu->dmrsPorts = (1<<nrOfLayers)-1; // FIXME with a better implementation
|
||||||
|
|
||||||
// Pdsch Allocation in frequency domain
|
// Pdsch Allocation in frequency domain
|
||||||
pdsch_pdu->resourceAlloc = 1;
|
pdsch_pdu->resourceAlloc = 1;
|
||||||
@@ -1025,7 +1020,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
|
|||||||
dci_payload.tpc = sched_ctrl->tpc1; // TPC for PUCCH: table 7.2.1-1 in 38.213
|
dci_payload.tpc = sched_ctrl->tpc1; // TPC for PUCCH: table 7.2.1-1 in 38.213
|
||||||
dci_payload.pucch_resource_indicator = pucch->resource_indicator;
|
dci_payload.pucch_resource_indicator = pucch->resource_indicator;
|
||||||
dci_payload.pdsch_to_harq_feedback_timing_indicator.val = pucch->timing_indicator; // PDSCH to HARQ TI
|
dci_payload.pdsch_to_harq_feedback_timing_indicator.val = pucch->timing_indicator; // PDSCH to HARQ TI
|
||||||
dci_payload.antenna_ports.val = 0; // nb of cdm groups w/o data 1 and dmrs port 0
|
dci_payload.antenna_ports.val = ps->dmrs_ports_id;
|
||||||
dci_payload.dmrs_sequence_initialization.val = pdsch_pdu->SCID;
|
dci_payload.dmrs_sequence_initialization.val = pdsch_pdu->SCID;
|
||||||
LOG_D(NR_MAC,
|
LOG_D(NR_MAC,
|
||||||
"%4d.%2d DCI type 1 payload: freq_alloc %d (%d,%d,%d), "
|
"%4d.%2d DCI type 1 payload: freq_alloc %d (%d,%d,%d), "
|
||||||
|
|||||||
@@ -369,11 +369,12 @@ void nr_preprocessor_phytest(module_id_t module_id,
|
|||||||
sched_pdsch->rbSize = rbSize;
|
sched_pdsch->rbSize = rbSize;
|
||||||
const int tda = sched_ctrl->active_bwp ? RC.nrmac[module_id]->preferred_dl_tda[sched_ctrl->active_bwp->bwp_Id][slot] : 1;
|
const int tda = sched_ctrl->active_bwp ? RC.nrmac[module_id]->preferred_dl_tda[sched_ctrl->active_bwp->bwp_Id][slot] : 1;
|
||||||
const uint8_t num_dmrs_cdm_grps_no_data = 1;
|
const uint8_t num_dmrs_cdm_grps_no_data = 1;
|
||||||
|
ps->nrOfLayers = target_dl_Nl;
|
||||||
if (ps->time_domain_allocation != tda || ps->numDmrsCdmGrpsNoData != num_dmrs_cdm_grps_no_data)
|
if (ps->time_domain_allocation != tda || ps->numDmrsCdmGrpsNoData != num_dmrs_cdm_grps_no_data)
|
||||||
nr_set_pdsch_semi_static(
|
nr_set_pdsch_semi_static(
|
||||||
scc, UE_info->CellGroup[UE_id], sched_ctrl->active_bwp, tda, num_dmrs_cdm_grps_no_data, ps);
|
scc, UE_info->CellGroup[UE_id], sched_ctrl->active_bwp, tda, num_dmrs_cdm_grps_no_data, ps);
|
||||||
|
|
||||||
sched_pdsch->nrOfLayers = target_dl_Nl;
|
|
||||||
sched_pdsch->mcs = target_dl_mcs;
|
sched_pdsch->mcs = target_dl_mcs;
|
||||||
sched_pdsch->Qm = nr_get_Qm_dl(sched_pdsch->mcs, ps->mcsTableIdx);
|
sched_pdsch->Qm = nr_get_Qm_dl(sched_pdsch->mcs, ps->mcsTableIdx);
|
||||||
sched_pdsch->R = nr_get_code_rate_dl(sched_pdsch->mcs, ps->mcsTableIdx);
|
sched_pdsch->R = nr_get_code_rate_dl(sched_pdsch->mcs, ps->mcsTableIdx);
|
||||||
@@ -384,7 +385,7 @@ void nr_preprocessor_phytest(module_id_t module_id,
|
|||||||
ps->N_PRB_DMRS * ps->N_DMRS_SLOT,
|
ps->N_PRB_DMRS * ps->N_DMRS_SLOT,
|
||||||
0 /* N_PRB_oh, 0 for initialBWP */,
|
0 /* N_PRB_oh, 0 for initialBWP */,
|
||||||
0 /* tb_scaling */,
|
0 /* tb_scaling */,
|
||||||
sched_pdsch->nrOfLayers)
|
ps->nrOfLayers)
|
||||||
>> 3;
|
>> 3;
|
||||||
|
|
||||||
/* get the PID of a HARQ process awaiting retransmission, or -1 otherwise */
|
/* get the PID of a HARQ process awaiting retransmission, or -1 otherwise */
|
||||||
|
|||||||
@@ -122,6 +122,36 @@ static inline uint8_t get_max_cces(uint8_t scs) {
|
|||||||
return (nr_max_number_of_cces_per_slot[scs]);
|
return (nr_max_number_of_cces_per_slot[scs]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void set_dl_dmrs_ports(NR_pdsch_semi_static_t *ps) {
|
||||||
|
|
||||||
|
//TODO first basic implementation of dmrs port selection
|
||||||
|
// only vaild for a single codeword
|
||||||
|
// for now it assumes a selection of Nl consecutive dmrs ports
|
||||||
|
// and a single front loaded symbol
|
||||||
|
// dmrs_ports_id is the index of Tables 7.3.1.2.2-1/2/3/4
|
||||||
|
|
||||||
|
switch (ps->nrOfLayers) {
|
||||||
|
case 1:
|
||||||
|
ps->dmrs_ports_id = 0;
|
||||||
|
ps->numDmrsCdmGrpsNoData = 1;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
ps->dmrs_ports_id = 2;
|
||||||
|
ps->numDmrsCdmGrpsNoData = 1;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
ps->dmrs_ports_id = 9;
|
||||||
|
ps->numDmrsCdmGrpsNoData = 2;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
ps->dmrs_ports_id = 10;
|
||||||
|
ps->numDmrsCdmGrpsNoData = 2;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
AssertFatal(1==0,"Number of layers %d\n not supported or not valid\n",ps->nrOfLayers);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
NR_ControlResourceSet_t *get_coreset(NR_ServingCellConfigCommon_t *scc,
|
NR_ControlResourceSet_t *get_coreset(NR_ServingCellConfigCommon_t *scc,
|
||||||
NR_BWP_Downlink_t *bwp,
|
NR_BWP_Downlink_t *bwp,
|
||||||
NR_SearchSpace_t *ss,
|
NR_SearchSpace_t *ss,
|
||||||
@@ -266,7 +296,7 @@ void nr_set_pdsch_semi_static(const NR_ServingCellConfigCommon_t *scc,
|
|||||||
const NR_CellGroupConfig_t *secondaryCellGroup,
|
const NR_CellGroupConfig_t *secondaryCellGroup,
|
||||||
const NR_BWP_Downlink_t *bwp,
|
const NR_BWP_Downlink_t *bwp,
|
||||||
int tda,
|
int tda,
|
||||||
uint8_t num_dmrs_cdm_grps_no_data,
|
const long dci_format,
|
||||||
NR_pdsch_semi_static_t *ps)
|
NR_pdsch_semi_static_t *ps)
|
||||||
{
|
{
|
||||||
ps->time_domain_allocation = tda;
|
ps->time_domain_allocation = tda;
|
||||||
@@ -292,12 +322,13 @@ void nr_set_pdsch_semi_static(const NR_ServingCellConfigCommon_t *scc,
|
|||||||
}
|
}
|
||||||
else ps->mcsTableIdx = 0;
|
else ps->mcsTableIdx = 0;
|
||||||
|
|
||||||
ps->numDmrsCdmGrpsNoData = num_dmrs_cdm_grps_no_data;
|
if(dci_format == 0) // format 1_0
|
||||||
|
ps->numDmrsCdmGrpsNoData = (ps->nrOfSymbols == 2 ? 1 : 2);
|
||||||
|
else
|
||||||
|
set_dl_dmrs_ports(ps);
|
||||||
ps->dmrsConfigType = bwp!=NULL ? (bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1) : 0;
|
ps->dmrsConfigType = bwp!=NULL ? (bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1) : 0;
|
||||||
|
|
||||||
// if no data in dmrs cdm group is 1 only even REs have no data
|
ps->N_PRB_DMRS = ps->numDmrsCdmGrpsNoData * (ps->dmrsConfigType == NFAPI_NR_DMRS_TYPE1 ? 6 : 4);
|
||||||
// if no data in dmrs cdm group is 2 both odd and even REs have no data
|
|
||||||
ps->N_PRB_DMRS = num_dmrs_cdm_grps_no_data * (ps->dmrsConfigType == NFAPI_NR_DMRS_TYPE1 ? 6 : 4);
|
|
||||||
ps->dl_dmrs_symb_pos = fill_dmrs_mask(bwp ? bwp->bwp_Dedicated->pdsch_Config->choice.setup : NULL, scc->dmrs_TypeA_Position, ps->nrOfSymbols, ps->startSymbolIndex, mapping_type);
|
ps->dl_dmrs_symb_pos = fill_dmrs_mask(bwp ? bwp->bwp_Dedicated->pdsch_Config->choice.setup : NULL, scc->dmrs_TypeA_Position, ps->nrOfSymbols, ps->startSymbolIndex, mapping_type);
|
||||||
ps->N_DMRS_SLOT = get_num_dmrs(ps->dl_dmrs_symb_pos);
|
ps->N_DMRS_SLOT = get_num_dmrs(ps->dl_dmrs_symb_pos);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -283,7 +283,7 @@ void nr_set_pdsch_semi_static(const NR_ServingCellConfigCommon_t *scc,
|
|||||||
const NR_CellGroupConfig_t *secondaryCellGroup,
|
const NR_CellGroupConfig_t *secondaryCellGroup,
|
||||||
const NR_BWP_Downlink_t *bwp,
|
const NR_BWP_Downlink_t *bwp,
|
||||||
int tda,
|
int tda,
|
||||||
uint8_t num_dmrs_cdm_grps_no_data,
|
const long dci_format,
|
||||||
NR_pdsch_semi_static_t *ps);
|
NR_pdsch_semi_static_t *ps);
|
||||||
|
|
||||||
void nr_set_pusch_semi_static(const NR_ServingCellConfigCommon_t *scc,
|
void nr_set_pusch_semi_static(const NR_ServingCellConfigCommon_t *scc,
|
||||||
@@ -417,6 +417,8 @@ int16_t ssb_index_from_prach(module_id_t module_idP,
|
|||||||
|
|
||||||
void find_SSB_and_RO_available(module_id_t module_idP);
|
void find_SSB_and_RO_available(module_id_t module_idP);
|
||||||
|
|
||||||
|
void set_dl_dmrs_ports(NR_pdsch_semi_static_t *ps);
|
||||||
|
|
||||||
void calculate_preferred_dl_tda(module_id_t module_id, const NR_BWP_Downlink_t *bwp);
|
void calculate_preferred_dl_tda(module_id_t module_id, const NR_BWP_Downlink_t *bwp);
|
||||||
void calculate_preferred_ul_tda(module_id_t module_id, const NR_BWP_Uplink_t *ubwp);
|
void calculate_preferred_ul_tda(module_id_t module_id, const NR_BWP_Uplink_t *ubwp);
|
||||||
|
|
||||||
|
|||||||
@@ -368,9 +368,9 @@ typedef struct NR_pdsch_semi_static {
|
|||||||
|
|
||||||
int startSymbolIndex;
|
int startSymbolIndex;
|
||||||
int nrOfSymbols;
|
int nrOfSymbols;
|
||||||
|
uint8_t nrOfLayers;
|
||||||
uint8_t mcsTableIdx;
|
uint8_t mcsTableIdx;
|
||||||
|
uint8_t dmrs_ports_id;
|
||||||
uint8_t N_PRB_DMRS;
|
uint8_t N_PRB_DMRS;
|
||||||
uint8_t N_DMRS_SLOT;
|
uint8_t N_DMRS_SLOT;
|
||||||
uint16_t dl_dmrs_symb_pos;
|
uint16_t dl_dmrs_symb_pos;
|
||||||
@@ -386,7 +386,6 @@ typedef struct NR_sched_pdsch {
|
|||||||
uint8_t mcs;
|
uint8_t mcs;
|
||||||
|
|
||||||
/// TBS-related info
|
/// TBS-related info
|
||||||
uint8_t nrOfLayers;
|
|
||||||
uint16_t R;
|
uint16_t R;
|
||||||
uint8_t Qm;
|
uint8_t Qm;
|
||||||
uint32_t tb_size;
|
uint32_t tb_size;
|
||||||
|
|||||||
@@ -218,7 +218,7 @@ static void reassemble_and_deliver(nr_rlc_entity_am_t *entity, int sn)
|
|||||||
bad_sdu = 1;
|
bad_sdu = 1;
|
||||||
}
|
}
|
||||||
if (!bad_sdu && len > 0) {
|
if (!bad_sdu && len > 0) {
|
||||||
memcpy(sdu + so, pdu->data, len);
|
memcpy(sdu + so, pdu->data + so - pdu->so, len);
|
||||||
so += len;
|
so += len;
|
||||||
}
|
}
|
||||||
free(pdu->data);
|
free(pdu->data);
|
||||||
|
|||||||
@@ -148,7 +148,7 @@ static void reassemble_and_deliver(nr_rlc_entity_um_t *entity, int sn)
|
|||||||
bad_sdu = 1;
|
bad_sdu = 1;
|
||||||
}
|
}
|
||||||
if (!bad_sdu && len > 0) {
|
if (!bad_sdu && len > 0) {
|
||||||
memcpy(sdu + so, pdu->data, len);
|
memcpy(sdu + so, pdu->data + so - pdu->so, len);
|
||||||
so += len;
|
so += len;
|
||||||
}
|
}
|
||||||
free(pdu->data);
|
free(pdu->data);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
test_count=15
|
test_count=17
|
||||||
|
|
||||||
for i in `seq $test_count`
|
for i in `seq $test_count`
|
||||||
do
|
do
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
* create the UE RLC AM entity with given parameters
|
* create the UE RLC AM entity with given parameters
|
||||||
*
|
*
|
||||||
* GNB_UM <rx_maxsize> <tx_maxsize> <t_reassembly> <sn_field_length>
|
* GNB_UM <rx_maxsize> <tx_maxsize> <t_reassembly> <sn_field_length>
|
||||||
* create the eNB RLC UM entity with given parameters
|
* create the gNB RLC UM entity with given parameters
|
||||||
*
|
*
|
||||||
* UE_UM <rx_maxsize> <tx_maxsize> <t_reassembly> <sn_field_length>
|
* UE_UM <rx_maxsize> <tx_maxsize> <t_reassembly> <sn_field_length>
|
||||||
* create the UE RLC UM entity with given parameters
|
* create the UE RLC UM entity with given parameters
|
||||||
*
|
*
|
||||||
* GNB_TM <tx_maxsize>
|
* GNB_TM <tx_maxsize>
|
||||||
* create the eNB RLC TM entity with given parameters
|
* create the gNB RLC TM entity with given parameters
|
||||||
*
|
*
|
||||||
* UE_UM <tx_maxsize>
|
* UE_UM <tx_maxsize>
|
||||||
* create the UE RLC TM entity with given parameters
|
* create the UE RLC TM entity with given parameters
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
* You must end your test definition with a line 'TIME, -1'.
|
* You must end your test definition with a line 'TIME, -1'.
|
||||||
*
|
*
|
||||||
* GNB_SDU <id> <size>
|
* GNB_SDU <id> <size>
|
||||||
* send an SDU to eNB with id <i> and size <size>
|
* send an SDU to gNB with id <i> and size <size>
|
||||||
* the SDU is [00 01 ... ff 01 ...]
|
* the SDU is [00 01 ... ff 01 ...]
|
||||||
* (ie. start byte is 00 then we increment for each byte, loop if needed)
|
* (ie. start byte is 00 then we increment for each byte, loop if needed)
|
||||||
*
|
*
|
||||||
@@ -47,10 +47,10 @@
|
|||||||
* same as GNB_SDU but the SDU is sent to the UE
|
* same as GNB_SDU but the SDU is sent to the UE
|
||||||
*
|
*
|
||||||
* GNB_PDU <size> <'size' bytes>
|
* GNB_PDU <size> <'size' bytes>
|
||||||
* send a custom PDU from eNB to UE (eNB does not see this PDU at all)
|
* send a custom PDU from gNB to UE (gNB does not see this PDU at all)
|
||||||
*
|
*
|
||||||
* UE_PDU <size> <'size' bytes>
|
* UE_PDU <size> <'size' bytes>
|
||||||
* send a custom PDU from UE to eNB (UE does not see this PDU at all)
|
* send a custom PDU from UE to gNB (UE does not see this PDU at all)
|
||||||
*
|
*
|
||||||
* GNB_PDU_SIZE <size>
|
* GNB_PDU_SIZE <size>
|
||||||
* set 'gnb_pdu_size'
|
* set 'gnb_pdu_size'
|
||||||
@@ -70,7 +70,7 @@
|
|||||||
* that the test must fail (ie. exit with non zero, crash not allowed)
|
* that the test must fail (ie. exit with non zero, crash not allowed)
|
||||||
*
|
*
|
||||||
* GNB_BUFFER_STATUS
|
* GNB_BUFFER_STATUS
|
||||||
* call buffer_status for eNB and print result
|
* call buffer_status for gNB and print result
|
||||||
*
|
*
|
||||||
* UE_BUFFER_STATUS
|
* UE_BUFFER_STATUS
|
||||||
* call buffer_status for UE and print result
|
* call buffer_status for UE and print result
|
||||||
@@ -82,7 +82,7 @@
|
|||||||
* discards given SDU
|
* discards given SDU
|
||||||
*
|
*
|
||||||
* RE_ESTABLISH
|
* RE_ESTABLISH
|
||||||
* re-establish both eNB and UE
|
* re-establish both gNB and UE
|
||||||
*/
|
*/
|
||||||
|
|
||||||
enum action {
|
enum action {
|
||||||
@@ -368,7 +368,7 @@ int test_main(void)
|
|||||||
pos += 2;
|
pos += 2;
|
||||||
break;
|
break;
|
||||||
case RE_ESTABLISH:
|
case RE_ESTABLISH:
|
||||||
printf("TEST: %d: re-establish eNB and UE\n", i);
|
printf("TEST: %d: re-establish gNB and UE\n", i);
|
||||||
gnb->reestablishment(gnb);
|
gnb->reestablishment(gnb);
|
||||||
ue->reestablishment(ue);
|
ue->reestablishment(ue);
|
||||||
pos++;
|
pos++;
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* am test (SN field size 18):
|
||||||
|
* there was a bug when we receive a full PDU after receiving only the
|
||||||
|
* beginning of it; the data was copied at the end but from the start of the
|
||||||
|
* full PDU instead of the correct offset. This test captures this case.
|
||||||
|
* Gnb sends the start of a PDU then the full PDU. That is the SDU is
|
||||||
|
* [00 .. 09]. First gnb sends [00 .. 08] then it sends [00 .. 09].
|
||||||
|
*/
|
||||||
|
|
||||||
|
TIME, 1,
|
||||||
|
GNB_AM, 100000, 100000, 45, 35, 0, -1, -1, 8, 18,
|
||||||
|
UE_AM, 100000, 100000, 45, 35, 0, -1, -1, 8, 18,
|
||||||
|
GNB_PDU_SIZE, 12,
|
||||||
|
UE_PDU_SIZE, 20,
|
||||||
|
GNB_PDU, 12, 0x90, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
|
||||||
|
TIME, 2,
|
||||||
|
GNB_PDU_SIZE, 20,
|
||||||
|
GNB_PDU, 13, 0xc0, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
|
||||||
|
TIME, -1
|
||||||
Binary file not shown.
@@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* um test (SN field size 12):
|
||||||
|
* same problem as for test16, but we test by sending [00 .. 08] then
|
||||||
|
* [02 .. 09] (they overlap, the full SDU is [00 .. 09]), which probably
|
||||||
|
* never occurs in practice but triggers the bug. Doing as for test16 does
|
||||||
|
* not trigger the bug.
|
||||||
|
*/
|
||||||
|
|
||||||
|
TIME, 1,
|
||||||
|
GNB_UM, 100000, 100000, 35, 12,
|
||||||
|
UE_UM, 100000, 100000, 35, 12,
|
||||||
|
GNB_PDU_SIZE, 8,
|
||||||
|
UE_PDU_SIZE, 20,
|
||||||
|
GNB_PDU, 11, 0x40, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
|
||||||
|
TIME, 2,
|
||||||
|
GNB_PDU_SIZE, 20,
|
||||||
|
GNB_PDU, 12, 0x80, 0x00, 0x00, 0x02, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
|
||||||
|
TIME, -1
|
||||||
Binary file not shown.
@@ -419,14 +419,28 @@ uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier,
|
|||||||
nrMultiBandInfo->freqBandIndicatorNR = configuration->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[i];
|
nrMultiBandInfo->freqBandIndicatorNR = configuration->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[i];
|
||||||
ASN_SEQUENCE_ADD(&sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL.frequencyBandList.list,nrMultiBandInfo);
|
ASN_SEQUENCE_ADD(&sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL.frequencyBandList.list,nrMultiBandInfo);
|
||||||
}
|
}
|
||||||
int ref_scs;
|
|
||||||
if (configuration->scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA < 600000)
|
int scs_scaling0 = 1<<(configuration->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing);
|
||||||
ref_scs = 0; // 15 khz
|
int scs_scaling = scs_scaling0;
|
||||||
if (configuration->scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA > 2016666)
|
int scs_scaling2 = scs_scaling0;
|
||||||
ref_scs = 3; // 60 khz
|
if (configuration->scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA < 600000) {
|
||||||
uint32_t absolute_diff = (*configuration->scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB - configuration->scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA);
|
scs_scaling = scs_scaling0*3;
|
||||||
sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL.offsetToPointA =
|
}
|
||||||
(absolute_diff/12) - (10<<(configuration->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing - ref_scs));
|
if (configuration->scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA > 2016666) {
|
||||||
|
scs_scaling = scs_scaling0>>2;
|
||||||
|
scs_scaling2 = scs_scaling0>>2;
|
||||||
|
}
|
||||||
|
uint32_t absolute_diff = (*configuration->scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB -
|
||||||
|
configuration->scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA);
|
||||||
|
|
||||||
|
sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL.offsetToPointA = scs_scaling2 * (absolute_diff/(12*scs_scaling) - 10);
|
||||||
|
|
||||||
|
LOG_I(NR_RRC,"SIB1 freq: absoluteFrequencySSB %ld, absoluteFrequencyPointA %ld\n",
|
||||||
|
*configuration->scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB,
|
||||||
|
configuration->scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA);
|
||||||
|
LOG_I(NR_RRC,"SIB1 freq: absolute_diff %d, %d*(absolute_diff/(12*%d) - 10) %d\n",
|
||||||
|
absolute_diff,scs_scaling2,scs_scaling,(int)sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL.offsetToPointA);
|
||||||
|
|
||||||
for(int i = 0; i< configuration->scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.count; i++) {
|
for(int i = 0; i< configuration->scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.count; i++) {
|
||||||
ASN_SEQUENCE_ADD(&sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list,configuration->scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[i]);
|
ASN_SEQUENCE_ADD(&sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list,configuration->scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[i]);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user