diff --git a/cmake_targets/lte_noS1_build_oai/CMakeLists.txt b/cmake_targets/lte_noS1_build_oai/CMakeLists.txt index 0a6fe8ca7697d2253372851e4889f47ba6651f70..ebc39abd412476e883bb14e3f5252517ee7bdfd8 100644 --- a/cmake_targets/lte_noS1_build_oai/CMakeLists.txt +++ b/cmake_targets/lte_noS1_build_oai/CMakeLists.txt @@ -2,13 +2,13 @@ cmake_minimum_required(VERSION 2.8) set(XFORMS True) set(RRC_ASN1_VERSION "Rel10") set(ENABLE_VCD_FIFO False ) -set(RF_BOARD "EXMIMO") +set(RF_BOARD "OAI_USRP") set(ENABLE_ITTI True) set(ENABLE_USE_MME False) set(PDCP_USE_NETLINK True) set(LINK_ENB_PDCP_TO_IP_DRIVER True) set(LINK_ENB_PDCP_TO_GTPV1U False) -set(PDCP_USE_NETLINK True ) +set(PDCP_USE_NETLINK_QUEUES False) set(LINUX True) set(SECU False) set(NAS_UE False) diff --git a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c index bff1a7a8613032d83b14ac6ace99f4861ff18c88..7c6254090f20836654ee67bdec7998788dde1328 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c @@ -39,9 +39,7 @@ #include "SCHED/extern.h" #include "MAC_INTERFACE/defs.h" #include "MAC_INTERFACE/extern.h" -#ifdef USER_MODE #include <math.h> -#endif #ifdef OPENAIR2 #include "LAYER2/MAC/defs.h" @@ -296,12 +294,10 @@ int lte_sync_time_init(LTE_DL_FRAME_PARMS *frame_parms ) // LTE_UE_COMMON *com -#ifdef USER_MODE #ifdef DEBUG_PHY write_output("primary_sync0.m","psync0",primary_synch0_time,frame_parms->ofdm_symbol_size,1,1); write_output("primary_sync1.m","psync1",primary_synch1_time,frame_parms->ofdm_symbol_size,1,1); write_output("primary_sync2.m","psync2",primary_synch2_time,frame_parms->ofdm_symbol_size,1,1); -#endif #endif return (1); } @@ -310,7 +306,6 @@ int lte_sync_time_init(LTE_DL_FRAME_PARMS *frame_parms ) // LTE_UE_COMMON *com void lte_sync_time_free(void) { -#ifdef USER_MODE if (sync_corr_ue0) { msg("Freeing sync_corr_ue (%p)...\n",sync_corr_ue0); @@ -342,7 +337,6 @@ void lte_sync_time_free(void) free(primary_synch2_time); } -#endif sync_corr_ue0 = NULL; sync_corr_ue1 = NULL; sync_corr_ue2 = NULL; @@ -502,7 +496,7 @@ int lte_sync_time(int **rxdata, ///rx data in time domain sync_source,peak_pos,peak_val); -#ifdef USER_MODE + if (debug_cnt == 0) { write_output("sync_corr0_ue.m","synccorr0",sync_corr_ue0,2*length,1,2); @@ -514,7 +508,7 @@ int lte_sync_time(int **rxdata, ///rx data in time domain debug_cnt++; } -#endif + #endif @@ -574,11 +568,8 @@ int lte_sync_time_eNB(int32_t **rxdata, ///rx data in time domain //calculate dot product of primary_synch0_time and rxdata[ar][n] (ar=0..nb_ant_rx) and store the sum in temp[n]; for (ar=0; ar<frame_parms->nb_antennas_rx; ar++) { - //#ifndef USER_MODE + result = dot_product((short*)primary_synch_time, (short*) &(rxdata[ar][n]), frame_parms->ofdm_symbol_size, 15); - //#else - // result = dot_product((short*)primary_synch_time, (short*) &(rxdata[ar][n]), frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples, 12); - //#endif //((short*)sync_corr)[2*n] += ((short*) &result)[0]; //((short*)sync_corr)[2*n+1] += ((short*) &result)[1]; sync_corr_eNB[n] += abs32(result); diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c index 60f56f3b556fba24eabae8714814ec789e55aad4..24d1516bd555edfc3a08b94f9e7b5008a2b0e258 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c @@ -3714,10 +3714,10 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, }*/ if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)) { // - if (dlsch0_harq->round == 4) { + // if ((dlsch0_harq->round == 4) || ( { dlsch0_harq->round = 0; dlsch0_harq->first_tx = 1; - } + // } // if (dlsch0_harq->round == 0) // ndi = 1-dlsch0_harq->DCINdi; @@ -3731,8 +3731,15 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, dlsch0_harq->mimo_mode = frame_parms->mode1_flag == 1 ?SISO : ALAMOUTI; dlsch0_harq->dl_power_off = 1; //no power offset - //LOG_I(PHY,"UE (%x/%d): Subframe %d Format1A DCI: ndi %d, old_ndi %d (first tx %d) harq_status %d\n",dlsch[0]->rnti,harq_pid,subframe,ndi,dlsch0_harq->DCINdi, - //dlsch0_harq->first_tx,dlsch0_harq->status); + LOG_D(PHY,"UE (%x/%d): Subframe %d Format1A DCI: ndi %d, old_ndi %d (first tx %d) harq_status %d, round %d\n", + dlsch[0]->rnti, + harq_pid, + subframe, + ndi, + dlsch0_harq->DCINdi, + dlsch0_harq->first_tx, + dlsch0_harq->status, + dlsch0_harq->round); if ((ndi!=dlsch0_harq->DCINdi)|| // DCI has been toggled or this is the first transmission (dlsch0_harq->first_tx==1)) { dlsch0_harq->round = 0; @@ -3746,7 +3753,14 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, dlsch0_harq->DCINdi = ndi; dlsch0_harq->mcs = mcs; - dlsch0_harq->TBS = TBStable[get_I_TBS(mcs)][NPRB-1]; + if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)) { + dlsch0_harq->TBS = TBStable[mcs][NPRB-1]; + dlsch0_harq->Qm = 2; + } + else { + dlsch0_harq->TBS = TBStable[get_I_TBS(mcs)][NPRB-1]; + dlsch0_harq->Qm = get_Qm(mcs); + } dlsch[0]->rnti = rnti; dlsch0 = dlsch[0]; //printf("Format 1A: harq_pid %d, nb_rb %d, round %d\n",harq_pid,dlsch0_harq->nb_rb,dlsch0_harq->round); @@ -3898,6 +3912,12 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, dlsch0_harq->mcs = mcs; dlsch0_harq->TBS = TBStable[get_I_TBS(mcs)][NPRB-1]; + if (mcs <= 28) + dlsch0_harq->Qm = get_Qm(mcs); + else if (mcs<=31) + dlsch0_harq->Qm = (mcs-28)<<1; + else + LOG_E(PHY,"invalid mcs %d\n",mcs); // msg("test: MCS %d, NPRB %d, TBS %d\n",mcs,NPRB,dlsch0_harq->TBS); dlsch[0]->current_harq_pid = harq_pid; @@ -4238,9 +4258,17 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, if (dlsch0_harq->nb_rb>1) { dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; + if (mcs1 <= 28) + dlsch0_harq->Qm = get_Qm(mcs1); + else if (mcs1<=31) + dlsch0_harq->Qm = (mcs1-28)<<1; + else + LOG_E(PHY,"invalid mcs1 %d\n",mcs1); + } else dlsch0_harq->TBS =0; + /* if (dlsch0_harq->mcs > 18) printf("mcs %d, TBS %d\n",dlsch0_harq->mcs,dlsch0_harq->TBS); @@ -4256,9 +4284,16 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, if (dlsch1_harq->nb_rb>1) { dlsch1_harq->TBS = TBStable[dlsch1_harq->mcs][dlsch1_harq->nb_rb-1]; + if (mcs2 <= 28) + dlsch1_harq->Qm = get_Qm(mcs2); + else if (mcs1<=31) + dlsch1_harq->Qm = (mcs2-28)<<1; + else + LOG_E(PHY,"invalid mcs2 %d\n",mcs2); } else dlsch1_harq->TBS = 0; + dlsch0->rnti = rnti; dlsch1->rnti = rnti; @@ -4626,6 +4661,8 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch0_harq->nb_rb-1]; + + if ((dlsch0->active==1) && (dlsch1->active==1)) { dlsch0_harq->mimo_mode = LARGE_CDD; dlsch1_harq->mimo_mode = LARGE_CDD; @@ -4644,7 +4681,8 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, dlsch0_harq->dl_power_off = 0; //apply power offset dlsch1_harq->dl_power_off = 0; //apply power offset dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; - dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; + dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch1_harq->nb_rb-1]; + break; case 1: // one-layers on TB 0, two on TB 1 @@ -4721,6 +4759,20 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, LOG_E(PHY,"Illegal number of antennas for eNB %d\n",frame_parms->nb_antennas_tx_eNB); } + if (mcs1 <= 28) + dlsch0_harq->Qm = get_Qm(mcs1); + else if (mcs1<=31) + dlsch0_harq->Qm = (mcs1-28)<<1; + else + LOG_E(PHY,"invalid mcs1 %d\n",mcs1); + + if (mcs2 <= 28) + dlsch1_harq->Qm = get_Qm(mcs2); + else if (mcs2<=31) + dlsch1_harq->Qm = (mcs2-28)<<1; + else + LOG_E(PHY,"invalid mcs2 %d\n",mcs2); + // printf("Format 2A: NPRB=%d (rballoc %x,mcs1 %d, mcs2 %d, frame_type %d N_RB_DL %d,active %d/%d)\n",NPRB,rballoc,mcs1,mcs2,frame_parms->frame_type,frame_parms->N_RB_DL,dlsch0->active,dlsch1->active); //printf("UE (%x/%d): Subframe %d Format2A DCI: ndi1 %d, old_ndi1 %d, ndi2 %d, old_ndi2 %d (first tx1 %d, first tx2 %d) harq_status1 %d, harq_status2 %d\n",dlsch0->rnti,harq_pid,subframe,ndi,dlsch0_harq->DCINdi, // dlsch0_harq->first_tx,dlsch1_harq->first_tx,dlsch0_harq->status,dlsch1_harq->status); diff --git a/openair1/PHY/LTE_TRANSPORT/defs.h b/openair1/PHY/LTE_TRANSPORT/defs.h index 444a2b12621eb67f29cf4768a3563ee7fc3a7166..8a527e2d7a45cba86c9d780e2f032c582662ec12 100644 --- a/openair1/PHY/LTE_TRANSPORT/defs.h +++ b/openair1/PHY/LTE_TRANSPORT/defs.h @@ -515,6 +515,8 @@ typedef struct { uint8_t round; /// MCS format for this DLSCH uint8_t mcs; + /// Qm (modulation order) for this DLSCH + uint8_t Qm; /// Redundancy-version of the current sub-frame uint8_t rvidx; /// MIMO mode for this DLSCH diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c index 833426685584d169e52f551b441109cafd5ea703..549464b2cf236534ad2f0edd3b7f2f70ab0937f3 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c @@ -244,8 +244,6 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, */ A = harq_process->TBS; //2072 for QPSK 1/3 - // mod_order = get_Qm(harq_process->mcs); - ret = dlsch->max_turbo_iterations; @@ -278,8 +276,33 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, err_flag = 0; r_offset = 0; + unsigned char bw_scaling =1; + + switch (frame_parms->N_RB_DL) { + case 6: + bw_scaling =16; + break; + + case 25: + bw_scaling =4; + break; + + case 50: + bw_scaling =2; + break; + + default: + bw_scaling =1; + break; + } + + if (harq_process->C >= MAX_NUM_DLSCH_SEGMENTS/bw_scaling) { + LOG_E(PHY,"Illegal harq_process->C %d > %d\n",harq_process->C,MAX_NUM_DLSCH_SEGMENTS/bw_scaling); + return((1+dlsch->max_turbo_iterations)); + } for (r=0; r<harq_process->C; r++) { + // Get Turbo interleaver parameters if (r<harq_process->Cminus) Kr = harq_process->Kminus; @@ -316,7 +339,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, harq_pid,r, G, Kr*3, harq_process->TBS, - get_Qm(harq_process->mcs), + harq_process->Qm, harq_process->nb_rb, harq_process->Nl, harq_process->rvidx, @@ -335,7 +358,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, dlsch->Kmimo, harq_process->rvidx, (harq_process->round==0)?1:0, - get_Qm(harq_process->mcs), + harq_process->Qm, harq_process->Nl, r, &E)==-1) { diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c index cce09acd41d9fbf03a9c9342798c09a3dc99a831..276f34ce7dd5d262b1441208b370bfd3afa00f53 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c @@ -325,7 +325,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, frame_parms, symbol, first_symbol_flag, - get_Qm(dlsch0_harq->mcs), + dlsch0_harq->Qm, nb_rb, lte_ue_pdsch_vars[eNB_id]->log2_maxh, phy_measurements); // log2_maxh+I0_shift @@ -380,7 +380,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, avg, symbol, nb_rb); // LOG_D(PHY,"llr_offset = %d\n",offset_mumimo_llr_drange[dlsch0_harq->mcs][(dlsch1_harq->mcs>>1)-1]); - avg[0] = log2_approx(avg[0]) - 13 + offset_mumimo_llr_drange[dlsch0_harq->mcs][(get_Qm(dlsch1_harq->mcs)>>1)-1]; + avg[0] = log2_approx(avg[0]) - 13 + offset_mumimo_llr_drange[dlsch0_harq->mcs][(dlsch1_harq->Qm>>1)-1]; lte_ue_pdsch_vars[eNB_id]->log2_maxh = cmax(avg[0],0); // printf("log2_maxh =%d\n",lte_ue_pdsch_vars[eNB_id]->log2_maxh); @@ -391,8 +391,8 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, phy_measurements, eNB_id, symbol, - get_Qm(dlsch0_harq->mcs), - get_Qm(dlsch1_harq->mcs), + dlsch0_harq->Qm, + dlsch1_harq->Qm, dlsch0_harq->round, nb_rb, lte_ue_pdsch_vars[eNB_id]->log2_maxh); @@ -451,7 +451,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, phy_measurements, eNB_id, symbol, - get_Qm(dlsch0_harq->mcs), + dlsch0_harq->Qm, nb_rb, lte_ue_pdsch_vars[eNB_id]->log2_maxh, dlsch0_harq->dl_power_off); @@ -526,7 +526,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, phy_measurements, eNB_id, symbol, - get_Qm(dlsch0_harq->mcs), + dlsch0_harq->Qm, nb_rb, lte_ue_pdsch_vars[eNB_id]->log2_maxh, 1); @@ -599,7 +599,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, // printf("LLR"); - switch (get_Qm(dlsch0_harq->mcs)) { + switch (dlsch0_harq->Qm) { case 2 : if (dlsch0_harq->mimo_mode != LARGE_CDD) { if (dual_stream_flag == 0) @@ -643,7 +643,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, } else { // TM3 DevAssert(dlsch1_harq); - if (get_Qm(dlsch1_harq->mcs) == 2) { + if (dlsch1_harq->Qm == 2) { /* dlsch_qpsk_llr(frame_parms, lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, lte_ue_pdsch_vars[eNB_id]->llr[0], @@ -667,7 +667,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, symbol,first_symbol_flag,nb_rb, adjust_G2(frame_parms,dlsch1_harq->rb_alloc,2,subframe,symbol), lte_ue_pdsch_vars[eNB_id]->llr128_2ndstream); - } else if (get_Qm(dlsch1_harq->mcs) == 4) { + } else if (dlsch1_harq->Qm == 4) { dlsch_qpsk_16qam_llr(frame_parms, lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[dlsch0_harq->round], diff --git a/openair1/PHY/LTE_TRANSPORT/initial_sync.c b/openair1/PHY/LTE_TRANSPORT/initial_sync.c index 547b73d79fcc98f551d09dc42a7ad6d2b4936091..1ea14be6f7a22c060308837d04ac2a1db63f4102 100644 --- a/openair1/PHY/LTE_TRANSPORT/initial_sync.c +++ b/openair1/PHY/LTE_TRANSPORT/initial_sync.c @@ -52,7 +52,7 @@ #include "common_lib.h" extern openair0_config_t openair0_cfg[]; #endif -//#define DEBUG_INITIAL_SYNCH +#define DEBUG_INITIAL_SYNCH int pbch_detection(PHY_VARS_UE *phy_vars_ue, runmode_t mode) { @@ -292,6 +292,8 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) frame_parms->frame_type=FDD; init_frame_parms(frame_parms,1); + // write_output("rxdata0.m","rxd0",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); + #ifdef OAI_USRP for (aarx = 0; aarx<frame_parms->nb_antennas_rx;aarx++) { rxdata128 = (__m128i*)phy_vars_ue->lte_ue_common_vars.rxdata[aarx]; @@ -304,6 +306,7 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) frame_parms, (int *)&phy_vars_ue->lte_ue_common_vars.eNb_id); + // write_output("rxdata1.m","rxd1",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); if (sync_pos >= frame_parms->nb_prefix_samples) sync_pos2 = sync_pos - frame_parms->nb_prefix_samples; else @@ -361,6 +364,7 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) init_frame_parms(&phy_vars_ue->lte_frame_parms,1); lte_gold(frame_parms,phy_vars_ue->lte_gold_table[0],frame_parms->Nid_cell); ret = pbch_detection(phy_vars_ue,mode); + // write_output("rxdata2.m","rxd2",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); #ifdef DEBUG_INITIAL_SYNCH LOG_I(PHY,"FDD Normal prefix: CellId %d metric %d, phase %d, flip %d, pbch %d\n", @@ -407,7 +411,7 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) init_frame_parms(&phy_vars_ue->lte_frame_parms,1); lte_gold(frame_parms,phy_vars_ue->lte_gold_table[0],frame_parms->Nid_cell); ret = pbch_detection(phy_vars_ue,mode); - + // write_output("rxdata3.m","rxd3",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); #ifdef DEBUG_INITIAL_SYNCH LOG_I(PHY,"FDD Extended prefix: CellId %d metric %d, phase %d, flip %d, pbch %d\n", frame_parms->Nid_cell,metric_fdd_ecp,phase_fdd_ecp,flip_fdd_ecp,ret); @@ -454,7 +458,7 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) lte_gold(frame_parms,phy_vars_ue->lte_gold_table[0],frame_parms->Nid_cell); ret = pbch_detection(phy_vars_ue,mode); - + // write_output("rxdata4.m","rxd4",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); #ifdef DEBUG_INITIAL_SYNCH LOG_I(PHY,"TDD Normal prefix: CellId %d metric %d, phase %d, flip %d, pbch %d\n", @@ -501,6 +505,7 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) lte_gold(frame_parms,phy_vars_ue->lte_gold_table[0],frame_parms->Nid_cell); ret = pbch_detection(phy_vars_ue,mode); + // write_output("rxdata5.m","rxd5",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); #ifdef DEBUG_INITIAL_SYNCH LOG_I(PHY,"TDD Extended prefix: CellId %d metric %d, phase %d, flip %d, pbch %d\n", frame_parms->Nid_cell,metric_tdd_ecp,phase_tdd_ecp,flip_tdd_ecp,ret); @@ -590,6 +595,7 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) } + // exit_fun("debug exit"); return ret; } diff --git a/openair1/PHY/MODULATION/slot_fep.c b/openair1/PHY/MODULATION/slot_fep.c index c591c7b5288cb8da99222a94608a015fe71ddfd9..d97401903d5457c9866b7f59d973884effef1652 100644 --- a/openair1/PHY/MODULATION/slot_fep.c +++ b/openair1/PHY/MODULATION/slot_fep.c @@ -33,23 +33,6 @@ #define SOFFSET 0 -void rescale(int16_t *input,int length) -{ -#if defined(__x86_64__) || defined(__i386__) - __m128i *input128 = (__m128i *)input; -#elif defined(__arm__) - int16x8_t *input128 = (int16x8_t *)input; -#endif - int i; - - for (i=0; i<length>>2; i++) { -#if defined(__x86_64__) || defined(__i386__) - input128[i] = _mm_srai_epi16(input128[i],4); -#elif defined(__arm__) - input128[i] = vshrq_n_s16(input128[i],4); -#endif - } -} int slot_fep(PHY_VARS_UE *phy_vars_ue, unsigned char l, @@ -148,18 +131,11 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue, memcpy((void *)tmp_dft_in, (void *)&ue_common_vars->rxdata[aa][(rx_offset-nb_prefix_samples0) % frame_length_samples], frame_parms->ofdm_symbol_size*sizeof(int)); -#ifdef OAI_USRP - rescale((int16_t *)tmp_dft_in, - frame_parms->ofdm_symbol_size); -#endif dft((int16_t *)tmp_dft_in, (int16_t *)&ue_common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); } else { // use dft input from RX buffer directly start_meas(&phy_vars_ue->rx_dft_stats); -#ifdef OAI_USRP - rescale((int16_t *)&ue_common_vars->rxdata[aa][(rx_offset-nb_prefix_samples0) % frame_length_samples], - frame_parms->ofdm_symbol_size+nb_prefix_samples0); -#endif + dft((int16_t *)&ue_common_vars->rxdata[aa][(rx_offset) % frame_length_samples], (int16_t *)&ue_common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); stop_meas(&phy_vars_ue->rx_dft_stats); @@ -186,17 +162,10 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue, memcpy((void *)tmp_dft_in, (void *)&ue_common_vars->rxdata[aa][(rx_offset) % frame_length_samples], frame_parms->ofdm_symbol_size*sizeof(int)); -#ifdef OAI_USRP - rescale((int16_t *)tmp_dft_in, - frame_parms->ofdm_symbol_size); -#endif dft((int16_t *)tmp_dft_in, (int16_t *)&ue_common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); } else { // use dft input from RX buffer directly -#ifdef OAI_USRP - rescale((int16_t *)&ue_common_vars->rxdata[aa][(rx_offset-nb_prefix_samples) % frame_length_samples], - frame_parms->ofdm_symbol_size+nb_prefix_samples); -#endif + dft((int16_t *)&ue_common_vars->rxdata[aa][(rx_offset) % frame_length_samples], (int16_t *)&ue_common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); } diff --git a/openair1/SCHED/defs.h b/openair1/SCHED/defs.h index 3f0da65030f49988f297b7ef9f974f9a8174cb87..016a52104be4ce433353a1747a9d2c85cce93947 100644 --- a/openair1/SCHED/defs.h +++ b/openair1/SCHED/defs.h @@ -114,7 +114,7 @@ typedef struct { int32_t freq_offset; uint32_t tx_rx_switch_point; uint32_t manual_timing_advance; /// 1 to override automatic timing advance - uint32_t timing_advance; + int32_t timing_advance; uint32_t dual_tx; /// 1 for dual-antenna TX, 0 for single-antenna TX uint32_t tdd; /// 1 for TDD mode, 0 for FDD mode uint32_t rx_rf_mode; diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index 3db2bf62a426848f8c47b97eb09c970b403a9e56..3a2b6aa4b992e70b69e8d499a8e1860ec473d6ab 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -135,7 +135,7 @@ void dump_dlsch(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe,uint8_t coded_bits_per_codeword = get_G(&phy_vars_ue->lte_frame_parms, phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->nb_rb, phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rb_alloc, - get_Qm(phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs), + phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Qm, phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Nl, phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, phy_vars_ue->frame_rx,subframe); @@ -164,7 +164,7 @@ void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe) coded_bits_per_codeword = get_G(&phy_vars_ue->lte_frame_parms, phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->nb_rb, phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc, - get_Qm(phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->mcs), + 2, 1, phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, phy_vars_ue->frame_rx,subframe); @@ -265,7 +265,7 @@ void dump_dlsch_ra(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe) coded_bits_per_codeword = get_G(&phy_vars_ue->lte_frame_parms, phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->nb_rb, phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->rb_alloc, - get_Qm(phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->mcs), + 2, 1, phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, phy_vars_ue->frame_rx,subframe); @@ -985,7 +985,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra #else tx_amp = AMP; #endif - LOG_I(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d, generating PUSCH, Po_PUSCH: %d dBm, amp %d\n", + LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d, generating PUSCH, Po_PUSCH: %d dBm, amp %d\n", Mod_id,harq_pid,frame_tx,subframe_tx,phy_vars_ue->tx_power_dBm, tx_amp); start_meas(&phy_vars_ue->ulsch_modulation_stats); ulsch_modulation(phy_vars_ue->lte_ue_common_vars.txdataF, @@ -1246,14 +1246,15 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra #else //this is the normal case ulsch_start = (frame_parms->samples_per_tti*subframe_tx)-phy_vars_ue->N_TA_offset; //-phy_vars_ue->timing_advance; #endif //else EXMIMO - LOG_D(PHY,"[UE %d] Frame %d, subframe %d: ulsch_start = %d (rxoff %d, HW TA %d, timing advance %d, TA_offset %d\n", - Mod_id,frame_tx,subframe_tx, - ulsch_start, - phy_vars_ue->rx_offset, - openair_daq_vars.timing_advance, - phy_vars_ue->timing_advance, - phy_vars_ue->N_TA_offset); - + if ((frame_tx%100) == 0) + LOG_D(PHY,"[UE %d] Frame %d, subframe %d: ulsch_start = %d (rxoff %d, HW TA %d, timing advance %d, TA_offset %d\n", + Mod_id,frame_tx,subframe_tx, + ulsch_start, + phy_vars_ue->rx_offset, + openair_daq_vars.timing_advance, + phy_vars_ue->timing_advance, + phy_vars_ue->N_TA_offset); + if (generate_ul_signal == 1 ) { @@ -1379,7 +1380,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra #endif if (abstraction_flag == 0) { - LOG_I(PHY,"[UE %d][RAPROC] Frame %d, Subframe %d : Generating PRACH, preamble %d, TARGET_RECEIVED_POWER %d dBm, PRACH TDD Resource index %d, RA-RNTI %d\n", + LOG_D(PHY,"[UE %d][RAPROC] Frame %d, Subframe %d : Generating PRACH, preamble %d, TARGET_RECEIVED_POWER %d dBm, PRACH TDD Resource index %d, RA-RNTI %d\n", Mod_id, frame_tx, subframe_tx, @@ -1410,7 +1411,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp = AMP; #endif if ((mode == calib_prach_tx) && (((phy_vars_ue->frame_tx&0xfffe)%100)==0)) - LOG_I(PHY,"[UE %d][RAPROC] Frame %d, Subframe %d : PRACH TX power %d dBm, amp %d\n",Mod_id,phy_vars_ue->frame_rx,phy_vars_ue->slot_tx>>1,phy_vars_ue->tx_power_dBm, + LOG_D(PHY,"[UE %d][RAPROC] Frame %d, Subframe %d : PRACH TX power %d dBm, amp %d\n",Mod_id,phy_vars_ue->frame_rx,phy_vars_ue->slot_tx>>1,phy_vars_ue->tx_power_dBm, phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp); @@ -2473,15 +2474,16 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - LOG_D(PHY,"[UE %d] *********** dlsch->active in subframe %d (%d)=> %d\n",phy_vars_ue->Mod_id,subframe_rx,slot_rx,phy_vars_ue->dlsch_ue[eNB_id][0]->active); - // This is normal processing (i.e. not MBSFN) // RX processing of symbols in slot_rx + + + for (l=0; l<n_symb; l++) { if (abstraction_flag == 0) { start_meas(&phy_vars_ue->ofdm_demod_stats); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_IN); + slot_fep(phy_vars_ue, l, slot_rx, @@ -2576,7 +2578,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac (openair_daq_vars.use_ia_receiver ==1)) { dual_stream_UE = 1; eNB_id_i = phy_vars_ue->n_connected_eNB; - i_mod = get_Qm(phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs); + i_mod = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Qm; if (frame_rx%100==0) { LOG_I(PHY,"using IA receiver\n"); @@ -2624,7 +2626,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->G = get_G(&phy_vars_ue->lte_frame_parms, phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->nb_rb, phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rb_alloc, - get_Qm(phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs), + phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Qm, phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Nl, phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, frame_rx,subframe_prev); @@ -2782,7 +2784,8 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac get_G(&phy_vars_ue->lte_frame_parms, phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->nb_rb, phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc, - get_Qm(phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->mcs),1, + 2, + 1, phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, frame_rx,subframe_prev); @@ -2835,7 +2838,17 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac if (ret == (1+phy_vars_ue->dlsch_ue_SI[eNB_id]->max_turbo_iterations)) { phy_vars_ue->dlsch_SI_errors[eNB_id]++; #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Frame %d, subframe %d, received SI in error\n",phy_vars_ue->Mod_id,frame_rx,subframe_prev); + LOG_D(PHY,"[UE %d] Frame %d, subframe %d, received SI in error (TBS %d, mcs %d, rvidx %d, rballoc %X.%X.%X.%X\n", + phy_vars_ue->Mod_id, + frame_rx, + subframe_prev, + phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS, + phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->mcs, + phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rvidx, + phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc[0], + phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc[1], + phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc[2], + phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc[3]); #endif //dump_dlsch_SI(phy_vars_ue,eNB_id,subframe_prev); @@ -2847,9 +2860,15 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac #ifdef DEBUG_PHY_PROC //if ((frame_rx % 100) == 0) - LOG_D(PHY,"[UE %d] Frame %d, subframe %d, received SI for TBS %d, mcs %d\n", - phy_vars_ue->Mod_id,frame_rx,subframe_prev,phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->mcs); + LOG_D(PHY,"[UE %d] Frame %d, subframe %d, received SI for TBS %d, mcs %d, rvidx %d, rballoc %X.%X.%X.%X\n", + phy_vars_ue->Mod_id,frame_rx,subframe_prev, + phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS, + phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->mcs, + phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rvidx, + phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc[0], + phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc[1], + phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc[2], + phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc[3]); #endif #ifdef OPENAIR2 @@ -2923,10 +2942,11 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac if (abstraction_flag==0) { phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->G = get_G(&phy_vars_ue->lte_frame_parms, - phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->nb_rb, - phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->rb_alloc, - get_Qm(phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->mcs),1, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, + phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->nb_rb, + phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->rb_alloc, + 2, + 1, + phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, frame_rx, subframe_prev); @@ -2950,7 +2970,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac phy_vars_ue->dlsch_ue_ra[eNB_id], phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0], subframe_prev, // subframe - harq_pid, + phy_vars_ue->dlsch_ue_ra[eNB_id]->current_harq_pid, 0,0); } @@ -3104,7 +3124,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac (openair_daq_vars.use_ia_receiver ==1)) { dual_stream_UE = 1; eNB_id_i = phy_vars_ue->n_connected_eNB; - i_mod = get_Qm(phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs); + i_mod = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Qm; } else { dual_stream_UE = 0; eNB_id_i = eNB_id+1; @@ -3173,7 +3193,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac (openair_daq_vars.use_ia_receiver ==1)) { dual_stream_UE = 1; eNB_id_i = phy_vars_ue->n_connected_eNB; - i_mod = get_Qm(phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs); + i_mod = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Qm; } else { dual_stream_UE = 0; eNB_id_i = eNB_id+1; @@ -3301,7 +3321,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->G = get_G(&phy_vars_ue->lte_frame_parms, phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->nb_rb, phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->rb_alloc, - get_Qm(phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->mcs), + phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->Qm, 1, 2, (subframe_rx==9?-1:0)+frame_rx,subframe_rx); diff --git a/openair1/SCHED/pusch_pc.c b/openair1/SCHED/pusch_pc.c index 0d7a99b8d25d8000afea013aafcbd8262b27d0ae..e36d887ceb1c38c544573c8655752172a2e94674 100644 --- a/openair1/SCHED/pusch_pc.c +++ b/openair1/SCHED/pusch_pc.c @@ -163,7 +163,7 @@ void pusch_power_cntl(PHY_VARS_UE *phy_vars_ue,uint8_t subframe,uint8_t eNB_id,u phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH += (mac_xface->get_Po_NOMINAL_PUSCH(phy_vars_ue->Mod_id,0) + PL); - LOG_I(PHY,"[UE %d][RAPROC] frame %d, subframe %d: Msg3 Po_PUSCH %d dBm (%d,%d,100*PL=%d,%d,%d)\n", + LOG_D(PHY,"[UE %d][RAPROC] frame %d, subframe %d: Msg3 Po_PUSCH %d dBm (%d,%d,100*PL=%d,%d,%d)\n", phy_vars_ue->Mod_id,phy_vars_ue->frame_tx,subframe,phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH, 100*mac_xface->get_Po_NOMINAL_PUSCH(phy_vars_ue->Mod_id,0), hundred_times_log10_NPRB[nb_rb-1], @@ -182,7 +182,7 @@ void pusch_power_cntl(PHY_VARS_UE *phy_vars_ue,uint8_t subframe,uint8_t eNB_id,u else if (phy_vars_ue->ulsch_ue[eNB_id]->PHR > 40) phy_vars_ue->ulsch_ue[eNB_id]->PHR = 40; - LOG_I(PHY,"[UE %d][PUSCH %d] frame %d, subframe %d: Po_PUSCH %d dBm : tx power %d, Po_NOMINAL_PUSCH %d,log10(NPRB) %f,PHR %d, PL %d, alpha*PL %f,delta_IF %f,f_pusch %d\n", + LOG_D(PHY,"[UE %d][PUSCH %d] frame %d, subframe %d: Po_PUSCH %d dBm : tx power %d, Po_NOMINAL_PUSCH %d,log10(NPRB) %f,PHR %d, PL %d, alpha*PL %f,delta_IF %f,f_pusch %d\n", phy_vars_ue->Mod_id,harq_pid,phy_vars_ue->frame_tx,subframe, phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH, phy_vars_ue->tx_power_max_dBm, diff --git a/openair2/LAYER2/MAC/ra_procedures.c b/openair2/LAYER2/MAC/ra_procedures.c index 6c3e96e444ae2b82424b9212a96771e3a65ae5d0..086d4dd3c9a669b213ec318d0ec1b242f7dc6d57 100644 --- a/openair2/LAYER2/MAC/ra_procedures.c +++ b/openair2/LAYER2/MAC/ra_procedures.c @@ -244,7 +244,7 @@ void Msg3_tx(module_id_t module_idP,uint8_t CC_id,frame_t frameP, uint8_t eNB_id } // start contention resolution timer - LOG_I(MAC,"[UE %d][RAPROC] Frame %d : Msg3_tx: Setting contention resolution timer\n",module_idP,frameP); + LOG_D(MAC,"[UE %d][RAPROC] Frame %d : Msg3_tx: Setting contention resolution timer\n",module_idP,frameP); UE_mac_inst[module_idP].RA_contention_resolution_cnt = 0; UE_mac_inst[module_idP].RA_contention_resolution_timer_active = 1; #if defined(USER_MODE) && defined(OAI_EMU) @@ -448,9 +448,45 @@ PRACH_RESOURCES_t *ue_get_rach(module_id_t module_idP,int CC_id,frame_t frameP, UE_mac_inst[module_idP].RA_PREAMBLE_TRANSMISSION_COUNTER++; UE_mac_inst[module_idP].RA_prach_resources.ra_PREAMBLE_RECEIVED_TARGET_POWER += (rach_ConfigCommon->powerRampingParameters.powerRampingStep<<1); // 2dB increments in ASN.1 definition - - if (UE_mac_inst[module_idP].RA_PREAMBLE_TRANSMISSION_COUNTER == rach_ConfigCommon->ra_SupervisionInfo.preambleTransMax) { - LOG_D(MAC,"[UE %d] Frame %d: Maximum number of RACH attempts (%d)\n",module_idP,frameP,rach_ConfigCommon->ra_SupervisionInfo.preambleTransMax); + int preambleTransMax; + switch (rach_ConfigCommon->ra_SupervisionInfo.preambleTransMax) { + case RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n3: + preambleTransMax = 3; + break; + case RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n4: + preambleTransMax = 4; + break; + case RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n5: + preambleTransMax = 5; + break; + case RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n6: + preambleTransMax = 6; + break; + case RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n7: + preambleTransMax = 7; + break; + case RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n8: + preambleTransMax = 8; + break; + case RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n10: + preambleTransMax = 10; + break; + case RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n20: + preambleTransMax = 20; + break; + case RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n50: + preambleTransMax = 50; + break; + case RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n100: + preambleTransMax = 100; + break; + case RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n200: + preambleTransMax = 200; + break; + } + + if (UE_mac_inst[module_idP].RA_PREAMBLE_TRANSMISSION_COUNTER == preambleTransMax) { + LOG_D(MAC,"[UE %d] Frame %d: Maximum number of RACH attempts (%d)\n",module_idP,frameP,preambleTransMax); // send message to RRC UE_mac_inst[module_idP].RA_PREAMBLE_TRANSMISSION_COUNTER=1; UE_mac_inst[module_idP].RA_prach_resources.ra_PREAMBLE_RECEIVED_TARGET_POWER = get_Po_NOMINAL_PUSCH(module_idP,CC_id); diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c index ceaa663537901da445b178cf3d4f58e3375df065..4e293b6185ac15ff6f2b807f87aad7bfccefa405 100644 --- a/openair2/LAYER2/MAC/ue_procedures.c +++ b/openair2/LAYER2/MAC/ue_procedures.c @@ -1435,7 +1435,7 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf bsr_l, post_padding); // long_bsr - LOG_I(MAC, + LOG_D(MAC, "[UE %d] Generate header :bufflen %d sdu_length_total %d, num_sdus %d, sdu_lengths[0] %d, sdu_lcids[0] %d => payload offset %d, dcch_header_len %d, dtch_header_len %d, padding %d,post_padding %d, bsr len %d, phr len %d, reminder %d \n", module_idP,buflen, sdu_length_total,num_sdus,sdu_lengths[0],sdu_lcids[0],payload_offset, dcch_header_len, dtch_header_len, short_padding,post_padding, bsr_len, phr_len,buflen-sdu_length_total-payload_offset); diff --git a/openair2/RRC/LITE/L2_interface.c b/openair2/RRC/LITE/L2_interface.c index d9c1062ab765f4ee9e1c40ee4720f24aa377b7fa..2dfb0a1a87dce7fa96cf8efcb831741a9c60ab3c 100644 --- a/openair2/RRC/LITE/L2_interface.c +++ b/openair2/RRC/LITE/L2_interface.c @@ -362,7 +362,7 @@ mac_rrc_lite_data_ind( if(eNB_flagP == ENB_FLAG_NO) { if(srb_idP == BCCH) { - LOG_T(RRC,"[UE %d] Received SDU for BCCH on SRB %d from eNB %d\n",module_idP,srb_idP,eNB_indexP); + LOG_D(RRC,"[UE %d] Received SDU for BCCH on SRB %d from eNB %d\n",module_idP,srb_idP,eNB_indexP); #if defined(ENABLE_ITTI) { diff --git a/openair2/RRC/LITE/defs.h b/openair2/RRC/LITE/defs.h index a0507c31a86c5bfc85854664e35621fedf102dc8..2847032336cad9eda04737ad693b4b79156f1353 100644 --- a/openair2/RRC/LITE/defs.h +++ b/openair2/RRC/LITE/defs.h @@ -189,9 +189,9 @@ typedef enum HO_STATE_e { typedef struct UE_RRC_INFO_s { UE_STATE_t State; - uint8_t SIB1Status; uint8_t SIB1systemInfoValueTag; - uint8_t SIStatus; + uint32_t SIStatus; + uint32_t SIcnt; #ifdef Rel10 uint8_t MCCHStatus[8]; // MAX_MBSFN_AREA #endif diff --git a/openair2/RRC/LITE/rrc_UE.c b/openair2/RRC/LITE/rrc_UE.c index 75008b1ac220f8689a807b147feb3080efd58dbd..664c169e3a98368945495814252281d0654ed704 100644 --- a/openair2/RRC/LITE/rrc_UE.c +++ b/openair2/RRC/LITE/rrc_UE.c @@ -255,8 +255,8 @@ static void init_SI_UE( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_ UE_rrc_inst[ctxt_pP->module_id].si[eNB_index] = (SystemInformation_t*)malloc16_clear( sizeof(SystemInformation_t) ); - UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIB1Status = 0; UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus = 0; + UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIcnt = 0; } #ifdef Rel10 @@ -2332,12 +2332,15 @@ int decode_BCCH_DLSCH_Message( const uint8_t rsrp ) { BCCH_DL_SCH_Message_t *bcch_message = NULL; + SystemInformationBlockType1_t* sib1 = UE_rrc_inst[ctxt_pP->module_id].sib1[eNB_index]; + int i; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_BCCH, VCD_FUNCTION_IN ); - if ((UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIB1Status == 1) && - (UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus == 1)) { - // Avoid decoding to prevent memory bloating + if (((UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus&1) == 1) && // SIB1 received + (UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIcnt == sib1->schedulingInfoList.list.count)) { + // Avoid decoding SystemInformationBlockType1_t* sib1 = UE_rrc_inst[ctxt_pP->module_id].sib1[eNB_index]; + // to prevent memory bloating VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_BCCH, VCD_FUNCTION_OUT ); return 0; } @@ -2354,6 +2357,9 @@ int decode_BCCH_DLSCH_Message( LOG_E( RRC, "[UE %"PRIu8"] Failed to decode BCCH_DLSCH_MESSAGE (%zu bits)\n", ctxt_pP->module_id, dec_rval.consumed ); + for (i=0;i<Sdu_len;i++) + printf("%02x ",Sdu[i]); + printf("\n"); // free the memory SEQUENCE_free( &asn_DEF_BCCH_DL_SCH_Message, (void*)bcch_message, 1 ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_BCCH, VCD_FUNCTION_OUT ); @@ -2393,7 +2399,7 @@ int decode_BCCH_DLSCH_Message( case BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1: if ((ctxt_pP->frame % 2) == 0) { // even frame - if (UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIB1Status == 0) { + if ((UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus&1) == 0) { SystemInformationBlockType1_t* sib1 = UE_rrc_inst[ctxt_pP->module_id].sib1[eNB_index]; memcpy( (void*)sib1, (void*)&bcch_message->message.choice.c1.choice.systemInformationBlockType1, @@ -2406,7 +2412,7 @@ int decode_BCCH_DLSCH_Message( break; case BCCH_DL_SCH_MessageType__c1_PR_systemInformation: - if (UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIB1Status == 1) { + if ((UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus&1) == 1) { // SIB1 with schedulingInfoList is available SystemInformation_t* si = UE_rrc_inst[ctxt_pP->module_id].si[eNB_index]; @@ -2599,7 +2605,7 @@ static int decode_SIB1( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_ #endif ); - UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIB1Status = 1; + UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus = 1; UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIB1systemInfoValueTag = sib1->systemInfoValueTag; #if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME) @@ -3000,6 +3006,8 @@ static int decode_SI( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_in { SystemInformation_t** si = &UE_rrc_inst[ctxt_pP->module_id].si[eNB_index]; + int new_sib = 0; + SystemInformationBlockType1_t* sib1 = UE_rrc_inst[ctxt_pP->module_id].sib1[eNB_index]; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_UE_DECODE_SI, VCD_FUNCTION_IN ); @@ -3019,181 +3027,241 @@ static int decode_SI( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_in switch(typeandinfo->present) { case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib2: - memcpy( UE_rrc_inst[ctxt_pP->module_id].sib2[eNB_index], &typeandinfo->choice.sib2, sizeof(SystemInformationBlockType2_t) ); - LOG_D( RRC, "[UE %"PRIu8"] Frame %"PRIu32" Found SIB2 from eNB %"PRIu8"\n", ctxt_pP->module_id, ctxt_pP->frame, eNB_index ); - dump_sib2( UE_rrc_inst[ctxt_pP->module_id].sib2[eNB_index] ); - LOG_D( RRC, "[FRAME %05"PRIu32"][RRC_UE][MOD %02"PRIu8"][][--- MAC_CONFIG_REQ (SIB2 params eNB %"PRIu8") --->][MAC_UE][MOD %02"PRIu8"][]\n", - ctxt_pP->frame, ctxt_pP->module_id, eNB_index, ctxt_pP->module_id ); - rrc_mac_config_req(ctxt_pP->module_id, 0, ENB_FLAG_NO, 0, eNB_index, - &UE_rrc_inst[ctxt_pP->module_id].sib2[eNB_index]->radioResourceConfigCommon, - (struct PhysicalConfigDedicated *)NULL, + if ((UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus&2) == 0) { + UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus|=2; + new_sib=1; + memcpy( UE_rrc_inst[ctxt_pP->module_id].sib2[eNB_index], &typeandinfo->choice.sib2, sizeof(SystemInformationBlockType2_t) ); + LOG_I( RRC, "[UE %"PRIu8"] Frame %"PRIu32" Found SIB2 from eNB %"PRIu8"\n", ctxt_pP->module_id, ctxt_pP->frame, eNB_index ); + dump_sib2( UE_rrc_inst[ctxt_pP->module_id].sib2[eNB_index] ); + LOG_I( RRC, "[FRAME %05"PRIu32"][RRC_UE][MOD %02"PRIu8"][][--- MAC_CONFIG_REQ (SIB2 params eNB %"PRIu8") --->][MAC_UE][MOD %02"PRIu8"][]\n", + ctxt_pP->frame, ctxt_pP->module_id, eNB_index, ctxt_pP->module_id ); + rrc_mac_config_req(ctxt_pP->module_id, 0, ENB_FLAG_NO, 0, eNB_index, + &UE_rrc_inst[ctxt_pP->module_id].sib2[eNB_index]->radioResourceConfigCommon, + (struct PhysicalConfigDedicated *)NULL, #ifdef Rel10 - (SCellToAddMod_r10_t *)NULL, + (SCellToAddMod_r10_t *)NULL, #endif - (MeasObjectToAddMod_t **)NULL, - (MAC_MainConfig_t *)NULL, - 0, - (struct LogicalChannelConfig *)NULL, - (MeasGapConfig_t *)NULL, - (TDD_Config_t *)NULL, - (MobilityControlInfo_t *)NULL, - NULL, - NULL, - UE_rrc_inst[ctxt_pP->module_id].sib2[eNB_index]->freqInfo.ul_CarrierFreq, - UE_rrc_inst[ctxt_pP->module_id].sib2[eNB_index]->freqInfo.ul_Bandwidth, - &UE_rrc_inst[ctxt_pP->module_id].sib2[eNB_index]->freqInfo.additionalSpectrumEmission, - UE_rrc_inst[ctxt_pP->module_id].sib2[eNB_index]->mbsfn_SubframeConfigList + (MeasObjectToAddMod_t **)NULL, + (MAC_MainConfig_t *)NULL, + 0, + (struct LogicalChannelConfig *)NULL, + (MeasGapConfig_t *)NULL, + (TDD_Config_t *)NULL, + (MobilityControlInfo_t *)NULL, + NULL, + NULL, + UE_rrc_inst[ctxt_pP->module_id].sib2[eNB_index]->freqInfo.ul_CarrierFreq, + UE_rrc_inst[ctxt_pP->module_id].sib2[eNB_index]->freqInfo.ul_Bandwidth, + &UE_rrc_inst[ctxt_pP->module_id].sib2[eNB_index]->freqInfo.additionalSpectrumEmission, + UE_rrc_inst[ctxt_pP->module_id].sib2[eNB_index]->mbsfn_SubframeConfigList #ifdef Rel10 - ,0, - (MBSFN_AreaInfoList_r9_t *)NULL, - (PMCH_InfoList_r9_t *)NULL + ,0, + (MBSFN_AreaInfoList_r9_t *)NULL, + (PMCH_InfoList_r9_t *)NULL #endif #ifdef CBA - ,0, - 0 + ,0, + 0 #endif - ); - UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus = 1; - // After SI is received, prepare RRCConnectionRequest + ); + // After SI is received, prepare RRCConnectionRequest #ifdef Rel10 - if (UE_rrc_inst[ctxt_pP->module_id].MBMS_flag < 3) // see -Q option + if (UE_rrc_inst[ctxt_pP->module_id].MBMS_flag < 3) // see -Q option #endif #if !(defined(ENABLE_ITTI) && defined(ENABLE_USE_MME)) - rrc_ue_generate_RRCConnectionRequest( ctxt_pP, eNB_index ); - - LOG_I( RRC, "not sending connection request\n" ); + rrc_ue_generate_RRCConnectionRequest( ctxt_pP, eNB_index ); + + LOG_I( RRC, "not sending connection request\n" ); #endif - - if (UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].State == RRC_IDLE) { - LOG_I( RRC, "[UE %d] Received SIB1/SIB2/SIB3 Switching to RRC_SI_RECEIVED\n", ctxt_pP->module_id ); - UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].State = RRC_SI_RECEIVED; + + if (UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].State == RRC_IDLE) { + LOG_I( RRC, "[UE %d] Received SIB1/SIB2/SIB3 Switching to RRC_SI_RECEIVED\n", ctxt_pP->module_id ); + UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].State = RRC_SI_RECEIVED; #ifdef ENABLE_RAL - { - MessageDef *message_ral_p = NULL; - rrc_ral_system_information_ind_t ral_si_ind; - - message_ral_p = itti_alloc_new_message (TASK_RRC_UE, RRC_RAL_SYSTEM_INFORMATION_IND); - memset(&ral_si_ind, 0, sizeof(rrc_ral_system_information_ind_t)); - ral_si_ind.plmn_id.MCCdigit2 = '0'; - ral_si_ind.plmn_id.MCCdigit1 = '2'; - ral_si_ind.plmn_id.MNCdigit3 = '0'; - ral_si_ind.plmn_id.MCCdigit3 = '8'; - ral_si_ind.plmn_id.MNCdigit2 = '9'; - ral_si_ind.plmn_id.MNCdigit1 = '9'; - ral_si_ind.cell_id = 1; - ral_si_ind.dbm = 0; - //ral_si_ind.dbm = fifo_dump_emos_UE.PHY_measurements->rx_rssi_dBm[eNB_index]; - // TO DO - ral_si_ind.sinr = 0; - //ral_si_ind.sinr = fifo_dump_emos_UE.PHY_measurements->subband_cqi_dB[eNB_index][phy_vars_ue->lte_frame_parms.nb_antennas_rx][0]; - // TO DO - ral_si_ind.link_data_rate = 0; - memcpy (&message_ral_p->ittiMsg, (void *) &ral_si_ind, sizeof(rrc_ral_system_information_ind_t)); + { + MessageDef *message_ral_p = NULL; + rrc_ral_system_information_ind_t ral_si_ind; + + message_ral_p = itti_alloc_new_message (TASK_RRC_UE, RRC_RAL_SYSTEM_INFORMATION_IND); + memset(&ral_si_ind, 0, sizeof(rrc_ral_system_information_ind_t)); + ral_si_ind.plmn_id.MCCdigit2 = '0'; + ral_si_ind.plmn_id.MCCdigit1 = '2'; + ral_si_ind.plmn_id.MNCdigit3 = '0'; + ral_si_ind.plmn_id.MCCdigit3 = '8'; + ral_si_ind.plmn_id.MNCdigit2 = '9'; + ral_si_ind.plmn_id.MNCdigit1 = '9'; + ral_si_ind.cell_id = 1; + ral_si_ind.dbm = 0; + //ral_si_ind.dbm = fifo_dump_emos_UE.PHY_measurements->rx_rssi_dBm[eNB_index]; + // TO DO + ral_si_ind.sinr = 0; + //ral_si_ind.sinr = fifo_dump_emos_UE.PHY_measurements->subband_cqi_dB[eNB_index][phy_vars_ue->lte_frame_parms.nb_antennas_rx][0]; + // TO DO + ral_si_ind.link_data_rate = 0; + memcpy (&message_ral_p->ittiMsg, (void *) &ral_si_ind, sizeof(rrc_ral_system_information_ind_t)); #warning "ue_mod_idP ? for instance ?" - itti_send_msg_to_task (TASK_RAL_UE, UE_MODULE_ID_TO_INSTANCE(ctxt_pP->module_id), message_ral_p); - } + itti_send_msg_to_task (TASK_RAL_UE, UE_MODULE_ID_TO_INSTANCE(ctxt_pP->module_id), message_ral_p); + } #endif + } } - break; // case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib2 case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib3: - memcpy( UE_rrc_inst[ctxt_pP->module_id].sib3[eNB_index], &typeandinfo->choice.sib3, sizeof(SystemInformationBlockType3_t) ); - LOG_I( RRC, "[UE %"PRIu8"] Frame %"PRIu32" Found SIB3 from eNB %"PRIu8"\n", ctxt_pP->module_id, ctxt_pP->frame, eNB_index ); - dump_sib3( UE_rrc_inst[ctxt_pP->module_id].sib3[eNB_index] ); - UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus = 1; - rrc_set_sub_state( ctxt_pP->module_id, RRC_SUB_STATE_IDLE_SIB_COMPLETE ); + if ((UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus&4) == 0) { + UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus|=4; + new_sib=1; + memcpy( UE_rrc_inst[ctxt_pP->module_id].sib3[eNB_index], &typeandinfo->choice.sib3, sizeof(SystemInformationBlockType3_t) ); + LOG_I( RRC, "[UE %"PRIu8"] Frame %"PRIu32" Found SIB3 from eNB %"PRIu8"\n", ctxt_pP->module_id, ctxt_pP->frame, eNB_index ); + dump_sib3( UE_rrc_inst[ctxt_pP->module_id].sib3[eNB_index] ); + + } break; case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib4: - memcpy( UE_rrc_inst[ctxt_pP->module_id].sib4[eNB_index], &typeandinfo->choice.sib4, sizeof(SystemInformationBlockType4_t) ); - LOG_I( RRC, "[UE %"PRIu8"] Frame %"PRIu32" Found SIB4 from eNB %"PRIu8"\n", ctxt_pP->module_id, ctxt_pP->frame, eNB_index ); + if ((UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus&8) == 0) { + UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus|=8; + new_sib=1; + memcpy( UE_rrc_inst[ctxt_pP->module_id].sib4[eNB_index], &typeandinfo->choice.sib4, sizeof(SystemInformationBlockType4_t) ); + LOG_I( RRC, "[UE %"PRIu8"] Frame %"PRIu32" Found SIB4 from eNB %"PRIu8"\n", ctxt_pP->module_id, ctxt_pP->frame, eNB_index ); + } + break; case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib5: - memcpy( UE_rrc_inst[ctxt_pP->module_id].sib5[eNB_index], &typeandinfo->choice.sib5, sizeof(SystemInformationBlockType5_t) ); - LOG_I( RRC, "[UE %"PRIu8"] Frame %"PRIu32" Found SIB5 from eNB %"PRIu8"\n", ctxt_pP->module_id, ctxt_pP->frame, eNB_index ); + if ((UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus&16) == 0) { + UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus|=16; + new_sib=1; + + memcpy( UE_rrc_inst[ctxt_pP->module_id].sib5[eNB_index], &typeandinfo->choice.sib5, sizeof(SystemInformationBlockType5_t) ); + LOG_I( RRC, "[UE %"PRIu8"] Frame %"PRIu32" Found SIB5 from eNB %"PRIu8"\n", ctxt_pP->module_id, ctxt_pP->frame, eNB_index ); + } break; case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib6: - memcpy( UE_rrc_inst[ctxt_pP->module_id].sib6[eNB_index], &typeandinfo->choice.sib6, sizeof(SystemInformationBlockType6_t) ); - LOG_I( RRC, "[UE %"PRIu8"] Frame %"PRIu32" Found SIB6 from eNB %"PRIu8"\n", ctxt_pP->module_id, ctxt_pP->frame, eNB_index ); + if ((UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus&32) == 0) { + UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus|=32; + new_sib=1; + + memcpy( UE_rrc_inst[ctxt_pP->module_id].sib6[eNB_index], &typeandinfo->choice.sib6, sizeof(SystemInformationBlockType6_t) ); + LOG_I( RRC, "[UE %"PRIu8"] Frame %"PRIu32" Found SIB6 from eNB %"PRIu8"\n", ctxt_pP->module_id, ctxt_pP->frame, eNB_index ); + } break; case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib7: - memcpy( UE_rrc_inst[ctxt_pP->module_id].sib7[eNB_index], &typeandinfo->choice.sib7, sizeof(SystemInformationBlockType7_t) ); - LOG_I( RRC, "[UE %"PRIu8"] Frame %"PRIu32" Found SIB7 from eNB %"PRIu8"\n", ctxt_pP->module_id, ctxt_pP->frame, eNB_index ); + if ((UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus&64) == 0) { + UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus|=64; + new_sib=1; + memcpy( UE_rrc_inst[ctxt_pP->module_id].sib7[eNB_index], &typeandinfo->choice.sib7, sizeof(SystemInformationBlockType7_t) ); + LOG_I( RRC, "[UE %"PRIu8"] Frame %"PRIu32" Found SIB7 from eNB %"PRIu8"\n", ctxt_pP->module_id, ctxt_pP->frame, eNB_index ); + } break; case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib8: - memcpy( UE_rrc_inst[ctxt_pP->module_id].sib8[eNB_index], &typeandinfo->choice.sib8, sizeof(SystemInformationBlockType8_t) ); - LOG_I( RRC, "[UE %"PRIu8"] Frame %"PRIu32" Found SIB8 from eNB %"PRIu8"\n", ctxt_pP->module_id, ctxt_pP->frame, eNB_index ); + if ((UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus&128) == 0) { + UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus|=128; + new_sib=1; + memcpy( UE_rrc_inst[ctxt_pP->module_id].sib8[eNB_index], &typeandinfo->choice.sib8, sizeof(SystemInformationBlockType8_t) ); + LOG_I( RRC, "[UE %"PRIu8"] Frame %"PRIu32" Found SIB8 from eNB %"PRIu8"\n", ctxt_pP->module_id, ctxt_pP->frame, eNB_index ); + } break; case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib9: - memcpy( UE_rrc_inst[ctxt_pP->module_id].sib9[eNB_index], &typeandinfo->choice.sib9, sizeof(SystemInformationBlockType9_t) ); - LOG_I( RRC, "[UE %"PRIu8"] Frame %"PRIu32" Found SIB9 from eNB %"PRIu8"\n", ctxt_pP->module_id, ctxt_pP->frame, eNB_index ); + if ((UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus&256) == 0) { + UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus|=256; + new_sib=1; + + memcpy( UE_rrc_inst[ctxt_pP->module_id].sib9[eNB_index], &typeandinfo->choice.sib9, sizeof(SystemInformationBlockType9_t) ); + LOG_I( RRC, "[UE %"PRIu8"] Frame %"PRIu32" Found SIB9 from eNB %"PRIu8"\n", ctxt_pP->module_id, ctxt_pP->frame, eNB_index ); + } break; case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib10: - memcpy( UE_rrc_inst[ctxt_pP->module_id].sib10[eNB_index], &typeandinfo->choice.sib10, sizeof(SystemInformationBlockType10_t) ); - LOG_I( RRC, "[UE %"PRIu8"] Frame %"PRIu32" Found SIB10 from eNB %"PRIu8"\n", ctxt_pP->module_id, ctxt_pP->frame, eNB_index ); + if ((UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus&512) == 0) { + UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus|=512; + new_sib=1; + memcpy( UE_rrc_inst[ctxt_pP->module_id].sib10[eNB_index], &typeandinfo->choice.sib10, sizeof(SystemInformationBlockType10_t) ); + LOG_I( RRC, "[UE %"PRIu8"] Frame %"PRIu32" Found SIB10 from eNB %"PRIu8"\n", ctxt_pP->module_id, ctxt_pP->frame, eNB_index ); + } break; case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib11: - memcpy( UE_rrc_inst[ctxt_pP->module_id].sib11[eNB_index], &typeandinfo->choice.sib11, sizeof(SystemInformationBlockType11_t) ); - LOG_I( RRC, "[UE %"PRIu8"] Frame %"PRIu32" Found SIB11 from eNB %"PRIu8"\n", ctxt_pP->module_id, ctxt_pP->frame, eNB_index ); + if ((UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus&1024) == 0) { + UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus|=1024; + new_sib=1; + + memcpy( UE_rrc_inst[ctxt_pP->module_id].sib11[eNB_index], &typeandinfo->choice.sib11, sizeof(SystemInformationBlockType11_t) ); + LOG_I( RRC, "[UE %"PRIu8"] Frame %"PRIu32" Found SIB11 from eNB %"PRIu8"\n", ctxt_pP->module_id, ctxt_pP->frame, eNB_index ); + } break; #ifdef Rel10 case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib12_v920: - memcpy( UE_rrc_inst[ctxt_pP->module_id].sib12[eNB_index], &typeandinfo->choice.sib12_v920, sizeof(SystemInformationBlockType12_r9_t) ); - LOG_I( RRC, "[UE %"PRIu8"] Frame %"PRIu32" Found SIB12 from eNB %"PRIu8"\n", ctxt_pP->module_id, ctxt_pP->frame, eNB_index ); + if ((UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus&2048) == 0) { + UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus|=2048; + new_sib=1; + memcpy( UE_rrc_inst[ctxt_pP->module_id].sib12[eNB_index], &typeandinfo->choice.sib12_v920, sizeof(SystemInformationBlockType12_r9_t) ); + LOG_I( RRC, "[UE %"PRIu8"] Frame %"PRIu32" Found SIB12 from eNB %"PRIu8"\n", ctxt_pP->module_id, ctxt_pP->frame, eNB_index ); + } break; - + case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib13_v920: - memcpy( UE_rrc_inst[ctxt_pP->module_id].sib13[eNB_index], &typeandinfo->choice.sib13_v920, sizeof(SystemInformationBlockType13_r9_t) ); - LOG_I( RRC, "[UE %"PRIu8"] Frame %"PRIu32" Found SIB13 from eNB %"PRIu8"\n", ctxt_pP->module_id, ctxt_pP->frame, eNB_index ); - dump_sib13( UE_rrc_inst[ctxt_pP->module_id].sib13[eNB_index] ); - // adding here function to store necessary parameters for using in decode_MCCH_Message + maybe transfer to PHY layer - LOG_D( RRC, "[FRAME %05"PRIu32"][RRC_UE][MOD %02"PRIu8"][][--- MAC_CONFIG_REQ (SIB13 params eNB %"PRIu8") --->][MAC_UE][MOD %02"PRIu8"][]\n", - ctxt_pP->frame, ctxt_pP->module_id, eNB_index, ctxt_pP->module_id); - rrc_mac_config_req(ctxt_pP->module_id,0,ENB_FLAG_NO,0,eNB_index, - (RadioResourceConfigCommonSIB_t *)NULL, - (struct PhysicalConfigDedicated *)NULL, - (SCellToAddMod_r10_t *)NULL, - (MeasObjectToAddMod_t **)NULL, - (MAC_MainConfig_t *)NULL, - 0, - (struct LogicalChannelConfig *)NULL, - (MeasGapConfig_t *)NULL, - (TDD_Config_t *)NULL, - (MobilityControlInfo_t *)NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - (MBSFN_SubframeConfigList_t *)NULL, - 0, - &UE_rrc_inst[ctxt_pP->module_id].sib13[eNB_index]->mbsfn_AreaInfoList_r9, - (PMCH_InfoList_r9_t *)NULL + if ((UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus&4096) == 0) { + UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus|=4096; + new_sib=1; + + memcpy( UE_rrc_inst[ctxt_pP->module_id].sib13[eNB_index], &typeandinfo->choice.sib13_v920, sizeof(SystemInformationBlockType13_r9_t) ); + LOG_I( RRC, "[UE %"PRIu8"] Frame %"PRIu32" Found SIB13 from eNB %"PRIu8"\n", ctxt_pP->module_id, ctxt_pP->frame, eNB_index ); + dump_sib13( UE_rrc_inst[ctxt_pP->module_id].sib13[eNB_index] ); + // adding here function to store necessary parameters for using in decode_MCCH_Message + maybe transfer to PHY layer + LOG_D( RRC, "[FRAME %05"PRIu32"][RRC_UE][MOD %02"PRIu8"][][--- MAC_CONFIG_REQ (SIB13 params eNB %"PRIu8") --->][MAC_UE][MOD %02"PRIu8"][]\n", + ctxt_pP->frame, ctxt_pP->module_id, eNB_index, ctxt_pP->module_id); + rrc_mac_config_req(ctxt_pP->module_id,0,ENB_FLAG_NO,0,eNB_index, + (RadioResourceConfigCommonSIB_t *)NULL, + (struct PhysicalConfigDedicated *)NULL, + (SCellToAddMod_r10_t *)NULL, + (MeasObjectToAddMod_t **)NULL, + (MAC_MainConfig_t *)NULL, + 0, + (struct LogicalChannelConfig *)NULL, + (MeasGapConfig_t *)NULL, + (TDD_Config_t *)NULL, + (MobilityControlInfo_t *)NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + (MBSFN_SubframeConfigList_t *)NULL, + 0, + &UE_rrc_inst[ctxt_pP->module_id].sib13[eNB_index]->mbsfn_AreaInfoList_r9, + (PMCH_InfoList_r9_t *)NULL #ifdef CBA - ,0, - 0 + ,0, + 0 #endif - ); - UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus = 1; - break; + ); + break; + } #endif - default: break; } } + if (new_sib == 1) { + UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIcnt++; + + if (UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIcnt == sib1->schedulingInfoList.list.count) + rrc_set_sub_state( ctxt_pP->module_id, RRC_SUB_STATE_IDLE_SIB_COMPLETE ); + + LOG_I(RRC,"SIStatus %x, SIcnt %d/%d\n", + UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus, + UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIcnt, + sib1->schedulingInfoList.list.count); + } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_UE_DECODE_SI , VCD_FUNCTION_OUT); return 0; @@ -3705,7 +3773,7 @@ void *rrc_ue_task( void *args_p ) break; case MESSAGE_TEST: - LOG_I(RRC, "[UE %d] Received %s\n", ue_mod_id, msg_name); + LOG_D(RRC, "[UE %d] Received %s\n", ue_mod_id, msg_name); break; /* MAC messages */ @@ -3722,7 +3790,7 @@ void *rrc_ue_task( void *args_p ) break; case RRC_MAC_OUT_OF_SYNC_IND: - LOG_I(RRC, "[UE %d] Received %s: frameP %d, eNB %d\n", ue_mod_id, msg_name, + LOG_D(RRC, "[UE %d] Received %s: frameP %d, eNB %d\n", ue_mod_id, msg_name, RRC_MAC_OUT_OF_SYNC_IND (msg_p).frame, RRC_MAC_OUT_OF_SYNC_IND (msg_p).enb_index); UE_rrc_inst[ue_mod_id].Info[RRC_MAC_OUT_OF_SYNC_IND (msg_p).enb_index].N310_cnt ++; @@ -3743,7 +3811,7 @@ void *rrc_ue_task( void *args_p ) break; case RRC_MAC_CCCH_DATA_CNF: - LOG_I(RRC, "[UE %d] Received %s: eNB %d\n", ue_mod_id, msg_name, + LOG_D(RRC, "[UE %d] Received %s: eNB %d\n", ue_mod_id, msg_name, RRC_MAC_CCCH_DATA_CNF (msg_p).enb_index); // reset the tx buffer to indicate RRC that ccch was successfully transmitted (for example if contention resolution succeeds) @@ -3751,7 +3819,7 @@ void *rrc_ue_task( void *args_p ) break; case RRC_MAC_CCCH_DATA_IND: - LOG_I(RRC, "[UE %d] RNTI %x Received %s: frameP %d, eNB %d\n", + LOG_D(RRC, "[UE %d] RNTI %x Received %s: frameP %d, eNB %d\n", ue_mod_id, RRC_MAC_CCCH_DATA_IND (msg_p).rnti, msg_name, @@ -3773,7 +3841,7 @@ void *rrc_ue_task( void *args_p ) # ifdef Rel10 case RRC_MAC_MCCH_DATA_IND: - LOG_I(RRC, "[UE %d] Received %s: frameP %d, eNB %d, mbsfn SA %d\n", ue_mod_id, msg_name, + LOG_D(RRC, "[UE %d] Received %s: frameP %d, eNB %d, mbsfn SA %d\n", ue_mod_id, msg_name, RRC_MAC_MCCH_DATA_IND (msg_p).frame, RRC_MAC_MCCH_DATA_IND (msg_p).enb_index, RRC_MAC_MCCH_DATA_IND (msg_p).mbsfn_sync_area); //PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, ENB_FLAG_NO, M_RNTI, RRC_MAC_MCCH_DATA_IND (msg_p).frame, 0); @@ -3790,14 +3858,14 @@ void *rrc_ue_task( void *args_p ) /* PDCP messages */ case RRC_DCCH_DATA_IND: PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, RRC_DCCH_DATA_IND (msg_p).module_id, ENB_FLAG_NO, RRC_DCCH_DATA_IND (msg_p).rnti, RRC_DCCH_DATA_IND (msg_p).frame, 0,RRC_DCCH_DATA_IND (msg_p).eNB_index); - LOG_I(RRC, "[UE %d] Received %s: frameP %d, DCCH %d, eNB %d\n", + LOG_D(RRC, "[UE %d] Received %s: frameP %d, DCCH %d, eNB %d\n", RRC_DCCH_DATA_IND (msg_p).module_id, msg_name, RRC_DCCH_DATA_IND (msg_p).frame, RRC_DCCH_DATA_IND (msg_p).dcch_index, RRC_DCCH_DATA_IND (msg_p).eNB_index); - LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT"Received %s DCCH %d, eNB %d\n", + LOG_D(RRC, PROTOCOL_RRC_CTXT_UE_FMT"Received %s DCCH %d, eNB %d\n", PROTOCOL_RRC_CTXT_UE_ARGS(&ctxt), msg_name, RRC_DCCH_DATA_IND (msg_p).dcch_index, @@ -3818,7 +3886,7 @@ void *rrc_ue_task( void *args_p ) case NAS_CELL_SELECTION_REQ: ue_mod_id = 0; /* TODO force ue_mod_id to first UE, NAS UE not virtualized yet */ - LOG_I(RRC, "[UE %d] Received %s: state %d, plmnID %d, rat %x\n", ue_mod_id, msg_name, rrc_get_state(ue_mod_id), + LOG_D(RRC, "[UE %d] Received %s: state %d, plmnID %d, rat %x\n", ue_mod_id, msg_name, rrc_get_state(ue_mod_id), NAS_CELL_SELECTION_REQ (msg_p).plmnID, NAS_CELL_SELECTION_REQ (msg_p).rat); if (rrc_get_state(ue_mod_id) == RRC_STATE_INACTIVE) { @@ -3830,7 +3898,7 @@ void *rrc_ue_task( void *args_p ) { UE_rrc_inst[ue_mod_id].plmnID = NAS_CELL_SELECTION_REQ (msg_p).plmnID; UE_rrc_inst[ue_mod_id].rat = NAS_CELL_SELECTION_REQ (msg_p).rat; - LOG_I(RRC, "[UE %d] Save cell selection criterion MCC %X%X%X MNC %X%X%X\n", + LOG_D(RRC, "[UE %d] Save cell selection criterion MCC %X%X%X MNC %X%X%X\n", ue_mod_id, UE_rrc_inst[ue_mod_id].plmnID.MCCdigit1, UE_rrc_inst[ue_mod_id].plmnID.MCCdigit2, @@ -3882,7 +3950,7 @@ void *rrc_ue_task( void *args_p ) break; case NAS_CONN_ESTABLI_REQ: - LOG_I(RRC, "[UE %d] Received %s: cause %d, type %d, s_tmsi %d, plmnID %d\n", ue_mod_id, msg_name, NAS_CONN_ESTABLI_REQ (msg_p).cause, + LOG_D(RRC, "[UE %d] Received %s: cause %d, type %d, s_tmsi %d, plmnID %d\n", ue_mod_id, msg_name, NAS_CONN_ESTABLI_REQ (msg_p).cause, NAS_CONN_ESTABLI_REQ (msg_p).type, NAS_CONN_ESTABLI_REQ (msg_p).s_tmsi, NAS_CONN_ESTABLI_REQ (msg_p).plmnID); //PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, ENB_FLAG_NO, NOT_A_RNTI, 0, 0); @@ -3894,7 +3962,7 @@ void *rrc_ue_task( void *args_p ) case RRC_STATE_IDLE: { if (rrc_get_sub_state(ue_mod_id) == RRC_SUB_STATE_IDLE_SIB_COMPLETE) { rrc_ue_generate_RRCConnectionRequest(&ctxt, 0); - LOG_I(RRC, "not sending connection request\n"); + LOG_D(RRC, "not sending connection request\n"); rrc_set_sub_state (ue_mod_id, RRC_SUB_STATE_IDLE_CONNECTING); } @@ -3919,7 +3987,7 @@ void *rrc_ue_task( void *args_p ) uint32_t length; uint8_t *buffer; - LOG_I(RRC, "[UE %d] Received %s: UEid %d\n", ue_mod_id, msg_name, NAS_UPLINK_DATA_REQ (msg_p).UEid); + LOG_D(RRC, "[UE %d] Received %s: UEid %d\n", ue_mod_id, msg_name, NAS_UPLINK_DATA_REQ (msg_p).UEid); /* Create message for PDCP (ULInformationTransfer_t) */ length = do_ULInformationTransfer(&buffer, NAS_UPLINK_DATA_REQ (msg_p).nasMsg.length, NAS_UPLINK_DATA_REQ (msg_p).nasMsg.data); @@ -3940,7 +4008,7 @@ void *rrc_ue_task( void *args_p ) # if defined(ENABLE_RAL) case RRC_RAL_SCAN_REQ: - LOG_I(RRC, "[UE %d] Received %s: state %d\n", ue_mod_id, msg_name); + LOG_D(RRC, "[UE %d] Received %s: state %d\n", ue_mod_id, msg_name); switch (rrc_get_state(ue_mod_id)) { case RRC_STATE_INACTIVE: { @@ -3987,7 +4055,7 @@ void *rrc_ue_task( void *args_p ) break; case PHY_FIND_CELL_IND: - LOG_I(RRC, "[UE %d] Received %s: state %d\n", ue_mod_id, msg_name, rrc_get_state(ue_mod_id)); + LOG_D(RRC, "[UE %d] Received %s: state %d\n", ue_mod_id, msg_name, rrc_get_state(ue_mod_id)); switch (rrc_get_state(ue_mod_id)) { case RRC_STATE_IDLE: @@ -4051,7 +4119,7 @@ void *rrc_ue_task( void *args_p ) &PHY_MEAS_REPORT_IND(msg_p).link_param, sizeof(RRC_RAL_MEASUREMENT_REPORT_IND (message_p).link_param)); - LOG_I(RRC, "[UE %d] PHY_MEAS_REPORT_IN: sending msg %s to %s \n", ue_mod_id, "RRC_RAL_MEASUREMENT_REPORT_IND", "TASK_RAL_UE"); + LOG_D(RRC, "[UE %d] PHY_MEAS_REPORT_IN: sending msg %s to %s \n", ue_mod_id, "RRC_RAL_MEASUREMENT_REPORT_IND", "TASK_RAL_UE"); itti_send_msg_to_task(TASK_RAL_UE, instance, message_p); break; } @@ -4061,14 +4129,14 @@ void *rrc_ue_task( void *args_p ) break; case RRC_RAL_CONNECTION_ESTABLISHMENT_REQ: - LOG_I(RRC, "[UE %d] Received %s\n", ue_mod_id, msg_name); + LOG_D(RRC, "[UE %d] Received %s\n", ue_mod_id, msg_name); switch (rrc_get_state(ue_mod_id)) { case RRC_STATE_IDLE: { if (rrc_get_sub_state(ue_mod_id) == RRC_SUB_STATE_IDLE_SIB_COMPLETE) { PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, ue_mod_id, ENB_FLAG_NO, UE_rrc_inst[ue_mod_id].Info[0].rnti, 0, 0, 0); rrc_ue_generate_RRCConnectionRequest(&ctxt, 0); - LOG_I(RRC, "not sending connection request\n"); + LOG_D(RRC, "not sending connection request\n"); rrc_set_sub_state (ue_mod_id, RRC_SUB_STATE_IDLE_CONNECTING); } @@ -4090,7 +4158,7 @@ void *rrc_ue_task( void *args_p ) case RRC_RAL_CONNECTION_RELEASE_REQ: ue_mod_id = 0; /* TODO force ue_mod_id to first UE, NAS UE not virtualized yet */ - LOG_I(RRC, "[UE %d] Received %s\n", ue_mod_id, msg_name); + LOG_D(RRC, "[UE %d] Received %s\n", ue_mod_id, msg_name); break; #endif diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 265ccbdcf17bf48a8a32f08cd6e16aeb0186b9c8..1d2fa2c9d18b4e8a65b2f62bcce55e0573179245 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -283,7 +283,7 @@ double rx_gain[MAX_NUM_CCs][4] = {{110,0,0,0}}; #endif double sample_rate=30.72e6; -double bw = 14e6; +double bw = 10.0e6; static int tx_max_power[MAX_NUM_CCs]; /* = {0,0}*/; @@ -2537,7 +2537,7 @@ int main( int argc, char **argv ) } #endif -#ifdef NAS_NETLINK +#ifdef PDCP_USE_NETLINK netlink_init(); #endif @@ -2774,6 +2774,7 @@ int main( int argc, char **argv ) if(frame_parms[0]->N_RB_DL == 100) { sample_rate = 30.72e6; + bw = 10.0e6; #ifndef EXMIMO openair0_cfg[0].samples_per_packet = 2048; samples_per_frame = 307200; @@ -2783,6 +2784,7 @@ int main( int argc, char **argv ) #endif } else if(frame_parms[0]->N_RB_DL == 50) { sample_rate = 15.36e6; + bw = 5.0e6; #ifndef EXMIMO openair0_cfg[0].samples_per_packet = 2048; samples_per_frame = 153600; @@ -2791,6 +2793,7 @@ int main( int argc, char **argv ) #endif } else if (frame_parms[0]->N_RB_DL == 25) { sample_rate = 7.68e6; + bw = 2.5e6; #ifndef EXMIMO openair0_cfg[0].samples_per_packet = 1024; samples_per_frame = 76800; @@ -2799,6 +2802,7 @@ int main( int argc, char **argv ) #endif } else if (frame_parms[0]->N_RB_DL == 6) { sample_rate = 1.92e6; + bw = 0.96e6; #ifndef EXMIMO openair0_cfg[0].samples_per_packet = 256; samples_per_frame = 19200; @@ -2961,8 +2965,11 @@ int main( int argc, char **argv ) // connect the TX/RX buffers if (UE_flag==1) { - openair_daq_vars.timing_advance = 0; - +#ifdef OAI_USRP + openair_daq_vars.timing_advance = 160; +#else + openair_daq_vars.timing_advance = 170; +#endif if (setup_ue_buffers(UE,&openair0_cfg[0],rf_map)!=0) { printf("Error setting up eNB buffer\n"); exit(-1); diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 1f522b56d9f5cbaf7cc005c16fac6101ede976af..6ea807ac6b32f8b1fdb97fb67f485c050227035e 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -390,6 +390,7 @@ static void *UE_thread_synch(void *arg) case pbch: + if (initial_sync( UE, UE->mode ) == 0) { hw_slot_offset = (UE->rx_offset<<1) / UE->lte_frame_parms.samples_per_tti; @@ -410,15 +411,23 @@ static void *UE_thread_synch(void *arg) switch(UE->lte_frame_parms.N_RB_DL) { case 6: openair0_cfg[0].sample_rate =1.92e6; + openair0_cfg[0].rx_bw =.96e6; + openair0_cfg[0].tx_bw =.96e6; break; case 25: - openair0_cfg[0].sample_rate=7.68e6; + openair0_cfg[0].sample_rate =7.68e6; + openair0_cfg[0].rx_bw =2.5e6; + openair0_cfg[0].tx_bw =2.5e6; break; case 50: - openair0_cfg[0].sample_rate=15.36e6; + openair0_cfg[0].sample_rate =15.36e6; + openair0_cfg[0].rx_bw =5.0e6; + openair0_cfg[0].tx_bw =5.0e6; break; case 100: openair0_cfg[0].sample_rate=30.72e6; + openair0_cfg[0].rx_bw=10.0e6; + openair0_cfg[0].tx_bw=10.0e6; break; } @@ -687,6 +696,27 @@ static void *UE_thread_tx(void *arg) * \param arg is a pointer to a \ref PHY_VARS_UE structure. * \returns a pointer to an int. The storage is not on the heap and must not be freed. */ + +#ifdef OAI_USRP +void rescale(int16_t *input,int length) +{ +#if defined(__x86_64__) || defined(__i386__) + __m128i *input128 = (__m128i *)input; +#elif defined(__arm__) + int16x8_t *input128 = (int16x8_t *)input; +#endif + int i; + + for (i=0; i<length>>2; i++) { +#if defined(__x86_64__) || defined(__i386__) + input128[i] = _mm_srai_epi16(input128[i],4); +#elif defined(__arm__) + input128[i] = vshrq_n_s16(input128[i],4); +#endif + } +} +#endif + static void *UE_thread_rx(void *arg) { static int UE_thread_rx_retval; @@ -767,11 +797,78 @@ static void *UE_thread_rx(void *arg) for (i=0; i<2; i++) { if ((subframe_select( &UE->lte_frame_parms, UE->slot_rx>>1 ) == SF_DL) || (UE->lte_frame_parms.frame_type == FDD)) { +#ifdef OAI_USRP + // this does the adjustments of RX signal amplitude to bring into least 12 significant bits + int slot_length = UE->lte_frame_parms.samples_per_tti>>1; + int rx_offset = (UE->slot_rx)*slot_length + UE->rx_offset; + int frame_length = UE->lte_frame_parms.samples_per_tti*10; + int aa; + if (rx_offset > frame_length) + rx_offset-=frame_length; + + + if (rx_offset >= 0) { + if (rx_offset + slot_length < frame_length) + for (aa=0;aa<UE->lte_frame_parms.nb_antennas_rx;aa++) + rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][rx_offset&(~0x3)], + slot_length); + else { + int diff = rx_offset + slot_length - frame_length; + for (aa=0;aa<UE->lte_frame_parms.nb_antennas_rx;aa++){ + rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][rx_offset&(~0x3)], + slot_length-diff); + rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][0], + diff); + } + } + } + else { + for (aa=0;aa<UE->lte_frame_parms.nb_antennas_rx;aa++){ + rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][(frame_length+rx_offset)&(~0x3)], + -rx_offset); + rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][0], + slot_length+rx_offset); + } + } +#endif phy_procedures_UE_RX( UE, 0, 0, UE->mode, no_relay, NULL ); } if ((subframe_select( &UE->lte_frame_parms, UE->slot_rx>>1 ) == SF_S) && ((UE->slot_rx&1) == 0)) { +#ifdef OAI_USRP + // this does the adjustments of RX signal amplitude to bring into least 12 significant bits + int slot_length = UE->lte_frame_parms.samples_per_tti>>1; + int rx_offset = (UE->slot_rx)*slot_length + UE->rx_offset; + int frame_length = UE->lte_frame_parms.samples_per_tti*10; + if (rx_offset > frame_length) + rx_offset-=frame_length; + int aa; + + if (rx_offset >= 0) { + if (rx_offset + slot_length < frame_length) + for (aa=0;aa<UE->lte_frame_parms.nb_antennas_rx;aa++) + rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][rx_offset&(~0x3)], + slot_length); + else { + int diff = rx_offset + slot_length - frame_length; + for (aa=0;aa<UE->lte_frame_parms.nb_antennas_rx;aa++){ + rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][rx_offset&(~0x3)], + slot_length-diff); + rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][0], + diff); + } + } + } + else { + for (aa=0;aa<UE->lte_frame_parms.nb_antennas_rx;aa++){ + rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][(frame_length+rx_offset)&(~0x3)], + -rx_offset); + rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][0], + slot_length+rx_offset); + } + } +#endif phy_procedures_UE_RX( UE, 0, 0, UE->mode, no_relay, NULL ); } @@ -938,9 +1035,9 @@ void *UE_thread(void *arg) for (int i=0; i<UE->lte_frame_parms.nb_antennas_rx; i++) rxp[i] = (dummy_dump==0) ? (void*)&rxdata[i][rxpos] : (void*)dummy[i]; - // if (dummy_dump == 0) - // printf("writing %d samples to %d\n",spp - ((first_rx==1) ? rx_off_diff : 0),rxpos); - + /* if (dummy_dump == 0) + printf("writing %d samples to %d (first_rx %d)\n",spp - ((first_rx==1) ? rx_off_diff : 0),rxpos,first_rx); + */ rxs = openair0.trx_read_func(&openair0, ×tamp, rxp, @@ -952,7 +1049,9 @@ void *UE_thread(void *arg) return &UE_thread_retval; } - rx_off_diff = 0; + if (rx_off_diff !=0) + LOG_I(PHY,"frame %d, rx_offset %d, rx_off_diff %d\n",UE->frame_rx,UE->rx_offset,rx_off_diff); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); // Transmit TX buffer based on timestamp from RX @@ -968,7 +1067,7 @@ void *UE_thread(void *arg) openair0.trx_write_func(&openair0, (timestamp+spp*tx_delay-tx_forward_nsamps), txp, - spp, + spp - ((first_rx==1) ? rx_off_diff : 0), UE->lte_frame_parms.nb_antennas_tx, 1); @@ -980,6 +1079,9 @@ void *UE_thread(void *arg) rt_sleep_ns(1000000); #endif + rx_off_diff = 0; + first_rx = 0; + rxpos += spp; txpos += spp; @@ -1128,6 +1230,7 @@ void *UE_thread(void *arg) rx_off_diff = 0; LTE_DL_FRAME_PARMS *frame_parms = &UE->lte_frame_parms; // for macro FRAME_LENGTH_COMPLEX_SAMPLES + // LOG_I(PHY,"UE->rx_offset %d\n",UE->rx_offset); if ((UE->rx_offset > RX_OFF_MAX) && (start_rx_stream == 0)) { start_rx_stream=1; frame=0; @@ -1148,11 +1251,20 @@ void *UE_thread(void *arg) #endif UE->rx_offset=0; tx_enabled = 1; - } else if ((UE->rx_offset < RX_OFF_MIN) && (start_rx_stream==1) && (rx_correction_timer == 0)) { + } else if ((UE->rx_offset<(FRAME_LENGTH_COMPLEX_SAMPLES/2)) && + (UE->rx_offset > RX_OFF_MIN) && + (start_rx_stream==1) && + (rx_correction_timer == 0)) { rx_off_diff = -UE->rx_offset + RX_OFF_MIN; + LOG_D(PHY,"UE->rx_offset %d > %d, diff %d\n",UE->rx_offset,RX_OFF_MIN,rx_off_diff); rx_correction_timer = 5; - } else if ((UE->rx_offset > (FRAME_LENGTH_COMPLEX_SAMPLES-RX_OFF_MAX)) && (start_rx_stream==1) && (rx_correction_timer == 0)) { - rx_off_diff = FRAME_LENGTH_COMPLEX_SAMPLES-UE->rx_offset; + } else if ((UE->rx_offset>(FRAME_LENGTH_COMPLEX_SAMPLES/2)) && + (UE->rx_offset < (FRAME_LENGTH_COMPLEX_SAMPLES-RX_OFF_MIN)) && + (start_rx_stream==1) && + (rx_correction_timer == 0)) { // moving to the left so drop rx_off_diff samples + rx_off_diff = FRAME_LENGTH_COMPLEX_SAMPLES - RX_OFF_MIN - UE->rx_offset; + LOG_D(PHY,"UE->rx_offset %d < %d, diff %d\n",UE->rx_offset,FRAME_LENGTH_COMPLEX_SAMPLES-RX_OFF_MIN,rx_off_diff);(UE->rx_offset>(FRAME_LENGTH_COMPLEX_SAMPLES/2)); + rx_correction_timer = 5; }