From 1ec528dbdbfdd0a0e55529f305bd751e25e2c551 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sat, 14 Oct 2023 19:40:56 +0200 Subject: [PATCH 01/14] Remove commented code --- executables/nr-gnb.c | 54 -------------------------------------------- 1 file changed, 54 deletions(-) diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c index 35dcbde525..5fc0be3941 100644 --- a/executables/nr-gnb.c +++ b/executables/nr-gnb.c @@ -204,21 +204,6 @@ void rx_func(void *param) handle_nr_slot_ind(frame_rx, slot_rx); stop_meas(&nfapi_meas); - /*if (gNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus|| - gNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs || - gNB->UL_INFO.crc_ind.crc_indication_body.number_of_crcs || - gNB->UL_INFO.rach_ind.number_of_pdus || - gNB->UL_INFO.cqi_ind.number_of_cqis - ) { - LOG_D(PHY, "UL_info[rx_ind:%05d:%d harqs:%05d:%d crcs:%05d:%d rach_pdus:%0d.%d:%d cqis:%d] RX:%04d%d TX:%04d%d \n", - NFAPI_SFNSF2DEC(gNB->UL_INFO.rx_ind.sfn_sf), gNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus, - NFAPI_SFNSF2DEC(gNB->UL_INFO.harq_ind.sfn_sf), gNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs, - NFAPI_SFNSF2DEC(gNB->UL_INFO.crc_ind.sfn_sf), gNB->UL_INFO.crc_ind.crc_indication_body.number_of_crcs, - gNB->UL_INFO.rach_ind.sfn, gNB->UL_INFO.rach_ind.slot,gNB->UL_INFO.rach_ind.number_of_pdus, - gNB->UL_INFO.cqi_ind.number_of_cqis, - frame_rx, slot_rx, - frame_tx, slot_tx); - }*/ } // **************************************** @@ -304,45 +289,6 @@ void rx_func(void *param) pushNotifiedFIFO(&gNB->L1_tx_out, res); } -#if 0 - LOG_D(PHY, "rxtx:%lld nfapi:%lld phy:%lld tx:%lld rx:%lld prach:%lld ofdm:%lld ", - softmodem_stats_rxtx_sf.diff_now, nfapi_meas.diff_now, - TICK_TO_US(gNB->phy_proc), - TICK_TO_US(gNB->phy_proc_tx), - TICK_TO_US(gNB->phy_proc_rx), - TICK_TO_US(gNB->rx_prach), - TICK_TO_US(gNB->ofdm_mod_stats), - softmodem_stats_rxtx_sf.diff_now, nfapi_meas.diff_now); - LOG_D(PHY, - "dlsch[enc:%lld mod:%lld scr:%lld rm:%lld t:%lld i:%lld] rx_dft:%lld ", - TICK_TO_US(gNB->dlsch_encoding_stats), - TICK_TO_US(gNB->dlsch_modulation_stats), - TICK_TO_US(gNB->dlsch_scrambling_stats), - TICK_TO_US(gNB->dlsch_rate_matching_stats), - TICK_TO_US(gNB->dlsch_turbo_encoding_stats), - TICK_TO_US(gNB->dlsch_interleaving_stats), - TICK_TO_US(gNB->rx_dft_stats)); - LOG_D(PHY," ulsch[ch:%lld freq:%lld dec:%lld demod:%lld ru:%lld ", - TICK_TO_US(gNB->ulsch_channel_estimation_stats), - TICK_TO_US(gNB->ulsch_freq_offset_estimation_stats), - TICK_TO_US(gNB->ulsch_decoding_stats), - TICK_TO_US(gNB->ulsch_demodulation_stats), - TICK_TO_US(gNB->ulsch_rate_unmatching_stats)); - LOG_D(PHY, "td:%lld dei:%lld dem:%lld llr:%lld tci:%lld ", - TICK_TO_US(gNB->ulsch_turbo_decoding_stats), - TICK_TO_US(gNB->ulsch_deinterleaving_stats), - TICK_TO_US(gNB->ulsch_demultiplexing_stats), - TICK_TO_US(gNB->ulsch_llr_stats), - TICK_TO_US(gNB->ulsch_tc_init_stats)); - LOG_D(PHY, "tca:%lld tcb:%lld tcg:%lld tce:%lld l1:%lld l2:%lld]\n\n", - TICK_TO_US(gNB->ulsch_tc_alpha_stats), - TICK_TO_US(gNB->ulsch_tc_beta_stats), - TICK_TO_US(gNB->ulsch_tc_gamma_stats), - TICK_TO_US(gNB->ulsch_tc_ext_stats), - TICK_TO_US(gNB->ulsch_tc_intl1_stats), - TICK_TO_US(gNB->ulsch_tc_intl2_stats) - ); -#endif } static size_t dump_L1_meas_stats(PHY_VARS_gNB *gNB, RU_t *ru, char *output, size_t outputlen) { const char *begin = output; From bb044cf9403825c1b92898392577dcd950448b22 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sat, 14 Oct 2023 19:44:12 +0200 Subject: [PATCH 02/14] Update logs to NR_ version and add some new --- executables/nr-ru.c | 2 +- openair1/PHY/NR_TRANSPORT/nr_prach.c | 1 + openair1/SCHED_NR/fapi_nr_l1.c | 20 +++++++++---------- openair1/SCHED_NR/nr_prach_procedures.c | 5 +++-- openair2/NR_PHY_INTERFACE/nr_sched_response.c | 4 ++++ radio/ETHERNET/eth_udp.c | 5 +++-- 6 files changed, 22 insertions(+), 15 deletions(-) diff --git a/executables/nr-ru.c b/executables/nr-ru.c index c61088dc88..03ebab6b2e 100644 --- a/executables/nr-ru.c +++ b/executables/nr-ru.c @@ -283,7 +283,7 @@ void fh_if5_south_out(RU_t *ru, int frame, int slot, uint64_t timestamp) { for (int aid=0;aidnb_tx;aid++) buffs[aid] = (void*)&ru->common.txdata[aid][offset]; struct timespec txmeas; clock_gettime(CLOCK_MONOTONIC, &txmeas); - LOG_D(PHY,"IF5 TX %d.%d, TS %llu, buffs[0] %p, buffs[1] %p ener0 %f dB, tx start %d\n",frame,slot,(unsigned long long)timestamp,buffs[0],buffs[1], + LOG_D(NR_PHY,"IF5 TX %d.%d, TS %llu, buffs[0] %p, buffs[1] %p ener0 %f dB, tx start %d\n",frame,slot,(unsigned long long)timestamp,buffs[0],buffs[1], 10*log10((double)signal_energy(buffs[0],ru->nr_frame_parms->get_samples_per_slot(slot,ru->nr_frame_parms))),(int)txmeas.tv_nsec); ru->ifdevice.trx_write_func2(&ru->ifdevice, timestamp, diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach.c b/openair1/PHY/NR_TRANSPORT/nr_prach.c index 16b42dd9b1..5f534ef500 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prach.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prach.c @@ -81,6 +81,7 @@ void nr_fill_prach(PHY_VARS_gNB *gNB, gNB->prach_vars.list[prach_id].frame=SFN; gNB->prach_vars.list[prach_id].slot=Slot; + LOG_D(NR_PHY,"Copying prach pdu %d bytes to index %d\n",(int)sizeof(*prach_pdu),prach_id); memcpy((void*)&gNB->prach_vars.list[prach_id].pdu,(void*)prach_pdu,sizeof(*prach_pdu)); } diff --git a/openair1/SCHED_NR/fapi_nr_l1.c b/openair1/SCHED_NR/fapi_nr_l1.c index 8d9a51d41a..979acf2343 100644 --- a/openair1/SCHED_NR/fapi_nr_l1.c +++ b/openair1/SCHED_NR/fapi_nr_l1.c @@ -55,7 +55,7 @@ void handle_nr_nfapi_ssb_pdu(processingData_L1tx_t *msgTx,int frame,int slot, uint8_t i_ssb = dl_tti_pdu->ssb_pdu.ssb_pdu_rel15.SsbBlockIndex; - LOG_D(PHY,"%d.%d : ssb index %d pbch_pdu: %x\n",frame,slot,i_ssb,dl_tti_pdu->ssb_pdu.ssb_pdu_rel15.bchPayload); + LOG_D(NR_PHY,"%d.%d : ssb index %d pbch_pdu: %x\n",frame,slot,i_ssb,dl_tti_pdu->ssb_pdu.ssb_pdu_rel15.bchPayload); if (msgTx->ssb[i_ssb].active) AssertFatal(1==0,"SSB PDU with index %d already active\n",i_ssb); else { @@ -109,7 +109,7 @@ void handle_nfapi_nr_csirs_pdu(processingData_L1tx_t *msgTx, int frame, int slot for (int id = 0; id < NR_SYMBOLS_PER_SLOT; id++) { NR_gNB_CSIRS_t *csirs = &msgTx->csirs_pdu[id]; if (csirs->active == 0) { - LOG_D(PHY,"Frame %d Slot %d CSI_RS with ID %d is now active\n",frame,slot,id); + LOG_D(NR_PHY,"Frame %d Slot %d CSI_RS with ID %d is now active\n",frame,slot,id); csirs->active = 1; memcpy((void*)&csirs->csirs_pdu, (void*)csirs_pdu, sizeof(nfapi_nr_dl_tti_csi_rs_pdu)); found = 1; @@ -181,7 +181,7 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO) for (int i=0;idl_tti_request_body.dl_tti_pdu_list[i]; - LOG_D(PHY,"NFAPI: dl_pdu %d : type %d\n",i,dl_tti_pdu->PDUType); + LOG_D(NR_PHY,"NFAPI: dl_pdu %d : type %d\n",i,dl_tti_pdu->PDUType); switch (dl_tti_pdu->PDUType) { case NFAPI_NR_DL_TTI_SSB_PDU_TYPE: handle_nr_nfapi_ssb_pdu(msgTx,frame,slot, @@ -189,18 +189,18 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO) break; case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE: - LOG_D(PHY,"frame %d, slot %d, Got NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE for %d.%d\n",frame,slot,DL_req->SFN,DL_req->Slot); + LOG_D(NR_PHY,"frame %d, slot %d, Got NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE for %d.%d\n",frame,slot,DL_req->SFN,DL_req->Slot); msgTx->pdcch_pdu[msgTx->num_dl_pdcch] = dl_tti_pdu->pdcch_pdu; msgTx->num_dl_pdcch++; break; case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE: - LOG_D(PHY,"frame %d, slot %d, Got NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE for %d.%d\n",frame,slot,DL_req->SFN,DL_req->Slot); + LOG_D(NR_PHY,"frame %d, slot %d, Got NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE for %d.%d\n",frame,slot,DL_req->SFN,DL_req->Slot); handle_nfapi_nr_csirs_pdu(msgTx,frame,slot,&dl_tti_pdu->csi_rs_pdu); break; case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE: - LOG_D(PHY,"frame %d, slot %d, Got NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE for %d.%d\n",frame,slot,DL_req->SFN,DL_req->Slot); + LOG_D(NR_PHY,"frame %d, slot %d, Got NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE for %d.%d\n",frame,slot,DL_req->SFN,DL_req->Slot); nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdu->pdsch_pdu.pdsch_pdu_rel15; uint16_t pduIndex = pdsch_pdu_rel15->pduIndex; AssertFatal(TX_req->pdu_list[pduIndex].num_TLV == 1, "TX_req->pdu_list[%d].num_TLV %d != 1\n", @@ -229,22 +229,22 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO) for (int i = 0; i < number_ul_tti_pdu; i++) { switch (UL_tti_req->pdus_list[i].pdu_type) { case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE: - LOG_D(PHY,"frame %d, slot %d, Got NFAPI_NR_UL_TTI_PUSCH_PDU_TYPE for %d.%d\n", frame, slot, UL_tti_req->SFN, UL_tti_req->Slot); + LOG_D(NR_PHY,"frame %d, slot %d, Got NFAPI_NR_UL_TTI_PUSCH_PDU_TYPE for %d.%d\n", frame, slot, UL_tti_req->SFN, UL_tti_req->Slot); nr_fill_ulsch(gNB,UL_tti_req->SFN, UL_tti_req->Slot, &UL_tti_req->pdus_list[i].pusch_pdu); break; case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE: - 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); + LOG_D(NR_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); break; case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE: - LOG_D(PHY,"frame %d, slot %d, Got NFAPI_NR_UL_TTI_PRACH_PDU_TYPE for %d.%d\n", frame, slot, UL_tti_req->SFN, UL_tti_req->Slot); + LOG_D(NR_PHY,"frame %d, slot %d, Got NFAPI_NR_UL_TTI_PRACH_PDU_TYPE for %d.%d\n", frame, slot, UL_tti_req->SFN, UL_tti_req->Slot); nfapi_nr_prach_pdu_t *prach_pdu = &UL_tti_req->pdus_list[i].prach_pdu; nr_fill_prach(gNB, UL_tti_req->SFN, UL_tti_req->Slot, prach_pdu); if (gNB->RU_list[0]->if_south == LOCAL_RF || gNB->RU_list[0]->if_south == REMOTE_IF5) nr_fill_prach_ru(gNB->RU_list[0], UL_tti_req->SFN, UL_tti_req->Slot, prach_pdu); break; case NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE: - LOG_D(PHY,"frame %d, slot %d, Got NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE for %d.%d\n", frame, slot, UL_tti_req->SFN, UL_tti_req->Slot); + LOG_D(NR_PHY,"frame %d, slot %d, Got NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE for %d.%d\n", frame, slot, UL_tti_req->SFN, UL_tti_req->Slot); nr_fill_srs(gNB,UL_tti_req->SFN, UL_tti_req->Slot, &UL_tti_req->pdus_list[i].srs_pdu); break; } diff --git a/openair1/SCHED_NR/nr_prach_procedures.c b/openair1/SCHED_NR/nr_prach_procedures.c index b0167dce9e..ce79cec448 100644 --- a/openair1/SCHED_NR/nr_prach_procedures.c +++ b/openair1/SCHED_NR/nr_prach_procedures.c @@ -120,6 +120,7 @@ void L1_nr_prach_procedures(PHY_VARS_gNB *gNB,int frame,int slot) { int prach_id=find_nr_prach(gNB,frame,slot,SEARCH_EXIST); if (prach_id>=0) { + LOG_D(NR_PHY,"%d.%d Got prach entry id %d\n",frame,slot,prach_id); nfapi_nr_prach_pdu_t *prach_pdu = &gNB->prach_vars.list[prach_id].pdu; uint8_t prachStartSymbol; uint8_t N_dur = get_nr_prach_duration(prach_pdu->prach_format); @@ -140,9 +141,9 @@ void L1_nr_prach_procedures(PHY_VARS_gNB *gNB,int frame,int slot) { &max_preamble[0], &max_preamble_energy[0], &max_preamble_delay[0]); - + LOG_D(NR_PHY,"Freeing PRACH entry %d\n",prach_id); free_nr_prach_entry(gNB,prach_id); - LOG_D(PHY,"[RAPROC] Frame %d, slot %d, occasion %d (prachStartSymbol %d) : Most likely preamble %d, energy %d.%d dB delay %d (prach_energy counter %d)\n", + LOG_D(NR_PHY,"[RAPROC] Frame %d, slot %d, occasion %d (prachStartSymbol %d) : Most likely preamble %d, energy %d.%d dB delay %d (prach_energy counter %d)\n", frame,slot,prach_oc,prachStartSymbol, max_preamble[0], max_preamble_energy[0]/10, diff --git a/openair2/NR_PHY_INTERFACE/nr_sched_response.c b/openair2/NR_PHY_INTERFACE/nr_sched_response.c index f0aa25781c..17b6c56c29 100644 --- a/openair2/NR_PHY_INTERFACE/nr_sched_response.c +++ b/openair2/NR_PHY_INTERFACE/nr_sched_response.c @@ -105,6 +105,7 @@ NR_Sched_Rsp_t *allocate_sched_response(void) static void release_sched_response(int sched_response_id) { + LOG_D(NR_MAC,"Releasing sched_response %d\n",sched_response_id); resp_freelist_next[sched_response_id] = resp_freelist_head; resp_freelist_head = sched_response_id; } @@ -124,6 +125,7 @@ void deref_sched_response(int sched_response_id) AssertFatal(resp_freelist_inited, "sched_response used before init\n"); AssertFatal(resp_refcount[sched_response_id] > 0, "sched_reponse decreased too much\n"); + LOG_D(NR_MAC,"resp_refcount[%d] %d\n",sched_response_id,resp_refcount[sched_response_id]); resp_refcount[sched_response_id]--; if (resp_refcount[sched_response_id] == 0) release_sched_response(sched_response_id); @@ -141,6 +143,8 @@ void inc_ref_sched_response(int sched_response_id) if (sched_response_id == -1) return; + LOG_D(NR_MAC,"Incrementing sched_resp resp_refounct[%d] = %d\n", + sched_response_id,resp_refcount[sched_response_id]); if (pthread_mutex_lock(&resp_mutex)) AssertFatal(0, "pthread_mutex_lock failed\n"); diff --git a/radio/ETHERNET/eth_udp.c b/radio/ETHERNET/eth_udp.c index 82772e8905..6d41a783ab 100644 --- a/radio/ETHERNET/eth_udp.c +++ b/radio/ETHERNET/eth_udp.c @@ -337,7 +337,7 @@ void *trx_eth_write_udp_cmd(udpTXelem_t *udpTXelem) { TS -= device->txrx_offset; int TSinc = (6*256*device->sampling_rate_ratio_d)/device->sampling_rate_ratio_n; int len=256; - LOG_D(PHY,"TS %llu (%llu),txrx_offset %d,d %d, n %d, buff[0] %p buff[1] %p\n", + LOG_D(NR_PHY,"in eth send: TS %llu (%llu),txrx_offset %d,d %d, n %d, buff[0] %p buff[1] %p\n", (unsigned long long)TS,(unsigned long long)timestamp,device->txrx_offset,device->sampling_rate_ratio_d,device->sampling_rate_ratio_n, buff[0],buff[1]); for (int offset=0;offset>8; *(uint8_t *)(buff2 + 3) = len&0xff; for (int aid = 0; aidTS0,aid,offset,len); + LOG_D(NR_PHY,"TS %llu (TS0 %llu) aa %d : offset %d, len %d\n",(unsigned long long)TS,(unsigned long long)fhstate->TS0,aid,offset,len); // ECPRI PC_ID (2 bytes) *(uint16_t *)(buff2 + 4) = aid; // bring TX data into 12 MSBs @@ -383,6 +383,7 @@ void *trx_eth_write_udp_cmd(udpTXelem_t *udpTXelem) { } // aid } // offset free(buff); + LOG_D(NR_PHY,"Returning from eth send\n"); return(NULL); } From 94a0704e4338b9cf2507271440b0311c4377856a Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sat, 14 Oct 2023 19:46:00 +0200 Subject: [PATCH 03/14] Update sample config gnb.sa.band41.fr1.106PRB.usrpb210.conf --- .../gnb.sa.band41.fr1.106PRB.usrpb210.conf | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf index 60077f4ab4..3ecd542a9c 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf @@ -11,7 +11,7 @@ gNBs = // Tracking area code, 0x0000 and 0xfffe are reserved values tracking_area_code = 1; - plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ({ sst = 1 }) }); + plmn_list = ({ mcc = 208; mnc = 98; mnc_length = 2; snssaiList = ({ sst = 1 }) }); nr_cellid = 12345678L; @@ -136,10 +136,10 @@ gNBs = # pattern1 # dl_UL_TransmissionPeriodicity # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 - dl_UL_TransmissionPeriodicity = 6; - nrofDownlinkSlots = 7; + dl_UL_TransmissionPeriodicity = 5; + nrofDownlinkSlots = 3; nrofDownlinkSymbols = 6; - nrofUplinkSlots = 2; + nrofUplinkSlots = 1; nrofUplinkSymbols = 4; ssPBCH_BlockPower = -25; @@ -168,9 +168,9 @@ gNBs = NETWORK_INTERFACES : { - GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; + GNB_INTERFACE_NAME_FOR_NG_AMF = "internet"; GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24"; - GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; + GNB_INTERFACE_NAME_FOR_NGU = "internet"; GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24"; GNB_PORT_FOR_S1U = 2152; # Spec 2152 }; @@ -186,6 +186,10 @@ MACRLCs = ( pusch_TargetSNRx10 = 150; pucch_TargetSNRx10 = 200; ulsch_max_frame_inactivity = 0; + ul_max_mcs = 10; + min_grant_prb = 20; + min_grant_mcs = 16; + dl_max_mcs = 10; } ); @@ -204,8 +208,8 @@ RUs = ( local_rf = "yes" nb_tx = 1 nb_rx = 1 - att_tx = 6; - att_rx = 6; + att_tx = 0; + att_rx = 0; bands = [41]; max_pdschReferenceSignalPower = -27; max_rxgain = 114; @@ -213,6 +217,7 @@ RUs = ( #beamforming 1x4 matrix: bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; clock_src = "internal"; + sl_ahead = 2; } ); From 88852dc9af60b1067139d9cec62979eb562ef3c2 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Tue, 6 Feb 2024 16:21:31 +0100 Subject: [PATCH 04/14] Introduce slot indication tick to run (DL) scheduler The next commit introduces a separate gNB TX processing thread. To properly separate DL scheduler (for scheduling decisions) from UL indication handling (for UL packets), this commit introduces a slot indication "tick" to run the DL scheduler which will be put into the gNB TX processing chain instead of the UL indication. --- executables/nr-gnb.c | 2 + openair2/NR_PHY_INTERFACE/NR_IF_Module.c | 104 ++++++++++++----------- openair2/NR_PHY_INTERFACE/NR_IF_Module.h | 1 + 3 files changed, 56 insertions(+), 51 deletions(-) diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c index 5fc0be3941..47210fc0f7 100644 --- a/executables/nr-gnb.c +++ b/executables/nr-gnb.c @@ -52,6 +52,8 @@ #include "PHY/MODULATION/nr_modulation.h" #include "PHY/NR_TRANSPORT/nr_dlsch.h" #include "openair2/NR_PHY_INTERFACE/nr_sched_response.h" +#include "LAYER2/NR_MAC_COMMON/nr_mac_extern.h" +#include "LAYER2/NR_MAC_gNB/mac_proto.h" #undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all //#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all diff --git a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c index 4f23c327a7..86ef7247c5 100644 --- a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c @@ -385,12 +385,49 @@ static void match_crc_rx_pdu(nfapi_nr_rx_data_indication_t *rx_ind, nfapi_nr_crc } } +static void run_scheduler(module_id_t module_id, int CC_id, int frame, int slot) +{ + NR_IF_Module_t *ifi = nr_if_inst[module_id]; + // gNB_MAC_INST *mac = RC.nrmac[module_id]; + + NR_Sched_Rsp_t *sched_info; + LOG_D(NR_MAC, "Calling scheduler for %d.%d\n", frame, slot); + sched_info = allocate_sched_response(); + + // clear UL DCI prior to handling ULSCH + sched_info->UL_dci_req.numPdus = 0; + gNB_dlsch_ulsch_scheduler(module_id, frame, slot, sched_info); + ifi->CC_mask = 0; + sched_info->module_id = module_id; + sched_info->CC_id = CC_id; + sched_info->frame = frame; + sched_info->slot = slot; + /* + sched_info->DL_req = &mac->DL_req[CC_id]; + sched_info->UL_dci_req = &mac->UL_dci_req[CC_id]; + + sched_info->UL_tti_req = mac->UL_tti_req[CC_id]; + + sched_info->TX_req = &mac->TX_req[CC_id]; + */ +#ifdef DUMP_FAPI + dump_dl(sched_info); +#endif + + AssertFatal(ifi->NR_Schedule_response != NULL, "nr_schedule_response is null (mod %d, cc %d)\n", module_id, CC_id); + ifi->NR_Schedule_response(sched_info); + + LOG_D(NR_PHY, + "NR_Schedule_response: SFN SLOT:%d %d dl_pdus:%d\n", + sched_info->frame, + sched_info->slot, + sched_info->DL_req.dl_tti_request_body.nPDUs); +} + void NR_UL_indication(NR_UL_IND_t *UL_info) { AssertFatal(UL_info!=NULL,"UL_info is null\n"); - module_id_t module_id = UL_info->module_id; - int CC_id = UL_info->CC_id; - NR_Sched_Rsp_t *sched_info; - NR_IF_Module_t *ifi = nr_if_inst[module_id]; + module_id_t module_id = UL_info->module_id; + int CC_id = UL_info->CC_id; LOG_D(NR_PHY,"SFN/SLOT:%d.%d module_id:%d CC_id:%d UL_info[rach_pdus:%zu rx_ind:%zu crcs:%zu]\n", UL_info->frame, UL_info->slot, @@ -449,56 +486,20 @@ void NR_UL_indication(NR_UL_IND_t *UL_info) { if (get_softmodem_params()->emulate_l1) { free_unqueued_nfapi_indications(rach_ind, uci_ind, rx_ind, crc_ind); } + if (NFAPI_MODE != NFAPI_MODE_PNF) { - gNB_MAC_INST *mac = RC.nrmac[module_id]; - if (ifi->CC_mask==0) { - ifi->current_frame = UL_info->frame; - ifi->current_slot = UL_info->slot; - } else { - AssertFatal(UL_info->frame != ifi->current_frame,"CC_mask %x is not full and frame has changed\n",ifi->CC_mask); - AssertFatal(UL_info->slot != ifi->current_slot,"CC_mask %x is not full and slot has changed\n",ifi->CC_mask); - } + gNB_MAC_INST *mac = RC.nrmac[module_id]; - ifi->CC_mask |= (1<current_frame = UL_info->frame; + ifi->current_slot = UL_info->slot; - if (ifi->CC_mask == ((1<frame+((UL_info->slot>(9-sl_ahead))?1:0)) % 1024, - (UL_info->slot+sl_ahead)%10); - */ - nfapi_nr_config_request_scf_t *cfg = &mac->config[CC_id]; - int spf = get_spf(cfg); - sched_info = allocate_sched_response(); - // clear UL DCI prior to handling ULSCH - sched_info->UL_dci_req.numPdus = 0; - gNB_dlsch_ulsch_scheduler(module_id, - (UL_info->frame + ((UL_info->slot > (spf - 1 - ifi->sl_ahead)) ? 1 : 0)) % 1024, - (UL_info->slot + ifi->sl_ahead) % spf, - sched_info); - - ifi->CC_mask = 0; - sched_info->module_id = module_id; - sched_info->CC_id = CC_id; - sched_info->frame = (UL_info->frame + ((UL_info->slot>(spf-1-ifi->sl_ahead)) ? 1 : 0)) % 1024; - sched_info->slot = (UL_info->slot+ifi->sl_ahead)%spf; - -#ifdef DUMP_FAPI - dump_dl(sched_info); -#endif - - AssertFatal(ifi->NR_Schedule_response!=NULL, - "nr_schedule_response is null (mod %d, cc %d)\n", - module_id, - CC_id); - ifi->NR_Schedule_response(sched_info); - - LOG_D(NR_PHY, - "NR_Schedule_response: SFN SLOT:%d %d dl_pdus:%d\n", - sched_info->frame, - sched_info->slot, - sched_info->DL_req.dl_tti_request_body.nPDUs); - } + nfapi_nr_config_request_scf_t *cfg = &mac->config[CC_id]; + int spf = get_spf(cfg); + int CC_id = 0; + int frame_tx = UL_info->frame + ((UL_info->slot > (spf - 1 - ifi->sl_ahead)) ? 1 : 0); + int slot_tx = (UL_info->slot + ifi->sl_ahead) % spf; + ifi->NR_slot_indication(module_id, CC_id, frame_tx, slot_tx); } } @@ -514,6 +515,7 @@ NR_IF_Module_t *NR_IF_Module_init(int Mod_id) { nr_if_inst[Mod_id]->CC_mask=0; nr_if_inst[Mod_id]->NR_UL_indication = NR_UL_indication; + nr_if_inst[Mod_id]->NR_slot_indication = run_scheduler; AssertFatal(pthread_mutex_init(&nr_if_inst[Mod_id]->if_mutex,NULL)==0, "allocation of nr_if_inst[%d]->if_mutex fails\n",Mod_id); } diff --git a/openair2/NR_PHY_INTERFACE/NR_IF_Module.h b/openair2/NR_PHY_INTERFACE/NR_IF_Module.h index dd4e7e970b..108e0afe7a 100644 --- a/openair2/NR_PHY_INTERFACE/NR_IF_Module.h +++ b/openair2/NR_PHY_INTERFACE/NR_IF_Module.h @@ -113,6 +113,7 @@ typedef struct NR_IF_Module_s { //define the function pointer void (*NR_UL_indication)(NR_UL_IND_t *UL_INFO); void (*NR_Schedule_response)(NR_Sched_Rsp_t *Sched_INFO); + void (*NR_slot_indication)(module_id_t module_idP, int CC_id, int frame, int slot); void (*NR_PHY_config_req)(NR_PHY_Config_t *config_INFO); uint32_t CC_mask; uint16_t current_frame; From fb69d9c63594c621cd48c0c945d7c48a90ca30db Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Sat, 14 Oct 2023 19:54:21 +0200 Subject: [PATCH 05/14] Remove unused UL_INFO_mutex The UL_INFO_mutex is used in only one place, and therefore useless. Also, the scheduler uses a lock internally to prevent concurrent access. Hence, the UL_INFO_mutex is not needed. Remove kill_gNB_proc(), as it is now dead code. --- executables/nr-gnb.c | 16 ---------------- executables/nr-softmodem.h | 1 - nfapi/oai_integration/nfapi_vnf.c | 3 --- nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c | 2 -- openair1/PHY/defs_gNB.h | 1 - 5 files changed, 23 deletions(-) diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c index 47210fc0f7..e8720d00ad 100644 --- a/executables/nr-gnb.c +++ b/executables/nr-gnb.c @@ -247,13 +247,11 @@ void rx_func(void *param) // Call the scheduler start_meas(&gNB->ul_indication_stats); -// pthread_mutex_lock(&gNB->UL_INFO_mutex); gNB->UL_INFO.frame = frame_rx; gNB->UL_INFO.slot = slot_rx; gNB->UL_INFO.module_id = gNB->Mod_id; gNB->UL_INFO.CC_id = gNB->CC_id; gNB->if_inst->NR_UL_indication(&gNB->UL_INFO); -// pthread_mutex_unlock(&gNB->UL_INFO_mutex); stop_meas(&gNB->ul_indication_stats); int tx_slot_type = nr_slot_select(cfg,frame_tx,slot_tx); @@ -499,19 +497,6 @@ void term_gNB_Tpool(int inst) { pthread_join(proc->pthread_tx_reorder, NULL); } -/*! - * \brief Terminate gNB TX and RX threads. - */ -void kill_gNB_proc(int inst) { - PHY_VARS_gNB *gNB; - - gNB=RC.gNB[inst]; - - LOG_I(PHY, "Destroying UL_INFO mutex\n"); - pthread_mutex_destroy(&gNB->UL_INFO_mutex); - -} - void reset_opp_meas(void) { int sfn; reset_meas(&softmodem_stats_mt); @@ -640,6 +625,5 @@ void stop_gNB(int nb_inst) { for (int inst=0; instUL_INFO_mutex); gNB->UL_INFO.srs_ind = *ind; @@ -1260,8 +1259,6 @@ int phy_nr_srs_indication(nfapi_nr_srs_indication_t *ind) { ); } - pthread_mutex_unlock(&gNB->UL_INFO_mutex); - return 1; } //end NR phy indication diff --git a/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c b/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c index e12b10ec52..6bba112c50 100644 --- a/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c +++ b/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c @@ -182,7 +182,6 @@ int nfapi_nr_vnf_p7_start(nfapi_vnf_p7_config_t* config) NFAPI_TRACE(NFAPI_TRACE_DEBUG, "This is the slot_ind queue size %ld in %s():%d\n", gnb_slot_ind_queue.num_items, __FUNCTION__, __LINE__); if (slot_ind) { - pthread_mutex_lock(&gNB->UL_INFO_mutex); gNB->UL_INFO.frame = slot_ind->sfn; gNB->UL_INFO.slot = slot_ind->slot; @@ -198,7 +197,6 @@ int nfapi_nr_vnf_p7_start(nfapi_vnf_p7_config_t* config) gNB->if_inst->NR_UL_indication(&gNB->UL_INFO); prev_slot = gNB->UL_INFO.slot; } - pthread_mutex_unlock(&gNB->UL_INFO_mutex); free(slot_ind); slot_ind = NULL; } diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index b5f830df19..4132642a46 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -562,7 +562,6 @@ typedef struct PHY_VARS_gNB_s { PHY_MEASUREMENTS_gNB measurements; NR_IF_Module_t *if_inst; NR_UL_IND_t UL_INFO; - pthread_mutex_t UL_INFO_mutex; /// NFAPI RX ULSCH information nfapi_nr_rx_data_pdu_t rx_pdu_list[MAX_UL_PDUS_PER_SLOT]; From d52b81798ba5622356ef3c09105ed57b025a4ccb Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Tue, 6 Feb 2024 16:25:56 +0100 Subject: [PATCH 06/14] Introduce separate thread to handle gNB TX processing This commit introduces a separate thread (l1_tx_thread) that processes gNB DL/TX slots. It receives a message from the ru_thread when a new slot started, and starts processing. The DL part of the scheduler is run in the l1_tx_thread. Therefore, only call UL indication (for scheduler) in UL slots. The UL indication previously triggered the DL scheduler -- hence, it had to be called in every slot. Now, since the DL scheduler is moved into the DL thread, we don't have to call the scheduler in every slot anymore. The reorder thread is removed, as reordering with this scheme is not necessary anymore. The main advantage of this version is that the TX can be scheduled earlier (sl_ahead). Further, there can no longer be race conditions in the TX path, since the scheduler/L2, TX L1 processing and the RU tx function are all execute in the same thread (L1_tX_thread). Also, the scheduler prepares PRACH/PUSCH/PUCCH FAPI PDUs. As of this commit, the scheduler runs in the TX processing chain, whereas these PDUs are destined for RX processing. Thus, too avoid data races, instead of triggering the RX processing at the same time as TX processing in the RU thread, this commit changes the code to trigger RX processing after the scheduler has been run in TX processing to avoid data races. Finally, we synchronize RU and L1 threads. This is important for rfsimulator, since unlike most radios, rfsimulator can run slower or faster, depending on I/O and CPU (it does not have a stable "tick"). Co-authored-by: kiran --- executables/nr-gnb.c | 250 ++++++------------ executables/nr-ru.c | 131 ++++++--- executables/softmodem-common.h | 8 +- openair1/PHY/NR_TRANSPORT/nr_prach.c | 3 +- openair1/PHY/NR_TRANSPORT/nr_ulsch.c | 15 +- .../PHY/NR_TRANSPORT/nr_ulsch_demodulation.c | 4 +- openair1/PHY/NR_TRANSPORT/pucch_rx.c | 8 +- openair1/PHY/NR_TRANSPORT/srs_rx.c | 3 +- openair1/PHY/defs_RU.h | 2 +- openair1/PHY/defs_gNB.h | 12 +- openair1/SCHED_NR/fapi_nr_l1.c | 22 +- openair1/SCHED_NR/nr_ru_procedures.c | 4 +- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 32 ++- openair1/SIMULATION/NR_PHY/dlsim.c | 1 + openair1/SIMULATION/NR_PHY/ulsim.c | 1 + openair2/NR_PHY_INTERFACE/NR_IF_Module.c | 15 -- 16 files changed, 228 insertions(+), 283 deletions(-) diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c index e8720d00ad..707297e419 100644 --- a/executables/nr-gnb.c +++ b/executables/nr-gnb.c @@ -111,42 +111,63 @@ time_stats_t softmodem_stats_rx_sf; // total rx time #define TICK_TO_US(ts) (ts.trials==0?0:ts.diff/ts.trials) #define L1STATSSTRLEN 16384 - -void tx_func(void *param) +static void tx_func(void *param) { processingData_L1tx_t *info = (processingData_L1tx_t *) param; - PHY_VARS_gNB *gNB = info->gNB; + int frame_tx = info->frame; int slot_tx = info->slot; - int cumul_samples = gNB->frame_parms.get_samples_per_slot(0, &gNB->frame_parms); - int i = 1; - for (; i < gNB->frame_parms.slots_per_subframe / 2; i++) - cumul_samples += gNB->frame_parms.get_samples_per_slot(i, &gNB->frame_parms); - int samples = cumul_samples / i; - int absslot_tx = info->timestamp_tx / samples; - int absslot_rx = absslot_tx - gNB->RU_list[0]->sl_ahead; - int rt_prof_idx = absslot_rx % RT_PROF_DEPTH; - start_meas(&gNB->phy_proc_tx); + int frame_rx = info->frame_rx; + int slot_rx = info->slot_rx; + int absslot_tx = info->timestamp_tx / info->gNB->frame_parms.get_samples_per_slot(slot_tx, &info->gNB->frame_parms); + int absslot_rx = absslot_tx - info->gNB->RU_list[0]->sl_ahead; - clock_gettime(CLOCK_MONOTONIC, &gNB->rt_L1_profiling.start_L1_TX[rt_prof_idx]); - phy_procedures_gNB_TX(info, - frame_tx, - slot_tx, - 1); - clock_gettime(CLOCK_MONOTONIC, &gNB->rt_L1_profiling.return_L1_TX[rt_prof_idx]); + LOG_D(NR_PHY, "%d.%d running tx_func\n", frame_tx, slot_tx); + PHY_VARS_gNB *gNB = info->gNB; + module_id_t module_id = gNB->Mod_id; + uint8_t CC_id = gNB->CC_id; + NR_IF_Module_t *ifi = gNB->if_inst; + nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config; - if (get_softmodem_params()->reorder_thread_disable) { + T(T_GNB_PHY_DL_TICK, T_INT(gNB->Mod_id), T_INT(frame_tx), T_INT(slot_tx)); + + ifi->NR_slot_indication(module_id, CC_id, frame_tx, slot_tx); + gNB->msgDataTx->timestamp_tx = info->timestamp_tx; + info = gNB->msgDataTx; + info->gNB = gNB; + + // At this point, MAC scheduler just ran, including scheduling + // PRACH/PUCCH/PUSCH, so trigger RX chain processing + LOG_D(NR_PHY, "%s() trigger RX for %d.%d\n", __func__, frame_rx, slot_rx); + notifiedFIFO_elt_t *res = newNotifiedFIFO_elt(sizeof(processingData_L1_t), 0, &gNB->resp_L1, NULL); + processingData_L1_t *syncMsg = NotifiedFifoData(res); + syncMsg->gNB = gNB; + syncMsg->frame_rx = frame_rx; + syncMsg->slot_rx = slot_rx; + syncMsg->timestamp_tx = info->timestamp_tx; + res->key = slot_rx; + pushNotifiedFIFO(&gNB->resp_L1, res); + + int tx_slot_type = nr_slot_select(cfg, frame_tx, slot_tx); + if (tx_slot_type == NR_DOWNLINK_SLOT || tx_slot_type == NR_MIXED_SLOT || get_softmodem_params()->continuous_tx) { + start_meas(&info->gNB->phy_proc_tx); + phy_procedures_gNB_TX(info, frame_tx, slot_tx, 1); + const int rt_prof_idx = absslot_rx % RT_PROF_DEPTH; + clock_gettime(CLOCK_MONOTONIC, &info->gNB->rt_L1_profiling.return_L1_TX[rt_prof_idx]); + + PHY_VARS_gNB *gNB = info->gNB; processingData_RU_t syncMsgRU; syncMsgRU.frame_tx = frame_tx; syncMsgRU.slot_tx = slot_tx; syncMsgRU.ru = gNB->RU_list[0]; syncMsgRU.timestamp_tx = info->timestamp_tx; - LOG_D(PHY,"gNB: %d.%d : calling RU TX function\n",syncMsgRU.frame_tx,syncMsgRU.slot_tx); - ru_tx_func((void*)&syncMsgRU); + LOG_D(PHY, "gNB: %d.%d : calling RU TX function\n", syncMsgRU.frame_tx, syncMsgRU.slot_tx); + ru_tx_func((void *)&syncMsgRU); + stop_meas(&info->gNB->phy_proc_tx); } /* this thread is done with the sched_info, decrease the reference counter */ + LOG_D(NR_PHY, "Calling deref_sched_response for id %d (tx_func) in %d.%d\n", info->sched_response_id, frame_tx, slot_tx); deref_sched_response(info->sched_response_id); - stop_meas(&gNB->phy_proc_tx); } @@ -164,27 +185,27 @@ void *L1_rx_thread(void *arg) } return NULL; } -/* to be added for URLLC, requires MAC scheduling to be split from UL indication +// Added for URLLC, requires MAC scheduling to be split from UL indication void *L1_tx_thread(void *arg) { PHY_VARS_gNB *gNB = (PHY_VARS_gNB*)arg; while (oai_exit == 0) { notifiedFIFO_elt_t *res = pullNotifiedFIFO(&gNB->L1_tx_out); + if (res == NULL) // stopping condition, happens only when queue is freed + break; processingData_L1tx_t *info = (processingData_L1tx_t *)NotifiedFifoData(res); tx_func(info); delNotifiedFIFO_elt(res); } return NULL; } -*/ + void rx_func(void *param) { processingData_L1_t *info = (processingData_L1_t *) param; PHY_VARS_gNB *gNB = info->gNB; int frame_rx = info->frame_rx; int slot_rx = info->slot_rx; - int frame_tx = info->frame_tx; - int slot_tx = info->slot_tx; nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config; int cumul_samples = gNB->frame_parms.get_samples_per_slot(0, &gNB->frame_parms); int i = 1; @@ -209,14 +230,11 @@ void rx_func(void *param) } // **************************************** - T(T_GNB_PHY_DL_TICK, T_INT(gNB->Mod_id), T_INT(frame_tx), T_INT(slot_tx)); - - reset_active_stats(gNB, frame_tx); - reset_active_ulsch(gNB, frame_tx); - // RX processing int rx_slot_type = nr_slot_select(cfg, frame_rx, slot_rx); if (rx_slot_type == NR_UPLINK_SLOT || rx_slot_type == NR_MIXED_SLOT) { + LOG_D(NR_PHY, "%d.%d Starting RX processing\n", frame_rx, slot_rx); + // UE-specific RX processing for subframe n // TODO: check if this is correct for PARALLEL_RU_L1_TRX_SPLIT @@ -239,57 +257,30 @@ void rx_func(void *param) } } phy_procedures_gNB_uespec_RX(gNB, frame_rx, slot_rx); - } - stop_meas( &softmodem_stats_rxtx_sf ); - LOG_D(PHY,"%s() Exit proc[rx:%d%d tx:%d%d]\n", __FUNCTION__, frame_rx, slot_rx, frame_tx, slot_tx); - clock_gettime(CLOCK_MONOTONIC,&info->gNB->rt_L1_profiling.return_L1_RX[rt_prof_idx]); + // Call the scheduler + start_meas(&gNB->ul_indication_stats); + gNB->UL_INFO.frame = frame_rx; + gNB->UL_INFO.slot = slot_rx; + gNB->UL_INFO.module_id = gNB->Mod_id; + gNB->UL_INFO.CC_id = gNB->CC_id; + gNB->if_inst->NR_UL_indication(&gNB->UL_INFO); + stop_meas(&gNB->ul_indication_stats); - // Call the scheduler - start_meas(&gNB->ul_indication_stats); - gNB->UL_INFO.frame = frame_rx; - gNB->UL_INFO.slot = slot_rx; - gNB->UL_INFO.module_id = gNB->Mod_id; - gNB->UL_INFO.CC_id = gNB->CC_id; - gNB->if_inst->NR_UL_indication(&gNB->UL_INFO); - stop_meas(&gNB->ul_indication_stats); - - int tx_slot_type = nr_slot_select(cfg,frame_tx,slot_tx); - if ((tx_slot_type == NR_DOWNLINK_SLOT || tx_slot_type == NR_MIXED_SLOT) && NFAPI_MODE != NFAPI_MODE_PNF) { - notifiedFIFO_elt_t *res; - processingData_L1tx_t *syncMsg; - // Its a FIFO so it maitains the order in which the MAC fills the messages - // so no need for checking for right slot - if (get_softmodem_params()->reorder_thread_disable) { - // call the TX function directly from this thread - syncMsg = gNB->msgDataTx; - syncMsg->gNB = gNB; - syncMsg->timestamp_tx = info->timestamp_tx; - tx_func(syncMsg); - } else { - res = pullTpool(&gNB->L1_tx_filled, &gNB->threadPool); - if (res == NULL) - return; // Tpool has been stopped - syncMsg = (processingData_L1tx_t *)NotifiedFifoData(res); - syncMsg->gNB = gNB; - syncMsg->timestamp_tx = info->timestamp_tx; - res->key = slot_tx; - pushTpool(&gNB->threadPool, res); - } - } else if (get_softmodem_params()->continuous_tx) { - notifiedFIFO_elt_t *res = pullNotifiedFIFO(&gNB->L1_tx_free); - if (res == NULL) - return; // Tpool has been stopped - processingData_L1tx_t *syncMsg = (processingData_L1tx_t *)NotifiedFifoData(res); + notifiedFIFO_elt_t *res = newNotifiedFIFO_elt(sizeof(processingData_L1_t), 0, &gNB->L1_rx_out, NULL); + processingData_L1_t *syncMsg = NotifiedFifoData(res); syncMsg->gNB = gNB; - syncMsg->timestamp_tx = info->timestamp_tx; - syncMsg->frame = frame_tx; - syncMsg->slot = slot_tx; - res->key = slot_tx; - pushNotifiedFIFO(&gNB->L1_tx_out, res); + syncMsg->frame_rx = frame_rx; + syncMsg->slot_rx = slot_rx; + res->key = slot_rx; + LOG_D(NR_PHY, "Signaling completion for %d.%d (mod_slot %d) on L1_rx_out\n", frame_rx, slot_rx, slot_rx % RU_RX_SLOT_DEPTH); + pushNotifiedFIFO(&gNB->L1_rx_out, res); } + stop_meas(&softmodem_stats_rxtx_sf); + clock_gettime(CLOCK_MONOTONIC, &info->gNB->rt_L1_profiling.return_L1_RX[rt_prof_idx]); } + static size_t dump_L1_meas_stats(PHY_VARS_gNB *gNB, RU_t *ru, char *output, size_t outputlen) { const char *begin = output; const char *end = output + outputlen; @@ -367,60 +358,6 @@ void *nrL1_stats_thread(void *param) { return(NULL); } -// This thread reads the finished L1 tx jobs from threaPool -// and pushes RU tx thread in the right order. It works only -// two parallel L1 tx threads. -void *tx_reorder_thread(void* param) { - PHY_VARS_gNB *gNB = (PHY_VARS_gNB *)param; - - notifiedFIFO_elt_t *resL1Reserve = pullNotifiedFIFO(&gNB->L1_tx_out); - AssertFatal(resL1Reserve != NULL, "pullTpool() did not return start message in %s\n", __func__); - int next_tx_slot=((processingData_L1tx_t *)NotifiedFifoData(resL1Reserve))->slot; - - LOG_I(PHY,"tx_reorder_thread started\n"); - - while (!oai_exit) { - notifiedFIFO_elt_t *resL1; - if (resL1Reserve) { - resL1=resL1Reserve; - if (((processingData_L1tx_t *)NotifiedFifoData(resL1))->slot != next_tx_slot) { - LOG_E(PHY,"order mistake\n"); - resL1Reserve = NULL; - resL1 = pullNotifiedFIFO(&gNB->L1_tx_out); - } - } else { - resL1 = pullNotifiedFIFO(&gNB->L1_tx_out); - if (resL1 != NULL && ((processingData_L1tx_t *)NotifiedFifoData(resL1))->slot != next_tx_slot) { - if (resL1Reserve) - LOG_E(PHY,"error, have a stored packet, then a second one\n"); - resL1Reserve = resL1; - resL1 = pullNotifiedFIFO(&gNB->L1_tx_out); - if (((processingData_L1tx_t *)NotifiedFifoData(resL1))->slot != next_tx_slot) - LOG_E(PHY,"error, pull two msg, none is good\n"); - } - } - if (resL1 == NULL) - break; // Tpool has been stopped - processingData_L1tx_t *syncMsgL1= (processingData_L1tx_t *)NotifiedFifoData(resL1); - processingData_RU_t syncMsgRU; - syncMsgRU.frame_tx = syncMsgL1->frame; - syncMsgRU.slot_tx = syncMsgL1->slot; - syncMsgRU.timestamp_tx = syncMsgL1->timestamp_tx; - syncMsgRU.ru = gNB->RU_list[0]; - if (get_softmodem_params()->continuous_tx) { - int slots_per_frame = gNB->frame_parms.slots_per_frame; - next_tx_slot = (syncMsgRU.slot_tx + 1) % slots_per_frame; - } else - next_tx_slot = get_next_downlink_slot(gNB, &gNB->gNB_config, syncMsgRU.frame_tx, syncMsgRU.slot_tx); - pushNotifiedFIFO(&gNB->L1_tx_free, resL1); - if (resL1==resL1Reserve) - resL1Reserve=NULL; - LOG_D(PHY,"gNB: %d.%d : calling RU TX function\n",syncMsgL1->frame,syncMsgL1->slot); - ru_tx_func((void*)&syncMsgRU); - } - return(NULL); -} - void init_gNB_Tpool(int inst) { PHY_VARS_gNB *gNB; gNB = RC.gNB[inst]; @@ -433,47 +370,26 @@ void init_gNB_Tpool(int inst) { initNotifiedFIFO(&gNB->respPuschSymb); initNotifiedFIFO(&gNB->respDecode); - // L1 RX result FIFO + // L1 RX result FIFO initNotifiedFIFO(&gNB->resp_L1); - if (!get_softmodem_params()->reorder_thread_disable) { - notifiedFIFO_elt_t *msg = newNotifiedFIFO_elt(sizeof(processingData_L1_t), 0, &gNB->resp_L1, rx_func); - pushNotifiedFIFO(&gNB->resp_L1, msg); // to unblock the process in the beginning - } // L1 TX result FIFO initNotifiedFIFO(&gNB->L1_tx_free); initNotifiedFIFO(&gNB->L1_tx_filled); initNotifiedFIFO(&gNB->L1_tx_out); - - if (get_softmodem_params()->reorder_thread_disable) { - // create the RX thread responsible for triggering RX processing and then TX processing if a single thread is used - threadCreate(&gNB->L1_rx_thread, L1_rx_thread, (void *)gNB, "L1_rx_thread", - gNB->L1_rx_thread_core, OAI_PRIORITY_RT_MAX); - // if separate threads are used for RX and TX, create the TX thread - // threadCreate(&gNB->L1_tx_thread, L1_tx_thread, (void *)gNB, "L1_tx_thread", - // gNB->L1_tx_thread_core, OAI_PRIORITY_RT_MAX); + initNotifiedFIFO(&gNB->L1_rx_out); - notifiedFIFO_elt_t *msgL1Tx = newNotifiedFIFO_elt(sizeof(processingData_L1tx_t), 0, &gNB->L1_tx_out, tx_func); - processingData_L1tx_t *msgDataTx = (processingData_L1tx_t *)NotifiedFifoData(msgL1Tx); - memset(msgDataTx, 0, sizeof(processingData_L1tx_t)); - init_DLSCH_struct(gNB, msgDataTx); - memset(msgDataTx->ssb, 0, 64*sizeof(NR_gNB_SSB_t)); - // this will be removed when the msgDataTx is not necessary anymore - gNB->msgDataTx = msgDataTx; - } else { - // we create 2 threads for L1 tx processing - for (int i=0; i < 2; i++) { - notifiedFIFO_elt_t *msgL1Tx = newNotifiedFIFO_elt(sizeof(processingData_L1tx_t), 0, &gNB->L1_tx_out, tx_func); - processingData_L1tx_t *msgDataTx = (processingData_L1tx_t *)NotifiedFifoData(msgL1Tx); - memset(msgDataTx, 0, sizeof(processingData_L1tx_t)); - init_DLSCH_struct(gNB, msgDataTx); - memset(msgDataTx->ssb, 0, 64*sizeof(NR_gNB_SSB_t)); - pushNotifiedFIFO(&gNB->L1_tx_free, msgL1Tx); // to unblock the process in the beginning - } - - LOG_I(PHY,"Creating thread for TX reordering and dispatching to RU\n"); - threadCreate(&proc->pthread_tx_reorder, tx_reorder_thread, (void *)gNB, "thread_tx_reorder", - gNB->RU_list[0] ? gNB->RU_list[0]->tpcores[1] : -1, OAI_PRIORITY_RT_MAX); - } + // create the RX thread responsible for RX processing start event (resp_L1 msg queue), then launch rx_func() + threadCreate(&gNB->L1_rx_thread, L1_rx_thread, (void *)gNB, "L1_rx_thread", gNB->L1_rx_thread_core, OAI_PRIORITY_RT_MAX); + // create the TX thread responsible for TX processing start event (L1_tx_out msg queue), then launch tx_func() + threadCreate(&gNB->L1_tx_thread, L1_tx_thread, (void *)gNB, "L1_tx_thread", gNB->L1_tx_thread_core, OAI_PRIORITY_RT_MAX); + + notifiedFIFO_elt_t *msgL1Tx = newNotifiedFIFO_elt(sizeof(processingData_L1tx_t), 0, &gNB->L1_tx_out, tx_func); + processingData_L1tx_t *msgDataTx = (processingData_L1tx_t *)NotifiedFifoData(msgL1Tx); + memset(msgDataTx, 0, sizeof(processingData_L1tx_t)); + init_DLSCH_struct(gNB, msgDataTx); + memset(msgDataTx->ssb, 0, 64 * sizeof(NR_gNB_SSB_t)); + // this will be removed when the msgDataTx is not necessary anymore + gNB->msgDataTx = msgDataTx; if ((!get_softmodem_params()->emulate_l1) && (!IS_SOFTMODEM_NOSTATS_BIT) && (NFAPI_MODE!=NFAPI_MODE_VNF)) threadCreate(&proc->L1_stats_thread,nrL1_stats_thread,(void*)gNB,"L1_stats",-1,OAI_PRIORITY_RT_LOW); @@ -489,12 +405,11 @@ void term_gNB_Tpool(int inst) { abortNotifiedFIFO(&gNB->L1_tx_free); abortNotifiedFIFO(&gNB->L1_tx_filled); abortNotifiedFIFO(&gNB->L1_tx_out); + abortNotifiedFIFO(&gNB->L1_rx_out); gNB_L1_proc_t *proc = &gNB->proc; if (!get_softmodem_params()->emulate_l1) pthread_join(proc->L1_stats_thread, NULL); - if (!get_softmodem_params()->reorder_thread_disable) - pthread_join(proc->pthread_tx_reorder, NULL); } void reset_opp_meas(void) { @@ -534,7 +449,6 @@ void init_eNB_afterRU(void) { gNB = RC.gNB[inst]; gNB->ldpc_offload_flag = get_softmodem_params()->ldpc_offload_flag; - gNB->reorder_thread_disable = get_softmodem_params()->reorder_thread_disable; phy_init_nr_gNB(gNB); diff --git a/executables/nr-ru.c b/executables/nr-ru.c index 03ebab6b2e..413daf9fe0 100644 --- a/executables/nr-ru.c +++ b/executables/nr-ru.c @@ -624,7 +624,8 @@ void *emulatedRF_thread(void *param) { return 0; } -void rx_rf(RU_t *ru,int *frame,int *slot) { +static void rx_rf(RU_t *ru, int *frame, int *slot) +{ RU_proc_t *proc = &ru->proc; NR_DL_FRAME_PARMS *fp = ru->nr_frame_parms; openair0_config_t *cfg = &ru->openair0_cfg; @@ -662,13 +663,17 @@ void rx_rf(RU_t *ru,int *frame,int *slot) { //AssertFatal(rxs == fp->samples_per_subframe, //"rx_rf: Asked for %d samples, got %d from USRP\n",fp->samples_per_subframe,rxs); - if (rxs != samples_per_slot) LOG_E(PHY, "rx_rf: Asked for %d samples, got %d from USRP\n",samples_per_slot,rxs); + if (rxs != samples_per_slot) + LOG_E(PHY, "rx_rf: Asked for %d samples, got %d from USRP\n", samples_per_slot, rxs); if (proc->first_rx != 1) { samples_per_slot_prev = fp->get_samples_per_slot((*slot-1)%fp->slots_per_frame,fp); if (proc->timestamp_rx - old_ts != samples_per_slot_prev) { - LOG_D(PHY,"rx_rf: rfdevice timing drift of %"PRId64" samples (ts_off %"PRId64")\n",proc->timestamp_rx - old_ts - samples_per_slot_prev,ru->ts_offset); + LOG_D(PHY, + "rx_rf: rfdevice timing drift of %" PRId64 " samples (ts_off %" PRId64 ")\n", + proc->timestamp_rx - old_ts - samples_per_slot_prev, + ru->ts_offset); ru->ts_offset += (proc->timestamp_rx - old_ts - samples_per_slot_prev); proc->timestamp_rx = ts-ru->ts_offset; } @@ -705,8 +710,14 @@ void rx_rf(RU_t *ru,int *frame,int *slot) { } if (proc->frame_rx != *frame) { - LOG_E(PHY,"Received Timestamp (%llu) doesn't correspond to the time we think it is (proc->frame_rx %d frame %d, proc->tti_rx %d, slot %d)\n",(long long unsigned int)proc->timestamp_rx,proc->frame_rx, - *frame,proc->tti_rx,*slot); + LOG_E(PHY, + "Received Timestamp (%llu) doesn't correspond to the time we think it is (proc->frame_rx %d frame %d, proc->tti_rx %d, " + "slot %d)\n", + (long long unsigned int)proc->timestamp_rx, + proc->frame_rx, + *frame, + proc->tti_rx, + *slot); exit_fun("Exiting"); } } else { @@ -1169,6 +1180,7 @@ void *ru_thread( void *param ) { int initial_wait=0; int opp_enabled0 = opp_enabled; + bool rx_tti_busy[RU_RX_SLOT_DEPTH] = {false}; nfapi_nr_config_request_scf_t *cfg = &ru->config; // set default return value ru_thread_status = 0; @@ -1233,9 +1245,6 @@ void *ru_thread( void *param ) { pthread_mutex_unlock(&RC.ru_mutex); wait_sync("ru_thread"); - processingData_L1_t *syncMsg; - notifiedFIFO_elt_t *res; - if(!emulate_rf) { // Start RF device if any if (ru->start_rf) { @@ -1299,14 +1308,13 @@ void *ru_thread( void *param ) { if (ru->fh_south_in) ru->fh_south_in(ru,&frame,&slot); else AssertFatal(1==0, "No fronthaul interface at south port"); - - if (initial_wait == 1 && proc->frame_rx < 300 && ru->fh_south_in == rx_rf) { - if (proc->frame_rx>0 && ((proc->frame_rx % 100) == 0) && proc->tti_rx==0) { - LOG_I(PHY,"delay processing to let RX stream settle, frame %d (trials %d)\n",proc->frame_rx,ru->rx_fhaul.trials); - print_meas(&ru->rx_fhaul,"rx_fhaul",NULL,NULL); - reset_meas(&ru->rx_fhaul); - } - continue; + if (initial_wait == 1 && proc->frame_rx < 300) { + if (proc->frame_rx > 0 && ((proc->frame_rx % 100) == 0) && proc->tti_rx == 0) { + LOG_D(PHY, "delay processing to let RX stream settle, frame %d (trials %d)\n", proc->frame_rx, ru->rx_fhaul.trials); + print_meas(&ru->rx_fhaul, "rx_fhaul", NULL, NULL); + reset_meas(&ru->rx_fhaul); + } + continue; } if (proc->frame_rx>=300) { initial_wait=0; @@ -1314,15 +1322,14 @@ void *ru_thread( void *param ) { } if (initial_wait == 0 && ru->rx_fhaul.trials > 1000) { reset_meas(&ru->rx_fhaul); - /*if (ru->if_south == REMOTE_IF5) reset_meas(&ru->ifdevice.tx_fhaul); - else*/ reset_meas(&ru->tx_fhaul); + reset_meas(&ru->tx_fhaul); } proc->timestamp_tx = proc->timestamp_rx; int sl=proc->tti_tx; for (int slidx=0;slidxsl_ahead;slidx++) proc->timestamp_tx += fp->get_samples_per_slot((sl+slidx)%fp->slots_per_frame,fp); - proc->frame_tx = (proc->tti_rx > (fp->slots_per_frame-1-(ru->sl_ahead))) ? (proc->frame_rx+1)&1023 : proc->frame_rx; - proc->tti_tx = (proc->tti_rx + ru->sl_ahead)%fp->slots_per_frame; + proc->frame_tx = (proc->tti_rx > (fp->slots_per_frame - 1 - (ru->sl_ahead))) ? (proc->frame_rx + 1) & 1023 : proc->frame_rx; + proc->tti_tx = (proc->tti_rx + ru->sl_ahead) % fp->slots_per_frame; int absslot_rx = proc->timestamp_rx/fp->get_samples_per_slot(proc->tti_rx,fp); int rt_prof_idx = absslot_rx % RT_PROF_DEPTH; clock_gettime(CLOCK_MONOTONIC,&ru->rt_ru_profiling.return_RU_south_in[rt_prof_idx]); @@ -1333,14 +1340,62 @@ void *ru_thread( void *param ) { RC.gNB[0]->proc.frame_rx,RC.gNB[0]->proc.slot_rx, RC.gNB[0]->proc.frame_tx); - if (ru->idx!=0) proc->frame_tx = (proc->frame_tx+proc->frame_offset)&1023; + if (ru->idx != 0) + proc->frame_tx = (proc->frame_tx + proc->frame_offset) & 1023; + LOG_D(NR_PHY, "In %d.%d: Checking L1 status\n", proc->frame_rx, proc->tti_rx); + for (int n = 0; n < RU_RX_SLOT_DEPTH; n++) + LOG_D(NR_PHY, "slot n %d => %d\n", n, rx_tti_busy[n]); + // handle potential race by blocking if rxdataF is being used by L1 + // collect all pending msg in L1 return fifo to not down the memory is available (rx_tti_busy[slot] boolean array) + notifiedFIFO_elt_t *res = pollNotifiedFIFO(&gNB->L1_rx_out); + LOG_D(NR_PHY, "%d.%d Polling L1_rx_out %p\n", proc->frame_rx, proc->tti_rx, res); + while (res) { + processingData_L1_t *info = (processingData_L1_t *)NotifiedFifoData(res); + LOG_D(NR_PHY, + "%d.%d res %d.%d completed, clearing %d\n", + proc->frame_rx, + proc->tti_rx, + info->frame_rx, + info->slot_rx, + info->slot_rx % RU_RX_SLOT_DEPTH); + + rx_tti_busy[info->slot_rx % RU_RX_SLOT_DEPTH] = false; + res = pollNotifiedFIFO(&gNB->L1_rx_out); + } + LOG_D(NR_PHY, "%d.%d Done polling\n", proc->frame_rx, proc->tti_rx); // do RX front-end processing (frequency-shift, dft) if needed - int slot_type = nr_slot_select(cfg,proc->frame_rx,proc->tti_rx); - + int slot_type = nr_slot_select(cfg, proc->frame_rx, proc->tti_rx); if (slot_type == NR_UPLINK_SLOT || slot_type == NR_MIXED_SLOT) { if (ru->feprx) { + if (rx_tti_busy[proc->tti_rx % RU_RX_SLOT_DEPTH]) { + bool not_done = true; + LOG_D(NR_PHY, "%d.%d Waiting to access RX slot %d\n", proc->frame_rx, proc->tti_rx, proc->tti_rx % RU_RX_SLOT_DEPTH); + // now we block and wait our slot memory zone is freed from previous slot processing + // as we can get other slots ending, we loop on the queue + while (not_done) { + res = pullNotifiedFIFO(&gNB->L1_rx_out); + if (!res) + break; + processingData_L1_t *info = (processingData_L1_t *)NotifiedFifoData(res); + LOG_D(NR_PHY, + "%d.%d Got access to RX slot %d.%d (%d)\n", + proc->frame_rx, + proc->tti_rx, + info->frame_rx, + info->slot_rx, + proc->tti_rx % RU_RX_SLOT_DEPTH); + rx_tti_busy[info->slot_rx % RU_RX_SLOT_DEPTH] = false; + if ((info->slot_rx % RU_RX_SLOT_DEPTH) == (proc->tti_rx % RU_RX_SLOT_DEPTH)) + not_done = false; + } + if (!res) + break; + } ru->feprx(ru,proc->tti_rx); + // set the tti that was generated to busy + LOG_D(NR_PHY, "Setting %d.%d (%d) to busy\n", proc->frame_rx, proc->tti_rx, proc->tti_rx % RU_RX_SLOT_DEPTH); + rx_tti_busy[proc->tti_rx % RU_RX_SLOT_DEPTH] = true; clock_gettime(CLOCK_MONOTONIC,&ru->rt_ru_profiling.return_RU_feprx[rt_prof_idx]); //LOG_M("rxdata.m","rxs",ru->common.rxdata[0],1228800,1,1); LOG_D(PHY,"RU proc: frame_rx = %d, tti_rx = %d\n", proc->frame_rx, proc->tti_rx); @@ -1383,26 +1438,16 @@ void *ru_thread( void *param ) { } } // end if (slot_type == NR_UPLINK_SLOT || slot_type == NR_MIXED_SLOT) { - // At this point, all information for subframe has been received on FH interface - if (!get_softmodem_params()->reorder_thread_disable) { - res = pullTpool(&gNB->resp_L1, &gNB->threadPool); - if (res == NULL) - break; // Tpool has been stopped - } else { - res=newNotifiedFIFO_elt(sizeof(processingData_L1_t),0, &gNB->resp_L1,NULL); - } - syncMsg = (processingData_L1_t *)NotifiedFifoData(res); - syncMsg->gNB = gNB; - syncMsg->frame_rx = proc->frame_rx; - syncMsg->slot_rx = proc->tti_rx; - syncMsg->frame_tx = proc->frame_tx; - syncMsg->slot_tx = proc->tti_tx; - syncMsg->timestamp_tx = proc->timestamp_tx; - res->key = proc->tti_rx; - if (!get_softmodem_params()->reorder_thread_disable) - pushTpool(&gNB->threadPool, res); - else - pushNotifiedFIFO(&gNB->resp_L1, res); + notifiedFIFO_elt_t *resTx = newNotifiedFIFO_elt(sizeof(processingData_L1tx_t), 0, &gNB->L1_tx_out, NULL); + processingData_L1tx_t *syncMsgTx = NotifiedFifoData(resTx); + syncMsgTx->gNB = gNB; + syncMsgTx->frame = proc->frame_tx; + syncMsgTx->slot = proc->tti_tx; + syncMsgTx->frame_rx = proc->frame_rx; + syncMsgTx->slot_rx = proc->tti_rx; + syncMsgTx->timestamp_tx = proc->timestamp_tx; + resTx->key = proc->tti_tx; + pushNotifiedFIFO(&gNB->L1_tx_out, resTx); } printf( "Exiting ru_thread \n"); diff --git a/executables/softmodem-common.h b/executables/softmodem-common.h index b856bf252c..851e0b64b1 100644 --- a/executables/softmodem-common.h +++ b/executables/softmodem-common.h @@ -44,7 +44,6 @@ extern "C" example: -1,3 launches two working threads one floating, the second set on core 3\n\ default 8 floating threads\n\ use N for no pool (runs in calling thread) recommended with rfsim.\n" -#define CONFIG_HLP_REORDER "Disable reorder thread\n" #define CONFIG_HLP_ULMAXE "set the eNodeB max ULSCH erros\n" #define CONFIG_HLP_CALUER "set UE RX calibration\n" #define CONFIG_HLP_CALUERM "" @@ -147,7 +146,6 @@ extern "C" #define NID2 softmodem_params.nid2 #define LDPC_OFFLOAD_FLAG softmodem_params.ldpc_offload_flag -#define REORDER_THREAD_DISABLE softmodem_params.reorder_thread_disable #define DEFAULT_RFCONFIG_FILE "/usr/local/etc/syriq/ue.band7.tm1.PRB100.NR40.dat"; extern int usrp_tx_thread; @@ -155,7 +153,6 @@ extern int usrp_tx_thread; #define CMDLINE_PARAMS_DESC { \ {"rf-config-file", CONFIG_HLP_RFCFGF, 0, .strptr=&RF_CONFIG_FILE, .defstrval=NULL, TYPE_STRING, 0}, \ {"thread-pool", CONFIG_HLP_TPOOL, 0, .strptr=&TP_CONFIG, .defstrval="-1,-1,-1,-1,-1,-1,-1,-1", TYPE_STRING, 0}, \ - {"reorder-thread-disable",CONFIG_HLP_REORDER, PARAMFLAG_BOOL, .iptr=&REORDER_THREAD_DISABLE, .defintval=0, TYPE_INT, 0}, \ {"phy-test", CONFIG_HLP_PHYTST, PARAMFLAG_BOOL, .iptr=&PHY_TEST, .defintval=0, TYPE_INT, 0}, \ {"do-ra", CONFIG_HLP_DORA, PARAMFLAG_BOOL, .iptr=&DO_RA, .defintval=0, TYPE_INT, 0}, \ {"sa", CONFIG_HLP_SA, PARAMFLAG_BOOL, .iptr=&SA, .defintval=0, TYPE_INT, 0}, \ @@ -232,7 +229,6 @@ extern int usrp_tx_thread; { .s5 = { NULL } }, \ { .s5 = { NULL } }, \ { .s5 = { NULL } }, \ - { .s5 = { NULL } }, \ { .s3a = { config_checkstr_assign_integer, \ {"MONOLITHIC", "PNF", "VNF","UE_STUB_PNF","UE_STUB_OFFNET","STANDALONE_PNF"}, \ {NFAPI_MONOLITHIC, NFAPI_MODE_PNF, NFAPI_MODE_VNF,NFAPI_UE_STUB_PNF,NFAPI_UE_STUB_OFFNET,NFAPI_MODE_STANDALONE_PNF}, \ @@ -326,8 +322,7 @@ typedef struct { uint64_t optmask; //THREAD_STRUCT thread_struct; char *rf_config_file; - char *threadPoolConfig; - int reorder_thread_disable; + char *threadPoolConfig; int phy_test; int do_ra; int sa; @@ -375,7 +370,6 @@ extern uint16_t sl_ahead; extern uint16_t sf_ahead; extern int oai_exit; -void tx_func(void *param); void rx_func(void *param); void ru_tx_func(void *param); extern uint8_t nfapi_mode; diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach.c b/openair1/PHY/NR_TRANSPORT/nr_prach.c index 5f534ef500..95c2c8040b 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prach.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prach.c @@ -76,8 +76,7 @@ void nr_fill_prach(PHY_VARS_gNB *gNB, nfapi_nr_prach_pdu_t *prach_pdu) { int prach_id = find_nr_prach(gNB,SFN,Slot,SEARCH_EXIST_OR_FREE); - AssertFatal( ((prach_id>=0) && (prach_id= 0) && (prach_id < NUMBER_OF_NR_PRACH_MAX)), "illegal or no prach_id found!!! prach_id %d\n", prach_id); gNB->prach_vars.list[prach_id].frame=SFN; gNB->prach_vars.list[prach_id].slot=Slot; diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch.c index 352967c7f5..7e7562ff22 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch.c @@ -74,8 +74,8 @@ void nr_fill_ulsch(PHY_VARS_gNB *gNB, int frame, int slot, nfapi_nr_pusch_pdu_t NR_UL_gNB_HARQ_t *harq = ulsch->harq_process; if (ulsch_pdu->pusch_data.new_data_indicator) harq->harq_to_be_cleared = true; - LOG_D(PHY, - "%d.%d RNTI %x HARQ PID %d new data indicator %d\n", + LOG_D(NR_PHY, + "NEW ULSCH %d.%d RNTI %x HARQ PID %d new data indicator %d\n", frame, slot, ulsch_pdu->rnti, @@ -98,8 +98,17 @@ void reset_active_ulsch(PHY_VARS_gNB *gNB, int frame) // assuming UE disconnected or some other error occurred for (int i = 0; i < gNB->max_nb_pusch; i++) { NR_gNB_ULSCH_t *ulsch = &gNB->ulsch[i]; - if (ulsch->active && (((frame - ulsch->frame + 1024) % 1024) > NUMBER_FRAMES_PHY_UE_INACTIVE)) + int diff = (frame - ulsch->frame + 1024) & 1023; + if (ulsch->active && diff > NUMBER_FRAMES_PHY_UE_INACTIVE && diff < 100) { ulsch->active = false; + LOG_D(NR_PHY, + "Frame %d: resetting ulsch %d harq %d (programmed in %d.%d)\n", + frame, + i, + ulsch->harq_pid, + ulsch->frame, + ulsch->slot); + } } } diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c index 217d6bbc88..c76365f4ac 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c @@ -1409,7 +1409,7 @@ static void nr_pusch_symbol_processing(void *arg) if (gNB->pusch_vars[ulsch_id].ul_valid_re_per_slot[symbol] == 0) continue; - int soffset = (slot&3)*frame_parms->symbols_per_slot*frame_parms->ofdm_symbol_size; + int soffset = (slot % RU_RX_SLOT_DEPTH) * frame_parms->symbols_per_slot * frame_parms->ofdm_symbol_size; inner_rx(gNB, ulsch_id, slot, @@ -1591,7 +1591,7 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, // extract the first dmrs for the channel level computation // extract the data in the OFDM frame, to the start of the array - int soffset = (slot&3)*frame_parms->symbols_per_slot*frame_parms->ofdm_symbol_size; + int soffset = (slot % RU_RX_SLOT_DEPTH) * frame_parms->symbols_per_slot * frame_parms->ofdm_symbol_size; nb_re_pusch = (nb_re_pusch + 15) & ~15; diff --git a/openair1/PHY/NR_TRANSPORT/pucch_rx.c b/openair1/PHY/NR_TRANSPORT/pucch_rx.c index e878a3c0bb..35b5b1be3d 100644 --- a/openair1/PHY/NR_TRANSPORT/pucch_rx.c +++ b/openair1/PHY/NR_TRANSPORT/pucch_rx.c @@ -501,7 +501,7 @@ void nr_decode_pucch1(c16_t **rxdataF, * Implement TS 38.211 Subclause 6.3.2.4.1 Sequence modulation * */ - const int soffset = (nr_tti_tx & 3) * frame_parms->symbols_per_slot * frame_parms->ofdm_symbol_size; + const int soffset = (nr_tti_tx % RU_RX_SLOT_DEPTH) * frame_parms->symbols_per_slot * frame_parms->ofdm_symbol_size; // lprime is the index of the OFDM symbol in the slot that corresponds to the first OFDM symbol of the PUCCH transmission in the slot given by [5, TS 38.213] const int lprime = startingSymbolIndex; // mcs = 0 except for PUCCH format 0 @@ -1021,14 +1021,10 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB, //extract pucch and dmrs first int l2 = pucch_pdu->start_symbol_index; - - int soffset = (slot & 3) * frame_parms->symbols_per_slot * frame_parms->ofdm_symbol_size; - + int soffset = (slot % RU_RX_SLOT_DEPTH) * frame_parms->symbols_per_slot * frame_parms->ofdm_symbol_size; int re_offset[2]; re_offset[0] = (12 * (pucch_pdu->prb_start + pucch_pdu->bwp_start) + frame_parms->first_carrier_offset) % frame_parms->ofdm_symbol_size; - if (re_offset[0]>= frame_parms->ofdm_symbol_size) - re_offset[0]-=frame_parms->ofdm_symbol_size; if (pucch_pdu->freq_hop_flag == 0) re_offset[1] = re_offset[0]; else { diff --git a/openair1/PHY/NR_TRANSPORT/srs_rx.c b/openair1/PHY/NR_TRANSPORT/srs_rx.c index 989c5cf044..12eb6edda9 100644 --- a/openair1/PHY/NR_TRANSPORT/srs_rx.c +++ b/openair1/PHY/NR_TRANSPORT/srs_rx.c @@ -34,6 +34,7 @@ #include "PHY/impl_defs_nr.h" #include "PHY/defs_nr_common.h" #include "PHY/defs_gNB.h" +#include "PHY/defs_RU.h" #include "PHY/CODING/nrSmallBlock/nr_small_block_defs.h" #include "PHY/NR_UE_TRANSPORT/srs_modulation_nr.h" #include "common/utils/LOG/log.h" @@ -75,7 +76,7 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB, c16_t **rxdataF = gNB->common_vars.rxdataF; const NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms; - const uint16_t n_symbols = (slot&3)*frame_parms->symbols_per_slot; // number of symbols until this slot + const uint16_t n_symbols = (slot % RU_RX_SLOT_DEPTH) * frame_parms->symbols_per_slot; // number of symbols until this slot const uint8_t l0 = frame_parms->symbols_per_slot - 1 - srs_pdu->time_start_position; // starting symbol in this slot const uint64_t symbol_offset = (n_symbols+l0)*frame_parms->ofdm_symbol_size; const uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_pdu->bwp_start*NR_NB_SC_PER_RB; diff --git a/openair1/PHY/defs_RU.h b/openair1/PHY/defs_RU.h index b8cc7ae84c..2f564eac6b 100644 --- a/openair1/PHY/defs_RU.h +++ b/openair1/PHY/defs_RU.h @@ -197,7 +197,7 @@ typedef struct { #define NUMBER_OF_NR_RU_PRACH_MAX 8 #define NUMBER_OF_NR_RU_PRACH_OCCASIONS_MAX 12 - +#define RU_RX_SLOT_DEPTH 4 typedef struct RU_proc_t_s { /// Pointer to associated RU descriptor struct RU_t_s *ru; diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 4132642a46..3afb47490b 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -639,8 +639,6 @@ typedef struct PHY_VARS_gNB_s { int ldpc_offload_flag; - int reorder_thread_disable; - int max_ldpc_iterations; /// indicate the channel estimation technique in time domain int chest_time; @@ -718,6 +716,7 @@ typedef struct PHY_VARS_gNB_s { notifiedFIFO_t L1_tx_free; notifiedFIFO_t L1_tx_filled; notifiedFIFO_t L1_tx_out; + notifiedFIFO_t L1_rx_out; notifiedFIFO_t resp_RU_tx; tpool_t threadPool; int nbSymb; @@ -795,9 +794,7 @@ union ldpcReqUnion { typedef struct processingData_L1 { int frame_rx; - int frame_tx; int slot_rx; - int slot_tx; openair0_timestamp timestamp_tx; PHY_VARS_gNB *gNB; } processingData_L1_t; @@ -811,6 +808,8 @@ typedef enum { typedef struct processingData_L1tx { int frame; int slot; + int frame_rx; + int slot_rx; openair0_timestamp timestamp_tx; PHY_VARS_gNB *gNB; nfapi_nr_dl_tti_pdcch_pdu pdcch_pdu[NFAPI_NR_MAX_NB_CORESETS]; @@ -825,4 +824,9 @@ typedef struct processingData_L1tx { int sched_response_id; } processingData_L1tx_t; +typedef struct processingData_L1rx { + int frame_rx; + int slot_rx; + PHY_VARS_gNB *gNB; +} processingData_L1rx_t; #endif diff --git a/openair1/SCHED_NR/fapi_nr_l1.c b/openair1/SCHED_NR/fapi_nr_l1.c index 979acf2343..23f22a9f2a 100644 --- a/openair1/SCHED_NR/fapi_nr_l1.c +++ b/openair1/SCHED_NR/fapi_nr_l1.c @@ -156,21 +156,9 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO) uint8_t number_tx_data_pdu = (TX_req == NULL) ? 0 : TX_req->Number_of_PDUs; if (NFAPI_MODE == NFAPI_MONOLITHIC){ - if (slot_type == NR_DOWNLINK_SLOT || slot_type == NR_MIXED_SLOT) { - notifiedFIFO_elt_t *res=NULL; processingData_L1tx_t *msgTx=NULL; - if (!gNB->reorder_thread_disable) { - res = pullNotifiedFIFO(&gNB->L1_tx_free); - if (res == NULL) - return; // Tpool has been stopped, nothing to process - msgTx = (processingData_L1tx_t *)NotifiedFifoData(res); - } else { - msgTx = gNB->msgDataTx; //newNotifiedFIFO_elt(sizeof(processingData_L1tx_t),0, &gNB->L1_tx_out,NULL); - } - /*const time_stats_t ts = exec_time_stats_NotifiedFIFO(res); - merge_meas(&gNB->phy_proc_tx, &ts); -*/ + msgTx = gNB->msgDataTx; msgTx->num_pdsch_slot = 0; msgTx->num_dl_pdcch = 0; msgTx->num_ul_pdcch = number_ul_dci_pdu; @@ -222,8 +210,6 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO) * released only when both threads are done with it. */ inc_ref_sched_response(Sched_INFO->sched_response_id); - if (!gNB->reorder_thread_disable) - pushNotifiedFIFO(&gNB->L1_tx_filled,res); } for (int i = 0; i < number_ul_tti_pdu; i++) { @@ -267,7 +253,9 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO) } /* this thread is done with the sched_info, decrease the reference counter */ - deref_sched_response(Sched_INFO->sched_response_id); - + if (slot_type == NR_DOWNLINK_SLOT || slot_type == NR_MIXED_SLOT) { + LOG_D(NR_PHY, "Calling dref_sched_response for id %d in %d.%d (sched_response)\n", Sched_INFO->sched_response_id, frame, slot); + deref_sched_response(Sched_INFO->sched_response_id); + } stop_meas(&gNB->schedule_response_stats); } diff --git a/openair1/SCHED_NR/nr_ru_procedures.c b/openair1/SCHED_NR/nr_ru_procedures.c index fbf89e5101..93619732ae 100644 --- a/openair1/SCHED_NR/nr_ru_procedures.c +++ b/openair1/SCHED_NR/nr_ru_procedures.c @@ -242,7 +242,7 @@ void nr_fep_full(RU_t *ru, int slot) { // remove_7_5_kHz(ru,proc->tti_rx<<1); // remove_7_5_kHz(ru,1+(proc->tti_rx<<1)); - int offset = (proc->tti_rx&3)*(fp->symbols_per_slot * fp->ofdm_symbol_size); + int offset = (proc->tti_rx % RU_RX_SLOT_DEPTH) * (fp->symbols_per_slot * fp->ofdm_symbol_size); for (l = 0; l < fp->symbols_per_slot; l++) { for (aa = 0; aa < fp->nb_antennas_rx; aa++) { nr_slot_fep_ul(fp, @@ -378,7 +378,7 @@ void nr_fep(void* arg) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPRX+aid, 1); - int offset = (tti_rx&3) * fp->symbols_per_slot * fp->ofdm_symbol_size; + int offset = (tti_rx % RU_RX_SLOT_DEPTH) * fp->symbols_per_slot * fp->ofdm_symbol_size; for (int l = startSymbol; l <= endSymbol; l++) nr_slot_fep_ul(fp, ru->common.rxdata[aid], diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 47c0821b7d..26cfbaa034 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -272,10 +272,11 @@ static void nr_postDecode(PHY_VARS_gNB *gNB, notifiedFIFO_elt_t *req) } if (crc_valid && !check_abort(&ulsch_harq->abort_decode) && !gNB->pusch_vars[rdata->ulsch_id].DTX) { - LOG_D(PHY, - "[gNB %d] ULSCH: Setting ACK for SFN/SF %d.%d (rnti %x, pid %d, ndi %d, status %d, round %d, TBS %d, Max interation " + LOG_D(NR_PHY, + "[gNB %d] ULSCH %d: Setting ACK for SFN/SF %d.%d (rnti %x, pid %d, ndi %d, status %d, round %d, TBS %d, Max interation " "(all seg) %d)\n", gNB->Mod_id, + rdata->ulsch_id, ulsch->frame, ulsch->slot, ulsch->rnti, @@ -316,7 +317,7 @@ static void nr_postDecode(PHY_VARS_gNB *gNB, notifiedFIFO_elt_t *req) if (ulsch_harq->ulsch_pdu.mcs_index == 0 && dumpsig==1) { int off = ((ulsch_harq->ulsch_pdu.rb_size&1) == 1)? 4:0; - LOG_M("rxsigF0.m","rxsF0",&gNB->common_vars.rxdataF[0][(ulsch_harq->slot&3)*gNB->frame_parms.ofdm_symbol_size*gNB->frame_parms.symbols_per_slot],gNB->frame_parms.ofdm_symbol_size*gNB->frame_parms.symbols_per_slot,1,1); + LOG_M("rxsigF0.m","rxsF0",&gNB->common_vars.rxdataF[0][(ulsch_harq->slot%RU_RX_SLOT_DEPTH)*gNB->frame_parms.ofdm_symbol_size*gNB->frame_parms.symbols_per_slot],gNB->frame_parms.ofdm_symbol_size*gNB->frame_parms.symbols_per_slot,1,1); LOG_M("rxsigF0_ext.m","rxsF0_ext", &gNB->pusch_vars[0].rxdataF_ext[0][ulsch_harq->ulsch_pdu.start_symbol_index*NR_NB_SC_PER_RB * ulsch_harq->ulsch_pdu.rb_size],ulsch_harq->ulsch_pdu.nr_of_symbols*(off+(NR_NB_SC_PER_RB * @@ -410,9 +411,6 @@ static int nr_ulsch_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id, uint8_t harq_pid, uint8_t crc_flag, int dtx_flag) { - if (!get_softmodem_params()->reorder_thread_disable) - pthread_mutex_lock(&gNB->UL_INFO_mutex); - NR_gNB_ULSCH_t *ulsch = &gNB->ulsch[ULSCH_id]; NR_UL_gNB_HARQ_t *harq_process = ulsch->harq_process; NR_gNB_PHY_STATS_t *stats = get_phy_stats(gNB, ulsch->rnti); @@ -467,7 +465,13 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id, __attribute__((unused)) int off = ((pusch_pdu->rb_size&1) == 1)? 4:0; - LOG_M("rxsigF0.m","rxsF0",&gNB->common_vars.rxdataF[0][(slot_rx&3)*gNB->frame_parms.ofdm_symbol_size*gNB->frame_parms.symbols_per_slot],gNB->frame_parms.ofdm_symbol_size*gNB->frame_parms.symbols_per_slot,1,1); + LOG_M("rxsigF0.m", + "rxsF0", + &gNB->common_vars + .rxdataF[0][(slot_rx % RU_RX_SLOT_DEPTH) * gNB->frame_parms.ofdm_symbol_size * gNB->frame_parms.symbols_per_slot], + gNB->frame_parms.ofdm_symbol_size * gNB->frame_parms.symbols_per_slot, + 1, + 1); LOG_M("chestF0.m", "chF0", &gNB->pusch_vars[0].ul_ch_estimates[0][pusch_pdu->start_symbol_index * gNB->frame_parms.ofdm_symbol_size], @@ -494,7 +498,14 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id, 1, 0); if (gNB->frame_parms.nb_antennas_rx > 1) { - LOG_M("rxsigF1.m","rxsF1",&gNB->common_vars.rxdataF[1][(slot_rx&3)*gNB->frame_parms.ofdm_symbol_size*gNB->frame_parms.symbols_per_slot],gNB->frame_parms.ofdm_symbol_size*gNB->frame_parms.symbols_per_slot,1,1); + LOG_M( + "rxsigF1.m", + "rxsF1", + &gNB->common_vars + .rxdataF[1][(slot_rx % RU_RX_SLOT_DEPTH) * gNB->frame_parms.ofdm_symbol_size * gNB->frame_parms.symbols_per_slot], + gNB->frame_parms.ofdm_symbol_size * gNB->frame_parms.symbols_per_slot, + 1, + 1); LOG_M("chestF1.m", "chF1", &gNB->pusch_vars[0].ul_ch_estimates[1][pusch_pdu->start_symbol_index * gNB->frame_parms.ofdm_symbol_size], @@ -557,9 +568,6 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id, } gNB->UL_INFO.rx_ind.number_of_pdus++; - - if (!get_softmodem_params()->reorder_thread_disable) - pthread_mutex_unlock(&gNB->UL_INFO_mutex); } // Function to fill UL RB mask to be used for N0 measurements @@ -834,9 +842,9 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) NR_gNB_ULSCH_t *ulsch = &gNB->ulsch[ULSCH_id]; NR_UL_gNB_HARQ_t *ulsch_harq = ulsch->harq_process; AssertFatal(ulsch_harq != NULL, "harq_pid %d is not allocated\n", ulsch->harq_pid); - if ((ulsch->active == true) && (ulsch->frame == frame_rx) && (ulsch->slot == slot_rx) && (ulsch->handled == 0)) { LOG_D(PHY, "PUSCH ID %d with RNTI %x detection started in frame %d slot %d\n", ULSCH_id, ulsch->rnti, frame_rx, slot_rx); + int num_dmrs = 0; for (int s = 0; s < NR_NUMBER_OF_SYMBOLS_PER_SLOT; s++) num_dmrs += (ulsch_harq->ulsch_pdu.ul_dmrs_symb_pos >> s) & 1; diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c index 5e6b8c5f45..9cfe4941cd 100644 --- a/openair1/SIMULATION/NR_PHY/dlsim.c +++ b/openair1/SIMULATION/NR_PHY/dlsim.c @@ -895,6 +895,7 @@ int main(int argc, char **argv) msgDataTx->slot = slot; msgDataTx->frame = frame; memset(msgDataTx->ssb, 0, 64*sizeof(NR_gNB_SSB_t)); + gNB->msgDataTx = msgDataTx; // Buffers to store internal memory of slot process int rx_size = (((14 * frame_parms->N_RB_DL * 12 * sizeof(int32_t)) + 15) >> 4) << 4; diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index cc043c7974..05e8fa8e22 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -563,6 +563,7 @@ int main(int argc, char *argv[]) notifiedFIFO_elt_t *msgL1Tx = newNotifiedFIFO_elt(sizeof(processingData_L1tx_t), 0, &gNB->L1_tx_free, NULL); processingData_L1tx_t *msgDataTx = (processingData_L1tx_t *)NotifiedFifoData(msgL1Tx); msgDataTx->slot = -1; + gNB->msgDataTx = msgDataTx; //gNB_config = &gNB->gNB_config; //memset((void *)&gNB->UL_INFO,0,sizeof(gNB->UL_INFO)); diff --git a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c index 86ef7247c5..37bedddf46 100644 --- a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c @@ -486,21 +486,6 @@ void NR_UL_indication(NR_UL_IND_t *UL_info) { if (get_softmodem_params()->emulate_l1) { free_unqueued_nfapi_indications(rach_ind, uci_ind, rx_ind, crc_ind); } - - if (NFAPI_MODE != NFAPI_MODE_PNF) { - gNB_MAC_INST *mac = RC.nrmac[module_id]; - - NR_IF_Module_t *ifi = nr_if_inst[module_id]; - ifi->current_frame = UL_info->frame; - ifi->current_slot = UL_info->slot; - - nfapi_nr_config_request_scf_t *cfg = &mac->config[CC_id]; - int spf = get_spf(cfg); - int CC_id = 0; - int frame_tx = UL_info->frame + ((UL_info->slot > (spf - 1 - ifi->sl_ahead)) ? 1 : 0); - int slot_tx = (UL_info->slot + ifi->sl_ahead) % spf; - ifi->NR_slot_indication(module_id, CC_id, frame_tx, slot_tx); - } } NR_IF_Module_t *NR_IF_Module_init(int Mod_id) { From e9d6081abc6ddb57c354f14a6143d89cf265ace5 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Wed, 7 Feb 2024 13:23:15 +0100 Subject: [PATCH 07/14] Add slot indication timing --- executables/nr-gnb.c | 4 ++++ openair1/PHY/defs_gNB.h | 1 + 2 files changed, 5 insertions(+) diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c index 707297e419..e2864b9320 100644 --- a/executables/nr-gnb.c +++ b/executables/nr-gnb.c @@ -131,7 +131,9 @@ static void tx_func(void *param) T(T_GNB_PHY_DL_TICK, T_INT(gNB->Mod_id), T_INT(frame_tx), T_INT(slot_tx)); + start_meas(&gNB->slot_indication_stats); ifi->NR_slot_indication(module_id, CC_id, frame_tx, slot_tx); + stop_meas(&gNB->slot_indication_stats); gNB->msgDataTx->timestamp_tx = info->timestamp_tx; info = gNB->msgDataTx; info->gNB = gNB; @@ -293,6 +295,7 @@ static size_t dump_L1_meas_stats(PHY_VARS_gNB *gNB, RU_t *ru, char *output, size output += print_meas_log(&gNB->dlsch_precoding_stats, "DLSCH precoding", NULL, NULL, output,end-output); output += print_meas_log(&gNB->phy_proc_rx, "L1 Rx processing", NULL, NULL, output, end - output); output += print_meas_log(&gNB->ul_indication_stats, "UL Indication", NULL, NULL, output, end - output); + output += print_meas_log(&gNB->slot_indication_stats, "Slot Indication", NULL, NULL, output, end - output); output += print_meas_log(&gNB->rx_pusch_stats, "PUSCH inner-receiver", NULL, NULL, output, end - output); output += print_meas_log(&gNB->ulsch_decoding_stats, "PUSCH decoding", NULL, NULL, output, end - output); output += print_meas_log(&gNB->schedule_response_stats, "Schedule Response", NULL, NULL, output, end - output); @@ -336,6 +339,7 @@ void *nrL1_stats_thread(void *param) { reset_meas(&gNB->dlsch_encoding_stats); reset_meas(&gNB->phy_proc_rx); reset_meas(&gNB->ul_indication_stats); + reset_meas(&gNB->slot_indication_stats); reset_meas(&gNB->rx_pusch_stats); reset_meas(&gNB->ulsch_decoding_stats); reset_meas(&gNB->schedule_response_stats); diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 3afb47490b..e437024521 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -691,6 +691,7 @@ typedef struct PHY_VARS_gNB_s { time_stats_t rx_pusch_init_stats; time_stats_t rx_pusch_symbol_processing_stats; time_stats_t ul_indication_stats; + time_stats_t slot_indication_stats; time_stats_t schedule_response_stats; time_stats_t ulsch_decoding_stats; time_stats_t ulsch_ldpc_decoding_stats; From 6ba87167002007977df7fd21eabe7cfecf86f824 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Wed, 7 Feb 2024 13:29:21 +0100 Subject: [PATCH 08/14] Add Slot Indication to monitoring --- ci-scripts/datalog_rt_stats.1x1.60.yaml | 4 +++- ci-scripts/datalog_rt_stats.2x2.yaml | 4 +++- ci-scripts/datalog_rt_stats.60.2x2.yaml | 4 +++- ci-scripts/datalog_rt_stats.default.yaml | 4 +++- ci-scripts/stats_monitor_conf.yaml | 2 ++ 5 files changed, 14 insertions(+), 4 deletions(-) diff --git a/ci-scripts/datalog_rt_stats.1x1.60.yaml b/ci-scripts/datalog_rt_stats.1x1.60.yaml index dca2b28901..9160573853 100644 --- a/ci-scripts/datalog_rt_stats.1x1.60.yaml +++ b/ci-scripts/datalog_rt_stats.1x1.60.yaml @@ -18,7 +18,8 @@ Ref : PUSCH decoding : 2200.0 Schedule Response : 48.0 DL & UL scheduling timing : 13.0 - UL Indication : 60.0 + UL Indication : 3.0 + Slot Indication : 60.0 Threshold : feprx : 1.25 feptx_prec : 1.25 @@ -32,3 +33,4 @@ Threshold : Schedule Response : 1.25 DL & UL scheduling timing : 1.25 UL Indication : 1.25 + Slot Indication : 1.25 diff --git a/ci-scripts/datalog_rt_stats.2x2.yaml b/ci-scripts/datalog_rt_stats.2x2.yaml index 1805d8ab2f..1d86d0e4a6 100644 --- a/ci-scripts/datalog_rt_stats.2x2.yaml +++ b/ci-scripts/datalog_rt_stats.2x2.yaml @@ -17,7 +17,8 @@ Ref : PUSCH inner-receiver : 100.0 PUSCH decoding : 180.0 DL & UL scheduling timing : 37.0 - UL Indication : 38.0 + UL Indication : 3.0 + Slot Indication : 38.0 Threshold : feprx : 1.25 feptx_prec : 1.25 @@ -30,3 +31,4 @@ Threshold : PUSCH decoding : 1.25 DL & UL scheduling timing : 1.25 UL Indication : 1.25 + Slot Indication : 1.25 diff --git a/ci-scripts/datalog_rt_stats.60.2x2.yaml b/ci-scripts/datalog_rt_stats.60.2x2.yaml index 0703df6a31..4f86ebe7bd 100644 --- a/ci-scripts/datalog_rt_stats.60.2x2.yaml +++ b/ci-scripts/datalog_rt_stats.60.2x2.yaml @@ -18,7 +18,8 @@ Ref : PUSCH decoding : 2200.0 Schedule Response : 111.0 DL & UL scheduling timing : 20.0 - UL Indication : 127.0 + UL Indication : 5.0 + Slot Indication : 127.0 Threshold : feprx : 1.25 feptx_prec : 1.25 @@ -32,3 +33,4 @@ Threshold : Schedule Response : 48.0 DL & UL scheduling timing : 1.25 UL Indication : 1.25 + Slot Indication : 1.25 diff --git a/ci-scripts/datalog_rt_stats.default.yaml b/ci-scripts/datalog_rt_stats.default.yaml index bbc5b2d016..970fdda184 100644 --- a/ci-scripts/datalog_rt_stats.default.yaml +++ b/ci-scripts/datalog_rt_stats.default.yaml @@ -18,7 +18,8 @@ Ref : PUSCH decoding : 2200.0 Schedule Response : 30.0 DL & UL scheduling timing : 10.0 - UL Indication : 40.0 + UL Indication : 3.0 + Slot Indication : 40.0 Threshold : feprx : 1.25 feptx_prec : 1.25 @@ -32,3 +33,4 @@ Threshold : Schedule Response : 1.25 DL & UL scheduling timing : 1.25 UL Indication : 1.25 + Slot Indication : 1.25 diff --git a/ci-scripts/stats_monitor_conf.yaml b/ci-scripts/stats_monitor_conf.yaml index 4e1f87ed17..e61608a63c 100644 --- a/ci-scripts/stats_monitor_conf.yaml +++ b/ci-scripts/stats_monitor_conf.yaml @@ -27,6 +27,7 @@ gnb : PUSCH decoding: DL & UL scheduling timing: UL Indication: + Slot Indication: graph : page1: dlsch_err: @@ -47,3 +48,4 @@ gnb : rt.PUSCH decoding: rt.DL & UL scheduling timing: rt.UL Indication: + rt.Slot Indication: From 003567675c8ebb35e30b13e011f4a8aa06ca31d4 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Wed, 7 Feb 2024 13:51:58 +0100 Subject: [PATCH 09/14] CI: phytest-timing: detect deviation from normalized values above/below The CI would only detect a deviation from the normalized value based on a configurable threshold, typically 1.25 (so we would tolerate a 25% increase). However, it often happens that a timing gets shorter (e.g., forgot to put the timing measurements). This commit introduces a "Deviation Threshold" (smaller than 1) to not only check that we exceed 1.0 + "Deviation Threshold" (as before), but also that are not below 1.0 - "Deviation Threshold". In other words, assuming a maximum divergence of 25%, instead of just checking if val > 1.25, we now also check if val < 0.75 (and flag error). --- ci-scripts/cls_oai_html.py | 14 +++++++---- ci-scripts/datalog_rt_stats.1x1.60.yaml | 30 ++++++++++++------------ ci-scripts/datalog_rt_stats.2x2.yaml | 30 +++++++++++++----------- ci-scripts/datalog_rt_stats.60.2x2.yaml | 30 ++++++++++++------------ ci-scripts/datalog_rt_stats.default.yaml | 30 ++++++++++++------------ ci-scripts/ran.py | 6 +++-- 6 files changed, 75 insertions(+), 65 deletions(-) diff --git a/ci-scripts/cls_oai_html.py b/ci-scripts/cls_oai_html.py index 81b01cd530..04971485a6 100644 --- a/ci-scripts/cls_oai_html.py +++ b/ci-scripts/cls_oai_html.py @@ -437,13 +437,19 @@ class HTMLManagement(): for k in DataLog['Data']: # TestRow + avg = DataLog['Data'][k][0] + maxval = DataLog['Data'][k][1] + count = DataLog['Data'][k][2] + valnorm = float(DataLog['Data'][k][3]) + dev = DataLog['DeviationThreshold'][k] + ref = DataLog['Ref'][k] self.htmlFile.write(' \n') self.htmlFile.write(' ' + k + ' \n') - self.htmlFile.write(' ' + DataLog['Data'][k][0] + '; ' + DataLog['Data'][k][1] + '; ' + DataLog['Data'][k][2] + ' \n') - if float(DataLog['Data'][k][3])> DataLog['Threshold'][k]: - self.htmlFile.write(' ' + DataLog['Data'][k][3] + ' (Ref = ' + str(DataLog['Ref'][k]) + ' ; Thres = ' +str(DataLog['Threshold'][k])+') ' + '\n') + self.htmlFile.write(f' {avg}; {maxval}; {count}\n') + if valnorm > 1.0 + dev or valnorm < 1.0 - dev: + self.htmlFile.write(f' {valnorm} (Avg over Ref = {avg} over {ref}; max allowed deviation = {dev})\n') else: - self.htmlFile.write(' ' + DataLog['Data'][k][3] + ' (Ref = ' + str(DataLog['Ref'][k]) + ' ; Thres = ' +str(DataLog['Threshold'][k])+') ' + '\n') + self.htmlFile.write(f' {valnorm} (Avg over Ref = {avg} over {ref}; max allowed deviation = {dev})\n') self.htmlFile.write(' \n') self.htmlFile.close() diff --git a/ci-scripts/datalog_rt_stats.1x1.60.yaml b/ci-scripts/datalog_rt_stats.1x1.60.yaml index 9160573853..5e2bf90943 100644 --- a/ci-scripts/datalog_rt_stats.1x1.60.yaml +++ b/ci-scripts/datalog_rt_stats.1x1.60.yaml @@ -5,7 +5,7 @@ Title : Processing Time (us) ColNames : - Metric - Average; Max; Count - - Average vs Reference Deviation (Reference Value; Acceptability Threshold) + - Average vs Reference Deviation (Reference Value; Acceptability Deviation Threshold) Ref : feprx : 46.0 feptx_prec : 15.0 @@ -20,17 +20,17 @@ Ref : DL & UL scheduling timing : 13.0 UL Indication : 3.0 Slot Indication : 60.0 -Threshold : - feprx : 1.25 - feptx_prec : 1.25 - feptx_ofdm : 1.25 - feptx_total : 1.25 - L1 Tx processing : 1.25 - DLSCH encoding : 1.25 - L1 Rx processing : 1.25 - PUSCH inner-receiver : 1.25 - PUSCH decoding : 1.25 - Schedule Response : 1.25 - DL & UL scheduling timing : 1.25 - UL Indication : 1.25 - Slot Indication : 1.25 +DeviationThreshold : + feprx : 0.25 + feptx_prec : 0.25 + feptx_ofdm : 0.25 + feptx_total : 0.25 + L1 Tx processing : 0.25 + DLSCH encoding : 0.25 + L1 Rx processing : 0.25 + PUSCH inner-receiver : 0.25 + PUSCH decoding : 0.25 + Schedule Response : 0.25 + DL & UL scheduling timing : 0.25 + UL Indication : 0.25 + Slot Indication : 0.25 diff --git a/ci-scripts/datalog_rt_stats.2x2.yaml b/ci-scripts/datalog_rt_stats.2x2.yaml index 1d86d0e4a6..f99e09737f 100644 --- a/ci-scripts/datalog_rt_stats.2x2.yaml +++ b/ci-scripts/datalog_rt_stats.2x2.yaml @@ -5,7 +5,7 @@ Title : Processing Time (us) ColNames : - Metric - Average; Max; Count - - Average vs Reference Deviation (Reference Value; Acceptability Threshold) + - Average vs Reference Deviation (Reference Value; Acceptability Deviation Threshold) Ref : feprx : 120.0 feptx_prec : 30.0 @@ -16,19 +16,21 @@ Ref : L1 Rx processing : 175.0 PUSCH inner-receiver : 100.0 PUSCH decoding : 180.0 + Schedule Response : 111.0 DL & UL scheduling timing : 37.0 UL Indication : 3.0 Slot Indication : 38.0 -Threshold : - feprx : 1.25 - feptx_prec : 1.25 - feptx_ofdm : 1.25 - feptx_total : 1.25 - L1 Tx processing : 1.25 - DLSCH encoding : 1.25 - L1 Rx processing : 1.25 - PUSCH inner-receiver : 1.25 - PUSCH decoding : 1.25 - DL & UL scheduling timing : 1.25 - UL Indication : 1.25 - Slot Indication : 1.25 +DeviationThreshold : + feprx : 0.25 + feptx_prec : 0.25 + feptx_ofdm : 0.25 + feptx_total : 0.25 + L1 Tx processing : 0.25 + DLSCH encoding : 0.25 + L1 Rx processing : 0.25 + PUSCH inner-receiver : 0.25 + PUSCH decoding : 0.25 + Schedule Response : 0.25 + DL & UL scheduling timing : 0.25 + UL Indication : 0.25 + Slot Indication : 0.25 diff --git a/ci-scripts/datalog_rt_stats.60.2x2.yaml b/ci-scripts/datalog_rt_stats.60.2x2.yaml index 4f86ebe7bd..66d01f859d 100644 --- a/ci-scripts/datalog_rt_stats.60.2x2.yaml +++ b/ci-scripts/datalog_rt_stats.60.2x2.yaml @@ -5,7 +5,7 @@ Title : Processing Time (us) ColNames : - Metric - Average; Max; Count - - Average vs Reference Deviation (Reference Value; Acceptability Threshold) + - Average vs Reference Deviation (Reference Value; Acceptability Deviation Threshold) Ref : feprx : 84.0 feptx_prec : 14.0 @@ -20,17 +20,17 @@ Ref : DL & UL scheduling timing : 20.0 UL Indication : 5.0 Slot Indication : 127.0 -Threshold : - feprx : 1.25 - feptx_prec : 1.25 - feptx_ofdm : 1.25 - feptx_total : 1.25 - L1 Tx processing : 1.25 - DLSCH encoding : 1.25 - L1 Rx processing : 1.25 - PUSCH inner-receiver : 1.25 - PUSCH decoding : 1.25 - Schedule Response : 48.0 - DL & UL scheduling timing : 1.25 - UL Indication : 1.25 - Slot Indication : 1.25 +DeviationThreshold : + feprx : 0.25 + feptx_prec : 0.25 + feptx_ofdm : 0.25 + feptx_total : 0.25 + L1 Tx processing : 0.25 + DLSCH encoding : 0.25 + L1 Rx processing : 0.25 + PUSCH inner-receiver : 0.25 + PUSCH decoding : 0.25 + Schedule Response : 0.25 + DL & UL scheduling timing : 0.25 + UL Indication : 0.25 + Slot Indication : 0.25 diff --git a/ci-scripts/datalog_rt_stats.default.yaml b/ci-scripts/datalog_rt_stats.default.yaml index 970fdda184..73a5f82232 100644 --- a/ci-scripts/datalog_rt_stats.default.yaml +++ b/ci-scripts/datalog_rt_stats.default.yaml @@ -5,7 +5,7 @@ Title : Processing Time (us) ColNames : - Metric - Average; Max; Count - - Average vs Reference Deviation (Reference Value; Acceptability Threshold) + - Average vs Reference Deviation (Reference Value; Acceptability Deviation Threshold) Ref : feprx : 43.0 feptx_prec : 13.0 @@ -20,17 +20,17 @@ Ref : DL & UL scheduling timing : 10.0 UL Indication : 3.0 Slot Indication : 40.0 -Threshold : - feprx : 1.25 - feptx_prec : 1.25 - feptx_ofdm : 1.25 - feptx_total : 1.25 - L1 Tx processing : 1.25 - DLSCH encoding : 1.25 - L1 Rx processing : 1.25 - PUSCH inner-receiver : 1.25 - PUSCH decoding : 1.25 - Schedule Response : 1.25 - DL & UL scheduling timing : 1.25 - UL Indication : 1.25 - Slot Indication : 1.25 +DeviationThreshold : + feprx : 0.25 + feptx_prec : 0.25 + feptx_ofdm : 0.25 + feptx_total : 0.25 + L1 Tx processing : 0.25 + DLSCH encoding : 0.25 + L1 Rx processing : 0.25 + PUSCH inner-receiver : 0.25 + PUSCH decoding : 0.25 + Schedule Response : 0.25 + DL & UL scheduling timing : 0.25 + UL Indication : 0.25 + Slot Indication : 0.25 diff --git a/ci-scripts/ran.py b/ci-scripts/ran.py index 17a8b54d6d..52b9c79abf 100644 --- a/ci-scripts/ran.py +++ b/ci-scripts/ran.py @@ -1179,8 +1179,10 @@ class RANManagement(): self.datalog_rt_stats=datalog_rt_stats #check if there is a fail => will render the test as failed for k in datalog_rt_stats['Data']: - if float(datalog_rt_stats['Data'][k][3])> datalog_rt_stats['Threshold'][k]: #condition for fail : avg/ref is greater than the fixed threshold - logging.debug('\u001B[1;30;43m datalog_rt_stats metric ' + k + '=' + datalog_rt_stats['Data'][k][3] + ' > threshold ' + str(datalog_rt_stats['Threshold'][k]) + ' \u001B[0m') + valnorm = float(datalog_rt_stats['Data'][k][3]) + dev = datalog_rt_stats['DeviationThreshold'][k] + if valnorm > 1.0 + dev or valnorm < 1.0 - dev: # condition for fail : avg/ref deviates by more than "deviation threshold" + logging.debug(f'\u001B[1;30;43m normalized datalog_rt_stats metric {k}={valnorm} deviates by more than {dev}\u001B[0m') RealTimeProcessingIssue = True else: statMsg = 'No real time stats found in the log file\n' From 418024835b5a8415754cf14772f386d98a549a46 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Wed, 7 Feb 2024 14:32:32 +0100 Subject: [PATCH 10/14] Add 100 MHz 2x2 phytest-timing test --- ...b.band78.273prb.usrpn300.phytest-dora.conf | 242 ++++++++++++++++++ ci-scripts/datalog_rt_stats.100.2x2.yaml | 36 +++ .../gnb_phytest_usrp_run_100_2x2.xml | 68 +++++ 3 files changed, 346 insertions(+) create mode 100644 ci-scripts/conf_files/gnb.band78.273prb.usrpn300.phytest-dora.conf create mode 100644 ci-scripts/datalog_rt_stats.100.2x2.yaml create mode 100644 ci-scripts/xml_files/gnb_phytest_usrp_run_100_2x2.xml diff --git a/ci-scripts/conf_files/gnb.band78.273prb.usrpn300.phytest-dora.conf b/ci-scripts/conf_files/gnb.band78.273prb.usrpn300.phytest-dora.conf new file mode 100644 index 0000000000..6331462d1b --- /dev/null +++ b/ci-scripts/conf_files/gnb.band78.273prb.usrpn300.phytest-dora.conf @@ -0,0 +1,242 @@ +Active_gNBs = ( "gNB-Eurecom-5GNRBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + + cell_type = "CELL_MACRO_GNB"; + + gNB_name = "gNB-Eurecom-5GNRBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + + plmn_list = ({mcc = 208; mnc = 93; mnc_length = 2;}); + + tr_s_preference = "local_mac" + + ////////// Physical parameters: + + pdsch_AntennaPorts_XP = 2; + pusch_AntennaPorts = 2; + min_rxtxtime = 6; + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 0; + +# downlinkConfigCommon + #frequencyInfoDL + # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP) + absoluteFrequencySSB = 621312; + dl_frequencyBand = 78; + # this is 3600 MHz + dl_absoluteFrequencyPointA = 620040; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 1; + dl_carrierBandwidth = 273; + #initialDownlinkBWP + #genericParameters + # this is RBstart=41,L=24 (275*(L-1))+RBstart + initialDLBWPlocationAndBandwidth = 31624; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 1; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 12; + initialDLBWPsearchSpaceZero = 0; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 78; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 1; + ul_carrierBandwidth = 273; + pMax = 20; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 31624; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 1; + #rach-ConfigCommon + #rach-ConfigGeneric + prach_ConfigurationIndex = 98; +#prach_msg1_FDM +#0 = one, 1=two, 2=four, 3=eight + prach_msg1_FDM = 0; + prach_msg1_FrequencyStart = 0; + zeroCorrelationZoneConfig = 13; + preambleReceivedTargetPower = -118; +#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) + preambleTransMax = 6; +#powerRampingStep +# 0=dB0,1=dB2,2=dB4,3=dB6 + powerRampingStep = 1; +#ra_ReponseWindow +#1,2,4,8,10,20,40,80 + ra_ResponseWindow = 4; +#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR +#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen + ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4; +#oneHalf (0..15) 4,8,12,16,...60,64 + ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15; +#ra_ContentionResolutionTimer +#(0..7) 8,16,24,32,40,48,56,64 + ra_ContentionResolutionTimer = 7; + rsrp_ThresholdSSB = 19; +#prach-RootSequenceIndex_PR +#1 = 839, 2 = 139 + prach_RootSequenceIndex_PR = 2; + prach_RootSequenceIndex = 1; + # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex + # + msg1_SubcarrierSpacing = 1, +# restrictedSetConfig +# 0=unrestricted, 1=restricted type A, 2=restricted type B + restrictedSetConfig = 0, + + msg3_DeltaPreamble = 1; + p0_NominalWithGrant =-90; + +# pucch-ConfigCommon setup : +# pucchGroupHopping +# 0 = neither, 1= group hopping, 2=sequence hopping + pucchGroupHopping = 0; + hoppingId = 40; + p0_nominal = -90; +# ssb_PositionsInBurs_BitmapPR +# 1=short, 2=medium, 3=long + ssb_PositionsInBurst_PR = 2; + ssb_PositionsInBurst_Bitmap = 1; + +# ssb_periodicityServingCell +# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 + ssb_periodicityServingCell = 2; + +# dmrs_TypeA_position +# 0 = pos2, 1 = pos3 + dmrs_TypeA_Position = 0; + +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + subcarrierSpacing = 1; + + + #tdd-UL-DL-ConfigurationCommon +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + referenceSubcarrierSpacing = 1; + # pattern1 + # dl_UL_TransmissionPeriodicity + # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 + dl_UL_TransmissionPeriodicity = 6; + nrofDownlinkSlots = 7; + nrofDownlinkSymbols = 6; + nrofUplinkSlots = 2; + nrofUplinkSymbols = 4; + + ssPBCH_BlockPower = -25; + } + + ); + + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.26"; + ipv6 = "192:168:30::17"; + port = 36412 ; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : { + GNB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + GNB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24"; + GNB_INTERFACE_NAME_FOR_S1U = "eth0"; + GNB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + } +); + +MACRLCs = ({ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; +}); + +L1s = ({ + num_cc = 1; + tr_n_preference = "local_mac"; +}); + +RUs = ({ + local_rf = "yes" + nb_tx = 2 + nb_rx = 2 + att_tx = 0 + att_rx = 0; + bands = [7]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 50; + eNB_instances = [0]; + bf_weights = [0x00007fff, 0x0000]; + sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2"; +}); + +THREAD_STRUCT = ({ + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_RU_L1_TRX_SPLIT"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; +}); + +security = { + # preferred ciphering algorithms + # the first one of the list that an UE supports in chosen + # valid values: nea0, nea1, nea2, nea3 + ciphering_algorithms = ( "nea0" ); + + # preferred integrity algorithms + # the first one of the list that an UE supports in chosen + # valid values: nia0, nia1, nia2, nia3 + integrity_algorithms = ( "nia2", "nia0" ); + + # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter + # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' + drb_ciphering = "yes"; + drb_integrity = "no"; +}; + +log_config : { + global_log_level = "info"; + hw_log_level = "info"; + phy_log_level = "info"; + mac_log_level = "info"; + rlc_log_level = "info"; + pdcp_log_level = "info"; + rrc_log_level = "info"; +}; diff --git a/ci-scripts/datalog_rt_stats.100.2x2.yaml b/ci-scripts/datalog_rt_stats.100.2x2.yaml new file mode 100644 index 0000000000..5941e75916 --- /dev/null +++ b/ci-scripts/datalog_rt_stats.100.2x2.yaml @@ -0,0 +1,36 @@ +#this is a configuration file +#used to build real time processing statistics +#for 5G NR phy test (gNB terminate) +Title : Processing Time (us) +ColNames : + - Metric + - Average; Max; Count + - Average vs Reference Deviation (Reference Value; Acceptability Deviation Threshold) +Ref : + feprx : 150.0 + feptx_prec : 0.0 + feptx_ofdm : 65.0 + feptx_total : 177.0 + L1 Tx processing : 560.0 + DLSCH encoding : 179.0 + L1 Rx processing : 526.0 + PUSCH inner-receiver : 400.0 + PUSCH decoding : 2000.0 + Schedule Response : 1.0 + DL & UL scheduling timing : 15.0 + UL Indication : 1.0 + Slot Indication : 17.0 +DeviationThreshold : + feprx : 0.25 + feptx_prec : 0.25 + feptx_ofdm : 0.25 + feptx_total : 0.25 + L1 Tx processing : 0.25 + DLSCH encoding : 0.25 + L1 Rx processing : 0.25 + PUSCH inner-receiver : 0.25 + PUSCH decoding : 0.25 + Schedule Response : 0.25 + DL & UL scheduling timing : 0.25 + UL Indication : 0.25 + Slot Indication : 0.25 diff --git a/ci-scripts/xml_files/gnb_phytest_usrp_run_100_2x2.xml b/ci-scripts/xml_files/gnb_phytest_usrp_run_100_2x2.xml new file mode 100644 index 0000000000..fdad18d099 --- /dev/null +++ b/ci-scripts/xml_files/gnb_phytest_usrp_run_100_2x2.xml @@ -0,0 +1,68 @@ + + + gNB-PHY-Test-100-2x2 + Timing phytest 100 MHz 2x2 + tasks + 1 + +100000 390101 000001 390109 200000 + + + + Custom_Command + Disable Sleep States + caracal + sudo cpupower idle-set -D 0 + + + Custom_Command + Enable Sleep States + caracal + sudo cpupower idle-set -E + + + + Initialize_eNB + Initialize gNB USRP + -O ci-scripts/conf_files/gnb.band78.273prb.usrpn300.phytest-dora.conf --phy-test -q -U 787200 -T 273 -t 23 -D 130175 -m 23 -M 273 -l 2 --usrp-tx-thread-config 1 --log_config.global_log_options level,nocolor,time + datalog_rt_stats.100.2x2.yaml + NR + 192.168.20.2 + numactl --cpunodebind=netdev:enp94s0f0np0 --membind=netdev:enp94s0f0np0 + + + + IdleSleep + Sleep + 60 + + + + + Terminate_eNB + Terminate gNB + NR + + + From 362bc481bd4f80c1d795d354b4b0737b26b98e61 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Wed, 7 Feb 2024 17:46:15 +0100 Subject: [PATCH 11/14] Remove misleading PUSCH decoding PUSCH decoding is started multiple times in nr_ulsch_procedures() for each ULSCH segment, and stopped once inside phy_procedures_gNB_uespec_RX(). Not only is it not clear if that works with the API, it also might measure more than just PUSCH decoding. Remove the PUSCH decoding, it is misleading. Check L1 RX processing instead. --- ci-scripts/datalog_rt_stats.100.2x2.yaml | 2 -- ci-scripts/datalog_rt_stats.1x1.60.yaml | 2 -- ci-scripts/datalog_rt_stats.2x2.yaml | 2 -- ci-scripts/datalog_rt_stats.60.2x2.yaml | 2 -- ci-scripts/datalog_rt_stats.default.yaml | 2 -- ci-scripts/stats_monitor_conf.yaml | 2 -- executables/nr-gnb.c | 2 -- openair1/PHY/defs_gNB.h | 1 - openair1/SCHED_NR/phy_procedures_nr_gNB.c | 2 -- openair1/SIMULATION/NR_PHY/ulsim.c | 2 -- 10 files changed, 19 deletions(-) diff --git a/ci-scripts/datalog_rt_stats.100.2x2.yaml b/ci-scripts/datalog_rt_stats.100.2x2.yaml index 5941e75916..e6c6a374e9 100644 --- a/ci-scripts/datalog_rt_stats.100.2x2.yaml +++ b/ci-scripts/datalog_rt_stats.100.2x2.yaml @@ -15,7 +15,6 @@ Ref : DLSCH encoding : 179.0 L1 Rx processing : 526.0 PUSCH inner-receiver : 400.0 - PUSCH decoding : 2000.0 Schedule Response : 1.0 DL & UL scheduling timing : 15.0 UL Indication : 1.0 @@ -29,7 +28,6 @@ DeviationThreshold : DLSCH encoding : 0.25 L1 Rx processing : 0.25 PUSCH inner-receiver : 0.25 - PUSCH decoding : 0.25 Schedule Response : 0.25 DL & UL scheduling timing : 0.25 UL Indication : 0.25 diff --git a/ci-scripts/datalog_rt_stats.1x1.60.yaml b/ci-scripts/datalog_rt_stats.1x1.60.yaml index 5e2bf90943..09a2980688 100644 --- a/ci-scripts/datalog_rt_stats.1x1.60.yaml +++ b/ci-scripts/datalog_rt_stats.1x1.60.yaml @@ -15,7 +15,6 @@ Ref : DLSCH encoding : 137.0 L1 Rx processing : 345.0 PUSCH inner-receiver : 210.0 - PUSCH decoding : 2200.0 Schedule Response : 48.0 DL & UL scheduling timing : 13.0 UL Indication : 3.0 @@ -29,7 +28,6 @@ DeviationThreshold : DLSCH encoding : 0.25 L1 Rx processing : 0.25 PUSCH inner-receiver : 0.25 - PUSCH decoding : 0.25 Schedule Response : 0.25 DL & UL scheduling timing : 0.25 UL Indication : 0.25 diff --git a/ci-scripts/datalog_rt_stats.2x2.yaml b/ci-scripts/datalog_rt_stats.2x2.yaml index f99e09737f..99a442c80a 100644 --- a/ci-scripts/datalog_rt_stats.2x2.yaml +++ b/ci-scripts/datalog_rt_stats.2x2.yaml @@ -15,7 +15,6 @@ Ref : DLSCH encoding : 230.0 L1 Rx processing : 175.0 PUSCH inner-receiver : 100.0 - PUSCH decoding : 180.0 Schedule Response : 111.0 DL & UL scheduling timing : 37.0 UL Indication : 3.0 @@ -29,7 +28,6 @@ DeviationThreshold : DLSCH encoding : 0.25 L1 Rx processing : 0.25 PUSCH inner-receiver : 0.25 - PUSCH decoding : 0.25 Schedule Response : 0.25 DL & UL scheduling timing : 0.25 UL Indication : 0.25 diff --git a/ci-scripts/datalog_rt_stats.60.2x2.yaml b/ci-scripts/datalog_rt_stats.60.2x2.yaml index 66d01f859d..d352f8ab28 100644 --- a/ci-scripts/datalog_rt_stats.60.2x2.yaml +++ b/ci-scripts/datalog_rt_stats.60.2x2.yaml @@ -15,7 +15,6 @@ Ref : DLSCH encoding : 177.0 L1 Rx processing : 345.0 PUSCH inner-receiver : 210.0 - PUSCH decoding : 2200.0 Schedule Response : 111.0 DL & UL scheduling timing : 20.0 UL Indication : 5.0 @@ -29,7 +28,6 @@ DeviationThreshold : DLSCH encoding : 0.25 L1 Rx processing : 0.25 PUSCH inner-receiver : 0.25 - PUSCH decoding : 0.25 Schedule Response : 0.25 DL & UL scheduling timing : 0.25 UL Indication : 0.25 diff --git a/ci-scripts/datalog_rt_stats.default.yaml b/ci-scripts/datalog_rt_stats.default.yaml index 73a5f82232..e19833434d 100644 --- a/ci-scripts/datalog_rt_stats.default.yaml +++ b/ci-scripts/datalog_rt_stats.default.yaml @@ -15,7 +15,6 @@ Ref : DLSCH encoding : 118.0 L1 Rx processing : 305.0 PUSCH inner-receiver : 150.0 - PUSCH decoding : 2200.0 Schedule Response : 30.0 DL & UL scheduling timing : 10.0 UL Indication : 3.0 @@ -29,7 +28,6 @@ DeviationThreshold : DLSCH encoding : 0.25 L1 Rx processing : 0.25 PUSCH inner-receiver : 0.25 - PUSCH decoding : 0.25 Schedule Response : 0.25 DL & UL scheduling timing : 0.25 UL Indication : 0.25 diff --git a/ci-scripts/stats_monitor_conf.yaml b/ci-scripts/stats_monitor_conf.yaml index e61608a63c..15a93abc6c 100644 --- a/ci-scripts/stats_monitor_conf.yaml +++ b/ci-scripts/stats_monitor_conf.yaml @@ -24,7 +24,6 @@ gnb : DLSCH encoding: L1 Rx processing: PUSCH inner-receiver: - PUSCH decoding: DL & UL scheduling timing: UL Indication: Slot Indication: @@ -45,7 +44,6 @@ gnb : rt.L1 Rx processing: page4: rt.PUSCH inner-receiver: - rt.PUSCH decoding: rt.DL & UL scheduling timing: rt.UL Indication: rt.Slot Indication: diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c index e2864b9320..e7f92a054c 100644 --- a/executables/nr-gnb.c +++ b/executables/nr-gnb.c @@ -297,7 +297,6 @@ static size_t dump_L1_meas_stats(PHY_VARS_gNB *gNB, RU_t *ru, char *output, size output += print_meas_log(&gNB->ul_indication_stats, "UL Indication", NULL, NULL, output, end - output); output += print_meas_log(&gNB->slot_indication_stats, "Slot Indication", NULL, NULL, output, end - output); output += print_meas_log(&gNB->rx_pusch_stats, "PUSCH inner-receiver", NULL, NULL, output, end - output); - output += print_meas_log(&gNB->ulsch_decoding_stats, "PUSCH decoding", NULL, NULL, output, end - output); output += print_meas_log(&gNB->schedule_response_stats, "Schedule Response", NULL, NULL, output, end - output); output += print_meas_log(&gNB->rx_prach, "PRACH RX", NULL, NULL, output, end - output); if (ru->feprx) @@ -341,7 +340,6 @@ void *nrL1_stats_thread(void *param) { reset_meas(&gNB->ul_indication_stats); reset_meas(&gNB->slot_indication_stats); reset_meas(&gNB->rx_pusch_stats); - reset_meas(&gNB->ulsch_decoding_stats); reset_meas(&gNB->schedule_response_stats); reset_meas(&gNB->dlsch_scrambling_stats); reset_meas(&gNB->dlsch_modulation_stats); diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index e437024521..c4ef28bc0b 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -693,7 +693,6 @@ typedef struct PHY_VARS_gNB_s { time_stats_t ul_indication_stats; time_stats_t slot_indication_stats; time_stats_t schedule_response_stats; - time_stats_t ulsch_decoding_stats; time_stats_t ulsch_ldpc_decoding_stats; time_stats_t ulsch_deinterleaving_stats; time_stats_t ulsch_channel_estimation_stats; diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 26cfbaa034..2c8935f007 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -401,7 +401,6 @@ static int nr_ulsch_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int //--------------------- ULSCH decoding --------------------- //---------------------------------------------------------- - start_meas(&gNB->ulsch_decoding_stats); int nbDecode = nr_ulsch_decoding(gNB, ULSCH_id, gNB->pusch_vars[ULSCH_id].llr, frame_parms, pusch_pdu, frame_rx, slot_rx, harq_pid, G); @@ -949,7 +948,6 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) delNotifiedFIFO_elt(req); totalDecode--; } - stop_meas(&gNB->ulsch_decoding_stats); for (int i = 0; i < gNB->max_nb_srs; i++) { NR_gNB_SRS_t *srs = &gNB->srs[i]; if (srs) { diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index 05e8fa8e22..0e64d837e0 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -922,7 +922,6 @@ int main(int argc, char *argv[]) reset_meas(&gNB->rx_pusch_stats); reset_meas(&gNB->rx_pusch_init_stats); reset_meas(&gNB->rx_pusch_symbol_processing_stats); - reset_meas(&gNB->ulsch_decoding_stats); reset_meas(&gNB->ulsch_channel_estimation_stats); reset_meas(&UE->ulsch_ldpc_encoding_stats); reset_meas(&UE->ulsch_rate_matching_stats); @@ -1547,7 +1546,6 @@ int main(int argc, char *argv[]) printStatIndent2(&gNB->ulsch_channel_estimation_stats, "ULSCH channel estimation time"); printStatIndent2(&gNB->rx_pusch_init_stats, "RX PUSCH Initialization time"); printStatIndent2(&gNB->rx_pusch_symbol_processing_stats, "RX PUSCH Symbol Processing time"); - printStatIndent(&gNB->ulsch_decoding_stats,"ULSCH total decoding time"); printf("\nUE TX\n"); printStatIndent(&UE->ulsch_encoding_stats,"ULSCH total encoding time"); From f3bba45bfe6442303ca248efedd7d450a26b2c39 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Thu, 8 Feb 2024 22:22:45 +0100 Subject: [PATCH 12/14] Update some timing stats --- ci-scripts/datalog_rt_stats.100.2x2.yaml | 14 +++++++------- ci-scripts/datalog_rt_stats.1x1.60.yaml | 16 ++++++++-------- ci-scripts/datalog_rt_stats.2x2.yaml | 14 +++++++------- ci-scripts/datalog_rt_stats.60.2x2.yaml | 18 +++++++++--------- ci-scripts/datalog_rt_stats.default.yaml | 16 ++++++++-------- 5 files changed, 39 insertions(+), 39 deletions(-) diff --git a/ci-scripts/datalog_rt_stats.100.2x2.yaml b/ci-scripts/datalog_rt_stats.100.2x2.yaml index e6c6a374e9..31da78e5ea 100644 --- a/ci-scripts/datalog_rt_stats.100.2x2.yaml +++ b/ci-scripts/datalog_rt_stats.100.2x2.yaml @@ -1,7 +1,7 @@ #this is a configuration file #used to build real time processing statistics #for 5G NR phy test (gNB terminate) -Title : Processing Time (us) +Title : Processing Time (us) from datalog_rt_stats.100.2x2.yaml ColNames : - Metric - Average; Max; Count @@ -11,13 +11,13 @@ Ref : feptx_prec : 0.0 feptx_ofdm : 65.0 feptx_total : 177.0 - L1 Tx processing : 560.0 + L1 Tx processing : 700.0 DLSCH encoding : 179.0 L1 Rx processing : 526.0 PUSCH inner-receiver : 400.0 - Schedule Response : 1.0 + Schedule Response : 3.0 DL & UL scheduling timing : 15.0 - UL Indication : 1.0 + UL Indication : 3.0 Slot Indication : 17.0 DeviationThreshold : feprx : 0.25 @@ -28,7 +28,7 @@ DeviationThreshold : DLSCH encoding : 0.25 L1 Rx processing : 0.25 PUSCH inner-receiver : 0.25 - Schedule Response : 0.25 + Schedule Response : 1.00 DL & UL scheduling timing : 0.25 - UL Indication : 0.25 - Slot Indication : 0.25 + UL Indication : 1.00 + Slot Indication : 0.50 diff --git a/ci-scripts/datalog_rt_stats.1x1.60.yaml b/ci-scripts/datalog_rt_stats.1x1.60.yaml index 09a2980688..9ad2e848e8 100644 --- a/ci-scripts/datalog_rt_stats.1x1.60.yaml +++ b/ci-scripts/datalog_rt_stats.1x1.60.yaml @@ -1,7 +1,7 @@ #this is a configuration file #used to build real time processing statistics #for 5G NR phy test (gNB terminate) -Title : Processing Time (us) +Title : Processing Time (us) from datalog_rt_stats.1x1.60.yaml ColNames : - Metric - Average; Max; Count @@ -15,10 +15,10 @@ Ref : DLSCH encoding : 137.0 L1 Rx processing : 345.0 PUSCH inner-receiver : 210.0 - Schedule Response : 48.0 - DL & UL scheduling timing : 13.0 + Schedule Response : 3.0 + DL & UL scheduling timing : 8.0 UL Indication : 3.0 - Slot Indication : 60.0 + Slot Indication : 8.0 DeviationThreshold : feprx : 0.25 feptx_prec : 0.25 @@ -28,7 +28,7 @@ DeviationThreshold : DLSCH encoding : 0.25 L1 Rx processing : 0.25 PUSCH inner-receiver : 0.25 - Schedule Response : 0.25 - DL & UL scheduling timing : 0.25 - UL Indication : 0.25 - Slot Indication : 0.25 + Schedule Response : 1.00 + DL & UL scheduling timing : 0.50 + UL Indication : 1.00 + Slot Indication : 0.50 diff --git a/ci-scripts/datalog_rt_stats.2x2.yaml b/ci-scripts/datalog_rt_stats.2x2.yaml index 99a442c80a..7d489c171e 100644 --- a/ci-scripts/datalog_rt_stats.2x2.yaml +++ b/ci-scripts/datalog_rt_stats.2x2.yaml @@ -1,7 +1,7 @@ #this is a configuration file #used to build real time processing statistics #for 5G NR phy test (gNB terminate) -Title : Processing Time (us) +Title : Processing Time (us) from datalog_rt_stats.2x2.yaml ColNames : - Metric - Average; Max; Count @@ -15,10 +15,10 @@ Ref : DLSCH encoding : 230.0 L1 Rx processing : 175.0 PUSCH inner-receiver : 100.0 - Schedule Response : 111.0 - DL & UL scheduling timing : 37.0 + Schedule Response : 3.0 + DL & UL scheduling timing : 11.0 UL Indication : 3.0 - Slot Indication : 38.0 + Slot Indication : 14.0 DeviationThreshold : feprx : 0.25 feptx_prec : 0.25 @@ -28,7 +28,7 @@ DeviationThreshold : DLSCH encoding : 0.25 L1 Rx processing : 0.25 PUSCH inner-receiver : 0.25 - Schedule Response : 0.25 - DL & UL scheduling timing : 0.25 - UL Indication : 0.25 + Schedule Response : 1.00 + DL & UL scheduling timing : 0.50 + UL Indication : 1.00 Slot Indication : 0.25 diff --git a/ci-scripts/datalog_rt_stats.60.2x2.yaml b/ci-scripts/datalog_rt_stats.60.2x2.yaml index d352f8ab28..6a5600a9d1 100644 --- a/ci-scripts/datalog_rt_stats.60.2x2.yaml +++ b/ci-scripts/datalog_rt_stats.60.2x2.yaml @@ -1,7 +1,7 @@ #this is a configuration file #used to build real time processing statistics #for 5G NR phy test (gNB terminate) -Title : Processing Time (us) +Title : Processing Time (us) from datalog_rt_stats.60.2x2.yaml ColNames : - Metric - Average; Max; Count @@ -15,10 +15,10 @@ Ref : DLSCH encoding : 177.0 L1 Rx processing : 345.0 PUSCH inner-receiver : 210.0 - Schedule Response : 111.0 - DL & UL scheduling timing : 20.0 - UL Indication : 5.0 - Slot Indication : 127.0 + Schedule Response : 3.0 + DL & UL scheduling timing : 13.0 + UL Indication : 3.0 + Slot Indication : 15.0 DeviationThreshold : feprx : 0.25 feptx_prec : 0.25 @@ -28,7 +28,7 @@ DeviationThreshold : DLSCH encoding : 0.25 L1 Rx processing : 0.25 PUSCH inner-receiver : 0.25 - Schedule Response : 0.25 - DL & UL scheduling timing : 0.25 - UL Indication : 0.25 - Slot Indication : 0.25 + Schedule Response : 1.00 + DL & UL scheduling timing : 0.35 + UL Indication : 1.00 + Slot Indication : 0.35 diff --git a/ci-scripts/datalog_rt_stats.default.yaml b/ci-scripts/datalog_rt_stats.default.yaml index e19833434d..a561817cf2 100644 --- a/ci-scripts/datalog_rt_stats.default.yaml +++ b/ci-scripts/datalog_rt_stats.default.yaml @@ -1,7 +1,7 @@ #this is a configuration file #used to build real time processing statistics #for 5G NR phy test (gNB terminate) -Title : Processing Time (us) +Title : Processing Time (us) from datalog_rt_stats.default.yaml ColNames : - Metric - Average; Max; Count @@ -15,10 +15,10 @@ Ref : DLSCH encoding : 118.0 L1 Rx processing : 305.0 PUSCH inner-receiver : 150.0 - Schedule Response : 30.0 - DL & UL scheduling timing : 10.0 + Schedule Response : 3.0 + DL & UL scheduling timing : 6.0 UL Indication : 3.0 - Slot Indication : 40.0 + Slot Indication : 7.0 DeviationThreshold : feprx : 0.25 feptx_prec : 0.25 @@ -28,7 +28,7 @@ DeviationThreshold : DLSCH encoding : 0.25 L1 Rx processing : 0.25 PUSCH inner-receiver : 0.25 - Schedule Response : 0.25 - DL & UL scheduling timing : 0.25 - UL Indication : 0.25 - Slot Indication : 0.25 + Schedule Response : 1.00 + DL & UL scheduling timing : 0.50 + UL Indication : 1.00 + Slot Indication : 0.50 From 0a1651e45c16489880153ead0ef666d084ef070b Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Mon, 12 Feb 2024 18:15:04 +0100 Subject: [PATCH 13/14] Periodically check for stats freeing to prevent assert Not periodically checking stats freeing can lead to asserts if these lists are full. Check it once a frame to ensure that lists remain non-empty. --- executables/nr-gnb.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c index e7f92a054c..c66123112f 100644 --- a/executables/nr-gnb.c +++ b/executables/nr-gnb.c @@ -131,6 +131,11 @@ static void tx_func(void *param) T(T_GNB_PHY_DL_TICK, T_INT(gNB->Mod_id), T_INT(frame_tx), T_INT(slot_tx)); + if (slot_rx == 0) { + reset_active_stats(gNB, frame_rx); + reset_active_ulsch(gNB, frame_rx); + } + start_meas(&gNB->slot_indication_stats); ifi->NR_slot_indication(module_id, CC_id, frame_tx, slot_tx); stop_meas(&gNB->slot_indication_stats); From c33a308dfffa575314565739ff99e6e82768c850 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Mon, 12 Feb 2024 18:17:28 +0100 Subject: [PATCH 14/14] Remove comments on L1_tx_thread_core param: is merged --- .../CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf | 2 +- .../CONF/gnb.sa.band78.273prb.fhi72.4x2-benetel650.conf | 2 +- .../CONF/gnb.sa.band78.273prb.fhi72.4x4-liteon.conf | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf index 1e377e5664..2f7d8a4e65 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf @@ -217,7 +217,7 @@ L1s = ( #thread_pool_size = 8; tx_amp_backoff_dB = 3; L1_rx_thread_core = 8; - L1_tx_thread_core = 10; # relevant after merge of l1_tx_thread + L1_tx_thread_core = 10; phase_compensation = 0; # needs to match O-RU configuration } ); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x2-benetel650.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x2-benetel650.conf index c362f05ac1..5bb618bb1e 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x2-benetel650.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x2-benetel650.conf @@ -214,7 +214,7 @@ L1s = ( max_ldpc_iterations = 10; tx_amp_backoff_dB = 20; # needs to match O-RU configuration L1_rx_thread_core = 8; - L1_tx_thread_core = 10; # relevant after merge of l1_tx_thread + L1_tx_thread_core = 10; phase_compensation = 0; # needs to match O-RU configuration } ); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-liteon.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-liteon.conf index 5de3d3a4b5..b1b05c1c4b 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-liteon.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-liteon.conf @@ -215,7 +215,7 @@ L1s = ( max_ldpc_iterations = 10; tx_amp_backoff_dB = 20; # needs to match O-RU configuration L1_rx_thread_core = 8; - L1_tx_thread_core = 10; # relevant after merge of l1_tx_thread + L1_tx_thread_core = 10; phase_compensation = 1; # needs to match O-RU configuration } );