From ec6236f8c765ff61170b7add6d9494c3d0a07eb8 Mon Sep 17 00:00:00 2001 From: "Raymond.Knopp" Date: Fri, 11 Aug 2017 01:44:22 +0200 Subject: [PATCH] tests with monolithic eNB. runs fluidly. No UE stimulus yet --- openair1/PHY/INIT/lte_init.c | 22 +- openair1/PHY/impl_defs_lte.h | 14 +- openair2/LAYER2/MAC/eNB_scheduler.c | 757 +----------------- openair2/LAYER2/MAC/eNB_scheduler_RA.c | 2 +- .../LAYER2/MAC/eNB_scheduler_primitives.c | 2 +- openair2/LAYER2/MAC/proto.h | 23 +- targets/RT/USER/lte-enb.c | 40 +- targets/RT/USER/lte-ru.c | 108 ++- targets/RT/USER/lte-softmodem.c | 4 +- 9 files changed, 178 insertions(+), 794 deletions(-) diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index 81a8478e33..4c68021325 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -1648,9 +1648,17 @@ int phy_init_RU(RU_t *ru) { AssertFatal(ru->nb_rx <= sizeof(ru->prach_rxsigF) / sizeof(ru->prach_rxsigF[0]), "nb_antennas_rx too large"); ru->prach_rxsigF = (int16_t**)malloc(ru->nb_rx * sizeof(int16_t*)); + for (j=0;j<4;j++) ru->prach_rxsigF_br[j] = (int16_t**)malloc(ru->nb_rx * sizeof(int16_t*)); + for (i=0; inb_rx; i++) { ru->prach_rxsigF[i] = (int16_t*)malloc16_clear( fp->ofdm_symbol_size*12*2*sizeof(int16_t) ); LOG_D(PHY,"[INIT] prach_vars->rxsigF[%d] = %p\n",i,ru->prach_rxsigF[i]); +#ifdef Rel14 + for (j=0;j<4;j++) { + ru->prach_rxsigF_br[j][i] = (int16_t*)malloc16_clear( fp->ofdm_symbol_size*12*2*sizeof(int16_t) ); + LOG_D(PHY,"[INIT] prach_vars_br->rxsigF[%d] = %p\n",i,ru->prach_rxsigF_br[j][i]); + } +#endif } for (i=0; iprachF = (int16_t*)malloc16_clear( 1024*2*sizeof(int16_t) ); // assume maximum of 64 RX antennas for PRACH receiver - prach_vars->prach_ifft = (int16_t***)malloc16_clear(4*sizeof(int32_t**)); - prach_vars->prach_ifft[0] = (int16_t**)malloc16_clear(2*sizeof(int32_t*)); - prach_vars->prach_ifft[0][0] = (int16_t*)malloc16_clear(1024*2*sizeof(int32_t)); - + prach_vars->prach_ifft[0] = (int32_t**)malloc16_clear(64*sizeof(int32_t*)); + for (i=0;i<64;i++) prach_vars->prach_ifft[0][i] = (int32_t*)malloc16_clear(1024*2*sizeof(int32_t)); + + prach_vars->rxsigF[0] = (int16_t**)malloc16_clear(64*sizeof(int16_t*)); // PRACH BR #ifdef Rel14 prach_vars_br->prachF = (int16_t*)malloc16_clear( 1024*2*sizeof(int32_t) ); // assume maximum of 64 RX antennas for PRACH receiver - prach_vars_br->prach_ifft = (int32_t***)malloc16_clear(4*sizeof(int32_t**)); for (int ce_level=0;ce_level<4;ce_level++) { - prach_vars_br->prach_ifft[ce_level] = (int32_t**)malloc16_clear(64*sizeof(int32_t*)); - for (i=0; i<64; i++) prach_vars_br->prach_ifft[ce_level][i] = (int32_t*)malloc16_clear(1024*2*sizeof(int32_t)); + prach_vars_br->prach_ifft[ce_level] = (int32_t**)malloc16_clear(64*sizeof(int32_t*)); + for (i=0;i<64;i++) prach_vars_br->prach_ifft[ce_level][i] = (int32_t*)malloc16_clear(1024*2*sizeof(int32_t)); + prach_vars->rxsigF[ce_level] = (int16_t**)malloc16_clear(64*sizeof(int16_t*)); } #endif diff --git a/openair1/PHY/impl_defs_lte.h b/openair1/PHY/impl_defs_lte.h index c0810f49f8..fea33a7707 100644 --- a/openair1/PHY/impl_defs_lte.h +++ b/openair1/PHY/impl_defs_lte.h @@ -1182,13 +1182,15 @@ typedef struct { /// first index: ? [0..1023] (hard coded) int16_t *prachF; /// \brief ?. - /// first index: rx antenna [0..63] (hard coded) \note Hard coded array size indexed by \c nb_antennas_rx. - /// second index: ? [0..ofdm_symbol_size*12[ - int16_t **rxsigF; + /// first index: ce_level [0..3] + /// second index: rx antenna [0..63] (hard coded) \note Hard coded array size indexed by \c nb_antennas_rx. + /// third index: frequency-domain sample [0..ofdm_symbol_size*12[ + int16_t **rxsigF[4]; /// \brief local buffer to compute prach_ifft (necessary in case of multiple CCs) - /// first index: rx antenna [0..63] (hard coded) \note Hard coded array size indexed by \c nb_antennas_rx. - /// second index: ? [0..2047] (hard coded) - int32_t ***prach_ifft; + /// first index: ce_level [0..3] (hard coded) \note Hard coded array size indexed by \c nb_antennas_rx. + /// second index: ? [0..63] (hard coded) + /// third index: ? [0..63] (hard coded) + int32_t **prach_ifft[4]; /// repetition number #ifdef Rel14 diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c index e9dcec4b21..7e6e2b67c9 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler.c +++ b/openair2/LAYER2/MAC/eNB_scheduler.c @@ -130,6 +130,32 @@ void check_ul_failure(module_id_t module_idP,int CC_id,int UE_id, } +void clear_nfapi_information(eNB_MAC_INST *eNB,int CC_idP,frame_t frameP,sub_frame_t subframeP); + +void clear_nfapi_information(eNB_MAC_INST *eNB,int CC_idP,frame_t frameP,sub_frame_t subframeP) { + + nfapi_dl_config_request_t *DL_req = &eNB->DL_req[0]; + nfapi_ul_config_request_t *UL_req = &eNB->UL_req[0]; + nfapi_hi_dci0_request_t *HI_DCI0_req = &eNB->HI_DCI0_req[0]; + nfapi_tx_request_t *TX_req = &eNB->TX_req[0]; + + eNB->pdu_index[CC_idP] = 0; + DL_req[CC_idP].dl_config_request_body.number_pdcch_ofdm_symbols = 1; + DL_req[CC_idP].dl_config_request_body.number_dci = 0; + DL_req[CC_idP].dl_config_request_body.number_pdu = 0; + DL_req[CC_idP].dl_config_request_body.number_pdsch_rnti = 0; + DL_req[CC_idP].dl_config_request_body.transmission_power_pcfich = 6000; + + HI_DCI0_req[CC_idP].hi_dci0_request_body.sfnsf = subframeP + (frameP<<3); + HI_DCI0_req[CC_idP].hi_dci0_request_body.number_of_dci = 0; + + UL_req[CC_idP].ul_config_request_body.number_of_pdus = 0; + UL_req[CC_idP].ul_config_request_body.rach_prach_frequency_resources = 0; // ignored, handled by PHY for now + UL_req[CC_idP].ul_config_request_body.srs_present = 0; // ignored, handled by PHY for now + TX_req[CC_idP].tx_request_body.number_of_pdus = 0; + +} + void eNB_dlsch_ulsch_scheduler(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) { @@ -147,10 +173,7 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP, frame_t frameP, sub_frame rnti_t rnti; COMMON_channels_t *cc = RC.mac[module_idP]->common_channels; - nfapi_dl_config_request_t *DL_req = &RC.mac[module_idP]->DL_req[0]; - nfapi_ul_config_request_t *UL_req = &RC.mac[module_idP]->UL_req[0]; - nfapi_hi_dci0_request_t *HI_DCI0_req = &RC.mac[module_idP]->HI_DCI0_req[0]; - nfapi_tx_request_t *TX_req = &RC.mac[module_idP]->TX_req[0]; + eNB_UE_STATS *eNB_UE_stats; #if defined(FLEXRAN_AGENT_SB_IF) Protocol__FlexranMessage *msg; @@ -168,21 +191,8 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP, frame_t frameP, sub_frame memset(cc[CC_id].vrb_map,0,100); // clear DL/UL info for new scheduling round + clear_nfapi_information(RC.mac[module_idP],CC_id,frameP,subframeP); - RC.mac[module_idP]->pdu_index[CC_id] = 0; - DL_req[CC_id].dl_config_request_body.number_pdcch_ofdm_symbols = 1; - DL_req[CC_id].dl_config_request_body.number_dci = 0; - DL_req[CC_id].dl_config_request_body.number_pdu = 0; - DL_req[CC_id].dl_config_request_body.number_pdsch_rnti = 0; - DL_req[CC_id].dl_config_request_body.transmission_power_pcfich = 6000; - - HI_DCI0_req[CC_id].hi_dci0_request_body.sfnsf = subframeP + (frameP<<3); - HI_DCI0_req[CC_id].hi_dci0_request_body.number_of_dci = 0; - - UL_req[CC_id].ul_config_request_body.number_of_pdus = 0; - UL_req[CC_id].ul_config_request_body.rach_prach_frequency_resources = 0; // ignored, handled by PHY for now - UL_req[CC_id].ul_config_request_body.srs_present = 0; // ignored, handled by PHY for now - TX_req[CC_id].tx_request_body.number_of_pdus = 0; #if defined(Rel10) || defined(Rel14) cc[CC_id].mcch_active =0; #endif @@ -310,719 +320,18 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP, frame_t frameP, sub_frame // This schedules MIB if ((subframeP==0) && (frameP&3) == 0) schedule_mib(module_idP,frameP,subframeP); - // This schedules SI for LTE and eMTC + // This schedules SI for legacy LTE and eMTC schedule_SI(module_idP,frameP,subframeP); - // This schedules Random-Access - schedule_RA(module_idP,frameP,subframeP,1); + // This schedules Random-Access for legacy LTE and eMTC + schedule_RA(module_idP,frameP,subframeP); - // This schedules ULSCH in subframe+ + // This schedules ULSCH in subframeP+k schedule_ulsch(module_idP,frameP,subframeP); - // This schedules DLSCH in + // This schedules DLSCH in subframeP schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - /* - switch (subframeP) { - case 0: - - // FDD/TDD Schedule Downlink RA transmissions (RA response, Msg4 Contention resolution) - // Schedule ULSCH for FDD or subframeP 4 (TDD config 0,3,6) - // Schedule Normal DLSCH - - - - LOG_D(MAC,"NFAPI: number_of_pdus %d, number_of_TX_req %d\n", - DL_req[0].dl_config_request_body.number_pdu, - TX_req[0].tx_request_body.number_of_pdus); - - if (cc[0].tdd_Config == NULL) { //FDD - schedule_ulsch(module_idP,frameP,cooperation_flag,0,4);//,calibration_flag); - } else if ((cc[0].tdd_Config->subframeAssignment == 0) || - (cc[0].tdd_Config->subframeAssignment == 3) || - (cc[0].tdd_Config->subframeAssignment == 6)) { - schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,4);//,calibration_flag); - } -#ifndef FLEXRAN_AGENT_SB_IF - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); -#else - if (mac_agent_registered[module_idP]) { - agent_mac_xface[module_idP]->flexran_agent_schedule_ue_spec( - module_idP, - frameP, - subframeP, - mbsfn_status, - &msg); - - flexran_apply_dl_scheduling_decisions(module_idP, - frameP, - subframeP, - mbsfn_status, - msg); - flexran_agent_mac_destroy_dl_config(msg); - } -#endif - break; - - case 1: - - // TDD, schedule UL for subframeP 7 (TDD config 0,1) / subframeP 8 (TDD Config 6) - // FDD, schedule normal UL/DLSCH - if (cc[0].tdd_Config != NULL) { // TDD - switch (cc[0].tdd_Config->subframeAssignment) { - case 0: - case 1: - schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,7); -#ifndef FLEXRAN_AGENT_SB_IF - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); -#endif - break; - - case 6: - schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,8); -#ifndef FLEXRAN_AGENT_SB_IF - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); -#endif - break; - - default: - break; - } - } else { //FDD - schedule_ulsch(module_idP,frameP,cooperation_flag,1,5); -#ifndef FLEXRAN_AGENT_SB_IF - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); -#else - if (mac_agent_registered[module_idP]) { - agent_mac_xface[module_idP]->flexran_agent_schedule_ue_spec( - module_idP, - frameP, - subframeP, - mbsfn_status, - &msg); - - flexran_apply_dl_scheduling_decisions(module_idP, - frameP, - subframeP, - mbsfn_status, - msg); - flexran_agent_mac_destroy_dl_config(msg); - } -#endif - } - - break; - - case 2: - - // TDD, nothing - // FDD, normal UL/DLSCH - if (cc[0].tdd_Config == NULL) { //FDD - schedule_ulsch(module_idP,frameP,cooperation_flag,2,6); -#ifndef FLEXRAN_AGENT_SB_IF - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); -#else - if (mac_agent_registered[module_idP]) { - agent_mac_xface[module_idP]->flexran_agent_schedule_ue_spec( - module_idP, - frameP, - subframeP, - mbsfn_status, - &msg); - - flexran_apply_dl_scheduling_decisions(module_idP, - frameP, - subframeP, - mbsfn_status, - msg); - flexran_agent_mac_destroy_dl_config(msg); - } -#endif - } - - break; - - case 3: - - // TDD Config 2, ULSCH for subframeP 7 - // TDD Config 2/5 normal DLSCH - // FDD, normal UL/DLSCH - if (cc[0].tdd_Config != NULL) { - switch (cc[0].tdd_Config->subframeAssignment) { - case 2: - schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,7); - - // no break here! - case 5: -#ifndef FLEXRAN_AGENT_SB_IF - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); -#else - if (mac_agent_registered[module_idP]) { - agent_mac_xface[module_idP]->flexran_agent_schedule_ue_spec( - module_idP, - frameP, - subframeP, - mbsfn_status, - &msg); - - flexran_apply_dl_scheduling_decisions(module_idP, - frameP, - subframeP, - mbsfn_status, - msg); - flexran_agent_mac_destroy_dl_config(msg); - } -#endif - break; - - default: - break; - } - } else { //FDD - - schedule_ulsch(module_idP,frameP,cooperation_flag,3,7); -#ifndef FLEXRAN_AGENT_SB_IF - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); -#else - if (mac_agent_registered[module_idP]) { - agent_mac_xface[module_idP]->flexran_agent_schedule_ue_spec( - module_idP, - frameP, - subframeP, - mbsfn_status, - &msg); - - flexran_apply_dl_scheduling_decisions(module_idP, - frameP, - subframeP, - mbsfn_status, - msg); - flexran_agent_mac_destroy_dl_config(msg); - } -#endif - } - - break; - - case 4: - - // TDD Config 1, ULSCH for subframeP 8 - // TDD Config 1/2/4/5 DLSCH - // FDD UL/DLSCH - if (cc[0].tdd_Config != NULL) { // TDD - switch (cc[0].tdd_Config->subframeAssignment) { - case 1: - schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,8); - - // no break here! - case 2: - - // no break here! - case 4: - - // no break here! - case 5: -#ifndef FLEXRAN_AGENT_SB_IF - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); -#else - if (mac_agent_registered[module_idP]) { - agent_mac_xface[module_idP]->flexran_agent_schedule_ue_spec( - module_idP, - frameP, - subframeP, - mbsfn_status, - &msg); - - flexran_apply_dl_scheduling_decisions(module_idP, - frameP, - subframeP, - mbsfn_status, - msg); - flexran_agent_mac_destroy_dl_config(msg); - } -#endif - break; - - default: - break; - } - } else { - if (cc[0].tdd_Config == NULL) { //FDD - - schedule_ulsch(module_idP, frameP, cooperation_flag, 4, 8); -#ifndef FLEXRAN_AGENT_SB_IF - schedule_ue_spec(module_idP, frameP, subframeP, mbsfn_status); - fill_DLSCH_dci(module_idP, frameP, subframeP, mbsfn_status); -#else - if (mac_agent_registered[module_idP]) { - agent_mac_xface[module_idP]->flexran_agent_schedule_ue_spec( - module_idP, - frameP, - subframeP, - mbsfn_status, - &msg); - - flexran_apply_dl_scheduling_decisions(module_idP, - frameP, - subframeP, - mbsfn_status, - msg); - flexran_agent_mac_destroy_dl_config(msg); - } -#endif - } - } - - break; - - case 5: - // TDD/FDD Schedule SI - // TDD Config 0,6 ULSCH for subframes 9,3 resp. - // TDD normal DLSCH - // FDD normal UL/DLSCH - - - if (cc[0].tdd_Config == NULL) { - schedule_ulsch(module_idP,frameP,cooperation_flag,5,9); -#ifndef FLEXRAN_AGENT_SB_IF - schedule_ue_spec(module_idP, frameP, subframeP, mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); -#else - if (mac_agent_registered[module_idP]) { - agent_mac_xface[module_idP]->flexran_agent_schedule_ue_spec( - module_idP, - frameP, - subframeP, - mbsfn_status, - &msg); - - flexran_apply_dl_scheduling_decisions(module_idP, - frameP, - subframeP, - mbsfn_status, - msg); - flexran_agent_mac_destroy_dl_config(msg); - } -#endif - } else if ((cc[0].tdd_Config->subframeAssignment == 0) || // TDD Config 0 - (cc[0].tdd_Config->subframeAssignment == 6)) { // TDD Config 6 - //schedule_ulsch(module_idP,cooperation_flag,subframeP); -#ifndef FLEXRAN_AGENT_SB_IF - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); -#endif - } else { -#ifndef FLEXRAN_AGENT_SB_IF - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); -#else - if (mac_agent_registered[module_idP]) { - agent_mac_xface[module_idP]->flexran_agent_schedule_ue_spec( - module_idP, - frameP, - subframeP, - mbsfn_status, - &msg); - - flexran_apply_dl_scheduling_decisions(module_idP, - frameP, - subframeP, - mbsfn_status, - msg); - flexran_agent_mac_destroy_dl_config(msg); - } -#endif - } - - break; - - case 6: - - // TDD Config 0,1,6 ULSCH for subframes 2,3 - // TDD Config 3,4,5 Normal DLSCH - // FDD normal ULSCH/DLSCH - if (cc[0].tdd_Config != NULL) { // TDD - switch (cc[0].tdd_Config->subframeAssignment) { - case 0: - break; - - case 1: - schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,2); - // schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); -#ifndef FLEXRAN_AGENT_SB_IF - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); -#endif - break; - - case 6: - schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3); - // schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); -#ifndef FLEXRAN_AGENT_SB_IF - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); -#endif - break; - - case 5: -#ifndef FLEXRAN_AGENT_SB_IF - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); -#else - if (mac_agent_registered[module_idP]) { - agent_mac_xface[module_idP]->flexran_agent_schedule_ue_spec( - module_idP, - frameP, - subframeP, - mbsfn_status, - &msg); - - flexran_apply_dl_scheduling_decisions(module_idP, - frameP, - subframeP, - mbsfn_status, - msg); - flexran_agent_mac_destroy_dl_config(msg); - } -#endif - break; - - case 3: - case 4: -#ifndef FLEXRAN_AGENT_SB_IF - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); -#else - if (mac_agent_registered[module_idP]) { - agent_mac_xface[module_idP]->flexran_agent_schedule_ue_spec( - module_idP, - frameP, - subframeP, - mbsfn_status, - &msg); - - flexran_apply_dl_scheduling_decisions(module_idP, - frameP, - subframeP, - mbsfn_status, - msg); - flexran_agent_mac_destroy_dl_config(msg); - } -#endif - break; - - default: - break; - } - } else { //FDD - schedule_ulsch(module_idP,frameP,cooperation_flag,6,0); -#ifndef FLEXRAN_AGENT_SB_IF - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); -#else - if (mac_agent_registered[module_idP]) { - agent_mac_xface[module_idP]->flexran_agent_schedule_ue_spec( - module_idP, - frameP, - subframeP, - mbsfn_status, - &msg); - - flexran_apply_dl_scheduling_decisions(module_idP, - frameP, - subframeP, - mbsfn_status, - msg); - flexran_agent_mac_destroy_dl_config(msg); - } -#endif - } - - break; - - case 7: - - // TDD Config 3,4,5 Normal DLSCH - // FDD Normal UL/DLSCH - if (cc[0].tdd_Config != NULL) { // TDD - switch (cc[0].tdd_Config->subframeAssignment) { - case 3: - case 4: -#ifndef FLEXRAN_AGENT_SB_IF - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); -#else - if (mac_agent_registered[module_idP]) { - agent_mac_xface[module_idP]->flexran_agent_schedule_ue_spec( - module_idP, - frameP, - subframeP, - mbsfn_status, - &msg); - - flexran_apply_dl_scheduling_decisions(module_idP, - frameP, - subframeP, - mbsfn_status, - msg); - flexran_agent_mac_destroy_dl_config(msg); - } -#endif - break; - - case 5: -#ifndef FLEXRAN_AGENT_SB_IF - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); -#else - if (mac_agent_registered[module_idP]) { - agent_mac_xface[module_idP]->flexran_agent_schedule_ue_spec( - module_idP, - frameP, - subframeP, - mbsfn_status, - &msg); - - flexran_apply_dl_scheduling_decisions(module_idP, - frameP, - subframeP, - mbsfn_status, - msg); - flexran_agent_mac_destroy_dl_config(msg); - } -#endif - break; - - default: - break; - } - } else { //FDD - schedule_ulsch(module_idP,frameP,cooperation_flag,7,1); -#ifndef FLEXRAN_AGENT_SB_IF - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); -#else - if (mac_agent_registered[module_idP]) { - agent_mac_xface[module_idP]->flexran_agent_schedule_ue_spec( - module_idP, - frameP, - subframeP, - mbsfn_status, - &msg); - - flexran_apply_dl_scheduling_decisions(module_idP, - frameP, - subframeP, - mbsfn_status, - msg); - flexran_agent_mac_destroy_dl_config(msg); - } -#endif - } - - break; - - case 8: - - // TDD Config 2,3,4,5 ULSCH for subframeP 2 - // - // FDD Normal UL/DLSCH - if (cc[0].tdd_Config != NULL) { // TDD - switch (cc[0].tdd_Config->subframeAssignment) { - case 2: - case 3: - case 4: - case 5: - - schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,2); -#ifndef FLEXRAN_AGENT_SB_IF - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); -#else - if (mac_agent_registered[module_idP]) { - agent_mac_xface[module_idP]->flexran_agent_schedule_ue_spec( - module_idP, - frameP, - subframeP, - mbsfn_status, - &msg); - - flexran_apply_dl_scheduling_decisions(module_idP, - frameP, - subframeP, - mbsfn_status, - msg); - flexran_agent_mac_destroy_dl_config(msg); - } -#endif - break; - - default: - break; - } - } else { //FDD - schedule_ulsch(module_idP,frameP,cooperation_flag,8,2); -#ifndef FLEXRAN_AGENT_SB_IF - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); -#else - if (mac_agent_registered[module_idP]) { - agent_mac_xface[module_idP]->flexran_agent_schedule_ue_spec( - module_idP, - frameP, - subframeP, - mbsfn_status, - &msg); - - flexran_apply_dl_scheduling_decisions(module_idP, - frameP, - subframeP, - mbsfn_status, - msg); - flexran_agent_mac_destroy_dl_config(msg); - } -#endif - } - - break; - - case 9: - - // TDD Config 1,3,4,6 ULSCH for subframes 3,3,3,4 - if (cc[0].tdd_Config != NULL) { - switch (cc[0].tdd_Config->subframeAssignment) { - case 1: - schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3); -#ifndef FLEXRAN_AGENT_SB_IF - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); -#else - if (mac_agent_registered[module_idP]) { - agent_mac_xface[module_idP]->flexran_agent_schedule_ue_spec( - module_idP, - frameP, - subframeP, - mbsfn_status, - &msg); - - flexran_apply_dl_scheduling_decisions(module_idP, - frameP, - subframeP, - mbsfn_status, - msg); - flexran_agent_mac_destroy_dl_config(msg); - } -#endif - break; - - case 3: - case 4: - schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3); -#ifndef FLEXRAN_AGENT_SB_IF - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); -#else - if (mac_agent_registered[module_idP]) { - agent_mac_xface[module_idP]->flexran_agent_schedule_ue_spec( - module_idP, - frameP, - subframeP, - mbsfn_status, - &msg); - - flexran_apply_dl_scheduling_decisions(module_idP, - frameP, - subframeP, - mbsfn_status, - msg); - flexran_agent_mac_destroy_dl_config(msg); - } -#endif - break; - - case 6: - schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,4); -#ifndef FLEXRAN_AGENT_SB_IF - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); -#else - if (mac_agent_registered[module_idP]) { - agent_mac_xface[module_idP]->flexran_agent_schedule_ue_spec( - module_idP, - frameP, - subframeP, - mbsfn_status, - &msg); - - flexran_apply_dl_scheduling_decisions(module_idP, - frameP, - subframeP, - mbsfn_status, - msg); - flexran_agent_mac_destroy_dl_config(msg); - } -#endif - break; - - case 2: - case 5: -#ifndef FLEXRAN_AGENT_SB_IF - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); -#else - if (mac_agent_registered[module_idP]) { - agent_mac_xface[module_idP]->flexran_agent_schedule_ue_spec( - module_idP, - frameP, - subframeP, - mbsfn_status, - &msg); - - flexran_apply_dl_scheduling_decisions(module_idP, - frameP, - subframeP, - mbsfn_status, - msg); - flexran_agent_mac_destroy_dl_config(msg); - } -#endif - break; - - default: - break; - } - } else { //FDD - schedule_ulsch(module_idP,frameP,cooperation_flag,9,3); -#ifndef FLEXRAN_AGENT_SB_IF - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); -#else - if (mac_agent_registered[module_idP]) { - agent_mac_xface[module_idP]->flexran_agent_schedule_ue_spec( - module_idP, - frameP, - subframeP, - mbsfn_status, - &msg); - - flexran_apply_dl_scheduling_decisions(module_idP, - frameP, - subframeP, - mbsfn_status, - msg); - flexran_agent_mac_destroy_dl_config(msg); - } -#endif - } - - break; - - } - */ - // Allocate CCEs and Msg3 for good after scheduling is done for (CC_id=0;CC_idsingle_thread_flag==0) { + proc_rxtx[0].instance_cnt_rxtx = 0; // FIXME data race! + proc_rxtx[1].instance_cnt_rxtx = 0; // FIXME data race! + pthread_cond_signal( &proc_rxtx[0].cond_rxtx ); + pthread_cond_signal( &proc_rxtx[1].cond_rxtx ); + } proc->instance_cnt_prach = 0; - pthread_cond_signal( &proc_rxtx[0].cond_rxtx ); - pthread_cond_signal( &proc_rxtx[1].cond_rxtx ); pthread_cond_signal( &proc->cond_prach ); pthread_cond_broadcast(&sync_phy_proc.cond_phy_proc_tx); pthread_join( proc->pthread_prach, (void**)&status ); + LOG_I(PHY, "Destroying prach mutex/cond\n"); pthread_mutex_destroy( &proc->mutex_prach ); pthread_cond_destroy( &proc->cond_prach ); #ifdef Rel14 + proc->instance_cnt_prach_br = 0; pthread_cond_signal( &proc->cond_prach_br ); pthread_join( proc->pthread_prach_br, (void**)&status ); pthread_mutex_destroy( &proc->mutex_prach_br ); pthread_cond_destroy( &proc->cond_prach_br ); #endif + LOG_I(PHY, "Destroying UL_INFO mutex\n"); pthread_mutex_destroy(&eNB->UL_INFO_mutex); int i; - for (i=0;i<2;i++) { - pthread_join( proc_rxtx[i].pthread_rxtx, (void**)&status ); - pthread_mutex_destroy( &proc_rxtx[i].mutex_rxtx ); - pthread_cond_destroy( &proc_rxtx[i].cond_rxtx ); + if (eNB->single_thread_flag==0) { + for (i=0;i<2;i++) { + LOG_I(PHY, "Joining rxtx[%d] mutex/cond\n"); + pthread_join( proc_rxtx[i].pthread_rxtx, (void**)&status ); + LOG_I(PHY, "Destroying rxtx[%d] mutex/cond\n"); + pthread_mutex_destroy( &proc_rxtx[i].mutex_rxtx ); + pthread_cond_destroy( &proc_rxtx[i].cond_rxtx ); + } } } } @@ -854,8 +863,11 @@ void init_eNB_afterRU() { AssertFatal(eNB->num_RU>0,"Number of RU attached to eNB %d is zero\n",eNB->Mod_id); LOG_I(PHY,"Mapping RX ports from %d RUs to eNB %d\n",eNB->num_RU,eNB->Mod_id); eNB->frame_parms.nb_antennas_rx = 0; - eNB->prach_vars.rxsigF = (int16_t*)malloc16(64*sizeof(int16_t*)); - + eNB->prach_vars.rxsigF[0] = (int16_t*)malloc16(64*sizeof(int16_t*)); +#ifdef Rel14 + for (int ce_level=0;ce_level<4;ce_level++) + eNB->prach_vars_br.rxsigF[ce_level] = (int16_t*)malloc16(64*sizeof(int16_t*)); +#endif for (ru_id=0,aa=0;ru_idnum_RU;ru_id++) { eNB->frame_parms.nb_antennas_rx += eNB->RU_list[ru_id]->nb_rx; @@ -877,12 +889,6 @@ void init_eNB_afterRU() { "inst %d, CC_id %d : nb_antennas_rx %d\n",inst,CC_id,eNB->frame_parms.nb_antennas_rx); LOG_I(PHY,"inst %d, CC_id %d : nb_antennas_rx %d\n",inst,CC_id,eNB->frame_parms.nb_antennas_rx); - AssertFatal(eNB->frame_parms.nb_antennas_rx <= sizeof(eNB->prach_vars.prach_ifft) / sizeof(eNB->prach_vars.prach_ifft[0]), - "nb_antennas_rx too large"); - for (i=0; iframe_parms.nb_antennas_rx; i++) { - eNB->prach_vars.prach_ifft[i] = (int16_t*)malloc16_clear(1024*2*sizeof(int16_t)); - LOG_D(PHY,"[INIT] prach_vars->prach_ifft[%d] = %p\n",i,eNB->prach_vars.prach_ifft[i]); - } init_transport(eNB); init_precoding_weights(RC.eNB[inst][CC_id]); } diff --git a/targets/RT/USER/lte-ru.c b/targets/RT/USER/lte-ru.c index 20daeaff10..98a673ade6 100644 --- a/targets/RT/USER/lte-ru.c +++ b/targets/RT/USER/lte-ru.c @@ -133,6 +133,8 @@ int connect_rau(RU_t *ru); /*************************************************************/ /* Functions to attach and configure RRU */ +extern void wait_eNBs(); + int attach_rru(RU_t *ru) { ssize_t msg_len,len; @@ -626,7 +628,7 @@ void fh_if4p5_north_asynch_in(RU_t *ru,int *frame,int *subframe) { if ((frame_tx == 0)&&(subframe_tx == 0)) proc->frame_tx_unwrap += 1024; proc->timestamp_tx = (((frame_tx + proc->frame_tx_unwrap) * 10) + subframe_tx) * fp->samples_per_tti; - LOG_D(PHY,"RU %d/%d TST %llu, frame %d, subframe %d\n",ru->idx,0,proc->timestamp_tx,frame_tx,subframe_tx); + LOG_D(PHY,"RU %d/%d TST %llu, frame %d, subframe %d\n",ru->idx,0,(long long unsigned int)proc->timestamp_tx,frame_tx,subframe_tx); // dump VCD output for first RU in list if (ru == RC.ru[0]) { VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_RU, frame_tx ); @@ -680,33 +682,53 @@ void rx_rf(RU_t *ru,int *frame,int *subframe) { void *rxp[ru->nb_rx]; unsigned int rxs; int i; - + openair0_timestamp ts,old_ts; for (i=0; inb_rx; i++) rxp[i] = (void*)&ru->common.rxdata[i][*subframe*fp->samples_per_tti]; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); + old_ts = proc->timestamp_rx; + rxs = ru->rfdevice.trx_read_func(&ru->rfdevice, - &(proc->timestamp_rx), + &ts, rxp, fp->samples_per_tti, ru->nb_rx); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); - if (proc->first_rx == 1) + proc->timestamp_rx = ts-ru->ts_offset; + + if (rxs != fp->samples_per_tti) + LOG_E(PHY,"rx_rf: Asked for %d samples, got %d from USRP\n",fp->samples_per_tti,rxs); + + if (proc->first_rx == 1) { ru->ts_offset = proc->timestamp_rx; - - proc->frame_rx = ((proc->timestamp_rx-ru->ts_offset) / (fp->samples_per_tti*10))&1023; - proc->subframe_rx = ((proc->timestamp_rx-ru->ts_offset) / fp->samples_per_tti)%10; + proc->timestamp_rx = 0; + } + else { + if (proc->timestamp_rx - old_ts != fp->samples_per_tti) { + LOG_I(PHY,"rx_rf: rfdevice timing drift of %"PRId64" samples (ts_off %"PRId64")\n",proc->timestamp_rx - old_ts - fp->samples_per_tti,ru->ts_offset); + ru->ts_offset += (proc->timestamp_rx - old_ts - fp->samples_per_tti); + proc->timestamp_rx = ts-ru->ts_offset; + } + + } + proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; + proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; // synchronize first reception to frame 0 subframe 0 proc->timestamp_tx = proc->timestamp_rx+(4*fp->samples_per_tti); proc->subframe_tx = (proc->subframe_rx+4)%10; proc->frame_tx = (proc->subframe_rx>5) ? (proc->frame_rx+1)&1023 : proc->frame_rx; - - LOG_D(PHY,"RU %d/%d TS %llu (off %d), frame %d, subframe %d\n",ru->idx, 0, proc->timestamp_rx,ru->ts_offset,proc->frame_rx,proc->subframe_rx); + + LOG_D(PHY,"RU %d/%d TS %llu (off %d), frame %d, subframe %d\n", + ru->idx, + 0, + (unsigned long long int)proc->timestamp_rx, + (int)ru->ts_offset,proc->frame_rx,proc->subframe_rx); // dump VCD output for first RU in list if (ru == RC.ru[0]) { @@ -752,30 +774,56 @@ void tx_rf(RU_t *ru) { unsigned int txs; int i; - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_tx-ru->openair0_cfg.tx_sample_advance)&0xffffffff ); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); - // prepare tx buffer pointers - - for (i=0; inb_tx; i++) - txp[i] = (void*)&ru->common.txdata[i][proc->subframe_tx*fp->samples_per_tti]; - - txs = ru->rfdevice.trx_write_func(&ru->rfdevice, - proc->timestamp_tx-ru->openair0_cfg.tx_sample_advance, - txp, - fp->samples_per_tti, - ru->nb_tx, - 1); - - LOG_D(PHY,"[TXPATH] RU %d tx_rf, writing to TS %llu, frame %d, unwrapped_frame %d, subframe %d\n",ru->idx, - proc->timestamp_tx,proc->frame_tx,proc->frame_tx_unwrap,proc->subframe_tx,proc); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); + lte_subframe_t SF_type = subframe_select(fp,proc->subframe_tx%10); + lte_subframe_t prevSF_type = subframe_select(fp,(proc->subframe_tx+9)%10); + lte_subframe_t nextSF_type = subframe_select(fp,(proc->subframe_tx+1)%10); + if ((SF_type == SF_DL) || + (SF_type == SF_S)) { + + for (i=0; inb_tx; i++) + txp[i] = (void*)&ru->common.txdata[i][proc->subframe_tx*fp->samples_per_tti]; + + int siglen=fp->samples_per_tti,flags=1; + + if (SF_type == SF_S) { + siglen = fp->dl_symbols_in_S_subframe*(fp->ofdm_symbol_size+fp->nb_prefix_samples0); + flags=3; // end of burst + } + if ((fp->frame_type == TDD) && + (SF_type == SF_DL)&& + (prevSF_type == SF_UL) && + (nextSF_type == SF_DL)) + flags = 2; // start of burst + + if ((fp->frame_type == TDD) && + (SF_type == SF_DL)&& + (prevSF_type == SF_UL) && + (nextSF_type == SF_UL)) + flags = 4; // start of burst and end of burst (only one DL SF between two UL) + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_tx-ru->openair0_cfg.tx_sample_advance)&0xffffffff ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); + // prepare tx buffer pointers - if (txs != fp->samples_per_tti) { - LOG_E(PHY,"TX : Timeout (sent %d/%d)\n",txs, fp->samples_per_tti); - exit_fun( "problem transmitting samples" ); - } + txs = ru->rfdevice.trx_write_func(&ru->rfdevice, + proc->timestamp_tx+ru->ts_offset-ru->openair0_cfg.tx_sample_advance, + txp, + siglen, + ru->nb_tx, + flags); + + LOG_D(PHY,"[TXPATH] RU %d tx_rf, writing to TS %llu, frame %d, unwrapped_frame %d, subframe %d\n",ru->idx, + proc->timestamp_tx,proc->frame_tx,proc->frame_tx_unwrap,proc->subframe_tx,proc); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); + + + + if (txs != fp->samples_per_tti) { + LOG_E(PHY,"TX : Timeout (sent %d/%d)\n",txs, fp->samples_per_tti); + exit_fun( "problem transmitting samples" ); + } + } } diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 18a470b2e5..319465072c 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -1691,8 +1691,8 @@ int main( int argc, char **argv ) if (RC.nb_L1_inst > 0) { printf("Initializing eNB threads\n"); init_eNB(single_thread_flag,wait_for_sync); - for (inst=0;inst