From d3d423f51ebbe94affbb3999aa30313781c839d3 Mon Sep 17 00:00:00 2001 From: Raymond Knopp <raymond.knopp@eurecom.fr> Date: Sun, 15 May 2016 14:10:04 -0700 Subject: [PATCH] split phy_procedures_eNB_TX into sub-modules for better understanding. No functional differences. --- openair1/PHY/LTE_TRANSPORT/defs.h | 4 +- openair1/PHY/LTE_TRANSPORT/prach.c | 2 +- openair1/PHY/LTE_TRANSPORT/print_stats.c | 4 +- openair1/PHY/TOOLS/lte_phy_scope.c | 4 +- openair1/PHY/TOOLS/lte_phy_scope.h | 1 - openair1/PHY/defs.h | 14 + openair1/SCHED/defs.h | 3 +- openair1/SCHED/extern.h | 1 - openair1/SCHED/phy_mac_stub.c | 66 +- openair1/SCHED/phy_procedures_lte_eNb.c | 2667 ++++++++++----------- openair1/SCHED/phy_procedures_lte_ue.c | 71 +- openair1/SCHED/vars.h | 1 - openair2/LAYER2/MAC/eNB_scheduler_dlsch.c | 10 +- openair2/LAYER2/MAC/eNB_scheduler_ulsch.c | 8 +- openair2/LAYER2/MAC/pre_processor.c | 2 +- targets/RT/USER/lte-softmodem.c | 49 +- targets/RT/USER/lte-ue.c | 4 +- targets/SIMU/USER/oaisim.c | 2 +- targets/SIMU/USER/oaisim_functions.c | 21 +- 19 files changed, 1402 insertions(+), 1532 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/defs.h b/openair1/PHY/LTE_TRANSPORT/defs.h index 43bc7e3515..a8ebb99c8a 100644 --- a/openair1/PHY/LTE_TRANSPORT/defs.h +++ b/openair1/PHY/LTE_TRANSPORT/defs.h @@ -726,7 +726,9 @@ typedef enum {format0, format2B, format2C, format2D, - format3 + format3, + format3A, + format4 } DCI_format_t; typedef enum { diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index b93519d393..5e58b13737 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.c +++ b/openair1/PHY/LTE_TRANSPORT/prach.c @@ -638,7 +638,7 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra prach_start = ((subframe*phy_vars_ue->lte_frame_parms.samples_per_tti)<<1)-phy_vars_ue->N_TA_offset; #else #if defined(EXMIMO) || defined(OAI_USRP) - prach_start = (phy_vars_ue->rx_offset+subframe*phy_vars_ue->lte_frame_parms.samples_per_tti-openair_daq_vars.timing_advance-phy_vars_ue->N_TA_offset); + prach_start = (phy_vars_ue->rx_offset+subframe*phy_vars_ue->lte_frame_parms.samples_per_tti-phy_vars_ue->hw_timing_advance-phy_vars_ue->N_TA_offset); if (prach_start<0) prach_start+=(phy_vars_ue->lte_frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME); diff --git a/openair1/PHY/LTE_TRANSPORT/print_stats.c b/openair1/PHY/LTE_TRANSPORT/print_stats.c index 7445fca40f..16cc75b290 100644 --- a/openair1/PHY/LTE_TRANSPORT/print_stats.c +++ b/openair1/PHY/LTE_TRANSPORT/print_stats.c @@ -102,7 +102,7 @@ int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t len += sprintf(&buffer[len], "[UE PROC] RX Gain %d dB\n",phy_vars_ue->rx_total_gain_dB); #endif #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - len += sprintf(&buffer[len], "[UE_PROC] Frequency offset %d Hz (%d), estimated carrier frequency %f Hz\n",phy_vars_ue->lte_ue_common_vars.freq_offset,openair_daq_vars.freq_offset,openair0_cfg[0].rx_freq[0]-phy_vars_ue->lte_ue_common_vars.freq_offset); + len += sprintf(&buffer[len], "[UE_PROC] Frequency offset %d Hz, estimated carrier frequency %f Hz\n",phy_vars_ue->lte_ue_common_vars.freq_offset,openair0_cfg[0].rx_freq[0]-phy_vars_ue->lte_ue_common_vars.freq_offset); #endif len += sprintf(&buffer[len], "[UE PROC] UE mode = %s (%d)\n",mode_string[phy_vars_ue->UE_mode[0]],phy_vars_ue->UE_mode[0]); len += sprintf(&buffer[len], "[UE PROC] timing_advance = %d\n",phy_vars_ue->timing_advance); @@ -529,7 +529,7 @@ int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t #endif len += sprintf(&buffer[len], "[UE PROC] DLSCH Bitrate %dkbps\n",(phy_vars_ue->bitrate[0]/1000)); len += sprintf(&buffer[len], "[UE PROC] Total Received Bits %dkbits\n",(phy_vars_ue->total_received_bits[0]/1000)); - len += sprintf(&buffer[len], "[UE PROC] IA receiver %d\n",openair_daq_vars.use_ia_receiver); + len += sprintf(&buffer[len], "[UE PROC] IA receiver %d\n",phy_vars_ue->use_ia_receiver); } diff --git a/openair1/PHY/TOOLS/lte_phy_scope.c b/openair1/PHY/TOOLS/lte_phy_scope.c index 4b623fb9dc..468aae8052 100644 --- a/openair1/PHY/TOOLS/lte_phy_scope.c +++ b/openair1/PHY/TOOLS/lte_phy_scope.c @@ -47,11 +47,11 @@ static void ia_receiver_on_off( FL_OBJECT *button, long arg) if (fl_get_button(button)) { fl_set_object_label(button, "IA Receiver ON"); - openair_daq_vars.use_ia_receiver = 1; + // PHY_vars_UE_g[0][0]->use_ia_receiver = 1; fl_set_object_color(button, FL_GREEN, FL_GREEN); } else { fl_set_object_label(button, "IA Receiver OFF"); - openair_daq_vars.use_ia_receiver = 0; + // PHY_vars_UE_g[0][0]->use_ia_receiver = 0; fl_set_object_color(button, FL_RED, FL_RED); } } diff --git a/openair1/PHY/TOOLS/lte_phy_scope.h b/openair1/PHY/TOOLS/lte_phy_scope.h index 877934fc7a..814e340808 100644 --- a/openair1/PHY/TOOLS/lte_phy_scope.h +++ b/openair1/PHY/TOOLS/lte_phy_scope.h @@ -37,7 +37,6 @@ #include "../defs.h" #include "../../SCHED/defs.h" // for OPENAIR_DAQ_VARS -extern OPENAIR_DAQ_VARS openair_daq_vars; /* Forms and Objects */ typedef struct { diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 26239b024c..b72c5f648a 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -330,6 +330,15 @@ typedef struct PHY_VARS_eNB_s { MU_MIMO_mode mu_mimo_mode[NUMBER_OF_UE_MAX]; + /// target_ue_dl_mcs : only for debug purposes + uint32_t target_ue_dl_mcs; + /// target_ue_ul_mcs : only for debug purposes + uint32_t target_ue_ul_mcs; + /// target_ue_dl_rballoc : only for debug purposes + uint32_t ue_dl_rb_alloc; + /// target ul PRBs : only for debug + uint32_t ue_ul_nb_rb; + ///check for Total Transmissions uint32_t check_for_total_transmissions; @@ -347,6 +356,8 @@ typedef struct PHY_VARS_eNB_s { uint32_t total_transmitted_bits; uint32_t total_system_throughput; + int hw_timing_advance; + time_stats_t phy_proc; time_stats_t phy_proc_tx; time_stats_t phy_proc_rx; @@ -577,6 +588,7 @@ typedef struct { // uint8_t prach_timer; int rx_offset; /// Timing offset int timing_advance; ///timing advance signalled from eNB + int hw_timing_advance; int N_TA_offset; ///timing offset used in TDD /// Flag to tell if UE is secondary user (cognitive mode) unsigned char is_secondary_ue; @@ -645,6 +657,8 @@ typedef struct { time_stats_t phy_proc_tx; time_stats_t phy_proc_rx; + uint32_t use_ia_receiver; + time_stats_t ofdm_mod_stats; time_stats_t ulsch_encoding_stats; time_stats_t ulsch_modulation_stats; diff --git a/openair1/SCHED/defs.h b/openair1/SCHED/defs.h index af6acca880..23e44d6692 100644 --- a/openair1/SCHED/defs.h +++ b/openair1/SCHED/defs.h @@ -86,7 +86,7 @@ enum openair_SYNCH_STATUS { #define DAQ_AGC_OFF 0 - +/* typedef struct { boolean_t is_eNB; uint8_t mode; @@ -133,6 +133,7 @@ typedef struct { uint32_t get_frame_done; uint32_t use_ia_receiver; } OPENAIR_DAQ_VARS; +*/ #ifndef USER_MODE int32_t openair_sched_init(void); diff --git a/openair1/SCHED/extern.h b/openair1/SCHED/extern.h index dd3892a290..657037b823 100644 --- a/openair1/SCHED/extern.h +++ b/openair1/SCHED/extern.h @@ -75,7 +75,6 @@ extern int openair_sched_status; extern int synch_wait_cnt; -extern OPENAIR_DAQ_VARS openair_daq_vars; extern int16_t hundred_times_delta_TF[100]; extern uint16_t hundred_times_log10_NPRB[100]; diff --git a/openair1/SCHED/phy_mac_stub.c b/openair1/SCHED/phy_mac_stub.c index 286b11b4ad..ea6e45e739 100644 --- a/openair1/SCHED/phy_mac_stub.c +++ b/openair1/SCHED/phy_mac_stub.c @@ -234,7 +234,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; @@ -253,7 +253,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = 1; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t)); @@ -265,7 +265,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; - ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; //((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->rv = 0; @@ -284,7 +284,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = 1; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t)); @@ -301,7 +301,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0; @@ -320,7 +320,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = 1; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_10MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_10MHz_TDD_t)); @@ -332,7 +332,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; - ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; //((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->rv = 0; @@ -351,7 +351,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = 1; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_10MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_10MHz_TDD_t)); @@ -367,7 +367,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; @@ -386,7 +386,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = 1; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t)); @@ -398,7 +398,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; - ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; //((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->rv = 0; @@ -417,7 +417,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; //((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->ndi = 1; ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_20MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t)); @@ -438,14 +438,14 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->tpmi = 0; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rv1 = 0; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi1 = phy_vars_eNB->proc[sched_subframe].frame_tx&1; - ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs1 = openair_daq_vars.target_ue_dl_mcs; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs1 = phy_vars_eNB->target_ue_dl_mcs; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rv2 = 0; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi2 = phy_vars_eNB->proc[sched_subframe].frame_tx&1; - ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs2 = openair_daq_vars.target_ue_dl_mcs; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs2 = phy_vars_eNB->target_ue_dl_mcs; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->tb_swap = 0; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->TPC = 0; - ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rballoc = openair_daq_vars.ue_dl_rb_alloc; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rballoc = phy_vars_eNB->ue_dl_rb_alloc; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rah = 0; } else if (transmission_mode==5) { @@ -462,13 +462,13 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e DLSCH_alloc_pdu1E.ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&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 = phy_vars_eNB->target_ue_dl_mcs; //DLSCH_alloc_pdu1E.mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); phy_vars_eNB->eNB_UE_stats[0].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs; DLSCH_alloc_pdu1E.harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; DLSCH_alloc_pdu1E.dai = 0; DLSCH_alloc_pdu1E.TPC = 0; - DLSCH_alloc_pdu1E.rballoc = openair_daq_vars.ue_dl_rb_alloc; + DLSCH_alloc_pdu1E.rballoc = phy_vars_eNB->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)); @@ -479,7 +479,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e 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 = phy_vars_eNB->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->proc[sched_subframe].frame_tx%1024)/3)%28); @@ -531,8 +531,8 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e UL_alloc_pdu.type = 0; UL_alloc_pdu.hopping = 0; - UL_alloc_pdu.rballoc = computeRIV(25,2,openair_daq_vars.ue_ul_nb_rb); - UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs; + UL_alloc_pdu.rballoc = computeRIV(25,2,phy_vars_eNB->ue_ul_nb_rb); + UL_alloc_pdu.mcs = phy_vars_eNB->target_ue_ul_mcs; UL_alloc_pdu.ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; UL_alloc_pdu.TPC = 0; UL_alloc_pdu.cshift = 0; @@ -551,10 +551,10 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e UL_alloc_pdu.type = 0; UL_alloc_pdu.hopping = 0; if (cooperation_flag==0) - UL_alloc_pdu.rballoc = computeRIV(25,2+openair_daq_vars.ue_ul_nb_rb,openair_daq_vars.ue_ul_nb_rb); + UL_alloc_pdu.rballoc = computeRIV(25,2+phy_vars_eNB->ue_ul_nb_rb,phy_vars_eNB->ue_ul_nb_rb); else - UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb); - UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs; + UL_alloc_pdu.rballoc = computeRIV(25,0,phy_vars_eNB->ue_ul_nb_rb); + UL_alloc_pdu.mcs = phy_vars_eNB->target_ue_ul_mcs; UL_alloc_pdu.ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; UL_alloc_pdu.TPC = 0; if ((cooperation_flag==0) || (cooperation_flag==1)) @@ -611,11 +611,11 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eN 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.rballoc = phy_vars_eNB->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.mcs = phy_vars_eNB->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)); @@ -632,7 +632,7 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eN 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.mcs = phy_vars_eNB->target_ue_dl_mcs; 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)); @@ -649,11 +649,11 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eN 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.mcs = phy_vars_eNB->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.rballoc = phy_vars_eNB->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)); @@ -705,8 +705,8 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eN UL_alloc_pdu.type = 0; UL_alloc_pdu.hopping = 0; - UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb); - UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs; + UL_alloc_pdu.rballoc = computeRIV(25,0,phy_vars_eNB->ue_ul_nb_rb); + UL_alloc_pdu.mcs = phy_vars_eNB->target_ue_ul_mcs; UL_alloc_pdu.ndi = 1; UL_alloc_pdu.TPC = 0; UL_alloc_pdu.cshift = 0; @@ -725,10 +725,10 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eN UL_alloc_pdu.type = 0; UL_alloc_pdu.hopping = 0; if (cooperation_flag==0) - UL_alloc_pdu.rballoc = computeRIV(25,2+openair_daq_vars.ue_ul_nb_rb,openair_daq_vars.ue_ul_nb_rb); + UL_alloc_pdu.rballoc = computeRIV(25,2+phy_vars_eNB->ue_ul_nb_rb,phy_vars_eNB->ue_ul_nb_rb); else - UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb); - UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs; + UL_alloc_pdu.rballoc = computeRIV(25,0,phy_vars_eNB->ue_ul_nb_rb); + UL_alloc_pdu.mcs = phy_vars_eNB->target_ue_ul_mcs; UL_alloc_pdu.ndi = 1; UL_alloc_pdu.TPC = 0; if ((cooperation_flag==0) || (cooperation_flag==1)) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 6a785ebf33..b0a94b8f59 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -90,7 +90,7 @@ int max_sync_pos; fifo_dump_emos_eNB emos_dump_eNB; #endif -#if defined(SMBV) && !defined(EXMIMO) +#if defined(SMBV) extern const char smbv_fname[]; extern unsigned short config_frames[4]; extern uint8_t smbv_frame_cnt; @@ -211,7 +211,7 @@ int mac_phy_remove_ue(module_id_t Mod_idP,rnti_t rntiP) { #ifdef DEBUG_PHY_PROC LOG_I(PHY,"eNB %d removing UE %d with rnti %x\n",phy_vars_eNB->Mod_id,i,rnti); #endif - //msg("[PHY] UE_id %d\n",i); + //LOG_D(PHY,("[PHY] UE_id %d\n",i); clean_eNb_dlsch(phy_vars_eNB->dlsch_eNB[i][0]); clean_eNb_ulsch(phy_vars_eNB->ulsch_eNB[i]); //phy_vars_eNB->eNB_UE_stats[i].crnti = 0; @@ -562,640 +562,846 @@ void phy_eNB_lte_check_measurement_thresholds(instance_t instanceP, ral_threshol unsigned int taus(void); -void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag, - relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn) -{ - UNUSED(phy_vars_rn); - uint8_t *pbch_pdu=&phy_vars_eNB->pbch_pdu[0]; - uint16_t input_buffer_length, re_allocated=0; - uint32_t i,aa; - uint8_t harq_pid; - DCI_PDU *DCI_pdu; - uint8_t *DLSCH_pdu=NULL; - DCI_PDU DCI_pdu_tmp; - uint8_t DLSCH_pdu_tmp[768*8]; - int8_t UE_id; - uint8_t num_pdcch_symbols=0; - uint8_t ul_subframe; - uint32_t ul_frame; +void pmch_procedures(PHY_VARS_eNB *eNB,PHY_VARS_RN *rn, int subframe,int sched_subframe,int abstraction_flag,relaying_type_t r_type) { + #ifdef Rel10 MCH_PDU *mch_pduP; MCH_PDU mch_pdu; // uint8_t sync_area=255; #endif -#if defined(SMBV) && !defined(EXMIMO) - // counts number of allocations in subframe - // there is at least one allocation for PDCCH - uint8_t smbv_alloc_cnt = 1; -#endif - int frame = phy_vars_eNB->proc[sched_subframe].frame_tx; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_tx; - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX,1); - start_meas(&phy_vars_eNB->phy_proc_tx); - - for (i=0; i<NUMBER_OF_UE_MAX; i++) { - // 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 == ULSCH_max_consecutive_errors) { - LOG_W(PHY,"[eNB %d, CC %d] frame %d, subframe %d, UE %d: ULSCH consecutive error count reached %u, triggering UL Failure\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->CC_id,frame,subframe, i, phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors); - phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors=0; - mac_xface->UL_failure_indication(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - frame, - phy_vars_eNB->eNB_UE_stats[i].crnti, - subframe); - - } - - - } - - - // Get scheduling info for next subframe - if (phy_vars_eNB->mac_enabled==1) { - if (phy_vars_eNB->CC_id == 0) { - mac_xface->eNB_dlsch_ulsch_scheduler(phy_vars_eNB->Mod_id,0,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);//,1); - } - } if (abstraction_flag==0) { - // clear the transmit data array for the current subframe - for (aa=0; aa<phy_vars_eNB->lte_frame_parms.nb_antennas_tx_eNB; aa++) { - - memset(&phy_vars_eNB->lte_eNB_common_vars.txdataF[0][aa][subframe*phy_vars_eNB->lte_frame_parms.ofdm_symbol_size*(phy_vars_eNB->lte_frame_parms.symbols_per_tti)], - 0,phy_vars_eNB->lte_frame_parms.ofdm_symbol_size*(phy_vars_eNB->lte_frame_parms.symbols_per_tti)*sizeof(int32_t)); - } + // This is DL-Cell spec pilots in Control region + generate_pilots_slot(eNB, + eNB->lte_eNB_common_vars.txdataF[0], + AMP, + subframe<<1,1); } - - - if (is_pmch_subframe(phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,&phy_vars_eNB->lte_frame_parms)) { - - if (abstraction_flag==0) { - // This is DL-Cell spec pilots in Control region - generate_pilots_slot(phy_vars_eNB, - phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - subframe<<1,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->CC_id, - phy_vars_eNB->proc[sched_subframe].frame_tx, - subframe); - - 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 - LOG_I(PHY,"[eNB%"PRIu8"] Frame %d subframe %d : Got MCH pdu for MBSFN (MCS %"PRIu8", TBS %d) \n", - phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,mch_pduP->mcs, - phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->TBS>>3); - else { - LOG_D(PHY,"[DeNB %"PRIu8"] Frame %d subframe %d : Do not transmit MCH pdu for MBSFN sync area %"PRIu8" (%s)\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,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)) { - LOG_I(PHY,"[RN %"PRIu8"] Frame %d subframe %d: Got the MCH PDU for MBSFN sync area %"PRIu8" (MCS %"PRIu8", TBS %"PRIu16")\n", - phy_vars_rn->Mod_id,phy_vars_rn->frame, subframe, - mch_pduP->sync_area,mch_pduP->mcs,mch_pduP->Pdu_size); - } else if (phy_vars_rn->mch_avtive[subframe%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[subframe%5]->harq_processes[0]->b, - phy_vars_rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->TBS>>3); - mch_pduP->Pdu_size = (uint16_t) (phy_vars_rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->TBS>>3); - mch_pduP->mcs = phy_vars_rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->mcs; - LOG_I(PHY,"[RN %"PRIu8"] Frame %d subframe %d: Forward the MCH PDU for MBSFN received on SF %d sync area %"PRIu8" (MCS %"PRIu8", TBS %"PRIu16")\n", - phy_vars_rn->Mod_id,phy_vars_rn->frame, subframe,subframe%5, - phy_vars_rn->sync_area[subframe%5],mch_pduP->mcs,mch_pduP->Pdu_size); - } else { - mch_pduP=NULL; - } - - phy_vars_rn->mch_avtive[subframe]=0; - break; - - default: - LOG_W(PHY,"[eNB %"PRIu8"] Frame %d subframe %d: unknown relaying type %d \n", - phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,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,sched_subframe,(uint8_t*)mch_pduP->payload,abstraction_flag); -#ifdef DEBUG_PHY - - for (i=0; i<mch_pduP->Pdu_size; i++) - msg("%2"PRIx8".",(uint8_t)mch_pduP->payload[i]); - - msg("\n"); -#endif + // 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(eNB->Mod_id, + eNB->CC_id, + eNB->proc[sched_subframe].frame_tx, + subframe); + + 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 + LOG_I(PHY,"[eNB%"PRIu8"] Frame %d subframe %d : Got MCH pdu for MBSFN (MCS %"PRIu8", TBS %d) \n", + eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,subframe,mch_pduP->mcs, + eNB->dlsch_eNB_MCH->harq_processes[0]->TBS>>3); + else { + LOG_D(PHY,"[DeNB %"PRIu8"] Frame %d subframe %d : Do not transmit MCH pdu for MBSFN sync area %"PRIu8" (%s)\n", + eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,subframe,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)) { + LOG_I(PHY,"[RN %"PRIu8"] Frame %d subframe %d: Got the MCH PDU for MBSFN sync area %"PRIu8" (MCS %"PRIu8", TBS %"PRIu16")\n", + rn->Mod_id,rn->frame, subframe, + mch_pduP->sync_area,mch_pduP->mcs,mch_pduP->Pdu_size); + } else if (rn->mch_avtive[subframe%5] == 1) { // SF2 -> SF7, SF3 -> SF8 + mch_pduP= &mch_pdu; + memcpy(&mch_pduP->payload, // could be a simple copy + rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->b, + rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->TBS>>3); + mch_pduP->Pdu_size = (uint16_t) (rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->TBS>>3); + mch_pduP->mcs = rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->mcs; + LOG_I(PHY,"[RN %"PRIu8"] Frame %d subframe %d: Forward the MCH PDU for MBSFN received on SF %d sync area %"PRIu8" (MCS %"PRIu8", TBS %"PRIu16")\n", + rn->Mod_id,rn->frame, subframe,subframe%5, + rn->sync_area[subframe%5],mch_pduP->mcs,mch_pduP->Pdu_size); } else { - LOG_D(PHY,"[eNB/RN] Frame %d subframe %d: MCH not generated \n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe); + mch_pduP=NULL; } - -#endif + + rn->mch_avtive[subframe]=0; + break; + + default: + LOG_W(PHY,"[eNB %"PRIu8"] Frame %d subframe %d: unknown relaying type %d \n", + eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,subframe,r_type); + mch_pduP=NULL; + break; + }// switch + + if (mch_pduP) { + fill_eNB_dlsch_MCH(eNB,mch_pduP->mcs,1,0, abstraction_flag); + // Generate PMCH + generate_mch(eNB,sched_subframe,(uint8_t*)mch_pduP->payload,abstraction_flag); + } else { + LOG_D(PHY,"[eNB/RN] Frame %d subframe %d: MCH not generated \n",eNB->proc[sched_subframe].frame_tx,subframe); } + +#endif +} - else { - // this is not a pmch subframe +void common_signal_procedures (int subframe,int sched_subframe,PHY_VARS_eNB *eNB,int abstraction_flag) { - if (abstraction_flag==0) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,1); - generate_pilots_slot(phy_vars_eNB, - phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - subframe<<1,0); - if (subframe_select(&phy_vars_eNB->lte_frame_parms,subframe) == SF_DL) - generate_pilots_slot(phy_vars_eNB, - phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - (subframe<<1)+1,0); - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,0); - - // First half of PSS/SSS (FDD) - if (subframe == 0) { - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { - generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - &phy_vars_eNB->lte_frame_parms, - (phy_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 6 : 5, - 0); - generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - &phy_vars_eNB->lte_frame_parms, - (phy_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 5 : 4, - 0); + LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; + int **txdataF = eNB->lte_eNB_common_vars.txdataF[0]; + uint8_t *pbch_pdu=&eNB->pbch_pdu[0]; - } - } - } - } + // generate Cell-Specific Reference Signals for both slots + if (abstraction_flag==0) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,1); + generate_pilots_slot(eNB, + txdataF, + AMP, + subframe<<1,0); + // check that 2nd slot is for DL + if (subframe_select(fp,subframe) == SF_DL) + generate_pilots_slot(eNB, + txdataF, + AMP, + (subframe<<1)+1,0); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,0); + } + // First half of PSS/SSS (FDD, slot 0) if (subframe == 0) { + if ((fp->frame_type == FDD) && + (abstraction_flag==0)) { + generate_pss(txdataF, + AMP, + fp, + (fp->Ncp==NORMAL) ? 6 : 5, + 0); + generate_sss(txdataF, + AMP, + fp, + (fp->Ncp==NORMAL) ? 5 : 4, + 0); + + } + // generate PBCH (Physical Broadcast CHannel) info - if ((phy_vars_eNB->proc[sched_subframe].frame_tx&3) == 0) { + if ((eNB->proc[sched_subframe].frame_tx&3) == 0) { pbch_pdu[2] = 0; - + // FIXME setting pbch_pdu[2] to zero makes the switch statement easier: remove all the or-operators - switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) { + switch (fp->N_RB_DL) { case 6: - pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (0<<5); - break; - + pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (0<<5); + break; + case 15: - pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (1<<5); - break; - + pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (1<<5); + break; + case 25: - pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (2<<5); - break; - + pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (2<<5); + break; + case 50: - pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (3<<5); - break; - + pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (3<<5); + break; + case 75: - pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (4<<5); - break; - + pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (4<<5); + break; + case 100: - pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (5<<5); - break; - + pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (5<<5); + break; + default: - // FIXME if we get here, this should be flagged as an error, right? - pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (2<<5); - break; + // FIXME if we get here, this should be flagged as an error, right? + pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (2<<5); + break; } - + pbch_pdu[2] = (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) { + ((fp->phich_config_common.phich_duration << 4)&0x10); + + switch (fp->phich_config_common.phich_resource) { case oneSixth: - pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (0<<2); - break; - + pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (0<<2); + break; + case half: - pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (1<<2); - break; - + pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (1<<2); + break; + case one: - pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (2<<2); - break; - + pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (2<<2); + break; + case two: - pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (3<<2); - break; - + pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (3<<2); + break; + default: - // unreachable - break; + // unreachable + break; } - - pbch_pdu[2] = (pbch_pdu[2]&0xfc) | ((phy_vars_eNB->proc[sched_subframe].frame_tx>>8)&0x3); - pbch_pdu[1] = phy_vars_eNB->proc[sched_subframe].frame_tx&0xfc; + + pbch_pdu[2] = (pbch_pdu[2]&0xfc) | ((eNB->proc[sched_subframe].frame_tx>>8)&0x3); + pbch_pdu[1] = eNB->proc[sched_subframe].frame_tx&0xfc; pbch_pdu[0] = 0; } + + /// First half of SSS (TDD, slot 1) + + if ((fp->frame_type == TDD)&& + (abstraction_flag==0)){ + generate_sss(txdataF, + AMP, + fp, + (fp->Ncp==NORMAL) ? 6 : 5, + 1); + } - /// First half of SSS (TDD) + /// generate PBCH if (abstraction_flag==0) { + generate_pbch(&eNB->lte_eNB_pbch, + txdataF, + AMP, + fp, + pbch_pdu, + eNB->proc[sched_subframe].frame_tx&3); + } +#ifdef PHY_ABSTRACTION + else { + generate_pbch_emul(eNB,pbch_pdu); + } +#endif - if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) { - generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], + } + else if ((subframe == 1) && + (fp->frame_type == TDD)&& + (abstraction_flag==0)) { + generate_pss(txdataF, + AMP, + fp, + 2, + 2); + } + + // Second half of PSS/SSS (FDD, slot 10) + else if ((subframe == 5) && + (fp->frame_type == FDD) && + (abstraction_flag==0)) { + generate_pss(txdataF, AMP, - &phy_vars_eNB->lte_frame_parms, - (phy_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 6 : 5, - 1); + &eNB->lte_frame_parms, + (fp->Ncp==NORMAL) ? 6 : 5, + 10); + generate_sss(txdataF, + AMP, + &eNB->lte_frame_parms, + (fp->Ncp==NORMAL) ? 5 : 4, + 10); + + } + + // Second-half of SSS (TDD, slot 11) + else if ((subframe == 5) && + (fp->frame_type == TDD) && + (abstraction_flag==0)) { + generate_sss(txdataF, + AMP, + fp, + (fp->Ncp==NORMAL) ? 6 : 5, + 11); + } + + // Second half of PSS (TDD, slot 12) + else if ((subframe == 6) && + (fp->frame_type == TDD) && + (abstraction_flag==0)) { + generate_pss(txdataF, + AMP, + fp, + 2, + 12); + } + +} + +void generate_eNB_dlsch_params(const int frame,const int subframe,int sched_subframe,PHY_VARS_eNB *eNB,DCI_ALLOC_t *dci_alloc,const int UE_id) { + + LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; + + // if we have SI_RNTI, configure dlsch parameters and CCE index + if (dci_alloc->rnti == SI_RNTI) { + LOG_D(PHY,"Generating dlsch params for SI_RNTI\n"); + generate_eNB_dlsch_params_from_dci(frame, + subframe, + &dci_alloc->dci_pdu[0], + dci_alloc->rnti, + dci_alloc->format, + &eNB->dlsch_eNB_SI, + fp, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + eNB->eNB_UE_stats[0].DL_pmi_single); + + + eNB->dlsch_eNB_SI->nCCE[subframe] = dci_alloc->firstCCE; + + LOG_T(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (SI) => %"PRIu8"\n",eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,subframe, + eNB->dlsch_eNB_SI->nCCE[subframe]); + +#if defined(SMBV) + + // configure SI DCI + if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, SI in SF %d DCI %"PRIu32"\n",eNB->proc[sched_subframe].frame_tx,subframe,i); + smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), "SI", dci_alloc, i); + } + +#endif + + + } else if (dci_alloc->ra_flag == 1) { // This is format 1A allocation for RA + // configure dlsch parameters and CCE index + LOG_D(PHY,"Generating dlsch params for RA_RNTI\n"); + generate_eNB_dlsch_params_from_dci(frame, + subframe, + &dci_alloc->dci_pdu[0], + dci_alloc->rnti, + dci_alloc->format, + &eNB->dlsch_eNB_ra, + fp, + eNB->pdsch_config_dedicated, + SI_RNTI, + dci_alloc->rnti, + P_RNTI, + eNB->eNB_UE_stats[0].DL_pmi_single); + + + eNB->dlsch_eNB_ra->nCCE[subframe] = dci_alloc->firstCCE; + + LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (RA) => %"PRIu8"\n",eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,subframe, + eNB->dlsch_eNB_ra->nCCE[subframe]); +#if defined(SMBV) + + // configure RA DCI + if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, RA in SF %d DCI %"PRIu32"\n",eNB->proc[sched_subframe].frame_tx,subframe,i); + smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), "RA", dci_alloc, i); + } + +#endif + + } + + else if ((dci_alloc->format != format0)&& + (dci_alloc->format != format3)&& + (dci_alloc->format != format3A)&& + (dci_alloc->format != format4)){ // this is a normal DLSCH allocation + + + + if (UE_id>=0) { +#if defined(SMBV) + // Configure this user + if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, SF %d (SMBV SF %d) Configuring user %d with RNTI %"PRIu16" in TM%"PRIu8"\n",eNB->proc[sched_subframe].frame_tx,subframe,(smbv_frame_cnt*10) + (subframe),UE_id+1, + dci_alloc->rnti,eNB->transmission_mode[(uint8_t)UE_id]); + smbv_configure_user(smbv_fname,UE_id+1,eNB->transmission_mode[(uint8_t)UE_id],dci_alloc->rnti); + } + +#endif + + LOG_D(PHY,"Generating dlsch params for RNTI %x\n",dci_alloc->rnti); + generate_eNB_dlsch_params_from_dci(frame, + subframe, + &dci_alloc->dci_pdu[0], + dci_alloc->rnti, + dci_alloc->format, + eNB->dlsch_eNB[(uint8_t)UE_id], + fp, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + eNB->eNB_UE_stats[(uint8_t)UE_id].DL_pmi_single); + LOG_D(PHY,"[eNB %"PRIu8"][PDSCH %"PRIx16"/%"PRIu8"] Frame %d subframe %d: Generated dlsch params\n", + eNB->Mod_id,dci_alloc->rnti,eNB->dlsch_eNB[(uint8_t)UE_id][0]->current_harq_pid,eNB->proc[sched_subframe].frame_tx,subframe); + + + eNB->dlsch_eNB[(uint8_t)UE_id][0]->nCCE[subframe] = dci_alloc->firstCCE; + + LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for ue DCI (PDSCH %"PRIx16") => %"PRIu8"/%u\n",eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,subframe, + dci_alloc->rnti,eNB->dlsch_eNB[(uint8_t)UE_id][0]->nCCE[subframe]); + +#if defined(SMBV) + + // configure UE-spec DCI + if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, PDSCH in SF %d DCI %"PRIu32"\n",eNB->proc[sched_subframe].frame_tx,subframe,i); + smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), UE_id+1,dci_alloc, i); } + +#endif + + LOG_D(PHY,"[eNB %"PRIu8"][DCI][PDSCH %"PRIx16"] Frame %d subframe %d UE_id %"PRId8" Generated DCI format %d, aggregation %d\n", + eNB->Mod_id, dci_alloc->rnti, + eNB->proc[sched_subframe].frame_tx, subframe,UE_id, + dci_alloc->format, + 1<<dci_alloc->L); + } else { + LOG_D(PHY,"[eNB %"PRIu8"][PDSCH] Frame %d : No UE_id with corresponding rnti %"PRIx16", dropping DLSCH\n", + eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,dci_alloc->rnti); } + } + +} +void generate_eNB_ulsch_params(const int frame,const int subframe,int sched_subframe,PHY_VARS_eNB *eNB,DCI_ALLOC_t *dci_alloc,const int UE_id) { + int harq_pid; + LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; + + LOG_D(PHY, + "[eNB %"PRIu8"][PUSCH %"PRIu8"] Frame %d subframe %d UL Frame %"PRIu32", UL Subframe %"PRIu8", Generated ULSCH (format0) DCI (rnti %"PRIx16", dci %"PRIx8"), aggregation %d\n", + eNB->Mod_id, + subframe2harq_pid(fp, + pdcch_alloc2ul_frame(fp,eNB->proc[sched_subframe].frame_tx,subframe), + pdcch_alloc2ul_subframe(fp,subframe)), + eNB->proc[sched_subframe].frame_tx, + subframe, + pdcch_alloc2ul_frame(fp,eNB->proc[sched_subframe].frame_tx,subframe), + pdcch_alloc2ul_subframe(fp,subframe), + dci_alloc->rnti, + dci_alloc->dci_pdu[0], + 1<<dci_alloc->L); + + generate_eNB_ulsch_params_from_dci(&dci_alloc->dci_pdu[0], + dci_alloc->rnti, + sched_subframe, + format0, + UE_id, + eNB, + SI_RNTI, + 0, + P_RNTI, + CBA_RNTI, + 0); // do_srs + + LOG_T(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resources for UE spec DCI (PUSCH %"PRIx16") => %d\n", + eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,subframe,dci_alloc->rnti, + dci_alloc->firstCCE); + +#if defined(SMBV) + + // configure UE-spec DCI for UL Grant + if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, SF %d UL DCI %"PRIu32"\n",eNB->proc[sched_subframe].frame_tx,subframe,i); + smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), UE_id+1, &DCI_pdu->dci_alloc[i], i); + } + +#endif + + + // get the hard_pid for this subframe + harq_pid = subframe2harq_pid(fp, + pdcch_alloc2ul_frame(fp,eNB->proc[sched_subframe].frame_tx,subframe), + pdcch_alloc2ul_subframe(fp,subframe)); + + if (harq_pid==255) { // should not happen, log an error and exit, this is a fatal error + LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Bad harq_pid for ULSCH allocation\n",eNB->Mod_id,eNB->proc[sched_subframe].frame_tx); + mac_xface->macphy_exit("FATAL\n"); + } + + if ((dci_alloc->rnti >= CBA_RNTI) && (dci_alloc->rnti < P_RNTI)) + eNB->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag = 1; + else + eNB->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1; + +} +void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t *dlsch1,LTE_eNB_UE_stats *ue_stats,int ra_flag,int subframe,int sched_subframe,int num_pdcch_symbols,int abstraction_flag) { - if (abstraction_flag==0) { + int harq_pid = dlsch->current_harq_pid; + LTE_DL_eNB_HARQ_t *dlsch_harq=dlsch->harq_processes[harq_pid]; + int input_buffer_length = dlsch_harq->TBS/8; + LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; + uint8_t *DLSCH_pdu=NULL; + uint8_t DLSCH_pdu_tmp[768*8]; + uint8_t DLSCH_pdu_rar[256]; + int i; + + LOG_D(PHY, + "[eNB %"PRIu8"][PDSCH %"PRIx16"/%"PRIu8"] Frame %d, subframe %d: Generating PDSCH/DLSCH with input size = %"PRIu16", G %d, nb_rb %"PRIu16", mcs %"PRIu8", pmi_alloc %"PRIx16", rv %"PRIu8" (round %"PRIu8")\n", + eNB->Mod_id, dlsch->rnti,harq_pid, + eNB->proc[sched_subframe].frame_tx, subframe, input_buffer_length, + get_G(fp, + dlsch_harq->nb_rb, + dlsch_harq->rb_alloc, + get_Qm(dlsch_harq->mcs), + dlsch_harq->Nl, + num_pdcch_symbols,eNB->proc[sched_subframe].frame_tx,subframe), + dlsch_harq->nb_rb, + dlsch_harq->mcs, + pmi2hex_2Ar1(dlsch_harq->pmi_alloc), + dlsch_harq->rvidx, + dlsch_harq->round); - generate_pbch(&phy_vars_eNB->lte_eNB_pbch, - phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - &phy_vars_eNB->lte_frame_parms, - pbch_pdu, - phy_vars_eNB->proc[sched_subframe].frame_tx&3); +#if defined(MESSAGE_CHART_GENERATOR_PHY) + MSC_LOG_TX_MESSAGE( + MSC_PHY_ENB,MSC_PHY_UE, + NULL,0, + "%05u:%02u PDSCH/DLSCH input size = %"PRIu16", G %d, nb_rb %"PRIu16", mcs %"PRIu8", pmi_alloc %"PRIx16", rv %"PRIu8" (round %"PRIu8")", + eNB->proc[sched_subframe].frame_tx, subframe, + input_buffer_length, + get_G(fp, + dlsch_harq->nb_rb, + dlsch_harq->rb_alloc, + get_Qm(dlsch_harq->mcs), + dlsch_harq->Nl, + num_pdcch_symbols,eNB->proc[sched_subframe].frame_tx,subframe), + dlsch_harq->nb_rb, + dlsch_harq->mcs, + pmi2hex_2Ar1(dlsch_harq->pmi_alloc), + dlsch_harq->rvidx, + dlsch_harq->round); +#endif + + if (ue_stats) ue_stats->dlsch_sliding_cnt++; + + if (dlsch_harq->round == 0) { + + if (ue_stats) + ue_stats->dlsch_trials[harq_pid][0]++; + + if (eNB->mac_enabled==1) { + if (ra_flag == 0) { + DLSCH_pdu = mac_xface->get_dlsch_sdu(eNB->Mod_id, + eNB->CC_id, + eNB->proc[sched_subframe].frame_tx, + dlsch->rnti, + 0); + } + else { + int16_t crnti = mac_xface->fill_rar(eNB->Mod_id, + eNB->CC_id, + eNB->proc[sched_subframe].frame_tx, + DLSCH_pdu_rar, + fp->N_RB_UL, + input_buffer_length); + DLSCH_pdu = DLSCH_pdu_rar; + + int UE_id; + + if (crnti!=0) + UE_id = add_ue(crnti,eNB); + else + UE_id = -1; + + if (UE_id==-1) { + LOG_W(PHY,"[eNB] Max user count reached.\n"); + mac_xface->cancel_ra_proc(eNB->Mod_id, + eNB->CC_id, + eNB->proc[sched_subframe].frame_tx, + crnti); + } else { + eNB->eNB_UE_stats[(uint32_t)UE_id].mode = RA_RESPONSE; + // Initialize indicator for first SR (to be cleared after ConnectionSetup is acknowledged) + eNB->first_sr[(uint32_t)UE_id] = 1; + + generate_eNB_ulsch_params_from_rar(DLSCH_pdu, + eNB->proc[sched_subframe].frame_tx, + (subframe), + eNB->ulsch_eNB[(uint32_t)UE_id], + fp); + + eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active = 1; + + get_Msg3_alloc(fp, + subframe, + eNB->proc[sched_subframe].frame_tx, + &eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame, + &eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe); + LOG_D(PHY,"[eNB][RAPROC] Frame %d subframe %d, Activated Msg3 demodulation for UE %"PRId8" in frame %"PRIu32", subframe %"PRIu8"\n", + eNB->proc[sched_subframe].frame_tx, + subframe, + UE_id, + eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame, + eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe); + } + if (ue_stats) ue_stats->total_TBS_MAC += dlsch_harq->TBS; + } + } + else { + DLSCH_pdu = DLSCH_pdu_tmp; + + for (i=0; i<input_buffer_length; i++) + DLSCH_pdu[i] = (unsigned char)(taus()&0xff); + } + +#if defined(SMBV) - } + // Configures the data source of allocation (allocation is configured by DCI) + if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, Configuring PDSCH payload in SF %d alloc %"PRIu8"\n",eNB->proc[sched_subframe].frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt); + smbv_configure_datalist_for_user(smbv_fname, find_ue(dlsch->rnti,eNB)+1, DLSCH_pdu, input_buffer_length); + } -#ifdef PHY_ABSTRACTION - else { - generate_pbch_emul(phy_vars_eNB,pbch_pdu); - } +#endif + +#ifdef DEBUG_PHY_PROC +#ifdef DEBUG_DLSCH + LOG_T(PHY,"eNB DLSCH SDU: \n"); + + for (i=0; i<dlsch_harq->TBS>>3; i++) + LOG_T(PHY,"%"PRIx8".",DLSCH_pdu[i]); + + LOG_T(PHY,"\n"); #endif +#endif + } else { + ue_stats->dlsch_trials[harq_pid][dlsch_harq->round]++; +#ifdef DEBUG_PHY_PROC +#ifdef DEBUG_DLSCH + LOG_D(PHY,"[eNB] This DLSCH is a retransmission\n"); +#endif +#endif + } + if (abstraction_flag==0) { - } + LOG_D(PHY,"Generating DLSCH/PDSCH %d\n",ra_flag); + // 36-212 + start_meas(&eNB->dlsch_encoding_stats); + dlsch_encoding(DLSCH_pdu, + fp, + num_pdcch_symbols, + dlsch, + eNB->proc[sched_subframe].frame_tx,subframe, + &eNB->dlsch_rate_matching_stats, + &eNB->dlsch_turbo_encoding_stats, + &eNB->dlsch_interleaving_stats); + stop_meas(&eNB->dlsch_encoding_stats); + // 36-211 + start_meas(&eNB->dlsch_scrambling_stats); + dlsch_scrambling(fp, + 0, + dlsch, + get_G(fp, + dlsch_harq->nb_rb, + dlsch_harq->rb_alloc, + get_Qm(dlsch_harq->mcs), + dlsch_harq->Nl, + num_pdcch_symbols,eNB->proc[sched_subframe].frame_tx,subframe), + 0, + subframe<<1); + stop_meas(&eNB->dlsch_scrambling_stats); + start_meas(&eNB->dlsch_modulation_stats); - if (subframe == 1) { - if (abstraction_flag==0) { + dlsch_modulation(eNB->lte_eNB_common_vars.txdataF[0], + AMP, + subframe, + fp, + num_pdcch_symbols, + dlsch, + dlsch1); + + stop_meas(&eNB->dlsch_modulation_stats); + } - if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) { - generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - &phy_vars_eNB->lte_frame_parms, - 2, - 2); +#ifdef PHY_ABSTRACTION + else { + start_meas(&eNB->dlsch_encoding_stats); + dlsch_encoding_emul(eNB, + DLSCH_pdu, + dlsch); + stop_meas(&eNB->dlsch_encoding_stats); } - } - } - // Second half of PSS/SSS (FDD) - if (subframe == 5) { +#endif + dlsch->active = 0; +} - if (abstraction_flag==0) { +void phy_procedures_eNB_TX(unsigned char sched_subframe, + PHY_VARS_eNB *eNB, + uint8_t abstraction_flag, + relaying_type_t r_type, + PHY_VARS_RN *rn) +{ + UNUSED(rn); + uint16_t input_buffer_length; + uint32_t i,aa; + uint8_t harq_pid; + DCI_PDU *DCI_pdu; + DCI_PDU DCI_pdu_tmp; + int8_t UE_id; + uint8_t num_pdcch_symbols=0; + uint8_t ul_subframe; + uint32_t ul_frame; + LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; + DCI_ALLOC_t *dci_alloc=(DCI_ALLOC_t *)NULL; - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { - generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - &phy_vars_eNB->lte_frame_parms, - (phy_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 6 : 5, - 10); - generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - &phy_vars_eNB->lte_frame_parms, - (phy_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 5 : 4, - 10); +#if defined(SMBV) + // counts number of allocations in subframe + // there is at least one allocation for PDCCH + uint8_t smbv_alloc_cnt = 1; +#endif + int frame = eNB->proc[sched_subframe].frame_tx; + int subframe = eNB->proc[sched_subframe].subframe_tx; - } - } - } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX,1); + start_meas(&eNB->phy_proc_tx); - // Second-half of SSS (TDD) - if (subframe == 5) { - if (abstraction_flag==0) { + for (i=0; i<NUMBER_OF_UE_MAX; i++) { + // If we've dropped the UE, go back to PRACH mode for this UE - if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) { - generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - &phy_vars_eNB->lte_frame_parms, - (phy_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 6 : 5, - 11); - } + if (eNB->eNB_UE_stats[i].ulsch_consecutive_errors == ULSCH_max_consecutive_errors) { + LOG_W(PHY,"[eNB %d, CC %d] frame %d, subframe %d, UE %d: ULSCH consecutive error count reached %u, triggering UL Failure\n", + eNB->Mod_id,eNB->CC_id,frame,subframe, i, eNB->eNB_UE_stats[i].ulsch_consecutive_errors); + eNB->eNB_UE_stats[i].ulsch_consecutive_errors=0; + mac_xface->UL_failure_indication(eNB->Mod_id, + eNB->CC_id, + frame, + eNB->eNB_UE_stats[i].crnti, + subframe); + } - } + - // Second half of PSS (TDD) - if (subframe == 6) { + } - if (abstraction_flag==0) { - if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) { - generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - &phy_vars_eNB->lte_frame_parms, - 2, - 12); - } +// Get scheduling info for next subframe +// This is called only for the CC_id = 0 and triggers scheduling for all CC_id's + if (eNB->mac_enabled==1) { + if (eNB->CC_id == 0) { + mac_xface->eNB_dlsch_ulsch_scheduler(eNB->Mod_id,0,eNB->proc[sched_subframe].frame_tx,subframe);//,1); } } +// clear the transmit data array for the current subframe + if (abstraction_flag==0) { + for (aa=0; aa<fp->nb_antennas_tx_eNB; aa++) { + memset(&eNB->lte_eNB_common_vars.txdataF[0][aa][subframe*fp->ofdm_symbol_size*(fp->symbols_per_tti)], + 0,fp->ofdm_symbol_size*(fp->symbols_per_tti)*sizeof(int32_t)); + } + } + if (is_pmch_subframe(eNB->proc[sched_subframe].frame_tx,subframe,fp)) { + pmch_procedures(eNB,rn,subframe,sched_subframe,abstraction_flag,r_type); + } + else { + // this is not a pmch subframe, so generate PSS/SSS/PBCH + common_signal_procedures(subframe,sched_subframe,eNB,abstraction_flag); + } -#if defined(SMBV) && !defined(EXMIMO) +#if defined(SMBV) // PBCH takes one allocation - if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { + if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { if (subframe==0) smbv_alloc_cnt++; } #endif - if (phy_vars_eNB->mac_enabled==1) { + if (eNB->mac_enabled==1) { // 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->CC_id, - phy_vars_eNB->proc[sched_subframe].frame_tx, + DCI_pdu = mac_xface->get_dci_sdu(eNB->Mod_id, + eNB->CC_id, + eNB->proc[sched_subframe].frame_tx, subframe); } else { DCI_pdu = &DCI_pdu_tmp; #ifdef EMOS_CHANNEL - fill_dci_emos(DCI_pdu,sched_subframe,phy_vars_eNB); + fill_dci_emos(DCI_pdu,sched_subframe,eNB); #else - fill_dci(DCI_pdu,sched_subframe,phy_vars_eNB); + fill_dci(DCI_pdu,sched_subframe,eNB); #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,subframe); - ul_frame = pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe); + ul_subframe = pdcch_alloc2ul_subframe(fp,subframe); + ul_frame = pdcch_alloc2ul_frame(fp,eNB->proc[sched_subframe].frame_tx,subframe); - if ((subframe_select(&phy_vars_eNB->lte_frame_parms,ul_subframe)==SF_UL) || - (phy_vars_eNB->lte_frame_parms.frame_type == FDD)) { - harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms,ul_frame,ul_subframe); + if ((subframe_select(fp,ul_subframe)==SF_UL) || + (fp->frame_type == FDD)) { + harq_pid = subframe2harq_pid(fp,ul_frame,ul_subframe); + // clear DCI allocation maps for new 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; + if (eNB->ulsch_eNB[i]) { + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->dci_alloc=0; + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rar_alloc=0; } } // 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[subframe] = 0; + eNB->dlsch_eNB[i][0]->subframe_tx[subframe] = 0; } num_pdcch_symbols = DCI_pdu->num_pdcch_symbols; - - LOG_D(PHY,"num_pdcch_symbols %"PRIu8", nCCE %u (dci commond %"PRIu8", dci uespec %"PRIu8"\n",num_pdcch_symbols,DCI_pdu->nCCE, + LOG_D(PHY,"num_pdcch_symbols %"PRIu8", (dci commond %"PRIu8", dci uespec %"PRIu8"\n",num_pdcch_symbols, DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci); -#if defined(SMBV) && !defined(EXMIMO) - +#if defined(SMBV) // Sets up PDCCH and DCI table - if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (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->proc[sched_subframe].frame_tx,subframe,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci); - dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[0]); + if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4) && ((DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci)>0)) { + LOG_D(PHY,"[SMBV] Frame %3d, SF %d PDCCH, number of DCIs %d\n",eNB->proc[sched_subframe].frame_tx,subframe,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci); + dump_dci(fp,&DCI_pdu->dci_alloc[0]); smbv_configure_pdcch(smbv_fname,(smbv_frame_cnt*10) + (subframe),num_pdcch_symbols,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci); } - #endif - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,DCI_pdu->num_pdcch_symbols); + // loop over all DCIs for this subframe to generate DLSCH allocations for (i=0; i<DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci ; i++) { LOG_D(PHY,"[eNB] Subframe %d: DCI %d/%d : rnti %x, CCEind %d\n",subframe,i,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci,DCI_pdu->dci_alloc[i].rnti,DCI_pdu->dci_alloc[i].firstCCE); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,DCI_pdu->dci_alloc[i].rnti); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,DCI_pdu->dci_alloc[i].format); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,DCI_pdu->dci_alloc[i].firstCCE); + dci_alloc = &DCI_pdu->dci_alloc[i]; - if (DCI_pdu->dci_alloc[i].rnti == SI_RNTI) { - - generate_eNB_dlsch_params_from_dci(frame, - subframe, - &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); - - - phy_vars_eNB->dlsch_eNB_SI->nCCE[subframe] = DCI_pdu->dci_alloc[i].firstCCE; - - LOG_T(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (SI) => %"PRIu8"/%u\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe, - phy_vars_eNB->dlsch_eNB_SI->nCCE[subframe],DCI_pdu->nCCE); - -#if defined(SMBV) && !defined(EXMIMO) - - // configure SI DCI - if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, SI in SF %d DCI %"PRIu32"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,i); - smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), "SI", &DCI_pdu->dci_alloc[i], i); - } - -#endif - - - } else if (DCI_pdu->dci_alloc[i].ra_flag == 1) { - - generate_eNB_dlsch_params_from_dci(frame, - subframe, - &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); - - - phy_vars_eNB->dlsch_eNB_ra->nCCE[subframe] = DCI_pdu->dci_alloc[i].firstCCE; - - LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (RA) => %"PRIu8"/%u\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe, - phy_vars_eNB->dlsch_eNB_ra->nCCE[subframe],DCI_pdu->nCCE); -#if defined(SMBV) && !defined(EXMIMO) - - // configure RA DCI - if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, RA in SF %d DCI %"PRIu32"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,i); - smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), "RA", &DCI_pdu->dci_alloc[i], i); - } - -#endif - - } - - else if (DCI_pdu->dci_alloc[i].format != format0) { // this is a normal DLSCH allocation - - if (phy_vars_eNB->mac_enabled==1) - UE_id = find_ue((int16_t)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB); + if ((dci_alloc->rnti<= P_RNTI) && + (dci_alloc->ra_flag!=1)) { + if (eNB->mac_enabled==1) + UE_id = find_ue((int16_t)dci_alloc->rnti,eNB); else UE_id = i; - - if (UE_id>=0) { - if ((frame%100)==0) { - LOG_D(PHY,"Frame %3d, SF %d \n",frame,subframe); - 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->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, SF %d (SMBV SF %d) Configuring user %d with RNTI %"PRIu16" in TM%"PRIu8"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,(smbv_frame_cnt*10) + (subframe),UE_id+1, - DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->transmission_mode[(uint8_t)UE_id]); - smbv_configure_user(smbv_fname,UE_id+1,phy_vars_eNB->transmission_mode[(uint8_t)UE_id],DCI_pdu->dci_alloc[i].rnti); - } - -#endif - - generate_eNB_dlsch_params_from_dci(frame, - subframe, - &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[(uint8_t)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[(uint8_t)UE_id].DL_pmi_single); - LOG_D(PHY,"[eNB %"PRIu8"][PDSCH %"PRIx16"/%"PRIu8"] Frame %d subframe %d: Generated dlsch params\n", - phy_vars_eNB->Mod_id,DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->current_harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe); - - - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->nCCE[subframe] = DCI_pdu->dci_alloc[i].firstCCE; - - LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for ue DCI (PDSCH %"PRIx16") => %"PRIu8"/%u\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe, - DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->nCCE[subframe],DCI_pdu->nCCE); - -#if defined(SMBV) && !defined(EXMIMO) - - // configure UE-spec DCI - if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, PDSCH in SF %d DCI %"PRIu32"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,i); - smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), UE_id+1, &DCI_pdu->dci_alloc[i], i); - } - -#endif - - LOG_D(PHY,"[eNB %"PRIu8"][DCI][PDSCH %"PRIx16"] Frame %d subframe %d UE_id %"PRId8" Generated DCI format %d, aggregation %d\n", - phy_vars_eNB->Mod_id, DCI_pdu->dci_alloc[i].rnti, - phy_vars_eNB->proc[sched_subframe].frame_tx, subframe,UE_id, - DCI_pdu->dci_alloc[i].format, - 1<<DCI_pdu->dci_alloc[i].L); - } else { - LOG_D(PHY,"[eNB %"PRIu8"][PDSCH] Frame %d : No UE_id with corresponding rnti %"PRIx16", dropping DLSCH\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,DCI_pdu->dci_alloc[i].rnti); - } } + else UE_id=0; + + generate_eNB_dlsch_params(frame,subframe,sched_subframe,eNB,dci_alloc,UE_id); } VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,(frame*10)+subframe); // Apply physicalConfigDedicated if needed - phy_config_dedicated_eNB_step2(phy_vars_eNB); - + // This is for UEs that have received this IE, which changes these DL and UL configuration, we apply after a delay for the eNodeB UL parameters + phy_config_dedicated_eNB_step2(eNB); + + // Now loop again over the DCIs for UL configuration 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->proc[sched_subframe].frame_tx,subframe), - pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,subframe)); - - if (harq_pid==255) { - LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Bad harq_pid for ULSCH allocation\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx); - return; - } - - if (phy_vars_eNB->mac_enabled==1) - UE_id = find_ue((int16_t)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB); + if (dci_alloc->format == format0) { // this is a ULSCH allocation + if (eNB->mac_enabled==1) + UE_id = find_ue((int16_t)dci_alloc->rnti,eNB); else UE_id = i; - - if (UE_id<0) { - LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Unknown UE_id for rnti %"PRIx16"\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,DCI_pdu->dci_alloc[i].rnti); - mac_exit_wrapper("Invalid UE id (< 0) detected"); - return; // not reached - } - - LOG_D(PHY, - "[eNB %"PRIu8"][PUSCH %"PRIu8"] Frame %d subframe %d UL Frame %"PRIu32", UL Subframe %"PRIu8", Generated ULSCH (format0) DCI (rnti %"PRIx16", dci %"PRIx8") (DCI pos %"PRIu32"/%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,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe), - pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,subframe)), - phy_vars_eNB->proc[sched_subframe].frame_tx, - subframe, - pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe), - pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,subframe), - DCI_pdu->dci_alloc[i].rnti, - 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); - - generate_eNB_ulsch_params_from_dci(&DCI_pdu->dci_alloc[i].dci_pdu[0], - DCI_pdu->dci_alloc[i].rnti, - sched_subframe, - format0, - UE_id, - phy_vars_eNB, - SI_RNTI, - 0, - P_RNTI, - CBA_RNTI, - 0); // do_srs - - LOG_T(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resources for UE spec DCI (PUSCH %"PRIx16") => %d/%u\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,DCI_pdu->dci_alloc[i].rnti, - DCI_pdu->dci_alloc[i].firstCCE,DCI_pdu->nCCE); -#if defined(SMBV) && !defined(EXMIMO) - - // configure UE-spec DCI for UL Grant - if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, SF %d UL DCI %"PRIu32"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,i); - smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), UE_id+1, &DCI_pdu->dci_alloc[i], i); + if (UE_id<0) { // should not happen, log an error and exit, this is a fatal error + LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Unknown UE_id for rnti %"PRIx16"\n",eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,dci_alloc->rnti); + mac_xface->macphy_exit("FATAL\n"); } - -#endif - - - - if ((DCI_pdu->dci_alloc[i].rnti >= CBA_RNTI) && (DCI_pdu->dci_alloc[i].rnti < P_RNTI)) - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag = 1; - else - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1; - + generate_eNB_ulsch_params(frame,subframe,sched_subframe,eNB,dci_alloc,UE_id); } } @@ -1208,14 +1414,14 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e } else { // for emulation!! - phy_vars_eNB->num_ue_spec_dci[(subframe)&1]=0; - phy_vars_eNB->num_common_dci[(subframe)&1]=0; + eNB->num_ue_spec_dci[(subframe)&1]=0; + eNB->num_common_dci[(subframe)&1]=0; } if (abstraction_flag == 0) { if (DCI_pdu->Num_ue_spec_dci+DCI_pdu->Num_common_dci > 0) - LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_top (pdcch) (common %"PRIu8",ue_spec %"PRIu8")\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx, subframe, + LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_top (pdcch) (common %"PRIu8",ue_spec %"PRIu8")\n",eNB->Mod_id,eNB->proc[sched_subframe].frame_tx, subframe, DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci); @@ -1224,16 +1430,16 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e DCI_pdu->dci_alloc, 0, AMP, - &phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->lte_eNB_common_vars.txdataF[0], + fp, + eNB->lte_eNB_common_vars.txdataF[0], subframe); } #ifdef PHY_ABSTRACTION // FIXME this ifdef seems suspicious else { - LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_top_emul\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx, subframe); - 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,subframe); + LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_to_emul\n",eNB->Mod_id,eNB->proc[sched_subframe].frame_tx, subframe); + num_pdcch_symbols = generate_dci_top_emul(eNB,DCI_pdu->Num_ue_spec_dci,DCI_pdu->Num_common_dci,DCI_pdu->dci_alloc,subframe); } #endif @@ -1242,361 +1448,65 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e // 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 (eNB->dlsch_eNB_SI->active == 1) { - if (phy_vars_eNB->mac_enabled==1) { - DLSCH_pdu = mac_xface->get_dlsch_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - phy_vars_eNB->proc[sched_subframe].frame_tx, - SI_RNTI, - 0); - } - else { - DLSCH_pdu = DLSCH_pdu_tmp; - - for (i=0; i<input_buffer_length; i++) - DLSCH_pdu[i] = (unsigned char)(taus()&0xff); - } + pdsch_procedures(eNB,eNB->dlsch_eNB_SI,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,0,subframe,sched_subframe,num_pdcch_symbols,abstraction_flag); -#if defined(SMBV) && !defined(EXMIMO) +#if defined(SMBV) // Configures the data source of allocation (allocation is configured by DCI) - if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, Configuring SI payload in SF %d alloc %"PRIu8"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt); + if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, Configuring SI payload in SF %d alloc %"PRIu8"\n",eNB->proc[sched_subframe].frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt); smbv_configure_datalist_for_alloc(smbv_fname, smbv_alloc_cnt++, (smbv_frame_cnt*10) + (subframe), DLSCH_pdu, input_buffer_length); } #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->proc[sched_subframe].frame_tx,subframe, - &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->harq_processes[0]->nb_rb, - phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->rb_alloc, - get_Qm(phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->mcs), - 1, - num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe), - 0, - subframe<<1); - - stop_meas(&phy_vars_eNB->dlsch_scrambling_stats); - - start_meas(&phy_vars_eNB->dlsch_modulation_stats); - - re_allocated = dlsch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - subframe, - &phy_vars_eNB->lte_frame_parms, - num_pdcch_symbols, - phy_vars_eNB->dlsch_eNB_SI, - (LTE_eNB_DLSCH_t *)NULL); - stop_meas(&phy_vars_eNB->dlsch_modulation_stats); - } - -#ifdef PHY_ABSTRACTION - 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; - } // Check for RA activity - if (phy_vars_eNB->dlsch_eNB_ra->active == 1) { - - input_buffer_length = phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->TBS/8; - - int16_t crnti = mac_xface->fill_rar(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - phy_vars_eNB->proc[sched_subframe].frame_tx, - dlsch_input_buffer, - phy_vars_eNB->lte_frame_parms.N_RB_UL, - input_buffer_length); - if (crnti!=0) - UE_id = add_ue(crnti,phy_vars_eNB); - else - UE_id = -1; - - if (UE_id==-1) { - LOG_W(PHY,"[eNB] Max user count reached.\n"); - mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - phy_vars_eNB->proc[sched_subframe].frame_tx, - crnti); - } else { - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].mode = RA_RESPONSE; - // Initialize indicator for first SR (to be cleared after ConnectionSetup is acknowledged) - phy_vars_eNB->first_sr[(uint32_t)UE_id] = 1; - - generate_eNB_ulsch_params_from_rar(dlsch_input_buffer, - phy_vars_eNB->proc[sched_subframe].frame_tx, - (subframe), - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id], - &phy_vars_eNB->lte_frame_parms); - - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active = 1; - - get_Msg3_alloc(&phy_vars_eNB->lte_frame_parms, - subframe, - phy_vars_eNB->proc[sched_subframe].frame_tx, - &phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame, - &phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe); - LOG_D(PHY,"[eNB][RAPROC] Frame %d subframe %d, Activated Msg3 demodulation for UE %"PRId8" in frame %"PRIu32", subframe %"PRIu8"\n", - phy_vars_eNB->proc[sched_subframe].frame_tx, - subframe, - UE_id, - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame, - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe); - -#if defined(SMBV) && !defined(EXMIMO) - - // Configures the data source of allocation (allocation is configured by DCI) - if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, Configuring RA payload in SF %d alloc %"PRIu8"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt); - smbv_configure_datalist_for_alloc(smbv_fname, smbv_alloc_cnt++, (smbv_frame_cnt*10) + (subframe), dlsch_input_buffer, input_buffer_length); - } - -#endif - - - LOG_D(PHY,"[eNB %"PRIu8"][RAPROC] Frame %d, subframe %d: Calling generate_dlsch (RA) with input size = %"PRIu16",Msg3 frame %"PRIu32", Msg3 subframe %"PRIu8"\n", - phy_vars_eNB->Mod_id, - phy_vars_eNB->proc[sched_subframe].frame_tx, subframe,input_buffer_length, - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame, - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe); - - - 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->proc[sched_subframe].frame_tx,subframe, - &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->harq_processes[0]->nb_rb, - phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->rb_alloc, - get_Qm(phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->mcs), - 1, - num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe), - 0, - subframe<<1); - - re_allocated = dlsch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - subframe, - &phy_vars_eNB->lte_frame_parms, - num_pdcch_symbols, - phy_vars_eNB->dlsch_eNB_ra, - (LTE_eNB_DLSCH_t *)NULL); - } + if (eNB->dlsch_eNB_ra->active == 1) { -#ifdef PHY_ABSTRACTION - else { - dlsch_encoding_emul(phy_vars_eNB, - dlsch_input_buffer, - phy_vars_eNB->dlsch_eNB_ra); - } +#if defined(SMBV) + // Configures the data source of allocation (allocation is configured by DCI) + if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, Configuring RA payload in SF %d alloc %"PRIu8"\n",eNB->proc[sched_subframe].frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt); + smbv_configure_datalist_for_alloc(smbv_fname, smbv_alloc_cnt++, (smbv_frame_cnt*10) + (subframe), dlsch_input_buffer, input_buffer_length); + } + #endif - LOG_D(PHY,"[eNB %"PRIu8"][RAPROC] Frame %d subframe %d Deactivating DLSCH RA\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->proc[sched_subframe].frame_tx,subframe); - - } //max user count - - phy_vars_eNB->dlsch_eNB_ra->active = 0; + + + LOG_D(PHY,"[eNB %"PRIu8"][RAPROC] Frame %d, subframe %d: Calling generate_dlsch (RA) with input size = %"PRIu16",Msg3 frame %"PRIu32", Msg3 subframe %"PRIu8"\n", + eNB->Mod_id, + eNB->proc[sched_subframe].frame_tx, subframe,input_buffer_length, + eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame, + eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe); + + pdsch_procedures(eNB,eNB->dlsch_eNB_ra,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,1,subframe,sched_subframe,num_pdcch_symbols,abstraction_flag); + + + 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[(uint8_t)UE_id][0])&& - (phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti>0)&& - (phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->active == 1)) { - harq_pid = phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->current_harq_pid; - input_buffer_length = phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->TBS/8; - - - - LOG_D(PHY, - "[eNB %"PRIu8"][PDSCH %"PRIx16"/%"PRIu8"] Frame %d, subframe %d: Generating PDSCH/DLSCH with input size = %"PRIu16", G %d, nb_rb %"PRIu16", mcs %"PRIu8", pmi_alloc %"PRIx16", rv %"PRIu8" (round %"PRIu8")\n", - phy_vars_eNB->Mod_id, phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti,harq_pid, - phy_vars_eNB->proc[sched_subframe].frame_tx, subframe, input_buffer_length, - get_G(&phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->nb_rb, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rb_alloc, - get_Qm(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs), - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->Nl, - num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe), - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->nb_rb, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs, - pmi2hex_2Ar1(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->pmi_alloc), - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rvidx, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->round); - -#if defined(MESSAGE_CHART_GENERATOR_PHY) - MSC_LOG_TX_MESSAGE( - MSC_PHY_ENB,MSC_PHY_UE, - NULL,0, - "%05u:%02u PDSCH/DLSCH input size = %"PRIu16", G %d, nb_rb %"PRIu16", mcs %"PRIu8", pmi_alloc %"PRIx16", rv %"PRIu8" (round %"PRIu8")", - phy_vars_eNB->proc[sched_subframe].frame_tx, subframe, - input_buffer_length, - get_G(&phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->nb_rb, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rb_alloc, - get_Qm(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs), - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->Nl, - num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe), - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->nb_rb, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs, - pmi2hex_2Ar1(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->pmi_alloc), - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rvidx, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->round); -#endif - - phy_vars_eNB->eNB_UE_stats[(uint8_t)UE_id].dlsch_sliding_cnt++; - - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->harq_processes[harq_pid]->round == 0) { - - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].dlsch_trials[harq_pid][0]++; - - if (phy_vars_eNB->mac_enabled==1) { - DLSCH_pdu = mac_xface->get_dlsch_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - phy_vars_eNB->proc[sched_subframe].frame_tx, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti, - 0); - phy_vars_eNB->eNB_UE_stats[UE_id].total_TBS_MAC += phy_vars_eNB->dlsch_eNB[(uint8_t)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); - } - -#if defined(SMBV) && !defined(EXMIMO) - - // Configures the data source of allocation (allocation is configured by DCI) - if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, Configuring PDSCH payload in SF %d alloc %"PRIu8"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,(smbv_frame_cnt*10) + (subframe),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[(uint8_t)UE_id][0]->harq_processes[harq_pid]->TBS>>3; i++) - LOG_T(PHY,"%"PRIx8".",DLSCH_pdu[i]); - - LOG_T(PHY,"\n"); -#endif -#endif - } else { - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].dlsch_trials[harq_pid][phy_vars_eNB->dlsch_eNB[(uint8_t)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 - 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[(uint8_t)UE_id][0], - phy_vars_eNB->proc[sched_subframe].frame_tx,subframe, - &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[(uint8_t)UE_id][0], - get_G(&phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->nb_rb, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rb_alloc, - get_Qm(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs), - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->Nl, - num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe), - 0, - subframe<<1); - stop_meas(&phy_vars_eNB->dlsch_scrambling_stats); - start_meas(&phy_vars_eNB->dlsch_modulation_stats); - - - re_allocated = dlsch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - subframe, - &phy_vars_eNB->lte_frame_parms, - num_pdcch_symbols, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0], - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][1]); + if ((eNB->dlsch_eNB[(uint8_t)UE_id][0])&& + (eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti>0)&& + (eNB->dlsch_eNB[(uint8_t)UE_id][0]->active == 1)) { - stop_meas(&phy_vars_eNB->dlsch_modulation_stats); - } - -#ifdef PHY_ABSTRACTION - else { - start_meas(&phy_vars_eNB->dlsch_encoding_stats); - dlsch_encoding_emul(phy_vars_eNB, - DLSCH_pdu, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]); - stop_meas(&phy_vars_eNB->dlsch_encoding_stats); - } + pdsch_procedures(eNB,eNB->dlsch_eNB[(uint8_t)UE_id][0],eNB->dlsch_eNB[(uint8_t)UE_id][1],&eNB->eNB_UE_stats[(uint32_t)UE_id],0,subframe,sched_subframe,num_pdcch_symbols,abstraction_flag); -#endif - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->active = 0; } - else if ((phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0])&& - (phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti>0)&& - (phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->active == 0)) { + else if ((eNB->dlsch_eNB[(uint8_t)UE_id][0])&& + (eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti>0)&& + (eNB->dlsch_eNB[(uint8_t)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[(uint8_t)UE_id][0]->subframe_tx[subframe]=0; + eNB->dlsch_eNB[(uint8_t)UE_id][0]->subframe_tx[subframe]=0; } } @@ -1604,9 +1514,9 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e // if we have PHICH to generate - if (is_phich_subframe(&phy_vars_eNB->lte_frame_parms,subframe)) + if (is_phich_subframe(fp,subframe)) { - generate_phich_top(phy_vars_eNB, + generate_phich_top(eNB, sched_subframe, AMP, 0, @@ -1616,60 +1526,59 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e #ifdef EMOS - phy_procedures_emos_eNB_TX(subframe, phy_vars_eNB); + phy_procedures_emos_eNB_TX(subframe, eNB); #endif #if !(defined(EXMIMO) || defined(OAI_USRP) || defined (CPRIGW)) if (abstraction_flag==0) { - start_meas(&phy_vars_eNB->ofdm_mod_stats); - do_OFDM_mod(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - phy_vars_eNB->lte_eNB_common_vars.txdata[0], - phy_vars_eNB->proc[sched_subframe].frame_tx,subframe<<1, - &phy_vars_eNB->lte_frame_parms); - do_OFDM_mod(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - phy_vars_eNB->lte_eNB_common_vars.txdata[0], - phy_vars_eNB->proc[sched_subframe].frame_tx,1+(subframe<<1), - &phy_vars_eNB->lte_frame_parms); - stop_meas(&phy_vars_eNB->ofdm_mod_stats); + start_meas(&eNB->ofdm_mod_stats); + do_OFDM_mod(eNB->lte_eNB_common_vars.txdataF[0], + eNB->lte_eNB_common_vars.txdata[0], + eNB->proc[sched_subframe].frame_tx,subframe<<1, + fp); + do_OFDM_mod(eNB->lte_eNB_common_vars.txdataF[0], + eNB->lte_eNB_common_vars.txdata[0], + eNB->proc[sched_subframe].frame_tx,1+(subframe<<1), + fp); + stop_meas(&eNB->ofdm_mod_stats); } #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); + stop_meas(&eNB->phy_proc_tx); - (void)re_allocated; /* remove gcc warning "set but not used" */ } -void process_Msg3(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t UE_id, uint8_t harq_pid) +void process_Msg3(PHY_VARS_eNB *eNB,uint8_t sched_subframe,uint8_t UE_id, uint8_t harq_pid) { // this prepares the demodulation of the first PUSCH of a new user, containing Msg3 - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; - int frame = phy_vars_eNB->proc[sched_subframe].frame_rx; + int subframe = eNB->proc[sched_subframe].subframe_rx; + int frame = eNB->proc[sched_subframe].frame_rx; LOG_D(PHY,"[eNB %d][RAPROC] frame %d : subframe %d : process_Msg3 UE_id %d (active %d, subframe %d, frame %d)\n", - phy_vars_eNB->Mod_id, + eNB->Mod_id, frame,subframe, - UE_id,phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active, - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe, - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame); - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_flag = 0; + UE_id,eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active, + eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe, + eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame); + eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_flag = 0; - if ((phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active == 1) && - (phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe == subframe) && - (phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame == (uint32_t)frame)) { + if ((eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active == 1) && + (eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe == subframe) && + (eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame == (uint32_t)frame)) { // harq_pid = 0; - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active = 0; - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_flag = 1; - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag=1; + eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active = 0; + eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_flag = 1; + eNB->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag=1; LOG_D(PHY,"[eNB %d][RAPROC] frame %d, subframe %d: Setting subframe_scheduling_flag (Msg3) for UE %d\n", - phy_vars_eNB->Mod_id, + eNB->Mod_id, frame,subframe,UE_id); } } @@ -1682,39 +1591,41 @@ void process_Msg3(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t UE_i void process_HARQ_feedback(uint8_t UE_id, uint8_t sched_subframe, - PHY_VARS_eNB *phy_vars_eNB, + PHY_VARS_eNB *eNB, uint8_t pusch_flag, uint8_t *pucch_payload, uint8_t pucch_sel, uint8_t SR_payload) { + LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; uint8_t dl_harq_pid[8],dlsch_ACK[8],dl_subframe; - LTE_eNB_DLSCH_t *dlsch = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]; - LTE_eNB_UE_stats *ue_stats = &phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id]; + LTE_eNB_DLSCH_t *dlsch = eNB->dlsch_eNB[(uint32_t)UE_id][0]; + LTE_eNB_UE_stats *ue_stats = &eNB->eNB_UE_stats[(uint32_t)UE_id]; LTE_DL_eNB_HARQ_t *dlsch_harq_proc; uint8_t subframe_m4,M,m; int mp; int all_ACKed=1,nb_alloc=0,nb_ACK=0; - int frame = phy_vars_eNB->proc[sched_subframe].frame_rx; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; - int harq_pid = subframe2harq_pid( &phy_vars_eNB->lte_frame_parms,frame,subframe); + int frame = eNB->proc[sched_subframe].frame_rx; + int subframe = eNB->proc[sched_subframe].subframe_rx; + int harq_pid = subframe2harq_pid( fp,frame,subframe); - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { //FDD + + if (fp->frame_type == FDD) { //FDD 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[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0]; + dlsch_ACK[0] = eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0]; if (dlsch->subframe_tx[subframe_m4]==1) - LOG_D(PHY,"[eNB %d] Frame %d: Received ACK/NAK %d on PUSCH for subframe %d\n",phy_vars_eNB->Mod_id, + LOG_D(PHY,"[eNB %d] Frame %d: Received ACK/NAK %d on PUSCH for subframe %d\n",eNB->Mod_id, frame,dlsch_ACK[0],subframe_m4); } else { dlsch_ACK[0] = pucch_payload[0]; - LOG_D(PHY,"[eNB %d] Frame %d: Received ACK/NAK %d on PUCCH for subframe %d\n",phy_vars_eNB->Mod_id, + LOG_D(PHY,"[eNB %d] Frame %d: Received ACK/NAK %d on PUCCH for subframe %d\n",eNB->Mod_id, frame,dlsch_ACK[0],subframe_m4); /* if (dlsch_ACK[0]==0) @@ -1738,7 +1649,7 @@ void process_HARQ_feedback(uint8_t UE_id, #endif } else { // TDD Handle M=1,2 cases only - M=ul_ACK_subframe2_M(&phy_vars_eNB->lte_frame_parms, + M=ul_ACK_subframe2_M(fp, subframe); // Now derive ACK information for TDD @@ -1749,10 +1660,9 @@ void process_HARQ_feedback(uint8_t UE_id, // 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[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0]; - dlsch_ACK[1] = (phy_vars_eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode == bundling) - ?phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0]:phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[1]; - // printf("UE %d: ACK %d,%d\n",UE_id,dlsch_ACK[0],dlsch_ACK[1]); + dlsch_ACK[0] = eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0]; + dlsch_ACK[1] = (eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode == bundling) + ?eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0]:eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[1]; } else { // PUCCH ACK/NAK @@ -1773,7 +1683,6 @@ void process_HARQ_feedback(uint8_t UE_id, 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 @@ -1801,7 +1710,7 @@ void process_HARQ_feedback(uint8_t UE_id, nb_alloc = 0; for (m=0; m<M; m++) { - dl_subframe = ul_ACK_subframe2_dl_subframe(&phy_vars_eNB->lte_frame_parms, + dl_subframe = ul_ACK_subframe2_dl_subframe(fp, subframe, m); @@ -1813,14 +1722,12 @@ void process_HARQ_feedback(uint8_t UE_id, all_ACKed = 1; else all_ACKed = 0; - - // 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, + dl_subframe = ul_ACK_subframe2_dl_subframe(fp, subframe, m); @@ -1842,7 +1749,7 @@ void process_HARQ_feedback(uint8_t UE_id, if (dl_harq_pid[m]<dlsch->Mdlharq) { dlsch_harq_proc = dlsch->harq_processes[dl_harq_pid[m]]; #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PDSCH %x/%d] subframe %d, status %d, round %d (mcs %d, rv %d, TBS %d)\n",phy_vars_eNB->Mod_id, + LOG_D(PHY,"[eNB %d][PDSCH %x/%d] subframe %d, status %d, round %d (mcs %d, rv %d, TBS %d)\n",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, @@ -1858,11 +1765,10 @@ void process_HARQ_feedback(uint8_t UE_id, (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_D(PHY,"[eNB %d][PDSCH %x/%d] M = %d, m= %d, mp=%d NAK Received in round %d, requesting retransmission\n",phy_vars_eNB->Mod_id, + LOG_D(PHY,"[eNB %d][PDSCH %x/%d] M = %d, m= %d, mp=%d NAK Received in round %d, requesting retransmission\n",eNB->Mod_id, dlsch->rnti,dl_harq_pid[m],M,m,mp,dlsch_harq_proc->round); #endif @@ -1879,7 +1785,7 @@ void process_HARQ_feedback(uint8_t UE_id, if (dlsch_harq_proc->round == dlsch->Mlimit) { // 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, + LOG_W(PHY,"[eNB %d][PDSCH %x/%d] DLSCH retransmissions exhausted, dropping packet\n",eNB->Mod_id, dlsch->rnti,dl_harq_pid[m]); #endif #if defined(MESSAGE_CHART_GENERATOR_PHY) @@ -1896,7 +1802,7 @@ void process_HARQ_feedback(uint8_t UE_id, } } else { #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PDSCH %x/%d] ACK Received in round %d, resetting process\n",phy_vars_eNB->Mod_id, + LOG_D(PHY,"[eNB %d][PDSCH %x/%d] ACK Received in round %d, resetting process\n",eNB->Mod_id, dlsch->rnti,dl_harq_pid[m],dlsch_harq_proc->round); #endif ue_stats->dlsch_ACK[dl_harq_pid[m]][dlsch_harq_proc->round]++; @@ -1908,10 +1814,10 @@ void process_HARQ_feedback(uint8_t UE_id, dlsch->harq_ids[dl_subframe] = dlsch->Mdlharq; ue_stats->total_TBS = ue_stats->total_TBS + - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS; + eNB->dlsch_eNB[(uint8_t)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[(uint8_t)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS; + eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS; */ } @@ -1954,7 +1860,7 @@ void process_HARQ_feedback(uint8_t UE_id, } } -void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, +void get_n1_pucch_eNB(PHY_VARS_eNB *eNB, uint8_t UE_id, uint8_t sched_subframe, int16_t *n1_pucch0, @@ -1963,18 +1869,17 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, int16_t *n1_pucch3) { - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms=&eNB->lte_frame_parms; uint8_t nCCE0,nCCE1; int sf; - int frame = phy_vars_eNB->proc[sched_subframe].frame_rx; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; + int frame = eNB->proc[sched_subframe].frame_rx; + int subframe = eNB->proc[sched_subframe].subframe_rx; 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[(uint32_t)UE_id][0]->nCCE[sf]); - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[sf]>0) { - *n1_pucch0 = frame_parms->pucch_config_common.n1PUCCH_AN + phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[sf]; + if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[sf]>0) { + *n1_pucch0 = frame_parms->pucch_config_common.n1PUCCH_AN + eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[sf]; *n1_pucch1 = -1; } else { *n1_pucch0 = -1; @@ -1985,15 +1890,15 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, 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[(uint32_t)UE_id][0]->subframe_tx[6]>0) { - nCCE1 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[6]; + /* if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[6]>0) { + nCCE1 = eNB->dlsch_eNB[(uint32_t)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[(uint32_t)UE_id][0]->subframe_tx[5]>0) { - nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[5]; + if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[5]>0) { + nCCE0 = eNB->dlsch_eNB[(uint32_t)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; @@ -2001,8 +1906,8 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, *n1_pucch1 = -1; } else if (subframe == 3) { // ACK subframe 9 - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[9]>0) { - nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[9]; + if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[9]>0) { + nCCE0 = eNB->dlsch_eNB[(uint32_t)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; @@ -2012,8 +1917,8 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, } else if (subframe == 7) { // ACK subframes 0 and 1 //harq_ack[0].nCCE; //harq_ack[1].nCCE; - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[0]>0) { - nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[0]; + if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[0]>0) { + nCCE0 = eNB->dlsch_eNB[(uint32_t)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; @@ -2021,8 +1926,8 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, *n1_pucch1 = -1; } else if (subframe == 8) { // ACK subframes 4 //harq_ack[4].nCCE; - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[4]>0) { - nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[4]; + if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[4]>0) { + nCCE0 = eNB->dlsch_eNB[(uint32_t)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; @@ -2030,7 +1935,7 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, *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, + eNB->Mod_id, frame, subframe,frame_parms->tdd_config); return; @@ -2040,49 +1945,49 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, 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[(uint32_t)UE_id][0]->subframe_tx[6]>0) { - nCCE1 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[6]; + if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[6]>0) { + nCCE1 = eNB->dlsch_eNB[(uint32_t)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[(uint32_t)UE_id][0]->subframe_tx[5]>0) { - nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[5]; + if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[5]>0) { + nCCE0 = eNB->dlsch_eNB[(uint32_t)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[(uint32_t)UE_id][0]->subframe_tx[7],phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[8]); + eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[7],eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[8]); - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[8]>0) { - nCCE1 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[8]; + if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[8]>0) { + nCCE1 = eNB->dlsch_eNB[(uint32_t)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[(uint32_t)UE_id][0]->subframe_tx[7]>0) { - nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[7]; + if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[7]>0) { + nCCE0 = eNB->dlsch_eNB[(uint32_t)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[(uint32_t)UE_id][0]->subframe_tx[0]>0) { - nCCE1 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[0]; + if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[0]>0) { + nCCE1 = eNB->dlsch_eNB[(uint32_t)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[(uint32_t)UE_id][0]->subframe_tx[9]>0) { - nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[9]; + if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[9]>0) { + nCCE0 = eNB->dlsch_eNB[(uint32_t)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); + eNB->Mod_id,frame,subframe,frame_parms->tdd_config); return; } @@ -2095,26 +2000,27 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, } } -void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t abstraction_flag) +void prach_procedures(PHY_VARS_eNB *eNB,uint8_t sched_subframe,uint8_t abstraction_flag) { + LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; uint16_t preamble_energy_list[64],preamble_delay_list[64]; uint16_t preamble_max,preamble_energy_max; uint16_t i; int8_t UE_id; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; - int frame = phy_vars_eNB->proc[sched_subframe].frame_rx; - uint8_t CC_id = phy_vars_eNB->CC_id; + int subframe = eNB->proc[sched_subframe].subframe_rx; + int frame = eNB->proc[sched_subframe].frame_rx; + uint8_t CC_id = eNB->CC_id; memset(&preamble_energy_list[0],0,64*sizeof(uint16_t)); memset(&preamble_delay_list[0],0,64*sizeof(uint16_t)); if (abstraction_flag == 0) { - LOG_D(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_D(PHY,"[eNB %d][RAPROC] Frame %d, Subframe %d : PRACH RX Signal Power : %d dBm\n",eNB->Mod_id, + frame,subframe,dB_fixed(signal_energy(&eNB->lte_eNB_common_vars.rxdata[0][0][subframe*fp->samples_per_tti],512)) - eNB->rx_total_gain_eNB_dB); - rx_prach(phy_vars_eNB, + rx_prach(eNB, subframe, preamble_energy_list, preamble_delay_list, @@ -2126,12 +2032,12 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t 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][CC_id],PHY_vars_UE_g[UE_id][CC_id]->generate_prach, PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.prach_config_common.rootSequenceIndex, - phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex, + fp->prach_config_common.rootSequenceIndex, PHY_vars_UE_g[UE_id][CC_id]->prach_PreambleIndex); if ((PHY_vars_UE_g[UE_id][CC_id]->generate_prach==1) && (PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.prach_config_common.rootSequenceIndex == - phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex) ) { + fp->prach_config_common.rootSequenceIndex) ) { preamble_energy_list[PHY_vars_UE_g[UE_id][CC_id]->prach_PreambleIndex] = 800; preamble_delay_list[PHY_vars_UE_g[UE_id][CC_id]->prach_PreambleIndex] = 5; @@ -2158,15 +2064,15 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t if (preamble_energy_list[preamble_max] > 580) { - UE_id = find_next_ue_index(phy_vars_eNB); + UE_id = find_next_ue_index(eNB); if (UE_id>=0) { - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UE_timing_offset = preamble_delay_list[preamble_max]&0x1FFF; //limit to 13 (=11+2) bits + eNB->eNB_UE_stats[(uint32_t)UE_id].UE_timing_offset = preamble_delay_list[preamble_max]&0x1FFF; //limit to 13 (=11+2) bits - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].sector = 0; + eNB->eNB_UE_stats[(uint32_t)UE_id].sector = 0; LOG_D(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure (UE_id %d) with preamble %d, energy %d.%d dB, delay %d\n", - phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, + eNB->Mod_id, + eNB->CC_id, frame, subframe, UE_id, @@ -2175,10 +2081,10 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t preamble_energy_max%10, preamble_delay_list[preamble_max]); - if (phy_vars_eNB->mac_enabled==1) { + if (eNB->mac_enabled==1) { uint8_t update_TA=4; - switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) { + switch (fp->N_RB_DL) { case 6: update_TA = 16; break; @@ -2196,8 +2102,8 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t break; } - mac_xface->initiate_ra_proc(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, + mac_xface->initiate_ra_proc(eNB->Mod_id, + eNB->CC_id, frame, preamble_max, preamble_delay_list[preamble_max]*update_TA, @@ -2207,24 +2113,24 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t } else { MSC_LOG_EVENT(MSC_PHY_ENB, "0 RA Failed add user, too many"); LOG_I(PHY,"[eNB %d][RAPROC] frame %d, subframe %d: Unable to add user, max user count reached\n", - phy_vars_eNB->Mod_id,frame, subframe); + eNB->Mod_id,frame, subframe); } } } -void ulsch_decoding_procedures(unsigned char subframe, unsigned int i, PHY_VARS_eNB *phy_vars_eNB, unsigned char abstraction_flag) +void ulsch_decoding_procedures(unsigned char subframe, unsigned int i, PHY_VARS_eNB *eNB, unsigned char abstraction_flag) { UNUSED(subframe); UNUSED(i); - UNUSED(phy_vars_eNB); + UNUSED(eNB); UNUSED(abstraction_flag); LOG_D(PHY,"ulsch_decoding_procedures not yet implemented. should not be called"); } -void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) { +void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) { - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms; + LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; uint8_t SR_payload = 0,*pucch_payload=NULL,pucch_payload0[2]= {0,0},pucch_payload1[2]= {0,0}; int16_t n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3; uint8_t do_SR = 0; @@ -2233,20 +2139,20 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ ANFBmode_t bundling_flag; PUCCH_FMT_t format; - const int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; - const int frame = phy_vars_eNB->proc[sched_subframe].frame_rx; + const int subframe = eNB->proc[sched_subframe].subframe_rx; + const int frame = eNB->proc[sched_subframe].frame_rx; - if ((phy_vars_eNB->dlsch_eNB[UE_id][0]) && - (phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti>0) && - (phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag==0)) { + if ((eNB->dlsch_eNB[UE_id][0]) && + (eNB->dlsch_eNB[UE_id][0]->rnti>0) && + (eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag==0)) { // check SR availability - do_SR = is_SR_subframe(phy_vars_eNB,UE_id,sched_subframe); + do_SR = is_SR_subframe(eNB,UE_id,sched_subframe); // do_SR = 0; // Now ACK/NAK // First check subframe_tx flag for earlier subframes - get_n1_pucch_eNB(phy_vars_eNB, + get_n1_pucch_eNB(eNB, UE_id, sched_subframe, &n1_pucch0, @@ -2255,7 +2161,7 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ &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[UE_id][0]->rnti, + eNB->Mod_id,eNB->dlsch_eNB[UE_id][0]->rnti, frame,subframe, n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,do_SR); @@ -2264,41 +2170,41 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ // otherwise we have some PUCCH detection to do // Null out PUCCH PRBs for noise measurement - switch(phy_vars_eNB->lte_frame_parms.N_RB_UL) { + switch(fp->N_RB_UL) { case 6: - phy_vars_eNB->rb_mask_ul[0] |= (0x1 | (1<<5)); //position 5 + eNB->rb_mask_ul[0] |= (0x1 | (1<<5)); //position 5 break; case 15: - phy_vars_eNB->rb_mask_ul[0] |= (0x1 | (1<<14)); // position 14 + eNB->rb_mask_ul[0] |= (0x1 | (1<<14)); // position 14 break; case 25: - phy_vars_eNB->rb_mask_ul[0] |= (0x1 | (1<<24)); // position 24 + eNB->rb_mask_ul[0] |= (0x1 | (1<<24)); // position 24 break; case 50: - phy_vars_eNB->rb_mask_ul[0] |= 0x1; - phy_vars_eNB->rb_mask_ul[1] |= (1<<17); // position 49 (49-32) + eNB->rb_mask_ul[0] |= 0x1; + eNB->rb_mask_ul[1] |= (1<<17); // position 49 (49-32) break; case 75: - phy_vars_eNB->rb_mask_ul[0] |= 0x1; - phy_vars_eNB->rb_mask_ul[2] |= (1<<10); // position 74 (74-64) + eNB->rb_mask_ul[0] |= 0x1; + eNB->rb_mask_ul[2] |= (1<<10); // position 74 (74-64) break; case 100: - phy_vars_eNB->rb_mask_ul[0] |= 0x1; - phy_vars_eNB->rb_mask_ul[3] |= (1<<3); // position 99 (99-96) + eNB->rb_mask_ul[0] |= 0x1; + eNB->rb_mask_ul[3] |= (1<<3); // position 99 (99-96) break; default: - LOG_E(PHY,"Unknown number for N_RB_UL %d\n",phy_vars_eNB->lte_frame_parms.N_RB_UL); + LOG_E(PHY,"Unknown number for N_RB_UL %d\n",fp->N_RB_UL); break; } if (do_SR == 1) { - phy_vars_eNB->eNB_UE_stats[UE_id].sr_total++; + eNB->eNB_UE_stats[UE_id].sr_total++; if (abstraction_flag == 0) - metric0_SR = rx_pucch(phy_vars_eNB, + metric0_SR = rx_pucch(eNB, pucch_format1, UE_id, - phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex, + eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex, 0, // n2_pucch 0, // shortened format, should be use_srs flag, later &SR_payload, @@ -2307,56 +2213,56 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ #ifdef PHY_ABSTRACTION else { - metric0_SR = rx_pucch_emul(phy_vars_eNB, + metric0_SR = rx_pucch_emul(eNB, UE_id, pucch_format1, 0, &SR_payload, sched_subframe); - 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[UE_id]->rnti,frame,subframe,SR_payload,phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex); + LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking SR (UE SR %d/%d)\n",eNB->Mod_id, + eNB->ulsch_eNB[UE_id]->rnti,frame,subframe,SR_payload,eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex); } #endif if (SR_payload == 1) { - LOG_D(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[UE_id]->rnti,frame,subframe); - phy_vars_eNB->eNB_UE_stats[UE_id].sr_received++; + LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Got SR for PUSCH, transmitting to MAC\n",eNB->Mod_id, + eNB->ulsch_eNB[UE_id]->rnti,frame,subframe); + eNB->eNB_UE_stats[UE_id].sr_received++; - if (phy_vars_eNB->first_sr[UE_id] == 1) { // this is the first request for uplink after Connection Setup, so clear HARQ process 0 use for Msg4 + if (eNB->first_sr[UE_id] == 1) { // this is the first request for uplink after Connection Setup, so clear HARQ process 0 use for Msg4 /* is this test necessary? */ - if (phy_vars_eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->status != SCH_IDLE) - put_harq_pid_in_freelist(phy_vars_eNB->dlsch_eNB[UE_id][0], 0); - phy_vars_eNB->first_sr[UE_id] = 0; - phy_vars_eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->round=0; - phy_vars_eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->status=SCH_IDLE; + if (eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->status != SCH_IDLE) + put_harq_pid_in_freelist(eNB->dlsch_eNB[UE_id][0], 0); + eNB->first_sr[UE_id] = 0; + eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->round=0; + eNB->dlsch_eNB[UE_id][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[UE_id]->rnti,frame,subframe); + eNB->Mod_id, + eNB->ulsch_eNB[UE_id]->rnti,frame,subframe); } - if (phy_vars_eNB->mac_enabled==1) { - mac_xface->SR_indication(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, + if (eNB->mac_enabled==1) { + mac_xface->SR_indication(eNB->Mod_id, + eNB->CC_id, frame, - phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti,subframe); + eNB->dlsch_eNB[UE_id][0]->rnti,subframe); } } }// 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 + } else if (fp->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[UE_id].sr_PUCCH_ResourceIndex:n1_pucch0; + // n1_pucch0 = (SR_payload==1) ? eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex:n1_pucch0; - LOG_D(PHY,"Demodulating PUCCH for ACK/NAK: n1_pucch0 %d (%d), SR_payload %d\n",n1_pucch0,phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,SR_payload); + LOG_D(PHY,"Demodulating PUCCH for ACK/NAK: n1_pucch0 %d (%d), SR_payload %d\n",n1_pucch0,eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,SR_payload); if (abstraction_flag == 0) { - metric0 = rx_pucch(phy_vars_eNB, + metric0 = rx_pucch(eNB, pucch_format1a, UE_id, (uint16_t)n1_pucch0, @@ -2367,10 +2273,10 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ PUCCH1a_THRES); if (metric0 < metric0_SR) - metric0=rx_pucch(phy_vars_eNB, + metric0=rx_pucch(eNB, pucch_format1a, UE_id, - phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex, + eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex, 0, //n2_pucch 0, // shortened format pucch_payload0, @@ -2379,7 +2285,7 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ } else { #ifdef PHY_ABSTRACTION - metric0 = rx_pucch_emul(phy_vars_eNB,UE_id, + metric0 = rx_pucch_emul(eNB,UE_id, pucch_format1a, 0, pucch_payload0, @@ -2389,13 +2295,13 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ #ifdef DEBUG_PHY_PROC LOG_D(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[UE_id][0]->rnti, + eNB->Mod_id, + eNB->dlsch_eNB[UE_id][0]->rnti, frame,subframe, pucch_payload0[0],metric0); #endif - process_HARQ_feedback(UE_id,sched_subframe,phy_vars_eNB, + process_HARQ_feedback(UE_id,sched_subframe,eNB, 0,// pusch_flag pucch_payload0, 2, @@ -2404,34 +2310,32 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ } // FDD else { //TDD - bundling_flag = phy_vars_eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode; + bundling_flag = eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode; // fix later for 2 TB case and format1b - if ((frame_parms->frame_type==FDD) || + if ((fp->frame_type==FDD) || (bundling_flag==bundling) || - ((frame_parms->frame_type==TDD)&&(frame_parms->tdd_config==1)&&((subframe!=2)||(subframe!=7)))) { + ((fp->frame_type==TDD)&&(fp->tdd_config==1)&&((subframe!=2)||(subframe!=7)))) { format = pucch_format1a; - // msg("PUCCH 1a\n"); - } else { + } 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_D(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[UE_id][0]->rnti, + LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d with SR\n",eNB->Mod_id, + eNB->dlsch_eNB[UE_id][0]->rnti, frame,subframe, n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format); #endif if (abstraction_flag == 0) - metric0_SR = rx_pucch(phy_vars_eNB, + metric0_SR = rx_pucch(eNB, format, UE_id, - phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex, + eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex, 0, //n2_pucch 0, // shortened format pucch_payload0, @@ -2439,7 +2343,7 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ PUCCH1a_THRES); else { #ifdef PHY_ABSTRACTION - metric0 = rx_pucch_emul(phy_vars_eNB,UE_id, + metric0 = rx_pucch_emul(eNB,UE_id, format, 0, pucch_payload0, @@ -2448,8 +2352,8 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ } } else { //using n1_pucch0/n1_pucch1 resources #ifdef DEBUG_PHY_PROC - LOG_D(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[UE_id][0]->rnti, + LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d\n",eNB->Mod_id, + eNB->dlsch_eNB[UE_id][0]->rnti, frame,subframe, n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format); #endif @@ -2459,7 +2363,7 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ // Check n1_pucch0 metric if (n1_pucch0 != -1) { if (abstraction_flag == 0) - metric0 = rx_pucch(phy_vars_eNB, + metric0 = rx_pucch(eNB, format, UE_id, (uint16_t)n1_pucch0, @@ -2470,7 +2374,7 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ PUCCH1a_THRES); else { #ifdef PHY_ABSTRACTION - metric0 = rx_pucch_emul(phy_vars_eNB,UE_id, + metric0 = rx_pucch_emul(eNB,UE_id, format, 0, pucch_payload0, @@ -2482,7 +2386,7 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ // Check n1_pucch1 metric if (n1_pucch1 != -1) { if (abstraction_flag == 0) - metric1 = rx_pucch(phy_vars_eNB, + metric1 = rx_pucch(eNB, format, UE_id, (uint16_t)n1_pucch1, @@ -2493,7 +2397,7 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ PUCCH1a_THRES); else { #ifdef PHY_ABSTRACTION - metric1 = rx_pucch_emul(phy_vars_eNB,UE_id, + metric1 = rx_pucch_emul(eNB,UE_id, format, 1, pucch_payload1, @@ -2523,12 +2427,12 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ } #ifdef DEBUG_PHY_PROC - LOG_D(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[UE_id][0]->rnti, + LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d ACK/NAK metric 0 %d, metric 1 %d, sel %d, (%d,%d)\n",eNB->Mod_id, + eNB->dlsch_eNB[UE_id][0]->rnti, frame,subframe, metric0,metric1,pucch_sel,pucch_payload[0],pucch_payload[1]); #endif - process_HARQ_feedback(UE_id,sched_subframe,phy_vars_eNB, + process_HARQ_feedback(UE_id,sched_subframe,eNB, 0,// pusch_flag pucch_payload, pucch_sel, @@ -2539,61 +2443,62 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ } } -void cba_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) { +void cba_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) { uint8_t access_mode; int num_active_cba_groups; - const int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; - const int frame = phy_vars_eNB->proc[sched_subframe].frame_rx; + const int subframe = eNB->proc[sched_subframe].subframe_rx; + const int frame = eNB->proc[sched_subframe].frame_rx; uint16_t rnti=0; int ret=0; + LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; - num_active_cba_groups = phy_vars_eNB->ulsch_eNB[UE_id]->num_active_cba_groups; + num_active_cba_groups = eNB->ulsch_eNB[UE_id]->num_active_cba_groups; - if ((phy_vars_eNB->ulsch_eNB[UE_id]) && + if ((eNB->ulsch_eNB[UE_id]) && (num_active_cba_groups > 0) && - (phy_vars_eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups]>0) && - (phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag==1)) { + (eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups]>0) && + (eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag==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, + eNB->Mod_id,harq_pid, frame,subframe, - UE_id, (uint16_t)phy_vars_eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups],mode_string[phy_vars_eNB->eNB_UE_stats[UE_id].mode]); + UE_id, (uint16_t)eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups],mode_string[eNB->eNB_UE_stats[UE_id].mode]); #endif if (abstraction_flag==0) { - rx_ulsch(phy_vars_eNB, + rx_ulsch(eNB, sched_subframe, - phy_vars_eNB->eNB_UE_stats[UE_id].sector, // this is the effective sector id + eNB->eNB_UE_stats[UE_id].sector, // this is the effective sector id UE_id, - phy_vars_eNB->ulsch_eNB, + eNB->ulsch_eNB, 0); } #ifdef PHY_ABSTRACTION else { - rx_ulsch_emul(phy_vars_eNB, + rx_ulsch_emul(eNB, subframe, - phy_vars_eNB->eNB_UE_stats[UE_id].sector, // this is the effective sector id + eNB->eNB_UE_stats[UE_id].sector, // this is the effective sector id UE_id); } #endif if (abstraction_flag == 0) { - ret = ulsch_decoding(phy_vars_eNB, + ret = ulsch_decoding(eNB, UE_id, sched_subframe, 0, // control_only_flag - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->V_UL_DAI, - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0); + eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->V_UL_DAI, + eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0); } #ifdef PHY_ABSTRACTION else { - ret = ulsch_decoding_emul(phy_vars_eNB, + ret = ulsch_decoding_emul(eNB, sched_subframe, UE_id, &rnti); @@ -2601,60 +2506,60 @@ void cba_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eN #endif - if (phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->cqi_crc_status == 1) { + if (eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->cqi_crc_status == 1) { #ifdef DEBUG_PHY_PROC - print_CQI(phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o,phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->uci_format,0,phy_vars_eNB->lte_frame_parms.N_RB_DL); + print_CQI(eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o,eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->uci_format,0,fp->N_RB_DL); #endif access_mode = UNKNOWN_ACCESS; - extract_CQI(phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o, - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->uci_format, - &phy_vars_eNB->eNB_UE_stats[UE_id], - phy_vars_eNB->lte_frame_parms.N_RB_DL, + extract_CQI(eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o, + eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->uci_format, + &eNB->eNB_UE_stats[UE_id], + fp->N_RB_DL, &rnti, &access_mode); - phy_vars_eNB->eNB_UE_stats[UE_id].rank = phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o_RI[0]; + eNB->eNB_UE_stats[UE_id].rank = eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o_RI[0]; } - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=0; - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->status= SCH_IDLE; + eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=0; + eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->status= SCH_IDLE; if ((num_active_cba_groups > 0) && (UE_id + num_active_cba_groups < NUMBER_OF_UE_MAX) && - (phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->cba_rnti[UE_id%num_active_cba_groups] > 0 ) && - (phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->num_active_cba_groups> 0)) { + (eNB->ulsch_eNB[UE_id+num_active_cba_groups]->cba_rnti[UE_id%num_active_cba_groups] > 0 ) && + (eNB->ulsch_eNB[UE_id+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,subframe,UE_id,harq_pid, - UE_id+num_active_cba_groups, UE_id%phy_vars_eNB->ulsch_eNB[UE_id]->num_active_cba_groups); + eNB->Mod_id,harq_pid,frame,subframe,UE_id,harq_pid, + UE_id+num_active_cba_groups, UE_id%eNB->ulsch_eNB[UE_id]->num_active_cba_groups); #endif - phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=1; - phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->status= CBA_ACTIVE; - phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->TBS=phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS; + eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=1; + eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->status= CBA_ACTIVE; + eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->TBS=eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS; } if (ret == (1+MAX_TURBO_ITERATIONS)) { - phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_round_errors[harq_pid][phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round]++; - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active = 1; - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK = 0; - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round++; + eNB->eNB_UE_stats[UE_id].ulsch_round_errors[harq_pid][eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round]++; + eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active = 1; + eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK = 0; + eNB->ulsch_eNB[UE_id]->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, + eNB->Mod_id,harq_pid, frame,subframe); - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active = 1; - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK = 1; - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round = 0; - phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_consecutive_errors = 0; + eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active = 1; + eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK = 1; + eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round = 0; + eNB->eNB_UE_stats[UE_id].ulsch_consecutive_errors = 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,subframe, - harq_pid,phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3); + harq_pid,eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3); - for (j=0; j<phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3; j++) - LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->b[j]); + for (j=0; j<eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3; j++) + LOG_T(PHY,"%x.",eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->b[j]); LOG_T(PHY,"\n"); #endif @@ -2662,37 +2567,37 @@ void cba_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eN if (access_mode > UNKNOWN_ACCESS) { LOG_D(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,subframe, - UE_id, phy_vars_eNB->ulsch_eNB[UE_id]->rnti, - UE_id % phy_vars_eNB->ulsch_eNB[UE_id]->num_active_cba_groups, phy_vars_eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups]); + eNB->Mod_id, frame,subframe, + UE_id, eNB->ulsch_eNB[UE_id]->rnti, + UE_id % eNB->ulsch_eNB[UE_id]->num_active_cba_groups, eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups]); // detect if there is a CBA collision - if (phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups] == 0 ) { - mac_xface->rx_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, + if (eNB->cba_last_reception[UE_id%num_active_cba_groups] == 0 ) { + mac_xface->rx_sdu(eNB->Mod_id, + eNB->CC_id, frame,subframe, - phy_vars_eNB->ulsch_eNB[UE_id]->rnti, - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->b, - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3, + eNB->ulsch_eNB[UE_id]->rnti, + eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->b, + eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3, harq_pid, NULL); - phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups]+=1;//(subframe); + eNB->cba_last_reception[UE_id%num_active_cba_groups]+=1;//(subframe); } else { - if (phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups] == 1 ) + if (eNB->cba_last_reception[UE_id%num_active_cba_groups] == 1 ) LOG_N(PHY,"[eNB%d] Frame %d subframe %d : first CBA collision detected \n ", - phy_vars_eNB->Mod_id,frame,subframe); + eNB->Mod_id,frame,subframe); LOG_N(PHY,"[eNB%d] Frame %d subframe %d : CBA collision set SR for UE %d in group %d \n ", - phy_vars_eNB->Mod_id,frame,subframe, - phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups],UE_id%num_active_cba_groups ); + eNB->Mod_id,frame,subframe, + eNB->cba_last_reception[UE_id%num_active_cba_groups],UE_id%num_active_cba_groups ); - phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups]+=1; + eNB->cba_last_reception[UE_id%num_active_cba_groups]+=1; - mac_xface->SR_indication(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, + mac_xface->SR_indication(eNB->Mod_id, + eNB->CC_id, frame, - phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti,subframe); + eNB->dlsch_eNB[UE_id][0]->rnti,subframe); } } // UNKNOWN_ACCESS } // ULSCH CBA not in error @@ -2700,61 +2605,61 @@ void cba_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eN } -void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,const uint8_t abstraction_flag,const relaying_type_t r_type) +void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *eNB,const uint8_t abstraction_flag,const relaying_type_t r_type) { //RX processing UNUSED(r_type); uint32_t l, ret=0,i,j,k; uint32_t harq_pid, harq_idx, round; uint8_t nPRS; - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms; int sync_pos; uint16_t rnti=0; uint8_t access_mode; + LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; - const int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; - const int frame = phy_vars_eNB->proc[sched_subframe].frame_rx; + const int subframe = eNB->proc[sched_subframe].subframe_rx; + const int frame = eNB->proc[sched_subframe].frame_rx; AssertFatal(sched_subframe < NUM_ENB_THREADS, "Bad sched_subframe %d", sched_subframe); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,1); - start_meas(&phy_vars_eNB->phy_proc_rx); + start_meas(&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, subframe); + LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_RX(%d)\n",eNB->Mod_id,frame, subframe); #endif - phy_vars_eNB->rb_mask_ul[0]=0; - phy_vars_eNB->rb_mask_ul[1]=0; - phy_vars_eNB->rb_mask_ul[2]=0; - phy_vars_eNB->rb_mask_ul[3]=0; + eNB->rb_mask_ul[0]=0; + eNB->rb_mask_ul[1]=0; + eNB->rb_mask_ul[2]=0; + eNB->rb_mask_ul[3]=0; if (abstraction_flag == 0) { - remove_7_5_kHz(phy_vars_eNB,subframe<<1); - remove_7_5_kHz(phy_vars_eNB,(subframe<<1)+1); + remove_7_5_kHz(eNB,subframe<<1); + remove_7_5_kHz(eNB,(subframe<<1)+1); } // check if we have to detect PRACH first - if (is_prach_subframe(&phy_vars_eNB->lte_frame_parms,frame,subframe)>0) { + if (is_prach_subframe(fp,frame,subframe)>0) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,1); - prach_procedures(phy_vars_eNB,sched_subframe,abstraction_flag); + prach_procedures(eNB,sched_subframe,abstraction_flag); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0); } if (abstraction_flag == 0) { - start_meas(&phy_vars_eNB->ofdm_demod_stats); + start_meas(&eNB->ofdm_demod_stats); - for (l=0; l<phy_vars_eNB->lte_frame_parms.symbols_per_tti/2; l++) { + for (l=0; l<fp->symbols_per_tti/2; l++) { - slot_fep_ul(&phy_vars_eNB->lte_frame_parms, - &phy_vars_eNB->lte_eNB_common_vars, + slot_fep_ul(fp, + &eNB->lte_eNB_common_vars, l, subframe<<1, 0, 0 ); - slot_fep_ul(&phy_vars_eNB->lte_frame_parms, - &phy_vars_eNB->lte_eNB_common_vars, + slot_fep_ul(fp, + &eNB->lte_eNB_common_vars, l, (subframe<<1)+1, 0, @@ -2762,265 +2667,265 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_ ); } - stop_meas(&phy_vars_eNB->ofdm_demod_stats); + stop_meas(&eNB->ofdm_demod_stats); } // Check for active processes in current subframe - harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms, + harq_pid = subframe2harq_pid(fp, frame,subframe); // 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; + eNB->cba_last_reception[i]=0; } // Do PUCCH processing first for (i=0; i<NUMBER_OF_UE_MAX; i++) { - pucch_procedures(sched_subframe,phy_vars_eNB,i,harq_pid,abstraction_flag); + pucch_procedures(sched_subframe,eNB,i,harq_pid,abstraction_flag); } for (i=0; i<NUMBER_OF_UE_MAX; i++) { // check for Msg3 - if (phy_vars_eNB->mac_enabled==1) { - if (phy_vars_eNB->eNB_UE_stats[i].mode == RA_RESPONSE) { - process_Msg3(phy_vars_eNB,sched_subframe,i,harq_pid); + if (eNB->mac_enabled==1) { + if (eNB->eNB_UE_stats[i].mode == RA_RESPONSE) { + process_Msg3(eNB,sched_subframe,i,harq_pid); } } - phy_vars_eNB->pusch_stats_rb[i][(frame*10)+subframe] = -63; - phy_vars_eNB->pusch_stats_round[i][(frame*10)+subframe] = 0; - phy_vars_eNB->pusch_stats_mcs[i][(frame*10)+subframe] = -63; + eNB->pusch_stats_rb[i][(frame*10)+subframe] = -63; + eNB->pusch_stats_round[i][(frame*10)+subframe] = 0; + eNB->pusch_stats_mcs[i][(frame*10)+subframe] = -63; - 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)) { + if ((eNB->ulsch_eNB[i]) && + (eNB->ulsch_eNB[i]->rnti>0) && + (eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag==1)) { // UE is has ULSCH scheduling - round = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round; + round = eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round; for (int rb=0; - rb<=phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb; + rb<=eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb; rb++) { - int rb2 = rb+phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->first_rb; - phy_vars_eNB->rb_mask_ul[rb2>>5] |= (1<<(rb2&31)); + int rb2 = rb+eNB->ulsch_eNB[i]->harq_processes[harq_pid]->first_rb; + eNB->rb_mask_ul[rb2>>5] |= (1<<(rb2&31)); } #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Scheduling PUSCH/ULSCH Reception for rnti %x (UE_id %d)\n", - phy_vars_eNB->Mod_id,harq_pid, - frame,subframe,phy_vars_eNB->ulsch_eNB[i]->rnti,i); + eNB->Mod_id,harq_pid, + frame,subframe,eNB->ulsch_eNB[i]->rnti,i); #endif - if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) { + if (eNB->ulsch_eNB[i]->Msg3_flag == 1) { LOG_D(PHY,"[eNB %d] frame %d, subframe %d: Scheduling ULSCH Reception for Msg3 in Sector %d\n", - phy_vars_eNB->Mod_id, + eNB->Mod_id, frame, subframe, - phy_vars_eNB->eNB_UE_stats[i].sector); + eNB->eNB_UE_stats[i].sector); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_MSG3,1); } else { LOG_D(PHY,"[eNB %d] frame %d, subframe %d: Scheduling ULSCH Reception for UE %d Mode %s\n", - phy_vars_eNB->Mod_id, + eNB->Mod_id, frame, subframe, i, - mode_string[phy_vars_eNB->eNB_UE_stats[i].mode]); + mode_string[eNB->eNB_UE_stats[i].mode]); } - nPRS = phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<1]; + nPRS = fp->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<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 + + eNB->ulsch_eNB[i]->cyclicShift = (eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2 + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift + nPRS)%12; - if (frame_parms->frame_type == FDD ) { + if (fp->frame_type == FDD ) { 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; + if (eNB->dlsch_eNB[i][0]->subframe_tx[sf]>0) { // we have downlink transmission + 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; + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 0; } } LOG_D(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,subframe, - 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, + eNB->Mod_id,harq_pid,frame,subframe, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->dci_alloc, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rar_alloc, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->first_rb, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->mcs, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rvidx, + eNB->ulsch_eNB[i]->cyclicShift, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2, + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift, nPRS, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK); - phy_vars_eNB->pusch_stats_rb[i][(frame*10)+subframe] = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb; - phy_vars_eNB->pusch_stats_round[i][(frame*10)+subframe] = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round; - phy_vars_eNB->pusch_stats_mcs[i][(frame*10)+subframe] = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->mcs; - start_meas(&phy_vars_eNB->ulsch_demodulation_stats); + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK); + eNB->pusch_stats_rb[i][(frame*10)+subframe] = eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb; + eNB->pusch_stats_round[i][(frame*10)+subframe] = eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round; + eNB->pusch_stats_mcs[i][(frame*10)+subframe] = eNB->ulsch_eNB[i]->harq_processes[harq_pid]->mcs; + start_meas(&eNB->ulsch_demodulation_stats); if (abstraction_flag==0) { - rx_ulsch(phy_vars_eNB, + rx_ulsch(eNB, sched_subframe, - phy_vars_eNB->eNB_UE_stats[i].sector, // this is the effective sector id + eNB->eNB_UE_stats[i].sector, // this is the effective sector id i, - phy_vars_eNB->ulsch_eNB, + eNB->ulsch_eNB, 0); } #ifdef PHY_ABSTRACTION else { - rx_ulsch_emul(phy_vars_eNB, + rx_ulsch_emul(eNB, subframe, - phy_vars_eNB->eNB_UE_stats[i].sector, // this is the effective sector id + eNB->eNB_UE_stats[i].sector, // this is the effective sector id i); } #endif - stop_meas(&phy_vars_eNB->ulsch_demodulation_stats); + stop_meas(&eNB->ulsch_demodulation_stats); - start_meas(&phy_vars_eNB->ulsch_decoding_stats); + start_meas(&eNB->ulsch_decoding_stats); if (abstraction_flag == 0) { - ret = ulsch_decoding(phy_vars_eNB, + ret = ulsch_decoding(eNB, i, sched_subframe, 0, // control_only_flag - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->V_UL_DAI, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0); + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->V_UL_DAI, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0); } #ifdef PHY_ABSTRACTION else { - ret = ulsch_decoding_emul(phy_vars_eNB, + ret = ulsch_decoding_emul(eNB, sched_subframe, i, &rnti); } #endif - stop_meas(&phy_vars_eNB->ulsch_decoding_stats); + stop_meas(&eNB->ulsch_decoding_stats); LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n", - phy_vars_eNB->Mod_id,harq_pid, + eNB->Mod_id,harq_pid, frame,subframe, - 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->eNB_UE_stats[i].UL_rssi[0], - phy_vars_eNB->eNB_UE_stats[i].UL_rssi[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]->harq_processes[harq_pid]->o_ACK[0], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], + eNB->ulsch_eNB[i]->rnti, + dB_fixed(eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]), + dB_fixed(eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]), + eNB->eNB_UE_stats[i].UL_rssi[0], + eNB->eNB_UE_stats[i].UL_rssi[1], + eNB->PHY_measurements_eNB->n0_power_dB[0], + eNB->PHY_measurements_eNB->n0_power_dB[1], + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], ret); //compute the expected ULSCH RX power (for the stats) - phy_vars_eNB->ulsch_eNB[(uint32_t)i]->harq_processes[harq_pid]->delta_TF = - get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 0); // 0 means bw_factor is not considered + eNB->ulsch_eNB[(uint32_t)i]->harq_processes[harq_pid]->delta_TF = + get_hundred_times_delta_IF_eNB(eNB,i,harq_pid, 0); // 0 means bw_factor is not considered - //dump_ulsch(phy_vars_eNB, sched_subframe, i); + //dump_ulsch(eNB, sched_subframe, i); - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++; + eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][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,subframe,i,harq_pid); + eNB->Mod_id,harq_pid,frame,subframe,i,harq_pid); #endif - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag=0; + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag=0; - if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->cqi_crc_status == 1) { + if (eNB->ulsch_eNB[i]->harq_processes[harq_pid]->cqi_crc_status == 1) { #ifdef DEBUG_PHY_PROC - //if (((phy_vars_eNB->proc[sched_subframe].frame_tx%10) == 0) || (phy_vars_eNB->proc[sched_subframe].frame_tx < 50)) - print_CQI(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format,0,phy_vars_eNB->lte_frame_parms.N_RB_DL); + //if (((eNB->proc[sched_subframe].frame_tx%10) == 0) || (eNB->proc[sched_subframe].frame_tx < 50)) + print_CQI(eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o,eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format,0,fp->N_RB_DL); #endif - extract_CQI(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format, - &phy_vars_eNB->eNB_UE_stats[i], - phy_vars_eNB->lte_frame_parms.N_RB_DL, + extract_CQI(eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format, + &eNB->eNB_UE_stats[i], + fp->N_RB_DL, &rnti, &access_mode); - phy_vars_eNB->eNB_UE_stats[i].rank = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_RI[0]; + eNB->eNB_UE_stats[i].rank = eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_RI[0]; } - if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) + if (eNB->ulsch_eNB[i]->Msg3_flag == 1) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_MSG3,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++; + eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++; + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1; + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 0; + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round++; - LOG_D(PHY,"[eNB][PUSCH %d] Increasing to round %d\n",harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round); + LOG_D(PHY,"[eNB][PUSCH %d] Increasing to round %d\n",harq_pid,eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round); - if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) { + if (eNB->ulsch_eNB[i]->Msg3_flag == 1) { LOG_D(PHY,"[eNB %d/%d][RAPROC] frame %d, subframe %d, UE %d: Error receiving ULSCH (Msg3), round %d/%d\n", - phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, + eNB->Mod_id, + eNB->CC_id, frame,subframe, i, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1, - phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx-1); + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1, + fp->maxHARQ_Msg3Tx-1); LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n", - phy_vars_eNB->Mod_id,harq_pid, + eNB->Mod_id,harq_pid, frame,subframe, - 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->eNB_UE_stats[i].UL_rssi[0], - phy_vars_eNB->eNB_UE_stats[i].UL_rssi[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]->harq_processes[harq_pid]->o_ACK[0], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], + eNB->ulsch_eNB[i]->rnti, + dB_fixed(eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]), + dB_fixed(eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]), + eNB->eNB_UE_stats[i].UL_rssi[0], + eNB->eNB_UE_stats[i].UL_rssi[1], + eNB->PHY_measurements_eNB->n0_power_dB[0], + eNB->PHY_measurements_eNB->n0_power_dB[1], + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], ret); - if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round == - phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx) { + if (eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round == + fp->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; - if (phy_vars_eNB->mac_enabled==1) { - mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, + eNB->Mod_id, i); + eNB->eNB_UE_stats[i].mode = PRACH; + if (eNB->mac_enabled==1) { + mac_xface->cancel_ra_proc(eNB->Mod_id, + eNB->CC_id, frame, - phy_vars_eNB->eNB_UE_stats[i].crnti); + eNB->eNB_UE_stats[i].crnti); } - mac_phy_remove_ue(phy_vars_eNB->Mod_id,phy_vars_eNB->eNB_UE_stats[i].crnti); + mac_phy_remove_ue(eNB->Mod_id,eNB->eNB_UE_stats[i].crnti); - phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0; - //phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 0; + eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0; + //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[(uint32_t)i]->Msg3_active = 1; + eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 1; - get_Msg3_alloc_ret(&phy_vars_eNB->lte_frame_parms, + get_Msg3_alloc_ret(fp, subframe, frame, - &phy_vars_eNB->ulsch_eNB[i]->Msg3_frame, - &phy_vars_eNB->ulsch_eNB[i]->Msg3_subframe); + &eNB->ulsch_eNB[i]->Msg3_frame, + &eNB->ulsch_eNB[i]->Msg3_subframe); } LOG_D(PHY,"[eNB] Frame %d, Subframe %d: Msg3 in error, i = %d \n", frame,subframe,i); } // 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, + eNB->Mod_id,harq_pid, frame,subframe, i, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1, - phy_vars_eNB->ulsch_eNB[i]->Mlimit, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1]); + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1, + eNB->ulsch_eNB[i]->Mlimit, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1]); #if defined(MESSAGE_CHART_GENERATOR_PHY) MSC_LOG_RX_DISCARDED_MESSAGE( @@ -3028,51 +2933,51 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_ NULL,0, "%05u:%02u ULSCH received rnti %x harq id %u round %d", frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->rnti,harq_pid, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1 + eNB->ulsch_eNB[i]->rnti,harq_pid, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1 ); #endif - if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round== phy_vars_eNB->ulsch_eNB[i]->Mlimit) { + if (eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round== eNB->ulsch_eNB[i]->Mlimit) { LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d ULSCH Mlimit %d reached\n", - phy_vars_eNB->Mod_id,harq_pid, + eNB->Mod_id,harq_pid, frame,subframe, i, - phy_vars_eNB->ulsch_eNB[i]->Mlimit); + eNB->ulsch_eNB[i]->Mlimit); - 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++; + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round=0; + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active=0; + eNB->eNB_UE_stats[i].ulsch_errors[harq_pid]++; + eNB->eNB_UE_stats[i].ulsch_consecutive_errors++; // indicate error to MAC - mac_xface->rx_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, + mac_xface->rx_sdu(eNB->Mod_id, + eNB->CC_id, frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->rnti, + eNB->ulsch_eNB[i]->rnti, NULL, 0, harq_pid, - &phy_vars_eNB->ulsch_eNB[i]->Msg3_flag); + &eNB->ulsch_eNB[i]->Msg3_flag); } } } // ulsch in error else { - if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) { + if (eNB->ulsch_eNB[i]->Msg3_flag == 1) { 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, + eNB->Mod_id,harq_pid, frame,subframe); LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n", - phy_vars_eNB->Mod_id,harq_pid, + eNB->Mod_id,harq_pid, frame,subframe, - 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->eNB_UE_stats[i].UL_rssi[0], - phy_vars_eNB->eNB_UE_stats[i].UL_rssi[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]->harq_processes[harq_pid]->o_ACK[0], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], + eNB->ulsch_eNB[i]->rnti, + dB_fixed(eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]), + dB_fixed(eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]), + eNB->eNB_UE_stats[i].UL_rssi[0], + eNB->eNB_UE_stats[i].UL_rssi[1], + eNB->PHY_measurements_eNB->n0_power_dB[0], + eNB->PHY_measurements_eNB->n0_power_dB[1], + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], ret); } #if defined(MESSAGE_CHART_GENERATOR_PHY) @@ -3081,115 +2986,115 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_ NULL,0, "%05u:%02u ULSCH received rnti %x harq id %u", frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->rnti,harq_pid + eNB->ulsch_eNB[i]->rnti,harq_pid ); #endif - for (j=0; j<phy_vars_eNB->lte_frame_parms.nb_antennas_rx; j++) + for (j=0; j<fp->nb_antennas_rx; j++) //this is the RSSI per RB - phy_vars_eNB->eNB_UE_stats[i].UL_rssi[j] = + eNB->eNB_UE_stats[i].UL_rssi[j] = - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[j]* - (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb*12)/ - phy_vars_eNB->lte_frame_parms.ofdm_symbol_size) - - phy_vars_eNB->rx_total_gain_eNB_dB - - hundred_times_log10_NPRB[phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb-1]/100 - - get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 0)/100; + dB_fixed(eNB->lte_eNB_pusch_vars[i]->ulsch_power[j]* + (eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb*12)/ + fp->ofdm_symbol_size) - + eNB->rx_total_gain_eNB_dB - + hundred_times_log10_NPRB[eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb-1]/100 - + get_hundred_times_delta_IF_eNB(eNB,i,harq_pid, 0)/100; - 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 = 0; + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1; + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 1; + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round = 0; + eNB->eNB_UE_stats[i].ulsch_consecutive_errors = 0; - if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) { - if (phy_vars_eNB->mac_enabled==1) { + if (eNB->ulsch_eNB[i]->Msg3_flag == 1) { + if (eNB->mac_enabled==1) { LOG_I(PHY,"[eNB %d][RAPROC] Frame %d Terminating ra_proc for harq %d, UE %d\n", - phy_vars_eNB->Mod_id, + eNB->Mod_id, frame,harq_pid,i); - mac_xface->rx_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, + mac_xface->rx_sdu(eNB->Mod_id, + eNB->CC_id, frame,subframe, - 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, + eNB->ulsch_eNB[i]->rnti, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3, harq_pid, - &phy_vars_eNB->ulsch_eNB[i]->Msg3_flag); + &eNB->ulsch_eNB[i]->Msg3_flag); // one-shot msg3 detection by MAC: empty PDU (e.g. CRNTI) - if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 0 ) { - phy_vars_eNB->eNB_UE_stats[i].mode = PRACH; - mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, + if (eNB->ulsch_eNB[i]->Msg3_flag == 0 ) { + eNB->eNB_UE_stats[i].mode = PRACH; + mac_xface->cancel_ra_proc(eNB->Mod_id, + eNB->CC_id, frame, - phy_vars_eNB->eNB_UE_stats[i].crnti); - mac_phy_remove_ue(phy_vars_eNB->Mod_id,phy_vars_eNB->eNB_UE_stats[i].crnti); - phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0; + eNB->eNB_UE_stats[i].crnti); + mac_phy_remove_ue(eNB->Mod_id,eNB->eNB_UE_stats[i].crnti); + eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0; } // Msg3_flag == 0 } // mac_enabled==1 - phy_vars_eNB->eNB_UE_stats[i].mode = PUSCH; - phy_vars_eNB->ulsch_eNB[i]->Msg3_flag = 0; + eNB->eNB_UE_stats[i].mode = PUSCH; + eNB->ulsch_eNB[i]->Msg3_flag = 0; - LOG_D(PHY,"[eNB %d][RAPROC] Frame %d : RX Subframe %d Setting UE %d mode to PUSCH\n",phy_vars_eNB->Mod_id,frame,subframe,i); + LOG_D(PHY,"[eNB %d][RAPROC] Frame %d : RX Subframe %d Setting UE %d mode to PUSCH\n",eNB->Mod_id,frame,subframe,i); for (k=0; k<8; k++) { //harq_processes - for (j=0; j<phy_vars_eNB->dlsch_eNB[i][0]->Mlimit; j++) { - phy_vars_eNB->eNB_UE_stats[i].dlsch_NAK[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].dlsch_ACK[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].dlsch_trials[k][j]=0; + for (j=0; j<eNB->dlsch_eNB[i][0]->Mlimit; j++) { + eNB->eNB_UE_stats[i].dlsch_NAK[k][j]=0; + eNB->eNB_UE_stats[i].dlsch_ACK[k][j]=0; + eNB->eNB_UE_stats[i].dlsch_trials[k][j]=0; } - phy_vars_eNB->eNB_UE_stats[i].dlsch_l2_errors[k]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[k]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors=0; + eNB->eNB_UE_stats[i].dlsch_l2_errors[k]=0; + eNB->eNB_UE_stats[i].ulsch_errors[k]=0; + eNB->eNB_UE_stats[i].ulsch_consecutive_errors=0; - for (j=0; j<phy_vars_eNB->ulsch_eNB[i]->Mlimit; j++) { - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_fer[k][j]=0; + for (j=0; j<eNB->ulsch_eNB[i]->Mlimit; j++) { + eNB->eNB_UE_stats[i].ulsch_decoding_attempts[k][j]=0; + eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[k][j]=0; + eNB->eNB_UE_stats[i].ulsch_round_errors[k][j]=0; + eNB->eNB_UE_stats[i].ulsch_round_fer[k][j]=0; } } - phy_vars_eNB->eNB_UE_stats[i].dlsch_sliding_cnt=0; - phy_vars_eNB->eNB_UE_stats[i].dlsch_NAK_round0=0; - phy_vars_eNB->eNB_UE_stats[i].dlsch_mcs_offset=0; + eNB->eNB_UE_stats[i].dlsch_sliding_cnt=0; + eNB->eNB_UE_stats[i].dlsch_NAK_round0=0; + eNB->eNB_UE_stats[i].dlsch_mcs_offset=0; } // Msg3_flag==1 else { // Msg3_flag == 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,subframe, - harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); + harq_pid,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]); + for (j=0; j<eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3; j++) + LOG_T(PHY,"%x.",eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b[j]); LOG_T(PHY,"\n"); #endif #endif - if (phy_vars_eNB->mac_enabled==1) { + if (eNB->mac_enabled==1) { - mac_xface->rx_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, + mac_xface->rx_sdu(eNB->Mod_id, + eNB->CC_id, frame,subframe, - 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, + eNB->ulsch_eNB[i]->rnti, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3, harq_pid, NULL); #ifdef LOCALIZATION - start_meas(&phy_vars_eNB->localization_stats); - aggregate_eNB_UE_localization_stats(phy_vars_eNB, + start_meas(&eNB->localization_stats); + aggregate_eNB_UE_localization_stats(eNB, i, frame, subframe, - get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 1)/100); - stop_meas(&phy_vars_eNB->localization_stats); + get_hundred_times_delta_IF_eNB(eNB,i,harq_pid, 1)/100); + stop_meas(&eNB->localization_stats); #endif } // mac_enabled==1 @@ -3197,16 +3102,16 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_ // estimate timing advance for MAC if (abstraction_flag == 0) { - sync_pos = lte_est_timing_advance_pusch(phy_vars_eNB,i,sched_subframe); - phy_vars_eNB->eNB_UE_stats[i].timing_advance_update = sync_pos - phy_vars_eNB->lte_frame_parms.nb_prefix_samples/4; //to check + sync_pos = lte_est_timing_advance_pusch(eNB,i,sched_subframe); + eNB->eNB_UE_stats[i].timing_advance_update = sync_pos - fp->nb_prefix_samples/4; //to check } #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d] frame %d, subframe %d: user %d: timing advance = %d\n", - phy_vars_eNB->Mod_id, + eNB->Mod_id, frame, subframe, i, - phy_vars_eNB->eNB_UE_stats[i].timing_advance_update); + eNB->eNB_UE_stats[i].timing_advance_update); #endif @@ -3214,14 +3119,14 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_ // 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, + LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d, Processing HARQ feedback for UE %d (after PUSCH)\n",eNB->Mod_id, + eNB->dlsch_eNB[i][0]->rnti, frame,subframe, i); #endif process_HARQ_feedback(i, sched_subframe, - phy_vars_eNB, + eNB, 1, // pusch_flag 0, 0, @@ -3229,24 +3134,24 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_ #ifdef DEBUG_PHY_PROC LOG_D(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,subframe, - phy_vars_eNB->eNB_UE_stats[i].sector, + eNB->Mod_id,frame,subframe, + eNB->eNB_UE_stats[i].sector, harq_pid, i, ret, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->cqi_crc_status, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->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]); + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->cqi_crc_status, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], + eNB->eNB_UE_stats[i].ulsch_errors[harq_pid], + eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][0]); #endif // dump stats to VCD if (i==0) { - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_MCS0+harq_pid,phy_vars_eNB->pusch_stats_mcs[0][(frame*10)+subframe]); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RB0+harq_pid,phy_vars_eNB->pusch_stats_rb[0][(frame*10)+subframe]); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_ROUND0+harq_pid,phy_vars_eNB->pusch_stats_round[0][(frame*10)+subframe]); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RSSI0+harq_pid,dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[0]->ulsch_power[0])); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_MCS0+harq_pid,eNB->pusch_stats_mcs[0][(frame*10)+subframe]); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RB0+harq_pid,eNB->pusch_stats_rb[0][(frame*10)+subframe]); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_ROUND0+harq_pid,eNB->pusch_stats_round[0][(frame*10)+subframe]); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RSSI0+harq_pid,dB_fixed(eNB->lte_eNB_pusch_vars[0]->ulsch_power[0])); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES0+harq_pid,ret); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN0+harq_pid,(frame*10)+subframe); } @@ -3256,48 +3161,48 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_ // update ULSCH statistics for tracing if ((frame % 100 == 0) && (subframe == 4)) { for (harq_idx=0; harq_idx<8; harq_idx++) { - for (round=0; round<phy_vars_eNB->ulsch_eNB[i]->Mlimit; round++) { - if ((phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_idx][round] - - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round]) != 0) { - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_fer[harq_idx][round] = - (100*(phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_idx][round] - - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors_last[harq_idx][round]))/ - (phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_idx][round] - - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round]); + for (round=0; round<eNB->ulsch_eNB[i]->Mlimit; round++) { + if ((eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_idx][round] - + eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round]) != 0) { + eNB->eNB_UE_stats[i].ulsch_round_fer[harq_idx][round] = + (100*(eNB->eNB_UE_stats[i].ulsch_round_errors[harq_idx][round] - + eNB->eNB_UE_stats[i].ulsch_round_errors_last[harq_idx][round]))/ + (eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_idx][round] - + eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round]); } else { - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_fer[harq_idx][round] = 0; + eNB->eNB_UE_stats[i].ulsch_round_fer[harq_idx][round] = 0; } - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round] = - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_idx][round]; - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors_last[harq_idx][round] = - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_idx][round]; + eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round] = + eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_idx][round]; + eNB->eNB_UE_stats[i].ulsch_round_errors_last[harq_idx][round] = + eNB->eNB_UE_stats[i].ulsch_round_errors[harq_idx][round]; } } } if ((frame % 100 == 0) && (subframe==4)) { - 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); + eNB->eNB_UE_stats[i].dlsch_bitrate = (eNB->eNB_UE_stats[i].total_TBS - + eNB->eNB_UE_stats[i].total_TBS_last); - phy_vars_eNB->eNB_UE_stats[i].total_TBS_last = phy_vars_eNB->eNB_UE_stats[i].total_TBS; + eNB->eNB_UE_stats[i].total_TBS_last = eNB->eNB_UE_stats[i].total_TBS; } // CBA (non-LTE) - cba_procedures(sched_subframe,phy_vars_eNB,i,harq_pid,abstraction_flag); + cba_procedures(sched_subframe,eNB,i,harq_pid,abstraction_flag); } // loop i=0 ... NUMBER_OF_UE_MAX-1 if (abstraction_flag == 0) { - lte_eNB_I0_measurements(phy_vars_eNB, + lte_eNB_I0_measurements(eNB, subframe, 0, - phy_vars_eNB->first_run_I0_measurements); - phy_vars_eNB->first_run_I0_measurements = 0; + eNB->first_run_I0_measurements); + eNB->first_run_I0_measurements = 0; } #ifdef PHY_ABSTRACTION else { - lte_eNB_I0_measurements_emul(phy_vars_eNB, + lte_eNB_I0_measurements_emul(eNB, 0); } @@ -3307,11 +3212,11 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_ //} #ifdef EMOS - phy_procedures_emos_eNB_RX(subframe,phy_vars_eNB); + phy_procedures_emos_eNB_RX(subframe,eNB); #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); + stop_meas(&eNB->phy_proc_rx); } @@ -3345,8 +3250,8 @@ int phy_procedures_RN_eNB_TX(unsigned char last_slot, unsigned char next_slot, r return do_proc; } #endif -void phy_procedures_eNB_lte(unsigned char subframe,PHY_VARS_eNB **phy_vars_eNB,uint8_t abstraction_flag, - relaying_type_t r_type, PHY_VARS_RN *phy_vars_rn) +void phy_procedures_eNB_lte(unsigned char subframe,PHY_VARS_eNB **eNB,uint8_t abstraction_flag, + relaying_type_t r_type, PHY_VARS_RN *rn) { #if defined(ENABLE_ITTI) MessageDef *msg_p; @@ -3360,12 +3265,12 @@ void phy_procedures_eNB_lte(unsigned char subframe,PHY_VARS_eNB **phy_vars_eNB,u int CC_id=0; /* - if (phy_vars_eNB->proc[sched_subframe].frame_tx >= 1000) + if (eNB->proc[sched_subframe].frame_tx >= 1000) mac_xface->macphy_exit("Exiting after 1000 Frames\n"); */ - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_ENB, phy_vars_eNB[0]->proc[subframe].frame_tx); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_ENB, eNB[0]->proc[subframe].frame_tx); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_LTE,1); - start_meas(&phy_vars_eNB[0]->phy_proc); + start_meas(&eNB[0]->phy_proc); #if defined(ENABLE_ITTI) @@ -3512,45 +3417,45 @@ void phy_procedures_eNB_lte(unsigned char subframe,PHY_VARS_eNB **phy_vars_eNB,u for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { - if ((((phy_vars_eNB[CC_id]->lte_frame_parms.frame_type == TDD)&& - (subframe_select(&phy_vars_eNB[CC_id]->lte_frame_parms,phy_vars_eNB[CC_id]->proc[subframe].subframe_tx)==SF_DL))|| - (phy_vars_eNB[CC_id]->lte_frame_parms.frame_type == FDD))) { + if ((((eNB[CC_id]->lte_frame_parms.frame_type == TDD)&& + (subframe_select(&eNB[CC_id]->lte_frame_parms,eNB[CC_id]->proc[subframe].subframe_tx)==SF_DL))|| + (eNB[CC_id]->lte_frame_parms.frame_type == FDD))) { #ifdef Rel10 - if (phy_procedures_RN_eNB_TX(phy_vars_eNB[CC_id]->proc[subframe].subframe_rx, phy_vars_eNB[CC_id]->proc[subframe].subframe_tx, r_type) != 0 ) + if (phy_procedures_RN_eNB_TX(eNB[CC_id]->proc[subframe].subframe_rx, eNB[CC_id]->proc[subframe].subframe_tx, r_type) != 0 ) #endif - phy_procedures_eNB_TX(subframe,phy_vars_eNB[CC_id],abstraction_flag,r_type,phy_vars_rn); + phy_procedures_eNB_TX(subframe,eNB[CC_id],abstraction_flag,r_type,rn); } - if ((((phy_vars_eNB[CC_id]->lte_frame_parms.frame_type == TDD )&& - (subframe_select(&phy_vars_eNB[CC_id]->lte_frame_parms,phy_vars_eNB[CC_id]->proc[subframe].subframe_rx)==SF_UL)) || - (phy_vars_eNB[CC_id]->lte_frame_parms.frame_type == FDD))) { - phy_procedures_eNB_RX(subframe,phy_vars_eNB[CC_id],abstraction_flag,r_type); + if ((((eNB[CC_id]->lte_frame_parms.frame_type == TDD )&& + (subframe_select(&eNB[CC_id]->lte_frame_parms,eNB[CC_id]->proc[subframe].subframe_rx)==SF_UL)) || + (eNB[CC_id]->lte_frame_parms.frame_type == FDD))) { + phy_procedures_eNB_RX(subframe,eNB[CC_id],abstraction_flag,r_type); } - if (subframe_select(&phy_vars_eNB[CC_id]->lte_frame_parms,phy_vars_eNB[CC_id]->proc[subframe].subframe_tx)==SF_S) { + if (subframe_select(&eNB[CC_id]->lte_frame_parms,eNB[CC_id]->proc[subframe].subframe_tx)==SF_S) { #ifdef Rel10 if (phy_procedures_RN_eNB_TX(subframe, subframe, r_type) != 0 ) #endif - phy_procedures_eNB_TX(subframe,phy_vars_eNB[CC_id],abstraction_flag,r_type,phy_vars_rn); + phy_procedures_eNB_TX(subframe,eNB[CC_id],abstraction_flag,r_type,rn); } - if ((subframe_select(&phy_vars_eNB[CC_id]->lte_frame_parms,phy_vars_eNB[CC_id]->proc[subframe].subframe_rx)==SF_S)) { - phy_procedures_eNB_S_RX(subframe,phy_vars_eNB[CC_id],abstraction_flag,r_type); + if ((subframe_select(&eNB[CC_id]->lte_frame_parms,eNB[CC_id]->proc[subframe].subframe_rx)==SF_S)) { + phy_procedures_eNB_S_RX(subframe,eNB[CC_id],abstraction_flag,r_type); } - phy_vars_eNB[CC_id]->proc[subframe].frame_tx++; - phy_vars_eNB[CC_id]->proc[subframe].frame_rx++; + eNB[CC_id]->proc[subframe].frame_tx++; + eNB[CC_id]->proc[subframe].frame_rx++; - if (phy_vars_eNB[CC_id]->proc[subframe].frame_tx>=MAX_FRAME_NUMBER) // defined in impl_defs_top.h - phy_vars_eNB[CC_id]->proc[subframe].frame_tx-=MAX_FRAME_NUMBER; + if (eNB[CC_id]->proc[subframe].frame_tx>=MAX_FRAME_NUMBER) // defined in impl_defs_top.h + eNB[CC_id]->proc[subframe].frame_tx-=MAX_FRAME_NUMBER; - if (phy_vars_eNB[CC_id]->proc[subframe].frame_rx>=MAX_FRAME_NUMBER) - phy_vars_eNB[CC_id]->proc[subframe].frame_rx-=MAX_FRAME_NUMBER; + if (eNB[CC_id]->proc[subframe].frame_rx>=MAX_FRAME_NUMBER) + eNB[CC_id]->proc[subframe].frame_rx-=MAX_FRAME_NUMBER; } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_LTE,0); - stop_meas(&phy_vars_eNB[0]->phy_proc); + stop_meas(&eNB[0]->phy_proc); } diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index ac09ac77b3..084173248f 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -115,7 +115,7 @@ extern int rx_sig_fifo; extern uint32_t downlink_frequency[MAX_NUM_CCs][4]; #endif -#ifdef USER_MODE + void dump_dlsch(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid) { @@ -286,7 +286,7 @@ void dump_dlsch_ra(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe) write_output("dlsch_mag1.m","dlschmag1",phy_vars_ue->lte_ue_pdsch_vars_ra[0]->dl_ch_mag0,300*nsymb,1,1); write_output("dlsch_mag2.m","dlschmag2",phy_vars_ue->lte_ue_pdsch_vars_ra[0]->dl_ch_magb0,300*nsymb,1,1); } -#endif + void phy_reset_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) { @@ -367,13 +367,11 @@ void process_timing_advance_rar(PHY_VARS_UE *phy_vars_ue,uint16_t timing_advance timing_advance = timing_advance - (1<<11); */ - if (openair_daq_vars.manual_timing_advance == 0) { - phy_vars_ue->timing_advance = timing_advance*4; + phy_vars_ue->timing_advance = timing_advance*4; - } #ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[UE %d] Frame %d, received (rar) timing_advance %d, HW timing advance %d\n",phy_vars_ue->Mod_id,phy_vars_ue->frame_rx, phy_vars_ue->timing_advance,openair_daq_vars.timing_advance); + LOG_I(PHY,"[UE %d] Frame %d, received (rar) timing_advance %d, HW timing advance %d\n",phy_vars_ue->Mod_id,phy_vars_ue->frame_rx, phy_vars_ue->timing_advance); #endif } @@ -386,11 +384,8 @@ void process_timing_advance(uint8_t Mod_id,uint8_t CC_id,int16_t timing_advance) // timing advance has Q1.5 format timing_advance = timing_advance - 31; - if (openair_daq_vars.manual_timing_advance == 0) { - //if ( (frame % 100) == 0) { - //if ((timing_advance > 3) || (timing_advance < -3) ) - PHY_vars_UE_g[Mod_id][CC_id]->timing_advance = PHY_vars_UE_g[Mod_id][CC_id]->timing_advance+timing_advance*4; //this is for 25RB only!!! - } + PHY_vars_UE_g[Mod_id][CC_id]->timing_advance = PHY_vars_UE_g[Mod_id][CC_id]->timing_advance+timing_advance*4; //this is for 25RB only!!! + LOG_I(PHY,"[UE %d] Got timing advance %d from MAC, new value %d\n",Mod_id, timing_advance, PHY_vars_UE_g[Mod_id][CC_id]->timing_advance); @@ -1223,7 +1218,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)//this is the EXPRESS MIMO case ulsch_start = (phy_vars_ue->rx_offset+subframe_tx*frame_parms->samples_per_tti- - openair_daq_vars.timing_advance- + phy_vars_ue->hw_timing_advance- phy_vars_ue->timing_advance- phy_vars_ue->N_TA_offset+5)%(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti); #else //this is the normal case @@ -1234,7 +1229,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra Mod_id,frame_tx,subframe_tx, ulsch_start, phy_vars_ue->rx_offset, - openair_daq_vars.timing_advance, + phy_vars_ue->hw_timing_advance, phy_vars_ue->timing_advance, phy_vars_ue->N_TA_offset); @@ -1525,14 +1520,7 @@ void lte_ue_measurement_procedures(uint16_t l, PHY_VARS_UE *phy_vars_ue,uint8_t // AGC VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GAIN_CONTROL, VCD_FUNCTION_IN); -#if defined EXMIMO - if ((openair_daq_vars.rx_gain_mode == DAQ_AGC_ON) && - (mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) ) - if (phy_vars_ue->frame_rx%100==0) - gain_control_all(dB_fixed(phy_vars_ue->PHY_measurements.rssi),0); - -#else #ifndef OAI_USRP #ifndef OAI_BLADERF #ifndef OAI_LMSSDR @@ -1540,7 +1528,7 @@ void lte_ue_measurement_procedures(uint16_t l, PHY_VARS_UE *phy_vars_ue,uint8_t #endif #endif #endif -#endif + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GAIN_CONTROL, VCD_FUNCTION_OUT); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_IN); eNB_id = 0; @@ -1554,29 +1542,6 @@ void lte_ue_measurement_procedures(uint16_t l, PHY_VARS_UE *phy_vars_ue,uint8_t VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_OUT); - /* if (openair_daq_vars.auto_freq_correction == 1) { - if (frame_rx % 100 == 0) { - if ((phy_vars_ue->lte_ue_common_vars.freq_offset>100) && (openair_daq_vars.freq_offset < 1000)) { - openair_daq_vars.freq_offset+=100; - #if defined(EXMIMO) && defined(DRIVER2013) - for (aa = 0; aa<4; aa++) { - p_exmimo_config->rf.rf_freq_rx[aa] = downlink_frequency[aa]+=openair_daq_vars.freq_offset; - p_exmimo_config->rf.rf_freq_tx[aa] = downlink_frequency[aa]+=openair_daq_vars.freq_offset; - } - #endif - } - else if ((phy_vars_ue->lte_ue_common_vars.freq_offset<-100) && (openair_daq_vars.freq_offset > -1000)) { - openair_daq_vars.freq_offset-=100; - #if defined(EXMIMO) && defined(DRIVER2013) - for (aa = 0; aa<4; aa++) { - p_exmimo_config->rf.rf_freq_rx[aa] = downlink_frequency[aa]+=openair_daq_vars.freq_offset; - p_exmimo_config->rf.rf_freq_tx[aa] = downlink_frequency[aa]+=openair_daq_vars.freq_offset; - } - #endif - } - } - }*/ - } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_MEASUREMENT_PROCEDURES, VCD_FUNCTION_OUT); @@ -1681,9 +1646,7 @@ void restart_phy(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_fla // first_run = 1; if (abstraction_flag ==0 ) { - openair_daq_vars.mode = openair_NOT_SYNCHED; phy_vars_ue->UE_mode[eNB_id] = NOT_SYNCHED; - openair_daq_vars.sync_state=0; } else { phy_vars_ue->UE_mode[eNB_id] = PRACH; phy_vars_ue->prach_resources[eNB_id]=NULL; @@ -1691,8 +1654,8 @@ void restart_phy(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_fla phy_vars_ue->frame_rx = -1; phy_vars_ue->frame_tx = -1; - openair_daq_vars.synch_wait_cnt=0; - openair_daq_vars.sched_cnt=-1; + // phy_vars_ue->synch_wait_cnt=0; + // phy_vars_ue->sched_cnt=-1; phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq=0; phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors=0; @@ -2564,7 +2527,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac if ((phy_vars_ue->transmission_mode[eNB_id] == 5) && (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) && - (openair_daq_vars.use_ia_receiver ==1)) { + (phy_vars_ue->use_ia_receiver ==1)) { dual_stream_UE = 1; eNB_id_i = phy_vars_ue->n_connected_eNB; i_mod = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Qm; @@ -2975,9 +2938,9 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac if (ret == (1+phy_vars_ue->dlsch_ue_ra[eNB_id]->max_turbo_iterations)) { phy_vars_ue->dlsch_ra_errors[eNB_id]++; LOG_D(PHY,"[UE %d] Frame %d, subframe %d, received RA in error\n",phy_vars_ue->Mod_id,frame_rx,subframe_prev); -#ifdef USER_MODE - //dump_dlsch_ra(phy_vars_ue,eNB_id,subframe_prev); -#endif + + // dump_dlsch_ra(phy_vars_ue,eNB_id,subframe_prev); exit(-1); + // 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); @@ -3107,7 +3070,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac if ((phy_vars_ue->transmission_mode[eNB_id] == 5) && (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) && - (openair_daq_vars.use_ia_receiver ==1)) { + (phy_vars_ue->use_ia_receiver ==1)) { dual_stream_UE = 1; eNB_id_i = phy_vars_ue->n_connected_eNB; i_mod = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Qm; @@ -3176,7 +3139,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac if ((phy_vars_ue->transmission_mode[eNB_id] == 5) && (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) && - (openair_daq_vars.use_ia_receiver ==1)) { + (phy_vars_ue->use_ia_receiver ==1)) { dual_stream_UE = 1; eNB_id_i = phy_vars_ue->n_connected_eNB; i_mod = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Qm; diff --git a/openair1/SCHED/vars.h b/openair1/SCHED/vars.h index 532251a2f0..2c4c93cfad 100644 --- a/openair1/SCHED/vars.h +++ b/openair1/SCHED/vars.h @@ -28,7 +28,6 @@ *******************************************************************************/ #include "defs.h" -OPENAIR_DAQ_VARS openair_daq_vars; diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c index 4d8e32b63c..62422bf9ae 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c @@ -569,17 +569,9 @@ schedule_ue_spec( eNB_UE_stats->DL_cqi[0], MIN_CQI_VALUE, MAX_CQI_VALUE); */ eNB_UE_stats->dlsch_mcs1 = cqi_to_mcs[eNB_UE_stats->DL_cqi[0]]; - eNB_UE_stats->dlsch_mcs1 = cmin(eNB_UE_stats->dlsch_mcs1, openair_daq_vars.target_ue_dl_mcs); + eNB_UE_stats->dlsch_mcs1 = eNB_UE_stats->dlsch_mcs1;//cmin(eNB_UE_stats->dlsch_mcs1, openair_daq_vars.target_ue_dl_mcs); -#ifdef EXMIMO - - if (mac_xface->get_transmission_mode(module_idP,CC_id, rnti)==5) { - eNB_UE_stats->dlsch_mcs1 = cmin(eNB_UE_stats->dlsch_mcs1,16); - } - -#endif - // store stats UE_list->eNB_UE_stats[CC_id][UE_id].dl_cqi= eNB_UE_stats->DL_cqi[0]; diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c index 2973bedd00..e508e24eb5 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c @@ -826,14 +826,14 @@ void schedule_ulsch_rnti(module_id_t module_idP, UE_list->eNB_UE_stats[CC_id][UE_id].normalized_rx_power=normalized_rx_power; UE_list->eNB_UE_stats[CC_id][UE_id].target_rx_power=target_rx_power; UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs1=UE_template->pre_assigned_mcs_ul; - mcs = cmin (UE_template->pre_assigned_mcs_ul, openair_daq_vars.target_ue_ul_mcs); // adjust, based on user-defined MCS + mcs = UE_template->pre_assigned_mcs_ul;//cmin (UE_template->pre_assigned_mcs_ul, openair_daq_vars.target_ue_ul_mcs); // adjust, based on user-defined MCS if ((cqi_req==1) && (mcs>19)) { mcs=19; } if (UE_template->pre_allocated_rb_table_index_ul >=0) { rb_table_index=UE_template->pre_allocated_rb_table_index_ul; } else { - mcs=cmin (10, openair_daq_vars.target_ue_ul_mcs); + mcs=10;//cmin (10, openair_daq_vars.target_ue_ul_mcs); rb_table_index=5; // for PHR } @@ -1171,7 +1171,7 @@ void schedule_ulsch_cba_rnti(module_id_t module_idP, unsigned char cooperation_f required_rbs[cba_group] = 0; num_cba_resources[cba_group]=0; active_UEs[cba_group]=0; - mcs[cba_group]=openair_daq_vars.target_ue_ul_mcs; + mcs[cba_group]=10;//openair_daq_vars.target_ue_ul_mcs; } //LOG_D(MAC, "[eNB ] CBA granted ues are %d\n",granted_UEs ); @@ -1219,7 +1219,7 @@ void schedule_ulsch_cba_rnti(module_id_t module_idP, unsigned char cooperation_f } } - mcs[cba_group]= cmin(mcs[cba_group],openair_daq_vars.target_ue_ul_mcs); + mcs[cba_group]= mcs[cba_group];//cmin(mcs[cba_group],openair_daq_vars.target_ue_ul_mcs); if (available_rbs < min_rb_unit ) break; diff --git a/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c index fe8fe55d44..d28614699b 100644 --- a/openair2/LAYER2/MAC/pre_processor.c +++ b/openair2/LAYER2/MAC/pre_processor.c @@ -178,7 +178,7 @@ void assign_rbs_required (module_id_t Mod_id, */ eNB_UE_stats[CC_id]->dlsch_mcs1=cqi_to_mcs[eNB_UE_stats[CC_id]->DL_cqi[0]]; - eNB_UE_stats[CC_id]->dlsch_mcs1 = cmin(eNB_UE_stats[CC_id]->dlsch_mcs1,openair_daq_vars.target_ue_dl_mcs); + eNB_UE_stats[CC_id]->dlsch_mcs1 = eNB_UE_stats[CC_id]->dlsch_mcs1;//cmin(eNB_UE_stats[CC_id]->dlsch_mcs1,openair_daq_vars.target_ue_dl_mcs); } diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 822409f302..e903fd0c9a 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -114,15 +114,14 @@ unsigned short config_frames[4] = {2,9,11,13}; #endif // In lte-enb.c -int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]); - +extern int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]); extern void init_eNB(void); extern void stop_eNB(void); extern void kill_eNB_proc(void); // In lte-ue.c -int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]); -void fill_ue_band_info(void); +extern int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]); +extern void fill_ue_band_info(void); extern void init_UE(void); #ifdef XFORMS @@ -1139,6 +1138,7 @@ int main( int argc, char **argv ) memset(tx_max_power,0,sizeof(int)*MAX_NUM_CCs); set_latency_target(); + // det defaults for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { frame_parms[CC_id] = (LTE_DL_FRAME_PARMS*) malloc(sizeof(LTE_DL_FRAME_PARMS)); /* Set some default values that may be overwritten while reading options */ @@ -1342,7 +1342,7 @@ int main( int argc, char **argv ) else UE[CC_id]->mac_enabled = 1; - if (UE[CC_id]->mac_enabled == 0) { + if (UE[CC_id]->mac_enabled == 0) { //set default UL parameters for testing mode for (i=0; i<NUMBER_OF_CONNECTED_eNB_MAX; i++) { UE[CC_id]->pusch_config_dedicated[i].betaOffset_ACK_Index = beta_ACK; UE[CC_id]->pusch_config_dedicated[i].betaOffset_RI_Index = beta_RI; @@ -1373,13 +1373,6 @@ int main( int argc, char **argv ) } - openair_daq_vars.manual_timing_advance = 0; - openair_daq_vars.rx_gain_mode = DAQ_AGC_ON; - openair_daq_vars.auto_freq_correction = 0; - openair_daq_vars.use_ia_receiver = 0; - - - // printf("tx_max_power = %d -> amp %d\n",tx_max_power,get_tx_amp(tx_max_power,tx_max_power)); } else { //this is eNB @@ -1390,12 +1383,10 @@ int main( int argc, char **argv ) PHY_vars_eNB_g[0][CC_id] = init_lte_eNB(frame_parms[CC_id],0,frame_parms[CC_id]->Nid_cell,cooperation_flag,transmission_mode,abstraction_flag); PHY_vars_eNB_g[0][CC_id]->CC_id = CC_id; - if (phy_test==1) - PHY_vars_eNB_g[0][CC_id]->mac_enabled = 0; - else - PHY_vars_eNB_g[0][CC_id]->mac_enabled = 1; + if (phy_test==1) PHY_vars_eNB_g[0][CC_id]->mac_enabled = 0; + else PHY_vars_eNB_g[0][CC_id]->mac_enabled = 1; - if (PHY_vars_eNB_g[0][CC_id]->mac_enabled == 0) { + if (PHY_vars_eNB_g[0][CC_id]->mac_enabled == 0) { //set default parameters for testing mode for (i=0; i<NUMBER_OF_UE_MAX; i++) { PHY_vars_eNB_g[0][CC_id]->pusch_config_dedicated[i].betaOffset_ACK_Index = beta_ACK; PHY_vars_eNB_g[0][CC_id]->pusch_config_dedicated[i].betaOffset_RI_Index = beta_RI; @@ -1413,7 +1404,6 @@ int main( int argc, char **argv ) PHY_vars_eNB_g[0][CC_id]->rx_total_gain_eNB_dB = (int)rx_gain[CC_id][0]; - //already taken care of in lte-softmodem.c PHY_vars_eNB_g[0][CC_id]->N_TA_offset = 0; } @@ -1422,11 +1412,6 @@ int main( int argc, char **argv ) NB_eNB_INST=1; NB_INST=1; - openair_daq_vars.ue_dl_rb_alloc=0x1fff; - openair_daq_vars.target_ue_dl_mcs=target_dl_mcs; - openair_daq_vars.ue_ul_nb_rb=6; - openair_daq_vars.target_ue_ul_mcs=target_ul_mcs; - } fill_modeled_runtime_table(runtime_phy_rx,runtime_phy_tx); @@ -1644,11 +1629,16 @@ int main( int argc, char **argv ) // connect the TX/RX buffers if (UE_flag==1) { + + for (CC_id=0;CC_id<MAX_NUM_CCs; CC_id++) { + + #ifdef OAI_USRP - openair_daq_vars.timing_advance = timing_advance; + UE[CC_id]->hw_timing_advance = timing_advance; #else - openair_daq_vars.timing_advance = 160; + UE[CC_id]->hw_timing_advance = 160; #endif + } if (setup_ue_buffers(UE,&openair0_cfg[0],rf_map)!=0) { printf("Error setting up eNB buffer\n"); exit(-1); @@ -1673,7 +1663,8 @@ int main( int argc, char **argv ) } //p_exmimo_config->framing.tdd_config = TXRXSWITCH_TESTRX; } else { - openair_daq_vars.timing_advance = 0; + + if (setup_eNB_buffers(PHY_vars_eNB_g[0],&openair0_cfg[0],rf_map)!=0) { printf("Error setting up eNB buffer\n"); @@ -1684,6 +1675,7 @@ int main( int argc, char **argv ) // Set LSBs for antenna switch (ExpressMIMO) for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { + PHY_vars_eNB_g[0][CC_id]->hw_timing_advance = 0; for (i=0; i<frame_parms[CC_id]->samples_per_tti*10; i++) for (aa=0; aa<frame_parms[CC_id]->nb_antennas_tx; aa++) PHY_vars_eNB_g[0][CC_id]->lte_eNB_common_vars.txdata[0][aa][i] = 0x00010001; @@ -1730,13 +1722,16 @@ int main( int argc, char **argv ) sprintf (title, "LTE DL SCOPE UE"); fl_show_form (form_ue[UE_id]->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); + /* if (openair_daq_vars.use_ia_receiver) { fl_set_button(form_ue[UE_id]->button_0,1); fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver ON"); } else { fl_set_button(form_ue[UE_id]->button_0,0); fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver OFF"); - } + }*/ + fl_set_button(form_ue[UE_id]->button_0,0); + fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver OFF"); } ret = pthread_create(&forms_thread, NULL, scope_thread, NULL); diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 3049fd4e02..865f257135 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -1622,7 +1622,7 @@ int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, return(-1); } - + /* if (frame_parms->frame_type == TDD) { if (frame_parms->N_RB_DL == 100) N_TA_offset = 624; @@ -1631,7 +1631,7 @@ int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, else if (frame_parms->N_RB_DL == 25) N_TA_offset = 624/4; } - + */ // replace RX signal buffers with mmaped HW versions rxdata = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); diff --git a/targets/SIMU/USER/oaisim.c b/targets/SIMU/USER/oaisim.c index 8a5d23afac..7c335fdd10 100644 --- a/targets/SIMU/USER/oaisim.c +++ b/targets/SIMU/USER/oaisim.c @@ -500,7 +500,7 @@ l2l1_task (void *args_p) sprintf (title, "LTE DL SCOPE eNB %d to UE %d CC_id %d", eNB_inst, UE_inst, CC_id); fl_show_form (form_ue[CC_id][UE_inst]->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); - if (openair_daq_vars.use_ia_receiver == 1) { + if (PHY_vars_UE_g[UE_inst][CC_id]->use_ia_receiver == 1) { fl_set_button(form_ue[CC_id][UE_inst]->button_0,1); fl_set_object_label(form_ue[CC_id][UE_inst]->button_0, "IA Receiver ON"); fl_set_object_color(form_ue[CC_id][UE_inst]->button_0, FL_GREEN, FL_GREEN); diff --git a/targets/SIMU/USER/oaisim_functions.c b/targets/SIMU/USER/oaisim_functions.c index b87142c3e5..ea9d298904 100644 --- a/targets/SIMU/USER/oaisim_functions.c +++ b/targets/SIMU/USER/oaisim_functions.c @@ -951,22 +951,23 @@ void init_openair1(void) number_of_cards = 1; - openair_daq_vars.rx_rf_mode = 1; - openair_daq_vars.tdd = 1; - openair_daq_vars.rx_gain_mode = DAQ_AGC_ON; +// openair_daq_vars.rx_rf_mode = 1; +// openair_daq_vars.tdd = 1; +// openair_daq_vars.rx_gain_mode = DAQ_AGC_ON; - openair_daq_vars.dlsch_transmission_mode = oai_emulation.info.transmission_mode[0]; +// openair_daq_vars.dlsch_transmission_mode = oai_emulation.info.transmission_mode[0]; //#warning "NN->FK: OAI EMU channel abstraction does not work for MCS higher than" - openair_daq_vars.target_ue_dl_mcs = cmin(target_dl_mcs,16); - openair_daq_vars.target_ue_ul_mcs = target_ul_mcs; - openair_daq_vars.ue_dl_rb_alloc=0x1fff; - openair_daq_vars.ue_ul_nb_rb=6; - openair_daq_vars.dlsch_rate_adaptation = rate_adaptation_flag; - openair_daq_vars.use_ia_receiver = 0; +// openair_daq_vars.target_ue_dl_mcs = cmin(target_dl_mcs,16); +// openair_daq_vars.target_ue_ul_mcs = target_ul_mcs; +// openair_daq_vars.ue_dl_rb_alloc=0x1fff; +// openair_daq_vars.ue_ul_nb_rb=6; +// openair_daq_vars.dlsch_rate_adaptation = rate_adaptation_flag; //N_TA_offset for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { for (UE_id=0; UE_id<NB_UE_INST; UE_id++) { + PHY_vars_UE_g[UE_id][CC_id]->use_ia_receiver = 0; + if (PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.frame_type == TDD) { if (PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.N_RB_DL == 100) PHY_vars_UE_g[UE_id][CC_id]->N_TA_offset = 624; -- GitLab