From 98a9469f5975028f16fdb5f98a9c55777b6d05b2 Mon Sep 17 00:00:00 2001 From: Navid Nikaein <navid.nikaein@eurecom.fr> Date: Thu, 27 Feb 2014 12:27:58 +0000 Subject: [PATCH] * add oaisim performance profiler OPP (enabled with option q ) * fix the bug for IP connectivity when more than 1 UE is connected (test with iperf: ok) * set target ul/dl mcs in the eNB scheduler to hardwire the desired MCS (option t for UL and m for DL) * add the code related to abstraction from http://svn.eurecom.fr/openairsvn/openair4G/tags/asilomar2013 * cleanup the code * pre-ci passed for all except for eMBMS git-svn-id: http://svn.eurecom.fr/openair4G/trunk@5093 818b1a75-f10b-46b9-bf7c-635c3b92a50f --- openair1/PHY/CODING/defs.h | 2 +- openair1/PHY/INIT/lte_init.c | 11 +- openair1/PHY/LTE_ESTIMATION/adjust_gain.c | 3 +- openair1/PHY/LTE_TRANSPORT/dci.c | 6 +- openair1/PHY/LTE_TRANSPORT/dci_tools.c | 6 +- openair1/PHY/LTE_TRANSPORT/dlsch_coding.c | 29 +- openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c | 100 +- openair1/PHY/LTE_TRANSPORT/pbch.c | 36 +- openair1/PHY/LTE_TRANSPORT/prach.c | 4 + openair1/PHY/LTE_TRANSPORT/print_stats.c | 10 +- openair1/PHY/LTE_TRANSPORT/ulsch_coding.c | 4 +- .../PHY/LTE_TRANSPORT/ulsch_demodulation.c | 4 +- openair1/PHY/Makefile.inc | 2 + openair1/PHY/TOOLS/dB_routines.c | 4 +- openair1/PHY/TOOLS/defs.h | 2 + openair1/PHY/TOOLS/file_output.c | 3 +- openair1/PHY/TOOLS/lut.c | 25 + openair1/PHY/TOOLS/time_meas.c | 34 + openair1/PHY/TOOLS/time_meas.h | 73 +- openair1/PHY/defs.h | 21 +- openair1/PHY/extern.h | 2 +- openair1/PHY/impl_defs_top.h | 7 +- openair1/PHY/vars.h | 8 +- openair1/SCHED/phy_procedures_lte_eNb.c | 5080 +++++++++-------- openair1/SCHED/phy_procedures_lte_ue.c | 76 +- .../bler_tx1_chan18_nrx1_mcs0.csv | 75 + .../bler_tx1_chan18_nrx1_mcs1.csv | 72 + .../bler_tx1_chan18_nrx1_mcs10.csv | 83 + .../bler_tx1_chan18_nrx1_mcs11.csv | 40 + .../bler_tx1_chan18_nrx1_mcs12.csv | 33 + .../bler_tx1_chan18_nrx1_mcs13.csv | 32 + .../bler_tx1_chan18_nrx1_mcs14.csv | 61 + .../bler_tx1_chan18_nrx1_mcs15.csv | 48 + .../bler_tx1_chan18_nrx1_mcs16.csv | 50 + .../bler_tx1_chan18_nrx1_mcs17.csv | 55 + .../bler_tx1_chan18_nrx1_mcs18.csv | 38 + .../bler_tx1_chan18_nrx1_mcs19.csv | 43 + .../bler_tx1_chan18_nrx1_mcs2.csv | 66 + .../bler_tx1_chan18_nrx1_mcs20.csv | 41 + .../bler_tx1_chan18_nrx1_mcs21.csv | 40 + .../bler_tx1_chan18_nrx1_mcs22.csv | 29 + .../bler_tx1_chan18_nrx1_mcs23.csv | 31 + .../bler_tx1_chan18_nrx1_mcs24.csv | 29 + .../bler_tx1_chan18_nrx1_mcs25.csv | 25 + .../bler_tx1_chan18_nrx1_mcs26.csv | 24 + .../bler_tx1_chan18_nrx1_mcs27.csv | 21 + .../bler_tx1_chan18_nrx1_mcs3.csv | 64 + .../bler_tx1_chan18_nrx1_mcs4.csv | 63 + .../bler_tx1_chan18_nrx1_mcs5.csv | 54 + .../bler_tx1_chan18_nrx1_mcs6.csv | 57 + .../bler_tx1_chan18_nrx1_mcs7.csv | 45 + .../bler_tx1_chan18_nrx1_mcs8.csv | 33 + .../bler_tx1_chan18_nrx1_mcs9.csv | 25 + .../BLER_SIMULATIONS/AWGN/eval_results.m | 103 + openair1/SIMULATION/LTE_PHY/dlsim.c | 13 +- openair1/SIMULATION/LTE_PHY/ulsim.c | 8 +- openair1/SIMULATION/RF/rf.c | 91 +- openair1/SIMULATION/TOOLS/abstraction.c | 35 +- openair1/SIMULATION/TOOLS/defs.h | 14 +- openair1/SIMULATION/TOOLS/multipath_channel.c | 379 +- openair1/SIMULATION/TOOLS/random_channel.c | 102 +- openair2/LAYER2/MAC/defs.h | 20 + openair2/LAYER2/MAC/eNB_scheduler.c | 78 +- openair2/LAYER2/MAC/rar_tools.c | 6 +- openair2/LAYER2/MAC/ue_procedures.c | 66 +- openair2/LAYER2/PDCP_v10.1.0/pdcp.c | 98 +- openair2/LAYER2/PDCP_v10.1.0/pdcp.h | 14 + .../RLC/UM_v9.3.0/rlc_um_control_primitives.c | 26 +- openair2/LAYER2/RLC/rlc.c | 40 +- openair2/LAYER2/RLC/rlc_rrc.c | 74 +- openair2/RRC/LITE/rrc_common.c | 22 +- openair2/UTIL/LOG/vcd_signal_dumper.h | 1 + openair2/UTIL/OCG/OCG.h | 13 +- targets/RTAI/USER/lte-softmodem.c | 7 +- targets/SIMU/USER/Makefile | 12 +- targets/SIMU/USER/channel_sim.c | 156 +- targets/SIMU/USER/oaisim.c | 368 +- targets/SIMU/USER/oaisim.h | 12 + targets/SIMU/USER/oaisim_config.c | 2 + targets/SIMU/USER/oaisim_functions.c | 37 +- targets/SIMU/USER/oaisim_functions.h | 2 + targets/SIMU/USER/sinr_sim.c | 23 +- targets/TEST/OAI/case02.py | 6 +- targets/TEST/OAI/case03.py | 9 +- 84 files changed, 5338 insertions(+), 3328 deletions(-) create mode 100644 openair1/PHY/TOOLS/lut.c create mode 100644 openair1/PHY/TOOLS/time_meas.c create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs0.csv create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs1.csv create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs10.csv create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs11.csv create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs12.csv create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs13.csv create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs14.csv create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs15.csv create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs16.csv create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs17.csv create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs18.csv create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs19.csv create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs2.csv create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs20.csv create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs21.csv create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs22.csv create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs23.csv create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs24.csv create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs25.csv create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs26.csv create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs27.csv create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs3.csv create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs4.csv create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs5.csv create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs6.csv create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs7.csv create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs8.csv create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs9.csv create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/eval_results.m diff --git a/openair1/PHY/CODING/defs.h b/openair1/PHY/CODING/defs.h index 1ddc73822ec..b89f1343c18 100644 --- a/openair1/PHY/CODING/defs.h +++ b/openair1/PHY/CODING/defs.h @@ -373,7 +373,7 @@ run in segments with final trace back after last segment. @param traceback flag to indicate that traceback should be performed*/ void phy_viterbi_dot11_sse2(int8_t *y,uint8_t *decoded_bytes,uint16_t n); -/*!\fn void phy_viterbi_lte_sse2(s8 *y, u8 *decoded_bytes, u16 n) +/*!\fn void phy_viterbi_lte_sse2(int8_t *y, uint8_t *decoded_bytes, uint16_t n) \brief This routine performs a SIMD optmized Viterbi decoder for the LTE 64-state tail-biting convolutional code. @param y Pointer to soft input (coded on 8-bits but should be limited to 4-bit precision to avoid overflow) @param decoded_bytes Pointer to decoded output diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index 90cafbf2537..32ea176f798 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -582,7 +582,16 @@ void phy_config_dedicated_ue(u8 Mod_id,u8 CH_index, PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id]; - + phy_vars_ue->total_TBS[CH_index]=0; + phy_vars_ue->total_TBS_last[CH_index]=0; + phy_vars_ue->bitrate[CH_index]=0; + phy_vars_ue->total_received_bits[CH_index]=0; + phy_vars_ue->dlsch_errors[CH_index]=0; + phy_vars_ue->dlsch_errors_last[CH_index]=0; + phy_vars_ue->dlsch_received[CH_index]=0; + phy_vars_ue->dlsch_received_last[CH_index]=0; + phy_vars_ue->dlsch_fer[CH_index]=0; + if (physicalConfigDedicated) { diff --git a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c index bf812c9e61f..8dae8381a20 100644 --- a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c +++ b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c @@ -154,10 +154,11 @@ phy_adjust_gain (PHY_VARS_UE *phy_vars_ue, u8 eNB_id) { #endif #ifdef DEBUG_PHY - if ((phy_vars_ue->frame%100==0) || (phy_vars_ue->frame < 10)) + /* if ((phy_vars_ue->frame%100==0) || (phy_vars_ue->frame < 10)) msg("[PHY][ADJUST_GAIN] frame %d, rx_power = %d, rx_power_fil = %d, rx_power_fil_dB = %d, coef=%d, ncoef=%d, rx_total_gain_dB = %d (%d,%d,%d)\n", phy_vars_ue->frame,rx_power,rx_power_fil,rx_power_fil_dB,coef,ncoef,phy_vars_ue->rx_total_gain_dB, TARGET_RX_POWER,MAX_RF_GAIN,MIN_RF_GAIN); + */ #endif //DEBUG_PHY } diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c index db7d798abf4..261e22f3134 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci.c +++ b/openair1/PHY/LTE_TRANSPORT/dci.c @@ -45,6 +45,7 @@ #include "PHY/defs.h" #include "PHY/extern.h" #include "SCHED/defs.h" +#include "SIMULATION/TOOLS/defs.h" // for taus #include <emmintrin.h> #include <xmmintrin.h> #ifdef __SSE3__ @@ -2062,9 +2063,10 @@ u8 generate_dci_top(u8 num_ue_spec_dci, y[1] = &yseq1[0]; // reset all bits to <NIL>, here we set <NIL> elements as 2 - memset(e, 2, DCI_BITS_MAX); + //memset(e, 2, DCI_BITS_MAX); // here we interpred NIL as a random QPSK sequence. That makes power estimation easier. - //for (i=0;i<DCI_BITS_MAX;i++) e[i]=taus()&1; + for (i=0;i<DCI_BITS_MAX;i++) + e[i]=taus()&1; e_ptr = e; // generate DCIs in order of decreasing aggregation level, then common/ue spec diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c index 1056d2b9acd..c2616b0fcbf 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c @@ -2636,7 +2636,7 @@ uint16_t quantize_wideband_pmi(PHY_MEASUREMENTS *meas,uint8_t eNB_id) { } */ -uint8_t sinr2cqi(int sinr,uint8_t trans_mode) { +uint8_t sinr2cqi(double sinr,uint8_t trans_mode) { // int flag_LA=0; if(flag_LA==0){ @@ -2751,7 +2751,9 @@ void fill_CQI(void *o,UCI_format_t uci_format,PHY_MEASUREMENTS *meas,uint8_t eNB if(flag_LA==1) sinr_tmp = sinr_eff; else - sinr_tmp = meas->wideband_cqi_avg[eNB_id]; + sinr_tmp = (double) meas->wideband_cqi_avg[eNB_id]; + + LOG_I(PHY,"Filling CQI %f for eNB %d\n",sinr_tmp,eNB_id); switch (uci_format) { case wideband_cqi_rank1_2A: diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c index d8df1473c6c..d495b7c2ca6 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c @@ -45,6 +45,7 @@ #include "PHY/CODING/lte_interleaver_inline.h" #include "PHY/LTE_TRANSPORT/defs.h" #include "defs.h" +#include "UTIL/LOG/vcd_signal_dumper.h" //#define DEBUG_DLSCH_CODING //#define DEBUG_DLSCH_FREE 1 @@ -74,11 +75,12 @@ void free_eNB_dlsch(LTE_eNB_DLSCH_t *dlsch) { msg("Freeing dlsch process %d (%p)\n",i,dlsch->harq_processes[i]); #endif if (dlsch->harq_processes[i]->b) { - free16(dlsch->harq_processes[i]->b,MAX_DLSCH_PAYLOAD_BYTES); + free16(dlsch->harq_processes[i]->b,MAX_DLSCH_PAYLOAD_BYTES); + dlsch->harq_processes[i]->b = NULL; #ifdef DEBUG_DLSCH_FREE msg("Freeing dlsch process %d b (%p)\n",i,dlsch->harq_processes[i]->b); #endif - } + } if (dlsch->harq_processes[i]->c) { #ifdef DEBUG_DLSCH_FREE msg("Freeing dlsch process %d c (%p)\n",i,dlsch->harq_processes[i]->c); @@ -88,14 +90,18 @@ void free_eNB_dlsch(LTE_eNB_DLSCH_t *dlsch) { #ifdef DEBUG_DLSCH_FREE msg("Freeing dlsch process %d c[%d] (%p)\n",i,r,dlsch->harq_processes[i]->c[r]); #endif - if (dlsch->harq_processes[i]->c[r]) + if (dlsch->harq_processes[i]->c[r]) { free16(dlsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+768); + dlsch->harq_processes[i]->c[r] = NULL; + } } } free16(dlsch->harq_processes[i],sizeof(LTE_DL_eNB_HARQ_t)); + dlsch->harq_processes[i] = NULL; } } free16(dlsch,sizeof(LTE_eNB_DLSCH_t)); + dlsch = NULL; } } @@ -137,7 +143,10 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,unsigne bzero(dlsch->harq_processes[i],sizeof(LTE_DL_eNB_HARQ_t)); // dlsch->harq_processes[i]->first_tx=1; dlsch->harq_processes[i]->b = (unsigned char*)malloc16(MAX_DLSCH_PAYLOAD_BYTES/bw_scaling); - if (!dlsch->harq_processes[i]->b) { + if (dlsch->harq_processes[i]->b) { + bzero(dlsch->harq_processes[i]->b,MAX_DLSCH_PAYLOAD_BYTES/bw_scaling); + } + else { msg("Can't get b\n"); exit_flag=1; } @@ -145,7 +154,10 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,unsigne for (r=0;r<MAX_NUM_DLSCH_SEGMENTS/bw_scaling;r++) { // account for filler in first segment and CRCs for multiple segment case dlsch->harq_processes[i]->c[r] = (unsigned char*)malloc16(((r==0)?8:0) + 3+ 768); - if (!dlsch->harq_processes[i]->c[r]) { + if (dlsch->harq_processes[i]->c[r]) { + bzero(dlsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+ 768); + } + else { msg("Can't get c\n"); exit_flag=2; } @@ -169,7 +181,8 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,unsigne return(dlsch); } } - msg("new_eNB_dlsch exit flag %d, size of %zd\n", exit_flag, sizeof(LTE_eNB_DLSCH_t)); + LOG_D(PHY, "new_eNB_dlsch exit flag %d, size of %ld\n", + exit_flag, sizeof(LTE_eNB_DLSCH_t)); free_eNB_dlsch(dlsch); return(NULL); @@ -224,6 +237,8 @@ int dlsch_encoding(unsigned char *a, unsigned int Kr=0,Kr_bytes,r,r_offset=0; unsigned short m=dlsch->harq_processes[harq_pid]->mcs; + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_IN); + A = dlsch->harq_processes[harq_pid]->TBS; //6228 // printf("Encoder: A: %d\n",A); mod_order = get_Qm(dlsch->harq_processes[harq_pid]->mcs); @@ -355,6 +370,8 @@ int dlsch_encoding(unsigned char *a, write_output("enc_output.m","enc",dlsch->e,r_offset,1,4); #endif } + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_OUT); + return(0); } diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c index a8bc4cc7b9f..1a988a57dcc 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c @@ -495,34 +495,14 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, } } } - //printf("sinr_eff1 = %f\n",sinr_eff); + LOG_D(OCM,"sinr_eff (lin, unweighted) = %f\n",sinr_eff); sinr_eff = -beta2_dlsch[TM][mcs]*log((sinr_eff)/(12*rb_count)); + LOG_D(OCM,"sinr_eff (lin, weighted) = %f\n",sinr_eff); sinr_eff = 10 * log10(sinr_eff); - LOG_I(OCM,"sinr_eff2 = %f\n",sinr_eff); - - // table lookup - sinr_eff *= 10; - sinr_eff = floor(sinr_eff); - // if ((int)sinr_eff%2) { - // sinr_eff += 1; - // } - sinr_eff /= 10; - msg("Imran sinr_eff after rounding = %f\n",sinr_eff); - for (index = 0; index < table_length[mcs]; index++) { - if(index == 0) { - if (sinr_eff < sinr_bler_map[mcs][0][index]) { - bler = 1; - break; - } - else if(sinr_eff > sinr_bler_map[mcs][0][table_length[mcs]]){ - bler = 0; - break; - } - } - if (sinr_eff == sinr_bler_map[mcs][0][index]) { - bler = sinr_bler_map[mcs][1][index]; - } - } + LOG_D(OCM,"sinr_eff (dB) = %f\n",sinr_eff); + + bler = interp(sinr_eff,&sinr_bler_map[mcs][0][0],&sinr_bler_map[mcs][1][0],table_length[mcs]); + #ifdef USER_MODE // need to be adapted for the emulation in the kernel space if (uniformrandom() < bler) { LOG_I(OCM,"abstraction_decoding failed (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler); @@ -591,56 +571,34 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, } } // averaging of accumulated MI - I = I/(12*rb_count); - //Now I->SINR_effective Mapping - - if(mcs<10) - { - sinr_eff = (p_qpsk[0]*pow(I,7) + p_qpsk[1]*pow(I,6) + p_qpsk[2]*pow(I,5) + p_qpsk[3]*pow(I,4) + p_qpsk[4]*pow(I,3) + p_qpsk[5]*pow(I,2) + p_qpsk[6]*I + p_qpsk[7]); - } - else if(mcs>9 && mcs<17) - { - sinr_eff = (p_qam16[0]*pow(I,7) + p_qam16[1]*pow(I,6) + p_qam16[2]*pow(I,5) + p_qam16[3]*pow(I,4) + p_qam16[4]*pow(I,3) + p_qam16[5]*pow(I,2) + p_qam16[6]*I + p_qam16[7]); - } - else if(mcs>16 && mcs<23) - { - sinr_eff = (p_qam64[0]*pow(I,7) + p_qam64[1]*pow(I,6) + p_qam64[2]*pow(I,5) + p_qam64[3]*pow(I,4) + p_qam64[4]*pow(I,3) + p_qam64[5]*pow(I,2) + p_qam64[6]*I + p_qam64[7]); - } - - sinr_eff = sinr_eff + 10*log10(beta2_dlsch_MI[TM][mcs]); - msg("SINR_Eff = %e\n",sinr_eff); - - sinr_eff *= 10; - sinr_eff = floor(sinr_eff); - // if ((int)sinr_eff%2) { - // sinr_eff += 1; - // } - sinr_eff /= 10; - msg("sinr_eff after rounding = %f\n",sinr_eff); - - for (index = 0; index < table_length[mcs]; index++) { - if(index == 0) { - if (sinr_eff < sinr_bler_map[mcs][0][index]) { - bler = 1; - break; - } - else if(sinr_eff > sinr_bler_map[mcs][0][table_length[mcs]]){ - bler = 0; - break; - } + I = I/(12*rb_count); + //Now I->SINR_effective Mapping + + if(mcs<10) + { + sinr_eff = (p_qpsk[0]*pow(I,7) + p_qpsk[1]*pow(I,6) + p_qpsk[2]*pow(I,5) + p_qpsk[3]*pow(I,4) + p_qpsk[4]*pow(I,3) + p_qpsk[5]*pow(I,2) + p_qpsk[6]*I + p_qpsk[7]); } - if (sinr_eff == sinr_bler_map[mcs][0][index]) { - bler = sinr_bler_map[mcs][1][index]; + else if(mcs>9 && mcs<17) + { + sinr_eff = (p_qam16[0]*pow(I,7) + p_qam16[1]*pow(I,6) + p_qam16[2]*pow(I,5) + p_qam16[3]*pow(I,4) + p_qam16[4]*pow(I,3) + p_qam16[5]*pow(I,2) + p_qam16[6]*I + p_qam16[7]); } - } - + else if(mcs>16 && mcs<23) + { + sinr_eff = (p_qam64[0]*pow(I,7) + p_qam64[1]*pow(I,6) + p_qam64[2]*pow(I,5) + p_qam64[3]*pow(I,4) + p_qam64[4]*pow(I,3) + p_qam64[5]*pow(I,2) + p_qam64[6]*I + p_qam64[7]); + } + + //sinr_eff = sinr_eff + 10*log10(beta2_dlsch_MI[TM][mcs]); + LOG_D(OCM,"SINR_Eff = %e\n",sinr_eff); + + bler = interp(sinr_eff,&sinr_bler_map[mcs][0][0],&sinr_bler_map[mcs][1][0],table_length[mcs]); + #ifdef USER_MODE // need to be adapted for the emulation in the kernel space - if (uniformrandom() < bler) { - msg("abstraction_decoding failed (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler); + if (uniformrandom() < bler) { + LOG_I(OCM,"abstraction_decoding failed (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler); return(0); } else { - msg("abstraction_decoding successful (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler); + LOG_I(OCM,"abstraction_decoding successful (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler); return(1); } #endif @@ -660,7 +618,7 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue, u16 i; #endif - // may not be necessaru for PMCH?? + // may not be necessary for PMCH?? for (eNB_id2=0;eNB_id2<NB_eNB_INST;eNB_id2++) { if (PHY_vars_eNB_g[eNB_id2]->lte_frame_parms.Nid_cell == phy_vars_ue->lte_frame_parms.Nid_cell) break; diff --git a/openair1/PHY/LTE_TRANSPORT/pbch.c b/openair1/PHY/LTE_TRANSPORT/pbch.c index 182b40761be..b8687e71c93 100755 --- a/openair1/PHY/LTE_TRANSPORT/pbch.c +++ b/openair1/PHY/LTE_TRANSPORT/pbch.c @@ -50,6 +50,10 @@ #include "extern.h" #include "PHY/extern.h" +#ifdef PHY_ABSTRACTION +#include "SIMULATION/TOOLS/defs.h" +#endif + #ifndef __SSE3__ extern __m128i zero; #define _mm_abs_epi16(xmmx) _mm_xor_si128((xmmx),_mm_cmpgt_epi16(zero,(xmmx))) @@ -900,21 +904,34 @@ u16 rx_pbch(LTE_UE_COMMON *lte_ue_common_vars, } - +#ifdef PHY_ABSTRACTION u16 rx_pbch_emul(PHY_VARS_UE *phy_vars_ue, u8 eNB_id, u8 pbch_phase) { - u8 pbch_error=0; - - LOG_D(PHY,"EMUL UE rx_pbch_emul: eNB_id %d, pbch_phase %d\n",eNB_id,pbch_phase); + double bler=0.0, x=0.0; + double sinr=0.0; + u16 nb_rb = phy_vars_ue->lte_frame_parms.N_RB_DL; + s16 f; + + // compute effective sinr + // TODO: adapt this to varible bandwidth + for (f=(nb_rb*6-3*12);f<(nb_rb*6+3*12);f++) { + if (f!=0) //skip DC + sinr += pow(10, 0.1*(phy_vars_ue->sinr_dB[f])); + } + sinr = 10*log10(sinr/(6*12)); + + bler = pbch_bler(sinr); + + LOG_D(PHY,"EMUL UE rx_pbch_emul: eNB_id %d, pbch_phase %d, sinr %f dB, bler %f \n", + eNB_id, + pbch_phase, + sinr, + bler); if (pbch_phase == (phy_vars_ue->frame % 4)) { - - // abtract pbch error here - // pbch_error = pbch_abstraction(); - - if (pbch_error == 0) { + if (uniformrandom() >= bler) { memcpy(phy_vars_ue->lte_ue_pbch_vars[eNB_id]->decoded_output,PHY_vars_eNB_g[eNB_id]->pbch_pdu,PBCH_PDU_SIZE); return(PHY_vars_eNB_g[eNB_id]->lte_frame_parms.nb_antennas_tx_eNB); } @@ -924,3 +941,4 @@ u16 rx_pbch_emul(PHY_VARS_UE *phy_vars_ue, else return(-1); } +#endif diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index 5ad45e2e005..5ce8cdf9575 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.c +++ b/openair1/PHY/LTE_TRANSPORT/prach.c @@ -827,6 +827,8 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB,u8 subframe,u16 *preamble_energy_list, NCS = NCS_restricted[Ncs_config]; } + start_meas(&phy_vars_eNB->rx_prach); + n_ra_prb = n_ra_prboffset; prach_root_sequence_map = (prach_fmt < 4) ? prach_root_sequence_map0_3 : prach_root_sequence_map4; @@ -1133,6 +1135,8 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB,u8 subframe,u16 *preamble_energy_list, #endif // exit(-1); }// preamble_index + stop_meas(&phy_vars_eNB->rx_prach); + } void init_prach_tables(int N_ZC) { diff --git a/openair1/PHY/LTE_TRANSPORT/print_stats.c b/openair1/PHY/LTE_TRANSPORT/print_stats.c index dd02ea027ef..2bbc4d73cbc 100644 --- a/openair1/PHY/LTE_TRANSPORT/print_stats.c +++ b/openair1/PHY/LTE_TRANSPORT/print_stats.c @@ -119,6 +119,7 @@ int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t len += sprintf(&buffer[len], "[UE PROC] RX total power eNB%d: %d dB, avg: %d dB\n",eNB,phy_vars_ue->PHY_measurements.rx_power_tot_dB[eNB],phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB]); len += sprintf(&buffer[len], "[UE PROC] RX total power lin: %d, avg: %d, RX total noise lin: %d, avg: %d\n",phy_vars_ue->PHY_measurements.rx_power_tot[eNB], phy_vars_ue->PHY_measurements.rx_power_avg[eNB], phy_vars_ue->PHY_measurements.n0_power_tot, phy_vars_ue->PHY_measurements.n0_power_avg); + len += sprintf(&buffer[len], "[UE PROC] effective SINR %.2f dB\n",phy_vars_ue->sinr_eff); len += sprintf(&buffer[len], "[UE PROC] Wideband CQI eNB %d: %d dB, avg: %d dB\n",eNB,phy_vars_ue->PHY_measurements.wideband_cqi_tot[eNB],phy_vars_ue->PHY_measurements.wideband_cqi_avg[eNB]); len += sprintf(&buffer[len], "[UE PROC] Subband CQI eNB%d (Ant 0): [%d %d %d %d %d %d %d] dB\n", @@ -195,6 +196,7 @@ int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t RRC_status = mac_get_rrc_status(phy_vars_ue->Mod_id,0,0); len += sprintf(&buffer[len],"[UE PROC] RRC status = %d\n",RRC_status); #endif + len += sprintf(&buffer[len],"[UE PROC] RSRP[0] %d, RSSI %d, RSRQ[0] %d\n",phy_vars_ue->PHY_measurements.rsrp[0], phy_vars_ue->PHY_measurements.rssi, phy_vars_ue->PHY_measurements.rsrq[0]); len += sprintf(&buffer[len], "[UE PROC] Transmission Mode %d (mode1_flag %d)\n",phy_vars_ue->transmission_mode[eNB],phy_vars_ue->lte_frame_parms.mode1_flag); if (phy_vars_ue->transmission_mode[eNB] == 6) @@ -252,8 +254,7 @@ int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t } len += sprintf(&buffer[len],"EOF\n"); - /* SR: for trailing '\0' */ - len ++; + len += sprintf(&buffer[len],"\0"); return len; } // is_clusterhead @@ -479,8 +480,7 @@ int dump_eNB_stats(PHY_VARS_eNB *phy_vars_eNB, char* buffer, int length) { len += sprintf(&buffer[len],"\n"); } len += sprintf(&buffer[len],"EOF\n"); - /* SR: for trailing '\0' */ - len++; - + len += sprintf(&buffer[len],"\0"); + return len; } diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c index 78844a094b5..51bafdff22a 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c @@ -247,12 +247,14 @@ u32 ulsch_encoding(u8 *a, // fill CQI/PMI information if (ulsch->O>0) { + /* //not correctly done if (flag_LA==1) sinr_eff = sinr_eff_cqi_calc(phy_vars_ue, 0); //eNB_id is missing here else sinr_eff = 0; + */ rnti = phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti; - fill_CQI(ulsch->o,ulsch->uci_format,meas,0,rnti, tmode,sinr_eff); + fill_CQI(ulsch->o,ulsch->uci_format,meas,0,rnti, tmode,phy_vars_ue->sinr_eff); LOG_D(PHY,"UE CQI\n"); print_CQI(ulsch->o,ulsch->uci_format,0); diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c index a45f9a5fd82..ade4091a190 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c @@ -1607,6 +1607,7 @@ void dump_ulsch(PHY_VARS_eNB *PHY_vars_eNB,uint8_t subframe, uint8_t UE_id) { uint32_t nsymb = (PHY_vars_eNB->lte_frame_parms.Ncp == 0) ? 14 : 12; uint8_t harq_pid = subframe2harq_pid(&PHY_vars_eNB->lte_frame_parms,PHY_vars_eNB->frame,subframe); printf("Dumping ULSCH in subframe %d with harq_pid %d, for NB_rb %d, mcs %d, Qm %d, N_symb %d\n", subframe,harq_pid,PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb,PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->mcs,get_Qm_ul(PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->mcs),PHY_vars_eNB->ulsch_eNB[UE_id]->Nsymb_pusch); +#ifndef OAI_EMU write_output("/tmp/ulsch_d.m","ulsch_dseq",&PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->d[0][96], PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->Kplus*3,1,0); write_output("/tmp/rxsig0.m","rxs0", &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][0],PHY_vars_eNB->lte_frame_parms.samples_per_tti*10,1,1); @@ -1639,6 +1640,7 @@ void dump_ulsch(PHY_VARS_eNB *PHY_vars_eNB,uint8_t subframe, uint8_t UE_id) { write_output("/tmp/ulsch_rxF_llr.m","ulsch_llr",PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->llr,PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb*12*get_Qm_ul(PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->mcs)*PHY_vars_eNB->ulsch_eNB[UE_id]->Nsymb_pusch,1,0); write_output("/tmp/ulsch_ch_mag.m","ulsch_ch_mag",&PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->ul_ch_mag[0][0][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1); // write_output("ulsch_ch_mag1.m","ulsch_ch_mag1",&PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->ul_ch_mag[0][1][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1); -#endif +#endif +#endif } diff --git a/openair1/PHY/Makefile.inc b/openair1/PHY/Makefile.inc index fd02e0933f0..b924b02f6d4 100644 --- a/openair1/PHY/Makefile.inc +++ b/openair1/PHY/Makefile.inc @@ -80,5 +80,7 @@ PHY_OBJS += $(TOP_DIR)/PHY/TOOLS/sqrt.o ifdef SMBV PHY_OBJS += $(TOP_DIR)/PHY/TOOLS/smbv.o endif +PHY_OBJS += $(TOP_DIR)/PHY/TOOLS/time_meas.o +PHY_OBJS += $(TOP_DIR)/PHY/TOOLS/lut.o #PHY_OBJS += $(TOP_DIR)/SIMULATION/TOOLS/rangen_double.o diff --git a/openair1/PHY/TOOLS/dB_routines.c b/openair1/PHY/TOOLS/dB_routines.c index dbc6cef5ae3..e7e41ab2367 100755 --- a/openair1/PHY/TOOLS/dB_routines.c +++ b/openair1/PHY/TOOLS/dB_routines.c @@ -569,7 +569,7 @@ s16 dB_fixed_times10(u32 x) { dB_power = dB_table_times10[(x&255)-1]; } if (dB_power > 900) - return(0); + return(900); return dB_power; } @@ -593,7 +593,7 @@ s8 dB_fixed(u32 x) { dB_power = dB_table[(x&255)-1]; } if (dB_power > 90) - return(0); + return(90); return dB_power; } diff --git a/openair1/PHY/TOOLS/defs.h b/openair1/PHY/TOOLS/defs.h index 6e292f8fa82..d2c7ca63566 100644 --- a/openair1/PHY/TOOLS/defs.h +++ b/openair1/PHY/TOOLS/defs.h @@ -588,4 +588,6 @@ void idft2048(int16_t *x,int16_t *y,int scale); /** @} */ +double interp(double x, double *xs, double *ys, int count); + #endif //__PHY_TOOLS_DEFS__H__ diff --git a/openair1/PHY/TOOLS/file_output.c b/openair1/PHY/TOOLS/file_output.c index dc8aa8618fd..c1ed67420b9 100755 --- a/openair1/PHY/TOOLS/file_output.c +++ b/openair1/PHY/TOOLS/file_output.c @@ -10,8 +10,7 @@ int write_output(const char *fname,const char *vname,void *data,int length,int d int i; - printf("Writing %d elements of type %d to %s\n",length,format,fname); - printf("Writing %d elements of type %d to %s\n",length,format,fname); + printf("Writing %d elements of type %d to %s\n",length,format,fname); if (format == 10 || format ==11 || format == 12 ) diff --git a/openair1/PHY/TOOLS/lut.c b/openair1/PHY/TOOLS/lut.c new file mode 100644 index 00000000000..78d9afca9a2 --- /dev/null +++ b/openair1/PHY/TOOLS/lut.c @@ -0,0 +1,25 @@ +double interp(double x, double *xs, double *ys, int count) +{ + int i; + double dx, dy; + + if (x < xs[0]) { + return 1.0; /* return minimum element */ + } + + if (x > xs[count-1]) { + return 0.0; /* return maximum */ + } + + /* find i, such that xs[i] <= x < xs[i+1] */ + for (i = 0; i < count-1; i++) { + if (xs[i+1] > x) { + break; + } + } + + /* interpolate */ + dx = xs[i+1] - xs[i]; + dy = ys[i+1] - ys[i]; + return ys[i] + (x - xs[i]) * dy / dx; +} diff --git a/openair1/PHY/TOOLS/time_meas.c b/openair1/PHY/TOOLS/time_meas.c new file mode 100644 index 00000000000..0e7b4800350 --- /dev/null +++ b/openair1/PHY/TOOLS/time_meas.c @@ -0,0 +1,34 @@ +#include <stdio.h> +#include "time_meas.h" + +// global var for openair performance profiler +int opp_enabled = 0; + +void print_meas(time_stats_t *ts, const char* name, time_stats_t * total_exec_time, time_stats_t * sf_exec_time){ + + if (opp_enabled) { + + static int first_time = 0; + static double cpu_freq_GHz = 0.0; + + if (cpu_freq_GHz == 0.0) + cpu_freq_GHz = get_cpu_freq_GHz(); + + if (first_time == 0) { + first_time=1; + fprintf(stderr, "%25s %25s %25s %20s %15s %6f\n","Name","Total","Average/Frame","Trials","CPU_F_GHz", cpu_freq_GHz); + } + if (ts->trials>0) { + //printf("%20s: total: %10.3f ms, average: %10.3f us (%10d trials)\n", name, ts->diff/cpu_freq_GHz/1000000.0, ts->diff/ts->trials/cpu_freq_GHz/1000.0, ts->trials); + + fprintf(stderr, "%25s: %15.3f ms (%5.2f%); %15.3f us (%5.2f%); %15d;\n", + name, + (ts->diff/cpu_freq_GHz/1000000.0), + ((ts->diff/cpu_freq_GHz/1000000.0)/(total_exec_time->diff/cpu_freq_GHz/1000000.0))*100, // percentage + (ts->diff/ts->trials/cpu_freq_GHz/1000.0), + ((ts->diff/ts->trials/cpu_freq_GHz/1000.0)/(sf_exec_time->diff/sf_exec_time->trials/cpu_freq_GHz/1000.0))*100, // percentage + ts->trials); + } + } + +} diff --git a/openair1/PHY/TOOLS/time_meas.h b/openair1/PHY/TOOLS/time_meas.h index 3da89ba8eb7..203a8b95240 100644 --- a/openair1/PHY/TOOLS/time_meas.h +++ b/openair1/PHY/TOOLS/time_meas.h @@ -1,6 +1,9 @@ #ifdef OMP #include <omp.h> #endif +#include <unistd.h> +// global var to enable openair performance profiler +extern int opp_enabled; typedef struct { @@ -13,6 +16,8 @@ typedef struct { static inline void start_meas(time_stats_t *ts) __attribute__((always_inline)); static inline void stop_meas(time_stats_t *ts) __attribute__((always_inline)); +void print_meas(time_stats_t *ts, const char* name, time_stats_t * total_exec_time, time_stats_t * sf_exec_time); + #if defined(__i386__) static inline unsigned long long rdtsc_oai(void) __attribute__((always_inline)); static inline unsigned long long rdtsc_oai(void) { @@ -31,38 +36,62 @@ static inline unsigned long long rdtsc_oai() { static inline void start_meas(time_stats_t *ts) { -#ifdef OMP - int tid; + if (opp_enabled) { - tid = omp_get_thread_num(); - if (tid==0) +#ifdef OMP + int tid; + + tid = omp_get_thread_num(); + if (tid==0) #endif - { - ts->trials++; - ts->in = rdtsc_oai(); - } + { + ts->trials++; + ts->in = rdtsc_oai(); + } + } } static inline void stop_meas(time_stats_t *ts) { - long long out = rdtsc_oai(); - + if (opp_enabled) { + long long out = rdtsc_oai(); + #ifdef OMP - int tid; - tid = omp_get_thread_num(); - if (tid==0) + int tid; + tid = omp_get_thread_num(); + if (tid==0) #endif - { - ts->diff += (out-ts->in); - if ((out-ts->in) > ts->max) - ts->max = out-ts->in; - - } + { + ts->diff += (out-ts->in); + if ((out-ts->in) > ts->max) + ts->max = out-ts->in; + + } + } } static inline void reset_meas(time_stats_t *ts) { - ts->trials=0; - ts->diff=0; - ts->max=0; + if (opp_enabled){ + ts->trials=0; + ts->diff=0; + ts->max=0; + } } + +/*static inline double get_mean_meas_us(time_stats_t *ts, double cpu_freq_GHz) { + + return (double) ts->diff/ts->trials/cpu_freq_GHz/1000.0; + + }*/ + +static inline double get_cpu_freq_GHz(void) { + + time_stats_t ts; + reset_meas(&ts); + start_meas(&ts); + sleep(1); + stop_meas(&ts); + return (double)ts.diff/1000000000; +} + diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index f8a842e405b..82ce81c194f 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -301,10 +301,16 @@ typedef struct { unsigned int total_dlsch_bitrate; unsigned int total_transmitted_bits; unsigned int total_system_throughput; - + + time_stats_t phy_proc; + time_stats_t phy_proc_tx; + time_stats_t phy_proc_rx; + time_stats_t rx_prach; + time_stats_t ofdm_mod_stats; time_stats_t dlsch_encoding_stats; time_stats_t dlsch_modulation_stats; + time_stats_t dlsch_scrambling_stats; time_stats_t dlsch_rate_matching_stats; time_stats_t dlsch_turbo_encoding_stats; time_stats_t dlsch_interleaving_stats; @@ -452,6 +458,9 @@ typedef struct /// sinr for all subcarriers of first symbol for the CQI Calculation double *sinr_CQI_dB; + /// sinr_effective used for CQI calulcation + double sinr_eff; + /// N0 (used for abstraction) double N0; @@ -488,7 +497,11 @@ typedef struct /// Transmission mode per eNB u8 transmission_mode[NUMBER_OF_CONNECTED_eNB_MAX]; - + + time_stats_t phy_proc; + time_stats_t phy_proc_tx; + time_stats_t phy_proc_rx; + time_stats_t ofdm_mod_stats; time_stats_t ulsch_encoding_stats; time_stats_t ulsch_modulation_stats; @@ -508,6 +521,7 @@ typedef struct time_stats_t dlsch_turbo_decoding_stats; time_stats_t dlsch_deinterleaving_stats; time_stats_t dlsch_llr_stats; + time_stats_t dlsch_unscrambling_stats; time_stats_t dlsch_tc_init_stats; time_stats_t dlsch_tc_alpha_stats; time_stats_t dlsch_tc_beta_stats; @@ -515,7 +529,8 @@ typedef struct time_stats_t dlsch_tc_ext_stats; time_stats_t dlsch_tc_intl1_stats; time_stats_t dlsch_tc_intl2_stats; - + time_stats_t tx_prach; + #if defined(ENABLE_RAL) hash_table_t *ral_thresholds_timed; SLIST_HEAD(ral_thresholds_gen_poll_s, ral_threshold_phy_t) ral_thresholds_gen_polled[RAL_LINK_PARAM_GEN_MAX]; diff --git a/openair1/PHY/extern.h b/openair1/PHY/extern.h index cae887ad0ad..6628956e5bc 100755 --- a/openair1/PHY/extern.h +++ b/openair1/PHY/extern.h @@ -61,7 +61,7 @@ extern unsigned char NB_RN_INST; #endif extern int flag_LA; -extern double sinr_bler_map[MCS_COUNT][2][20]; +extern double sinr_bler_map[MCS_COUNT][2][MCS_TABLE_LENGTH_MAX]; extern double sinr_bler_map_up[MCS_COUNT][2][16]; extern int table_length[MCS_COUNT]; extern double sinr_to_cqi[4][16]; diff --git a/openair1/PHY/impl_defs_top.h b/openair1/PHY/impl_defs_top.h index 0fc0c2a7b9e..17d46e6b15c 100755 --- a/openair1/PHY/impl_defs_top.h +++ b/openair1/PHY/impl_defs_top.h @@ -239,6 +239,10 @@ #define AMP 512//1024 //4096 #endif +#define AMP_OVER_SQRT2 ((AMP*ONE_OVER_SQRT2_Q15)>>15) +#define AMP_OVER_2 (AMP>>1) + + #ifndef OPENAIR_LTE /// /// PHY-MAC Interface Defs @@ -486,7 +490,8 @@ typedef struct } PHY_MEASUREMENTS_eNB; -#define MCS_COUNT 24 +#define MCS_COUNT 28 +#define MCS_TABLE_LENGTH_MAX 64 #endif //__PHY_IMPLEMENTATION_DEFS_H__ /**@} diff --git a/openair1/PHY/vars.h b/openair1/PHY/vars.h index cae0782dd2f..b0103c4d7c1 100755 --- a/openair1/PHY/vars.h +++ b/openair1/PHY/vars.h @@ -71,7 +71,7 @@ int flagMag; //extern channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX]; //extern double ABS_SINR_eff_BLER_table[MCS_COUNT][9][9]; //extern double ABS_beta[MCS_COUNT];odi -double sinr_bler_map[MCS_COUNT][2][20]; +double sinr_bler_map[MCS_COUNT][2][MCS_TABLE_LENGTH_MAX]; int table_length[MCS_COUNT]; //double sinr_bler_map_up[MCS_COUNT][2][16]; @@ -110,8 +110,10 @@ double beta1_dlsch_MI[6][MCS_COUNT] = { {1.32955, 0.59522, 0.54024, 0.98698, 0.8 double beta2_dlsch_MI[6][MCS_COUNT] = { {1.36875, 0.59304, 0.53870, 0.98239, 0.81637, 0.76847, 0.69842, 0.69885, 0.69967, 0.69826, 0.82660, 0.70559, 0.78404, 0.70670, 0.55393, 0.36893, 0.52225, 0.39752, 0.40494, 0.46239, 0.49247,0.26900,0.34504,1}, {0.43775, 0.78208, 0.72875, 0.77458, 0.64485, 0.69174, 0.66097, 0.63289, 0.59652, 0.61175, 0.44551, 0.56047, 0.57314, 0.57553, 0.58849, 0.52159, 0.21241, 0.30139, 0.37373, 0.32029, 0.37067, 0.36706, 0.27118,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,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1},{1.079518113138858, 1.105622953570353, 1.031337449900606, 1.073342032668810, 1.242636589110353, 1.255054927783647, 1.291463834317768, 1.317048698347491, 1.354485054187984, 0.338534029291017, 1.85, 1.79, 1.65, 1.54, 1.46, 1.39, 1.33,1, 1,1,1,1,1,1},{0.54448, 0.73731, 0.79165, 0.74407, 0.68042, 0.64906, 0.71349, 0.62109, 0.65815, 0.60940, 0.90549, 0.78708, 1.03176, 0.58431, 0.53379, 0.51224, 0.52767, 0.26848, 0.29642, 0.36879, 0.34148, 0.35279,0.40633,1}}; */ //ideal channel estimation values -double beta1_dlsch[6][MCS_COUNT] = { {2.3814, 0.4956, 0.5273, 1.1708, 0.8014, 0.7889, 0.8111, 0.8139, 0.8124, 0.8479, 1.9280, 1.9664, 2.3857, 2.5147, 2.4511, 3.0158, 2.8643, 5.3013, 5.8594, 6.5372, 7.8073, 7.8030, 7.5295, 7.1320}, {0.5146, 0.5549, 0.7405, 0.6913, 0.7349, 0.7000, 0.7539, 0.7955, 0.8074, 0.7760, 1.8150, 1.6561, 1.9280, 2.3563, 2.6699, 2.3086, 3.1601, 4.5316, 5.2870, 6.0983, 6.5635, 7.7024, 9.9592, 6.6173}, {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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {1.79358, 1.17908, 2.02600, 1.72040, 1.58618, 1.59039, 1.68111, 1.67062, 1.64911, 1.33274, 4.87800, 3.58797, 3.72338, 5.35700, 2.81752, 1.93472, 2.23259, 1,1,1,1,1,1,1}, {0.4445, 0.5918, 0.7118, 0.7115, 0.7284, 0.7202, 0.7117, 0.8111, 0.8239, 0.7907, 1.8456, 1.8144, 2.3830, 2.6634, 2.6129, 2.8127, 2.7372, 4.9424, 4.8763, 6.8413, 7.1493, 9.4180, 10.1230, 8.9613}}; -double beta2_dlsch[6][MCS_COUNT] = { {2.3639, 0.4952, 0.5207, 1.1572, 0.8026, 0.7864, 0.7996, 0.8034, 0.8200, 0.8367, 1.8701, 1.9212, 2.2947, 2.4472, 2.4091, 2.9479, 2.8973, 5.0591, 5.5134, 6.1483, 7.2166, 7.5177, 7.5704, 7.2248}, {0.5113, 0.5600, 0.7359, 0.6860, 0.7344, 0.6902, 0.7315, 0.7660, 0.7817, 0.7315, 1.7268, 1.5912, 1.8519, 2.2115, 2.4580, 2.1879, 2.9015, 4.1543, 4.6986, 5.3193, 5.6319, 6.5640, 8.2421, 5.6393}, {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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {0.79479, 0.52872, 0.90005, 0.77170, 0.73220, 0.72060, 0.75433, 0.75451, 0.75989, 0.67655, 1.68525, 1.31100, 1.46573, 1.99843, 1.57293, 1.62852, 2.10636, 1,1,1,1,1,1,1}, {0.4398, 0.5823, 0.7094, 0.7043, 0.7282, 0.7041, 0.6979, 0.7762, 0.7871, 0.7469, 1.7752, 1.7443, 2.2266, 2.4767, 2.4146, 2.6040, 2.5708, 4.4488, 4.4944, 5.9630, 6.3740, 8.1097, 8.4210, 7.8027}}; +//double beta1_dlsch[6][MCS_COUNT] = { {2.3814, 0.4956, 0.5273, 1.1708, 0.8014, 0.7889, 0.8111, 0.8139, 0.8124, 0.8479, 1.9280, 1.9664, 2.3857, 2.5147, 2.4511, 3.0158, 2.8643, 5.3013, 5.8594, 6.5372, 7.8073, 7.8030, 7.5295, 7.1320}, {0.5146, 0.5549, 0.7405, 0.6913, 0.7349, 0.7000, 0.7539, 0.7955, 0.8074, 0.7760, 1.8150, 1.6561, 1.9280, 2.3563, 2.6699, 2.3086, 3.1601, 4.5316, 5.2870, 6.0983, 6.5635, 7.7024, 9.9592, 6.6173}, {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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {1.79358, 1.17908, 2.02600, 1.72040, 1.58618, 1.59039, 1.68111, 1.67062, 1.64911, 1.33274, 4.87800, 3.58797, 3.72338, 5.35700, 2.81752, 1.93472, 2.23259, 1,1,1,1,1,1,1}, {0.4445, 0.5918, 0.7118, 0.7115, 0.7284, 0.7202, 0.7117, 0.8111, 0.8239, 0.7907, 1.8456, 1.8144, 2.3830, 2.6634, 2.6129, 2.8127, 2.7372, 4.9424, 4.8763, 6.8413, 7.1493, 9.4180, 10.1230, 8.9613}}; +//double beta2_dlsch[6][MCS_COUNT] = { {2.3639, 0.4952, 0.5207, 1.1572, 0.8026, 0.7864, 0.7996, 0.8034, 0.8200, 0.8367, 1.8701, 1.9212, 2.2947, 2.4472, 2.4091, 2.9479, 2.8973, 5.0591, 5.5134, 6.1483, 7.2166, 7.5177, 7.5704, 7.2248}, {0.5113, 0.5600, 0.7359, 0.6860, 0.7344, 0.6902, 0.7315, 0.7660, 0.7817, 0.7315, 1.7268, 1.5912, 1.8519, 2.2115, 2.4580, 2.1879, 2.9015, 4.1543, 4.6986, 5.3193, 5.6319, 6.5640, 8.2421, 5.6393}, {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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {0.79479, 0.52872, 0.90005, 0.77170, 0.73220, 0.72060, 0.75433, 0.75451, 0.75989, 0.67655, 1.68525, 1.31100, 1.46573, 1.99843, 1.57293, 1.62852, 2.10636, 1,1,1,1,1,1,1}, {0.4398, 0.5823, 0.7094, 0.7043, 0.7282, 0.7041, 0.6979, 0.7762, 0.7871, 0.7469, 1.7752, 1.7443, 2.2266, 2.4767, 2.4146, 2.6040, 2.5708, 4.4488, 4.4944, 5.9630, 6.3740, 8.1097, 8.4210, 7.8027}}; +double beta1_dlsch[6][MCS_COUNT] = { {1.199175, 1.085656, 0.983872, 0.843789, 0.816093, 0.853078, 0.899236, 0.919665, 0.888673, 0.924181, 0.814176, 0.794108, 0.770653, 0.826266, 0.982043, 0.979621, 0.985176, 0.901741, 0.870311, 0.911303, 0.898923, 1.003359, 0.988535, 1.030639, 1.151038, 1.116939, 1.214118, 1.219148}, {0.5146, 0.5549, 0.7405, 0.6913, 0.7349, 0.7000, 0.7539, 0.7955, 0.8074, 0.7760, 1.8150, 1.6561, 1.9280, 2.3563, 2.6699, 2.3086, 3.1601, 4.5316, 5.2870, 6.0983, 6.5635, 7.7024, 9.9592, 6.6173}, {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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {1.79358, 1.17908, 2.02600, 1.72040, 1.58618, 1.59039, 1.68111, 1.67062, 1.64911, 1.33274, 4.87800, 3.58797, 3.72338, 5.35700, 2.81752, 1.93472, 2.23259, 1,1,1,1,1,1,1}, {0.4445, 0.5918, 0.7118, 0.7115, 0.7284, 0.7202, 0.7117, 0.8111, 0.8239, 0.7907, 1.8456, 1.8144, 2.3830, 2.6634, 2.6129, 2.8127, 2.7372, 4.9424, 4.8763, 6.8413, 7.1493, 9.4180, 10.1230, 8.9613}}; +double beta2_dlsch[6][MCS_COUNT] = { {0.534622, 0.596561, 0.500838, 0.471721, 0.548218, 0.547974, 0.924245, 0.836484, 0.776917, 0.879691, 0.875722, 0.666933, 0.666393, 0.755377, 1.074985, 1.080290, 1.010914, 0.790892, 0.793435, 0.860249, 0.901508, 0.967060, 0.951372, 1.011493, 1.106151, 1.117076, 1.209397, 1.227790}, {0.5113, 0.5600, 0.7359, 0.6860, 0.7344, 0.6902, 0.7315, 0.7660, 0.7817, 0.7315, 1.7268, 1.5912, 1.8519, 2.2115, 2.4580, 2.1879, 2.9015, 4.1543, 4.6986, 5.3193, 5.6319, 6.5640, 8.2421, 5.6393}, {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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {0.79479, 0.52872, 0.90005, 0.77170, 0.73220, 0.72060, 0.75433, 0.75451, 0.75989, 0.67655, 1.68525, 1.31100, 1.46573, 1.99843, 1.57293, 1.62852, 2.10636, 1,1,1,1,1,1,1}, {0.4398, 0.5823, 0.7094, 0.7043, 0.7282, 0.7041, 0.6979, 0.7762, 0.7871, 0.7469, 1.7752, 1.7443, 2.2266, 2.4767, 2.4146, 2.6040, 2.5708, 4.4488, 4.4944, 5.9630, 6.3740, 8.1097, 8.4210, 7.8027}}; //real channel estimation valus /* diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index d0fb239c973..8ce0d6ab4b1 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -25,15 +25,15 @@ Forums : http://forums.eurecom.fsr/openairinterface Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France - *******************************************************************************/ +*******************************************************************************/ /*! \file phy_procedures_lte_eNB.c * \brief Implementation of eNB procedures from 36.213 LTE specifications - * \author R. Knopp, F. Kaltenberger + * \author R. Knopp, F. Kaltenberger, N. Nikaein * \date 2011 * \version 0.1 * \company Eurecom - * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr + * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr,navid.nikaein@eurecom.fr * \note * \warning */ @@ -49,7 +49,7 @@ #include "SCHED/phy_procedures_emos.h" #endif -#define DEBUG_PHY_PROC 1 +#define DEBUG_PHY_PROC //#define DEBUG_ULSCH #include "ARCH/CBMIMO1/DEVICE_DRIVER/extern.h" @@ -79,6 +79,7 @@ #define PUCCH 1 #define PUCCH1_THRES 25 +#define PUCCH1a_THRES 15 extern inline unsigned int taus(void); extern int exit_openair; @@ -112,35 +113,35 @@ extern int rx_sig_fifo; static unsigned char I0_clear = 1; u8 is_SR_subframe(PHY_VARS_eNB *phy_vars_eNB,u8 UE_id,u8 subframe) { - + LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking for SR TXOp(sr_ConfigIndex %d)\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->ulsch_eNB[UE_id]->rnti,phy_vars_eNB->frame,subframe, - phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex); - + phy_vars_eNB->Mod_id,phy_vars_eNB->ulsch_eNB[UE_id]->rnti,phy_vars_eNB->frame,subframe, + phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex); + if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 4) { // 5 ms SR period - if ((subframe%5) == phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex) - return(1); + if ((subframe%5) == phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex) + return(1); } else if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 14) { // 10 ms SR period - if (subframe==(phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-5)) - return(1); + if (subframe==(phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-5)) + return(1); } else if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 34) { // 20 ms SR period - if ((10*(phy_vars_eNB->frame&1)+subframe) == (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-15)) - return(1); + if ((10*(phy_vars_eNB->frame&1)+subframe) == (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-15)) + return(1); } else if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 74) { // 40 ms SR period - if ((10*(phy_vars_eNB->frame&3)+subframe) == (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-35)) - return(1); + if ((10*(phy_vars_eNB->frame&3)+subframe) == (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-35)) + return(1); } else if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 154) { // 80 ms SR period - if ((10*(phy_vars_eNB->frame&7)+subframe) == (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-75)) - return(1); + if ((10*(phy_vars_eNB->frame&7)+subframe) == (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-75)) + return(1); } return(0); } - + s32 add_ue(s16 rnti, PHY_VARS_eNB *phy_vars_eNB) { u8 i; @@ -148,19 +149,19 @@ s32 add_ue(s16 rnti, PHY_VARS_eNB *phy_vars_eNB) { LOG_I(PHY,"[eNB %d] Adding UE with rnti %x\n",phy_vars_eNB->Mod_id,rnti); //#endif for (i=0;i<NUMBER_OF_UE_MAX;i++) { - if ((phy_vars_eNB->dlsch_eNB[i]==NULL) || (phy_vars_eNB->ulsch_eNB[i]==NULL)) { - LOG_E(PHY,"Can't add UE, not enough memory allocated\n"); - return(-1); - } - else { - if (phy_vars_eNB->eNB_UE_stats[i].crnti==0) { - LOG_I(PHY,"UE_id %d associated with rnti %x\n",i, rnti); - phy_vars_eNB->dlsch_eNB[i][0]->rnti = rnti; - phy_vars_eNB->ulsch_eNB[i]->rnti = rnti; - phy_vars_eNB->eNB_UE_stats[i].crnti = rnti; - return(i); - } + if ((phy_vars_eNB->dlsch_eNB[i]==NULL) || (phy_vars_eNB->ulsch_eNB[i]==NULL)) { + LOG_E(PHY,"Can't add UE, not enough memory allocated\n"); + return(-1); + } + else { + if (phy_vars_eNB->eNB_UE_stats[i].crnti==0) { + LOG_I(PHY,"UE_id %d associated with rnti %x\n",i, rnti); + phy_vars_eNB->dlsch_eNB[i][0]->rnti = rnti; + phy_vars_eNB->ulsch_eNB[i]->rnti = rnti; + phy_vars_eNB->eNB_UE_stats[i].crnti = rnti; + return(i); } + } } return(-1); } @@ -172,20 +173,20 @@ s32 remove_ue(u16 rnti, PHY_VARS_eNB *phy_vars_eNB, u8 abstraction_flag) { LOG_I(PHY,"eNB %d removing UE with rnti %x\n",phy_vars_eNB->Mod_id,rnti); //#endif for (i=0;i<NUMBER_OF_UE_MAX;i++) { - if ((phy_vars_eNB->dlsch_eNB[i]==NULL) || (phy_vars_eNB->ulsch_eNB[i]==NULL)) { - LOG_E(PHY,"Can't remove UE, not enough memory allocated\n"); - return(-1); - } - else { - if (phy_vars_eNB->eNB_UE_stats[i].crnti==rnti) { - //msg("[PHY] UE_id %d\n",i); - clean_eNb_dlsch(phy_vars_eNB->dlsch_eNB[i][0], abstraction_flag); - clean_eNb_ulsch(phy_vars_eNB->ulsch_eNB[i],abstraction_flag); - //phy_vars_eNB->eNB_UE_stats[i].crnti = 0; - memset(&phy_vars_eNB->eNB_UE_stats[i],0,sizeof(LTE_eNB_UE_stats)); - return(i); - } + if ((phy_vars_eNB->dlsch_eNB[i]==NULL) || (phy_vars_eNB->ulsch_eNB[i]==NULL)) { + LOG_E(PHY,"Can't remove UE, not enough memory allocated\n"); + return(-1); + } + else { + if (phy_vars_eNB->eNB_UE_stats[i].crnti==rnti) { + //msg("[PHY] UE_id %d\n",i); + clean_eNb_dlsch(phy_vars_eNB->dlsch_eNB[i][0], abstraction_flag); + clean_eNb_ulsch(phy_vars_eNB->ulsch_eNB[i],abstraction_flag); + //phy_vars_eNB->eNB_UE_stats[i].crnti = 0; + memset(&phy_vars_eNB->eNB_UE_stats[i],0,sizeof(LTE_eNB_UE_stats)); + return(i); } + } } return(-1); @@ -195,13 +196,13 @@ s8 find_next_ue_index(PHY_VARS_eNB *phy_vars_eNB) { u8 i; for (i=0;i<NUMBER_OF_UE_MAX;i++) { - if (phy_vars_eNB->eNB_UE_stats[i].crnti==0) { - /*if ((phy_vars_eNB->dlsch_eNB[i]) && + if (phy_vars_eNB->eNB_UE_stats[i].crnti==0) { + /*if ((phy_vars_eNB->dlsch_eNB[i]) && (phy_vars_eNB->dlsch_eNB[i][0]) && (phy_vars_eNB->dlsch_eNB[i][0]->rnti==0))*/ - LOG_D(PHY,"Next free UE id is %d\n",i); - return(i); - } + LOG_D(PHY,"Next free UE id is %d\n",i); + return(i); + } } return(-1); } @@ -217,67 +218,67 @@ int get_ue_active_harq_pid(u8 Mod_id,u16 rnti,u8 subframe,u8 *harq_pid,u8 *round u32 frame = PHY_vars_eNB_g[Mod_id]->frame; if (UE_id==-1) { - LOG_E(PHY,"Cannot find UE with rnti %x\n",rnti); - *round=0; - return(-1); + LOG_E(PHY,"Cannot find UE with rnti %x\n",rnti); + *round=0; + return(-1); } if (ul_flag == 0) {// this is a DL request - DLSCH_ptr = PHY_vars_eNB_g[Mod_id]->dlsch_eNB[(u32)UE_id][0]; - /* + DLSCH_ptr = PHY_vars_eNB_g[Mod_id]->dlsch_eNB[(u32)UE_id][0]; + /* if (subframe<4) subframe_m4 = subframe+6; else subframe_m4 = subframe-4; - */ + */ #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d] get_ue_active_harq_pid: Frame %d subframe %d, current harq_id %d\n", - Mod_id,frame,subframe,DLSCH_ptr->harq_ids[subframe]); -#endif - // switch on TDD or FDD configuration here later - *harq_pid = DLSCH_ptr->harq_ids[subframe]; - if ((*harq_pid<DLSCH_ptr->Mdlharq) && - ((DLSCH_ptr->harq_processes[*harq_pid]->round > 0))) { - - *round = DLSCH_ptr->harq_processes[*harq_pid]->round; - LOG_D(PHY,"round %d\n",*round); - - // else if ((subframe_m4==5) || (subframe_m4==6)) { - // *harq_pid = 0;//DLSCH_ptr->harq_ids[subframe_m4];//Ankit - // *round = DLSCH_ptr->harq_processes[*harq_pid]->round; - // } - } - else { - // get first free harq_pid (i.e. round 0) - for (i=0;i<DLSCH_ptr->Mdlharq;i++) { - if (DLSCH_ptr->harq_processes[i]!=NULL) { - if (DLSCH_ptr->harq_processes[i]->status != ACTIVE) { - *harq_pid = i;//0;//i; //(Ankit) - *round = 0; - return(0); - } - else { - LOG_D(PHY,"process %d is active\n",i); - } - } - else { - LOG_E(PHY,"[eNB %d] DLSCH process %d for rnti %x (UE_id %d) not allocated\n",Mod_id,i,rnti,UE_id); - return(-1); - } - } + LOG_D(PHY,"[eNB %d] get_ue_active_harq_pid: Frame %d subframe %d, current harq_id %d\n", + Mod_id,frame,subframe,DLSCH_ptr->harq_ids[subframe]); +#endif + // switch on TDD or FDD configuration here later + *harq_pid = DLSCH_ptr->harq_ids[subframe]; + if ((*harq_pid<DLSCH_ptr->Mdlharq) && + ((DLSCH_ptr->harq_processes[*harq_pid]->round > 0))) { + + *round = DLSCH_ptr->harq_processes[*harq_pid]->round; + LOG_D(PHY,"round %d\n",*round); + + // else if ((subframe_m4==5) || (subframe_m4==6)) { + // *harq_pid = 0;//DLSCH_ptr->harq_ids[subframe_m4];//Ankit + // *round = DLSCH_ptr->harq_processes[*harq_pid]->round; + // } + } + else { + // get first free harq_pid (i.e. round 0) + for (i=0;i<DLSCH_ptr->Mdlharq;i++) { + if (DLSCH_ptr->harq_processes[i]!=NULL) { + if (DLSCH_ptr->harq_processes[i]->status != ACTIVE) { + *harq_pid = i;//0;//i; //(Ankit) + *round = 0; + return(0); + } + else { + LOG_D(PHY,"process %d is active\n",i); + } + } + else { + LOG_E(PHY,"[eNB %d] DLSCH process %d for rnti %x (UE_id %d) not allocated\n",Mod_id,i,rnti,UE_id); + return(-1); + } } + } } else { // This is a UL request - ULSCH_ptr = PHY_vars_eNB_g[Mod_id]->ulsch_eNB[(u32)UE_id]; - ulsch_subframe = pdcch_alloc2ul_subframe(&PHY_vars_eNB_g[Mod_id]->lte_frame_parms,subframe); - ulsch_frame = pdcch_alloc2ul_frame(&PHY_vars_eNB_g[Mod_id]->lte_frame_parms,frame,subframe); - // Note this is for TDD configuration 3,4,5 only - *harq_pid = subframe2harq_pid(&PHY_vars_eNB_g[Mod_id]->lte_frame_parms, - ulsch_frame, - ulsch_subframe); - *round = ULSCH_ptr->harq_processes[*harq_pid]->round; - LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d Checking HARQ, round %d\n",Mod_id,*harq_pid,frame,subframe,*round); + ULSCH_ptr = PHY_vars_eNB_g[Mod_id]->ulsch_eNB[(u32)UE_id]; + ulsch_subframe = pdcch_alloc2ul_subframe(&PHY_vars_eNB_g[Mod_id]->lte_frame_parms,subframe); + ulsch_frame = pdcch_alloc2ul_frame(&PHY_vars_eNB_g[Mod_id]->lte_frame_parms,frame,subframe); + // Note this is for TDD configuration 3,4,5 only + *harq_pid = subframe2harq_pid(&PHY_vars_eNB_g[Mod_id]->lte_frame_parms, + ulsch_frame, + ulsch_subframe); + *round = ULSCH_ptr->harq_processes[*harq_pid]->round; + LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d Checking HARQ, round %d\n",Mod_id,*harq_pid,frame,subframe,*round); } return(0); } @@ -299,69 +300,69 @@ int get_nCCE_offset(unsigned char L, int nCCE, int common_dci, unsigned short rn for (i=0;i<nCCE;i++) printf("%d.",CCE_table[i]); printf("\n"); - */ + */ if (common_dci == 1) { - // check CCE(0 ... L-1) - nb_candidates = (L==4) ? 4 : 2; - for (m = 0 ; m < nb_candidates ; m++) { - search_space_free = 1; - for (l=0;l<L;l++) { - if (CCE_table[(m*L) + l] == 1) { - search_space_free = 0; - break; - } - } - if (search_space_free == 1) { - for (l=0;l<L;l++) - CCE_table[(m*L)+l]=1; - return(m*L); - } + // check CCE(0 ... L-1) + nb_candidates = (L==4) ? 4 : 2; + for (m = 0 ; m < nb_candidates ; m++) { + search_space_free = 1; + for (l=0;l<L;l++) { + if (CCE_table[(m*L) + l] == 1) { + search_space_free = 0; + break; + } } - return(-1); + if (search_space_free == 1) { + for (l=0;l<L;l++) + CCE_table[(m*L)+l]=1; + return(m*L); + } + } + return(-1); } else { // Find first available in ue specific search space - // according to procedure in Section 9.1.1 of 36.213 (v. 8.6) - // compute Yk - Yk = (unsigned int)rnti; - - for (i=0;i<=subframe;i++) - Yk = (Yk*39827)%65537; - - Yk = Yk % (nCCE/L); - - - switch (L) { - case 1: - case 2: - nb_candidates = 6; - break; - case 4: - case 8: - nb_candidates = 2; - break; - default: - DevParam(L, nCCE, rnti); - break; - } - - // LOG_I(PHY,"rnti %x, Yk = %d, nCCE %d (nCCE/L %d),nb_cand %d\n",rnti,Yk,nCCE,nCCE/L,nb_candidates); - - for (m = 0 ; m < nb_candidates ; m++) { - search_space_free = 1; - for (l=0;l<L;l++) { - if (CCE_table[(((Yk+m)%(nCCE/L))*L) + l] == 1) { - search_space_free = 0; - break; - } - } - if (search_space_free == 1) { - for (l=0;l<L;l++) - CCE_table[(((Yk+m)%(nCCE/L))*L)+l]=1; - return(((Yk+m)%(nCCE/L))*L); - } + // according to procedure in Section 9.1.1 of 36.213 (v. 8.6) + // compute Yk + Yk = (unsigned int)rnti; + + for (i=0;i<=subframe;i++) + Yk = (Yk*39827)%65537; + + Yk = Yk % (nCCE/L); + + + switch (L) { + case 1: + case 2: + nb_candidates = 6; + break; + case 4: + case 8: + nb_candidates = 2; + break; + default: + DevParam(L, nCCE, rnti); + break; + } + + // LOG_I(PHY,"rnti %x, Yk = %d, nCCE %d (nCCE/L %d),nb_cand %d\n",rnti,Yk,nCCE,nCCE/L,nb_candidates); + + for (m = 0 ; m < nb_candidates ; m++) { + search_space_free = 1; + for (l=0;l<L;l++) { + if (CCE_table[(((Yk+m)%(nCCE/L))*L) + l] == 1) { + search_space_free = 0; + break; + } } - return(-1); + if (search_space_free == 1) { + for (l=0;l<L;l++) + CCE_table[(((Yk+m)%(nCCE/L))*L)+l]=1; + return(((Yk+m)%(nCCE/L))*L); + } + } + return(-1); } } @@ -381,13 +382,13 @@ void phy_procedures_emos_eNB_TX(unsigned char next_slot, PHY_VARS_eNB *phy_vars_ msg("[PHY][eNB %d] Frame %d, slot %d: Generating pilots for DL-S\n", phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot); #endif - + for (sect_id=0;sect_id<number_of_cards;sect_id++) { if (abstraction_flag == 0) { for (aa=0; aa<phy_vars_eNB->lte_frame_parms.nb_antennas_tx; aa++) { - - + + #ifdef IFFT_FPGA memset(&phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id][aa][next_slot*(phy_vars_eNB->lte_frame_parms.N_RB_DL*12)*(phy_vars_eNB->lte_frame_parms.symbols_per_tti>>1)], 0,(phy_vars_eNB->lte_frame_parms.N_RB_DL*12)*(phy_vars_eNB->lte_frame_parms.symbols_per_tti>>1)*sizeof(mod_sym_t)); @@ -404,13 +405,13 @@ void phy_procedures_emos_eNB_TX(unsigned char next_slot, PHY_VARS_eNB *phy_vars_ msg("[PHY][eNB] Frame %d, subframe %d Generating PSS\n", phy_vars_eNB->frame,next_slot>>1); - + generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], 4*AMP, &phy_vars_eNB->lte_frame_parms, 2, next_slot); - + } else { #ifdef PHY_ABSTRACTION @@ -420,7 +421,7 @@ void phy_procedures_emos_eNB_TX(unsigned char next_slot, PHY_VARS_eNB *phy_vars_ } } } - */ +*/ void phy_procedures_eNB_S_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 abstraction_flag,relaying_type_t r_type) { @@ -431,30 +432,30 @@ void phy_procedures_eNB_S_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB, #endif if (last_slot%2 == 0) { - for (sect_id=0;sect_id<number_of_cards;sect_id++) { - - if (abstraction_flag == 0) { - lte_eNB_I0_measurements(phy_vars_eNB, - sect_id, - phy_vars_eNB->first_run_I0_measurements); - } + for (sect_id=0;sect_id<number_of_cards;sect_id++) { + + if (abstraction_flag == 0) { + lte_eNB_I0_measurements(phy_vars_eNB, + sect_id, + phy_vars_eNB->first_run_I0_measurements); + } #ifdef PHY_ABSTRACTION - else { - lte_eNB_I0_measurements_emul(phy_vars_eNB, - sect_id); - } -#endif + else { + lte_eNB_I0_measurements_emul(phy_vars_eNB, + sect_id); } - - if (I0_clear == 1) - I0_clear = 0; +#endif + } + + if (I0_clear == 1) + I0_clear = 0; } - + } #ifdef EMOS void phy_procedures_emos_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB) { - + u8 aa; u16 last_subframe_emos; u16 pilot_pos1 = 3 - phy_vars_eNB->lte_frame_parms.Ncp, pilot_pos2 = 10 - 2*phy_vars_eNB->lte_frame_parms.Ncp; @@ -466,44 +467,44 @@ void phy_procedures_emos_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_e last_subframe_emos = (last_slot-4)>>1; else mac_xface->macphy_exit("should never happen"); - */ + */ last_subframe_emos=0; #ifdef EMOS_CHANNEL //if (last_slot%2==1) // this is for all UL subframes if (last_slot==7) for (aa=0; aa<phy_vars_eNB->lte_frame_parms.nb_antennas_rx; aa++) { - memcpy(&emos_dump_eNB.channel[aa][last_subframe_emos*2*phy_vars_eNB->lte_frame_parms.N_RB_UL*12], - &phy_vars_eNB->lte_eNB_pusch_vars[0]->drs_ch_estimates[0][aa][phy_vars_eNB->lte_frame_parms.N_RB_UL*12*pilot_pos1], - phy_vars_eNB->lte_frame_parms.N_RB_UL*12*sizeof(int)); - memcpy(&emos_dump_eNB.channel[aa][(last_subframe_emos*2+1)*phy_vars_eNB->lte_frame_parms.N_RB_UL*12], - &phy_vars_eNB->lte_eNB_pusch_vars[0]->drs_ch_estimates[0][aa][phy_vars_eNB->lte_frame_parms.N_RB_UL*12*pilot_pos2], - phy_vars_eNB->lte_frame_parms.N_RB_UL*12*sizeof(int)); + memcpy(&emos_dump_eNB.channel[aa][last_subframe_emos*2*phy_vars_eNB->lte_frame_parms.N_RB_UL*12], + &phy_vars_eNB->lte_eNB_pusch_vars[0]->drs_ch_estimates[0][aa][phy_vars_eNB->lte_frame_parms.N_RB_UL*12*pilot_pos1], + phy_vars_eNB->lte_frame_parms.N_RB_UL*12*sizeof(int)); + memcpy(&emos_dump_eNB.channel[aa][(last_subframe_emos*2+1)*phy_vars_eNB->lte_frame_parms.N_RB_UL*12], + &phy_vars_eNB->lte_eNB_pusch_vars[0]->drs_ch_estimates[0][aa][phy_vars_eNB->lte_frame_parms.N_RB_UL*12*pilot_pos2], + phy_vars_eNB->lte_frame_parms.N_RB_UL*12*sizeof(int)); } #endif if (last_slot==9) { - emos_dump_eNB.timestamp = rt_get_time_ns(); - emos_dump_eNB.frame_tx = phy_vars_eNB->frame; - emos_dump_eNB.rx_total_gain_dB = phy_vars_eNB->rx_total_gain_eNB_dB; - emos_dump_eNB.mimo_mode = phy_vars_eNB->transmission_mode[0]; - memcpy(&emos_dump_eNB.PHY_measurements_eNB, - &phy_vars_eNB->PHY_measurements_eNB[0], - sizeof(PHY_MEASUREMENTS_eNB)); - memcpy(&emos_dump_eNB.eNB_UE_stats[0],&phy_vars_eNB->eNB_UE_stats[0],NUMBER_OF_UE_MAX*sizeof(LTE_eNB_UE_stats)); - - bytes = rtf_put(CHANSOUNDER_FIFO_MINOR, &emos_dump_eNB, sizeof(fifo_dump_emos_eNB)); - //bytes = rtf_put(CHANSOUNDER_FIFO_MINOR, "test", sizeof("test")); - if (bytes!=sizeof(fifo_dump_emos_eNB)) { - LOG_W(PHY,"[eNB %d] Frame %d, slot %d, Problem writing EMOS data to FIFO (bytes=%d, size=%d)\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->frame, last_slot,bytes,sizeof(fifo_dump_emos_eNB)); - } - else { - if (phy_vars_eNB->frame%100==0) { - LOG_I(PHY,"[eNB %d] Frame %d (%d), slot %d, Writing %d bytes EMOS data to FIFO\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->frame, ((fifo_dump_emos_eNB*)&emos_dump_eNB)->frame_tx, last_slot, bytes); - } + emos_dump_eNB.timestamp = rt_get_time_ns(); + emos_dump_eNB.frame_tx = phy_vars_eNB->frame; + emos_dump_eNB.rx_total_gain_dB = phy_vars_eNB->rx_total_gain_eNB_dB; + emos_dump_eNB.mimo_mode = phy_vars_eNB->transmission_mode[0]; + memcpy(&emos_dump_eNB.PHY_measurements_eNB, + &phy_vars_eNB->PHY_measurements_eNB[0], + sizeof(PHY_MEASUREMENTS_eNB)); + memcpy(&emos_dump_eNB.eNB_UE_stats[0],&phy_vars_eNB->eNB_UE_stats[0],NUMBER_OF_UE_MAX*sizeof(LTE_eNB_UE_stats)); + + bytes = rtf_put(CHANSOUNDER_FIFO_MINOR, &emos_dump_eNB, sizeof(fifo_dump_emos_eNB)); + //bytes = rtf_put(CHANSOUNDER_FIFO_MINOR, "test", sizeof("test")); + if (bytes!=sizeof(fifo_dump_emos_eNB)) { + LOG_W(PHY,"[eNB %d] Frame %d, slot %d, Problem writing EMOS data to FIFO (bytes=%d, size=%d)\n", + phy_vars_eNB->Mod_id,phy_vars_eNB->frame, last_slot,bytes,sizeof(fifo_dump_emos_eNB)); + } + else { + if (phy_vars_eNB->frame%100==0) { + LOG_I(PHY,"[eNB %d] Frame %d (%d), slot %d, Writing %d bytes EMOS data to FIFO\n", + phy_vars_eNB->Mod_id,phy_vars_eNB->frame, ((fifo_dump_emos_eNB*)&emos_dump_eNB)->frame_tx, last_slot, bytes); } + } } } #endif @@ -523,30 +524,30 @@ void fill_dci(DCI_PDU *DCI_pdu, u8 subframe, PHY_VARS_eNB *phy_vars_eNB) { rand = (rand%5)+5; else rand = (rand%4)+5; - */ + */ DCI_pdu->Num_common_dci = 0; DCI_pdu->Num_ue_spec_dci=0; switch (subframe) { - case 5: - DCI_pdu->Num_common_dci = 1; - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; - DCI_pdu->dci_alloc[0].L = 2; - DCI_pdu->dci_alloc[0].rnti = SI_RNTI; - DCI_pdu->dci_alloc[0].format = format1A; - DCI_pdu->dci_alloc[0].ra_flag = 0; + case 5: + DCI_pdu->Num_common_dci = 1; + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; + DCI_pdu->dci_alloc[0].L = 2; + DCI_pdu->dci_alloc[0].rnti = SI_RNTI; + DCI_pdu->dci_alloc[0].format = format1A; + DCI_pdu->dci_alloc[0].ra_flag = 0; - BCCH_alloc_pdu.type = 1; - BCCH_alloc_pdu.vrb_type = 0; - BCCH_alloc_pdu.rballoc = computeRIV(25,10,3); - BCCH_alloc_pdu.ndi = 1; - BCCH_alloc_pdu.rv = 1; - BCCH_alloc_pdu.mcs = 1; - BCCH_alloc_pdu.harq_pid = 0; - BCCH_alloc_pdu.TPC = 1; // set to 3 PRB - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&BCCH_alloc_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t)); - break; + BCCH_alloc_pdu.type = 1; + BCCH_alloc_pdu.vrb_type = 0; + BCCH_alloc_pdu.rballoc = computeRIV(25,10,3); + BCCH_alloc_pdu.ndi = 1; + BCCH_alloc_pdu.rv = 1; + BCCH_alloc_pdu.mcs = 1; + BCCH_alloc_pdu.harq_pid = 0; + BCCH_alloc_pdu.TPC = 1; // set to 3 PRB + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&BCCH_alloc_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t)); + break; case 6: /* DCI_pdu->Num_ue_spec_dci = 1; @@ -566,30 +567,30 @@ void fill_dci(DCI_PDU *DCI_pdu, u8 subframe, PHY_VARS_eNB *phy_vars_eNB) { DLSCH_alloc_pdu1.rv1 = 0; DLSCH_alloc_pdu1.tpmi = 0; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1,sizeof(DCI2_5MHz_2A_M10PRB_TDD_t)); - */ + */ break; case 7: DCI_pdu->Num_ue_spec_dci = 1; - + if (transmission_mode<3) { - //user 1 - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_TDD_t; - DCI_pdu->dci_alloc[0].L = 2; - DCI_pdu->dci_alloc[0].rnti = 0x1235; - DCI_pdu->dci_alloc[0].format = format1; - DCI_pdu->dci_alloc[0].ra_flag = 0; - - DLSCH_alloc_pdu.rballoc = rballoc; - DLSCH_alloc_pdu.TPC = 0; - DLSCH_alloc_pdu.dai = 0; - DLSCH_alloc_pdu.harq_pid = 0; - DLSCH_alloc_pdu.mcs = openair_daq_vars.target_ue_dl_mcs; - //DLSCH_alloc_pdu.mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); - DLSCH_alloc_pdu.ndi = 1; - DLSCH_alloc_pdu.rv = 0; - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t)); - - /* + //user 1 + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_TDD_t; + DCI_pdu->dci_alloc[0].L = 2; + DCI_pdu->dci_alloc[0].rnti = 0x1235; + DCI_pdu->dci_alloc[0].format = format1; + DCI_pdu->dci_alloc[0].ra_flag = 0; + + DLSCH_alloc_pdu.rballoc = rballoc; + DLSCH_alloc_pdu.TPC = 0; + DLSCH_alloc_pdu.dai = 0; + DLSCH_alloc_pdu.harq_pid = 0; + DLSCH_alloc_pdu.mcs = openair_daq_vars.target_ue_dl_mcs; + //DLSCH_alloc_pdu.mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); + DLSCH_alloc_pdu.ndi = 1; + DLSCH_alloc_pdu.rv = 0; + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t)); + + /* //user2 DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_5MHz_TDD_t; DCI_pdu->dci_alloc[1].L = 2; @@ -606,50 +607,50 @@ void fill_dci(DCI_PDU *DCI_pdu, u8 subframe, PHY_VARS_eNB *phy_vars_eNB) { DLSCH_alloc_pdu.ndi = 1; DLSCH_alloc_pdu.rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t)); - */ + */ } else if (transmission_mode==5) { - DCI_pdu->Num_ue_spec_dci = 2; - // user 1 - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; - DCI_pdu->dci_alloc[0].L = 3; - DCI_pdu->dci_alloc[0].rnti = 0x1235; - DCI_pdu->dci_alloc[0].format = format1E_2A_M10PRB; - DCI_pdu->dci_alloc[0].ra_flag = 0; - - DLSCH_alloc_pdu1E.tpmi = 5; //5=use feedback - DLSCH_alloc_pdu1E.rv = 0; - DLSCH_alloc_pdu1E.ndi = 1; - //DLSCH_alloc_pdu1E.mcs = cqi_to_mcs[phy_vars_eNB->eNB_UE_stats->DL_cqi[0]]; - //DLSCH_alloc_pdu1E.mcs = (unsigned char) (taus()%28); - DLSCH_alloc_pdu1E.mcs = openair_daq_vars.target_ue_dl_mcs; - //DLSCH_alloc_pdu1E.mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); - phy_vars_eNB->eNB_UE_stats[0].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs; - DLSCH_alloc_pdu1E.harq_pid = 0; - DLSCH_alloc_pdu1E.dai = 0; - DLSCH_alloc_pdu1E.TPC = 0; - DLSCH_alloc_pdu1E.rballoc = openair_daq_vars.ue_dl_rb_alloc; - DLSCH_alloc_pdu1E.rah = 0; - DLSCH_alloc_pdu1E.dl_power_off = 0; //0=second user present - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); - - //user 2 - DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; - DCI_pdu->dci_alloc[1].L = 0; - DCI_pdu->dci_alloc[1].rnti = 0x1236; - DCI_pdu->dci_alloc[1].format = format1E_2A_M10PRB; - DCI_pdu->dci_alloc[1].ra_flag = 0; - //DLSCH_alloc_pdu1E.mcs = openair_daq_vars.target_ue_dl_mcs; - //DLSCH_alloc_pdu1E.mcs = (unsigned char) (taus()%28); - //DLSCH_alloc_pdu1E.mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); - DLSCH_alloc_pdu1E.mcs = (unsigned char) (((phy_vars_eNB->frame%1024)/3)%28); - phy_vars_eNB->eNB_UE_stats[1].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs; - - memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); - - // set the precoder of the second UE orthogonal to the first - phy_vars_eNB->eNB_UE_stats[1].DL_pmi_single = (phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single ^ 0x1555); - } + DCI_pdu->Num_ue_spec_dci = 2; + // user 1 + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; + DCI_pdu->dci_alloc[0].L = 3; + DCI_pdu->dci_alloc[0].rnti = 0x1235; + DCI_pdu->dci_alloc[0].format = format1E_2A_M10PRB; + DCI_pdu->dci_alloc[0].ra_flag = 0; + + DLSCH_alloc_pdu1E.tpmi = 5; //5=use feedback + DLSCH_alloc_pdu1E.rv = 0; + DLSCH_alloc_pdu1E.ndi = 1; + //DLSCH_alloc_pdu1E.mcs = cqi_to_mcs[phy_vars_eNB->eNB_UE_stats->DL_cqi[0]]; + //DLSCH_alloc_pdu1E.mcs = (unsigned char) (taus()%28); + DLSCH_alloc_pdu1E.mcs = openair_daq_vars.target_ue_dl_mcs; + //DLSCH_alloc_pdu1E.mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); + phy_vars_eNB->eNB_UE_stats[0].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs; + DLSCH_alloc_pdu1E.harq_pid = 0; + DLSCH_alloc_pdu1E.dai = 0; + DLSCH_alloc_pdu1E.TPC = 0; + DLSCH_alloc_pdu1E.rballoc = openair_daq_vars.ue_dl_rb_alloc; + DLSCH_alloc_pdu1E.rah = 0; + DLSCH_alloc_pdu1E.dl_power_off = 0; //0=second user present + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); + + //user 2 + DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; + DCI_pdu->dci_alloc[1].L = 0; + DCI_pdu->dci_alloc[1].rnti = 0x1236; + DCI_pdu->dci_alloc[1].format = format1E_2A_M10PRB; + DCI_pdu->dci_alloc[1].ra_flag = 0; + //DLSCH_alloc_pdu1E.mcs = openair_daq_vars.target_ue_dl_mcs; + //DLSCH_alloc_pdu1E.mcs = (unsigned char) (taus()%28); + //DLSCH_alloc_pdu1E.mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); + DLSCH_alloc_pdu1E.mcs = (unsigned char) (((phy_vars_eNB->frame%1024)/3)%28); + phy_vars_eNB->eNB_UE_stats[1].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs; + + memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); + + // set the precoder of the second UE orthogonal to the first + phy_vars_eNB->eNB_UE_stats[1].DL_pmi_single = (phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single ^ 0x1555); + } break; /* case 8: @@ -671,7 +672,7 @@ void fill_dci(DCI_PDU *DCI_pdu, u8 subframe, PHY_VARS_eNB *phy_vars_eNB) { memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&RA_alloc_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t)); break; - */ + */ case 9: DCI_pdu->Num_ue_spec_dci = 2; @@ -692,7 +693,7 @@ void fill_dci(DCI_PDU *DCI_pdu, u8 subframe, PHY_VARS_eNB *phy_vars_eNB) { UL_alloc_pdu.dai = 0; UL_alloc_pdu.cqi_req = 1; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t)); - + DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ; DCI_pdu->dci_alloc[1].L = 2; DCI_pdu->dci_alloc[1].rnti = 0x1236; @@ -724,7 +725,7 @@ void fill_dci(DCI_PDU *DCI_pdu, u8 subframe, PHY_VARS_eNB *phy_vars_eNB) { DCI_pdu->nCCE = 0; for (i=0;i<DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci;i++) { - DCI_pdu->nCCE += (1<<(DCI_pdu->dci_alloc[i].L)); + DCI_pdu->nCCE += (1<<(DCI_pdu->dci_alloc[i].L)); } } @@ -744,40 +745,40 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, u8 subframe, PHY_VARS_eNB *phy_vars_eNB) { rand = (rand%5)+5; else rand = (rand%4)+5; - */ + */ DCI_pdu->Num_common_dci = 0; DCI_pdu->Num_ue_spec_dci=0; switch (subframe) { - case 5: + case 5: DCI_pdu->Num_ue_spec_dci = 1; - + if (transmission_mode<3) { - //user 1 - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_TDD_t; - DCI_pdu->dci_alloc[0].L = 2; - DCI_pdu->dci_alloc[0].rnti = 0x1235; - DCI_pdu->dci_alloc[0].format = format1; - DCI_pdu->dci_alloc[0].ra_flag = 0; - - DLSCH_alloc_pdu.rballoc = openair_daq_vars.ue_dl_rb_alloc; - DLSCH_alloc_pdu.TPC = 0; - DLSCH_alloc_pdu.dai = 0; - DLSCH_alloc_pdu.harq_pid = 1; - DLSCH_alloc_pdu.mcs = openair_daq_vars.target_ue_dl_mcs; - DLSCH_alloc_pdu.ndi = 1; - DLSCH_alloc_pdu.rv = 0; - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t)); - - /* + //user 1 + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_TDD_t; + DCI_pdu->dci_alloc[0].L = 2; + DCI_pdu->dci_alloc[0].rnti = 0x1235; + DCI_pdu->dci_alloc[0].format = format1; + DCI_pdu->dci_alloc[0].ra_flag = 0; + + DLSCH_alloc_pdu.rballoc = openair_daq_vars.ue_dl_rb_alloc; + DLSCH_alloc_pdu.TPC = 0; + DLSCH_alloc_pdu.dai = 0; + DLSCH_alloc_pdu.harq_pid = 1; + DLSCH_alloc_pdu.mcs = openair_daq_vars.target_ue_dl_mcs; + DLSCH_alloc_pdu.ndi = 1; + DLSCH_alloc_pdu.rv = 0; + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t)); + + /* //user2 DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_5MHz_TDD_t; DCI_pdu->dci_alloc[1].L = 2; DCI_pdu->dci_alloc[1].rnti = 0x1236; DCI_pdu->dci_alloc[1].format = format1; DCI_pdu->dci_alloc[1].ra_flag = 0; - + DLSCH_alloc_pdu.rballoc = rballoc2; DLSCH_alloc_pdu.TPC = 0; DLSCH_alloc_pdu.dai = 0; @@ -786,40 +787,40 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, u8 subframe, PHY_VARS_eNB *phy_vars_eNB) { DLSCH_alloc_pdu.ndi = 1; DLSCH_alloc_pdu.rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t)); - */ + */ } else if (transmission_mode==5) { - DCI_pdu->Num_ue_spec_dci = 2; - // user 1 - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; - DCI_pdu->dci_alloc[0].L = 2; - DCI_pdu->dci_alloc[0].rnti = 0x1235; - DCI_pdu->dci_alloc[0].format = format1E_2A_M10PRB; - DCI_pdu->dci_alloc[0].ra_flag = 0; - - DLSCH_alloc_pdu1E.tpmi = 5; //5=use feedback - DLSCH_alloc_pdu1E.rv = 0; - DLSCH_alloc_pdu1E.ndi = 1; - DLSCH_alloc_pdu1E.mcs = openair_daq_vars.target_ue_dl_mcs; - DLSCH_alloc_pdu1E.harq_pid = 1; - DLSCH_alloc_pdu1E.dai = 0; - DLSCH_alloc_pdu1E.TPC = 0; - DLSCH_alloc_pdu1E.rballoc = openair_daq_vars.ue_dl_rb_alloc; - DLSCH_alloc_pdu1E.rah = 0; - DLSCH_alloc_pdu1E.dl_power_off = 0; //0=second user present - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); - - //user 2 - DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; - DCI_pdu->dci_alloc[1].L = 2; - DCI_pdu->dci_alloc[1].rnti = 0x1236; - DCI_pdu->dci_alloc[1].format = format1E_2A_M10PRB; - DCI_pdu->dci_alloc[1].ra_flag = 0; - - memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); - - // set the precoder of the second UE orthogonal to the first - phy_vars_eNB->eNB_UE_stats[1].DL_pmi_single = (phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single ^ 0x1555); + DCI_pdu->Num_ue_spec_dci = 2; + // user 1 + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; + DCI_pdu->dci_alloc[0].L = 2; + DCI_pdu->dci_alloc[0].rnti = 0x1235; + DCI_pdu->dci_alloc[0].format = format1E_2A_M10PRB; + DCI_pdu->dci_alloc[0].ra_flag = 0; + + DLSCH_alloc_pdu1E.tpmi = 5; //5=use feedback + DLSCH_alloc_pdu1E.rv = 0; + DLSCH_alloc_pdu1E.ndi = 1; + DLSCH_alloc_pdu1E.mcs = openair_daq_vars.target_ue_dl_mcs; + DLSCH_alloc_pdu1E.harq_pid = 1; + DLSCH_alloc_pdu1E.dai = 0; + DLSCH_alloc_pdu1E.TPC = 0; + DLSCH_alloc_pdu1E.rballoc = openair_daq_vars.ue_dl_rb_alloc; + DLSCH_alloc_pdu1E.rah = 0; + DLSCH_alloc_pdu1E.dl_power_off = 0; //0=second user present + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); + + //user 2 + DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; + DCI_pdu->dci_alloc[1].L = 2; + DCI_pdu->dci_alloc[1].rnti = 0x1236; + DCI_pdu->dci_alloc[1].format = format1E_2A_M10PRB; + DCI_pdu->dci_alloc[1].ra_flag = 0; + + memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); + + // set the precoder of the second UE orthogonal to the first + phy_vars_eNB->eNB_UE_stats[1].DL_pmi_single = (phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single ^ 0x1555); } break; @@ -888,16 +889,16 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, u8 subframe, PHY_VARS_eNB *phy_vars_eNB) { UL_alloc_pdu.dai = 0; UL_alloc_pdu.cqi_req = 1; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t)); - */ + */ break; - + default: break; } DCI_pdu->nCCE = 0; for (i=0;i<DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci;i++) { - DCI_pdu->nCCE += (1<<(DCI_pdu->dci_alloc[i].L)); + DCI_pdu->nCCE += (1<<(DCI_pdu->dci_alloc[i].L)); } } @@ -915,102 +916,102 @@ int QPSK2[4]={AMP_OVER_2|(AMP_OVER_2<<16),AMP_OVER_2|((65536-AMP_OVER_2)<<16),(( extern PHY_MEASUREMENTS PHY_measurements; void phy_eNB_lte_measurement_thresholds_test_and_report(instance_t instanceP, ral_threshold_phy_t* threshold_phy_pP, uint16_t valP) { - MessageDef *message_p = NULL; - if ( - ( - ((threshold_phy_pP->threshold.threshold_val < valP) && (threshold_phy_pP->threshold.threshold_xdir == RAL_ABOVE_THRESHOLD)) || - ((threshold_phy_pP->threshold.threshold_val > valP) && (threshold_phy_pP->threshold.threshold_xdir == RAL_BELOW_THRESHOLD)) - ) || - (threshold_phy_pP->threshold.threshold_xdir == RAL_NO_THRESHOLD) - ){ - message_p = itti_alloc_new_message(TASK_PHY_ENB , PHY_MEAS_REPORT_IND); - memset(&PHY_MEAS_REPORT_IND(message_p), 0, sizeof(PHY_MEAS_REPORT_IND(message_p))); - - memcpy(&PHY_MEAS_REPORT_IND (message_p).threshold, - &threshold_phy_pP->threshold, - sizeof(PHY_MEAS_REPORT_IND (message_p).threshold)); - - memcpy(&PHY_MEAS_REPORT_IND (message_p).link_param, - &threshold_phy_pP->link_param, - sizeof(PHY_MEAS_REPORT_IND (message_p).link_param));\ - - switch (threshold_phy_pP->link_param.choice) { - case RAL_LINK_PARAM_CHOICE_LINK_PARAM_VAL: - PHY_MEAS_REPORT_IND (message_p).link_param._union.link_param_val = valP; - break; - case RAL_LINK_PARAM_CHOICE_QOS_PARAM_VAL: - //PHY_MEAS_REPORT_IND (message_p).link_param._union.qos_param_val. - AssertFatal (1 == 0, "TO DO RAL_LINK_PARAM_CHOICE_QOS_PARAM_VAL\n"); - break; - } - itti_send_msg_to_task(TASK_RRC_ENB, instanceP, message_p); - } + MessageDef *message_p = NULL; + if ( + ( + ((threshold_phy_pP->threshold.threshold_val < valP) && (threshold_phy_pP->threshold.threshold_xdir == RAL_ABOVE_THRESHOLD)) || + ((threshold_phy_pP->threshold.threshold_val > valP) && (threshold_phy_pP->threshold.threshold_xdir == RAL_BELOW_THRESHOLD)) + ) || + (threshold_phy_pP->threshold.threshold_xdir == RAL_NO_THRESHOLD) + ){ + message_p = itti_alloc_new_message(TASK_PHY_ENB , PHY_MEAS_REPORT_IND); + memset(&PHY_MEAS_REPORT_IND(message_p), 0, sizeof(PHY_MEAS_REPORT_IND(message_p))); + + memcpy(&PHY_MEAS_REPORT_IND (message_p).threshold, + &threshold_phy_pP->threshold, + sizeof(PHY_MEAS_REPORT_IND (message_p).threshold)); + + memcpy(&PHY_MEAS_REPORT_IND (message_p).link_param, + &threshold_phy_pP->link_param, + sizeof(PHY_MEAS_REPORT_IND (message_p).link_param));\ + + switch (threshold_phy_pP->link_param.choice) { + case RAL_LINK_PARAM_CHOICE_LINK_PARAM_VAL: + PHY_MEAS_REPORT_IND (message_p).link_param._union.link_param_val = valP; + break; + case RAL_LINK_PARAM_CHOICE_QOS_PARAM_VAL: + //PHY_MEAS_REPORT_IND (message_p).link_param._union.qos_param_val. + AssertFatal (1 == 0, "TO DO RAL_LINK_PARAM_CHOICE_QOS_PARAM_VAL\n"); + break; + } + itti_send_msg_to_task(TASK_RRC_ENB, instanceP, message_p); + } } void phy_eNB_lte_check_measurement_thresholds(instance_t instanceP, ral_threshold_phy_t* threshold_phy_pP) { - unsigned int mod_id; - - mod_id = instanceP; + unsigned int mod_id; + + mod_id = instanceP; + + switch (threshold_phy_pP->link_param.link_param_type.choice) { + + case RAL_LINK_PARAM_TYPE_CHOICE_GEN: + switch (threshold_phy_pP->link_param.link_param_type._union.link_param_gen) { + case RAL_LINK_PARAM_GEN_DATA_RATE: + phy_eNB_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0); + break; + case RAL_LINK_PARAM_GEN_SIGNAL_STRENGTH: + phy_eNB_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0); + break; + case RAL_LINK_PARAM_GEN_SINR: + phy_eNB_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0); + break; + case RAL_LINK_PARAM_GEN_THROUGHPUT: + break; + case RAL_LINK_PARAM_GEN_PACKET_ERROR_RATE: + break; + default:; + } + break; - switch (threshold_phy_pP->link_param.link_param_type.choice) { + case RAL_LINK_PARAM_TYPE_CHOICE_LTE: + switch (threshold_phy_pP->link_param.link_param_type._union.link_param_gen) { + case RAL_LINK_PARAM_LTE_UE_RSRP: + break; + case RAL_LINK_PARAM_LTE_UE_RSRQ: + break; + case RAL_LINK_PARAM_LTE_UE_CQI: + break; + case RAL_LINK_PARAM_LTE_AVAILABLE_BW: + break; + case RAL_LINK_PARAM_LTE_PACKET_DELAY: + break; + case RAL_LINK_PARAM_LTE_PACKET_LOSS_RATE: + break; + case RAL_LINK_PARAM_LTE_L2_BUFFER_STATUS: + break; + case RAL_LINK_PARAM_LTE_MOBILE_NODE_CAPABILITIES: + break; + case RAL_LINK_PARAM_LTE_EMBMS_CAPABILITY: + break; + case RAL_LINK_PARAM_LTE_JUMBO_FEASIBILITY: + break; + case RAL_LINK_PARAM_LTE_JUMBO_SETUP_STATUS: + break; + case RAL_LINK_PARAM_LTE_NUM_ACTIVE_EMBMS_RECEIVERS_PER_FLOW: + break; + default:; + } + break; - case RAL_LINK_PARAM_TYPE_CHOICE_GEN: - switch (threshold_phy_pP->link_param.link_param_type._union.link_param_gen) { - case RAL_LINK_PARAM_GEN_DATA_RATE: - phy_eNB_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0); - break; - case RAL_LINK_PARAM_GEN_SIGNAL_STRENGTH: - phy_eNB_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0); - break; - case RAL_LINK_PARAM_GEN_SINR: - phy_eNB_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0); - break; - case RAL_LINK_PARAM_GEN_THROUGHPUT: - break; - case RAL_LINK_PARAM_GEN_PACKET_ERROR_RATE: - break; - default:; + default:; } - break; - - case RAL_LINK_PARAM_TYPE_CHOICE_LTE: - switch (threshold_phy_pP->link_param.link_param_type._union.link_param_gen) { - case RAL_LINK_PARAM_LTE_UE_RSRP: - break; - case RAL_LINK_PARAM_LTE_UE_RSRQ: - break; - case RAL_LINK_PARAM_LTE_UE_CQI: - break; - case RAL_LINK_PARAM_LTE_AVAILABLE_BW: - break; - case RAL_LINK_PARAM_LTE_PACKET_DELAY: - break; - case RAL_LINK_PARAM_LTE_PACKET_LOSS_RATE: - break; - case RAL_LINK_PARAM_LTE_L2_BUFFER_STATUS: - break; - case RAL_LINK_PARAM_LTE_MOBILE_NODE_CAPABILITIES: - break; - case RAL_LINK_PARAM_LTE_EMBMS_CAPABILITY: - break; - case RAL_LINK_PARAM_LTE_JUMBO_FEASIBILITY: - break; - case RAL_LINK_PARAM_LTE_JUMBO_SETUP_STATUS: - break; - case RAL_LINK_PARAM_LTE_NUM_ACTIVE_EMBMS_RECEIVERS_PER_FLOW: - break; - default:; - } - break; - - default:; - } } # endif #endif void phy_procedures_eNB_TX(unsigned char next_slot,PHY_VARS_eNB *phy_vars_eNB,u8 abstraction_flag, - relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn) { + relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn) { u8 *pbch_pdu=&phy_vars_eNB->pbch_pdu[0]; // unsigned int nb_dci_ue_spec = 0, nb_dci_common = 0; u16 input_buffer_length, re_allocated=0; @@ -1040,1080 +1041,1098 @@ void phy_procedures_eNB_TX(unsigned char next_slot,PHY_VARS_eNB *phy_vars_eNB,u8 // there is at least one allocation for PDCCH u8 smbv_alloc_cnt = 1; #endif + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX,1); + start_meas(&phy_vars_eNB->phy_proc_tx); #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[%s %d] Frame %d subframe %d : Doing phy_procedures_eNB_TX(%d)\n", - (r_type == multicast_relay) ? "RN/eNB" : "eNB", - phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot>>1, next_slot); + (r_type == multicast_relay) ? "RN/eNB" : "eNB", + phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot>>1, next_slot); #endif #ifdef OPENAIR2 // Get scheduling info for next subframe during odd slot of previous subframe (next_slot is even) if (next_slot%2 == 0) mac_xface->eNB_dlsch_ulsch_scheduler(phy_vars_eNB->Mod_id,0,phy_vars_eNB->frame,next_slot>>1);//,1); #endif + for (sect_id = 0 ; sect_id < number_of_cards; sect_id++) { - if (abstraction_flag==0) { - if (next_slot%2 == 0) { - for (aa=0; aa<phy_vars_eNB->lte_frame_parms.nb_antennas_tx_eNB;aa++) { + if (abstraction_flag==0) { + if (next_slot%2 == 0) { + for (aa=0; aa<phy_vars_eNB->lte_frame_parms.nb_antennas_tx_eNB;aa++) { + #ifdef IFFT_FPGA - memset(&phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id][aa][next_slot*(phy_vars_eNB->lte_frame_parms.N_RB_DL*12)*(phy_vars_eNB->lte_frame_parms.symbols_per_tti>>1)], - 0,(phy_vars_eNB->lte_frame_parms.N_RB_DL*12)*(phy_vars_eNB->lte_frame_parms.symbols_per_tti)*sizeof(mod_sym_t)); + memset(&phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id][aa][next_slot*(phy_vars_eNB->lte_frame_parms.N_RB_DL*12)*(phy_vars_eNB->lte_frame_parms.symbols_per_tti>>1)], + 0,(phy_vars_eNB->lte_frame_parms.N_RB_DL*12)*(phy_vars_eNB->lte_frame_parms.symbols_per_tti)*sizeof(mod_sym_t)); #else - memset(&phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id][aa][next_slot*phy_vars_eNB->lte_frame_parms.ofdm_symbol_size*(phy_vars_eNB->lte_frame_parms.symbols_per_tti>>1)], - 0,phy_vars_eNB->lte_frame_parms.ofdm_symbol_size*(phy_vars_eNB->lte_frame_parms.symbols_per_tti)*sizeof(mod_sym_t)); + memset(&phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id][aa][next_slot*phy_vars_eNB->lte_frame_parms.ofdm_symbol_size*(phy_vars_eNB->lte_frame_parms.symbols_per_tti>>1)], + 0,phy_vars_eNB->lte_frame_parms.ofdm_symbol_size*(phy_vars_eNB->lte_frame_parms.symbols_per_tti)*sizeof(mod_sym_t)); + #endif - } - } + } + } + } + if (is_pmch_subframe(phy_vars_eNB->frame,next_slot>>1,&phy_vars_eNB->lte_frame_parms)) { + + if (abstraction_flag==0){ + if ((next_slot%2) == 0) { + // This is DL-Cell spec pilots in Control region + generate_pilots_slot(phy_vars_eNB, + phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], + AMP, + next_slot,1); + } } - if (is_pmch_subframe(phy_vars_eNB->frame,next_slot>>1,&phy_vars_eNB->lte_frame_parms)) { - - if (abstraction_flag==0){ - if ((next_slot%2) == 0) { - // This is DL-Cell spec pilots in Control region - generate_pilots_slot(phy_vars_eNB, - phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], - AMP, - next_slot,1); - } - } #ifdef Rel10 - // if mcch is active, send regardless of the node type: eNB or RN - // when mcch is active, MAC sched does not allow MCCH and MTCH multiplexing - mch_pduP = mac_xface->get_mch_sdu(phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1); - switch (r_type){ - case no_relay: - if ((mch_pduP->Pdu_size > 0) && (mch_pduP->sync_area == 0)) // TEST: only transmit mcch for sync area 0 - //if ((mch_pduP->sync_area == 0)) // TEST: only transmit mcch for sync area 0 - LOG_I(PHY,"[eNB%d] Frame %d subframe %d : Got MCH pdu for MBSFN (MCS %d, TBS %d) \n", - phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,mch_pduP->mcs, - phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->TBS>>3); - else { - LOG_D(PHY,"[DeNB %d] Frame %d subframe %d : Do not transmit MCH pdu for MBSFN sync area %d (%s)\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,mch_pduP->sync_area, - (mch_pduP->Pdu_size == 0)? "Empty MCH PDU":"Let RN transmit for the moment"); - mch_pduP = NULL; - } - break; - case multicast_relay: - if ((mch_pduP->Pdu_size > 0) && ((mch_pduP->mcch_active == 1) || mch_pduP->msi_active==1)){ - //if (((mch_pduP->mcch_active == 1) || mch_pduP->msi_active==1)){ - LOG_I(PHY,"[RN %d] Frame %d subframe %d: Got the MCH PDU for MBSFN sync area %d (MCS %d, TBS %d)\n", - phy_vars_rn->Mod_id,phy_vars_rn->frame, next_slot>>1, - mch_pduP->sync_area,mch_pduP->mcs,mch_pduP->Pdu_size); - } else if (phy_vars_rn->mch_avtive[(next_slot>>1)%5] == 1){ // SF2 -> SF7, SF3 -> SF8 - mch_pduP= &mch_pdu; - memcpy(&mch_pduP->payload, // could be a simple copy - phy_vars_rn->dlsch_rn_MCH[(next_slot>>1)%5]->harq_processes[0]->b, - phy_vars_rn->dlsch_rn_MCH[(next_slot>>1)%5]->harq_processes[0]->TBS>>3); - mch_pduP->Pdu_size = (uint16_t) (phy_vars_rn->dlsch_rn_MCH[(next_slot>>1)%5]->harq_processes[0]->TBS>>3); - mch_pduP->mcs = phy_vars_rn->dlsch_rn_MCH[(next_slot>>1)%5]->harq_processes[0]->mcs; - LOG_I(PHY,"[RN %d] Frame %d subframe %d: Forward the MCH PDU for MBSFN received on SF %d sync area %d (MCS %d, TBS %d)\n", - phy_vars_rn->Mod_id,phy_vars_rn->frame, next_slot>>1,(next_slot>>1)%5, - phy_vars_rn->sync_area[(next_slot>>1)%5],mch_pduP->mcs,mch_pduP->Pdu_size); - } else { - /* LOG_I(PHY,"[RN %d] Frame %d subframe %d: do not forward MCH pdu for MBSFN sync area %d (MCS %d, TBS %d)\n", + // if mcch is active, send regardless of the node type: eNB or RN + // when mcch is active, MAC sched does not allow MCCH and MTCH multiplexing + mch_pduP = mac_xface->get_mch_sdu(phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1); + switch (r_type){ + case no_relay: + if ((mch_pduP->Pdu_size > 0) && (mch_pduP->sync_area == 0)) // TEST: only transmit mcch for sync area 0 + //if ((mch_pduP->sync_area == 0)) // TEST: only transmit mcch for sync area 0 + LOG_I(PHY,"[eNB%d] Frame %d subframe %d : Got MCH pdu for MBSFN (MCS %d, TBS %d) \n", + phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,mch_pduP->mcs, + phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->TBS>>3); + else { + LOG_D(PHY,"[DeNB %d] Frame %d subframe %d : Do not transmit MCH pdu for MBSFN sync area %d (%s)\n", + phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,mch_pduP->sync_area, + (mch_pduP->Pdu_size == 0)? "Empty MCH PDU":"Let RN transmit for the moment"); + mch_pduP = NULL; + } + break; + case multicast_relay: + if ((mch_pduP->Pdu_size > 0) && ((mch_pduP->mcch_active == 1) || mch_pduP->msi_active==1)){ + //if (((mch_pduP->mcch_active == 1) || mch_pduP->msi_active==1)){ + LOG_I(PHY,"[RN %d] Frame %d subframe %d: Got the MCH PDU for MBSFN sync area %d (MCS %d, TBS %d)\n", + phy_vars_rn->Mod_id,phy_vars_rn->frame, next_slot>>1, + mch_pduP->sync_area,mch_pduP->mcs,mch_pduP->Pdu_size); + } else if (phy_vars_rn->mch_avtive[(next_slot>>1)%5] == 1){ // SF2 -> SF7, SF3 -> SF8 + mch_pduP= &mch_pdu; + memcpy(&mch_pduP->payload, // could be a simple copy + phy_vars_rn->dlsch_rn_MCH[(next_slot>>1)%5]->harq_processes[0]->b, + phy_vars_rn->dlsch_rn_MCH[(next_slot>>1)%5]->harq_processes[0]->TBS>>3); + mch_pduP->Pdu_size = (uint16_t) (phy_vars_rn->dlsch_rn_MCH[(next_slot>>1)%5]->harq_processes[0]->TBS>>3); + mch_pduP->mcs = phy_vars_rn->dlsch_rn_MCH[(next_slot>>1)%5]->harq_processes[0]->mcs; + LOG_I(PHY,"[RN %d] Frame %d subframe %d: Forward the MCH PDU for MBSFN received on SF %d sync area %d (MCS %d, TBS %d)\n", + phy_vars_rn->Mod_id,phy_vars_rn->frame, next_slot>>1,(next_slot>>1)%5, + phy_vars_rn->sync_area[(next_slot>>1)%5],mch_pduP->mcs,mch_pduP->Pdu_size); + } else { + /* LOG_I(PHY,"[RN %d] Frame %d subframe %d: do not forward MCH pdu for MBSFN sync area %d (MCS %d, TBS %d)\n", phy_vars_rn->Mod_id,phy_vars_rn->frame, next_slot>>1, mch_pduP->sync_area,mch_pduP->mcs,mch_pduP->Pdu_size);*/ - mch_pduP=NULL; - } - phy_vars_rn->mch_avtive[next_slot>>1]=0; - break; - default: - LOG_W(PHY,"[eNB %d] Frame %d subframe %d: unknown relaying type %d \n", - phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,r_type); - mch_pduP=NULL; - break; - }// switch - - if (mch_pduP){ - fill_eNB_dlsch_MCH(phy_vars_eNB,mch_pduP->mcs,1,0, abstraction_flag); - // Generate PMCH - generate_mch(phy_vars_eNB,next_slot>>1,(uint8_t*)mch_pduP->payload,abstraction_flag); + mch_pduP=NULL; + } + phy_vars_rn->mch_avtive[next_slot>>1]=0; + break; + default: + LOG_W(PHY,"[eNB %d] Frame %d subframe %d: unknown relaying type %d \n", + phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,r_type); + mch_pduP=NULL; + break; + }// switch + + if (mch_pduP){ + fill_eNB_dlsch_MCH(phy_vars_eNB,mch_pduP->mcs,1,0, abstraction_flag); + // Generate PMCH + generate_mch(phy_vars_eNB,next_slot>>1,(uint8_t*)mch_pduP->payload,abstraction_flag); #ifdef DEBUG_PHY - for (i=0;i<mch_pduP->Pdu_size;i++) - msg("%2x.",(uint8_t)mch_pduP->payload[i]); - msg("\n"); + for (i=0;i<mch_pduP->Pdu_size;i++) + msg("%2x.",(uint8_t)mch_pduP->payload[i]); + msg("\n"); #endif - } else { - LOG_D(PHY,"[eNB/RN] Frame %d subframe %d: MCH not generated \n",phy_vars_eNB->frame,next_slot>>1); - } + } else { + LOG_D(PHY,"[eNB/RN] Frame %d subframe %d: MCH not generated \n",phy_vars_eNB->frame,next_slot>>1); + } #endif - } - - else { - vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,1); - - if (abstraction_flag==0){ - generate_pilots_slot(phy_vars_eNB, - phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], - AMP, - next_slot,0); - generate_pilots_slot(phy_vars_eNB, - phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], - AMP, - next_slot+1,0); - - vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,0); - - if (next_slot == 0) { - - // First half of PSS/SSS (FDD) - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { - generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], - AMP, - &phy_vars_eNB->lte_frame_parms, - (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5, - 0); - generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], - AMP, - &phy_vars_eNB->lte_frame_parms, - (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 5 : 4, - 0); - } - } - } + } + + else { + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,1); + + if (abstraction_flag==0){ + generate_pilots_slot(phy_vars_eNB, + phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], + AMP, + next_slot,0); + generate_pilots_slot(phy_vars_eNB, + phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], + AMP, + next_slot+1,0); + + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,0); + + if (next_slot == 0) { + + // First half of PSS/SSS (FDD) + if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { + generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], + AMP, + &phy_vars_eNB->lte_frame_parms, + (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5, + 0); + generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], + AMP, + &phy_vars_eNB->lte_frame_parms, + (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 5 : 4, + 0); + } + } + } } if (next_slot == 0) { - - if ((phy_vars_eNB->frame&3) == 0) { - ((u8*) pbch_pdu)[2] = 0; - switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) { - case 6: - ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0x1f) | (0<<5); - break; - case 15: - ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0x1f) | (1<<5); - break; - case 25: - ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0x1f) | (2<<5); - break; - case 50: - ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0x1f) | (3<<5); - break; - case 75: - ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0x1f) | (4<<5); - break; - case 100: - ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0x1f) | (5<<5); - break; - default: - ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0x1f) | (2<<5); - break; - } - ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0xef) | - ((phy_vars_eNB->lte_frame_parms.phich_config_common.phich_duration << 4)&0x10); - - switch (phy_vars_eNB->lte_frame_parms.phich_config_common.phich_resource) { - case oneSixth: - ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0xf3) | (0<<2); - break; - case half: - ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0xf3) | (1<<2); - break; - case one: - ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0xf3) | (2<<2); - break; - case two: - ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0xf3) | (3<<2); - break; - default: - break; - } - - ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0xfc) | ((phy_vars_eNB->frame>>8)&0x3); - ((u8*) pbch_pdu)[1] = phy_vars_eNB->frame&0xfc; - ((u8*) pbch_pdu)[0] = 0; - } - /// First half of SSS (TDD) - if (abstraction_flag==0) { - - if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) { - generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], - AMP, - &phy_vars_eNB->lte_frame_parms, - (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5, - 1); - } - } - - - - frame_tx = (((int) (pbch_pdu[2]&0x3))<<8) + ((int) (pbch_pdu[1]&0xfc)) + phy_vars_eNB->frame%4; - + + if ((phy_vars_eNB->frame&3) == 0) { + ((u8*) pbch_pdu)[2] = 0; + switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) { + case 6: + ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0x1f) | (0<<5); + break; + case 15: + ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0x1f) | (1<<5); + break; + case 25: + ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0x1f) | (2<<5); + break; + case 50: + ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0x1f) | (3<<5); + break; + case 75: + ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0x1f) | (4<<5); + break; + case 100: + ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0x1f) | (5<<5); + break; + default: + ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0x1f) | (2<<5); + break; + } + ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0xef) | + ((phy_vars_eNB->lte_frame_parms.phich_config_common.phich_duration << 4)&0x10); + + switch (phy_vars_eNB->lte_frame_parms.phich_config_common.phich_resource) { + case oneSixth: + ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0xf3) | (0<<2); + break; + case half: + ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0xf3) | (1<<2); + break; + case one: + ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0xf3) | (2<<2); + break; + case two: + ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0xf3) | (3<<2); + break; + default: + break; + } + + ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0xfc) | ((phy_vars_eNB->frame>>8)&0x3); + ((u8*) pbch_pdu)[1] = phy_vars_eNB->frame&0xfc; + ((u8*) pbch_pdu)[0] = 0; + } + /// First half of SSS (TDD) + if (abstraction_flag==0) { + + if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) { + generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], + AMP, + &phy_vars_eNB->lte_frame_parms, + (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5, + 1); + } + } + + + + frame_tx = (((int) (pbch_pdu[2]&0x3))<<8) + ((int) (pbch_pdu[1]&0xfc)) + phy_vars_eNB->frame%4; + #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d] Frame %d, slot %d: Calling generate_pbch, mode1_flag=%d, frame_tx=%d, pdu=%02x%02x%02x\n", - phy_vars_eNB->Mod_id, - phy_vars_eNB->frame, - next_slot, - phy_vars_eNB->lte_frame_parms.mode1_flag, - frame_tx, - ((u8*) pbch_pdu)[2], - ((u8*) pbch_pdu)[1], - ((u8*) pbch_pdu)[0]); -#endif - - if (abstraction_flag==0) { - - generate_pbch(&phy_vars_eNB->lte_eNB_pbch, - phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], - AMP, - &phy_vars_eNB->lte_frame_parms, - pbch_pdu, - phy_vars_eNB->frame&3); - - } + LOG_D(PHY,"[eNB %d] Frame %d, slot %d: Calling generate_pbch, mode1_flag=%d, frame_tx=%d, pdu=%02x%02x%02x\n", + phy_vars_eNB->Mod_id, + phy_vars_eNB->frame, + next_slot, + phy_vars_eNB->lte_frame_parms.mode1_flag, + frame_tx, + ((u8*) pbch_pdu)[2], + ((u8*) pbch_pdu)[1], + ((u8*) pbch_pdu)[0]); +#endif + + if (abstraction_flag==0) { + + generate_pbch(&phy_vars_eNB->lte_eNB_pbch, + phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], + AMP, + &phy_vars_eNB->lte_frame_parms, + pbch_pdu, + phy_vars_eNB->frame&3); + + } #ifdef PHY_ABSTRACTION - else { - generate_pbch_emul(phy_vars_eNB,pbch_pdu); - } + else { + generate_pbch_emul(phy_vars_eNB,pbch_pdu); + } #endif } - - + + if (next_slot == 2) { - - if (abstraction_flag==0) { - - if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) { - // printf("Generating PSS (frame %d, subframe %d)\n",phy_vars_eNB->frame,next_slot>>1); - generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], - AMP, - &phy_vars_eNB->lte_frame_parms, - 2, - 2); - } + + if (abstraction_flag==0) { + + if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) { + // printf("Generating PSS (frame %d, subframe %d)\n",phy_vars_eNB->frame,next_slot>>1); + generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], + AMP, + &phy_vars_eNB->lte_frame_parms, + 2, + 2); } + } } - + // Second half of PSS/SSS (FDD) if (next_slot == 10) { - - if (abstraction_flag==0) { - - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { - generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], - AMP, - &phy_vars_eNB->lte_frame_parms, - (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5, - 10); - generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], - AMP, - &phy_vars_eNB->lte_frame_parms, - (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 5 : 4, - 10); - - } - } + + if (abstraction_flag==0) { + + if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { + generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], + AMP, + &phy_vars_eNB->lte_frame_parms, + (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5, + 10); + generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], + AMP, + &phy_vars_eNB->lte_frame_parms, + (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 5 : 4, + 10); + + } + } } // Second-half of SSS (TDD) if (next_slot == 10) { - if (abstraction_flag==0) { - - if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) { - generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], - AMP, - &phy_vars_eNB->lte_frame_parms, - (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5, - 11); - } - } + if (abstraction_flag==0) { + + if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) { + generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], + AMP, + &phy_vars_eNB->lte_frame_parms, + (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5, + 11); + } + } } // Second half of PSS (TDD) if (next_slot == 12) { - - if (abstraction_flag==0) { - - if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) { - // printf("Generating PSS (frame %d, subframe %d)\n",phy_vars_eNB->frame,next_slot>>1); - generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], - AMP, - &phy_vars_eNB->lte_frame_parms, - 2, - 12); - } - } + + if (abstraction_flag==0) { + + if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) { + // printf("Generating PSS (frame %d, subframe %d)\n",phy_vars_eNB->frame,next_slot>>1); + generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], + AMP, + &phy_vars_eNB->lte_frame_parms, + 2, + 12); + } + } } - - - - //return; - - - sect_id=0; - - if ((next_slot % 2)==0) { - //#ifdef DEBUG_PHY_PROC - // msg("[PHY][eNB %d] UE %d: Mode %s\n",phy_vars_eNB->Mod_id,0,mode_string[phy_vars_eNB->eNB_UE_stats[0].mode]); - //#endif + + + + //return; + + + sect_id=0; + + if ((next_slot % 2)==0) { + //#ifdef DEBUG_PHY_PROC + // msg("[PHY][eNB %d] UE %d: Mode %s\n",phy_vars_eNB->Mod_id,0,mode_string[phy_vars_eNB->eNB_UE_stats[0].mode]); + //#endif #if defined(SMBV) && !defined(EXMIMO) - // PBCH takes one allocation - if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) { - if (next_slot==0) + // PBCH takes one allocation + if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) { + if (next_slot==0) smbv_alloc_cnt++; - } + } #endif - + #ifdef OPENAIR2 - // if there are two users and we want to do cooperation - // if ((phy_vars_eNB->eNB_UE_stats[0].mode == PUSCH) && (phy_vars_eNB->eNB_UE_stats[1].mode == PUSCH)) - // mac_xface->eNB_dlsch_ulsch_scheduler(phy_vars_eNB->Mod_id,phy_vars_eNB->cooperation_flag,phy_vars_eNB->frame,next_slot>>1);//,1); - // else - - - // Parse DCI received from MAC - vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,1); - DCI_pdu = mac_xface->get_dci_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->frame, - next_slot>>1); + // if there are two users and we want to do cooperation + // if ((phy_vars_eNB->eNB_UE_stats[0].mode == PUSCH) && (phy_vars_eNB->eNB_UE_stats[1].mode == PUSCH)) + // mac_xface->eNB_dlsch_ulsch_scheduler(phy_vars_eNB->Mod_id,phy_vars_eNB->cooperation_flag,phy_vars_eNB->frame,next_slot>>1);//,1); + // else + + + // Parse DCI received from MAC + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,1); + DCI_pdu = mac_xface->get_dci_sdu(phy_vars_eNB->Mod_id, + phy_vars_eNB->frame, + next_slot>>1); #else - DCI_pdu = &DCI_pdu_tmp; + DCI_pdu = &DCI_pdu_tmp; #ifdef EMOS - if (((phy_vars_eNB->frame%1024)%3 == 0) && (next_slot == 0)) { - //openair_daq_vars.target_ue_dl_mcs = (openair_daq_vars.target_ue_dl_mcs+1)%28; - openair_daq_vars.target_ue_dl_mcs = taus()%28; - LOG_D(PHY,"[MYEMOS] frame %d, increasing MCS to %d\n",phy_vars_eNB->frame,openair_daq_vars.target_ue_dl_mcs); - } - /* - if (phy_vars_eNB->frame > 28000) { + if (((phy_vars_eNB->frame%1024)%3 == 0) && (next_slot == 0)) { + //openair_daq_vars.target_ue_dl_mcs = (openair_daq_vars.target_ue_dl_mcs+1)%28; + openair_daq_vars.target_ue_dl_mcs = taus()%28; + LOG_D(PHY,"[MYEMOS] frame %d, increasing MCS to %d\n",phy_vars_eNB->frame,openair_daq_vars.target_ue_dl_mcs); + } + /* + if (phy_vars_eNB->frame > 28000) { LOG_E(PHY,"More that 28000 frames reached! Exiting!\n"); mac_xface->macphy_exit(""); } - */ + */ #endif #ifdef EMOS_CHANNEL - fill_dci_emos(DCI_pdu,next_slot>>1,phy_vars_eNB); + fill_dci_emos(DCI_pdu,next_slot>>1,phy_vars_eNB); #else - fill_dci(DCI_pdu,next_slot>>1,phy_vars_eNB); + fill_dci(DCI_pdu,next_slot>>1,phy_vars_eNB); #endif #endif - // clear existing ulsch dci allocations before applying info from MAC (this is table - ul_subframe = pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,next_slot>>1); - ul_frame = pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->frame,next_slot>>1); - - if ((subframe_select(&phy_vars_eNB->lte_frame_parms,ul_subframe)==SF_UL) || - (phy_vars_eNB->lte_frame_parms.frame_type == 0)) { - harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms,ul_frame,ul_subframe); - for (i=0;i<NUMBER_OF_UE_MAX;i++) - if (phy_vars_eNB->ulsch_eNB[i]) { - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->dci_alloc=0; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rar_alloc=0; - } - } + // clear existing ulsch dci allocations before applying info from MAC (this is table + ul_subframe = pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,next_slot>>1); + ul_frame = pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->frame,next_slot>>1); + if ((subframe_select(&phy_vars_eNB->lte_frame_parms,ul_subframe)==SF_UL) || + (phy_vars_eNB->lte_frame_parms.frame_type == 0)) { + harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms,ul_frame,ul_subframe); + for (i=0;i<NUMBER_OF_UE_MAX;i++) + if (phy_vars_eNB->ulsch_eNB[i]) { + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->dci_alloc=0; + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rar_alloc=0; + } + } + #ifdef EMOS - //emos_dump_eNB.dci_cnt[next_slot>>1] = DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci; //nb_dci_common+nb_dci_ue_spec; + //emos_dump_eNB.dci_cnt[next_slot>>1] = DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci; //nb_dci_common+nb_dci_ue_spec; #endif - // clear previous allocation information for all UEs - for (i=0;i<NUMBER_OF_UE_MAX;i++) { - phy_vars_eNB->dlsch_eNB[i][0]->subframe_tx[next_slot>>1] = 0; - } - - init_nCCE_table(); - - num_pdcch_symbols = get_num_pdcch_symbols(DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci, - DCI_pdu->dci_alloc, - &phy_vars_eNB->lte_frame_parms, - next_slot>>1); - DCI_pdu->nCCE = get_nCCE(num_pdcch_symbols, - &phy_vars_eNB->lte_frame_parms, - get_mi(&phy_vars_eNB->lte_frame_parms,next_slot>>1)); - LOG_D(PHY,"num_pdcch_symbols %d, nCCE %d\n",num_pdcch_symbols,DCI_pdu->nCCE); - + // clear previous allocation information for all UEs + for (i=0;i<NUMBER_OF_UE_MAX;i++) { + phy_vars_eNB->dlsch_eNB[i][0]->subframe_tx[next_slot>>1] = 0; + } + + init_nCCE_table(); + + num_pdcch_symbols = get_num_pdcch_symbols(DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci, + DCI_pdu->dci_alloc, + &phy_vars_eNB->lte_frame_parms, + next_slot>>1); + DCI_pdu->nCCE = get_nCCE(num_pdcch_symbols, + &phy_vars_eNB->lte_frame_parms, + get_mi(&phy_vars_eNB->lte_frame_parms,next_slot>>1)); + LOG_D(PHY,"num_pdcch_symbols %d, nCCE %d\n",num_pdcch_symbols,DCI_pdu->nCCE); + #if defined(SMBV) && !defined(EXMIMO) - // Sets up PDCCH and DCI table - if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4) && ((DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci)>0)) { - msg("[SMBV] Frame %3d, SF %d PDCCH, number of DCIs %d\n",phy_vars_eNB->frame,next_slot>>1,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci); - dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[0]); - smbv_configure_pdcch(smbv_fname,(smbv_frame_cnt*10) + (next_slot>>1),num_pdcch_symbols,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci); - } + // Sets up PDCCH and DCI table + if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4) && ((DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci)>0)) { + msg("[SMBV] Frame %3d, SF %d PDCCH, number of DCIs %d\n",phy_vars_eNB->frame,next_slot>>1,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci); + dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[0]); + smbv_configure_pdcch(smbv_fname,(smbv_frame_cnt*10) + (next_slot>>1),num_pdcch_symbols,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci); + } #endif - - printf("PHY @0\n"); - for (i=0;i<DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci ; i++) { + + for (i=0;i<DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci ; i++) { #ifdef DEBUG_PHY_PROC - if (DCI_pdu->dci_alloc[i].rnti != SI_RNTI) { - LOG_D(PHY,"[eNB] Subframe %d : Doing DCI index %d/%d\n",next_slot>>1,i,DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci); - dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]); - } + if (DCI_pdu->dci_alloc[i].rnti != SI_RNTI) { + LOG_D(PHY,"[eNB] Subframe %d : Doing DCI index %d/%d\n",next_slot>>1,i,DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci); + dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]); + } #endif - printf("PHY @1 %d\n",i); - - if (DCI_pdu->dci_alloc[i].rnti == SI_RNTI) { + + if (DCI_pdu->dci_alloc[i].rnti == SI_RNTI) { #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d] SI generate_eNB_dlsch_params_from_dci\n", phy_vars_eNB->Mod_id); -#endif - generate_eNB_dlsch_params_from_dci(next_slot>>1, - &DCI_pdu->dci_alloc[i].dci_pdu[0], - DCI_pdu->dci_alloc[i].rnti, - DCI_pdu->dci_alloc[i].format, - &phy_vars_eNB->dlsch_eNB_SI, - &phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI, - phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single); - - if ((phy_vars_eNB->dlsch_eNB_SI->nCCE[next_slot>>1] = get_nCCE_offset(1<<DCI_pdu->dci_alloc[i].L, - DCI_pdu->nCCE, - 1, - SI_RNTI, - next_slot>>1)) == -1) { - LOG_E(PHY,"[eNB %d] Frame %d subframe %d : No available CCE resources for common DCI (SI)!!!\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1); - } - else { - LOG_D(PHY,"[eNB %d] Frame %d subframe %d : CCE resource for common DCI (SI) => %d/%d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1, - phy_vars_eNB->dlsch_eNB_SI->nCCE[next_slot>>1],DCI_pdu->nCCE); + LOG_D(PHY,"[eNB %d] SI generate_eNB_dlsch_params_from_dci\n", phy_vars_eNB->Mod_id); +#endif + generate_eNB_dlsch_params_from_dci(next_slot>>1, + &DCI_pdu->dci_alloc[i].dci_pdu[0], + DCI_pdu->dci_alloc[i].rnti, + DCI_pdu->dci_alloc[i].format, + &phy_vars_eNB->dlsch_eNB_SI, + &phy_vars_eNB->lte_frame_parms, + phy_vars_eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single); + + if ((phy_vars_eNB->dlsch_eNB_SI->nCCE[next_slot>>1] = get_nCCE_offset(1<<DCI_pdu->dci_alloc[i].L, + DCI_pdu->nCCE, + 1, + SI_RNTI, + next_slot>>1)) == -1) { + LOG_E(PHY,"[eNB %d] Frame %d subframe %d : No available CCE resources for common DCI (SI)!!!\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1); + } + else { + LOG_D(PHY,"[eNB %d] Frame %d subframe %d : CCE resource for common DCI (SI) => %d/%d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1, + phy_vars_eNB->dlsch_eNB_SI->nCCE[next_slot>>1],DCI_pdu->nCCE); #if defined(SMBV) && !defined(EXMIMO) - // configure SI DCI - if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, SI in SF %d DCI %d\n",phy_vars_eNB->frame,next_slot>>1,i); - smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (next_slot>>1), "SI", &DCI_pdu->dci_alloc[i], i); - } + // configure SI DCI + if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) { + msg("[SMBV] Frame %3d, SI in SF %d DCI %d\n",phy_vars_eNB->frame,next_slot>>1,i); + smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (next_slot>>1), "SI", &DCI_pdu->dci_alloc[i], i); + } #endif - } - DCI_pdu->dci_alloc[i].nCCE = phy_vars_eNB->dlsch_eNB_SI->nCCE[next_slot>>1]; - - } - else if (DCI_pdu->dci_alloc[i].ra_flag == 1) { + } + DCI_pdu->dci_alloc[i].nCCE = phy_vars_eNB->dlsch_eNB_SI->nCCE[next_slot>>1]; + + } + else if (DCI_pdu->dci_alloc[i].ra_flag == 1) { #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d] RA generate_eNB_dlsch_params_from_dci\n", phy_vars_eNB->Mod_id); -#endif - generate_eNB_dlsch_params_from_dci(next_slot>>1, - &DCI_pdu->dci_alloc[i].dci_pdu[0], - DCI_pdu->dci_alloc[i].rnti, - DCI_pdu->dci_alloc[i].format, - &phy_vars_eNB->dlsch_eNB_ra, - &phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->pdsch_config_dedicated, - SI_RNTI, - DCI_pdu->dci_alloc[i].rnti, - P_RNTI, - phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single); - - // mac_xface->macphy_exit("Transmitted RAR, exiting\n"); - - if ((phy_vars_eNB->dlsch_eNB_ra->nCCE[next_slot>>1] = get_nCCE_offset(1<<DCI_pdu->dci_alloc[i].L, - DCI_pdu->nCCE, - 1, - DCI_pdu->dci_alloc[i].rnti, - next_slot>>1)) == -1) { - LOG_E(PHY,"[eNB %d] Frame %d subframe %d : No available CCE resources for common DCI (RA) !!!\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1); - } - else { - LOG_I(PHY,"[eNB %d] Frame %d subframe %d : CCE resource for common DCI (RA) => %d/%d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1, - phy_vars_eNB->dlsch_eNB_ra->nCCE[next_slot>>1],DCI_pdu->nCCE); + LOG_D(PHY,"[eNB %d] RA generate_eNB_dlsch_params_from_dci\n", phy_vars_eNB->Mod_id); +#endif + generate_eNB_dlsch_params_from_dci(next_slot>>1, + &DCI_pdu->dci_alloc[i].dci_pdu[0], + DCI_pdu->dci_alloc[i].rnti, + DCI_pdu->dci_alloc[i].format, + &phy_vars_eNB->dlsch_eNB_ra, + &phy_vars_eNB->lte_frame_parms, + phy_vars_eNB->pdsch_config_dedicated, + SI_RNTI, + DCI_pdu->dci_alloc[i].rnti, + P_RNTI, + phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single); + + // mac_xface->macphy_exit("Transmitted RAR, exiting\n"); + + if ((phy_vars_eNB->dlsch_eNB_ra->nCCE[next_slot>>1] = get_nCCE_offset(1<<DCI_pdu->dci_alloc[i].L, + DCI_pdu->nCCE, + 1, + DCI_pdu->dci_alloc[i].rnti, + next_slot>>1)) == -1) { + LOG_E(PHY,"[eNB %d] Frame %d subframe %d : No available CCE resources for common DCI (RA) !!!\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1); + } + else { + LOG_I(PHY,"[eNB %d] Frame %d subframe %d : CCE resource for common DCI (RA) => %d/%d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1, + phy_vars_eNB->dlsch_eNB_ra->nCCE[next_slot>>1],DCI_pdu->nCCE); #if defined(SMBV) && !defined(EXMIMO) - // configure RA DCI - if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, RA in SF %d DCI %d\n",phy_vars_eNB->frame,next_slot>>1,i); - smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (next_slot>>1), "RA", &DCI_pdu->dci_alloc[i], i); - } + // configure RA DCI + if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) { + msg("[SMBV] Frame %3d, RA in SF %d DCI %d\n",phy_vars_eNB->frame,next_slot>>1,i); + smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (next_slot>>1), "RA", &DCI_pdu->dci_alloc[i], i); + } #endif - } - DCI_pdu->dci_alloc[i].nCCE = phy_vars_eNB->dlsch_eNB_ra->nCCE[next_slot>>1]; + } + DCI_pdu->dci_alloc[i].nCCE = phy_vars_eNB->dlsch_eNB_ra->nCCE[next_slot>>1]; - } - else if (DCI_pdu->dci_alloc[i].format != format0){ // this is a normal DLSCH allocation + } + + else if (DCI_pdu->dci_alloc[i].format != format0){ // this is a normal DLSCH allocation #ifdef OPENAIR2 #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB] Searching for RNTI %x\n",DCI_pdu->dci_alloc[i].rnti); + LOG_D(PHY,"[eNB] Searching for RNTI %x\n",DCI_pdu->dci_alloc[i].rnti); #endif - UE_id = find_ue((s16)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB); + UE_id = find_ue((s16)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB); #else - UE_id = i; + UE_id = i; #endif - if (UE_id>=0) { - // dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]); + if (UE_id>=0) { + // dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]); #if defined(SMBV) && !defined(EXMIMO) - // Configure this user - if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, SF %d (SMBV SF %d) Configuring user %d with RNTI %d in TM%d\n",phy_vars_eNB->frame,next_slot>>1,(smbv_frame_cnt*10) + (next_slot>>1),UE_id+1,DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->transmission_mode[(u8)UE_id]); - smbv_configure_user(smbv_fname,UE_id+1,phy_vars_eNB->transmission_mode[(u8)UE_id],DCI_pdu->dci_alloc[i].rnti); - } + // Configure this user + if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) { + msg("[SMBV] Frame %3d, SF %d (SMBV SF %d) Configuring user %d with RNTI %d in TM%d\n",phy_vars_eNB->frame,next_slot>>1,(smbv_frame_cnt*10) + (next_slot>>1),UE_id+1,DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->transmission_mode[(u8)UE_id]); + smbv_configure_user(smbv_fname,UE_id+1,phy_vars_eNB->transmission_mode[(u8)UE_id],DCI_pdu->dci_alloc[i].rnti); + } #endif - generate_eNB_dlsch_params_from_dci(next_slot>>1, - &DCI_pdu->dci_alloc[i].dci_pdu[0], - DCI_pdu->dci_alloc[i].rnti, - DCI_pdu->dci_alloc[i].format, - phy_vars_eNB->dlsch_eNB[(u8)UE_id], - &phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI, - phy_vars_eNB->eNB_UE_stats[(u8)UE_id].DL_pmi_single); - LOG_D(PHY,"[eNB %d][PDSCH %x/%d] Frame %d subframe %d: Generated dlsch params\n", - phy_vars_eNB->Mod_id,DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->current_harq_pid,phy_vars_eNB->frame,next_slot>>1); - if ((phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->nCCE[next_slot>>1] = get_nCCE_offset(1<<DCI_pdu->dci_alloc[i].L, - DCI_pdu->nCCE, - 0, - DCI_pdu->dci_alloc[i].rnti, - next_slot>>1)) == -1) { - LOG_E(PHY,"[eNB %d] Frame %d subframe %d : No available CCE resources for UE spec DCI (PDSCH %x) !!!\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,DCI_pdu->dci_alloc[i].rnti); - } - else { - LOG_D(PHY,"[eNB %d] Frame %d subframe %d : CCE resource for ue DCI (PDSCH %x) => %d/%d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1, - DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->nCCE[next_slot>>1],DCI_pdu->nCCE); + generate_eNB_dlsch_params_from_dci(next_slot>>1, + &DCI_pdu->dci_alloc[i].dci_pdu[0], + DCI_pdu->dci_alloc[i].rnti, + DCI_pdu->dci_alloc[i].format, + phy_vars_eNB->dlsch_eNB[(u8)UE_id], + &phy_vars_eNB->lte_frame_parms, + phy_vars_eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + phy_vars_eNB->eNB_UE_stats[(u8)UE_id].DL_pmi_single); + LOG_D(PHY,"[eNB %d][PDSCH %x/%d] Frame %d subframe %d: Generated dlsch params\n", + phy_vars_eNB->Mod_id,DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->current_harq_pid,phy_vars_eNB->frame,next_slot>>1); + if ((phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->nCCE[next_slot>>1] = get_nCCE_offset(1<<DCI_pdu->dci_alloc[i].L, + DCI_pdu->nCCE, + 0, + DCI_pdu->dci_alloc[i].rnti, + next_slot>>1)) == -1) { + LOG_E(PHY,"[eNB %d] Frame %d subframe %d : No available CCE resources for UE spec DCI (PDSCH %x) !!!\n", + phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,DCI_pdu->dci_alloc[i].rnti); + } + else { + LOG_D(PHY,"[eNB %d] Frame %d subframe %d : CCE resource for ue DCI (PDSCH %x) => %d/%d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1, + DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->nCCE[next_slot>>1],DCI_pdu->nCCE); #if defined(SMBV) && !defined(EXMIMO) - DCI_pdu->dci_alloc[i].nCCE = phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->nCCE[next_slot>>1]; - // configure UE-spec DCI - if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, PDSCH in SF %d DCI %d\n",phy_vars_eNB->frame,next_slot>>1,i); - smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (next_slot>>1), UE_id+1, &DCI_pdu->dci_alloc[i], i); - } + DCI_pdu->dci_alloc[i].nCCE = phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->nCCE[next_slot>>1]; + // configure UE-spec DCI + if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) { + msg("[SMBV] Frame %3d, PDSCH in SF %d DCI %d\n",phy_vars_eNB->frame,next_slot>>1,i); + smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (next_slot>>1), UE_id+1, &DCI_pdu->dci_alloc[i], i); + } #endif - } - DCI_pdu->dci_alloc[i].nCCE = phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->nCCE[next_slot>>1]; + } + DCI_pdu->dci_alloc[i].nCCE = phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->nCCE[next_slot>>1]; #ifdef DEBUG_PHY_PROC - //if (phy_vars_eNB->frame%100 == 0) - LOG_I(PHY,"[eNB %d][DCI][PDSCH %x] Frame %d subframe %d UE_id %d Generated DCI format %d, aggregation %d\n", - phy_vars_eNB->Mod_id, DCI_pdu->dci_alloc[i].rnti, - phy_vars_eNB->frame, next_slot>>1,UE_id, - DCI_pdu->dci_alloc[i].format, - 1<<DCI_pdu->dci_alloc[i].L); -#endif - } - else { - LOG_D(PHY,"[eNB %d][PDSCH] Frame %d : No UE_id with corresponding rnti %x, dropping DLSCH\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->frame,(s16)DCI_pdu->dci_alloc[i].rnti); - } - } else { - LOG_W(PHY,"[eNB %d] Frame %d : DCI not recognised, No UE_id with corresponding rnti %x, dropping DLSCH\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->frame,DCI_pdu->dci_alloc[i].rnti); - } - + //if (phy_vars_eNB->frame%100 == 0) + LOG_I(PHY,"[eNB %d][DCI][PDSCH %x] Frame %d subframe %d UE_id %d Generated DCI format %d, aggregation %d\n", + phy_vars_eNB->Mod_id, DCI_pdu->dci_alloc[i].rnti, + phy_vars_eNB->frame, next_slot>>1,UE_id, + DCI_pdu->dci_alloc[i].format, + 1<<DCI_pdu->dci_alloc[i].L); +#endif + } + else { + LOG_D(PHY,"[eNB %d][PDSCH] Frame %d : No UE_id with corresponding rnti %x, dropping DLSCH\n", + phy_vars_eNB->Mod_id,phy_vars_eNB->frame,(s16)DCI_pdu->dci_alloc[i].rnti); + } + } - } + } - // Apply physicalConfigDedicated if needed - phy_config_dedicated_eNB_step2(phy_vars_eNB); + // Apply physicalConfigDedicated if needed + phy_config_dedicated_eNB_step2(phy_vars_eNB); - for (i=0;i<DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci ; i++) { - if (DCI_pdu->dci_alloc[i].format == format0) { // this is a ULSCH allocation + for (i=0;i<DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci ; i++) { + if (DCI_pdu->dci_alloc[i].format == format0) { // this is a ULSCH allocation - harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms, - pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->frame,next_slot>>1), - pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,next_slot>>1)); - if (harq_pid==255) { - LOG_E(PHY,"[eNB %d] Frame %d: Bad harq_pid for ULSCH allocation\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame); - mac_exit_wrapper("Invalid harq_pid (255) detected"); - } + harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms, + pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->frame,next_slot>>1), + pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,next_slot>>1)); + if (harq_pid==255) { + LOG_E(PHY,"[eNB %d] Frame %d: Bad harq_pid for ULSCH allocation\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame); + mac_exit_wrapper("Invalid harq_pid (255) detected"); + } #ifdef OPENAIR2 - UE_id = find_ue((s16)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB); + UE_id = find_ue((s16)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB); #else - UE_id = i; + UE_id = i; #endif - if (UE_id<0) { - LOG_E(PHY,"[eNB %d] Frame %d: Unknown UE_id for rnti %x\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame,(s16)DCI_pdu->dci_alloc[i].rnti); - mac_exit_wrapper("Invalid UE id (< 0) detected"); - } + if (UE_id<0) { + LOG_E(PHY,"[eNB %d] Frame %d: Unknown UE_id for rnti %x\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame,(s16)DCI_pdu->dci_alloc[i].rnti); + mac_exit_wrapper("Invalid UE id (< 0) detected"); + } #ifdef DEBUG_PHY_PROC - if (phy_vars_eNB->frame%100 == 0) - LOG_I(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d Generated format0 DCI (rnti %x, dci %x) (DCI pos %d/%d), aggregation %d\n", - phy_vars_eNB->Mod_id, - subframe2harq_pid(&phy_vars_eNB->lte_frame_parms, - pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,(((next_slot>>1)==0)?1:0)+phy_vars_eNB->frame,next_slot>>1), - pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,next_slot>>1)), - pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,(((next_slot>>1)==0)?1:0)+phy_vars_eNB->frame,next_slot>>1), - next_slot>>1,DCI_pdu->dci_alloc[i].rnti, - *(unsigned int *)&DCI_pdu->dci_alloc[i].dci_pdu[0], - i,DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci, - 1<<DCI_pdu->dci_alloc[i].L); -#endif - - //dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]); - //LOG_D(PHY,"[eNB] cba generate_eNB_ulsch_params_from_dci for ue %d for dci rnti %x\n", UE_id, DCI_pdu->dci_alloc[i].rnti); - generate_eNB_ulsch_params_from_dci(&DCI_pdu->dci_alloc[i].dci_pdu[0], - DCI_pdu->dci_alloc[i].rnti, - (next_slot>>1), - format0, - UE_id, - phy_vars_eNB, - SI_RNTI, - 0, - P_RNTI, - CBA_RNTI, - 0); // do_srs - - if ((DCI_pdu->dci_alloc[i].nCCE=get_nCCE_offset(1<<DCI_pdu->dci_alloc[i].L, - DCI_pdu->nCCE, - 0, - DCI_pdu->dci_alloc[i].rnti, - next_slot>>1)) == -1) { - LOG_E(PHY,"[eNB %d] Frame %d subframe %d : No available CCE resources (%d) for UE spec DCI (PUSCH %x) !!!\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,DCI_pdu->nCCE,DCI_pdu->dci_alloc[i].rnti); - } - else { - LOG_D(PHY,"[eNB %d] Frame %d subframe %d : CCE resources for UE spec DCI (PUSCH %x) => %d/%d\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,DCI_pdu->dci_alloc[i].rnti, - DCI_pdu->dci_alloc[i].nCCE,DCI_pdu->nCCE); + if (phy_vars_eNB->frame%100 == 0) + LOG_I(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d Generated format0 DCI (rnti %x, dci %x) (DCI pos %d/%d), aggregation %d\n", + phy_vars_eNB->Mod_id, + subframe2harq_pid(&phy_vars_eNB->lte_frame_parms, + pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,(((next_slot>>1)==0)?1:0)+phy_vars_eNB->frame,next_slot>>1), + pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,next_slot>>1)), + pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,(((next_slot>>1)==0)?1:0)+phy_vars_eNB->frame,next_slot>>1), + next_slot>>1,DCI_pdu->dci_alloc[i].rnti, + *(unsigned int *)&DCI_pdu->dci_alloc[i].dci_pdu[0], + i,DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci, + 1<<DCI_pdu->dci_alloc[i].L); +#endif + + //dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]); + //LOG_D(PHY,"[eNB] cba generate_eNB_ulsch_params_from_dci for ue %d for dci rnti %x\n", UE_id, DCI_pdu->dci_alloc[i].rnti); + generate_eNB_ulsch_params_from_dci(&DCI_pdu->dci_alloc[i].dci_pdu[0], + DCI_pdu->dci_alloc[i].rnti, + (next_slot>>1), + format0, + UE_id, + phy_vars_eNB, + SI_RNTI, + 0, + P_RNTI, + CBA_RNTI, + 0); // do_srs + + if ((DCI_pdu->dci_alloc[i].nCCE=get_nCCE_offset(1<<DCI_pdu->dci_alloc[i].L, + DCI_pdu->nCCE, + 0, + DCI_pdu->dci_alloc[i].rnti, + next_slot>>1)) == -1) { + LOG_E(PHY,"[eNB %d] Frame %d subframe %d : No available CCE resources (%d) for UE spec DCI (PUSCH %x) !!!\n", + phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,DCI_pdu->nCCE,DCI_pdu->dci_alloc[i].rnti); + } + else { + LOG_D(PHY,"[eNB %d] Frame %d subframe %d : CCE resources for UE spec DCI (PUSCH %x) => %d/%d\n", + phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,DCI_pdu->dci_alloc[i].rnti, + DCI_pdu->dci_alloc[i].nCCE,DCI_pdu->nCCE); #if defined(SMBV) && !defined(EXMIMO) - // configure UE-spec DCI for UL Grant - if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, SF %d UL DCI %d\n",phy_vars_eNB->frame,next_slot>>1,i); - smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (next_slot>>1), UE_id+1, &DCI_pdu->dci_alloc[i], i); - } + // configure UE-spec DCI for UL Grant + if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) { + msg("[SMBV] Frame %3d, SF %d UL DCI %d\n",phy_vars_eNB->frame,next_slot>>1,i); + smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (next_slot>>1), UE_id+1, &DCI_pdu->dci_alloc[i], i); + } #endif - } - /* + } + /* #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Setting subframe_scheduling_flag for UE %d harq_pid %d (ul subframe %d)\n", phy_vars_eNB->Mod_id,harq_pid, phy_vars_eNB->frame,next_slot>>1,i,harq_pid, pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,next_slot>>1)); #endif - */ - if ((DCI_pdu->dci_alloc[i].rnti >= CBA_RNTI) && (DCI_pdu->dci_alloc[i].rnti < P_RNTI)) - phy_vars_eNB->ulsch_eNB[(u32)UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag = 1; - else - phy_vars_eNB->ulsch_eNB[(u32)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1; - - } - } - - - + */ + if ((DCI_pdu->dci_alloc[i].rnti >= CBA_RNTI) && (DCI_pdu->dci_alloc[i].rnti < P_RNTI)) + phy_vars_eNB->ulsch_eNB[(u32)UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag = 1; + else + phy_vars_eNB->ulsch_eNB[(u32)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1; + + } + } + - // if we have DCI to generate do it now - if ((DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci)>0) { - } - else { // for emulation!! - phy_vars_eNB->num_ue_spec_dci[(next_slot>>1)&1]=0; - phy_vars_eNB->num_common_dci[(next_slot>>1)&1]=0; - } + // if we have DCI to generate do it now + if ((DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci)>0) { - if (abstraction_flag == 0) { + + } + else { // for emulation!! + phy_vars_eNB->num_ue_spec_dci[(next_slot>>1)&1]=0; + phy_vars_eNB->num_common_dci[(next_slot>>1)&1]=0; + } + + if (abstraction_flag == 0) { #ifdef DEBUG_PHY_PROC - if (DCI_pdu->Num_ue_spec_dci+DCI_pdu->Num_common_dci > 0) - LOG_I(PHY,"[eNB %d] Frame %d, subframe %d: Calling generate_dci_top (pdcch) (common %d,ue_spec %d)\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot>>1,DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci); + if (DCI_pdu->Num_ue_spec_dci+DCI_pdu->Num_common_dci > 0) + LOG_I(PHY,"[eNB %d] Frame %d, subframe %d: Calling generate_dci_top (pdcch) (common %d,ue_spec %d)\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot>>1,DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci); #endif - for (sect_id=0;sect_id<number_of_cards;sect_id++) - num_pdcch_symbols = generate_dci_top(DCI_pdu->Num_ue_spec_dci, - DCI_pdu->Num_common_dci, - DCI_pdu->dci_alloc, - 0, - AMP, - &phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], - next_slot>>1); + for (sect_id=0;sect_id<number_of_cards;sect_id++) + num_pdcch_symbols = generate_dci_top(DCI_pdu->Num_ue_spec_dci, + DCI_pdu->Num_common_dci, + DCI_pdu->dci_alloc, + 0, + AMP, + &phy_vars_eNB->lte_frame_parms, + phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], + next_slot>>1); #ifdef DEBUG_PHY_PROC - // LOG_I(PHY,"[eNB %d] Frame %d, subframe %d: num_pdcch_symbols %d)\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot>>1,num_pdcch_symbols); +// LOG_I(PHY,"[eNB %d] Frame %d, subframe %d: num_pdcch_symbols %d)\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot>>1,num_pdcch_symbols); #endif - } + } #ifdef PHY_ABSTRACTION - else { - LOG_D(PHY,"[eNB %d] Frame %d, subframe %d: Calling generate_dci_top_emul\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot>>1); - num_pdcch_symbols = generate_dci_top_emul(phy_vars_eNB,DCI_pdu->Num_ue_spec_dci,DCI_pdu->Num_common_dci,DCI_pdu->dci_alloc,next_slot>>1); - } + else { + LOG_D(PHY,"[eNB %d] Frame %d, subframe %d: Calling generate_dci_top_emul\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot>>1); + num_pdcch_symbols = generate_dci_top_emul(phy_vars_eNB,DCI_pdu->Num_ue_spec_dci,DCI_pdu->Num_common_dci,DCI_pdu->dci_alloc,next_slot>>1); + } #endif - vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,0); + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,0); #ifdef DEBUG_PHY_PROC - //LOG_D(PHY,"[eNB %d] Frame %d, slot %d: num_pdcch_symbols=%d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot,num_pdcch_symbols); + //LOG_D(PHY,"[eNB %d] Frame %d, slot %d: num_pdcch_symbols=%d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot,num_pdcch_symbols); #endif - // Check for SI activity + // Check for SI activity - if (phy_vars_eNB->dlsch_eNB_SI->active == 1) { - input_buffer_length = phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->TBS/8; + if (phy_vars_eNB->dlsch_eNB_SI->active == 1) { + input_buffer_length = phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->TBS/8; #ifdef OPENAIR2 - DLSCH_pdu = mac_xface->get_dlsch_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->frame, - SI_RNTI, - 0); + DLSCH_pdu = mac_xface->get_dlsch_sdu(phy_vars_eNB->Mod_id, + phy_vars_eNB->frame, + SI_RNTI, + 0); #else - DLSCH_pdu = DLSCH_pdu_tmp; - for (i=0;i<input_buffer_length;i++) - DLSCH_pdu[i] = (unsigned char)(taus()&0xff); + DLSCH_pdu = DLSCH_pdu_tmp; + for (i=0;i<input_buffer_length;i++) + DLSCH_pdu[i] = (unsigned char)(taus()&0xff); #endif - + #if defined(SMBV) && !defined(EXMIMO) - // Configures the data source of allocation (allocation is configured by DCI) - if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, Configuring SI payload in SF %d alloc %d\n",phy_vars_eNB->frame,(smbv_frame_cnt*10) + (next_slot>>1),smbv_alloc_cnt); - smbv_configure_datalist_for_alloc(smbv_fname, smbv_alloc_cnt++, (smbv_frame_cnt*10) + (next_slot>>1), DLSCH_pdu, input_buffer_length); - } + // Configures the data source of allocation (allocation is configured by DCI) + if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) { + msg("[SMBV] Frame %3d, Configuring SI payload in SF %d alloc %d\n",phy_vars_eNB->frame,(smbv_frame_cnt*10) + (next_slot>>1),smbv_alloc_cnt); + smbv_configure_datalist_for_alloc(smbv_fname, smbv_alloc_cnt++, (smbv_frame_cnt*10) + (next_slot>>1), DLSCH_pdu, input_buffer_length); + } #endif #ifdef DEBUG_PHY_PROC #ifdef DEBUG_DLSCH - LOG_D(PHY,"[eNB %d][SI] Frame %d, slot %d: Calling generate_dlsch (SI) with input size = %d, num_pdcch_symbols %d\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot, input_buffer_length,num_pdcch_symbols); - for (i=0;i<input_buffer_length;i++) - LOG_T(PHY,"%x.",i,DLSCH_pdu[i]); - LOG_T(PHY,"\n"); -#endif -#endif - - if (abstraction_flag == 0) { - - dlsch_encoding(DLSCH_pdu, - &phy_vars_eNB->lte_frame_parms, - num_pdcch_symbols, - phy_vars_eNB->dlsch_eNB_SI, - phy_vars_eNB->frame,next_slot>>1, - &phy_vars_eNB->dlsch_rate_matching_stats, - &phy_vars_eNB->dlsch_turbo_encoding_stats, - &phy_vars_eNB->dlsch_interleaving_stats); - - dlsch_scrambling(&phy_vars_eNB->lte_frame_parms, - 0, - phy_vars_eNB->dlsch_eNB_SI, - get_G(&phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->dlsch_eNB_SI->nb_rb, - phy_vars_eNB->dlsch_eNB_SI->rb_alloc, - get_Qm(phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->mcs), - num_pdcch_symbols,phy_vars_eNB->frame,next_slot>>1), - 0, - next_slot); - - for (sect_id=0;sect_id<number_of_cards;sect_id++) - re_allocated = dlsch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], - AMP, - next_slot/2, - &phy_vars_eNB->lte_frame_parms, - num_pdcch_symbols, - phy_vars_eNB->dlsch_eNB_SI); - } + LOG_D(PHY,"[eNB %d][SI] Frame %d, slot %d: Calling generate_dlsch (SI) with input size = %d, num_pdcch_symbols %d\n", + phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot, input_buffer_length,num_pdcch_symbols); + for (i=0;i<input_buffer_length;i++) + LOG_T(PHY,"%x.",i,DLSCH_pdu[i]); + LOG_T(PHY,"\n"); +#endif +#endif + + if (abstraction_flag == 0) { + + start_meas(&phy_vars_eNB->dlsch_encoding_stats); + dlsch_encoding(DLSCH_pdu, + &phy_vars_eNB->lte_frame_parms, + num_pdcch_symbols, + phy_vars_eNB->dlsch_eNB_SI, + phy_vars_eNB->frame,next_slot>>1, + &phy_vars_eNB->dlsch_rate_matching_stats, + &phy_vars_eNB->dlsch_turbo_encoding_stats, + &phy_vars_eNB->dlsch_interleaving_stats); + stop_meas(&phy_vars_eNB->dlsch_encoding_stats); + + start_meas(&phy_vars_eNB->dlsch_scrambling_stats); + dlsch_scrambling(&phy_vars_eNB->lte_frame_parms, + 0, + phy_vars_eNB->dlsch_eNB_SI, + get_G(&phy_vars_eNB->lte_frame_parms, + phy_vars_eNB->dlsch_eNB_SI->nb_rb, + phy_vars_eNB->dlsch_eNB_SI->rb_alloc, + get_Qm(phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->mcs), + num_pdcch_symbols,phy_vars_eNB->frame,next_slot>>1), + 0, + next_slot); + stop_meas(&phy_vars_eNB->dlsch_scrambling_stats); + + start_meas(&phy_vars_eNB->dlsch_modulation_stats); + for (sect_id=0;sect_id<number_of_cards;sect_id++) + re_allocated = dlsch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], + AMP, + next_slot/2, + &phy_vars_eNB->lte_frame_parms, + num_pdcch_symbols, + phy_vars_eNB->dlsch_eNB_SI); + stop_meas(&phy_vars_eNB->dlsch_modulation_stats); + } #ifdef PHY_ABSTRACTION - else { - dlsch_encoding_emul(phy_vars_eNB, - DLSCH_pdu, - phy_vars_eNB->dlsch_eNB_SI); - } + else { + start_meas(&phy_vars_eNB->dlsch_encoding_stats); + dlsch_encoding_emul(phy_vars_eNB, + DLSCH_pdu, + phy_vars_eNB->dlsch_eNB_SI); + stop_meas(&phy_vars_eNB->dlsch_encoding_stats); + } #endif - phy_vars_eNB->dlsch_eNB_SI->active = 0; - - } + phy_vars_eNB->dlsch_eNB_SI->active = 0; + + } - // Check for RA activity - if (phy_vars_eNB->dlsch_eNB_ra->active == 1) { + // Check for RA activity + if (phy_vars_eNB->dlsch_eNB_ra->active == 1) { #ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[eNB %d][RAPROC] Frame %d, slot %d, RA active, filling RAR:\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot); + LOG_I(PHY,"[eNB %d][RAPROC] Frame %d, slot %d, RA active, filling RAR:\n", + phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot); #endif - input_buffer_length = phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->TBS/8; + input_buffer_length = phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->TBS/8; #ifdef OPENAIR2 - crnti = mac_xface->fill_rar(phy_vars_eNB->Mod_id, - phy_vars_eNB->frame, - dlsch_input_buffer, - phy_vars_eNB->lte_frame_parms.N_RB_UL, - input_buffer_length); - /* + crnti = mac_xface->fill_rar(phy_vars_eNB->Mod_id, + phy_vars_eNB->frame, + dlsch_input_buffer, + phy_vars_eNB->lte_frame_parms.N_RB_UL, + input_buffer_length); + /* for (i=0;i<input_buffer_length;i++) LOG_T(PHY,"%x.",dlsch_input_buffer[i]); LOG_T(PHY,"\n"); - */ - UE_id = add_ue(crnti,phy_vars_eNB); - if (UE_id==-1) { - LOG_W(PHY,"[eNB] Max user count reached.\n"); - //mac_xface->macphy_exit("[PHY][eNB] Max user count reached.\n"); - mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id, - phy_vars_eNB->frame, - crnti); - } - else { - phy_vars_eNB->eNB_UE_stats[(u32)UE_id].mode = RA_RESPONSE; - // Initialize indicator for first SR (to be cleared after ConnectionSetup is acknowledged) - phy_vars_eNB->first_sr[(u32)UE_id] = 1; - - generate_eNB_ulsch_params_from_rar(dlsch_input_buffer, - phy_vars_eNB->frame, - (next_slot>>1), - phy_vars_eNB->ulsch_eNB[(u32)UE_id], - &phy_vars_eNB->lte_frame_parms); - - phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_active = 1; - - get_Msg3_alloc(&phy_vars_eNB->lte_frame_parms, - next_slot>>1, - phy_vars_eNB->frame, - &phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_frame, - &phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_subframe); + */ + UE_id = add_ue(crnti,phy_vars_eNB); + if (UE_id==-1) { + LOG_W(PHY,"[eNB] Max user count reached.\n"); + //mac_xface->macphy_exit("[PHY][eNB] Max user count reached.\n"); + mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id, + phy_vars_eNB->frame, + crnti); + } + else { + phy_vars_eNB->eNB_UE_stats[(u32)UE_id].mode = RA_RESPONSE; + // Initialize indicator for first SR (to be cleared after ConnectionSetup is acknowledged) + phy_vars_eNB->first_sr[(u32)UE_id] = 1; + + generate_eNB_ulsch_params_from_rar(dlsch_input_buffer, + phy_vars_eNB->frame, + (next_slot>>1), + phy_vars_eNB->ulsch_eNB[(u32)UE_id], + &phy_vars_eNB->lte_frame_parms); + + phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_active = 1; + + get_Msg3_alloc(&phy_vars_eNB->lte_frame_parms, + next_slot>>1, + phy_vars_eNB->frame, + &phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_frame, + &phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_subframe); #else - for (i=0;i<input_buffer_length;i++) - dlsch_input_buffer[i]= (unsigned char) i; //(taus()&0xff); + for (i=0;i<input_buffer_length;i++) + dlsch_input_buffer[i]= (unsigned char) i; //(taus()&0xff); - dlsch_input_buffer[1] = (phy_vars_eNB->eNB_UE_stats[0].UE_timing_offset)>>(2+4); // 7 MSBs of timing advance + divide by 4 - dlsch_input_buffer[2] = ((phy_vars_eNB->eNB_UE_stats[0].UE_timing_offset)<<(4-2))&0xf0; // 4 LSBs of timing advance + divide by 4 - //LOG_I(PHY,"UE %d: timing_offset = %d\n",UE_id,phy_vars_eNB->eNB_UE_stats[0].UE_timing_offset); + dlsch_input_buffer[1] = (phy_vars_eNB->eNB_UE_stats[0].UE_timing_offset)>>(2+4); // 7 MSBs of timing advance + divide by 4 + dlsch_input_buffer[2] = ((phy_vars_eNB->eNB_UE_stats[0].UE_timing_offset)<<(4-2))&0xf0; // 4 LSBs of timing advance + divide by 4 + //LOG_I(PHY,"UE %d: timing_offset = %d\n",UE_id,phy_vars_eNB->eNB_UE_stats[0].UE_timing_offset); #endif #if defined(SMBV) && !defined(EXMIMO) - // Configures the data source of allocation (allocation is configured by DCI) - if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, Configuring RA payload in SF %d alloc %d\n",phy_vars_eNB->frame,(smbv_frame_cnt*10) + (next_slot>>1),smbv_alloc_cnt); - smbv_configure_datalist_for_alloc(smbv_fname, smbv_alloc_cnt++, (smbv_frame_cnt*10) + (next_slot>>1), dlsch_input_buffer, input_buffer_length); - } + // Configures the data source of allocation (allocation is configured by DCI) + if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) { + msg("[SMBV] Frame %3d, Configuring RA payload in SF %d alloc %d\n",phy_vars_eNB->frame,(smbv_frame_cnt*10) + (next_slot>>1),smbv_alloc_cnt); + smbv_configure_datalist_for_alloc(smbv_fname, smbv_alloc_cnt++, (smbv_frame_cnt*10) + (next_slot>>1), dlsch_input_buffer, input_buffer_length); + } #endif #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][RAPROC] Frame %d, next slot %d: Calling generate_dlsch (RA) with input size = %d,Msg3 frame %d, Msg3 subframe %d\n", - phy_vars_eNB->Mod_id, - phy_vars_eNB->frame, next_slot,input_buffer_length, - phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_frame, - phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_subframe); -#endif - - if (abstraction_flag == 0) { - - dlsch_encoding(dlsch_input_buffer, - &phy_vars_eNB->lte_frame_parms, - num_pdcch_symbols, - phy_vars_eNB->dlsch_eNB_ra, - phy_vars_eNB->frame,next_slot>>1, - &phy_vars_eNB->dlsch_rate_matching_stats, - &phy_vars_eNB->dlsch_turbo_encoding_stats, - &phy_vars_eNB->dlsch_interleaving_stats); - - // phy_vars_eNB->dlsch_eNB_ra->rnti = RA_RNTI; - dlsch_scrambling(&phy_vars_eNB->lte_frame_parms, - 0, - phy_vars_eNB->dlsch_eNB_ra, - get_G(&phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->dlsch_eNB_ra->nb_rb, - phy_vars_eNB->dlsch_eNB_ra->rb_alloc, - get_Qm(phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->mcs), - num_pdcch_symbols,phy_vars_eNB->frame,next_slot>>1), - 0, - next_slot); - for (sect_id=0;sect_id<number_of_cards;sect_id++) - re_allocated = dlsch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], - AMP, - next_slot/2, - &phy_vars_eNB->lte_frame_parms, - num_pdcch_symbols, - phy_vars_eNB->dlsch_eNB_ra); - } + LOG_D(PHY,"[eNB %d][RAPROC] Frame %d, next slot %d: Calling generate_dlsch (RA) with input size = %d,Msg3 frame %d, Msg3 subframe %d\n", + phy_vars_eNB->Mod_id, + phy_vars_eNB->frame, next_slot,input_buffer_length, + phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_frame, + phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_subframe); +#endif + + if (abstraction_flag == 0) { + + dlsch_encoding(dlsch_input_buffer, + &phy_vars_eNB->lte_frame_parms, + num_pdcch_symbols, + phy_vars_eNB->dlsch_eNB_ra, + phy_vars_eNB->frame,next_slot>>1, + &phy_vars_eNB->dlsch_rate_matching_stats, + &phy_vars_eNB->dlsch_turbo_encoding_stats, + &phy_vars_eNB->dlsch_interleaving_stats); + + // phy_vars_eNB->dlsch_eNB_ra->rnti = RA_RNTI; + dlsch_scrambling(&phy_vars_eNB->lte_frame_parms, + 0, + phy_vars_eNB->dlsch_eNB_ra, + get_G(&phy_vars_eNB->lte_frame_parms, + phy_vars_eNB->dlsch_eNB_ra->nb_rb, + phy_vars_eNB->dlsch_eNB_ra->rb_alloc, + get_Qm(phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->mcs), + num_pdcch_symbols,phy_vars_eNB->frame,next_slot>>1), + 0, + next_slot); + for (sect_id=0;sect_id<number_of_cards;sect_id++) + re_allocated = dlsch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], + AMP, + next_slot/2, + &phy_vars_eNB->lte_frame_parms, + num_pdcch_symbols, + phy_vars_eNB->dlsch_eNB_ra); + } #ifdef PHY_ABSTRACTION - else { - dlsch_encoding_emul(phy_vars_eNB, - dlsch_input_buffer, - phy_vars_eNB->dlsch_eNB_ra); - } -#endif - LOG_D(PHY,"[eNB %d][RAPROC] Frame %d subframe %d Deactivating DLSCH RA\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->frame,next_slot>>1); - + else { + dlsch_encoding_emul(phy_vars_eNB, + dlsch_input_buffer, + phy_vars_eNB->dlsch_eNB_ra); + } +#endif + LOG_D(PHY,"[eNB %d][RAPROC] Frame %d subframe %d Deactivating DLSCH RA\n",phy_vars_eNB->Mod_id, + phy_vars_eNB->frame,next_slot>>1); + #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d] Frame %d, slot %d, DLSCH (RA) re_allocated = %d\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->frame, next_slot, re_allocated); + LOG_D(PHY,"[eNB %d] Frame %d, slot %d, DLSCH (RA) re_allocated = %d\n",phy_vars_eNB->Mod_id, + phy_vars_eNB->frame, next_slot, re_allocated); #endif #ifdef OPENAIR2 - } //max user count + } //max user count #endif - phy_vars_eNB->dlsch_eNB_ra->active = 0; - } - - // Now scan UE specific DLSCH - for (UE_id=0;UE_id<NUMBER_OF_UE_MAX;UE_id++) { - if ((phy_vars_eNB->dlsch_eNB[(u8)UE_id][0])&& - (phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->rnti>0)&& - (phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->active == 1)) { - harq_pid = phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->current_harq_pid; - input_buffer_length = phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->TBS/8; + phy_vars_eNB->dlsch_eNB_ra->active = 0; + } + // Now scan UE specific DLSCH + for (UE_id=0;UE_id<NUMBER_OF_UE_MAX;UE_id++) { + if ((phy_vars_eNB->dlsch_eNB[(u8)UE_id][0])&& + (phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->rnti>0)&& + (phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->active == 1)) { + harq_pid = phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->current_harq_pid; + input_buffer_length = phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->TBS/8; + #ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[eNB %d][PDSCH %x/%d] Frame %d, subframe %d: Generating PDSCH/DLSCH with input size = %d, G %d, nb_rb %d, mcs %d, pmi_alloc %x, rv %d (round %d)\n", - phy_vars_eNB->Mod_id, phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->rnti,harq_pid, - phy_vars_eNB->frame, next_slot>>1, input_buffer_length, - get_G(&phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->nb_rb, - phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->rb_alloc, - get_Qm(phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->mcs), - num_pdcch_symbols,phy_vars_eNB->frame,next_slot>>1), - phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->nb_rb, - phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->mcs, - pmi2hex_2Ar1(phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->pmi_alloc), - phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->rvidx, - phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->round); -#endif - - phy_vars_eNB->eNB_UE_stats[(u8)UE_id].dlsch_sliding_cnt++; - if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->harq_processes[harq_pid]->round == 0) { - - phy_vars_eNB->eNB_UE_stats[(u32)UE_id].dlsch_trials[0]++; - + LOG_I(PHY,"[eNB %d][PDSCH %x/%d] Frame %d, subframe %d: Generating PDSCH/DLSCH with input size = %d, G %d, nb_rb %d, mcs %d, pmi_alloc %x, rv %d (round %d)\n", + phy_vars_eNB->Mod_id, phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->rnti,harq_pid, + phy_vars_eNB->frame, next_slot>>1, input_buffer_length, + get_G(&phy_vars_eNB->lte_frame_parms, + phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->nb_rb, + phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->rb_alloc, + get_Qm(phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->mcs), + num_pdcch_symbols,phy_vars_eNB->frame,next_slot>>1), + phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->nb_rb, + phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->mcs, + pmi2hex_2Ar1(phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->pmi_alloc), + phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->rvidx, + phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->round); +#endif + + phy_vars_eNB->eNB_UE_stats[(u8)UE_id].dlsch_sliding_cnt++; + if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->harq_processes[harq_pid]->round == 0) { + + phy_vars_eNB->eNB_UE_stats[(u32)UE_id].dlsch_trials[0]++; + #ifdef OPENAIR2 - DLSCH_pdu = mac_xface->get_dlsch_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->frame, - phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->rnti, - 0); - phy_vars_eNB->eNB_UE_stats[UE_id].total_TBS_MAC += phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->TBS; + DLSCH_pdu = mac_xface->get_dlsch_sdu(phy_vars_eNB->Mod_id, + phy_vars_eNB->frame, + phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->rnti, + 0); + phy_vars_eNB->eNB_UE_stats[UE_id].total_TBS_MAC += phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->TBS; #else - DLSCH_pdu = DLSCH_pdu_tmp; - for (i=0;i<input_buffer_length;i++) - DLSCH_pdu[i] = (unsigned char)(taus()&0xff); + DLSCH_pdu = DLSCH_pdu_tmp; + for (i=0;i<input_buffer_length;i++) + DLSCH_pdu[i] = (unsigned char)(taus()&0xff); #endif #if defined(SMBV) && !defined(EXMIMO) - // Configures the data source of allocation (allocation is configured by DCI) - if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, Configuring PDSCH payload in SF %d alloc %d\n",phy_vars_eNB->frame,(smbv_frame_cnt*10) + (next_slot>>1),smbv_alloc_cnt); - smbv_configure_datalist_for_user(smbv_fname, UE_id+1, DLSCH_pdu, input_buffer_length); - } + // Configures the data source of allocation (allocation is configured by DCI) + if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) { + msg("[SMBV] Frame %3d, Configuring PDSCH payload in SF %d alloc %d\n",phy_vars_eNB->frame,(smbv_frame_cnt*10) + (next_slot>>1),smbv_alloc_cnt); + smbv_configure_datalist_for_user(smbv_fname, UE_id+1, DLSCH_pdu, input_buffer_length); + } #endif #ifdef DEBUG_PHY_PROC #ifdef DEBUG_DLSCH - LOG_T(PHY,"eNB DLSCH SDU: \n"); - for (i=0;i<phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->TBS>>3;i++) - LOG_T(PHY,"%x.",(u8)DLSCH_pdu[i]); - LOG_T(PHY,"\n"); + LOG_T(PHY,"eNB DLSCH SDU: \n"); + for (i=0;i<phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->TBS>>3;i++) + LOG_T(PHY,"%x.",(u8)DLSCH_pdu[i]); + LOG_T(PHY,"\n"); #endif #endif - } - else { - phy_vars_eNB->eNB_UE_stats[(u32)UE_id].dlsch_trials[phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->round]++; + } + else { + phy_vars_eNB->eNB_UE_stats[(u32)UE_id].dlsch_trials[phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->round]++; #ifdef DEBUG_PHY_PROC #ifdef DEBUG_DLSCH - LOG_D(PHY,"[eNB] This DLSCH is a retransmission\n"); -#endif -#endif - } - if (abstraction_flag==0) { - - // 36-212 - dlsch_encoding(DLSCH_pdu, - &phy_vars_eNB->lte_frame_parms, - num_pdcch_symbols, - phy_vars_eNB->dlsch_eNB[(u8)UE_id][0], - phy_vars_eNB->frame,next_slot>>1, - &phy_vars_eNB->dlsch_rate_matching_stats, - &phy_vars_eNB->dlsch_turbo_encoding_stats, - &phy_vars_eNB->dlsch_interleaving_stats); - // 36-211 - dlsch_scrambling(&phy_vars_eNB->lte_frame_parms, - 0, - phy_vars_eNB->dlsch_eNB[(u8)UE_id][0], - get_G(&phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->nb_rb, - phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->rb_alloc, - get_Qm(phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->mcs), - num_pdcch_symbols,phy_vars_eNB->frame,next_slot>>1), - 0, - next_slot); - for (sect_id=0;sect_id<number_of_cards;sect_id++) { - - /* if ((phy_vars_eNB->transmission_mode[(u8)UE_id] == 5) && + LOG_D(PHY,"[eNB] This DLSCH is a retransmission\n"); +#endif +#endif + } + if (abstraction_flag==0) { + + // 36-212 + start_meas(&phy_vars_eNB->dlsch_encoding_stats); + dlsch_encoding(DLSCH_pdu, + &phy_vars_eNB->lte_frame_parms, + num_pdcch_symbols, + phy_vars_eNB->dlsch_eNB[(u8)UE_id][0], + phy_vars_eNB->frame,next_slot>>1, + &phy_vars_eNB->dlsch_rate_matching_stats, + &phy_vars_eNB->dlsch_turbo_encoding_stats, + &phy_vars_eNB->dlsch_interleaving_stats); + stop_meas(&phy_vars_eNB->dlsch_encoding_stats); + // 36-211 + start_meas(&phy_vars_eNB->dlsch_scrambling_stats); + dlsch_scrambling(&phy_vars_eNB->lte_frame_parms, + 0, + phy_vars_eNB->dlsch_eNB[(u8)UE_id][0], + get_G(&phy_vars_eNB->lte_frame_parms, + phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->nb_rb, + phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->rb_alloc, + get_Qm(phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->mcs), + num_pdcch_symbols,phy_vars_eNB->frame,next_slot>>1), + 0, + next_slot); + stop_meas(&phy_vars_eNB->dlsch_scrambling_stats); + start_meas(&phy_vars_eNB->dlsch_modulation_stats); + for (sect_id=0;sect_id<number_of_cards;sect_id++) { + + /* if ((phy_vars_eNB->transmission_mode[(u8)UE_id] == 5) && (phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->dl_power_off == 0)) amp = (s16)(((s32)AMP*(s32)ONE_OVER_SQRT2_Q15)>>15); else*/ - // amp = AMP; - // if (UE_id == 1) - // LOG_I(PHY,"[MYEMOS] MCS_i %d\n", phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->mcs); - - re_allocated = dlsch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], - AMP, - next_slot/2, - &phy_vars_eNB->lte_frame_parms, - num_pdcch_symbols, - phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]); - } - } + // amp = AMP; + // if (UE_id == 1) + // LOG_I(PHY,"[MYEMOS] MCS_i %d\n", phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->mcs); + + re_allocated = dlsch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], + AMP, + next_slot/2, + &phy_vars_eNB->lte_frame_parms, + num_pdcch_symbols, + phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]); + } + stop_meas(&phy_vars_eNB->dlsch_modulation_stats); + } #ifdef PHY_ABSTRACTION - else { - dlsch_encoding_emul(phy_vars_eNB, - DLSCH_pdu, - phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]); - } -#endif - phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->active = 0; - - //mac_xface->macphy_exit("first dlsch transmitted\n"); - } - - else if ((phy_vars_eNB->dlsch_eNB[(u8)UE_id][0])&& - (phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->rnti>0)&& - (phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->active == 0)) { + else { + start_meas(&phy_vars_eNB->dlsch_encoding_stats); + dlsch_encoding_emul(phy_vars_eNB, + DLSCH_pdu, + phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]); + stop_meas(&phy_vars_eNB->dlsch_encoding_stats); + } +#endif + phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->active = 0; + + //mac_xface->macphy_exit("first dlsch transmitted\n"); + } - // clear subframe TX flag since UE is not scheduled for PDSCH in this subframe (so that we don't look for PUCCH later) - phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->subframe_tx[next_slot>>1]=0; + else if ((phy_vars_eNB->dlsch_eNB[(u8)UE_id][0])&& + (phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->rnti>0)&& + (phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->active == 0)) { + + // clear subframe TX flag since UE is not scheduled for PDSCH in this subframe (so that we don't look for PUCCH later) + phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->subframe_tx[next_slot>>1]=0; #ifdef DEBUG_PHY_PROC - //LOG_D(PHY,"[eNB %d] DCI: Clearing subframe_tx for subframe %d, UE %d\n",phy_vars_eNB->Mod_id,next_slot>>1,UE_id); + //LOG_D(PHY,"[eNB %d] DCI: Clearing subframe_tx for subframe %d, UE %d\n",phy_vars_eNB->Mod_id,next_slot>>1,UE_id); #endif - } - } - + } + } + - // if we have PHICH to generate - // printf("[PHY][eNB] Frame %d subframe %d Checking for phich\n",phy_vars_eNB->frame,next_slot>>1); - if (is_phich_subframe(&phy_vars_eNB->lte_frame_parms,next_slot>>1)) { + // if we have PHICH to generate + // printf("[PHY][eNB] Frame %d subframe %d Checking for phich\n",phy_vars_eNB->frame,next_slot>>1); + if (is_phich_subframe(&phy_vars_eNB->lte_frame_parms,next_slot>>1)) { #ifdef DEBUG_PHY_PROC - // LOG_D(PHY,"[eNB %d] Frame %d, subframe %d: Calling generate_phich_top\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot>>1); -#endif - for (sect_id=0;sect_id<number_of_cards;sect_id++) { - generate_phich_top(phy_vars_eNB, - next_slot>>1, - AMP, - sect_id, - abstraction_flag); - } - } + // LOG_D(PHY,"[eNB %d] Frame %d, subframe %d: Calling generate_phich_top\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot>>1); +#endif + for (sect_id=0;sect_id<number_of_cards;sect_id++) { + generate_phich_top(phy_vars_eNB, + next_slot>>1, + AMP, + sect_id, + abstraction_flag); + } } - + } + #ifdef EMOS - phy_procedures_emos_eNB_TX(next_slot, phy_vars_eNB); + phy_procedures_emos_eNB_TX(next_slot, phy_vars_eNB); #endif } vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX,0); + stop_meas(&phy_vars_eNB->phy_proc_tx); + } void process_Msg3(PHY_VARS_eNB *phy_vars_eNB,u8 last_slot,u8 UE_id, u8 harq_pid) { - // this prepares the demodulation of the first PUSCH of a new user, containing Msg3 + // this prepares the demodulation of the first PUSCH of a new user, containing Msg3 int frame = ((last_slot>>1)>=8 ? -1 : 0) + phy_vars_eNB->frame; LOG_D(PHY,"[eNB %d][RAPROC] frame %d : subframe %d (last_slot %d): process_Msg3 UE_id %d (active %d, subframe %d, frame %d)\n", - phy_vars_eNB->Mod_id, - frame,last_slot>>1,last_slot, - UE_id,phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_active, - phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_subframe, - phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_frame); + phy_vars_eNB->Mod_id, + frame,last_slot>>1,last_slot, + UE_id,phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_active, + phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_subframe, + phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_frame); phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_flag = 0; - + if ((phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_active == 1) && ((last_slot%2)==1) && (phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_subframe == (last_slot>>1)) && (phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_frame == frame)) { - - // harq_pid = 0; - - phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_active = 0; - phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_flag = 1; - phy_vars_eNB->ulsch_eNB[(u32)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag=1; - LOG_D(PHY,"[eNB %d][RAPROC] frame %d, slot %d, subframe %d: Setting subframe_scheduling_flag (Msg3) for UE %d\n", - phy_vars_eNB->Mod_id, - frame,last_slot,last_slot>>1,UE_id); + + // harq_pid = 0; + + phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_active = 0; + phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_flag = 1; + phy_vars_eNB->ulsch_eNB[(u32)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag=1; + LOG_D(PHY,"[eNB %d][RAPROC] frame %d, slot %d, subframe %d: Setting subframe_scheduling_flag (Msg3) for UE %d\n", + phy_vars_eNB->Mod_id, + frame,last_slot,last_slot>>1,UE_id); } } @@ -2124,12 +2143,12 @@ void process_Msg3(PHY_VARS_eNB *phy_vars_eNB,u8 last_slot,u8 UE_id, u8 harq_pid) // rate-adaptation based on the error statistics derived from the ACK/NAK process void process_HARQ_feedback(u8 UE_id, - u8 subframe, - PHY_VARS_eNB *phy_vars_eNB, - u8 pusch_flag, - u8 *pucch_payload, - u8 pucch_sel, - u8 SR_payload) { + u8 subframe, + PHY_VARS_eNB *phy_vars_eNB, + u8 pusch_flag, + u8 *pucch_payload, + u8 pucch_sel, + u8 SR_payload) { u8 dl_harq_pid[8],dlsch_ACK[8],j,dl_subframe; LTE_eNB_DLSCH_t *dlsch = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]; @@ -2141,222 +2160,222 @@ void process_HARQ_feedback(u8 UE_id, int frame = ((subframe>=8) ? -1 : 0) + phy_vars_eNB->frame; if (phy_vars_eNB->lte_frame_parms.frame_type == 0){ //FDD - subframe_m4 = (subframe<4) ? subframe+6 : subframe-4; + subframe_m4 = (subframe<4) ? subframe+6 : subframe-4; - dl_harq_pid[0] = dlsch->harq_ids[subframe_m4]; - M=1; - if (pusch_flag == 1) - dlsch_ACK[0] = phy_vars_eNB->ulsch_eNB[(u8)UE_id]->o_ACK[0]; - else - dlsch_ACK[0] = pucch_payload[0]; - LOG_D(PHY,"[eNB %d] Frame %d: Received ACK/NAK %d for subframe %d\n",phy_vars_eNB->Mod_id, - frame,dlsch_ACK[0],subframe_m4); + dl_harq_pid[0] = dlsch->harq_ids[subframe_m4]; + M=1; + if (pusch_flag == 1) + dlsch_ACK[0] = phy_vars_eNB->ulsch_eNB[(u8)UE_id]->o_ACK[0]; + else + dlsch_ACK[0] = pucch_payload[0]; + LOG_D(PHY,"[eNB %d] Frame %d: Received ACK/NAK %d for subframe %d\n",phy_vars_eNB->Mod_id, + frame,dlsch_ACK[0],subframe_m4); } else { // TDD Handle M=1,2 cases only + + M=ul_ACK_subframe2_M(&phy_vars_eNB->lte_frame_parms, + subframe); + // Now derive ACK information for TDD + if (pusch_flag == 1) { // Do PUSCH ACK/NAK first + // detect missing DAI + //FK: this code is just a guess + //RK: not exactly, yes if scheduled from PHICH (i.e. no DCI format 0) + // otherwise, it depends on how many of the PDSCH in the set are scheduled, we can leave it like this, + // but we have to adapt the code below. For example, if only one out of 2 are scheduled, only 1 bit o_ACK is used + + dlsch_ACK[0] = phy_vars_eNB->ulsch_eNB[(u8)UE_id]->o_ACK[0]; + dlsch_ACK[1] = phy_vars_eNB->ulsch_eNB[(u8)UE_id]->o_ACK[1]; + // printf("UE %d: ACK %d,%d\n",UE_id,dlsch_ACK[0],dlsch_ACK[1]); + } - M=ul_ACK_subframe2_M(&phy_vars_eNB->lte_frame_parms, - subframe); - // Now derive ACK information for TDD - if (pusch_flag == 1) { // Do PUSCH ACK/NAK first - // detect missing DAI - //FK: this code is just a guess - //RK: not exactly, yes if scheduled from PHICH (i.e. no DCI format 0) - // otherwise, it depends on how many of the PDSCH in the set are scheduled, we can leave it like this, - // but we have to adapt the code below. For example, if only one out of 2 are scheduled, only 1 bit o_ACK is used - - dlsch_ACK[0] = phy_vars_eNB->ulsch_eNB[(u8)UE_id]->o_ACK[0]; - dlsch_ACK[1] = phy_vars_eNB->ulsch_eNB[(u8)UE_id]->o_ACK[1]; - // printf("UE %d: ACK %d,%d\n",UE_id,dlsch_ACK[0],dlsch_ACK[1]); - } - - else { // PUCCH ACK/NAK - if ((SR_payload == 1)&&(pucch_sel!=2)) { // decode Table 7.3 if multiplexing and SR=1 - nb_ACK = 0; - if (M == 2) { - if ((pucch_payload[0] == 1) && (pucch_payload[1] == 1)) // b[0],b[1] - nb_ACK = 1; - else if ((pucch_payload[0] == 1) && (pucch_payload[1] == 0)) - nb_ACK = 2; - } - else if (M == 3) { - if ((pucch_payload[0] == 1) && (pucch_payload[1] == 1)) - nb_ACK = 1; - else if ((pucch_payload[0] == 1) && (pucch_payload[1] == 0)) - nb_ACK = 2; - else if ((pucch_payload[0] == 0) && (pucch_payload[1] == 1)) - nb_ACK = 3; - } - } - else if (pucch_sel == 2) { // bundling or M=1 - // printf("*** (%d,%d)\n",pucch_payload[0],pucch_payload[1]); - dlsch_ACK[0] = pucch_payload[0]; - dlsch_ACK[1] = pucch_payload[0]; - } - else { // multiplexing with no SR, this is table 10.1 - if (M==1) - dlsch_ACK[0] = pucch_payload[0]; - else if (M==2) { - if (((pucch_sel == 1) && (pucch_payload[0] == 1) && (pucch_payload[1] == 1)) || - ((pucch_sel == 0) && (pucch_payload[0] == 0) && (pucch_payload[1] == 1))) - dlsch_ACK[0] = 1; - else - dlsch_ACK[0] = 0; - - if (((pucch_sel == 1) && (pucch_payload[0] == 1) && (pucch_payload[1] == 1)) || - ((pucch_sel == 1) && (pucch_payload[0] == 0) && (pucch_payload[1] == 0))) - dlsch_ACK[1] = 1; - else - dlsch_ACK[1] = 0; - } - } + else { // PUCCH ACK/NAK + if ((SR_payload == 1)&&(pucch_sel!=2)) { // decode Table 7.3 if multiplexing and SR=1 + nb_ACK = 0; + if (M == 2) { + if ((pucch_payload[0] == 1) && (pucch_payload[1] == 1)) // b[0],b[1] + nb_ACK = 1; + else if ((pucch_payload[0] == 1) && (pucch_payload[1] == 0)) + nb_ACK = 2; + } + else if (M == 3) { + if ((pucch_payload[0] == 1) && (pucch_payload[1] == 1)) + nb_ACK = 1; + else if ((pucch_payload[0] == 1) && (pucch_payload[1] == 0)) + nb_ACK = 2; + else if ((pucch_payload[0] == 0) && (pucch_payload[1] == 1)) + nb_ACK = 3; + } + } + else if (pucch_sel == 2) { // bundling or M=1 + // printf("*** (%d,%d)\n",pucch_payload[0],pucch_payload[1]); + dlsch_ACK[0] = pucch_payload[0]; + dlsch_ACK[1] = pucch_payload[0]; + } + else { // multiplexing with no SR, this is table 10.1 + if (M==1) + dlsch_ACK[0] = pucch_payload[0]; + else if (M==2) { + if (((pucch_sel == 1) && (pucch_payload[0] == 1) && (pucch_payload[1] == 1)) || + ((pucch_sel == 0) && (pucch_payload[0] == 0) && (pucch_payload[1] == 1))) + dlsch_ACK[0] = 1; + else + dlsch_ACK[0] = 0; + + if (((pucch_sel == 1) && (pucch_payload[0] == 1) && (pucch_payload[1] == 1)) || + ((pucch_sel == 1) && (pucch_payload[0] == 0) && (pucch_payload[1] == 0))) + dlsch_ACK[1] = 1; + else + dlsch_ACK[1] = 0; + } } + } } // handle case where positive SR was transmitted with multiplexing if ((SR_payload == 1)&&(pucch_sel!=2)&&(pusch_flag == 0)) { - nb_alloc = 0; - for (m=0;m<M;m++) { - dl_subframe = ul_ACK_subframe2_dl_subframe(&phy_vars_eNB->lte_frame_parms, - subframe, - m); - - if (dlsch->subframe_tx[dl_subframe]==1) - nb_alloc++; - } - if (nb_alloc == nb_ACK) - all_ACKed = 1; - else - all_ACKed = 0; + nb_alloc = 0; + for (m=0;m<M;m++) { + dl_subframe = ul_ACK_subframe2_dl_subframe(&phy_vars_eNB->lte_frame_parms, + subframe, + m); + + if (dlsch->subframe_tx[dl_subframe]==1) + nb_alloc++; + } + if (nb_alloc == nb_ACK) + all_ACKed = 1; + else + all_ACKed = 0; - // printf("nb_alloc %d, all_ACKed %d\n",nb_alloc,all_ACKed); + // printf("nb_alloc %d, all_ACKed %d\n",nb_alloc,all_ACKed); } for (m=0,mp=-1;m<M;m++) { - dl_subframe = ul_ACK_subframe2_dl_subframe(&phy_vars_eNB->lte_frame_parms, - subframe, - m); - - if (dlsch->subframe_tx[dl_subframe]==1) { - if (pusch_flag == 1) - mp++; - else - mp = m; - - dl_harq_pid[m] = dlsch->harq_ids[dl_subframe]; - - if ((pucch_sel != 2)&&(pusch_flag == 0)) { // multiplexing - if ((SR_payload == 1)&&(all_ACKed == 1)) - dlsch_ACK[m] = 1; - else - dlsch_ACK[m] = 0; - } - if (dl_harq_pid[m]<dlsch->Mdlharq) { - dlsch_harq_proc = dlsch->harq_processes[dl_harq_pid[m]]; -#ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[eNB %d][PDSCH %x/%d] subframe %d, status %d, round %d (mcs %d, rv %d, TBS %d)\n",phy_vars_eNB->Mod_id, - dlsch->rnti,dl_harq_pid[m],dl_subframe, - dlsch_harq_proc->status,dlsch_harq_proc->round, - dlsch->harq_processes[dl_harq_pid[m]]->mcs, - dlsch->harq_processes[dl_harq_pid[m]]->rvidx, - dlsch->harq_processes[dl_harq_pid[m]]->TBS); - if (dlsch_harq_proc->status==DISABLED) - LOG_E(PHY,"dlsch_harq_proc is disabled? \n"); -#endif - if ((dl_harq_pid[m]<dlsch->Mdlharq) && - (dlsch_harq_proc->status == ACTIVE)) { - // dl_harq_pid of DLSCH is still active - - // msg("[PHY] eNB %d Process %d is active (%d)\n",phy_vars_eNB->Mod_id,dl_harq_pid[m],dlsch_ACK[m]); - if ( dlsch_ACK[mp]==0) { - // Received NAK -#ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[eNB %d][PDSCH %x/%d] NAK Received in round %d, requesting retransmission\n",phy_vars_eNB->Mod_id, - dlsch->rnti,dl_harq_pid[m],dlsch_harq_proc->round); -#endif + dl_subframe = ul_ACK_subframe2_dl_subframe(&phy_vars_eNB->lte_frame_parms, + subframe, + m); - // if (dlsch_harq_proc->round == 0) - ue_stats->dlsch_NAK[dlsch_harq_proc->round]++; + if (dlsch->subframe_tx[dl_subframe]==1) { + if (pusch_flag == 1) + mp++; + else + mp = m; - // then Increment DLSCH round index - dlsch_harq_proc->round++; + dl_harq_pid[m] = dlsch->harq_ids[dl_subframe]; - if (dlsch_harq_proc->round == dlsch->Mdlharq) { - // This was the last round for DLSCH so reset round and increment l2_error counter + if ((pucch_sel != 2)&&(pusch_flag == 0)) { // multiplexing + if ((SR_payload == 1)&&(all_ACKed == 1)) + dlsch_ACK[m] = 1; + else + dlsch_ACK[m] = 0; + } + if (dl_harq_pid[m]<dlsch->Mdlharq) { + dlsch_harq_proc = dlsch->harq_processes[dl_harq_pid[m]]; +#ifdef DEBUG_PHY_PROC + LOG_I(PHY,"[eNB %d][PDSCH %x/%d] subframe %d, status %d, round %d (mcs %d, rv %d, TBS %d)\n",phy_vars_eNB->Mod_id, + dlsch->rnti,dl_harq_pid[m],dl_subframe, + dlsch_harq_proc->status,dlsch_harq_proc->round, + dlsch->harq_processes[dl_harq_pid[m]]->mcs, + dlsch->harq_processes[dl_harq_pid[m]]->rvidx, + dlsch->harq_processes[dl_harq_pid[m]]->TBS); + if (dlsch_harq_proc->status==DISABLED) + LOG_E(PHY,"dlsch_harq_proc is disabled? \n"); +#endif + if ((dl_harq_pid[m]<dlsch->Mdlharq) && + (dlsch_harq_proc->status == ACTIVE)) { + // dl_harq_pid of DLSCH is still active + + // msg("[PHY] eNB %d Process %d is active (%d)\n",phy_vars_eNB->Mod_id,dl_harq_pid[m],dlsch_ACK[m]); + if ( dlsch_ACK[mp]==0) { + // Received NAK #ifdef DEBUG_PHY_PROC - LOG_W(PHY,"[eNB %d][PDSCH %x/%d] DLSCH retransmissions exhausted, dropping packet\n",phy_vars_eNB->Mod_id, - dlsch->rnti,dl_harq_pid[m]); + LOG_I(PHY,"[eNB %d][PDSCH %x/%d] NAK Received in round %d, requesting retransmission\n",phy_vars_eNB->Mod_id, + dlsch->rnti,dl_harq_pid[m],dlsch_harq_proc->round); +#endif + + // if (dlsch_harq_proc->round == 0) + ue_stats->dlsch_NAK[dlsch_harq_proc->round]++; + + // then Increment DLSCH round index + dlsch_harq_proc->round++; + + if (dlsch_harq_proc->round == dlsch->Mdlharq) { + // This was the last round for DLSCH so reset round and increment l2_error counter +#ifdef DEBUG_PHY_PROC + LOG_W(PHY,"[eNB %d][PDSCH %x/%d] DLSCH retransmissions exhausted, dropping packet\n",phy_vars_eNB->Mod_id, + dlsch->rnti,dl_harq_pid[m]); #endif - dlsch_harq_proc->round = 0; - ue_stats->dlsch_l2_errors++; - dlsch_harq_proc->status = SCH_IDLE; - dlsch->harq_ids[dl_subframe] = dlsch->Mdlharq; - } - } - else { + dlsch_harq_proc->round = 0; + ue_stats->dlsch_l2_errors++; + dlsch_harq_proc->status = SCH_IDLE; + dlsch->harq_ids[dl_subframe] = dlsch->Mdlharq; + } + } + else { #ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[eNB %d][PDSCH %x/%d] ACK Received in round %d, resetting process\n",phy_vars_eNB->Mod_id, - dlsch->rnti,dl_harq_pid[m],dlsch_harq_proc->round); + LOG_I(PHY,"[eNB %d][PDSCH %x/%d] ACK Received in round %d, resetting process\n",phy_vars_eNB->Mod_id, + dlsch->rnti,dl_harq_pid[m],dlsch_harq_proc->round); #endif - ue_stats->dlsch_ACK[dlsch_harq_proc->round]++; + ue_stats->dlsch_ACK[dlsch_harq_proc->round]++; - // Received ACK so set round to 0 and set dlsch_harq_pid IDLE - dlsch_harq_proc->round = 0; - dlsch_harq_proc->status = SCH_IDLE; - dlsch->harq_ids[dl_subframe] = dlsch->Mdlharq; + // Received ACK so set round to 0 and set dlsch_harq_pid IDLE + dlsch_harq_proc->round = 0; + dlsch_harq_proc->status = SCH_IDLE; + dlsch->harq_ids[dl_subframe] = dlsch->Mdlharq; - ue_stats->total_TBS = ue_stats->total_TBS + - phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS; - /* + ue_stats->total_TBS = ue_stats->total_TBS + + phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS; + /* ue_stats->total_transmitted_bits = ue_stats->total_transmitted_bits + phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS; - */ - } - - // Do fine-grain rate-adaptation for DLSCH - if (ue_stats->dlsch_NAK[0] > dlsch->error_threshold) { - if (ue_stats->dlsch_mcs_offset == 1) - ue_stats->dlsch_mcs_offset=0; - else - ue_stats->dlsch_mcs_offset=-1; - } + */ + } + + // Do fine-grain rate-adaptation for DLSCH + if (ue_stats->dlsch_NAK[0] > dlsch->error_threshold) { + if (ue_stats->dlsch_mcs_offset == 1) + ue_stats->dlsch_mcs_offset=0; + else + ue_stats->dlsch_mcs_offset=-1; + } #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[process_HARQ_feedback] Frame %d Setting round to %d for pid %d (subframe %d)\n",frame, - dlsch_harq_proc->round,dl_harq_pid[m],subframe); -#endif - - // Clear NAK stats and adjust mcs offset - // after measurement window timer expires - if ((ue_stats->dlsch_sliding_cnt == dlsch->ra_window_size) ) { - if ((ue_stats->dlsch_mcs_offset == 0) && (ue_stats->dlsch_NAK[0] < 2)) - ue_stats->dlsch_mcs_offset = 1; - if ((ue_stats->dlsch_mcs_offset == 1) && (ue_stats->dlsch_NAK[0] > 2)) - ue_stats->dlsch_mcs_offset = 0; - if ((ue_stats->dlsch_mcs_offset == 0) && (ue_stats->dlsch_NAK[0] > 2)) - ue_stats->dlsch_mcs_offset = -1; - if ((ue_stats->dlsch_mcs_offset == -1) && (ue_stats->dlsch_NAK[0] < 2)) - ue_stats->dlsch_mcs_offset = 0; - - for (j=0;j<phy_vars_eNB->dlsch_eNB[j][0]->Mdlharq;j++) - ue_stats->dlsch_NAK[j] = 0; - ue_stats->dlsch_sliding_cnt = 0; - } - - - } - } + LOG_D(PHY,"[process_HARQ_feedback] Frame %d Setting round to %d for pid %d (subframe %d)\n",frame, + dlsch_harq_proc->round,dl_harq_pid[m],subframe); +#endif + + // Clear NAK stats and adjust mcs offset + // after measurement window timer expires + if ((ue_stats->dlsch_sliding_cnt == dlsch->ra_window_size) ) { + if ((ue_stats->dlsch_mcs_offset == 0) && (ue_stats->dlsch_NAK[0] < 2)) + ue_stats->dlsch_mcs_offset = 1; + if ((ue_stats->dlsch_mcs_offset == 1) && (ue_stats->dlsch_NAK[0] > 2)) + ue_stats->dlsch_mcs_offset = 0; + if ((ue_stats->dlsch_mcs_offset == 0) && (ue_stats->dlsch_NAK[0] > 2)) + ue_stats->dlsch_mcs_offset = -1; + if ((ue_stats->dlsch_mcs_offset == -1) && (ue_stats->dlsch_NAK[0] < 2)) + ue_stats->dlsch_mcs_offset = 0; + + for (j=0;j<phy_vars_eNB->dlsch_eNB[j][0]->Mdlharq;j++) + ue_stats->dlsch_NAK[j] = 0; + ue_stats->dlsch_sliding_cnt = 0; + } + + + } } + } } } void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, - u8 UE_id, - u8 subframe, - s16 *n1_pucch0, - s16 *n1_pucch1, - s16 *n1_pucch2, - s16 *n1_pucch3) { + u8 UE_id, + u8 subframe, + s16 *n1_pucch0, + s16 *n1_pucch1, + s16 *n1_pucch2, + s16 *n1_pucch3) { LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms; u8 nCCE0,nCCE1; @@ -2364,143 +2383,143 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, int frame = ((subframe>=8) ? -1 : 0) + phy_vars_eNB->frame; if (frame_parms->frame_type == FDD ) { - sf = (subframe<4) ? (subframe+6) : (subframe-4); - // printf("n1_pucch_eNB: subframe %d, nCCE %d\n",sf,phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[sf]); + sf = (subframe<4) ? (subframe+6) : (subframe-4); + // printf("n1_pucch_eNB: subframe %d, nCCE %d\n",sf,phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[sf]); - if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[sf]>0) { - *n1_pucch0 = frame_parms->pucch_config_common.n1PUCCH_AN + phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[sf]; - *n1_pucch1 = -1; - } - else { - *n1_pucch0 = -1; - *n1_pucch1 = -1; - } + if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[sf]>0) { + *n1_pucch0 = frame_parms->pucch_config_common.n1PUCCH_AN + phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[sf]; + *n1_pucch1 = -1; + } + else { + *n1_pucch0 = -1; + *n1_pucch1 = -1; + } } else { - switch (frame_parms->tdd_config) { - case 1: // DL:S:UL:UL:DL:DL:S:UL:UL:DL - if (subframe == 2) { // ACK subframes 5 and 6 - /* if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[6]>0) { + switch (frame_parms->tdd_config) { + case 1: // DL:S:UL:UL:DL:DL:S:UL:UL:DL + if (subframe == 2) { // ACK subframes 5 and 6 + /* if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[6]>0) { nCCE1 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[6]; - *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; + *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; } else - *n1_pucch1 = -1;*/ - - if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[5]>0) { - nCCE0 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[5]; - *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN; - } - else - *n1_pucch0 = -1; + *n1_pucch1 = -1;*/ - *n1_pucch1 = -1; - } - else if (subframe == 3) { // ACK subframe 9 - - if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[9]>0) { - nCCE0 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[9]; - *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN; - } - else - *n1_pucch0 = -1; + if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[5]>0) { + nCCE0 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[5]; + *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN; + } + else + *n1_pucch0 = -1; - *n1_pucch1 = -1; + *n1_pucch1 = -1; + } + else if (subframe == 3) { // ACK subframe 9 + + if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[9]>0) { + nCCE0 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[9]; + *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN; + } + else + *n1_pucch0 = -1; - } - else if (subframe == 7) { // ACK subframes 0 and 1 - //harq_ack[0].nCCE; - //harq_ack[1].nCCE; - if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[0]>0) { - nCCE0 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[0]; - *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 + frame_parms->pucch_config_common.n1PUCCH_AN; - } - else - *n1_pucch0 = -1; + *n1_pucch1 = -1; + + } + else if (subframe == 7) { // ACK subframes 0 and 1 + //harq_ack[0].nCCE; + //harq_ack[1].nCCE; + if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[0]>0) { + nCCE0 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[0]; + *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 + frame_parms->pucch_config_common.n1PUCCH_AN; + } + else + *n1_pucch0 = -1; - *n1_pucch1 = -1; - } - else if (subframe == 8) { // ACK subframes 4 - //harq_ack[4].nCCE; - if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[4]>0) { - nCCE0 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[4]; - *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 + frame_parms->pucch_config_common.n1PUCCH_AN; - } - else - *n1_pucch0 = -1; + *n1_pucch1 = -1; + } + else if (subframe == 8) { // ACK subframes 4 + //harq_ack[4].nCCE; + if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[4]>0) { + nCCE0 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[4]; + *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 + frame_parms->pucch_config_common.n1PUCCH_AN; + } + else + *n1_pucch0 = -1; - *n1_pucch1 = -1; - } - else { - LOG_D(PHY,"[eNB %d] frame %d: phy_procedures_lte.c: get_n1pucch, illegal subframe %d for tdd_config %d\n", - phy_vars_eNB->Mod_id, - frame, - subframe,frame_parms->tdd_config); - return; - } - break; - case 3: // DL:S:UL:UL:UL:DL:DL:DL:DL:DL - if (subframe == 2) { // ACK subframes 5,6 and 1 (S in frame-2), forget about n-11 for the moment (S-subframe) - if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[6]>0) { - nCCE1 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[6]; - *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; - } - else - *n1_pucch1 = -1; + *n1_pucch1 = -1; + } + else { + LOG_D(PHY,"[eNB %d] frame %d: phy_procedures_lte.c: get_n1pucch, illegal subframe %d for tdd_config %d\n", + phy_vars_eNB->Mod_id, + frame, + subframe,frame_parms->tdd_config); + return; + } + break; + case 3: // DL:S:UL:UL:UL:DL:DL:DL:DL:DL + if (subframe == 2) { // ACK subframes 5,6 and 1 (S in frame-2), forget about n-11 for the moment (S-subframe) + if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[6]>0) { + nCCE1 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[6]; + *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; + } + else + *n1_pucch1 = -1; - if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[5]>0) { - nCCE0 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[5]; - *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN; - } - else - *n1_pucch0 = -1; - } - else if (subframe == 3) { // ACK subframes 7 and 8 - LOG_D(PHY,"get_n1_pucch_eNB : subframe 3, subframe_tx[7] %d, subframe_tx[8] %d\n", - phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[7],phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[8]); - - if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[8]>0) { - nCCE1 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[8]; - *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; - LOG_D(PHY,"nCCE1 %d, n1_pucch1 %d\n",nCCE1,*n1_pucch1); - } - else - *n1_pucch1 = -1; + if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[5]>0) { + nCCE0 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[5]; + *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN; + } + else + *n1_pucch0 = -1; + } + else if (subframe == 3) { // ACK subframes 7 and 8 + LOG_D(PHY,"get_n1_pucch_eNB : subframe 3, subframe_tx[7] %d, subframe_tx[8] %d\n", + phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[7],phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[8]); + + if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[8]>0) { + nCCE1 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[8]; + *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; + LOG_D(PHY,"nCCE1 %d, n1_pucch1 %d\n",nCCE1,*n1_pucch1); + } + else + *n1_pucch1 = -1; - if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[7]>0) { - nCCE0 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[7]; - *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN; - LOG_D(PHY,"nCCE0 %d, n1_pucch0 %d\n",nCCE0,*n1_pucch0); - } - else - *n1_pucch0 = -1; - } - else if (subframe == 4) { // ACK subframes 9 and 0 - if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[0]>0) { - nCCE1 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[0]; - *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; - } - else - *n1_pucch1 = -1; + if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[7]>0) { + nCCE0 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[7]; + *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN; + LOG_D(PHY,"nCCE0 %d, n1_pucch0 %d\n",nCCE0,*n1_pucch0); + } + else + *n1_pucch0 = -1; + } + else if (subframe == 4) { // ACK subframes 9 and 0 + if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[0]>0) { + nCCE1 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[0]; + *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; + } + else + *n1_pucch1 = -1; - if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[9]>0) { - nCCE0 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[9]; - *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN; - } - else - *n1_pucch0 = -1; - } - else { - LOG_D(PHY,"[eNB %d] Frame %d: phy_procedures_lte.c: get_n1pucch, illegal subframe %d for tdd_config %d\n", - phy_vars_eNB->Mod_id,frame,subframe,frame_parms->tdd_config); - return; - } - break; - } // switch tdd_config - // Don't handle the case M>2 - *n1_pucch2 = -1; - *n1_pucch3 = -1; + if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[9]>0) { + nCCE0 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[9]; + *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN; + } + else + *n1_pucch0 = -1; + } + else { + LOG_D(PHY,"[eNB %d] Frame %d: phy_procedures_lte.c: get_n1pucch, illegal subframe %d for tdd_config %d\n", + phy_vars_eNB->Mod_id,frame,subframe,frame_parms->tdd_config); + return; + } + break; + } // switch tdd_config + // Don't handle the case M>2 + *n1_pucch2 = -1; + *n1_pucch3 = -1; } } @@ -2516,44 +2535,44 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,u8 subframe,u8 abstraction_flag memset(&preamble_energy_list[0],0,64*sizeof(u16)); memset(&preamble_delay_list[0],0,64*sizeof(u16)); if (abstraction_flag == 0) { - // LOG_I(PHY,"[eNB %d][RAPROC] Frame %d, Subframe %d : PRACH RX Signal Power : %d dBm\n",phy_vars_eNB->Mod_id, - // frame,subframe,dB_fixed(signal_energy(&phy_vars_eNB->lte_eNB_common_vars.rxdata[0][0][subframe*phy_vars_eNB->lte_frame_parms.samples_per_tti],512)) - phy_vars_eNB->rx_total_gain_eNB_dB); + // LOG_I(PHY,"[eNB %d][RAPROC] Frame %d, Subframe %d : PRACH RX Signal Power : %d dBm\n",phy_vars_eNB->Mod_id, + // frame,subframe,dB_fixed(signal_energy(&phy_vars_eNB->lte_eNB_common_vars.rxdata[0][0][subframe*phy_vars_eNB->lte_frame_parms.samples_per_tti],512)) - phy_vars_eNB->rx_total_gain_eNB_dB); - // LOG_I(PHY,"[eNB %d][RAPROC] PRACH: rootSequenceIndex %d, prach_ConfigIndex %d, zeroCorrelationZoneConfig %d, highSpeedFlag %d, prach_FreqOffset %d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex,phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex, phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig,phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag,phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset); + // LOG_I(PHY,"[eNB %d][RAPROC] PRACH: rootSequenceIndex %d, prach_ConfigIndex %d, zeroCorrelationZoneConfig %d, highSpeedFlag %d, prach_FreqOffset %d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex,phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex, phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig,phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag,phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset); - rx_prach(phy_vars_eNB, - subframe, - preamble_energy_list, - preamble_delay_list, - frame, - 0); + rx_prach(phy_vars_eNB, + subframe, + preamble_energy_list, + preamble_delay_list, + frame, + 0); } else { - for (UE_id=0;UE_id<NB_UE_INST;UE_id++) { - - LOG_D(PHY,"[RAPROC] UE_id %d (%p), generate_prach %d, UE RSI %d, eNB RSI %d preamble index %d\n", - UE_id,PHY_vars_UE_g[UE_id],PHY_vars_UE_g[UE_id]->generate_prach, - PHY_vars_UE_g[UE_id]->lte_frame_parms.prach_config_common.rootSequenceIndex, - phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex, - PHY_vars_UE_g[UE_id]->prach_PreambleIndex); - - if ((PHY_vars_UE_g[UE_id]->generate_prach==1) && - (PHY_vars_UE_g[UE_id]->lte_frame_parms.prach_config_common.rootSequenceIndex == - phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex) ) { - preamble_energy_list[PHY_vars_UE_g[UE_id]->prach_PreambleIndex] = 80; - preamble_delay_list[PHY_vars_UE_g[UE_id]->prach_PreambleIndex] = 5; - - } + for (UE_id=0;UE_id<NB_UE_INST;UE_id++) { + + LOG_D(PHY,"[RAPROC] UE_id %d (%p), generate_prach %d, UE RSI %d, eNB RSI %d preamble index %d\n", + UE_id,PHY_vars_UE_g[UE_id],PHY_vars_UE_g[UE_id]->generate_prach, + PHY_vars_UE_g[UE_id]->lte_frame_parms.prach_config_common.rootSequenceIndex, + phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex, + PHY_vars_UE_g[UE_id]->prach_PreambleIndex); + + if ((PHY_vars_UE_g[UE_id]->generate_prach==1) && + (PHY_vars_UE_g[UE_id]->lte_frame_parms.prach_config_common.rootSequenceIndex == + phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex) ) { + preamble_energy_list[PHY_vars_UE_g[UE_id]->prach_PreambleIndex] = 80; + preamble_delay_list[PHY_vars_UE_g[UE_id]->prach_PreambleIndex] = 5; + } + } } preamble_energy_max = preamble_energy_list[0]; preamble_max = 0; for (i=1;i<64;i++) { - if (preamble_energy_max < preamble_energy_list[i]) { - preamble_energy_max = preamble_energy_list[i]; - preamble_max = i; - } + if (preamble_energy_max < preamble_energy_list[i]) { + preamble_energy_max = preamble_energy_list[i]; + preamble_max = i; + } } #ifdef DEBUG_PHY_PROC @@ -2564,28 +2583,28 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,u8 subframe,u8 abstraction_flag #endif if (preamble_energy_list[preamble_max] > 60) { - UE_id = find_next_ue_index(phy_vars_eNB); - if (UE_id>=0) { - phy_vars_eNB->eNB_UE_stats[(u32)UE_id].UE_timing_offset = preamble_delay_list[preamble_max]&0x1FFF; //limit to 13 (=11+2) bits - //phy_vars_eNb->eNB_UE_stats[(u32)UE_id].mode = PRACH; - phy_vars_eNB->eNB_UE_stats[(u32)UE_id].sector = 0; - LOG_I(PHY,"[eNB %d][RAPROC] Initiating RA procedure with preamble %d, energy %d, delay %d\n", - phy_vars_eNB->Mod_id, - preamble_max, - preamble_energy_max, - preamble_delay_list[preamble_max]); + UE_id = find_next_ue_index(phy_vars_eNB); + if (UE_id>=0) { + phy_vars_eNB->eNB_UE_stats[(u32)UE_id].UE_timing_offset = preamble_delay_list[preamble_max]&0x1FFF; //limit to 13 (=11+2) bits + //phy_vars_eNb->eNB_UE_stats[(u32)UE_id].mode = PRACH; + phy_vars_eNB->eNB_UE_stats[(u32)UE_id].sector = 0; + LOG_I(PHY,"[eNB %d][RAPROC] Initiating RA procedure with preamble %d, energy %d, delay %d\n", + phy_vars_eNB->Mod_id, + preamble_max, + preamble_energy_max, + preamble_delay_list[preamble_max]); #ifdef OPENAIR2 - mac_xface->initiate_ra_proc(phy_vars_eNB->Mod_id, - frame, - preamble_max, - preamble_delay_list[preamble_max], - 0,subframe,0); + mac_xface->initiate_ra_proc(phy_vars_eNB->Mod_id, + frame, + preamble_max, + preamble_delay_list[preamble_max], + 0,subframe,0); #endif - } - else { - LOG_D(PHY,"[eNB %d][RAPROC] frame %d, subframe %d: Unable to add user, max user count reached\n", - phy_vars_eNB->Mod_id,frame, subframe); - } + } + else { + LOG_D(PHY,"[eNB %d][RAPROC] frame %d, subframe %d: Unable to add user, max user count reached\n", + phy_vars_eNB->Mod_id,frame, subframe); + } } } @@ -2618,61 +2637,64 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 int frame = ((last_slot>>1)>=8 ? -1 : 0 )+ phy_vars_eNB->frame; vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,1); + start_meas(&phy_vars_eNB->phy_proc_rx); #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_RX(%d)\n",phy_vars_eNB->Mod_id,frame, last_slot); #endif if (abstraction_flag == 0) { - remove_7_5_kHz(phy_vars_eNB,last_slot-1); - remove_7_5_kHz(phy_vars_eNB,last_slot); + remove_7_5_kHz(phy_vars_eNB,last_slot-1); + remove_7_5_kHz(phy_vars_eNB,last_slot); } //#ifdef OPENAIR2 // check if we have to detect PRACH first if ((last_slot&1)==1){ - // printf("Checking PRACH for eNB %d, subframe %d\n",phy_vars_eNB->Mod_id,last_slot>>1); - if (is_prach_subframe(&phy_vars_eNB->lte_frame_parms,frame,last_slot>>1)>0) { - // printf("Running prach procedures\n"); - vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,1); - prach_procedures(phy_vars_eNB,last_slot>>1,abstraction_flag); - vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0); - } + // printf("Checking PRACH for eNB %d, subframe %d\n",phy_vars_eNB->Mod_id,last_slot>>1); + if (is_prach_subframe(&phy_vars_eNB->lte_frame_parms,frame,last_slot>>1)>0) { + // printf("Running prach procedures\n"); + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,1); + prach_procedures(phy_vars_eNB,last_slot>>1,abstraction_flag); + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0); + } } //#endif if (abstraction_flag == 0) { - for (l=0;l<phy_vars_eNB->lte_frame_parms.symbols_per_tti/2;l++) { - - for (sect_id=0;sect_id<number_of_cards;sect_id++) { - slot_fep_ul(&phy_vars_eNB->lte_frame_parms, - &phy_vars_eNB->lte_eNB_common_vars, - l, - last_slot, - sect_id, + start_meas(&phy_vars_eNB->ofdm_demod_stats); + for (l=0;l<phy_vars_eNB->lte_frame_parms.symbols_per_tti/2;l++) { + + for (sect_id=0;sect_id<number_of_cards;sect_id++) { + slot_fep_ul(&phy_vars_eNB->lte_frame_parms, + &phy_vars_eNB->lte_eNB_common_vars, + l, + last_slot, + sect_id, #ifdef HW_PREFIX_REMOVAL - 1 + 1 #else - 0 -#endif - ); - slot_fep_ul(&phy_vars_eNB->lte_frame_parms, - &phy_vars_eNB->lte_eNB_common_vars, - l, - last_slot-1, - sect_id, + 0 +#endif + ); + slot_fep_ul(&phy_vars_eNB->lte_frame_parms, + &phy_vars_eNB->lte_eNB_common_vars, + l, + last_slot-1, + sect_id, #ifdef HW_PREFIX_REMOVAL - 1 + 1 #else - 0 + 0 #endif - ); + ); - } } + } + stop_meas(&phy_vars_eNB->ofdm_demod_stats); } sect_id = 0; /* for (UE_id=0;UE_id<NUMBER_OF_UE_MAX;UE_id++) { - + if ((phy_vars_eNB->eNB_UE_stats[(u32)UE_id].mode>PRACH) && (last_slot%2==1)) { #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d] frame %d, slot %d: Doing SRS estimation and measurements for UE_id %d (UE_mode %d)\n", @@ -2681,7 +2703,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 UE_id,phy_vars_eNB->eNB_UE_stats[(u32)UE_id].mode); #endif for (sect_id=0;sect_id<number_of_cards;sect_id++) { - + lte_srs_channel_estimation(&phy_vars_eNB->lte_frame_parms, &phy_vars_eNB->lte_eNB_common_vars, &phy_vars_eNB->lte_eNB_srs_vars[(u32)UE_id], @@ -2700,13 +2722,13 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 phy_vars_eNB->PHY_measurements_eNB[sect_id].rx_rssi_dBm[(u32)UE_id]); #endif } - + sect_id=0; #ifdef USER_MODE //write_output("srs_est0.m","srsest0",phy_vars_eNB->lte_eNB_common_vars.srs_ch_estimates[0][0],512,1,1); //write_output("srs_est1.m","srsest1",phy_vars_eNB->lte_eNB_common_vars.srs_ch_estimates[0][1],512,1,1); #endif - + //msg("timing advance in\n"); sync_pos = lte_est_timing_advance(&phy_vars_eNB->lte_frame_parms, &phy_vars_eNB->lte_eNB_srs_vars[(u32)UE_id], @@ -2714,191 +2736,196 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 phy_vars_eNB->first_run_timing_advance[(u32)UE_id], number_of_cards, 24576); - + //msg("timing advance out\n"); - + //phy_vars_eNB->eNB_UE_stats[(u32)UE_id].UE_timing_offset = sync_pos - phy_vars_eNB->lte_frame_parms.nb_prefix_samples/8; phy_vars_eNB->eNB_UE_stats[(u32)UE_id].UE_timing_offset = 0; phy_vars_eNB->eNB_UE_stats[(u32)UE_id].sector = sect_id; - #ifdef DEBUG_PHY_PROC + #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d] frame %d, slot %d: user %d in sector %d: timing_advance = %d\n", phy_vars_eNB->Mod_id, - phy_vars_eNB->frame, last_slot, + phy_vars_eNB->frame, last_slot, UE_id, sect_id, phy_vars_eNB->eNB_UE_stats[(u32)UE_id].UE_timing_offset); #endif } } else { - + } - */ + */ // Check for active processes in current subframe harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms, - frame,last_slot>>1); + frame,last_slot>>1); // printf("[eNB][PUSCH] subframe %d => harq_pid %d\n",last_slot>>1,harq_pid); /* #ifdef OPENAIR2 - if ((phy_vars_eNB->eNB_UE_stats[0].mode == PUSCH) && + if ((phy_vars_eNB->eNB_UE_stats[0].mode == PUSCH) && (phy_vars_eNB->eNB_UE_stats[1].mode == PUSCH)) two_ues_connected = 1; #else two_ues_connected = 1; #endif - */ + */ pusch_active = 0; - // reset the cba flag used for collision detection + // reset the cba flag used for collision detection for (i=0; i < NUM_MAX_CBA_GROUP; i++){ - phy_vars_eNB->cba_last_reception[i]=0; + phy_vars_eNB->cba_last_reception[i]=0; } // LOG_I(PHY,"subframe %d: nPRS %d\n",last_slot>>1,phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[last_slot-1]); - - for (i=0;i<NUMBER_OF_UE_MAX;i++) { - - /* + + for (i=0;i<NUMBER_OF_UE_MAX;i++) { + + /* if ((i == 1) && (phy_vars_eNB->cooperation_flag > 0) && (two_ues_connected == 1)) break; - */ + */ #ifdef OPENAIR2 - if (phy_vars_eNB->eNB_UE_stats[i].mode == RA_RESPONSE) - process_Msg3(phy_vars_eNB,last_slot,i,harq_pid); + if (phy_vars_eNB->eNB_UE_stats[i].mode == RA_RESPONSE) + process_Msg3(phy_vars_eNB,last_slot,i,harq_pid); #endif - /* + /* #ifdef DEBUG_PHY_PROC if (phy_vars_eNB->ulsch_eNB[i]) { - + LOG_I(PHY,"[eNB %d][PUSCH %d] frame %d, subframe %d rnti %x, alloc %d\n",phy_vars_eNB->Mod_id, harq_pid,frame,last_slot>>1, (phy_vars_eNB->ulsch_eNB[i]->rnti), - (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag) + (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag) ); } #endif - */ - if ((phy_vars_eNB->ulsch_eNB[i]) && - (phy_vars_eNB->ulsch_eNB[i]->rnti>0) && - (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag==1) && - ((last_slot%2)==1)) { - - pusch_active = 1; - round = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round; + */ + if ((phy_vars_eNB->ulsch_eNB[i]) && + (phy_vars_eNB->ulsch_eNB[i]->rnti>0) && + (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag==1) && + ((last_slot%2)==1)) { + + pusch_active = 1; + round = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round; #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Scheduling PUSCH/ULSCH Reception for rnti %x\n", - phy_vars_eNB->Mod_id,harq_pid, - frame,last_slot>>1,phy_vars_eNB->ulsch_eNB[i]->rnti); + LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Scheduling PUSCH/ULSCH Reception for rnti %x\n", + phy_vars_eNB->Mod_id,harq_pid, + frame,last_slot>>1,phy_vars_eNB->ulsch_eNB[i]->rnti); #endif - + #ifdef DEBUG_PHY_PROC - if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1){ - LOG_D(PHY,"[eNB %d] frame %d, slot %d, subframe %d: Scheduling ULSCH Reception for Msg3 in Sector %d\n", - phy_vars_eNB->Mod_id, - frame, - last_slot,last_slot>>1, - phy_vars_eNB->eNB_UE_stats[i].sector); - } else { - LOG_D(PHY,"[eNB %d] frame %d, slot %d, subframe %d: Scheduling ULSCH Reception for UE %d Mode %s sect_id %d\n", - phy_vars_eNB->Mod_id, - frame, - last_slot,last_slot>>1, - i, - mode_string[phy_vars_eNB->eNB_UE_stats[i].mode], - phy_vars_eNB->eNB_UE_stats[i].sector); - } + if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1){ + LOG_D(PHY,"[eNB %d] frame %d, slot %d, subframe %d: Scheduling ULSCH Reception for Msg3 in Sector %d\n", + phy_vars_eNB->Mod_id, + frame, + last_slot,last_slot>>1, + phy_vars_eNB->eNB_UE_stats[i].sector); + } else { + LOG_D(PHY,"[eNB %d] frame %d, slot %d, subframe %d: Scheduling ULSCH Reception for UE %d Mode %s sect_id %d\n", + phy_vars_eNB->Mod_id, + frame, + last_slot,last_slot>>1, + i, + mode_string[phy_vars_eNB->eNB_UE_stats[i].mode], + phy_vars_eNB->eNB_UE_stats[i].sector); + } #endif - nPRS = phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[last_slot-1]; + nPRS = phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[last_slot-1]; - phy_vars_eNB->ulsch_eNB[i]->cyclicShift = (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2 + phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift + nPRS)%12; + phy_vars_eNB->ulsch_eNB[i]->cyclicShift = (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2 + phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift + nPRS)%12; - if (frame_parms->frame_type == FDD ) { - int subframe = last_slot >> 1; - int sf = (subframe<4) ? (subframe+6) : (subframe-4); + if (frame_parms->frame_type == FDD ) { + int subframe = last_slot >> 1; + int sf = (subframe<4) ? (subframe+6) : (subframe-4); - if (phy_vars_eNB->dlsch_eNB[i][0]->subframe_tx[sf]>0) { // we have downlink transmission - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 1; - } - else { - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 0; - } - } + if (phy_vars_eNB->dlsch_eNB[i][0]->subframe_tx[sf]>0) { // we have downlink transmission + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 1; + } + else { + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 0; + } + } #ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[eNB %d][PUSCH %d] Frame %d Subframe %d Demodulating PUSCH: dci_alloc %d, rar_alloc %d, round %d, first_rb %d, nb_rb %d, mcs %d, TBS %d, rv %d, cyclic_shift %d (n_DMRS2 %d, cyclicShift_common %d, nprs %d), O_ACK %d \n", - phy_vars_eNB->Mod_id,harq_pid,frame,last_slot>>1, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->dci_alloc, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rar_alloc, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->first_rb, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->mcs, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rvidx, - phy_vars_eNB->ulsch_eNB[i]->cyclicShift, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2, - phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift, - nPRS, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK); -#endif - if (abstraction_flag==0) { - rx_ulsch(phy_vars_eNB, - last_slot>>1, - phy_vars_eNB->eNB_UE_stats[i].sector, // this is the effective sector id - i, - phy_vars_eNB->ulsch_eNB, - 0); - } + LOG_I(PHY,"[eNB %d][PUSCH %d] Frame %d Subframe %d Demodulating PUSCH: dci_alloc %d, rar_alloc %d, round %d, first_rb %d, nb_rb %d, mcs %d, TBS %d, rv %d, cyclic_shift %d (n_DMRS2 %d, cyclicShift_common %d, nprs %d), O_ACK %d \n", + phy_vars_eNB->Mod_id,harq_pid,frame,last_slot>>1, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->dci_alloc, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rar_alloc, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->first_rb, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->mcs, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rvidx, + phy_vars_eNB->ulsch_eNB[i]->cyclicShift, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2, + phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift, + nPRS, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK); +#endif + start_meas(&phy_vars_eNB->ulsch_demodulation_stats); + if (abstraction_flag==0) { + rx_ulsch(phy_vars_eNB, + last_slot>>1, + phy_vars_eNB->eNB_UE_stats[i].sector, // this is the effective sector id + i, + phy_vars_eNB->ulsch_eNB, + 0); + } #ifdef PHY_ABSTRACTION - else { - rx_ulsch_emul(phy_vars_eNB, - last_slot>>1, - phy_vars_eNB->eNB_UE_stats[i].sector, // this is the effective sector id - i); - } + else { + rx_ulsch_emul(phy_vars_eNB, + last_slot>>1, + phy_vars_eNB->eNB_UE_stats[i].sector, // this is the effective sector id + i); + } #endif + stop_meas(&phy_vars_eNB->ulsch_demodulation_stats); - for (j=0;j<phy_vars_eNB->lte_frame_parms.nb_antennas_rx;j++) - phy_vars_eNB->eNB_UE_stats[i].UL_rssi[j] = dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[j]) - phy_vars_eNB->rx_total_gain_eNB_dB; - if (abstraction_flag == 0) { - ret = ulsch_decoding(phy_vars_eNB, - i, - last_slot>>1, - 0, // control_only_flag - 0, //Nbundled, to be updated!!!! - 0); - } + for (j=0;j<phy_vars_eNB->lte_frame_parms.nb_antennas_rx;j++) + phy_vars_eNB->eNB_UE_stats[i].UL_rssi[j] = dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[j]) - phy_vars_eNB->rx_total_gain_eNB_dB; + + start_meas(&phy_vars_eNB->ulsch_decoding_stats); + if (abstraction_flag == 0) { + ret = ulsch_decoding(phy_vars_eNB, + i, + last_slot>>1, + 0, // control_only_flag + 0, //Nbundled, to be updated!!!! + 0); + } #ifdef PHY_ABSTRACTION - else { - ret = ulsch_decoding_emul(phy_vars_eNB, - last_slot>>1, - i, - &rnti); - } + else { + ret = ulsch_decoding_emul(phy_vars_eNB, + last_slot>>1, + i, + &rnti); + } #endif + stop_meas(&phy_vars_eNB->ulsch_decoding_stats); #ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n", - phy_vars_eNB->Mod_id,harq_pid, - frame,last_slot>>1, - phy_vars_eNB->ulsch_eNB[i]->rnti, - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]), - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]), - phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0], - phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[1], - phy_vars_eNB->ulsch_eNB[i]->o_ACK[0], - phy_vars_eNB->ulsch_eNB[i]->o_ACK[1], - ret); + LOG_I(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n", + phy_vars_eNB->Mod_id,harq_pid, + frame,last_slot>>1, + phy_vars_eNB->ulsch_eNB[i]->rnti, + dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]), + dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]), + phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0], + phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[1], + phy_vars_eNB->ulsch_eNB[i]->o_ACK[0], + phy_vars_eNB->ulsch_eNB[i]->o_ACK[1], + ret); #endif //DEBUG_PHY_PROC - /* + /* if ((two_ues_connected==1) && (phy_vars_eNB->cooperation_flag==2)) { for (j=0;j<phy_vars_eNB->lte_frame_parms.nb_antennas_rx;j++) { - phy_vars_eNB->eNB_UE_stats[i].UL_rssi[j] = dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power_0[j]) + phy_vars_eNB->eNB_UE_stats[i].UL_rssi[j] = dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power_0[j]) - phy_vars_eNB->rx_total_gain_eNB_dB; - phy_vars_eNB->eNB_UE_stats[i+1].UL_rssi[j] = dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power_1[j]) + phy_vars_eNB->eNB_UE_stats[i+1].UL_rssi[j] = dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power_1[j]) - phy_vars_eNB->rx_total_gain_eNB_dB; } #ifdef DEBUG_PHY_PROC @@ -2911,684 +2938,688 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 #endif } else { - */ - for (j=0;j<phy_vars_eNB->lte_frame_parms.nb_antennas_rx;j++) - phy_vars_eNB->eNB_UE_stats[i].UL_rssi[j] = dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[j]) - - phy_vars_eNB->rx_total_gain_eNB_dB; + */ + for (j=0;j<phy_vars_eNB->lte_frame_parms.nb_antennas_rx;j++) + phy_vars_eNB->eNB_UE_stats[i].UL_rssi[j] = dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[j]) + - phy_vars_eNB->rx_total_gain_eNB_dB; #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d] Frame %d subframe %d: ULSCH %d RX power (%d,%d) dB\n", - phy_vars_eNB->Mod_id,frame,last_slot>>1,i, - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]), - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1])); + LOG_D(PHY,"[eNB %d] Frame %d subframe %d: ULSCH %d RX power (%d,%d) dB\n", + phy_vars_eNB->Mod_id,frame,last_slot>>1,i, + dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]), + dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1])); #endif - // } - - - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++; + // } + + + phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++; #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d Clearing subframe_scheduling_flag\n", - phy_vars_eNB->Mod_id,harq_pid,frame,last_slot>>1,i,harq_pid); + LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d Clearing subframe_scheduling_flag\n", + phy_vars_eNB->Mod_id,harq_pid,frame,last_slot>>1,i,harq_pid); #endif - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag=0; + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag=0; - if (phy_vars_eNB->ulsch_eNB[i]->cqi_crc_status == 1) { + if (phy_vars_eNB->ulsch_eNB[i]->cqi_crc_status == 1) { #ifdef DEBUG_PHY_PROC - //if (((phy_vars_eNB->frame%10) == 0) || (phy_vars_eNB->frame < 50)) - print_CQI(phy_vars_eNB->ulsch_eNB[i]->o,phy_vars_eNB->ulsch_eNB[i]->uci_format,0); + //if (((phy_vars_eNB->frame%10) == 0) || (phy_vars_eNB->frame < 50)) + print_CQI(phy_vars_eNB->ulsch_eNB[i]->o,phy_vars_eNB->ulsch_eNB[i]->uci_format,0); #endif - extract_CQI(phy_vars_eNB->ulsch_eNB[i]->o,phy_vars_eNB->ulsch_eNB[i]->uci_format,&phy_vars_eNB->eNB_UE_stats[i], &rnti, &access_mode); - phy_vars_eNB->eNB_UE_stats[i].rank = phy_vars_eNB->ulsch_eNB[i]->o_RI[0]; - } - - if (ret == (1+MAX_TURBO_ITERATIONS)) { - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 0; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round++; - - LOG_D(PHY,"[UE][PUSCH %d] Increasing to round %d\n",harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round); - // dump_ulsch(phy_vars_eNB, last_slot>>1, i); - // exit(-1); - - if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) { - LOG_I(PHY,"[eNB %d][RAPROC] frame %d, slot %d, subframe %d, UE %d: Error receiving ULSCH (Msg3), round %d/%d\n", - phy_vars_eNB->Mod_id, - frame,last_slot,last_slot>>1, i, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1, - phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx-1); - - if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round == - phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx) { - LOG_D(PHY,"[eNB %d][RAPROC] maxHARQ_Msg3Tx reached, abandoning RA procedure for UE %d\n", - phy_vars_eNB->Mod_id, i); - phy_vars_eNB->eNB_UE_stats[i].mode = PRACH; + extract_CQI(phy_vars_eNB->ulsch_eNB[i]->o,phy_vars_eNB->ulsch_eNB[i]->uci_format,&phy_vars_eNB->eNB_UE_stats[i], &rnti, &access_mode); + phy_vars_eNB->eNB_UE_stats[i].rank = phy_vars_eNB->ulsch_eNB[i]->o_RI[0]; + } + + if (ret == (1+MAX_TURBO_ITERATIONS)) { + phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++; + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1; + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 0; + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round++; + + LOG_D(PHY,"[UE][PUSCH %d] Increasing to round %d\n",harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round); + // dump_ulsch(phy_vars_eNB, last_slot>>1, i); + // exit(-1); + + if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) { + LOG_I(PHY,"[eNB %d][RAPROC] frame %d, slot %d, subframe %d, UE %d: Error receiving ULSCH (Msg3), round %d/%d\n", + phy_vars_eNB->Mod_id, + frame,last_slot,last_slot>>1, i, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1, + phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx-1); + + if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round == + phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx) { + LOG_D(PHY,"[eNB %d][RAPROC] maxHARQ_Msg3Tx reached, abandoning RA procedure for UE %d\n", + phy_vars_eNB->Mod_id, i); + phy_vars_eNB->eNB_UE_stats[i].mode = PRACH; #ifdef OPENAIR2 - mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id, - frame, - phy_vars_eNB->eNB_UE_stats[i].crnti); -#endif - remove_ue(phy_vars_eNB->eNB_UE_stats[i].crnti,phy_vars_eNB,abstraction_flag); - phy_vars_eNB->ulsch_eNB[(u32)i]->Msg3_active = 0; - //phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 0; - - } - else { - // activate retransmission for Msg3 (signalled to UE PHY by PHICH (not MAC/DCI) - phy_vars_eNB->ulsch_eNB[(u32)i]->Msg3_active = 1; - - get_Msg3_alloc_ret(&phy_vars_eNB->lte_frame_parms, - last_slot>>1, - frame, - &phy_vars_eNB->ulsch_eNB[i]->Msg3_frame, - &phy_vars_eNB->ulsch_eNB[i]->Msg3_subframe); - } - LOG_I(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",frame,last_slot>>1, - harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); - for (j=0;j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3;j++) - printf("%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->c[0][j]); - printf("\n"); - dump_ulsch(phy_vars_eNB,last_slot>>1,i); - mac_exit_wrapper("Msg3 error"); - } // This is Msg3 error - else { //normal ULSCH - LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d Error receiving ULSCH, round %d/%d (ACK %d,%d)\n", - phy_vars_eNB->Mod_id,harq_pid, - frame,last_slot>>1, i, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1, - phy_vars_eNB->ulsch_eNB[i]->Mdlharq, - phy_vars_eNB->ulsch_eNB[i]->o_ACK[0], - phy_vars_eNB->ulsch_eNB[i]->o_ACK[1]); - - LOG_I(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:\n",frame,last_slot>>1, - harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); - if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->c[0]!=NULL){ - for (j=0;j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3;j++) - LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->c[0][j]); - LOG_T(PHY,"\n"); - } - - - // dump_ulsch(phy_vars_eNB,last_slot>>1,i); - // mac_xface->macphy_exit(""); - - if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round== phy_vars_eNB->ulsch_eNB[i]->Mdlharq) { - LOG_I(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d ULSCH Mdlharq %d reached\n", - phy_vars_eNB->Mod_id,harq_pid, - frame,last_slot>>1, i, - phy_vars_eNB->ulsch_eNB[i]->Mdlharq); - - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round=0; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[harq_pid]++; - phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid]++; - //dump_ulsch(phy_vars_eNB, last_slot>>1, i); - //mac_xface->macphy_exit(""); - } - - // If we've dropped the UE, go back to PRACH mode for this UE - if (phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid] == 20) { - LOG_I(PHY,"[eNB %d] frame %d, subframe %d, UE %d: ULSCH consecutive error count reached, removing UE\n", - phy_vars_eNB->Mod_id,frame,last_slot>>1, i); - phy_vars_eNB->eNB_UE_stats[i].mode = PRACH; + mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id, + frame, + phy_vars_eNB->eNB_UE_stats[i].crnti); +#endif + remove_ue(phy_vars_eNB->eNB_UE_stats[i].crnti,phy_vars_eNB,abstraction_flag); + phy_vars_eNB->ulsch_eNB[(u32)i]->Msg3_active = 0; + //phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 0; + + } + else { + // activate retransmission for Msg3 (signalled to UE PHY by PHICH (not MAC/DCI) + phy_vars_eNB->ulsch_eNB[(u32)i]->Msg3_active = 1; + + get_Msg3_alloc_ret(&phy_vars_eNB->lte_frame_parms, + last_slot>>1, + frame, + &phy_vars_eNB->ulsch_eNB[i]->Msg3_frame, + &phy_vars_eNB->ulsch_eNB[i]->Msg3_subframe); + } + LOG_I(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",frame,last_slot>>1, + harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); + for (j=0;j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3;j++) + printf("%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->c[0][j]); + printf("\n"); + dump_ulsch(phy_vars_eNB,last_slot>>1,i); +#ifndef EXMIMO_IOT + LOG_W(PHY,"[eNB] Frame %d, Subframe %d: Msg3 in error\n", frame,last_slot>>1); +#else + mac_exit_wrapper("Msg3 error"); +#endif + } // This is Msg3 error + else { //normal ULSCH + LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d Error receiving ULSCH, round %d/%d (ACK %d,%d)\n", + phy_vars_eNB->Mod_id,harq_pid, + frame,last_slot>>1, i, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1, + phy_vars_eNB->ulsch_eNB[i]->Mdlharq, + phy_vars_eNB->ulsch_eNB[i]->o_ACK[0], + phy_vars_eNB->ulsch_eNB[i]->o_ACK[1]); + + LOG_I(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:\n",frame,last_slot>>1, + harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); + if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->c[0]!=NULL){ + for (j=0;j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3;j++) + LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->c[0][j]); + LOG_T(PHY,"\n"); + } + + +// dump_ulsch(phy_vars_eNB,last_slot>>1,i); +// mac_xface->macphy_exit(""); + + if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round== phy_vars_eNB->ulsch_eNB[i]->Mdlharq) { + LOG_I(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d ULSCH Mdlharq %d reached\n", + phy_vars_eNB->Mod_id,harq_pid, + frame,last_slot>>1, i, + phy_vars_eNB->ulsch_eNB[i]->Mdlharq); + + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round=0; + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active=0; + phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[harq_pid]++; + phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid]++; + //dump_ulsch(phy_vars_eNB, last_slot>>1, i); + //mac_xface->macphy_exit(""); + } + + // If we've dropped the UE, go back to PRACH mode for this UE + if (phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid] == 20) { + LOG_I(PHY,"[eNB %d] frame %d, subframe %d, UE %d: ULSCH consecutive error count reached, removing UE\n", + phy_vars_eNB->Mod_id,frame,last_slot>>1, i); + phy_vars_eNB->eNB_UE_stats[i].mode = PRACH; #ifdef OPENAIR2 - mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id, - frame, - phy_vars_eNB->eNB_UE_stats[i].crnti); + mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id, + frame, + phy_vars_eNB->eNB_UE_stats[i].crnti); #endif - remove_ue(phy_vars_eNB->eNB_UE_stats[i].crnti,phy_vars_eNB,abstraction_flag); - phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid]=0; - } - } - } // ulsch in error - else { - LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d ULSCH received, setting round to 0, PHICH ACK\n", - phy_vars_eNB->Mod_id,harq_pid, - frame,last_slot>>1); - - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 1; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round = 0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid] = 0; - - if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) { + remove_ue(phy_vars_eNB->eNB_UE_stats[i].crnti,phy_vars_eNB,abstraction_flag); + phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid]=0; + } + } + } // ulsch in error + else { + LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d ULSCH received, setting round to 0, PHICH ACK\n", + phy_vars_eNB->Mod_id,harq_pid, + frame,last_slot>>1); + + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1; + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 1; + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round = 0; + phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid] = 0; + + if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) { #ifdef OPENAIR2 #ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[eNB %d][RAPROC] Frame %d Terminating ra_proc for harq %d, UE %d\n", - phy_vars_eNB->Mod_id, - frame,harq_pid,i); + LOG_I(PHY,"[eNB %d][RAPROC] Frame %d Terminating ra_proc for harq %d, UE %d\n", + phy_vars_eNB->Mod_id, + frame,harq_pid,i); #endif - mac_xface->terminate_ra_proc(phy_vars_eNB->Mod_id, - frame, - phy_vars_eNB->ulsch_eNB[i]->rnti, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); + mac_xface->terminate_ra_proc(phy_vars_eNB->Mod_id, + frame, + phy_vars_eNB->ulsch_eNB[i]->rnti, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); #endif - phy_vars_eNB->eNB_UE_stats[i].mode = PUSCH; - phy_vars_eNB->ulsch_eNB[i]->Msg3_flag = 0; + phy_vars_eNB->eNB_UE_stats[i].mode = PUSCH; + phy_vars_eNB->ulsch_eNB[i]->Msg3_flag = 0; #ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[eNB %d][RAPROC] Frame %d : RX Subframe %d Setting UE %d mode to PUSCH\n",phy_vars_eNB->Mod_id,frame,last_slot>>1,i); + LOG_I(PHY,"[eNB %d][RAPROC] Frame %d : RX Subframe %d Setting UE %d mode to PUSCH\n",phy_vars_eNB->Mod_id,frame,last_slot>>1,i); #endif //DEBUG_PHY_PROC - for (j=0;j<phy_vars_eNB->dlsch_eNB[i][0]->Mdlharq;j++) { - phy_vars_eNB->eNB_UE_stats[i].dlsch_NAK[j]=0; - phy_vars_eNB->eNB_UE_stats[i].dlsch_sliding_cnt=0; - } - - //mac_xface->macphy_exit("Mode PUSCH. Exiting.\n"); - } - else { + for (j=0;j<phy_vars_eNB->dlsch_eNB[i][0]->Mdlharq;j++) { + phy_vars_eNB->eNB_UE_stats[i].dlsch_NAK[j]=0; + phy_vars_eNB->eNB_UE_stats[i].dlsch_sliding_cnt=0; + } + //mac_xface->macphy_exit("Mode PUSCH. Exiting.\n"); + } + else { + #ifdef DEBUG_PHY_PROC #ifdef DEBUG_ULSCH - LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",frame,last_slot>>1, - harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); - for (j=0;j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3;j++) - LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b[j]); - LOG_T(PHY,"\n"); + LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",frame,last_slot>>1, + harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); + for (j=0;j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3;j++) + LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b[j]); + LOG_T(PHY,"\n"); #endif #endif - //dump_ulsch(phy_vars_eNB,last_slot>>1,i); - //mac_xface->macphy_exit(""); - + //dump_ulsch(phy_vars_eNB,last_slot>>1,i); + //mac_xface->macphy_exit(""); + #ifdef OPENAIR2 - // if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->calibration_flag == 0) { - mac_xface->rx_sdu(phy_vars_eNB->Mod_id, - frame, - phy_vars_eNB->ulsch_eNB[i]->rnti, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); - //} - /* + // if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->calibration_flag == 0) { + mac_xface->rx_sdu(phy_vars_eNB->Mod_id, + frame, + phy_vars_eNB->ulsch_eNB[i]->rnti, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); + //} + /* else { // Retrieve calibration information and do whatever - LOG_D(PHY,"[eNB][Auto-Calibration] Frame %d, Subframe %d : ULSCH PDU (RX) %d bytes\n",phy_vars_eNB->frame,last_slot>>1,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); + LOG_D(PHY,"[eNB][Auto-Calibration] Frame %d, Subframe %d : ULSCH PDU (RX) %d bytes\n",phy_vars_eNB->frame,last_slot>>1,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); } - */ + */ #endif - } + } - // estimate timing advance for MAC - if (abstraction_flag == 0) { - sync_pos = lte_est_timing_advance_pusch(phy_vars_eNB,i,last_slot>>1); - phy_vars_eNB->eNB_UE_stats[i].timing_advance_update = sync_pos - phy_vars_eNB->lte_frame_parms.nb_prefix_samples/8; //to check - } + // estimate timing advance for MAC + if (abstraction_flag == 0) { + sync_pos = lte_est_timing_advance_pusch(phy_vars_eNB,i,last_slot>>1); + phy_vars_eNB->eNB_UE_stats[i].timing_advance_update = sync_pos - phy_vars_eNB->lte_frame_parms.nb_prefix_samples/8; //to check + } -#ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[eNB %d] frame %d, slot %d: user %d in sector %d: timing advance = %d\n", - phy_vars_eNB->Mod_id, - frame, last_slot, - i, sect_id, - phy_vars_eNB->eNB_UE_stats[i].timing_advance_update); +#ifdef DEBUG_PHY_PROC + LOG_I(PHY,"[eNB %d] frame %d, slot %d: user %d in sector %d: timing advance = %d\n", + phy_vars_eNB->Mod_id, + frame, last_slot, + i, sect_id, + phy_vars_eNB->eNB_UE_stats[i].timing_advance_update); #endif + - - } // ulsch not in error - - // process HARQ feedback + } // ulsch not in error + + // process HARQ feedback #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d, Processing HARQ feedback for UE %d (after PUSCH)\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->dlsch_eNB[i][0]->rnti, - frame,last_slot>>1, - i); -#endif - process_HARQ_feedback(i, - last_slot>>1, - phy_vars_eNB, - 1, // pusch_flag - 0, - 0, - 0); - - //#ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[eNB %d] Frame %d subframe %d, sect %d: received ULSCH harq_pid %d for UE %d, ret = %d, CQI CRC Status %d, ACK %d,%d, ulsch_errors %d/%d\n", - phy_vars_eNB->Mod_id,frame,last_slot>>1, - phy_vars_eNB->eNB_UE_stats[i].sector, - harq_pid, - i, - ret, - phy_vars_eNB->ulsch_eNB[i]->cqi_crc_status, - phy_vars_eNB->ulsch_eNB[i]->o_ACK[0], - phy_vars_eNB->ulsch_eNB[i]->o_ACK[1], - phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[harq_pid], - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][0]); - //#endif - - - if (frame % 100 == 0) { - if ((phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][round] - - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_pid][round]) != 0) - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_fer[harq_pid][round] = - (100*(phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][round] - - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors_last[harq_pid][round]))/ - (phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][round] - - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_pid][round]); - - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_pid][round] = - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][round]; - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors_last[harq_pid][round] = - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][round]; - } - + LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d, Processing HARQ feedback for UE %d (after PUSCH)\n",phy_vars_eNB->Mod_id, + phy_vars_eNB->dlsch_eNB[i][0]->rnti, + frame,last_slot>>1, + i); +#endif + process_HARQ_feedback(i, + last_slot>>1, + phy_vars_eNB, + 1, // pusch_flag + 0, + 0, + 0); + + //#ifdef DEBUG_PHY_PROC + LOG_I(PHY,"[eNB %d] Frame %d subframe %d, sect %d: received ULSCH harq_pid %d for UE %d, ret = %d, CQI CRC Status %d, ACK %d,%d, ulsch_errors %d/%d\n", + phy_vars_eNB->Mod_id,frame,last_slot>>1, + phy_vars_eNB->eNB_UE_stats[i].sector, + harq_pid, + i, + ret, + phy_vars_eNB->ulsch_eNB[i]->cqi_crc_status, + phy_vars_eNB->ulsch_eNB[i]->o_ACK[0], + phy_vars_eNB->ulsch_eNB[i]->o_ACK[1], + phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[harq_pid], + phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][0]); + //#endif + + + if (frame % 100 == 0) { + if ((phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][round] - + phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_pid][round]) != 0) + phy_vars_eNB->eNB_UE_stats[i].ulsch_round_fer[harq_pid][round] = + (100*(phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][round] - + phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors_last[harq_pid][round]))/ + (phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][round] - + phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_pid][round]); + + phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_pid][round] = + phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][round]; + phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors_last[harq_pid][round] = + phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][round]; } + } + #ifdef PUCCH - else if ((phy_vars_eNB->dlsch_eNB[i][0]) && - (phy_vars_eNB->dlsch_eNB[i][0]->rnti>0) && - ((last_slot%2)==1)){ // check for PUCCH - - // check SR availability - do_SR = is_SR_subframe(phy_vars_eNB,i,last_slot>>1); - // do_SR = 0; - - // Now ACK/NAK - // First check subframe_tx flag for earlier subframes - get_n1_pucch_eNB(phy_vars_eNB, - i, - last_slot>>1, - &n1_pucch0, - &n1_pucch1, - &n1_pucch2, - &n1_pucch3); - - LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d, subframe %d Checking for PUCCH (%d,%d,%d,%d) SR %d\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->dlsch_eNB[i][0]->rnti, - frame,last_slot>>1, - n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,do_SR); - - if ((n1_pucch0==-1) && (n1_pucch1==-1) && (do_SR==0)) { // no TX PDSCH that have to be checked and no SR for this UE_id - } - else { - // otherwise we have some PUCCH detection to do - - if (do_SR == 1) { - phy_vars_eNB->eNB_UE_stats[i].sr_total++; - - if (abstraction_flag == 0) - metric0 = rx_pucch(phy_vars_eNB, - pucch_format1, - i, - phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex, - 0, // n2_pucch - 1, // shortened format - &SR_payload, - last_slot>>1, - PUCCH1_THRES); + else if ((phy_vars_eNB->dlsch_eNB[i][0]) && + (phy_vars_eNB->dlsch_eNB[i][0]->rnti>0) && + ((last_slot%2)==1)){ // check for PUCCH + + // check SR availability + do_SR = is_SR_subframe(phy_vars_eNB,i,last_slot>>1); + // do_SR = 0; + + // Now ACK/NAK + // First check subframe_tx flag for earlier subframes + get_n1_pucch_eNB(phy_vars_eNB, + i, + last_slot>>1, + &n1_pucch0, + &n1_pucch1, + &n1_pucch2, + &n1_pucch3); + + LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d, subframe %d Checking for PUCCH (%d,%d,%d,%d) SR %d\n", + phy_vars_eNB->Mod_id,phy_vars_eNB->dlsch_eNB[i][0]->rnti, + frame,last_slot>>1, + n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,do_SR); + + if ((n1_pucch0==-1) && (n1_pucch1==-1) && (do_SR==0)) { // no TX PDSCH that have to be checked and no SR for this UE_id + } + else { + // otherwise we have some PUCCH detection to do + + if (do_SR == 1) { + phy_vars_eNB->eNB_UE_stats[i].sr_total++; + + if (abstraction_flag == 0) + metric0 = rx_pucch(phy_vars_eNB, + pucch_format1, + i, + phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex, + 0, // n2_pucch + 1, // shortened format + &SR_payload, + last_slot>>1, + PUCCH1_THRES); #ifdef PHY_ABSTRACTION - else { - metric0 = rx_pucch_emul(phy_vars_eNB, - i, - pucch_format1, - 0, - &SR_payload, - last_slot>>1); - LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking SR (UE SR %d/%d)\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->ulsch_eNB[i]->rnti,frame,last_slot>>1,SR_payload,phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex); - } -#endif - - if (SR_payload == 1) { - LOG_I(PHY,"[eNB %d][SR %x] Frame %d subframe %d Got SR for PUSCH, transmitting to MAC\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->ulsch_eNB[i]->rnti,frame,last_slot>>1); - phy_vars_eNB->eNB_UE_stats[i].sr_received++; - if (phy_vars_eNB->first_sr[i] == 1) { // this is the first request for uplink after Connection Setup, so clear HARQ process 0 use for Msg4 - phy_vars_eNB->first_sr[i] = 0; - phy_vars_eNB->dlsch_eNB[i][0]->harq_processes[0]->round=0; - phy_vars_eNB->dlsch_eNB[i][0]->harq_processes[0]->status=SCH_IDLE; - LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d First SR\n", - phy_vars_eNB->Mod_id, - phy_vars_eNB->ulsch_eNB[i]->rnti,frame,last_slot>>1); - } + else { + metric0 = rx_pucch_emul(phy_vars_eNB, + i, + pucch_format1, + 0, + &SR_payload, + last_slot>>1); + LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking SR (UE SR %d/%d)\n",phy_vars_eNB->Mod_id, + phy_vars_eNB->ulsch_eNB[i]->rnti,frame,last_slot>>1,SR_payload,phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex); + } +#endif + + if (SR_payload == 1) { + LOG_I(PHY,"[eNB %d][SR %x] Frame %d subframe %d Got SR for PUSCH, transmitting to MAC\n",phy_vars_eNB->Mod_id, + phy_vars_eNB->ulsch_eNB[i]->rnti,frame,last_slot>>1); + phy_vars_eNB->eNB_UE_stats[i].sr_received++; + if (phy_vars_eNB->first_sr[i] == 1) { // this is the first request for uplink after Connection Setup, so clear HARQ process 0 use for Msg4 + phy_vars_eNB->first_sr[i] = 0; + phy_vars_eNB->dlsch_eNB[i][0]->harq_processes[0]->round=0; + phy_vars_eNB->dlsch_eNB[i][0]->harq_processes[0]->status=SCH_IDLE; + LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d First SR\n", + phy_vars_eNB->Mod_id, + phy_vars_eNB->ulsch_eNB[i]->rnti,frame,last_slot>>1); + } #ifdef OPENAIR2 - mac_xface->SR_indication(phy_vars_eNB->Mod_id, - frame, - phy_vars_eNB->dlsch_eNB[i][0]->rnti,last_slot>>1); + mac_xface->SR_indication(phy_vars_eNB->Mod_id, + frame, + phy_vars_eNB->dlsch_eNB[i][0]->rnti,last_slot>>1); #endif - } - }// do_SR==1 - if ((n1_pucch0==-1) && (n1_pucch1==-1)) { // just check for SR - } - else if (phy_vars_eNB->lte_frame_parms.frame_type==FDD) { // FDD - // if SR was detected, use the n1_pucch from SR, else use n1_pucch0 - n1_pucch0 = (SR_payload==1) ? phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex:n1_pucch0; - if (abstraction_flag == 0) - metric0 = rx_pucch(phy_vars_eNB, - pucch_format1a, - i, - (u16)n1_pucch0, - 0, //n2_pucch - 1, // shortened format - pucch_payload0, - last_slot>>1, - PUCCH1_THRES); - else { + } + }// do_SR==1 + if ((n1_pucch0==-1) && (n1_pucch1==-1)) { // just check for SR + } + else if (phy_vars_eNB->lte_frame_parms.frame_type==FDD) { // FDD + // if SR was detected, use the n1_pucch from SR, else use n1_pucch0 + n1_pucch0 = (SR_payload==1) ? phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex:n1_pucch0; + if (abstraction_flag == 0) + metric0 = rx_pucch(phy_vars_eNB, + pucch_format1a, + i, + (u16)n1_pucch0, + 0, //n2_pucch + 1, // shortened format + pucch_payload0, + last_slot>>1, + PUCCH1a_THRES); + else { #ifdef PHY_ABSTRACTION - metric0 = rx_pucch_emul(phy_vars_eNB,i, - pucch_format1a, - 0, - pucch_payload0, - last_slot>>1); + metric0 = rx_pucch_emul(phy_vars_eNB,i, + pucch_format1a, + 0, + pucch_payload0, + last_slot>>1); #endif - } + } #ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d pucch1a (FDD) payload %d (metric %d)\n", - phy_vars_eNB->Mod_id, - phy_vars_eNB->dlsch_eNB[i][0]->rnti, - frame,last_slot>>1, - pucch_payload0[0],metric0); -#endif - - process_HARQ_feedback(i,last_slot>>1,phy_vars_eNB, - 0,// pusch_flag - pucch_payload0, - 2, - SR_payload); - - } // FDD - else { //TDD - - bundling_flag = phy_vars_eNB->pucch_config_dedicated[i].tdd_AckNackFeedbackMode; - - // fix later for 2 TB case and format1b - - if ((frame_parms->frame_type==FDD) || - (bundling_flag==bundling) || - ((frame_parms->frame_type==TDD)&&(frame_parms->tdd_config==1)&&((last_slot!=4)||(last_slot!=14)))) { - format = pucch_format1a; - // msg("PUCCH 1a\n"); - } - else { - format = pucch_format1b; - // msg("PUCCH 1b\n"); - } - - // if SR was detected, use the n1_pucch from SR - if (SR_payload==1) { + LOG_I(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d pucch1a (FDD) payload %d (metric %d)\n", + phy_vars_eNB->Mod_id, + phy_vars_eNB->dlsch_eNB[i][0]->rnti, + frame,last_slot>>1, + pucch_payload0[0],metric0); +#endif + + process_HARQ_feedback(i,last_slot>>1,phy_vars_eNB, + 0,// pusch_flag + pucch_payload0, + 2, + SR_payload); + + } // FDD + else { //TDD + + bundling_flag = phy_vars_eNB->pucch_config_dedicated[i].tdd_AckNackFeedbackMode; + + // fix later for 2 TB case and format1b + + if ((frame_parms->frame_type==FDD) || + (bundling_flag==bundling) || + ((frame_parms->frame_type==TDD)&&(frame_parms->tdd_config==1)&&((last_slot!=4)||(last_slot!=14)))) { + format = pucch_format1a; + // msg("PUCCH 1a\n"); + } + else { + format = pucch_format1b; + // msg("PUCCH 1b\n"); + } + + // if SR was detected, use the n1_pucch from SR + if (SR_payload==1) { #ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d with SR\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->dlsch_eNB[i][0]->rnti, - frame,last_slot>>1, - n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format); -#endif - if (abstraction_flag == 0) - metric0 = rx_pucch(phy_vars_eNB, - format, - i, - phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex, - 0, //n2_pucch - 1, // shortened format - pucch_payload0, - last_slot>>1, - PUCCH1_THRES); - else { + LOG_I(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d with SR\n",phy_vars_eNB->Mod_id, + phy_vars_eNB->dlsch_eNB[i][0]->rnti, + frame,last_slot>>1, + n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format); +#endif + if (abstraction_flag == 0) + metric0 = rx_pucch(phy_vars_eNB, + format, + i, + phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex, + 0, //n2_pucch + 1, // shortened format + pucch_payload0, + last_slot>>1, + PUCCH1a_THRES); + else { #ifdef PHY_ABSTRACTION - metric0 = rx_pucch_emul(phy_vars_eNB,i, - format, - 0, - pucch_payload0, - last_slot>>1); -#endif - } - } - else { //using n1_pucch0/n1_pucch1 resources + metric0 = rx_pucch_emul(phy_vars_eNB,i, + format, + 0, + pucch_payload0, + last_slot>>1); +#endif + } + } + else { //using n1_pucch0/n1_pucch1 resources #ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->dlsch_eNB[i][0]->rnti, - frame,last_slot>>1, - n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format); -#endif - metric0=0; - metric1=0; - - // Check n1_pucch0 metric - if (n1_pucch0 != -1) { - if (abstraction_flag == 0) - metric0 = rx_pucch(phy_vars_eNB, - format, - i, - (u16)n1_pucch0, - 0, // n2_pucch - 1, // shortened format - pucch_payload0, - last_slot>>1, - PUCCH1_THRES); - else { + LOG_I(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d\n",phy_vars_eNB->Mod_id, + phy_vars_eNB->dlsch_eNB[i][0]->rnti, + frame,last_slot>>1, + n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format); +#endif + metric0=0; + metric1=0; + + // Check n1_pucch0 metric + if (n1_pucch0 != -1) { + if (abstraction_flag == 0) + metric0 = rx_pucch(phy_vars_eNB, + format, + i, + (u16)n1_pucch0, + 0, // n2_pucch + 1, // shortened format + pucch_payload0, + last_slot>>1, + PUCCH1a_THRES); + else { #ifdef PHY_ABSTRACTION - metric0 = rx_pucch_emul(phy_vars_eNB,i, - format, - 0, - pucch_payload0, - last_slot>>1); + metric0 = rx_pucch_emul(phy_vars_eNB,i, + format, + 0, + pucch_payload0, + last_slot>>1); #endif - } - } + } + } - // Check n1_pucch1 metric - if (n1_pucch1 != -1) { - if (abstraction_flag == 0) - metric1 = rx_pucch(phy_vars_eNB, - format, - i, - (u16)n1_pucch1, - 0, //n2_pucch - 1, // shortened format - pucch_payload1, - last_slot>>1, - PUCCH1_THRES); - else { + // Check n1_pucch1 metric + if (n1_pucch1 != -1) { + if (abstraction_flag == 0) + metric1 = rx_pucch(phy_vars_eNB, + format, + i, + (u16)n1_pucch1, + 0, //n2_pucch + 1, // shortened format + pucch_payload1, + last_slot>>1, + PUCCH1a_THRES); + else { #ifdef PHY_ABSTRACTION - metric1 = rx_pucch_emul(phy_vars_eNB,i, - format, - 1, - pucch_payload1, - last_slot>>1); - + metric1 = rx_pucch_emul(phy_vars_eNB,i, + format, + 1, + pucch_payload1, + last_slot>>1); + #endif - } - } - } - - if (SR_payload == 1) { - pucch_payload = pucch_payload0; - if (bundling_flag == bundling) - pucch_sel = 2; - } - else if (bundling_flag == multiplexing) { // multiplexing + no SR - pucch_payload = (metric1>metric0) ? pucch_payload1 : pucch_payload0; - pucch_sel = (metric1>metric0) ? 1 : 0; - } - else { // bundling + no SR - if (n1_pucch1 != -1) - pucch_payload = pucch_payload1; - else if (n1_pucch0 != -1) - pucch_payload = pucch_payload0; - pucch_sel = 2; // indicate that this is a bundled ACK/NAK - } + } + } + } + + if (SR_payload == 1) { + pucch_payload = pucch_payload0; + if (bundling_flag == bundling) + pucch_sel = 2; + } + else if (bundling_flag == multiplexing) { // multiplexing + no SR + pucch_payload = (metric1>metric0) ? pucch_payload1 : pucch_payload0; + pucch_sel = (metric1>metric0) ? 1 : 0; + } + else { // bundling + no SR + if (n1_pucch1 != -1) + pucch_payload = pucch_payload1; + else if (n1_pucch0 != -1) + pucch_payload = pucch_payload0; + pucch_sel = 2; // indicate that this is a bundled ACK/NAK + } #ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d ACK/NAK metric 0 %d, metric 1 %d, sel %d, (%d,%d)\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->dlsch_eNB[i][0]->rnti, - frame,last_slot>>1, - metric0,metric1,pucch_sel,pucch_payload[0],pucch_payload[1]); + LOG_I(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d ACK/NAK metric 0 %d, metric 1 %d, sel %d, (%d,%d)\n",phy_vars_eNB->Mod_id, + phy_vars_eNB->dlsch_eNB[i][0]->rnti, + frame,last_slot>>1, + metric0,metric1,pucch_sel,pucch_payload[0],pucch_payload[1]); #endif - process_HARQ_feedback(i,last_slot>>1,phy_vars_eNB, - 0,// pusch_flag - pucch_payload, - pucch_sel, - SR_payload); - } - } - } // PUCCH processing - -#endif //PUCCH - - if ((frame % 10 == 0) && (last_slot==9)) { - phy_vars_eNB->eNB_UE_stats[i].dlsch_bitrate = (phy_vars_eNB->eNB_UE_stats[i].total_TBS - - phy_vars_eNB->eNB_UE_stats[i].total_TBS_last)*10; - - phy_vars_eNB->eNB_UE_stats[i].total_TBS_last = phy_vars_eNB->eNB_UE_stats[i].total_TBS; + process_HARQ_feedback(i,last_slot>>1,phy_vars_eNB, + 0,// pusch_flag + pucch_payload, + pucch_sel, + SR_payload); + } } - - num_active_cba_groups = phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups; - /*if (num_active_cba_groups > 0 ) + } // PUCCH processing + +#endif //PUCCH + + if ((frame % 10 == 0) && (last_slot==9)) { + phy_vars_eNB->eNB_UE_stats[i].dlsch_bitrate = (phy_vars_eNB->eNB_UE_stats[i].total_TBS - + phy_vars_eNB->eNB_UE_stats[i].total_TBS_last)*10; + + phy_vars_eNB->eNB_UE_stats[i].total_TBS_last = phy_vars_eNB->eNB_UE_stats[i].total_TBS; + } + + num_active_cba_groups = phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups; + /*if (num_active_cba_groups > 0 ) LOG_D(PHY,"[eNB] last slot %d trying cba transmission decoding UE %d num_grps %d rnti %x flag %d\n", last_slot, i, num_active_cba_groups,phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i%num_active_cba_groups], phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_cba_scheduling_flag ); - */ - if ((phy_vars_eNB->ulsch_eNB[i]) && - (num_active_cba_groups > 0) && - (phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i%num_active_cba_groups]>0) && - (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_cba_scheduling_flag==1) && - ((last_slot%2)==1)) { - - - rnti=0; + */ + if ((phy_vars_eNB->ulsch_eNB[i]) && + (num_active_cba_groups > 0) && + (phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i%num_active_cba_groups]>0) && + (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_cba_scheduling_flag==1) && + ((last_slot%2)==1)) { + + + rnti=0; #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Checking PUSCH/ULSCH CBA Reception for UE %d with cba rnti %x mode %s\n", - phy_vars_eNB->Mod_id,harq_pid, - frame,last_slot>>1, - i, (u16)phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i%num_active_cba_groups],mode_string[phy_vars_eNB->eNB_UE_stats[i].mode]); -#endif - if (abstraction_flag==0) { - rx_ulsch(phy_vars_eNB, - last_slot>>1, - phy_vars_eNB->eNB_UE_stats[i].sector, // this is the effective sector id - i, - phy_vars_eNB->ulsch_eNB, - 0); - } + LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Checking PUSCH/ULSCH CBA Reception for UE %d with cba rnti %x mode %s\n", + phy_vars_eNB->Mod_id,harq_pid, + frame,last_slot>>1, + i, (u16)phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i%num_active_cba_groups],mode_string[phy_vars_eNB->eNB_UE_stats[i].mode]); +#endif + if (abstraction_flag==0) { + rx_ulsch(phy_vars_eNB, + last_slot>>1, + phy_vars_eNB->eNB_UE_stats[i].sector, // this is the effective sector id + i, + phy_vars_eNB->ulsch_eNB, + 0); + } #ifdef PHY_ABSTRACTION - else { - rx_ulsch_emul(phy_vars_eNB, - last_slot>>1, - phy_vars_eNB->eNB_UE_stats[i].sector, // this is the effective sector id - i); - } + else { + rx_ulsch_emul(phy_vars_eNB, + last_slot>>1, + phy_vars_eNB->eNB_UE_stats[i].sector, // this is the effective sector id + i); + } #endif - - if (abstraction_flag == 0) { - ret = ulsch_decoding(phy_vars_eNB, - i, - last_slot>>1, - 0, // control_only_flag - 0, //Nbundled, to be updated!!!! - 0); - } + + if (abstraction_flag == 0) { + ret = ulsch_decoding(phy_vars_eNB, + i, + last_slot>>1, + 0, // control_only_flag + 0, //Nbundled, to be updated!!!! + 0); + } #ifdef PHY_ABSTRACTION - else { - ret = ulsch_decoding_emul(phy_vars_eNB, - last_slot>>1, - i, - &rnti); - } + else { + ret = ulsch_decoding_emul(phy_vars_eNB, + last_slot>>1, + i, + &rnti); + } #endif - if (phy_vars_eNB->ulsch_eNB[i]->cqi_crc_status == 1) { + if (phy_vars_eNB->ulsch_eNB[i]->cqi_crc_status == 1) { #ifdef DEBUG_PHY_PROC - //if (((phy_vars_eNB->frame%10) == 0) || (phy_vars_eNB->frame < 50)) - // print_CQI(phy_vars_eNB->ulsch_eNB[i]->o,phy_vars_eNB->ulsch_eNB[i]->uci_format,0); + //if (((phy_vars_eNB->frame%10) == 0) || (phy_vars_eNB->frame < 50)) + // print_CQI(phy_vars_eNB->ulsch_eNB[i]->o,phy_vars_eNB->ulsch_eNB[i]->uci_format,0); #endif - extract_CQI(phy_vars_eNB->ulsch_eNB[i]->o,phy_vars_eNB->ulsch_eNB[i]->uci_format,&phy_vars_eNB->eNB_UE_stats[i], &rnti, &access_mode); - phy_vars_eNB->eNB_UE_stats[i].rank = phy_vars_eNB->ulsch_eNB[i]->o_RI[0]; - } - /* LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d resetting the subframe_scheduling_flag, total cba groups %d %d\n", + extract_CQI(phy_vars_eNB->ulsch_eNB[i]->o,phy_vars_eNB->ulsch_eNB[i]->uci_format,&phy_vars_eNB->eNB_UE_stats[i], &rnti, &access_mode); + phy_vars_eNB->eNB_UE_stats[i].rank = phy_vars_eNB->ulsch_eNB[i]->o_RI[0]; + } + /* LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d resetting the subframe_scheduling_flag, total cba groups %d %d\n", phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->frame,last_slot>>1,i,harq_pid, phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups,num_active_cba_groups); - */ - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=0; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->status= SCH_IDLE; - - if ((num_active_cba_groups > 0) && - // (i % num_active_cba_groups == 0) && // this ue is used a a template for the CBA - (i + num_active_cba_groups < NUMBER_OF_UE_MAX) && - (phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->cba_rnti[i%num_active_cba_groups] > 0 ) && - (phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->num_active_cba_groups> 0)) { + */ + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=0; + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->status= SCH_IDLE; + + if ((num_active_cba_groups > 0) && + // (i % num_active_cba_groups == 0) && // this ue is used a a template for the CBA + (i + num_active_cba_groups < NUMBER_OF_UE_MAX) && + (phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->cba_rnti[i%num_active_cba_groups] > 0 ) && + (phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->num_active_cba_groups> 0)) { #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d resetting the subframe_scheduling_flag for Ue %d cba groups %d members\n", - phy_vars_eNB->Mod_id,harq_pid,frame,last_slot>>1,i,harq_pid, - i+num_active_cba_groups, i%phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups); + LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d resetting the subframe_scheduling_flag for Ue %d cba groups %d members\n", + phy_vars_eNB->Mod_id,harq_pid,frame,last_slot>>1,i,harq_pid, + i+num_active_cba_groups, i%phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups); #endif - phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=1; - phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->harq_processes[harq_pid]->status= CBA_ACTIVE; - phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->harq_processes[harq_pid]->TBS=phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS; - } - - if (ret == (1+MAX_TURBO_ITERATIONS)) { - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 0; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round++; - } // ulsch in error - else { - LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d ULSCH received, setting round to 0, PHICH ACK\n", - phy_vars_eNB->Mod_id,harq_pid, - frame,last_slot>>1); - - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 1; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round = 0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid] = 0; + phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=1; + phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->harq_processes[harq_pid]->status= CBA_ACTIVE; + phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->harq_processes[harq_pid]->TBS=phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS; + } + + if (ret == (1+MAX_TURBO_ITERATIONS)) { + phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++; + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1; + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 0; + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round++; + } // ulsch in error + else { + LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d ULSCH received, setting round to 0, PHICH ACK\n", + phy_vars_eNB->Mod_id,harq_pid, + frame,last_slot>>1); + + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1; + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 1; + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round = 0; + phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid] = 0; #ifdef DEBUG_PHY_PROC #ifdef DEBUG_ULSCH - LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:", - frame,last_slot>>1, - harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); - for (j=0;j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3;j++) - LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b[j]); - LOG_T(PHY,"\n"); -#endif -#endif - if (access_mode > UNKNOWN_ACCESS){ - LOG_I(PHY,"[eNB %d] Frame %d, Subframe %d : received ULSCH SDU from CBA transmission, UE (%d,%x), CBA (group %d, rnti %x)\n", - phy_vars_eNB->Mod_id, frame,last_slot>>1, - i, phy_vars_eNB->ulsch_eNB[i]->rnti, - i % phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups, phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i%num_active_cba_groups]); - // detect if there is a CBA collision - if (phy_vars_eNB->cba_last_reception[i%num_active_cba_groups] == 0 ) { - mac_xface->rx_sdu(phy_vars_eNB->Mod_id, - frame, - phy_vars_eNB->ulsch_eNB[i]->rnti, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); - phy_vars_eNB->cba_last_reception[i%num_active_cba_groups]=1;//(last_slot>>1); - } else { - LOG_N(PHY,"[eNB %d] Frame %d subframe %d : CBA collision detected for UE%d for group %d, set the SR for this UE \n ", - phy_vars_eNB->Mod_id,frame,last_slot>>1, - i,i%num_active_cba_groups ); - mac_xface->SR_indication(phy_vars_eNB->Mod_id, - frame, - phy_vars_eNB->dlsch_eNB[i][0]->rnti,last_slot>>1); - } - - } - } // ULSCH CBA not in error - } - + LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:", + frame,last_slot>>1, + harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); + for (j=0;j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3;j++) + LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b[j]); + LOG_T(PHY,"\n"); +#endif +#endif + if (access_mode > UNKNOWN_ACCESS){ + LOG_I(PHY,"[eNB %d] Frame %d, Subframe %d : received ULSCH SDU from CBA transmission, UE (%d,%x), CBA (group %d, rnti %x)\n", + phy_vars_eNB->Mod_id, frame,last_slot>>1, + i, phy_vars_eNB->ulsch_eNB[i]->rnti, + i % phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups, phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i%num_active_cba_groups]); + // detect if there is a CBA collision + if (phy_vars_eNB->cba_last_reception[i%num_active_cba_groups] == 0 ) { + mac_xface->rx_sdu(phy_vars_eNB->Mod_id, + frame, + phy_vars_eNB->ulsch_eNB[i]->rnti, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); + phy_vars_eNB->cba_last_reception[i%num_active_cba_groups]=1;//(last_slot>>1); + } else { + LOG_N(PHY,"[eNB %d] Frame %d subframe %d : CBA collision detected for UE%d for group %d, set the SR for this UE \n ", + phy_vars_eNB->Mod_id,frame,last_slot>>1, + i,i%num_active_cba_groups ); + mac_xface->SR_indication(phy_vars_eNB->Mod_id, + frame, + phy_vars_eNB->dlsch_eNB[i][0]->rnti,last_slot>>1); + } + + } + } // ULSCH CBA not in error + } + } // loop i=0 ... NUMBER_OF_UE_MAX-1 if (((last_slot&1) == 1 ) && (pusch_active == 0)){ - if (abstraction_flag == 0) { - // LOG_D(PHY,"[eNB] Frame %d, subframe %d Doing I0_measurements\n", - // (((last_slot>>1)==9)?-1:0) + phy_vars_eNB->frame,last_slot>>1); - lte_eNB_I0_measurements(phy_vars_eNB, - 0, - phy_vars_eNB->first_run_I0_measurements); - } + if (abstraction_flag == 0) { + // LOG_D(PHY,"[eNB] Frame %d, subframe %d Doing I0_measurements\n", + // (((last_slot>>1)==9)?-1:0) + phy_vars_eNB->frame,last_slot>>1); + lte_eNB_I0_measurements(phy_vars_eNB, + 0, + phy_vars_eNB->first_run_I0_measurements); + } #ifdef PHY_ABSTRACTION - else { - lte_eNB_I0_measurements_emul(phy_vars_eNB, - sect_id); - } + else { + lte_eNB_I0_measurements_emul(phy_vars_eNB, + sect_id); + } #endif - - - if (I0_clear == 1) - I0_clear = 0; + + + if (I0_clear == 1) + I0_clear = 0; } #ifdef EMOS @@ -3596,14 +3627,15 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 #endif vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,0); - + stop_meas(&phy_vars_eNB->phy_proc_rx); + } #undef DEBUG_PHY_PROC #ifdef Rel10 int phy_procedures_RN_eNB_TX(unsigned char last_slot, unsigned char next_slot, relaying_type_t r_type){ - + int do_proc=0;// do nothing switch(r_type){ case no_relay: @@ -3624,7 +3656,7 @@ int phy_procedures_RN_eNB_TX(unsigned char last_slot, unsigned char next_slot, r } #endif void phy_procedures_eNB_lte(unsigned char last_slot, unsigned char next_slot,PHY_VARS_eNB *phy_vars_eNB,u8 abstraction_flag, - relaying_type_t r_type, PHY_VARS_RN *phy_vars_rn) { + relaying_type_t r_type, PHY_VARS_RN *phy_vars_rn) { #if defined(ENABLE_ITTI) MessageDef *msg_p; const char *msg_name; @@ -3635,40 +3667,41 @@ void phy_procedures_eNB_lte(unsigned char last_slot, unsigned char next_slot,PHY /* if (phy_vars_eNB->frame >= 1000) mac_xface->macphy_exit("Exiting after 1000 Frames\n"); - */ + */ vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_SLOT_NUMBER_ENB, (last_slot + 1) % 20); vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_ENB, phy_vars_eNB->frame); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_LTE,1); + start_meas(&phy_vars_eNB->phy_proc); #if defined(ENABLE_ITTI) do { - // Checks if a message has been sent to PHY sub-task - itti_poll_msg (TASK_PHY_ENB, &msg_p); + // Checks if a message has been sent to PHY sub-task + itti_poll_msg (TASK_PHY_ENB, &msg_p); - if (msg_p != NULL) { - msg_name = ITTI_MSG_NAME (msg_p); - instance = ITTI_MSG_INSTANCE (msg_p); - Mod_id = instance; + if (msg_p != NULL) { + msg_name = ITTI_MSG_NAME (msg_p); + instance = ITTI_MSG_INSTANCE (msg_p); + Mod_id = instance; - switch (ITTI_MSG_ID(msg_p)) { + switch (ITTI_MSG_ID(msg_p)) { # if defined(ENABLE_RAL) - case TIMER_HAS_EXPIRED: + case TIMER_HAS_EXPIRED: // check if it is a measurement timer - { - hashtable_rc_t hashtable_rc; + { + hashtable_rc_t hashtable_rc; - hashtable_rc = hashtable_is_key_exists(PHY_vars_eNB_g[Mod_id]->ral_thresholds_timed, (uint64_t)(TIMER_HAS_EXPIRED(msg_p).timer_id)); - if (hashtable_rc == HASH_TABLE_OK) { - phy_eNB_lte_check_measurement_thresholds(instance, (ral_threshold_phy_t*)TIMER_HAS_EXPIRED(msg_p).arg); - } + hashtable_rc = hashtable_is_key_exists(PHY_vars_eNB_g[Mod_id]->ral_thresholds_timed, (uint64_t)(TIMER_HAS_EXPIRED(msg_p).timer_id)); + if (hashtable_rc == HASH_TABLE_OK) { + phy_eNB_lte_check_measurement_thresholds(instance, (ral_threshold_phy_t*)TIMER_HAS_EXPIRED(msg_p).arg); } + } break; - case PHY_MEAS_THRESHOLD_REQ: + case PHY_MEAS_THRESHOLD_REQ: #warning "TO DO LIST OF THRESHOLDS" - LOG_I(PHY, "[ENB %d] Received %s\n", Mod_id, msg_name); - { + LOG_I(PHY, "[ENB %d] Received %s\n", Mod_id, msg_name); + { ral_threshold_phy_t* threshold_phy_p = NULL; int index, res; long timer_id; @@ -3676,126 +3709,126 @@ void phy_procedures_eNB_lte(unsigned char last_slot, unsigned char next_slot,PHY switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action) { - case RAL_TH_ACTION_CANCEL_THRESHOLD: - break; + case RAL_TH_ACTION_CANCEL_THRESHOLD: + break; - case RAL_TH_ACTION_SET_NORMAL_THRESHOLD: - case RAL_TH_ACTION_SET_ONE_SHOT_THRESHOLD: - for (index = 0; index < PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.num_thresholds; index++) { - threshold_phy_p = calloc(1, sizeof(ral_threshold_phy_t)); - threshold_phy_p->th_action = PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action; - memcpy(&threshold_phy_p->link_param.link_param_type, - &PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type, - sizeof(ral_link_param_type_t)); - - memcpy(&threshold_phy_p->threshold, - &PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.thresholds[index], - sizeof(ral_threshold_t)); - - switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.union_choice) { - - case RAL_LINK_CFG_PARAM_CHOICE_TIMER_NULL: - switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type.choice) { - case RAL_LINK_PARAM_TYPE_CHOICE_GEN: - SLIST_INSERT_HEAD( - &PHY_vars_eNB_g[Mod_id]->ral_thresholds_gen_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_gen], - threshold_phy_p, - ral_thresholds); - break; - - case RAL_LINK_PARAM_TYPE_CHOICE_LTE: - SLIST_INSERT_HEAD( - &PHY_vars_eNB_g[Mod_id]->ral_thresholds_lte_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_lte], - threshold_phy_p, - ral_thresholds); - break; - - default: - LOG_E(PHY, "[ENB %d] BAD PARAMETER cfg_param.link_param_type.choice %d in %s\n", - Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type.choice, msg_name); + case RAL_TH_ACTION_SET_NORMAL_THRESHOLD: + case RAL_TH_ACTION_SET_ONE_SHOT_THRESHOLD: + for (index = 0; index < PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.num_thresholds; index++) { + threshold_phy_p = calloc(1, sizeof(ral_threshold_phy_t)); + threshold_phy_p->th_action = PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action; + memcpy(&threshold_phy_p->link_param.link_param_type, + &PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type, + sizeof(ral_link_param_type_t)); + + memcpy(&threshold_phy_p->threshold, + &PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.thresholds[index], + sizeof(ral_threshold_t)); + + switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.union_choice) { + + case RAL_LINK_CFG_PARAM_CHOICE_TIMER_NULL: + switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type.choice) { + case RAL_LINK_PARAM_TYPE_CHOICE_GEN: + SLIST_INSERT_HEAD( + &PHY_vars_eNB_g[Mod_id]->ral_thresholds_gen_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_gen], + threshold_phy_p, + ral_thresholds); + break; + + case RAL_LINK_PARAM_TYPE_CHOICE_LTE: + SLIST_INSERT_HEAD( + &PHY_vars_eNB_g[Mod_id]->ral_thresholds_lte_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_lte], + threshold_phy_p, + ral_thresholds); + break; + + default: + LOG_E(PHY, "[ENB %d] BAD PARAMETER cfg_param.link_param_type.choice %d in %s\n", + Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type.choice, msg_name); + } + break; + + case RAL_LINK_CFG_PARAM_CHOICE_TIMER: + res = timer_setup( + (uint32_t)(PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param._union.timer_interval/1000),//uint32_t interval_sec, + (uint32_t)(PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param._union.timer_interval%1000),//uint32_t interval_us, + TASK_PHY_ENB, + instance, + TIMER_PERIODIC, + threshold_phy_p, + &timer_id); + + if (res == 0) { + hashtable_rc = hashtable_insert(PHY_vars_eNB_g[Mod_id]->ral_thresholds_timed, (uint64_t )timer_id, (void*)threshold_phy_p); + if (hashtable_rc == HASH_TABLE_OK) { + threshold_phy_p->timer_id = timer_id; + } else { + LOG_E(PHY, "[ENB %d] %s: Error in hashtable. Could not configure threshold index %d \n", + Mod_id, msg_name, index); + } + + } else { + LOG_E(PHY, "[ENB %d] %s: Could not configure threshold index %d because of timer initialization failure\n", + Mod_id, msg_name, index); + } + break; + + default: // already checked in RRC, should not happen here + LOG_E(PHY, "[ENB %d] BAD PARAMETER cfg_param.union_choice %d in %s\n", + Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.union_choice, msg_name); + } } break; - case RAL_LINK_CFG_PARAM_CHOICE_TIMER: - res = timer_setup( - (uint32_t)(PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param._union.timer_interval/1000),//uint32_t interval_sec, - (uint32_t)(PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param._union.timer_interval%1000),//uint32_t interval_us, - TASK_PHY_ENB, - instance, - TIMER_PERIODIC, - threshold_phy_p, - &timer_id); - - if (res == 0) { - hashtable_rc = hashtable_insert(PHY_vars_eNB_g[Mod_id]->ral_thresholds_timed, (uint64_t )timer_id, (void*)threshold_phy_p); - if (hashtable_rc == HASH_TABLE_OK) { - threshold_phy_p->timer_id = timer_id; - } else { - LOG_E(PHY, "[ENB %d] %s: Error in hashtable. Could not configure threshold index %d \n", - Mod_id, msg_name, index); - } - - } else { - LOG_E(PHY, "[ENB %d] %s: Could not configure threshold index %d because of timer initialization failure\n", - Mod_id, msg_name, index); - } - break; - - default: // already checked in RRC, should not happen here - LOG_E(PHY, "[ENB %d] BAD PARAMETER cfg_param.union_choice %d in %s\n", - Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.union_choice, msg_name); - } - } - break; - - default: - LOG_E(PHY, "[ENB %d] BAD PARAMETER th_action value %d in %s\n", - Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action, msg_name); + default: + LOG_E(PHY, "[ENB %d] BAD PARAMETER th_action value %d in %s\n", + Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action, msg_name); } - } - break; + } + break; # endif - /* Messages from eNB app */ - case PHY_CONFIGURATION_REQ: - LOG_I(PHY, "[eNB %d] Received %s\n", instance, msg_name); - /* TODO */ + /* Messages from eNB app */ + case PHY_CONFIGURATION_REQ: + LOG_I(PHY, "[eNB %d] Received %s\n", instance, msg_name); + /* TODO */ - break; + break; - default: - LOG_E(PHY, "[ENB %d] Received unexpected message %s\n", Mod_id, msg_name); - break; - } - - result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p); - AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); + default: + LOG_E(PHY, "[ENB %d] Received unexpected message %s\n", Mod_id, msg_name); + break; } + + result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p); + AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); + } } while(msg_p != NULL); #endif if ((((phy_vars_eNB->lte_frame_parms.frame_type == TDD)&&(subframe_select(&phy_vars_eNB->lte_frame_parms,next_slot>>1)==SF_DL))|| (phy_vars_eNB->lte_frame_parms.frame_type == FDD)) && ((next_slot&1)==0)) { #ifdef Rel10 - if (phy_procedures_RN_eNB_TX(last_slot, next_slot, r_type) != 0 ) + if (phy_procedures_RN_eNB_TX(last_slot, next_slot, r_type) != 0 ) #endif - phy_procedures_eNB_TX(next_slot,phy_vars_eNB,abstraction_flag,r_type,phy_vars_rn); + phy_procedures_eNB_TX(next_slot,phy_vars_eNB,abstraction_flag,r_type,phy_vars_rn); } if ((((phy_vars_eNB->lte_frame_parms.frame_type == TDD )&&(subframe_select(&phy_vars_eNB->lte_frame_parms,last_slot>>1)==SF_UL)) || (phy_vars_eNB->lte_frame_parms.frame_type == FDD)) && ((last_slot&1)==1)){ - phy_procedures_eNB_RX(last_slot,phy_vars_eNB,abstraction_flag,r_type); + phy_procedures_eNB_RX(last_slot,phy_vars_eNB,abstraction_flag,r_type); } if ((subframe_select(&phy_vars_eNB->lte_frame_parms,next_slot>>1)==SF_S) && ((next_slot&1)==0)) { #ifdef Rel10 - if (phy_procedures_RN_eNB_TX(last_slot, next_slot, r_type) != 0 ) + if (phy_procedures_RN_eNB_TX(last_slot, next_slot, r_type) != 0 ) #endif - phy_procedures_eNB_TX(next_slot,phy_vars_eNB,abstraction_flag,r_type,phy_vars_rn); + phy_procedures_eNB_TX(next_slot,phy_vars_eNB,abstraction_flag,r_type,phy_vars_rn); } if ((subframe_select(&phy_vars_eNB->lte_frame_parms,last_slot>>1)==SF_S) && ((last_slot&1)==0)){ - phy_procedures_eNB_S_RX(last_slot,phy_vars_eNB,abstraction_flag,r_type); + phy_procedures_eNB_S_RX(last_slot,phy_vars_eNB,abstraction_flag,r_type); } vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_LTE,0); @@ -3804,5 +3837,6 @@ void phy_procedures_eNB_lte(unsigned char last_slot, unsigned char next_slot,PHY if (phy_vars_eNB->frame==1024) phy_vars_eNB->frame=0; + stop_meas(&phy_vars_eNB->phy_proc); } diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index 95e0a6740f4..db3cc3a9250 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -29,11 +29,11 @@ /*! \file phy_procedures_lte_ue.c * \brief Implementation of UE procedures from 36.213 LTE specifications - * \author R. Knopp, F. Kaltenberger + * \author R. Knopp, F. Kaltenberger, N. Nikaein * \date 2011 * \version 0.1 * \company Eurecom - * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr + * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr, navid.nikaein@eurecom.fr * \note * \warning */ @@ -628,6 +628,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX,VCD_FUNCTION_IN); + start_meas(&phy_vars_ue->phy_proc_tx); #ifdef EMOS //phy_procedures_emos_UE_TX(next_slot); @@ -696,6 +697,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs phy_vars_ue->Mod_id,phy_vars_ue->frame); mac_xface->macphy_exit(""); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT); + stop_meas(&phy_vars_ue->phy_proc_tx); return; } Msg3_flag=0; @@ -789,6 +791,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs phy_vars_ue->prach_resources[eNB_id]->Msg3[7], phy_vars_ue->prach_resources[eNB_id]->Msg3[8]); + start_meas(&phy_vars_ue->ulsch_encoding_stats); if (abstraction_flag==0) { if (ulsch_encoding(phy_vars_ue->prach_resources[eNB_id]->Msg3, phy_vars_ue, @@ -798,6 +801,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n"); mac_xface->macphy_exit(""); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT); + stop_meas(&phy_vars_ue->phy_proc_tx); return; } } @@ -806,6 +810,8 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs ulsch_encoding_emul(phy_vars_ue->prach_resources[eNB_id]->Msg3,phy_vars_ue,eNB_id,harq_pid,0); } #endif + stop_meas(&phy_vars_ue->ulsch_encoding_stats); + #ifdef OPENAIR2 // signal MAC that Msg3 was sent @@ -875,6 +881,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs */ #endif //OPENAIR2 + start_meas(&phy_vars_ue->ulsch_encoding_stats); if (abstraction_flag==0) { /* if (phy_vars_ue->frame%100==0) { @@ -889,6 +896,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs 0)!=0) { // Nbundled, to be updated!!!! LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n"); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT); + stop_meas(&phy_vars_ue->phy_proc_tx); return; } } @@ -897,6 +905,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs ulsch_encoding_emul(ulsch_input_buffer,phy_vars_ue,eNB_id,harq_pid,0); } #endif + stop_meas(&phy_vars_ue->ulsch_encoding_stats); } if (abstraction_flag == 0) { #ifdef OPENAIR2 @@ -912,6 +921,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs AMP #endif ); + start_meas(&phy_vars_ue->ulsch_modulation_stats); #ifdef OFDMA_ULSCH ulsch_modulation(phy_vars_ue->lte_ue_common_vars.txdataF, #ifdef EXMIMO @@ -937,6 +947,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs phy_vars_ue->ulsch_ue[eNB_id]); #endif //OFDMA_ULSCH + start_meas(&phy_vars_ue->ulsch_modulation_stats); } if (abstraction_flag==1) { // clear SR @@ -977,6 +988,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs 0)!=0) { // Nbundled, to be updated!!!! LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n"); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT); + stop_meas(&phy_vars_ue->phy_proc_tx); return; } } @@ -1001,11 +1013,11 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs (bundling_flag==bundling) || ((frame_parms->frame_type==TDD)&&(frame_parms->tdd_config==1)&&((next_slot!=4)||(next_slot!=14)))) { format = pucch_format1a; - // debug_msg("PUCCH 1a\n"); + LOG_D(PHY,"[UE] PUCCH 1a\n"); } else { format = pucch_format1b; - // debug_msg("PUCCH 1b\n"); + LOG_D(PHY,"[UE] PUCCH 1b\n"); } // Check for SR and do ACK/NACK accordingly @@ -1174,6 +1186,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs ulsch_start = (frame_parms->samples_per_tti*subframe); #endif //else EXMIMO + start_meas(&phy_vars_ue->ofdm_mod_stats); for (aa=0; aa<1/*frame_parms->nb_antennas_tx*/; aa++) { if (frame_parms->Ncp == 1) PHY_ofdm_mod(&phy_vars_ue->lte_ue_common_vars.txdataF[aa][subframe*nsymb*frame_parms->ofdm_symbol_size], @@ -1242,6 +1255,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs #endif } //nb_antennas_tx + stop_meas(&phy_vars_ue->ofdm_mod_stats); } // generate_ul_signal == 1 } } // mode != PRACH @@ -1298,7 +1312,9 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs #else phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp = AMP; #endif + start_meas(&phy_vars_ue->tx_prach); prach_power = generate_prach(phy_vars_ue,eNB_id,next_slot>>1,phy_vars_ue->frame); + stop_meas(&phy_vars_ue->tx_prach); LOG_D(PHY,"[UE %d][RAPROC] PRACH PL %d dB, power %d dBm, digital power %d dB (amp %d)\n", phy_vars_ue->Mod_id, get_PL(phy_vars_ue->Mod_id,eNB_id), @@ -1309,9 +1325,11 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs else { UE_transport_info[phy_vars_ue->Mod_id].cntl.prach_flag=1; UE_transport_info[phy_vars_ue->Mod_id].cntl.prach_id=phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex; +#ifdef OPENAIR2 mac_xface->Msg1_transmitted(phy_vars_ue->Mod_id, phy_vars_ue->frame, eNB_id); +#endif } LOG_D(PHY,"[UE %d][RAPROC] Frame %d, subframe %d: Generating PRACH (eNB %d) preamble index %d for UL, TX power %d dBm (PL %d dB), l3msg \n", phy_vars_ue->Mod_id,phy_vars_ue->frame,next_slot>>1,eNB_id, @@ -1333,6 +1351,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs } } // next_slot is even vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT); + stop_meas(&phy_vars_ue->phy_proc_tx); } void phy_procedures_UE_S_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abstraction_flag,relaying_type_t r_type) { @@ -1453,6 +1472,9 @@ void lte_ue_measurement_procedures(u8 last_slot, u16 l, PHY_VARS_UE *phy_vars_ue ue_rrc_measurements(phy_vars_ue, last_slot, abstraction_flag); + + phy_vars_ue->sinr_eff = sinr_eff_cqi_calc(phy_vars_ue, 0); + } if ((last_slot==1) && (l==(4-frame_parms->Ncp))) { @@ -2250,6 +2272,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8 int pmch_mcs=-1; u8 mcch_active=0; vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_IN); + 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", (r_type == multicast_relay) ? "RN/UE" : "UE", @@ -2301,11 +2324,13 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8 // RX processing of symbols in last_slot for (l=0;l<n_symb;l++) { if (abstraction_flag == 0) { + start_meas(&phy_vars_ue->ofdm_demod_stats); slot_fep(phy_vars_ue, l, last_slot, phy_vars_ue->rx_offset, 0); + stop_meas(&phy_vars_ue->ofdm_demod_stats); } //if (subframe_select(&phy_vars_ue->lte_frame_parms,last_slot>>1) == SF_DL) @@ -2399,6 +2424,8 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8 // process symbols 10,11,12 and trigger DLSCH decoding if (abstraction_flag == 0) { + + start_meas(&phy_vars_ue->dlsch_llr_stats); for (m=pilot3;m<phy_vars_ue->lte_frame_parms.symbols_per_tti;m++) { rx_pdsch(phy_vars_ue, @@ -2412,6 +2439,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8 i_mod, phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid); } + stop_meas(&phy_vars_ue->dlsch_llr_stats); } phy_vars_ue->dlsch_ue[eNB_id][0]->active = 0; @@ -2432,14 +2460,17 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8 get_Qm(phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs), phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, phy_vars_ue->frame,(((last_slot>>1)==0) ? 9 : ((last_slot>>1)-1))); - dlsch_unscrambling(&phy_vars_ue->lte_frame_parms, - 0, - phy_vars_ue->dlsch_ue[0][0], - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->G, - phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->llr[0], - 0, - ((((last_slot>>1)==0) ? 9 : ((last_slot>>1))-1))<<1); - + start_meas(&phy_vars_ue->dlsch_unscrambling_stats); + dlsch_unscrambling(&phy_vars_ue->lte_frame_parms, + 0, + phy_vars_ue->dlsch_ue[0][0], + phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->G, + phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->llr[0], + 0, + ((((last_slot>>1)==0) ? 9 : ((last_slot>>1))-1))<<1); + stop_meas(&phy_vars_ue->dlsch_unscrambling_stats); + + start_meas(&phy_vars_ue->dlsch_decoding_stats); ret = dlsch_decoding(phy_vars_ue, phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->llr[0], &phy_vars_ue->lte_frame_parms, @@ -2448,7 +2479,8 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8 (((last_slot>>1)==0) ? 9 : ((last_slot>>1)-1)), harq_pid, 1,0); - } + stop_meas(&phy_vars_ue->dlsch_decoding_stats); + } else { LOG_D(PHY,"Calling dlsch_decoding_emul ...\n"); @@ -2538,6 +2570,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8 // process symbols 10,11,12 (13) of last SF and trigger DLSCH decoding if (abstraction_flag==0) { + start_meas(&phy_vars_ue->dlsch_llr_stats); for (m=pilot3;m<phy_vars_ue->lte_frame_parms.symbols_per_tti;m++) { #ifdef DEBUG_PHY_PROC /* @@ -2556,6 +2589,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8 phy_vars_ue->is_secondary_ue, phy_vars_ue->dlsch_ue_SI[eNB_id]->current_harq_pid); } + stop_meas(&phy_vars_ue->dlsch_llr_stats); } // write_output("dlsch_ra_llr.m","llr",lte_ue_pdsch_vars_ra[eNB_id]->llr[0],40,1,0); @@ -2628,6 +2662,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8 // dump_dlsch_SI(phy_vars_ue,eNB_id,(((last_slot>>1)==0) ? 9 : ((last_slot>>1)-1))); #endif vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); + stop_meas(&phy_vars_ue->phy_proc_rx); return(-1); } else { @@ -2673,6 +2708,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8 // process symbols 10,11,12 and trigger DLSCH decoding if (abstraction_flag==0) { + start_meas(&phy_vars_ue->dlsch_llr_stats); for (m=pilot3;m<phy_vars_ue->lte_frame_parms.symbols_per_tti;m++) rx_pdsch(phy_vars_ue, RA_PDSCH, @@ -2685,6 +2721,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8 phy_vars_ue->is_secondary_ue, phy_vars_ue->dlsch_ue_ra[eNB_id]->current_harq_pid); } + stop_meas(&phy_vars_ue->dlsch_llr_stats); phy_vars_ue->dlsch_ue_ra[eNB_id]->active = 0; @@ -2696,7 +2733,8 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8 else { LOG_E(PHY,"[UE %d] Frame %d, subframe %d: FATAL, prach_resources is NULL\n",phy_vars_ue->Mod_id,phy_vars_ue->frame,last_slot>>1); mac_xface->macphy_exit(""); - vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); + stop_meas(&phy_vars_ue->phy_proc_rx); return 0; } @@ -2751,6 +2789,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8 #endif // oai_exit=1; vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); + stop_meas(&phy_vars_ue->phy_proc_rx); return(-1); } @@ -2859,7 +2898,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8 if (abstraction_flag==0) { if (((last_slot%2)==1) && (l==0)) { - + start_meas(&phy_vars_ue->dlsch_llr_stats); for (m=phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols; m<pilot2; m++) { @@ -2921,9 +2960,11 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8 phy_vars_ue->dlsch_ue_ra[eNB_id]->current_harq_pid); } // RA active } // loop from first dlsch symbol to end of slot + stop_meas(&phy_vars_ue->dlsch_llr_stats); } // 2nd quarter if (((last_slot%2)==1) && (l==pilot1)) { + start_meas(&phy_vars_ue->dlsch_llr_stats); for (m=pilot2;m<pilot3;m++) { #ifndef DLSCH_THREAD @@ -2981,6 +3022,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8 } // RA active } // loop over 3rd quarter + stop_meas(&phy_vars_ue->dlsch_llr_stats); } // 3rd quarter of subframe } // abstraction_flag==0 }// l loop @@ -3152,6 +3194,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8 } } vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); + stop_meas(&phy_vars_ue->phy_proc_rx); return (0); } @@ -3310,7 +3353,7 @@ void phy_UE_lte_check_measurement_thresholds(instance_t instanceP, ral_threshold vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *((volatile unsigned int *) openair0_exmimo_pci[card].rxcnt_ptr[0])); #endif #endif - + start_meas(&phy_vars_ue->phy_proc); #if defined(ENABLE_ITTI) do { // Checks if a message has been sent to PHY sub-task @@ -3521,4 +3564,5 @@ void phy_UE_lte_check_measurement_thresholds(instance_t instanceP, ral_threshold phy_vars_ue->frame++; vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_LTE,0); + stop_meas(&phy_vars_ue->phy_proc); } diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs0.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs0.csv new file mode 100644 index 00000000000..cb650854d31 --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs0.csv @@ -0,0 +1,75 @@ +SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err +-7.000000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0 +-6.900000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0 +-6.800000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0 +-6.700000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0 +-6.600000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0 +-6.500000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0 +-6.400000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0 +-6.300000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0 +-6.200000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0 +-6.100000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0 +-6.000000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0 +-5.900000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0 +-5.800000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0 +-5.700000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0 +-5.600000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0 +-5.500000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0 +-5.400000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0 +-5.300000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0 +-5.200000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0 +-5.100000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0 +-5.000000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0 +-4.900000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0 +-4.800000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0 +-4.700000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0 +-4.600000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0 +-4.500000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0 +-4.400000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0 +-4.300000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0 +-4.200000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0 +-4.100000;0;680;0.090667;4999;5002;0;0;0;0;0;0;0 +-4.000000;0;680;0.090667;4994;5002;0;0;0;0;0;0;0 +-3.900000;0;680;0.090667;4980;5002;0;0;0;0;0;0;0 +-3.800000;0;680;0.090667;4954;5002;0;0;0;0;0;0;0 +-3.700000;0;680;0.090667;4921;5002;0;0;0;0;0;0;0 +-3.600000;0;680;0.090667;4833;5002;0;0;0;0;0;0;0 +-3.500000;0;680;0.090667;4639;5002;0;0;0;0;0;0;0 +-3.400000;0;680;0.090667;4467;5002;0;0;0;0;0;0;0 +-3.300000;0;680;0.090667;4169;5002;0;0;0;0;0;0;0 +-3.200000;0;680;0.090667;3725;5002;0;0;0;0;0;0;0 +-3.100000;0;680;0.090667;3342;5002;0;0;0;0;0;0;0 +-3.000000;0;680;0.090667;2792;5002;0;0;0;0;0;0;0 +-2.900000;0;680;0.090667;2290;5002;0;0;0;0;0;0;0 +-2.800000;0;680;0.090667;1859;5002;0;0;0;0;0;0;0 +-2.700000;0;680;0.090667;1438;5002;0;0;0;0;0;0;0 +-2.600000;0;680;0.090667;1097;5002;0;0;0;0;0;0;0 +-2.500000;0;680;0.090667;1000;6360;0;0;0;0;0;0;0 +-2.400000;0;680;0.090667;1000;8356;0;0;0;0;0;0;0 +-2.300000;0;680;0.090667;963;10000;0;0;0;0;0;0;0 +-2.200000;0;680;0.090667;740;10000;0;0;0;0;0;0;0 +-2.100000;0;680;0.090667;634;10000;0;0;0;0;0;0;0 +-2.000000;0;680;0.090667;519;10000;0;0;0;0;0;0;0 +-1.900000;0;680;0.090667;519;10000;0;0;0;0;0;0;0 +-1.800000;0;680;0.090667;494;10000;0;0;0;0;0;0;0 +-1.700000;0;680;0.090667;425;10000;0;0;0;0;0;0;0 +-1.600000;0;680;0.090667;420;10000;0;0;0;0;0;0;0 +-1.500000;0;680;0.090667;372;10000;0;0;0;0;0;0;0 +-1.400000;0;680;0.090667;347;10000;0;0;0;0;0;0;0 +-1.300000;0;680;0.090667;297;10000;0;0;0;0;0;0;0 +-1.200000;0;680;0.090667;294;10000;0;0;0;0;0;0;0 +-1.100000;0;680;0.090667;260;10000;0;0;0;0;0;0;0 +-1.000000;0;680;0.090667;254;10000;0;0;0;0;0;0;0 +-0.900000;0;680;0.090667;247;10000;0;0;0;0;0;0;0 +-0.800000;0;680;0.090667;209;10000;0;0;0;0;0;0;0 +-0.700000;0;680;0.090667;190;10000;0;0;0;0;0;0;0 +-0.600000;0;680;0.090667;207;10000;0;0;0;0;0;0;0 +-0.500000;0;680;0.090667;171;10000;0;0;0;0;0;0;0 +-0.400000;0;680;0.090667;169;10000;0;0;0;0;0;0;0 +-0.300000;0;680;0.090667;150;10000;0;0;0;0;0;0;0 +-0.200000;0;680;0.090667;125;10000;0;0;0;0;0;0;0 +-0.100000;0;680;0.090667;125;10000;0;0;0;0;0;0;0 +-0.000000;0;680;0.090667;110;10000;0;0;0;0;0;0;0 +0.100000;0;680;0.090667;103;10000;0;0;0;0;0;0;0 +0.200000;0;680;0.090667;104;10000;0;0;0;0;0;0;0 +0.300000;0;680;0.090667;88;10000;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs1.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs1.csv new file mode 100644 index 00000000000..7aa750f13f5 --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs1.csv @@ -0,0 +1,72 @@ +SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err +-6.000000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0 +-5.900000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0 +-5.800000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0 +-5.700000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0 +-5.600000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0 +-5.500000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0 +-5.400000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0 +-5.300000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0 +-5.200000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0 +-5.100000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0 +-5.000000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0 +-4.900000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0 +-4.800000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0 +-4.700000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0 +-4.600000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0 +-4.500000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0 +-4.400000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0 +-4.300000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0 +-4.200000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0 +-4.100000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0 +-4.000000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0 +-3.900000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0 +-3.800000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0 +-3.700000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0 +-3.600000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0 +-3.500000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0 +-3.400000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0 +-3.300000;1;904;0.120533;5001;5002;0;0;0;0;0;0;0 +-3.200000;1;904;0.120533;5000;5002;0;0;0;0;0;0;0 +-3.100000;1;904;0.120533;4997;5002;0;0;0;0;0;0;0 +-3.000000;1;904;0.120533;4985;5002;0;0;0;0;0;0;0 +-2.900000;1;904;0.120533;4957;5002;0;0;0;0;0;0;0 +-2.800000;1;904;0.120533;4907;5002;0;0;0;0;0;0;0 +-2.700000;1;904;0.120533;4820;5002;0;0;0;0;0;0;0 +-2.600000;1;904;0.120533;4639;5002;0;0;0;0;0;0;0 +-2.500000;1;904;0.120533;4448;5002;0;0;0;0;0;0;0 +-2.400000;1;904;0.120533;4108;5002;0;0;0;0;0;0;0 +-2.300000;1;904;0.120533;3632;5002;0;0;0;0;0;0;0 +-2.200000;1;904;0.120533;3086;5002;0;0;0;0;0;0;0 +-2.100000;1;904;0.120533;2593;5002;0;0;0;0;0;0;0 +-2.000000;1;904;0.120533;1930;5002;0;0;0;0;0;0;0 +-1.900000;1;904;0.120533;1445;5002;0;0;0;0;0;0;0 +-1.800000;1;904;0.120533;1025;5002;0;0;0;0;0;0;0 +-1.700000;1;904;0.120533;1000;6622;0;0;0;0;0;0;0 +-1.600000;1;904;0.120533;1000;8803;0;0;0;0;0;0;0 +-1.500000;1;904;0.120533;806;10000;0;0;0;0;0;0;0 +-1.400000;1;904;0.120533;681;10000;0;0;0;0;0;0;0 +-1.300000;1;904;0.120533;560;10000;0;0;0;0;0;0;0 +-1.200000;1;904;0.120533;484;10000;0;0;0;0;0;0;0 +-1.100000;1;904;0.120533;466;10000;0;0;0;0;0;0;0 +-1.000000;1;904;0.120533;370;10000;0;0;0;0;0;0;0 +-0.900000;1;904;0.120533;401;10000;0;0;0;0;0;0;0 +-0.800000;1;904;0.120533;389;10000;0;0;0;0;0;0;0 +-0.700000;1;904;0.120533;363;10000;0;0;0;0;0;0;0 +-0.600000;1;904;0.120533;335;10000;0;0;0;0;0;0;0 +-0.500000;1;904;0.120533;305;10000;0;0;0;0;0;0;0 +-0.400000;1;904;0.120533;276;10000;0;0;0;0;0;0;0 +-0.300000;1;904;0.120533;302;10000;0;0;0;0;0;0;0 +-0.200000;1;904;0.120533;258;10000;0;0;0;0;0;0;0 +-0.100000;1;904;0.120533;242;10000;0;0;0;0;0;0;0 +-0.000000;1;904;0.120533;233;10000;0;0;0;0;0;0;0 +0.100000;1;904;0.120533;229;10000;0;0;0;0;0;0;0 +0.200000;1;904;0.120533;210;10000;0;0;0;0;0;0;0 +0.300000;1;904;0.120533;190;10000;0;0;0;0;0;0;0 +0.400000;1;904;0.120533;162;10000;0;0;0;0;0;0;0 +0.500000;1;904;0.120533;144;10000;0;0;0;0;0;0;0 +0.600000;1;904;0.120533;156;10000;0;0;0;0;0;0;0 +0.700000;1;904;0.120533;138;10000;0;0;0;0;0;0;0 +0.800000;1;904;0.120533;130;10000;0;0;0;0;0;0;0 +0.900000;1;904;0.120533;101;10000;0;0;0;0;0;0;0 +1.000000;1;904;0.120533;94;10000;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs10.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs10.csv new file mode 100644 index 00000000000..b3792f15399 --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs10.csv @@ -0,0 +1,83 @@ +SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err +1.000000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +1.100000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +1.200000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +1.300000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +1.400000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +1.500000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +1.600000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +1.700000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +1.800000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +1.900000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +2.000000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +2.100000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +2.200000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +2.300000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +2.400000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +2.500000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +2.600000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +2.700000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +2.800000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +2.900000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +3.000000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +3.100000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +3.200000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +3.300000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +3.400000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +3.500000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +3.600000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +3.700000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +3.800000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +3.900000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +4.000000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +4.100000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +4.200000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0 +4.300000;10;4008;0.267200;4992;5002;0;0;0;0;0;0;0 +4.400000;10;4008;0.267200;4947;5002;0;0;0;0;0;0;0 +4.500000;10;4008;0.267200;4838;5002;0;0;0;0;0;0;0 +4.600000;10;4008;0.267200;4521;5002;0;0;0;0;0;0;0 +4.700000;10;4008;0.267200;3977;5002;0;0;0;0;0;0;0 +4.800000;10;4008;0.267200;3034;5002;0;0;0;0;0;0;0 +4.900000;10;4008;0.267200;2257;5002;0;0;0;0;0;0;0 +5.000000;10;4008;0.267200;1435;5002;0;0;0;0;0;0;0 +5.100000;10;4008;0.267200;1000;5561;0;0;0;0;0;0;0 +5.200000;10;4008;0.267200;1000;8160;0;0;0;0;0;0;0 +5.300000;10;4008;0.267200;974;10000;0;0;0;0;0;0;0 +5.400000;10;4008;0.267200;845;10000;0;0;0;0;0;0;0 +5.500000;10;4008;0.267200;752;10000;0;0;0;0;0;0;0 +5.600000;10;4008;0.267200;738;10000;0;0;0;0;0;0;0 +5.700000;10;4008;0.267200;703;10000;0;0;0;0;0;0;0 +5.800000;10;4008;0.267200;635;10000;0;0;0;0;0;0;0 +5.900000;10;4008;0.267200;630;10000;0;0;0;0;0;0;0 +6.000000;10;4008;0.267200;574;10000;0;0;0;0;0;0;0 +6.100000;10;4008;0.267200;557;10000;0;0;0;0;0;0;0 +6.200000;10;4008;0.267200;556;10000;0;0;0;0;0;0;0 +6.300000;10;4008;0.267200;507;10000;0;0;0;0;0;0;0 +6.400000;10;4008;0.267200;492;10000;0;0;0;0;0;0;0 +6.500000;10;4008;0.267200;453;10000;0;0;0;0;0;0;0 +6.600000;10;4008;0.267200;488;10000;0;0;0;0;0;0;0 +6.700000;10;4008;0.267200;442;10000;0;0;0;0;0;0;0 +6.800000;10;4008;0.267200;441;10000;0;0;0;0;0;0;0 +6.900000;10;4008;0.267200;429;10000;0;0;0;0;0;0;0 +7.000000;10;4008;0.267200;388;10000;0;0;0;0;0;0;0 +7.100000;10;4008;0.267200;355;10000;0;0;0;0;0;0;0 +7.200000;10;4008;0.267200;361;10000;0;0;0;0;0;0;0 +7.300000;10;4008;0.267200;325;10000;0;0;0;0;0;0;0 +7.400000;10;4008;0.267200;313;10000;0;0;0;0;0;0;0 +7.500000;10;4008;0.267200;302;10000;0;0;0;0;0;0;0 +7.600000;10;4008;0.267200;238;10000;0;0;0;0;0;0;0 +7.700000;10;4008;0.267200;254;10000;0;0;0;0;0;0;0 +7.800000;10;4008;0.267200;225;10000;0;0;0;0;0;0;0 +7.900000;10;4008;0.267200;199;10000;0;0;0;0;0;0;0 +8.000000;10;4008;0.267200;225;10000;0;0;0;0;0;0;0 +8.100000;10;4008;0.267200;181;10000;0;0;0;0;0;0;0 +8.200000;10;4008;0.267200;177;10000;0;0;0;0;0;0;0 +8.300000;10;4008;0.267200;167;10000;0;0;0;0;0;0;0 +8.400000;10;4008;0.267200;158;10000;0;0;0;0;0;0;0 +8.500000;10;4008;0.267200;161;10000;0;0;0;0;0;0;0 +8.600000;10;4008;0.267200;124;10000;0;0;0;0;0;0;0 +8.700000;10;4008;0.267200;128;10000;0;0;0;0;0;0;0 +8.800000;10;4008;0.267200;129;10000;0;0;0;0;0;0;0 +8.900000;10;4008;0.267200;117;10000;0;0;0;0;0;0;0 +9.000000;10;4008;0.267200;104;10000;0;0;0;0;0;0;0 +9.100000;10;4008;0.267200;97;10000;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs11.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs11.csv new file mode 100644 index 00000000000..6d500ea1a65 --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs11.csv @@ -0,0 +1,40 @@ +SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err +2.000000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0 +2.100000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0 +2.200000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0 +2.300000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0 +2.400000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0 +2.500000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0 +2.600000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0 +2.700000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0 +2.800000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0 +2.900000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0 +3.000000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0 +3.100000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0 +3.200000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0 +3.300000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0 +3.400000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0 +3.500000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0 +3.600000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0 +3.700000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0 +3.800000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0 +3.900000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0 +4.000000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0 +4.100000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0 +4.200000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0 +4.300000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0 +4.400000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0 +4.500000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0 +4.600000;11;4392;0.292800;5001;5002;0;0;0;0;0;0;0 +4.700000;11;4392;0.292800;4986;5002;0;0;0;0;0;0;0 +4.800000;11;4392;0.292800;4941;5002;0;0;0;0;0;0;0 +4.900000;11;4392;0.292800;4730;5002;0;0;0;0;0;0;0 +5.000000;11;4392;0.292800;4250;5002;0;0;0;0;0;0;0 +5.100000;11;4392;0.292800;3440;5002;0;0;0;0;0;0;0 +5.200000;11;4392;0.292800;2397;5002;0;0;0;0;0;0;0 +5.300000;11;4392;0.292800;1403;5002;0;0;0;0;0;0;0 +5.400000;11;4392;0.292800;1000;6845;0;0;0;0;0;0;0 +5.500000;11;4392;0.292800;657;10000;0;0;0;0;0;0;0 +5.600000;11;4392;0.292800;255;10000;0;0;0;0;0;0;0 +5.700000;11;4392;0.292800;151;10000;0;0;0;0;0;0;0 +5.800000;11;4392;0.292800;65;10000;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs12.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs12.csv new file mode 100644 index 00000000000..bdcb811f2e1 --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs12.csv @@ -0,0 +1,33 @@ +SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err +3.000000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0 +3.100000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0 +3.200000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0 +3.300000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0 +3.400000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0 +3.500000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0 +3.600000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0 +3.700000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0 +3.800000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0 +3.900000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0 +4.000000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0 +4.100000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0 +4.200000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0 +4.300000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0 +4.400000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0 +4.500000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0 +4.600000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0 +4.700000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0 +4.800000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0 +4.900000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0 +5.000000;12;4968;0.331200;5001;5002;0;0;0;0;0;0;0 +5.100000;12;4968;0.331200;4999;5002;0;0;0;0;0;0;0 +5.200000;12;4968;0.331200;4980;5002;0;0;0;0;0;0;0 +5.300000;12;4968;0.331200;4909;5002;0;0;0;0;0;0;0 +5.400000;12;4968;0.331200;4655;5002;0;0;0;0;0;0;0 +5.500000;12;4968;0.331200;4022;5002;0;0;0;0;0;0;0 +5.600000;12;4968;0.331200;3049;5002;0;0;0;0;0;0;0 +5.700000;12;4968;0.331200;1912;5002;0;0;0;0;0;0;0 +5.800000;12;4968;0.331200;1063;5002;0;0;0;0;0;0;0 +5.900000;12;4968;0.331200;843;10000;0;0;0;0;0;0;0 +6.000000;12;4968;0.331200;310;10000;0;0;0;0;0;0;0 +6.100000;12;4968;0.331200;86;10000;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs13.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs13.csv new file mode 100644 index 00000000000..99baee16f7b --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs13.csv @@ -0,0 +1,32 @@ +SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err +4.000000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0 +4.100000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0 +4.200000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0 +4.300000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0 +4.400000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0 +4.500000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0 +4.600000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0 +4.700000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0 +4.800000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0 +4.900000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0 +5.000000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0 +5.100000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0 +5.200000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0 +5.300000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0 +5.400000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0 +5.500000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0 +5.600000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0 +5.700000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0 +5.800000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0 +5.900000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0 +6.000000;13;5736;0.382400;5000;5002;0;0;0;0;0;0;0 +6.100000;13;5736;0.382400;4991;5002;0;0;0;0;0;0;0 +6.200000;13;5736;0.382400;4940;5002;0;0;0;0;0;0;0 +6.300000;13;5736;0.382400;4741;5002;0;0;0;0;0;0;0 +6.400000;13;5736;0.382400;4192;5002;0;0;0;0;0;0;0 +6.500000;13;5736;0.382400;3241;5002;0;0;0;0;0;0;0 +6.600000;13;5736;0.382400;2133;5002;0;0;0;0;0;0;0 +6.700000;13;5736;0.382400;1057;5002;0;0;0;0;0;0;0 +6.800000;13;5736;0.382400;889;10000;0;0;0;0;0;0;0 +6.900000;13;5736;0.382400;311;10000;0;0;0;0;0;0;0 +7.000000;13;5736;0.382400;87;10000;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs14.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs14.csv new file mode 100644 index 00000000000..d8049c8abe3 --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs14.csv @@ -0,0 +1,61 @@ +SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err +5.000000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0 +5.100000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0 +5.200000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0 +5.300000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0 +5.400000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0 +5.500000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0 +5.600000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0 +5.700000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0 +5.800000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0 +5.900000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0 +6.000000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0 +6.100000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0 +6.200000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0 +6.300000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0 +6.400000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0 +6.500000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0 +6.600000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0 +6.700000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0 +6.800000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0 +6.900000;14;6456;0.430400;5001;5002;0;0;0;0;0;0;0 +7.000000;14;6456;0.430400;4994;5002;0;0;0;0;0;0;0 +7.100000;14;6456;0.430400;4958;5002;0;0;0;0;0;0;0 +7.200000;14;6456;0.430400;4813;5002;0;0;0;0;0;0;0 +7.300000;14;6456;0.430400;4460;5002;0;0;0;0;0;0;0 +7.400000;14;6456;0.430400;3755;5002;0;0;0;0;0;0;0 +7.500000;14;6456;0.430400;2907;5002;0;0;0;0;0;0;0 +7.600000;14;6456;0.430400;1964;5002;0;0;0;0;0;0;0 +7.700000;14;6456;0.430400;1264;5002;0;0;0;0;0;0;0 +7.800000;14;6456;0.430400;1000;6588;0;0;0;0;0;0;0 +7.900000;14;6456;0.430400;998;10000;0;0;0;0;0;0;0 +8.000000;14;6456;0.430400;712;10000;0;0;0;0;0;0;0 +8.100000;14;6456;0.430400;588;10000;0;0;0;0;0;0;0 +8.200000;14;6456;0.430400;548;10000;0;0;0;0;0;0;0 +8.300000;14;6456;0.430400;548;10000;0;0;0;0;0;0;0 +8.400000;14;6456;0.430400;442;10000;0;0;0;0;0;0;0 +8.500000;14;6456;0.430400;420;10000;0;0;0;0;0;0;0 +8.600000;14;6456;0.430400;395;10000;0;0;0;0;0;0;0 +8.700000;14;6456;0.430400;361;10000;0;0;0;0;0;0;0 +8.800000;14;6456;0.430400;334;10000;0;0;0;0;0;0;0 +8.900000;14;6456;0.430400;310;10000;0;0;0;0;0;0;0 +9.000000;14;6456;0.430400;306;10000;0;0;0;0;0;0;0 +9.100000;14;6456;0.430400;302;10000;0;0;0;0;0;0;0 +9.200000;14;6456;0.430400;280;10000;0;0;0;0;0;0;0 +9.300000;14;6456;0.430400;270;10000;0;0;0;0;0;0;0 +9.400000;14;6456;0.430400;254;10000;0;0;0;0;0;0;0 +9.500000;14;6456;0.430400;259;10000;0;0;0;0;0;0;0 +9.600000;14;6456;0.430400;247;10000;0;0;0;0;0;0;0 +9.700000;14;6456;0.430400;228;10000;0;0;0;0;0;0;0 +9.800000;14;6456;0.430400;208;10000;0;0;0;0;0;0;0 +9.900000;14;6456;0.430400;211;10000;0;0;0;0;0;0;0 +10.000000;14;6456;0.430400;190;10000;0;0;0;0;0;0;0 +10.100000;14;6456;0.430400;182;10000;0;0;0;0;0;0;0 +10.200000;14;6456;0.430400;175;10000;0;0;0;0;0;0;0 +10.300000;14;6456;0.430400;137;10000;0;0;0;0;0;0;0 +10.400000;14;6456;0.430400;161;10000;0;0;0;0;0;0;0 +10.500000;14;6456;0.430400;142;10000;0;0;0;0;0;0;0 +10.600000;14;6456;0.430400;133;10000;0;0;0;0;0;0;0 +10.700000;14;6456;0.430400;119;10000;0;0;0;0;0;0;0 +10.800000;14;6456;0.430400;107;10000;0;0;0;0;0;0;0 +10.900000;14;6456;0.430400;80;10000;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs15.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs15.csv new file mode 100644 index 00000000000..e9413cf454a --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs15.csv @@ -0,0 +1,48 @@ +SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err +6.000000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0 +6.100000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0 +6.200000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0 +6.300000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0 +6.400000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0 +6.500000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0 +6.600000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0 +6.700000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0 +6.800000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0 +6.900000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0 +7.000000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0 +7.100000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0 +7.200000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0 +7.300000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0 +7.400000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0 +7.500000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0 +7.600000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0 +7.700000;15;7224;0.481600;4999;5002;0;0;0;0;0;0;0 +7.800000;15;7224;0.481600;4985;5002;0;0;0;0;0;0;0 +7.900000;15;7224;0.481600;4898;5002;0;0;0;0;0;0;0 +8.000000;15;7224;0.481600;4612;5002;0;0;0;0;0;0;0 +8.100000;15;7224;0.481600;4067;5002;0;0;0;0;0;0;0 +8.200000;15;7224;0.481600;3175;5002;0;0;0;0;0;0;0 +8.300000;15;7224;0.481600;2186;5002;0;0;0;0;0;0;0 +8.400000;15;7224;0.481600;1363;5002;0;0;0;0;0;0;0 +8.500000;15;7224;0.481600;1000;6598;0;0;0;0;0;0;0 +8.600000;15;7224;0.481600;913;10000;0;0;0;0;0;0;0 +8.700000;15;7224;0.481600;582;10000;0;0;0;0;0;0;0 +8.800000;15;7224;0.481600;437;10000;0;0;0;0;0;0;0 +8.900000;15;7224;0.481600;369;10000;0;0;0;0;0;0;0 +9.000000;15;7224;0.481600;355;10000;0;0;0;0;0;0;0 +9.100000;15;7224;0.481600;293;10000;0;0;0;0;0;0;0 +9.200000;15;7224;0.481600;288;10000;0;0;0;0;0;0;0 +9.300000;15;7224;0.481600;274;10000;0;0;0;0;0;0;0 +9.400000;15;7224;0.481600;266;10000;0;0;0;0;0;0;0 +9.500000;15;7224;0.481600;231;10000;0;0;0;0;0;0;0 +9.600000;15;7224;0.481600;178;10000;0;0;0;0;0;0;0 +9.700000;15;7224;0.481600;186;10000;0;0;0;0;0;0;0 +9.800000;15;7224;0.481600;151;10000;0;0;0;0;0;0;0 +9.900000;15;7224;0.481600;190;10000;0;0;0;0;0;0;0 +10.000000;15;7224;0.481600;122;10000;0;0;0;0;0;0;0 +10.100000;15;7224;0.481600;158;10000;0;0;0;0;0;0;0 +10.200000;15;7224;0.481600;131;10000;0;0;0;0;0;0;0 +10.300000;15;7224;0.481600;125;10000;0;0;0;0;0;0;0 +10.400000;15;7224;0.481600;125;10000;0;0;0;0;0;0;0 +10.500000;15;7224;0.481600;106;10000;0;0;0;0;0;0;0 +10.600000;15;7224;0.481600;88;10000;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs16.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs16.csv new file mode 100644 index 00000000000..e89fda9219a --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs16.csv @@ -0,0 +1,50 @@ +SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err +5.000000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +5.100000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +5.200000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +5.300000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +5.400000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +5.500000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +5.600000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +5.700000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +5.800000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +5.900000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +6.000000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +6.100000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +6.200000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +6.300000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +6.400000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +6.500000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +6.600000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +6.700000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +6.800000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +6.900000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +7.000000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +7.100000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +7.200000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +7.300000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +7.400000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +7.500000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +7.600000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +7.700000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +7.800000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +7.900000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +8.000000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +8.100000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0 +8.200000;16;7736;0.515733;5000;5002;0;0;0;0;0;0;0 +8.300000;16;7736;0.515733;4992;5002;0;0;0;0;0;0;0 +8.400000;16;7736;0.515733;4936;5002;0;0;0;0;0;0;0 +8.500000;16;7736;0.515733;4730;5002;0;0;0;0;0;0;0 +8.600000;16;7736;0.515733;4205;5002;0;0;0;0;0;0;0 +8.700000;16;7736;0.515733;3357;5002;0;0;0;0;0;0;0 +8.800000;16;7736;0.515733;2255;5002;0;0;0;0;0;0;0 +8.900000;16;7736;0.515733;1374;5002;0;0;0;0;0;0;0 +9.000000;16;7736;0.515733;1000;7260;0;0;0;0;0;0;0 +9.100000;16;7736;0.515733;690;10000;0;0;0;0;0;0;0 +9.200000;16;7736;0.515733;354;10000;0;0;0;0;0;0;0 +9.300000;16;7736;0.515733;214;10000;0;0;0;0;0;0;0 +9.400000;16;7736;0.515733;127;10000;0;0;0;0;0;0;0 +9.500000;16;7736;0.515733;138;10000;0;0;0;0;0;0;0 +9.600000;16;7736;0.515733;105;10000;0;0;0;0;0;0;0 +9.700000;16;7736;0.515733;108;10000;0;0;0;0;0;0;0 +9.800000;16;7736;0.515733;93;10000;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs17.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs17.csv new file mode 100644 index 00000000000..92ebc450c23 --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs17.csv @@ -0,0 +1,55 @@ +SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err +6.000000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +6.100000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +6.200000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +6.300000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +6.400000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +6.500000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +6.600000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +6.700000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +6.800000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +6.900000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +7.000000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +7.100000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +7.200000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +7.300000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +7.400000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +7.500000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +7.600000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +7.700000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +7.800000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +7.900000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +8.000000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +8.100000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +8.200000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +8.300000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +8.400000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +8.500000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +8.600000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +8.700000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +8.800000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +8.900000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +9.000000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +9.100000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +9.200000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +9.300000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0 +9.400000;17;7736;0.343822;4987;5002;0;0;0;0;0;0;0 +9.500000;17;7736;0.343822;4939;5002;0;0;0;0;0;0;0 +9.600000;17;7736;0.343822;4707;5002;0;0;0;0;0;0;0 +9.700000;17;7736;0.343822;4220;5002;0;0;0;0;0;0;0 +9.800000;17;7736;0.343822;3337;5002;0;0;0;0;0;0;0 +9.900000;17;7736;0.343822;2314;5002;0;0;0;0;0;0;0 +10.000000;17;7736;0.343822;1353;5002;0;0;0;0;0;0;0 +10.100000;17;7736;0.343822;1000;6908;0;0;0;0;0;0;0 +10.200000;17;7736;0.343822;781;10000;0;0;0;0;0;0;0 +10.300000;17;7736;0.343822;417;10000;0;0;0;0;0;0;0 +10.400000;17;7736;0.343822;288;10000;0;0;0;0;0;0;0 +10.500000;17;7736;0.343822;209;10000;0;0;0;0;0;0;0 +10.600000;17;7736;0.343822;195;10000;0;0;0;0;0;0;0 +10.700000;17;7736;0.343822;158;10000;0;0;0;0;0;0;0 +10.800000;17;7736;0.343822;203;10000;0;0;0;0;0;0;0 +10.900000;17;7736;0.343822;161;10000;0;0;0;0;0;0;0 +11.000000;17;7736;0.343822;119;10000;0;0;0;0;0;0;0 +11.100000;17;7736;0.343822;138;10000;0;0;0;0;0;0;0 +11.200000;17;7736;0.343822;124;10000;0;0;0;0;0;0;0 +11.300000;17;7736;0.343822;94;10000;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs18.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs18.csv new file mode 100644 index 00000000000..9b32fb2fee1 --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs18.csv @@ -0,0 +1,38 @@ +SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err +7.000000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0 +7.100000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0 +7.200000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0 +7.300000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0 +7.400000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0 +7.500000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0 +7.600000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0 +7.700000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0 +7.800000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0 +7.900000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0 +8.000000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0 +8.100000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0 +8.200000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0 +8.300000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0 +8.400000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0 +8.500000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0 +8.600000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0 +8.700000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0 +8.800000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0 +8.900000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0 +9.000000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0 +9.100000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0 +9.200000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0 +9.300000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0 +9.400000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0 +9.500000;18;7992;0.355200;5001;5002;0;0;0;0;0;0;0 +9.600000;18;7992;0.355200;4983;5002;0;0;0;0;0;0;0 +9.700000;18;7992;0.355200;4928;5002;0;0;0;0;0;0;0 +9.800000;18;7992;0.355200;4709;5002;0;0;0;0;0;0;0 +9.900000;18;7992;0.355200;4200;5002;0;0;0;0;0;0;0 +10.000000;18;7992;0.355200;3257;5002;0;0;0;0;0;0;0 +10.100000;18;7992;0.355200;2195;5002;0;0;0;0;0;0;0 +10.200000;18;7992;0.355200;1197;5002;0;0;0;0;0;0;0 +10.300000;18;7992;0.355200;1000;8488;0;0;0;0;0;0;0 +10.400000;18;7992;0.355200;533;10000;0;0;0;0;0;0;0 +10.500000;18;7992;0.355200;185;10000;0;0;0;0;0;0;0 +10.600000;18;7992;0.355200;61;10000;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs19.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs19.csv new file mode 100644 index 00000000000..8ed3997616e --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs19.csv @@ -0,0 +1,43 @@ +SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err +8.000000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0 +8.100000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0 +8.200000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0 +8.300000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0 +8.400000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0 +8.500000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0 +8.600000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0 +8.700000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0 +8.800000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0 +8.900000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0 +9.000000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0 +9.100000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0 +9.200000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0 +9.300000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0 +9.400000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0 +9.500000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0 +9.600000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0 +9.700000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0 +9.800000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0 +9.900000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0 +10.000000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0 +10.100000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0 +10.200000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0 +10.300000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0 +10.400000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0 +10.500000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0 +10.600000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0 +10.700000;19;9144;0.406400;5000;5002;0;0;0;0;0;0;0 +10.800000;19;9144;0.406400;4992;5002;0;0;0;0;0;0;0 +10.900000;19;9144;0.406400;4914;5002;0;0;0;0;0;0;0 +11.000000;19;9144;0.406400;4677;5002;0;0;0;0;0;0;0 +11.100000;19;9144;0.406400;4127;5002;0;0;0;0;0;0;0 +11.200000;19;9144;0.406400;3249;5002;0;0;0;0;0;0;0 +11.300000;19;9144;0.406400;2219;5002;0;0;0;0;0;0;0 +11.400000;19;9144;0.406400;1276;5002;0;0;0;0;0;0;0 +11.500000;19;9144;0.406400;1000;7658;0;0;0;0;0;0;0 +11.600000;19;9144;0.406400;597;10000;0;0;0;0;0;0;0 +11.700000;19;9144;0.406400;297;10000;0;0;0;0;0;0;0 +11.800000;19;9144;0.406400;180;10000;0;0;0;0;0;0;0 +11.900000;19;9144;0.406400;115;10000;0;0;0;0;0;0;0 +12.000000;19;9144;0.406400;117;10000;0;0;0;0;0;0;0 +12.100000;19;9144;0.406400;82;10000;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs2.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs2.csv new file mode 100644 index 00000000000..ba98e86b2d1 --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs2.csv @@ -0,0 +1,66 @@ +SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err +-5.000000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0 +-4.900000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0 +-4.800000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0 +-4.700000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0 +-4.600000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0 +-4.500000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0 +-4.400000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0 +-4.300000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0 +-4.200000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0 +-4.100000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0 +-4.000000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0 +-3.900000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0 +-3.800000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0 +-3.700000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0 +-3.600000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0 +-3.500000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0 +-3.400000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0 +-3.300000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0 +-3.200000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0 +-3.100000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0 +-3.000000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0 +-2.900000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0 +-2.800000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0 +-2.700000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0 +-2.600000;2;1096;0.146133;5001;5002;0;0;0;0;0;0;0 +-2.500000;2;1096;0.146133;4999;5002;0;0;0;0;0;0;0 +-2.400000;2;1096;0.146133;4988;5002;0;0;0;0;0;0;0 +-2.300000;2;1096;0.146133;4982;5002;0;0;0;0;0;0;0 +-2.200000;2;1096;0.146133;4943;5002;0;0;0;0;0;0;0 +-2.100000;2;1096;0.146133;4846;5002;0;0;0;0;0;0;0 +-2.000000;2;1096;0.146133;4704;5002;0;0;0;0;0;0;0 +-1.900000;2;1096;0.146133;4432;5002;0;0;0;0;0;0;0 +-1.800000;2;1096;0.146133;4087;5002;0;0;0;0;0;0;0 +-1.700000;2;1096;0.146133;3653;5002;0;0;0;0;0;0;0 +-1.600000;2;1096;0.146133;3052;5002;0;0;0;0;0;0;0 +-1.500000;2;1096;0.146133;2449;5002;0;0;0;0;0;0;0 +-1.400000;2;1096;0.146133;1900;5002;0;0;0;0;0;0;0 +-1.300000;2;1096;0.146133;1378;5002;0;0;0;0;0;0;0 +-1.200000;2;1096;0.146133;1000;5333;0;0;0;0;0;0;0 +-1.100000;2;1096;0.146133;1000;7587;0;0;0;0;0;0;0 +-1.000000;2;1096;0.146133;910;10000;0;0;0;0;0;0;0 +-0.900000;2;1096;0.146133;703;10000;0;0;0;0;0;0;0 +-0.800000;2;1096;0.146133;580;10000;0;0;0;0;0;0;0 +-0.700000;2;1096;0.146133;488;10000;0;0;0;0;0;0;0 +-0.600000;2;1096;0.146133;429;10000;0;0;0;0;0;0;0 +-0.500000;2;1096;0.146133;386;10000;0;0;0;0;0;0;0 +-0.400000;2;1096;0.146133;427;10000;0;0;0;0;0;0;0 +-0.300000;2;1096;0.146133;371;10000;0;0;0;0;0;0;0 +-0.200000;2;1096;0.146133;316;10000;0;0;0;0;0;0;0 +-0.100000;2;1096;0.146133;327;10000;0;0;0;0;0;0;0 +-0.000000;2;1096;0.146133;322;10000;0;0;0;0;0;0;0 +0.100000;2;1096;0.146133;288;10000;0;0;0;0;0;0;0 +0.200000;2;1096;0.146133;243;10000;0;0;0;0;0;0;0 +0.300000;2;1096;0.146133;246;10000;0;0;0;0;0;0;0 +0.400000;2;1096;0.146133;220;10000;0;0;0;0;0;0;0 +0.500000;2;1096;0.146133;210;10000;0;0;0;0;0;0;0 +0.600000;2;1096;0.146133;190;10000;0;0;0;0;0;0;0 +0.700000;2;1096;0.146133;210;10000;0;0;0;0;0;0;0 +0.800000;2;1096;0.146133;181;10000;0;0;0;0;0;0;0 +0.900000;2;1096;0.146133;167;10000;0;0;0;0;0;0;0 +1.000000;2;1096;0.146133;144;10000;0;0;0;0;0;0;0 +1.100000;2;1096;0.146133;146;10000;0;0;0;0;0;0;0 +1.200000;2;1096;0.146133;112;10000;0;0;0;0;0;0;0 +1.300000;2;1096;0.146133;138;10000;0;0;0;0;0;0;0 +1.400000;2;1096;0.146133;96;10000;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs20.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs20.csv new file mode 100644 index 00000000000..3fb27a64bf1 --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs20.csv @@ -0,0 +1,41 @@ +SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err +9.000000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0 +9.100000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0 +9.200000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0 +9.300000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0 +9.400000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0 +9.500000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0 +9.600000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0 +9.700000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0 +9.800000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0 +9.900000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0 +10.000000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0 +10.100000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0 +10.200000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0 +10.300000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0 +10.400000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0 +10.500000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0 +10.600000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0 +10.700000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0 +10.800000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0 +10.900000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0 +11.000000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0 +11.100000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0 +11.200000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0 +11.300000;20;9912;0.440533;5000;5002;0;0;0;0;0;0;0 +11.400000;20;9912;0.440533;4985;5002;0;0;0;0;0;0;0 +11.500000;20;9912;0.440533;4905;5002;0;0;0;0;0;0;0 +11.600000;20;9912;0.440533;4681;5002;0;0;0;0;0;0;0 +11.700000;20;9912;0.440533;4143;5002;0;0;0;0;0;0;0 +11.800000;20;9912;0.440533;3197;5002;0;0;0;0;0;0;0 +11.900000;20;9912;0.440533;2159;5002;0;0;0;0;0;0;0 +12.000000;20;9912;0.440533;1179;5002;0;0;0;0;0;0;0 +12.100000;20;9912;0.440533;1000;8312;0;0;0;0;0;0;0 +12.200000;20;9912;0.440533;559;10000;0;0;0;0;0;0;0 +12.300000;20;9912;0.440533;329;10000;0;0;0;0;0;0;0 +12.400000;20;9912;0.440533;215;10000;0;0;0;0;0;0;0 +12.500000;20;9912;0.440533;175;10000;0;0;0;0;0;0;0 +12.600000;20;9912;0.440533;118;10000;0;0;0;0;0;0;0 +12.700000;20;9912;0.440533;124;10000;0;0;0;0;0;0;0 +12.800000;20;9912;0.440533;109;10000;0;0;0;0;0;0;0 +12.900000;20;9912;0.440533;95;10000;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs21.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs21.csv new file mode 100644 index 00000000000..8520c063fd8 --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs21.csv @@ -0,0 +1,40 @@ +SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err +10.000000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0 +10.100000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0 +10.200000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0 +10.300000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0 +10.400000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0 +10.500000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0 +10.600000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0 +10.700000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0 +10.800000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0 +10.900000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0 +11.000000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0 +11.100000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0 +11.200000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0 +11.300000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0 +11.400000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0 +11.500000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0 +11.600000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0 +11.700000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0 +11.800000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0 +11.900000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0 +12.000000;21;10680;0.474667;5000;5002;0;0;0;0;0;0;0 +12.100000;21;10680;0.474667;4989;5002;0;0;0;0;0;0;0 +12.200000;21;10680;0.474667;4935;5002;0;0;0;0;0;0;0 +12.300000;21;10680;0.474667;4780;5002;0;0;0;0;0;0;0 +12.400000;21;10680;0.474667;4284;5002;0;0;0;0;0;0;0 +12.500000;21;10680;0.474667;3477;5002;0;0;0;0;0;0;0 +12.600000;21;10680;0.474667;2490;5002;0;0;0;0;0;0;0 +12.700000;21;10680;0.474667;1564;5002;0;0;0;0;0;0;0 +12.800000;21;10680;0.474667;1000;5635;0;0;0;0;0;0;0 +12.900000;21;10680;0.474667;853;10000;0;0;0;0;0;0;0 +13.000000;21;10680;0.474667;466;10000;0;0;0;0;0;0;0 +13.100000;21;10680;0.474667;273;10000;0;0;0;0;0;0;0 +13.200000;21;10680;0.474667;200;10000;0;0;0;0;0;0;0 +13.300000;21;10680;0.474667;200;10000;0;0;0;0;0;0;0 +13.400000;21;10680;0.474667;142;10000;0;0;0;0;0;0;0 +13.500000;21;10680;0.474667;144;10000;0;0;0;0;0;0;0 +13.600000;21;10680;0.474667;121;10000;0;0;0;0;0;0;0 +13.700000;21;10680;0.474667;101;10000;0;0;0;0;0;0;0 +13.800000;21;10680;0.474667;83;10000;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs22.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs22.csv new file mode 100644 index 00000000000..74d7a16de28 --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs22.csv @@ -0,0 +1,29 @@ +SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err +11.000000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0 +11.100000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0 +11.200000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0 +11.300000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0 +11.400000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0 +11.500000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0 +11.600000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0 +11.700000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0 +11.800000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0 +11.900000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0 +12.000000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0 +12.100000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0 +12.200000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0 +12.300000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0 +12.400000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0 +12.500000;22;11448;0.508800;5001;5002;0;0;0;0;0;0;0 +12.600000;22;11448;0.508800;4998;5002;0;0;0;0;0;0;0 +12.700000;22;11448;0.508800;4991;5002;0;0;0;0;0;0;0 +12.800000;22;11448;0.508800;4926;5002;0;0;0;0;0;0;0 +12.900000;22;11448;0.508800;4729;5002;0;0;0;0;0;0;0 +13.000000;22;11448;0.508800;4189;5002;0;0;0;0;0;0;0 +13.100000;22;11448;0.508800;3307;5002;0;0;0;0;0;0;0 +13.200000;22;11448;0.508800;2256;5002;0;0;0;0;0;0;0 +13.300000;22;11448;0.508800;1299;5002;0;0;0;0;0;0;0 +13.400000;22;11448;0.508800;1000;8110;0;0;0;0;0;0;0 +13.500000;22;11448;0.508800;538;10000;0;0;0;0;0;0;0 +13.600000;22;11448;0.508800;213;10000;0;0;0;0;0;0;0 +13.700000;22;11448;0.508800;63;10000;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs23.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs23.csv new file mode 100644 index 00000000000..1b6e4fc14c6 --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs23.csv @@ -0,0 +1,31 @@ +SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err +12.000000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0 +12.100000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0 +12.200000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0 +12.300000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0 +12.400000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0 +12.500000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0 +12.600000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0 +12.700000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0 +12.800000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0 +12.900000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0 +13.000000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0 +13.100000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0 +13.200000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0 +13.300000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0 +13.400000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0 +13.500000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0 +13.600000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0 +13.700000;23;12576;0.558933;5001;5002;0;0;0;0;0;0;0 +13.800000;23;12576;0.558933;4986;5002;0;0;0;0;0;0;0 +13.900000;23;12576;0.558933;4946;5002;0;0;0;0;0;0;0 +14.000000;23;12576;0.558933;4715;5002;0;0;0;0;0;0;0 +14.100000;23;12576;0.558933;4207;5002;0;0;0;0;0;0;0 +14.200000;23;12576;0.558933;3458;5002;0;0;0;0;0;0;0 +14.300000;23;12576;0.558933;2467;5002;0;0;0;0;0;0;0 +14.400000;23;12576;0.558933;1564;5002;0;0;0;0;0;0;0 +14.500000;23;12576;0.558933;1000;6038;0;0;0;0;0;0;0 +14.600000;23;12576;0.558933;824;10000;0;0;0;0;0;0;0 +14.700000;23;12576;0.558933;395;10000;0;0;0;0;0;0;0 +14.800000;23;12576;0.558933;153;10000;0;0;0;0;0;0;0 +14.900000;23;12576;0.558933;68;10000;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs24.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs24.csv new file mode 100644 index 00000000000..f86bde20d4a --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs24.csv @@ -0,0 +1,29 @@ +SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err +13.000000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0 +13.100000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0 +13.200000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0 +13.300000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0 +13.400000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0 +13.500000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0 +13.600000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0 +13.700000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0 +13.800000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0 +13.900000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0 +14.000000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0 +14.100000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0 +14.200000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0 +14.300000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0 +14.400000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0 +14.500000;24;13536;0.601600;4997;5002;0;0;0;0;0;0;0 +14.600000;24;13536;0.601600;4976;5002;0;0;0;0;0;0;0 +14.700000;24;13536;0.601600;4858;5002;0;0;0;0;0;0;0 +14.800000;24;13536;0.601600;4525;5002;0;0;0;0;0;0;0 +14.900000;24;13536;0.601600;3912;5002;0;0;0;0;0;0;0 +15.000000;24;13536;0.601600;2863;5002;0;0;0;0;0;0;0 +15.100000;24;13536;0.601600;1938;5002;0;0;0;0;0;0;0 +15.200000;24;13536;0.601600;1156;5002;0;0;0;0;0;0;0 +15.300000;24;13536;0.601600;1000;8723;0;0;0;0;0;0;0 +15.400000;24;13536;0.601600;524;10000;0;0;0;0;0;0;0 +15.500000;24;13536;0.601600;255;10000;0;0;0;0;0;0;0 +15.600000;24;13536;0.601600;100;10000;0;0;0;0;0;0;0 +15.700000;24;13536;0.601600;66;10000;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs25.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs25.csv new file mode 100644 index 00000000000..ac5c5c1c4e4 --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs25.csv @@ -0,0 +1,25 @@ +SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err +14.000000;25;14112;0.627200;5002;5002;0;0;0;0;0;0;0 +14.100000;25;14112;0.627200;5002;5002;0;0;0;0;0;0;0 +14.200000;25;14112;0.627200;5002;5002;0;0;0;0;0;0;0 +14.300000;25;14112;0.627200;5002;5002;0;0;0;0;0;0;0 +14.400000;25;14112;0.627200;5002;5002;0;0;0;0;0;0;0 +14.500000;25;14112;0.627200;5002;5002;0;0;0;0;0;0;0 +14.600000;25;14112;0.627200;5002;5002;0;0;0;0;0;0;0 +14.700000;25;14112;0.627200;5002;5002;0;0;0;0;0;0;0 +14.800000;25;14112;0.627200;5002;5002;0;0;0;0;0;0;0 +14.900000;25;14112;0.627200;5002;5002;0;0;0;0;0;0;0 +15.000000;25;14112;0.627200;5001;5002;0;0;0;0;0;0;0 +15.100000;25;14112;0.627200;5000;5002;0;0;0;0;0;0;0 +15.200000;25;14112;0.627200;4973;5002;0;0;0;0;0;0;0 +15.300000;25;14112;0.627200;4871;5002;0;0;0;0;0;0;0 +15.400000;25;14112;0.627200;4599;5002;0;0;0;0;0;0;0 +15.500000;25;14112;0.627200;3924;5002;0;0;0;0;0;0;0 +15.600000;25;14112;0.627200;3115;5002;0;0;0;0;0;0;0 +15.700000;25;14112;0.627200;2107;5002;0;0;0;0;0;0;0 +15.800000;25;14112;0.627200;1274;5002;0;0;0;0;0;0;0 +15.900000;25;14112;0.627200;1000;7614;0;0;0;0;0;0;0 +16.000000;25;14112;0.627200;699;10000;0;0;0;0;0;0;0 +16.100000;25;14112;0.627200;296;10000;0;0;0;0;0;0;0 +16.200000;25;14112;0.627200;146;10000;0;0;0;0;0;0;0 +16.300000;25;14112;0.627200;77;10000;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs26.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs26.csv new file mode 100644 index 00000000000..c3a649c4439 --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs26.csv @@ -0,0 +1,24 @@ +SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err +15.000000;26;15264;0.678400;5002;5002;0;0;0;0;0;0;0 +15.100000;26;15264;0.678400;5002;5002;0;0;0;0;0;0;0 +15.200000;26;15264;0.678400;5002;5002;0;0;0;0;0;0;0 +15.300000;26;15264;0.678400;5002;5002;0;0;0;0;0;0;0 +15.400000;26;15264;0.678400;5002;5002;0;0;0;0;0;0;0 +15.500000;26;15264;0.678400;5002;5002;0;0;0;0;0;0;0 +15.600000;26;15264;0.678400;5002;5002;0;0;0;0;0;0;0 +15.700000;26;15264;0.678400;5002;5002;0;0;0;0;0;0;0 +15.800000;26;15264;0.678400;5002;5002;0;0;0;0;0;0;0 +15.900000;26;15264;0.678400;5002;5002;0;0;0;0;0;0;0 +16.000000;26;15264;0.678400;5000;5002;0;0;0;0;0;0;0 +16.100000;26;15264;0.678400;4975;5002;0;0;0;0;0;0;0 +16.200000;26;15264;0.678400;4911;5002;0;0;0;0;0;0;0 +16.300000;26;15264;0.678400;4635;5002;0;0;0;0;0;0;0 +16.400000;26;15264;0.678400;4057;5002;0;0;0;0;0;0;0 +16.500000;26;15264;0.678400;3231;5002;0;0;0;0;0;0;0 +16.600000;26;15264;0.678400;2244;5002;0;0;0;0;0;0;0 +16.700000;26;15264;0.678400;1336;5002;0;0;0;0;0;0;0 +16.800000;26;15264;0.678400;1000;6596;0;0;0;0;0;0;0 +16.900000;26;15264;0.678400;724;10000;0;0;0;0;0;0;0 +17.000000;26;15264;0.678400;340;10000;0;0;0;0;0;0;0 +17.100000;26;15264;0.678400;142;10000;0;0;0;0;0;0;0 +17.200000;26;15264;0.678400;63;10000;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs27.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs27.csv new file mode 100644 index 00000000000..11771acc871 --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs27.csv @@ -0,0 +1,21 @@ +SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err +16.000000;27;15840;0.704000;5002;5002;0;0;0;0;0;0;0 +16.100000;27;15840;0.704000;5002;5002;0;0;0;0;0;0;0 +16.200000;27;15840;0.704000;5002;5002;0;0;0;0;0;0;0 +16.300000;27;15840;0.704000;5002;5002;0;0;0;0;0;0;0 +16.400000;27;15840;0.704000;4999;5002;0;0;0;0;0;0;0 +16.500000;27;15840;0.704000;4981;5002;0;0;0;0;0;0;0 +16.600000;27;15840;0.704000;4887;5002;0;0;0;0;0;0;0 +16.700000;27;15840;0.704000;4688;5002;0;0;0;0;0;0;0 +16.800000;27;15840;0.704000;4176;5002;0;0;0;0;0;0;0 +16.900000;27;15840;0.704000;3340;5002;0;0;0;0;0;0;0 +17.000000;27;15840;0.704000;2386;5002;0;0;0;0;0;0;0 +17.100000;27;15840;0.704000;1510;5002;0;0;0;0;0;0;0 +17.200000;27;15840;0.704000;1000;5552;0;0;0;0;0;0;0 +17.300000;27;15840;0.704000;926;10000;0;0;0;0;0;0;0 +17.400000;27;15840;0.704000;516;10000;0;0;0;0;0;0;0 +17.500000;27;15840;0.704000;287;10000;0;0;0;0;0;0;0 +17.600000;27;15840;0.704000;198;10000;0;0;0;0;0;0;0 +17.700000;27;15840;0.704000;135;10000;0;0;0;0;0;0;0 +17.800000;27;15840;0.704000;102;10000;0;0;0;0;0;0;0 +17.900000;27;15840;0.704000;94;10000;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs3.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs3.csv new file mode 100644 index 00000000000..ddfee7f1588 --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs3.csv @@ -0,0 +1,64 @@ +SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err +-4.000000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0 +-3.900000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0 +-3.800000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0 +-3.700000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0 +-3.600000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0 +-3.500000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0 +-3.400000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0 +-3.300000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0 +-3.200000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0 +-3.100000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0 +-3.000000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0 +-2.900000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0 +-2.800000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0 +-2.700000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0 +-2.600000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0 +-2.500000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0 +-2.400000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0 +-2.300000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0 +-2.200000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0 +-2.100000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0 +-2.000000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0 +-1.900000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0 +-1.800000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0 +-1.700000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0 +-1.600000;3;1416;0.188800;5001;5002;0;0;0;0;0;0;0 +-1.500000;3;1416;0.188800;4992;5002;0;0;0;0;0;0;0 +-1.400000;3;1416;0.188800;4981;5002;0;0;0;0;0;0;0 +-1.300000;3;1416;0.188800;4928;5002;0;0;0;0;0;0;0 +-1.200000;3;1416;0.188800;4836;5002;0;0;0;0;0;0;0 +-1.100000;3;1416;0.188800;4691;5002;0;0;0;0;0;0;0 +-1.000000;3;1416;0.188800;4365;5002;0;0;0;0;0;0;0 +-0.900000;3;1416;0.188800;3918;5002;0;0;0;0;0;0;0 +-0.800000;3;1416;0.188800;3317;5002;0;0;0;0;0;0;0 +-0.700000;3;1416;0.188800;2690;5002;0;0;0;0;0;0;0 +-0.600000;3;1416;0.188800;2011;5002;0;0;0;0;0;0;0 +-0.500000;3;1416;0.188800;1459;5002;0;0;0;0;0;0;0 +-0.400000;3;1416;0.188800;1000;5044;0;0;0;0;0;0;0 +-0.300000;3;1416;0.188800;1000;7616;0;0;0;0;0;0;0 +-0.200000;3;1416;0.188800;923;10000;0;0;0;0;0;0;0 +-0.100000;3;1416;0.188800;692;10000;0;0;0;0;0;0;0 +0.000000;3;1416;0.188800;560;10000;0;0;0;0;0;0;0 +0.100000;3;1416;0.188800;518;10000;0;0;0;0;0;0;0 +0.200000;3;1416;0.188800;423;10000;0;0;0;0;0;0;0 +0.300000;3;1416;0.188800;388;10000;0;0;0;0;0;0;0 +0.400000;3;1416;0.188800;366;10000;0;0;0;0;0;0;0 +0.500000;3;1416;0.188800;349;10000;0;0;0;0;0;0;0 +0.600000;3;1416;0.188800;370;10000;0;0;0;0;0;0;0 +0.700000;3;1416;0.188800;309;10000;0;0;0;0;0;0;0 +0.800000;3;1416;0.188800;293;10000;0;0;0;0;0;0;0 +0.900000;3;1416;0.188800;242;10000;0;0;0;0;0;0;0 +1.000000;3;1416;0.188800;277;10000;0;0;0;0;0;0;0 +1.100000;3;1416;0.188800;233;10000;0;0;0;0;0;0;0 +1.200000;3;1416;0.188800;230;10000;0;0;0;0;0;0;0 +1.300000;3;1416;0.188800;222;10000;0;0;0;0;0;0;0 +1.400000;3;1416;0.188800;205;10000;0;0;0;0;0;0;0 +1.500000;3;1416;0.188800;182;10000;0;0;0;0;0;0;0 +1.600000;3;1416;0.188800;187;10000;0;0;0;0;0;0;0 +1.700000;3;1416;0.188800;167;10000;0;0;0;0;0;0;0 +1.800000;3;1416;0.188800;156;10000;0;0;0;0;0;0;0 +1.900000;3;1416;0.188800;124;10000;0;0;0;0;0;0;0 +2.000000;3;1416;0.188800;110;10000;0;0;0;0;0;0;0 +2.100000;3;1416;0.188800;112;10000;0;0;0;0;0;0;0 +2.200000;3;1416;0.188800;88;10000;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs4.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs4.csv new file mode 100644 index 00000000000..a7789f16e55 --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs4.csv @@ -0,0 +1,63 @@ +SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err +-3.000000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0 +-2.900000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0 +-2.800000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0 +-2.700000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0 +-2.600000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0 +-2.500000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0 +-2.400000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0 +-2.300000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0 +-2.200000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0 +-2.100000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0 +-2.000000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0 +-1.900000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0 +-1.800000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0 +-1.700000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0 +-1.600000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0 +-1.500000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0 +-1.400000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0 +-1.300000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0 +-1.200000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0 +-1.100000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0 +-1.000000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0 +-0.900000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0 +-0.800000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0 +-0.700000;4;1800;0.240000;4997;5002;0;0;0;0;0;0;0 +-0.600000;4;1800;0.240000;4995;5002;0;0;0;0;0;0;0 +-0.500000;4;1800;0.240000;4964;5002;0;0;0;0;0;0;0 +-0.400000;4;1800;0.240000;4885;5002;0;0;0;0;0;0;0 +-0.300000;4;1800;0.240000;4725;5002;0;0;0;0;0;0;0 +-0.200000;4;1800;0.240000;4470;5002;0;0;0;0;0;0;0 +-0.100000;4;1800;0.240000;4037;5002;0;0;0;0;0;0;0 +0.000000;4;1800;0.240000;3475;5002;0;0;0;0;0;0;0 +0.100000;4;1800;0.240000;2867;5002;0;0;0;0;0;0;0 +0.200000;4;1800;0.240000;2104;5002;0;0;0;0;0;0;0 +0.300000;4;1800;0.240000;1477;5002;0;0;0;0;0;0;0 +0.400000;4;1800;0.240000;1059;5002;0;0;0;0;0;0;0 +0.500000;4;1800;0.240000;1000;7320;0;0;0;0;0;0;0 +0.600000;4;1800;0.240000;963;10000;0;0;0;0;0;0;0 +0.700000;4;1800;0.240000;674;10000;0;0;0;0;0;0;0 +0.800000;4;1800;0.240000;554;10000;0;0;0;0;0;0;0 +0.900000;4;1800;0.240000;498;10000;0;0;0;0;0;0;0 +1.000000;4;1800;0.240000;442;10000;0;0;0;0;0;0;0 +1.100000;4;1800;0.240000;390;10000;0;0;0;0;0;0;0 +1.200000;4;1800;0.240000;380;10000;0;0;0;0;0;0;0 +1.300000;4;1800;0.240000;325;10000;0;0;0;0;0;0;0 +1.400000;4;1800;0.240000;323;10000;0;0;0;0;0;0;0 +1.500000;4;1800;0.240000;281;10000;0;0;0;0;0;0;0 +1.600000;4;1800;0.240000;309;10000;0;0;0;0;0;0;0 +1.700000;4;1800;0.240000;255;10000;0;0;0;0;0;0;0 +1.800000;4;1800;0.240000;271;10000;0;0;0;0;0;0;0 +1.900000;4;1800;0.240000;246;10000;0;0;0;0;0;0;0 +2.000000;4;1800;0.240000;215;10000;0;0;0;0;0;0;0 +2.100000;4;1800;0.240000;198;10000;0;0;0;0;0;0;0 +2.200000;4;1800;0.240000;206;10000;0;0;0;0;0;0;0 +2.300000;4;1800;0.240000;177;10000;0;0;0;0;0;0;0 +2.400000;4;1800;0.240000;174;10000;0;0;0;0;0;0;0 +2.500000;4;1800;0.240000;161;10000;0;0;0;0;0;0;0 +2.600000;4;1800;0.240000;170;10000;0;0;0;0;0;0;0 +2.700000;4;1800;0.240000;141;10000;0;0;0;0;0;0;0 +2.800000;4;1800;0.240000;121;10000;0;0;0;0;0;0;0 +2.900000;4;1800;0.240000;121;10000;0;0;0;0;0;0;0 +3.000000;4;1800;0.240000;128;10000;0;0;0;0;0;0;0 +3.100000;4;1800;0.240000;93;10000;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs5.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs5.csv new file mode 100644 index 00000000000..6b1c7da61d5 --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs5.csv @@ -0,0 +1,54 @@ +SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err +-2.000000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0 +-1.900000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0 +-1.800000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0 +-1.700000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0 +-1.600000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0 +-1.500000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0 +-1.400000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0 +-1.300000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0 +-1.200000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0 +-1.100000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0 +-1.000000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0 +-0.900000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0 +-0.800000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0 +-0.700000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0 +-0.600000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0 +-0.500000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0 +-0.400000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0 +-0.300000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0 +-0.200000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0 +-0.100000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0 +0.000000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0 +0.100000;5;2216;0.295467;4999;5002;0;0;0;0;0;0;0 +0.200000;5;2216;0.295467;4989;5002;0;0;0;0;0;0;0 +0.300000;5;2216;0.295467;4946;5002;0;0;0;0;0;0;0 +0.400000;5;2216;0.295467;4837;5002;0;0;0;0;0;0;0 +0.500000;5;2216;0.295467;4620;5002;0;0;0;0;0;0;0 +0.600000;5;2216;0.295467;4265;5002;0;0;0;0;0;0;0 +0.700000;5;2216;0.295467;3655;5002;0;0;0;0;0;0;0 +0.800000;5;2216;0.295467;2933;5002;0;0;0;0;0;0;0 +0.900000;5;2216;0.295467;2253;5002;0;0;0;0;0;0;0 +1.000000;5;2216;0.295467;1517;5002;0;0;0;0;0;0;0 +1.100000;5;2216;0.295467;1031;5002;0;0;0;0;0;0;0 +1.200000;5;2216;0.295467;1000;8037;0;0;0;0;0;0;0 +1.300000;5;2216;0.295467;825;10000;0;0;0;0;0;0;0 +1.400000;5;2216;0.295467;605;10000;0;0;0;0;0;0;0 +1.500000;5;2216;0.295467;436;10000;0;0;0;0;0;0;0 +1.600000;5;2216;0.295467;374;10000;0;0;0;0;0;0;0 +1.700000;5;2216;0.295467;326;10000;0;0;0;0;0;0;0 +1.800000;5;2216;0.295467;325;10000;0;0;0;0;0;0;0 +1.900000;5;2216;0.295467;305;10000;0;0;0;0;0;0;0 +2.000000;5;2216;0.295467;269;10000;0;0;0;0;0;0;0 +2.100000;5;2216;0.295467;257;10000;0;0;0;0;0;0;0 +2.200000;5;2216;0.295467;210;10000;0;0;0;0;0;0;0 +2.300000;5;2216;0.295467;213;10000;0;0;0;0;0;0;0 +2.400000;5;2216;0.295467;193;10000;0;0;0;0;0;0;0 +2.500000;5;2216;0.295467;178;10000;0;0;0;0;0;0;0 +2.600000;5;2216;0.295467;152;10000;0;0;0;0;0;0;0 +2.700000;5;2216;0.295467;145;10000;0;0;0;0;0;0;0 +2.800000;5;2216;0.295467;128;10000;0;0;0;0;0;0;0 +2.900000;5;2216;0.295467;144;10000;0;0;0;0;0;0;0 +3.000000;5;2216;0.295467;124;10000;0;0;0;0;0;0;0 +3.100000;5;2216;0.295467;113;10000;0;0;0;0;0;0;0 +3.200000;5;2216;0.295467;97;10000;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs6.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs6.csv new file mode 100644 index 00000000000..bb91a58267d --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs6.csv @@ -0,0 +1,57 @@ +SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err +-1.000000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0 +-0.900000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0 +-0.800000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0 +-0.700000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0 +-0.600000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0 +-0.500000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0 +-0.400000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0 +-0.300000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0 +-0.200000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0 +-0.100000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0 +-0.000000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0 +0.100000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0 +0.200000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0 +0.300000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0 +0.400000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0 +0.500000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0 +0.600000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0 +0.700000;6;2600;0.346667;4996;5002;0;0;0;0;0;0;0 +0.800000;6;2600;0.346667;4977;5002;0;0;0;0;0;0;0 +0.900000;6;2600;0.346667;4927;5002;0;0;0;0;0;0;0 +1.000000;6;2600;0.346667;4757;5002;0;0;0;0;0;0;0 +1.100000;6;2600;0.346667;4438;5002;0;0;0;0;0;0;0 +1.200000;6;2600;0.346667;3918;5002;0;0;0;0;0;0;0 +1.300000;6;2600;0.346667;3176;5002;0;0;0;0;0;0;0 +1.400000;6;2600;0.346667;2309;5002;0;0;0;0;0;0;0 +1.500000;6;2600;0.346667;1557;5002;0;0;0;0;0;0;0 +1.600000;6;2600;0.346667;1000;5177;0;0;0;0;0;0;0 +1.700000;6;2600;0.346667;1000;8453;0;0;0;0;0;0;0 +1.800000;6;2600;0.346667;817;10000;0;0;0;0;0;0;0 +1.900000;6;2600;0.346667;579;10000;0;0;0;0;0;0;0 +2.000000;6;2600;0.346667;444;10000;0;0;0;0;0;0;0 +2.100000;6;2600;0.346667;475;10000;0;0;0;0;0;0;0 +2.200000;6;2600;0.346667;431;10000;0;0;0;0;0;0;0 +2.300000;6;2600;0.346667;347;10000;0;0;0;0;0;0;0 +2.400000;6;2600;0.346667;391;10000;0;0;0;0;0;0;0 +2.500000;6;2600;0.346667;334;10000;0;0;0;0;0;0;0 +2.600000;6;2600;0.346667;334;10000;0;0;0;0;0;0;0 +2.700000;6;2600;0.346667;320;10000;0;0;0;0;0;0;0 +2.800000;6;2600;0.346667;297;10000;0;0;0;0;0;0;0 +2.900000;6;2600;0.346667;287;10000;0;0;0;0;0;0;0 +3.000000;6;2600;0.346667;250;10000;0;0;0;0;0;0;0 +3.100000;6;2600;0.346667;259;10000;0;0;0;0;0;0;0 +3.200000;6;2600;0.346667;246;10000;0;0;0;0;0;0;0 +3.300000;6;2600;0.346667;226;10000;0;0;0;0;0;0;0 +3.400000;6;2600;0.346667;216;10000;0;0;0;0;0;0;0 +3.500000;6;2600;0.346667;198;10000;0;0;0;0;0;0;0 +3.600000;6;2600;0.346667;175;10000;0;0;0;0;0;0;0 +3.700000;6;2600;0.346667;185;10000;0;0;0;0;0;0;0 +3.800000;6;2600;0.346667;166;10000;0;0;0;0;0;0;0 +3.900000;6;2600;0.346667;137;10000;0;0;0;0;0;0;0 +4.000000;6;2600;0.346667;144;10000;0;0;0;0;0;0;0 +4.100000;6;2600;0.346667;123;10000;0;0;0;0;0;0;0 +4.200000;6;2600;0.346667;119;10000;0;0;0;0;0;0;0 +4.300000;6;2600;0.346667;107;10000;0;0;0;0;0;0;0 +4.400000;6;2600;0.346667;111;10000;0;0;0;0;0;0;0 +4.500000;6;2600;0.346667;95;10000;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs7.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs7.csv new file mode 100644 index 00000000000..739656f3b3b --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs7.csv @@ -0,0 +1,45 @@ +SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err +0.000000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0 +0.100000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0 +0.200000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0 +0.300000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0 +0.400000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0 +0.500000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0 +0.600000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0 +0.700000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0 +0.800000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0 +0.900000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0 +1.000000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0 +1.100000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0 +1.200000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0 +1.300000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0 +1.400000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0 +1.500000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0 +1.600000;7;3112;0.414933;4997;5002;0;0;0;0;0;0;0 +1.700000;7;3112;0.414933;4981;5002;0;0;0;0;0;0;0 +1.800000;7;3112;0.414933;4892;5002;0;0;0;0;0;0;0 +1.900000;7;3112;0.414933;4746;5002;0;0;0;0;0;0;0 +2.000000;7;3112;0.414933;4388;5002;0;0;0;0;0;0;0 +2.100000;7;3112;0.414933;3664;5002;0;0;0;0;0;0;0 +2.200000;7;3112;0.414933;2843;5002;0;0;0;0;0;0;0 +2.300000;7;3112;0.414933;1992;5002;0;0;0;0;0;0;0 +2.400000;7;3112;0.414933;1285;5002;0;0;0;0;0;0;0 +2.500000;7;3112;0.414933;1000;6867;0;0;0;0;0;0;0 +2.600000;7;3112;0.414933;773;10000;0;0;0;0;0;0;0 +2.700000;7;3112;0.414933;427;10000;0;0;0;0;0;0;0 +2.800000;7;3112;0.414933;300;10000;0;0;0;0;0;0;0 +2.900000;7;3112;0.414933;276;10000;0;0;0;0;0;0;0 +3.000000;7;3112;0.414933;215;10000;0;0;0;0;0;0;0 +3.100000;7;3112;0.414933;198;10000;0;0;0;0;0;0;0 +3.200000;7;3112;0.414933;193;10000;0;0;0;0;0;0;0 +3.300000;7;3112;0.414933;179;10000;0;0;0;0;0;0;0 +3.400000;7;3112;0.414933;173;10000;0;0;0;0;0;0;0 +3.500000;7;3112;0.414933;169;10000;0;0;0;0;0;0;0 +3.600000;7;3112;0.414933;124;10000;0;0;0;0;0;0;0 +3.700000;7;3112;0.414933;149;10000;0;0;0;0;0;0;0 +3.800000;7;3112;0.414933;123;10000;0;0;0;0;0;0;0 +3.900000;7;3112;0.414933;133;10000;0;0;0;0;0;0;0 +4.000000;7;3112;0.414933;129;10000;0;0;0;0;0;0;0 +4.100000;7;3112;0.414933;101;10000;0;0;0;0;0;0;0 +4.200000;7;3112;0.414933;109;10000;0;0;0;0;0;0;0 +4.300000;7;3112;0.414933;69;10000;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs8.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs8.csv new file mode 100644 index 00000000000..89ce70d3507 --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs8.csv @@ -0,0 +1,33 @@ +SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err +1.000000;8;3496;0.466133;5002;5002;0;0;0;0;0;0;0 +1.100000;8;3496;0.466133;5002;5002;0;0;0;0;0;0;0 +1.200000;8;3496;0.466133;5002;5002;0;0;0;0;0;0;0 +1.300000;8;3496;0.466133;5002;5002;0;0;0;0;0;0;0 +1.400000;8;3496;0.466133;5002;5002;0;0;0;0;0;0;0 +1.500000;8;3496;0.466133;5002;5002;0;0;0;0;0;0;0 +1.600000;8;3496;0.466133;5002;5002;0;0;0;0;0;0;0 +1.700000;8;3496;0.466133;5002;5002;0;0;0;0;0;0;0 +1.800000;8;3496;0.466133;5002;5002;0;0;0;0;0;0;0 +1.900000;8;3496;0.466133;5002;5002;0;0;0;0;0;0;0 +2.000000;8;3496;0.466133;5002;5002;0;0;0;0;0;0;0 +2.100000;8;3496;0.466133;5002;5002;0;0;0;0;0;0;0 +2.200000;8;3496;0.466133;4999;5002;0;0;0;0;0;0;0 +2.300000;8;3496;0.466133;4982;5002;0;0;0;0;0;0;0 +2.400000;8;3496;0.466133;4943;5002;0;0;0;0;0;0;0 +2.500000;8;3496;0.466133;4782;5002;0;0;0;0;0;0;0 +2.600000;8;3496;0.466133;4443;5002;0;0;0;0;0;0;0 +2.700000;8;3496;0.466133;3858;5002;0;0;0;0;0;0;0 +2.800000;8;3496;0.466133;2987;5002;0;0;0;0;0;0;0 +2.900000;8;3496;0.466133;2063;5002;0;0;0;0;0;0;0 +3.000000;8;3496;0.466133;1290;5002;0;0;0;0;0;0;0 +3.100000;8;3496;0.466133;1000;7204;0;0;0;0;0;0;0 +3.200000;8;3496;0.466133;741;10000;0;0;0;0;0;0;0 +3.300000;8;3496;0.466133;407;10000;0;0;0;0;0;0;0 +3.400000;8;3496;0.466133;240;10000;0;0;0;0;0;0;0 +3.500000;8;3496;0.466133;199;10000;0;0;0;0;0;0;0 +3.600000;8;3496;0.466133;198;10000;0;0;0;0;0;0;0 +3.700000;8;3496;0.466133;153;10000;0;0;0;0;0;0;0 +3.800000;8;3496;0.466133;141;10000;0;0;0;0;0;0;0 +3.900000;8;3496;0.466133;131;10000;0;0;0;0;0;0;0 +4.000000;8;3496;0.466133;115;10000;0;0;0;0;0;0;0 +4.100000;8;3496;0.466133;98;10000;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs9.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs9.csv new file mode 100644 index 00000000000..d40f4e4f6f0 --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs9.csv @@ -0,0 +1,25 @@ +SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err +2.000000;9;4008;0.534400;5002;5002;0;0;0;0;0;0;0 +2.100000;9;4008;0.534400;5002;5002;0;0;0;0;0;0;0 +2.200000;9;4008;0.534400;5002;5002;0;0;0;0;0;0;0 +2.300000;9;4008;0.534400;5002;5002;0;0;0;0;0;0;0 +2.400000;9;4008;0.534400;5002;5002;0;0;0;0;0;0;0 +2.500000;9;4008;0.534400;5002;5002;0;0;0;0;0;0;0 +2.600000;9;4008;0.534400;5002;5002;0;0;0;0;0;0;0 +2.700000;9;4008;0.534400;5002;5002;0;0;0;0;0;0;0 +2.800000;9;4008;0.534400;5001;5002;0;0;0;0;0;0;0 +2.900000;9;4008;0.534400;4999;5002;0;0;0;0;0;0;0 +3.000000;9;4008;0.534400;4983;5002;0;0;0;0;0;0;0 +3.100000;9;4008;0.534400;4920;5002;0;0;0;0;0;0;0 +3.200000;9;4008;0.534400;4740;5002;0;0;0;0;0;0;0 +3.300000;9;4008;0.534400;4318;5002;0;0;0;0;0;0;0 +3.400000;9;4008;0.534400;3635;5002;0;0;0;0;0;0;0 +3.500000;9;4008;0.534400;2657;5002;0;0;0;0;0;0;0 +3.600000;9;4008;0.534400;1780;5002;0;0;0;0;0;0;0 +3.700000;9;4008;0.534400;1000;5063;0;0;0;0;0;0;0 +3.800000;9;4008;0.534400;1000;9741;0;0;0;0;0;0;0 +3.900000;9;4008;0.534400;505;10000;0;0;0;0;0;0;0 +4.000000;9;4008;0.534400;269;10000;0;0;0;0;0;0;0 +4.100000;9;4008;0.534400;141;10000;0;0;0;0;0;0;0 +4.200000;9;4008;0.534400;118;10000;0;0;0;0;0;0;0 +4.300000;9;4008;0.534400;93;10000;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/eval_results.m b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/eval_results.m new file mode 100644 index 00000000000..dd833103ce1 --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/eval_results.m @@ -0,0 +1,103 @@ +set(0, 'DefaultLineMarkerSize', 10); +set(0, 'Defaultaxesfontsize', 14); +set(0, 'DefaultLineLineWidth', 2); + +root_path = 'Rayleigh8_perfectCE_new'; +tx_mode = 6; +channel = 8; + +%% +addpath('../../../EMOS/LTE/POST_PROCESSING') +load SISO.mat + +scale_bps = (8*12+3*8)*6*100; +c_siso = [c_siso_4Qam; c_siso_16Qam; c_siso_64Qam]; +bps_siso = c_siso.*scale_bps; + +snr_all = -20:0.2:40; +throughput_all = zeros(length(snr_all),22); + +plot_style = {'b-*';'r-*';'g-*';'y-*';'k-*';... + 'b-o';'r-o';'g-o';'y-o';'k-o';... + 'b-s';'r-s';'g-s';'y-s';'k-s';... + 'b-d';'r-d';'g-d';'y-d';'k-d';... + 'b-x';'r-x';'g-x';'y-x';'k-x';... + 'b-+';'r-+';'g-+';'y-+';'k-+'}; + + +%% +figure(1) +hold off +figure(2) +hold off +legend_str = {}; +i=1; +for mcs=0:28 + file = fullfile(root_path,sprintf('second_bler_tx%d_mcs%d_chan%d.csv',tx_mode,mcs,channel)); + try + data = dlmread(file,';',1,0); + catch exception + disp(sprintf('Problem with file %s:',file)); + disp(exception.message); + continue + end + snr = data(:,1); + bler = data(:,5)./data(:,6); % round 1 + bler4 = data(:,11)./data(:,6); % round 4 + harq_adjust = data(:,6)./sum(data(:,6:2:12),2); + if size(data,2)>13 + uncoded_ber = data(:,14); + else + uncoded_ber = ones(size(data,1),1); + end + if (length(snr)==1) + throughput_all(:,mcs+1) = (1-bler4).*harq_adjust.*get_tbs(mcs,25)*6*100; + else + throughput_all(:,mcs+1) = interp1(snr, (1-bler4).*harq_adjust.*get_tbs(mcs,25)*6*100,snr_all,'nearest','extrap'); + end + throughput_all(1:find(snr_all==snr(1)),mcs+1) = 0; + figure(1) + semilogy(snr,bler(:,1),plot_style{mcs+1}); + hold on + figure(2) + semilogy(snr,uncoded_ber,plot_style{mcs+1}); + hold on + legend_str{i} = sprintf('mcs %d',mcs); + i=i+1; +end + +%% +h_fig = figure(1); +h_leg = legend(legend_str,'location','eastoutside'); +set(h_leg,'FontSize',10); +title(sprintf('Tx mode %d: BLER vs SNR',tx_mode)); +ylabel 'BLER' +xlabel 'SNR' +ylim([0.001 1]) +grid on +saveas(h_fig,fullfile(root_path,sprintf('tx_mode%d_channel%d_bler.fig',tx_mode,channel))); +saveas(h_fig,fullfile(root_path,sprintf('tx_mode%d_channel%d_bler.emf',tx_mode,channel))); + +h_fig = figure(2); +h_leg = legend(legend_str,'location','eastoutside'); +set(h_leg,'FontSize',10); +title(sprintf('Tx mode %d: uncoded BER vs SNR',tx_mode)); +ylabel 'uncoded BER' +xlabel 'SNR' +ylim([0.0001 1]) +grid on +saveas(h_fig,fullfile(root_path,sprintf('tx_mode%d_channel%d_ber.fig',tx_mode,channel))); +saveas(h_fig,fullfile(root_path,sprintf('tx_mode%d_channel%d_ber.emf',tx_mode,channel))); + +%% +h_fig = figure(4); +hold off +plot(snr_all,(max(throughput_all,[],2))) +%plot(snr_all,throughput_all) +hold on +plot(SNR,max(bps_siso),'r--'); +legend('simulation','SISO mutual information','location','northwest'); +xlabel('SNR [dB]') +ylabel('Throughput [bps]') +grid on + diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index 6aff4dbc930..2203e06740b 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -280,11 +280,7 @@ int main(int argc, char **argv) { int print_perf=0; int llr8_flag=0; - reset_meas(&ts); - start_meas(&ts); - sleep(1); - stop_meas(&ts); - cpu_freq_GHz = (double)ts.diff/1000000000; + cpu_freq_GHz = (double)get_cpu_freq_GHz(); printf("Detected cpu_freq %f GHz\n",cpu_freq_GHz); @@ -483,6 +479,7 @@ int main(int argc, char **argv) { break; case 'P': print_perf=1; + opp_enabled=1; // to enable the time meas break; case 'L': llr8_flag=1; @@ -1657,9 +1654,9 @@ int main(int argc, char **argv) { // printf("amc: ****************** eNB2UE[%d]->n_rx = %d,dd %d\n",round,eNB2UE[round]->nb_rx,eNB2UE[round]->channel_offset); if(abstx==1 && num_rounds>1) if(round==0 && hold_channel==0){ - random_channel(eNB2UE[1]); - random_channel(eNB2UE[2]); - random_channel(eNB2UE[3]); + random_channel(eNB2UE[1],0); + random_channel(eNB2UE[2],0); + random_channel(eNB2UE[3],0); } } diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c index 8c5c39cb77f..d7b6fafe28c 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsim.c +++ b/openair1/SIMULATION/LTE_PHY/ulsim.c @@ -201,7 +201,6 @@ int main(int argc, char **argv) { u8 N0=30; double tx_gain=1.0; double cpu_freq_GHz; - time_stats_t ts; int avg_iter,iter_trials; uint32_t UL_alloc_pdu; @@ -212,11 +211,7 @@ int main(int argc, char **argv) { uint8_t llr8_flag=0; int nb_rb_set = 0; - reset_meas(&ts); - start_meas(&ts); - sleep(1); - stop_meas(&ts); - cpu_freq_GHz = (double)ts.diff/1000000000; + cpu_freq_GHz = (double)get_cpu_freq_GHz(); printf("Detected cpu_freq %f GHz\n",cpu_freq_GHz); @@ -389,6 +384,7 @@ int main(int argc, char **argv) { break; case 'P': dump_perf=1; + opp_enabled=1; break; case 'L': llr8_flag=1; diff --git a/openair1/SIMULATION/RF/rf.c b/openair1/SIMULATION/RF/rf.c index 0d45494e4b3..3ddc50f84f6 100644 --- a/openair1/SIMULATION/RF/rf.c +++ b/openair1/SIMULATION/RF/rf.c @@ -2,7 +2,11 @@ #include <stdio.h> #include <stdlib.h> #include <math.h> + +//#include "PHY/defs.h" +#include "SIMULATION/TOOLS/defs.h" +/* extern void randominit(void); extern double gaussdouble(double,double); //free(input_data); @@ -10,6 +14,7 @@ extern double gaussdouble(double,double); //extern int write_output(const char *,const char *,void *,int,int,char); //flag change extern int write_output(const char *,const char *,void *,int,int,char); +*/ //double pn[1024]; @@ -206,8 +211,9 @@ void rf_rx_simple(double **r_re, #ifdef RF_MAIN #define INPUT_dBm -70.0 -#include "../../PHY/TOOLS/defs.h" -#include "../TOOLS/defs.h" +int QPSK[4]={AMP_OVER_SQRT2|(AMP_OVER_SQRT2<<16),AMP_OVER_SQRT2|((65536-AMP_OVER_SQRT2)<<16),((65536-AMP_OVER_SQRT2)<<16)|AMP_OVER_SQRT2,((65536-AMP_OVER_SQRT2)<<16)|(65536-AMP_OVER_SQRT2)}; +int QPSK2[4]={AMP_OVER_2|(AMP_OVER_2<<16),AMP_OVER_2|((65536-AMP_OVER_2)<<16),((65536-AMP_OVER_2)<<16)|AMP_OVER_2,((65536-AMP_OVER_2)<<16)|(65536-AMP_OVER_2)}; + int main(int argc, char* argv[]) { @@ -217,31 +223,71 @@ int main(int argc, char* argv[]) { int length = 100000; int i,j,n; double input_amp = pow(10.0,(.05*INPUT_dBm))/sqrt(2); - double **r_re,**r_im; double nf[2] = {3.0,3.0}; double ip =0.0; + double path_loss_dB = -90, rx_gain_dB = 125; + double tx_pwr, rx_pwr; + + u32 **input = malloc(nb_antennas*sizeof(u32*)); + u32 **output = malloc(nb_antennas*sizeof(u32*)); - r_re = malloc(nb_antennas*sizeof (double *)); - r_im = malloc(nb_antennas*sizeof (double *)); - printf("Input amp = %f\n",input_amp); + double **s_re = malloc(nb_antennas*sizeof (double *)); + double **s_im = malloc(nb_antennas*sizeof (double *)); + double **r_re = malloc(nb_antennas*sizeof (double *)); + double **r_im = malloc(nb_antennas*sizeof (double *)); - randominit(); + channel_desc_t *channel; - for (i=0;i<nb_antennas;i++) { + srand(0); + randominit(0); + set_taus_seed(0); + + channel = new_channel_desc_scm(nb_antennas, + nb_antennas, + AWGN, + 7.68e6, + 0, + 0, + path_loss_dB); + for (i=0;i<nb_antennas;i++) { + s_re[i] = (double *)malloc(length * sizeof (double )); + s_im[i] = (double *)malloc(length * sizeof (double )); r_re[i] = (double *)malloc(length * sizeof (double )); r_im[i] = (double *)malloc(length * sizeof (double )); - + input[i] = (u32*)malloc(length * sizeof(u32)); + output[i] = (u32*)malloc(length * sizeof(u32)); } for (i=0;i<nb_antennas;i++) { - // generate fs/4 complex exponential - for (j=0;j<length;j++) { - r_re[i][j] = 0; //input_amp; // * cos(M_PI*j/2); - r_im[i][j] = 0; //input_amp; // * sin(M_PI*j/2); + // generate a random QPSK signal + for (j=0;j<length/2;j++) { + input[i][j] = QPSK[taus()&3]; } } + tx_pwr = dac_fixed_gain(s_re, + s_im, + input, + 0, + nb_antennas, + length, + 0, + 512, + 14, + 15.0); + + multipath_channel(channel,s_re,s_im,r_re,r_im, + length,0); + + rf_rx_simple(r_re, + r_im, + nb_antennas, + length, + 1.0/7.68e6 * 1e9,// sampling time (ns) + rx_gain_dB - 66.227); + + /* rf_rx(r_re, r_im, nb_antennas, @@ -257,9 +303,22 @@ int main(int argc, char* argv[]) { -500.0, // pn_amp (dBc) -0.0, // IQ imbalance (dB), 0.0); // IQ phase imbalance (rad) + */ - write_output("/tmp/test_output_re.m","rfout_re",r_re[0],length,1,7); - write_output("/tmp/test_output_im.m","rfout_im",r_im[0],length,1,7); - // write_output("pn.m","pnoise",pn,1024,1,7); + adc(r_re, + r_im, + 0, + 0, + output, + nb_antennas, + length, + 12); + + write_output("s_im.m","s_im",s_im[0],length,1,7); + write_output("s_re.m","s_re",s_re[0],length,1,7); + write_output("r_im.m","r_im",r_im[0],length,1,7); + write_output("r_re.m","r_re",r_re[0],length,1,7); + write_output("input.m","rfin",input[0],length,1,1); + write_output("output.m","rfout",output[0],length,1,1); } #endif diff --git a/openair1/SIMULATION/TOOLS/abstraction.c b/openair1/SIMULATION/TOOLS/abstraction.c index 046fe1618de..ff631aa78f3 100644 --- a/openair1/SIMULATION/TOOLS/abstraction.c +++ b/openair1/SIMULATION/TOOLS/abstraction.c @@ -69,7 +69,8 @@ void freq_channel(channel_desc_t *desc,u16 nb_rb,s16 n_samples) { init_freq_channel(desc,nb_rb,n_samples); freq_channel_init=1; } - + + start_meas(&desc->interp_freq); for (f=-n_samples/2;f<n_samples/2;f++) { clut = cos_lut[n_samples/2+f]; slut = sin_lut[n_samples/2+f]; @@ -88,6 +89,7 @@ void freq_channel(channel_desc_t *desc,u16 nb_rb,s16 n_samples) { } } } + stop_meas(&desc->interp_freq); } double compute_pbch_sinr(channel_desc_t *desc, @@ -188,7 +190,7 @@ double compute_sinr(channel_desc_t *desc, } int pbch_polynomial_degree; -double a[7]; +double pbch_awgn_polynomial[7]; void load_pbch_desc(FILE *pbch_file_fd) { @@ -213,8 +215,8 @@ void load_pbch_desc(FILE *pbch_file_fd) { printf("fscanf failed: %s\n", strerror(errno)); exit(EXIT_FAILURE); } - a[i] = strtod(dummy,NULL); - printf("%f ",a[i]); + pbch_awgn_polynomial[i] = strtod(dummy,NULL); + printf("%f ",pbch_awgn_polynomial[i]); } printf("\n"); } @@ -222,19 +224,24 @@ void load_pbch_desc(FILE *pbch_file_fd) { double pbch_bler(double sinr) { int i; - double log10_bler=a[pbch_polynomial_degree]; + double log10_bler=pbch_awgn_polynomial[pbch_polynomial_degree]; double sinrpow=sinr; + double bler=0.0; // printf("log10bler %f\n",log10_bler); if (sinr<-7.9) - return(1.0); + bler= 1.0; else if (sinr>=0.0) - return(1e-4); - - for (i=1;i<=pbch_polynomial_degree;i++) { - // printf("sinrpow %f\n",sinrpow); - log10_bler += (a[pbch_polynomial_degree-i]*sinrpow); - sinrpow *= sinr; - // printf("log10bler %f\n",log10_bler); + bler=0.0001; + else { + for (i=1;i<=pbch_polynomial_degree;i++) { + // printf("sinrpow %f\n",sinrpow); + log10_bler += (pbch_awgn_polynomial[pbch_polynomial_degree-i]*sinrpow); + sinrpow *= sinr; + // printf("log10bler %f\n",log10_bler); + } + bler = pow(10.0,log10_bler); } - return(pow(10.0,log10_bler)); + printf ("sinr %f bler %f\n",sinr,bler); + return(bler); + } diff --git a/openair1/SIMULATION/TOOLS/defs.h b/openair1/SIMULATION/TOOLS/defs.h index fde0e6c40e0..b1960e70c18 100644 --- a/openair1/SIMULATION/TOOLS/defs.h +++ b/openair1/SIMULATION/TOOLS/defs.h @@ -63,7 +63,12 @@ typedef struct { /// initial phase for frequency offset simulation double ip; /// number of paths taken by transmit signal - u16 nb_paths; + u16 nb_paths; + /// timing measurements + time_stats_t random_channel; + time_stats_t interp_time; + time_stats_t interp_freq; + time_stats_t convolution; } channel_desc_t; typedef struct { @@ -164,7 +169,7 @@ typedef enum { \param random_aoa If set to 1, AoA of ricean component is randomized */ -channel_desc_t *new_channel_desc(u8 nb_tx,u8 nb_rx, u8 nb_taps, u8 channel_length, double *amps, double* delays, struct complex** R_sqrt, double Td, double BW, double ricean_factor, double aoa, double forgetting_factor, double max_Doppler, s32 channel_offset, double path_loss_dB,u8 random_aoa); +//channel_desc_t *new_channel_desc(u8 nb_tx,u8 nb_rx, u8 nb_taps, u8 channel_length, double *amps, double* delays, struct complex** R_sqrt, double Td, double BW, double ricean_factor, double aoa, double forgetting_factor, double max_Doppler, s32 channel_offset, double path_loss_dB,u8 random_aoa); channel_desc_t *new_channel_desc_scm(u8 nb_tx, u8 nb_rx, @@ -180,7 +185,7 @@ channel_desc_t *new_channel_desc_scm(u8 nb_tx, \brief This routine generates a random channel response (time domain) according to a tapped delay line model. \param desc Pointer to the channel descriptor */ -int random_channel(channel_desc_t *desc); +int random_channel(channel_desc_t *desc, u8 abstraction_flag); /**\fn void multipath_channel(channel_desc_t *desc, double **tx_sig_re, @@ -239,6 +244,9 @@ double compute_sinr(channel_desc_t *desc, u16 nb_rb); double pbch_bler(double sinr); + +void load_pbch_desc(FILE *pbch_file_fd); + /**@}*/ /** diff --git a/openair1/SIMULATION/TOOLS/multipath_channel.c b/openair1/SIMULATION/TOOLS/multipath_channel.c index 8876900eb8d..a98a35bd772 100644 --- a/openair1/SIMULATION/TOOLS/multipath_channel.c +++ b/openair1/SIMULATION/TOOLS/multipath_channel.c @@ -1,199 +1,180 @@ -#include <stdio.h> -#include <stdlib.h> -#include <math.h> -#include <string.h> -#include "defs.h" -#include "SIMULATION/RF/defs.h" - -//#define DEBUG_CH -/* -int init_multipath_channel(channel_desc_t *channel) { - int i; - if (channel->nb_taps<=0) { - msg("init_multipath_channel: nb_taps must be > 0\n"); - return(-1); - } - if (channel->channel_length<=0) { - msg("init_multipath_channel: channel_length must be > 0\n"); - return(-1); - } - if (channel->nb_tx<=0) { - msg("init_multipath_channel: nb_tx must be > 0\n"); - return(-1); - } - if (channel->nb_rx<=0) { - msg("init_multipath_channel: nb_rx must be > 0\n"); - return(-1); - } - channel->amps = (double*) malloc(channel->nb_taps*sizeof(double)); - if (!channel->amps) { - msg("init_multipath_channel: cannot allocate amps\n"); - return(-1); - } - channel->delays = (double*) malloc(channel->nb_taps*sizeof(double)); - if (!channel->delays) { - msg("init_multipath_channel: cannot allocate delays\n"); - return(-1); - } - channel->state = (struct complex **) malloc(channel->nb_tx*channel->nb_rx*sizeof(struct complex *)); - if (!channel->state) { - msg("init_multipath_channel: cannot allocate state\n"); - return(-1); - } - for (i=0; i<channel->nb_tx*channel->nb_rx; i++) { - channel->state[i] = (struct complex *) malloc(channel->nb_taps*sizeof(struct complex)); - if (!channel->state[i]) { - msg("init_multipath_channel: cannot allocate state\n"); - return(-1); - } - } - channel->ch = (struct complex **) malloc(channel->nb_tx*channel->nb_rx*sizeof(struct complex *)); - if (!channel->ch) { - msg("init_multipath_channel: cannot allocate ch\n"); - return(-1); - } - for (i=0; i<channel->nb_tx*channel->nb_rx; i++) { - channel->ch[i] = (struct complex *) malloc(channel->channel_length*sizeof(struct complex)); - if (!channel->ch[i]) { - msg("init_multipath_channel: cannot allocate ch\n"); - return(-1); - } - } - channel->R_tx_sqrt = (struct complex **) malloc(channel->nb_tx*channel->nb_tx*sizeof(struct complex *)); - if (!channel->Rx_tx_sqrt) { - msg("init_multipath_channel: cannot allocate R_tx_sqrt\n"); - return(-1); - } - for (i=0; i<channel->nb_tx*channel->nb_tx; i++) { - channel->R_tx_sqrt[i] = (struct complex *) malloc(channel->channel_length*sizeof(struct complex)); - if (!channel->R_tx_sqrt[i]) { - msg("init_multipath_channel: cannot allocate R_tx_sqrt\n"); - return(-1); - } - } - channel->R_rx_sqrt = (struct complex **) malloc(channel->nb_rx*channel->nb_rx*sizeof(struct complex *)); - if (!channel->R_rx_sqrt) { - msg("init_multipath_channel: cannot allocate R_rx_sqrt\n"); - return(-1); - } - for (i=0; i<channel->nb_rx*channel->nb_rx; i++) { - channel->R_rx_sqrt[i] = (struct complex *) malloc(channel->channel_length*sizeof(struct complex)); - if (!channel->R_rx_sqrt[i]) { - msg("init_multipath_channel: cannot allocate R_rx_sqrt\n"); - return(-1); - } - } - return(0); -} - -int free_multipath_channel(channel_desc_t *channel) { - int i; - free(channel->amps); - free(channel->delays); - for (i=0; i<channel->nb_tx*channel->nb_rx; i++) { - free(channel->state[i] = (struct complex *) malloc(channel->nb_taps*sizeof(struct complex)); - if (!channel->state[i]) { - msg("init_multipath_channel: cannot allocate state\n"); - return(-1); - } - } - free(channel->state); - channel->ch = (struct complex **) malloc(channel->nb_tx*channel->nb_rx*sizeof(struct complex *)); - if (!channel->ch) { - msg("init_multipath_channel: cannot allocate ch\n"); - return(-1); - } - for (i=0; i<channel->nb_tx*channel->nb_rx; i++) { - channel->ch[i] = (struct complex *) malloc(channel->channel_length*sizeof(struct complex)); - if (!channel->ch[i]) { - msg("init_multipath_channel: cannot allocate ch\n"); - return(-1); - } - } - channel->R_tx_sqrt = (struct complex *) malloc(channel->nb_tx*channel->nb_tx*sizeof(struct complex)); - if (!channel->Rx_tx_sqrt) { - msg("init_multipath_channel: cannot allocate Rx_tx_sqrt\n"); - return(-1); - } - channel->R_rx_sqrt = (struct complex *) malloc(channel->nb_rx*channel->nb_rx*sizeof(struct complex)); - if (!channel->R_rx_sqrt) { - msg("init_multipath_channel: cannot allocate R_rx_sqrt\n"); - return(-1); - } - return(0); -} -*/ - -u8 multipath_channel_nosigconv(channel_desc_t *desc){ - - random_channel(desc); - return(1); -} - -//#define DEBUG_CH -void multipath_channel(channel_desc_t *desc, - double **tx_sig_re, - double **tx_sig_im, - double **rx_sig_re, - double **rx_sig_im, - u32 length, - u8 keep_channel) { - - int i,ii,j,l; - struct complex rx_tmp,tx; - - double path_loss = pow(10,desc->path_loss_dB/20); - int dd; - dd = abs(desc->channel_offset); - -#ifdef DEBUG_CH - printf("[CHANNEL] keep = %d : path_loss = %g (%f), nb_rx %d, nb_tx %d, dd %d, len %d \n",keep_channel,path_loss,desc->path_loss_dB,desc->nb_rx,desc->nb_tx,dd,desc->channel_length); -#endif - - if (keep_channel) { - // do nothing - keep channel - } else { - random_channel(desc); - } - -#ifdef DEBUG_CH - for (l = 0;l<(int)desc->channel_length;l++) { - printf("%p (%f,%f) ",desc->ch[0],desc->ch[0][l].x,desc->ch[0][l].y); - } - printf("\n"); -#endif - - for (i=0;i<((int)length-dd);i++) { - for (ii=0;ii<desc->nb_rx;ii++) { - rx_tmp.x = 0; - rx_tmp.y = 0; - for (j=0;j<desc->nb_tx;j++) { - for (l = 0;l<(int)desc->channel_length;l++) { - if ((i>=0) && (i-l)>=0) { - tx.x = tx_sig_re[j][i-l]; - tx.y = tx_sig_im[j][i-l]; - } - else { - tx.x =0; - tx.y =0; - } - rx_tmp.x += (tx.x * desc->ch[ii+(j*desc->nb_rx)][l].x) - (tx.y * desc->ch[ii+(j*desc->nb_rx)][l].y); - rx_tmp.y += (tx.y * desc->ch[ii+(j*desc->nb_rx)][l].x) + (tx.x * desc->ch[ii+(j*desc->nb_rx)][l].y); - } //l - } // j - rx_sig_re[ii][i+dd] = rx_tmp.x*path_loss; - rx_sig_im[ii][i+dd] = rx_tmp.y*path_loss; - /* - if ((ii==0)&&((i%32)==0)) { - printf("%p %p %f,%f => %e,%e\n",rx_sig_re[ii],rx_sig_im[ii],rx_tmp.x,rx_tmp.y,rx_sig_re[ii][i-dd],rx_sig_im[ii][i-dd]); - } - */ - //rx_sig_re[ii][i] = sqrt(.5)*(tx_sig_re[0][i] + tx_sig_re[1][i]); - //rx_sig_im[ii][i] = sqrt(.5)*(tx_sig_im[0][i] + tx_sig_im[1][i]); - - } // ii - } // i -} - - - +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <string.h> +#include "defs.h" +#include "SIMULATION/RF/defs.h" + +//#define DEBUG_CH +u8 multipath_channel_nosigconv(channel_desc_t *desc){ + + random_channel(desc,0); + return(1); +} + +#define CHANNEL_SSE +#ifdef CHANNEL_SSE +void multipath_channel(channel_desc_t *desc, + double **tx_sig_re, + double **tx_sig_im, + double **rx_sig_re, + double **rx_sig_im, + u32 length, + u8 keep_channel) { + + int i,ii,j,l; + int length1, length2, tail; + __m128d rx_tmp128_re_f,rx_tmp128_im_f,rx_tmp128_re,rx_tmp128_im, rx_tmp128_1,rx_tmp128_2,rx_tmp128_3,rx_tmp128_4,tx128_re,tx128_im,ch128_x,ch128_y,pathloss128; + + double path_loss = pow(10,desc->path_loss_dB/20); + int dd = abs(desc->channel_offset); + + pathloss128 = _mm_set1_pd(path_loss); + +#ifdef DEBUG_CH + printf("[CHANNEL] keep = %d : path_loss = %g (%f), nb_rx %d, nb_tx %d, dd %d, len %d \n",keep_channel,path_loss,desc->path_loss_dB,desc->nb_rx,desc->nb_tx,dd,desc->channel_length); +#endif + + if (keep_channel) { + // do nothing - keep channel + } else { + random_channel(desc,0); + } + + start_meas(&desc->convolution); + +#ifdef DEBUG_CH + for (l = 0;l<(int)desc->channel_length;l++) { + printf("%p (%f,%f) ",desc->ch[0],desc->ch[0][l].x,desc->ch[0][l].y); + } + printf("\n"); +#endif + + tail = ((int)length-dd)%2; + if(tail) + length1 = ((int)length-dd)-1; + else + length1 = ((int)length-dd); + length2 = length1/2; + for (i=0;i<length2;i++) { // + for (ii=0;ii<desc->nb_rx;ii++) { + // rx_tmp.x = 0; + // rx_tmp.y = 0; + rx_tmp128_re_f = _mm_setzero_pd(); + rx_tmp128_im_f = _mm_setzero_pd(); + for (j=0;j<desc->nb_tx;j++) { + for (l = 0;l<(int)desc->channel_length;l++) { + if ((i>=0) && (i-l)>=0) { //SIMD correct only if length1 > 2*channel_length...which is almost always satisfied + // tx.x = tx_sig_re[j][i-l]; + // tx.y = tx_sig_im[j][i-l]; + tx128_re = _mm_loadu_pd(&tx_sig_re[j][2*i-l]); // tx_sig_re[j][i-l+1], tx_sig_re[j][i-l] + tx128_im = _mm_loadu_pd(&tx_sig_im[j][2*i-l]); + } + else { + //tx.x =0; + //tx.y =0; + tx128_re = _mm_setzero_pd(); + tx128_im = _mm_setzero_pd(); + } + ch128_x = _mm_set1_pd(desc->ch[ii+(j*desc->nb_rx)][l].x); + ch128_y = _mm_set1_pd(desc->ch[ii+(j*desc->nb_rx)][l].y); + // rx_tmp.x += (tx.x * desc->ch[ii+(j*desc->nb_rx)][l].x) - (tx.y * desc->ch[ii+(j*desc->nb_rx)][l].y); + // rx_tmp.y += (tx.y * desc->ch[ii+(j*desc->nb_rx)][l].x) + (tx.x * desc->ch[ii+(j*desc->nb_rx)][l].y); + rx_tmp128_1 = _mm_mul_pd(tx128_re,ch128_x); + rx_tmp128_2 = _mm_mul_pd(tx128_re,ch128_y); + rx_tmp128_3 = _mm_mul_pd(tx128_im,ch128_x); + rx_tmp128_4 = _mm_mul_pd(tx128_im,ch128_y); + rx_tmp128_re = _mm_sub_pd(rx_tmp128_1,rx_tmp128_4); + rx_tmp128_im = _mm_add_pd(rx_tmp128_2,rx_tmp128_3); + rx_tmp128_re_f = _mm_add_pd(rx_tmp128_re_f,rx_tmp128_re); + rx_tmp128_im_f = _mm_add_pd(rx_tmp128_im_f,rx_tmp128_im); + } //l + } // j + //rx_sig_re[ii][i+dd] = rx_tmp.x*path_loss; + //rx_sig_im[ii][i+dd] = rx_tmp.y*path_loss; + rx_tmp128_re_f = _mm_mul_pd(rx_tmp128_re_f,pathloss128); + rx_tmp128_im_f = _mm_mul_pd(rx_tmp128_im_f,pathloss128); + _mm_storeu_pd(&rx_sig_re[ii][2*i+dd],rx_tmp128_re_f); // max index: length-dd -1 + dd = length -1 + _mm_storeu_pd(&rx_sig_im[ii][2*i+dd],rx_tmp128_im_f); + /* + if ((ii==0)&&((i%32)==0)) { + printf("%p %p %f,%f => %e,%e\n",rx_sig_re[ii],rx_sig_im[ii],rx_tmp.x,rx_tmp.y,rx_sig_re[ii][i-dd],rx_sig_im[ii][i-dd]); + } + */ + //rx_sig_re[ii][i] = sqrt(.5)*(tx_sig_re[0][i] + tx_sig_re[1][i]); + //rx_sig_im[ii][i] = sqrt(.5)*(tx_sig_im[0][i] + tx_sig_im[1][i]); + + } // ii + } // i + + stop_meas(&desc->convolution); + +} + +#else +void multipath_channel(channel_desc_t *desc, + double **tx_sig_re, + double **tx_sig_im, + double **rx_sig_re, + double **rx_sig_im, + u32 length, + u8 keep_channel) { + + int i,ii,j,l; + struct complex rx_tmp,tx; + + double path_loss = pow(10,desc->path_loss_dB/20); + int dd; + dd = abs(desc->channel_offset); + +#ifdef DEBUG_CH + printf("[CHANNEL] keep = %d : path_loss = %g (%f), nb_rx %d, nb_tx %d, dd %d, len %d \n",keep_channel,path_loss,desc->path_loss_dB,desc->nb_rx,desc->nb_tx,dd,desc->channel_length); +#endif + + if (keep_channel) { + // do nothing - keep channel + } else { + random_channel(desc,0); + } + +#ifdef DEBUG_CH + for (l = 0;l<(int)desc->channel_length;l++) { + printf("%p (%f,%f) ",desc->ch[0],desc->ch[0][l].x,desc->ch[0][l].y); + } + printf("\n"); +#endif + + for (i=0;i<((int)length-dd);i++) { + for (ii=0;ii<desc->nb_rx;ii++) { + rx_tmp.x = 0; + rx_tmp.y = 0; + for (j=0;j<desc->nb_tx;j++) { + for (l = 0;l<(int)desc->channel_length;l++) { + if ((i>=0) && (i-l)>=0) { + tx.x = tx_sig_re[j][i-l]; + tx.y = tx_sig_im[j][i-l]; + } + else { + tx.x =0; + tx.y =0; + } + rx_tmp.x += (tx.x * desc->ch[ii+(j*desc->nb_rx)][l].x) - (tx.y * desc->ch[ii+(j*desc->nb_rx)][l].y); + rx_tmp.y += (tx.y * desc->ch[ii+(j*desc->nb_rx)][l].x) + (tx.x * desc->ch[ii+(j*desc->nb_rx)][l].y); + } //l + } // j + rx_sig_re[ii][i+dd] = rx_tmp.x*path_loss; + rx_sig_im[ii][i+dd] = rx_tmp.y*path_loss; + /* + if ((ii==0)&&((i%32)==0)) { + printf("%p %p %f,%f => %e,%e\n",rx_sig_re[ii],rx_sig_im[ii],rx_tmp.x,rx_tmp.y,rx_sig_re[ii][i-dd],rx_sig_im[ii][i-dd]); + } + */ + //rx_sig_re[ii][i] = sqrt(.5)*(tx_sig_re[0][i] + tx_sig_re[1][i]); + //rx_sig_im[ii][i] = sqrt(.5)*(tx_sig_im[0][i] + tx_sig_im[1][i]); + + } // ii + } // i +} +#endif + + diff --git a/openair1/SIMULATION/TOOLS/random_channel.c b/openair1/SIMULATION/TOOLS/random_channel.c index b42049f5208..04c7da0d241 100644 --- a/openair1/SIMULATION/TOOLS/random_channel.c +++ b/openair1/SIMULATION/TOOLS/random_channel.c @@ -11,24 +11,24 @@ #include "UTIL/LOG/log.h" //#define DEBUG_CH -channel_desc_t *new_channel_desc(u8 nb_tx, - u8 nb_rx, - u8 nb_taps, - u8 channel_length, - double *amps, - double *delays, - struct complex** R_sqrt, - double Td, - double BW, - double ricean_factor, - double aoa, - double forgetting_factor, - double max_Doppler, - s32 channel_offset, - double path_loss_dB, - u8 random_aoa) { - - channel_desc_t *chan_desc = (channel_desc_t *)malloc(sizeof(channel_desc_t)); +void fill_channel_desc(channel_desc_t *chan_desc, + u8 nb_tx, + u8 nb_rx, + u8 nb_taps, + u8 channel_length, + double *amps, + double *delays, + struct complex** R_sqrt, + double Td, + double BW, + double ricean_factor, + double aoa, + double forgetting_factor, + double max_Doppler, + s32 channel_offset, + double path_loss_dB, + u8 random_aoa) { + u16 i,j; double delta_tau; @@ -106,7 +106,11 @@ channel_desc_t *new_channel_desc(u8 nb_tx, chan_desc->nb_paths=10; - return(chan_desc); + reset_meas(&chan_desc->random_channel); + reset_meas(&chan_desc->interp_time); + reset_meas(&chan_desc->interp_freq); + reset_meas(&chan_desc->convolution); + } double mbsfn_delays[] = {0,.03,.15,.31,.37,1.09,12.490,12.52,12.64,12.80,12.86,13.58,27.49,27.52,27.64,27.80,27.86,28.58}; @@ -457,22 +461,23 @@ channel_desc_t *new_channel_desc_scm(u8 nb_tx, aoa = .03; maxDoppler = 0; - chan_desc = new_channel_desc(nb_tx, - nb_rx, - nb_taps, - channel_length, - default_amps_lin, - NULL, - NULL, - Td, - BW, - ricean_factor, - aoa, - forgetting_factor, - maxDoppler, - channel_offset, - path_loss_dB, - 0); + fill_channel_desc(chan_desc, + nb_tx, + nb_rx, + nb_taps, + channel_length, + default_amps_lin, + NULL, + NULL, + Td, + BW, + ricean_factor, + aoa, + forgetting_factor, + maxDoppler, + channel_offset, + path_loss_dB, + 0); break; case Rice8: @@ -483,7 +488,7 @@ channel_desc_t *new_channel_desc_scm(u8 nb_tx, aoa = .03; maxDoppler = 0; - chan_desc = new_channel_desc(nb_tx, + fill_channel_desc(chan_desc,nb_tx, nb_rx, nb_taps, channel_length, @@ -509,7 +514,7 @@ channel_desc_t *new_channel_desc_scm(u8 nb_tx, aoa = .03; maxDoppler = 0; - chan_desc = new_channel_desc(nb_tx, + fill_channel_desc(chan_desc,nb_tx, nb_rx, nb_taps, channel_length, @@ -535,7 +540,7 @@ channel_desc_t *new_channel_desc_scm(u8 nb_tx, aoa = .03; maxDoppler = 800; - chan_desc = new_channel_desc(nb_tx, + fill_channel_desc(chan_desc,nb_tx, nb_rx, nb_taps, channel_length, @@ -570,7 +575,7 @@ channel_desc_t *new_channel_desc_scm(u8 nb_tx, else R_sqrt_ptr2 = NULL; - chan_desc = new_channel_desc(nb_tx, + fill_channel_desc(chan_desc,nb_tx, nb_rx, nb_taps, channel_length, @@ -605,7 +610,7 @@ channel_desc_t *new_channel_desc_scm(u8 nb_tx, else R_sqrt_ptr2 = NULL; - chan_desc = new_channel_desc(nb_tx, + fill_channel_desc(chan_desc,nb_tx, nb_rx, nb_taps, channel_length, @@ -631,7 +636,7 @@ channel_desc_t *new_channel_desc_scm(u8 nb_tx, aoa = .03; maxDoppler = 0; - chan_desc = new_channel_desc(nb_tx, + fill_channel_desc(chan_desc,nb_tx, nb_rx, nb_taps, channel_length, @@ -657,7 +662,7 @@ channel_desc_t *new_channel_desc_scm(u8 nb_tx, aoa = 0.0; maxDoppler = 0; - chan_desc = new_channel_desc(nb_tx, + fill_channel_desc(chan_desc,nb_tx, nb_rx, nb_taps, channel_length, @@ -694,7 +699,7 @@ channel_desc_t *new_channel_desc_scm(u8 nb_tx, else R_sqrt_ptr2 = NULL; - chan_desc = new_channel_desc(nb_tx, + fill_channel_desc(chan_desc,nb_tx, nb_rx, nb_taps, channel_length, @@ -729,7 +734,7 @@ channel_desc_t *new_channel_desc_scm(u8 nb_tx, else R_sqrt_ptr2 = NULL; - chan_desc = new_channel_desc(nb_tx, + fill_channel_desc(chan_desc,nb_tx, nb_rx, nb_taps, channel_length, @@ -762,7 +767,7 @@ channel_desc_t *new_channel_desc_scm(u8 nb_tx, } -int random_channel(channel_desc_t *desc) { +int random_channel(channel_desc_t *desc, u8 abstraction_flag) { double s; int i,k,l,aarx,aatx; @@ -774,7 +779,7 @@ int random_channel(channel_desc_t *desc) { return(-1); } - + start_meas(&desc->random_channel); for (i=0;i<(int)desc->nb_taps;i++) { for (aarx=0;aarx<desc->nb_rx;aarx++) { for (aatx=0;aatx<desc->nb_tx;aatx++) { @@ -862,9 +867,12 @@ int random_channel(channel_desc_t *desc) { */ } //nb_taps + stop_meas(&desc->random_channel); //memset((void *)desc->ch[aarx+(aatx*desc->nb_rx)],0,(int)(desc->channel_length)*sizeof(struct complex)); + if (abstraction_flag==0) { + start_meas(&desc->interp_time); for (aarx=0;aarx<desc->nb_rx;aarx++) { for (aatx=0;aatx<desc->nb_tx;aatx++) { if (desc->channel_length == 1) { @@ -895,6 +903,8 @@ int random_channel(channel_desc_t *desc) { } //channel_length } //aatx } //aarx + stop_meas(&desc->interp_time); + } if (desc->first_run==1) desc->first_run = 0; diff --git a/openair2/LAYER2/MAC/defs.h b/openair2/LAYER2/MAC/defs.h index a3f108ee2bb..12b74d5b5dd 100644 --- a/openair2/LAYER2/MAC/defs.h +++ b/openair2/LAYER2/MAC/defs.h @@ -655,6 +655,18 @@ typedef struct{ eNB_STATS eNB_stats; /// eNB to UE statistics eNB_UE_STATS eNB_UE_stats[NUMBER_OF_UE_MAX]; + + // MAC function execution peformance profiler + time_stats_t eNB_scheduler; + time_stats_t schedule_si; + time_stats_t schedule_ra; + time_stats_t schedule_ulsch; + time_stats_t fill_DLSCH_dci; + time_stats_t schedule_dlsch_preprocessor; + time_stats_t schedule_dlsch; // include rlc_data_req + MAC header + preprocessor + time_stats_t schedule_mch; + time_stats_t rx_ulsch_sdu; // include rlc_data_ind + }eNB_MAC_INST; typedef struct { @@ -805,6 +817,14 @@ typedef struct{ uint16_t cba_rnti[NUM_MAX_CBA_GROUP]; uint8_t cba_last_access[NUM_MAX_CBA_GROUP]; //#endif + + time_stats_t ue_scheduler; // total + time_stats_t tx_ulsch_sdu; // inlcude rlc_data_req + mac header gen + time_stats_t rx_dlsch_sdu ; // include mac_rrc_data_ind or mac_rlc_status_ind+mac_rlc_data_ind and mac header parser + time_stats_t ue_query_mch; + time_stats_t rx_mch_sdu; + time_stats_t rx_si; // include mac_rrc_data_ind + }UE_MAC_INST; typedef struct { diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c index 5f225556406..17f884211f6 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler.c +++ b/openair2/LAYER2/MAC/eNB_scheduler.c @@ -529,6 +529,8 @@ void rx_sdu(module_id_t enb_mod_idP,frame_t frameP,rnti_t rntiP,u8 *sdu, u16 sdu unsigned short rx_lengths[NB_RB_MAX]; module_id_t ue_mod_id = find_UE_id(enb_mod_idP,rntiP); int ii,j; + start_meas(&eNB_mac_inst[enb_mod_idP].rx_ulsch_sdu); + for(ii=0; ii<NB_RB_MAX; ii++) rx_lengths[ii] = 0; vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_SDU,1); @@ -648,7 +650,7 @@ void rx_sdu(module_id_t enb_mod_idP,frame_t frameP,rnti_t rntiP,u8 *sdu, u16 sdu } vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_SDU,0); - + stop_meas(&eNB_mac_inst[enb_mod_idP].rx_ulsch_sdu); } unsigned char generate_dlsch_header(unsigned char *mac_header, @@ -986,6 +988,8 @@ void add_ue_spec_dci(DCI_PDU *DCI_pdu,void *pdu,rnti_t rnti,unsigned char dci_si void schedule_SI(module_id_t module_idP,frame_t frameP, unsigned char *nprb,unsigned int *nCCE) { + start_meas(&eNB_mac_inst[module_idP].schedule_si); + unsigned char bcch_sdu_length; int mcs = -1; void *BCCH_alloc_pdu=(void*)&eNB_mac_inst[module_idP].BCCH_alloc_pdu; @@ -1088,13 +1092,16 @@ void schedule_SI(module_id_t module_idP,frame_t frameP, unsigned char *nprb,unsi eNB_mac_inst[module_idP].bcch_active=1; *nprb=3; *nCCE=4; - return; } - eNB_mac_inst[module_idP].bcch_active=0; - *nprb=0; - *nCCE=0; - //LOG_D(MAC,"[eNB %d] Frame %d : BCCH not active \n",module_idP,frameP); - + else { + eNB_mac_inst[module_idP].bcch_active=0; + *nprb=0; + *nCCE=0; + //LOG_D(MAC,"[eNB %d] Frame %d : BCCH not active \n",Mod_id,frame); + } + // this might be misleading when bcch is inactive + stop_meas(&eNB_mac_inst[module_idP].schedule_si); + return; } #ifdef Rel10 @@ -1588,6 +1595,7 @@ MCH_PDU *get_mch_sdu(uint8_t module_idP,uint32_t frameP, sub_frame_t subframeP) // First stage of Random-Access Scheduling void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,unsigned char Msg3_subframe,unsigned char *nprb,unsigned int *nCCE) { + start_meas(&eNB_mac_inst[module_idP].schedule_ra); RA_TEMPLATE *RA_template = (RA_TEMPLATE *)&eNB_mac_inst[module_idP].RA_template[0]; unsigned char i;//,harq_pid,round; u16 rrc_sdu_length; @@ -1942,6 +1950,7 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un */ } } + stop_meas(&eNB_mac_inst[module_idP].schedule_ra); } // This has to be updated to include BSR information @@ -1980,10 +1989,9 @@ u8 rb_table[33] = {1,2,3,4,5,6,8,9,10,12,15,16,18,20,24,25,27,30,32,36,40,45,48, void schedule_ulsch(module_id_t module_idP, frame_t frameP,unsigned char cooperation_flag,sub_frame_t subframeP, unsigned char sched_subframe,unsigned int *nCCE) {//,int calibration_flag) { + start_meas(&eNB_mac_inst[module_idP].schedule_ulsch); u8 granted_UEs; unsigned int nCCE_available; - - u16 first_rb=1,i; granted_UEs = find_ulgranted_UEs(module_idP); @@ -2017,6 +2025,7 @@ void schedule_ulsch(module_id_t module_idP, frame_t frameP,unsigned char coopera if ((eNB_mac_inst[module_idP].num_active_cba_groups > 0) && (*nCCE == 0)) schedule_ulsch_cba_rnti(module_idP, cooperation_flag, frameP, subframeP, sched_subframe, granted_UEs, nCCE, &nCCE_available, &first_rb); #endif + stop_meas(&eNB_mac_inst[module_idP].schedule_ulsch); } #ifdef CBA @@ -2660,8 +2669,8 @@ u32 allocate_prbs_sub(int nb_rb, u8 *rballoc) { void fill_DLSCH_dci(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,u32 RBalloc,u8 RA_scheduled,int mbsfn_flag) { + // loop over all allocated UEs and compute frequency allocations for PDSCH - module_id_t ue_mod_id = -1; u8 first_rb,nb_rb=3; rnti_t rnti; @@ -2680,7 +2689,9 @@ void fill_DLSCH_dci(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP if (mbsfn_flag>0) return; - + + start_meas(&eNB_mac_inst[module_idP].fill_DLSCH_dci); + // clear vrb_map memset(vrb_map,0,100); @@ -3392,6 +3403,7 @@ void fill_DLSCH_dci(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP } + stop_meas(&eNB_mac_inst[module_idP].fill_DLSCH_dci); } @@ -3442,6 +3454,11 @@ void schedule_ue_spec(module_id_t module_idP, int mcs; u16 min_rb_unit; short ta_update = 0; + + if (mbsfn_flag>0) + return; + + reset_meas(&eNB_mac_inst[module_idP].schedule_dlsch); switch (mac_xface->lte_frame_parms->N_RB_DL) { case 6: @@ -3461,9 +3478,6 @@ void schedule_ue_spec(module_id_t module_idP, break; } - if (mbsfn_flag>0) - return; - //int **rballoc_sub = (int **)malloc(1792*sizeof(int *)); granted_UEs = find_dlgranted_UEs(module_idP); @@ -3505,14 +3519,15 @@ void schedule_ue_spec(module_id_t module_idP, /// CALLING Pre_Processor for downlink scheduling (Returns estimation of RBs required by each UE and the allocation on sub-band) + start_meas(&eNB_mac_inst[module_idP].schedule_dlsch_preprocessor); dlsch_scheduler_pre_processor(module_idP, - frameP, - subframeP, - dl_pow_off, - pre_nb_available_rbs, - mac_xface->lte_frame_parms->N_RBGS, - rballoc_sub_UE); - + frameP, + subframeP, + dl_pow_off, + pre_nb_available_rbs, + mac_xface->lte_frame_parms->N_RBGS, + rballoc_sub_UE); + stop_meas(&eNB_mac_inst[module_idP].schedule_dlsch_preprocessor); for (ue_mod_id=0;ue_mod_id<granted_UEs;ue_mod_id++) { @@ -3596,11 +3611,13 @@ void schedule_ue_spec(module_id_t module_idP, if (eNB_UE_stats==NULL) mac_xface->macphy_exit("[MAC][eNB] Cannot find eNB_UE_stats\n"); - //eNB_UE_stats->dlsch_mcs1 = openair_daq_vars.target_ue_dl_mcs; - // int flag_LA=0; - //printf("CQI %d\n",eNB_UE_stats->DL_cqi[0]); - - eNB_UE_stats->dlsch_mcs1 = cqi_to_mcs[eNB_UE_stats->DL_cqi[0]]; + if (openair_daq_vars.target_ue_dl_mcs <= 0) { + eNB_UE_stats->dlsch_mcs1 = cqi_to_mcs[eNB_UE_stats->DL_cqi[0]]; + LOG_T(MAC,"CQI %d\n",eNB_UE_stats->DL_cqi[0]); + } + else + eNB_UE_stats->dlsch_mcs1 = openair_daq_vars.target_ue_dl_mcs; + if(eNB_UE_stats->dlsch_mcs1>22) eNB_UE_stats->dlsch_mcs1=22; @@ -4285,10 +4302,12 @@ void schedule_ue_spec(module_id_t module_idP, } //printf("MAC nCCE : %d\n",*nCCE_used); } + stop_meas(&eNB_mac_inst[module_idP].schedule_dlsch); } void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,u8 cooperation_flag, frame_t frameP, sub_frame_t subframeP) {//, int calibration_flag) { - + + start_meas(&eNB_mac_inst[module_idP].eNB_scheduler); unsigned char nprb=0; unsigned int nCCE=0; int mbsfn_status=0; @@ -4411,8 +4430,9 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,u8 cooperation_flag, frame #ifdef Rel10 if (eNB_mac_inst[module_idP].MBMS_flag >0) { - + start_meas(&eNB_mac_inst[module_idP].schedule_mch); mbsfn_status = schedule_MBMS(module_idP,frameP,subframeP); + stop_meas(&eNB_mac_inst[module_idP].schedule_mch); } #endif @@ -4688,4 +4708,6 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,u8 cooperation_flag, frame LOG_D(MAC,"frameP %d, subframeP %d nCCE %d\n",frameP,subframeP,nCCE); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER,0); + stop_meas(&eNB_mac_inst[module_idP].eNB_scheduler); + } diff --git a/openair2/LAYER2/MAC/rar_tools.c b/openair2/LAYER2/MAC/rar_tools.c index 70f20446d78..ebe7d4a89b9 100644 --- a/openair2/LAYER2/MAC/rar_tools.c +++ b/openair2/LAYER2/MAC/rar_tools.c @@ -106,7 +106,7 @@ unsigned short fill_rar(module_id_t module_idP, rar[2] |= ((mcs&0x8)>>3); // mcs 10 rar[3] = (((mcs&0x7)<<5)) | ((TPC&7)<<2) | ((ULdelay&1)<<1) | (cqireq&1); - LOG_I(MAC,"[eNB %d][RAPROC] Frame %d Generating RAR (%02x|%02x.%02x.%02x.%02x.%02x.%02x) for ra_idx %d, CRNTI %x,preamble %d/%d,TIMING OFFSET %d\n",module_idP,frame, + LOG_I(MAC,"[eNB %d][RAPROC] Frame %d Generating RAR (%02x|%02x.%02x.%02x.%02x.%02x.%02x) for ra_idx %d, CRNTI %x,preamble %d/%d,TIMING OFFSET %d\n",module_idP,frameP, *(uint8_t*)rarh,rar[0],rar[1],rar[2],rar[3],rar[4],rar[5], ra_idx, eNB_mac_inst[module_idP].RA_template[ra_idx].rnti, @@ -118,7 +118,7 @@ unsigned short fill_rar(module_id_t module_idP, trace_pdu(1, dlsch_buffer, input_buffer_length, module_idP, 2, 1, eNB_mac_inst[module_idP].subframe, 0, 0); LOG_I(OPT,"[eNB %d][RAPROC] RAR Frame %d trace pdu for rnti %x and rapid %d size %d\n", - module_idP, frame, eNB_mac_inst[module_idP].RA_template[ra_idx].rnti, + module_idP, frameP, eNB_mac_inst[module_idP].RA_template[ra_idx].rnti, rarh->RAPID, input_buffer_length); } #endif @@ -131,7 +131,7 @@ uint16_t ue_process_rar(module_id_t module_idP, frame_t frameP, u8 *dlsch_buffer // RAR_PDU *rar = (RAR_PDU *)(dlsch_buffer+1); uint8_t *rar = (uint8_t *)(dlsch_buffer+1); - LOG_I(MAC,"[eNB %d][RAPROC] Frame %d Received RAR (%02x|%02x.%02x.%02x.%02x.%02x.%02x) for preamble %d/%d\n",module_idP,frame, + LOG_I(MAC,"[eNB %d][RAPROC] Frame %d Received RAR (%02x|%02x.%02x.%02x.%02x.%02x.%02x) for preamble %d/%d\n",module_idP,frameP, *(uint8_t*)rarh,rar[0],rar[1],rar[2],rar[3],rar[4],rar[5], rarh->RAPID,preamble_index); #ifdef DEBUG_RAR diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c index afe7ad30592..d85a6f112b5 100644 --- a/openair2/LAYER2/MAC/ue_procedures.c +++ b/openair2/LAYER2/MAC/ue_procedures.c @@ -274,6 +274,7 @@ void ue_send_sdu(module_id_t module_idP,frame_t frameP,u8 *sdu,u16 sdu_len,u8 eN unsigned short rx_lengths[NB_RB_MAX]; unsigned char *tx_sdu; + start_meas(&UE_mac_inst[module_idP].rx_dlsch_sdu); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_SDU, VCD_FUNCTION_IN); LOG_T(MAC,"sdu: %x.%x.%x\n",sdu[0],sdu[1],sdu[2]); @@ -412,10 +413,12 @@ void ue_send_sdu(module_id_t module_idP,frame_t frameP,u8 *sdu,u16 sdu_len,u8 eN payload_ptr+= rx_lengths[i]; } vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_SDU, VCD_FUNCTION_OUT); + stop_meas(&UE_mac_inst[module_idP].rx_dlsch_sdu); } void ue_decode_si(module_id_t module_idP,frame_t frameP, u8 eNB_index, void *pdu,u16 len) { + start_meas(&UE_mac_inst[module_idP].rx_si); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_SI, VCD_FUNCTION_IN); LOG_D(MAC,"[UE %d] Frame %d Sending SI to RRC (LCID Id %d,len %d)\n",module_idP,frameP,BCCH,len); @@ -429,6 +432,7 @@ void ue_decode_si(module_id_t module_idP,frame_t frameP, u8 eNB_index, void *pdu eNB_index, 0); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_SI, VCD_FUNCTION_OUT); + stop_meas(&UE_mac_inst[module_idP].rx_si); } #ifdef Rel10 @@ -484,7 +488,9 @@ void ue_send_mch_sdu(module_id_t module_idP, frame_t frameP, u8 *sdu, u16 sdu_le unsigned char rx_lcids[NB_RB_MAX]; unsigned short rx_lengths[NB_RB_MAX]; - // vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_MCH_SDU, VCD_FUNCTION_IN); + start_meas(&UE_mac_inst[module_idP].rx_mch_sdu); + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_MCH_SDU, VCD_FUNCTION_IN); + LOG_D(MAC,"[UE %d] Frame %d : process the mch PDU for sync area %d \n",module_idP,frameP, sync_area); LOG_D(MAC,"[UE %d] sdu: %x.%x\n", module_idP,sdu[0], sdu[1]); LOG_D(MAC,"[UE %d] parse_mch_header, demultiplex\n",module_idP); @@ -534,7 +540,8 @@ void ue_send_mch_sdu(module_id_t module_idP, frame_t frameP, u8 *sdu, u16 sdu_le payload_ptr += rx_lengths[i]; } - // vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_MCH_SDU, VCD_FUNCTION_OUT); + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_MCH_SDU, VCD_FUNCTION_OUT); + stop_meas(&UE_mac_inst[module_idP].rx_mch_sdu); } s8 ue_get_mbsfn_sf_alloction (module_id_t module_idP, u8 mbsfn_sync_area, unsigned char eNB_index){ @@ -558,7 +565,9 @@ int ue_query_mch(module_id_t module_idP, uint32_t frameP, uint32_t subframe, uin int mbsfn_period = 0;// 1<<(UE_mac_inst[module_idP].mbsfn_SubframeConfig[0]->radioframeAllocationPeriod); int mcch_period = 0;// 32<<(UE_mac_inst[module_idP].mbsfn_AreaInfo[0]->mcch_Config_r9.mcch_RepetitionPeriod_r9); int mch_scheduling_period = -1; - + + start_meas(&UE_mac_inst[module_idP].ue_query_mch); + if (UE_mac_inst[module_idP].pmch_Config[0]) mch_scheduling_period = 8<<(UE_mac_inst[module_idP].pmch_Config[0]->mch_SchedulingPeriod_r9); @@ -757,6 +766,8 @@ int ue_query_mch(module_id_t module_idP, uint32_t frameP, uint32_t subframe, uin } } // end of for + stop_meas(&UE_mac_inst[module_idP].ue_query_mch); + if ( (mcch_flag==1))// || (msi_flag==1)) *mcch_active=1; @@ -1035,6 +1046,7 @@ void ue_get_sdu(module_id_t module_idP,frame_t frameP,sub_frame_t subframe, u8 e int j; // used for padding // Compute header length + start_meas(&UE_mac_inst[module_idP].tx_ulsch_sdu); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GET_SDU, VCD_FUNCTION_IN); #ifdef CBA @@ -1263,6 +1275,7 @@ void ue_get_sdu(module_id_t module_idP,frame_t frameP,sub_frame_t subframe, u8 e UE_mac_inst[module_idP].scheduling_info.SR_pending=0; UE_mac_inst[module_idP].scheduling_info.SR_COUNTER=0; vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GET_SDU, VCD_FUNCTION_OUT); + stop_meas(&UE_mac_inst[module_idP].tx_ulsch_sdu); } // called at each subframe @@ -1272,8 +1285,6 @@ void ue_get_sdu(module_id_t module_idP,frame_t frameP,sub_frame_t subframe, u8 e // 3. Perform SR/BSR procedures for scheduling feedback // 4. Perform PHR procedures - - UE_L2_STATE_t ue_scheduler(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP, lte_subframe_t directionP,u8 eNB_indexP) { int lcid; // lcid index @@ -1292,7 +1303,7 @@ UE_L2_STATE_t ue_scheduler(module_id_t module_idP,frame_t frameP, sub_frame_t su instance_t instance; int result; #endif - + start_meas(&UE_mac_inst[module_idP].ue_scheduler); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_IN); #if defined(ENABLE_ITTI) @@ -1329,37 +1340,11 @@ UE_L2_STATE_t ue_scheduler(module_id_t module_idP,frame_t frameP, sub_frame_t su //Rrc_xface->Frame_index=Mac_rlc_xface->frameP; //if (subframe%5 == 0) #ifdef EXMIMO - pdcp_run(frameP, 0, module_idP, eNB_index); - /* - ret = pthread_mutex_trylock (&pdcp_mutex); - if (ret != 0) { - if (ret==EBUSY) - LOG_E(PDCP,"Mutex busy\n"); - else - LOG_E(PDCP,"Cannot lock mutex\n"); - //return(-1); - } - else { - pdcp_instance_cnt++; - pthread_mutex_unlock(&pdcp_mutex); - - if (pdcp_instance_cnt == 0) { - if (pthread_cond_signal(&pdcp_cond) != 0) { - LOG_E(PDCP,"pthread_cond_signal unsuccessfull\n"); - //return(-1); - } - } - else { - LOG_W(PDCP,"PDCP thread busy!!! inst_cnt=%d\n",pdcp_instance_cnt); - } - } - */ + pdcp_run(frameP, 0, module_idP, eNB_indexP); #endif UE_mac_inst[module_idP].frame = frameP; UE_mac_inst[module_idP].subframe = subframeP; - - #ifdef CELLULAR rrc_rx_tx(module_idP, frameP, 0, eNB_indexP); #else @@ -1371,10 +1356,14 @@ UE_L2_STATE_t ue_scheduler(module_id_t module_idP,frame_t frameP, sub_frame_t su break; case RRC_ConnSetup_failed: LOG_E(MAC,"RRCConnectionSetup failed, returning to IDLE state\n"); + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT); + stop_meas(&UE_mac_inst[module_idP].ue_scheduler); return(CONNECTION_LOST); break; case RRC_PHY_RESYNCH: LOG_E(MAC,"RRC Loss of synch, returning PHY_RESYNCH\n"); + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT); + stop_meas(&UE_mac_inst[module_idP].ue_scheduler); return(PHY_RESYNCH); case RRC_Handover_failed: LOG_N(MAC,"Handover failure for UE %d eNB_index %d\n",module_idP,eNB_indexP); @@ -1384,6 +1373,8 @@ UE_L2_STATE_t ue_scheduler(module_id_t module_idP,frame_t frameP, sub_frame_t su break; case RRC_HO_STARTED: LOG_I(MAC,"RRC handover, Instruct PHY to start the contention-free PRACH and synchronization\n"); + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT); + stop_meas(&UE_mac_inst[module_idP].ue_scheduler); return(PHY_HO_PRACH); default: break; @@ -1397,9 +1388,10 @@ UE_L2_STATE_t ue_scheduler(module_id_t module_idP,frame_t frameP, sub_frame_t su rach_ConfigCommon = &UE_mac_inst[module_idP].radioResourceConfigCommon->rach_ConfigCommon; else { LOG_E(MAC,"FATAL: radioResourceConfigCommon is NULL!!!\n"); - mac_xface->macphy_exit(""); - vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT); - return(RRC_OK); + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT); + stop_meas(&UE_mac_inst[module_idP].ue_scheduler); + mac_xface->macphy_exit(""); + //return(RRC_OK); } LOG_I(MAC,"Frame %d: Contention resolution timer %d/%d\n",frameP,UE_mac_inst[module_idP].RA_contention_resolution_cnt, @@ -1454,6 +1446,7 @@ UE_L2_STATE_t ue_scheduler(module_id_t module_idP,frame_t frameP, sub_frame_t su UE_mac_inst[module_idP].ul_active=0; LOG_T(MAC,"[UE %d] Release all SRs \n", module_idP); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT); + stop_meas(&UE_mac_inst[module_idP].ue_scheduler); return(CONNECTION_OK); } @@ -1494,6 +1487,7 @@ UE_L2_STATE_t ue_scheduler(module_id_t module_idP,frame_t frameP, sub_frame_t su } //If the UE has UL resources allocated for new transmission for this TTI here: vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT); + stop_meas(&UE_mac_inst[module_idP].ue_scheduler); return(CONNECTION_OK); } diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c index 8f427b47a41..5cdfdd9c9f5 100755 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c @@ -88,6 +88,7 @@ boolean_t pdcp_data_req(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t u16 current_sn = 0; mem_block_t *pdcp_pdu_p = NULL; rlc_op_status_t rlc_status; + boolean_t ret=TRUE; AssertError (enb_mod_idP < NUMBER_OF_eNB_MAX, return FALSE, "eNB id is too high (%u/%d) %u %u!\n", enb_mod_idP, NUMBER_OF_eNB_MAX, ue_mod_idP, rb_idP); AssertError (ue_mod_idP < NUMBER_OF_UE_MAX, return FALSE, "UE id is too high (%u/%d) %u %u!\n", ue_mod_idP, NUMBER_OF_UE_MAX, enb_mod_idP, rb_idP); @@ -123,7 +124,12 @@ boolean_t pdcp_data_req(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t // XXX What does following call do? mac_xface->macphy_exit("PDCP sdu buffer size > MAX_IP_PACKET_SIZE"); } - + + if (enb_flagP == 0) + start_meas(&eNB_pdcp_stats[enb_mod_idP].data_req); + else + start_meas(&UE_pdcp_stats[ue_mod_idP].data_req); + // PDCP transparent mode for MBMS traffic if (modeP == PDCP_TM) { @@ -183,7 +189,11 @@ boolean_t pdcp_data_req(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t memset(&pdu_header.mac_i[0],0,PDCP_CONTROL_PLANE_DATA_PDU_MAC_I_SIZE); if (pdcp_serialize_control_plane_data_pdu_with_SRB_sn_buffer((unsigned char*)pdcp_pdu_p->data, &pdu_header) == FALSE) { LOG_E(PDCP, "Cannot fill PDU buffer with relevant header fields!\n"); - return FALSE; + if (enb_flagP == 0) + stop_meas(&eNB_pdcp_stats[enb_mod_idP].data_req); + else + stop_meas(&UE_pdcp_stats[ue_mod_idP].data_req); + return FALSE; } } else { pdcp_user_plane_data_pdu_header_with_long_sn pdu_header; @@ -192,7 +202,11 @@ boolean_t pdcp_data_req(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t current_sn = pdu_header.sn ; if (pdcp_serialize_user_plane_data_pdu_with_long_sn_buffer((unsigned char*)pdcp_pdu_p->data, &pdu_header) == FALSE) { LOG_E(PDCP, "Cannot fill PDU buffer with relevant header fields!\n"); - return FALSE; + if (enb_flagP == 0) + stop_meas(&eNB_pdcp_stats[enb_mod_idP].data_req); + else + stop_meas(&UE_pdcp_stats[ue_mod_idP].data_req); + return FALSE; } } /* @@ -203,6 +217,10 @@ boolean_t pdcp_data_req(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t LOG_E(PDCP, "There must be a problem with PDCP initialization, ignoring this PDU...\n"); free_mem_block(pdcp_pdu_p); + if (enb_flagP == 0) + stop_meas(&eNB_pdcp_stats[enb_mod_idP].data_req); + else + stop_meas(&UE_pdcp_stats[ue_mod_idP].data_req); return FALSE; } @@ -234,6 +252,10 @@ boolean_t pdcp_data_req(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t //util_flush_hex_octets(PDCP, (unsigned char*)pdcp_pdu->data, pdcp_pdu_size); } else { LOG_E(PDCP, "Cannot create a mem_block for a PDU!\n"); + if (enb_flagP == 0) + stop_meas(&eNB_pdcp_stats[enb_mod_idP].data_req); + else + stop_meas(&UE_pdcp_stats[ue_mod_idP].data_req); #if defined(STOP_ON_IP_TRAFFIC_OVERLOAD) AssertFatal(0, "[FRAME %5u][%s][PDCP][MOD %u/%u][RB %u] PDCP_DATA_REQ SDU DROPPED, OUT OF MEMORY \n", frameP, @@ -253,25 +275,32 @@ boolean_t pdcp_data_req(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t switch (rlc_status) { case RLC_OP_STATUS_OK: LOG_D(PDCP, "Data sending request over RLC succeeded!\n"); + ret=TRUE; break; case RLC_OP_STATUS_BAD_PARAMETER: LOG_W(PDCP, "Data sending request over RLC failed with 'Bad Parameter' reason!\n"); - return FALSE; - + ret= FALSE; + break; case RLC_OP_STATUS_INTERNAL_ERROR: LOG_W(PDCP, "Data sending request over RLC failed with 'Internal Error' reason!\n"); - return FALSE; + ret= FALSE; + break; case RLC_OP_STATUS_OUT_OF_RESSOURCES: LOG_W(PDCP, "Data sending request over RLC failed with 'Out of Resources' reason!\n"); - return FALSE; + ret= FALSE; + break; default: LOG_W(PDCP, "RLC returned an unknown status code after PDCP placed the order to send some data (Status Code:%d)\n", rlc_status); - return FALSE; + ret= FALSE; + break; } - + if (enb_flagP == 0) + stop_meas(&eNB_pdcp_stats[enb_mod_idP].data_req); + else + stop_meas(&UE_pdcp_stats[ue_mod_idP].data_req); /* * Control arrives here only if rlc_data_req() returns RLC_OP_STATUS_OK * so we return TRUE afterwards @@ -286,7 +315,7 @@ boolean_t pdcp_data_req(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t Pdcp_stats_tx_bytes[module_id][(rb_id & RAB_OFFSET2 )>> RAB_SHIFT2][(rb_id & RAB_OFFSET)-DTCH] += sdu_buffer_size; } }*/ - return TRUE; + return ret; } @@ -303,6 +332,11 @@ boolean_t pdcp_data_ind(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t pdcp_sn_t sequence_number = 0; u8 payload_offset = 0; + if (enb_flagP) + start_meas(&eNB_pdcp_stats[enb_mod_idP].data_ind); + else + start_meas(&UE_pdcp_stats[ue_mod_idP].data_ind); + AssertFatal (enb_mod_idP >= oai_emulation.info.first_enb_local, "eNB inst is too low (%u/%d)!\n", enb_mod_idP, @@ -335,10 +369,14 @@ boolean_t pdcp_data_ind(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t enb_mod_idP, ue_mod_idP, rb_idP, sdu_buffer_sizeP, enb_flagP, enb_mod_idP); } sdu_list_p = &pdcp_sdu_list; -# + if (sdu_buffer_sizeP == 0) { LOG_W(PDCP, "SDU buffer size is zero! Ignoring this chunk!\n"); + if (enb_flagP) + stop_meas(&eNB_pdcp_stats[enb_mod_idP].data_ind); + else + stop_meas(&UE_pdcp_stats[ue_mod_idP].data_ind); return FALSE; } @@ -357,7 +395,11 @@ boolean_t pdcp_data_ind(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t if (sdu_buffer_sizeP < pdcp_header_len + pdcp_tailer_len ) { LOG_W(PDCP, "Incoming (from RLC) SDU is short of size (size:%d)! Ignoring...\n", sdu_buffer_sizeP); free_mem_block(sdu_buffer_pP); - return FALSE; + if (enb_flagP) + stop_meas(&eNB_pdcp_stats[enb_mod_idP].data_ind); + else + stop_meas(&UE_pdcp_stats[ue_mod_idP].data_ind); + return FALSE; } /* @@ -410,7 +452,11 @@ boolean_t pdcp_data_ind(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t (u8*)&sdu_buffer_pP->data[pdcp_header_len]); free_mem_block(sdu_buffer_pP); // free_mem_block(new_sdu); - return TRUE; + if (enb_flagP) + stop_meas(&eNB_pdcp_stats[enb_mod_idP].data_ind); + else + stop_meas(&UE_pdcp_stats[ue_mod_idP].data_ind); + return TRUE; } payload_offset=PDCP_USER_PLANE_DATA_PDU_LONG_SN_HEADER_SIZE; #if defined(ENABLE_SECURITY) @@ -437,13 +483,21 @@ boolean_t pdcp_data_ind(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t if (otg_rx_pkt(src_id, dst_id,ctime,&sdu_buffer_pP->data[payload_offset], sdu_buffer_sizeP - payload_offset ) == 0 ) { free_mem_block(sdu_buffer_pP); - return TRUE; + if (enb_flagP) + stop_meas(&eNB_pdcp_stats[enb_mod_idP].data_ind); + else + stop_meas(&UE_pdcp_stats[ue_mod_idP].data_ind); + return TRUE; } } #else if (otg_enabled==1) { LOG_D(OTG,"Discarding received packed\n"); free_mem_block(sdu_buffer_pP); + if (enb_flagP) + stop_meas(&eNB_pdcp_stats[enb_mod_idP].data_ind); + else + stop_meas(&UE_pdcp_stats[ue_mod_idP].data_ind); return TRUE; } #endif @@ -516,7 +570,10 @@ boolean_t pdcp_data_ind(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t #endif free_mem_block(sdu_buffer_pP); - + if (enb_flagP) + stop_meas(&eNB_pdcp_stats[enb_mod_idP].data_ind); + else + stop_meas(&UE_pdcp_stats[ue_mod_idP].data_ind); return TRUE; } @@ -529,6 +586,10 @@ void pdcp_run (frame_t frameP, eNB_flag_t enb_flagP, module_id_t ue_mod_idP, mo instance_t instance; int result; #endif + if (enb_flagP) + start_meas(&eNB_pdcp_stats[enb_mod_idP].pdcp_run); + else + start_meas(&UE_pdcp_stats[ue_mod_idP].pdcp_run); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_RUN, VCD_FUNCTION_IN); @@ -602,7 +663,12 @@ void pdcp_run (frame_t frameP, eNB_flag_t enb_flagP, module_id_t ue_mod_idP, mo // PDCP -> NAS/IP traffic: RX pdcp_fifo_flush_sdus(frameP, enb_flagP, enb_mod_idP, ue_mod_idP); - vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_RUN, VCD_FUNCTION_OUT); + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_RUN, VCD_FUNCTION_OUT); + if (enb_flagP) + stop_meas(&eNB_pdcp_stats[enb_mod_idP].pdcp_run); + else + stop_meas(&UE_pdcp_stats[ue_mod_idP].pdcp_run); + } boolean_t rrc_pdcp_config_asn1_req (module_id_t enb_mod_idP, diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h index 4393438cf6b..7e6cb20af7f 100755 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h @@ -102,6 +102,18 @@ public_pdcp(unsigned int Pdcp_stats_rx_bytes[NB_MODULES_MAX][NB_CNX_CH][NB_RAB_M public_pdcp(unsigned int Pdcp_stats_rx_bytes_last[NB_MODULES_MAX][NB_CNX_CH][NB_RAB_MAX]); public_pdcp(unsigned int Pdcp_stats_rx_rate[NB_MODULES_MAX][NB_CNX_CH][NB_RAB_MAX]); +typedef struct pdcp_stats_t { + time_stats_t pdcp_run; + time_stats_t data_req; + time_stats_t data_ind; + time_stats_t encrption; + time_stats_t decrption; + time_stats_t pdcp_ip; + time_stats_t ip_pdcp; + +}pdcp_stats_t; // common to eNB and UE + + typedef struct pdcp_t { boolean_t instanciated_instance; u16 header_compression_profile; @@ -384,6 +396,8 @@ typedef struct pdcp_missing_pdu_info_t { #define PDCP_MAX_SN_12BIT 4095 // 2^12-1 protected_pdcp(signed int pdcp_2_nas_irq;) +public_pdcp(pdcp_stats_t UE_pdcp_stats[NUMBER_OF_UE_MAX];) +public_pdcp(pdcp_stats_t eNB_pdcp_stats[NUMBER_OF_eNB_MAX];) protected_pdcp(pdcp_t pdcp_array_ue[NUMBER_OF_UE_MAX][NB_RB_MAX];) protected_pdcp(pdcp_t pdcp_array_eNB[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][NB_RB_MAX];) #if defined(Rel10) diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c index ffd19b260fd..4686ae59b19 100755 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c @@ -59,7 +59,7 @@ void config_req_rlc_um (frame_t frameP, rlc_p = &rlc_array_ue[ue_module_idP][rb_idP].rlc.um; } LOG_D(RLC, "[FRAME %05d][%s][RRC][MOD %u/%u][][--- CONFIG_REQ timer_reordering=%d sn_field_length=%d is_mXch=%d --->][RLC_UM][MOD %u/%u][RB %u] \n", - frame, + frameP, (eNB_flagP) ? "eNB" : "UE", enb_module_idP, ue_module_idP, @@ -72,9 +72,9 @@ void config_req_rlc_um (frame_t frameP, rlc_um_init(rlc_p); if (rlc_um_fsm_notify_event (rlc_p, RLC_UM_RECEIVE_CRLC_CONFIG_REQ_ENTER_DATA_TRANSFER_READY_STATE_EVENT)) { - rlc_um_set_debug_infos(rlc_p, frame, eNB_flagP, enb_module_idP, ue_module_idP, rb_idP, rb_typeP); + rlc_um_set_debug_infos(rlc_p, frameP, eNB_flagP, enb_module_idP, ue_module_idP, rb_idP, rb_typeP); rlc_um_configure(rlc_p, - frame, + frameP, config_um_pP->timer_reordering, config_um_pP->sn_field_length, config_um_pP->sn_field_length, @@ -120,7 +120,7 @@ void config_req_rlc_um_asn1 (frame_t frameP, //----------------------------------------------------------------------------- LOG_D(RLC, "[FRAME %05d][%s][RRC][MOD %u/%u][][--- CONFIG_REQ timer_reordering=%dms sn_field_length= --->][RLC_UM][MOD %u/%u][RB %u] \n", - frame, + frameP, (eNB_flagP) ? "eNB" : "UE", enb_module_idP, ue_module_idP, @@ -131,7 +131,7 @@ void config_req_rlc_um_asn1 (frame_t frameP, rlc_um_init(rlc_p); if (rlc_um_fsm_notify_event (rlc_p, RLC_UM_RECEIVE_CRLC_CONFIG_REQ_ENTER_DATA_TRANSFER_READY_STATE_EVENT)) { - rlc_um_set_debug_infos(rlc_p, frame, eNB_flagP, enb_module_idP, ue_module_idP, rb_idP, rb_typeP); + rlc_um_set_debug_infos(rlc_p, frameP, eNB_flagP, enb_module_idP, ue_module_idP, rb_idP, rb_typeP); if (ul_rlc_pP != NULL) { switch (ul_rlc_pP->sn_FieldLength) { case SN_FieldLength_size5: @@ -142,7 +142,7 @@ void config_req_rlc_um_asn1 (frame_t frameP, break; default: LOG_E(RLC,"[FRAME %05d][%s][RLC_UM][MOD %u/%u][RB %u][CONFIGURE] INVALID Uplink sn_FieldLength %d, RLC NOT CONFIGURED\n", - frame, + frameP, (rlc_p->is_enb) ? "eNB" : "UE", rlc_p->enb_module_id, rlc_p->ue_module_id, @@ -162,7 +162,7 @@ void config_req_rlc_um_asn1 (frame_t frameP, break; default: LOG_E(RLC,"[FRAME %05d][%s][RLC_UM][MOD %u/%u][RB %u][CONFIGURE] INVALID Downlink sn_FieldLength %d, RLC NOT CONFIGURED\n", - frame, + frameP, (rlc_p->is_enb) ? "eNB" : "UE", rlc_p->enb_module_id, rlc_p->ue_module_id, @@ -174,7 +174,7 @@ void config_req_rlc_um_asn1 (frame_t frameP, t_Reordering = t_Reordering_tab[dl_rlc_pP->t_Reordering]; } else { LOG_E(RLC,"[FRAME %05d][%s][RLC_UM][MOD %u/%u][RB %u][CONFIGURE] INVALID T_Reordering %d, RLC NOT CONFIGURED\n", - frame, + frameP, (rlc_p->is_enb) ? "eNB" : "UE", rlc_p->enb_module_id, rlc_p->ue_module_id, @@ -185,14 +185,14 @@ void config_req_rlc_um_asn1 (frame_t frameP, } if (eNB_flagP > 0) { rlc_um_configure(rlc_p, - frame, + frameP, t_Reordering, ul_sn_FieldLength, dl_sn_FieldLength, mbms_flagP); } else { rlc_um_configure(rlc_p, - frame, + frameP, t_Reordering, dl_sn_FieldLength, ul_sn_FieldLength, @@ -321,7 +321,7 @@ void rlc_um_configure(rlc_um_entity_t *rlc_pP, rlc_pP->rx_header_min_length_in_bytes = 1; } else if (rx_sn_field_lengthP != 0) { LOG_E(RLC, "[FRAME %05d][%s][RLC_UM][MOD %u/%u][RB %u][CONFIGURE] INVALID RX SN LENGTH %d BITS NOT IMPLEMENTED YET, RLC NOT CONFIGURED\n", - frame, + frameP, (rlc_pP->is_enb) ? "eNB" : "UE", rlc_pP->enb_module_id, rlc_pP->ue_module_id, @@ -342,7 +342,7 @@ void rlc_um_configure(rlc_um_entity_t *rlc_pP, rlc_pP->tx_header_min_length_in_bytes = 1; } else if (tx_sn_field_lengthP != 0) { LOG_E(RLC, "[FRAME %05d][%s][RLC_UM][MOD %02d/%02][RB %u][CONFIGURE] INVALID RX SN LENGTH %d BITS NOT IMPLEMENTED YET, RLC NOT CONFIGURED\n", - frame, + frameP, (rlc_pP->is_enb) ? "eNB" : "UE", rlc_pP->enb_module_id, rlc_pP->ue_module_id, @@ -378,7 +378,7 @@ void rlc_um_set_debug_infos(rlc_um_entity_t *rlc_pP, //----------------------------------------------------------------------------- { LOG_D(RLC, "[FRAME %05d][%s][RLC_UM][SET DEBUG INFOS] enb_module_id %u ue_module_id %u rb_id %d rb_type %d\n", - frame, + frameP, (rlc_pP->is_enb) ? "eNB" : "UE", eNB_flagP, enb_module_idP, diff --git a/openair2/LAYER2/RLC/rlc.c b/openair2/LAYER2/RLC/rlc.c index 471710ab08c..8863e5f3647 100644 --- a/openair2/LAYER2/RLC/rlc.c +++ b/openair2/LAYER2/RLC/rlc.c @@ -436,7 +436,7 @@ rlc_op_status_t rlc_data_req (module_id_t enb_mod_idP, if (MBMS_flagP == 0) { LOG_D(RLC, "[FRAME %5u][%s][RLC][INST %u/%u][RB %u] Display of rlc_data_req:\n", - frame, + frameP, (eNB_flagP) ? "eNB" : "UE", enb_mod_idP, ue_mod_idP, @@ -476,7 +476,7 @@ rlc_op_status_t rlc_data_req (module_id_t enb_mod_idP, if (((rlc_am_entity_t*)rlc_p)->is_data_plane) { LOG_D(RLC, "[FRAME %5u][%s][PDCP][INST %u/%u][RB %u][--- RLC_AM_DATA_REQ/%d Bytes --->][RLC_AM][INST %u/%u][RB %u]\n", - frame, + frameP, (eNB_flagP) ? "eNB" : "UE", enb_mod_idP, ue_mod_idP, @@ -487,7 +487,7 @@ rlc_op_status_t rlc_data_req (module_id_t enb_mod_idP, rb_idP); } else { LOG_D(RLC, "[FRAME %5u][%s][RRC][INST %u/%u][][--- RLC_AM_DATA_REQ/%d Bytes --->][RLC_AM][INST %u/%u][RB %u]\n", - frame, + frameP, (eNB_flagP) ? "eNB" : "UE", enb_mod_idP, ue_mod_idP, @@ -498,7 +498,7 @@ rlc_op_status_t rlc_data_req (module_id_t enb_mod_idP, rb_idP); } LOG_D(RLC, "%s\n",RLC_FG_COLOR_DEFAULT); - rlc_am_data_req((rlc_am_entity_t*)rlc_p, frame, new_sdu_p); + rlc_am_data_req((rlc_am_entity_t*)rlc_p, frameP, new_sdu_p); return RLC_OP_STATUS_OK; } else { return RLC_OP_STATUS_INTERNAL_ERROR; @@ -520,7 +520,7 @@ rlc_op_status_t rlc_data_req (module_id_t enb_mod_idP, LOG_D(RLC, "%s\n",RLC_FG_BRIGHT_COLOR_RED); if (((rlc_am_entity_t*)rlc_p)->is_data_plane) { LOG_D(RLC, "[FRAME %5u][%s][PDCP][INST %u/%u][RB %u][--- RLC_UM_DATA_REQ/%d Bytes --->][RLC_UM][INST %u/%u][RB %u]\n", - frame, + frameP, (eNB_flagP) ? "eNB" : "UE", enb_mod_idP, ue_mod_idP, @@ -531,7 +531,7 @@ rlc_op_status_t rlc_data_req (module_id_t enb_mod_idP, rb_idP); } else { LOG_D(RLC, "[FRAME %5u][%s][RRC][INST %u/%u][][--- RLC_UM_DATA_REQ/%d Bytes --->][RLC_UM][INST %u/%u][RB %u]\n", - frame, + frameP, (eNB_flagP) ? "eNB" : "UE", enb_mod_idP, ue_mod_idP, @@ -542,7 +542,7 @@ rlc_op_status_t rlc_data_req (module_id_t enb_mod_idP, rb_idP); } LOG_D(RLC, "%s\n",RLC_FG_COLOR_DEFAULT); - rlc_um_data_req((rlc_um_entity_t*)rlc_p, frame, new_sdu_p); + rlc_um_data_req((rlc_um_entity_t*)rlc_p, frameP, new_sdu_p); //free_mem_block(new_sdu); return RLC_OP_STATUS_OK; @@ -565,7 +565,7 @@ rlc_op_status_t rlc_data_req (module_id_t enb_mod_idP, LOG_D(RLC, "%s\n",RLC_FG_BRIGHT_COLOR_RED); if (((rlc_tm_entity_t*)rlc_p)->is_data_plane) { LOG_D(RLC, "[FRAME %5u][%s][PDCP][INST %u/%u][RB %u][--- RLC_TM_DATA_REQ/%d Bytes --->][RLC_TM][INST %u/%u][RB %u]\n", - frame, + frameP, (eNB_flagP) ? "eNB" : "UE", enb_mod_idP, ue_mod_idP, @@ -576,7 +576,7 @@ rlc_op_status_t rlc_data_req (module_id_t enb_mod_idP, rb_idP); } else { LOG_D(RLC, "[FRAME %5u][%s][RRC][INST %u/%u][][--- RLC_TM_DATA_REQ/%d Bytes --->][RLC_TM][INST %u/%u][RB %u]\n", - frame, + frameP, (eNB_flagP) ? "eNB" : "UE", enb_mod_idP, ue_mod_idP, @@ -626,7 +626,7 @@ rlc_op_status_t rlc_data_req (module_id_t enb_mod_idP, LOG_D(RLC, "%s\n",RLC_FG_BRIGHT_COLOR_RED); if (rlc_um_p->is_data_plane) { LOG_D(RLC, "[FRAME %5u][PDCP][INST %u/%u][RB %u][--- RLC_UM_DATA_REQ/%d Bytes (MBMS) --->][RLC_UM][INST %u/%u][RB %u]\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP, @@ -639,7 +639,7 @@ rlc_op_status_t rlc_data_req (module_id_t enb_mod_idP, } else { if (eNB_flagP) { LOG_D(RLC, "[FRAME %5u][RRC_eNB][INST %u/%u][][--- RLC_UM_DATA_REQ/%d Bytes (MBMS) --->][RLC_UM][INST %u/%u][RB %u]\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP, @@ -650,7 +650,7 @@ rlc_op_status_t rlc_data_req (module_id_t enb_mod_idP, mbms_rb_id); } else { LOG_D(RLC, "[FRAME %5u][RRC_UE][INST %u/%u][][--- RLC_UM_DATA_REQ/%d Bytes (MBMS) --->][RLC_UM][INST %u/%u][RB %u]\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP, @@ -701,7 +701,7 @@ void rlc_data_ind (module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t } LOG_D(RLC, "[FRAME %5u][%s][RLC][INST %u/%u][RB %u] Display of rlc_data_ind: size %u\n", - frame, + frameP, (eNB_flagP) ? "eNB" : "UE", enb_mod_idP, ue_mod_idP, @@ -718,7 +718,7 @@ void rlc_data_ind (module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t break; case RLC_MODE_AM: LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][INST %u/%u][RB %u][--- RLC_DATA_IND/%d Bytes --->][PDCP][INST %u/%u][RB %u]\n", - frame, + frameP, (eNB_flagP) ? "eNB" : "UE", enb_mod_idP, ue_mod_idP, @@ -730,7 +730,7 @@ void rlc_data_ind (module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t break; case RLC_MODE_UM: LOG_D(RLC, "[FRAME %5u][%s][RLC_UM][INST %u/%u][RB %u][--- RLC_DATA_IND/%d Bytes --->][PDCP][INST %u/%u][RB %u]\n", - frame, + frameP, (eNB_flagP) ? "eNB" : "UE", enb_mod_idP, ue_mod_idP, @@ -742,7 +742,7 @@ void rlc_data_ind (module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t break; case RLC_MODE_TM: LOG_D(RLC, "[FRAME %5u][%s][RLC_TM][INST %u/%u][RB %u][--- RLC_DATA_IND/%d Bytes --->][PDCP][INST %u/%u][RB %u]\n", - frame, + frameP, (eNB_flagP) ? "eNB" : "UE", enb_mod_idP, ue_mod_idP, @@ -753,7 +753,7 @@ void rlc_data_ind (module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t rb_idP); break; } - pdcp_data_ind (enb_mod_idP, ue_mod_idP, frame, eNB_flagP, MBMS_flagP, rb_idP % NB_RB_MAX, sdu_sizeP, sdu_pP, is_data_planeP); + pdcp_data_ind (enb_mod_idP, ue_mod_idP, frameP, eNB_flagP, MBMS_flagP, rb_idP % NB_RB_MAX, sdu_sizeP, sdu_pP, is_data_planeP); } //----------------------------------------------------------------------------- void rlc_data_conf (module_id_t enb_mod_idP, @@ -780,7 +780,7 @@ void rlc_data_conf (module_id_t enb_mod_idP, break; case RLC_MODE_AM: LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][INST %u/%u][RB %u][--- RLC_DATA_CONF /MUI %d --->][RRC][INST %u/%u][][RLC_DATA_CONF/ MUI %d]\n", - frame, + frameP, (eNB_flagP) ? "eNB" : "UE", enb_mod_idP, ue_mod_idP, @@ -791,7 +791,7 @@ void rlc_data_conf (module_id_t enb_mod_idP, break; case RLC_MODE_UM: LOG_D(RLC, "[FRAME %5u][%s][RLC_UM][INST %u/%u][RB %u][--- RLC_DATA_CONF /MUI %d --->][RRC][INST %u/%u][][RLC_DATA_CONF/ MUI %d]\n", - frame, + frameP, (eNB_flagP) ? "eNB" : "UE", enb_mod_idP, ue_mod_idP, @@ -802,7 +802,7 @@ void rlc_data_conf (module_id_t enb_mod_idP, break; case RLC_MODE_TM: LOG_D(RLC, "[FRAME %5u][%s][RLC_TM][INST %u/%u][RB %u][--- RLC_DATA_CONF /MUI %d --->][RRC][INST %u/%u][][RLC_DATA_CONF/ MUI %d]\n", - frame, + frameP, (eNB_flagP) ? "eNB" : "UE", enb_mod_idP, ue_mod_idP, diff --git a/openair2/LAYER2/RLC/rlc_rrc.c b/openair2/LAYER2/RLC/rlc_rrc.c index 49b98c136ec..3922869c474 100644 --- a/openair2/LAYER2/RLC/rlc_rrc.c +++ b/openair2/LAYER2/RLC/rlc_rrc.c @@ -468,7 +468,7 @@ rlc_op_status_t rb_release_rlc_am (rlc_am_entity_t *rlcP, frame_t frameP, module_id_t enb_mod_idP, module_id_t ue_mod_idP) { //----------------------------------------------------------------------------- - rlc_am_cleanup(rlcP,frame); + rlc_am_cleanup(rlcP,frameP); return RLC_OP_STATUS_OK; } //----------------------------------------------------------------------------- @@ -504,20 +504,20 @@ rlc_op_status_t rrc_rlc_remove_rlc (module_id_t enb_mod_idP, module_id_t ue_mo switch (rlc_mode) { case RLC_MODE_AM: LOG_D(RLC, "[Frame %05u][eNB][RLC_RRC][INST %u/%u][RB %u] RELEASE RB AM\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP); lcid = rlc_array_eNB[enb_mod_idP][ue_mod_idP][rb_idP].rlc.am.channel_id; AssertFatal (lcid2rbid_eNB[enb_mod_idP][ue_mod_idP][lcid] == rb_idP, "Mismatch in RLC AM LC %u/RB %u mapping for RB %u\n", lcid, lcid2rbid_eNB[enb_mod_idP][ue_mod_idP][lcid], rb_idP); lcid2rbid_eNB[enb_mod_idP][ue_mod_idP][lcid] = RLC_RB_UNALLOCATED; - status = rb_release_rlc_am(&rlc_array_eNB[enb_mod_idP][ue_mod_idP][rb_idP].rlc.am, frame, enb_mod_idP, ue_mod_idP); + status = rb_release_rlc_am(&rlc_array_eNB[enb_mod_idP][ue_mod_idP][rb_idP].rlc.am, frameP, enb_mod_idP, ue_mod_idP); rlc_array_eNB[enb_mod_idP][ue_mod_idP][rb_idP].rlc.am.allocation = 0; rlc_array_eNB[enb_mod_idP][ue_mod_idP][rb_idP].mode = RLC_MODE_NONE; break; case RLC_MODE_TM: LOG_D(RLC, "[Frame %05u][eNB][RLC_RRC][INST %u/%u][RB %u] RELEASE RB TM\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP); @@ -530,7 +530,7 @@ rlc_op_status_t rrc_rlc_remove_rlc (module_id_t enb_mod_idP, module_id_t ue_mo break; case RLC_MODE_UM: LOG_D(RLC, "[Frame %05u][eNB][RLC_RRC][INST %u/%u][RB %u] RELEASE RB UM\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP); @@ -543,7 +543,7 @@ rlc_op_status_t rrc_rlc_remove_rlc (module_id_t enb_mod_idP, module_id_t ue_mo break; default: LOG_E(RLC, "[Frame %05u][eNB][RLC_RRC][INST %u/%u][RB %u] RELEASE RB mode %d\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP, @@ -556,20 +556,20 @@ rlc_op_status_t rrc_rlc_remove_rlc (module_id_t enb_mod_idP, module_id_t ue_mo switch (rlc_mode) { case RLC_MODE_AM: LOG_D(RLC, "[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u] RELEASE RB AM\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP); lcid = rlc_array_ue[ue_mod_idP][rb_idP].rlc.am.channel_id; AssertFatal (lcid2rbid_ue[ue_mod_idP][lcid] == rb_idP, "Mismatch in RLC AM LC %u/RB %u mapping for RB %u\n", lcid, lcid2rbid_ue[ue_mod_idP][lcid], rb_idP); lcid2rbid_ue[ue_mod_idP][lcid] = RLC_RB_UNALLOCATED; - status = rb_release_rlc_am(&rlc_array_ue[ue_mod_idP][rb_idP].rlc.am, frame, enb_mod_idP, ue_mod_idP); + status = rb_release_rlc_am(&rlc_array_ue[ue_mod_idP][rb_idP].rlc.am, frameP, enb_mod_idP, ue_mod_idP); rlc_array_ue[ue_mod_idP][rb_idP].rlc.am.allocation = 0; rlc_array_ue[ue_mod_idP][rb_idP].mode = RLC_MODE_NONE; break; case RLC_MODE_TM: LOG_D(RLC, "[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u] RELEASE RB TM\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP); @@ -582,7 +582,7 @@ rlc_op_status_t rrc_rlc_remove_rlc (module_id_t enb_mod_idP, module_id_t ue_mo break; case RLC_MODE_UM: LOG_D(RLC, "[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u] RELEASE RB UM\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP); @@ -595,7 +595,7 @@ rlc_op_status_t rrc_rlc_remove_rlc (module_id_t enb_mod_idP, module_id_t ue_mo break; default: LOG_E(RLC, "[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u] RELEASE RB mode %d\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP, @@ -637,7 +637,7 @@ rlc_op_status_t rrc_rlc_add_rlc (module_id_t enb_mod_idP, module_id_t ue_mod_i rlc_mode = rlc_array_eNB[enb_mod_idP][ue_mod_idP][rb_idP].mode; if (rlc_mode != RLC_MODE_NONE) { LOG_E(RLC, "[Frame %05u][eNB][RLC_RRC][INST %u/%u][RB %u][LCH Id %d] ADD RB RB IS ALREADY ALLOCATED\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP, @@ -653,14 +653,14 @@ rlc_op_status_t rrc_rlc_add_rlc (module_id_t enb_mod_idP, module_id_t ue_mod_i rlc_array_eNB[enb_mod_idP][ue_mod_idP][rb_idP].rlc.am.allocation = 1; rlc_array_eNB[enb_mod_idP][ue_mod_idP][rb_idP].mode = RLC_MODE_AM; LOG_I(RLC, "[Frame %05u][eNB][RLC_RRC][INST %u/%u][RB %u][LCH Id %d] ADD RB AM\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP, chan_idP); } else { LOG_D(RLC,"[Frame %05u][eNB][RLC_RRC][INST %u/%u][RB %u][LCH Id %d] ADD RB AM IS ALREADY ALLOCATED\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP, @@ -674,14 +674,14 @@ rlc_op_status_t rrc_rlc_add_rlc (module_id_t enb_mod_idP, module_id_t ue_mod_i rlc_array_eNB[enb_mod_idP][ue_mod_idP][rb_idP].rlc.tm.allocation = 1; rlc_array_eNB[enb_mod_idP][ue_mod_idP][rb_idP].mode = RLC_MODE_TM; LOG_I(RLC, "[Frame %05u][eNB][RLC_RRC][INST %u/%u][RB %u][LCH Id %d] ADD RB TM\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP, chan_idP); } else { LOG_D(RLC,"[Frame %05u][eNB][RLC_RRC][INST %u/%u][RB %u][LCH Id %d] ADD RB TM IS ALREADY ALLOCATED\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP, @@ -695,14 +695,14 @@ rlc_op_status_t rrc_rlc_add_rlc (module_id_t enb_mod_idP, module_id_t ue_mod_i rlc_array_eNB[enb_mod_idP][ue_mod_idP][rb_idP].rlc.um.allocation = 1; rlc_array_eNB[enb_mod_idP][ue_mod_idP][rb_idP].mode = RLC_MODE_UM; LOG_I(RLC, "[Frame %05u][eNB][RLC_RRC][INST %u/%u][RB %u][LCH Id %d] ADD RB UM\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP, chan_idP); } else { LOG_D(RLC,"[Frame %05u][eNB][RLC_RRC][INST %u/%u][RB %u][LCH Id %d] ADD RB UM IS ALREADY ALLOCATED\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP, @@ -712,7 +712,7 @@ rlc_op_status_t rrc_rlc_add_rlc (module_id_t enb_mod_idP, module_id_t ue_mod_i break; default: LOG_E(RLC, "[Frame %05u][eNB][RLC_RRC][INST %u/%u][RB %u] %s BAD PARAMETER RLC MODE %d\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP, @@ -724,7 +724,7 @@ rlc_op_status_t rrc_rlc_add_rlc (module_id_t enb_mod_idP, module_id_t ue_mod_i rlc_mode = rlc_array_ue[ue_mod_idP][rb_idP].mode; if (rlc_mode != RLC_MODE_NONE) { LOG_E(RLC, "[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u][LCH Id %d] ADD RB RB IS ALREADY ALLOCATED\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP, @@ -740,14 +740,14 @@ rlc_op_status_t rrc_rlc_add_rlc (module_id_t enb_mod_idP, module_id_t ue_mod_i rlc_array_ue[ue_mod_idP][rb_idP].rlc.am.allocation = 1; rlc_array_ue[ue_mod_idP][rb_idP].mode = RLC_MODE_AM; LOG_I(RLC, "[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u][LCH Id %d] ADD RB AM\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP, chan_idP); } else { LOG_D(RLC,"[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u][LCH Id %d] ADD RB AM IS ALREADY ALLOCATED\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP, @@ -761,14 +761,14 @@ rlc_op_status_t rrc_rlc_add_rlc (module_id_t enb_mod_idP, module_id_t ue_mod_i rlc_array_ue[ue_mod_idP][rb_idP].rlc.tm.allocation = 1; rlc_array_ue[ue_mod_idP][rb_idP].mode = RLC_MODE_TM; LOG_I(RLC, "[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u][LCH Id %d] ADD RB TM\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP, chan_idP); } else { LOG_D(RLC,"[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u][LCH Id %d] ADD RB TM IS ALREADY ALLOCATED\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP, @@ -782,14 +782,14 @@ rlc_op_status_t rrc_rlc_add_rlc (module_id_t enb_mod_idP, module_id_t ue_mod_i rlc_array_ue[ue_mod_idP][rb_idP].rlc.um.allocation = 1; rlc_array_ue[ue_mod_idP][rb_idP].mode = RLC_MODE_UM; LOG_I(RLC, "[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u][LCH Id %d] ADD RB UM\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP, chan_idP); } else { LOG_D(RLC,"[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u][LCH Id %d] ADD RB UM IS ALREADY ALLOCATED\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP, @@ -799,7 +799,7 @@ rlc_op_status_t rrc_rlc_add_rlc (module_id_t enb_mod_idP, module_id_t ue_mod_i break; default: LOG_E(RLC, "[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u] %s BAD PARAMETER RLC MODE %d\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP, @@ -816,7 +816,7 @@ rlc_op_status_t rrc_rlc_config_req (module_id_t enb_mod_idP, module_id_t ue_mo rlc_op_status_t status; LOG_D(RLC, "[FRAME %05u][%s][RLC][MOD %u/%u] CONFIG_REQ for Rab %u\n", - frame, + frameP, (enb_flagP) ? "eNB" : "UE", enb_mod_idP, ue_mod_idP, @@ -846,20 +846,20 @@ rlc_op_status_t rrc_rlc_config_req (module_id_t enb_mod_idP, module_id_t ue_mo switch (actionP) { case ACTION_ADD: - if ((status = rrc_rlc_add_rlc(enb_mod_idP, ue_mod_idP, frame, enb_flagP, rb_idP, rb_idP, rlc_infoP.rlc_mode)) != RLC_OP_STATUS_OK) { + if ((status = rrc_rlc_add_rlc(enb_mod_idP, ue_mod_idP, frameP, enb_flagP, rb_idP, rb_idP, rlc_infoP.rlc_mode)) != RLC_OP_STATUS_OK) { return status; } case ACTION_MODIFY: switch (rlc_infoP.rlc_mode) { case RLC_MODE_AM: LOG_I(RLC, "[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u] MODIFY RB AM\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP); config_req_rlc_am( - frame, + frameP, enb_flagP, enb_mod_idP, ue_mod_idP, @@ -869,12 +869,12 @@ rlc_op_status_t rrc_rlc_config_req (module_id_t enb_mod_idP, module_id_t ue_mo break; case RLC_MODE_UM: LOG_I(RLC, "[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u] MODIFY RB UM\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP); config_req_rlc_um( - frame, + frameP, enb_flagP, enb_mod_idP, ue_mod_idP, @@ -884,12 +884,12 @@ rlc_op_status_t rrc_rlc_config_req (module_id_t enb_mod_idP, module_id_t ue_mo break; case RLC_MODE_TM: LOG_I(RLC, "[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u] MODIFY RB TM\n", - frame, + frameP, enb_mod_idP, ue_mod_idP, rb_idP); config_req_rlc_tm( - frame, + frameP, enb_flagP, enb_mod_idP, ue_mod_idP, @@ -903,7 +903,7 @@ rlc_op_status_t rrc_rlc_config_req (module_id_t enb_mod_idP, module_id_t ue_mo break; case ACTION_REMOVE: - return rrc_rlc_remove_rlc(enb_mod_idP, ue_mod_idP, rb_idP, frame, enb_flagP); + return rrc_rlc_remove_rlc(enb_mod_idP, ue_mod_idP, rb_idP, frameP, enb_flagP); break; default: return RLC_OP_STATUS_BAD_PARAMETER; @@ -919,7 +919,7 @@ rlc_op_status_t rrc_rlc_data_req (module_id_t enb_mod_idP, module_id_t ue_mo sdu = get_free_mem_block(sdu_sizeP); if (sdu != NULL) { memcpy (sdu->data, sduP, sdu_sizeP); - return rlc_data_req(enb_mod_idP, ue_mod_idP, frame, enb_flagP, MBMS_flagP, rb_idP, muiP, confirmP, sdu_sizeP, sdu); + return rlc_data_req(enb_mod_idP, ue_mod_idP, frameP, enb_flagP, MBMS_flagP, rb_idP, muiP, confirmP, sdu_sizeP, sdu); } else { return RLC_OP_STATUS_INTERNAL_ERROR; } diff --git a/openair2/RRC/LITE/rrc_common.c b/openair2/RRC/LITE/rrc_common.c index 310cbf90d66..2c7a82ff2a6 100644 --- a/openair2/RRC/LITE/rrc_common.c +++ b/openair2/RRC/LITE/rrc_common.c @@ -304,9 +304,9 @@ void rrc_t310_expiration(frame_t frameP, u8 Mod_id, u8 eNB_index) { if (UE_rrc_inst[Mod_id].Srb2[eNB_index].Active == 1) { msg ("[RRC Inst %d] eNB_index %d, Remove RB %d\n ", Mod_id, eNB_index, UE_rrc_inst[Mod_id].Srb2[eNB_index].Srb_info.Srb_id); - rrc_pdcp_config_req (eNB_index, Mod_id, frame, 0, ACTION_REMOVE, + rrc_pdcp_config_req (eNB_index, Mod_id, frameP, 0, ACTION_REMOVE, UE_rrc_inst[Mod_id].Srb2[eNB_index].Srb_info.Srb_id, 0); - rrc_rlc_config_req (eNB_index, Mod_id, frame, 0, ACTION_REMOVE, + rrc_rlc_config_req (eNB_index, Mod_id, frameP, 0, ACTION_REMOVE, UE_rrc_inst[Mod_id].Srb2[eNB_index].Srb_info.Srb_id, SIGNALLING_RADIO_BEARER, Rlc_info_um); UE_rrc_inst[Mod_id].Srb2[eNB_index].Active = 0; UE_rrc_inst[Mod_id].Srb2[eNB_index].Status = IDLE; @@ -326,13 +326,13 @@ RRC_status_t rrc_rx_tx(u8 Mod_id,frame_t frameP, eNB_flag_t eNB_flagP,u8 index){ if (UE_rrc_inst[Mod_id].Info[index].T300_active == 1) { if ((UE_rrc_inst[Mod_id].Info[index].T300_cnt % 10) == 0) LOG_D(RRC, - "[UE %d][RAPROC] Frame %d T300 Count %d ms\n", Mod_id, frame, UE_rrc_inst[Mod_id].Info[index].T300_cnt); + "[UE %d][RAPROC] Frame %d T300 Count %d ms\n", Mod_id, frameP, UE_rrc_inst[Mod_id].Info[index].T300_cnt); if (UE_rrc_inst[Mod_id].Info[index].T300_cnt == T300[UE_rrc_inst[Mod_id].sib2[index]->ue_TimersAndConstants.t300]) { UE_rrc_inst[Mod_id].Info[index].T300_active = 0; // ALLOW CCCH to be used UE_rrc_inst[Mod_id].Srb0[index].Tx_buffer.payload_size = 0; - rrc_ue_generate_RRCConnectionRequest (Mod_id, frame, index); + rrc_ue_generate_RRCConnectionRequest (Mod_id, frameP, index); return (RRC_ConnSetup_failed); } UE_rrc_inst[Mod_id].Info[index].T300_cnt++; @@ -356,11 +356,11 @@ RRC_status_t rrc_rx_tx(u8 Mod_id,frame_t frameP, eNB_flag_t eNB_flagP,u8 index){ UE_rrc_inst[Mod_id].Info[index].N311_cnt = 0; } if ((UE_rrc_inst[Mod_id].Info[index].T310_cnt % 10) == 0) - LOG_D(RRC, "[UE %d] Frame %d T310 Count %d ms\n", Mod_id, frame, UE_rrc_inst[Mod_id].Info[index].T310_cnt); + LOG_D(RRC, "[UE %d] Frame %d T310 Count %d ms\n", Mod_id, frameP, UE_rrc_inst[Mod_id].Info[index].T310_cnt); if (UE_rrc_inst[Mod_id].Info[index].T310_cnt == T310[UE_rrc_inst[Mod_id].sib2[index]->ue_TimersAndConstants.t310]) { UE_rrc_inst[Mod_id].Info[index].T310_active = 0; - rrc_t310_expiration (frame, Mod_id, index); + rrc_t310_expiration (frameP, Mod_id, index); return (RRC_PHY_RESYNCH); } UE_rrc_inst[Mod_id].Info[index].T310_cnt++; @@ -369,7 +369,7 @@ RRC_status_t rrc_rx_tx(u8 Mod_id,frame_t frameP, eNB_flag_t eNB_flagP,u8 index){ if (UE_rrc_inst[Mod_id].Info[index].T304_active==1) { if ((UE_rrc_inst[Mod_id].Info[index].T304_cnt % 10) == 0) - LOG_D(RRC,"[UE %d][RAPROC] Frame %d T304 Count %d ms\n",Mod_id,frame, + LOG_D(RRC,"[UE %d][RAPROC] Frame %d T304 Count %d ms\n",Mod_id,frameP, UE_rrc_inst[Mod_id].Info[index].T304_cnt); if (UE_rrc_inst[Mod_id].Info[index].T304_cnt == 0) { UE_rrc_inst[Mod_id].Info[index].T304_active = 0; @@ -382,11 +382,11 @@ RRC_status_t rrc_rx_tx(u8 Mod_id,frame_t frameP, eNB_flag_t eNB_flagP,u8 index){ } // Layer 3 filtering of RRC measurements if (UE_rrc_inst[Mod_id].QuantityConfig[0] != NULL) { - ue_meas_filtering(Mod_id,frame,index); + ue_meas_filtering(Mod_id,frameP,index); } - ue_measurement_report_triggering(Mod_id,frame,index); + ue_measurement_report_triggering(Mod_id,frameP,index); if (UE_rrc_inst[Mod_id].Info[0].handoverTarget > 0) - LOG_I(RRC,"[UE %d] Frame %d : RRC handover initiated\n", Mod_id, frame); + LOG_I(RRC,"[UE %d] Frame %d : RRC handover initiated\n", Mod_id, frameP); if((UE_rrc_inst[Mod_id].Info[index].State == RRC_HO_EXECUTION) && (UE_rrc_inst[Mod_id].HandoverInfoUe.targetCellId != 0xFF)) { UE_rrc_inst[Mod_id].Info[index].State= RRC_IDLE; @@ -395,7 +395,7 @@ RRC_status_t rrc_rx_tx(u8 Mod_id,frame_t frameP, eNB_flag_t eNB_flagP,u8 index){ } else { - check_handovers(Mod_id,frame); + check_handovers(Mod_id,frameP); } return (RRC_OK); diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.h b/openair2/UTIL/LOG/vcd_signal_dumper.h index ee19868b980..1979984d7b2 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.h +++ b/openair2/UTIL/LOG/vcd_signal_dumper.h @@ -88,6 +88,7 @@ typedef enum VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PROCESS_RAR, VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GET_SR, + VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_MCH_SDU, VCD_SIGNAL_DUMPER_FUNCTIONS_UE_MEASUREMENT_PROCEDURES, VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PBCH_PROCEDURES, diff --git a/openair2/UTIL/OCG/OCG.h b/openair2/UTIL/OCG/OCG.h index 8550f27f9ca..e32fd1a1deb 100644 --- a/openair2/UTIL/OCG/OCG.h +++ b/openair2/UTIL/OCG/OCG.h @@ -657,12 +657,13 @@ The following diagram is based on graphviz (http://www.graphviz.org/), you need unsigned char multicast_group; char *multicast_ifname; // status - unsigned char ocg_enabled; - unsigned char ocm_enabled; - unsigned char opt_enabled; - unsigned char opt_mode; - unsigned char otg_enabled; - unsigned char omv_enabled; + unsigned char ocg_enabled; // openair config generator + unsigned char ocm_enabled; // openair channel modeling + unsigned char opt_enabled;//openair packet tracer + unsigned char opt_mode; // openair packet tracer mode: wireshark, pcap + unsigned char otg_enabled; // openair traffic generator + unsigned char omv_enabled; // openair mobility visulizer + unsigned char opp_enabled; // openair performance profiler char *itti_dump_file; unsigned char vcd_enabled; char *vcd_file; diff --git a/targets/RTAI/USER/lte-softmodem.c b/targets/RTAI/USER/lte-softmodem.c index f2693bbb223..81c44bada97 100644 --- a/targets/RTAI/USER/lte-softmodem.c +++ b/targets/RTAI/USER/lte-softmodem.c @@ -1118,7 +1118,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:dF:K:O:ST:UV",long_options,NULL)) != -1) + while ((c = getopt_long (argc, argv, "C:dF:K:qO:ST:UV",long_options,NULL)) != -1) { switch (c) { @@ -1254,7 +1254,10 @@ static void get_options (int argc, char **argv) case 'V': ouput_vcd = 1; break; - + /* case 'q': + opp_enabled = 1; + break; + */ default: break; } diff --git a/targets/SIMU/USER/Makefile b/targets/SIMU/USER/Makefile index aefc4350682..27aaa933e59 100644 --- a/targets/SIMU/USER/Makefile +++ b/targets/SIMU/USER/Makefile @@ -17,7 +17,13 @@ CPUFLAGS += $(shell if grep --silent ssse3 /proc/cpuinfo ; then echo "-mssse3" ; CPUFLAGS += $(shell if grep --silent -w sse4 /proc/cpuinfo ; then echo "-msse4" ; else echo ""; fi) linux = $(shell if [ `uname` = "Linux" ] ; then echo "1" ; else echo "0" ; fi) -CFLAGS += -g -ggdb -Wstrict-prototypes -Wpointer-sign +ifdef DEBUG +CFLAGS += -g -ggdb -DDEBUG_PHY +else +CFLAGE += -O2 +endif + +CFLAGS += -Wstrict-prototypes -Wpointer-sign CFLAGS += -DUSER_MODE -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 $(CPUFLAGS) -I/usr/include/X11 #-Wno-packed-bitfield-compat # Check if GCC version is greater or equal to 4.4 @@ -94,10 +100,6 @@ else endif endif -ifdef DEBUG_PHY -CFLAGS += -DDEBUG_PHY -endif - ifdef JF CFLAGS += -DJUMBO_FRAME endif diff --git a/targets/SIMU/USER/channel_sim.c b/targets/SIMU/USER/channel_sim.c index bfc889e404a..e64f432533e 100644 --- a/targets/SIMU/USER/channel_sim.c +++ b/targets/SIMU/USER/channel_sim.c @@ -140,9 +140,10 @@ void do_DL_sig(double **r_re0,double **r_im0, if (abstraction_flag != 0) { //for (UE_id=0;UE_id<NB_UE_INST;UE_id++) { + if (!hold_channel) { // calculate the random channel from each eNB for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++) { - random_channel(eNB2UE[eNB_id][UE_id]); + random_channel(eNB2UE[eNB_id][UE_id],abstraction_flag); /* for (i=0;i<eNB2UE[eNB_id][UE_id]->nb_taps;i++) printf("eNB2UE[%d][%d]->a[0][%d] = (%f,%f)\n",eNB_id,UE_id,i,eNB2UE[eNB_id][UE_id]->a[0][i].x,eNB2UE[eNB_id][UE_id]->a[0][i].y); @@ -175,13 +176,14 @@ void do_DL_sig(double **r_re0,double **r_im0, return; //exit(-1); } +#ifdef DEBUG_SIM rx_pwr = signal_energy_fp2(eNB2UE[att_eNB_id][UE_id]->ch[0], eNB2UE[att_eNB_id][UE_id]->channel_length)*eNB2UE[att_eNB_id][UE_id]->channel_length; LOG_D(OCM,"Channel eNB %d => UE %d : tx_power %d dBm, path_loss %f dB\n", att_eNB_id,UE_id, PHY_vars_eNB_g[att_eNB_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower, eNB2UE[att_eNB_id][UE_id]->path_loss_dB); - +#endif //dlsch_abstraction(PHY_vars_UE_g[UE_id]->sinr_dB, rb_alloc, 8); // fill in perfect channel estimates @@ -189,7 +191,8 @@ void do_DL_sig(double **r_re0,double **r_im0, s32 **dl_channel_est = PHY_vars_UE_g[UE_id]->lte_ue_common_vars.dl_ch_estimates[0]; // double scale = pow(10.0,(enb_data[att_eNB_id]->tx_power_dBm + eNB2UE[att_eNB_id][UE_id]->path_loss_dB + (double) PHY_vars_UE_g[UE_id]->rx_total_gain_dB)/20.0); double scale = pow(10.0,(PHY_vars_eNB_g[att_eNB_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower+eNB2UE[att_eNB_id][UE_id]->path_loss_dB + (double) PHY_vars_UE_g[UE_id]->rx_total_gain_dB)/20.0); - scale = scale * sqrt(512.0/300.0); //TODO: make this variable for all BWs + //this factor is not really needed (it was actually wrong in the non abstraction mode) + //scale = scale * sqrt(512.0/300.0); //TODO: make this variable for all BWs LOG_D(OCM,"scale =%lf (%d dB)\n",scale,(int) (20*log10(scale))); // freq_channel(desc1,frame_parms->N_RB_DL,nb_samples); //write_output("channel.m","ch",desc1->ch[0],desc1->channel_length,1,8); @@ -211,19 +214,21 @@ void do_DL_sig(double **r_re0,double **r_im0, } } + /* if(PHY_vars_UE_g[UE_id]->transmission_mode[att_eNB_id]>=5) { - /* lte_ue_measurements(PHY_vars_UE_g[UE_id], + lte_ue_measurements(PHY_vars_UE_g[UE_id], ((next_slot-1)>>1)*frame_parms->samples_per_tti, 1, abstraction_flag); - */ + PHY_vars_eNB_g[att_eNB_id]->dlsch_eNB[0][0]->pmi_alloc = quantize_subband_pmi(&PHY_vars_UE_g[UE_id]->PHY_measurements,0); // printf("pmi_alloc in channel sim: %d",PHY_vars_eNB_g[att_eNB_id]->dlsch_eNB[0][0]->pmi_alloc); - } - - // calculate the SNR for the attached eNB - init_snr(eNB2UE[att_eNB_id][UE_id], enb_data[att_eNB_id], ue_data[UE_id], PHY_vars_UE_g[UE_id]->sinr_dB, &PHY_vars_UE_g[UE_id]->N0, PHY_vars_UE_g[UE_id]->transmission_mode[att_eNB_id], PHY_vars_eNB_g[att_eNB_id]->dlsch_eNB[UE_id][0]->pmi_alloc,PHY_vars_eNB_g[att_eNB_id]->mu_mimo_mode[UE_id].dl_pow_off); + } + */ + + // calculate the SNR for the attached eNB (this assumes eNB always uses PMI stored in eNB_UE_stats; to be improved) + init_snr(eNB2UE[att_eNB_id][UE_id], enb_data[att_eNB_id], ue_data[UE_id], PHY_vars_UE_g[UE_id]->sinr_dB, &PHY_vars_UE_g[UE_id]->N0, PHY_vars_UE_g[UE_id]->transmission_mode[att_eNB_id], PHY_vars_eNB_g[att_eNB_id]->eNB_UE_stats[UE_id].DL_pmi_single,PHY_vars_eNB_g[att_eNB_id]->mu_mimo_mode[UE_id].dl_pow_off); // calculate sinr here for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) { @@ -231,9 +236,7 @@ void do_DL_sig(double **r_re0,double **r_im0, calculate_sinr(eNB2UE[eNB_id][UE_id], enb_data[eNB_id], ue_data[UE_id], PHY_vars_UE_g[UE_id]->sinr_dB); } } - - - //} //UE_id + } // hold channel } else { //abstraction_flag @@ -241,11 +244,13 @@ void do_DL_sig(double **r_re0,double **r_im0, Call do_OFDM_mod from phy_procedures_eNB_TX function */ - for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++) { + for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++) { + start_meas(&PHY_vars_eNB_g[eNB_id]->ofdm_mod_stats); do_OFDM_mod(PHY_vars_eNB_g[eNB_id]->lte_eNB_common_vars.txdataF[0], PHY_vars_eNB_g[eNB_id]->lte_eNB_common_vars.txdata[0], ((next_slot==19) ? -1 : 0 ) + PHY_vars_eNB_g[eNB_id]->frame,next_slot, &PHY_vars_eNB_g[eNB_id]->lte_frame_parms); + stop_meas(&PHY_vars_eNB_g[eNB_id]->ofdm_mod_stats); } //for (UE_id=0;UE_id<NB_UE_INST;UE_id++) { @@ -288,7 +293,7 @@ void do_DL_sig(double **r_re0,double **r_im0, PHY_vars_eNB_g[eNB_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower); #ifdef DEBUG_SIM - LOG_D(OCM,"eNB %d: tx_pwr %f dBm, for slot %d (subframe %d)\n", + LOG_D(OCM,"[SIM][DL] eNB %d: tx_pwr %f dBm, for slot %d (subframe %d)\n", eNB_id, 10*log10(tx_pwr), next_slot, @@ -300,13 +305,13 @@ void do_DL_sig(double **r_re0,double **r_im0, #ifdef DEBUG_SIM rx_pwr = signal_energy_fp2(eNB2UE[eNB_id][UE_id]->ch[0], eNB2UE[eNB_id][UE_id]->channel_length)*eNB2UE[eNB_id][UE_id]->channel_length; - LOG_D(OCM,"Channel eNB %d => UE %d : Channel gain %f dB (%f)\n",eNB_id,UE_id,10*log10(rx_pwr),rx_pwr); + LOG_D(OCM,"[SIM][DL] Channel eNB %d => UE %d : Channel gain %f dB (%f)\n",eNB_id,UE_id,10*log10(rx_pwr),rx_pwr); #endif #ifdef DEBUG_SIM for (i=0;i<eNB2UE[eNB_id][UE_id]->channel_length;i++) - printf("ch(%d,%d)[%d] : (%f,%f)\n",eNB_id,UE_id,i,eNB2UE[eNB_id][UE_id]->ch[0][i]); + printf("ch(%d,%d)[%d] : (%f,%f)\n",eNB_id,UE_id,i,eNB2UE[eNB_id][UE_id]->ch[0][i].x,eNB2UE[eNB_id][UE_id]->ch[0][i].y); #endif LOG_D(OCM,"[SIM][DL] Channel eNB %d => UE %d : tx_power %f dBm, path_loss %f dB\n", @@ -316,8 +321,8 @@ void do_DL_sig(double **r_re0,double **r_im0, eNB2UE[eNB_id][UE_id]->path_loss_dB); #ifdef DEBUG_SIM - rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx,512,0); - printf("[SIM][DL] UE %d : rx_pwr %f dBm for slot %d (subframe %d)\n",UE_id,10*log10(rx_pwr),next_slot,next_slot>>1); + rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx,512,0)*512.0/300.0; + LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr %f dBm for slot %d (subframe %d)\n",UE_id,10*log10(rx_pwr),next_slot,next_slot>>1); #endif if (eNB2UE[eNB_id][UE_id]->first_run == 1) @@ -356,9 +361,9 @@ void do_DL_sig(double **r_re0,double **r_im0, 1e3/eNB2UE[eNB_id][UE_id]->BW, // sampling time (ns) (double)PHY_vars_UE_g[UE_id]->rx_total_gain_dB - 66.227); // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later) - rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx,frame_parms->ofdm_symbol_size,0); #ifdef DEBUG_SIM - printf("[SIM][DL] UE %d : ADC in (eNB %d) %f dB for slot %d (subframe %d)\n", + rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx,frame_parms->ofdm_symbol_size,0)*512.0/300; + LOG_D(OCM,"[SIM][DL] UE %d : ADC in (eNB %d) %f dB for slot %d (subframe %d)\n", UE_id,eNB_id, 10*log10(rx_pwr),next_slot,next_slot>>1); #endif @@ -370,9 +375,9 @@ void do_DL_sig(double **r_re0,double **r_im0, } } - rx_pwr = signal_energy_fp(r_re,r_im,nb_antennas_rx,frame_parms->ofdm_symbol_size,0); #ifdef DEBUG_SIM - printf("[SIM][DL] UE %d : ADC in %f dB for slot %d (subframe %d)\n",UE_id,10*log10(rx_pwr),next_slot,next_slot>>1); + rx_pwr = signal_energy_fp(r_re,r_im,nb_antennas_rx,frame_parms->ofdm_symbol_size,0)*512.0/300.0; + LOG_D(OCM,"[SIM][DL] UE %d : ADC in %f dB for slot %d (subframe %d)\n",UE_id,10*log10(rx_pwr),next_slot,next_slot>>1); #endif rxdata = PHY_vars_UE_g[UE_id]->lte_ue_common_vars.rxdata; @@ -387,8 +392,8 @@ void do_DL_sig(double **r_re0,double **r_im0, frame_parms->samples_per_tti>>1, 12); - rx_pwr2 = signal_energy(rxdata[0]+slot_offset,512); #ifdef DEBUG_SIM + rx_pwr2 = signal_energy(rxdata[0]+slot_offset,512)*512.0/300.0; LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr (ADC out) %f dB (%d) for slot %d (subframe %d), writing to %p\n",UE_id, 10*log10((double)rx_pwr2),rx_pwr2,next_slot,next_slot>>1,rxdata); #else UNUSED_VARIABLE(rx_pwr2); @@ -421,81 +426,57 @@ void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double #ifdef PHY_ABSTRACTION_UL double min_path_loss=-200; - - int subframe = (next_slot>>1); - - u8 harq_pid; - u16 ul_nb_rb=0; + u16 ul_nb_rb=0 ; u16 ul_fr_rb=0; -#endif + int ulnbrb2 ; + int ulfrrb2 ; + u8 harq_pid; + int subframe = (next_slot>>1); +#endif + /* if (next_slot==4) - { hold_channel = 0; - } + else + hold_channel = 1; + */ + + if (abstraction_flag!=0) { #ifdef PHY_ABSTRACTION_UL - if (abstraction_flag!=0) - { - for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++) + for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++) { for (UE_id=0;UE_id<NB_UE_INST;UE_id++) { - random_channel(UE2eNB[UE_id][eNB_id]); - freq_channel(UE2eNB[UE_id][eNB_id], frame_parms->N_RB_UL,frame_parms->N_RB_UL*12+1); - } - } - for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++) - { - //channel now is ready for uplink,now find out which UEs are connected to you - for (UE_id=0;UE_id<NB_UE_INST;UE_id++) - { - att_eNB_id=0; - // if UE is not attached yet, find assume its the eNB with the smallest pathloss - if (att_eNB_id >= 0) - { - for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++) - { - if (min_path_loss<UE2eNB[UE_id][eNB_id]->path_loss_dB) - { - min_path_loss = UE2eNB[UE_id][eNB_id]->path_loss_dB; - att_eNB_id=eNB_id; - LOG_D(OCM,"UE attached to eNB (UE%d->eNB%d)\n",UE_id,eNB_id); - } - } - } - if (att_eNB_id<0) - { - LOG_E(OCM,"Cannot find eNB for UE %d, return\n",UE_id); - return; //exit(-1); - } - // If the UE is attached to you, perform the uplink / abstraction procedure: - if(att_eNB_id >= 0) - { - //{ // REceived power at the eNB - rx_pwr = signal_energy_fp2(UE2eNB[UE_id][att_eNB_id]->ch[0], - UE2eNB[UE_id][att_eNB_id]->channel_length)*UE2eNB[UE_id][att_eNB_id]->channel_length; // calculate the rx power at the eNB - - // write_output("SINRch.m","SINRch",PHY_vars_eNB_g[att_eNB_id]->sinr_dB_eNB,frame_parms->N_RB_UL*12+1,1,1); - if(subframe>1 && subframe <5) + if (!hold_channel) { + random_channel(UE2eNB[UE_id][eNB_id],abstraction_flag); + freq_channel(UE2eNB[UE_id][eNB_id], frame_parms->N_RB_UL,frame_parms->N_RB_UL*12+1); + + // REceived power at the eNB + rx_pwr = signal_energy_fp2(UE2eNB[UE_id][eNB_id]->ch[0], + UE2eNB[UE_id][eNB_id]->channel_length)*UE2eNB[UE_id][att_eNB_id]->channel_length; // calculate the rx power at the eNB + } + + // write_output("SINRch.m","SINRch",PHY_vars_eNB_g[att_eNB_id]->sinr_dB_eNB,frame_parms->N_RB_UL*12+1,1,1); + if(subframe>1 && subframe <5) { harq_pid = subframe2harq_pid(frame_parms,frame,subframe); ul_nb_rb = PHY_vars_eNB_g[att_eNB_id]->ulsch_eNB[(u8)UE_id]->harq_processes[harq_pid]->nb_rb; ul_fr_rb = PHY_vars_eNB_g[att_eNB_id]->ulsch_eNB[(u8)UE_id]->harq_processes[harq_pid]->first_rb; } - - if(ul_nb_rb>1 && (ul_fr_rb < 25 && ul_fr_rb > -1)) + + if(ul_nb_rb>1 && (ul_fr_rb < 25 && ul_fr_rb > -1)) { number_rb_ul = ul_nb_rb; first_rbUL = ul_fr_rb; init_snr_up(UE2eNB[UE_id][att_eNB_id],enb_data[att_eNB_id], ue_data[UE_id],PHY_vars_eNB_g[att_eNB_id]->sinr_dB,&PHY_vars_UE_g[att_eNB_id]->N0,ul_nb_rb,ul_fr_rb); - + } - } // If this UE is attached to you(means perform Uplink abstraction procedure) - } //uE_id - } - } + } //UE_id + } //eNB_id #else - if (abstraction_flag!=0) { +/* the following functions are not needed */ +/* +if (abstraction_flag!=0) { for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++) { for (UE_id=0;UE_id<NB_UE_INST;UE_id++) { random_channel(UE2eNB[UE_id][eNB_id]); @@ -503,7 +484,9 @@ void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double } } } +*/ #endif + } else { //without abstraction /* @@ -548,7 +531,7 @@ void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double PHY_vars_UE_g[UE_id]->tx_power_dBm); //ue_data[UE_id]->tx_power_dBm); #ifdef DEBUG_SIM - printf("[SIM][UL] UE %d tx_pwr %f dBm (target %d dBm) for slot %d (subframe %d, slot_offset %d, slot_offset_meas %d)\n",UE_id,10*log10(tx_pwr),PHY_vars_UE_g[UE_id]->tx_power_dBm,next_slot,next_slot>>1,slot_offset,slot_offset_meas); + LOG_D(OCM,"[SIM][UL] UE %d tx_pwr %f dBm (target %d dBm) for slot %d (subframe %d, slot_offset %d, slot_offset_meas %d)\n",UE_id,10*log10(tx_pwr),PHY_vars_UE_g[UE_id]->tx_power_dBm,next_slot,next_slot>>1,slot_offset,slot_offset_meas); #endif multipath_channel(UE2eNB[UE_id][eNB_id],s_re,s_im,r_re0,r_im0, @@ -557,12 +540,12 @@ void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double #ifdef DEBUG_SIM rx_pwr = signal_energy_fp2(UE2eNB[UE_id][eNB_id]->ch[0], UE2eNB[UE_id][eNB_id]->channel_length)*UE2eNB[UE_id][eNB_id]->channel_length; - printf("[SIM][UL] slot %d Channel UE %d => eNB %d : %f dB (hold %d)\n",next_slot,UE_id,eNB_id,10*log10(rx_pwr),hold_channel); + LOG_D(OCM,"[SIM][UL] slot %d Channel UE %d => eNB %d : %f dB (hold %d)\n",next_slot,UE_id,eNB_id,10*log10(rx_pwr),hold_channel); #endif #ifdef DEBUG_SIM rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx,frame_parms->samples_per_tti>>1,0); - printf("[SIM][UL] eNB %d : rx_pwr %f dB (%f) for slot %d (subframe %d), sptti %d\n", + LOG_D(OCM,"[SIM][UL] eNB %d : rx_pwr %f dB (%f) for slot %d (subframe %d), sptti %d\n", eNB_id,10*log10(rx_pwr),rx_pwr,next_slot,next_slot>>1,frame_parms->samples_per_tti); #endif @@ -610,9 +593,9 @@ void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double 1e3/UE2eNB[0][eNB_id]->BW, // sampling time (ns) (double)PHY_vars_eNB_g[eNB_id]->rx_total_gain_eNB_dB - 66.227); // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later) - rx_pwr = signal_energy_fp(r_re,r_im,nb_antennas_rx,frame_parms->samples_per_tti>>1,0); #ifdef DEBUG_SIM - printf("[SIM][UL] rx_pwr (ADC in) %f dB for slot %d (subframe %d)\n",10*log10(rx_pwr),next_slot,next_slot>>1); + rx_pwr = signal_energy_fp(r_re,r_im,nb_antennas_rx,frame_parms->samples_per_tti>>1,0); + LOG_D(OCM,"[SIM][UL] rx_pwr (ADC in) %f dB for slot %d (subframe %d)\n",10*log10(rx_pwr),next_slot,next_slot>>1); #endif rxdata = PHY_vars_eNB_g[eNB_id]->lte_eNB_common_vars.rxdata[0]; @@ -627,10 +610,9 @@ void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double frame_parms->samples_per_tti>>1, 12); - rx_pwr2 = signal_energy(rxdata[0]+slot_offset,frame_parms->samples_per_tti>>1); #ifdef DEBUG_SIM - printf("[SIM][UL] eNB %d rx_pwr (ADC out) %f dB (%d) for slot %d (subframe %d)\n", - eNB_id,10*log10((double)rx_pwr2),rx_pwr2,next_slot,next_slot>>1); + rx_pwr2 = signal_energy(rxdata[0]+slot_offset,frame_parms->samples_per_tti>>1); + LOG_D(OCM,"[SIM][UL] eNB %d rx_pwr (ADC out) %f dB (%d) for slot %d (subframe %d)\n",eNB_id,10*log10((double)rx_pwr2),rx_pwr2,next_slot,next_slot>>1); #else UNUSED_VARIABLE(tx_pwr); UNUSED_VARIABLE(rx_pwr); diff --git a/targets/SIMU/USER/oaisim.c b/targets/SIMU/USER/oaisim.c index d7d9397495a..4bb261a8fa3 100644 --- a/targets/SIMU/USER/oaisim.c +++ b/targets/SIMU/USER/oaisim.c @@ -95,10 +95,10 @@ char smbv_ip[16]; #define SF_VAR 10 //constant for OAISIM soft realtime calibration -#define SF_DEVIATION_OFFSET_NS 100000 /*= 0.1ms : should be as a number of UE */ -#define SLEEP_STEP_US 100 /* = 0.01ms could be adaptive, should be as a number of UE */ -#define K 2 /* averaging coefficient */ -#define TARGET_SF_TIME_NS 1000000 /* 1ms = 1000000 ns */ +//#define SF_DEVIATION_OFFSET_NS 100000 /*= 0.1ms : should be as a number of UE */ +//#define SLEEP_STEP_US 100 /* = 0.01ms could be adaptive, should be as a number of UE */ +//#define K 2 /* averaging coefficient */ +//#define TARGET_SF_TIME_NS 1000000 /* 1ms = 1000000 ns */ frame_t frame = 0; char stats_buffer[16384]; @@ -127,18 +127,18 @@ u8 rate_adaptation_flag; extern u8 abstraction_flag; extern u8 ethernet_flag; extern u16 Nid_cell; -extern struct timespec time_spec; -extern unsigned long time_last; -extern unsigned long time_now; -extern int td; -extern int td_avg; -extern int sleep_time_us; + extern LTE_DL_FRAME_PARMS *frame_parms; #ifdef XFORMS int otg_enabled; #endif +time_stats_t oaisim_stats; +time_stats_t oaisim_stats_f; +time_stats_t dl_chan_stats; +time_stats_t ul_chan_stats; + // this should reflect the channel models in openair1/SIMULATION/TOOLS/defs.h mapping small_scale_names[] = { {"custom", custom}, @@ -188,7 +188,7 @@ void help(void) { printf ("-K [log_file] Enable ITTI logging into log_file\n"); printf ("-l Set the global log level (8:trace, 7:debug, 6:info, 4:warn, 3:error) \n"); printf ("-L [0-1] 0 to disable new link adaptation, 1 to enable new link adapatation\n"); - printf ("-m Gives a fixed DL mcs\n"); + printf ("-m Gives a fixed DL mcs for eNB scheduler\n"); printf ("-M Set the machine ID for Ethernet-based emulation\n"); printf ("-n Set the number of frames for the simulation\n"); printf ("-O [enb_conf_file] eNB configuration file name\n"); @@ -197,12 +197,13 @@ void help(void) { printf (" - wireshark: Enable tracing of layers above PHY using an UDP socket\n"); printf (" - pcap: Enable tracing of layers above PHY to a pcap file\n"); printf (" - tshark: Not implemented yet\n"); + printf ("-q Enable Openair performance profiler \n"); printf ("-Q Activate and set the MBMS service: 0 : not used (default eMBMS disabled), 1: eMBMS and RRC Connection enabled, 2: eMBMS relaying and RRC Connection enabled, 3: eMBMS enabled, RRC Connection disabled, 4: eMBMS relaying enabled, RRC Connection disabled\n"); printf ("-R [6,15,25,50,75,100] Sets N_RB_DL\n"); printf ("-r Activates rate adaptation (DL for now)\n"); printf ("-s snr_dB set a fixed (average) SNR, this deactivates the openair channel model generator (OCM)\n"); printf ("-S snir_dB set a fixed (average) SNIR, this deactivates the openair channel model generator (OCM)\n"); - printf ("-t Set the delay spread (microseconds)\n"); + printf ("-t Gives a fixed UL mcs for eNB scheduler\n"); printf ("-T activate the traffic generator: cbr, mcbr, bcbr, mscbr\n"); printf ("-u Set the number of local UE\n"); printf ("-U Set the mobility model for UE, options are: STATIC, RWP, RWALK\n"); @@ -513,9 +514,11 @@ void *l2l1_task(void *args_p) { AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); } #endif - + start_meas(&oaisim_stats); for (frame = 0; (l2l1_state != L2L1_TERMINATED) && (frame < oai_emulation.info.n_frames); frame++) { + start_meas(&oaisim_stats_f); + #if defined(ENABLE_ITTI) do { // Checks if a message has been sent to L2L1 task @@ -602,7 +605,7 @@ void *l2l1_task(void *args_p) { update_ocm (); for (slot = 0; slot < 20; slot++) { - + wait_for_slot_isr (); #if defined(ENABLE_ITTI) @@ -815,14 +818,16 @@ void *l2l1_task(void *args_p) { frame_parms); } }*/ - for (UE_inst = 0; UE_inst < NB_UE_INST; UE_inst++) { - do_DL_sig (r_re0, r_im0, r_re, r_im, s_re, s_im, eNB2UE, enb_data, ue_data, next_slot, abstraction_flag, - frame_parms, UE_inst); + start_meas(&dl_chan_stats); + for (UE_inst = 0; UE_inst < NB_UE_INST; UE_inst++) { + do_DL_sig (r_re0, r_im0, r_re, r_im, s_re, s_im, eNB2UE, enb_data, ue_data, next_slot, abstraction_flag,frame_parms, UE_inst); } + stop_meas(&dl_chan_stats); } if ((direction == SF_UL) || (frame_parms->frame_type == 0)) { //if ((subframe<2) || (subframe>4)) - do_UL_sig (r_re0, r_im0, r_re, r_im, s_re, s_im, UE2eNB, enb_data, ue_data, next_slot, abstraction_flag, - frame_parms, frame); + start_meas(&ul_chan_stats); + do_UL_sig (r_re0, r_im0, r_re, r_im, s_re, s_im, UE2eNB, enb_data, ue_data, next_slot, abstraction_flag,frame_parms, frame); + stop_meas(&ul_chan_stats); /* int ccc; fprintf(SINRpost,"SINRdb For eNB New Subframe : \n "); @@ -842,11 +847,12 @@ void *l2l1_task(void *args_p) { frame,next_slot, frame_parms); } - }*/ - for (UE_inst = 0; UE_inst < NB_UE_INST; UE_inst++) { - do_DL_sig (r_re0, r_im0, r_re, r_im, s_re, s_im, eNB2UE, enb_data, ue_data, next_slot, abstraction_flag, - frame_parms, UE_inst); - } + }*/ + start_meas(&dl_chan_stats); + for (UE_inst = 0; UE_inst < NB_UE_INST; UE_inst++) { + do_DL_sig (r_re0, r_im0, r_re, r_im, s_re, s_im, eNB2UE, enb_data, ue_data, next_slot, abstraction_flag,frame_parms, UE_inst); + } + stop_meas(&dl_chan_stats); /* for (aarx=0;aarx<UE2eNB[1][0]->nb_rx;aarx++) for (aatx=0;aatx<UE2eNB[1][0]->nb_tx;aatx++) @@ -855,8 +861,9 @@ void *l2l1_task(void *args_p) { */ } else { // UL part - do_UL_sig (r_re0, r_im0, r_re, r_im, s_re, s_im, UE2eNB, enb_data, ue_data, next_slot, abstraction_flag, - frame_parms, frame); + start_meas(&ul_chan_stats); + do_UL_sig (r_re0, r_im0, r_re, r_im, s_re, s_im, UE2eNB, enb_data, ue_data, next_slot, abstraction_flag,frame_parms, frame); + stop_meas(&ul_chan_stats); /* int ccc; fprintf(SINRpost,"SINRdb For eNB New Subframe : \n "); @@ -887,33 +894,7 @@ void *l2l1_task(void *args_p) { write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",PHY_vars_UE->lte_ue_pdcch_vars[eNB_id]->rxdataF_comp[0],4*300,1,1); } */ - - if (next_slot % 2 == 0) { - clock_gettime (CLOCK_REALTIME, &time_spec); - time_last = time_now; - time_now = (unsigned long) time_spec.tv_nsec; - td = (int) (time_now - time_last); - if (td > 0) { - td_avg = (int) (((K * (long) td) + (((1 << 3) - K) * ((long) td_avg))) >> 3); // in us - LOG_T( - EMU, - "sleep frame %d, time_now %ldus,time_last %ldus,average time difference %ldns, CURRENT TIME DIFF %dus, avgerage difference from the target %dus\n", frame, time_now, time_last, td_avg, td/1000, (td_avg-TARGET_SF_TIME_NS)/1000); - } - if (td_avg < (TARGET_SF_TIME_NS - SF_DEVIATION_OFFSET_NS)) { - sleep_time_us += SLEEP_STEP_US; - LOG_D(EMU, "Faster than realtime increase the avg sleep time for %d us, frame %d\n", sleep_time_us, frame); - // LOG_D(EMU,"Faster than realtime increase the avg sleep time for %d us, frame %d, time_now %ldus,time_last %ldus,average time difference %ldns, CURRENT TIME DIFF %dus, avgerage difference from the target %dus\n", sleep_time_us,frame, time_now,time_last,td_avg, td/1000,(td_avg-TARGET_SF_TIME_NS)/1000); - } - else - if (td_avg > (TARGET_SF_TIME_NS + SF_DEVIATION_OFFSET_NS)) { - sleep_time_us -= SLEEP_STEP_US; - LOG_D( - EMU, - "Slower than realtime reduce the avg sleep time for %d us, frame %d, time_now\n", sleep_time_us, frame); - //LOG_T(EMU,"Slower than realtime reduce the avg sleep time for %d us, frame %d, time_now %ldus,time_last %ldus,average time difference %ldns, CURRENT TIME DIFF %dus, avgerage difference from the target %dus\n", sleep_time_us,frame, time_now,time_last,td_avg, td/1000,(td_avg-TARGET_SF_TIME_NS)/1000); - } - } // end if next_slot%2 - } // if Channel_Flag==0 + } // if Channel_Flag==0 } //end of slot @@ -955,19 +936,16 @@ void *l2l1_task(void *args_p) { } #endif - // calibrate at the end of each frame if there is some time left - if ((sleep_time_us > 0) && (ethernet_flag == 0)) { - LOG_I(EMU, "[TIMING] Adjust average frame duration, sleep for %d us\n", sleep_time_us); - //usleep (sleep_time_us); - sleep_time_us = 0; // reset the timer, could be done per n SF - } #ifdef SMBV if ((frame == config_frames[0]) || (frame == config_frames[1]) || (frame == config_frames[2]) || (frame == config_frames[3])) { smbv_frame_cnt++; } #endif + stop_meas(&oaisim_stats_f); } //end of frame + stop_meas(&oaisim_stats); + #if defined(ENABLE_ITTI) itti_terminate_tasks(TASK_L2L1); #endif @@ -1011,8 +989,8 @@ int main(int argc, char **argv) { #endif // time calibration for soft realtime mode - //time_t t0,t1; - //clock_t start, stop; + char pbch_file_path[512]; + FILE *pbch_file_fd; #ifdef PROC int node_id; @@ -1085,7 +1063,10 @@ int main(int argc, char **argv) { smbv_init_config(smbv_fname, smbv_nframes); smbv_write_config_from_frame_parms(smbv_fname, &PHY_vars_eNB_g[0]->lte_frame_parms); #endif - + // oai performance profiler is enabled + if (oai_emulation.info.opp_enabled == 1) + reset_opp_meas(); + init_time (); init_slot_isr (); @@ -1125,6 +1106,9 @@ int main(int argc, char **argv) { if (oai_emulation.info.otg_enabled == 1) kpi_gen (); + if (oai_emulation.info.opp_enabled == 1) + print_opp_meas(); + // relase all rx state if (ethernet_flag == 1) { emu_transport_release (); @@ -1200,6 +1184,266 @@ int main(int argc, char **argv) { return (0); } +void reset_opp_meas(void){ + u8 eNB_id=0,UE_id=0; + + reset_meas(&oaisim_stats); + reset_meas(&oaisim_stats_f); // frame + + // init time stats here (including channel) + reset_meas(&dl_chan_stats); + reset_meas(&ul_chan_stats); + + for (UE_id=0; UE_id<NB_UE_INST; UE_id++) { + reset_meas(&PHY_vars_UE_g[UE_id]->phy_proc); + reset_meas(&PHY_vars_UE_g[UE_id]->phy_proc_rx); + reset_meas(&PHY_vars_UE_g[UE_id]->phy_proc_tx); + + reset_meas(&PHY_vars_UE_g[UE_id]->ofdm_demod_stats); + reset_meas(&PHY_vars_UE_g[UE_id]->rx_dft_stats); + reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_channel_estimation_stats); + reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_freq_offset_estimation_stats); + reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_decoding_stats); + reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_rate_unmatching_stats); + reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_turbo_decoding_stats); + reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_deinterleaving_stats); + reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_llr_stats); + reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_unscrambling_stats); + + reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_init_stats); + reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_alpha_stats); + reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_beta_stats); + reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_gamma_stats); + reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_ext_stats); + reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_intl1_stats); + reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_intl2_stats); + + reset_meas(&PHY_vars_UE_g[UE_id]->tx_prach); + + reset_meas(&PHY_vars_UE_g[UE_id]->ofdm_mod_stats); + reset_meas(&PHY_vars_UE_g[UE_id]->ulsch_encoding_stats); + reset_meas(&PHY_vars_UE_g[UE_id]->ulsch_modulation_stats); + reset_meas(&PHY_vars_UE_g[UE_id]->ulsch_segmentation_stats); + reset_meas(&PHY_vars_UE_g[UE_id]->ulsch_rate_matching_stats); + reset_meas(&PHY_vars_UE_g[UE_id]->ulsch_turbo_encoding_stats); + reset_meas(&PHY_vars_UE_g[UE_id]->ulsch_interleaving_stats); + reset_meas(&PHY_vars_UE_g[UE_id]->ulsch_multiplexing_stats); + /* + * L2 functions + */ + + // UE MAC + reset_meas(&UE_mac_inst[UE_id].ue_scheduler); // total + reset_meas(&UE_mac_inst[UE_id].tx_ulsch_sdu); // inlcude rlc_data_req + mac header gen + reset_meas(&UE_mac_inst[UE_id].rx_dlsch_sdu); // include mac_rrc_data_ind or mac_rlc_status_ind+mac_rlc_data_ind and mac header parser + reset_meas(&UE_mac_inst[UE_id].ue_query_mch); + reset_meas(&UE_mac_inst[UE_id].rx_mch_sdu); // include rld_data_ind+ parse mch header + reset_meas(&UE_mac_inst[UE_id].rx_si); // include rlc_data_ind + mac header parser + + reset_meas(&UE_pdcp_stats[UE_id].pdcp_run); + reset_meas(&UE_pdcp_stats[UE_id].data_req); + reset_meas(&UE_pdcp_stats[UE_id].data_ind); + /* reset_meas(&UE_pdcp_stats[UE_id].encrption); + reset_meas(&UE_pdcp_stats[UE_id].decrption); + reset_meas(&UE_pdcp_stats[UE_id].pdcp_ip); + reset_meas(&UE_pdcp_stats[UE_id].ip_pdcp); + */ + for (eNB_id=0; eNB_id<NB_eNB_INST; eNB_id++) { + reset_meas(&PHY_vars_eNB_g[eNB_id]->phy_proc); + reset_meas(&PHY_vars_eNB_g[eNB_id]->phy_proc_rx); + reset_meas(&PHY_vars_eNB_g[eNB_id]->phy_proc_tx); + reset_meas(&PHY_vars_eNB_g[eNB_id]->rx_prach); + + reset_meas(&PHY_vars_eNB_g[eNB_id]->ofdm_mod_stats); + reset_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_encoding_stats); + reset_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_modulation_stats); + reset_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_scrambling_stats); + reset_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_rate_matching_stats); + reset_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_turbo_encoding_stats); + reset_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_interleaving_stats); + + reset_meas(&PHY_vars_eNB_g[eNB_id]->ofdm_demod_stats); + //reset_meas(&PHY_vars_eNB_g[eNB_id]->rx_dft_stats); + //reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_channel_estimation_stats); + //reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_freq_offset_estimation_stats); + reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_decoding_stats); + reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_demodulation_stats); + reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_rate_unmatching_stats); + reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_turbo_decoding_stats); + reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_deinterleaving_stats); + reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_demultiplexing_stats); + reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_llr_stats); + reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_init_stats); + reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_alpha_stats); + reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_beta_stats); + reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_gamma_stats); + reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_ext_stats); + reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_intl1_stats); + reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_intl2_stats); + + reset_meas(&eNB2UE[eNB_id][UE_id]->random_channel); + reset_meas(&eNB2UE[eNB_id][UE_id]->interp_time); + reset_meas(&eNB2UE[eNB_id][UE_id]->interp_freq); + reset_meas(&eNB2UE[eNB_id][UE_id]->convolution); + reset_meas(&UE2eNB[UE_id][eNB_id]->random_channel); + reset_meas(&UE2eNB[UE_id][eNB_id]->interp_time); + reset_meas(&UE2eNB[UE_id][eNB_id]->interp_freq); + reset_meas(&UE2eNB[UE_id][eNB_id]->convolution); + /* + * L2 functions + */ + // eNB MAC + reset_meas(&eNB_mac_inst[eNB_id].eNB_scheduler); // total + reset_meas(&eNB_mac_inst[eNB_id].schedule_si); // only schedule + tx + reset_meas(&eNB_mac_inst[eNB_id].schedule_ra); // only ra + reset_meas(&eNB_mac_inst[eNB_id].schedule_ulsch); // onlu ulsch + reset_meas(&eNB_mac_inst[eNB_id].fill_DLSCH_dci);// only dci + reset_meas(&eNB_mac_inst[eNB_id].schedule_dlsch_preprocessor); // include rlc_data_req + MAC header gen + reset_meas(&eNB_mac_inst[eNB_id].schedule_dlsch); // include rlc_data_req + MAC header gen + pre-processor + reset_meas(&eNB_mac_inst[eNB_id].schedule_mch); // only embms + reset_meas(&eNB_mac_inst[eNB_id].rx_ulsch_sdu); // include rlc_data_ind + mac header parser + + reset_meas(&eNB_pdcp_stats[UE_id].pdcp_run); + reset_meas(&eNB_pdcp_stats[UE_id].data_req); + reset_meas(&eNB_pdcp_stats[UE_id].data_ind); + /* + reset_meas(&eNB_pdcp_stats[UE_id].encrption); + reset_meas(&eNB_pdcp_stats[UE_id].decrption); + reset_meas(&eNB_pdcp_stats[UE_id].pdcp_ip); + reset_meas(&eNB_pdcp_stats[UE_id].ip_pdcp); + */ + } + } +} + +void print_opp_meas(void){ + u8 eNB_id=0,UE_id=0; + + print_meas(&oaisim_stats,"[OAI][total_exec_time]", &oaisim_stats,&oaisim_stats); + print_meas(&oaisim_stats_f,"[OAI][SF_exec_time]", &oaisim_stats,&oaisim_stats_f); + + print_meas(&dl_chan_stats,"[DL][chan_stats]",&oaisim_stats,&oaisim_stats_f); + print_meas(&ul_chan_stats,"[UL][chan_stats]", &oaisim_stats,&oaisim_stats_f); + + for (UE_id=0; UE_id<NB_UE_INST;UE_id++) { + for (eNB_id=0; eNB_id<NB_eNB_INST; eNB_id++) { + print_meas(&eNB2UE[eNB_id][UE_id]->random_channel,"[DL][random_channel]",&oaisim_stats,&oaisim_stats_f); + print_meas(&eNB2UE[eNB_id][UE_id]->interp_time,"[DL][interp_time]",&oaisim_stats,&oaisim_stats_f); + print_meas(&eNB2UE[eNB_id][UE_id]->interp_freq,"[DL][interp_freq]",&oaisim_stats,&oaisim_stats_f); + print_meas(&eNB2UE[eNB_id][UE_id]->convolution,"[DL][convolution]",&oaisim_stats,&oaisim_stats_f); + + print_meas(&UE2eNB[UE_id][eNB_id]->random_channel,"[UL][random_channel]",&oaisim_stats,&oaisim_stats_f); + print_meas(&UE2eNB[UE_id][eNB_id]->interp_time,"[UL][interp_time]",&oaisim_stats,&oaisim_stats_f); + print_meas(&UE2eNB[UE_id][eNB_id]->interp_freq,"[UL][interp_freq]",&oaisim_stats,&oaisim_stats_f); + print_meas(&UE2eNB[UE_id][eNB_id]->convolution,"[UL][convolution]",&oaisim_stats,&oaisim_stats_f); + } + } + + for (UE_id=0; UE_id<NB_UE_INST;UE_id++) { + print_meas(&PHY_vars_UE_g[UE_id]->phy_proc,"[UE][total_phy_proc]",&oaisim_stats,&oaisim_stats_f); + + print_meas(&PHY_vars_UE_g[UE_id]->phy_proc_rx,"[UE][total_phy_proc_rx]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_UE_g[UE_id]->ofdm_demod_stats,"[UE][ofdm_demod]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_UE_g[UE_id]->rx_dft_stats,"[UE][rx_dft]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_UE_g[UE_id]->dlsch_channel_estimation_stats,"[UE][channel_est]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_UE_g[UE_id]->dlsch_freq_offset_estimation_stats,"[UE][freq_offset]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_UE_g[UE_id]->dlsch_llr_stats,"[UE][llr]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_UE_g[UE_id]->dlsch_unscrambling_stats,"[UE][unscrambling]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_UE_g[UE_id]->dlsch_decoding_stats,"[UE][decoding]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_UE_g[UE_id]->dlsch_rate_unmatching_stats,"[UE][rate_unmatching]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_UE_g[UE_id]->dlsch_deinterleaving_stats,"[UE][deinterleaving]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_UE_g[UE_id]->dlsch_turbo_decoding_stats,"[UE][turbo_decoding]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_init_stats,"[UE][ |_tc_init]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_alpha_stats,"[UE][ |_tc_alpha]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_beta_stats,"[UE][ |_tc_beta]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_gamma_stats,"[UE][ |_tc_gamma]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_ext_stats,"[UE][ |_tc_ext]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_intl1_stats,"[UE][ |_tc_intl1]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_intl2_stats,"[UE][ |_tc_intl2]",&oaisim_stats,&oaisim_stats_f); + + print_meas(&PHY_vars_UE_g[UE_id]->phy_proc_tx,"[UE][total_phy_proc_tx]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_UE_g[UE_id]->ofdm_mod_stats,"[UE][ofdm_mod]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_UE_g[UE_id]->ulsch_modulation_stats,"[UE][modulation]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_UE_g[UE_id]->ulsch_encoding_stats,"[UE][encoding]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_UE_g[UE_id]->ulsch_segmentation_stats,"[UE][segmentation]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_UE_g[UE_id]->ulsch_rate_matching_stats,"[UE][rate_matching]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_UE_g[UE_id]->ulsch_turbo_encoding_stats,"[UE][turbo_encoding]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_UE_g[UE_id]->ulsch_interleaving_stats,"[UE][interleaving]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_UE_g[UE_id]->ulsch_multiplexing_stats,"[UE][multiplexing]",&oaisim_stats,&oaisim_stats_f); + + } + + for (eNB_id=0; eNB_id<NB_eNB_INST; eNB_id++) { + print_meas(&PHY_vars_eNB_g[eNB_id]->phy_proc,"[eNB][total_phy_proc]",&oaisim_stats,&oaisim_stats_f); + + print_meas(&PHY_vars_eNB_g[eNB_id]->phy_proc_rx,"[eNB][total_phy_proc_rx]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_eNB_g[eNB_id]->ofdm_mod_stats,"[eNB][ofdm_mod]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_modulation_stats,"[eNB][modulation]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_scrambling_stats,"[eNB][scrambling]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_encoding_stats,"[eNB][encoding]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_interleaving_stats,"[eNB][|_interleaving]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_rate_matching_stats,"[eNB][|_rate_matching]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_turbo_encoding_stats,"[eNB][|_turbo_encoding]",&oaisim_stats,&oaisim_stats_f); + + + print_meas(&PHY_vars_eNB_g[eNB_id]->phy_proc_tx,"[eNB][total_phy_proc_tx]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_eNB_g[eNB_id]->ofdm_demod_stats,"[eNB][ofdm_demod]",&oaisim_stats,&oaisim_stats_f); + //print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_channel_estimation_stats,"[eNB][channel_est]"); + //print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_freq_offset_estimation_stats,"[eNB][freq_offset]"); + //print_meas(&PHY_vars_eNB_g[eNB_id]->rx_dft_stats,"[eNB][rx_dft]"); + print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_demodulation_stats,"[eNB][demodulation]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_decoding_stats,"[eNB][decoding]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_deinterleaving_stats,"[eNB][|_deinterleaving]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_demultiplexing_stats,"[eNB][|_demultiplexing]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_rate_unmatching_stats,"[eNB][|_rate_unmatching]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_turbo_decoding_stats,"[eNB][|_turbo_decoding]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_init_stats,"[eNB][ |_tc_init]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_alpha_stats,"[eNB][ |_tc_alpha]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_beta_stats,"[eNB][ |_tc_beta]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_gamma_stats,"[eNB][ |_tc_gamma]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_ext_stats,"[eNB][ |_tc_ext]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_intl1_stats,"[eNB][ |_tc_intl1]",&oaisim_stats,&oaisim_stats_f); + print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_intl2_stats,"[eNB][ |_tc_intl2]",&oaisim_stats,&oaisim_stats_f); + + print_meas(&PHY_vars_eNB_g[eNB_id]->rx_prach,"[eNB][rx_prach]",&oaisim_stats,&oaisim_stats_f); + + } + + for (UE_id=0; UE_id<NB_UE_INST;UE_id++) { + + print_meas(&UE_mac_inst[UE_id].ue_scheduler,"[UE][mac_scheduler]",&oaisim_stats,&oaisim_stats_f); + print_meas(&UE_mac_inst[UE_id].tx_ulsch_sdu,"[UE][tx_ulsch_sdu]",&oaisim_stats,&oaisim_stats_f); + print_meas(&UE_mac_inst[UE_id].rx_dlsch_sdu,"[UE][rx_dlsch_sdu]",&oaisim_stats,&oaisim_stats_f); + print_meas(&UE_mac_inst[UE_id].ue_query_mch,"[UE][query_MCH]",&oaisim_stats,&oaisim_stats_f); + print_meas(&UE_mac_inst[UE_id].rx_mch_sdu,"[UE][rx_mch_sdu]",&oaisim_stats,&oaisim_stats_f); + print_meas(&UE_mac_inst[UE_id].rx_si,"[UE][rx_si]",&oaisim_stats,&oaisim_stats_f); + + print_meas(&UE_pdcp_stats[UE_id].pdcp_run,"[UE][total_pdcp_run]",&oaisim_stats,&oaisim_stats_f); + print_meas(&UE_pdcp_stats[UE_id].data_req,"[UE][DL][pdcp_data_req]",&oaisim_stats,&oaisim_stats_f); + print_meas(&UE_pdcp_stats[UE_id].data_ind,"[UE][UL][pdcp_data_ind]",&oaisim_stats,&oaisim_stats_f); + + } + + for (eNB_id=0; eNB_id<NB_eNB_INST; eNB_id++) { + + print_meas(&eNB_mac_inst[eNB_id].eNB_scheduler,"[eNB][mac_scheduler]",&oaisim_stats,&oaisim_stats_f); + print_meas(&eNB_mac_inst[eNB_id].schedule_si,"[eNB][DL][SI]",&oaisim_stats,&oaisim_stats_f); + print_meas(&eNB_mac_inst[eNB_id].schedule_ra,"[eNB][DL][RA]",&oaisim_stats,&oaisim_stats_f); + print_meas(&eNB_mac_inst[eNB_id].fill_DLSCH_dci,"[eNB][DL/UL][fill_DCI]",&oaisim_stats,&oaisim_stats_f); + print_meas(&eNB_mac_inst[eNB_id].schedule_dlsch_preprocessor,"[eNB][DL][preprocessor]",&oaisim_stats,&oaisim_stats_f); + print_meas(&eNB_mac_inst[eNB_id].schedule_dlsch,"[eNB][DL][schedule_tx_dlsch]",&oaisim_stats,&oaisim_stats_f); + print_meas(&eNB_mac_inst[eNB_id].schedule_mch,"[eNB][DL][mch]",&oaisim_stats,&oaisim_stats_f); + print_meas(&eNB_mac_inst[eNB_id].schedule_ulsch,"[eNB][UL][ULSCH]",&oaisim_stats,&oaisim_stats_f); + print_meas(&eNB_mac_inst[eNB_id].rx_ulsch_sdu,"[eNB][UL][rx_ulsch_sdu]",&oaisim_stats,&oaisim_stats_f); + + print_meas(&eNB_pdcp_stats[UE_id].pdcp_run,"[eNB][pdcp_run]",&oaisim_stats,&oaisim_stats_f); + print_meas(&eNB_pdcp_stats[UE_id].data_req,"[eNB][DL][pdcp_data_req]",&oaisim_stats,&oaisim_stats_f); + print_meas(&eNB_pdcp_stats[UE_id].data_ind,"[eNB][UL][pdcp_data_ind]",&oaisim_stats,&oaisim_stats_f); + } + +} + + /* static void *sigh(void *arg) { diff --git a/targets/SIMU/USER/oaisim.h b/targets/SIMU/USER/oaisim.h index 86bd4df113d..b5bac619e1e 100644 --- a/targets/SIMU/USER/oaisim.h +++ b/targets/SIMU/USER/oaisim.h @@ -45,4 +45,16 @@ void do_OFDM_mod(mod_sym_t **txdataF, s32 **txdata, frame_t frame, u16 next_slot #ifdef OPENAIR2 int omv_write (int pfd, Node_list enb_node_list, Node_list ue_node_list, Data_Flow_Unit omv_data); void omv_end (int pfd, Data_Flow_Unit omv_data); + +void reset_opp_meas(void); +void print_opp_meas(void); + #endif + + + + + + + + diff --git a/targets/SIMU/USER/oaisim_config.c b/targets/SIMU/USER/oaisim_config.c index 9fcdbfaf11b..8ef289f6eb2 100644 --- a/targets/SIMU/USER/oaisim_config.c +++ b/targets/SIMU/USER/oaisim_config.c @@ -337,6 +337,8 @@ void init_oai_emulation() { oai_emulation.info.cli_enabled=0;// I flag oai_emulation.info.omv_enabled =0; // v flag oai_emulation.info.vcd_enabled=0; + oai_emulation.info.opp_enabled=0; + oai_emulation.info.cba_group_active=0; oai_emulation.info.eMBMS_active_state=0; oai_emulation.info.handover_active=0; diff --git a/targets/SIMU/USER/oaisim_functions.c b/targets/SIMU/USER/oaisim_functions.c index 80c8b44953d..a5694217051 100644 --- a/targets/SIMU/USER/oaisim_functions.c +++ b/targets/SIMU/USER/oaisim_functions.c @@ -58,7 +58,7 @@ int for_times = 0; static char *conf_config_file_name = NULL; u16 Nid_cell = 0; //needed by init_lte_vars int nb_antennas_rx = 2; // // -u8 target_dl_mcs = 0; +u8 target_dl_mcs = 0; // not set u8 rate_adaptation_flag = 0; u8 set_sinr = 0; double snr_dB, sinr_dB; @@ -72,7 +72,7 @@ double forgetting_factor = 0.0; u8 beta_ACK = 0; u8 beta_RI = 0; u8 beta_CQI = 2; -u8 target_ul_mcs = 2; +u8 target_ul_mcs = 4; LTE_DL_FRAME_PARMS *frame_parms = NULL; int map1,map2; double **ShaF = NULL; @@ -123,7 +123,8 @@ extern pdcp_mbms_t pdcp_mbms_array_ue[NUMBER_OF_UE_MAX][maxServiceCount][maxSess extern pdcp_mbms_t pdcp_mbms_array_eNB[NUMBER_OF_eNB_MAX][maxServiceCount][maxSessionPerPMCH]; #endif -extern void help (void); +extern time_stats_t dl_chan_stats; +extern time_stats_t ul_chan_stats; void get_simulation_options(int argc, char *argv[]) { int option; @@ -182,7 +183,7 @@ void get_simulation_options(int argc, char *argv[]) { {NULL, 0, NULL, 0} }; - while ((option = getopt_long (argc, argv, "aA:b:B:c:C:D:d:eE:f:FGg:hHi:IJ:j:k:K:l:L:m:M:n:N:oO:p:P:Q:rR:s:S:t:T:u:U:vV:w:W:x:X:y:Y:z:Z:", long_options, NULL)) != -1) { + while ((option = getopt_long (argc, argv, "aA:b:B:c:C:D:d:eE:f:FGg:hHi:IJ:j:k:K:l:L:m:M:n:N:oO:p:P:qQ:rR:s:S:t:T:u:U:vV:w:W:x:X:y:Y:z:Z:", long_options, NULL)) != -1) { switch (option) { case LONG_OPTION_ENB_CONF: if (optarg) { @@ -474,7 +475,11 @@ void get_simulation_options(int argc, char *argv[]) { } oai_emulation.info.opt_mode = opt_type; break; - + case 'q': + // openair performane profiler + oai_emulation.info.opp_enabled = 1; // this var is used for OCG + opp_enabled = 1; // this is the global var used by oaisim + break; case 'Q': //eMBMS_active=1; // 0 : not used (default), 1: eMBMS and RRC enabled, 2: eMBMS relaying and RRC enabled, 3: eMBMS enabled, RRC disabled, 4: eMBMS relaying enabled, RRC disabled @@ -507,9 +512,7 @@ void get_simulation_options(int argc, char *argv[]) { break; case 't': - //Td = atof (optarg); - printf("[SIM] Option t is no longer supported on the command line. Please specify your channel model in the xml template\n"); - exit(-1); + target_ul_mcs = atoi (optarg); break; case 'T': @@ -856,7 +859,10 @@ void init_ocm() { get_beta_map_up(); #endif get_MIESM_param(); + + //load_pbch_desc(); } + for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) { enb_data[eNB_id] = (node_desc_t *)malloc(sizeof(node_desc_t)); @@ -912,7 +918,7 @@ void init_ocm() { forgetting_factor, 0, 0); - random_channel(eNB2UE[eNB_id][UE_id]); + random_channel(eNB2UE[eNB_id][UE_id],abstraction_flag); LOG_D(OCM,"[SIM] Initializing channel (%s, %d) from UE %d to eNB %d\n", oai_emulation.environment_system_config.fading.small_scale.selected_option, map_str_to_int(small_scale_names, oai_emulation.environment_system_config.fading.small_scale.selected_option),UE_id, eNB_id); @@ -924,15 +930,12 @@ void init_ocm() { 0, 0); - random_channel(UE2eNB[UE_id][eNB_id]); - } - } - - // Not needed anymore, done automatically in init_freq_channel upon first call to the function + random_channel(UE2eNB[UE_id][eNB_id],abstraction_flag); - // if (abstraction_flag==1) - // init_freq_channel(eNB2UE[0][0],PHY_vars_UE_g[0]->lte_frame_parms.N_RB_DL,PHY_vars_UE_g[0]->lte_frame_parms.N_RB_DL*12+1); - freq_channel(eNB2UE[0][0],PHY_vars_UE_g[0]->lte_frame_parms.N_RB_DL,PHY_vars_UE_g[0]->lte_frame_parms.N_RB_DL*12+1); + // to make channel reciprocal uncomment following line instead of previous. However this only works for SISO at the moment. For MIMO the channel would need to be transposed. + //UE2eNB[UE_id][eNB_id] = eNB2UE[eNB_id][UE_id]; + } + } } void init_otg_pdcp_buffer() { diff --git a/targets/SIMU/USER/oaisim_functions.h b/targets/SIMU/USER/oaisim_functions.h index 42641d1c8c3..a4fbd51a8d0 100644 --- a/targets/SIMU/USER/oaisim_functions.h +++ b/targets/SIMU/USER/oaisim_functions.h @@ -40,6 +40,8 @@ void init_time(); void init_pad(); +void help(void); + int init_slot_isr(void); void wait_for_slot_isr(void); diff --git a/targets/SIMU/USER/sinr_sim.c b/targets/SIMU/USER/sinr_sim.c index 41769a04f33..62104bfb7f6 100644 --- a/targets/SIMU/USER/sinr_sim.c +++ b/targets/SIMU/USER/sinr_sim.c @@ -35,7 +35,7 @@ #define PI 3.1416 #define Am 20 -#define MCS_COUNT 24 + #define MCL (-70) /*minimum coupling loss (MCL) in dB*/ //double sinr[NUMBER_OF_eNB_MAX][2*25]; /* @@ -169,7 +169,7 @@ void calc_path_loss(node_desc_t* enb_data, node_desc_t* ue_data, channel_desc_t path_loss = env_desc.fading.free_space_model_parameters.pathloss_0_dB - 10*env_desc.fading.free_space_model_parameters.pathloss_exponent * log10(dist/1000); - //printf("dist %f, Path loss %f\n",dist,ch_desc->path_loss_dB); + LOG_D(OCM,"dist %f, Path loss %f\n",dist,ch_desc->path_loss_dB); /* Calculating the angle in the range -pi to pi from the slope */ alpha = atan2((ue_data->x - enb_data->x), (ue_data->y - enb_data->y)); @@ -522,20 +522,13 @@ void get_beta_map() { file_path = (char*) malloc(512); for (mcs = 0; mcs < MCS_COUNT; mcs++) { - sprintf(file_path,"%s/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/Perf_Curves_Abs/awgn_bler_tx1_mcs%d.csv",getenv("OPENAIR1_DIR"),mcs); + sprintf(file_path,"%s/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs%d.csv",getenv("OPENAIR1_DIR"),mcs); fp = fopen(file_path,"r"); if (fp == NULL) { - LOG_W(OCM,"ERROR: Unable to open the file %s, try an alternative path\n", file_path); - memset(file_path, 0, 512); - sprintf(file_path,"AWGN/awgn_snr_bler_mcs%d.csv",mcs); - LOG_I(OCM,"Opening the alternative path %s\n", file_path); - fp = fopen(file_path,"r"); - if (fp == NULL) { - LOG_E(OCM,"ERROR: Unable to open the file %s, exisitng\n", file_path); + LOG_E(OCM,"ERROR: Unable to open the file %s! Exitng.\n", file_path); exit(-1); } - } - // else { + // else { if (fgets (buffer, 1000, fp) != NULL) { if (fgets (buffer, 1000, fp) != NULL) { table_length[mcs] = 0; @@ -551,6 +544,10 @@ void get_beta_map() { sinr_bler_map[mcs][0][table_length[mcs]] = perf_array[0]; sinr_bler_map[mcs][1][table_length[mcs]] = (perf_array[4] / perf_array[5]); table_length[mcs]++; + if (table_length[mcs]>MCS_TABLE_LENGTH_MAX) { + LOG_E(OCM,"Error reading MCS table. Increase MCS_TABLE_LENGTH_MAX (mcs %d)!\n",mcs); + exit(-1); + } } if (fgets (buffer, 1000, fp) != NULL) { } @@ -560,10 +557,8 @@ void get_beta_map() { fclose(fp); // } LOG_D(OCM,"Print the table for mcs %d\n",mcs); - // printf("Print the table for mcs %d\n",mcs); for (t = 0; t<table_length[mcs]; t++) LOG_D(OCM,"%lf %lf \n ",sinr_bler_map[mcs][0][t],sinr_bler_map[mcs][1][t]); - // printf("%lf %lf \n ",sinr_bler_map[mcs][0][t],sinr_bler_map[mcs][1][t]); } free(file_path); } diff --git a/targets/TEST/OAI/case02.py b/targets/TEST/OAI/case02.py index 251085be9aa..437eba6f777 100644 --- a/targets/TEST/OAI/case02.py +++ b/targets/TEST/OAI/case02.py @@ -80,7 +80,7 @@ def execute(oai, user, pw, logfile,logdir): oai.send_expect_false('./oaisim.rel8 ' + conf, '[E]', 30) except log.err, e: - log.fail(case, test, name, conf, e.value, diag, logfile) + log.fail(case, test, name, conf, e.value, diag, logfile,trace) else: log.ok(case, test, name, conf, '', logfile) @@ -143,7 +143,7 @@ def execute(oai, user, pw, logfile,logdir): diag = 'RRC procedure is not finished completely, check the execution logs and trace BCCH, CCCH, and DCCH channels' for i in range(NUM_UE) : for j in range(NUM_eNB) : - conf = '-A AWGN -n' + str((i+1+j) * 100) + ' -u' + str(i+1) +' -b'+ str(j+1) + ' -x1' + conf = '-A AWGN -s 20 -n' + str((i+1+j) * 100) + ' -u' + str(i+1) +' -b'+ str(j+1) + ' -x1' trace = logdir + '/log_' + case + test + '_' + str(i) + str(j) + '.txt' tee = ' 2>&1 | tee ' + trace oai.send_expect('./oaisim.rel8 ' + conf + tee, ' Received RRCConnectionReconfigurationComplete from UE ' + str(i), (i+1) * 200) @@ -158,7 +158,7 @@ def execute(oai, user, pw, logfile,logdir): diag = 'RRC procedure is not finished completely in FDD mode, check the execution logs and trace BCCH, CCCH, and DCCH channels' for i in range(NUM_UE) : for j in range(NUM_eNB) : - conf = '-A AWGN -F -n' + str((i+1+j) * 100) + ' -u' + str(i+1) +' -b'+ str(j+1) + ' -x1' + conf = '-A AWGN -F -s 20 -n' + str((i+1+j) * 100) + ' -u' + str(i+1) +' -b'+ str(j+1) + ' -x1' trace = logdir + '/log_' + case + test + '_' + str(i) + str(j) + '.txt' tee = ' 2>&1 | tee ' + trace oai.send_expect('./oaisim.rel8 ' + conf + tee, ' Received RRCConnectionReconfigurationComplete from UE ' + str(i), (i+1) * 200) diff --git a/targets/TEST/OAI/case03.py b/targets/TEST/OAI/case03.py index a33292d048e..303ae013df5 100644 --- a/targets/TEST/OAI/case03.py +++ b/targets/TEST/OAI/case03.py @@ -105,7 +105,7 @@ def execute(oai, user, pw, logfile,logdir): diag = 'RRC procedure is not finished completely, check the execution logs and trace BCCH, CCCH, and DCCH channels' for i in range(NUM_UE) : for j in range(NUM_eNB) : - conf = '-A AWGN -l7 -x 1 -n' + str((i+1+j) * 100) + ' -u' + str(i+1) +' -b'+ str(j+1) + conf = '-A AWGN -s20 -l7 -x 1 -n' + str((i+1+j) * 100) + ' -u' + str(i+1) +' -b'+ str(j+1) trace = logdir + '/log_' + case + test + '_' + str(i) + str(j) + '.txt' tee = ' 2>&1 | tee ' + trace oai.send_expect('./oaisim.rel10 ' + conf + tee, ' Received RRCConnectionReconfigurationComplete from UE ' + str(i), (i+1) * 200) @@ -120,7 +120,7 @@ def execute(oai, user, pw, logfile,logdir): diag = 'RRC procedure is not finished completely in FDD mode, check the execution logs and trace BCCH, CCCH, and DCCH channels' for i in range(NUM_UE) : for j in range(NUM_eNB) : - conf = '-A AWGN -l7 -F -x 1 -n' + str((i+1+j) * 100) + ' -u' + str(i+1) +' -b'+ str(j+1) + conf = '-A AWGN -s20 -l7 -F -x 1 -n' + str((i+1+j) * 100) + ' -u' + str(i+1) +' -b'+ str(j+1) trace = logdir + '/log_' + case + test + '_' + str(i) + str(j) + '.txt' tee = ' 2>&1 | tee ' + trace oai.send_expect('./oaisim.rel10 ' + conf + tee, ' Received RRCConnectionReconfigurationComplete from UE ' + str(i), (i+1) * 200) @@ -195,7 +195,7 @@ def execute(oai, user, pw, logfile,logdir): log_name = logdir + '/log_' + case + test + '_' + str(i) + str(j) itti_name = log_name + '.log' trace_name = log_name + '.txt' - conf = '-A AWGN -l7 -s 15 -x 1 -Q3 --enb-conf ../../PROJECTS/GENERIC-LTE-EPC/CONF/enb.sfr.sud.conf -n' + str((i+1+j) * 50) + ' -u' + str(i+1) +' -b'+ str(j+1) + ' -K' + itti_name + conf = '-A AWGN -l7 -x 1 -Q3 --enb-conf ../../PROJECTS/GENERIC-LTE-EPC/CONF/enb.sfr.sud.conf -n' + str((i+1+j) * 50) + ' -u' + str(i+1) +' -b'+ str(j+1) + ' -K' + itti_name tee = ' 2>&1 | tee -a ' + trace_name command = './oaisim.rel10.itti ' + conf oai.send('echo ' + command + ' > ' + trace_name + ';') @@ -205,3 +205,6 @@ def execute(oai, user, pw, logfile,logdir): else: log.ok(case, test, name, conf, '', logfile) + + + -- GitLab