From b72ca3ee206b87107b6e9c5eea4c68f79aba082d Mon Sep 17 00:00:00 2001 From: Raymond Knopp <raymond.knopp@eurecom.fr> Date: Sun, 11 Jan 2015 18:41:40 +0000 Subject: [PATCH] git-svn-id: http://svn.eurecom.fr/openair4G/trunk@6348 818b1a75-f10b-46b9-bf7c-635c3b92a50f --- .../lte_dl_channel_estimation.c | 4 +- openair1/PHY/MODULATION/slot_fep.c | 4 +- openair1/PHY/MODULATION/slot_fep_mbsfn.c | 4 +- openair1/PHY/defs.h | 1 + openair1/SCHED/phy_procedures_lte_ue.c | 9 +- openair1/SIMULATION/LTE_PHY/dlsim.c | 17 +- openair1/SIMULATION/LTE_PHY/mbmssim.c | 13 +- openair1/SIMULATION/LTE_PHY/pdcchsim.c | 19 +- openair2/LAYER2/MAC/eNB_scheduler_ulsch.c | 2 +- openair2/LAYER2/MAC/main.c | 8 +- openair2/LAYER2/MAC/proto.h | 4 +- openair2/PHY_INTERFACE/defs.h | 2 +- openair2/RRC/LITE/MESSAGES/asn1_msg.c | 256 +++++----- openair2/RRC/LITE/MESSAGES/asn1_msg.h | 2 +- openair2/RRC/LITE/proto.h | 2 +- openair2/RRC/LITE/rrc_common.c | 9 +- openair2/UTIL/LOG/vcd_signal_dumper.c | 1 + openair2/UTIL/LOG/vcd_signal_dumper.h | 1 + .../ARCH/ETHERNET/USERSPACE/LIB/Makefile.inc | 2 +- .../ETHERNET/USERSPACE/LIB/ethernet_lib.c | 14 +- .../GENERIC-LTE-EPC/CONF/UE_config.xml | 112 +++++ .../CONF/enb.band7.exmimo2.conf | 10 + .../CONF/enb.band7.tm1.usrpb210.conf | 143 ------ targets/RT/USER/Makefile | 6 +- targets/RT/USER/lte-softmodem.c | 473 +++++++++++------- targets/RT/USER/ue.gtkw | 25 +- targets/SIMU/USER/oaisim_functions.c | 1 + targets/build_helper.bash | 14 +- 28 files changed, 635 insertions(+), 523 deletions(-) create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/UE_config.xml delete mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c index 2fcec9c256..73e7bfb807 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c @@ -616,7 +616,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, } -#ifndef PERFECT_CE + if (phy_vars_ue->perfect_ce == 0) { // Temporal Interpolation // printf("ch_offset %d\n",ch_offset); @@ -691,7 +691,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, } } -#endif + } } void (*idft)(int16_t *,int16_t *, int); diff --git a/openair1/PHY/MODULATION/slot_fep.c b/openair1/PHY/MODULATION/slot_fep.c index 3f29747abd..6fea6c858c 100644 --- a/openair1/PHY/MODULATION/slot_fep.c +++ b/openair1/PHY/MODULATION/slot_fep.c @@ -153,7 +153,7 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue, } -#ifndef PERFECT_CE + if (phy_vars_ue->perfect_ce == 0) { if ((l==0) || (l==(4-frame_parms->Ncp))) { for (aa=0;aa<frame_parms->nb_antennas_tx_eNB;aa++) { @@ -193,7 +193,7 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue, } } -#endif + } #ifdef DEBUG_FEP msg("slot_fep: done\n"); #endif diff --git a/openair1/PHY/MODULATION/slot_fep_mbsfn.c b/openair1/PHY/MODULATION/slot_fep_mbsfn.c index f918ecf622..81d200b34b 100644 --- a/openair1/PHY/MODULATION/slot_fep_mbsfn.c +++ b/openair1/PHY/MODULATION/slot_fep_mbsfn.c @@ -173,7 +173,7 @@ int slot_fep_mbsfn(PHY_VARS_UE *phy_vars_ue, // changed to invoke MBSFN channel estimation in symbols 2,6,10 if ((l==2)||(l==6)||(l==10)) { for (aa=0;aa<frame_parms->nb_antennas_tx;aa++) { -#ifndef PERFECT_CE + if (phy_vars_ue->perfect_ce == 0) { #ifdef DEBUG_FEP msg("Channel estimation eNB %d, aatx %d, subframe %d, symbol %d\n",eNB_id,aa,subframe,l); #endif @@ -201,7 +201,6 @@ int slot_fep_mbsfn(PHY_VARS_UE *phy_vars_ue, l, symbol); */ // } -#endif // do frequency offset estimation here! // use channel estimates from current symbol (=ch_t) and last symbol (ch_{t-1}) @@ -215,6 +214,7 @@ int slot_fep_mbsfn(PHY_VARS_UE *phy_vars_ue, l, &ue_common_vars->freq_offset); */ } + } } #ifdef DEBUG_FEP msg("slot_fep_mbsfn: done\n"); diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 0c54f5095a..2bf159e9a8 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -434,6 +434,7 @@ typedef struct uint32_t X_u[64][839]; uint32_t high_speed_flag; + uint32_t perfect_ce; int16_t ch_est_alpha; char ulsch_no_allocation_counter[NUMBER_OF_CONNECTED_eNB_MAX]; diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index b8e7f6c884..1d97be9205 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -1905,10 +1905,12 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst eNB_id,subframe_rx); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DCI_DECODING, VCD_FUNCTION_OUT); //LOG_D(PHY,"[UE %d][PUSCH] Frame %d subframe %d PHICH RX\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx); - + if (is_phich_subframe(&phy_vars_ue->lte_frame_parms,subframe_rx)) { + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PHICH, VCD_FUNCTION_IN); rx_phich(phy_vars_ue, subframe_rx,eNB_id); + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PHICH, VCD_FUNCTION_OUT); } } #ifdef PHY_ABSTRACTION @@ -2318,6 +2320,9 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst int CC_id = phy_vars_ue->CC_id; vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_IN); + vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_SLOT_NUMBER_UE, (slot_rx + 1) % 20); + vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_UE, frame_rx); + start_meas(&phy_vars_ue->phy_proc_rx); #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[%s %d] Frame %d subframe %d: Doing phy_procedures_UE_RX(%d)\n", @@ -3426,8 +3431,6 @@ void phy_UE_lte_check_measurement_thresholds(instance_t instanceP, ral_threshold prach_resources_local.ra_PreambleIndex = 0; #endif - vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_SLOT_NUMBER_UE, (slot_rx + 1) % 20); - vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_UE, frame_rx); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_LTE,1); #ifdef EXMIMO diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index 8aaebe9d33..16ea1c1d85 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -73,7 +73,6 @@ extern unsigned char offset_mumimo_llr_drange_fix; //#define ABSTRACTION -//#define PERFECT_CE /* #define RBmask0 0x00fc00fc @@ -107,7 +106,7 @@ void handler(int sig) { exit(1); } -void lte_param_init(unsigned char N_tx, unsigned char N_rx,unsigned char transmission_mode,uint8_t extended_prefix_flag,uint8_t fdd_flag, uint16_t Nid_cell,uint8_t tdd_config,uint8_t N_RB_DL,uint8_t osf) { +void lte_param_init(unsigned char N_tx, unsigned char N_rx,unsigned char transmission_mode,uint8_t extended_prefix_flag,uint8_t fdd_flag, uint16_t Nid_cell,uint8_t tdd_config,uint8_t N_RB_DL,uint8_t osf,uint32_t perfect_ce) { LTE_DL_FRAME_PARMS *lte_frame_parms; int i; @@ -186,6 +185,7 @@ void lte_param_init(unsigned char N_tx, unsigned char N_rx,unsigned char transmi ((PHY_vars_UE->lte_frame_parms).pdsch_config_common).p_b = 1; } + PHY_vars_UE->perfect_ce = perfect_ce; printf("Done lte_param_init\n"); @@ -344,6 +344,7 @@ int main(int argc, char **argv) { char channel_model_input[10]="I"; int TB0_active = 1; + uint32_t perfect_ce = 0; LTE_DL_UE_HARQ_t *dlsch0_ue_harq; LTE_DL_eNB_HARQ_t *dlsch0_eNB_harq; @@ -365,8 +366,9 @@ int main(int argc, char **argv) { n_frames = 1000; snr0 = 0; num_layers = 1; + perfect_ce = 0; - while ((c = getopt (argc, argv, "ahdpZDe:m:n:o:s:f:t:c:g:r:F:x:y:z:AM:N:I:i:O:R:S:C:T:b:u:v:w:B:PLl:")) != -1) { + while ((c = getopt (argc, argv, "ahdpZDe:m:n:o:s:f:t:c:g:r:F:x:y:z:AM:N:I:i:O:R:S:C:T:b:u:v:w:B:PLl:Y")) != -1) { switch (c) { case 'a': @@ -564,6 +566,9 @@ int main(int argc, char **argv) { case 'Z': dump_table=1; break; + case 'Y': + perfect_ce=1; + break; case 'h': default: printf("%s -h(elp) -a(wgn on) -d(ci decoding on) -p(extended prefix on) -m mcs1 -M mcs2 -n n_frames -s snr0 -x transmission mode (1,2,5,6) -y TXant -z RXant -I trch_file\n",argv[0]); @@ -645,7 +650,7 @@ int main(int argc, char **argv) { printf("dual_stream_UE=%d\n", dual_stream_UE); } - lte_param_init(n_tx,n_rx,transmission_mode,extended_prefix_flag,fdd_flag,Nid_cell,tdd_config,N_RB_DL,osf); + lte_param_init(n_tx,n_rx,transmission_mode,extended_prefix_flag,fdd_flag,Nid_cell,tdd_config,N_RB_DL,osf,perfect_ce); eNB_id_i = PHY_vars_UE->n_connected_eNB; @@ -2718,7 +2723,7 @@ int main(int argc, char **argv) { 0, 0); stop_meas(&PHY_vars_UE->ofdm_demod_stats); -#ifdef PERFECT_CE + if (PHY_vars_UE->perfect_ce==1) { if (awgn_flag==0) { // fill in perfect channel estimates freq_channel(eNB2UE[round],PHY_vars_UE->lte_frame_parms.N_RB_DL,12*PHY_vars_UE->lte_frame_parms.N_RB_DL + 1); @@ -2751,7 +2756,7 @@ int main(int argc, char **argv) { } } } -#endif + } if ((Ns==((2*subframe))) && (l==0)) { diff --git a/openair1/SIMULATION/LTE_PHY/mbmssim.c b/openair1/SIMULATION/LTE_PHY/mbmssim.c index 1f76a1a73b..100f794b1e 100644 --- a/openair1/SIMULATION/LTE_PHY/mbmssim.c +++ b/openair1/SIMULATION/LTE_PHY/mbmssim.c @@ -60,7 +60,7 @@ PHY_VARS_eNB *PHY_vars_eNB; PHY_VARS_UE *PHY_vars_UE; -void lte_param_init(unsigned char N_tx, unsigned char N_rx,unsigned char transmission_mode,uint8_t extended_prefix_flag,lte_frame_type_t frame_type, uint16_t Nid_cell,uint8_t tdd_config,uint8_t N_RB_DL,uint8_t osf) { +void lte_param_init(unsigned char N_tx, unsigned char N_rx,unsigned char transmission_mode,uint8_t extended_prefix_flag,lte_frame_type_t frame_type, uint16_t Nid_cell,uint8_t tdd_config,uint8_t N_RB_DL,uint8_t osf,uint32_t perfect_ce) { LTE_DL_FRAME_PARMS *lte_frame_parms; @@ -121,7 +121,8 @@ void lte_param_init(unsigned char N_tx, unsigned char N_rx,unsigned char transmi phy_init_lte_ue(PHY_vars_UE,1,0); phy_init_lte_eNB(PHY_vars_eNB,0,0,0); - + + PHY_vars_UE->perfect_ce = perfect_ce; printf("Done lte_param_init\n"); @@ -174,6 +175,7 @@ int main(int argc, char **argv) { uint8_t N_RB_DL=25,osf=1; double BW=5.0; + uint32_t perfect_ce = 0; lte_frame_type_t frame_type = FDD; @@ -201,7 +203,7 @@ int main(int argc, char **argv) { rxdata[0] = (int *)malloc16(FRAME_LENGTH_BYTES); rxdata[1] = (int *)malloc16(FRAME_LENGTH_BYTES); */ - while ((c = getopt (argc, argv, "ahA:Cp:n:s:S:t:x:y:z:N:F:R:O:dm:i:")) != -1) + while ((c = getopt (argc, argv, "ahA:Cp:n:s:S:t:x:y:z:N:F:R:O:dm:i:Y")) != -1) { switch (c) { @@ -266,6 +268,9 @@ int main(int argc, char **argv) { case 'O': osf = atoi(optarg); break; + case 'Y': + perfect_ce = 1; + break; default: case 'h': printf("%s -h(elp) -p(subframe) -N cell_id -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -i snr increment -z RXant \n",argv[0]); @@ -309,7 +314,7 @@ int main(int argc, char **argv) { if (transmission_mode==2) n_tx=2; - lte_param_init(n_tx,n_rx,transmission_mode,extended_prefix_flag,frame_type,Nid_cell,tdd_config,N_RB_DL,osf); + lte_param_init(n_tx,n_rx,transmission_mode,extended_prefix_flag,frame_type,Nid_cell,tdd_config,N_RB_DL,osf,perfect_ce); diff --git a/openair1/SIMULATION/LTE_PHY/pdcchsim.c b/openair1/SIMULATION/LTE_PHY/pdcchsim.c index b1098e5658..d707171443 100644 --- a/openair1/SIMULATION/LTE_PHY/pdcchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pdcchsim.c @@ -59,7 +59,7 @@ PHY_VARS_UE *PHY_vars_UE; #define CCCH_RB_ALLOC computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,0,2) #define DLSCH_RB_ALLOC 0x1fbf // igore DC component,RB13 -void lte_param_init(unsigned char N_tx, unsigned char N_rx,unsigned char transmission_mode,unsigned char extended_prefix_flag,uint16_t Nid_cell,uint8_t tdd_config,uint8_t N_RB_DL,lte_frame_type_t frame_type,uint8_t osf) { +void lte_param_init(unsigned char N_tx, unsigned char N_rx,unsigned char transmission_mode,unsigned char extended_prefix_flag,uint16_t Nid_cell,uint8_t tdd_config,uint8_t N_RB_DL,lte_frame_type_t frame_type,uint8_t osf,uint32_t perfect_ce) { unsigned int i; LTE_DL_FRAME_PARMS *lte_frame_parms; @@ -135,6 +135,7 @@ void lte_param_init(unsigned char N_tx, unsigned char N_rx,unsigned char transmi PHY_vars_UE->PHY_measurements.n_adj_cells=2; PHY_vars_UE->PHY_measurements.adj_cell_id[0] = Nid_cell+1; PHY_vars_UE->PHY_measurements.adj_cell_id[1] = Nid_cell+2; + PHY_vars_UE->perfect_ce = perfect_ce; for (i=0;i<3;i++) lte_gold(lte_frame_parms,PHY_vars_UE->lte_gold_table[i],Nid_cell+i); @@ -548,10 +549,9 @@ int main(int argc, char **argv) { int re_offset; uint32_t *txptr; int aarx; -#ifdef PERFECT_CE int k; -#endif double BW=5.0; + uint32_t perfect_ce = 0; number_of_cards = 1; openair_daq_vars.rx_rf_mode = 1; @@ -565,7 +565,7 @@ int main(int argc, char **argv) { rxdata[0] = (int *)malloc16(FRAME_LENGTH_BYTES); rxdata[1] = (int *)malloc16(FRAME_LENGTH_BYTES); */ - while ((c = getopt (argc, argv, "hapFg:R:c:n:s:x:y:z:L:M:N:I:f:i:S:P:")) != -1) { + while ((c = getopt (argc, argv, "hapFg:R:c:n:s:x:y:z:L:M:N:I:f:i:S:P:Y")) != -1) { switch (c) { case 'a': @@ -699,6 +699,9 @@ int main(int argc, char **argv) { case 'P': num_phich_interf=atoi(optarg); break; + case 'Y': + perfect_ce = 1; + break; case 'h': printf("%s -h(elp) -a(wgn on) -c tdd_config -n n_frames -r RiceanFactor -s snr0 -t Delayspread -x transmission mode (1,2,6) -y TXant -z RXant -L AggregLevelUEspec -M AggregLevelCommonDCI -N DCIFormat\n\n",argv[0]); printf("-h This message\n"); @@ -757,7 +760,8 @@ int main(int argc, char **argv) { Nid_cell, tdd_config, N_RB_DL,frame_type, - osf); + osf, + perfect_ce); #ifdef XFORMS fl_initialize (&argc, argv, NULL, 0, 0); @@ -1131,7 +1135,7 @@ int main(int argc, char **argv) { 0, 0); -#ifdef PERFECT_CE + if (PHY_vars_UE->perfect_ce == 1) { if (awgn_flag==0) { // fill in perfect channel estimates freq_channel(eNB2UE,PHY_vars_UE->lte_frame_parms.N_RB_DL,12*PHY_vars_UE->lte_frame_parms.N_RB_DL + 1); @@ -1164,8 +1168,7 @@ int main(int argc, char **argv) { } } } -#endif - + } if (l==((PHY_vars_eNB->lte_frame_parms.Ncp==0)?4:3)) { diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c index 416cea7dc0..dc7a1f013d 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c @@ -567,7 +567,7 @@ void schedule_ulsch_rnti(module_id_t module_idP, uint16_t TBS,i; int32_t buffer_occupancy=0; uint32_t cqi_req,cshift,ndi,mcs,rballoc,tpc; - int32_t normalized_rx_power, target_rx_power=-75; + int32_t normalized_rx_power, target_rx_power=-90; static int32_t tpc_accumulated=0; int n,CC_id; diff --git a/openair2/LAYER2/MAC/main.c b/openair2/LAYER2/MAC/main.c index 6757717446..e4a0f8ad20 100644 --- a/openair2/LAYER2/MAC/main.c +++ b/openair2/LAYER2/MAC/main.c @@ -112,7 +112,7 @@ void mac_UE_out_of_sync_ind(module_id_t module_idP, frame_t frameP, uint16_t eNB } -int mac_top_init(int eMBMS_active, uint8_t cba_group_active, uint8_t HO_active){ +int mac_top_init(int eMBMS_active, char *uecap_xer, uint8_t cba_group_active, uint8_t HO_active){ module_id_t Mod_id,i,j; RA_TEMPLATE *RA_template; @@ -185,7 +185,7 @@ int mac_top_init(int eMBMS_active, uint8_t cba_group_active, uint8_t HO_active){ if (Is_rrc_registered == 1){ LOG_I(MAC,"[MAIN] calling RRC\n"); #ifndef CELLULAR //nothing to be done yet for cellular - openair_rrc_top_init(eMBMS_active, cba_group_active,HO_active); + openair_rrc_top_init(eMBMS_active, uecap_xer, cba_group_active,HO_active); #endif } else { @@ -401,7 +401,7 @@ void mac_top_cleanup(void){ free( Mac_rlc_xface); } -int l2_init(LTE_DL_FRAME_PARMS *frame_parms,int eMBMS_active, uint8_t cba_group_active, uint8_t HO_active) { +int l2_init(LTE_DL_FRAME_PARMS *frame_parms,int eMBMS_active, char *uecap_xer,uint8_t cba_group_active, uint8_t HO_active) { @@ -510,7 +510,7 @@ int l2_init(LTE_DL_FRAME_PARMS *frame_parms,int eMBMS_active, uint8_t cba_group_ mac_xface->get_PHR = get_PHR; LOG_D(MAC,"[MAIN] ALL INIT OK\n"); - mac_xface->macphy_init(eMBMS_active,cba_group_active,HO_active); + mac_xface->macphy_init(eMBMS_active,uecap_xer,cba_group_active,HO_active); //Mac_rlc_xface->Is_cluster_head[0] = 1; //Mac_rlc_xface->Is_cluster_head[1] = 0; diff --git a/openair2/LAYER2/MAC/proto.h b/openair2/LAYER2/MAC/proto.h index dc0d1ea0b6..c435d21b14 100644 --- a/openair2/LAYER2/MAC/proto.h +++ b/openair2/LAYER2/MAC/proto.h @@ -156,7 +156,7 @@ void chbch_phy_sync_success(module_id_t module_idP,frame_t frameP,uint8_t eNB_in void mrbch_phy_sync_failure(module_id_t module_idP, frame_t frameP,uint8_t free_eNB_index); -int mac_top_init(int eMBMS_active, uint8_t cba_group_active, uint8_t HO_active); +int mac_top_init(int eMBMS_active, char *uecap_xer,uint8_t cba_group_active, uint8_t HO_active); char layer2_init_UE(module_id_t module_idP); @@ -469,7 +469,7 @@ uint8_t *parse_ulsch_header(uint8_t *mac_header, uint16_t tx_lenght); -int l2_init(LTE_DL_FRAME_PARMS *frame_parms,int eMBMS_active, uint8_t cba_group_active, uint8_t HO_active); +int l2_init(LTE_DL_FRAME_PARMS *frame_parms,int eMBMS_active, char *uecap_xer, uint8_t cba_group_active, uint8_t HO_active); int mac_init(void); int add_new_ue(module_id_t Mod_id, int CC_id, rnti_t rnti,int harq_pid); int mac_remove_ue(module_id_t Mod_id, int UE_id,int frameP); diff --git a/openair2/PHY_INTERFACE/defs.h b/openair2/PHY_INTERFACE/defs.h index c1b301c0d7..4a7a8ad1cf 100755 --- a/openair2/PHY_INTERFACE/defs.h +++ b/openair2/PHY_INTERFACE/defs.h @@ -63,7 +63,7 @@ do { typedef struct { /// Pointer function that initializes L2 - int (*macphy_init)(int eMBMS_active, uint8_t CBA_active,uint8_t HO_active); + int (*macphy_init)(int eMBMS_active, char *uecap_xer, uint8_t CBA_active,uint8_t HO_active); /// Pointer function that stops the low-level scheduler due an exit condition void (*macphy_exit)(const char *); diff --git a/openair2/RRC/LITE/MESSAGES/asn1_msg.c b/openair2/RRC/LITE/MESSAGES/asn1_msg.c index 42621f7a2d..940069d63b 100644 --- a/openair2/RRC/LITE/MESSAGES/asn1_msg.c +++ b/openair2/RRC/LITE/MESSAGES/asn1_msg.c @@ -356,7 +356,7 @@ uint8_t do_MIB(uint8_t Mod_id, LTE_DL_FRAME_PARMS *frame_parms, uint32_t frame, (void*)&mib, buffer, 100); - AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %d)!\n", + AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded); #if defined(ENABLE_ITTI) @@ -560,7 +560,7 @@ uint8_t do_SIB1(uint8_t Mod_id, LTE_DL_FRAME_PARMS *frame_parms, uint8_t *buffer (void*)bcch_message, buffer, 100); - AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %d)!\n", + AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded); #if defined(ENABLE_ITTI) @@ -1074,7 +1074,7 @@ uint8_t do_SIB23(uint8_t Mod_id, (void*)bcch_message, buffer, 900); - AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %d)!\n", + AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded); #if defined(ENABLE_ITTI) @@ -1164,7 +1164,7 @@ uint8_t do_RRCConnectionRequest(uint8_t Mod_id, uint8_t *buffer,uint8_t *rv) { (void*)&ul_ccch_msg, buffer, 100); - AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %d)!\n", + AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded); #if defined(ENABLE_ITTI) @@ -1242,7 +1242,7 @@ uint8_t do_RRCConnectionSetupComplete(uint8_t Mod_id, uint8_t *buffer, const uin (void*)&ul_dcch_msg, buffer, 100); - AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %d)!\n", + AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded); #if defined(ENABLE_ITTI) @@ -1296,7 +1296,7 @@ uint8_t do_RRCConnectionReconfigurationComplete(uint8_t Mod_id, uint8_t *buffer, (void*)&ul_dcch_msg, buffer, 100); - AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %d)!\n", + AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded); #if defined(ENABLE_ITTI) @@ -1611,7 +1611,7 @@ uint8_t do_RRCConnectionSetup(uint8_t Mod_id, (void*)&dl_ccch_msg, buffer, 100); - AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %d)!\n", + AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded); #if defined(ENABLE_ITTI) @@ -1678,7 +1678,7 @@ uint8_t do_SecurityModeCommand(uint8_t Mod_id, (void*)&dl_dcch_msg, buffer, 100); - AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %d)!\n", + AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded); #if defined(ENABLE_ITTI) @@ -1745,7 +1745,7 @@ uint8_t do_UECapabilityEnquiry(uint8_t Mod_id, (void*)&dl_dcch_msg, buffer, 100); - AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %d)!\n", + AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded); #if defined(ENABLE_ITTI) @@ -1891,7 +1891,7 @@ uint16_t do_RRCConnectionReconfiguration(uint8_t Mod (void*)&dl_dcch_msg, buffer, RRC_BUF_SIZE); - AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %d)!\n", + AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded); #ifdef XER_PRINT @@ -2077,7 +2077,7 @@ uint8_t do_MBSFNAreaConfig(uint8_t Mod_id, (void*)mcch_message, buffer, 100); - AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %d)!\n", + AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded); #if defined(ENABLE_ITTI) @@ -2202,7 +2202,7 @@ uint8_t do_MeasurementReport(uint8_t Mod_id, uint8_t *buffer,int measid,int phy_ - AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %d)!\n", + AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded); #if defined(ENABLE_ITTI) @@ -2295,143 +2295,169 @@ uint8_t do_ULInformationTransfer(uint8_t **buffer, uint32_t pdu_length, uint8_t return encoded; } -OAI_UECapability_t *fill_ue_capability(void) { +//OAI_UECapability_t *fill_ue_capability(void) { +OAI_UECapability_t *fill_ue_capability(char *UE_EUTRA_Capability_xer_fname) { static OAI_UECapability_t UECapability; /* TODO declared static to allow returning this has an address should be allocated in a cleaner way. */ SupportedBandEUTRA_t Bandlist[4]; // BandInfoEUTRA_t BandInfo_meas[4]; InterFreqBandInfo_t InterFreqBandInfo[4][4]; BandInfoEUTRA_t BandInfoEUTRA[4]; - UE_EUTRA_Capability_t *UE_EUTRA_Capability; asn_enc_rval_t enc_rval; + asn_dec_rval_t dec_rval; + long maxNumberROHC_ContextSessions = PDCP_Parameters__maxNumberROHC_ContextSessions_cs16; int i; - Bandlist[0].bandEUTRA = 33; // 1900-1920 TDD - Bandlist[0].halfDuplex = 0; - Bandlist[1].bandEUTRA = 38; // 2570-2620 TDD - - Bandlist[1].halfDuplex = 0; - Bandlist[2].bandEUTRA = 5; // 824-849 , 869-894 FDD - Bandlist[2].halfDuplex = 0; - Bandlist[3].bandEUTRA = 7; // 2500-2570, 2620-2690 FDD - Bandlist[3].halfDuplex = 0; - - memset((void*)InterFreqBandInfo, 0, sizeof(InterFreqBandInfo)); - memset((void*)BandInfoEUTRA, 0, sizeof(BandInfoEUTRA)); - - InterFreqBandInfo[0][0].interFreqNeedForGaps = 0; - InterFreqBandInfo[0][1].interFreqNeedForGaps = 1; - InterFreqBandInfo[0][2].interFreqNeedForGaps = 1; - InterFreqBandInfo[0][3].interFreqNeedForGaps = 1; - InterFreqBandInfo[1][0].interFreqNeedForGaps = 1; - InterFreqBandInfo[1][1].interFreqNeedForGaps = 0; - InterFreqBandInfo[1][2].interFreqNeedForGaps = 1; - InterFreqBandInfo[1][3].interFreqNeedForGaps = 1; - InterFreqBandInfo[2][0].interFreqNeedForGaps = 1; - InterFreqBandInfo[2][1].interFreqNeedForGaps = 1; - InterFreqBandInfo[2][2].interFreqNeedForGaps = 0; - InterFreqBandInfo[2][3].interFreqNeedForGaps = 1; - InterFreqBandInfo[3][0].interFreqNeedForGaps = 1; - InterFreqBandInfo[3][1].interFreqNeedForGaps = 1; - InterFreqBandInfo[3][2].interFreqNeedForGaps = 1; - InterFreqBandInfo[3][3].interFreqNeedForGaps = 0; - - LOG_I(RRC,"Allocating %d bytes for UE_EUTRA_Capability\n",sizeof(*UE_EUTRA_Capability)); + UE_EUTRA_Capability_t *UE_EUTRA_Capability; + char UE_EUTRA_Capability_xer[8192]; + size_t size; + FILE *f; + LOG_I(RRC,"Allocating %u bytes for UE_EUTRA_Capability\n",sizeof(*UE_EUTRA_Capability)); + UE_EUTRA_Capability = CALLOC(1, sizeof(*UE_EUTRA_Capability)); - UE_EUTRA_Capability->accessStratumRelease = 0;//AccessStratumRelease_rel8; - UE_EUTRA_Capability->ue_Category = 4; - UE_EUTRA_Capability->pdcp_Parameters.supportedROHC_Profiles.profile0x0001=0; - UE_EUTRA_Capability->pdcp_Parameters.supportedROHC_Profiles.profile0x0002=0; - UE_EUTRA_Capability->pdcp_Parameters.supportedROHC_Profiles.profile0x0003=0; - UE_EUTRA_Capability->pdcp_Parameters.supportedROHC_Profiles.profile0x0004=0; - UE_EUTRA_Capability->pdcp_Parameters.supportedROHC_Profiles.profile0x0006=0; - UE_EUTRA_Capability->pdcp_Parameters.supportedROHC_Profiles.profile0x0101=0; - UE_EUTRA_Capability->pdcp_Parameters.supportedROHC_Profiles.profile0x0102=0; - UE_EUTRA_Capability->pdcp_Parameters.supportedROHC_Profiles.profile0x0103=0; - UE_EUTRA_Capability->pdcp_Parameters.supportedROHC_Profiles.profile0x0104=0; - - UE_EUTRA_Capability->pdcp_Parameters.maxNumberROHC_ContextSessions = &maxNumberROHC_ContextSessions; - - UE_EUTRA_Capability->phyLayerParameters.ue_TxAntennaSelectionSupported = 0; - UE_EUTRA_Capability->phyLayerParameters.ue_SpecificRefSigsSupported = 0; - UE_EUTRA_Capability->rf_Parameters.supportedBandListEUTRA.list.count = 0; - ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->rf_Parameters.supportedBandListEUTRA.list,(void*)&Bandlist[0]); - ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->rf_Parameters.supportedBandListEUTRA.list,(void*)&Bandlist[1]); - ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->rf_Parameters.supportedBandListEUTRA.list,(void*)&Bandlist[2]); - ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->rf_Parameters.supportedBandListEUTRA.list,(void*)&Bandlist[3]); - - ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list,(void*)&BandInfoEUTRA[0]); - ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list,(void*)&BandInfoEUTRA[1]); - ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list,(void*)&BandInfoEUTRA[2]); - ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list,(void*)&BandInfoEUTRA[3]); - - ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[0]->interFreqBandList.list,(void*)&InterFreqBandInfo[0][0]); - ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[0]->interFreqBandList.list,(void*)&InterFreqBandInfo[0][1]); - ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[0]->interFreqBandList.list,(void*)&InterFreqBandInfo[0][2]); - ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[0]->interFreqBandList.list,(void*)&InterFreqBandInfo[0][3]); - - ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[1]->interFreqBandList.list,(void*)&InterFreqBandInfo[1][0]); - ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[1]->interFreqBandList.list,(void*)&InterFreqBandInfo[1][1]); - ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[1]->interFreqBandList.list,(void*)&InterFreqBandInfo[1][2]); - ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[1]->interFreqBandList.list,(void*)&InterFreqBandInfo[1][3]); - - ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[2]->interFreqBandList.list,(void*)&InterFreqBandInfo[2][0]); - ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[2]->interFreqBandList.list,(void*)&InterFreqBandInfo[2][1]); - ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[2]->interFreqBandList.list,(void*)&InterFreqBandInfo[2][2]); - ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[2]->interFreqBandList.list,(void*)&InterFreqBandInfo[2][3]); - - ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[3]->interFreqBandList.list,(void*)&InterFreqBandInfo[3][0]); - ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[3]->interFreqBandList.list,(void*)&InterFreqBandInfo[3][1]); - ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[3]->interFreqBandList.list,(void*)&InterFreqBandInfo[3][2]); - ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[3]->interFreqBandList.list,(void*)&InterFreqBandInfo[3][3]); - - // UE_EUTRA_Capability->measParameters.bandListEUTRA.list.count = 0; // no measurements on other bands - // UE_EUTRA_Capability->featureGroupIndicators // null - // UE_EUTRA_Capability->interRAT_Parameters // null - + assert(UE_EUTRA_Capability); + + if (!UE_EUTRA_Capability_xer_fname) { + Bandlist[0].bandEUTRA = 33; // 1900-1920 TDD + Bandlist[0].halfDuplex = 0; + Bandlist[1].bandEUTRA = 38; // 2570-2620 TDD + + Bandlist[1].halfDuplex = 0; + Bandlist[2].bandEUTRA = 5; // 824-849 , 869-894 FDD + Bandlist[2].halfDuplex = 0; + Bandlist[3].bandEUTRA = 7; // 2500-2570, 2620-2690 FDD + Bandlist[3].halfDuplex = 0; + + memset((void*)InterFreqBandInfo, 0, sizeof(InterFreqBandInfo)); + memset((void*)BandInfoEUTRA, 0, sizeof(BandInfoEUTRA)); + + InterFreqBandInfo[0][0].interFreqNeedForGaps = 0; + InterFreqBandInfo[0][1].interFreqNeedForGaps = 1; + InterFreqBandInfo[0][2].interFreqNeedForGaps = 1; + InterFreqBandInfo[0][3].interFreqNeedForGaps = 1; + InterFreqBandInfo[1][0].interFreqNeedForGaps = 1; + InterFreqBandInfo[1][1].interFreqNeedForGaps = 0; + InterFreqBandInfo[1][2].interFreqNeedForGaps = 1; + InterFreqBandInfo[1][3].interFreqNeedForGaps = 1; + InterFreqBandInfo[2][0].interFreqNeedForGaps = 1; + InterFreqBandInfo[2][1].interFreqNeedForGaps = 1; + InterFreqBandInfo[2][2].interFreqNeedForGaps = 0; + InterFreqBandInfo[2][3].interFreqNeedForGaps = 1; + InterFreqBandInfo[3][0].interFreqNeedForGaps = 1; + InterFreqBandInfo[3][1].interFreqNeedForGaps = 1; + InterFreqBandInfo[3][2].interFreqNeedForGaps = 1; + InterFreqBandInfo[3][3].interFreqNeedForGaps = 0; + + + UE_EUTRA_Capability->accessStratumRelease = 0;//AccessStratumRelease_rel8; + UE_EUTRA_Capability->ue_Category = 4; + UE_EUTRA_Capability->pdcp_Parameters.supportedROHC_Profiles.profile0x0001=0; + UE_EUTRA_Capability->pdcp_Parameters.supportedROHC_Profiles.profile0x0002=0; + UE_EUTRA_Capability->pdcp_Parameters.supportedROHC_Profiles.profile0x0003=0; + UE_EUTRA_Capability->pdcp_Parameters.supportedROHC_Profiles.profile0x0004=0; + UE_EUTRA_Capability->pdcp_Parameters.supportedROHC_Profiles.profile0x0006=0; + UE_EUTRA_Capability->pdcp_Parameters.supportedROHC_Profiles.profile0x0101=0; + UE_EUTRA_Capability->pdcp_Parameters.supportedROHC_Profiles.profile0x0102=0; + UE_EUTRA_Capability->pdcp_Parameters.supportedROHC_Profiles.profile0x0103=0; + UE_EUTRA_Capability->pdcp_Parameters.supportedROHC_Profiles.profile0x0104=0; + + UE_EUTRA_Capability->pdcp_Parameters.maxNumberROHC_ContextSessions = &maxNumberROHC_ContextSessions; + + UE_EUTRA_Capability->phyLayerParameters.ue_TxAntennaSelectionSupported = 0; + UE_EUTRA_Capability->phyLayerParameters.ue_SpecificRefSigsSupported = 0; + UE_EUTRA_Capability->rf_Parameters.supportedBandListEUTRA.list.count = 0; + ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->rf_Parameters.supportedBandListEUTRA.list,(void*)&Bandlist[0]); + ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->rf_Parameters.supportedBandListEUTRA.list,(void*)&Bandlist[1]); + ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->rf_Parameters.supportedBandListEUTRA.list,(void*)&Bandlist[2]); + ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->rf_Parameters.supportedBandListEUTRA.list,(void*)&Bandlist[3]); + + ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list,(void*)&BandInfoEUTRA[0]); + ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list,(void*)&BandInfoEUTRA[1]); + ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list,(void*)&BandInfoEUTRA[2]); + ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list,(void*)&BandInfoEUTRA[3]); + + ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[0]->interFreqBandList.list,(void*)&InterFreqBandInfo[0][0]); + ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[0]->interFreqBandList.list,(void*)&InterFreqBandInfo[0][1]); + ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[0]->interFreqBandList.list,(void*)&InterFreqBandInfo[0][2]); + ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[0]->interFreqBandList.list,(void*)&InterFreqBandInfo[0][3]); + + ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[1]->interFreqBandList.list,(void*)&InterFreqBandInfo[1][0]); + ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[1]->interFreqBandList.list,(void*)&InterFreqBandInfo[1][1]); + ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[1]->interFreqBandList.list,(void*)&InterFreqBandInfo[1][2]); + ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[1]->interFreqBandList.list,(void*)&InterFreqBandInfo[1][3]); + + ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[2]->interFreqBandList.list,(void*)&InterFreqBandInfo[2][0]); + ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[2]->interFreqBandList.list,(void*)&InterFreqBandInfo[2][1]); + ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[2]->interFreqBandList.list,(void*)&InterFreqBandInfo[2][2]); + ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[2]->interFreqBandList.list,(void*)&InterFreqBandInfo[2][3]); + + ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[3]->interFreqBandList.list,(void*)&InterFreqBandInfo[3][0]); + ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[3]->interFreqBandList.list,(void*)&InterFreqBandInfo[3][1]); + ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[3]->interFreqBandList.list,(void*)&InterFreqBandInfo[3][2]); + ASN_SEQUENCE_ADD(&UE_EUTRA_Capability->measParameters.bandListEUTRA.list.array[3]->interFreqBandList.list,(void*)&InterFreqBandInfo[3][3]); + + // UE_EUTRA_Capability->measParameters.bandListEUTRA.list.count = 0; // no measurements on other bands + // UE_EUTRA_Capability->featureGroupIndicators // null + // UE_EUTRA_Capability->interRAT_Parameters // null + } + + else { + + f = fopen(UE_EUTRA_Capability_xer_fname, "r"); + assert(f); + size = fread(UE_EUTRA_Capability_xer, 1, sizeof UE_EUTRA_Capability_xer, f); + if (size == 0 || size == sizeof UE_EUTRA_Capability_xer) { + LOG_E(RRC,"UE Capabilities XER file %s is too large\n", UE_EUTRA_Capability_xer_fname); + return(NULL); + } + + dec_rval = xer_decode(0, &asn_DEF_UE_EUTRA_Capability, (void*)UE_EUTRA_Capability, UE_EUTRA_Capability_xer, size); + assert(dec_rval.code == RC_OK); + } + UECapability.UE_EUTRA_Capability = UE_EUTRA_Capability; #ifdef XER_PRINT xer_fprint(stdout,&asn_DEF_UE_EUTRA_Capability,(void *)UE_EUTRA_Capability); #endif enc_rval = uper_encode_to_buffer(&asn_DEF_UE_EUTRA_Capability, - (void*)UE_EUTRA_Capability, - &UECapability.sdu[0], - MAX_UE_CAPABILITY_SIZE); - AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %d)!\n", - enc_rval.failed_type->name, enc_rval.encoded); - + (void*)UE_EUTRA_Capability, + &UECapability.sdu[0], + MAX_UE_CAPABILITY_SIZE); + AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", + enc_rval.failed_type->name, enc_rval.encoded); + #if defined(ENABLE_ITTI) # if defined(DISABLE_XER_SPRINT) { MessageDef *msg_p; - + msg_p = itti_alloc_new_message (TASK_RRC_UE, RRC_UE_EUTRA_CAPABILITY); memcpy (&msg_p->ittiMsg, (void *) UE_EUTRA_Capability, sizeof(RrcUeEutraCapability)); - + itti_send_msg_to_task (TASK_UNKNOWN, NB_eNB_INST, msg_p); } # else { char message_string[10000]; size_t message_string_size; - + if ((message_string_size = xer_sprint(message_string, sizeof(message_string), &asn_DEF_UE_EUTRA_Capability, (void *)UE_EUTRA_Capability)) > 0) - { - MessageDef *msg_p; - - msg_p = itti_alloc_new_message_sized (TASK_RRC_UE, RRC_UE_EUTRA_CAPABILITY, message_string_size + sizeof (IttiMsgText)); - msg_p->ittiMsg.rrc_ue_eutra_capability.size = message_string_size; - memcpy(&msg_p->ittiMsg.rrc_ue_eutra_capability.text, message_string, message_string_size); - - itti_send_msg_to_task(TASK_UNKNOWN, INSTANCE_DEFAULT, msg_p); - } + { + MessageDef *msg_p; + + msg_p = itti_alloc_new_message_sized (TASK_RRC_UE, RRC_UE_EUTRA_CAPABILITY, message_string_size + sizeof (IttiMsgText)); + msg_p->ittiMsg.rrc_ue_eutra_capability.size = message_string_size; + memcpy(&msg_p->ittiMsg.rrc_ue_eutra_capability.text, message_string, message_string_size); + + itti_send_msg_to_task(TASK_UNKNOWN, INSTANCE_DEFAULT, msg_p); + } } # endif #endif - + UECapability.sdu_size = (enc_rval.encoded + 7) / 8; LOG_I(PHY, "[RRC]UE Capability encoded, %d bytes (%d bits)\n", UECapability.sdu_size, enc_rval.encoded + 7); diff --git a/openair2/RRC/LITE/MESSAGES/asn1_msg.h b/openair2/RRC/LITE/MESSAGES/asn1_msg.h index 13244bbb95..eb8104cd87 100644 --- a/openair2/RRC/LITE/MESSAGES/asn1_msg.h +++ b/openair2/RRC/LITE/MESSAGES/asn1_msg.h @@ -232,7 +232,7 @@ uint8_t do_DLInformationTransfer(uint8_t Mod_id, uint8_t **buffer, uint8_t trans uint8_t do_ULInformationTransfer(uint8_t **buffer, uint32_t pdu_length, uint8_t *pdu_buffer); -OAI_UECapability_t *fill_ue_capability(void); +OAI_UECapability_t *fill_ue_capability(char *UE_EUTRA_Capability_xer); uint8_t do_UECapabilityEnquiry(uint8_t Mod_id, uint8_t *buffer, diff --git a/openair2/RRC/LITE/proto.h b/openair2/RRC/LITE/proto.h index d32e5b82fc..ca5306217c 100644 --- a/openair2/RRC/LITE/proto.h +++ b/openair2/RRC/LITE/proto.h @@ -39,7 +39,7 @@ //main.c int rrc_init_global_param(void); int L3_xface_init(void); -void openair_rrc_top_init(int eMBMS_active, uint8_t cba_group_active,uint8_t HO_enabled); +void openair_rrc_top_init(int eMBMS_active, char *uecap_xer, uint8_t cba_group_active,uint8_t HO_enabled); char openair_rrc_lite_eNB_init(module_id_t module_idP); char openair_rrc_lite_ue_init(module_id_t module_idP,uint8_t CH_IDX); void rrc_config_buffer(SRB_INFO *srb_info, uint8_t Lchan_type, uint8_t Role); diff --git a/openair2/RRC/LITE/rrc_common.c b/openair2/RRC/LITE/rrc_common.c index 54bfef6ebd..475d5acb22 100644 --- a/openair2/RRC/LITE/rrc_common.c +++ b/openair2/RRC/LITE/rrc_common.c @@ -206,7 +206,7 @@ void rrc_config_buffer(SRB_INFO *Srb_info, uint8_t Lchan_type, uint8_t Role) { } /*------------------------------------------------------------------------------*/ -void openair_rrc_top_init(int eMBMS_active, uint8_t cba_group_active,uint8_t HO_active){ +void openair_rrc_top_init(int eMBMS_active, char *uecap_xer, uint8_t cba_group_active,uint8_t HO_active){ /*-----------------------------------------------------------------------------*/ module_id_t module_id; @@ -221,16 +221,11 @@ void openair_rrc_top_init(int eMBMS_active, uint8_t cba_group_active,uint8_t HO_ LOG_D(RRC, "ALLOCATE %d Bytes for UE_RRC_INST @ %p\n", (unsigned int)(NB_UE_INST*sizeof(UE_RRC_INST)), UE_rrc_inst); // fill UE capability - UECap = fill_ue_capability (); + UECap = fill_ue_capability (uecap_xer); for (module_id = 0; module_id < NB_UE_INST; module_id++) { UE_rrc_inst[module_id].UECapability = UECap->sdu; UE_rrc_inst[module_id].UECapability_size = UECap->sdu_size; } - /* - do_UECapabilityEnquiry(0, - dummy_buffer, - 0, - 0);*/ #ifdef Rel10 LOG_I(RRC,"[UE] eMBMS active state is %d \n", eMBMS_active); for (module_id=0;module_id<NB_UE_INST;module_id++) { diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.c b/openair2/UTIL/LOG/vcd_signal_dumper.c index 85d969b304..a6d2733ea5 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.c +++ b/openair2/UTIL/LOG/vcd_signal_dumper.c @@ -152,6 +152,7 @@ const char* eurecomFunctionsNames[] = { "dlsch_decoding7", "rx_pdcch", "dci_decoding", + "rx_phich", "phy_ue_config_sib2", "macxface_phy_config_sib1_eNB", "macxface_phy_config_sib2_eNB", diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.h b/openair2/UTIL/LOG/vcd_signal_dumper.h index 54c15820b0..f8aaef077e 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.h +++ b/openair2/UTIL/LOG/vcd_signal_dumper.h @@ -127,6 +127,7 @@ typedef enum { VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DECODING7, VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PDCCH, VCD_SIGNAL_DUMPER_FUNCTIONS_DCI_DECODING, + VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PHICH, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_UE_CONFIG_SIB2, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_CONFIG_SIB1_ENB, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_CONFIG_SIB2_ENB, diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/Makefile.inc b/targets/ARCH/ETHERNET/USERSPACE/LIB/Makefile.inc index e6467b7f05..6e58738c4f 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/Makefile.inc +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/Makefile.inc @@ -1,4 +1,4 @@ ETHERNET_OBJ += $(OPENAIR_TARGETS)/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.o ETHERNET_FILE_OBJ += $(OPENAIR_TARGETS)/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c -ETHERNET_CFLAGS += -I$(OPENAIR_TARGETS)/ARCH/COMMON -I$(OPENAIR_TARGETS)/ARCH/ETHERNET/USERSPACE/LIB/ -I$(OPENAIR_TARGETS)/COMMON +ETHERNET_CFLAGS += -O2 -I$(OPENAIR_TARGETS)/ARCH/COMMON -I$(OPENAIR_TARGETS)/ARCH/ETHERNET/USERSPACE/LIB/ -I$(OPENAIR_TARGETS)/COMMON diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c index bc4a34d537..775889c0fd 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -106,15 +106,15 @@ int ethernet_write_data(int Mod_id, openair0_timestamp timestamp, const void **b ((int16_t *)buff2)[0] = 1+(antenna_id<<1); ((int16_t *)buff2)[1] = nsamps; *((openair0_timestamp *)(buff2+(sizeof(int16_t)*2))) = timestamp; - printf("Timestamp TX sent : %d\n",timestamp); + //printf("Timestamp TX sent : %d\n",timestamp); // printf("buffer head : %d %d %d %d \n",((int16_t *)buff2)[0],((int16_t *)buff2)[1],((int16_t *)buff2)[2],((int16_t *)buff2)[3]); - while(n_written < nsamps) { + while(n_written < (nsamps<<2)) { /* Send packet */ if ((n_written += sendto(sockfd[Mod_id], buff2, (nsamps<<2)+sizeof(openair0_timestamp)+(2*sizeof(int16_t)), - 0, + MSG_DONTWAIT, (struct sockaddr*)&dest_addr[Mod_id], dest_addr_len[Mod_id])) < 0) { printf("Send failed for Mod_id %d\n",Mod_id); @@ -137,16 +137,14 @@ int ethernet_read_data(int Mod_id,openair0_timestamp *timestamp,void **buff, int int ret; openair0_timestamp temp = *(openair0_timestamp*)(buff2); int16_t mesg[2]; - char str[INET_ADDRSTRLEN]; mesg[0] = 0+(antenna_id<<1); mesg[1] = nsamps; - inet_ntop(AF_INET, &(dest_addr[Mod_id].sin_addr), str, INET_ADDRSTRLEN); + // send command RX for nsamps samples - printf("requesting %d samples from (%s:%d)\n",nsamps,str,ntohs(dest_addr[Mod_id].sin_port)); - sendto(sockfd[Mod_id],mesg,4,0,(struct sockaddr *)&dest_addr[Mod_id],dest_addr_len[Mod_id]); + sendto(sockfd[Mod_id],mesg,4,MSG_DONTWAIT,(struct sockaddr *)&dest_addr[Mod_id],dest_addr_len[Mod_id]); bytes_received=0; block_cnt=0; @@ -178,7 +176,7 @@ int ethernet_read_data(int Mod_id,openair0_timestamp *timestamp,void **buff, int //printf("buffer head : %x %x %x %x \n",((int32_t *)buff2)[0],((int32_t *)buff2)[1],((int32_t *)buff2)[2],((int32_t *)buff2)[3]); *timestamp = *(openair0_timestamp *)(buff2); - printf("Received %d samples, timestamp = %d\n",bytes_received>>2,*(int32_t*)timestamp); +// printf("Received %d samples, timestamp = %d\n",bytes_received>>2,*(int32_t*)timestamp); *(openair0_timestamp *)(buff2) = temp; return nsamps; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/UE_config.xml b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/UE_config.xml new file mode 100644 index 0000000000..c8d57f944a --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/UE_config.xml @@ -0,0 +1,112 @@ +<UE-EUTRA-Capability> + <accessStratumRelease><rel8/></accessStratumRelease> + <ue-Category>4</ue-Category> + <pdcp-Parameters> + <supportedROHC-Profiles> + <profile0x0001><false/></profile0x0001> + <profile0x0002><false/></profile0x0002> + <profile0x0003><false/></profile0x0003> + <profile0x0004><false/></profile0x0004> + <profile0x0006><false/></profile0x0006> + <profile0x0101><false/></profile0x0101> + <profile0x0102><false/></profile0x0102> + <profile0x0103><false/></profile0x0103> + <profile0x0104><false/></profile0x0104> + </supportedROHC-Profiles> + <maxNumberROHC-ContextSessions><cs16/></maxNumberROHC-ContextSessions> + </pdcp-Parameters> + <phyLayerParameters> + <ue-TxAntennaSelectionSupported><false/></ue-TxAntennaSelectionSupported> + <ue-SpecificRefSigsSupported><false/></ue-SpecificRefSigsSupported> + </phyLayerParameters> + <rf-Parameters> + <supportedBandListEUTRA> + <SupportedBandEUTRA> + <bandEUTRA>33</bandEUTRA> + <halfDuplex><false/></halfDuplex> + </SupportedBandEUTRA> + <SupportedBandEUTRA> + <bandEUTRA>38</bandEUTRA> + <halfDuplex><false/></halfDuplex> + </SupportedBandEUTRA> + <SupportedBandEUTRA> + <bandEUTRA>5</bandEUTRA> + <halfDuplex><false/></halfDuplex> + </SupportedBandEUTRA> + <SupportedBandEUTRA> + <bandEUTRA>7</bandEUTRA> + <halfDuplex><false/></halfDuplex> + </SupportedBandEUTRA> + </supportedBandListEUTRA> + </rf-Parameters> + <measParameters> + <bandListEUTRA> + <BandInfoEUTRA> + <interFreqBandList> + <InterFreqBandInfo> + <interFreqNeedForGaps><false/></interFreqNeedForGaps> + </InterFreqBandInfo> + <InterFreqBandInfo> + <interFreqNeedForGaps><true/></interFreqNeedForGaps> + </InterFreqBandInfo> + <InterFreqBandInfo> + <interFreqNeedForGaps><true/></interFreqNeedForGaps> + </InterFreqBandInfo> + <InterFreqBandInfo> + <interFreqNeedForGaps><true/></interFreqNeedForGaps> + </InterFreqBandInfo> + </interFreqBandList> + </BandInfoEUTRA> + <BandInfoEUTRA> + <interFreqBandList> + <InterFreqBandInfo> + <interFreqNeedForGaps><true/></interFreqNeedForGaps> + </InterFreqBandInfo> + <InterFreqBandInfo> + <interFreqNeedForGaps><false/></interFreqNeedForGaps> + </InterFreqBandInfo> + <InterFreqBandInfo> + <interFreqNeedForGaps><true/></interFreqNeedForGaps> + </InterFreqBandInfo> + <InterFreqBandInfo> + <interFreqNeedForGaps><true/></interFreqNeedForGaps> + </InterFreqBandInfo> + </interFreqBandList> + </BandInfoEUTRA> + <BandInfoEUTRA> + <interFreqBandList> + <InterFreqBandInfo> + <interFreqNeedForGaps><true/></interFreqNeedForGaps> + </InterFreqBandInfo> + <InterFreqBandInfo> + <interFreqNeedForGaps><true/></interFreqNeedForGaps> + </InterFreqBandInfo> + <InterFreqBandInfo> + <interFreqNeedForGaps><false/></interFreqNeedForGaps> + </InterFreqBandInfo> + <InterFreqBandInfo> + <interFreqNeedForGaps><true/></interFreqNeedForGaps> + </InterFreqBandInfo> + </interFreqBandList> + </BandInfoEUTRA> + <BandInfoEUTRA> + <interFreqBandList> + <InterFreqBandInfo> + <interFreqNeedForGaps><true/></interFreqNeedForGaps> + </InterFreqBandInfo> + <InterFreqBandInfo> + <interFreqNeedForGaps><true/></interFreqNeedForGaps> + </InterFreqBandInfo> + <InterFreqBandInfo> + <interFreqNeedForGaps><true/></interFreqNeedForGaps> + </InterFreqBandInfo> + <InterFreqBandInfo> + <interFreqNeedForGaps><false/></interFreqNeedForGaps> + </InterFreqBandInfo> + </interFreqBandList> + </BandInfoEUTRA> + </bandListEUTRA> + </measParameters> + <interRAT-Parameters> + </interRAT-Parameters> +</UE-EUTRA-Capability> diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.exmimo2.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.exmimo2.conf index 72c35b08cc..41b3d8045e 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.exmimo2.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.exmimo2.conf @@ -113,11 +113,21 @@ eNBs = NETWORK_INTERFACES : { +<<<<<<< .mine + ENB_INTERFACE_NAME_FOR_S1_MME = "eth1"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.13.10/24"; +======= ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.13.10/24"; +>>>>>>> .r6319 +<<<<<<< .mine + ENB_INTERFACE_NAME_FOR_S1U = "eth1"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.10/24"; +======= ENB_INTERFACE_NAME_FOR_S1U = "eth0"; ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.10/24"; +>>>>>>> .r6319 ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; /* diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf deleted file mode 100644 index 50077ec06b..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf +++ /dev/null @@ -1,143 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - # real_time choice in {hard, rt-preempt, no} - real_time = "no"; - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "92"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2660000000L; - uplink_frequency_offset = -120000000; - Nid_cell = 0; - N_RB_DL = 50; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 90; - rx_gain = 135; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -26; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 1; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -108; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -108; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; -/* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; -*/ - rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -108; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - - } - ); - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.13.11"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.13.10/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.10/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="info"; - global_log_verbosity ="medium"; - hw_log_level ="info"; - hw_log_verbosity ="medium"; - phy_log_level ="info"; - phy_log_verbosity ="medium"; - mac_log_level ="info"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="info"; - rrc_log_verbosity ="medium"; - }; - - } -); diff --git a/targets/RT/USER/Makefile b/targets/RT/USER/Makefile index 3c03951d61..b691183b51 100644 --- a/targets/RT/USER/Makefile +++ b/targets/RT/USER/Makefile @@ -98,9 +98,11 @@ include $(OPENAIR3_DIR)/RAL-LTE/Makefile.inc ifeq ($(USRP),1) include $(OPENAIR_TARGETS)/ARCH/USRP/USERSPACE/LIB/Makefile.inc -CFLAGS += -I/opt/include/uhd -L/opt/lib -luhd -lpthread -lstdc++ +#CFLAGS += -I/opt/include/uhd -L/opt/lib -luhd -lpthread -lstdc++ +CFLAGS += -I/usr/include/uhd -L/usr/lib -luhd -lpthread -lstdc++ CFLAGS += -DUSRP -LDFLAGS += -L/opt/lib -luhd -lpthread -lstdc++ +#LDFLAGS += -L/opt/lib -luhd -lpthread -lstdc++ +LDFLAGS += -L/usr/lib/ -luhd -lpthread -lstdc++ endif ifeq ($(ETHERNET),1) diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index c31c0d33ff..fedcf8df00 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -214,10 +214,6 @@ static pthread_t forms_thread; //xforms static pthread_t thread3; //emos #endif -#ifdef SPECTRA -static pthread_t sensing_thread; -#endif - openair0_device openair0; openair0_timestamp timestamp; @@ -258,14 +254,14 @@ static char *conf_config_file_name = NULL; static char *itti_dump_file = NULL; #endif -#ifndef USRP +#ifdef EXMIMO double tx_gain[MAX_NUM_CCs][4] = {{20,20,0,0},{20,20,0,0}}; double rx_gain[MAX_NUM_CCs][4] = {{20,20,0,0},{20,20,0,0}}; // these are for EXMIMO2 target only /* -static unsigned int rxg_max[4] = {133,133,133,133}; -static unsigned int rxg_med[4] = {127,127,127,127}; -static unsigned int rxg_byp[4] = {120,120,120,120}; + static unsigned int rxg_max[4] = {133,133,133,133}; + static unsigned int rxg_med[4] = {127,127,127,127}; + static unsigned int rxg_byp[4] = {120,120,120,120}; */ // these are for EXMIMO2 card 39 static unsigned int rxg_max[4] = {128,128,128,126}; @@ -293,6 +289,22 @@ unsigned int samples_per_frame = 307200; unsigned int samples_per_packets = 2048; // samples got every recv or send unsigned int tx_forward_nsamps; +#ifndef USRP +//256 sample blocks +int sf_bounds_1_5[10] = {8, 15, 23, 30, 38, 45, 53, 60, 68, 75}; +int sf_bounds_1_5_tx[10] = {4, 11, 19, 26, 34, 41, 49, 56, 64, 71}; + +int sf_bounds_5[10] = {5,10,15,20,25,30,35,40,45,50}; +int sf_bounds_5_tx[10] = {3,8,13,18,23,28,33,38,43,48}; + +int sf_bounds_10[10] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100}; +int sf_bounds_10_tx[10] = {5, 15, 25, 35, 45, 55, 65, 75, 85,95}; + +int sf_bounds_20[10] = {20, 40, 60, 80, 100, 120, 140, 160, 180, 200}; +int sf_bounds_20_tx[10] = {10, 30, 50, 70, 90, 110, 130, 150, 170, 190}; + +#else + int sf_bounds_1_5[10] = {8, 15, 23, 30, 38, 45, 53, 60, 68, 75}; int sf_bounds_1_5_tx[10] = {4, 11, 19, 26, 34, 41, 49, 56, 64, 71}; @@ -304,6 +316,7 @@ int sf_bounds_10_tx[10] = {4, 11, 19, 26, 34, 41, 49, 56, 64, 71}; int sf_bounds_20[10] = {15, 30, 45, 60, 75, 90, 105, 120, 135, 150}; int sf_bounds_20_tx[10] = {7, 22, 37, 52, 67, 82, 97, 112, 127, 142}; +#endif int *sf_bounds; int *sf_bounds_tx; @@ -338,7 +351,7 @@ static char do_forms=0; int otg_enabled; #endif //int number_of_cards = 1; -#ifndef USRP +#ifdef EXMIMO static int mbox_bounds[20] = {8,16,24,30,38,46,54,60,68,76,84,90,98,106,114,120,128,136,144, 0}; ///boundaries of slots in terms ob mbox counter rounded up to even numbers //static int mbox_bounds[20] = {6,14,22,28,36,44,52,58,66,74,82,88,96,104,112,118,126,134,142, 148}; ///boundaries of slots in terms ob mbox counter rounded up to even numbers #endif @@ -351,14 +364,16 @@ uint32_t target_ul_mcs = 10; uint8_t exit_missed_slots=1; uint64_t num_missed_slots=0; // counter for the number of missed slots + time_stats_t softmodem_stats_mt; // main thread -time_stats_t softmodem_stats_hw; // hw acquisation +time_stats_t softmodem_stats_hw; // hw acquisition time_stats_t softmodem_stats_tx_sf[10]; // total tx time time_stats_t softmodem_stats_rx_sf[10]; // total rx time void reset_opp_meas(void); void print_opp_meas(void); int transmission_mode=1; + int16_t glog_level = LOG_DEBUG; int16_t glog_verbosity = LOG_MED; int16_t hw_log_level = LOG_DEBUG; @@ -384,6 +399,16 @@ int16_t osa_log_level = LOG_INFO; int16_t osa_log_verbosity = LOG_MED; #endif + +#ifdef ETHERNET +char rrh_eNB_ip[20] = "127.0.0.1"; +int rrh_eNB_port = 1500; +char *rrh_UE_ip = "127.0.0.1"; +int rrh_UE_port = 1600; +#endif + +char uecap_xer[1024],uecap_xer_in=0; + unsigned int build_rflocal(int txi, int txq, int rxi, int rxq) { return (txi + (txq<<6) + (rxi<<12) + (rxq<<18)); @@ -492,9 +517,9 @@ void reset_stats(FL_OBJECT *button, long arg) { phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors=0; for (j=0;j<phy_vars_eNB->ulsch_eNB[i]->Mdlharq;j++) { phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_fer[k][j]=0; + phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[k][j]=0; + phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[k][j]=0; + phy_vars_eNB->eNB_UE_stats[i].ulsch_round_fer[k][j]=0; } } phy_vars_eNB->eNB_UE_stats[i].dlsch_sliding_cnt=0; @@ -540,7 +565,7 @@ static void *scope_thread(void *arg) { # ifdef ENABLE_XFORMS_WRITE_STATS len = # endif - dump_eNB_l2_stats (stats_buffer, 0); + dump_eNB_l2_stats (stats_buffer, 0); fl_set_object_label(form_stats_l2->stats_text, stats_buffer); # ifdef ENABLE_XFORMS_WRITE_STATS @@ -746,37 +771,6 @@ void *emos_thread (void *arg) } #endif -#ifdef SPECTRA -void *sensing (void *arg) -{ - struct sched_param sched_param; - - sched_param.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; - sched_setscheduler(0, SCHED_FIFO,&sched_param); - - printf("[SPECTRA] sensing thread started with priority %d\n",sched_param.sched_priority); - - while (oai_exit==0) { - - - openair0_cfg[0].rx_freq[2]+= 5e6; - if (openair0_cfg[0].rx_freq[2] >= 750000000) - openair0_cfg[0].rx_freq[2] = 727500000; - - - //LOG_I(HW,"[SPECTRA] changing frequency to %u \n",(uint32_t)openair0_cfg[1].rx_freq[0]); - - openair0_reconfig(&openair0_cfg[0]); - - usleep(200000); - //sleep(1); - - } - - pthread_exit((void*) arg); - -} -#endif #if defined(ENABLE_ITTI) @@ -953,25 +947,25 @@ static void * eNB_thread_tx(void *param) { #endif -/*#if defined(ENABLE_ITTI) + /*#if defined(ENABLE_ITTI) // Wait for eNB application initialization to be complete (eNB registration to MME) wait_system_ready ("Waiting for eNB application to be ready %s\r", &start_eNB); -#endif*/ + #endif*/ #ifdef RTAI sprintf(task_name,"TXC%dS%d",proc->CC_id,proc->subframe); task = rt_task_init_schmod(nam2num(task_name), 0, 0, 0, SCHED_FIFO, 0xF); if (task==NULL) { - LOG_E(PHY,"[SCHED][eNB] Problem starting eNB_proc_TX thread_index %d (%s)!!!!\n",proc->subframe,task_name); - return 0; - } + LOG_E(PHY,"[SCHED][eNB] Problem starting eNB_proc_TX thread_index %d (%s)!!!!\n",proc->subframe,task_name); + return 0; +} else { - LOG_I(PHY,"[SCHED][eNB] eNB TX thread CC %d SF %d started with id %p\n", - proc->CC_id, - proc->subframe, - task); - } + LOG_I(PHY,"[SCHED][eNB] eNB TX thread CC %d SF %d started with id %p\n", + proc->CC_id, + proc->subframe, + task); +} #else #ifdef LOWLATENCY attr.size = sizeof(attr); @@ -993,7 +987,7 @@ static void * eNB_thread_tx(void *param) { proc->subframe, gettid(),sched_getcpu()); #else LOG_I(HW,"[SCHED] eNB TX thread %d started on CPU %d\n", - proc->subframe,sched_getcpu()); + proc->subframe,sched_getcpu()); #endif #endif @@ -1009,66 +1003,66 @@ static void * eNB_thread_tx(void *param) { while (!oai_exit){ - vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->subframe),0); + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->subframe),0); - //LOG_I(PHY,"Locking mutex for eNB proc %d (IC %d,mutex %p)\n",proc->subframe,proc->instance_cnt,&proc->mutex); - // printf("Locking mutex for eNB proc %d (subframe_tx %d))\n",proc->subframe,proc->instance_cnt_tx); + //LOG_I(PHY,"Locking mutex for eNB proc %d (IC %d,mutex %p)\n",proc->subframe,proc->instance_cnt,&proc->mutex); + // printf("Locking mutex for eNB proc %d (subframe_tx %d))\n",proc->subframe,proc->instance_cnt_tx); - if (pthread_mutex_lock(&proc->mutex_tx) != 0) { - LOG_E(PHY,"[SCHED][eNB] error locking mutex for eNB TX proc %d\n",proc->subframe); - oai_exit=1; - } - else { + if (pthread_mutex_lock(&proc->mutex_tx) != 0) { + LOG_E(PHY,"[SCHED][eNB] error locking mutex for eNB TX proc %d\n",proc->subframe); + oai_exit=1; +} + else { - while (proc->instance_cnt_tx < 0) { - // LOG_I(PHY,"Waiting and unlocking mutex for eNB proc %d (IC %d,lock %d)\n",proc->subframe,proc->instance_cnt,pthread_mutex_trylock(&proc->mutex)); - //printf("Waiting and unlocking mutex for eNB proc %d (subframe_tx %d)\n",proc->subframe,proc->instance_cnt_tx); + while (proc->instance_cnt_tx < 0) { + // LOG_I(PHY,"Waiting and unlocking mutex for eNB proc %d (IC %d,lock %d)\n",proc->subframe,proc->instance_cnt,pthread_mutex_trylock(&proc->mutex)); + //printf("Waiting and unlocking mutex for eNB proc %d (subframe_tx %d)\n",proc->subframe,proc->instance_cnt_tx); - pthread_cond_wait(&proc->cond_tx,&proc->mutex_tx); - } - // LOG_I(PHY,"Waking up and unlocking mutex for eNB proc %d instance_cnt_tx %d\n",proc->subframe,proc->instance_cnt_tx); - if (pthread_mutex_unlock(&proc->mutex_tx) != 0) { - LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for eNB TX proc %d\n",proc->subframe); - oai_exit=1; - } - } - vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->subframe),1); - vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_ENB, proc->frame_tx); - start_meas(&softmodem_stats_tx_sf[proc->subframe]); + pthread_cond_wait(&proc->cond_tx,&proc->mutex_tx); +} + // LOG_I(PHY,"Waking up and unlocking mutex for eNB proc %d instance_cnt_tx %d\n",proc->subframe,proc->instance_cnt_tx); + if (pthread_mutex_unlock(&proc->mutex_tx) != 0) { + LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for eNB TX proc %d\n",proc->subframe); + oai_exit=1; +} +} + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->subframe),1); + vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_ENB, proc->frame_tx); + start_meas(&softmodem_stats_tx_sf[proc->subframe]); - if (oai_exit) break; + if (oai_exit) break; - if ((((PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == TDD)&& - (subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_tx)==SF_DL))|| - (PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == FDD))) { + if ((((PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == TDD)&& + (subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_tx)==SF_DL))|| + (PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == FDD))) { - phy_procedures_eNB_TX(proc->subframe,PHY_vars_eNB_g[0][proc->CC_id],0,no_relay,NULL); + phy_procedures_eNB_TX(proc->subframe,PHY_vars_eNB_g[0][proc->CC_id],0,no_relay,NULL); - } - if ((subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_tx)==SF_S)) { - phy_procedures_eNB_TX(proc->subframe,PHY_vars_eNB_g[0][proc->CC_id],0,no_relay,NULL); - } +} + if ((subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_tx)==SF_S)) { + phy_procedures_eNB_TX(proc->subframe,PHY_vars_eNB_g[0][proc->CC_id],0,no_relay,NULL); +} - do_OFDM_mod_rt(proc->subframe_tx,PHY_vars_eNB_g[0][proc->CC_id]); + do_OFDM_mod_rt(proc->subframe_tx,PHY_vars_eNB_g[0][proc->CC_id]); - if (pthread_mutex_lock(&proc->mutex_tx) != 0) { - printf("[openair][SCHED][eNB] error locking mutex for eNB TX proc %d\n",proc->subframe); - } - else { - proc->instance_cnt_tx--; + if (pthread_mutex_lock(&proc->mutex_tx) != 0) { + printf("[openair][SCHED][eNB] error locking mutex for eNB TX proc %d\n",proc->subframe); +} + else { + proc->instance_cnt_tx--; - if (pthread_mutex_unlock(&proc->mutex_tx) != 0) { - printf("[openair][SCHED][eNB] error unlocking mutex for eNB TX proc %d\n",proc->subframe); - } - } + if (pthread_mutex_unlock(&proc->mutex_tx) != 0) { + printf("[openair][SCHED][eNB] error unlocking mutex for eNB TX proc %d\n",proc->subframe); +} +} - proc->frame_tx++; - if (proc->frame_tx==1024) - proc->frame_tx=0; + proc->frame_tx++; + if (proc->frame_tx==1024) + proc->frame_tx=0; - } +} stop_meas(&softmodem_stats_tx_sf[proc->subframe]); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->subframe),0); #ifdef HARD_RT @@ -1091,8 +1085,8 @@ static void * eNB_thread_tx(void *param) { #endif } -int eNB_thread_rx_status[10]; -static void * eNB_thread_rx(void *param) { + int eNB_thread_rx_status[10]; + static void * eNB_thread_rx(void *param) { //unsigned long cpuid; eNB_proc_t *proc = (eNB_proc_t*)param; @@ -1107,19 +1101,19 @@ static void * eNB_thread_rx(void *param) { #endif #endif -/*#if defined(ENABLE_ITTI) + /*#if defined(ENABLE_ITTI) // Wait for eNB application initialization to be complete (eNB registration to MME) wait_system_ready ("Waiting for eNB application to be ready %s\r", &start_eNB); -#endif*/ + #endif*/ #ifdef RTAI sprintf(task_name,"RXC%1dS%1d",proc->CC_id,proc->subframe); task = rt_task_init_schmod(nam2num(task_name), 0, 0, 0, SCHED_FIFO, 0xF); if (task==NULL) { - LOG_E(PHY,"[SCHED][eNB] Problem starting eNB_proc_RX thread_index %d (%s)!!!!\n",proc->subframe,task_name); - return 0; - } + LOG_E(PHY,"[SCHED][eNB] Problem starting eNB_proc_RX thread_index %d (%s)!!!!\n",proc->subframe,task_name); + return 0; +} else { LOG_I(PHY,"[SCHED][eNB] eNB RX thread CC_id %d SF %d started with id %p\n", /* on CPU %d*/ proc->CC_id, @@ -1144,10 +1138,10 @@ static void * eNB_thread_rx(void *param) { exit(-1); } LOG_I(HW,"[SCHED] eNB RX deadline thread %d(id %ld) started on CPU %d\n", - proc->subframe, gettid(),sched_getcpu()); + proc->subframe, gettid(),sched_getcpu()); #else LOG_I(HW,"[SCHED][eNB] eNB RX thread %d started on CPU %d\n", - proc->subframe,sched_getcpu()); + proc->subframe,sched_getcpu()); #endif #endif @@ -1389,43 +1383,46 @@ static void *eNB_thread(void *arg) void *rxp[2],*txp[2]; int i; + int trace_cnt=0; hw_subframe = 0; #endif + struct timespec trx_time0,trx_time1,trx_time2; + /* -#if defined(ENABLE_ITTI) - // Wait for eNB application initialization to be complete (eNB registration to MME) - wait_system_ready ("Waiting for eNB application to be ready %s\r", &start_eNB); -#endif + #if defined(ENABLE_ITTI) + // Wait for eNB application initialization to be complete (eNB registration to MME) + wait_system_ready ("Waiting for eNB application to be ready %s\r", &start_eNB); + #endif */ #ifdef RTAI - task = rt_task_init_schmod(nam2num("TASK0"), 0, 0, 0, SCHED_FIFO, 0xF); + task = rt_task_init_schmod(nam2num("TASK0"), 0, 0, 0, SCHED_FIFO, 0xF); #else #ifdef LOWLATENCY - attr.size = sizeof(attr); - attr.sched_flags = 0; - attr.sched_nice = 0; - attr.sched_priority = 0; + attr.size = sizeof(attr); + attr.sched_flags = 0; + attr.sched_nice = 0; + attr.sched_priority = 0; - /* This creates a .5 ms reservation */ - attr.sched_policy = SCHED_DEADLINE; - attr.sched_runtime = 0.5 * 1000000; - attr.sched_deadline = 0.5 * 1000000; - attr.sched_period = 1 * 1000000; + /* This creates a .5 ms reservation */ + attr.sched_policy = SCHED_DEADLINE; + attr.sched_runtime = 0.5 * 1000000; + attr.sched_deadline = 0.5 * 1000000; + attr.sched_period = 1 * 1000000; - /* pin the eNB main thread to CPU0*/ - /* if (pthread_setaffinity_np(pthread_self(), sizeof(mask),&mask) <0) { - perror("[MAIN_ENB_THREAD] pthread_setaffinity_np failed\n"); - }*/ + /* pin the eNB main thread to CPU0*/ + /* if (pthread_setaffinity_np(pthread_self(), sizeof(mask),&mask) <0) { + perror("[MAIN_ENB_THREAD] pthread_setaffinity_np failed\n"); + }*/ - if (sched_setattr(0, &attr, flags) < 0 ){ - perror("[SCHED] main eNB thread: sched_setattr failed\n"); - exit_fun("Nothing to add"); - } else { - LOG_I(HW,"[SCHED][eNB] eNB main deadline thread %ld started on CPU %d\n", - gettid(),sched_getcpu()); - } + if (sched_setattr(0, &attr, flags) < 0 ){ + perror("[SCHED] main eNB thread: sched_setattr failed\n"); + exit_fun("Nothing to add"); + } else { + LOG_I(HW,"[SCHED][eNB] eNB main deadline thread %ld started on CPU %d\n", + gettid(),sched_getcpu()); + } #endif #endif @@ -1548,6 +1545,7 @@ static void *eNB_thread(void *arg) vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_RXCNT,rx_cnt*samples_per_packets); + clock_gettime(CLOCK_MONOTONIC,&trx_time0); for (i=0;i<PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_rx;i++) rxp[i] = (void*)&rxdata[i][rx_cnt*samples_per_packets]; start_meas(&softmodem_stats_hw); @@ -1559,6 +1557,7 @@ static void *eNB_thread(void *arg) samples_per_packets, PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_rx); stop_meas(&softmodem_stats_hw); + clock_gettime(CLOCK_MONOTONIC,&trx_time1); if (rxs != samples_per_packets) oai_exit=1; @@ -1571,15 +1570,22 @@ static void *eNB_thread(void *arg) for (i=0;i<PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_tx;i++) txp[i] = (void*)&txdata[i][tx_cnt*samples_per_packets]; + openair0.trx_write_func(&openair0, (timestamp+samples_per_packets*tx_delay-tx_forward_nsamps), txp, samples_per_packets, PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_tx, 1); - + stop_meas(&softmodem_stats_mt); + clock_gettime(CLOCK_MONOTONIC,&trx_time2); + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE,0); + + if (trace_cnt++<10) + printf("TRX: t1 %llu (trx_read), t2 %llu (trx_write)\n",(long long unsigned int)(trx_time1.tv_nsec - trx_time0.tv_nsec), (long long unsigned int)(trx_time2.tv_nsec - trx_time1.tv_nsec)); + #else rt_sleep_ns(1000000); #endif @@ -1685,7 +1691,7 @@ static void *eNB_thread(void *arg) LOG_E(PHY,"[eNB] ERROR pthread_cond_signal for eNB RX thread %d\n",sf); } //else - // LOG_I(PHY,"[eNB] pthread_cond_signal for eNB RX thread %d instance_cnt_rx %d\n",sf,PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_rx); + // LOG_I(PHY,"[eNB] pthread_cond_signal for eNB RX thread %d instance_cnt_rx %d\n",sf,PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_rx); } else { LOG_W(PHY,"[eNB] Frame %d, eNB RX thread %d busy!! instance_cnt %d CC_id %d\n",PHY_vars_eNB_g[0][CC_id]->proc[sf].frame_rx,sf,PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_rx,CC_id); @@ -1877,6 +1883,11 @@ static void *UE_thread_synch(void *arg) { static void *UE_thread_tx(void *arg) { +#ifdef LOWLATENCY + struct sched_attr attr; + unsigned int flags = 0; +#endif + PHY_VARS_UE *UE = (PHY_VARS_UE*)arg; #ifndef OPENAIR2 @@ -1887,6 +1898,24 @@ static void *UE_thread_tx(void *arg) { #endif UE->instance_cnt_tx=-1; +#ifdef LOWLATENCY + attr.size = sizeof(attr); + attr.sched_flags = 0; + attr.sched_nice = 0; + attr.sched_priority = 0; + + /* This creates a 1ms reservation every 10ms period*/ + attr.sched_policy = SCHED_DEADLINE; + attr.sched_runtime = 1 * 1000000; // each tx thread requires 1ms to finish its job + attr.sched_deadline =1 * 1000000; // each tx thread will finish within 1ms + attr.sched_period = 1 * 10000000; // each tx thread has a period of 10ms from the starting point + + if (sched_setattr(0, &attr, flags) < 0 ){ + perror("[SCHED] eNB tx thread: sched_setattr failed\n"); + exit(-1); + } +#endif + mlockall(MCL_CURRENT | MCL_FUTURE); while (!oai_exit) { @@ -1940,9 +1969,32 @@ static void *UE_thread_rx(void *arg) { PHY_VARS_UE *UE = (PHY_VARS_UE*)arg; int i; + +#ifdef LOWLATENCY + struct sched_attr attr; + unsigned int flags = 0; +#endif UE->instance_cnt_rx=-1; + +#ifdef LOWLATENCY + attr.size = sizeof(attr); + attr.sched_flags = 0; + attr.sched_nice = 0; + attr.sched_priority = 0; + /* This creates a 1ms reservation every 10ms period*/ + attr.sched_policy = SCHED_DEADLINE; + attr.sched_runtime = 1 * 1000000; // each tx thread requires 1ms to finish its job + attr.sched_deadline =1 * 1000000; // each tx thread will finish within 1ms + attr.sched_period = 1 * 10000000; // each tx thread has a period of 10ms from the starting point + + if (sched_setattr(0, &attr, flags) < 0 ){ + perror("[SCHED] eNB tx thread: sched_setattr failed\n"); + exit(-1); + } +#endif + mlockall(MCL_CURRENT | MCL_FUTURE); #ifndef EXMIMO @@ -2041,6 +2093,13 @@ static void *UE_thread(void *arg) { unsigned int rxs; void *rxp[2],*txp[2]; +#ifdef LOWLATENCY + struct sched_attr attr; + unsigned int flags = 0; + unsigned long mask = 1; /* processor 0 */ +#endif + + printf("waiting for sync (UE_thread)\n"); #ifdef RTAI rt_sem_wait(sync_sem); @@ -2054,6 +2113,32 @@ static void *UE_thread(void *arg) { #endif printf("starting UE thread\n"); +#ifdef LOWLATENCY + attr.size = sizeof(attr); + attr.sched_flags = 0; + attr.sched_nice = 0; + attr.sched_priority = 0; + + /* This creates a .5 ms reservation */ + attr.sched_policy = SCHED_DEADLINE; + attr.sched_runtime = 0.5 * 1000000; + attr.sched_deadline = 0.5 * 1000000; + attr.sched_period = 1 * 1000000; + + /* pin the UE main thread to CPU0*/ + /* if (pthread_setaffinity_np(pthread_self(), sizeof(mask),&mask) <0) { + perror("[MAIN_ENB_THREAD] pthread_setaffinity_np failed\n"); + }*/ + + if (sched_setattr(0, &attr, flags) < 0 ){ + perror("[SCHED] main eNB thread: sched_setattr failed\n"); + exit_fun("Nothing to add"); + } else { + LOG_I(HW,"[SCHED][eNB] eNB main deadline thread %ld started on CPU %d\n", + gettid(),sched_getcpu()); + } +#endif + mlockall(MCL_CURRENT | MCL_FUTURE); T0 = rt_get_time_ns(); while (!oai_exit) { @@ -2417,18 +2502,18 @@ static void *UE_thread(void *arg) { /*if (mode == rx_calib_ue) { exit_fun("[HW][UE] UE in RX calibration mode"); - } - else {*/ - is_synchronized = 1; - //start the DMA transfers - //LOG_D(HW,"Before openair0_start_rt_acquisition \n"); - for (card=0;card<openair0_num_detected_cards;card++) - openair0_start_rt_acquisition(card); + } + else {*/ + is_synchronized = 1; + //start the DMA transfers + //LOG_D(HW,"Before openair0_start_rt_acquisition \n"); + for (card=0;card<openair0_num_detected_cards;card++) + openair0_start_rt_acquisition(card); - hw_slot_offset = (PHY_vars_UE_g[0][0]->rx_offset<<1) / PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti; - //LOG_D(HW,"Got synch: hw_slot_offset %d\n",hw_slot_offset); - oai_exit=1; - /*}*/ + hw_slot_offset = (PHY_vars_UE_g[0][0]->rx_offset<<1) / PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti; + //LOG_D(HW,"Got synch: hw_slot_offset %d\n",hw_slot_offset); + oai_exit=1; + /*}*/ } else { if (openair_daq_vars.freq_offset >= 0) { @@ -2544,9 +2629,15 @@ static void get_options (int argc, char **argv) { int clock_src; #endif int CC_id; +#ifdef EXMIMO char rxg_fname[256], line[1000]; FILE *rxg_fd; int l; +#endif + + + size_t size; + FILE *f; const Enb_properties_array_t *enb_properties; @@ -2569,7 +2660,7 @@ static void get_options (int argc, char **argv) { {"no-L2-connect", no_argument, NULL, LONG_OPTION_NO_L2_CONNECT}, {NULL, 0, NULL, 0}}; - while ((c = getopt_long (argc, argv, "C:dK:g:F:G:qO:m:SUVRMr:P:s:t:x:",long_options,NULL)) != -1) { + while ((c = getopt_long (argc, argv, "C:dK:g:F:G:qO:m:SUVRM:r:P:s:t:x:",long_options,NULL)) != -1) { switch (c) { case LONG_OPTION_ULSCH_MAX_CONSECUTIVE_ERRORS: ULSCH_max_consecutive_errors = atoi(optarg); @@ -2602,7 +2693,9 @@ static void get_options (int argc, char **argv) { mode = no_L2_connect; break; case 'M': - multi_thread=0; +#ifdef ETHERNET + strcpy(rrh_eNB_ip,optarg); +#endif break; case 'C': for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) { @@ -2848,6 +2941,13 @@ static void get_options (int argc, char **argv) { } // CC_id }// i } + else if ((UE_flag == 1) && (conf_config_file_name != NULL)) { + + // Here the configuration file is the XER encoded UE capabilities + // Read it in and store in asn1c data structures + strcpy(uecap_xer,conf_config_file_name); + uecap_xer_in=1; + } } int main(int argc, char **argv) { @@ -2857,8 +2957,8 @@ int main(int argc, char **argv) { int *eNB_thread_status_p; // int *eNB_thread_status_rx[10],*eNB_thread_status_tx[10]; #endif - int i,j,aa,card; -#if defined (XFORMS) || defined (EMOS) || (! defined (RTAI)) || defined (SPECTRA) + int i,aa,card; +#if defined (XFORMS) || defined (EMOS) void *status; #endif @@ -2873,19 +2973,7 @@ int main(int argc, char **argv) { unsigned int tcxo = 114; #endif -#ifdef ETHERNET - char *rrh_eNB_ip = "192.168.12.196"; - int rrh_eNB_port = 50000; - char *rrh_UE_ip = "192.168.12.196"; - int rrh_UE_port = 22222; -#endif - // int amp; - // uint8_t prach_fmt; - // int N_ZC; - - // int ret, ant; - int ant_offset=0; -#if defined (XFORMS) || defined (SPECTRA) +#if defined (XFORMS) int ret; #endif #if defined (EMOS) || (! defined (RTAI)) @@ -3271,11 +3359,19 @@ int main(int argc, char **argv) { tx_delay = 5; #endif } - + +#ifdef ETHERNET + if (frame_parms[0]->N_RB_DL == 6) samples_per_packets = 256; + else samples_per_packets = 1536; + + max_cnt = sf_bounds[9]; + printf("HW: samples_per_packets %d, max_cnt %d\n",samples_per_packets,max_cnt); +#endif + for (card=0;card<MAX_CARDS;card++) { #ifndef EXMIMO - openair0_cfg[card].samples_per_packet = 1024;//samples_per_packets; + openair0_cfg[card].samples_per_packet = samples_per_packets; #endif printf("HW: Configuring card %d, nb_antennas_tx/rx %d/%d\n",card, ((UE_flag==0) ? PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_tx : PHY_vars_UE_g[0][0]->lte_frame_parms.nb_antennas_tx), @@ -3283,16 +3379,16 @@ int main(int argc, char **argv) { openair0_cfg[card].Mod_id = 0; #ifdef ETHERNET if (UE_flag){ - printf("ETHERNET: Configuring UE ETH for %s:%d\n",rrh_UE_ip,rrh_UE_port); - openair0_cfg[card].rrh_ip = &rrh_UE_ip[0]; - openair0_cfg[card].rrh_port = rrh_UE_port; + printf("ETHERNET: Configuring UE ETH for %s:%d\n",rrh_UE_ip,rrh_UE_port); + openair0_cfg[card].rrh_ip = &rrh_UE_ip[0]; + openair0_cfg[card].rrh_port = rrh_UE_port; } else - { - printf("ETHERNET: Configuring eNB ETH for %s:%d\n",rrh_eNB_ip,rrh_eNB_port); - openair0_cfg[card].rrh_ip = &rrh_eNB_ip[0]; - openair0_cfg[card].rrh_port = rrh_eNB_port; - } + { + printf("ETHERNET: Configuring eNB ETH for %s:%d\n",rrh_eNB_ip,rrh_eNB_port); + openair0_cfg[card].rrh_ip = &rrh_eNB_ip[0]; + openair0_cfg[card].rrh_port = rrh_eNB_port; + } #endif openair0_cfg[card].sample_rate = sample_rate; openair0_cfg[card].tx_bw = bw; @@ -3307,7 +3403,7 @@ int main(int argc, char **argv) { openair0_cfg[card].tx_gain[i] = tx_gain[0][i]; openair0_cfg[card].rx_gain[i] = ((UE_flag==0) ? PHY_vars_eNB_g[0][0]->rx_total_gain_eNB_dB : - PHY_vars_UE_g[0][0]->rx_total_gain_dB) - 73; // calibrated for USRP B210 @ 2.6 GHz + PHY_vars_UE_g[0][0]->rx_total_gain_dB) - 73; // calibrated for USRP B210 @ 2.6 GHz openair0_cfg[card].tx_freq[i] = (UE_flag==0) ? downlink_frequency[0][i] : downlink_frequency[0][i]+uplink_frequency_offset[0][i]; openair0_cfg[card].rx_freq[i] = (UE_flag==0) ? downlink_frequency[0][i] + uplink_frequency_offset[0][i] : downlink_frequency[0][i]; printf("Setting tx_gain %f, rx_gain %f, tx_freq %f, rx_freq %f\n", @@ -3330,7 +3426,7 @@ int main(int argc, char **argv) { #ifdef OPENAIR2 int eMBMS_active=0; - l2_init(frame_parms[0],eMBMS_active, + l2_init(frame_parms[0],eMBMS_active,(uecap_xer_in==1)?uecap_xer:NULL, 0,// cba_group_active 0); // HO flag if (UE_flag == 1) @@ -3356,12 +3452,12 @@ int main(int argc, char **argv) { init_seeds(g_otg->seed); g_otg->num_nodes = 2; for (i=0; i<g_otg->num_nodes; i++){ - for (j=0; j<g_otg->num_nodes; j++){ - g_otg->application_idx[i][j] = 1; - //g_otg->packet_gen_type=SUBSTRACT_STRING; - g_otg->aggregation_level[i][j][0]=1; - g_otg->application_type[i][j][0] = BCBR; //MCBR, BCBR - } + for (j=0; j<g_otg->num_nodes; j++){ + g_otg->application_idx[i][j] = 1; + //g_otg->packet_gen_type=SUBSTRACT_STRING; + g_otg->aggregation_level[i][j][0]=1; + g_otg->application_type[i][j][0] = BCBR; //MCBR, BCBR + } } init_predef_traffic(UE_flag ? 1 : 0, UE_flag ? 0 : 1); // } @@ -3530,11 +3626,6 @@ int main(int argc, char **argv) { printf("EMOS thread created, ret=%d\n",ret); #endif -#ifdef SPECTRA - ret = pthread_create(&sensing_thread, NULL, sensing, NULL); - printf("sensing thread created, ret=%d\n",ret); -#endif - rt_sleep_ns(10*FRAME_PERIOD); #ifndef RTAI @@ -3722,12 +3813,6 @@ int main(int argc, char **argv) { printf("[OPENAIR][SCHED][CLEANUP] EMOS FIFO closed, error_code %d\n", error_code); #endif -#ifdef SPECTRA - printf("waiting for sensing thread\n"); - pthread_cancel(sensing_thread); - pthread_join(sensing_thread,&status); -#endif - if (ouput_vcd) vcd_signal_dumper_close(); diff --git a/targets/RT/USER/ue.gtkw b/targets/RT/USER/ue.gtkw index e311ba4b55..1b98219f60 100644 --- a/targets/RT/USER/ue.gtkw +++ b/targets/RT/USER/ue.gtkw @@ -1,22 +1,24 @@ [*] [*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI -[*] Tue Sep 9 07:03:39 2014 +[*] Sat Jan 3 21:45:58 2015 [*] [dumpfile] "/tmp/openair_dump_UE.vcd" -[dumpfile_mtime] "Tue Sep 9 06:37:26 2014" -[dumpfile_size] 94912 -[savefile] "/homes/knopp/Devel/openair4G/trunk/targets/RT/USER/ue.gtkw" -[timestart] 12883150000 +[dumpfile_mtime] "Sat Jan 3 21:45:33 2015" +[dumpfile_size] 98393197 +[savefile] "/home/haswell/openair4G_knopp/targets/RT/USER/ue.gtkw" +[timestart] 72755430000 [size] 1221 600 -[pos] 90 3 -*-21.000000 12886782928 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 +[pos] 251 123 +*-21.000000 72759034000 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 [sst_width] 224 [signals_width] 262 [sst_expanded] 1 [sst_vpaned_height] 143 @24 -variables.frame_number_UE[63:0] variables.hw_subframe[63:0] +variables.frame_number_UE[63:0] +@25 +variables.slot_number_UE[63:0] @28 functions.phy_procedures_ue_rx functions.ue_slot_fep @@ -25,7 +27,12 @@ functions.ue_rrc_measurements functions.ue_gain_control functions.ue_adjust_synch functions.lte_ue_pbch_procedures -@29 functions.lte_ue_pdcch_procedures +functions.rx_pdcch +functions.dci_decoding +functions.phy_ue_ulsch_encoding +functions.phy_ue_ulsch_modulation +functions.phy_ue_ulsch_scrambling +functions.phy_ue_config_sib2 [pattern_trace] 1 [pattern_trace] 0 diff --git a/targets/SIMU/USER/oaisim_functions.c b/targets/SIMU/USER/oaisim_functions.c index ea9472773f..6ebc33c91c 100644 --- a/targets/SIMU/USER/oaisim_functions.c +++ b/targets/SIMU/USER/oaisim_functions.c @@ -922,6 +922,7 @@ void init_openair2(void) { for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) l2_init (&PHY_vars_eNB_g[0][CC_id]->lte_frame_parms, oai_emulation.info.eMBMS_active_state, + NULL, oai_emulation.info.cba_group_active, oai_emulation.info.handover_active); diff --git a/targets/build_helper.bash b/targets/build_helper.bash index f31b1dd1af..38271115ea 100755 --- a/targets/build_helper.bash +++ b/targets/build_helper.bash @@ -253,19 +253,19 @@ check_install_freediamter(){ echo "Downloading gnutls archive" - if [ -f gnutls-3.1.0.tar.xz ]; then - $SUDO rm -f gnutls-3.1.0.tar.xz + if [ -f gnutls-3.1.23.tar.xz ]; then + $SUDO rm -f gnutls-3.1.23.tar.xz fi - if [ -d gnutls-3.1.0/ ]; then - $SUDO rm -rf gnutls-3.1.0/ + if [ -d gnutls-3.1.23/ ]; then + $SUDO rm -rf gnutls-3.1.23/ fi test_uninstall_package libgnutls-dev - $SUDO wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.1/gnutls-3.1.0.tar.xz - $SUDO tar -xf gnutls-3.1.0.tar.xz + $SUDO wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.1/gnutls-3.1.23.tar.xz + $SUDO tar -xf gnutls-3.1.23.tar.xz echo "Uncompressing gnutls archive ($PWD)" - cd gnutls-3.1.0/ + cd gnutls-3.1.23/ $SUDO ./configure --prefix=/usr if [ $? -ne 0 ]; then exit -1 -- GitLab