testing in SA, initialBWP
This commit is contained in:
@@ -397,8 +397,8 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
|||||||
uci_pdu->harq->harq_confidence_level = no_conf ? 1 : 0;
|
uci_pdu->harq->harq_confidence_level = no_conf ? 1 : 0;
|
||||||
uci_pdu->harq->harq_list = (nfapi_nr_harq_t*)malloc(1);
|
uci_pdu->harq->harq_list = (nfapi_nr_harq_t*)malloc(1);
|
||||||
uci_pdu->harq->harq_list[0].harq_value = index&0x01;
|
uci_pdu->harq->harq_list[0].harq_value = index&0x01;
|
||||||
LOG_I(PHY, "Slot %d HARQ value %d with confidence level (0 is good, 1 is bad) %d xrt_mag %d n0 %d pucch0_thres %d, cqi %d, SNRtimes10 %d\n",
|
LOG_I(PHY, "[DLSCH/PDSCH/PUCCH] %d.%d HARQ value %d with confidence level (0 is good, 1 is bad) %d xrt_mag %d n0 %d pucch0_thres %d, cqi %d, SNRtimes10 %d\n",
|
||||||
slot,uci_pdu->harq->harq_list[0].harq_value,uci_pdu->harq->harq_confidence_level,xrtmag_dBtimes10,max_n0,uci_stats->pucch0_thres,cqi,SNRtimes10);
|
frame,slot,uci_pdu->harq->harq_list[0].harq_value,uci_pdu->harq->harq_confidence_level,xrtmag_dBtimes10,max_n0,uci_stats->pucch0_thres,cqi,SNRtimes10);
|
||||||
|
|
||||||
if (pucch_pdu->sr_flag == 1) {
|
if (pucch_pdu->sr_flag == 1) {
|
||||||
uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
|
uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
|
||||||
@@ -415,8 +415,8 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
|||||||
uci_pdu->harq->harq_list = (nfapi_nr_harq_t*)malloc(2);
|
uci_pdu->harq->harq_list = (nfapi_nr_harq_t*)malloc(2);
|
||||||
uci_pdu->harq->harq_list[1].harq_value = index&0x01;
|
uci_pdu->harq->harq_list[1].harq_value = index&0x01;
|
||||||
uci_pdu->harq->harq_list[0].harq_value = (index>>1)&0x01;
|
uci_pdu->harq->harq_list[0].harq_value = (index>>1)&0x01;
|
||||||
LOG_D(PHY, "Slot %d HARQ values %d and %d with confidence level (0 is good, 1 is bad) %d, xrt_mag %d\n",
|
LOG_I(PHY, "[DLSCH/PDSCH/PUCCH] %d.%d HARQ values %d and %d with confidence level (0 is good, 1 is bad) %d, xrt_mag %d\n",
|
||||||
slot,uci_pdu->harq->harq_list[1].harq_value,uci_pdu->harq->harq_list[0].harq_value,uci_pdu->harq->harq_confidence_level,xrtmag_dBtimes10);
|
frame,slot,uci_pdu->harq->harq_list[1].harq_value,uci_pdu->harq->harq_list[0].harq_value,uci_pdu->harq->harq_confidence_level,xrtmag_dBtimes10);
|
||||||
if (pucch_pdu->sr_flag == 1) {
|
if (pucch_pdu->sr_flag == 1) {
|
||||||
uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
|
uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
|
||||||
uci_pdu->sr->sr_indication = (index>3) ? 1 : 0;
|
uci_pdu->sr->sr_indication = (index>3) ? 1 : 0;
|
||||||
|
|||||||
@@ -183,7 +183,7 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){
|
|||||||
uint8_t number_ul_tti_pdu = (UL_tti_req==NULL) ? 0 : UL_tti_req->n_pdus;
|
uint8_t number_ul_tti_pdu = (UL_tti_req==NULL) ? 0 : UL_tti_req->n_pdus;
|
||||||
|
|
||||||
if (DL_req != NULL && TX_req!=NULL && (number_dl_pdu > 0 || number_ul_dci_pdu > 0 || number_ul_tti_pdu > 0))
|
if (DL_req != NULL && TX_req!=NULL && (number_dl_pdu > 0 || number_ul_dci_pdu > 0 || number_ul_tti_pdu > 0))
|
||||||
LOG_I(PHY,"NFAPI: Sched_INFO:SFN/SLOT:%04d/%d DL_req:SFN/SLO:%04d/%d:dl_pdu:%d tx_req:SFN/SLOT:%04d/%d:pdus:%d;ul_dci %d ul_tti %d\n",
|
LOG_D(PHY,"NFAPI: Sched_INFO:SFN/SLOT:%04d/%d DL_req:SFN/SLO:%04d/%d:dl_pdu:%d tx_req:SFN/SLOT:%04d/%d:pdus:%d;ul_dci %d ul_tti %d\n",
|
||||||
frame,slot,
|
frame,slot,
|
||||||
DL_req->SFN,DL_req->Slot,number_dl_pdu,
|
DL_req->SFN,DL_req->Slot,number_dl_pdu,
|
||||||
TX_req->SFN,TX_req->Slot,TX_req->Number_of_PDUs,
|
TX_req->SFN,TX_req->Slot,TX_req->Number_of_PDUs,
|
||||||
@@ -253,7 +253,7 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){
|
|||||||
nr_fill_ulsch(gNB,UL_tti_req->SFN, UL_tti_req->Slot, &UL_tti_req->pdus_list[i].pusch_pdu);
|
nr_fill_ulsch(gNB,UL_tti_req->SFN, UL_tti_req->Slot, &UL_tti_req->pdus_list[i].pusch_pdu);
|
||||||
break;
|
break;
|
||||||
case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE:
|
case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE:
|
||||||
LOG_I(PHY,"frame %d, slot %d, Got NFAPI_NR_UL_TTI_PUCCH_PDU_TYPE for %d.%d\n", frame, slot, UL_tti_req->SFN, UL_tti_req->Slot);
|
LOG_D(PHY,"frame %d, slot %d, Got NFAPI_NR_UL_TTI_PUCCH_PDU_TYPE for %d.%d\n", frame, slot, UL_tti_req->SFN, UL_tti_req->Slot);
|
||||||
nr_fill_pucch(gNB,UL_tti_req->SFN, UL_tti_req->Slot, &UL_tti_req->pdus_list[i].pucch_pdu);
|
nr_fill_pucch(gNB,UL_tti_req->SFN, UL_tti_req->Slot, &UL_tti_req->pdus_list[i].pucch_pdu);
|
||||||
break;
|
break;
|
||||||
case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE:
|
case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE:
|
||||||
|
|||||||
@@ -234,6 +234,7 @@ void nr_postDecode(PHY_VARS_gNB *gNB, notifiedFIFO_elt_t *req) {
|
|||||||
NR_UL_gNB_HARQ_t *ulsch_harq = rdata->ulsch_harq;
|
NR_UL_gNB_HARQ_t *ulsch_harq = rdata->ulsch_harq;
|
||||||
NR_gNB_ULSCH_t *ulsch = rdata->ulsch;
|
NR_gNB_ULSCH_t *ulsch = rdata->ulsch;
|
||||||
int r = rdata->segment_r;
|
int r = rdata->segment_r;
|
||||||
|
nfapi_nr_pusch_pdu_t *pusch_pdu = &gNB->ulsch[rdata->ulsch_id][0]->harq_processes[rdata->harq_pid]->ulsch_pdu;
|
||||||
|
|
||||||
bool decodeSuccess = (rdata->decodeIterations <= rdata->decoderParms.numMaxIter);
|
bool decodeSuccess = (rdata->decodeIterations <= rdata->decoderParms.numMaxIter);
|
||||||
ulsch_harq->processedSegments++;
|
ulsch_harq->processedSegments++;
|
||||||
@@ -263,18 +264,18 @@ void nr_postDecode(PHY_VARS_gNB *gNB, notifiedFIFO_elt_t *req) {
|
|||||||
// if all segments are done
|
// if all segments are done
|
||||||
if (rdata->nbSegments == ulsch_harq->processedSegments) {
|
if (rdata->nbSegments == ulsch_harq->processedSegments) {
|
||||||
if (decodeSuccess) {
|
if (decodeSuccess) {
|
||||||
LOG_D(PHY,"[gNB %d] ULSCH: Setting ACK for slot %d TBS %d\n",
|
LOG_I(PHY,"[gNB %d] ULSCH: Setting ACK for SFN/SF %d.%d (pid %d, ndi %d, status %d, round %d, TBS %d)\n",
|
||||||
gNB->Mod_id,ulsch_harq->slot,ulsch_harq->TBS);
|
gNB->Mod_id,ulsch_harq->frame,ulsch_harq->slot,rdata->harq_pid,pusch_pdu->pusch_data.new_data_indicator,ulsch_harq->status,ulsch_harq->round,ulsch_harq->TBS);
|
||||||
ulsch_harq->status = SCH_IDLE;
|
ulsch_harq->status = SCH_IDLE;
|
||||||
ulsch_harq->round = 0;
|
ulsch_harq->round = 0;
|
||||||
ulsch->harq_mask &= ~(1 << rdata->harq_pid);
|
ulsch->harq_mask &= ~(1 << rdata->harq_pid);
|
||||||
|
|
||||||
LOG_I(PHY, "ULSCH received ok \n");
|
LOG_D(PHY, "ULSCH received ok \n");
|
||||||
nr_fill_indication(gNB,ulsch_harq->frame, ulsch_harq->slot, rdata->ulsch_id, rdata->harq_pid, 0);
|
nr_fill_indication(gNB,ulsch_harq->frame, ulsch_harq->slot, rdata->ulsch_id, rdata->harq_pid, 0);
|
||||||
} else {
|
} else {
|
||||||
LOG_I(PHY,"[gNB %d] ULSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d) r %d\n",
|
LOG_I(PHY,"[gNB %d] ULSCH: Setting NAK for SFN/SF %d/%d (pid %d, ndi %d, status %d, round %d, TBS %d) r %d\n",
|
||||||
gNB->Mod_id, ulsch_harq->frame, ulsch_harq->slot,
|
gNB->Mod_id, ulsch_harq->frame, ulsch_harq->slot,
|
||||||
rdata->harq_pid,ulsch_harq->status, ulsch_harq->round,ulsch_harq->TBS,r);
|
rdata->harq_pid,pusch_pdu->pusch_data.new_data_indicator,ulsch_harq->status, ulsch_harq->round,ulsch_harq->TBS,r);
|
||||||
if (ulsch_harq->round >= ulsch->Mlimit) {
|
if (ulsch_harq->round >= ulsch->Mlimit) {
|
||||||
ulsch_harq->status = SCH_IDLE;
|
ulsch_harq->status = SCH_IDLE;
|
||||||
ulsch_harq->round = 0;
|
ulsch_harq->round = 0;
|
||||||
@@ -432,7 +433,7 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
|
|||||||
int SNRtimes10 = dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_power_tot) -
|
int SNRtimes10 = dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_power_tot) -
|
||||||
dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_noise_power_tot);
|
dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_noise_power_tot);
|
||||||
|
|
||||||
if (crc_flag == 0) LOG_I(PHY, "Estimated SNR for PUSCH is = %f dB (ulsch_power %f, noise %f)\n", SNRtimes10/10.0,dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_power_tot)/10.0,dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_noise_power_tot)/10.0);
|
LOG_I(PHY, "Estimated SNR for PUSCH is = %f dB (ulsch_power %f, noise %f)\n", SNRtimes10/10.0,dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_power_tot)/10.0,dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_noise_power_tot)/10.0);
|
||||||
|
|
||||||
if (SNRtimes10 < -640) cqi=0;
|
if (SNRtimes10 < -640) cqi=0;
|
||||||
else if (SNRtimes10 > 635) cqi=255;
|
else if (SNRtimes10 > 635) cqi=255;
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ uint32_t nr_compute_tbs(uint16_t Qm,
|
|||||||
uint32_t Ninfo, Np_info, C;
|
uint32_t Ninfo, Np_info, C;
|
||||||
uint8_t n, scale;
|
uint8_t n, scale;
|
||||||
|
|
||||||
LOG_D(MAC,"nb_symb_sch %d, nb_dmrs_prb %d, nb_rb_oh %d\n",nb_symb_sch,nb_dmrs_prb,nb_rb_oh);
|
LOG_D(NR_MAC,"nb_symb_sch %d, nb_dmrs_prb %d, nb_rb_oh %d\n",nb_symb_sch,nb_dmrs_prb,nb_rb_oh);
|
||||||
|
|
||||||
nbp_re = NR_NB_SC_PER_RB * nb_symb_sch - nb_dmrs_prb - nb_rb_oh;
|
nbp_re = NR_NB_SC_PER_RB * nb_symb_sch - nb_dmrs_prb - nb_rb_oh;
|
||||||
nb_re = min(156, nbp_re) * nb_rb;
|
nb_re = min(156, nbp_re) * nb_rb;
|
||||||
@@ -59,6 +59,7 @@ uint32_t nr_compute_tbs(uint16_t Qm,
|
|||||||
// Intermediate number of information bits
|
// Intermediate number of information bits
|
||||||
Ninfo = ((nb_re * R * Qm * Nl)>>scale)>>tb_scaling;
|
Ninfo = ((nb_re * R * Qm * Nl)>>scale)>>tb_scaling;
|
||||||
|
|
||||||
|
|
||||||
if (Ninfo <=3824) {
|
if (Ninfo <=3824) {
|
||||||
n = max(3, floor(log2(Ninfo)) - 6);
|
n = max(3, floor(log2(Ninfo)) - 6);
|
||||||
Np_info = max(24, (Ninfo>>n)<<n);
|
Np_info = max(24, (Ninfo>>n)<<n);
|
||||||
@@ -85,7 +86,7 @@ uint32_t nr_compute_tbs(uint16_t Qm,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_D(PHY, "In %s: Ninfo %d nbp_re %d nb_re %d Qm %d, R %d, tbs %d\n", __FUNCTION__, Ninfo, nbp_re, nb_re, Qm, R, nr_tbs);
|
LOG_D(NR_MAC, "In %s: Ninfo %d nbp_re %d nb_re %d Qm %d, R %d, tbs %d\n", __FUNCTION__, Ninfo, nbp_re, nb_re, Qm, R, nr_tbs);
|
||||||
|
|
||||||
return nr_tbs;
|
return nr_tbs;
|
||||||
|
|
||||||
|
|||||||
@@ -2493,7 +2493,7 @@ uint8_t get_L_ptrs(uint8_t mcs1, uint8_t mcs2, uint8_t mcs3, uint8_t I_mcs, uint
|
|||||||
else if (I_mcs >= mcs3 && I_mcs < mcs4)
|
else if (I_mcs >= mcs3 && I_mcs < mcs4)
|
||||||
return 0;
|
return 0;
|
||||||
else {
|
else {
|
||||||
LOG_I(NR_MAC, "PT-RS time-density determination is obtained from the DCI for the same transport block in the initial transmission\n");
|
LOG_D(NR_MAC, "PT-RS time-density determination is obtained from the DCI for the same transport block in the initial transmission\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1007,8 +1007,8 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
|
|||||||
dl_req->nPDUs+=1;
|
dl_req->nPDUs+=1;
|
||||||
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdsch_pdu->pdsch_pdu.pdsch_pdu_rel15;
|
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdsch_pdu->pdsch_pdu.pdsch_pdu_rel15;
|
||||||
|
|
||||||
LOG_I(NR_MAC,"[gNB %d][RAPROC] CC_id %d Frame %d, slotP %d: Generating RA-Msg2 DCI, rnti 0x%x, state %d\n",
|
LOG_I(NR_MAC,"[gNB %d][RAPROC] CC_id %d Frame %d, slotP %d: Generating RA-Msg2 DCI, rnti 0x%x, state %d, CoreSetType %d\n",
|
||||||
module_idP, CC_id, frameP, slotP, ra->RA_rnti, ra->state);
|
module_idP, CC_id, frameP, slotP, ra->RA_rnti, ra->state,pdcch_pdu_rel15->CoreSetType);
|
||||||
|
|
||||||
// SCF222: PDU index incremented for each PDSCH PDU sent in TX control message. This is used to associate control
|
// SCF222: PDU index incremented for each PDSCH PDU sent in TX control message. This is used to associate control
|
||||||
// information to data and is reset every slot.
|
// information to data and is reset every slot.
|
||||||
|
|||||||
@@ -882,8 +882,8 @@ void nr_schedule_ue_spec(module_id_t module_id,
|
|||||||
harq->is_waiting = true;
|
harq->is_waiting = true;
|
||||||
UE_info->mac_stats[UE_id].dlsch_rounds[harq->round]++;
|
UE_info->mac_stats[UE_id].dlsch_rounds[harq->round]++;
|
||||||
|
|
||||||
LOG_D(NR_MAC,
|
LOG_I(NR_MAC,
|
||||||
"%4d.%2d DLSCH RNTI %04x start %3d RBs %3d startSymbol %2d nb_symbol %2d MCS %2d TBS %4d HARQ PID %2d round %d NDI %d\n",
|
"%4d.%2d [DLSCH/PDSCH/PUCCH] RNTI %04x start %3d RBs %3d startSymbol %2d nb_symbol %2d dmrspos %x MCS %2d TBS %4d HARQ PID %2d round %d NDI %d dl_data_to_ULACK %d (%d.%d)\n",
|
||||||
frame,
|
frame,
|
||||||
slot,
|
slot,
|
||||||
rnti,
|
rnti,
|
||||||
@@ -891,11 +891,15 @@ void nr_schedule_ue_spec(module_id_t module_id,
|
|||||||
sched_pdsch->rbSize,
|
sched_pdsch->rbSize,
|
||||||
ps->startSymbolIndex,
|
ps->startSymbolIndex,
|
||||||
ps->nrOfSymbols,
|
ps->nrOfSymbols,
|
||||||
|
ps->dl_dmrs_symb_pos,
|
||||||
sched_pdsch->mcs,
|
sched_pdsch->mcs,
|
||||||
TBS,
|
TBS,
|
||||||
current_harq_pid,
|
current_harq_pid,
|
||||||
harq->round,
|
harq->round,
|
||||||
harq->ndi);
|
harq->ndi,
|
||||||
|
pucch->timing_indicator,
|
||||||
|
pucch->frame,
|
||||||
|
pucch->ul_slot);
|
||||||
|
|
||||||
NR_BWP_Downlink_t *bwp = sched_ctrl->active_bwp;
|
NR_BWP_Downlink_t *bwp = sched_ctrl->active_bwp;
|
||||||
|
|
||||||
|
|||||||
@@ -56,7 +56,7 @@
|
|||||||
//#define UL_HARQ_PRINT
|
//#define UL_HARQ_PRINT
|
||||||
extern RAN_CONTEXT_t RC;
|
extern RAN_CONTEXT_t RC;
|
||||||
|
|
||||||
const uint8_t nr_rv_round_map[4] = {0, 2, 1, 3};
|
const uint8_t nr_rv_round_map[4] = {0, 2, 3, 1};
|
||||||
//#define ENABLE_MAC_PAYLOAD_DEBUG 1
|
//#define ENABLE_MAC_PAYLOAD_DEBUG 1
|
||||||
|
|
||||||
//uint8_t mac_pdu[MAX_NR_DLSCH_PAYLOAD_BYTES];
|
//uint8_t mac_pdu[MAX_NR_DLSCH_PAYLOAD_BYTES];
|
||||||
|
|||||||
@@ -302,6 +302,7 @@ 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;
|
ps->numDmrsCdmGrpsNoData = num_dmrs_cdm_grps_no_data;
|
||||||
ps->dmrsConfigType = bwpd!=NULL ? (bwpd->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1) : 0;
|
ps->dmrsConfigType = bwpd!=NULL ? (bwpd->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1) : 0;
|
||||||
|
|
||||||
@@ -310,6 +311,7 @@ void nr_set_pdsch_semi_static(const NR_ServingCellConfigCommon_t *scc,
|
|||||||
ps->N_PRB_DMRS = num_dmrs_cdm_grps_no_data * (ps->dmrsConfigType == NFAPI_NR_DMRS_TYPE1 ? 6 : 4);
|
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(bwpd ? bwpd->pdsch_Config->choice.setup : NULL, scc->dmrs_TypeA_Position, ps->nrOfSymbols, ps->startSymbolIndex, mapping_type);
|
ps->dl_dmrs_symb_pos = fill_dmrs_mask(bwpd ? bwpd->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);
|
||||||
|
LOG_I(NR_MAC,"bwpd0 %p, bwpd %p : Filling dmrs info, ps->N_PRB_DMRS %d, ps->dl_dmrs_symb_pos %x, ps->N_DMRS_SLOT %d",bwpd0,bwpd,ps->N_PRB_DMRS,ps->dl_dmrs_symb_pos,ps->N_DMRS_SLOT);
|
||||||
}
|
}
|
||||||
|
|
||||||
void nr_set_pusch_semi_static(const NR_ServingCellConfigCommon_t *scc,
|
void nr_set_pusch_semi_static(const NR_ServingCellConfigCommon_t *scc,
|
||||||
@@ -2026,20 +2028,41 @@ uint8_t nr_get_tpc(int target, uint8_t cqi, int incr) {
|
|||||||
|
|
||||||
void get_pdsch_to_harq_feedback(int Mod_idP,
|
void get_pdsch_to_harq_feedback(int Mod_idP,
|
||||||
int UE_id,
|
int UE_id,
|
||||||
|
int bwp_id,
|
||||||
NR_SearchSpace__searchSpaceType_PR ss_type,
|
NR_SearchSpace__searchSpaceType_PR ss_type,
|
||||||
uint8_t *pdsch_to_harq_feedback) {
|
uint8_t *pdsch_to_harq_feedback) {
|
||||||
|
|
||||||
int bwp_id=1;
|
|
||||||
NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
|
NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
|
||||||
NR_CellGroupConfig_t *CellGroup = UE_info->CellGroup[UE_id];
|
NR_CellGroupConfig_t *CellGroup = UE_info->CellGroup[UE_id];
|
||||||
NR_BWP_Downlink_t *bwp=NULL;
|
NR_BWP_DownlinkDedicated_t *bwpd=NULL;
|
||||||
NR_BWP_Uplink_t *ubwp=NULL;
|
NR_BWP_UplinkDedicated_t *ubwpd=NULL;
|
||||||
|
|
||||||
if (CellGroup && CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList)
|
|
||||||
bwp = CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_id-1];
|
|
||||||
if (CellGroup && CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList)
|
|
||||||
ubwp = CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_id-1];
|
|
||||||
|
|
||||||
|
if (ss_type == NR_SearchSpace__searchSpaceType_PR_ue_Specific) {
|
||||||
|
AssertFatal(CellGroup!=NULL,"Cellgroup is not defined for UE_id %d\n",UE_id);
|
||||||
|
AssertFatal(CellGroup->spCellConfig!=NULL,"Cellgroup->spCellConfig is null\n");
|
||||||
|
AssertFatal(CellGroup->spCellConfig->spCellConfigDedicated!=NULL,"CellGroup->spCellConfig->spCellConfigDedicated is null\n");
|
||||||
|
}
|
||||||
|
if (bwp_id>0) {
|
||||||
|
AssertFatal(CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList!=NULL,
|
||||||
|
"CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList is null\n");
|
||||||
|
AssertFatal(CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList!=NULL,
|
||||||
|
"CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList is null\n");
|
||||||
|
AssertFatal(CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count >= bwp_id,
|
||||||
|
"CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count %d < bwp_id %d\n",
|
||||||
|
CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count,bwp_id);
|
||||||
|
AssertFatal(CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count >= bwp_id,
|
||||||
|
"CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count %d < bwp_id %d\n",
|
||||||
|
CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count,bwp_id);
|
||||||
|
|
||||||
|
bwpd = CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_id-1]->bwp_Dedicated;
|
||||||
|
ubwpd = CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_id-1]->bwp_Dedicated;
|
||||||
|
}
|
||||||
|
else if (CellGroup) { // this is an initialBWP
|
||||||
|
AssertFatal((bwpd=CellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP)!=NULL,
|
||||||
|
"CellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP is null\n");
|
||||||
|
AssertFatal((ubwpd=CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP)!=NULL,
|
||||||
|
"CellGroup->spCellConfig->spCellConfigDedicated->uplnikConfig->initialUplinkBWP is null\n");
|
||||||
|
}
|
||||||
NR_SearchSpace_t *ss=NULL;
|
NR_SearchSpace_t *ss=NULL;
|
||||||
|
|
||||||
// common search type uses DCI format 1_0
|
// common search type uses DCI format 1_0
|
||||||
@@ -2051,9 +2074,11 @@ void get_pdsch_to_harq_feedback(int Mod_idP,
|
|||||||
|
|
||||||
// searching for a ue specific search space
|
// searching for a ue specific search space
|
||||||
int found=0;
|
int found=0;
|
||||||
|
AssertFatal(bwpd->pdcch_Config!=NULL,"bwpd->pdcch_Config is null\n");
|
||||||
for (int i=0;i<bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list.count;i++) {
|
AssertFatal(bwpd->pdcch_Config->choice.setup->searchSpacesToAddModList!=NULL,
|
||||||
ss=bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list.array[i];
|
"bwpd->pdcch_Config->choice.setup->searchSpacesToAddModList is null\n");
|
||||||
|
for (int i=0;i<bwpd->pdcch_Config->choice.setup->searchSpacesToAddModList->list.count;i++) {
|
||||||
|
ss=bwpd->pdcch_Config->choice.setup->searchSpacesToAddModList->list.array[i];
|
||||||
AssertFatal(ss->controlResourceSetId != NULL,"ss->controlResourceSetId is null\n");
|
AssertFatal(ss->controlResourceSetId != NULL,"ss->controlResourceSetId is null\n");
|
||||||
AssertFatal(ss->searchSpaceType != NULL,"ss->searchSpaceType is null\n");
|
AssertFatal(ss->searchSpaceType != NULL,"ss->searchSpaceType is null\n");
|
||||||
if (ss->searchSpaceType->present == ss_type) {
|
if (ss->searchSpaceType->present == ss_type) {
|
||||||
@@ -2069,9 +2094,10 @@ void get_pdsch_to_harq_feedback(int Mod_idP,
|
|||||||
pdsch_to_harq_feedback[i] = i+1;
|
pdsch_to_harq_feedback[i] = i+1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(ubwp->bwp_Dedicated->pucch_Config->choice.setup->dl_DataToUL_ACK != NULL) {
|
AssertFatal(ubwpd!=NULL,"ubwpd shouldn't be null here\n");
|
||||||
|
if(ubwpd->pucch_Config->choice.setup->dl_DataToUL_ACK != NULL) {
|
||||||
for (int i=0; i<8; i++)
|
for (int i=0; i<8; i++)
|
||||||
pdsch_to_harq_feedback[i] = *ubwp->bwp_Dedicated->pucch_Config->choice.setup->dl_DataToUL_ACK->list.array[i];
|
pdsch_to_harq_feedback[i] = *ubwpd->pucch_Config->choice.setup->dl_DataToUL_ACK->list.array[i];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
AssertFatal(0==1,"There is no allocated dl_DataToUL_ACK for pdsch to harq feedback\n");
|
AssertFatal(0==1,"There is no allocated dl_DataToUL_ACK for pdsch to harq feedback\n");
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ void nr_fill_nfapi_pucch(module_id_t mod_id,
|
|||||||
memset(pucch_pdu, 0, sizeof(nfapi_nr_pucch_pdu_t));
|
memset(pucch_pdu, 0, sizeof(nfapi_nr_pucch_pdu_t));
|
||||||
future_ul_tti_req->n_pdus += 1;
|
future_ul_tti_req->n_pdus += 1;
|
||||||
|
|
||||||
LOG_D(NR_MAC,
|
LOG_I(NR_MAC,
|
||||||
"%4d.%2d Scheduling pucch reception in %4d.%2d: bits SR %d, ACK %d, CSI %d on res %d\n",
|
"%4d.%2d Scheduling pucch reception in %4d.%2d: bits SR %d, ACK %d, CSI %d on res %d\n",
|
||||||
frame,
|
frame,
|
||||||
slot,
|
slot,
|
||||||
@@ -147,7 +147,7 @@ void nr_schedule_pucch(int Mod_idP,
|
|||||||
|| frameP != curr_pucch->frame
|
|| frameP != curr_pucch->frame
|
||||||
|| slotP != curr_pucch->ul_slot)
|
|| slotP != curr_pucch->ul_slot)
|
||||||
continue;
|
continue;
|
||||||
LOG_D(NR_MAC,"Scheduling PUCCH[%d] RX for UE %d in %d.%d O_ack %d\n",i,UE_id,curr_pucch->frame,curr_pucch->ul_slot,O_ack);
|
LOG_I(NR_MAC,"Scheduling PUCCH[%d] RX for UE %d in %d.%d O_ack %d\n",i,UE_id,curr_pucch->frame,curr_pucch->ul_slot,O_ack);
|
||||||
nr_fill_nfapi_pucch(Mod_idP, frameP, slotP, curr_pucch, UE_id);
|
nr_fill_nfapi_pucch(Mod_idP, frameP, slotP, curr_pucch, UE_id);
|
||||||
memset(curr_pucch, 0, sizeof(*curr_pucch));
|
memset(curr_pucch, 0, sizeof(*curr_pucch));
|
||||||
}
|
}
|
||||||
@@ -1217,7 +1217,7 @@ int nr_acknack_scheduling(int mod_id,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_D(NR_MAC,"1. DL slot %d, UL_ACK %d\n",slot,pucch->ul_slot);
|
LOG_D(NR_MAC,"1. DL slot %d, UL_ACK %d, DAI_C %d\n",slot,pucch->ul_slot,pucch->dai_c);
|
||||||
/* if the UE's next PUCCH occasion is after the possible UL slots (within the
|
/* if the UE's next PUCCH occasion is after the possible UL slots (within the
|
||||||
* same frame) or wrapped around to the next frame, then we assume there is
|
* same frame) or wrapped around to the next frame, then we assume there is
|
||||||
* no possible PUCCH allocation anymore */
|
* no possible PUCCH allocation anymore */
|
||||||
@@ -1227,10 +1227,25 @@ int nr_acknack_scheduling(int mod_id,
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
// this is hardcoded for now as ue specific only if we are not on the initialBWP (to be fixed to allow ue_Specific also on initialBWP
|
// this is hardcoded for now as ue specific only if we are not on the initialBWP (to be fixed to allow ue_Specific also on initialBWP
|
||||||
NR_SearchSpace__searchSpaceType_PR ss_type = sched_ctrl->active_bwp ? NR_SearchSpace__searchSpaceType_PR_ue_Specific: NR_SearchSpace__searchSpaceType_PR_common;
|
NR_CellGroupConfig_t *cg = RC.nrmac[mod_id]->UE_info.CellGroup[UE_id];
|
||||||
uint8_t pdsch_to_harq_feedback[8];
|
NR_BWP_UplinkDedicated_t *ubwpd=NULL;
|
||||||
get_pdsch_to_harq_feedback(mod_id, UE_id, ss_type, pdsch_to_harq_feedback);
|
|
||||||
|
|
||||||
|
if (cg &&
|
||||||
|
cg->spCellConfig &&
|
||||||
|
cg->spCellConfig->spCellConfigDedicated &&
|
||||||
|
cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
|
||||||
|
cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP)
|
||||||
|
ubwpd = cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP;
|
||||||
|
|
||||||
|
NR_SearchSpace__searchSpaceType_PR ss_type = (sched_ctrl->active_bwp || ubwpd) ? NR_SearchSpace__searchSpaceType_PR_ue_Specific: NR_SearchSpace__searchSpaceType_PR_common;
|
||||||
|
uint8_t pdsch_to_harq_feedback[8];
|
||||||
|
int bwp_Id = 0;
|
||||||
|
if (sched_ctrl->active_ubwp) bwp_Id = sched_ctrl->active_ubwp->bwp_Id;
|
||||||
|
|
||||||
|
get_pdsch_to_harq_feedback(mod_id, UE_id, bwp_Id, ss_type, pdsch_to_harq_feedback);
|
||||||
|
|
||||||
|
|
||||||
|
LOG_D(NR_MAC,"1b. DL slot %d, UL_ACK %d, DAI_C %d\n",slot,pucch->ul_slot,pucch->dai_c);
|
||||||
/* there is a HARQ. Check whether we can use it for this ACKNACK */
|
/* there is a HARQ. Check whether we can use it for this ACKNACK */
|
||||||
if (pucch->dai_c > 0) {
|
if (pucch->dai_c > 0) {
|
||||||
/* this UE already has a PUCCH occasion */
|
/* this UE already has a PUCCH occasion */
|
||||||
@@ -1303,9 +1318,10 @@ int nr_acknack_scheduling(int mod_id,
|
|||||||
|
|
||||||
// is there already CSI in this slot?
|
// is there already CSI in this slot?
|
||||||
csi_pucch = &sched_ctrl->sched_pucch[1];
|
csi_pucch = &sched_ctrl->sched_pucch[1];
|
||||||
if (csi_pucch->csi_bits > 0
|
if (csi_pucch &&
|
||||||
&& csi_pucch->frame == pucch->frame
|
csi_pucch->csi_bits > 0 &&
|
||||||
&& csi_pucch->ul_slot == pucch->ul_slot) {
|
csi_pucch->frame == pucch->frame &&
|
||||||
|
csi_pucch->ul_slot == pucch->ul_slot) {
|
||||||
// skip the CSI PUCCH if it is present and if in the next frame/slot
|
// skip the CSI PUCCH if it is present and if in the next frame/slot
|
||||||
// and if we don't multiplex
|
// and if we don't multiplex
|
||||||
// FIXME currently we support at most 11 bits in pucch2 so skip also in that case
|
// FIXME currently we support at most 11 bits in pucch2 so skip also in that case
|
||||||
@@ -1352,14 +1368,16 @@ int nr_acknack_scheduling(int mod_id,
|
|||||||
/* verify that at that slot and symbol, resources are free. We only do this
|
/* verify that at that slot and symbol, resources are free. We only do this
|
||||||
* for initialCyclicShift 0 (we assume it always has that one), so other
|
* for initialCyclicShift 0 (we assume it always has that one), so other
|
||||||
* initialCyclicShifts can overlap with ICS 0!*/
|
* initialCyclicShifts can overlap with ICS 0!*/
|
||||||
const NR_PUCCH_Resource_t *resource = pucch_Config->resourceToAddModList->list.array[pucch->resource_indicator];
|
if (pucch_Config) {
|
||||||
DevAssert(resource->format.present == NR_PUCCH_Resource__format_PR_format0);
|
const NR_PUCCH_Resource_t *resource = pucch_Config->resourceToAddModList->list.array[pucch->resource_indicator];
|
||||||
if (resource->format.choice.format0->initialCyclicShift == 0) {
|
DevAssert(resource->format.present == NR_PUCCH_Resource__format_PR_format0);
|
||||||
uint16_t *vrb_map_UL = &RC.nrmac[mod_id]->common_channels[CC_id].vrb_map_UL[pucch->ul_slot * MAX_BWP_SIZE];
|
if (resource->format.choice.format0->initialCyclicShift == 0) {
|
||||||
const uint16_t symb = 1 << resource->format.choice.format0->startingSymbolIndex;
|
uint16_t *vrb_map_UL = &RC.nrmac[mod_id]->common_channels[CC_id].vrb_map_UL[pucch->ul_slot * MAX_BWP_SIZE];
|
||||||
if ((vrb_map_UL[resource->startingPRB] & symb) != 0)
|
const uint16_t symb = 1 << resource->format.choice.format0->startingSymbolIndex;
|
||||||
LOG_W(NR_MAC, "symbol 0x%x is not free for PUCCH alloc in vrb_map_UL at RB %ld and slot %d.%d\n", symb, resource->startingPRB, pucch->frame, pucch->ul_slot);
|
if ((vrb_map_UL[resource->startingPRB] & symb) != 0)
|
||||||
vrb_map_UL[resource->startingPRB] |= symb;
|
LOG_W(NR_MAC, "symbol 0x%x is not free for PUCCH alloc in vrb_map_UL at RB %ld and slot %d.%d\n", symb, resource->startingPRB, pucch->frame, pucch->ul_slot);
|
||||||
|
vrb_map_UL[resource->startingPRB] |= symb;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -188,13 +188,13 @@ void calculate_preferred_ul_tda(module_id_t module_id, const NR_BWP_Uplink_t *ub
|
|||||||
tdd->nrofUplinkSlots);
|
tdd->nrofUplinkSlots);
|
||||||
}
|
}
|
||||||
|
|
||||||
void nr_process_mac_pdu(module_id_t module_idP,
|
int nr_process_mac_pdu(module_id_t module_idP,
|
||||||
int UE_id,
|
int UE_id,
|
||||||
uint8_t CC_id,
|
uint8_t CC_id,
|
||||||
frame_t frameP,
|
frame_t frameP,
|
||||||
sub_frame_t slot,
|
sub_frame_t slot,
|
||||||
uint8_t *pduP,
|
uint8_t *pduP,
|
||||||
uint16_t mac_pdu_len)
|
uint16_t mac_pdu_len)
|
||||||
{
|
{
|
||||||
|
|
||||||
// This function is adapting code from the old
|
// This function is adapting code from the old
|
||||||
@@ -234,7 +234,6 @@ void nr_process_mac_pdu(module_id_t module_idP,
|
|||||||
// 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;
|
// 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
|
// F: lenght of L is 0:8 or 1:16 bits wide
|
||||||
// R: Reserved bit, set to zero.
|
// R: Reserved bit, set to zero.
|
||||||
|
|
||||||
while (!done && pdu_len > 0){
|
while (!done && pdu_len > 0){
|
||||||
mac_ce_len = 0;
|
mac_ce_len = 0;
|
||||||
mac_subheader_len = 1; // default to fixed-length subheader = 1-oct
|
mac_subheader_len = 1; // default to fixed-length subheader = 1-oct
|
||||||
@@ -389,18 +388,24 @@ void nr_process_mac_pdu(module_id_t module_idP,
|
|||||||
mac_sdu_len = (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->L;
|
mac_sdu_len = (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->L;
|
||||||
mac_subheader_len = 2;
|
mac_subheader_len = 2;
|
||||||
}
|
}
|
||||||
LOG_D(NR_MAC, "[UE %d] Frame %d : ULSCH -> UL-DCCH %d (gNB %d, %d bytes), rnti: %d \n", module_idP, frameP, rx_lcid, module_idP, mac_sdu_len, UE_info->rnti[UE_id]);
|
if (UE_info->CellGroup[UE_id]) {
|
||||||
mac_rlc_data_ind(module_idP,
|
LOG_D(NR_MAC, "[UE %d] Frame %d : ULSCH -> UL-DCCH %d (gNB %d, %d bytes), rnti: %d \n", module_idP, frameP, rx_lcid, module_idP, mac_sdu_len, UE_info->rnti[UE_id]);
|
||||||
UE_info->rnti[UE_id],
|
mac_rlc_data_ind(module_idP,
|
||||||
module_idP,
|
UE_info->rnti[UE_id],
|
||||||
frameP,
|
module_idP,
|
||||||
ENB_FLAG_YES,
|
frameP,
|
||||||
MBMS_FLAG_NO,
|
ENB_FLAG_YES,
|
||||||
rx_lcid,
|
MBMS_FLAG_NO,
|
||||||
(char *) (pdu_ptr + mac_subheader_len),
|
rx_lcid,
|
||||||
mac_sdu_len,
|
(char *) (pdu_ptr + mac_subheader_len),
|
||||||
1,
|
mac_sdu_len,
|
||||||
NULL);
|
1,
|
||||||
|
NULL);
|
||||||
|
} else {
|
||||||
|
LOG_W(NR_MAC,"[UE %d] Frame/Slot %d.%d : Received LCID %d which is not configured, dropping packet\n",UE_id,frameP,slot,rx_lcid);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case UL_SCH_LCID_SRB3:
|
case UL_SCH_LCID_SRB3:
|
||||||
// todo
|
// todo
|
||||||
@@ -490,7 +495,7 @@ void nr_process_mac_pdu(module_id_t module_idP,
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
LOG_E(NR_MAC, "Received unknown MAC header (LCID = 0x%02x)\n", rx_lcid);
|
LOG_E(NR_MAC, "Received unknown MAC header (LCID = 0x%02x)\n", rx_lcid);
|
||||||
return;
|
return -1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
pdu_ptr += ( mac_subheader_len + mac_ce_len + mac_sdu_len );
|
pdu_ptr += ( mac_subheader_len + mac_ce_len + mac_sdu_len );
|
||||||
@@ -502,9 +507,10 @@ void nr_process_mac_pdu(module_id_t module_idP,
|
|||||||
for (int i = 0; i < 20; i++) // Only printf 1st - 20nd bytes
|
for (int i = 0; i < 20; i++) // Only printf 1st - 20nd bytes
|
||||||
printf("%02x ", pdu_ptr[i]);
|
printf("%02x ", pdu_ptr[i]);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void abort_nr_ul_harq(module_id_t mod_id, int UE_id, int8_t harq_pid)
|
void abort_nr_ul_harq(module_id_t mod_id, int UE_id, int8_t harq_pid)
|
||||||
@@ -781,13 +787,16 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
|
|||||||
// First byte corresponds to R/LCID MAC sub-header
|
// First byte corresponds to R/LCID MAC sub-header
|
||||||
memcpy(ra->cont_res_id, &sduP[1], sizeof(uint8_t) * 6);
|
memcpy(ra->cont_res_id, &sduP[1], sizeof(uint8_t) * 6);
|
||||||
|
|
||||||
nr_process_mac_pdu(gnb_mod_idP, UE_id, CC_idP, frameP, slotP, sduP, sdu_lenP);
|
if (nr_process_mac_pdu(gnb_mod_idP, UE_id, CC_idP, frameP, slotP, sduP, sdu_lenP) == 0) {
|
||||||
|
ra->state = Msg4;
|
||||||
ra->state = Msg4;
|
ra->Msg4_frame = ( frameP +2 ) % 1024;
|
||||||
ra->Msg4_frame = ( frameP +2 ) % 1024;
|
ra->Msg4_slot = 1;
|
||||||
ra->Msg4_slot = 1;
|
LOG_I(NR_MAC, "Scheduling RA-Msg4 for TC_RNTI %04x (state %d, frame %d, slot %d)\n", ra->rnti, ra->state, ra->Msg4_frame, ra->Msg4_slot);
|
||||||
LOG_I(NR_MAC, "Scheduling RA-Msg4 for TC_RNTI %04x (state %d, frame %d, slot %d)\n", ra->rnti, ra->state, ra->Msg4_frame, ra->Msg4_slot);
|
}
|
||||||
|
else {
|
||||||
|
nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
|
||||||
|
nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1166,13 +1175,13 @@ void pf_ul(module_id_t module_id,
|
|||||||
UE_id, UE_info->rnti[UE_id],rbStart,min_rb,bwpSize);
|
UE_id, UE_info->rnti[UE_id],rbStart,min_rb,bwpSize);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else LOG_D(NR_MAC,"allocating UL data for UE %d/RNTI %04x (rbStsart %d, min_rb %d, bwpSize %d\n",UE_id, UE_info->rnti[UE_id],rbStart,min_rb,bwpSize);
|
else LOG_I(NR_MAC,"allocating UL data for UE %d/RNTI %04x (rbStsart %d, min_rb %d, bwpSize %d\n",UE_id, UE_info->rnti[UE_id],rbStart,min_rb,bwpSize);
|
||||||
|
|
||||||
/* Save PUSCH field */
|
/* Save PUSCH field */
|
||||||
/* we want to avoid a lengthy deduction of DMRS and other parameters in
|
/* we want to avoid a lengthy deduction of DMRS and other parameters in
|
||||||
* every TTI if we can save it, so check whether dci_format, TDA, or
|
* every TTI if we can save it, so check whether dci_format, TDA, or
|
||||||
* num_dmrs_cdm_grps_no_data has changed and only then recompute */
|
* num_dmrs_cdm_grps_no_data has changed and only then recompute */
|
||||||
const uint8_t num_dmrs_cdm_grps_no_data = sched_ctrl->active_ubwp ? 1 : 2;
|
const uint8_t num_dmrs_cdm_grps_no_data = (sched_ctrl->active_ubwp || ubwpd) ? 1 : 2;
|
||||||
int dci_format = get_dci_format(sched_ctrl);
|
int dci_format = get_dci_format(sched_ctrl);
|
||||||
const int tda = sched_ctrl->active_ubwp ? nrmac->preferred_ul_tda[sched_ctrl->active_ubwp->bwp_Id][slot] : 0;
|
const int tda = sched_ctrl->active_ubwp ? nrmac->preferred_ul_tda[sched_ctrl->active_ubwp->bwp_Id][slot] : 0;
|
||||||
if (ps->time_domain_allocation != tda
|
if (ps->time_domain_allocation != tda
|
||||||
@@ -1195,8 +1204,8 @@ void pf_ul(module_id_t module_id,
|
|||||||
&rbSize);
|
&rbSize);
|
||||||
sched_pusch->rbSize = rbSize;
|
sched_pusch->rbSize = rbSize;
|
||||||
sched_pusch->tb_size = TBS;
|
sched_pusch->tb_size = TBS;
|
||||||
LOG_D(NR_MAC,"rbSize %d, TBS %d, est buf %d, sched_ul %d, B %d, CCE %d\n",
|
LOG_I(NR_MAC,"rbSize %d, TBS %d, est buf %d, sched_ul %d, B %d, CCE %d, num_dmrs_symb %d, N_PRB_DMRS %d\n",
|
||||||
rbSize, sched_pusch->tb_size, sched_ctrl->estimated_ul_buffer, sched_ctrl->sched_ul_bytes, B,sched_ctrl->cce_index);
|
rbSize, sched_pusch->tb_size, sched_ctrl->estimated_ul_buffer, sched_ctrl->sched_ul_bytes, B,sched_ctrl->cce_index,ps->num_dmrs_symb,ps->N_PRB_DMRS);
|
||||||
|
|
||||||
/* Mark the corresponding RBs as used */
|
/* Mark the corresponding RBs as used */
|
||||||
n_rb_sched -= sched_pusch->rbSize;
|
n_rb_sched -= sched_pusch->rbSize;
|
||||||
@@ -1430,8 +1439,8 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
|
|||||||
sched_ctrl->last_ul_frame = sched_pusch->frame;
|
sched_ctrl->last_ul_frame = sched_pusch->frame;
|
||||||
sched_ctrl->last_ul_slot = sched_pusch->slot;
|
sched_ctrl->last_ul_slot = sched_pusch->slot;
|
||||||
|
|
||||||
LOG_D(NR_MAC,
|
LOG_I(NR_MAC,
|
||||||
"%4d.%2d RNTI %04x UL sched %4d.%2d start %2d RBS %3d startSymbol %2d nb_symbol %2d dmrs_pos %x MCS %2d TBS %4d HARQ PID %2d round %d RV %d NDI %d est %6d sched %6d est BSR %6d\n",
|
"ULSCH/PUSCH: %4d.%2d RNTI %04x UL sched %4d.%2d start %2d RBS %3d startSymbol %2d nb_symbol %2d dmrs_pos %x MCS %2d TBS %4d HARQ PID %2d round %d RV %d NDI %d est %6d sched %6d est BSR %6d\n",
|
||||||
frame,
|
frame,
|
||||||
slot,
|
slot,
|
||||||
rnti,
|
rnti,
|
||||||
|
|||||||
@@ -201,6 +201,7 @@ int nr_acknack_scheduling(int Mod_idP,
|
|||||||
|
|
||||||
void get_pdsch_to_harq_feedback(int Mod_idP,
|
void get_pdsch_to_harq_feedback(int Mod_idP,
|
||||||
int UE_id,
|
int UE_id,
|
||||||
|
int bwp_id,
|
||||||
NR_SearchSpace__searchSpaceType_PR ss_type,
|
NR_SearchSpace__searchSpaceType_PR ss_type,
|
||||||
uint8_t *pdsch_to_harq_feedback);
|
uint8_t *pdsch_to_harq_feedback);
|
||||||
|
|
||||||
|
|||||||
@@ -285,7 +285,7 @@ int8_t mac_rrc_nr_data_req(const module_id_t Mod_idP,
|
|||||||
|
|
||||||
LOG_D(NR_RRC,"[gNB %d] Frame %d CCCH request (Srb_id %ld)\n", Mod_idP, frameP, Srb_id);
|
LOG_D(NR_RRC,"[gNB %d] Frame %d CCCH request (Srb_id %ld)\n", Mod_idP, frameP, Srb_id);
|
||||||
|
|
||||||
AssertFatal(ue_context_p!=NULL,"failed to get ue_context\n");
|
AssertFatal(ue_context_p!=NULL,"failed to get ue_context, rnti %x\n",rnti);
|
||||||
char payload_size = ue_context_p->ue_context.Srb0.Tx_buffer.payload_size;
|
char payload_size = ue_context_p->ue_context.Srb0.Tx_buffer.payload_size;
|
||||||
|
|
||||||
// check if data is there for MAC
|
// check if data is there for MAC
|
||||||
|
|||||||
@@ -1378,7 +1378,7 @@ void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGr
|
|||||||
rlc_Config_drb->choice.am->ul_AM_RLC.t_PollRetransmit = NR_T_PollRetransmit_ms80;
|
rlc_Config_drb->choice.am->ul_AM_RLC.t_PollRetransmit = NR_T_PollRetransmit_ms80;
|
||||||
rlc_Config_drb->choice.am->ul_AM_RLC.pollPDU = NR_PollPDU_p64;
|
rlc_Config_drb->choice.am->ul_AM_RLC.pollPDU = NR_PollPDU_p64;
|
||||||
rlc_Config_drb->choice.am->ul_AM_RLC.pollByte = NR_PollByte_kB125;
|
rlc_Config_drb->choice.am->ul_AM_RLC.pollByte = NR_PollByte_kB125;
|
||||||
rlc_Config_drb->choice.am->ul_AM_RLC.maxRetxThreshold = NR_UL_AM_RLC__maxRetxThreshold_t4;
|
rlc_Config_drb->choice.am->ul_AM_RLC.maxRetxThreshold = NR_UL_AM_RLC__maxRetxThreshold_t8;
|
||||||
rlc_BearerConfig_drb->rlc_Config = rlc_Config_drb;
|
rlc_BearerConfig_drb->rlc_Config = rlc_Config_drb;
|
||||||
logicalChannelConfig_drb = calloc(1, sizeof(NR_LogicalChannelConfig_t));
|
logicalChannelConfig_drb = calloc(1, sizeof(NR_LogicalChannelConfig_t));
|
||||||
logicalChannelConfig_drb->ul_SpecificParameters = calloc(1, sizeof(*logicalChannelConfig_drb->ul_SpecificParameters));
|
logicalChannelConfig_drb->ul_SpecificParameters = calloc(1, sizeof(*logicalChannelConfig_drb->ul_SpecificParameters));
|
||||||
|
|||||||
@@ -641,7 +641,7 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp
|
|||||||
break;
|
break;
|
||||||
case USRP_X300_DEV:
|
case USRP_X300_DEV:
|
||||||
case USRP_N300_DEV:
|
case USRP_N300_DEV:
|
||||||
rxshift=4;
|
rxshift=2;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
AssertFatal(1==0,"Shouldn't be here\n");
|
AssertFatal(1==0,"Shouldn't be here\n");
|
||||||
@@ -940,7 +940,7 @@ extern "C" {
|
|||||||
LOG_I(HW, "openair0_cfg[0].sdr_addrs == '%s'\n", openair0_cfg[0].sdr_addrs);
|
LOG_I(HW, "openair0_cfg[0].sdr_addrs == '%s'\n", openair0_cfg[0].sdr_addrs);
|
||||||
LOG_I(HW, "openair0_cfg[0].clock_source == '%d' (internal = %d, external = %d)\n", openair0_cfg[0].clock_source,internal,external);
|
LOG_I(HW, "openair0_cfg[0].clock_source == '%d' (internal = %d, external = %d)\n", openair0_cfg[0].clock_source,internal,external);
|
||||||
usrp_state_t *s ;
|
usrp_state_t *s ;
|
||||||
int choffset = 1;
|
int choffset = 0;
|
||||||
|
|
||||||
if ( device->priv == NULL) {
|
if ( device->priv == NULL) {
|
||||||
s=(usrp_state_t *)calloc(sizeof(usrp_state_t),1);
|
s=(usrp_state_t *)calloc(sizeof(usrp_state_t),1);
|
||||||
|
|||||||
Reference in New Issue
Block a user