From 81f04d29820986427d8a155fecf37c1c9cfb8997 Mon Sep 17 00:00:00 2001 From: Louis Adrien Dufrene <swmt1841@yd-CZC6227X3N.orangeai.mey> Date: Thu, 4 Apr 2019 08:17:26 +0200 Subject: [PATCH] Apply diff between ssr (CDRX) branch and develop --- common/utils/LOG/vcd_signal_dumper.c | 10 +- common/utils/LOG/vcd_signal_dumper.h | 8 + common/utils/T/T_defs.h | 2 +- common/utils/T/T_messages.txt | 40 + openair1/PHY/LTE_TRANSPORT/edci.c | 4 +- openair1/PHY/LTE_TRANSPORT/pucch.c | 19 +- openair1/PHY/LTE_TRANSPORT/transport_eNB.h | 2 +- openair1/SCHED/fapi_l1.c | 12 +- openair1/SCHED/phy_procedures_lte_eNb.c | 292 +++-- openair2/COMMON/rrc_messages_types.h | 9 + openair2/ENB_APP/enb_config.c | 345 ++++- openair2/ENB_APP/enb_config_eMTC.c | 9 +- openair2/ENB_APP/enb_paramdef.h | 61 +- openair2/ENB_APP/enb_paramdef_emtc.h | 6 + openair2/LAYER2/MAC/config.c | 355 ++++++ openair2/LAYER2/MAC/eNB_scheduler.c | 1123 +++++++++++------ openair2/LAYER2/MAC/eNB_scheduler_RA.c | 3 + openair2/LAYER2/MAC/eNB_scheduler_dlsch.c | 104 +- .../LAYER2/MAC/eNB_scheduler_primitives.c | 210 ++- openair2/LAYER2/MAC/eNB_scheduler_ulsch.c | 335 +++-- openair2/LAYER2/MAC/mac.h | 48 + openair2/LAYER2/MAC/mac_proto.h | 4 + openair2/LAYER2/MAC/pre_processor.c | 34 +- openair2/RRC/LTE/L2_interface_common.c | 35 +- openair2/RRC/LTE/L2_interface_ue.c | 324 +++-- openair2/RRC/LTE/MESSAGES/asn1_msg.c | 172 ++- openair2/RRC/LTE/MESSAGES/asn1_msg.h | 9 + openair2/RRC/LTE/rrc_UE.c | 6 +- openair2/RRC/LTE/rrc_UE_ral.c | 218 ++-- openair2/RRC/LTE/rrc_common.c | 26 +- openair2/RRC/LTE/rrc_defs.h | 2 + openair2/RRC/LTE/rrc_eNB.c | 548 ++++---- openair2/RRC/LTE/rrc_eNB_UE_context.c | 37 +- openair2/RRC/LTE/rrc_eNB_ral.c | 216 ++-- openair2/RRC/LTE/rrc_rrm_interface.c | 65 +- openair2/RRC/LTE/rrm_2_rrc_msg.c | 195 ++- openair2/RRC/LTE/utils.c | 24 +- 37 files changed, 3201 insertions(+), 1711 deletions(-) diff --git a/common/utils/LOG/vcd_signal_dumper.c b/common/utils/LOG/vcd_signal_dumper.c index 666bf46d44..2b18e75806 100644 --- a/common/utils/LOG/vcd_signal_dumper.c +++ b/common/utils/LOG/vcd_signal_dumper.c @@ -189,7 +189,15 @@ const char* eurecomVariablesNames[] = { "ue0_trx_write_ns_missing", "enb_thread_rxtx_CPUID", "ru_thread_CPUID", - "ru_thread_tx_CPUID" + "ru_thread_tx_CPUID", + "ue0_on_duration_timer", + "ue0_drx_inactivity", + "ue0_drx_short_cycle", + "ue0_short_drx_cycle_number", + "ue0_drx_long_cycle", + "ue0_drx_retransmission_harq0", + "ue0_drx_active_time", + "ue0_drx_active_time_condition" }; const char* eurecomFunctionsNames[] = { diff --git a/common/utils/LOG/vcd_signal_dumper.h b/common/utils/LOG/vcd_signal_dumper.h index 749978bb48..cb98da3e82 100644 --- a/common/utils/LOG/vcd_signal_dumper.h +++ b/common/utils/LOG/vcd_signal_dumper.h @@ -167,6 +167,14 @@ typedef enum { VCD_SIGNAL_DUMPER_VARIABLES_CPUID_ENB_THREAD_RXTX, VCD_SIGNAL_DUMPER_VARIABLES_CPUID_RU_THREAD, VCD_SIGNAL_DUMPER_VARIABLES_CPUID_RU_THREAD_TX, + VCD_SIGNAL_DUMPER_VARIABLES_ON_DURATION_TIMER, + VCD_SIGNAL_DUMPER_VARIABLES_DRX_INACTIVITY, + VCD_SIGNAL_DUMPER_VARIABLES_DRX_SHORT_CYCLE, + VCD_SIGNAL_DUMPER_VARIABLES_SHORT_DRX_CYCLE_NUMBER, + VCD_SIGNAL_DUMPER_VARIABLES_DRX_LONG_CYCLE, + VCD_SIGNAL_DUMPER_VARIABLES_DRX_RETRANSMISSION_HARQ0, + VCD_SIGNAL_DUMPER_VARIABLES_DRX_ACTIVE_TIME, + VCD_SIGNAL_DUMPER_VARIABLES_DRX_ACTIVE_TIME_CONDITION, VCD_SIGNAL_DUMPER_VARIABLES_END } vcd_signal_dump_variables; diff --git a/common/utils/T/T_defs.h b/common/utils/T/T_defs.h index 83a380662d..908a94f532 100644 --- a/common/utils/T/T_defs.h +++ b/common/utils/T/T_defs.h @@ -44,7 +44,7 @@ typedef struct { #define VCD_NUM_FUNCTIONS 190 /* number of VCD variables (to be kept up to date! see in T_messages.txt) */ -#define VCD_NUM_VARIABLES 128 +#define VCD_NUM_VARIABLES 136 /* first VCD function (to be kept up to date! see in T_messages.txt) */ #define VCD_FIRST_FUNCTION ((uintptr_t)T_VCD_FUNCTION_RT_SLEEP) diff --git a/common/utils/T/T_messages.txt b/common/utils/T/T_messages.txt index 1dbfe64a2a..3e3b5052e1 100644 --- a/common/utils/T/T_messages.txt +++ b/common/utils/T/T_messages.txt @@ -1676,6 +1676,46 @@ ID = VCD_VARIABLE_CPUID_RU_THREAD_TX GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value VCD_NAME = ru_thread_tx_CPUID +ID = VCD_VARIABLE_ON_DURATION_TIMER + DESC = VCD variable ON_DURATION_TIMER + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value + VCD_NAME = ue0_on_duration_timer +ID = VCD_VARIABLE_DRX_INACTIVITY + DESC = VCD variable DRX_INACTIVITY + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value + VCD_NAME = ue0_drx_inactivity +ID = VCD_VARIABLE_DRX_SHORT_CYCLE + DESC = VCD variable DRX_SHORT_CYCLE + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value + VCD_NAME = ue0_drx_short_cycle +ID = VCD_VARIABLE_SHORT_DRX_CYCLE_NUMBER + DESC = VCD variable SHORT_DRX_CYCLE_NUMBER + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value + VCD_NAME = ue0_short_drx_cycle_number +ID = VCD_VARIABLE_DRX_LONG_CYCLE + DESC = VCD variable DRX_LONG_CYCLE + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value + VCD_NAME = ue0_drx_long_cycle +ID = VCD_VARIABLE_DRX_RETRANSMISSION_HARQ0 + DESC = VCD variable DRX_RETRANSMISSION_HARQ0 + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value + VCD_NAME = ue0_drx_retransmission_harq0 +ID = VCD_VARIABLE_DRX_ACTIVE_TIME + DESC = VCD variable DRX_ACTIVE_TIME + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value + VCD_NAME = ue0_drx_active_time +ID = VCD_VARIABLE_DRX_ACTIVE_TIME_CONDITION + DESC = VCD variable DRX_ACTIVE_TIME_CONDITION + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value + VCD_NAME = ue0_drx_active_time_condition #functions diff --git a/openair1/PHY/LTE_TRANSPORT/edci.c b/openair1/PHY/LTE_TRANSPORT/edci.c index f1b5c356c7..b438953e83 100644 --- a/openair1/PHY/LTE_TRANSPORT/edci.c +++ b/openair1/PHY/LTE_TRANSPORT/edci.c @@ -115,8 +115,8 @@ void init_mpdcch5ss1tab_normal_regular_subframe_evenNRBDL(PHY_VARS_eNB * eNB) for (k = 0; k < 72; k++) { kmod = k % 12; if (((l != 5) && (l != 6) && (l != 12) && (l != 13)) || (kmod == 2) || (kmod == 3) || (kmod == 4) || (kmod == 7) || (kmod == 8) || (kmod == 9)) { - mpdcch5ss1tab[re] = (l * eNB->frame_parms.ofdm_symbol_size) + k; - re++; + mpdcch5ss1tab[re] = (l * eNB->frame_parms.ofdm_symbol_size) + k; + re++; } else if ((kmod == 0) || (kmod == 5) || (kmod == 10)) { mpdcch5ss1tab[re++] = (l * eNB->frame_parms.ofdm_symbol_size) + k; } diff --git a/openair1/PHY/LTE_TRANSPORT/pucch.c b/openair1/PHY/LTE_TRANSPORT/pucch.c index f9eee10b2a..676d753ab5 100644 --- a/openair1/PHY/LTE_TRANSPORT/pucch.c +++ b/openair1/PHY/LTE_TRANSPORT/pucch.c @@ -722,17 +722,13 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, #if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) ,uint8_t br_flag #endif - ) +) +//----------------------------------------------------------------------------- { - - - static int first_call=1; - LTE_eNB_COMMON *common_vars = &eNB->common_vars; - LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; - // PUCCH_CONFIG_DEDICATED *pucch_config_dedicated = &eNB->pucch_config_dedicated[UE_id]; - - int8_t sigma2_dB = max(eNB->measurements.n0_subband_power_tot_dB[0], - eNB->measurements.n0_subband_power_tot_dB[eNB->frame_parms.N_RB_UL-1]); + static int first_call = 1; + LTE_eNB_COMMON *common_vars = &eNB->common_vars; + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; + int8_t sigma2_dB = max(eNB->measurements.n0_subband_power_tot_dB[0], eNB->measurements.n0_subband_power_tot_dB[eNB->frame_parms.N_RB_UL-1]); uint32_t u,v,n,aa; uint32_t z[12*14]; @@ -770,7 +766,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, uint16_t Ret = 0; int16_t SubCarrierDeMapData[NB_ANTENNAS_RX][14][12][2]; //[Antenna][Symbol][Subcarrier][Complex] int16_t CshData_fmt3[NB_ANTENNAS_RX][14][12][2]; //[Antenna][Symbol][Subcarrier][Complex] - double delta_theta[NB_ANTENNAS_RX][12]; //[Antenna][Subcarrier][Complex] + double delta_theta[NB_ANTENNAS_RX][12]; //[Antenna][Subcarrier][Complex] int16_t ChestValue[NB_ANTENNAS_RX][2][12][2]; //[Antenna][Slot][Subcarrier][Complex] int16_t ChdetAfterValue_fmt3[NB_ANTENNAS_RX][14][12][2]; //[Antenna][Symbol][Subcarrier][Complex] int16_t RemoveFrqDev_fmt3[NB_ANTENNAS_RX][2][5][12][2]; //[Antenna][Slot][PUCCH_Symbol][Subcarrier][Complex] @@ -779,7 +775,6 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, int16_t Fmt3xDataAvgSym[2][12][2]; //[Slot][Subcarrier][Complex] int16_t IFFTOutData_Fmt3[2][12][2]; //[Slot][Subcarrier][Complex] int16_t b[48]; //[bit] - //int16_t IP_CsData_allavg[NB_ANTENNAS_RX][12][4][2]; //[Antenna][Symbol][Nouse Cyclic Shift][Complex] int16_t payload_entity = -1; int16_t Interpw; int16_t payload_max; diff --git a/openair1/PHY/LTE_TRANSPORT/transport_eNB.h b/openair1/PHY/LTE_TRANSPORT/transport_eNB.h index 35e7beeeab..6c1f674788 100644 --- a/openair1/PHY/LTE_TRANSPORT/transport_eNB.h +++ b/openair1/PHY/LTE_TRANSPORT/transport_eNB.h @@ -329,7 +329,7 @@ typedef struct { uint8_t subframe; /// corresponding UE RNTI uint16_t rnti; - /// Type (SR,HARQ,CQI,HARQ_SR,HARQ_CQI,SR_CQI,HARQ_SR_CQI) + /// Type (SR, HARQ, CQI, HARQ_SR, HARQ_CQI, SR_CQI, HARQ_SR_CQI) UCI_type_t type; /// SRS active flag uint8_t srs_active; diff --git a/openair1/SCHED/fapi_l1.c b/openair1/SCHED/fapi_l1.c index 094f972253..1935f98579 100644 --- a/openair1/SCHED/fapi_l1.c +++ b/openair1/SCHED/fapi_l1.c @@ -598,7 +598,12 @@ void handle_uci_harq_information(PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci,nfapi_ul_co } } -void handle_uci_sr_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe,uint8_t srs_active) +void handle_uci_sr_pdu(PHY_VARS_eNB *eNB, + int UE_id, + nfapi_ul_config_request_pdu_t *ul_config_pdu, + uint16_t frame, + uint8_t subframe, + uint8_t srs_active) { LTE_eNB_UCI *uci = &eNB->uci_vars[UE_id]; @@ -620,7 +625,10 @@ void handle_uci_sr_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t uci->total_repetitions = ul_config_pdu->uci_sr_pdu.ue_information.ue_information_rel13.total_number_of_repetitions; #endif LOG_D(PHY,"Programming UCI SR rnti %x, pucch1_0 %d for (%d,%d)\n", - uci->rnti,uci->n_pucch_1_0_sr[0],frame,subframe); + uci->rnti, + uci->n_pucch_1_0_sr[0], + frame, + subframe); } void handle_uci_sr_harq_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe,uint8_t srs_active) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 2dc16ef110..25b4a46a96 100644 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -684,54 +684,69 @@ void fill_sr_indication(PHY_VARS_eNB *eNB,uint16_t rnti,int frame,int subframe,u pthread_mutex_unlock(&eNB->UL_INFO_mutex); } -void uci_procedures(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc) +//----------------------------------------------------------------------------- +/* + * Main handler of PUCCH received + */ +void +uci_procedures(PHY_VARS_eNB *eNB, + L1_rxtx_proc_t *proc) +//----------------------------------------------------------------------------- { - LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; - uint8_t SR_payload = 0,pucch_b0b1[4][2]= {{0,0},{0,0},{0,0},{0,0}},harq_ack[4]={0,0,0,0}; - int32_t metric[4]={0,0,0,0},metric_SR=0,max_metric=0; + uint8_t SR_payload = 0; + uint8_t pucch_b0b1[4][2] = {{0,0},{0,0},{0,0},{0,0}}; + uint8_t harq_ack[4] = {0,0,0,0}; + uint16_t tdd_multiplexing_mask = 0; + int32_t metric[4] = {0,0,0,0}; + int32_t metric_SR = 0; + int32_t max_metric = 0; const int subframe = proc->subframe_rx; const int frame = proc->frame_rx; - int i; - LTE_eNB_UCI *uci; - uint16_t tdd_multiplexing_mask=0; - - for (i=0;i<NUMBER_OF_UE_MAX;i++) { - - - uci = &eNB->uci_vars[i]; + LTE_eNB_UCI *uci = NULL; + LTE_DL_FRAME_PARMS *fp = &(eNB->frame_parms); + + for (int i = 0; i < NUMBER_OF_UE_MAX; i++) { + uci = &(eNB->uci_vars[i]); + if ((uci->active == 1) && (uci->frame == frame) && (uci->subframe == subframe)) { + LOG_D(PHY,"Frame %d, subframe %d: Running uci procedures (type %d) for %d \n", + frame, + subframe, + uci->type, + i); - LOG_D (PHY, "Frame %d, subframe %d: Running uci procedures (type %d) for %d \n", frame, subframe, uci->type, i); uci->active = 0; - + // Null out PUCCH PRBs for noise measurement switch (fp->N_RB_UL) { - case 6: - eNB->rb_mask_ul[0] |= (0x1 | (1 << 5)); //position 5 - break; - case 15: - eNB->rb_mask_ul[0] |= (0x1 | (1 << 14)); // position 14 - break; - case 25: - eNB->rb_mask_ul[0] |= (0x1 | (1 << 24)); // position 24 - break; - case 50: - eNB->rb_mask_ul[0] |= 0x1; - eNB->rb_mask_ul[1] |= (1 << 17); // position 49 (49-32) - break; - case 75: - eNB->rb_mask_ul[0] |= 0x1; - eNB->rb_mask_ul[2] |= (1 << 10); // position 74 (74-64) - break; - case 100: - 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", fp->N_RB_UL); - break; + case 6: + eNB->rb_mask_ul[0] |= (0x1 | (1 << 5)); // position 5 + break; + case 15: + eNB->rb_mask_ul[0] |= (0x1 | (1 << 14)); // position 14 + break; + case 25: + eNB->rb_mask_ul[0] |= (0x1 | (1 << 24)); // position 24 + break; + case 50: + eNB->rb_mask_ul[0] |= 0x1; + eNB->rb_mask_ul[1] |= (1 << 17); // position 49 (49-32) + break; + case 75: + eNB->rb_mask_ul[0] |= 0x1; + eNB->rb_mask_ul[2] |= (1 << 10); // position 74 (74-64) + break; + case 100: + 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", fp->N_RB_UL); + break; } + SR_payload = 0; + switch (uci->type) { case SR: case HARQ_SR: @@ -1236,8 +1251,8 @@ void uci_procedures(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc) } } } - } - } + } // end if ((uci->active == 1) && (uci->frame == frame) && (uci->subframe == subframe)) { + } // end loop for (int i = 0; i < NUMBER_OF_UE_MAX; i++) { } void pusch_procedures(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc) @@ -1602,87 +1617,152 @@ void fill_rx_indication(PHY_VARS_eNB *eNB,int UE_id,int frame,int subframe) { pthread_mutex_unlock(&eNB->UL_INFO_mutex); } -/* release the harq if its round is >= 'after_rounds' */ -static void do_release_harq(PHY_VARS_eNB *eNB,int UE_id,int tb,uint16_t frame,uint8_t subframe,uint16_t mask, int after_rounds) { - - LTE_eNB_DLSCH_t *dlsch0=NULL,*dlsch1=NULL; - LTE_DL_eNB_HARQ_t *dlsch0_harq=NULL,*dlsch1_harq=NULL; +//----------------------------------------------------------------------------- +/* + * Release the harq if its round is >= 'after_rounds' + */ +static void do_release_harq(PHY_VARS_eNB *eNB, + int UE_id, + int tb, + uint16_t frame, + uint8_t subframe, + uint16_t mask, + int after_rounds) +//----------------------------------------------------------------------------- +{ + LTE_eNB_DLSCH_t *dlsch0 = NULL; + LTE_eNB_DLSCH_t *dlsch1 = NULL; + LTE_DL_eNB_HARQ_t *dlsch0_harq = NULL; + LTE_DL_eNB_HARQ_t *dlsch1_harq = NULL; + int UE_id_mac = -1; + UE_sched_ctrl *UE_scheduling_control = NULL; int harq_pid; - int subframe_tx,frame_tx; - int M,m; - AssertFatal (UE_id != -1, "no existing dlsch context\n"); - AssertFatal (UE_id < NUMBER_OF_UE_MAX, "returned UE_id %d >= %d(NUMBER_OF_UE_MAX)\n", UE_id, NUMBER_OF_UE_MAX); + int subframe_tx; + int frame_tx; + + AssertFatal(UE_id != -1, "No existing dlsch context\n"); + AssertFatal(UE_id < NUMBER_OF_UE_MAX, "Returned UE_id %d >= %d (NUMBER_OF_UE_MAX)\n", UE_id, NUMBER_OF_UE_MAX); + dlsch0 = eNB->dlsch[UE_id][0]; dlsch1 = eNB->dlsch[UE_id][1]; - - if (eNB->frame_parms.frame_type == FDD) { - subframe_tx = (subframe+6)%10; - frame_tx = ul_ACK_subframe2_dl_frame(&eNB->frame_parms,frame,subframe,subframe_tx); - harq_pid = dlsch0->harq_ids[frame_tx%2][subframe_tx]; // or just use 0 for fdd? - - AssertFatal((harq_pid>=0) && (harq_pid<10),"harq_pid %d not in 0...9\n",harq_pid); - dlsch0_harq = dlsch0->harq_processes[harq_pid]; - dlsch1_harq = dlsch1->harq_processes[harq_pid]; - AssertFatal(dlsch0_harq!=NULL,"dlsch0_harq is null\n"); + + UE_id_mac = find_UE_id(eNB->Mod_id, dlsch0->rnti); + UE_scheduling_control = &(RC.mac[eNB->Mod_id]->UE_list.UE_sched_ctrl[UE_id_mac]); + + if (eNB->frame_parms.frame_type == FDD) { + subframe_tx = (subframe + 6) % 10; + frame_tx = ul_ACK_subframe2_dl_frame(&eNB->frame_parms, + frame, + subframe, + subframe_tx); + + harq_pid = dlsch0->harq_ids[frame_tx%2][subframe_tx]; + + AssertFatal((harq_pid >= 0) && (harq_pid < 8),"harq_pid %d not in 0...7\n", harq_pid); + + dlsch0_harq = dlsch0->harq_processes[harq_pid]; + dlsch1_harq = dlsch1->harq_processes[harq_pid]; + AssertFatal(dlsch0_harq != NULL, "dlsch0_harq is null\n"); + #if T_TRACER if (after_rounds != -1) { - T(T_ENB_PHY_DLSCH_UE_NACK, T_INT(0), T_INT(frame), T_INT(subframe), - T_INT(dlsch0->rnti), T_INT(harq_pid)); + T(T_ENB_PHY_DLSCH_UE_NACK, + T_INT(0), + T_INT(frame), + T_INT(subframe), + T_INT(dlsch0->rnti), + T_INT(harq_pid)); } else { - T(T_ENB_PHY_DLSCH_UE_ACK, T_INT(0), T_INT(frame), T_INT(subframe), - T_INT(dlsch0->rnti), T_INT(harq_pid)); + T(T_ENB_PHY_DLSCH_UE_ACK, + T_INT(0), + T_INT(frame), + T_INT(subframe), + T_INT(dlsch0->rnti), + T_INT(harq_pid)); } #endif - + + /* + LOG_I(PHY, "UE_id = %d; Frame %d, subframe %d: Releasing harq %d for UE %x, CC_id = %d; HARQ RTT Timer = %d,%d,%d,%d,%d,%d,%d,%d, drx-ReTX = %d, cdrx-configured = %d\n", + UE_id_mac, + frame, + subframe, + harq_pid, + dlsch0->rnti, + eNB->CC_id, + UE_scheduling_control->harq_rtt_timer[eNB->CC_id][0], + UE_scheduling_control->harq_rtt_timer[eNB->CC_id][1], + UE_scheduling_control->harq_rtt_timer[eNB->CC_id][2], + UE_scheduling_control->harq_rtt_timer[eNB->CC_id][3], + UE_scheduling_control->harq_rtt_timer[eNB->CC_id][4], + UE_scheduling_control->harq_rtt_timer[eNB->CC_id][5], + UE_scheduling_control->harq_rtt_timer[eNB->CC_id][6], + UE_scheduling_control->harq_rtt_timer[eNB->CC_id][7], + UE_scheduling_control->drx_retransmission_timer[harq_pid], + UE_scheduling_control->cdrx_configured); + */ + if (dlsch0_harq->round >= after_rounds) { dlsch0_harq->status = SCH_IDLE; - /*if ((dlsch1_harq == NULL)|| - ((dlsch1_harq!=NULL)&& - (dlsch1_harq->status == SCH_IDLE)))*/ - dlsch0->harq_mask &= ~(1<<harq_pid); + dlsch0->harq_mask &= ~(1 << harq_pid); + + /* CDRX: PUCCH gives an ACK or no more repetitions, so reset corresponding HARQ RTT */ + UE_scheduling_control->harq_rtt_timer[eNB->CC_id][harq_pid] = 0; } - LOG_D(PHY,"Frame %d, subframe %d: Releasing harq %d for UE %x\n",frame,subframe,harq_pid,dlsch0->rnti); - - } - else { // release all processes in the bundle that was acked, based on mask - // This is at most 4 for multiplexing and 9 for bundling/special bundling - M=ul_ACK_subframe2_M(&eNB->frame_parms, - subframe); - - for (m=0; m<M; m++) { + + } else { + /* Release all processes in the bundle that was acked, based on mask */ + /* This is at most 4 for multiplexing and 9 for bundling/special bundling */ + int M = ul_ACK_subframe2_M(&eNB->frame_parms, subframe); + + for (int m=0; m < M; m++) { subframe_tx = ul_ACK_subframe2_dl_subframe(&eNB->frame_parms, - subframe, - m); - frame_tx = ul_ACK_subframe2_dl_frame(&eNB->frame_parms,frame,subframe,subframe_tx); - if (((1<<m)&mask) > 0) { - harq_pid = dlsch0->harq_ids[frame_tx%2][subframe_tx]; - if ((harq_pid>=0) && (harq_pid<dlsch0->Mdlharq)) { - dlsch0_harq = dlsch0->harq_processes[harq_pid]; - dlsch1_harq = dlsch1->harq_processes[harq_pid]; - AssertFatal(dlsch0_harq!=NULL,"dlsch0_harq is null\n"); - + subframe, + m); + + frame_tx = ul_ACK_subframe2_dl_frame(&eNB->frame_parms, + frame, + subframe, + subframe_tx); + + if (((1 << m) & mask) > 0) { + harq_pid = dlsch0->harq_ids[frame_tx%2][subframe_tx]; + + if ((harq_pid >= 0) && (harq_pid < dlsch0->Mdlharq)) { + dlsch0_harq = dlsch0->harq_processes[harq_pid]; + dlsch1_harq = dlsch1->harq_processes[harq_pid]; + + AssertFatal(dlsch0_harq != NULL, "Dlsch0_harq is null\n"); + #if T_TRACER - if (after_rounds != -1) { - T(T_ENB_PHY_DLSCH_UE_NACK, T_INT(0), T_INT(frame), T_INT(subframe), - T_INT(dlsch0->rnti), T_INT(harq_pid)); - } else { - T(T_ENB_PHY_DLSCH_UE_ACK, T_INT(0), T_INT(frame), T_INT(subframe), - T_INT(dlsch0->rnti), T_INT(harq_pid)); - } + if (after_rounds != -1) { + T(T_ENB_PHY_DLSCH_UE_NACK, + T_INT(0), + T_INT(frame), + T_INT(subframe), + T_INT(dlsch0->rnti), + T_INT(harq_pid)); + } else { + T(T_ENB_PHY_DLSCH_UE_ACK, + T_INT(0), + T_INT(frame), + T_INT(subframe), + T_INT(dlsch0->rnti), + T_INT(harq_pid)); + } #endif - if (dlsch0_harq->round >= after_rounds) { - dlsch0_harq->status = SCH_IDLE; - if ((dlsch1_harq == NULL)|| - ((dlsch1_harq!=NULL)&& - (dlsch1_harq->status == SCH_IDLE))) - dlsch0->harq_mask &= ~(1<<harq_pid); - } - } - - } - } - } + if (dlsch0_harq->round >= after_rounds) { + dlsch0_harq->status = SCH_IDLE; + + if ((dlsch1_harq == NULL) || ((dlsch1_harq != NULL) && (dlsch1_harq->status == SCH_IDLE))) { + dlsch0->harq_mask &= ~(1 << harq_pid); + } + } + } // end if ((harq_pid >= 0) && (harq_pid < dlsch0->Mdlharq)) + } // end if (((1 << m) & mask) > 0) + } // end for (int m=0; m < M; m++) + } // end if TDD } static void release_harq(PHY_VARS_eNB *eNB,int UE_id,int tb,uint16_t frame,uint8_t subframe,uint16_t mask, int is_ack) { diff --git a/openair2/COMMON/rrc_messages_types.h b/openair2/COMMON/rrc_messages_types.h index 5b33923b92..e8cabe5bf5 100644 --- a/openair2/COMMON/rrc_messages_types.h +++ b/openair2/COMMON/rrc_messages_types.h @@ -36,6 +36,7 @@ #include "LTE_SystemInformationBlockType2.h" #include "LTE_SL-OffsetIndicator-r12.h" #include "LTE_SubframeBitmapSL-r12.h" +#include "LTE_DRX-Config.h" // Add DRX SSR 2018-10 #include "LTE_SL-CP-Len-r12.h" #include "LTE_SL-PeriodComm-r12.h" #include "LTE_SL-DiscResourcePool-r12.h" @@ -141,6 +142,14 @@ typedef struct RadioResourceConfig_s { long bcch_modificationPeriodCoeff; long pcch_defaultPagingCycle; long pcch_nB; + LTE_DRX_Config_PR drx_Config_present; // Add DRX SSR 2018-10 + long drx_onDurationTimer; // Add DRX SSR 2018-10 + long drx_InactivityTimer; // Add DRX SSR 2018-10 + long drx_RetransmissionTimer; // Add DRX SSR 2018-10 + LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR drx_longDrx_CycleStartOffset_present; // Add DRX SSR 2018-10 + long drx_longDrx_CycleStartOffset; // Add DRX SSR 2018-10 + long drx_shortDrx_Cycle; // Add DRX SSR 2018-10 + long drx_shortDrx_ShortCycleTimer; // Add DRX SSR 2018-10 long ue_TimersAndConstants_t300; long ue_TimersAndConstants_t301; long ue_TimersAndConstants_t310; diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index 189cf01e0e..f8f8d1bd76 100644 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -55,7 +55,7 @@ #include "RRC_config_tools.h" #include "enb_paramdef.h" -#define RRC_INACTIVITY_THRESH 0 +#define RRC_INACTIVITY_THRESH 0 // set to '0' to deactivate (in ms) extern uint16_t sf_ahead; extern void set_parallel_conf(char *parallel_conf); @@ -285,8 +285,9 @@ int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1) { int j,k = 0; int32_t enb_id = 0; int nb_cc = 0; + int32_t offsetMaxLimit = 0; + int32_t cycleNb = 0; MessageDef *msg_p = itti_alloc_new_message(TASK_RRC_ENB, RRC_CONFIGURATION_REQ); - ccparams_lte_t ccparams_lte; ccparams_sidelink_t SLconfig; ccparams_eMTC_t eMTCconfig; @@ -1149,28 +1150,328 @@ int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1) { break; } - if (strcmp(ccparams_lte.pcch_nB, "fourT") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pcch_nB= LTE_PCCH_Config__nB_fourT; - } else if (strcmp(ccparams_lte.pcch_nB, "twoT") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pcch_nB= LTE_PCCH_Config__nB_twoT; - } else if (strcmp(ccparams_lte.pcch_nB, "oneT") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pcch_nB= LTE_PCCH_Config__nB_oneT; - } else if (strcmp(ccparams_lte.pcch_nB, "halfT") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pcch_nB= LTE_PCCH_Config__nB_halfT; - } else if (strcmp(ccparams_lte.pcch_nB, "quarterT") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pcch_nB= LTE_PCCH_Config__nB_quarterT; - } else if (strcmp(ccparams_lte.pcch_nB, "oneEighthT") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pcch_nB= LTE_PCCH_Config__nB_oneEighthT; - } else if (strcmp(ccparams_lte.pcch_nB, "oneSixteenthT") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pcch_nB= LTE_PCCH_Config__nB_oneSixteenthT; - } else if (strcmp(ccparams_lte.pcch_nB, "oneThirtySecondT") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pcch_nB= LTE_PCCH_Config__nB_oneThirtySecondT; - } else + if (strcmp(ccparams_lte.pcch_nB, "fourT") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pcch_nB= LTE_PCCH_Config__nB_fourT; + } + else if (strcmp(ccparams_lte.pcch_nB, "twoT") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pcch_nB= LTE_PCCH_Config__nB_twoT; + } + else if (strcmp(ccparams_lte.pcch_nB, "oneT") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pcch_nB= LTE_PCCH_Config__nB_oneT; + } + else if (strcmp(ccparams_lte.pcch_nB, "halfT") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pcch_nB= LTE_PCCH_Config__nB_halfT; + } + else if (strcmp(ccparams_lte.pcch_nB, "quarterT") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pcch_nB= LTE_PCCH_Config__nB_quarterT; + } + else if (strcmp(ccparams_lte.pcch_nB, "oneEighthT") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pcch_nB= LTE_PCCH_Config__nB_oneEighthT; + } + else if (strcmp(ccparams_lte.pcch_nB, "oneSixteenthT") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pcch_nB= LTE_PCCH_Config__nB_oneSixteenthT; + } + else if (strcmp(ccparams_lte.pcch_nB, "oneThirtySecondT") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pcch_nB= LTE_PCCH_Config__nB_oneThirtySecondT; + } + else { + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pcch_nB choice: fourT,twoT,oneT,halfT,quarterT,oneighthT,oneSixteenthT,oneThirtySecondT !\n", + RC.config_file_name, + i, + ccparams_lte.pcch_nB); + } + + if (strcmp(ccparams_lte.drx_Config_present, "prNothing") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_Config_present = LTE_DRX_Config_PR_NOTHING; + } else if (strcmp(ccparams_lte.drx_Config_present, "prRelease") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_Config_present = LTE_DRX_Config_PR_release; + } else if (strcmp(ccparams_lte.drx_Config_present, "prSetup") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_Config_present = LTE_DRX_Config_PR_setup; + } else { + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for drx_Config_present choice: prNothing,prRelease,prSetup !\n", + RC.config_file_name, i, ccparams_lte.drx_Config_present); + } + + if (strcmp(ccparams_lte.drx_onDurationTimer, "psf1") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_onDurationTimer = (long) LTE_DRX_Config__setup__onDurationTimer_psf1; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf2") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_onDurationTimer = (long) LTE_DRX_Config__setup__onDurationTimer_psf2; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf3") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_onDurationTimer = (long) LTE_DRX_Config__setup__onDurationTimer_psf3; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf4") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_onDurationTimer = (long) LTE_DRX_Config__setup__onDurationTimer_psf4; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf5") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_onDurationTimer = (long) LTE_DRX_Config__setup__onDurationTimer_psf5; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf6") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_onDurationTimer = (long) LTE_DRX_Config__setup__onDurationTimer_psf6; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf8") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_onDurationTimer = (long) LTE_DRX_Config__setup__onDurationTimer_psf8; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf10") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_onDurationTimer = (long) LTE_DRX_Config__setup__onDurationTimer_psf10; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf20") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_onDurationTimer = (long) LTE_DRX_Config__setup__onDurationTimer_psf20; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf30") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_onDurationTimer = (long) LTE_DRX_Config__setup__onDurationTimer_psf30; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf40") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_onDurationTimer = (long) LTE_DRX_Config__setup__onDurationTimer_psf40; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf50") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_onDurationTimer = (long) LTE_DRX_Config__setup__onDurationTimer_psf50; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf60") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_onDurationTimer = (long) LTE_DRX_Config__setup__onDurationTimer_psf60; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf80") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_onDurationTimer = (long) LTE_DRX_Config__setup__onDurationTimer_psf80; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf100") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_onDurationTimer = (long) LTE_DRX_Config__setup__onDurationTimer_psf100; + } else if (strcmp(ccparams_lte.drx_onDurationTimer, "psf200") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_onDurationTimer = (long) LTE_DRX_Config__setup__onDurationTimer_psf200; + } else { + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for drx_onDurationTimer choice !\n", + RC.config_file_name, i, ccparams_lte.drx_onDurationTimer); + break; + } + + if (strcmp(ccparams_lte.drx_InactivityTimer, "psf1") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_psf1; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf2") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_psf2; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf3") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_psf3; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf4") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_psf4; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf5") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_psf5; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf6") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_psf6; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf8") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_psf8; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf10") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_psf10; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf20") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_psf20; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf30") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_psf30; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf40") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_psf40; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf50") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_psf50; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf60") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_psf60; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf80") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_psf80; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf100") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_psf100; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf200") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_psf200; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf300") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_psf300; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf500") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_psf500; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf750") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_psf750; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf1280") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_psf1280; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf1920") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_psf1920; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf2560") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_psf2560; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "psf0-v1020") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_psf0_v1020; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "spare9") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_spare9; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "spare8") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_spare8; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "spare7") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_spare7; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "spare6") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_spare6; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "spare5") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_spare5; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "spare4") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_spare4; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "spare3") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_spare3; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "spare2") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_spare2; + } else if (strcmp(ccparams_lte.drx_InactivityTimer, "spare1") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_InactivityTimer = (long) LTE_DRX_Config__setup__drx_InactivityTimer_spare1; + } else { + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for drx_InactivityTimer choice !\n", + RC.config_file_name, i, ccparams_lte.drx_InactivityTimer); + break; + } + + if (strcmp(ccparams_lte.drx_RetransmissionTimer, "psf1") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_RetransmissionTimer = (long) LTE_DRX_Config__setup__drx_RetransmissionTimer_psf1; + } else if (strcmp(ccparams_lte.drx_RetransmissionTimer, "psf2") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_RetransmissionTimer = (long) LTE_DRX_Config__setup__drx_RetransmissionTimer_psf2; + } else if (strcmp(ccparams_lte.drx_RetransmissionTimer, "psf4") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_RetransmissionTimer = (long) LTE_DRX_Config__setup__drx_RetransmissionTimer_psf4; + } else if (strcmp(ccparams_lte.drx_RetransmissionTimer, "psf6") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_RetransmissionTimer = (long) LTE_DRX_Config__setup__drx_RetransmissionTimer_psf6; + } else if (strcmp(ccparams_lte.drx_RetransmissionTimer, "psf8") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_RetransmissionTimer = (long) LTE_DRX_Config__setup__drx_RetransmissionTimer_psf8; + } else if (strcmp(ccparams_lte.drx_RetransmissionTimer, "psf16") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_RetransmissionTimer = (long) LTE_DRX_Config__setup__drx_RetransmissionTimer_psf16; + } else if (strcmp(ccparams_lte.drx_RetransmissionTimer, "psf24") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_RetransmissionTimer = (long) LTE_DRX_Config__setup__drx_RetransmissionTimer_psf24; + } else if (strcmp(ccparams_lte.drx_RetransmissionTimer, "psf33") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_RetransmissionTimer = (long) LTE_DRX_Config__setup__drx_RetransmissionTimer_psf33; + } else { + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for drx_RetransmissionTimer choice !\n", + RC.config_file_name, i, ccparams_lte.drx_RetransmissionTimer); + break; + } + + if (ccparams_lte.drx_longDrx_CycleStartOffset_present == NULL || strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prNothing") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_NOTHING; + } else { + if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf10") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf10; + offsetMaxLimit = 10; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf20") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf20; + offsetMaxLimit = 20; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf32") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf32; + offsetMaxLimit = 32; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf40") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf40; + offsetMaxLimit = 40; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf64") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf64; + offsetMaxLimit = 64; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf80") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf80; + offsetMaxLimit = 80; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf128") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf128; + offsetMaxLimit = 128; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf160") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf160; + offsetMaxLimit = 160; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf256") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf256; + offsetMaxLimit = 256; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf320") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf320; + offsetMaxLimit = 320; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf512") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf512; + offsetMaxLimit = 512; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf640") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf640; + offsetMaxLimit = 640; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf1024") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf1024; + offsetMaxLimit = 1024; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf1280") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf1280; + offsetMaxLimit = 1280; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf2048") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf2048; + offsetMaxLimit = 2048; + } else if (strcmp(ccparams_lte.drx_longDrx_CycleStartOffset_present, "prSf2560") == 0) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_longDrx_CycleStartOffset_present = LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf2560; + offsetMaxLimit = 2560; + } else { + AssertFatal (0, + "Failed to parse eNB configuration file \"%s\", enb %d unknown string value \"%s\" for drx_longDrx_CycleStartOffset_present choice !\n", + RC.config_file_name, i, ccparams_lte.drx_longDrx_CycleStartOffset_present); + } + + if (ccparams_lte.drx_longDrx_CycleStartOffset >= 0 && ccparams_lte.drx_longDrx_CycleStartOffset < offsetMaxLimit) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_longDrx_CycleStartOffset = ccparams_lte.drx_longDrx_CycleStartOffset; + } else { + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d incoherent value \"%d\" for drx_longDrx_CycleStartOffset !\n", + RC.config_file_name, i, ccparams_lte.drx_longDrx_CycleStartOffset); + } + } + + if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "") == 0 || ccparams_lte.drx_shortDrx_ShortCycleTimer == 0) { + if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "") != 0 || ccparams_lte.drx_shortDrx_ShortCycleTimer != 0) { + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d incoherent values \"%s\" - \"%d\" for drx_shortDrx_Cycle or drx_shortDrx_ShortCycleTimer choice !\n", + RC.config_file_name, i, ccparams_lte.drx_shortDrx_Cycle, ccparams_lte.drx_shortDrx_ShortCycleTimer); + } else { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_shortDrx_Cycle = -1; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_shortDrx_ShortCycleTimer = 0; + } + } else { + if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf2") == 0) { + cycleNb = 2; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf2; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf5") == 0) { + cycleNb = 5; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf5; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf8") == 0) { + cycleNb = 8; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf8; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf10") == 0) { + cycleNb = 10; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf10; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf16") == 0) { + cycleNb = 16; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf16; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf20") == 0) { + cycleNb = 20; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf20; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf32") == 0) { + cycleNb = 32; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf32; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf40") == 0) { + cycleNb = 40; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf40; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf64") == 0) { + cycleNb = 64; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf64; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf80") == 0) { + cycleNb = 80; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf80; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf128") == 0) { + cycleNb = 128; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf128; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf160") == 0) { + cycleNb = 160; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf160; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf256") == 0) { + cycleNb = 256; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf256; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf320") == 0) { + cycleNb = 320; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf320; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf512") == 0) { + cycleNb = 512; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf512; + } else if (strcmp(ccparams_lte.drx_shortDrx_Cycle, "sf640") == 0) { + cycleNb = 640; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_shortDrx_Cycle = LTE_DRX_Config__setup__shortDRX__shortDRX_Cycle_sf640; + } else { + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d incoherent value \"%s\" for drx_shortDrx_Cycle !\n", + RC.config_file_name, i, ccparams_lte.drx_shortDrx_Cycle); + } + + if (cycleNb > 0 && (offsetMaxLimit % cycleNb != 0 || cycleNb == offsetMaxLimit)) { AssertFatal (0, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pcch_nB choice: fourT,twoT,oneT,halfT,quarterT,oneighthT,oneSixteenthT,oneThirtySecondT !\n", - RC.config_file_name, i, ccparams_lte.pcch_nB); + "Failed to parse eNB configuration file %s, enb %d incompatible (not multiple) values \"%d\" - \"%d\" for drx_shortDrx_Cycle and drx_longDrx_CycleStartOffset choice !\n", + RC.config_file_name, i, cycleNb, offsetMaxLimit); + } + + if (ccparams_lte.drx_shortDrx_ShortCycleTimer >= 1 && ccparams_lte.drx_shortDrx_ShortCycleTimer <= 16 ) { + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].drx_shortDrx_ShortCycleTimer = ccparams_lte.drx_shortDrx_ShortCycleTimer; + } else { + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for drx_shortDrx_ShortCycleTimer choice !\n", + RC.config_file_name, i, ccparams_lte.drx_shortDrx_ShortCycleTimer ); + } + } - switch (ccparams_lte.bcch_modificationPeriodCoeff) { + switch (ccparams_lte.bcch_modificationPeriodCoeff) { case 2: RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].bcch_modificationPeriodCoeff= LTE_BCCH_Config__modificationPeriodCoeff_n2; break; diff --git a/openair2/ENB_APP/enb_config_eMTC.c b/openair2/ENB_APP/enb_config_eMTC.c index 5a8362300e..effc93d244 100644 --- a/openair2/ENB_APP/enb_config_eMTC.c +++ b/openair2/ENB_APP/enb_config_eMTC.c @@ -932,8 +932,9 @@ void fill_eMTC_configuration(MessageDef *msg_p, ccparams_eMTC_t *eMTCconfig, in break; } RRC_CONFIGURATION_REQ (msg_p).rar_HoppingConfig_r13[cc_idx][rachCEInfoIndex] = eMTCconfig->rar_HoppingConfig_r13; + AssertFatal(eMTCconfig->rar_HoppingConfig_r13 == 0 || eMTCconfig->rar_HoppingConfig_r13 == 1, - "illegal rar_HoppingConfig_r13 %d\n",eMTCconfig->rar_HoppingConfig_r13); + "illegal rar_HoppingConfig_r13 %d\n",eMTCconfig->rar_HoppingConfig_r13); } // end for loop (rach ce level info) char rsrpRangeListPath[MAX_OPTNAME_SIZE * 2]; @@ -1101,11 +1102,12 @@ void fill_eMTC_configuration(MessageDef *msg_p, ccparams_eMTC_t *eMTCconfig, in /** PCCH CONFIG V1310 */ - RRC_CONFIGURATION_REQ(msg_p).pcch_config_v1310[cc_idx] = TRUE; RRC_CONFIGURATION_REQ(msg_p).paging_narrowbands_r13[cc_idx] = eMTCconfig->paging_narrowbands_r13; RRC_CONFIGURATION_REQ(msg_p).mpdcch_numrepetition_paging_r13[cc_idx] = eMTCconfig->mpdcch_numrepetition_paging_r13; - AssertFatal (eMTCconfig->mpdcch_numrepetition_paging_r13 == 1 || + + AssertFatal (eMTCconfig->mpdcch_numrepetition_paging_r13 == 0 || + eMTCconfig->mpdcch_numrepetition_paging_r13 == 1 || eMTCconfig->mpdcch_numrepetition_paging_r13 == 2 || eMTCconfig->mpdcch_numrepetition_paging_r13 == 4 || eMTCconfig->mpdcch_numrepetition_paging_r13 == 8 || @@ -1117,7 +1119,6 @@ void fill_eMTC_configuration(MessageDef *msg_p, ccparams_eMTC_t *eMTCconfig, in "illegal mpdcch_numrepetition_paging_r13 %d\n", eMTCconfig->mpdcch_numrepetition_paging_r13); - // RRC_CONFIGURATION_REQ(msg_p).nb_v1310[cc_idx] = CALLOC(1, sizeof(long)); // if (!strcmp(nb_v1310, "one64thT")) { // *RRC_CONFIGURATION_REQ(msg_p).nb_v1310[cc_idx] = 0; diff --git a/openair2/ENB_APP/enb_paramdef.h b/openair2/ENB_APP/enb_paramdef.h index 54d6decfee..ba26f4e3d9 100644 --- a/openair2/ENB_APP/enb_paramdef.h +++ b/openair2/ENB_APP/enb_paramdef.h @@ -321,8 +321,7 @@ typedef enum { #define ENB_CONFIG_STRING_PUCCH_NUM_REPETITION_CE_MSG4_LEVEL2 "pucch_NumRepetitionCE_Msg4_Level2_r13" #define ENB_CONFIG_STRING_PUCCH_NUM_REPETITION_CE_MSG4_LEVEL3 "pucch_NumRepetitionCE_Msg4_Level3_r13" -#define ENB_CONFIG_STRING_FREQ_HOPPING_PARAMETERS_R13 "sib2_freq_hoppingParameters_r13" - +#define ENB_CONFIG_STRING_FREQ_HOPPING_PARAMETERS_R13 "sib2_freq_hoppingParameters_r13" #define ENB_CONFIG_STRING_PDSCH_RS_EPRE "pdsch_referenceSignalPower" #define ENB_CONFIG_STRING_PDSCH_PB "pdsch_p_b" @@ -364,6 +363,14 @@ typedef enum { #define ENB_CONFIG_STRING_RACH_MAXHARQMSG3TX "rach_maxHARQ_Msg3Tx" #define ENB_CONFIG_STRING_PCCH_DEFAULT_PAGING_CYCLE "pcch_default_PagingCycle" #define ENB_CONFIG_STRING_PCCH_NB "pcch_nB" +#define ENB_CONFIG_STRING_DRX_CONFIG_PRESENT "drx_Config_present" // Add DRX SSR 2018-10 +#define ENB_CONFIG_STRING_DRX_ONDURATIONTIMER "drx_onDurationTimer" // Add DRX SSR 2018-10 +#define ENB_CONFIG_STRING_DRX_INACTIVITYTIMER "drx_InactivityTimer" // Add DRX SSR 2018-10 +#define ENB_CONFIG_STRING_DRX_RETRANSMISSIONTIMER "drx_RetransmissionTimer" // Add DRX SSR 2018-10 +#define ENB_CONFIG_STRING_DRX_LONGDRX_CYCLESTARTOFFSET_PRESENT "drx_longDrx_CycleStartOffset_present" // Add DRX SSR 2018-10 +#define ENB_CONFIG_STRING_DRX_LONGDRX_CYCLESTARTOFFSET "drx_longDrx_CycleStartOffset" // Add DRX SSR 2018-10 +#define ENB_CONFIG_STRING_DRX_SHORTDRX_CYCLE "drx_shortDrx_Cycle" // Add DRX SSR 2018-10 +#define ENB_CONFIG_STRING_DRX_SHORTDRX_SHORTCYCLETIMER "drx_shortDrx_ShortCycleTimer" // Add DRX SSR 2018-10 #define ENB_CONFIG_STRING_BCCH_MODIFICATIONPERIODCOEFF "bcch_modificationPeriodCoeff" #define ENB_CONFIG_STRING_UETIMERS_T300 "ue_TimersAndConstants_t300" #define ENB_CONFIG_STRING_UETIMERS_T301 "ue_TimersAndConstants_t301" @@ -496,6 +503,14 @@ typedef struct ccparams_lte_s { int32_t rach_maxHARQ_Msg3Tx; int32_t pcch_defaultPagingCycle; char *pcch_nB; + char *drx_Config_present; + char *drx_onDurationTimer; + char *drx_InactivityTimer; + char *drx_RetransmissionTimer; + char *drx_longDrx_CycleStartOffset_present; + int32_t drx_longDrx_CycleStartOffset; + char *drx_shortDrx_Cycle; + int32_t drx_shortDrx_ShortCycleTimer; int32_t bcch_modificationPeriodCoeff; int32_t ue_TimersAndConstants_t300; int32_t ue_TimersAndConstants_t301; @@ -574,6 +589,14 @@ typedef struct ccparams_lte_s { { .s5= {NULL }} , \ { .s5= {NULL }} , \ { .s5= {NULL }} , \ + { .s5= {NULL }} , /* Add DRX SSR 2018-10 */ \ + { .s5= {NULL }} , /* Add DRX SSR 2018-10 */ \ + { .s5= {NULL }} , /* Add DRX SSR 2018-10 */ \ + { .s5= {NULL }} , /* Add DRX SSR 2018-10 */ \ + { .s5= {NULL }} , /* Add DRX SSR 2018-10 */ \ + { .s5= {NULL }} , /* Add DRX SSR 2018-10 */ \ + { .s5= {NULL }} , /* Add DRX SSR 2018-10 */ \ + { .s5= {NULL }} , /* Add DRX SSR 2018-10 */ \ { .s5= {NULL }} , \ { .s1a= { config_check_modify_integer, UETIMER_T300_OKVALUES, UETIMER_T300_MODVALUES,8}} , \ { .s1a= { config_check_modify_integer, UETIMER_T301_OKVALUES, UETIMER_T301_MODVALUES,8}} , \ @@ -688,6 +711,14 @@ typedef struct ccparams_lte_s { {ENB_CONFIG_STRING_RACH_MAXHARQMSG3TX, NULL, 0, iptr:&ccparams.rach_maxHARQ_Msg3Tx, defintval:4, TYPE_UINT, 0}, \ {ENB_CONFIG_STRING_PCCH_DEFAULT_PAGING_CYCLE, NULL, 0, iptr:&ccparams.pcch_defaultPagingCycle, defintval:128, TYPE_INT, 0}, \ {ENB_CONFIG_STRING_PCCH_NB, NULL, 0, strptr:&ccparams.pcch_nB, defstrval:"oneT", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_DRX_CONFIG_PRESENT, NULL, 0, strptr:&ccparams.drx_Config_present, defstrval:"prNothing", TYPE_STRING, 0}, /* Add DRX SSR 2018-10 */ \ +{ENB_CONFIG_STRING_DRX_ONDURATIONTIMER, NULL, 0, strptr:&ccparams.drx_onDurationTimer, defstrval:"psf10", TYPE_STRING, 0}, /* Add DRX SSR 2018-10 */ \ +{ENB_CONFIG_STRING_DRX_INACTIVITYTIMER, NULL, 0, strptr:&ccparams.drx_InactivityTimer, defstrval:"psf10", TYPE_STRING, 0}, /* Add DRX SSR 2018-10 */ \ +{ENB_CONFIG_STRING_DRX_RETRANSMISSIONTIMER, NULL, 0, strptr:&ccparams.drx_RetransmissionTimer, defstrval:"psf8", TYPE_STRING, 0}, /* Add DRX SSR 2018-10 */ \ +{ENB_CONFIG_STRING_DRX_LONGDRX_CYCLESTARTOFFSET_PRESENT, NULL, 0, strptr:&ccparams.drx_longDrx_CycleStartOffset_present, defstrval:"prSf128", TYPE_STRING, 0}, /* Add DRX SSR 2018-10 */ \ +{ENB_CONFIG_STRING_DRX_LONGDRX_CYCLESTARTOFFSET, NULL, 0, iptr:&ccparams.drx_longDrx_CycleStartOffset, defintval:0, TYPE_UINT, 0}, /* Add DRX SSR 2018-10 */ \ +{ENB_CONFIG_STRING_DRX_SHORTDRX_CYCLE, NULL, 0, strptr:&ccparams.drx_shortDrx_Cycle, defstrval:"sf32", TYPE_STRING, 0}, /* Add DRX SSR 2018-10 */ \ +{ENB_CONFIG_STRING_DRX_SHORTDRX_SHORTCYCLETIMER, NULL, 0, iptr:&ccparams.drx_shortDrx_ShortCycleTimer, defintval:3, TYPE_UINT, 0}, /* Add DRX SSR 2018-10 */ \ {ENB_CONFIG_STRING_BCCH_MODIFICATIONPERIODCOEFF, NULL, 0, iptr:&ccparams.bcch_modificationPeriodCoeff, defintval:2, TYPE_UINT, 0}, \ {ENB_CONFIG_STRING_UETIMERS_T300, NULL, 0, iptr:&ccparams.ue_TimersAndConstants_t300, defintval:1000, TYPE_UINT, 0}, \ {ENB_CONFIG_STRING_UETIMERS_T301, NULL, 0, iptr:&ccparams.ue_TimersAndConstants_t301, defintval:1000, TYPE_UINT, 0}, \ @@ -696,7 +727,7 @@ typedef struct ccparams_lte_s { {ENB_CONFIG_STRING_UETIMERS_N310, NULL, 0, iptr:&ccparams.ue_TimersAndConstants_n310, defintval:20, TYPE_UINT, 0}, \ {ENB_CONFIG_STRING_UETIMERS_N311, NULL, 0, iptr:&ccparams.ue_TimersAndConstants_n311, defintval:1, TYPE_UINT, 0}, \ {ENB_CONFIG_STRING_UE_TRANSMISSION_MODE, NULL, 0, iptr:&ccparams.ue_TransmissionMode, defintval:1, TYPE_UINT, 0}, \ -{ENB_CONFIG_STRING_UE_MULTIPLE_MAX, NULL, 0, iptr:&ccparams.ue_multiple_max, defintval:4, TYPE_UINT, 0} \ +{ENB_CONFIG_STRING_UE_MULTIPLE_MAX, NULL, 0, iptr:&ccparams.ue_multiple_max, defintval:4, TYPE_UINT, 0} \ } @@ -761,14 +792,22 @@ typedef struct ccparams_lte_s { #define ENB_CONFIG_RACH_MAXHARQMSG3TX_IDX 57 #define ENB_CONFIG_PCCH_DEFAULT_PAGING_CYCLE_IDX 58 #define ENB_CONFIG_PCCH_NB_IDX 59 -#define ENB_CONFIG_BCCH_MODIFICATIONPERIODCOEFF_IDX 60 -#define ENB_CONFIG_UETIMERS_T300_IDX 61 -#define ENB_CONFIG_UETIMERS_T301_IDX 62 -#define ENB_CONFIG_UETIMERS_T310_IDX 63 -#define ENB_CONFIG_UETIMERS_T311_IDX 64 -#define ENB_CONFIG_UETIMERS_N310_IDX 65 -#define ENB_CONFIG_UETIMERS_N311_IDX 66 -#define ENB_CONFIG_UE_TRANSMISSION_MODE_IDX 67 +#define ENB_CONFIG_STRING_DRX_CONFIG_PRESENT_IDX 60 // Add DRX SSR 2018-10 +#define ENB_CONFIG_STRING_DRX_ONDURATIONTIMER_IDX 61 // Add DRX SSR 2018-10 +#define ENB_CONFIG_STRING_DRX_INACTIVITYTIMER_IDX 62 // Add DRX SSR 2018-10 +#define ENB_CONFIG_STRING_DRX_RETRANSMISSIONTIMER_IDX 63 // Add DRX SSR 2018-10 +#define ENB_CONFIG_STRING_DRX_LONGDRX_CYCLESTARTOFFSET_PRESENT_IDX 64 // Add DRX SSR 2018-10 +#define ENB_CONFIG_STRING_DRX_LONGDRX_CYCLESTARTOFFSET_IDX 65 // Add DRX SSR 2018-10 +#define ENB_CONFIG_STRING_DRX_SHORTDRX_CYCLE_IDX 66 // Add DRX SSR 2018-10 +#define ENB_CONFIG_STRING_DRX_SHORTDRX_SHORTCYCLETIMER_IDX 67 // Add DRX SSR 2018-10 +#define ENB_CONFIG_BCCH_MODIFICATIONPERIODCOEFF_IDX 68 // Modif DRX SSR 2018-10 +#define ENB_CONFIG_UETIMERS_T300_IDX 69 // Modif DRX SSR 2018-10 +#define ENB_CONFIG_UETIMERS_T301_IDX 70 // Modif DRX SSR 2018-10 +#define ENB_CONFIG_UETIMERS_T310_IDX 71 // Modif DRX SSR 2018-10 +#define ENB_CONFIG_UETIMERS_T311_IDX 72 // Modif DRX SSR 2018-10 +#define ENB_CONFIG_UETIMERS_N310_IDX 73 // Modif DRX SSR 2018-10 +#define ENB_CONFIG_UETIMERS_N311_IDX 74 // Modif DRX SSR 2018-10 +#define ENB_CONFIG_UE_TRANSMISSION_MODE_IDX 75 // Modif DRX SSR 2018-10 /*------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ /* SRB1 configuration parameters section name */ diff --git a/openair2/ENB_APP/enb_paramdef_emtc.h b/openair2/ENB_APP/enb_paramdef_emtc.h index 9f76bac2fa..25ab43ccf6 100644 --- a/openair2/ENB_APP/enb_paramdef_emtc.h +++ b/openair2/ENB_APP/enb_paramdef_emtc.h @@ -61,7 +61,10 @@ #define ENB_CONFIG_STRING_PREAMBLE_TRANSMAX_CE_R13 "preamble_TransMax_ce_r13" #define ENB_CONFIG_STRING_PREAMBLE_TRANSMAX_CE_R13_VAL "preamble_TransMax_ce_r13_val" #define ENB_CONFIG_STRING_PDSCH_MAX_NUM_REPETITION_CE_MODE_A_R13 "pdsch_maxNumRepetitionCEmodeA_r13" +#define ENB_CONFIG_STRING_PDSCH_MAX_NUM_REPETITION_CE_MODE_B_R13 "pdsch_maxNumRepetitionCEmodeB_r13" #define ENB_CONFIG_STRING_PUSCH_MAX_NUM_REPETITION_CE_MODE_A_R13 "pusch_maxNumRepetitionCEmodeA_r13" +#define ENB_CONFIG_STRING_PUSCH_MAX_NUM_REPETITION_CE_MODE_B_R13 "pusch_maxNumRepetitionCEmodeB_r13" +#define ENB_CONFIG_STRING_PUSCH_HOPPING_OFFSET_V1310 "pusch_HoppingOffset_v1310" #define ENB_CONFIG_STRING_SYSTEM_INFO_VALUE_TAG_LIST "system_info_value_tag_SI" #define ENB_CONFIG_STRING_FIRST_PREAMBLE_R13 "firstPreamble_r13" #define ENB_CONFIG_STRING_LAST_PREAMBLE_R13 "lastPreamble_r13" @@ -81,6 +84,9 @@ #define ENB_CONFIG_STRING_PUCCH_INFO_VALUE "pucch_info_value" #define ENB_CONFIG_STRING_N1PUCCH_AN_INFOLIST_R13 "n1PUCCH_AN_InfoList_r13" #define ENB_CONFIG_STRING_PCCH_CONFIG_V1310 "pcch_config_v1310" +#define ENB_CONFIG_STRING_PAGING_NARROWBANDS_R13 "paging_narrowbands_r13" +#define ENB_CONFIG_STRING_MPDCCH_NUMREPETITION_PAGING_R13 "mpdcch_numrepetition_paging_r13" +#define ENB_CONFIG_STRING_NB_V1310 "nb_v1310" #define ENB_CONFIG_STRING_SIB2_FREQ_HOPPINGPARAMETERS_R13 "sib2_freq_hoppingParameters_r13" typedef struct ccparams_eMTC_s { diff --git a/openair2/LAYER2/MAC/config.c b/openair2/LAYER2/MAC/config.c index 73d73c3556..00a4e44ff6 100644 --- a/openair2/LAYER2/MAC/config.c +++ b/openair2/LAYER2/MAC/config.c @@ -1009,3 +1009,358 @@ int rrc_mac_config_req_eNB(module_id_t Mod_idP, return(0); } + + +//----------------------------------------------------------------------------- +/* +* Configure local DRX timers and thresholds following the drx_configuration input +*/ +void eNB_Config_Local_DRX( + module_id_t Mod_id, + rnti_t rnti, + LTE_DRX_Config_t *const drx_Configuration +) +//----------------------------------------------------------------------------- +{ + UE_list_t *UE_list_mac = NULL; + int UE_id = -1; + UE_sched_ctrl *UE_scheduling_control = NULL; + + UE_list_mac = &(RC.mac[Mod_id]->UE_list); + + UE_id = find_UE_id(Mod_id, rnti); + + /* Check UE_id */ + if (UE_id == -1) { + LOG_E(MAC, "%s:%d:%s: ERROR, UE_id == -1\n", + __FILE__, + __LINE__, + __FUNCTION__); + return; + } + + /* Get struct to modify */ + UE_scheduling_control = &(UE_list_mac->UE_sched_ctrl[UE_id]); + + /* Check drx_Configuration */ + if (drx_Configuration == NULL) { + LOG_E(MAC, "drx_Configuration parameter is NULL, cannot configure local UE parameters\n"); + + UE_scheduling_control->cdrx_configured = FALSE; + return; + } + + /* Check if drx config present */ + if (drx_Configuration->present != LTE_DRX_Config_PR_setup) { + LOG_I(MAC, "No drx_Configuration present, don't configure local UE parameters\n"); + + UE_scheduling_control->cdrx_configured = FALSE; + return; + } + + /* Modify scheduling control structure according to DRX configuration */ + UE_scheduling_control->cdrx_configured = TRUE; + UE_scheduling_control->bypass_cdrx = TRUE; + UE_scheduling_control->in_active_time = FALSE; + + UE_scheduling_control->on_duration_timer = 0; + switch (drx_Configuration->choice.setup.onDurationTimer) { + case 0: + UE_scheduling_control->on_duration_timer_thres = 1; + break; + case 1: + UE_scheduling_control->on_duration_timer_thres = 2; + break; + case 2: + UE_scheduling_control->on_duration_timer_thres = 3; + break; + case 3: + UE_scheduling_control->on_duration_timer_thres = 4; + break; + case 4: + UE_scheduling_control->on_duration_timer_thres = 5; + break; + case 5: + UE_scheduling_control->on_duration_timer_thres = 6; + break; + case 6: + UE_scheduling_control->on_duration_timer_thres = 8; + break; + case 7: + UE_scheduling_control->on_duration_timer_thres = 10; + break; + case 8: + UE_scheduling_control->on_duration_timer_thres = 20; + break; + case 9: + UE_scheduling_control->on_duration_timer_thres = 30; + break; + case 10: + UE_scheduling_control->on_duration_timer_thres = 40; + break; + case 11: + UE_scheduling_control->on_duration_timer_thres = 50; + break; + case 12: + UE_scheduling_control->on_duration_timer_thres = 60; + break; + case 13: + UE_scheduling_control->on_duration_timer_thres = 80; + break; + case 14: + UE_scheduling_control->on_duration_timer_thres = 100; + break; + case 15: + UE_scheduling_control->on_duration_timer_thres = 200; + break; + default: + LOG_E(MAC, "Error in local DRX configuration, the on duration timer value specified is unknown\n"); + break; + } + + UE_scheduling_control->drx_inactivity_timer = 0; + switch (drx_Configuration->choice.setup.drx_InactivityTimer) { + case 0: + UE_scheduling_control->drx_inactivity_timer_thres = 1; + break; + case 1: + UE_scheduling_control->drx_inactivity_timer_thres = 2; + break; + case 2: + UE_scheduling_control->drx_inactivity_timer_thres = 3; + break; + case 3: + UE_scheduling_control->drx_inactivity_timer_thres = 4; + break; + case 4: + UE_scheduling_control->drx_inactivity_timer_thres = 5; + break; + case 5: + UE_scheduling_control->drx_inactivity_timer_thres = 6; + break; + case 6: + UE_scheduling_control->drx_inactivity_timer_thres = 8; + break; + case 7: + UE_scheduling_control->drx_inactivity_timer_thres = 10; + break; + case 8: + UE_scheduling_control->drx_inactivity_timer_thres = 20; + break; + case 9: + UE_scheduling_control->drx_inactivity_timer_thres = 30; + break; + case 10: + UE_scheduling_control->drx_inactivity_timer_thres = 40; + break; + case 11: + UE_scheduling_control->drx_inactivity_timer_thres = 50; + break; + case 12: + UE_scheduling_control->drx_inactivity_timer_thres = 60; + break; + case 13: + UE_scheduling_control->drx_inactivity_timer_thres = 80; + break; + case 14: + UE_scheduling_control->drx_inactivity_timer_thres = 100; + break; + case 15: + UE_scheduling_control->drx_inactivity_timer_thres = 200; + break; + case 16: + UE_scheduling_control->drx_inactivity_timer_thres = 300; + break; + case 17: + UE_scheduling_control->drx_inactivity_timer_thres = 500; + break; + case 18: + UE_scheduling_control->drx_inactivity_timer_thres = 750; + break; + case 19: + UE_scheduling_control->drx_inactivity_timer_thres = 1280; + break; + case 20: + UE_scheduling_control->drx_inactivity_timer_thres = 1920; + break; + case 21: + UE_scheduling_control->drx_inactivity_timer_thres = 2560; + break; + case 22: + UE_scheduling_control->drx_inactivity_timer_thres = 0; + break; + default: + LOG_E(MAC, "Error in local DRX configuration, the drx inactivity timer value specified is unknown\n"); + break; + } + + if (drx_Configuration->choice.setup.shortDRX == NULL) { + UE_scheduling_control->in_short_drx_cycle = FALSE; + UE_scheduling_control->drx_shortCycle_timer_value = 0; + UE_scheduling_control->short_drx_cycle_duration = 0; + UE_scheduling_control->drx_shortCycle_timer = 0; + UE_scheduling_control->drx_shortCycle_timer_thres = -1; + } else { + UE_scheduling_control->in_short_drx_cycle = FALSE; + UE_scheduling_control->drx_shortCycle_timer_value = (uint8_t) drx_Configuration->choice.setup.shortDRX->drxShortCycleTimer; + switch (drx_Configuration->choice.setup.shortDRX->shortDRX_Cycle) { + case 0: + UE_scheduling_control->short_drx_cycle_duration = 2; + break; + case 1: + UE_scheduling_control->short_drx_cycle_duration = 5; + break; + case 2: + UE_scheduling_control->short_drx_cycle_duration = 8; + break; + case 3: + UE_scheduling_control->short_drx_cycle_duration = 10; + break; + case 4: + UE_scheduling_control->short_drx_cycle_duration = 16; + break; + case 5: + UE_scheduling_control->short_drx_cycle_duration = 20; + break; + case 6: + UE_scheduling_control->short_drx_cycle_duration = 32; + break; + case 7: + UE_scheduling_control->short_drx_cycle_duration = 40; + break; + case 8: + UE_scheduling_control->short_drx_cycle_duration = 64; + break; + case 9: + UE_scheduling_control->short_drx_cycle_duration = 80; + break; + case 10: + UE_scheduling_control->short_drx_cycle_duration = 128; + break; + case 11: + UE_scheduling_control->short_drx_cycle_duration = 160; + break; + case 12: + UE_scheduling_control->short_drx_cycle_duration = 256; + break; + case 13: + UE_scheduling_control->short_drx_cycle_duration = 320; + break; + case 14: + UE_scheduling_control->short_drx_cycle_duration = 512; + break; + case 15: + UE_scheduling_control->short_drx_cycle_duration = 640; + break; + default: + LOG_E(MAC, "Error in local DRX configuration, the short drx timer value specified is unknown\n"); + break; + } + + UE_scheduling_control->drx_shortCycle_timer = 0; + UE_scheduling_control->drx_shortCycle_timer_thres = UE_scheduling_control->drx_shortCycle_timer_value * UE_scheduling_control->short_drx_cycle_duration; + } + + UE_scheduling_control->in_long_drx_cycle = FALSE; + UE_scheduling_control->drx_longCycle_timer = 0; + switch (drx_Configuration->choice.setup.longDRX_CycleStartOffset.present) { + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf10: + UE_scheduling_control->drx_longCycle_timer_thres = 10; + UE_scheduling_control->drx_start_offset = (uint16_t) drx_Configuration->choice.setup.longDRX_CycleStartOffset.choice.sf10; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf20: + UE_scheduling_control->drx_longCycle_timer_thres = 20; + UE_scheduling_control->drx_start_offset = (uint16_t) drx_Configuration->choice.setup.longDRX_CycleStartOffset.choice.sf20; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf32: + UE_scheduling_control->drx_longCycle_timer_thres = 32; + UE_scheduling_control->drx_start_offset = (uint16_t) drx_Configuration->choice.setup.longDRX_CycleStartOffset.choice.sf32; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf40: + UE_scheduling_control->drx_longCycle_timer_thres = 40; + UE_scheduling_control->drx_start_offset = (uint16_t) drx_Configuration->choice.setup.longDRX_CycleStartOffset.choice.sf40; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf64: + UE_scheduling_control->drx_longCycle_timer_thres = 64; + UE_scheduling_control->drx_start_offset = (uint16_t) drx_Configuration->choice.setup.longDRX_CycleStartOffset.choice.sf64; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf80: + UE_scheduling_control->drx_longCycle_timer_thres = 80; + UE_scheduling_control->drx_start_offset = (uint16_t) drx_Configuration->choice.setup.longDRX_CycleStartOffset.choice.sf80; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf128: + UE_scheduling_control->drx_longCycle_timer_thres = 128; + UE_scheduling_control->drx_start_offset = (uint16_t) drx_Configuration->choice.setup.longDRX_CycleStartOffset.choice.sf128; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf160: + UE_scheduling_control->drx_longCycle_timer_thres = 160; + UE_scheduling_control->drx_start_offset = (uint16_t) drx_Configuration->choice.setup.longDRX_CycleStartOffset.choice.sf160; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf256: + UE_scheduling_control->drx_longCycle_timer_thres = 256; + UE_scheduling_control->drx_start_offset = (uint16_t) drx_Configuration->choice.setup.longDRX_CycleStartOffset.choice.sf256; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf320: + UE_scheduling_control->drx_longCycle_timer_thres = 320; + UE_scheduling_control->drx_start_offset = (uint16_t) drx_Configuration->choice.setup.longDRX_CycleStartOffset.choice.sf320; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf512: + UE_scheduling_control->drx_longCycle_timer_thres = 512; + UE_scheduling_control->drx_start_offset = (uint16_t) drx_Configuration->choice.setup.longDRX_CycleStartOffset.choice.sf512; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf640: + UE_scheduling_control->drx_longCycle_timer_thres = 640; + UE_scheduling_control->drx_start_offset = (uint16_t) drx_Configuration->choice.setup.longDRX_CycleStartOffset.choice.sf640; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf1024: + UE_scheduling_control->drx_longCycle_timer_thres = 1024; + UE_scheduling_control->drx_start_offset = (uint16_t) drx_Configuration->choice.setup.longDRX_CycleStartOffset.choice.sf1024; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf1280: + UE_scheduling_control->drx_longCycle_timer_thres = 1280; + UE_scheduling_control->drx_start_offset = (uint16_t) drx_Configuration->choice.setup.longDRX_CycleStartOffset.choice.sf1280; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf2048: + UE_scheduling_control->drx_longCycle_timer_thres = 2048; + UE_scheduling_control->drx_start_offset = (uint16_t) drx_Configuration->choice.setup.longDRX_CycleStartOffset.choice.sf2048; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf2560: + UE_scheduling_control->drx_longCycle_timer_thres = 2560; + UE_scheduling_control->drx_start_offset = (uint16_t) drx_Configuration->choice.setup.longDRX_CycleStartOffset.choice.sf2560; + break; + default: + LOG_E(MAC, "Invalid long_DRX value in DRX local configuration\n"); + break; + } + + memset(UE_scheduling_control->drx_retransmission_timer, 0, sizeof(UE_scheduling_control->drx_retransmission_timer)); + switch (drx_Configuration->choice.setup.drx_RetransmissionTimer) { + case 0: + memset(UE_scheduling_control->drx_retransmission_timer_thres, 1, sizeof(UE_scheduling_control->drx_retransmission_timer_thres)); + break; + case 1: + memset(UE_scheduling_control->drx_retransmission_timer_thres, 2, sizeof(UE_scheduling_control->drx_retransmission_timer_thres)); + break; + case 2: + memset(UE_scheduling_control->drx_retransmission_timer_thres, 4, sizeof(UE_scheduling_control->drx_retransmission_timer_thres)); + break; + case 3: + memset(UE_scheduling_control->drx_retransmission_timer_thres, 6, sizeof(UE_scheduling_control->drx_retransmission_timer_thres)); + break; + case 4: + memset(UE_scheduling_control->drx_retransmission_timer_thres, 8, sizeof(UE_scheduling_control->drx_retransmission_timer_thres)); + break; + case 5: + memset(UE_scheduling_control->drx_retransmission_timer_thres, 16, sizeof(UE_scheduling_control->drx_retransmission_timer_thres)); + break; + case 6: + memset(UE_scheduling_control->drx_retransmission_timer_thres, 24, sizeof(UE_scheduling_control->drx_retransmission_timer_thres)); + break; + case 7: + memset(UE_scheduling_control->drx_retransmission_timer_thres, 33, sizeof(UE_scheduling_control->drx_retransmission_timer_thres)); + break; + default: + LOG_E(MAC, "Error in local DRX configuration, the drx retransmission timer value specified is unknown\n"); + break; + } +} \ No newline at end of file diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c index ab2856c40c..0f8945ab94 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler.c +++ b/openair2/LAYER2/MAC/eNB_scheduler.c @@ -55,7 +55,7 @@ #include "eNB_scheduler_fairRR.h" #if defined(ENABLE_ITTI) -#include "intertask_interface.h" + #include "intertask_interface.h" #endif #include "assertions.h" @@ -68,289 +68,369 @@ extern RAN_CONTEXT_t RC; uint16_t pdcch_order_table[6] = { 31, 31, 511, 2047, 2047, 8191 }; - -void -schedule_SRS(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) +//----------------------------------------------------------------------------- +/* + * Schedule periodic SRS + */ +void schedule_SRS(module_id_t module_idP, + frame_t frameP, + sub_frame_t subframeP) +//----------------------------------------------------------------------------- { - - - eNB_MAC_INST *eNB = RC.mac[module_idP]; - UE_list_t *UE_list = &eNB->UE_list; - nfapi_ul_config_request_body_t *ul_req; - int CC_id, UE_id; - COMMON_channels_t *cc = RC.mac[module_idP]->common_channels; - LTE_SoundingRS_UL_ConfigCommon_t *soundingRS_UL_ConfigCommon; - struct LTE_SoundingRS_UL_ConfigDedicated *soundingRS_UL_ConfigDedicated; - uint8_t TSFC; - uint16_t deltaTSFC; // bitmap - uint8_t srs_SubframeConfig; - + int CC_id = 0; + int UE_id = -1; + uint8_t TSFC = 0; + uint8_t srs_SubframeConfig = 0; + uint16_t srsPeriodicity = 0; + uint16_t srsOffset = 0; + uint16_t deltaTSFC = 0; // bitmap // table for TSFC (Period) and deltaSFC (offset) - const uint16_t deltaTSFCTabType1[15][2] = { {1, 1}, {1, 2}, {2, 2}, {1, 5}, {2, 5}, {4, 5}, {8, 5}, {3, 5}, {12, 5}, {1, 10}, {2, 10}, {4, 10}, {8, 10}, {351, 10}, {383, 10} }; // Table 5.5.3.3-2 3GPP 36.211 FDD - const uint16_t deltaTSFCTabType2[14][2] = { {2, 5}, {6, 5}, {10, 5}, {18, 5}, {14, 5}, {22, 5}, {26, 5}, {30, 5}, {70, 10}, {74, 10}, {194, 10}, {326, 10}, {586, 10}, {210, 10} }; // Table 5.5.3.3-2 3GPP 36.211 TDD - - uint16_t srsPeriodicity, srsOffset; - + const uint16_t deltaTSFCTabType1[15][2] = { {1, 1}, {1, 2}, {2, 2}, {1, 5}, {2, 5}, {4, 5}, {8, 5}, {3, 5}, {12, 5}, {1, 10}, {2, 10}, {4, 10}, {8, 10}, {351, 10}, {383, 10} }; // Table 5.5.3.3-2 3GPP 36.211 FDD + const uint16_t deltaTSFCTabType2[14][2] = { {2, 5}, {6, 5}, {10, 5}, {18, 5}, {14, 5}, {22, 5}, {26, 5}, {30, 5}, {70, 10}, {74, 10}, {194, 10}, {326, 10}, {586, 10}, {210, 10} }; // Table 5.5.3.3-2 3GPP 36.211 TDD + eNB_MAC_INST *eNB = RC.mac[module_idP]; + UE_list_t *UE_list = &(eNB->UE_list); + nfapi_ul_config_request_body_t *ul_req = NULL; + UE_sched_ctrl *UE_scheduling_control = NULL; + COMMON_channels_t *cc = eNB->common_channels; + LTE_SoundingRS_UL_ConfigCommon_t *soundingRS_UL_ConfigCommon = NULL; + struct LTE_SoundingRS_UL_ConfigDedicated *soundingRS_UL_ConfigDedicated = NULL; + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { - soundingRS_UL_ConfigCommon = &cc[CC_id].radioResourceConfigCommon->soundingRS_UL_ConfigCommon; - // check if SRS is enabled in this frame/subframe + soundingRS_UL_ConfigCommon = &(cc[CC_id].radioResourceConfigCommon->soundingRS_UL_ConfigCommon); + + /* Check if SRS is enabled in this frame/subframe */ if (soundingRS_UL_ConfigCommon) { srs_SubframeConfig = soundingRS_UL_ConfigCommon->choice.setup.srs_SubframeConfig; - if (cc[CC_id].tdd_Config == NULL) { // FDD - deltaTSFC = deltaTSFCTabType1[srs_SubframeConfig][0]; - TSFC = deltaTSFCTabType1[srs_SubframeConfig][1]; - } else { // TDD - deltaTSFC = deltaTSFCTabType2[srs_SubframeConfig][0]; - TSFC = deltaTSFCTabType2[srs_SubframeConfig][1]; + + if (cc[CC_id].tdd_Config == NULL) { // FDD + deltaTSFC = deltaTSFCTabType1[srs_SubframeConfig][0]; + TSFC = deltaTSFCTabType1[srs_SubframeConfig][1]; + } else { // TDD + deltaTSFC = deltaTSFCTabType2[srs_SubframeConfig][0]; + TSFC = deltaTSFCTabType2[srs_SubframeConfig][1]; } - // Sounding reference signal subframes are the subframes satisfying ns/2 mod TSFC (- deltaTSFC + + /* Sounding reference signal subframes are the subframes satisfying ns/2 mod TSFC (- deltaTSFC) */ uint16_t tmp = (subframeP % TSFC); - + if ((1 << tmp) & deltaTSFC) { - // This is an SRS subframe, loop over UEs - for (UE_id = 0; UE_id < MAX_MOBILES_PER_ENB; UE_id++) { - if (!RC.mac[module_idP]->UE_list.active[UE_id]) continue; - ul_req = &RC.mac[module_idP]->UL_req[CC_id].ul_config_request_body; - // drop the allocation if the UE hasn't send RRCConnectionSetupComplete yet - if (mac_eNB_get_rrc_status(module_idP,UE_RNTI(module_idP, UE_id)) < RRC_CONNECTED) continue; - - AssertFatal(UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated != NULL, - "physicalConfigDedicated is null for UE %d\n", - UE_id); - - if ((soundingRS_UL_ConfigDedicated = UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->soundingRS_UL_ConfigDedicated) != NULL) { - if (soundingRS_UL_ConfigDedicated->present == LTE_SoundingRS_UL_ConfigDedicated_PR_setup) { - get_srs_pos(&cc[CC_id], - soundingRS_UL_ConfigDedicated->choice. - setup.srs_ConfigIndex, - &srsPeriodicity, &srsOffset); - if (((10 * frameP + subframeP) % srsPeriodicity) == srsOffset) { - // Program SRS - ul_req->srs_present = 1; - nfapi_ul_config_request_pdu_t * ul_config_pdu = &ul_req->ul_config_pdu_list[ul_req->number_of_pdus]; - memset((void *) ul_config_pdu, 0, sizeof(nfapi_ul_config_request_pdu_t)); - ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_SRS_PDU_TYPE; - ul_config_pdu->pdu_size = 2 + (uint8_t) (2 + sizeof(nfapi_ul_config_srs_pdu)); - ul_config_pdu->srs_pdu.srs_pdu_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL8_TAG; - ul_config_pdu->srs_pdu.srs_pdu_rel8.size = (uint8_t)sizeof(nfapi_ul_config_srs_pdu); - ul_config_pdu->srs_pdu.srs_pdu_rel8.rnti = UE_list->UE_template[CC_id][UE_id].rnti; - ul_config_pdu->srs_pdu.srs_pdu_rel8.srs_bandwidth = soundingRS_UL_ConfigDedicated->choice.setup.srs_Bandwidth; - ul_config_pdu->srs_pdu.srs_pdu_rel8.frequency_domain_position = soundingRS_UL_ConfigDedicated->choice.setup.freqDomainPosition; - ul_config_pdu->srs_pdu.srs_pdu_rel8.srs_hopping_bandwidth = soundingRS_UL_ConfigDedicated->choice.setup.srs_HoppingBandwidth;; - ul_config_pdu->srs_pdu.srs_pdu_rel8.transmission_comb = soundingRS_UL_ConfigDedicated->choice.setup.transmissionComb; - ul_config_pdu->srs_pdu.srs_pdu_rel8.i_srs = soundingRS_UL_ConfigDedicated->choice.setup.srs_ConfigIndex; - ul_config_pdu->srs_pdu.srs_pdu_rel8.sounding_reference_cyclic_shift = soundingRS_UL_ConfigDedicated->choice.setup.cyclicShift; // ul_config_pdu->srs_pdu.srs_pdu_rel10.antenna_port = ;// - // ul_config_pdu->srs_pdu.srs_pdu_rel13.number_of_combs = ;// - RC.mac[module_idP]->UL_req[CC_id].sfn_sf = (frameP << 4) + subframeP; - RC.mac[module_idP]->UL_req[CC_id].header.message_id = NFAPI_UL_CONFIG_REQUEST; - ul_req->number_of_pdus++; - } // if (((10*frameP+subframeP) % srsPeriodicity) == srsOffset) - } // if (soundingRS_UL_ConfigDedicated->present == SoundingRS_UL_ConfigDedicated_PR_setup) - } // if ((soundingRS_UL_ConfigDedicated = UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->soundingRS_UL_ConfigDedicated)!=NULL) - } // for (UE_id ... - } // if((1<<tmp) & deltaTSFC) - - } // SRS config - } + /* This is an SRS subframe, loop over UEs */ + for (UE_id = 0; UE_id < MAX_MOBILES_PER_ENB; UE_id++) { + if (!UE_list->active[UE_id]) { + continue; + } + + /* Drop the allocation if the UE hasn't send RRCConnectionSetupComplete yet */ + if (mac_eNB_get_rrc_status(module_idP, UE_RNTI(module_idP, UE_id)) < RRC_CONNECTED) { + continue; + } + + AssertFatal(UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated != NULL, + "physicalConfigDedicated is null for UE %d\n", + UE_id); + + /* CDRX condition on Active Time and SRS type-0 report (36.321 5.7) */ + UE_scheduling_control = &(UE_list->UE_sched_ctrl[UE_id]); + + /* Test if Active Time not running since 6+ subframes */ + if (UE_scheduling_control->cdrx_configured == TRUE && UE_scheduling_control->in_active_time == FALSE) { + /* + * TODO: 6+ subframes condition not checked here + */ + continue; + } + + ul_req = &(eNB->UL_req[CC_id].ul_config_request_body); + + if ((soundingRS_UL_ConfigDedicated = UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->soundingRS_UL_ConfigDedicated) != NULL) { + if (soundingRS_UL_ConfigDedicated->present == LTE_SoundingRS_UL_ConfigDedicated_PR_setup) { + get_srs_pos(&cc[CC_id], + soundingRS_UL_ConfigDedicated->choice.setup.srs_ConfigIndex, + &srsPeriodicity, + &srsOffset); + + if (((10 * frameP + subframeP) % srsPeriodicity) == srsOffset) { + // Program SRS + ul_req->srs_present = 1; + nfapi_ul_config_request_pdu_t *ul_config_pdu = &(ul_req->ul_config_pdu_list[ul_req->number_of_pdus]); + memset((void *) ul_config_pdu, 0, sizeof(nfapi_ul_config_request_pdu_t)); + ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_SRS_PDU_TYPE; + ul_config_pdu->pdu_size = 2 + (uint8_t) (2 + sizeof(nfapi_ul_config_srs_pdu)); + ul_config_pdu->srs_pdu.srs_pdu_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL8_TAG; + ul_config_pdu->srs_pdu.srs_pdu_rel8.size = (uint8_t)sizeof(nfapi_ul_config_srs_pdu); + ul_config_pdu->srs_pdu.srs_pdu_rel8.rnti = UE_list->UE_template[CC_id][UE_id].rnti; + ul_config_pdu->srs_pdu.srs_pdu_rel8.srs_bandwidth = soundingRS_UL_ConfigDedicated->choice.setup.srs_Bandwidth; + ul_config_pdu->srs_pdu.srs_pdu_rel8.frequency_domain_position = soundingRS_UL_ConfigDedicated->choice.setup.freqDomainPosition; + ul_config_pdu->srs_pdu.srs_pdu_rel8.srs_hopping_bandwidth = soundingRS_UL_ConfigDedicated->choice.setup.srs_HoppingBandwidth;; + ul_config_pdu->srs_pdu.srs_pdu_rel8.transmission_comb = soundingRS_UL_ConfigDedicated->choice.setup.transmissionComb; + ul_config_pdu->srs_pdu.srs_pdu_rel8.i_srs = soundingRS_UL_ConfigDedicated->choice.setup.srs_ConfigIndex; + ul_config_pdu->srs_pdu.srs_pdu_rel8.sounding_reference_cyclic_shift = soundingRS_UL_ConfigDedicated->choice.setup.cyclicShift; + + eNB->UL_req[CC_id].sfn_sf = (frameP << 4) + subframeP; + eNB->UL_req[CC_id].header.message_id = NFAPI_UL_CONFIG_REQUEST; + ul_req->number_of_pdus++; + } // if (((10*frameP+subframeP) % srsPeriodicity) == srsOffset) + } // if (soundingRS_UL_ConfigDedicated->present == SoundingRS_UL_ConfigDedicated_PR_setup) + } // if ((soundingRS_UL_ConfigDedicated = UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->soundingRS_UL_ConfigDedicated)!=NULL) + } // end for loop on UE_id + } // if((1<<tmp) & deltaTSFC) + } // SRS config not NULL + } // end for loop on CC_id } -void -schedule_CSI(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) +//----------------------------------------------------------------------------- +/* +* Schedule the CSI (CQI/PMI/RI/PTI/CRI) periodic reception +*/ +void schedule_CSI(module_id_t module_idP, + frame_t frameP, + sub_frame_t subframeP) +//----------------------------------------------------------------------------- { + int CC_id = 0; + int UE_id = 0; + int H = 0; + uint16_t Npd = 0; + uint16_t N_OFFSET_CQI = 0; + struct LTE_CQI_ReportPeriodic *cqi_ReportPeriodic = NULL; eNB_MAC_INST *eNB = RC.mac[module_idP]; UE_list_t *UE_list = &eNB->UE_list; - COMMON_channels_t *cc; - nfapi_ul_config_request_body_t *ul_req; - int CC_id, UE_id; - struct LTE_CQI_ReportPeriodic *cqi_ReportPeriodic; - uint16_t Npd, N_OFFSET_CQI; - int H; + COMMON_channels_t *cc = NULL; + nfapi_ul_config_request_body_t *ul_req = NULL; + UE_sched_ctrl *UE_scheduling_control = NULL; for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { - cc = &eNB->common_channels[CC_id]; + for (UE_id = 0; UE_id < MAX_MOBILES_PER_ENB; UE_id++) { - if (!UE_list->active[UE_id]) continue; - - ul_req = &RC.mac[module_idP]->UL_req[CC_id].ul_config_request_body; - - // drop the allocation if the UE hasn't send RRCConnectionSetupComplete yet - if (mac_eNB_get_rrc_status(module_idP, UE_RNTI(module_idP, UE_id)) < RRC_CONNECTED) continue; - - AssertFatal(UE_list-> - UE_template[CC_id][UE_id].physicalConfigDedicated - != NULL, - "physicalConfigDedicated is null for UE %d\n", - UE_id); - - if (UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->cqi_ReportConfig) { - if ((cqi_ReportPeriodic = UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic) != NULL - && (cqi_ReportPeriodic->present != LTE_CQI_ReportPeriodic_PR_release)) { - //Rel8 Periodic CQI/PMI/RI reporting - - get_csi_params(cc, cqi_ReportPeriodic, &Npd, - &N_OFFSET_CQI, &H); - - if ((((frameP * 10) + subframeP) % Npd) == N_OFFSET_CQI) { // CQI opportunity - UE_list->UE_sched_ctrl[UE_id].feedback_cnt[CC_id] = (((frameP * 10) + subframeP) / Npd) % H; - // Program CQI - nfapi_ul_config_request_pdu_t *ul_config_pdu = &ul_req->ul_config_pdu_list[ul_req->number_of_pdus]; - memset((void *) ul_config_pdu, 0, - sizeof(nfapi_ul_config_request_pdu_t)); - ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE; - ul_config_pdu->pdu_size = 2 + (uint8_t) (2 + sizeof(nfapi_ul_config_uci_cqi_pdu)); - ul_config_pdu->uci_cqi_pdu.ue_information.ue_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG; - ul_config_pdu->uci_cqi_pdu.ue_information.ue_information_rel8.rnti = UE_list->UE_template[CC_id][UE_id].rnti; - ul_config_pdu->uci_cqi_pdu.cqi_information.cqi_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG; - ul_config_pdu->uci_cqi_pdu.cqi_information.cqi_information_rel8.pucch_index = cqi_ReportPeriodic->choice.setup.cqi_PUCCH_ResourceIndex; - ul_config_pdu->uci_cqi_pdu.cqi_information.cqi_information_rel8.dl_cqi_pmi_size = get_rel8_dl_cqi_pmi_size(&UE_list->UE_sched_ctrl[UE_id], CC_id, cc, - get_tmode(module_idP, CC_id, UE_id), - cqi_ReportPeriodic); - ul_req->number_of_pdus++; - ul_req->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG; + if (UE_list->active[UE_id] == FALSE) { + continue; + } + + /* Drop the allocation if the UE hasn't sent RRCConnectionSetupComplete yet */ + if (mac_eNB_get_rrc_status(module_idP, UE_RNTI(module_idP, UE_id)) < RRC_CONNECTED) { + continue; + } + + AssertFatal(UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated != NULL, + "physicalConfigDedicated is null for UE %d\n", + UE_id); + /* + * CDRX condition on Active Time and CSI report on PUCCH (36.321 5.7). + * Here we consider classic periodic reports on PUCCH without PUSCH simultaneous transmission condition. + * TODO: add the handling or test on simultaneous PUCCH/PUSCH transmission + */ + UE_scheduling_control = &(UE_list->UE_sched_ctrl[UE_id]); + + if (UE_scheduling_control->cdrx_configured == TRUE) { + /* Test if CQI masking activated */ + if (UE_scheduling_control->cqi_mask_boolean == TRUE) { + // CQI masking => test if onDurationTime not running since 6+ subframe + if (UE_scheduling_control->on_duration_timer == 0) { + /* + * TODO: 6+ subframes condition not checked here + */ + continue; + } + } else { // No CQI masking => test if Active Time not running since 6+ subframe + if (UE_scheduling_control->in_active_time == FALSE) { + /* + * TODO: 6+ subframes condition not checked here + */ + continue; + } + } + } + + ul_req = &(eNB->UL_req[CC_id].ul_config_request_body); + + if (UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->cqi_ReportConfig != NULL) { + cqi_ReportPeriodic = UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic; + + if (cqi_ReportPeriodic != NULL) { + /* Rel8 Periodic CSI (CQI/PMI/RI) reporting */ + if (cqi_ReportPeriodic->present != LTE_CQI_ReportPeriodic_PR_release) { + get_csi_params(cc, cqi_ReportPeriodic, &Npd, &N_OFFSET_CQI, &H); + + if ((((frameP * 10) + subframeP) % Npd) == N_OFFSET_CQI) { // CQI periodic opportunity + UE_scheduling_control->feedback_cnt[CC_id] = (((frameP * 10) + subframeP) / Npd) % H; + + // Program CQI + nfapi_ul_config_request_pdu_t *ul_config_pdu = &ul_req->ul_config_pdu_list[ul_req->number_of_pdus]; + memset((void *) ul_config_pdu, 0, sizeof(nfapi_ul_config_request_pdu_t)); + + ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE; + ul_config_pdu->pdu_size = 2 + (uint8_t) (2 + sizeof(nfapi_ul_config_uci_cqi_pdu)); + ul_config_pdu->uci_cqi_pdu.ue_information.ue_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG; + ul_config_pdu->uci_cqi_pdu.ue_information.ue_information_rel8.rnti = UE_list->UE_template[CC_id][UE_id].rnti; + ul_config_pdu->uci_cqi_pdu.cqi_information.cqi_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG; + ul_config_pdu->uci_cqi_pdu.cqi_information.cqi_information_rel8.pucch_index = cqi_ReportPeriodic->choice.setup.cqi_PUCCH_ResourceIndex; + ul_config_pdu->uci_cqi_pdu.cqi_information.cqi_information_rel8.dl_cqi_pmi_size = get_rel8_dl_cqi_pmi_size(&UE_list->UE_sched_ctrl[UE_id], CC_id, cc, get_tmode(module_idP, CC_id, UE_id), cqi_ReportPeriodic); + ul_req->number_of_pdus++; + ul_req->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG; #if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0)) - // PUT rel10-13 UCI options here + // PUT rel10-13 UCI options here #endif - } else - if ((cqi_ReportPeriodic->choice.setup.ri_ConfigIndex) - && ((((frameP * 10) + subframeP) % ((H * Npd) << (*cqi_ReportPeriodic->choice.setup.ri_ConfigIndex / 161))) == N_OFFSET_CQI + (*cqi_ReportPeriodic->choice.setup.ri_ConfigIndex % 161))) { // RI opportunity - // Program RI - nfapi_ul_config_request_pdu_t *ul_config_pdu = &ul_req->ul_config_pdu_list[ul_req->number_of_pdus]; - memset((void *) ul_config_pdu, 0, - sizeof(nfapi_ul_config_request_pdu_t)); - ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE; - ul_config_pdu->pdu_size = 2 + (uint8_t) (2 + sizeof(nfapi_ul_config_uci_cqi_pdu)); - ul_config_pdu->uci_cqi_pdu.ue_information.ue_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG; - ul_config_pdu->uci_cqi_pdu.ue_information.ue_information_rel8.rnti = UE_list->UE_template[CC_id][UE_id].rnti; - ul_config_pdu->uci_cqi_pdu.cqi_information.cqi_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG; - ul_config_pdu->uci_cqi_pdu.cqi_information.cqi_information_rel8.pucch_index = cqi_ReportPeriodic->choice.setup.cqi_PUCCH_ResourceIndex; - ul_config_pdu->uci_cqi_pdu.cqi_information.cqi_information_rel8.dl_cqi_pmi_size = (cc->p_eNB == 2) ? 1 : 2; - RC.mac[module_idP]->UL_req[CC_id].sfn_sf = (frameP << 4) + subframeP; - ul_req->number_of_pdus++; - ul_req->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG; - } - } // if ((cqi_ReportPeriodic = cqi_ReportConfig->cqi_ReportPeriodic)!=NULL) { - } // if (UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->cqi_ReportConfig) - } // for (UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) { - } // for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { + } else if (cqi_ReportPeriodic->choice.setup.ri_ConfigIndex != NULL) { + if ((((frameP * 10) + subframeP) % ((H * Npd) << (*cqi_ReportPeriodic->choice.setup.ri_ConfigIndex / 161))) == + N_OFFSET_CQI + (*cqi_ReportPeriodic->choice.setup.ri_ConfigIndex % 161)) { // RI opportunity + + // Program RI + nfapi_ul_config_request_pdu_t *ul_config_pdu = &ul_req->ul_config_pdu_list[ul_req->number_of_pdus]; + memset((void *) ul_config_pdu, 0, sizeof(nfapi_ul_config_request_pdu_t)); + + ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE; + ul_config_pdu->pdu_size = 2 + (uint8_t) (2 + sizeof(nfapi_ul_config_uci_cqi_pdu)); + ul_config_pdu->uci_cqi_pdu.ue_information.ue_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG; + ul_config_pdu->uci_cqi_pdu.ue_information.ue_information_rel8.rnti = UE_list->UE_template[CC_id][UE_id].rnti; + ul_config_pdu->uci_cqi_pdu.cqi_information.cqi_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG; + ul_config_pdu->uci_cqi_pdu.cqi_information.cqi_information_rel8.pucch_index = cqi_ReportPeriodic->choice.setup.cqi_PUCCH_ResourceIndex; + ul_config_pdu->uci_cqi_pdu.cqi_information.cqi_information_rel8.dl_cqi_pmi_size = (cc->p_eNB == 2) ? 1 : 2; + RC.mac[module_idP]->UL_req[CC_id].sfn_sf = (frameP << 4) + subframeP; + ul_req->number_of_pdus++; + ul_req->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG; + } + } + } // if CSI Periodic is not release state + } // if (cqi_ReportPeriodic != NULL) + } // if cqi_ReportConfig != NULL + } // for (UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) { + } // for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { } +//----------------------------------------------------------------------------- +/* +* Schedule a possible Scheduling Request reception +*/ void -schedule_SR(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) +schedule_SR (module_id_t module_idP, + frame_t frameP, + sub_frame_t subframeP) +//----------------------------------------------------------------------------- { - eNB_MAC_INST *eNB = RC.mac[module_idP]; - UE_list_t *UE_list = &eNB->UE_list; - nfapi_ul_config_request_t *ul_req; - nfapi_ul_config_request_body_t *ul_req_body; - int CC_id; - int UE_id; - LTE_SchedulingRequestConfig_t *SRconfig; - int skip_ue; - int is_harq; + int skip_ue = 0; + int is_harq = 0; + int pdu_list_index = 0; + eNB_MAC_INST *eNB = RC.mac[module_idP]; + UE_list_t *UE_list = &eNB->UE_list; + nfapi_ul_config_request_t *ul_req = NULL; + nfapi_ul_config_request_body_t *ul_req_body = NULL; + LTE_SchedulingRequestConfig_t *SRconfig = NULL; nfapi_ul_config_sr_information sr; - int i; - for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { - RC.mac[module_idP]->UL_req[CC_id].sfn_sf = (frameP << 4) + subframeP; + for (int CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + eNB->UL_req[CC_id].sfn_sf = (frameP << 4) + subframeP; - for (UE_id = 0; UE_id < MAX_MOBILES_PER_ENB; UE_id++) { - if (!RC.mac[module_idP]->UE_list.active[UE_id]) continue; - - ul_req = &RC.mac[module_idP]->UL_req[CC_id]; - ul_req_body = &ul_req->ul_config_request_body; - - // drop the allocation if the UE hasn't send RRCConnectionSetupComplete yet - //if (mac_eNB_get_rrc_status(module_idP, UE_RNTI(module_idP, UE_id)) < RRC_CONNECTED) continue; + for (int UE_id = 0; UE_id < MAX_MOBILES_PER_ENB; UE_id++) { + if (!UE_list->active[UE_id]) { + continue; + } - if (UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated== NULL) continue; + if (UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated == NULL) continue; if ((SRconfig = UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->schedulingRequestConfig) != NULL) { - if (SRconfig->present == LTE_SchedulingRequestConfig_PR_setup) { - if (SRconfig->choice.setup.sr_ConfigIndex <= 4) { // 5 ms SR period - if ((subframeP % 5) != SRconfig->choice.setup.sr_ConfigIndex) continue; - } else if (SRconfig->choice.setup.sr_ConfigIndex <= 14) { // 10 ms SR period - if (subframeP != (SRconfig->choice.setup.sr_ConfigIndex - 5)) continue; - } else if (SRconfig->choice.setup.sr_ConfigIndex <= 34) { // 20 ms SR period - if ((10 * (frameP & 1) + subframeP) != (SRconfig->choice.setup.sr_ConfigIndex - 15)) continue; - } else if (SRconfig->choice.setup.sr_ConfigIndex <= 74) { // 40 ms SR period - if ((10 * (frameP & 3) + subframeP) != (SRconfig->choice.setup.sr_ConfigIndex - 35)) continue; - } else if (SRconfig->choice.setup.sr_ConfigIndex <= 154) { // 80 ms SR period - if ((10 * (frameP & 7) + subframeP) != (SRconfig->choice.setup.sr_ConfigIndex - 75)) continue; - } - } // SRconfig->present == SchedulingRequestConfig_PR_setup) - } // SRconfig = UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->schedulingRequestConfig)!=NULL) - - // if we get here there is some PUCCH1 reception to schedule for SR + if (SRconfig->present == LTE_SchedulingRequestConfig_PR_setup) { + if (SRconfig->choice.setup.sr_ConfigIndex <= 4) { // 5 ms SR period + if ((subframeP % 5) != SRconfig->choice.setup.sr_ConfigIndex) continue; + } else if (SRconfig->choice.setup.sr_ConfigIndex <= 14) { // 10 ms SR period + if (subframeP != (SRconfig->choice.setup.sr_ConfigIndex - 5)) continue; + } else if (SRconfig->choice.setup.sr_ConfigIndex <= 34) { // 20 ms SR period + if ((10 * (frameP & 1) + subframeP) != (SRconfig->choice.setup.sr_ConfigIndex - 15)) continue; + } else if (SRconfig->choice.setup.sr_ConfigIndex <= 74) { // 40 ms SR period + if ((10 * (frameP & 3) + subframeP) != (SRconfig->choice.setup.sr_ConfigIndex - 35)) continue; + } else if (SRconfig->choice.setup.sr_ConfigIndex <= 154) { // 80 ms SR period + if ((10 * (frameP & 7) + subframeP) != (SRconfig->choice.setup.sr_ConfigIndex - 75)) continue; + } + } // SRconfig->present == SchedulingRequestConfig_PR_setup) + } // SRconfig = UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->schedulingRequestConfig)!=NULL) + /* If we get here there is some PUCCH1 reception to schedule for SR */ + ul_req = &(eNB->UL_req[CC_id]); + ul_req_body = &(ul_req->ul_config_request_body); skip_ue = 0; is_harq = 0; - // check that there is no existing UL grant for ULSCH which overrides the SR - for (i = 0; i < ul_req_body->number_of_pdus; i++) { - if (((ul_req_body->ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_PDU_TYPE) || - (ul_req_body->ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE) || - (ul_req_body->ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE) || - (ul_req_body->ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE)) && - (ul_req_body->ul_config_pdu_list[i].ulsch_pdu.ulsch_pdu_rel8.rnti == UE_list->UE_template[CC_id][UE_id].rnti)) { - skip_ue = 1; - break; - } - /* if there is already an HARQ pdu, convert to SR_HARQ */ - else if ((ul_req_body->ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE) && - (ul_req_body->ul_config_pdu_list[i].uci_harq_pdu.ue_information.ue_information_rel8.rnti == UE_list->UE_template[CC_id][UE_id].rnti)) { - is_harq = 1; - break; - } + pdu_list_index = 0; + + /* Check that there is no existing UL grant for ULSCH which overrides the SR */ + for (int i = 0; i < ul_req_body->number_of_pdus; i++) { + if (((ul_req_body->ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_PDU_TYPE) || + (ul_req_body->ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE) || + (ul_req_body->ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE) || + (ul_req_body->ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE)) && + (ul_req_body->ul_config_pdu_list[i].ulsch_pdu.ulsch_pdu_rel8.rnti == UE_list->UE_template[CC_id][UE_id].rnti)) { + skip_ue = 1; + pdu_list_index = i; + break; + } + /* If there is already an HARQ pdu, convert to SR_HARQ */ + else if ((ul_req_body->ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE) && + (ul_req_body->ul_config_pdu_list[i].uci_harq_pdu.ue_information.ue_information_rel8.rnti == UE_list->UE_template[CC_id][UE_id].rnti)) { + is_harq = 1; + pdu_list_index = i; + break; + } } - // drop the allocation because ULSCH with handle it with BSR + /* Drop the allocation because ULSCH will handle it with BSR */ if (skip_ue == 1) continue; - LOG_D(MAC,"Frame %d, Subframe %d : Scheduling SR for UE %d/%x is_harq:%d\n",frameP,subframeP,UE_id,UE_list->UE_template[CC_id][UE_id].rnti, is_harq); + LOG_D(MAC, "Frame %d, Subframe %d : Scheduling SR for UE %d/%x is_harq:%d \n", + frameP, + subframeP, + UE_id, + UE_list->UE_template[CC_id][UE_id].rnti, + is_harq); - // check Rel10 or Rel8 SR + /* Check Rel10 or Rel8 SR */ #if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0)) - if ((UE_list-> UE_template[CC_id][UE_id].physicalConfigDedicated->ext2) - && (UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->ext2->schedulingRequestConfig_v1020) - && (UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->ext2->schedulingRequestConfig_v1020)) { - sr.sr_information_rel10.tl.tag = NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL10_TAG; - sr.sr_information_rel10.number_of_pucch_resources = 1; - sr.sr_information_rel10.pucch_index_p1 = *UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->ext2->schedulingRequestConfig_v1020->sr_PUCCH_ResourceIndexP1_r10; - LOG_D(MAC,"REL10 PUCCH INDEX P1:%d\n", sr.sr_information_rel10.pucch_index_p1); + if ((UE_list-> UE_template[CC_id][UE_id].physicalConfigDedicated->ext2) && + (UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->ext2->schedulingRequestConfig_v1020) && + (UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->ext2->schedulingRequestConfig_v1020)) { + sr.sr_information_rel10.tl.tag = NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL10_TAG; + sr.sr_information_rel10.number_of_pucch_resources = 1; + sr.sr_information_rel10.pucch_index_p1 = *UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->ext2->schedulingRequestConfig_v1020->sr_PUCCH_ResourceIndexP1_r10; + + LOG_D(MAC, "REL10 PUCCH INDEX P1:%d \n", + sr.sr_information_rel10.pucch_index_p1); + } else #endif - { - sr.sr_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL8_TAG; - sr.sr_information_rel8.pucch_index = UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->schedulingRequestConfig->choice.setup.sr_PUCCH_ResourceIndex; - LOG_D(MAC,"REL8 PUCCH INDEX:%d\n", sr.sr_information_rel8.pucch_index); - } + { + sr.sr_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL8_TAG; + sr.sr_information_rel8.pucch_index = UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->schedulingRequestConfig->choice.setup.sr_PUCCH_ResourceIndex; + + LOG_D(MAC, "REL8 PUCCH INDEX:%d\n", + sr.sr_information_rel8.pucch_index); + } - /* if there is already an HARQ pdu, convert to SR_HARQ */ + /* If there is already an HARQ pdu, convert to SR_HARQ */ if (is_harq) { - nfapi_ul_config_harq_information h = ul_req_body->ul_config_pdu_list[i].uci_harq_pdu.harq_information; - ul_req_body->ul_config_pdu_list[i].pdu_type = NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE; - ul_req_body->ul_config_pdu_list[i].uci_sr_harq_pdu.sr_information = sr; - ul_req_body->ul_config_pdu_list[i].uci_sr_harq_pdu.harq_information = h; + nfapi_ul_config_harq_information harq = ul_req_body->ul_config_pdu_list[pdu_list_index].uci_harq_pdu.harq_information; + ul_req_body->ul_config_pdu_list[pdu_list_index].pdu_type = NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE; + ul_req_body->ul_config_pdu_list[pdu_list_index].uci_sr_harq_pdu.sr_information = sr; + ul_req_body->ul_config_pdu_list[pdu_list_index].uci_sr_harq_pdu.harq_information = harq; } else { - ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].pdu_type = NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE; - ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].uci_sr_pdu.ue_information.ue_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG; - ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].uci_sr_pdu.ue_information.ue_information_rel8.rnti = UE_list->UE_template[CC_id][UE_id].rnti; - ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].uci_sr_pdu.ue_information.ue_information_rel11.tl.tag = 0; - ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].uci_sr_pdu.ue_information.ue_information_rel13.tl.tag = 0; - ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].uci_sr_pdu.sr_information = sr; - ul_req_body->number_of_pdus++; - } /* if (is_harq) */ - ul_req_body->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG; - } // for (UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) - } // for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) + ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].pdu_type = NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE; + ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].uci_sr_pdu.ue_information.ue_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG; + ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].uci_sr_pdu.ue_information.ue_information_rel8.rnti = UE_list->UE_template[CC_id][UE_id].rnti; + ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].uci_sr_pdu.ue_information.ue_information_rel11.tl.tag = 0; + ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].uci_sr_pdu.ue_information.ue_information_rel13.tl.tag = 0; + ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].uci_sr_pdu.sr_information = sr; + ul_req_body->number_of_pdus++; + } // if (is_harq) + + ul_req_body->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG; + + } // for (int UE_id = 0; UE_id < MAX_MOBILES_PER_ENB; UE_id++) + } // for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) } extern uint8_t nfapi_mode; void check_ul_failure(module_id_t module_idP, int CC_id, int UE_id, - frame_t frameP, sub_frame_t subframeP) -{ + frame_t frameP, sub_frame_t subframeP) { UE_list_t *UE_list = &RC.mac[module_idP]->UE_list; nfapi_dl_config_request_t *DL_req = &RC.mac[module_idP]->DL_req[0]; uint16_t rnti = UE_RNTI(module_idP, UE_id); @@ -362,9 +442,9 @@ check_ul_failure(module_id_t module_idP, int CC_id, int UE_id, if (UE_list->UE_sched_ctrl[UE_id].ul_failure_timer == 1) LOG_I(MAC, "UE %d rnti %x: UL Failure timer %d \n", UE_id, rnti, UE_list->UE_sched_ctrl[UE_id].ul_failure_timer); + if (UE_list->UE_sched_ctrl[UE_id].ra_pdcch_order_sent == 0) { UE_list->UE_sched_ctrl[UE_id].ra_pdcch_order_sent = 1; - // add a format 1A dci for this UE to request an RA procedure (only one UE per subframe) nfapi_dl_config_request_pdu_t *dl_config_pdu = &DL_req[CC_id].dl_config_request_body.dl_config_pdu_list[DL_req[CC_id].dl_config_request_body.number_pdu]; memset((void *) dl_config_pdu, 0,sizeof(nfapi_dl_config_request_pdu_t)); @@ -373,34 +453,35 @@ check_ul_failure(module_id_t module_idP, int CC_id, int UE_id, dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG; dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.dci_format = NFAPI_DL_DCI_FORMAT_1A; dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level = get_aggregation(get_bw_index(module_idP, CC_id), - UE_list->UE_sched_ctrl[UE_id]. - dl_cqi[CC_id], format1A); + UE_list->UE_sched_ctrl[UE_id]. + dl_cqi[CC_id], format1A); dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti = rnti; - dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type = 1; // CRNTI : see Table 4-10 from SCF082 - nFAPI specifications - dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.transmission_power = 6000; // equal to RS power - + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type = 1; // CRNTI : see Table 4-10 from SCF082 - nFAPI specifications + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.transmission_power = 6000; // equal to RS power AssertFatal((cc[CC_id].mib->message.dl_Bandwidth >= 0) && (cc[CC_id].mib->message.dl_Bandwidth < 6), - "illegal dl_Bandwidth %d\n", - (int) cc[CC_id].mib->message.dl_Bandwidth); + "illegal dl_Bandwidth %d\n", + (int) cc[CC_id].mib->message.dl_Bandwidth); dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.resource_block_coding = pdcch_order_table[cc[CC_id].mib->message.dl_Bandwidth]; DL_req[CC_id].dl_config_request_body.number_dci++; DL_req[CC_id].dl_config_request_body.number_pdu++; DL_req[CC_id].dl_config_request_body.tl.tag = NFAPI_DL_CONFIG_REQUEST_BODY_TAG; LOG_D(MAC, - "UE %d rnti %x: sending PDCCH order for RAPROC (failure timer %d), resource_block_coding %d \n", - UE_id, rnti, - UE_list->UE_sched_ctrl[UE_id].ul_failure_timer, - dl_config_pdu->dci_dl_pdu. - dci_dl_pdu_rel8.resource_block_coding); - } else { // ra_pdcch_sent==1 + "UE %d rnti %x: sending PDCCH order for RAPROC (failure timer %d), resource_block_coding %d \n", + UE_id, rnti, + UE_list->UE_sched_ctrl[UE_id].ul_failure_timer, + dl_config_pdu->dci_dl_pdu. + dci_dl_pdu_rel8.resource_block_coding); + } else { // ra_pdcch_sent==1 LOG_D(MAC, - "UE %d rnti %x: sent PDCCH order for RAPROC waiting (failure timer %d) \n", - UE_id, rnti, - UE_list->UE_sched_ctrl[UE_id].ul_failure_timer); - if ((UE_list->UE_sched_ctrl[UE_id].ul_failure_timer % 80) == 0) UE_list->UE_sched_ctrl[UE_id].ra_pdcch_order_sent = 0; // resend every 8 frames + "UE %d rnti %x: sent PDCCH order for RAPROC waiting (failure timer %d) \n", + UE_id, rnti, + UE_list->UE_sched_ctrl[UE_id].ul_failure_timer); + + if ((UE_list->UE_sched_ctrl[UE_id].ul_failure_timer % 80) == 0) UE_list->UE_sched_ctrl[UE_id].ra_pdcch_order_sent = 0; // resend every 8 frames } UE_list->UE_sched_ctrl[UE_id].ul_failure_timer++; + // check threshold if (UE_list->UE_sched_ctrl[UE_id].ul_failure_timer > 4000) { // note: probably ul_failure_timer should be less than UE radio link failure time(see T310/N310/N311) @@ -414,30 +495,31 @@ check_ul_failure(module_id_t module_idP, int CC_id, int UE_id, itti_send_msg_to_task(TASK_DU_F1, module_idP, m); } else { // inform RRC of failure and clear timer - LOG_I(MAC, - "UE %d rnti %x: UL Failure after repeated PDCCH orders: Triggering RRC \n", - UE_id, rnti); - mac_eNB_rrc_ul_failure(module_idP, CC_id, frameP, subframeP,rnti); + LOG_I(MAC, "UE %d rnti %x: UL Failure after repeated PDCCH orders: Triggering RRC \n", + UE_id, + rnti); + mac_eNB_rrc_ul_failure(module_idP, + CC_id, + frameP, + subframeP, + rnti); } UE_list->UE_sched_ctrl[UE_id].ul_failure_timer = 0; UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync = 1; } - } // ul_failure_timer>0 + } // ul_failure_timer>0 } void -clear_nfapi_information(eNB_MAC_INST * eNB, int CC_idP, - frame_t frameP, sub_frame_t subframeP) -{ +clear_nfapi_information(eNB_MAC_INST *eNB, int CC_idP, + frame_t frameP, sub_frame_t subframeP) { nfapi_dl_config_request_t *DL_req = &eNB->DL_req[0]; nfapi_ul_config_request_t *UL_req = &eNB->UL_req[0]; nfapi_hi_dci0_request_t *HI_DCI0_req = &eNB->HI_DCI0_req[CC_idP][subframeP]; nfapi_tx_request_t *TX_req = &eNB->TX_req[0]; - eNB->pdu_index[CC_idP] = 0; if (nfapi_mode==0 || nfapi_mode == 1) { // monolithic or PNF - DL_req[CC_idP].dl_config_request_body.number_pdcch_ofdm_symbols = 1; DL_req[CC_idP].dl_config_request_body.number_dci = 0; DL_req[CC_idP].dl_config_request_body.number_pdu = 0; @@ -447,186 +529,386 @@ clear_nfapi_information(eNB_MAC_INST * eNB, int CC_idP, HI_DCI0_req->hi_dci0_request_body.sfnsf = subframeP + (frameP<<4); HI_DCI0_req->hi_dci0_request_body.number_of_dci = 0; - - UL_req[CC_idP].ul_config_request_body.number_of_pdus = 0; UL_req[CC_idP].ul_config_request_body.rach_prach_frequency_resources = 0; // ignored, handled by PHY for now UL_req[CC_idP].ul_config_request_body.srs_present = 0; // ignored, handled by PHY for now - TX_req[CC_idP].tx_request_body.number_of_pdus = 0; - } } void -copy_ulreq(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) -{ +copy_ulreq(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) { int CC_id; eNB_MAC_INST *mac = RC.mac[module_idP]; for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { - nfapi_ul_config_request_t *ul_req_tmp = &mac->UL_req_tmp[CC_id][subframeP]; nfapi_ul_config_request_t *ul_req = &mac->UL_req[CC_id]; nfapi_ul_config_request_pdu_t *ul_req_pdu = ul_req->ul_config_request_body.ul_config_pdu_list; - *ul_req = *ul_req_tmp; - // Restore the pointer ul_req->ul_config_request_body.ul_config_pdu_list = ul_req_pdu; ul_req->sfn_sf = (frameP<<4) + subframeP; ul_req_tmp->ul_config_request_body.number_of_pdus = 0; - if (ul_req->ul_config_request_body.number_of_pdus>0) - { - LOG_D(PHY, "%s() active NOW (frameP:%d subframeP:%d) pdus:%d\n", __FUNCTION__, frameP, subframeP, ul_req->ul_config_request_body.number_of_pdus); - } + if (ul_req->ul_config_request_body.number_of_pdus>0) { + LOG_D(PHY, "%s() active NOW (frameP:%d subframeP:%d) pdus:%d\n", __FUNCTION__, frameP, subframeP, ul_req->ul_config_request_body.number_of_pdus); + } - memcpy((void*)ul_req->ul_config_request_body.ul_config_pdu_list, - (void*)ul_req_tmp->ul_config_request_body.ul_config_pdu_list, - ul_req->ul_config_request_body.number_of_pdus*sizeof(nfapi_ul_config_request_pdu_t)); + memcpy((void *)ul_req->ul_config_request_body.ul_config_pdu_list, + (void *)ul_req_tmp->ul_config_request_body.ul_config_pdu_list, + ul_req->ul_config_request_body.number_of_pdus*sizeof(nfapi_ul_config_request_pdu_t)); } } void -eNB_dlsch_ulsch_scheduler(module_id_t module_idP, frame_t frameP, - sub_frame_t subframeP) +eNB_dlsch_ulsch_scheduler(module_id_t module_idP, + frame_t frameP, + sub_frame_t subframeP) { - int mbsfn_status[MAX_NUM_CCs]; protocol_ctxt_t ctxt; + rnti_t rnti = 0; + int CC_id = 0; + int UE_id = -1; + eNB_MAC_INST *eNB = RC.mac[module_idP]; + UE_list_t *UE_list = &(eNB->UE_list); + COMMON_channels_t *cc = eNB->common_channels; + UE_sched_ctrl *UE_scheduling_control = NULL; - int CC_id, i = -1; - UE_list_t *UE_list = &RC.mac[module_idP]->UE_list; - rnti_t rnti; - - COMMON_channels_t *cc = RC.mac[module_idP]->common_channels; + start_meas(&(eNB->eNB_scheduler)); - start_meas(&RC.mac[module_idP]->eNB_scheduler); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME - (VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER, - VCD_FUNCTION_IN); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER, VCD_FUNCTION_IN); - RC.mac[module_idP]->frame = frameP; - RC.mac[module_idP]->subframe = subframeP; + eNB->frame = frameP; + eNB->subframe = subframeP; for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { mbsfn_status[CC_id] = 0; - // clear vrb_maps + /* Clear vrb_maps */ memset(cc[CC_id].vrb_map, 0, 100); memset(cc[CC_id].vrb_map_UL, 0, 100); - #if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0)) - cc[CC_id].mcch_active = 0; + cc[CC_id].mcch_active = 0; #endif clear_nfapi_information(RC.mac[module_idP], CC_id, frameP, subframeP); } - // refresh UE list based on UEs dropped by PHY in previous subframe - for (i = 0; i < MAX_MOBILES_PER_ENB; i++) { - if (UE_list->active[i]) { - rnti = UE_RNTI(module_idP, i); - CC_id = UE_PCCID(module_idP, i); - - if (((frameP&127) == 0) && (subframeP == 0)) { - LOG_I(MAC, - "UE rnti %x : %s, PHR %d dB DL CQI %d PUSCH SNR %d PUCCH SNR %d\n", - rnti, - UE_list->UE_sched_ctrl[i].ul_out_of_sync == - 0 ? "in synch" : "out of sync", - UE_list->UE_template[CC_id][i].phr_info, - UE_list->UE_sched_ctrl[i].dl_cqi[CC_id], - (5*UE_list->UE_sched_ctrl[i].pusch_snr[CC_id] - 640) / 10, - (5*UE_list->UE_sched_ctrl[i].pucch1_snr[CC_id] - 640) / 10); + /* Refresh UE list based on UEs dropped by PHY in previous subframe */ + for (UE_id = 0; UE_id < MAX_MOBILES_PER_ENB; UE_id++) { + if (UE_list->active[UE_id]) { + rnti = UE_RNTI(module_idP, UE_id); + CC_id = UE_PCCID(module_idP, UE_id); + + UE_scheduling_control = &(UE_list->UE_sched_ctrl[UE_id]); + + if (((frameP & 127) == 0) && (subframeP == 0)) { + LOG_I(MAC,"UE rnti %x : %s, PHR %d dB DL CQI %d PUSCH SNR %d PUCCH SNR %d\n", + rnti, + UE_scheduling_control->ul_out_of_sync == 0 ? "in synch" : "out of sync", + UE_list->UE_template[CC_id][UE_id].phr_info, + UE_scheduling_control->dl_cqi[CC_id], + (5 * UE_scheduling_control->pusch_snr[CC_id] - 640) / 10, + (5 * UE_scheduling_control->pucch1_snr[CC_id] - 640) / 10); } + + RC.eNB[module_idP][CC_id]->pusch_stats_bsr[UE_id][(frameP * 10) + subframeP] = -63; + + if (UE_id == UE_list->head) { + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_BSR, RC.eNB[module_idP][CC_id]->pusch_stats_bsr[UE_id][(frameP * 10) + subframeP]); + } + + /* Set and increment CDRX related timers */ + if (UE_scheduling_control->cdrx_configured == TRUE) { + boolean_t harq_active_time_condition = FALSE; + UE_TEMPLATE *UE_template = NULL; + + unsigned long active_time_condition = 0; // variable used only for tracing purpose + + /* (UL and DL) HARQ RTT timers and DRX retransmission timers */ + for (int harq_process_id = 0; harq_process_id < 8; harq_process_id++) { + /* DL asynchronous HARQ process */ + if (UE_scheduling_control->drx_retransmission_timer[harq_process_id] > 0) { + UE_scheduling_control->drx_retransmission_timer[harq_process_id]++; + + if (UE_scheduling_control->drx_retransmission_timer[harq_process_id] > UE_scheduling_control->drx_retransmission_timer_thres[harq_process_id]) { + UE_scheduling_control->drx_retransmission_timer[harq_process_id] = 0; + } + } + + if (UE_scheduling_control->harq_rtt_timer[CC_id][harq_process_id] > 0) { + UE_scheduling_control->harq_rtt_timer[CC_id][harq_process_id]++; + + if (UE_scheduling_control->harq_rtt_timer[CC_id][harq_process_id] > 8) { + /* Note: here drx_retransmission_timer is restarted instead of started in the specification */ + UE_scheduling_control->drx_retransmission_timer[harq_process_id] = 1; // started when HARQ RTT timer expires + UE_scheduling_control->harq_rtt_timer[CC_id][harq_process_id] = 0; + } + } + + /* UL synchronous HARQ process */ + if (UE_scheduling_control->ul_harq_rtt_timer[CC_id][harq_process_id] > 0) { + UE_scheduling_control->ul_harq_rtt_timer[CC_id][harq_process_id]++; + + if (UE_scheduling_control->ul_harq_rtt_timer[CC_id][harq_process_id] > 4) { + // drx_ULRetransmissionTimer should be started here + UE_scheduling_control->ul_harq_rtt_timer[CC_id][harq_process_id] = 0; + } + } + + if (UE_scheduling_control->ul_synchronous_harq_timer[CC_id][harq_process_id] > 0) { + UE_scheduling_control->ul_synchronous_harq_timer[CC_id][harq_process_id]++; + + if (UE_scheduling_control->ul_synchronous_harq_timer[CC_id][harq_process_id] > 5) { + harq_active_time_condition = TRUE; + UE_scheduling_control->ul_synchronous_harq_timer[CC_id][harq_process_id] = 0; + active_time_condition = 5; // for tracing purpose + } + } + } + + /* On duration timer */ + if (UE_scheduling_control->on_duration_timer > 0) { + UE_scheduling_control->on_duration_timer++; + + if (UE_scheduling_control->on_duration_timer > UE_scheduling_control->on_duration_timer_thres) { + UE_scheduling_control->on_duration_timer = 0; + } + } + + /* DRX inactivity timer */ + if (UE_scheduling_control->drx_inactivity_timer > 0) { + UE_scheduling_control->drx_inactivity_timer++; + + if (UE_scheduling_control->drx_inactivity_timer > (UE_scheduling_control->drx_inactivity_timer_thres + 1)) { + UE_scheduling_control->drx_inactivity_timer = 0; + + /* When timer expires switch into short or long DRX cycle */ + if (UE_scheduling_control->drx_shortCycle_timer_thres > 0) { + UE_scheduling_control->in_short_drx_cycle = TRUE; + UE_scheduling_control->drx_shortCycle_timer = 0; + UE_scheduling_control->in_long_drx_cycle = FALSE; + } else { + UE_scheduling_control->in_long_drx_cycle = TRUE; + } + } + } + + /* Short DRX Cycle */ + if (UE_scheduling_control->in_short_drx_cycle == TRUE) { + UE_scheduling_control->drx_shortCycle_timer++; + + /* When the Short DRX cycles are over */ + if (UE_scheduling_control->drx_shortCycle_timer > UE_scheduling_control->drx_shortCycle_timer_thres) { + UE_scheduling_control->drx_shortCycle_timer = 0; + UE_scheduling_control->in_short_drx_cycle = FALSE; + UE_scheduling_control->in_long_drx_cycle = TRUE; + UE_scheduling_control->drx_longCycle_timer = 0; + } + } else { + UE_scheduling_control->drx_shortCycle_timer = 0; + } + + /* Long DRX Cycle */ + if (UE_scheduling_control->in_long_drx_cycle == TRUE) { + UE_scheduling_control->drx_longCycle_timer++; + + if (UE_scheduling_control->drx_longCycle_timer > UE_scheduling_control->drx_longCycle_timer_thres) { + UE_scheduling_control->drx_longCycle_timer = 1; + } + } else { + UE_scheduling_control->drx_longCycle_timer = 0; + } + + /* Check for error case */ + if ((UE_scheduling_control->in_short_drx_cycle == TRUE) && (UE_scheduling_control->in_long_drx_cycle == TRUE)) { + LOG_E(MAC, "Error in C-DRX: UE id %d is in both short and long DRX cycle. Should not happen. Back it to long cycle only\n", UE_id); + UE_scheduling_control->in_short_drx_cycle = FALSE; + } + + /* Condition to start On Duration Timer */ + if (UE_scheduling_control->in_short_drx_cycle == TRUE && UE_scheduling_control->on_duration_timer == 0) { + if (((frameP * 10) + subframeP) % (UE_scheduling_control->short_drx_cycle_duration) == + (UE_scheduling_control->drx_start_offset) % (UE_scheduling_control->short_drx_cycle_duration)) { + + UE_scheduling_control->on_duration_timer = 1; + } + } else if (UE_scheduling_control->in_long_drx_cycle == TRUE && UE_scheduling_control->on_duration_timer == 0) { + if (((frameP * 10) + subframeP) % (UE_scheduling_control->drx_longCycle_timer_thres) == + (UE_scheduling_control->drx_start_offset)) { + + UE_scheduling_control->on_duration_timer = 1; + } + } + + /* Update Active Time status of UE + * Based on 36.321 5.7 the differents conditions for the UE to be in Acttive Should be check ONLY + * here for the current subframe. The variable 'UE_scheduling_control->in_active_time' should be updated + * ONLY here. The variable can then be used for testing the actual state of the UE for scheduling purpose. + */ + UE_template = &(UE_list->UE_template[CC_id][UE_id]); + /* (a)synchronous HARQ Processes handling for Active Time */ + for (int harq_process_id = 0; harq_process_id < 8; harq_process_id++) { + if (UE_scheduling_control->drx_retransmission_timer[harq_process_id] > 0) { + harq_active_time_condition = TRUE; + active_time_condition = 2; + break; + } + } + + if (UE_scheduling_control->on_duration_timer > 0 || + UE_scheduling_control->drx_inactivity_timer > 1 || + harq_active_time_condition || + UE_template->ul_SR > 0) { + + UE_scheduling_control->in_active_time = TRUE; + } else { + UE_scheduling_control->in_active_time = FALSE; + } + + /* BEGIN VCD */ + if (UE_id == 0) { + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_ON_DURATION_TIMER, (unsigned long) UE_scheduling_control->on_duration_timer); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DRX_INACTIVITY, (unsigned long) UE_scheduling_control->drx_inactivity_timer); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DRX_SHORT_CYCLE, (unsigned long) UE_scheduling_control->drx_shortCycle_timer); + //VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_SHORT_DRX_CYCLE_NUMBER, (unsigned long) UE_scheduling_control->short_drx_cycle); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DRX_LONG_CYCLE, (unsigned long) UE_scheduling_control->drx_longCycle_timer); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DRX_RETRANSMISSION_HARQ0, (unsigned long) UE_scheduling_control->drx_retransmission_timer[0]); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DRX_ACTIVE_TIME, (unsigned long) UE_scheduling_control->in_active_time); + + if (UE_template->ul_SR > 0) { + active_time_condition = 1; + } else if ((UE_scheduling_control->on_duration_timer > 0) && (active_time_condition == 0)) { + active_time_condition = 3; + } else if ((UE_scheduling_control->drx_inactivity_timer > 0) && (active_time_condition == 0)) { + active_time_condition = 4; + } + + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DRX_ACTIVE_TIME_CONDITION, (unsigned long) active_time_condition); + } + /* END VCD */ + } else { // end if CDRX is configured + /* HARQ RTT timers */ + for (int harq_process_id = 0; harq_process_id < 8; harq_process_id++) { + if (UE_scheduling_control->harq_rtt_timer[CC_id][harq_process_id] > 0) { + UE_scheduling_control->harq_rtt_timer[CC_id][harq_process_id]++; + + if (UE_scheduling_control->harq_rtt_timer[CC_id][harq_process_id] > 8) { + UE_scheduling_control->harq_rtt_timer[CC_id][harq_process_id] = 0; + } + } + + if (UE_scheduling_control->ul_harq_rtt_timer[CC_id][harq_process_id] > 0) { + UE_scheduling_control->ul_harq_rtt_timer[CC_id][harq_process_id]++; + + if (UE_scheduling_control->ul_harq_rtt_timer[CC_id][harq_process_id] > 4) { + UE_scheduling_control->ul_harq_rtt_timer[CC_id][harq_process_id] = 0; + } + } + } // end loop harq process + } // end else CDRX not configured + + /* Increment these timers, they are cleared when we receive an sdu */ + UE_scheduling_control->ul_inactivity_timer++; + UE_scheduling_control->cqi_req_timer++; - RC.eNB[module_idP][CC_id]->pusch_stats_bsr[i][(frameP * 10) + - subframeP] = -63; - if (i == UE_list->head) - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME - (VCD_SIGNAL_DUMPER_VARIABLES_UE0_BSR, - RC.eNB[module_idP][CC_id]-> - pusch_stats_bsr[i][(frameP * 10) + subframeP]); - // increment this, it is cleared when we receive an sdu - RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].ul_inactivity_timer++; - - RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].cqi_req_timer++; - LOG_D(MAC, "UE %d/%x : ul_inactivity %d, cqi_req %d\n", i, rnti, - RC.mac[module_idP]->UE_list.UE_sched_ctrl[i]. - ul_inactivity_timer, - RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].cqi_req_timer); - check_ul_failure(module_idP, CC_id, i, frameP, subframeP); - - if (RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].ue_reestablishment_reject_timer > 0) { - RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].ue_reestablishment_reject_timer++; - if(RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].ue_reestablishment_reject_timer >= - RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].ue_reestablishment_reject_timer_thres) { - RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].ue_reestablishment_reject_timer = 0; - //clear reestablish_rnti_map - if(RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].ue_reestablishment_reject_timer_thres >20){ - for (int ue_id_l = 0; ue_id_l < MAX_MOBILES_PER_ENB; ue_id_l++) { - if (reestablish_rnti_map[ue_id_l][0] == rnti) { - // clear currentC-RNTI from map - reestablish_rnti_map[ue_id_l][0] = 0; - reestablish_rnti_map[ue_id_l][1] = 0; - break; - } - } + LOG_D(MAC, "UE %d/%x : ul_inactivity %d, cqi_req %d\n", + UE_id, + rnti, + UE_scheduling_control->ul_inactivity_timer, + UE_scheduling_control->cqi_req_timer); + + check_ul_failure(module_idP, CC_id, UE_id, frameP, subframeP); + + if (UE_scheduling_control->ue_reestablishment_reject_timer > 0) { + UE_scheduling_control->ue_reestablishment_reject_timer++; + + if (UE_scheduling_control->ue_reestablishment_reject_timer >= UE_scheduling_control->ue_reestablishment_reject_timer_thres) { + UE_scheduling_control->ue_reestablishment_reject_timer = 0; + + /* Clear reestablish_rnti_map */ + if (UE_scheduling_control->ue_reestablishment_reject_timer_thres > 20) { + for (int ue_id_l = 0; ue_id_l < MAX_MOBILES_PER_ENB; ue_id_l++) { + if (reestablish_rnti_map[ue_id_l][0] == rnti) { + /* Clear currentC-RNTI from map */ + reestablish_rnti_map[ue_id_l][0] = 0; + reestablish_rnti_map[ue_id_l][1] = 0; + break; + } + } PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_YES, rnti, 0, 0,module_idP); rrc_rlc_remove_ue(&ctxt); pdcp_remove_UE(&ctxt); } - // Note: This should not be done in the MAC! - for (int ii=0; ii<MAX_MOBILES_PER_ENB; ii++) { - LTE_eNB_ULSCH_t *ulsch = RC.eNB[module_idP][CC_id]->ulsch[ii]; - if((ulsch != NULL) && (ulsch->rnti == rnti)){ + + /* Note: This should not be done in the MAC! */ + for (int ii=0; ii<MAX_MOBILES_PER_ENB; ii++) { + LTE_eNB_ULSCH_t *ulsch = RC.eNB[module_idP][CC_id]->ulsch[ii]; + + if((ulsch != NULL) && (ulsch->rnti == rnti)) { void clean_eNb_ulsch(LTE_eNB_ULSCH_t *ulsch); - LOG_I(MAC, "clean_eNb_ulsch UE %x \n", rnti); - clean_eNb_ulsch(ulsch); - } - } - for (int ii=0; ii<MAX_MOBILES_PER_ENB; ii++) { - LTE_eNB_DLSCH_t *dlsch = RC.eNB[module_idP][CC_id]->dlsch[ii][0]; - if((dlsch != NULL) && (dlsch->rnti == rnti)){ + + LOG_I(MAC, "clean_eNb_ulsch UE %x \n", rnti); + + clean_eNb_ulsch(ulsch); + } + } + + for (int ii=0; ii<MAX_MOBILES_PER_ENB; ii++) { + LTE_eNB_DLSCH_t *dlsch = RC.eNB[module_idP][CC_id]->dlsch[ii][0]; + + if((dlsch != NULL) && (dlsch->rnti == rnti)) { void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch); - LOG_I(MAC, "clean_eNb_dlsch UE %x \n", rnti); - clean_eNb_dlsch(dlsch); - } - } - - for(int j = 0; j < 10; j++){ - nfapi_ul_config_request_body_t *ul_req_tmp = NULL; - ul_req_tmp = &RC.mac[module_idP]->UL_req_tmp[CC_id][j].ul_config_request_body; - if(ul_req_tmp){ - int pdu_number = ul_req_tmp->number_of_pdus; - for(int pdu_index = pdu_number-1; pdu_index >= 0; pdu_index--){ - if(ul_req_tmp->ul_config_pdu_list[pdu_index].ulsch_pdu.ulsch_pdu_rel8.rnti == rnti){ - LOG_I(MAC, "remove UE %x from ul_config_pdu_list %d/%d\n", rnti, pdu_index, pdu_number); - if(pdu_index < pdu_number -1){ - memcpy(&ul_req_tmp->ul_config_pdu_list[pdu_index], &ul_req_tmp->ul_config_pdu_list[pdu_index+1], (pdu_number-1-pdu_index) * sizeof(nfapi_ul_config_request_pdu_t)); - } - ul_req_tmp->number_of_pdus--; - } - } - } - } - rrc_mac_remove_ue(module_idP,rnti); - } - } - } - } + + LOG_I(MAC, "clean_eNb_dlsch UE %x \n", rnti); + + clean_eNb_dlsch(dlsch); + } + } + + for (int j = 0; j < 10; j++) { + nfapi_ul_config_request_body_t *ul_req_tmp = NULL; + ul_req_tmp = &(eNB->UL_req_tmp[CC_id][j].ul_config_request_body); + + if (ul_req_tmp) { + int pdu_number = ul_req_tmp->number_of_pdus; + + for (int pdu_index = pdu_number-1; pdu_index >= 0; pdu_index--) { + if (ul_req_tmp->ul_config_pdu_list[pdu_index].ulsch_pdu.ulsch_pdu_rel8.rnti == rnti) { + LOG_I(MAC, "remove UE %x from ul_config_pdu_list %d/%d\n", + rnti, + pdu_index, + pdu_number); + + if (pdu_index < pdu_number -1) { + memcpy(&ul_req_tmp->ul_config_pdu_list[pdu_index], + &ul_req_tmp->ul_config_pdu_list[pdu_index+1], + (pdu_number-1-pdu_index) * sizeof(nfapi_ul_config_request_pdu_t)); + } + + ul_req_tmp->number_of_pdus--; + } + } // end for pdu_index + } // end if (ul_req_tmp) + } // end for j + + rrc_mac_remove_ue(module_idP,rnti); + + } // end if (UE_scheduling_control->ue_reestablishment_reject_timer >= UE_scheduling_control->ue_reestablishment_reject_timer_thres) + } // end if (UE_scheduling_control->ue_reestablishment_reject_timer > 0) + } // end if UE active + } // end for loop on UE_id #if (!defined(PRE_SCD_THREAD)) - PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_YES, - NOT_A_RNTI, frameP, subframeP, - module_idP); - pdcp_run(&ctxt); + PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_YES, NOT_A_RNTI, frameP, subframeP, module_idP); + pdcp_run(&ctxt); rrc_rx_tx(&ctxt, CC_id); + #endif #if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0)) @@ -641,76 +923,83 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP, frame_t frameP, #endif - static int debug_flag=0; - void (*schedule_ulsch_p)(module_id_t module_idP, frame_t frameP, sub_frame_t subframe)=NULL; - void (*schedule_ue_spec_p)(module_id_t module_idP, frame_t frameP, sub_frame_t subframe, int *mbsfn_flag)=NULL; - if(RC.mac[module_idP]->scheduler_mode == SCHED_MODE_DEFAULT){ + static int debug_flag = 0; + void (*schedule_ulsch_p)(module_id_t module_idP, frame_t frameP, sub_frame_t subframe) = NULL; + void (*schedule_ue_spec_p)(module_id_t module_idP, frame_t frameP, sub_frame_t subframe, int *mbsfn_flag) = NULL; + + if (eNB->scheduler_mode == SCHED_MODE_DEFAULT) { schedule_ulsch_p = schedule_ulsch; schedule_ue_spec_p = schedule_dlsch; - }else if(RC.mac[module_idP]->scheduler_mode == SCHED_MODE_FAIR_RR){ + } else if (eNB->scheduler_mode == SCHED_MODE_FAIR_RR) { memset(dlsch_ue_select, 0, sizeof(dlsch_ue_select)); schedule_ulsch_p = schedule_ulsch_fairRR; schedule_ue_spec_p = schedule_ue_spec_fairRR; } - if(debug_flag==0){ - LOG_E(MAC,"SCHED_MODE=%d\n",RC.mac[module_idP]->scheduler_mode); - debug_flag=1; + + if(debug_flag == 0){ + LOG_E(MAC,"SCHED_MODE = %d\n", eNB->scheduler_mode); + debug_flag = 1; } - // This schedules MIB + /* This schedules MIB */ if ((subframeP == 0) && (frameP & 3) == 0) - schedule_mib(module_idP, frameP, subframeP); - if (get_softmodem_params()->phy_test == 0){ - // This schedules SI for legacy LTE and eMTC starting in subframeP + schedule_mib(module_idP, frameP, subframeP); + + if (get_softmodem_params()->phy_test == 0) { + /* This schedules SI for legacy LTE and eMTC starting in subframeP */ schedule_SI(module_idP, frameP, subframeP); - // This schedules Paging in subframeP + /* This schedules Paging in subframeP */ schedule_PCH(module_idP,frameP,subframeP); - // This schedules Random-Access for legacy LTE and eMTC starting in subframeP + /* This schedules Random-Access for legacy LTE and eMTC starting in subframeP */ schedule_RA(module_idP, frameP, subframeP); - // copy previously scheduled UL resources (ULSCH + HARQ) + /* Copy previously scheduled UL resources (ULSCH + HARQ) */ copy_ulreq(module_idP, frameP, subframeP); - // This schedules SRS in subframeP + /* This schedules SRS in subframeP */ schedule_SRS(module_idP, frameP, subframeP); - // This schedules ULSCH in subframeP (dci0) + + /* This schedules ULSCH in subframeP (dci0) */ if (schedule_ulsch_p != NULL) { - schedule_ulsch_p(module_idP, frameP, subframeP); + schedule_ulsch_p(module_idP, frameP, subframeP); } else { - LOG_E(MAC," %s %d: schedule_ulsch_p is NULL, function not called\n",__FILE__,__LINE__); + LOG_E(MAC," %s %d: schedule_ulsch_p is NULL, function not called\n", + __FILE__, + __LINE__); } - // This schedules UCI_SR in subframeP + + /* This schedules UCI_SR in subframeP */ schedule_SR(module_idP, frameP, subframeP); - // This schedules UCI_CSI in subframeP + /* This schedules UCI_CSI in subframeP */ schedule_CSI(module_idP, frameP, subframeP); #if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) - // This schedules DLSCH in subframeP + /* This schedules DLSCH in subframeP for BR UE*/ schedule_ue_spec_br(module_idP, frameP, subframeP); #endif - // This schedules DLSCH in subframeP + /* This schedules DLSCH in subframeP */ if (schedule_ue_spec_p != NULL) { - schedule_ue_spec_p(module_idP, frameP, subframeP, mbsfn_status); + schedule_ue_spec_p(module_idP, frameP, subframeP, mbsfn_status); } else { - LOG_E(MAC," %s %d: schedule_ue_spec_p is NULL, function not called\n",__FILE__,__LINE__); + LOG_E(MAC," %s %d: schedule_ue_spec_p is NULL, function not called\n", + __FILE__, + __LINE__); } - } - else{ + } else { schedule_ulsch_phy_test(module_idP,frameP,subframeP); schedule_ue_spec_phy_test(module_idP,frameP,subframeP,mbsfn_status); } // Allocate CCEs for good after scheduling is done for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { - if(cc[CC_id].tdd_Config == NULL || !(is_UL_sf(&cc[CC_id],subframeP))) + if (cc[CC_id].tdd_Config == NULL || !(is_UL_sf(&cc[CC_id],subframeP))) { allocate_CCEs(module_idP, CC_id, frameP, subframeP, 2); + } } if (flexran_agent_get_mac_xface(module_idP) && subframeP == 9) { flexran_agent_slice_update(module_idP); } - stop_meas(&RC.mac[module_idP]->eNB_scheduler); + stop_meas(&(eNB->eNB_scheduler)); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME - (VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER, - VCD_FUNCTION_OUT); -} + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER, VCD_FUNCTION_OUT); +} \ No newline at end of file diff --git a/openair2/LAYER2/MAC/eNB_scheduler_RA.c b/openair2/LAYER2/MAC/eNB_scheduler_RA.c index 79d791c558..25e412e8df 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_RA.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_RA.c @@ -353,6 +353,9 @@ void generate_Msg2(module_id_t module_idP, AssertFatal (cc[CC_idP].sib1_v13ext->bandwidthReducedAccessRelatedInfo_r13 != NULL, "cc[CC_idP].sib1_v13ext->bandwidthReducedAccessRelatedInfo_r13 is null\n"); dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.start_symbol = cc[CC_idP].sib1_v13ext->bandwidthReducedAccessRelatedInfo_r13->startSymbolBR_r13; + + LOG_E(MAC, "start_symbol = %d \n", dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.start_symbol); + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.ecce_index = 0; // Note: this should be dynamic dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.aggregation_level = 24; // OK for CEModeA r1-3 (9.1.5-1b) or CEModeB r1-4 dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.rnti_type = 2; // RA-RNTI diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c index 274b169bf6..59d4b3f157 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c @@ -477,7 +477,7 @@ schedule_ue_spec(module_id_t module_idP, int TBS, j, padding = 0, post_padding = 0; rnti_t rnti; unsigned char dlsch_buffer[MAX_DLSCH_PAYLOAD_BYTES]; - int round = 0; + int round_DL = 0; int harq_pid = 0; uint16_t release_num; uint8_t ra_ii; @@ -636,12 +636,15 @@ schedule_ue_spec(module_id_t module_idP, LOG_D(MAC, "doing schedule_ue_spec for CC_id %d UE %d\n", CC_id, UE_id); + continue_flag = 0; // reset the flag to allow allocation for the remaining UEs rnti = UE_RNTI(module_idP, UE_id); ue_sched_ctrl = &UE_list->UE_sched_ctrl[UE_id]; ue_template = &UE_list->UE_template[CC_id][UE_id]; - if (ue_template->rach_resource_type > 0) continue_flag = 1; + if (ue_template->rach_resource_type > 0) { + continue_flag = 1; + } if (&(UE_list->eNB_UE_stats[CC_id][UE_id]) == NULL) { LOG_D(MAC, "[eNB] Cannot find eNB_UE_stats\n"); @@ -722,11 +725,11 @@ schedule_ue_spec(module_id_t module_idP, harq_pid = frame_subframe2_dl_harq_pid(cc->tdd_Config, frameP, subframeP); - round = ue_sched_ctrl->round[CC_id][harq_pid]; + round_DL = ue_sched_ctrl->round[CC_id][harq_pid]; eNB_UE_stats->crnti = rnti; eNB_UE_stats->rrc_status = mac_eNB_get_rrc_status(module_idP, rnti); eNB_UE_stats->harq_pid = harq_pid; - eNB_UE_stats->harq_round = round; + eNB_UE_stats->harq_round = round_DL; if (eNB_UE_stats->rrc_status < RRC_CONNECTED) { LOG_D(MAC, "UE %d is not in RRC_CONNECTED\n", @@ -760,24 +763,55 @@ schedule_ue_spec(module_id_t module_idP, LOG_D(MAC, "[eNB %d] Frame %d: Scheduling UE %d on CC_id %d (rnti %x, harq_pid %d, round %d, rb %d, cqi %d, mcs %d, rrc %d)\n", module_idP, - frameP, UE_id, + frameP, + UE_id, CC_id, rnti, harq_pid, - round, + round_DL, nb_available_rb, ue_sched_ctrl->dl_cqi[CC_id], eNB_UE_stats->dlsch_mcs1, eNB_UE_stats->rrc_status); - /* process retransmission */ - if (round != 8) { + /* Process retransmission */ + if (round_DL != 8) { + //if (round_DL > 0) { // get freq_allocation nb_rb = ue_template->nb_rb[harq_pid]; TBS = get_TBS_DL(ue_template->oldmcs1[harq_pid], nb_rb); if (nb_rb <= nb_available_rb) { + /* CDRX */ + ue_sched_ctrl->harq_rtt_timer[CC_id][harq_pid] = 1; // restart HARQ RTT timer + /* + LOG_W(MAC, "HELLO : round!=8 UE_id = %d, frame = %d; subframe = %d; CC_id %d, harq_pid = %d , RTT_timer = %d,%d,%d,%d,%d,%d,%d,%d\n", + UE_id, + frameP, + subframeP, + CC_id, + harq_pid, + ue_sched_ctrl->harq_rtt_timer[CC_id][0], + ue_sched_ctrl->harq_rtt_timer[CC_id][1], + ue_sched_ctrl->harq_rtt_timer[CC_id][2], + ue_sched_ctrl->harq_rtt_timer[CC_id][3], + ue_sched_ctrl->harq_rtt_timer[CC_id][4], + ue_sched_ctrl->harq_rtt_timer[CC_id][5], + ue_sched_ctrl->harq_rtt_timer[CC_id][6], + ue_sched_ctrl->harq_rtt_timer[CC_id][7]); + */ + + if (ue_sched_ctrl->cdrx_configured) { + ue_sched_ctrl->drx_retransmission_timer[harq_pid] = 0; // stop drx retransmission + /* May be a problem with drx_retransmission_timer[harq_pid]. Here the timer is reset not stop. + * Can create a problem with several CC_id with the same UE?? + */ + if (harq_pid == 0) { + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DRX_RETRANSMISSION_HARQ0, (unsigned long) ue_sched_ctrl->drx_retransmission_timer[0]); + } + } + if (cc[CC_id].tdd_Config != NULL) { ue_template->DAI++; update_ul_dci(module_idP, @@ -852,7 +886,7 @@ schedule_ue_spec(module_id_t module_idP, dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tpc = 1; // Don't adjust power when retransmitting dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.new_data_indicator_1 = ue_template->oldNDI[harq_pid]; dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.mcs_1 = ue_template->oldmcs1[harq_pid]; - dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.redundancy_version_1 = round & 3; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.redundancy_version_1 = round_DL & 3; // TDD if (cc[CC_id].tdd_Config != NULL) { @@ -861,7 +895,7 @@ schedule_ue_spec(module_id_t module_idP, module_idP, CC_id, harq_pid, - round, + round_DL, ue_template->DAI - 1, ue_template->oldmcs1[harq_pid]); } else { @@ -869,7 +903,7 @@ schedule_ue_spec(module_id_t module_idP, module_idP, CC_id, harq_pid, - round, + round_DL, ue_template->oldmcs1[harq_pid]); } @@ -893,7 +927,7 @@ schedule_ue_spec(module_id_t module_idP, 0, // virtual_resource_block_assignment_flag, unused here 0, // resource_block_coding, to be filled in later getQm(ue_template->oldmcs1[harq_pid]), - round & 3, // redundancy version + round_DL & 3, // redundancy version 1, // transport blocks 0, // transport block to codeword swap flag cc[CC_id].p_eNB == 1 ? 0 : 1, // transmission_scheme @@ -911,7 +945,7 @@ schedule_ue_spec(module_id_t module_idP, LOG_D(MAC, "Filled NFAPI configuration for DCI/DLSCH %d, retransmission round %d\n", eNB->pdu_index[CC_id], - round); + round_DL); program_dlsch_acknak(module_idP, CC_id, UE_id, @@ -946,7 +980,8 @@ schedule_ue_spec(module_id_t module_idP, CC_id, UE_id); } - } else { /* This is a potentially new SDU opportunity */ + } else { + /* This is a potentially new SDU opportunity */ rlc_status.bytes_in_buffer = 0; // Now check RLC information to compute number of required RBs // get maximum TBS size for RLC request @@ -1265,7 +1300,7 @@ schedule_ue_spec(module_id_t module_idP, } } - /* last header does not have length field */ + /* Last header does not have length field */ if (header_length_total) { header_length_total -= header_length_last; header_length_total++; @@ -1569,6 +1604,38 @@ schedule_ue_spec(module_id_t module_idP, dl_req->tl.tag = NFAPI_DL_CONFIG_REQUEST_BODY_TAG; eNB->DL_req[CC_id].sfn_sf = frameP << 4 | subframeP; eNB->DL_req[CC_id].header.message_id = NFAPI_DL_CONFIG_REQUEST; + + /* CDRX */ + ue_sched_ctrl->harq_rtt_timer[CC_id][harq_pid] = 1; // restart HARQ RTT timer + /* + LOG_W(MAC, "HELLO : round=8, UE_id = %d, frame = %d; subframe = %d ; CC_id %d, harq_pid = %d , RTT_timer = %d,%d,%d,%d,%d,%d,%d,%d\n", + UE_id, + frameP, + subframeP, + CC_id, + harq_pid, + ue_sched_ctrl->harq_rtt_timer[CC_id][0], + ue_sched_ctrl->harq_rtt_timer[CC_id][1], + ue_sched_ctrl->harq_rtt_timer[CC_id][2], + ue_sched_ctrl->harq_rtt_timer[CC_id][3], + ue_sched_ctrl->harq_rtt_timer[CC_id][4], + ue_sched_ctrl->harq_rtt_timer[CC_id][5], + ue_sched_ctrl->harq_rtt_timer[CC_id][6], + ue_sched_ctrl->harq_rtt_timer[CC_id][7]); + */ + + if (ue_sched_ctrl->cdrx_configured) { + ue_sched_ctrl->drx_inactivity_timer = 1; // restart drx inactivity timer when new transmission + ue_sched_ctrl->drx_retransmission_timer[harq_pid] = 0; // stop drx retransmission + /* May be a problem with drx_retransmission_timer[harq_pid]. Here the timer is reset not stop. + * Can create a problem with several CC_id with the same UE?? + */ + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DRX_INACTIVITY, (unsigned long) ue_sched_ctrl->drx_inactivity_timer); + if (harq_pid == 0) { + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DRX_RETRANSMISSION_HARQ0, (unsigned long) ue_sched_ctrl->drx_retransmission_timer[0]); + } + } + // Toggle NDI for next time LOG_D(MAC, "CC_id %d Frame %d, subframeP %d: Toggling Format1 NDI for UE %d (rnti %x/%d) oldNDI %d\n", CC_id, @@ -1983,6 +2050,13 @@ schedule_ue_spec_br(module_id_t module_idP, continue; } + /* CDRX LTE-M */ + if (ue_sched_ctl->cdrx_configured == TRUE) { + if ((ue_sched_ctl->bypass_cdrx == FALSE) && (ue_sched_ctl->in_active_time == FALSE)) { + continue; + } + } + round_DL = ue_sched_ctl->round[CC_id][harq_pid]; AssertFatal (UE_template->physicalConfigDedicated != NULL, "UE_template->physicalConfigDedicated is null\n"); diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c index 1488209dd7..26fcf8ec0f 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c @@ -343,9 +343,10 @@ subframe2harqpid(COMMON_channels_t *cc, sub_frame_t subframe) //------------------------------------------------------------------------------ { - uint8_t ret = 255; AssertFatal(cc != NULL, "cc is null\n"); + uint8_t ret = 255; + if (cc->tdd_Config == NULL) { // FDD ret = (((frame << 1) + subframe) & 7); } else { @@ -582,39 +583,27 @@ is_UL_sf(COMMON_channels_t *ccP, break; case 3: - if ((subframeP <= 1) || (subframeP >= 5)) - return (0); - else if ((subframeP > 1) && (subframeP < 5)) - return (1); - else - AssertFatal(1 == 0, "Unknown subframe number\n"); + if (subframeP <= 1 || subframeP >= 5) + return 0; - break; + return 1; case 4: - if ((subframeP <= 1) || (subframeP >= 4)) - return (0); - else if ((subframeP > 1) && (subframeP < 4)) - return (1); - else - AssertFatal(1 == 0, "Unknown subframe number\n"); + if (subframeP <= 1 || subframeP >= 4) + return 0; - break; + return 1; case 5: - if ((subframeP <= 1) || (subframeP >= 3)) - return (0); - else if ((subframeP > 1) && (subframeP < 3)) - return (1); - else - AssertFatal(1 == 0, "Unknown subframe number\n"); + if (subframeP <= 1 || subframeP >= 3) + return 0; - break; + return 1; default: - AssertFatal(1 == 0, - "subframe %d Unsupported TDD configuration %d\n", - subframeP, (int) ccP->tdd_Config->subframeAssignment); + AssertFatal(1 == 0, "subframe %d Unsupported TDD configuration %d\n", + subframeP, + (int) ccP->tdd_Config->subframeAssignment); break; } return 0; @@ -841,6 +830,10 @@ get_srs_pos(COMMON_channels_t *cc, } //------------------------------------------------------------------------------ +/* +* Get some CSI (CQI/PMI/RI) parameters for SFN and subframe number calculation +* with periodic report. +*/ void get_csi_params(COMMON_channels_t *cc, struct LTE_CQI_ReportPeriodic *cqi_ReportPeriodic, @@ -877,19 +870,22 @@ get_csi_params(COMMON_channels_t *cc, *Npd = 160; *N_OFFSET_CQI = cqi_PMI_ConfigIndex - 157; } else if (cqi_PMI_ConfigIndex > 317) { - if (cqi_PMI_ConfigIndex <= 349) { // 32 ms CQI_PMI period - *Npd = 32; - *N_OFFSET_CQI = cqi_PMI_ConfigIndex - 318; - } else if (cqi_PMI_ConfigIndex <= 413) { // 64 ms CQI_PMI period - *Npd = 64; - *N_OFFSET_CQI = cqi_PMI_ConfigIndex - 350; - } else if (cqi_PMI_ConfigIndex <= 541) { // 128 ms CQI_PMI period - *Npd = 128; - *N_OFFSET_CQI = cqi_PMI_ConfigIndex - 414; + + if (cqi_PMI_ConfigIndex <= 349) { // 32 ms CQI_PMI period + *Npd = 32; + *N_OFFSET_CQI = cqi_PMI_ConfigIndex - 318; + } else if (cqi_PMI_ConfigIndex <= 413) { // 64 ms CQI_PMI period + *Npd = 64; + *N_OFFSET_CQI = cqi_PMI_ConfigIndex - 350; + } else if (cqi_PMI_ConfigIndex <= 541) { // 128 ms CQI_PMI period + *Npd = 128; + *N_OFFSET_CQI = cqi_PMI_ConfigIndex - 414; } + } - } else { // TDD - if (cqi_PMI_ConfigIndex == 0) { // all UL subframes + + } else { // TDD + if (cqi_PMI_ConfigIndex == 0) { // all UL subframes *Npd = 1; *N_OFFSET_CQI = 0; } else if (cqi_PMI_ConfigIndex <= 6) { // 5 ms CQI_PMI period @@ -1114,7 +1110,7 @@ fill_nfapi_dl_dci_1A(nfapi_dl_config_request_pdu_t *dl_config_pdu, uint8_t vrb_flag) //------------------------------------------------------------------------------ { - memset((void *) dl_config_pdu, 0,sizeof(nfapi_dl_config_request_pdu_t)); + memset((void *) dl_config_pdu, 0, sizeof(nfapi_dl_config_request_pdu_t)); dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE; dl_config_pdu->pdu_size = (uint8_t) (2 + sizeof(nfapi_dl_config_dci_dl_pdu)); @@ -1395,7 +1391,6 @@ fill_nfapi_ulsch_harq_information(module_id_t module_ else harq_information_rel10->harq_size = 1; } - break; default: // for any other TM we need 2 bits harq @@ -1410,7 +1405,6 @@ fill_nfapi_ulsch_harq_information(module_id_t module_ else harq_information_rel10->harq_size = 2; } - break; } // get Tmode return; @@ -1459,10 +1453,8 @@ fill_nfapi_harq_information(module_id_t module_idP, eNB_MAC_INST *eNB = RC.mac[module_idP]; COMMON_channels_t *cc = &eNB->common_channels[CC_idP]; UE_list_t *UE_list = &eNB->UE_list; - int UE_id = find_UE_id(module_idP, rntiP); - AssertFatal(UE_id >= 0, "UE_id cannot be found, impossible\n"); AssertFatal(UE_list != NULL, "UE_list is null\n"); harq_information->harq_information_rel11.tl.tag = NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL11_TAG; @@ -1554,7 +1546,7 @@ fill_nfapi_uci_acknak(module_id_t module_idP, ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE; ul_config_pdu->pdu_size = (uint8_t) (2 + sizeof(nfapi_ul_config_uci_harq_pdu)); ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG; - ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.handle = 0; // don't know how to use this + ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.handle = 0; // don't know how to use this ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.rnti = rntiP; fill_nfapi_harq_information(module_idP, @@ -1575,6 +1567,7 @@ fill_nfapi_uci_acknak(module_id_t module_idP, ul_req_body->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG; ul_req->header.message_id = NFAPI_UL_CONFIG_REQUEST; ul_req->sfn_sf = (ackNAK_absSF/10) << 4 | ackNAK_absSF%10; + return (((ackNAK_absSF / 10) << 4) + (ackNAK_absSF % 10)); } @@ -1654,7 +1647,6 @@ fill_nfapi_tx_req(nfapi_tx_request_body_t *tx_req_body, LOG_D(MAC, "Filling TX_req %d for pdu length %d\n", tx_req_body->number_of_pdus, pdu_length); - TX_req->pdu_length = pdu_length; TX_req->pdu_index = pdu_index; TX_req->num_segments = 1; @@ -1687,6 +1679,7 @@ fill_nfapi_ulsch_config_request_rel8(nfapi_ul_config_request_pdu_t *ul_config_pd uint8_t current_tx_nb, uint8_t n_srs, uint16_t size) +//------------------------------------------------------------------------------ { uint8_t ri_size = 0; @@ -2081,22 +2074,23 @@ get_aggregation(uint8_t bw_index, } //------------------------------------------------------------------------------ +/* + * Dump the UL or DL UE_list into LOG_T(MAC) + */ void dump_ue_list(UE_list_t *listP, int ul_flag) //------------------------------------------------------------------------------ { - int j; - if (ul_flag == 0) { - for (j = listP->head; j >= 0; j = listP->next[j]) { - LOG_T(MAC, "node %d => %d\n", + for (int j = listP->head; j >= 0; j = listP->next[j]) { + LOG_T(MAC, "DL list node %d => %d\n", j, listP->next[j]); } } else { - for (j = listP->head_ul; j >= 0; j = listP->next_ul[j]) { - LOG_T(MAC, "node %d => %d\n", + for (int j = listP->head_ul; j >= 0; j = listP->next_ul[j]) { + LOG_T(MAC, "UL list node %d => %d\n", j, listP->next_ul[j]); } @@ -2192,17 +2186,18 @@ add_new_ue(module_id_t mod_idP, } //------------------------------------------------------------------------------ +/* + * Remove MAC context of UE + */ int rrc_mac_remove_ue(module_id_t mod_idP, rnti_t rntiP) //------------------------------------------------------------------------------ { - int j; UE_list_t *UE_list = &RC.mac[mod_idP]->UE_list; - int UE_id = find_UE_id(mod_idP, - rntiP); - int pCC_id; - eNB_UE_STATS *ue_stats; + int UE_id = find_UE_id(mod_idP, rntiP); + eNB_UE_STATS *ue_stats = NULL; + int pCC_id = -1; if (UE_id == -1) { LOG_W(MAC,"rrc_mac_remove_ue: UE %x not found\n", @@ -2210,38 +2205,42 @@ rrc_mac_remove_ue(module_id_t mod_idP, return 0; } - pCC_id = UE_PCCID(mod_idP, - UE_id); + pCC_id = UE_PCCID(mod_idP, UE_id); + LOG_I(MAC,"Removing UE %d from Primary CC_id %d (rnti %x)\n", UE_id, pCC_id, rntiP); - dump_ue_list(UE_list, - 0); + + dump_ue_list(UE_list, 0); // DL list displayed in LOG_T(MAC) + UE_list->active[UE_id] = FALSE; UE_list->num_UEs--; - if (UE_list->head == UE_id) UE_list->head = UE_list->next[UE_id]; - else UE_list->next[prev(UE_list, - UE_id, - 0)] = UE_list->next[UE_id]; - - if (UE_list->head_ul == UE_id) UE_list->head_ul = UE_list->next_ul[UE_id]; - else UE_list->next_ul[prev(UE_list, - UE_id, - 0)] = UE_list->next_ul[UE_id]; - - // clear all remaining pending transmissions - /* UE_list->UE_template[pCC_id][UE_id].bsr_info[LCGID0] = 0; - UE_list->UE_template[pCC_id][UE_id].bsr_info[LCGID1] = 0; - UE_list->UE_template[pCC_id][UE_id].bsr_info[LCGID2] = 0; - UE_list->UE_template[pCC_id][UE_id].bsr_info[LCGID3] = 0; - - UE_list->UE_template[pCC_id][UE_id].ul_SR = 0; - UE_list->UE_template[pCC_id][UE_id].rnti = NOT_A_RNTI; - UE_list->UE_template[pCC_id][UE_id].ul_active = FALSE; - */ - memset (&UE_list->UE_template[pCC_id][UE_id], + /* If present, remove UE from DL list */ + if (UE_list->head == UE_id) { + UE_list->head = UE_list->next[UE_id]; + } else { + int previous = prev(UE_list, UE_id, 0); + + if (previous != -1) { + UE_list->next[previous] = UE_list->next[UE_id]; + } + } + + /* If present, remove UE from UL list */ + if (UE_list->head_ul == UE_id) { + UE_list->head_ul = UE_list->next_ul[UE_id]; + } else { + int previous = prev(UE_list, UE_id, 1); + + if (previous != -1) { + UE_list->next_ul[previous] = UE_list->next_ul[UE_id]; + } + } + + /* Clear all remaining pending transmissions */ + memset(&UE_list->UE_template[pCC_id][UE_id], 0, sizeof(UE_TEMPLATE)); @@ -2249,7 +2248,7 @@ rrc_mac_remove_ue(module_id_t mod_idP, ue_stats->total_rbs_used = 0; ue_stats->total_rbs_used_retx = 0; - for ( j = 0; j < NB_RB_MAX; j++ ) { + for (int j = 0; j < NB_RB_MAX; j++ ) { ue_stats->num_pdu_tx[j] = 0; ue_stats->num_bytes_tx[j] = 0; } @@ -2260,7 +2259,7 @@ rrc_mac_remove_ue(module_id_t mod_idP, ue_stats->total_num_pdus = 0; ue_stats->total_rbs_used_rx = 0; - for ( j = 0; j < NB_RB_MAX; j++ ) { + for (int j = 0; j < NB_RB_MAX; j++ ) { ue_stats->num_pdu_rx[j] = 0; ue_stats->num_bytes_rx[j] = 0; } @@ -2269,11 +2268,13 @@ rrc_mac_remove_ue(module_id_t mod_idP, ue_stats->total_pdu_bytes_rx = 0; ue_stats->total_num_pdus_rx = 0; ue_stats->total_num_errors_rx = 0; - eNB_ulsch_info[mod_idP][pCC_id][UE_id].rnti = NOT_A_RNTI; - eNB_ulsch_info[mod_idP][pCC_id][UE_id].status = S_UL_NONE; - eNB_dlsch_info[mod_idP][pCC_id][UE_id].rnti = NOT_A_RNTI; - eNB_dlsch_info[mod_idP][pCC_id][UE_id].status = S_DL_NONE; + + eNB_ulsch_info[mod_idP][pCC_id][UE_id].rnti = NOT_A_RNTI; + eNB_ulsch_info[mod_idP][pCC_id][UE_id].status = S_UL_NONE; eNB_ulsch_info[mod_idP][pCC_id][UE_id].serving_num = 0; + + eNB_dlsch_info[mod_idP][pCC_id][UE_id].rnti = NOT_A_RNTI; + eNB_dlsch_info[mod_idP][pCC_id][UE_id].status = S_DL_NONE; eNB_dlsch_info[mod_idP][pCC_id][UE_id].serving_num = 0; // check if this has an RA process active @@ -2315,20 +2316,21 @@ rrc_mac_remove_ue(module_id_t mod_idP, } //------------------------------------------------------------------------------ +/* + * Returns the previous UE_id in the scheduling list in UL or DL + */ int prev(UE_list_t *listP, int nodeP, int ul_flag) //------------------------------------------------------------------------------ { - int j; - if (ul_flag == 0) { if (nodeP == listP->head) { return nodeP; } - for (j = listP->head; j >= 0; j = listP->next[j]) { + for (int j = listP->head; j >= 0; j = listP->next[j]) { if (listP->next[j] == nodeP) { return j; } @@ -2338,7 +2340,7 @@ prev(UE_list_t *listP, return nodeP; } - for (j = listP->head_ul; j >= 0; j = listP->next_ul[j]) { + for (int j = listP->head_ul; j >= 0; j = listP->next_ul[j]) { if (listP->next_ul[j] == nodeP) { return j; } @@ -2492,8 +2494,8 @@ UE_is_to_be_scheduled(module_id_t module_idP, if (UE_sched_ctl->ul_failure_timer > 0 || UE_sched_ctl->ul_out_of_sync > 0) return 0; - rnti_t ue_rnti = UE_RNTI(module_idP, - UE_id); + rnti_t ue_rnti = UE_RNTI(module_idP, UE_id); + LOG_D(MAC, "[eNB %d][PUSCH] Checking UL requirements UE %d/%x\n", module_idP, UE_id, @@ -2510,7 +2512,9 @@ UE_is_to_be_scheduled(module_id_t module_idP, module_idP, UE_id, ue_rnti, - UE_template->ul_buffer_info[LCGID0], UE_template->ul_SR); + UE_template->ul_buffer_info[LCGID0], + UE_template->ul_SR); + return 1; } return 0; @@ -2537,7 +2541,7 @@ get_tmode(module_id_t module_idP, "antennaInfo (mod_id %d) is null for CCId %d, UEid %d, physicalConfigDedicated %p\n", module_idP, CC_idP, - UE_idP, + UE_idP, physicalConfigDedicated); AssertFatal(physicalConfigDedicated->antennaInfo->present != LTE_PhysicalConfigDedicated__antennaInfo_PR_NOTHING, @@ -2877,18 +2881,11 @@ get_nb_subband(int N_RB_DL) return nb_sb; } -/* -void -init_CCE_table(int module_idP, - int CC_idP) -{ - memset(RC.mac[module_idP]->CCE_table[CC_idP], - 0, - 800 * sizeof(int)); -} -*/ + +//------------------------------------------------------------------------------ void init_CCE_table(int *CCE_table) +//------------------------------------------------------------------------------ { memset(CCE_table, 0, 800 * sizeof(int)); } @@ -3313,7 +3310,7 @@ try_again: } } // for i = 0 ... num_DL_DCIs - // no try to allocate UL DCIs + // now try to allocate UL DCIs for (i = 0; i < HI_DCI0_req->number_of_dci + HI_DCI0_req->number_of_hi; i++) { hi_dci0_pduLoop = &hi_dci0_pdu[i]; // allocate UL DCIs @@ -4066,6 +4063,7 @@ extract_harq(module_id_t mod_idP, ra[ra_i].rnti); } } + break; } } @@ -4966,9 +4964,7 @@ SR_indication(module_id_t mod_idP, VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SR_INDICATION, 1); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SR_INDICATION, 0); } else { - // AssertFatal(0, "find_UE_id(%u,rnti %d) not found", enb_mod_idP, rntiP); - // AssertError(0, 0, "Frame %d: find_UE_id(%u,rnti %d) not found\n", frameP, enb_mod_idP, rntiP); - LOG_D(MAC, "[eNB %d][SR %x] Frame %d subframeP %d Signaling SR for UE %d (unknown UEid) on CC_id %d\n", + LOG_D(MAC, "[eNB %d][SR %x] Frame %d subframeP %d Signaling SR for UE %d (unknown UE_id) on CC_id %d\n", mod_idP, rntiP, frameP, diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c index efe60be84f..52b5f7eff7 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c @@ -120,6 +120,8 @@ rx_sdu(const module_id_t enb_mod_idP, eNB_MAC_INST *mac = NULL; UE_list_t *UE_list = NULL; rrc_eNB_ue_context_t *ue_contextP = NULL; + UE_sched_ctrl *UE_scheduling_control = NULL; + UE_TEMPLATE *UE_template_ptr = NULL; /* Init */ current_rnti = rntiP; @@ -146,44 +148,47 @@ rx_sdu(const module_id_t enb_mod_idP, } if (UE_id != -1) { + UE_scheduling_control = &(UE_list->UE_sched_ctrl[UE_id]); + UE_template_ptr = &(UE_list->UE_template[CC_idP][UE_id]); + LOG_D(MAC, "[eNB %d][PUSCH %d] CC_id %d %d.%d Received ULSCH sdu round %d from PHY (rnti %x, UE_id %d) ul_cqi %d\n", enb_mod_idP, harq_pid, CC_idP, frameP, subframeP, - UE_list->UE_sched_ctrl[UE_id].round_UL[CC_idP][harq_pid], + UE_scheduling_control->round_UL[CC_idP][harq_pid], current_rnti, UE_id, ul_cqi); - AssertFatal(UE_list->UE_sched_ctrl[UE_id].round_UL[CC_idP][harq_pid] < 8, "round >= 8\n"); + AssertFatal(UE_scheduling_control->round_UL[CC_idP][harq_pid] < 8, "round >= 8\n"); if (sduP != NULL) { - UE_list->UE_sched_ctrl[UE_id].ul_inactivity_timer = 0; - UE_list->UE_sched_ctrl[UE_id].ul_failure_timer = 0; - UE_list->UE_sched_ctrl[UE_id].ul_scheduled &= (~(1 << harq_pid)); + UE_scheduling_control->ul_inactivity_timer = 0; + UE_scheduling_control->ul_failure_timer = 0; + UE_scheduling_control->ul_scheduled &= (~(1 << harq_pid)); /* Update with smoothing: 3/4 of old value and 1/4 of new. * This is the logic that was done in the function * lte_est_timing_advance_pusch, maybe it's not necessary? * maybe it's even not correct at all? */ - UE_list->UE_sched_ctrl[UE_id].ta_update = (UE_list->UE_sched_ctrl[UE_id].ta_update * 3 + timing_advance) / 4; - UE_list->UE_sched_ctrl[UE_id].pusch_snr[CC_idP] = ul_cqi; - UE_list->UE_sched_ctrl[UE_id].ul_consecutive_errors = 0; + UE_scheduling_control->ta_update = (UE_scheduling_control->ta_update * 3 + timing_advance) / 4; + UE_scheduling_control->pusch_snr[CC_idP] = ul_cqi; + UE_scheduling_control->ul_consecutive_errors = 0; - first_rb = UE_list->UE_template[CC_idP][UE_id].first_rb_ul[harq_pid]; + first_rb = UE_template_ptr->first_rb_ul[harq_pid]; - if (UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync > 0) { - UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync = 0; + if (UE_scheduling_control->ul_out_of_sync > 0) { + UE_scheduling_control->ul_out_of_sync = 0; mac_eNB_rrc_ul_in_sync(enb_mod_idP, CC_idP, frameP, subframeP, current_rnti); } /* Update bytes to schedule */ - UE_list->UE_template[CC_idP][UE_id].scheduled_ul_bytes -= UE_list->UE_template[CC_idP][UE_id].TBS_UL[harq_pid]; + UE_template_ptr->scheduled_ul_bytes -= UE_template_ptr->TBS_UL[harq_pid]; - if (UE_list->UE_template[CC_idP][UE_id].scheduled_ul_bytes < 0) { - UE_list->UE_template[CC_idP][UE_id].scheduled_ul_bytes = 0; + if (UE_template_ptr->scheduled_ul_bytes < 0) { + UE_template_ptr->scheduled_ul_bytes = 0; } } else { // sduP == NULL => error @@ -193,29 +198,29 @@ rx_sdu(const module_id_t enb_mod_idP, CC_idP, frameP, subframeP, - UE_list->UE_sched_ctrl[UE_id].round_UL[CC_idP][harq_pid], + UE_scheduling_control->round_UL[CC_idP][harq_pid], ul_cqi, UE_id, current_rnti); if (ul_cqi > 200) { // too high energy pattern - UE_list->UE_sched_ctrl[UE_id].pusch_snr[CC_idP] = ul_cqi; + UE_scheduling_control->pusch_snr[CC_idP] = ul_cqi; LOG_W(MAC, "[MAC] Too high energy pattern\n"); } - if (UE_list->UE_sched_ctrl[UE_id].round_UL[CC_idP][harq_pid] == 3) { - UE_list->UE_sched_ctrl[UE_id].ul_scheduled &= (~(1 << harq_pid)); - UE_list->UE_sched_ctrl[UE_id].round_UL[CC_idP][harq_pid] = 0; + if (UE_scheduling_control->round_UL[CC_idP][harq_pid] == 3) { + UE_scheduling_control->ul_scheduled &= (~(1 << harq_pid)); + UE_scheduling_control->round_UL[CC_idP][harq_pid] = 0; - if (UE_list->UE_sched_ctrl[UE_id].ul_consecutive_errors++ == 10) { - UE_list->UE_sched_ctrl[UE_id].ul_failure_timer = 1; + if (UE_scheduling_control->ul_consecutive_errors++ == 10) { + UE_scheduling_control->ul_failure_timer = 1; } /* Update scheduled bytes */ - UE_list->UE_template[CC_idP][UE_id].scheduled_ul_bytes -= UE_list->UE_template[CC_idP][UE_id].TBS_UL[harq_pid]; + UE_template_ptr->scheduled_ul_bytes -= UE_template_ptr->TBS_UL[harq_pid]; - if (UE_list->UE_template[CC_idP][UE_id].scheduled_ul_bytes < 0) { - UE_list->UE_template[CC_idP][UE_id].scheduled_ul_bytes = 0; + if (UE_template_ptr->scheduled_ul_bytes < 0) { + UE_template_ptr->scheduled_ul_bytes = 0; } if (find_RA_id(enb_mod_idP, CC_idP, current_rnti) != -1) { @@ -223,16 +228,27 @@ rx_sdu(const module_id_t enb_mod_idP, } } else { - UE_list->UE_sched_ctrl[UE_id].round_UL[CC_idP][harq_pid]++; + UE_scheduling_control->round_UL[CC_idP][harq_pid]++; + } + + /* CDRX UL HARQ timers */ + if (UE_scheduling_control->cdrx_configured == TRUE) { + /* Synchronous UL HARQ */ + UE_scheduling_control->ul_synchronous_harq_timer[CC_idP][harq_pid] = 5; + /* In case of asynchronous UL HARQ process restart here relevant RTT timer + * Stop corresponding CDRX ULRetransmission timer + */ } - first_rb = UE_list->UE_template[CC_idP][UE_id].first_rb_ul[harq_pid]; + first_rb = UE_template_ptr->first_rb_ul[harq_pid]; /* Program NACK for PHICH */ - LOG_D(MAC, "Programming PHICH NACK for rnti %x harq_pid %d (first_rb %d)\n", + LOG_D(MAC, "Programming PHICH NACK for rnti %x harq_pid %d (first_rb %d), frame %d, subframe %d\n", current_rnti, harq_pid, - first_rb); + first_rb, + frameP, + subframeP); nfapi_hi_dci0_request_t *hi_dci0_req = NULL; uint8_t sf_ahead_dl = ul_subframe2_k_phich(&mac->common_channels[CC_idP], subframeP); @@ -250,9 +266,9 @@ rx_sdu(const module_id_t enb_mod_idP, hi_dci0_pdu->hi_pdu.hi_pdu_rel8.cyclic_shift_2_for_drms = 0; hi_dci0_pdu->hi_pdu.hi_pdu_rel8.hi_value = 0; hi_dci0_req_body->number_of_hi++; - hi_dci0_req_body->sfnsf = sfnsf_add_subframe(frameP,subframeP, 0); + hi_dci0_req_body->sfnsf = sfnsf_add_subframe(frameP, subframeP, 0); hi_dci0_req_body->tl.tag = NFAPI_HI_DCI0_REQUEST_BODY_TAG; - hi_dci0_req->sfn_sf = sfnsf_add_subframe(frameP,subframeP, sf_ahead_dl); + hi_dci0_req->sfn_sf = sfnsf_add_subframe(frameP, subframeP, sf_ahead_dl); hi_dci0_req->header.message_id = NFAPI_HI_DCI0_REQUEST; return; } @@ -293,7 +309,7 @@ rx_sdu(const module_id_t enb_mod_idP, if (ra->msg3_round >= mac->common_channels[CC_idP].radioResourceConfigCommon->rach_ConfigCommon.maxHARQ_Msg3Tx - 1) { cancel_ra_proc(enb_mod_idP, CC_idP, frameP, current_rnti); } else { - // first_rb = UE_list->UE_template[CC_idP][UE_id].first_rb_ul[harq_pid]; // UE_id = -1 !!!! + // first_rb = UE_template_ptr->first_rb_ul[harq_pid]; // UE_id = -1 !!!! ra->msg3_round++; /* Prepare handling of retransmission */ @@ -356,7 +372,7 @@ rx_sdu(const module_id_t enb_mod_idP, mac->eNB_stats[CC_idP].total_ulsch_bytes_rx += sdu_lenP; mac->eNB_stats[CC_idP].total_ulsch_pdus_rx += 1; if (UE_id != -1) { - UE_list->UE_sched_ctrl[UE_id].round_UL[CC_idP][harq_pid] = 0; + UE_scheduling_control->round_UL[CC_idP][harq_pid] = 0; } /* Control element */ @@ -372,20 +388,20 @@ rx_sdu(const module_id_t enb_mod_idP, switch (rx_ces[i]) { // implement and process PHR + CRNTI + BSR case POWER_HEADROOM: if (UE_id != -1) { - UE_list->UE_template[CC_idP][UE_id].phr_info = (payload_ptr[0] & 0x3f) - PHR_MAPPING_OFFSET + (int8_t)(hundred_times_log10_NPRB[UE_list->UE_template[CC_idP][UE_id].nb_rb_ul[harq_pid] - 1] / 100); + UE_template_ptr->phr_info = (payload_ptr[0] & 0x3f) - PHR_MAPPING_OFFSET + (int8_t)(hundred_times_log10_NPRB[UE_template_ptr->nb_rb_ul[harq_pid] - 1] / 100); - if (UE_list->UE_template[CC_idP][UE_id].phr_info > 40) { - UE_list->UE_template[CC_idP][UE_id].phr_info = 40; + if (UE_template_ptr->phr_info > 40) { + UE_template_ptr->phr_info = 40; } LOG_D(MAC, "[eNB %d] CC_id %d MAC CE_LCID %d : Received PHR PH = %d (db)\n", enb_mod_idP, CC_idP, rx_ces[i], - UE_list->UE_template[CC_idP][UE_id].phr_info); + UE_template_ptr->phr_info); - UE_list->UE_template[CC_idP][UE_id].phr_info_configured = 1; - UE_list->UE_sched_ctrl[UE_id].phr_received = 1; + UE_template_ptr->phr_info_configured = 1; + UE_scheduling_control->phr_received = 1; } payload_ptr += sizeof(POWER_HEADROOM_CMD); @@ -410,26 +426,39 @@ rx_sdu(const module_id_t enb_mod_idP, /* Receiving CRNTI means that the current rnti has to go away */ if (old_UE_id != -1) { if (mac_eNB_get_rrc_status(enb_mod_idP,old_rnti) == RRC_HO_EXECUTION) { - LOG_I(MAC, - "[eNB %d] Frame %d, Subframe %d CC_id %d : (rnti %x UE_id %d) Handover case\n", - enb_mod_idP, frameP, subframeP, CC_idP, old_rnti, old_UE_id); + LOG_I(MAC, "[eNB %d] Frame %d, Subframe %d CC_id %d : (rnti %x UE_id %d) Handover case\n", + enb_mod_idP, + frameP, + subframeP, + CC_idP, + old_rnti, + old_UE_id); + UE_id = old_UE_id; current_rnti = old_rnti; - //clear timer - UE_list->UE_sched_ctrl[UE_id].uplane_inactivity_timer = 0; - UE_list->UE_sched_ctrl[UE_id].ul_inactivity_timer = 0; - UE_list->UE_sched_ctrl[UE_id].ul_failure_timer = 0; - - if (UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync > 0) { - UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync = 0; - mac_eNB_rrc_ul_in_sync(enb_mod_idP, CC_idP, frameP, - subframeP, old_rnti); + /* Clear timer */ + UE_scheduling_control = &(UE_list->UE_sched_ctrl[UE_id]); + UE_template_ptr = &(UE_list->UE_template[CC_idP][UE_id]); + + UE_scheduling_control->uplane_inactivity_timer = 0; + UE_scheduling_control->ul_inactivity_timer = 0; + UE_scheduling_control->ul_failure_timer = 0; + + if (UE_scheduling_control->ul_out_of_sync > 0) { + UE_scheduling_control->ul_out_of_sync = 0; + mac_eNB_rrc_ul_in_sync(enb_mod_idP, + CC_idP, + frameP, + subframeP, + old_rnti); } - - UE_list->UE_template[CC_idP][UE_id].ul_SR = 1; - UE_list->UE_sched_ctrl[UE_id].crnti_reconfigurationcomplete_flag = 1; + UE_template_ptr->ul_SR = 1; + UE_scheduling_control->crnti_reconfigurationcomplete_flag = 1; UE_list->UE_template[UE_PCCID(enb_mod_idP, UE_id)][UE_id].configured = 1; - cancel_ra_proc(enb_mod_idP, CC_idP, frameP,current_rnti); + cancel_ra_proc(enb_mod_idP, + CC_idP, + frameP, + current_rnti); } else { /* TODO: if the UE did random access (followed by a MAC uplink with * CRNTI) because none of its scheduling request was granted, then @@ -473,19 +502,21 @@ rx_sdu(const module_id_t enb_mod_idP, ra->rnti = old_rnti; ra->crnti_rrc_mui = rrc_eNB_mui-1; ra->crnti_harq_pid = -1; + /* Clear timer */ - UE_list->UE_sched_ctrl[UE_id].uplane_inactivity_timer = 0; - UE_list->UE_sched_ctrl[UE_id].uplane_inactivity_timer = 0; - UE_list->UE_sched_ctrl[UE_id].ul_inactivity_timer = 0; - UE_list->UE_sched_ctrl[UE_id].ul_failure_timer = 0; + UE_scheduling_control = &(UE_list->UE_sched_ctrl[UE_id]); + UE_template_ptr = &(UE_list->UE_template[CC_idP][UE_id]); + + UE_scheduling_control->uplane_inactivity_timer = 0; + UE_scheduling_control->ul_inactivity_timer = 0; + UE_scheduling_control->ul_failure_timer = 0; - if (UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync > 0) { - UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync = 0; + if (UE_scheduling_control->ul_out_of_sync > 0) { + UE_scheduling_control->ul_out_of_sync = 0; mac_eNB_rrc_ul_in_sync(enb_mod_idP, CC_idP, frameP, subframeP, old_rnti); } - - UE_list->UE_template[CC_idP][UE_id].ul_SR = 1; - UE_list->UE_sched_ctrl[UE_id].crnti_reconfigurationcomplete_flag = 1; + UE_template_ptr->ul_SR = 1; + UE_scheduling_control->crnti_reconfigurationcomplete_flag = 1; // break; } } @@ -518,12 +549,12 @@ rx_sdu(const module_id_t enb_mod_idP, lcgid_updated[lcgid] = 1; /* Update buffer info */ - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[lcgid] = BSR_TABLE[bsr]; - UE_list->UE_template[CC_idP][UE_id].estimated_ul_buffer = - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID0] + - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID1] + - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID2] + - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID3]; + UE_template_ptr->ul_buffer_info[lcgid] = BSR_TABLE[bsr]; + UE_template_ptr->estimated_ul_buffer = + UE_template_ptr->ul_buffer_info[LCGID0] + + UE_template_ptr->ul_buffer_info[LCGID1] + + UE_template_ptr->ul_buffer_info[LCGID2] + + UE_template_ptr->ul_buffer_info[LCGID3]; RC.eNB[enb_mod_idP][CC_idP]->pusch_stats_bsr[UE_id][(frameP * 10) + subframeP] = (payload_ptr[0] & 0x3f); @@ -531,8 +562,8 @@ rx_sdu(const module_id_t enb_mod_idP, VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_BSR, (payload_ptr[0] & 0x3f)); } - if (UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[lcgid] == 0) { - UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[lcgid] = frameP; + if (UE_template_ptr->ul_buffer_creation_time[lcgid] == 0) { + UE_template_ptr->ul_buffer_creation_time[lcgid] = frameP; } if (mac_eNB_get_rrc_status(enb_mod_idP,UE_RNTI(enb_mod_idP, UE_id)) < RRC_CONNECTED) { @@ -540,8 +571,8 @@ rx_sdu(const module_id_t enb_mod_idP, enb_mod_idP, CC_idP, rx_ces[i], - UE_list->UE_template[CC_idP][UE_id].estimated_ul_buffer, - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[lcgid]); + UE_template_ptr->estimated_ul_buffer, + UE_template_ptr->ul_buffer_info[lcgid]); } } else { @@ -565,25 +596,25 @@ rx_sdu(const module_id_t enb_mod_idP, lcgid_updated[LCGID3] = 1; /* Update buffer info */ - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID0] = BSR_TABLE[bsr0]; - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID1] = BSR_TABLE[bsr1]; - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID2] = BSR_TABLE[bsr2]; - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID3] = BSR_TABLE[bsr3]; + UE_template_ptr->ul_buffer_info[LCGID0] = BSR_TABLE[bsr0]; + UE_template_ptr->ul_buffer_info[LCGID1] = BSR_TABLE[bsr1]; + UE_template_ptr->ul_buffer_info[LCGID2] = BSR_TABLE[bsr2]; + UE_template_ptr->ul_buffer_info[LCGID3] = BSR_TABLE[bsr3]; - UE_list->UE_template[CC_idP][UE_id].estimated_ul_buffer = - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID0] + - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID1] + - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID2] + - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID3]; + UE_template_ptr->estimated_ul_buffer = + UE_template_ptr->ul_buffer_info[LCGID0] + + UE_template_ptr->ul_buffer_info[LCGID1] + + UE_template_ptr->ul_buffer_info[LCGID2] + + UE_template_ptr->ul_buffer_info[LCGID3]; LOG_D(MAC, "[eNB %d] CC_id %d MAC CE_LCID %d: Received long BSR. Size is LCGID0 = %u LCGID1 = %u LCGID2 = %u LCGID3 = %u\n", enb_mod_idP, CC_idP, rx_ces[i], - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID0], - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID1], - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID2], - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID3]); + UE_template_ptr->ul_buffer_info[LCGID0], + UE_template_ptr->ul_buffer_info[LCGID1], + UE_template_ptr->ul_buffer_info[LCGID2], + UE_template_ptr->ul_buffer_info[LCGID3]); if (crnti_rx == 1) { LOG_D(MAC, "[eNB %d] CC_id %d MAC CE_LCID %d: Received CRNTI.\n", @@ -593,10 +624,10 @@ rx_sdu(const module_id_t enb_mod_idP, } for(int lcgid = 0; lcgid <= LCGID3; lcgid++) { - if (UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[lcgid] == 0) { - UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[lcgid] = 0; - } else if (UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[lcgid] == 0) { - UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[lcgid] = frameP; + if (UE_template_ptr->ul_buffer_info[lcgid] == 0) { + UE_template_ptr->ul_buffer_creation_time[lcgid] = 0; + } else if (UE_template_ptr->ul_buffer_creation_time[lcgid] == 0) { + UE_template_ptr->ul_buffer_creation_time[lcgid] = frameP; } } } @@ -705,6 +736,9 @@ rx_sdu(const module_id_t enb_mod_idP, frameP, ra->rnti, UE_id); + + UE_scheduling_control = &(UE_list->UE_sched_ctrl[UE_id]); + UE_template_ptr = &(UE_list->UE_template[CC_idP][UE_id]); } } else { LOG_D(MAC, "[eNB %d][RAPROC] CC_id %d Frame %d CCCH: Received Msg3 from already registered UE %d: length %d, offset %ld\n", @@ -758,7 +792,7 @@ rx_sdu(const module_id_t enb_mod_idP, ra->Msg4_subframe = (subframeP + 4) % 10; } - UE_list->UE_sched_ctrl[UE_id].crnti_reconfigurationcomplete_flag = 0; + UE_scheduling_control->crnti_reconfigurationcomplete_flag = 0; } // if RA process is active break; @@ -778,19 +812,19 @@ rx_sdu(const module_id_t enb_mod_idP, #endif if (UE_id != -1) { - if (lcgid_updated[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] == 0) { + if (lcgid_updated[UE_template_ptr->lcgidmap[rx_lcids[i]]] == 0) { /* Adjust buffer occupancy of the correponding logical channel group */ - if (UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] >= rx_lengths[i]) - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] -= rx_lengths[i]; + if (UE_template_ptr->ul_buffer_info[UE_template_ptr->lcgidmap[rx_lcids[i]]] >= rx_lengths[i]) + UE_template_ptr->ul_buffer_info[UE_template_ptr->lcgidmap[rx_lcids[i]]] -= rx_lengths[i]; else - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] = 0; - - UE_list->UE_template[CC_idP][UE_id].estimated_ul_buffer = - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[0] + - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[1] + - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[2] + - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[3]; - //UE_list->UE_template[CC_idP][UE_id].estimated_ul_buffer += UE_list->UE_template[CC_idP][UE_id].estimated_ul_buffer / 4; + UE_template_ptr->ul_buffer_info[UE_template_ptr->lcgidmap[rx_lcids[i]]] = 0; + + UE_template_ptr->estimated_ul_buffer = + UE_template_ptr->ul_buffer_info[0] + + UE_template_ptr->ul_buffer_info[1] + + UE_template_ptr->ul_buffer_info[2] + + UE_template_ptr->ul_buffer_info[3]; + //UE_template_ptr->estimated_ul_buffer += UE_template_ptr->estimated_ul_buffer / 4; } LOG_D(MAC, @@ -836,21 +870,21 @@ rx_sdu(const module_id_t enb_mod_idP, rx_lengths[i], UE_id, rx_lcids[i], - UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]], - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]]); + UE_template_ptr->lcgidmap[rx_lcids[i]], + UE_template_ptr->ul_buffer_info[UE_template_ptr->lcgidmap[rx_lcids[i]]]); - if (lcgid_updated[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] == 0) { - if (UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] >= rx_lengths[i]) { - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] -= rx_lengths[i]; + if (lcgid_updated[UE_template_ptr->lcgidmap[rx_lcids[i]]] == 0) { + if (UE_template_ptr->ul_buffer_info[UE_template_ptr->lcgidmap[rx_lcids[i]]] >= rx_lengths[i]) { + UE_template_ptr->ul_buffer_info[UE_template_ptr->lcgidmap[rx_lcids[i]]] -= rx_lengths[i]; } else { - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] = 0; + UE_template_ptr->ul_buffer_info[UE_template_ptr->lcgidmap[rx_lcids[i]]] = 0; } - UE_list->UE_template[CC_idP][UE_id].estimated_ul_buffer = - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[0] + - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[1] + - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[2] + - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[3]; + UE_template_ptr->estimated_ul_buffer = + UE_template_ptr->ul_buffer_info[0] + + UE_template_ptr->ul_buffer_info[1] + + UE_template_ptr->ul_buffer_info[2] + + UE_template_ptr->ul_buffer_info[3]; } if ((rx_lengths[i] < SCH_PAYLOAD_SIZE_MAX) && (rx_lengths[i] > 0)) { // MAX SIZE OF transport block @@ -859,7 +893,7 @@ rx_sdu(const module_id_t enb_mod_idP, UE_list->eNB_UE_stats[CC_idP][UE_id].num_bytes_rx[rx_lcids[i]] += rx_lengths[i]; /* Clear uplane_inactivity_timer */ - UE_list->UE_sched_ctrl[UE_id].uplane_inactivity_timer = 0; + UE_scheduling_control->uplane_inactivity_timer = 0; /* Reset RRC inactivity timer after uplane activity */ ue_contextP = rrc_eNB_get_ue_context(RC.rrc[enb_mod_idP], current_rnti); @@ -897,11 +931,24 @@ rx_sdu(const module_id_t enb_mod_idP, payload_ptr += rx_lengths[i]; } + /* CDRX UL HARQ timers */ + if (UE_id != -1) { + if (UE_scheduling_control->cdrx_configured == TRUE) { + /* Synchronous UL HARQ */ + UE_scheduling_control->ul_synchronous_harq_timer[CC_idP][harq_pid] = 5; + /* Note: in case of asynchronous UL HARQ process restart here relevant RTT timer + * Stop corresponding CDRX ULRetransmission timer + */ + } + } + /* Program ACK for PHICH */ - LOG_D(MAC, "Programming PHICH ACK for rnti %x harq_pid %d (first_rb %d)\n", - current_rnti, - harq_pid, - first_rb); + LOG_D(MAC, "Programming PHICH ACK for rnti %x harq_pid %d (first_rb %d) frame %d subframe %d\n", + current_rnti, + harq_pid, + first_rb, + frameP, + subframeP); nfapi_hi_dci0_request_t *hi_dci0_req; @@ -1303,15 +1350,15 @@ schedule_ulsch(module_id_t module_idP, //----------------------------------------------------------------------------- /* - * Default scheduler for ULSCH (DCI0) - */ +* Schedule the DCI0 for ULSCH +*/ void -schedule_ulsch_rnti(module_id_t module_idP, - int slice_idx, - frame_t frameP, - sub_frame_t subframeP, - unsigned char sched_subframeP, - uint16_t *first_rb) +schedule_ulsch_rnti(module_id_t module_idP, + int slice_idx, + frame_t frameP, + sub_frame_t subframeP, + unsigned char sched_subframeP, + uint16_t *first_rb) //----------------------------------------------------------------------------- { rnti_t rnti = -1; @@ -1473,7 +1520,7 @@ schedule_ulsch_rnti(module_id_t module_idP, VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_BO, UE_template_ptr->estimated_ul_buffer); /* - * If there is information on bsr of DCCH, DTCH or if there is UL_SR, + * If there is information on BSR of DCCH, DTCH or if there is UL_SR, * or if there is a packet to retransmit, or we want to schedule a periodic feedback */ /* Shouldn't this test be done earlier?? */ @@ -1491,14 +1538,14 @@ schedule_ulsch_rnti(module_id_t module_idP, UE_sched_ctrl_ptr->ul_failure_timer, UE_sched_ctrl_ptr->cqi_req_timer); - // reset the scheduling request + /* Reset the scheduling request */ UE_template_ptr->ul_SR = 0; status = mac_eNB_get_rrc_status(module_idP, rnti); cqi_req = 0; /* Handle the aperiodic CQI report */ /* These aperiodic reports behave as periodic ones... */ - if (status >= RRC_CONNECTED && UE_sched_ctrl_ptr->cqi_req_timer > 30) { + if (status >= RRC_CONNECTED && UE_sched_ctrl_ptr->cqi_req_timer > 200) { if (UE_sched_ctrl_ptr->cqi_received == 0) { if (nfapi_mode) { cqi_req = 0; @@ -1521,7 +1568,7 @@ schedule_ulsch_rnti(module_id_t module_idP, break; default: - LOG_E(MAC," TDD config not supported\n"); + LOG_E(MAC, "TDD config not supported\n"); break; } } @@ -1593,6 +1640,12 @@ schedule_ulsch_rnti(module_id_t module_idP, UE_template_ptr->mcs_UL[harq_pid] = cmin(UE_template_ptr->pre_assigned_mcs_ul, sli->ul[slice_idx].maxmcs); UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs1= UE_template_ptr->mcs_UL[harq_pid]; + /* CDRX */ + if (UE_sched_ctrl_ptr->cdrx_configured) { + UE_sched_ctrl_ptr->drx_inactivity_timer = 1; // reset drx inactivity timer when new transmission + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DRX_INACTIVITY, (unsigned long) UE_sched_ctrl_ptr->drx_inactivity_timer); + } + if (UE_template_ptr->pre_allocated_rb_table_index_ul >= 0) { rb_table_index = UE_template_ptr->pre_allocated_rb_table_index_ul; } else { @@ -1739,7 +1792,6 @@ schedule_ulsch_rnti(module_id_t module_idP, 1, // repetition_number (frameP * 10) + subframeP); } - #endif if (dlsch_flag == 1) { @@ -1854,7 +1906,6 @@ schedule_ulsch_rnti(module_id_t module_idP, UE_template_ptr->TBS_UL[harq_pid]); #if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) - /* This is a BL/CE UE allocation */ if (UE_template_ptr->rach_resource_type > 0) { fill_nfapi_ulsch_config_request_emtc(&ul_req_tmp_body->ul_config_pdu_list[ul_req_index], @@ -1863,7 +1914,6 @@ schedule_ulsch_rnti(module_id_t module_idP, 1, // repetition_number (frameP * 10) + subframeP); } - #endif if(dlsch_flag == 1) { @@ -1964,7 +2014,9 @@ void schedule_ulsch_rnti_emtc(module_id_t module_idP, UE_template = &(UE_list->UE_template[UE_PCCID(module_idP, UE_id)][UE_id]); /* LTE-M device */ - if (UE_template->rach_resource_type == 0) continue; + if (UE_template->rach_resource_type == 0) { + continue; + } /* Don't schedule if Msg4 is not received yet */ if (UE_template->configured == FALSE) { @@ -1988,6 +2040,14 @@ void schedule_ulsch_rnti_emtc(module_id_t module_idP, continue; } + /* CDRX LTE-M */ + UE_sched_ctrl = &(UE_list->UE_sched_ctrl[UE_id]); + if (UE_sched_ctrl->cdrx_configured == TRUE) { + if ((UE_sched_ctrl->bypass_cdrx == FALSE) && (UE_sched_ctrl->in_active_time == FALSE)) { + continue; + } + } + /* Loop over all active UL CC_ids for this UE */ for (n = 0; n < UE_list->numactiveULCCs[UE_id]; n++) { /* This is the actual CC_id in the list */ @@ -2087,6 +2147,13 @@ void schedule_ulsch_rnti_emtc(module_id_t module_idP, /* New transmission */ if (round_UL == 0) { + + /* CDRX LTE-M */ + if (UE_sched_ctrl->cdrx_configured == TRUE) { + UE_sched_ctrl->drx_inactivity_timer = 1; // reset drx inactivity timer when new transmission + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DRX_INACTIVITY, (unsigned long) UE_sched_ctrl->drx_inactivity_timer); + } + ndi = 1 - UE_template->oldNDI_UL[harq_pid]; UE_template->oldNDI_UL[harq_pid] = ndi; diff --git a/openair2/LAYER2/MAC/mac.h b/openair2/LAYER2/MAC/mac.h index fc457c2ee7..a00e5ec4e6 100644 --- a/openair2/LAYER2/MAC/mac.h +++ b/openair2/LAYER2/MAC/mac.h @@ -553,6 +553,7 @@ typedef struct { uint16_t serving_num; UE_ULSCH_STATUS status; } eNB_ULSCH_INFO; + /*! \brief temp struct for DLSCH sched */ typedef struct { rnti_t rnti; @@ -561,6 +562,7 @@ typedef struct { uint16_t serving_num; UE_DLSCH_STATUS status; } eNB_DLSCH_INFO; + /*! \brief eNB overall statistics */ typedef struct { /// num BCCH PDU per CC @@ -635,6 +637,7 @@ typedef struct { int missed_deadlines; } eNB_STATS; + /*! \brief eNB statistics for the connected UEs*/ typedef struct { /// CRNTI of UE @@ -778,6 +781,7 @@ typedef struct { } eNB_UE_STATS; /*! \brief eNB template for UE context information */ + typedef struct { /// C-RNTI of UE rnti_t rnti; @@ -995,6 +999,49 @@ typedef struct { int32_t uplane_inactivity_timer; uint8_t crnti_reconfigurationcomplete_flag; uint8_t cqi_req_flag; + + /* HARQ RRT Timers */ + /// (UL) HARQ RTT timers, especially used for CDRX operations, one timer per cell per harq process (and per user) + uint8_t harq_rtt_timer[NFAPI_CC_MAX][8]; + uint8_t ul_harq_rtt_timer[NFAPI_CC_MAX][8]; // Note: UL HARQ RTT timers are only for asynchronous HARQ processes!! + uint8_t ul_synchronous_harq_timer[NFAPI_CC_MAX][8]; + + /* C-DRX related timers */ + /* Note: only valid for FDD when this comment is written (11-01-19)*/ + /// is TRUE if the cqi mask feature is activated by RRC configuration + boolean_t cqi_mask_boolean; + /// is TRUE if the following drx parameters are configured for UE + boolean_t cdrx_configured; + /// if TRUE, the scheduler should bypass in_active_time and consider the UE as active + boolean_t bypass_cdrx; + /// is TRUE if the UE is in "Active Time", hence listening to PDCCH + boolean_t in_active_time; + /// OnDurationTimer + uint16_t on_duration_timer; + uint16_t on_duration_timer_thres; + /// drx-InactivityTimer + uint16_t drx_inactivity_timer; + uint16_t drx_inactivity_timer_thres; + /// is TRUE if UE is currently in short DRX cycle + boolean_t in_short_drx_cycle; + /// drxShortCycleTimer int (1..16) (number of short DRX cycles duration before long DRX cycles) + uint8_t drx_shortCycle_timer_value; + /// shortDRX-Cycle (duration of a short DRX cycle) + uint16_t short_drx_cycle_duration; + /// DRX short cycle timer before switching to long DRX cycle = drx_shortCycle_timer_value * short_drx_cycle_duration + uint16_t drx_shortCycle_timer; + uint16_t drx_shortCycle_timer_thres; + /// is TRUE if UE is currently in long DRX cycle + boolean_t in_long_drx_cycle; + /// longDRX-CycleStartOffset (long DRX cycle timer) + uint16_t drx_longCycle_timer; + uint16_t drx_longCycle_timer_thres; + /// longDRX-CycleStartOffset (offset value) + uint16_t drx_start_offset; + /// DRX retransmission timer, one per DL HARQ process + uint8_t drx_retransmission_timer[8]; + uint8_t drx_retransmission_timer_thres[8]; + /* End of C-DRX related timers */ } UE_sched_ctrl; /*! \brief eNB template for the Random access information */ @@ -1482,6 +1529,7 @@ typedef struct { int16_t bucket_size[MAX_NUM_LCID]; } UE_SCHEDULING_INFO; /*!\brief Top level UE MAC structure */ + typedef struct { uint16_t Node_id; /// RX frame counter diff --git a/openair2/LAYER2/MAC/mac_proto.h b/openair2/LAYER2/MAC/mac_proto.h index 8943a21d60..6e2a00fd30 100644 --- a/openair2/LAYER2/MAC/mac_proto.h +++ b/openair2/LAYER2/MAC/mac_proto.h @@ -1280,6 +1280,10 @@ uint16_t nb_rbs_allowed_slice(float rb_percentage, int total_rbs); int ue_dl_slice_membership(module_id_t mod_id, int UE_id, int slice_idx); int ue_ul_slice_membership(module_id_t mod_id, int UE_id, int slice_idx); +/* DRX Configuration */ +/* Configure local DRX timers and thresh following the drx_configuration input */ +void eNB_Config_Local_DRX(module_id_t Mod_id, rnti_t rnti, LTE_DRX_Config_t *drx_Configuration); + /* from here: prototypes to get rid of compilation warnings: doc to be written by function author */ uint8_t ul_subframe2_k_phich(COMMON_channels_t * cc, sub_frame_t ul_subframe); #endif diff --git a/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c index 89756e7baa..ea49cfa81e 100644 --- a/openair2/LAYER2/MAC/pre_processor.c +++ b/openair2/LAYER2/MAC/pre_processor.c @@ -459,7 +459,7 @@ void decode_slice_positioning(module_id_t Mod_idP, } -// This fuction sorts the UE in order their dlsch buffer and CQI +// This function sorts the UE in order their dlsch buffer and CQI void sort_UEs(module_id_t Mod_idP, int slice_idx, @@ -471,9 +471,19 @@ sort_UEs(module_id_t Mod_idP, int list_size = 0; struct sort_ue_dl_params params = {Mod_idP, frameP, subframeP, slice_idx}; UE_list_t *UE_list = &RC.mac[Mod_idP]->UE_list; + UE_sched_ctrl *UE_scheduling_control = NULL; for (i = 0; i < MAX_MOBILES_PER_ENB; i++) { + UE_scheduling_control = &(UE_list->UE_sched_ctrl[i]); + + if (UE_scheduling_control->cdrx_configured == TRUE) { + + if ((UE_scheduling_control->bypass_cdrx == FALSE) && (UE_scheduling_control->in_active_time == FALSE)) { + continue; + } + } + if (UE_list->active[i] == TRUE && UE_RNTI(Mod_idP, i) != NOT_A_RNTI && UE_list->UE_sched_ctrl[i].ul_out_of_sync != 1 && @@ -1636,8 +1646,9 @@ void ulsch_scheduler_pre_processor(module_id_t module_idP, uint16_t average_rbs_per_user[NFAPI_CC_MAX]; int16_t total_remaining_rbs[NFAPI_CC_MAX]; uint16_t total_ue_count[NFAPI_CC_MAX]; - UE_list_t *UE_list = &RC.mac[module_idP]->UE_list; - slice_info_t *sli = &RC.mac[module_idP]->slice_info; + eNB_MAC_INST *eNB = RC.mac[module_idP]; + UE_list_t *UE_list = &eNB->UE_list; + slice_info_t *sli = &eNB->slice_info; UE_TEMPLATE *UE_template = 0; UE_sched_ctrl *ue_sched_ctl; int N_RB_UL = 0; @@ -1695,7 +1706,7 @@ void ulsch_scheduler_pre_processor(module_id_t module_idP, nCCE_to_be_used[CC_id] = nCCE_to_be_used[CC_id] + (1<<aggregation); max_num_ue_to_be_scheduled+=1; } */ - N_RB_UL = to_prb(RC.mac[module_idP]->common_channels[CC_id].ul_Bandwidth); + N_RB_UL = to_prb(eNB->common_channels[CC_id].ul_Bandwidth); ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; ue_sched_ctl->max_rbs_allowed_slice_uplink[CC_id][slice_idx] = nb_rbs_allowed_slice(sli->ul[slice_idx].pct, N_RB_UL); @@ -1740,7 +1751,7 @@ void ulsch_scheduler_pre_processor(module_id_t module_idP, // This is the actual CC_id in the list CC_id = UE_list->ordered_ULCCids[n][UE_id]; UE_template = &UE_list->UE_template[CC_id][UE_id]; - harq_pid = subframe2harqpid(&RC.mac[module_idP]->common_channels[CC_id], + harq_pid = subframe2harqpid(&eNB->common_channels[CC_id], frameP, sched_subframeP); // mac_xface->get_ue_active_harq_pid(module_idP,CC_id,rnti,frameP,subframeP,&harq_pid,&round,openair_harq_UL); @@ -1772,7 +1783,7 @@ void ulsch_scheduler_pre_processor(module_id_t module_idP, // This is the actual CC_id in the list CC_id = UE_list->ordered_ULCCids[n][UE_id]; UE_template = &UE_list->UE_template[CC_id][UE_id]; - N_RB_UL = to_prb(RC.mac[module_idP]->common_channels[CC_id].ul_Bandwidth); + N_RB_UL = to_prb(eNB->common_channels[CC_id].ul_Bandwidth); first_rb_offset = UE_list->first_rb_offset[CC_id][slice_idx]; available_rbs = cmin(ue_sched_ctl->max_rbs_allowed_slice_uplink[CC_id][slice_idx], N_RB_UL - first_rb[CC_id] - first_rb_offset); total_remaining_rbs[CC_id] = available_rbs - total_allocated_rbs[CC_id]; @@ -1993,8 +2004,19 @@ sort_ue_ul(module_id_t module_idP, int list_size = 0; struct sort_ue_ul_params params = { module_idP, frameP, subframeP }; UE_list_t *UE_list = &RC.mac[module_idP]->UE_list; + UE_sched_ctrl *UE_scheduling_control = NULL; for (i = 0; i < MAX_MOBILES_PER_ENB; i++) { + + UE_scheduling_control = &(UE_list->UE_sched_ctrl[i]); + + if (UE_scheduling_control->cdrx_configured == TRUE) { + + if ((UE_scheduling_control->bypass_cdrx == FALSE) && (UE_scheduling_control->in_active_time == FALSE)) { + continue; + } + } + rntiTable[i] = UE_RNTI(module_idP, i); // Valid element and is not the actual CC_id in the list if (UE_list->active[i] == TRUE && diff --git a/openair2/RRC/LTE/L2_interface_common.c b/openair2/RRC/LTE/L2_interface_common.c index c17318d601..0afa6cd18f 100644 --- a/openair2/RRC/LTE/L2_interface_common.c +++ b/openair2/RRC/LTE/L2_interface_common.c @@ -38,7 +38,7 @@ #include "common/ran_context.h" #if defined(ENABLE_ITTI) -# include "intertask_interface.h" + #include "intertask_interface.h" #endif //#define RRC_DATA_REQ_DEBUG @@ -49,21 +49,21 @@ extern RAN_CONTEXT_t RC; //------------------------------------------------------------------------------ uint8_t rrc_data_req( - const protocol_ctxt_t* const ctxt_pP, + const protocol_ctxt_t *const ctxt_pP, const rb_id_t rb_idP, const mui_t muiP, const confirm_t confirmP, const sdu_size_t sdu_sizeP, - uint8_t* const buffer_pP, + uint8_t *const buffer_pP, const pdcp_transmission_mode_t modeP ) //------------------------------------------------------------------------------ { - if(sdu_sizeP == 255) - { + if(sdu_sizeP == 255) { LOG_I(RRC,"sdu_sizeP == 255"); return FALSE; } + MSC_LOG_TX_MESSAGE( ctxt_pP->enb_flag ? MSC_RRC_ENB : MSC_RRC_UE, ctxt_pP->enb_flag ? MSC_PDCP_ENB : MSC_PDCP_UE, @@ -74,20 +74,16 @@ rrc_data_req( ctxt_pP->rnti, muiP, sdu_sizeP); - #if defined(ENABLE_ITTI) { MessageDef *message_p; // Uses a new buffer to avoid issue with PDCP buffer content that could be changed by PDCP (asynchronous message handling). uint8_t *message_buffer; - message_buffer = itti_malloc ( ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE, ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE, sdu_sizeP); - memcpy (message_buffer, buffer_pP, sdu_sizeP); - message_p = itti_alloc_new_message (ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE, RRC_DCCH_DATA_REQ); RRC_DCCH_DATA_REQ (message_p).frame = ctxt_pP->frame; RRC_DCCH_DATA_REQ (message_p).enb_flag = ctxt_pP->enb_flag; @@ -102,7 +98,6 @@ rrc_data_req( RRC_DCCH_DATA_REQ (message_p).module_id = ctxt_pP->module_id; RRC_DCCH_DATA_REQ (message_p).rnti = ctxt_pP->rnti; RRC_DCCH_DATA_REQ (message_p).eNB_index = ctxt_pP->eNB_index; - itti_send_msg_to_task ( ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE, ctxt_pP->instance, @@ -117,7 +112,6 @@ rrc_data_req( #endif return TRUE; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway. - } #else return pdcp_data_req ( @@ -135,10 +129,10 @@ rrc_data_req( //------------------------------------------------------------------------------ void rrc_data_ind( - const protocol_ctxt_t* const ctxt_pP, + const protocol_ctxt_t *const ctxt_pP, const rb_id_t Srb_id, const sdu_size_t sdu_sizeP, - const uint8_t* const buffer_pP + const uint8_t *const buffer_pP ) //------------------------------------------------------------------------------ { @@ -162,10 +156,8 @@ rrc_data_ind( MessageDef *message_p; // Uses a new buffer to avoid issue with PDCP buffer content that could be changed by PDCP (asynchronous message handling). uint8_t *message_buffer; - message_buffer = itti_malloc (ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE, ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE, sdu_sizeP); memcpy (message_buffer, buffer_pP, sdu_sizeP); - message_p = itti_alloc_new_message (ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE, RRC_DCCH_DATA_IND); RRC_DCCH_DATA_IND (message_p).frame = ctxt_pP->frame; RRC_DCCH_DATA_IND (message_p).dcch_index = DCCH_index; @@ -174,16 +166,13 @@ rrc_data_ind( RRC_DCCH_DATA_IND (message_p).rnti = ctxt_pP->rnti; RRC_DCCH_DATA_IND (message_p).module_id = ctxt_pP->module_id; RRC_DCCH_DATA_IND (message_p).eNB_index = ctxt_pP->eNB_index; - itti_send_msg_to_task (ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE, ctxt_pP->instance, message_p); } #else - - rrc_eNB_decode_dcch( - ctxt_pP, - DCCH_index, - buffer_pP, - sdu_sizeP); - + rrc_eNB_decode_dcch( + ctxt_pP, + DCCH_index, + buffer_pP, + sdu_sizeP); #endif } diff --git a/openair2/RRC/LTE/L2_interface_ue.c b/openair2/RRC/LTE/L2_interface_ue.c index 9dfbeed61e..94a0f175d0 100644 --- a/openair2/RRC/LTE/L2_interface_ue.c +++ b/openair2/RRC/LTE/L2_interface_ue.c @@ -38,7 +38,7 @@ #if defined(ENABLE_ITTI) -# include "intertask_interface.h" + #include "intertask_interface.h" #endif //#define RRC_DATA_REQ_DEBUG @@ -53,67 +53,62 @@ mac_rrc_data_req_ue( const frame_t frameP, const rb_id_t Srb_id, const uint8_t Nb_tb, - uint8_t* const buffer_pP, + uint8_t *const buffer_pP, const uint8_t eNB_index, const uint8_t mbsfn_sync_area ) //-------------------------------------------------------------------------- { - LOG_D(RRC,"[eNB %d] mac_rrc_data_req to SRB ID=%d\n",Mod_idP,Srb_id); - - #if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) - LOG_D(RRC,"[UE %d] Frame %d Filling SL DISCOVERY SRB_ID %d\n",Mod_idP,frameP,Srb_id); - LOG_D(RRC,"[UE %d] Frame %d buffer_pP status %d,\n",Mod_idP,frameP, UE_rrc_inst[Mod_idP].SL_Discovery[eNB_index].Tx_buffer.payload_size); - - //TTN (for D2D) - if (Srb_id == SL_DISCOVERY && UE_rrc_inst[Mod_idP].SL_Discovery[eNB_index].Tx_buffer.payload_size > 0){ - memcpy(&buffer_pP[0],&UE_rrc_inst[Mod_idP].SL_Discovery[eNB_index].Tx_buffer.Payload[0],UE_rrc_inst[Mod_idP].SL_Discovery[eNB_index].Tx_buffer.payload_size); - uint8_t Ret_size=UE_rrc_inst[Mod_idP].SL_Discovery[eNB_index].Tx_buffer.payload_size; - LOG_I(RRC,"[UE %d] Sending SL_Discovery, size %d bytes\n",Mod_idP,Ret_size); - UE_rrc_inst[Mod_idP].SL_Discovery[eNB_index].Tx_buffer.payload_size = 0; - return(Ret_size); - } -#endif + LOG_D(RRC,"[UE %d] Frame %d Filling SL DISCOVERY SRB_ID %d\n",Mod_idP,frameP,Srb_id); + LOG_D(RRC,"[UE %d] Frame %d buffer_pP status %d,\n",Mod_idP,frameP, UE_rrc_inst[Mod_idP].SL_Discovery[eNB_index].Tx_buffer.payload_size); + + //TTN (for D2D) + if (Srb_id == SL_DISCOVERY && UE_rrc_inst[Mod_idP].SL_Discovery[eNB_index].Tx_buffer.payload_size > 0) { + memcpy(&buffer_pP[0],&UE_rrc_inst[Mod_idP].SL_Discovery[eNB_index].Tx_buffer.Payload[0],UE_rrc_inst[Mod_idP].SL_Discovery[eNB_index].Tx_buffer.payload_size); + uint8_t Ret_size=UE_rrc_inst[Mod_idP].SL_Discovery[eNB_index].Tx_buffer.payload_size; + LOG_I(RRC,"[UE %d] Sending SL_Discovery, size %d bytes\n",Mod_idP,Ret_size); + UE_rrc_inst[Mod_idP].SL_Discovery[eNB_index].Tx_buffer.payload_size = 0; + return(Ret_size); + } +#endif LOG_D(RRC,"[UE %d] Frame %d Filling CCCH SRB_ID %d\n",Mod_idP,frameP,Srb_id); LOG_D(RRC,"[UE %d] Frame %d buffer_pP status %d,\n",Mod_idP,frameP, UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.payload_size); if( (UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.payload_size > 0) ) { - #if defined(ENABLE_ITTI) - { - MessageDef *message_p; - int ccch_size = UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.payload_size; - int sdu_size = sizeof(RRC_MAC_CCCH_DATA_REQ (message_p).sdu); - - if (ccch_size > sdu_size) { - LOG_E(RRC, "SDU larger than CCCH SDU buffer size (%d, %d)", ccch_size, sdu_size); - ccch_size = sdu_size; - } - - message_p = itti_alloc_new_message (TASK_RRC_UE, RRC_MAC_CCCH_DATA_REQ); - RRC_MAC_CCCH_DATA_REQ (message_p).frame = frameP; - RRC_MAC_CCCH_DATA_REQ (message_p).sdu_size = ccch_size; - memset (RRC_MAC_CCCH_DATA_REQ (message_p).sdu, 0, CCCH_SDU_SIZE); - memcpy (RRC_MAC_CCCH_DATA_REQ (message_p).sdu, UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.Payload, ccch_size); - RRC_MAC_CCCH_DATA_REQ (message_p).enb_index = eNB_index; - - itti_send_msg_to_task (TASK_MAC_UE, UE_MODULE_ID_TO_INSTANCE(Mod_idP), message_p); + { + MessageDef *message_p; + int ccch_size = UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.payload_size; + int sdu_size = sizeof(RRC_MAC_CCCH_DATA_REQ (message_p).sdu); + + if (ccch_size > sdu_size) { + LOG_E(RRC, "SDU larger than CCCH SDU buffer size (%d, %d)", ccch_size, sdu_size); + ccch_size = sdu_size; } -#endif - memcpy(&buffer_pP[0],&UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.Payload[0],UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.payload_size); - uint8_t Ret_size=UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.payload_size; - // UE_rrc_inst[Mod_id].Srb0[eNB_index].Tx_buffer.payload_size=0; - UE_rrc_inst[Mod_idP].Info[eNB_index].T300_active = 1; - UE_rrc_inst[Mod_idP].Info[eNB_index].T300_cnt = 0; - // msg("[RRC][UE %d] Sending rach\n",Mod_id); - return(Ret_size); - } else { - return 0; + message_p = itti_alloc_new_message (TASK_RRC_UE, RRC_MAC_CCCH_DATA_REQ); + RRC_MAC_CCCH_DATA_REQ (message_p).frame = frameP; + RRC_MAC_CCCH_DATA_REQ (message_p).sdu_size = ccch_size; + memset (RRC_MAC_CCCH_DATA_REQ (message_p).sdu, 0, CCCH_SDU_SIZE); + memcpy (RRC_MAC_CCCH_DATA_REQ (message_p).sdu, UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.Payload, ccch_size); + RRC_MAC_CCCH_DATA_REQ (message_p).enb_index = eNB_index; + + itti_send_msg_to_task (TASK_MAC_UE, UE_MODULE_ID_TO_INSTANCE(Mod_idP), message_p); } +#endif + memcpy(&buffer_pP[0],&UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.Payload[0],UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.payload_size); + uint8_t Ret_size=UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.payload_size; + // UE_rrc_inst[Mod_id].Srb0[eNB_index].Tx_buffer.payload_size=0; + UE_rrc_inst[Mod_idP].Info[eNB_index].T300_active = 1; + UE_rrc_inst[Mod_idP].Info[eNB_index].T300_cnt = 0; + // msg("[RRC][UE %d] Sending rach\n",Mod_id); + return(Ret_size); + } else { + return 0; + } return(0); } @@ -127,7 +122,7 @@ mac_rrc_data_ind_ue( const sub_frame_t sub_frameP, const rnti_t rntiP, const rb_id_t srb_idP, - const uint8_t* sduP, + const uint8_t *sduP, const sdu_size_t sdu_lenP, const mac_enb_index_t eNB_indexP, const uint8_t mbsfn_sync_areaP @@ -136,139 +131,133 @@ mac_rrc_data_ind_ue( { protocol_ctxt_t ctxt; sdu_size_t sdu_size = 0; - /* for no gcc warnings */ (void)sdu_size; - /* int si_window; */ PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, 0, rntiP, frameP, sub_frameP,eNB_indexP); - if(srb_idP == BCCH) { - LOG_D(RRC,"[UE %d] Received SDU for BCCH on SRB %d from eNB %d\n",module_idP,srb_idP,eNB_indexP); + if(srb_idP == BCCH) { + LOG_D(RRC,"[UE %d] Received SDU for BCCH on SRB %d from eNB %d\n",module_idP,srb_idP,eNB_indexP); +#if defined(ENABLE_ITTI) + { + MessageDef *message_p; + int msg_sdu_size = sizeof(RRC_MAC_BCCH_DATA_IND (message_p).sdu); + + if (sdu_lenP > msg_sdu_size) { + LOG_E(RRC, "SDU larger than BCCH SDU buffer size (%d, %d)", sdu_lenP, msg_sdu_size); + sdu_size = msg_sdu_size; + } else { + sdu_size = sdu_lenP; + } + + message_p = itti_alloc_new_message (TASK_MAC_UE, RRC_MAC_BCCH_DATA_IND); + memset (RRC_MAC_BCCH_DATA_IND (message_p).sdu, 0, BCCH_SDU_SIZE); + RRC_MAC_BCCH_DATA_IND (message_p).frame = frameP; + RRC_MAC_BCCH_DATA_IND (message_p).sub_frame = sub_frameP; + RRC_MAC_BCCH_DATA_IND (message_p).sdu_size = sdu_size; + memcpy (RRC_MAC_BCCH_DATA_IND (message_p).sdu, sduP, sdu_size); + RRC_MAC_BCCH_DATA_IND (message_p).enb_index = eNB_indexP; + RRC_MAC_BCCH_DATA_IND (message_p).rsrq = 30 /* TODO change phy to report rspq */; + RRC_MAC_BCCH_DATA_IND (message_p).rsrp = 45 /* TODO change phy to report rspp */; + itti_send_msg_to_task (TASK_RRC_UE, ctxt.instance, message_p); + } +#else + decode_BCCH_DLSCH_Message(&ctxt,eNB_indexP,(uint8_t *)sduP,sdu_lenP, 0, 0); +#endif + } + + if(srb_idP == PCCH) { + LOG_D(RRC,"[UE %d] Received SDU for PCCH on SRB %d from eNB %d\n",module_idP,srb_idP,eNB_indexP); + decode_PCCH_DLSCH_Message(&ctxt,eNB_indexP,(uint8_t *)sduP,sdu_lenP); + } + if((srb_idP & RAB_OFFSET) == CCCH) { + if (sdu_lenP>0) { + LOG_T(RRC,"[UE %d] Received SDU for CCCH on SRB %d from eNB %d\n",module_idP,srb_idP & RAB_OFFSET,eNB_indexP); #if defined(ENABLE_ITTI) { MessageDef *message_p; - int msg_sdu_size = sizeof(RRC_MAC_BCCH_DATA_IND (message_p).sdu); + int msg_sdu_size = CCCH_SDU_SIZE; if (sdu_lenP > msg_sdu_size) { - LOG_E(RRC, "SDU larger than BCCH SDU buffer size (%d, %d)", sdu_lenP, msg_sdu_size); + LOG_E(RRC, "SDU larger than CCCH SDU buffer size (%d, %d)", sdu_size, msg_sdu_size); sdu_size = msg_sdu_size; } else { - sdu_size = sdu_lenP; + sdu_size = sdu_lenP; } - message_p = itti_alloc_new_message (TASK_MAC_UE, RRC_MAC_BCCH_DATA_IND); - memset (RRC_MAC_BCCH_DATA_IND (message_p).sdu, 0, BCCH_SDU_SIZE); - RRC_MAC_BCCH_DATA_IND (message_p).frame = frameP; - RRC_MAC_BCCH_DATA_IND (message_p).sub_frame = sub_frameP; - RRC_MAC_BCCH_DATA_IND (message_p).sdu_size = sdu_size; - memcpy (RRC_MAC_BCCH_DATA_IND (message_p).sdu, sduP, sdu_size); - RRC_MAC_BCCH_DATA_IND (message_p).enb_index = eNB_indexP; - RRC_MAC_BCCH_DATA_IND (message_p).rsrq = 30 /* TODO change phy to report rspq */; - RRC_MAC_BCCH_DATA_IND (message_p).rsrp = 45 /* TODO change phy to report rspp */; - + message_p = itti_alloc_new_message (TASK_MAC_UE, RRC_MAC_CCCH_DATA_IND); + memset (RRC_MAC_CCCH_DATA_IND (message_p).sdu, 0, CCCH_SDU_SIZE); + memcpy (RRC_MAC_CCCH_DATA_IND (message_p).sdu, sduP, sdu_size); + RRC_MAC_CCCH_DATA_IND (message_p).frame = frameP; + RRC_MAC_CCCH_DATA_IND (message_p).sub_frame = sub_frameP; + RRC_MAC_CCCH_DATA_IND (message_p).sdu_size = sdu_size; + RRC_MAC_CCCH_DATA_IND (message_p).enb_index = eNB_indexP; + RRC_MAC_CCCH_DATA_IND (message_p).rnti = rntiP; itti_send_msg_to_task (TASK_RRC_UE, ctxt.instance, message_p); } #else - decode_BCCH_DLSCH_Message(&ctxt,eNB_indexP,(uint8_t*)sduP,sdu_lenP, 0, 0); + SRB_INFO *Srb_info; + Srb_info = &UE_rrc_inst[module_idP].Srb0[eNB_indexP]; + memcpy(Srb_info->Rx_buffer.Payload,sduP,sdu_lenP); + Srb_info->Rx_buffer.payload_size = sdu_lenP; + rrc_ue_decode_ccch(&ctxt, Srb_info, eNB_indexP); #endif } - - if(srb_idP == PCCH) { - LOG_D(RRC,"[UE %d] Received SDU for PCCH on SRB %d from eNB %d\n",module_idP,srb_idP,eNB_indexP); - decode_PCCH_DLSCH_Message(&ctxt,eNB_indexP,(uint8_t*)sduP,sdu_lenP); - } - if((srb_idP & RAB_OFFSET) == CCCH) { - if (sdu_lenP>0) { - LOG_T(RRC,"[UE %d] Received SDU for CCCH on SRB %d from eNB %d\n",module_idP,srb_idP & RAB_OFFSET,eNB_indexP); - -#if defined(ENABLE_ITTI) - { - MessageDef *message_p; - int msg_sdu_size = CCCH_SDU_SIZE; - - if (sdu_lenP > msg_sdu_size) { - LOG_E(RRC, "SDU larger than CCCH SDU buffer size (%d, %d)", sdu_size, msg_sdu_size); - sdu_size = msg_sdu_size; - } else { - sdu_size = sdu_lenP; - } - - message_p = itti_alloc_new_message (TASK_MAC_UE, RRC_MAC_CCCH_DATA_IND); - memset (RRC_MAC_CCCH_DATA_IND (message_p).sdu, 0, CCCH_SDU_SIZE); - memcpy (RRC_MAC_CCCH_DATA_IND (message_p).sdu, sduP, sdu_size); - RRC_MAC_CCCH_DATA_IND (message_p).frame = frameP; - RRC_MAC_CCCH_DATA_IND (message_p).sub_frame = sub_frameP; - RRC_MAC_CCCH_DATA_IND (message_p).sdu_size = sdu_size; - RRC_MAC_CCCH_DATA_IND (message_p).enb_index = eNB_indexP; - RRC_MAC_CCCH_DATA_IND (message_p).rnti = rntiP; - itti_send_msg_to_task (TASK_RRC_UE, ctxt.instance, message_p); - } -#else - SRB_INFO *Srb_info; - Srb_info = &UE_rrc_inst[module_idP].Srb0[eNB_indexP]; - memcpy(Srb_info->Rx_buffer.Payload,sduP,sdu_lenP); - Srb_info->Rx_buffer.payload_size = sdu_lenP; - rrc_ue_decode_ccch(&ctxt, Srb_info, eNB_indexP); -#endif - } - } + } #if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0)) - if ((srb_idP & RAB_OFFSET) == MCCH) { - LOG_T(RRC,"[UE %d] Frame %d: Received SDU on MBSFN sync area %d for MCCH on SRB %d from eNB %d\n", - module_idP,frameP, mbsfn_sync_areaP, srb_idP & RAB_OFFSET,eNB_indexP); - + if ((srb_idP & RAB_OFFSET) == MCCH) { + LOG_T(RRC,"[UE %d] Frame %d: Received SDU on MBSFN sync area %d for MCCH on SRB %d from eNB %d\n", + module_idP,frameP, mbsfn_sync_areaP, srb_idP & RAB_OFFSET,eNB_indexP); #if defined(ENABLE_ITTI) - { - MessageDef *message_p; - int msg_sdu_size = sizeof(RRC_MAC_MCCH_DATA_IND (message_p).sdu); - - if (sdu_size > msg_sdu_size) { - LOG_E(RRC, "SDU larger than MCCH SDU buffer size (%d, %d)", sdu_size, msg_sdu_size); - sdu_size = msg_sdu_size; - } + { + MessageDef *message_p; + int msg_sdu_size = sizeof(RRC_MAC_MCCH_DATA_IND (message_p).sdu); - message_p = itti_alloc_new_message (TASK_MAC_UE, RRC_MAC_MCCH_DATA_IND); - RRC_MAC_MCCH_DATA_IND (message_p).frame = frameP; - RRC_MAC_MCCH_DATA_IND (message_p).sub_frame = sub_frameP; - RRC_MAC_MCCH_DATA_IND (message_p).sdu_size = sdu_lenP; - memset (RRC_MAC_MCCH_DATA_IND (message_p).sdu, 0, MCCH_SDU_SIZE); - memcpy (RRC_MAC_MCCH_DATA_IND (message_p).sdu, sduP, sdu_lenP); - RRC_MAC_MCCH_DATA_IND (message_p).enb_index = eNB_indexP; - RRC_MAC_MCCH_DATA_IND (message_p).mbsfn_sync_area = mbsfn_sync_areaP; - itti_send_msg_to_task (TASK_RRC_UE, ctxt.instance, message_p); + if (sdu_size > msg_sdu_size) { + LOG_E(RRC, "SDU larger than MCCH SDU buffer size (%d, %d)", sdu_size, msg_sdu_size); + sdu_size = msg_sdu_size; } + + message_p = itti_alloc_new_message (TASK_MAC_UE, RRC_MAC_MCCH_DATA_IND); + RRC_MAC_MCCH_DATA_IND (message_p).frame = frameP; + RRC_MAC_MCCH_DATA_IND (message_p).sub_frame = sub_frameP; + RRC_MAC_MCCH_DATA_IND (message_p).sdu_size = sdu_lenP; + memset (RRC_MAC_MCCH_DATA_IND (message_p).sdu, 0, MCCH_SDU_SIZE); + memcpy (RRC_MAC_MCCH_DATA_IND (message_p).sdu, sduP, sdu_lenP); + RRC_MAC_MCCH_DATA_IND (message_p).enb_index = eNB_indexP; + RRC_MAC_MCCH_DATA_IND (message_p).mbsfn_sync_area = mbsfn_sync_areaP; + itti_send_msg_to_task (TASK_RRC_UE, ctxt.instance, message_p); + } #else - decode_MCCH_Message(&ctxt, eNB_indexP, sduP, sdu_lenP, mbsfn_sync_areaP); + decode_MCCH_Message(&ctxt, eNB_indexP, sduP, sdu_lenP, mbsfn_sync_areaP); #endif - } - //TTN (for D2D) - if(srb_idP == SL_DISCOVERY) { - LOG_I(RRC,"[UE %d] Received SDU (%d bytes) for SL_DISCOVERY on SRB %d from eNB %d\n",module_idP, sdu_lenP, srb_idP,eNB_indexP); - decode_SL_Discovery_Message(&ctxt, eNB_indexP, sduP, sdu_lenP); - } + } -#endif // #if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0)) + //TTN (for D2D) + if(srb_idP == SL_DISCOVERY) { + LOG_I(RRC,"[UE %d] Received SDU (%d bytes) for SL_DISCOVERY on SRB %d from eNB %d\n",module_idP, sdu_lenP, srb_idP,eNB_indexP); + decode_SL_Discovery_Message(&ctxt, eNB_indexP, sduP, sdu_lenP); + } +#endif // #if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0)) return(0); - } //------------------------------------------------------------------------------ uint8_t rrc_data_req_ue( - const protocol_ctxt_t* const ctxt_pP, + const protocol_ctxt_t *const ctxt_pP, const rb_id_t rb_idP, const mui_t muiP, const confirm_t confirmP, const sdu_size_t sdu_sizeP, - uint8_t* const buffer_pP, + uint8_t *const buffer_pP, const pdcp_transmission_mode_t modeP ) //------------------------------------------------------------------------------ @@ -283,20 +272,16 @@ rrc_data_req_ue( ctxt_pP->rnti, muiP, sdu_sizeP); - #if defined(ENABLE_ITTI) { MessageDef *message_p; // Uses a new buffer to avoid issue with PDCP buffer content that could be changed by PDCP (asynchronous message handling). uint8_t *message_buffer; - message_buffer = itti_malloc ( ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE, ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE, sdu_sizeP); - memcpy (message_buffer, buffer_pP, sdu_sizeP); - message_p = itti_alloc_new_message (ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE, RRC_DCCH_DATA_REQ); RRC_DCCH_DATA_REQ (message_p).frame = ctxt_pP->frame; RRC_DCCH_DATA_REQ (message_p).enb_flag = ctxt_pP->enb_flag; @@ -309,13 +294,11 @@ rrc_data_req_ue( RRC_DCCH_DATA_REQ (message_p).module_id = ctxt_pP->module_id; RRC_DCCH_DATA_REQ (message_p).rnti = ctxt_pP->rnti; RRC_DCCH_DATA_REQ (message_p).eNB_index = ctxt_pP->eNB_index; - itti_send_msg_to_task ( TASK_PDCP_UE, ctxt_pP->instance, message_p); return TRUE; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway. - } #else return pdcp_data_req ( @@ -330,34 +313,30 @@ rrc_data_req_ue( #if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) ,NULL, NULL #endif - ); + ); #endif } //------------------------------------------------------------------------------ void rrc_data_ind_ue( - const protocol_ctxt_t* const ctxt_pP, + const protocol_ctxt_t *const ctxt_pP, const rb_id_t Srb_id, const sdu_size_t sdu_sizeP, - const uint8_t* const buffer_pP + const uint8_t *const buffer_pP ) //------------------------------------------------------------------------------ { rb_id_t DCCH_index = Srb_id; - - LOG_I(RRC, "[UE %x] Frame %d: received a DCCH %d message on SRB %d with Size %d from eNB %d\n", - ctxt_pP->module_id, ctxt_pP->frame, DCCH_index,Srb_id,sdu_sizeP, ctxt_pP->eNB_index); - + LOG_I(RRC, "[UE %x] Frame %d: received a DCCH %d message on SRB %d with Size %d from eNB %d\n", + ctxt_pP->module_id, ctxt_pP->frame, DCCH_index,Srb_id,sdu_sizeP, ctxt_pP->eNB_index); #if defined(ENABLE_ITTI) { MessageDef *message_p; // Uses a new buffer to avoid issue with PDCP buffer content that could be changed by PDCP (asynchronous message handling). uint8_t *message_buffer; - message_buffer = itti_malloc (ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE, ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE, sdu_sizeP); memcpy (message_buffer, buffer_pP, sdu_sizeP); - message_p = itti_alloc_new_message (ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE, RRC_DCCH_DATA_IND); RRC_DCCH_DATA_IND (message_p).frame = ctxt_pP->frame; RRC_DCCH_DATA_IND (message_p).dcch_index = DCCH_index; @@ -366,24 +345,20 @@ rrc_data_ind_ue( RRC_DCCH_DATA_IND (message_p).rnti = ctxt_pP->rnti; RRC_DCCH_DATA_IND (message_p).module_id = ctxt_pP->module_id; RRC_DCCH_DATA_IND (message_p).eNB_index = ctxt_pP->eNB_index; - itti_send_msg_to_task (TASK_RRC_UE, ctxt_pP->instance, message_p); } #else - -//#warning "LG put 0 to arg4 that is eNB index" - rrc_ue_decode_dcch( - ctxt_pP, - DCCH_index, - buffer_pP, - 0); - + //#warning "LG put 0 to arg4 that is eNB index" + rrc_ue_decode_dcch( + ctxt_pP, + DCCH_index, + buffer_pP, + 0); #endif } //-------------------------------------------------------------------------------------------// -void rrc_in_sync_ind(module_id_t Mod_idP, frame_t frameP, uint16_t eNB_index) -{ +void rrc_in_sync_ind(module_id_t Mod_idP, frame_t frameP, uint16_t eNB_index) { //-------------------------------------------------------------------------------------------// #if defined(ENABLE_ITTI) { @@ -392,7 +367,6 @@ void rrc_in_sync_ind(module_id_t Mod_idP, frame_t frameP, uint16_t eNB_index) message_p = itti_alloc_new_message (TASK_MAC_UE, RRC_MAC_IN_SYNC_IND); RRC_MAC_IN_SYNC_IND (message_p).frame = frameP; RRC_MAC_IN_SYNC_IND (message_p).enb_index = eNB_index; - itti_send_msg_to_task (TASK_RRC_UE, UE_MODULE_ID_TO_INSTANCE(Mod_idP), message_p); } #else @@ -406,25 +380,22 @@ void rrc_in_sync_ind(module_id_t Mod_idP, frame_t frameP, uint16_t eNB_index) } //-------------------------------------------------------------------------------------------// -void rrc_out_of_sync_ind(module_id_t Mod_idP, frame_t frameP, uint16_t eNB_index) -{ +void rrc_out_of_sync_ind(module_id_t Mod_idP, frame_t frameP, uint16_t eNB_index) { //-------------------------------------------------------------------------------------------// if (UE_rrc_inst[Mod_idP].Info[eNB_index].N310_cnt>10) LOG_I(RRC,"[UE %d] Frame %d: OUT OF SYNC FROM eNB %d (T310 active %d : T310 %d, N310 %d, N311 %d)\n ", - Mod_idP,frameP,eNB_index, - UE_rrc_inst[Mod_idP].Info[eNB_index].T300_active, - UE_rrc_inst[Mod_idP].Info[eNB_index].T310_cnt, - UE_rrc_inst[Mod_idP].Info[eNB_index].N310_cnt, - UE_rrc_inst[Mod_idP].Info[eNB_index].N311_cnt); - + Mod_idP,frameP,eNB_index, + UE_rrc_inst[Mod_idP].Info[eNB_index].T300_active, + UE_rrc_inst[Mod_idP].Info[eNB_index].T310_cnt, + UE_rrc_inst[Mod_idP].Info[eNB_index].N310_cnt, + UE_rrc_inst[Mod_idP].Info[eNB_index].N311_cnt); + #if defined(ENABLE_ITTI) { MessageDef *message_p; - message_p = itti_alloc_new_message (TASK_MAC_UE, RRC_MAC_OUT_OF_SYNC_IND); RRC_MAC_OUT_OF_SYNC_IND (message_p).frame = frameP; RRC_MAC_OUT_OF_SYNC_IND (message_p).enb_index = eNB_index; - itti_send_msg_to_task (TASK_RRC_UE, UE_MODULE_ID_TO_INSTANCE(Mod_idP), message_p); } #else @@ -447,16 +418,13 @@ mac_UE_get_rrc_status( } //-------------------------------------------------------------------------------------------// -int mac_ue_ccch_success_ind(module_id_t Mod_idP, uint8_t eNB_index) -{ +int mac_ue_ccch_success_ind(module_id_t Mod_idP, uint8_t eNB_index) { //-------------------------------------------------------------------------------------------// #if defined(ENABLE_ITTI) { MessageDef *message_p; - message_p = itti_alloc_new_message (TASK_MAC_UE, RRC_MAC_CCCH_DATA_CNF); RRC_MAC_CCCH_DATA_CNF (message_p).enb_index = eNB_index; - itti_send_msg_to_task (TASK_RRC_UE, UE_MODULE_ID_TO_INSTANCE(Mod_idP), message_p); } #else diff --git a/openair2/RRC/LTE/MESSAGES/asn1_msg.c b/openair2/RRC/LTE/MESSAGES/asn1_msg.c index 53e94ab828..14aeb895e8 100644 --- a/openair2/RRC/LTE/MESSAGES/asn1_msg.c +++ b/openair2/RRC/LTE/MESSAGES/asn1_msg.c @@ -317,6 +317,110 @@ uint8_t do_MIB_SL(const protocol_ctxt_t *const ctxt_pP, const uint8_t eNB_index, return((enc_rval.encoded+7)/8); } +// Begin add DRX SSR 2018-11 +LTE_DRX_Config_t *do_DrxConfig(uint8_t Mod_id, int CC_id, RrcConfigurationReq *configuration, LTE_UE_EUTRA_Capability_t *UEcap) +{ + // Begin add DRX SSR 2018-12 + LTE_DRX_Config_t *drxConfig = NULL; + BIT_STRING_t *featureGroupIndicators = NULL; + bool ueSupportCdrxShortFlag = false; + bool ueSupportCdrxLongFlag = false; + if (UEcap) { + featureGroupIndicators = UEcap->featureGroupIndicators; + if (featureGroupIndicators) { + if (featureGroupIndicators->size > 1 || (featureGroupIndicators->size == 1 && featureGroupIndicators->bits_unused < 4)) { + ueSupportCdrxShortFlag = ((featureGroupIndicators->buf[0] & (uint8_t) 0x10) > 0); + ueSupportCdrxLongFlag = ((featureGroupIndicators->buf[0] & (uint8_t) 0x08) > 0); + LOG_I(RRC,"[do_DrxConfig] featureGroupIndicators->buf[0]: %x\n", featureGroupIndicators->buf[0]); + } else LOG_W(RRC,"[do_DrxConfig] Not enough featureGroupIndicators bits\n"); + } else LOG_W(RRC,"[do_DrxConfig] No featureGroupIndicators pointer\n"); + } else LOG_W(RRC,"[do_DrxConfig] No UEcap pointer\n"); + // End add DRX SSR 2018-12 + + drxConfig = (LTE_DRX_Config_t *) malloc(sizeof(LTE_DRX_Config_t)); + if (drxConfig == NULL) return NULL; + memset(drxConfig, 0, sizeof(LTE_DRX_Config_t)); + + if (!ueSupportCdrxLongFlag || configuration == NULL) { + drxConfig->present = LTE_DRX_Config_PR_release; + } else { + drxConfig->present = configuration->radioresourceconfig[CC_id].drx_Config_present; + } + + if (drxConfig->present != LTE_DRX_Config_PR_NOTHING) { + if (drxConfig->present == LTE_DRX_Config_PR_release) { + drxConfig->choice.release = (NULL_t) 0; + } else { + drxConfig->choice.setup.onDurationTimer = configuration->radioresourceconfig[CC_id].drx_onDurationTimer; + drxConfig->choice.setup.drx_InactivityTimer = configuration->radioresourceconfig[CC_id].drx_InactivityTimer; + drxConfig->choice.setup.drx_RetransmissionTimer = configuration->radioresourceconfig[CC_id].drx_RetransmissionTimer; + drxConfig->choice.setup.longDRX_CycleStartOffset.present = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset_present; + switch (drxConfig->choice.setup.longDRX_CycleStartOffset.present) { + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf10: + drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf10 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf20: + drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf20 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf32: + drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf32 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf40: + drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf40 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf64: + drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf64 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf80: + drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf80 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf128: + drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf128 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf160: + drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf160 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf256: + drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf256 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf320: + drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf320 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf512: + drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf512 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf640: + drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf640 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf1024: + drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf1024 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf1280: + drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf1280 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf2048: + drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf2048 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset; + break; + case LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf2560: + drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf2560 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset; + break; + default: + break; + } + if (!ueSupportCdrxShortFlag || configuration->radioresourceconfig[CC_id].drx_shortDrx_ShortCycleTimer == 0) { + drxConfig->choice.setup.shortDRX = NULL; + } else { + drxConfig->choice.setup.shortDRX = MALLOC(sizeof(struct LTE_DRX_Config__setup__shortDRX)); + memset(drxConfig->choice.setup.shortDRX, 0, sizeof(struct LTE_DRX_Config__setup__shortDRX)); + drxConfig->choice.setup.shortDRX->shortDRX_Cycle = configuration->radioresourceconfig[CC_id].drx_shortDrx_Cycle; + drxConfig->choice.setup.shortDRX->drxShortCycleTimer = configuration->radioresourceconfig[CC_id].drx_shortDrx_ShortCycleTimer; + } + } + } + return drxConfig; +} +// End add DRX SSR 2018-11 + uint8_t do_SIB1(rrc_eNB_carrier_data_t *carrier, int Mod_id,int CC_id @@ -911,7 +1015,7 @@ uint8_t do_SIB23(uint8_t Mod_id, struct LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member *sib2_part,*sib3_part; #if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) - int eMTC_configured=configuration->eMTC_configured; + int eMTC_configured = configuration->eMTC_configured; struct LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member *sib18_part, *sib19_part, *sib21_part; LTE_SL_CommRxPoolList_r12_t *SL_CommRxPoolList; //for SIB18 struct LTE_SL_CommResourcePool_r12 *SL_CommResourcePool; //for SIB18 @@ -2357,6 +2461,7 @@ do_RRCConnectionSetup( dl_ccch_msg.message.present = LTE_DL_CCCH_MessageType_PR_c1; dl_ccch_msg.message.choice.c1.present = LTE_DL_CCCH_MessageType__c1_PR_rrcConnectionSetup; rrcConnectionSetup = &dl_ccch_msg.message.choice.c1.choice.rrcConnectionSetup; + LTE_MAC_MainConfig_t *mac_MainConfig = NULL; // RRCConnectionSetup // Configure SRB1 @@ -2475,30 +2580,34 @@ do_RRCConnectionSetup( physicalConfigDedicated2->tpc_PDCCH_ConfigPUSCH->choice.setup.tpc_RNTI.buf[0]=0x22; physicalConfigDedicated2->tpc_PDCCH_ConfigPUSCH->choice.setup.tpc_RNTI.buf[1]=0x34+ue_context_pP->local_uid; physicalConfigDedicated2->tpc_PDCCH_ConfigPUSCH->choice.setup.tpc_RNTI.bits_unused=0; - // CQI ReportConfig - physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportModeAperiodic=CALLOC(1,sizeof(*physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportModeAperiodic)); + + /* CQI ReportConfig */ + // Aperiodic configuration + physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportModeAperiodic = CALLOC(1, sizeof(*physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportModeAperiodic)); + #if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0)) - *physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportModeAperiodic= LTE_CQI_ReportModeAperiodic_rm30; + *physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportModeAperiodic = LTE_CQI_ReportModeAperiodic_rm30; // HLC CQI, no PMI #else - *physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportModeAperiodic=LTE_CQI_ReportConfig__cqi_ReportModeAperiodic_rm30; // HLC CQI, no PMI + *physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportModeAperiodic = LTE_CQI_ReportConfig__cqi_ReportModeAperiodic_rm30; // HLC CQI, no PMI #endif - physicalConfigDedicated2->cqi_ReportConfig->nomPDSCH_RS_EPRE_Offset = 0; // 0 dB - //physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic=NULL; - physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic=CALLOC(1,sizeof(*physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic)); - physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic->present = LTE_CQI_ReportPeriodic_PR_release; + + physicalConfigDedicated2->cqi_ReportConfig->nomPDSCH_RS_EPRE_Offset = 0; // 0 dB (int -1...6) + + // Periodic configuration + physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic = CALLOC(1, sizeof(*physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic)); + physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic->present = LTE_CQI_ReportPeriodic_PR_release; /* - physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic->present = CQI_ReportPeriodic_PR_setup; - physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_PUCCH_ResourceIndex = 0; // n2_pucch - physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_pmi_ConfigIndex = 0; // Icqi/pmi + physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic->present = CQI_ReportPeriodic_PR_setup; + physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_PUCCH_ResourceIndex = 0; // n2_pucch + physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_pmi_ConfigIndex = 0; // Icqi/pmi physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_FormatIndicatorPeriodic.present = CQI_ReportPeriodic__setup__cqi_FormatIndicatorPeriodic_PR_subbandCQI; // subband CQI - physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_FormatIndicatorPeriodic.choice.subbandCQI.k=4; - - physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.ri_ConfigIndex=NULL; - physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.simultaneousAckNackAndCQI=0; + physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_FormatIndicatorPeriodic.choice.subbandCQI.k = 4; + physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.ri_ConfigIndex = NULL; + physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.simultaneousAckNackAndCQI = 0; */ //soundingRS-UL-ConfigDedicated - if (rrc->srs_enable[CC_id]==1) { + if (rrc->srs_enable[CC_id] == 1) { physicalConfigDedicated2->soundingRS_UL_ConfigDedicated->present = LTE_SoundingRS_UL_ConfigDedicated_PR_setup; physicalConfigDedicated2->soundingRS_UL_ConfigDedicated->choice.setup.srs_Bandwidth = LTE_SoundingRS_UL_ConfigDedicated__setup__srs_Bandwidth_bw0; @@ -2667,22 +2776,33 @@ do_RRCConnectionSetup( rrcConnectionSetup->criticalExtensions.choice.c1.choice.rrcConnectionSetup_r8.radioResourceConfigDedicated.physicalConfigDedicated = physicalConfigDedicated2; rrcConnectionSetup->criticalExtensions.choice.c1.choice.rrcConnectionSetup_r8.radioResourceConfigDedicated.mac_MainConfig = CALLOC(1,sizeof(struct LTE_RadioResourceConfigDedicated__mac_MainConfig)); rrcConnectionSetup->criticalExtensions.choice.c1.choice.rrcConnectionSetup_r8.radioResourceConfigDedicated.mac_MainConfig->present = LTE_RadioResourceConfigDedicated__mac_MainConfig_PR_explicitValue; - LTE_MAC_MainConfig_t *mac_MainConfig = &rrcConnectionSetup->criticalExtensions.choice.c1.choice.rrcConnectionSetup_r8.radioResourceConfigDedicated.mac_MainConfig->choice.explicitValue; + + /* MAC MainConfig */ + mac_MainConfig = &rrcConnectionSetup->criticalExtensions.choice.c1.choice.rrcConnectionSetup_r8.radioResourceConfigDedicated.mac_MainConfig->choice.explicitValue; + + //* ul_SCH_Config *// mac_MainConfig->ul_SCH_Config = CALLOC(1, sizeof(*mac_MainConfig->ul_SCH_Config)); long *maxHARQ_Tx = CALLOC(1, sizeof(long)); *maxHARQ_Tx = LTE_MAC_MainConfig__ul_SCH_Config__maxHARQ_Tx_n5; long *periodicBSR_Timer = CALLOC(1, sizeof(long)); - *periodicBSR_Timer = LTE_PeriodicBSR_Timer_r12_sf64; - mac_MainConfig->ul_SCH_Config->maxHARQ_Tx = maxHARQ_Tx; + *periodicBSR_Timer = LTE_PeriodicBSR_Timer_r12_sf64; // LTE_PeriodicBSR_Timer_r12_infinity + + mac_MainConfig->ul_SCH_Config->maxHARQ_Tx = maxHARQ_Tx; // max number of UL HARQ transmission mac_MainConfig->ul_SCH_Config->periodicBSR_Timer = periodicBSR_Timer; - mac_MainConfig->ul_SCH_Config->retxBSR_Timer = LTE_RetxBSR_Timer_r12_sf320; + mac_MainConfig->ul_SCH_Config->retxBSR_Timer = LTE_RetxBSR_Timer_r12_sf320; // LTE_RetxBSR_Timer_r12_sf5120 // regular BSR timer mac_MainConfig->ul_SCH_Config->ttiBundling = 0; // FALSE + + //* timeAlignmentTimerDedicated *// mac_MainConfig->timeAlignmentTimerDedicated = LTE_TimeAlignmentTimer_infinity; + + //* DRX Config *// mac_MainConfig->drx_Config = NULL; + + //* PHR Config *// mac_MainConfig->phr_Config = CALLOC(1, sizeof(*mac_MainConfig->phr_Config)); mac_MainConfig->phr_Config->present = LTE_MAC_MainConfig__phr_Config_PR_setup; - mac_MainConfig->phr_Config->choice.setup.periodicPHR_Timer = LTE_MAC_MainConfig__phr_Config__setup__periodicPHR_Timer_sf20; // sf20 = 20 subframes - mac_MainConfig->phr_Config->choice.setup.prohibitPHR_Timer = LTE_MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf20; // sf20 = 20 subframes + mac_MainConfig->phr_Config->choice.setup.periodicPHR_Timer = LTE_MAC_MainConfig__phr_Config__setup__periodicPHR_Timer_sf20; // sf20 = 20 subframes // LTE_MAC_MainConfig__phr_Config__setup__periodicPHR_Timer_infinity + mac_MainConfig->phr_Config->choice.setup.prohibitPHR_Timer = LTE_MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf20; // sf20 = 20 subframes // LTE_MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf1000 mac_MainConfig->phr_Config->choice.setup.dl_PathlossChange = LTE_MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB1; // Value dB1 =1 dB, dB3 = 3 dB if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { @@ -2703,11 +2823,7 @@ do_RRCConnectionSetup( LOG_D(RRC,"RRCConnectionSetup Encoded %zd bits (%zd bytes) \n", enc_rval.encoded,(enc_rval.encoded+7)/8); - // FREEMEM(SRB_list); - // free(SRB1_config); - // free(SRB1_rlc_config); - // free(SRB1_lchan_config); - // free(SRB1_ul_SpecificParameters); + return((enc_rval.encoded+7)/8); } diff --git a/openair2/RRC/LTE/MESSAGES/asn1_msg.h b/openair2/RRC/LTE/MESSAGES/asn1_msg.h index eb9572f4d2..7022f9e6e0 100644 --- a/openair2/RRC/LTE/MESSAGES/asn1_msg.h +++ b/openair2/RRC/LTE/MESSAGES/asn1_msg.h @@ -70,6 +70,15 @@ uint8_t do_MIB(rrc_eNB_carrier_data_t *carrier, uint32_t N_RB_DL, uint32_t phich #endif ); +/** +\brief Generate configuration for DRX_Config (Add DRX SSR 2018-11) +@param Mod_id Instance of eNB +@param CC_id Id of component to configure +@param configuration Pointer Configuration Request structure +@param UEcap Pointer Configuration UE capablities +@return DRX_Config structure pointer or NULL => error*/ +LTE_DRX_Config_t *do_DrxConfig(uint8_t Mod_id, int CC_id, RrcConfigurationReq *configuration, LTE_UE_EUTRA_Capability_t *UEcap); + /** \brief Generate configuration for SIB1 (eNB). @param carrier pointer to Carrier information diff --git a/openair2/RRC/LTE/rrc_UE.c b/openair2/RRC/LTE/rrc_UE.c index a00bc53759..a0eab1c249 100644 --- a/openair2/RRC/LTE/rrc_UE.c +++ b/openair2/RRC/LTE/rrc_UE.c @@ -140,9 +140,9 @@ static uint8_t check_trigger_meas_event( LTE_Q_OffsetRange_t ofs, LTE_Q_OffsetRange_t ocs, long a3_offset, LTE_TimeToTrigger_t ttt); #if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0)) -static void decode_MBSFNAreaConfiguration(module_id_t module_idP, uint8_t eNB_index, frame_t frameP,uint8_t mbsfn_sync_area); -uint8_t rrc_ue_generate_SidelinkUEInformation( const protocol_ctxt_t *const ctxt_pP, const uint8_t eNB_index,LTE_SL_DestinationInfoList_r12_t *destinationInfoList, long *discTxResourceReq, - SL_TRIGGER_t mode); + static void decode_MBSFNAreaConfiguration(module_id_t module_idP, uint8_t eNB_index, frame_t frameP,uint8_t mbsfn_sync_area); + uint8_t rrc_ue_generate_SidelinkUEInformation( const protocol_ctxt_t *const ctxt_pP, const uint8_t eNB_index,LTE_SL_DestinationInfoList_r12_t *destinationInfoList, long *discTxResourceReq, + SL_TRIGGER_t mode); #endif diff --git a/openair2/RRC/LTE/rrc_UE_ral.c b/openair2/RRC/LTE/rrc_UE_ral.c index c972d280d5..d7ace8c242 100644 --- a/openair2/RRC/LTE/rrc_UE_ral.c +++ b/openair2/RRC/LTE/rrc_UE_ral.c @@ -46,8 +46,7 @@ int rrc_ue_ral_delete_all_thresholds_type(unsigned int mod_idP, ral_link_param_t rrc_ral_threshold_key_t *keys = NULL; unsigned int num_keys = 0; int return_code = 0; - - rc = obj_hashtable_get_keys(UE_rrc_inst[mod_idP].ral_meas_thresholds, (void*)&keys, &num_keys); + rc = obj_hashtable_get_keys(UE_rrc_inst[mod_idP].ral_meas_thresholds, (void *)&keys, &num_keys); if (rc == HASH_TABLE_OK) { key = keys; @@ -82,10 +81,9 @@ int rrc_ue_ral_delete_threshold(unsigned int mod_idP, ral_link_param_type_t *par { hashtable_rc_t rc; rrc_ral_threshold_key_t ref_key; - memcpy(&ref_key.link_param_type, param_type_pP, sizeof(ral_link_param_type_t)); memcpy(&ref_key.threshold, threshold_pP, sizeof(ral_threshold_t)); - rc = obj_hashtable_remove (UE_rrc_inst[mod_idP].ral_meas_thresholds, (void*)&ref_key, sizeof(rrc_ral_threshold_key_t)); + rc = obj_hashtable_remove (UE_rrc_inst[mod_idP].ral_meas_thresholds, (void *)&ref_key, sizeof(rrc_ral_threshold_key_t)); if (rc == HASH_TABLE_OK) { return 0; @@ -106,135 +104,131 @@ int rrc_ue_ral_handle_configure_threshold_request(unsigned int mod_idP, MessageD MessageDef *message_p = NULL; unsigned int ix_param = 0; unsigned int ix_thresholds = 0; - DevAssert(msg_pP != NULL); - LOG_I(RRC, "[UE %d] Received %s\n", mod_idP, ITTI_MSG_NAME (msg_pP)); configure_threshold_req_p = &RRC_RAL_CONFIGURE_THRESHOLD_REQ(msg_pP); - transaction_id = configure_threshold_req_p->transaction_id; for (ix_param = 0; ix_param < configure_threshold_req_p->num_link_cfg_params; ix_param++) { link_cfg_param_p = &configure_threshold_req_p->link_cfg_params[ix_param]; switch (link_cfg_param_p->th_action) { - case RAL_TH_ACTION_SET_NORMAL_THRESHOLD: - case RAL_TH_ACTION_SET_ONE_SHOT_THRESHOLD: - switch (link_cfg_param_p->link_param_type.choice) { - - case RAL_LINK_PARAM_TYPE_CHOICE_GEN: - switch (link_cfg_param_p->link_param_type._union.link_param_gen) { - case RAL_LINK_PARAM_GEN_DATA_RATE: - case RAL_LINK_PARAM_GEN_SIGNAL_STRENGTH: - case RAL_LINK_PARAM_GEN_SINR: - case RAL_LINK_PARAM_GEN_THROUGHPUT: - case RAL_LINK_PARAM_GEN_PACKET_ERROR_RATE: - message_p = itti_alloc_new_message (TASK_RRC_UE, PHY_MEAS_THRESHOLD_REQ); - PHY_MEAS_THRESHOLD_REQ(message_p).transaction_id = transaction_id; - memcpy (&PHY_MEAS_THRESHOLD_REQ(message_p).cfg_param, (void *) link_cfg_param_p, sizeof(ral_link_cfg_param_t)); - itti_send_msg_to_task (TASK_PHY_UE, ITTI_MSG_INSTANCE(msg_pP), message_p); - break; - - default: - LOG_E(RRC, "Message RRC_RAL_CONFIGURE_THRESHOLD_REQ malformed, unknown link_param_gen %d\n", link_cfg_param_p->link_param_type._union.link_param_gen); - return -1; - } + case RAL_TH_ACTION_SET_NORMAL_THRESHOLD: + case RAL_TH_ACTION_SET_ONE_SHOT_THRESHOLD: + switch (link_cfg_param_p->link_param_type.choice) { + case RAL_LINK_PARAM_TYPE_CHOICE_GEN: + switch (link_cfg_param_p->link_param_type._union.link_param_gen) { + case RAL_LINK_PARAM_GEN_DATA_RATE: + case RAL_LINK_PARAM_GEN_SIGNAL_STRENGTH: + case RAL_LINK_PARAM_GEN_SINR: + case RAL_LINK_PARAM_GEN_THROUGHPUT: + case RAL_LINK_PARAM_GEN_PACKET_ERROR_RATE: + message_p = itti_alloc_new_message (TASK_RRC_UE, PHY_MEAS_THRESHOLD_REQ); + PHY_MEAS_THRESHOLD_REQ(message_p).transaction_id = transaction_id; + memcpy (&PHY_MEAS_THRESHOLD_REQ(message_p).cfg_param, (void *) link_cfg_param_p, sizeof(ral_link_cfg_param_t)); + itti_send_msg_to_task (TASK_PHY_UE, ITTI_MSG_INSTANCE(msg_pP), message_p); + break; + + default: + LOG_E(RRC, "Message RRC_RAL_CONFIGURE_THRESHOLD_REQ malformed, unknown link_param_gen %d\n", link_cfg_param_p->link_param_type._union.link_param_gen); + return -1; + } + + break; + + case RAL_LINK_PARAM_TYPE_CHOICE_QOS: + switch (link_cfg_param_p->link_param_type._union.link_param_qos) { + case RAL_LINK_PARAM_QOS_MAX_NUM_DIF_COS_SUPPORTED: + case RAL_LINK_PARAM_QOS_MIN_PACKET_TRANSFER_DELAY_ALL_COS: + case RAL_LINK_PARAM_QOS_AVG_PACKET_TRANSFER_DELAY_ALL_COS: + case RAL_LINK_PARAM_QOS_MAX_PACKET_TRANSFER_DELAY_ALL_COS: + case RAL_LINK_PARAM_QOS_STD_DEVIATION_PACKET_TRANSFER_DELAY: + case RAL_LINK_PARAM_QOS_PACKET_LOSS_RATE_ALL_COS_FRAME_RATIO: + message_p = itti_alloc_new_message (TASK_RRC_UE, PHY_MEAS_THRESHOLD_REQ); + PHY_MEAS_THRESHOLD_REQ(message_p).transaction_id = transaction_id; + memcpy (&PHY_MEAS_THRESHOLD_REQ(message_p).cfg_param, (void *) link_cfg_param_p, sizeof(ral_link_cfg_param_t)); + itti_send_msg_to_task (TASK_MAC_UE, ITTI_MSG_INSTANCE(msg_pP), message_p); + break; + + default: + LOG_E(RRC, "Message RRC_RAL_CONFIGURE_THRESHOLD_REQ malformed, unknown link_param_qos %d\n", link_cfg_param_p->link_param_type._union.link_param_qos); + return -1; + } + + break; + + case RAL_LINK_PARAM_TYPE_CHOICE_LTE: + switch (link_cfg_param_p->link_param_type._union.link_param_lte) { + // group by dest task id + case RAL_LINK_PARAM_LTE_UE_RSRP: + case RAL_LINK_PARAM_LTE_UE_RSRQ: + case RAL_LINK_PARAM_LTE_UE_CQI: + message_p = itti_alloc_new_message (TASK_RRC_UE, PHY_MEAS_THRESHOLD_REQ); + PHY_MEAS_THRESHOLD_REQ(message_p).transaction_id = transaction_id; + memcpy (&PHY_MEAS_THRESHOLD_REQ(message_p).cfg_param, (void *) link_cfg_param_p, sizeof(ral_link_cfg_param_t)); + itti_send_msg_to_task (TASK_PHY_UE, ITTI_MSG_INSTANCE(msg_pP), message_p); + break; + + case RAL_LINK_PARAM_LTE_AVAILABLE_BW: + case RAL_LINK_PARAM_LTE_PACKET_LOSS_RATE: + case RAL_LINK_PARAM_LTE_L2_BUFFER_STATUS: + case RAL_LINK_PARAM_LTE_PACKET_DELAY: + message_p = itti_alloc_new_message (TASK_RRC_UE, PHY_MEAS_THRESHOLD_REQ); + PHY_MEAS_THRESHOLD_REQ(message_p).transaction_id = transaction_id; + memcpy (&PHY_MEAS_THRESHOLD_REQ(message_p).cfg_param, (void *) link_cfg_param_p, sizeof(ral_link_cfg_param_t)); + itti_send_msg_to_task (TASK_MAC_UE, ITTI_MSG_INSTANCE(msg_pP), message_p); + break; + + case RAL_LINK_PARAM_LTE_MOBILE_NODE_CAPABILITIES: + case RAL_LINK_PARAM_LTE_EMBMS_CAPABILITY: + case RAL_LINK_PARAM_LTE_JUMBO_FEASIBILITY: + case RAL_LINK_PARAM_LTE_JUMBO_SETUP_STATUS: + case RAL_LINK_PARAM_LTE_NUM_ACTIVE_EMBMS_RECEIVERS_PER_FLOW: +#warning "TO DO MIH LTE LINK PARAMS IN RRC UE" + break; - break; + default: + LOG_E(RRC, "Message RRC_RAL_CONFIGURE_THRESHOLD_REQ malformed, unknown link_param_lte %d\n", link_cfg_param_p->link_param_type._union.link_param_lte); + return -1; + } + + break; - case RAL_LINK_PARAM_TYPE_CHOICE_QOS: - switch (link_cfg_param_p->link_param_type._union.link_param_qos) { - case RAL_LINK_PARAM_QOS_MAX_NUM_DIF_COS_SUPPORTED: - case RAL_LINK_PARAM_QOS_MIN_PACKET_TRANSFER_DELAY_ALL_COS: - case RAL_LINK_PARAM_QOS_AVG_PACKET_TRANSFER_DELAY_ALL_COS: - case RAL_LINK_PARAM_QOS_MAX_PACKET_TRANSFER_DELAY_ALL_COS: - case RAL_LINK_PARAM_QOS_STD_DEVIATION_PACKET_TRANSFER_DELAY: - case RAL_LINK_PARAM_QOS_PACKET_LOSS_RATE_ALL_COS_FRAME_RATIO: - message_p = itti_alloc_new_message (TASK_RRC_UE, PHY_MEAS_THRESHOLD_REQ); - PHY_MEAS_THRESHOLD_REQ(message_p).transaction_id = transaction_id; - memcpy (&PHY_MEAS_THRESHOLD_REQ(message_p).cfg_param, (void *) link_cfg_param_p, sizeof(ral_link_cfg_param_t)); - itti_send_msg_to_task (TASK_MAC_UE, ITTI_MSG_INSTANCE(msg_pP), message_p); - break; - - default: - LOG_E(RRC, "Message RRC_RAL_CONFIGURE_THRESHOLD_REQ malformed, unknown link_param_qos %d\n", link_cfg_param_p->link_param_type._union.link_param_qos); - return -1; + default: + LOG_E(RRC, "Message RRC_RAL_CONFIGURE_THRESHOLD_REQ malformed, unknown link_param_type choice %d\n", link_cfg_param_p->link_param_type.choice); + return -1; } - break; + for (ix_thresholds=0; ix_thresholds < link_cfg_param_p->num_thresholds; ix_thresholds++) { + threshold_p = &link_cfg_param_p->thresholds[ix_thresholds]; + } - case RAL_LINK_PARAM_TYPE_CHOICE_LTE: - switch (link_cfg_param_p->link_param_type._union.link_param_lte) { - // group by dest task id - case RAL_LINK_PARAM_LTE_UE_RSRP: - case RAL_LINK_PARAM_LTE_UE_RSRQ: - case RAL_LINK_PARAM_LTE_UE_CQI: - message_p = itti_alloc_new_message (TASK_RRC_UE, PHY_MEAS_THRESHOLD_REQ); - PHY_MEAS_THRESHOLD_REQ(message_p).transaction_id = transaction_id; - memcpy (&PHY_MEAS_THRESHOLD_REQ(message_p).cfg_param, (void *) link_cfg_param_p, sizeof(ral_link_cfg_param_t)); - itti_send_msg_to_task (TASK_PHY_UE, ITTI_MSG_INSTANCE(msg_pP), message_p); - break; - - case RAL_LINK_PARAM_LTE_AVAILABLE_BW: - case RAL_LINK_PARAM_LTE_PACKET_LOSS_RATE: - case RAL_LINK_PARAM_LTE_L2_BUFFER_STATUS: - case RAL_LINK_PARAM_LTE_PACKET_DELAY: - message_p = itti_alloc_new_message (TASK_RRC_UE, PHY_MEAS_THRESHOLD_REQ); - PHY_MEAS_THRESHOLD_REQ(message_p).transaction_id = transaction_id; - memcpy (&PHY_MEAS_THRESHOLD_REQ(message_p).cfg_param, (void *) link_cfg_param_p, sizeof(ral_link_cfg_param_t)); - itti_send_msg_to_task (TASK_MAC_UE, ITTI_MSG_INSTANCE(msg_pP), message_p); - break; - - case RAL_LINK_PARAM_LTE_MOBILE_NODE_CAPABILITIES: - case RAL_LINK_PARAM_LTE_EMBMS_CAPABILITY: - case RAL_LINK_PARAM_LTE_JUMBO_FEASIBILITY: - case RAL_LINK_PARAM_LTE_JUMBO_SETUP_STATUS: - case RAL_LINK_PARAM_LTE_NUM_ACTIVE_EMBMS_RECEIVERS_PER_FLOW: -#warning "TO DO MIH LTE LINK PARAMS IN RRC UE" - break; + break; - default: - LOG_E(RRC, "Message RRC_RAL_CONFIGURE_THRESHOLD_REQ malformed, unknown link_param_lte %d\n", link_cfg_param_p->link_param_type._union.link_param_lte); - return -1; + case RAL_TH_ACTION_CANCEL_THRESHOLD: + + // IEEE Std 802.21-2008, Table F4, Data type name=LINK_CFG_PARAM (page 228): + // When “Cancel threshold†is selected and no thresholds are specified, then all + // currently configured thresholds for the given LINK_PARAM_TYPE are cancelled. + if (link_cfg_param_p->num_thresholds == 0) { + rrc_ue_ral_delete_all_thresholds_type(mod_idP, &link_cfg_param_p->link_param_type); + } else { + // + // When “Cancel threshold†is selected and thresholds are specified only those + // configured thresholds for the given LINK_PARAM_TYPE and whose threshold value match what was + // specified are cancelled. + for (ix_thresholds=0; ix_thresholds < link_cfg_param_p->num_thresholds; ix_thresholds++) { + threshold_p = &link_cfg_param_p->thresholds[ix_thresholds]; + rrc_ue_ral_delete_threshold(mod_idP, &link_cfg_param_p->link_param_type, threshold_p); + } } + LOG_E(RRC, "Message RRC_RAL_CONFIGURE_THRESHOLD_REQ with RAL_TH_ACTION_CANCEL_THRESHOLD\n"); break; default: - LOG_E(RRC, "Message RRC_RAL_CONFIGURE_THRESHOLD_REQ malformed, unknown link_param_type choice %d\n", link_cfg_param_p->link_param_type.choice); + LOG_E(RRC, "Message RRC_RAL_CONFIGURE_THRESHOLD_REQ malformed, unknown th_action %d\n", link_cfg_param_p->th_action); return -1; - } - - for (ix_thresholds=0; ix_thresholds < link_cfg_param_p->num_thresholds; ix_thresholds++) { - threshold_p = &link_cfg_param_p->thresholds[ix_thresholds]; - } - - break; - - case RAL_TH_ACTION_CANCEL_THRESHOLD: - - // IEEE Std 802.21-2008, Table F4, Data type name=LINK_CFG_PARAM (page 228): - // When “Cancel threshold†is selected and no thresholds are specified, then all - // currently configured thresholds for the given LINK_PARAM_TYPE are cancelled. - if (link_cfg_param_p->num_thresholds == 0) { - rrc_ue_ral_delete_all_thresholds_type(mod_idP, &link_cfg_param_p->link_param_type); - } else { - // - // When “Cancel threshold†is selected and thresholds are specified only those - // configured thresholds for the given LINK_PARAM_TYPE and whose threshold value match what was - // specified are cancelled. - for (ix_thresholds=0; ix_thresholds < link_cfg_param_p->num_thresholds; ix_thresholds++) { - threshold_p = &link_cfg_param_p->thresholds[ix_thresholds]; - rrc_ue_ral_delete_threshold(mod_idP, &link_cfg_param_p->link_param_type, threshold_p); - } - } - - LOG_E(RRC, "Message RRC_RAL_CONFIGURE_THRESHOLD_REQ with RAL_TH_ACTION_CANCEL_THRESHOLD\n"); - break; - - default: - LOG_E(RRC, "Message RRC_RAL_CONFIGURE_THRESHOLD_REQ malformed, unknown th_action %d\n", link_cfg_param_p->th_action); - return -1; } } diff --git a/openair2/RRC/LTE/rrc_common.c b/openair2/RRC/LTE/rrc_common.c index cf0196441e..1744719308 100644 --- a/openair2/RRC/LTE/rrc_common.c +++ b/openair2/RRC/LTE/rrc_common.c @@ -55,9 +55,7 @@ rrc_init_global_param( ) //----------------------------------------------------------------------------- { - rrc_rlc_register_rrc (rrc_data_ind, NULL); //register with rlc - DCCH_LCHAN_DESC.transport_block_size = 4; DCCH_LCHAN_DESC.max_transport_blocks = 16; DCCH_LCHAN_DESC.Delay_class = 1; @@ -67,13 +65,11 @@ rrc_init_global_param( DTCH_UL_LCHAN_DESC.transport_block_size = 52; DTCH_UL_LCHAN_DESC.max_transport_blocks = 20; DTCH_UL_LCHAN_DESC.Delay_class = 1; - Rlc_info_um.rlc_mode = RLC_MODE_UM; Rlc_info_um.rlc.rlc_um_info.timer_reordering = 5; Rlc_info_um.rlc.rlc_um_info.sn_field_length = 10; Rlc_info_um.rlc.rlc_um_info.is_mXch = 0; //Rlc_info_um.rlc.rlc_um_info.sdu_discard_mode=16; - Rlc_info_am_config.rlc_mode = RLC_MODE_AM; Rlc_info_am_config.rlc.rlc_am_info.max_retx_threshold = 50; Rlc_info_am_config.rlc.rlc_am_info.poll_pdu = 8; @@ -81,20 +77,18 @@ rrc_init_global_param( Rlc_info_am_config.rlc.rlc_am_info.t_poll_retransmit = 15; Rlc_info_am_config.rlc.rlc_am_info.t_reordering = 50; Rlc_info_am_config.rlc.rlc_am_info.t_status_prohibit = 10; - return 0; } //----------------------------------------------------------------------------- void rrc_config_buffer( - SRB_INFO* Srb_info, + SRB_INFO *Srb_info, uint8_t Lchan_type, uint8_t Role ) //----------------------------------------------------------------------------- { - Srb_info->Rx_buffer.payload_size = 0; Srb_info->Tx_buffer.payload_size = 0; } @@ -200,7 +194,7 @@ static band_freq bands[] = { { BAND_TYPE_FDD, 3, 1710000000UL, 1785000000UL, 1805000000UL, 1880000000UL }, { BAND_TYPE_FDD, 4, 1710000000UL, 1755000000UL, 2110000000UL, 2155000000UL }, { BAND_TYPE_FDD, 5, 824000000UL, 849000000UL, 869000000UL, 894000000UL }, - /* to remove? */{ BAND_TYPE_FDD, 6, 830000000UL, 840000000UL, 875000000UL, 885000000UL }, + /* to remove? */{ BAND_TYPE_FDD, 6, 830000000UL, 840000000UL, 875000000UL, 885000000UL }, { BAND_TYPE_FDD, 7, 2500000000UL, 2570000000UL, 2620000000UL, 2690000000UL }, { BAND_TYPE_FDD, 8, 880000000UL, 915000000UL, 925000000UL, 960000000UL }, { BAND_TYPE_FDD, 9, 1749900000UL, 1784900000UL, 1844900000UL, 1879900000UL }, @@ -278,17 +272,17 @@ static earfcn earfcn_table[] = { { 42, 3400000000UL, 41590, 41590, 43589, 3400000000UL, 41590, 41590, 43589 }, { 43, 3600000000UL, 43590, 43590, 45589, 3600000000UL, 43590, 43590, 45589 }, }; - -int freq_to_arfcn10(int band, unsigned long freq) -{ - int N = sizeof(earfcn_table) / sizeof(earfcn_table[0]); + +int freq_to_arfcn10(int band, unsigned long freq) { + int N = sizeof(earfcn_table) / sizeof(earfcn_table[0]); int i; - - for (i = 0; i < N; i++) if (bands[i].band == band) break; + + for (i = 0; i < N; i++) if (bands[i].band == band) break; + if (i == N) return -1; - + if (!(bands[i].dl_minfreq < freq && freq < bands[i].dl_maxfreq)) return -1; - + return (freq - earfcn_table[i].dl_flow) / 100000UL + earfcn_table[i].dl_off; } diff --git a/openair2/RRC/LTE/rrc_defs.h b/openair2/RRC/LTE/rrc_defs.h index 9cbef536fc..6019ae2529 100644 --- a/openair2/RRC/LTE/rrc_defs.h +++ b/openair2/RRC/LTE/rrc_defs.h @@ -200,6 +200,8 @@ void *send_UE_status_notification(void *); /* for ImsiMobileIdentity_t */ #include "MobileIdentity.h" +#include "LTE_DRX-Config.h" // Add DRX SSR 2018-11 + /* correct Rel(8|10)/Rel14 differences * the code is in favor of Rel14, those defines do the translation */ diff --git a/openair2/RRC/LTE/rrc_eNB.c b/openair2/RRC/LTE/rrc_eNB.c index f330399901..b70846cc30 100644 --- a/openair2/RRC/LTE/rrc_eNB.c +++ b/openair2/RRC/LTE/rrc_eNB.c @@ -1118,14 +1118,18 @@ rrc_eNB_process_RRCConnectionSetupComplete( ) //----------------------------------------------------------------------------- { - LOG_I(RRC, - PROTOCOL_RRC_CTXT_UE_FMT" [RAPROC] Logical Channel UL-DCCH, " "processing LTE_RRCConnectionSetupComplete from UE (SRB1 Active)\n", + LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT" [RAPROC] Logical Channel UL-DCCH, " "processing LTE_RRCConnectionSetupComplete from UE (SRB1 Active)\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); + ue_context_pP->ue_context.Srb1.Active = 1; ue_context_pP->ue_context.Status = RRC_CONNECTED; - ue_context_pP->ue_context.ue_rrc_inactivity_timer = 1; // set rrc inactivity when UE goes into RRC_CONNECTED - T(T_ENB_RRC_CONNECTION_SETUP_COMPLETE, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame), - T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti)); + ue_context_pP->ue_context.ue_rrc_inactivity_timer = 1; // set rrc inactivity timer when UE goes into RRC_CONNECTED + + T(T_ENB_RRC_CONNECTION_SETUP_COMPLETE, + T_INT(ctxt_pP->module_id), + T_INT(ctxt_pP->frame), + T_INT(ctxt_pP->subframe), + T_INT(ctxt_pP->rnti)); if (EPC_MODE_ENABLED == 1) { // Forward message to S1AP layer @@ -1272,15 +1276,17 @@ rrc_eNB_generate_RRCConnectionReject( } //----------------------------------------------------------------------------- +/* + * Generate a RCC Connection Reestablishment after requested + */ void rrc_eNB_generate_RRCConnectionReestablishment( - const protocol_ctxt_t *const ctxt_pP, - rrc_eNB_ue_context_t *const ue_context_pP, - const int CC_id -) + const protocol_ctxt_t *const ctxt_pP, + rrc_eNB_ue_context_t *const ue_context_pP, + const int CC_id) //----------------------------------------------------------------------------- { - LTE_LogicalChannelConfig_t *SRB1_logicalChannelConfig; +LTE_LogicalChannelConfig_t *SRB1_logicalChannelConfig; LTE_SRB_ToAddModList_t **SRB_configList; LTE_SRB_ToAddMod_t *SRB1_config; int cnt; @@ -1396,6 +1402,7 @@ rrc_eNB_generate_RRCConnectionReestablishment( ue_context_pP->ue_context.ue_reestablishment_timer = 1; // remove UE after 100 frames after LTE_RRCConnectionReestablishmentRelease is triggered ue_context_pP->ue_context.ue_reestablishment_timer_thres = 1000; + } //----------------------------------------------------------------------------- @@ -2775,6 +2782,8 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t *cons LTE_C_RNTI_t *cba_RNTI = NULL; int x2_enabled; uint8_t xid = rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id); //Transaction_id, + uint8_t cc_id = ue_context_pP->ue_context.primaryCC_id; // Add DRX SSR 2018-11 => CC id + LTE_UE_EUTRA_Capability_t *UEcap = ue_context_pP->ue_context.UE_Capability; // Add DRX SSR 2018-12 #ifdef CBA //struct PUSCH_CBAConfigDedicated_vlola *pusch_CBAConfigDedicated_vlola; uint8_t *cba_RNTI_buf; @@ -2931,21 +2940,87 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t *cons maxHARQ_Tx = CALLOC(1, sizeof(long)); *maxHARQ_Tx = LTE_MAC_MainConfig__ul_SCH_Config__maxHARQ_Tx_n5; mac_MainConfig->ul_SCH_Config->maxHARQ_Tx = maxHARQ_Tx; + + /* BSR reconfiguration */ periodicBSR_Timer = CALLOC(1, sizeof(long)); - *periodicBSR_Timer = LTE_PeriodicBSR_Timer_r12_sf64; + *periodicBSR_Timer = LTE_PeriodicBSR_Timer_r12_sf64; //LTE_PeriodicBSR_Timer_r12_infinity; // LTE_PeriodicBSR_Timer_r12_sf64; // LTE_PeriodicBSR_Timer_r12_sf20 mac_MainConfig->ul_SCH_Config->periodicBSR_Timer = periodicBSR_Timer; - mac_MainConfig->ul_SCH_Config->retxBSR_Timer = LTE_RetxBSR_Timer_r12_sf320; + mac_MainConfig->ul_SCH_Config->retxBSR_Timer = LTE_RetxBSR_Timer_r12_sf320; // LTE_RetxBSR_Timer_r12_sf320; // LTE_RetxBSR_Timer_r12_sf5120 mac_MainConfig->ul_SCH_Config->ttiBundling = 0; // FALSE mac_MainConfig->timeAlignmentTimerDedicated = LTE_TimeAlignmentTimer_infinity; - mac_MainConfig->drx_Config = NULL; + + /* PHR reconfiguration */ mac_MainConfig->phr_Config = CALLOC(1, sizeof(*mac_MainConfig->phr_Config)); mac_MainConfig->phr_Config->present = LTE_MAC_MainConfig__phr_Config_PR_setup; - mac_MainConfig->phr_Config->choice.setup.periodicPHR_Timer = LTE_MAC_MainConfig__phr_Config__setup__periodicPHR_Timer_sf20; // sf20 = 20 subframes - mac_MainConfig->phr_Config->choice.setup.prohibitPHR_Timer = LTE_MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf20; // sf20 = 20 subframes - mac_MainConfig->phr_Config->choice.setup.dl_PathlossChange = LTE_MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB1; // Value dB1 =1 dB, dB3 = 3 dB + mac_MainConfig->phr_Config->choice.setup.periodicPHR_Timer = LTE_MAC_MainConfig__phr_Config__setup__periodicPHR_Timer_sf500; // sf20 = 20 subframes // LTE_MAC_MainConfig__phr_Config__setup__periodicPHR_Timer_infinity + mac_MainConfig->phr_Config->choice.setup.prohibitPHR_Timer = LTE_MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf200; // sf20 = 20 subframes // LTE_MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf1000 + mac_MainConfig->phr_Config->choice.setup.dl_PathlossChange = LTE_MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB3; // Value dB1 =1 dB, dB3 = 3 dB + + // Begin add DRX SSR 2018-11 + if (rrc_inst->carrier[cc_id].sib1->tdd_Config == NULL) { // CDRX configured in case of FDD + LOG_D(RRC, "Processing the DRX configuration in RRC Connection Reconfiguration\n"); + + /* Process the IE drx_Config */ + if (cc_id < MAX_NUM_CCs) { + mac_MainConfig->drx_Config = do_DrxConfig(ctxt_pP->module_id, cc_id, &rrc_inst->configuration, UEcap); // drx_Config IE + } else { + LOG_E(RRC, "Invalid CC_id for DRX configuration\n"); + } + + /* Set timers and thresholds values in local MAC context of UE */ + eNB_Config_Local_DRX(ctxt_pP->module_id, ue_context_pP->ue_id_rnti, mac_MainConfig->drx_Config); + + /* BEGIN DEBUG LAD*/ + eNB_MAC_INST *eNB_mac = NULL; + UE_list_t *UE_list_mac = NULL; + int UE_id = -1; + UE_sched_ctrl *UE_scheduling_control = NULL; + + eNB_mac = RC.mac[ctxt_pP->module_id]; + UE_list_mac = &eNB_mac->UE_list; + UE_id = find_UE_id(ctxt_pP->module_id, ue_context_pP->ue_id_rnti); + UE_scheduling_control = &(UE_list_mac->UE_sched_ctrl[UE_id]); + + LOG_W(MAC, "Values to check: on_duration_timer = %d ; on_duration_timer_thres = %d \n \ + drx_inactivity_timer = %d ; drx_inactivity_timer_thres = %d \n \ + drx_shortCycle_timer = %d ; drx_shortCycle_timer_thres = %d \n \ + short_drx_cycle_duration = %d ; drx_shortCycle_timer_value = %d \n \ + drx_long_timer = %d ; drx_long_timer_thres = %d \n \ + drx_start_offset = %d ; \n \ + drx_retransmission_timer0 = %d ; drx_retransmission_timer2 = %d ; drx_retransmission_timer4 = %d ; drx_retransmission_timer7 = %d ; \n \ + drx_retransmission_timer_thres0 = %d ; drx_retransmission_timer_thres2 = %d ; drx_retransmission_timer_thres4 = %d ; drx_retransmission_timer_thres7 = %d; \n \ + cqi_mask_boolean = %d ; cdrx_configured = %d\n", + UE_scheduling_control->on_duration_timer, + UE_scheduling_control->on_duration_timer_thres, + UE_scheduling_control->drx_inactivity_timer, + UE_scheduling_control->drx_inactivity_timer_thres, + UE_scheduling_control->drx_shortCycle_timer, + UE_scheduling_control->drx_shortCycle_timer_thres, + UE_scheduling_control->short_drx_cycle_duration, + UE_scheduling_control->drx_shortCycle_timer_value, + UE_scheduling_control->drx_longCycle_timer, + UE_scheduling_control->drx_longCycle_timer_thres, + UE_scheduling_control->drx_start_offset, + UE_scheduling_control->drx_retransmission_timer[0], + UE_scheduling_control->drx_retransmission_timer[2], + UE_scheduling_control->drx_retransmission_timer[4], + UE_scheduling_control->drx_retransmission_timer[7], + UE_scheduling_control->drx_retransmission_timer_thres[0], + UE_scheduling_control->drx_retransmission_timer_thres[2], + UE_scheduling_control->drx_retransmission_timer_thres[4], + UE_scheduling_control->drx_retransmission_timer_thres[7], + UE_scheduling_control->cqi_mask_boolean, + UE_scheduling_control->cdrx_configured); + /* END DEBUG LAD */ + + } else { // CDRX not ready for TDD + mac_MainConfig->drx_Config = NULL; + } + // End add DRX SSR 2018-11 + #if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0)) sr_ProhibitTimer_r9 = CALLOC(1, sizeof(long)); - *sr_ProhibitTimer_r9 = 0; // SR tx on PUCCH, Value in number of SR period(s). Value 0 = no timer for SR, Value 2= 2*SR + *sr_ProhibitTimer_r9 = 0; // SR tx on PUCCH, Value in number of SR period(s). Value 0 = no timer for SR, Value 2 = 2*SR mac_MainConfig->ext1 = CALLOC(1, sizeof(struct LTE_MAC_MainConfig__ext1)); mac_MainConfig->ext1->sr_ProhibitTimer_r9 = sr_ProhibitTimer_r9; //sps_RA_ConfigList_rlola = NULL; @@ -3000,18 +3075,34 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t *cons LOG_E(RRC,"antenna_info not present in physical_config_dedicated. Not reconfiguring!\n"); } - if ((*physicalConfigDedicated)->cqi_ReportConfig) { - if ((rrc_inst->configuration.radioresourceconfig[0].ue_TransmissionMode==LTE_AntennaInfoDedicated__transmissionMode_tm4) || - (rrc_inst->configuration.radioresourceconfig[0].ue_TransmissionMode==LTE_AntennaInfoDedicated__transmissionMode_tm5) || - (rrc_inst->configuration.radioresourceconfig[0].ue_TransmissionMode==LTE_AntennaInfoDedicated__transmissionMode_tm6)) { - //feedback mode needs to be set as well - //TODO: I think this is taken into account in the PHY automatically based on the transmission mode variable - printf("setting cqi reporting mode to rm31\n"); + /* CSI RRC Reconfiguration */ + if ((*physicalConfigDedicated)->cqi_ReportConfig != NULL) { + if ((rrc_inst->configuration.radioresourceconfig[0].ue_TransmissionMode == LTE_AntennaInfoDedicated__transmissionMode_tm4) || + (rrc_inst->configuration.radioresourceconfig[0].ue_TransmissionMode == LTE_AntennaInfoDedicated__transmissionMode_tm5) || + (rrc_inst->configuration.radioresourceconfig[0].ue_TransmissionMode == LTE_AntennaInfoDedicated__transmissionMode_tm6)) { + + // feedback mode needs to be set as well + // TODO: I think this is taken into account in the PHY automatically based on the transmission mode variable + LOG_I(RRC, "Setting cqi reporting mode to rm31 (hardcoded)\n"); + #if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0)) - *((*physicalConfigDedicated)->cqi_ReportConfig->cqi_ReportModeAperiodic)=LTE_CQI_ReportModeAperiodic_rm31; + *((*physicalConfigDedicated)->cqi_ReportConfig->cqi_ReportModeAperiodic) = LTE_CQI_ReportModeAperiodic_rm31; // HLC CQI, single PMI #else - *((*physicalConfigDedicated)->cqi_ReportConfig->cqi_ReportModeAperiodic)=LTE_CQI_ReportConfig__cqi_ReportModeAperiodic_rm31; // HLC CQI, no PMI + *((*physicalConfigDedicated)->cqi_ReportConfig->cqi_ReportModeAperiodic) = LTE_CQI_ReportConfig__cqi_ReportModeAperiodic_rm31; // HLC CQI, single PMI #endif + /* For testing with CDRX */ + /* Periodic report can't work because NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE is not supported yet! */ + /* + (*physicalConfigDedicated)->cqi_ReportConfig->nomPDSCH_RS_EPRE_Offset = 0; // 0 dB + (*physicalConfigDedicated)->cqi_ReportConfig->cqi_ReportPeriodic = CALLOC(1, sizeof((*(*physicalConfigDedicated)).cqi_ReportConfig->cqi_ReportPeriodic)); + (*physicalConfigDedicated)->cqi_ReportConfig->cqi_ReportPeriodic->present = LTE_CQI_ReportPeriodic_PR_setup; + (*physicalConfigDedicated)->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_PUCCH_ResourceIndex = 0; // n2_pucch + (*physicalConfigDedicated)->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_pmi_ConfigIndex = 17; // I_cqi/pmi: 17 => 20ms + (*physicalConfigDedicated)->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_FormatIndicatorPeriodic.present = LTE_CQI_ReportPeriodic__setup__cqi_FormatIndicatorPeriodic_PR_subbandCQI; // subband CQI + (*physicalConfigDedicated)->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_FormatIndicatorPeriodic.choice.subbandCQI.k = 4; + (*physicalConfigDedicated)->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.ri_ConfigIndex = NULL; + (*physicalConfigDedicated)->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.simultaneousAckNackAndCQI = 0; + */ } } else { LOG_E(RRC,"cqi_ReportConfig not present in physical_config_dedicated. Not reconfiguring!\n"); @@ -3635,13 +3726,15 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt LOG_E(RRC,"antenna_info not present in physical_config_dedicated. Not reconfiguring!\n"); } - if ((*physicalConfigDedicated)->cqi_ReportConfig) { - if ((rrc_inst->configuration.radioresourceconfig[0].ue_TransmissionMode==LTE_AntennaInfoDedicated__transmissionMode_tm4) || - (rrc_inst->configuration.radioresourceconfig[0].ue_TransmissionMode==LTE_AntennaInfoDedicated__transmissionMode_tm5) || - (rrc_inst->configuration.radioresourceconfig[0].ue_TransmissionMode==LTE_AntennaInfoDedicated__transmissionMode_tm6)) { - //feedback mode needs to be set as well - //TODO: I think this is taken into account in the PHY automatically based on the transmission mode variable - printf("setting cqi reporting mode to rm31\n"); + /* CSI Configuration through RRC */ + if ((*physicalConfigDedicated)->cqi_ReportConfig != NULL) { + if ((rrc_inst->configuration.radioresourceconfig[0].ue_TransmissionMode == LTE_AntennaInfoDedicated__transmissionMode_tm4) || + (rrc_inst->configuration.radioresourceconfig[0].ue_TransmissionMode == LTE_AntennaInfoDedicated__transmissionMode_tm5) || + (rrc_inst->configuration.radioresourceconfig[0].ue_TransmissionMode == LTE_AntennaInfoDedicated__transmissionMode_tm6)) { + //feedback mode needs to be set as well + //TODO: I think this is taken into account in the PHY automatically based on the transmission mode variable + LOG_I(RRC, "Setting cqi aperiodic reporting mode to rm31 (hardcoded)\n"); + #if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0)) *((*physicalConfigDedicated)->cqi_ReportConfig->cqi_ReportModeAperiodic)=LTE_CQI_ReportModeAperiodic_rm31; #else @@ -5378,88 +5471,93 @@ rrc_eNB_configure_rbs_handover(struct rrc_eNB_ue_context_s *ue_context_p, protoc //----------------------------------------------------------------------------- /* -* TODO: * add function description -* * format the function correctly +* Process the RRC Connection Reconfiguration Complete from the UE */ void rrc_eNB_process_RRCConnectionReconfigurationComplete( const protocol_ctxt_t *const ctxt_pP, - rrc_eNB_ue_context_t *ue_context_pP, + rrc_eNB_ue_context_t *ue_context_pP, const uint8_t xid ) //----------------------------------------------------------------------------- { - int i, drb_id; + int drb_id; int oip_ifup = 0; int dest_ip_offset = 0; uint8_t *kRRCenc = NULL; uint8_t *kRRCint = NULL; uint8_t *kUPenc = NULL; + LTE_DRB_ToAddModList_t *DRB_configList = ue_context_pP->ue_context.DRB_configList2[xid]; + LTE_SRB_ToAddModList_t *SRB_configList = ue_context_pP->ue_context.SRB_configList2[xid]; + LTE_DRB_ToReleaseList_t *DRB_Release_configList2 = ue_context_pP->ue_context.DRB_Release_configList2[xid]; + LTE_DRB_Identity_t *drb_id_p = NULL; + ue_context_pP->ue_context.ue_reestablishment_timer = 0; - LTE_DRB_ToAddModList_t *DRB_configList = ue_context_pP->ue_context.DRB_configList2[xid]; - LTE_SRB_ToAddModList_t *SRB_configList = ue_context_pP->ue_context.SRB_configList2[xid]; - LTE_DRB_ToReleaseList_t *DRB_Release_configList2 = ue_context_pP->ue_context.DRB_Release_configList2[xid]; - LTE_DRB_Identity_t *drb_id_p = NULL; - T(T_ENB_RRC_CONNECTION_RECONFIGURATION_COMPLETE, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame), - T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti)); + ue_context_pP->ue_context.ue_rrc_inactivity_timer = 1; // reset rrc inactivity timer + + /* CDRX: activated */ + int UE_id_mac = find_UE_id(ctxt_pP->module_id, ue_context_pP->ue_context.rnti); + RC.mac[ctxt_pP->module_id]->UE_list.UE_sched_ctrl[UE_id_mac].bypass_cdrx = FALSE; + + T(T_ENB_RRC_CONNECTION_RECONFIGURATION_COMPLETE, + T_INT(ctxt_pP->module_id), + T_INT(ctxt_pP->frame), + T_INT(ctxt_pP->subframe), + T_INT(ctxt_pP->rnti)); /* Derive the keys from kenb */ if (DRB_configList != NULL) { derive_key_up_enc(ue_context_pP->ue_context.ciphering_algorithm, - ue_context_pP->ue_context.kenb, &kUPenc); + ue_context_pP->ue_context.kenb, + &kUPenc); } derive_key_rrc_enc(ue_context_pP->ue_context.ciphering_algorithm, - ue_context_pP->ue_context.kenb, &kRRCenc); + ue_context_pP->ue_context.kenb, + &kRRCenc); + derive_key_rrc_int(ue_context_pP->ue_context.integrity_algorithm, - ue_context_pP->ue_context.kenb, &kRRCint); - // Refresh SRBs/DRBs - MSC_LOG_TX_MESSAGE( - MSC_RRC_ENB, - MSC_PDCP_ENB, - NULL, - 0, - MSC_AS_TIME_FMT" CONFIG_REQ UE %x DRB (security unchanged)", - MSC_AS_TIME_ARGS(ctxt_pP), - ue_context_pP->ue_context.rnti); - rrc_pdcp_config_asn1_req( - ctxt_pP, - SRB_configList, //NULL, //LG-RK 14/05/2014 SRB_configList, - DRB_configList, - // (LTE_DRB_ToReleaseList_t *) NULL, - DRB_Release_configList2, - /*RC.rrc[ctxt_pP->module_id]->ciphering_algorithm[ue_mod_idP] | - (RC.rrc[ctxt_pP->module_id]->integrity_algorithm[ue_mod_idP] << 4), - */ - 0xff, // already configured during the securitymodecommand - kRRCenc, - kRRCint, - kUPenc + ue_context_pP->ue_context.kenb, + &kRRCint); + + /* Refresh SRBs/DRBs */ + MSC_LOG_TX_MESSAGE(MSC_RRC_ENB, MSC_PDCP_ENB, NULL, 0, MSC_AS_TIME_FMT" CONFIG_REQ UE %x DRB (security unchanged)", + MSC_AS_TIME_ARGS(ctxt_pP), + ue_context_pP->ue_context.rnti); + + rrc_pdcp_config_asn1_req(ctxt_pP, + SRB_configList, // NULL, + DRB_configList, + DRB_Release_configList2, + 0xff, // already configured during the securitymodecommand + kRRCenc, + kRRCint, + kUPenc #if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0)) - , (LTE_PMCH_InfoList_r9_t *) NULL + , (LTE_PMCH_InfoList_r9_t *) NULL #endif - ,NULL); - // Refresh SRBs/DRBs - rrc_rlc_config_asn1_req( - ctxt_pP, - SRB_configList, // NULL, //LG-RK 14/05/2014 SRB_configList, - DRB_configList, - // (LTE_DRB_ToReleaseList_t *) NULL - DRB_Release_configList2 + , NULL); + + /* Refresh SRBs/DRBs */ + rrc_rlc_config_asn1_req(ctxt_pP, + SRB_configList, // NULL, + DRB_configList, + DRB_Release_configList2 #if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0)) - , (LTE_PMCH_InfoList_r9_t *) NULL - , 0, 0 + , (LTE_PMCH_InfoList_r9_t *) NULL, + 0, + 0 #endif - ); + ); - // set the SRB active in Ue context + /* Set the SRB active in UE context */ if (SRB_configList != NULL) { - for (i = 0; (i < SRB_configList->list.count) && (i < 3); i++) { - if (SRB_configList->list.array[i]->srb_Identity == 1 ) { - ue_context_pP->ue_context.Srb1.Active=1; - } else if (SRB_configList->list.array[i]->srb_Identity == 2 ) { - ue_context_pP->ue_context.Srb2.Active=1; - ue_context_pP->ue_context.Srb2.Srb_info.Srb_id=2; + for (int i = 0; (i < SRB_configList->list.count) && (i < 3); i++) { + if (SRB_configList->list.array[i]->srb_Identity == 1) { + ue_context_pP->ue_context.Srb1.Active = 1; + } else if (SRB_configList->list.array[i]->srb_Identity == 2) { + ue_context_pP->ue_context.Srb2.Active = 1; + ue_context_pP->ue_context.Srb2.Srb_info.Srb_id = 2; LOG_I(RRC,"[eNB %d] Frame %d CC %d : SRB2 is now active\n", ctxt_pP->module_id, ctxt_pP->frame, @@ -5477,22 +5575,21 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( ue_context_pP->ue_context.SRB_configList2[xid] = NULL; } - // Loop through DRBs and establish if necessary - + /* Loop through DRBs and establish if necessary */ if (DRB_configList != NULL) { - for (i = 0; i < DRB_configList->list.count; i++) { // num max DRB (11-3-8) + for (int i = 0; i < DRB_configList->list.count; i++) { // num max DRB (11-3-8) if (DRB_configList->list.array[i]) { drb_id = (int)DRB_configList->list.array[i]->drb_Identity; - LOG_I(RRC, - "[eNB %d] Frame %d : Logical Channel UL-DCCH, Received LTE_RRCConnectionReconfigurationComplete from UE rnti %x, reconfiguring DRB %d/LCID %d\n", + + LOG_I(RRC, "[eNB %d] Frame %d : Logical Channel UL-DCCH, Received LTE_RRCConnectionReconfigurationComplete from UE rnti %x, reconfiguring DRB %d/LCID %d\n", ctxt_pP->module_id, ctxt_pP->frame, ctxt_pP->rnti, (int)DRB_configList->list.array[i]->drb_Identity, (int)*DRB_configList->list.array[i]->logicalChannelIdentity); - // for pre-ci tests - LOG_I(RRC, - "[eNB %d] Frame %d : Logical Channel UL-DCCH, Received LTE_RRCConnectionReconfigurationComplete from UE %u, reconfiguring DRB %d/LCID %d\n", + + /* For pre-ci tests */ + LOG_I(RRC, "[eNB %d] Frame %d : Logical Channel UL-DCCH, Received LTE_RRCConnectionReconfigurationComplete from UE %u, reconfiguring DRB %d/LCID %d\n", ctxt_pP->module_id, ctxt_pP->frame, oai_emulation.info.eNB_ue_local_uid_to_ue_module_id[ctxt_pP->module_id][ue_context_pP->local_uid], @@ -5500,13 +5597,6 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( (int)*DRB_configList->list.array[i]->logicalChannelIdentity); if (ue_context_pP->ue_context.DRB_active[drb_id] == 0) { - /* - rrc_pdcp_config_req (ctxt_pP->module_id, frameP, 1, CONFIG_ACTION_ADD, - (ue_mod_idP * NB_RB_MAX) + *DRB_configList->list.array[i]->logicalChannelIdentity,UNDEF_SECURITY_MODE); - rrc_rlc_config_req(ctxt_pP->module_id,frameP,1,CONFIG_ACTION_ADD, - (ue_mod_idP * NB_RB_MAX) + (int)*RC.rrc[ctxt_pP->module_id]->DRB_config[ue_mod_idP][i]->logicalChannelIdentity, - RADIO_ACCESS_BEARER,Rlc_info_um); - */ ue_context_pP->ue_context.DRB_active[drb_id] = 1; LOG_D(RRC, "[eNB %d] Frame %d: Establish RLC UM Bidirectional, DRB %d Active\n", @@ -5550,67 +5640,78 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( DRB2LCHAN[i] = (uint8_t) * DRB_configList->list.array[i]->logicalChannelIdentity; } - if (NODE_IS_MONOLITHIC(RC.rrc[ctxt_pP->module_id]->node_type)) { - rrc_mac_config_req_eNB(ctxt_pP->module_id, - ue_context_pP->ue_context.primaryCC_id, - 0,0,0,0,0, + if (NODE_IS_MONOLITHIC(RC.rrc[ctxt_pP->module_id]->node_type)) { + rrc_mac_config_req_eNB(ctxt_pP->module_id, + ue_context_pP->ue_context.primaryCC_id, + 0, + 0, + 0, + 0, + 0, #if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) - 0, + 0, #endif - ue_context_pP->ue_context.rnti, - (LTE_BCCH_BCH_Message_t *) NULL, - (LTE_RadioResourceConfigCommonSIB_t *) NULL, + ue_context_pP->ue_context.rnti, + (LTE_BCCH_BCH_Message_t *) NULL, + (LTE_RadioResourceConfigCommonSIB_t *) NULL, #if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) - (LTE_RadioResourceConfigCommonSIB_t *) NULL, + (LTE_RadioResourceConfigCommonSIB_t *) NULL, #endif - ue_context_pP->ue_context.physicalConfigDedicated, + ue_context_pP->ue_context.physicalConfigDedicated, #if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0)) - (LTE_SCellToAddMod_r10_t *)NULL, - //(struct LTE_PhysicalConfigDedicatedSCell_r10 *)NULL, + (LTE_SCellToAddMod_r10_t *)NULL, #endif - (LTE_MeasObjectToAddMod_t **) NULL, - ue_context_pP->ue_context.mac_MainConfig, - DRB2LCHAN[i], - DRB_configList->list.array[i]->logicalChannelConfig, - ue_context_pP->ue_context.measGapConfig, - (LTE_TDD_Config_t *) NULL, - NULL, - (LTE_SchedulingInfoList_t *) NULL, - 0, NULL, NULL, (LTE_MBSFN_SubframeConfigList_t *) NULL + (LTE_MeasObjectToAddMod_t **) NULL, + ue_context_pP->ue_context.mac_MainConfig, + DRB2LCHAN[i], + DRB_configList->list.array[i]->logicalChannelConfig, + ue_context_pP->ue_context.measGapConfig, + (LTE_TDD_Config_t *) NULL, + NULL, + (LTE_SchedulingInfoList_t *) NULL, + 0, + NULL, + NULL, + (LTE_MBSFN_SubframeConfigList_t *) NULL #if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0)) - , 0, (LTE_MBSFN_AreaInfoList_r9_t *) NULL, (LTE_PMCH_InfoList_r9_t *) NULL + , 0, + (LTE_MBSFN_AreaInfoList_r9_t *) NULL, + (LTE_PMCH_InfoList_r9_t *) NULL #endif #if (LTE_RRC_VERSION >= MAKE_VERSION(13, 0, 0)) - , - (LTE_SystemInformationBlockType1_v1310_IEs_t *)NULL + , + (LTE_SystemInformationBlockType1_v1310_IEs_t *) NULL #endif - ); - } - } else { // remove LCHAN from MAC/PHY - - if (ue_context_pP->ue_context.DRB_active[drb_id] == 1) { + ); + } + } else { // end if (ue_context_pP->ue_context.DRB_active[drb_id] == 0) // remove LCHAN from MAC/PHY + if (ue_context_pP->ue_context.DRB_active[drb_id] == 1) { // DRB has just been removed so remove RLC + PDCP for DRB /* rrc_pdcp_config_req (ctxt_pP->module_id, frameP, 1, CONFIG_ACTION_REMOVE, (ue_mod_idP * NB_RB_MAX) + DRB2LCHAN[i],UNDEF_SECURITY_MODE); */ - if (!NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) { - rrc_rlc_config_req(ctxt_pP, - SRB_FLAG_NO, - MBMS_FLAG_NO, - CONFIG_ACTION_REMOVE, - DRB2LCHAN[i], - Rlc_info_um); - } + if (!NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) { + rrc_rlc_config_req(ctxt_pP, + SRB_FLAG_NO, + MBMS_FLAG_NO, + CONFIG_ACTION_REMOVE, + DRB2LCHAN[i], + Rlc_info_um); + } } ue_context_pP->ue_context.DRB_active[drb_id] = 0; - LOG_D(RRC, - PROTOCOL_RRC_CTXT_UE_FMT" RRC_eNB --- MAC_CONFIG_REQ (DRB) ---> MAC_eNB\n", + + LOG_D(RRC, PROTOCOL_RRC_CTXT_UE_FMT" RRC_eNB --- MAC_CONFIG_REQ (DRB) ---> MAC_eNB\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); if (NODE_IS_MONOLITHIC(RC.rrc[ctxt_pP->module_id]->node_type)) { rrc_mac_config_req_eNB(ctxt_pP->module_id, ue_context_pP->ue_context.primaryCC_id, - 0,0,0,0,0, + 0, + 0, + 0, + 0, + 0, #if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) 0, #endif @@ -5622,8 +5723,7 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( #endif ue_context_pP->ue_context.physicalConfigDedicated, #if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0)) - (LTE_SCellToAddMod_r10_t *)NULL, - //(struct LTE_PhysicalConfigDedicatedSCell_r10 *)NULL, + (LTE_SCellToAddMod_r10_t *) NULL, #endif (LTE_MeasObjectToAddMod_t **) NULL, ue_context_pP->ue_context.mac_MainConfig, @@ -5633,25 +5733,32 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( (LTE_TDD_Config_t *) NULL, NULL, (LTE_SchedulingInfoList_t *) NULL, - 0, NULL, NULL, NULL + 0, + NULL, + NULL, + NULL #if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0)) - , 0, (LTE_MBSFN_AreaInfoList_r9_t *) NULL, (LTE_PMCH_InfoList_r9_t *) NULL + , + 0, + (LTE_MBSFN_AreaInfoList_r9_t *) NULL, + (LTE_PMCH_InfoList_r9_t *) NULL #endif #if (LTE_RRC_VERSION >= MAKE_VERSION(13, 0, 0)) , - (LTE_SystemInformationBlockType1_v1310_IEs_t *)NULL + (LTE_SystemInformationBlockType1_v1310_IEs_t *) NULL #endif - ); + ); } - } - } - } + } // end else of if (ue_context_pP->ue_context.DRB_active[drb_id] == 0) + } // end if (DRB_configList->list.array[i]) + } // end for (int i = 0; i < DRB_configList->list.count; i++) + free(DRB_configList); ue_context_pP->ue_context.DRB_configList2[xid] = NULL; - } + } // end if DRB_configList != NULL if(DRB_Release_configList2 != NULL) { - for (i = 0; i < DRB_Release_configList2->list.count; i++) { + for (int i = 0; i < DRB_Release_configList2->list.count; i++) { if (DRB_Release_configList2->list.array[i]) { drb_id_p = DRB_Release_configList2->list.array[i]; drb_id = *drb_id_p; @@ -5668,10 +5775,12 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( } //----------------------------------------------------------------------------- -void rrc_eNB_generate_RRCConnectionSetup(const protocol_ctxt_t *const ctxt_pP, - rrc_eNB_ue_context_t *const ue_context_pP, - const int CC_id - ) +void +rrc_eNB_generate_RRCConnectionSetup( + const protocol_ctxt_t *const ctxt_pP, + rrc_eNB_ue_context_t *const ue_context_pP, + const int CC_id +) //----------------------------------------------------------------------------- { #if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) @@ -5680,27 +5789,30 @@ void rrc_eNB_generate_RRCConnectionSetup(const protocol_ctxt_t *const ctxt_pP, LTE_LogicalChannelConfig_t *SRB1_logicalChannelConfig; //,*SRB2_logicalChannelConfig; LTE_SRB_ToAddModList_t **SRB_configList; LTE_SRB_ToAddMod_t *SRB1_config; - int cnt; - MessageDef *message_p; + + MessageDef *message_p; - T(T_ENB_RRC_CONNECTION_SETUP, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame), - T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti)); + T(T_ENB_RRC_CONNECTION_SETUP, + T_INT(ctxt_pP->module_id), + T_INT(ctxt_pP->frame), + T_INT(ctxt_pP->subframe), + T_INT(ctxt_pP->rnti)); eNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context; - SRB_configList = &ue_p->SRB_configList; + #if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) if (is_mtc) { ue_p->Srb0.Tx_buffer.payload_size = do_RRCConnectionSetup_BR(ctxt_pP, - ue_context_pP, - CC_id, - (uint8_t *) ue_p->Srb0.Tx_buffer.Payload, - (const uint8_t) RC.rrc[ctxt_pP->module_id]->carrier[CC_id].p_eNB, //at this point we do not have the UE capability information, so it can only be TM1 or TM2 - rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id), - SRB_configList, - &ue_context_pP->ue_context.physicalConfigDedicated); + ue_context_pP, + CC_id, + (uint8_t *) ue_p->Srb0.Tx_buffer.Payload, + (const uint8_t) RC.rrc[ctxt_pP->module_id]->carrier[CC_id].p_eNB, //at this point we do not have the UE capability information, so it can only be TM1 or TM2 + rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id), + SRB_configList, + &ue_context_pP->ue_context.physicalConfigDedicated); } else #endif { @@ -5749,66 +5861,66 @@ void rrc_eNB_generate_RRCConnectionSetup(const protocol_ctxt_t *const ctxt_pP, case ngran_ng_eNB : case ngran_gNB : - if (*SRB_configList != NULL) { - for (cnt = 0; cnt < (*SRB_configList)->list.count; cnt++) { - if ((*SRB_configList)->list.array[cnt]->srb_Identity == 1) { - SRB1_config = (*SRB_configList)->list.array[cnt]; - - if (SRB1_config->logicalChannelConfig) { - if (SRB1_config->logicalChannelConfig->present == - LTE_SRB_ToAddMod__logicalChannelConfig_PR_explicitValue) { - SRB1_logicalChannelConfig = &SRB1_config->logicalChannelConfig->choice.explicitValue; - } else { - SRB1_logicalChannelConfig = &SRB1_logicalChannelConfig_defaultValue; - } - } else { - SRB1_logicalChannelConfig = &SRB1_logicalChannelConfig_defaultValue; - } + if (*SRB_configList != NULL) { + for (int cnt = 0; cnt < (*SRB_configList)->list.count; cnt++) { + if ((*SRB_configList)->list.array[cnt]->srb_Identity == 1) { + SRB1_config = (*SRB_configList)->list.array[cnt]; + + if (SRB1_config->logicalChannelConfig) { + if (SRB1_config->logicalChannelConfig->present == + LTE_SRB_ToAddMod__logicalChannelConfig_PR_explicitValue) { + SRB1_logicalChannelConfig = &SRB1_config->logicalChannelConfig->choice.explicitValue; + } else { + SRB1_logicalChannelConfig = &SRB1_logicalChannelConfig_defaultValue; + } + } else { + SRB1_logicalChannelConfig = &SRB1_logicalChannelConfig_defaultValue; + } - LOG_D(RRC, - PROTOCOL_RRC_CTXT_UE_FMT" RRC_eNB --- MAC_CONFIG_REQ (SRB1) ---> MAC_eNB\n", - PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); - if (RC.rrc[ctxt_pP->module_id]->node_type == ngran_eNB) { - rrc_mac_config_req_eNB(ctxt_pP->module_id, - ue_context_pP->ue_context.primaryCC_id, - 0,0,0,0,0, + LOG_D(RRC, + PROTOCOL_RRC_CTXT_UE_FMT" RRC_eNB --- MAC_CONFIG_REQ (SRB1) ---> MAC_eNB\n", + PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); + if (RC.rrc[ctxt_pP->module_id]->node_type == ngran_eNB) { + rrc_mac_config_req_eNB(ctxt_pP->module_id, + ue_context_pP->ue_context.primaryCC_id, + 0,0,0,0,0, #if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) - 0, + 0, #endif - ue_context_pP->ue_context.rnti, - (LTE_BCCH_BCH_Message_t *) NULL, - (LTE_RadioResourceConfigCommonSIB_t *) NULL, + ue_context_pP->ue_context.rnti, + (LTE_BCCH_BCH_Message_t *) NULL, + (LTE_RadioResourceConfigCommonSIB_t *) NULL, #if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) - (LTE_RadioResourceConfigCommonSIB_t *) NULL, + (LTE_RadioResourceConfigCommonSIB_t *) NULL, #endif - ue_context_pP->ue_context.physicalConfigDedicated, + ue_context_pP->ue_context.physicalConfigDedicated, #if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0)) - (LTE_SCellToAddMod_r10_t *)NULL, - //(struct LTE_PhysicalConfigDedicatedSCell_r10 *)NULL, + (LTE_SCellToAddMod_r10_t *)NULL, + //(struct LTE_PhysicalConfigDedicatedSCell_r10 *)NULL, #endif - (LTE_MeasObjectToAddMod_t **) NULL, - ue_context_pP->ue_context.mac_MainConfig, - 1, - SRB1_logicalChannelConfig, - ue_context_pP->ue_context.measGapConfig, - (LTE_TDD_Config_t *) NULL, - NULL, - (LTE_SchedulingInfoList_t *) NULL, - 0, NULL, NULL, (LTE_MBSFN_SubframeConfigList_t *) NULL + (LTE_MeasObjectToAddMod_t **) NULL, + ue_context_pP->ue_context.mac_MainConfig, + 1, + SRB1_logicalChannelConfig, + ue_context_pP->ue_context.measGapConfig, + (LTE_TDD_Config_t *) NULL, + NULL, + (LTE_SchedulingInfoList_t *) NULL, + 0, NULL, NULL, (LTE_MBSFN_SubframeConfigList_t *) NULL #if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0)) - , 0, (LTE_MBSFN_AreaInfoList_r9_t *) NULL, (LTE_PMCH_InfoList_r9_t *) NULL + , 0, (LTE_MBSFN_AreaInfoList_r9_t *) NULL, (LTE_PMCH_InfoList_r9_t *) NULL #endif #if (LTE_RRC_VERSION >= MAKE_VERSION(13, 0, 0)) - , - (LTE_SystemInformationBlockType1_v1310_IEs_t *)NULL + , + (LTE_SystemInformationBlockType1_v1310_IEs_t *)NULL #endif ); } } } - break; - default : + break; + default : LOG_W(RRC, "Unknown node type %d\n", RC.rrc[ctxt_pP->module_id]->node_type); } @@ -5828,11 +5940,13 @@ void rrc_eNB_generate_RRCConnectionSetup(const protocol_ctxt_t *const ctxt_pP, PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), ue_p->Srb0.Tx_buffer.payload_size); - //ue_context_pP->ue_context.ue_release_timer_thres=100; // activate release timer, if RRCSetupComplete not received after 100 frames, remove UE - ue_context_pP->ue_context.ue_release_timer=1; - // remove UE after 10 frames after RRCConnectionRelease is triggered - ue_context_pP->ue_context.ue_release_timer_thres=1000; + ue_context_pP->ue_context.ue_release_timer = 1; + // remove UE after 10 frames after RRCConnectionRelease is triggered + ue_context_pP->ue_context.ue_release_timer_thres = 1000; + + /* init timers */ + ue_context_pP->ue_context.ue_rrc_inactivity_timer = 0; } } diff --git a/openair2/RRC/LTE/rrc_eNB_UE_context.c b/openair2/RRC/LTE/rrc_eNB_UE_context.c index 646939b8dc..197aedae51 100644 --- a/openair2/RRC/LTE/rrc_eNB_UE_context.c +++ b/openair2/RRC/LTE/rrc_eNB_UE_context.c @@ -41,7 +41,7 @@ //------------------------------------------------------------------------------ void uid_linear_allocator_init( - uid_allocator_t* const uid_pP + uid_allocator_t *const uid_pP ) //------------------------------------------------------------------------------ { @@ -51,14 +51,14 @@ uid_linear_allocator_init( //------------------------------------------------------------------------------ uid_t uid_linear_allocator_new( - eNB_RRC_INST* const rrc_instance_pP + eNB_RRC_INST *const rrc_instance_pP ) //------------------------------------------------------------------------------ { unsigned int i; unsigned int bit_index = 1; uid_t uid = 0; - uid_allocator_t* uia_p = &rrc_instance_pP->uid_allocator; + uid_allocator_t *uia_p = &rrc_instance_pP->uid_allocator; for (i=0; i < UID_LINEAR_ALLOCATOR_BITMAP_SIZE; i++) { if (uia_p->bitmap[i] != UINT_MAX) { @@ -82,7 +82,7 @@ uid_linear_allocator_new( //------------------------------------------------------------------------------ void uid_linear_allocator_free( - eNB_RRC_INST* rrc_instance_pP, + eNB_RRC_INST *rrc_instance_pP, uid_t uidP ) //------------------------------------------------------------------------------ @@ -99,7 +99,7 @@ uid_linear_allocator_free( //------------------------------------------------------------------------------ int rrc_eNB_compare_ue_rnti_id( - struct rrc_eNB_ue_context_s* c1_pP, struct rrc_eNB_ue_context_s* c2_pP) + struct rrc_eNB_ue_context_s *c1_pP, struct rrc_eNB_ue_context_s *c2_pP) //------------------------------------------------------------------------------ { if (c1_pP->ue_id_rnti > c2_pP->ue_id_rnti) { @@ -120,14 +120,14 @@ RB_GENERATE(rrc_ue_tree_s, rrc_eNB_ue_context_s, entries, //------------------------------------------------------------------------------ -struct rrc_eNB_ue_context_s* +struct rrc_eNB_ue_context_s * rrc_eNB_allocate_new_UE_context( - eNB_RRC_INST* rrc_instance_pP + eNB_RRC_INST *rrc_instance_pP ) //------------------------------------------------------------------------------ { - struct rrc_eNB_ue_context_s* new_p; - new_p = (struct rrc_eNB_ue_context_s* )malloc(sizeof(struct rrc_eNB_ue_context_s)); + struct rrc_eNB_ue_context_s *new_p; + new_p = (struct rrc_eNB_ue_context_s * )malloc(sizeof(struct rrc_eNB_ue_context_s)); if (new_p == NULL) { LOG_E(RRC, "Cannot allocate new ue context\n"); @@ -136,18 +136,20 @@ rrc_eNB_allocate_new_UE_context( memset(new_p, 0, sizeof(struct rrc_eNB_ue_context_s)); new_p->local_uid = uid_linear_allocator_new(rrc_instance_pP); + for(int i = 0; i < NB_RB_MAX; i++) { - new_p->ue_context.e_rab[i].xid = -1; - new_p->ue_context.modify_e_rab[i].xid = -1; + new_p->ue_context.e_rab[i].xid = -1; + new_p->ue_context.modify_e_rab[i].xid = -1; } + return new_p; } //------------------------------------------------------------------------------ -struct rrc_eNB_ue_context_s* +struct rrc_eNB_ue_context_s * rrc_eNB_get_ue_context( - eNB_RRC_INST* rrc_instance_pP, + eNB_RRC_INST *rrc_instance_pP, rnti_t rntiP) //------------------------------------------------------------------------------ { @@ -157,6 +159,7 @@ rrc_eNB_get_ue_context( temp.ue_id_rnti = rntiP; struct rrc_eNB_ue_context_s *ue_context_p = NULL; ue_context_p = RB_FIND(rrc_ue_tree_s, &rrc_instance_pP->rrc_ue_head, &temp); + if ( ue_context_p != NULL) { return ue_context_p; } else { @@ -172,9 +175,9 @@ rrc_eNB_get_ue_context( //------------------------------------------------------------------------------ void rrc_eNB_remove_ue_context( - const protocol_ctxt_t* const ctxt_pP, - eNB_RRC_INST* rrc_instance_pP, - struct rrc_eNB_ue_context_s* ue_context_pP) + const protocol_ctxt_t *const ctxt_pP, + eNB_RRC_INST *rrc_instance_pP, + struct rrc_eNB_ue_context_s *ue_context_pP) //------------------------------------------------------------------------------ { if (rrc_instance_pP == NULL) { @@ -190,12 +193,10 @@ void rrc_eNB_remove_ue_context( } RB_REMOVE(rrc_ue_tree_s, &rrc_instance_pP->rrc_ue_head, ue_context_pP); - MSC_LOG_EVENT( MSC_RRC_ENB, "0 Removed UE %"PRIx16" ", ue_context_pP->ue_context.rnti); - rrc_eNB_free_mem_UE_context(ctxt_pP, ue_context_pP); uid_linear_allocator_free(rrc_instance_pP, ue_context_pP->local_uid); free(ue_context_pP); diff --git a/openair2/RRC/LTE/rrc_eNB_ral.c b/openair2/RRC/LTE/rrc_eNB_ral.c index db20eb4a28..4820e84dc0 100644 --- a/openair2/RRC/LTE/rrc_eNB_ral.c +++ b/openair2/RRC/LTE/rrc_eNB_ral.c @@ -46,8 +46,7 @@ int rrc_enb_ral_delete_all_thresholds_type(unsigned int mod_idP, ral_link_param_ rrc_ral_threshold_key_t *keys = NULL; unsigned int num_keys = 0; int return_code = 0; - - rc = obj_hashtable_get_keys(eNB_rrc_inst[mod_idP].ral_meas_thresholds, (void*)&keys, &num_keys); + rc = obj_hashtable_get_keys(eNB_rrc_inst[mod_idP].ral_meas_thresholds, (void *)&keys, &num_keys); if (rc == HASH_TABLE_OK) { key = keys; @@ -82,10 +81,9 @@ int rrc_enb_ral_delete_threshold(unsigned int mod_idP, ral_link_param_type_t *pa { hashtable_rc_t rc; rrc_ral_threshold_key_t ref_key; - memcpy(&ref_key.link_param_type, param_type_pP, sizeof(ral_link_param_type_t)); memcpy(&ref_key.threshold, threshold_pP, sizeof(ral_threshold_t)); - rc = obj_hashtable_remove (eNB_rrc_inst[mod_idP].ral_meas_thresholds, (void*)&ref_key, sizeof(rrc_ral_threshold_key_t)); + rc = obj_hashtable_remove (eNB_rrc_inst[mod_idP].ral_meas_thresholds, (void *)&ref_key, sizeof(rrc_ral_threshold_key_t)); if (rc == HASH_TABLE_OK) { return 0; @@ -106,134 +104,130 @@ int rrc_enb_ral_handle_configure_threshold_request(unsigned int mod_idP, Message MessageDef *message_p = NULL; unsigned int ix_param = 0; unsigned int ix_thresholds = 0; - DevAssert(msg_pP != NULL); - LOG_I(RRC, "[eNB %d] Received %s\n", mod_idP, ITTI_MSG_NAME (msg_pP)); configure_threshold_req_p = &RRC_RAL_CONFIGURE_THRESHOLD_REQ(msg_pP); - transaction_id = configure_threshold_req_p->transaction_id; for (ix_param = 0; ix_param < configure_threshold_req_p->num_link_cfg_params; ix_param++) { link_cfg_param_p = &configure_threshold_req_p->link_cfg_params[ix_param]; switch (link_cfg_param_p->th_action) { - case RAL_TH_ACTION_SET_NORMAL_THRESHOLD: - case RAL_TH_ACTION_SET_ONE_SHOT_THRESHOLD: - switch (link_cfg_param_p->link_param_type.choice) { - - case RAL_LINK_PARAM_TYPE_CHOICE_GEN: - switch (link_cfg_param_p->link_param_type._union.link_param_gen) { - case RAL_LINK_PARAM_GEN_DATA_RATE: - case RAL_LINK_PARAM_GEN_SIGNAL_STRENGTH: - case RAL_LINK_PARAM_GEN_SINR: - case RAL_LINK_PARAM_GEN_THROUGHPUT: - case RAL_LINK_PARAM_GEN_PACKET_ERROR_RATE: - message_p = itti_alloc_new_message (TASK_RRC_ENB, PHY_MEAS_THRESHOLD_REQ); - PHY_MEAS_THRESHOLD_REQ(message_p).transaction_id = transaction_id; - memcpy (&PHY_MEAS_THRESHOLD_REQ(message_p).cfg_param, (void *) link_cfg_param_p, sizeof(ral_link_cfg_param_t)); - itti_send_msg_to_task (TASK_PHY_ENB, ITTI_MSG_INSTANCE(msg_pP), message_p); - break; - - default: - LOG_E(RRC, "Message RRC_RAL_CONFIGURE_THRESHOLD_REQ malformed, unknown link_param_gen %d\n", link_cfg_param_p->link_param_type._union.link_param_gen); - return -1; - } + case RAL_TH_ACTION_SET_NORMAL_THRESHOLD: + case RAL_TH_ACTION_SET_ONE_SHOT_THRESHOLD: + switch (link_cfg_param_p->link_param_type.choice) { + case RAL_LINK_PARAM_TYPE_CHOICE_GEN: + switch (link_cfg_param_p->link_param_type._union.link_param_gen) { + case RAL_LINK_PARAM_GEN_DATA_RATE: + case RAL_LINK_PARAM_GEN_SIGNAL_STRENGTH: + case RAL_LINK_PARAM_GEN_SINR: + case RAL_LINK_PARAM_GEN_THROUGHPUT: + case RAL_LINK_PARAM_GEN_PACKET_ERROR_RATE: + message_p = itti_alloc_new_message (TASK_RRC_ENB, PHY_MEAS_THRESHOLD_REQ); + PHY_MEAS_THRESHOLD_REQ(message_p).transaction_id = transaction_id; + memcpy (&PHY_MEAS_THRESHOLD_REQ(message_p).cfg_param, (void *) link_cfg_param_p, sizeof(ral_link_cfg_param_t)); + itti_send_msg_to_task (TASK_PHY_ENB, ITTI_MSG_INSTANCE(msg_pP), message_p); + break; + + default: + LOG_E(RRC, "Message RRC_RAL_CONFIGURE_THRESHOLD_REQ malformed, unknown link_param_gen %d\n", link_cfg_param_p->link_param_type._union.link_param_gen); + return -1; + } + + break; + + case RAL_LINK_PARAM_TYPE_CHOICE_QOS: + switch (link_cfg_param_p->link_param_type._union.link_param_qos) { + case RAL_LINK_PARAM_QOS_MAX_NUM_DIF_COS_SUPPORTED: + case RAL_LINK_PARAM_QOS_MIN_PACKET_TRANSFER_DELAY_ALL_COS: + case RAL_LINK_PARAM_QOS_AVG_PACKET_TRANSFER_DELAY_ALL_COS: + case RAL_LINK_PARAM_QOS_MAX_PACKET_TRANSFER_DELAY_ALL_COS: + case RAL_LINK_PARAM_QOS_STD_DEVIATION_PACKET_TRANSFER_DELAY: + case RAL_LINK_PARAM_QOS_PACKET_LOSS_RATE_ALL_COS_FRAME_RATIO: + message_p = itti_alloc_new_message (TASK_RRC_ENB, PHY_MEAS_THRESHOLD_REQ); + PHY_MEAS_THRESHOLD_REQ(message_p).transaction_id = transaction_id; + memcpy (&PHY_MEAS_THRESHOLD_REQ(message_p).cfg_param, (void *) link_cfg_param_p, sizeof(ral_link_cfg_param_t)); + itti_send_msg_to_task (TASK_MAC_ENB, ITTI_MSG_INSTANCE(msg_pP), message_p); + break; + + default: + LOG_E(RRC, "Message RRC_RAL_CONFIGURE_THRESHOLD_REQ malformed, unknown link_param_qos %d\n", link_cfg_param_p->link_param_type._union.link_param_qos); + return -1; + } + + break; + + case RAL_LINK_PARAM_TYPE_CHOICE_LTE: + switch (link_cfg_param_p->link_param_type._union.link_param_lte) { + // group by dest task id + case RAL_LINK_PARAM_LTE_UE_RSRP: + case RAL_LINK_PARAM_LTE_UE_RSRQ: + case RAL_LINK_PARAM_LTE_UE_CQI: + message_p = itti_alloc_new_message (TASK_RRC_ENB, PHY_MEAS_THRESHOLD_REQ); + PHY_MEAS_THRESHOLD_REQ(message_p).transaction_id = transaction_id; + memcpy (&PHY_MEAS_THRESHOLD_REQ(message_p).cfg_param, (void *) link_cfg_param_p, sizeof(ral_link_cfg_param_t)); + itti_send_msg_to_task (TASK_PHY_ENB, ITTI_MSG_INSTANCE(msg_pP), message_p); + break; + + case RAL_LINK_PARAM_LTE_AVAILABLE_BW: + case RAL_LINK_PARAM_LTE_PACKET_LOSS_RATE: + case RAL_LINK_PARAM_LTE_L2_BUFFER_STATUS: + case RAL_LINK_PARAM_LTE_PACKET_DELAY: + message_p = itti_alloc_new_message (TASK_RRC_ENB, PHY_MEAS_THRESHOLD_REQ); + PHY_MEAS_THRESHOLD_REQ(message_p).transaction_id = transaction_id; + memcpy (&PHY_MEAS_THRESHOLD_REQ(message_p).cfg_param, (void *) link_cfg_param_p, sizeof(ral_link_cfg_param_t)); + itti_send_msg_to_task (TASK_MAC_ENB, ITTI_MSG_INSTANCE(msg_pP), message_p); + break; + + case RAL_LINK_PARAM_LTE_MOBILE_NODE_CAPABILITIES: + case RAL_LINK_PARAM_LTE_EMBMS_CAPABILITY: + case RAL_LINK_PARAM_LTE_JUMBO_FEASIBILITY: + case RAL_LINK_PARAM_LTE_JUMBO_SETUP_STATUS: + case RAL_LINK_PARAM_LTE_NUM_ACTIVE_EMBMS_RECEIVERS_PER_FLOW: +#warning "TO DO MIH LTE LINK PARAMS IN RRC ENB" + break; - break; + default: + LOG_E(RRC, "Message RRC_RAL_CONFIGURE_THRESHOLD_REQ malformed, unknown link_param_lte %d\n", link_cfg_param_p->link_param_type._union.link_param_lte); + return -1; + } + + break; - case RAL_LINK_PARAM_TYPE_CHOICE_QOS: - switch (link_cfg_param_p->link_param_type._union.link_param_qos) { - case RAL_LINK_PARAM_QOS_MAX_NUM_DIF_COS_SUPPORTED: - case RAL_LINK_PARAM_QOS_MIN_PACKET_TRANSFER_DELAY_ALL_COS: - case RAL_LINK_PARAM_QOS_AVG_PACKET_TRANSFER_DELAY_ALL_COS: - case RAL_LINK_PARAM_QOS_MAX_PACKET_TRANSFER_DELAY_ALL_COS: - case RAL_LINK_PARAM_QOS_STD_DEVIATION_PACKET_TRANSFER_DELAY: - case RAL_LINK_PARAM_QOS_PACKET_LOSS_RATE_ALL_COS_FRAME_RATIO: - message_p = itti_alloc_new_message (TASK_RRC_ENB, PHY_MEAS_THRESHOLD_REQ); - PHY_MEAS_THRESHOLD_REQ(message_p).transaction_id = transaction_id; - memcpy (&PHY_MEAS_THRESHOLD_REQ(message_p).cfg_param, (void *) link_cfg_param_p, sizeof(ral_link_cfg_param_t)); - itti_send_msg_to_task (TASK_MAC_ENB, ITTI_MSG_INSTANCE(msg_pP), message_p); - break; - - default: - LOG_E(RRC, "Message RRC_RAL_CONFIGURE_THRESHOLD_REQ malformed, unknown link_param_qos %d\n", link_cfg_param_p->link_param_type._union.link_param_qos); - return -1; + default: + LOG_E(RRC, "Message RRC_RAL_CONFIGURE_THRESHOLD_REQ malformed, unknown link_param_type choice %d\n", link_cfg_param_p->link_param_type.choice); + return -1; } - break; + for (ix_thresholds=0; ix_thresholds < link_cfg_param_p->num_thresholds; ix_thresholds++) { + threshold_p = &link_cfg_param_p->thresholds[ix_thresholds]; + } - case RAL_LINK_PARAM_TYPE_CHOICE_LTE: - switch (link_cfg_param_p->link_param_type._union.link_param_lte) { - // group by dest task id - case RAL_LINK_PARAM_LTE_UE_RSRP: - case RAL_LINK_PARAM_LTE_UE_RSRQ: - case RAL_LINK_PARAM_LTE_UE_CQI: - message_p = itti_alloc_new_message (TASK_RRC_ENB, PHY_MEAS_THRESHOLD_REQ); - PHY_MEAS_THRESHOLD_REQ(message_p).transaction_id = transaction_id; - memcpy (&PHY_MEAS_THRESHOLD_REQ(message_p).cfg_param, (void *) link_cfg_param_p, sizeof(ral_link_cfg_param_t)); - itti_send_msg_to_task (TASK_PHY_ENB, ITTI_MSG_INSTANCE(msg_pP), message_p); - break; - - case RAL_LINK_PARAM_LTE_AVAILABLE_BW: - case RAL_LINK_PARAM_LTE_PACKET_LOSS_RATE: - case RAL_LINK_PARAM_LTE_L2_BUFFER_STATUS: - case RAL_LINK_PARAM_LTE_PACKET_DELAY: - message_p = itti_alloc_new_message (TASK_RRC_ENB, PHY_MEAS_THRESHOLD_REQ); - PHY_MEAS_THRESHOLD_REQ(message_p).transaction_id = transaction_id; - memcpy (&PHY_MEAS_THRESHOLD_REQ(message_p).cfg_param, (void *) link_cfg_param_p, sizeof(ral_link_cfg_param_t)); - itti_send_msg_to_task (TASK_MAC_ENB, ITTI_MSG_INSTANCE(msg_pP), message_p); - break; - - case RAL_LINK_PARAM_LTE_MOBILE_NODE_CAPABILITIES: - case RAL_LINK_PARAM_LTE_EMBMS_CAPABILITY: - case RAL_LINK_PARAM_LTE_JUMBO_FEASIBILITY: - case RAL_LINK_PARAM_LTE_JUMBO_SETUP_STATUS: - case RAL_LINK_PARAM_LTE_NUM_ACTIVE_EMBMS_RECEIVERS_PER_FLOW: -#warning "TO DO MIH LTE LINK PARAMS IN RRC ENB" - break; + break; - default: - LOG_E(RRC, "Message RRC_RAL_CONFIGURE_THRESHOLD_REQ malformed, unknown link_param_lte %d\n", link_cfg_param_p->link_param_type._union.link_param_lte); - return -1; + case RAL_TH_ACTION_CANCEL_THRESHOLD: + + // IEEE Std 802.21-2008, Table F4, Data type name=LINK_CFG_PARAM (page 228): + // When “Cancel threshold†is selected and no thresholds are specified, then all + // currently configured thresholds for the given LINK_PARAM_TYPE are cancelled. + if (link_cfg_param_p->num_thresholds == 0) { + rrc_enb_ral_delete_all_thresholds_type(mod_idP, &link_cfg_param_p->link_param_type); + } else { + // + // When “Cancel threshold†is selected and thresholds are specified only those + // configured thresholds for the given LINK_PARAM_TYPE and whose threshold value match what was + // specified are cancelled. + for (ix_thresholds=0; ix_thresholds < link_cfg_param_p->num_thresholds; ix_thresholds++) { + threshold_p = &link_cfg_param_p->thresholds[ix_thresholds]; + rrc_enb_ral_delete_threshold(mod_idP, &link_cfg_param_p->link_param_type, threshold_p); + } } break; default: - LOG_E(RRC, "Message RRC_RAL_CONFIGURE_THRESHOLD_REQ malformed, unknown link_param_type choice %d\n", link_cfg_param_p->link_param_type.choice); + LOG_E(RRC, "Message RRC_RAL_CONFIGURE_THRESHOLD_REQ malformed, unknown th_action %d\n", link_cfg_param_p->th_action); return -1; - } - - for (ix_thresholds=0; ix_thresholds < link_cfg_param_p->num_thresholds; ix_thresholds++) { - threshold_p = &link_cfg_param_p->thresholds[ix_thresholds]; - } - - break; - - case RAL_TH_ACTION_CANCEL_THRESHOLD: - - // IEEE Std 802.21-2008, Table F4, Data type name=LINK_CFG_PARAM (page 228): - // When “Cancel threshold†is selected and no thresholds are specified, then all - // currently configured thresholds for the given LINK_PARAM_TYPE are cancelled. - if (link_cfg_param_p->num_thresholds == 0) { - rrc_enb_ral_delete_all_thresholds_type(mod_idP, &link_cfg_param_p->link_param_type); - } else { - // - // When “Cancel threshold†is selected and thresholds are specified only those - // configured thresholds for the given LINK_PARAM_TYPE and whose threshold value match what was - // specified are cancelled. - for (ix_thresholds=0; ix_thresholds < link_cfg_param_p->num_thresholds; ix_thresholds++) { - threshold_p = &link_cfg_param_p->thresholds[ix_thresholds]; - rrc_enb_ral_delete_threshold(mod_idP, &link_cfg_param_p->link_param_type, threshold_p); - } - } - - break; - - default: - LOG_E(RRC, "Message RRC_RAL_CONFIGURE_THRESHOLD_REQ malformed, unknown th_action %d\n", link_cfg_param_p->th_action); - return -1; } } diff --git a/openair2/RRC/LTE/rrc_rrm_interface.c b/openair2/RRC/LTE/rrc_rrm_interface.c index 9f4270be89..fe15dae46d 100644 --- a/openair2/RRC/LTE/rrc_rrm_interface.c +++ b/openair2/RRC/LTE/rrc_rrm_interface.c @@ -44,18 +44,18 @@ */ #ifndef RRC_RRM_FIFOS_XFACE -#include <stdio.h> -#include <stdlib.h> -#include <errno.h> -#include <string.h> -#include <unistd.h> + #include <stdio.h> + #include <stdlib.h> + #include <errno.h> + #include <string.h> + #include <unistd.h> -#include <sys/socket.h> -#include <sys/un.h> + #include <sys/socket.h> + #include <sys/un.h> #else -#include<rtai_fifos.h> + #include<rtai_fifos.h> #endif @@ -78,12 +78,11 @@ \return The return value is a socket handle */ int open_socket( - sock_rrm_t *s , ///< socket descriptor + sock_rrm_t *s, ///< socket descriptor char *path_local, ///< local socket path if unix socket - char *path_dest , ///< host Socket path if unix socket + char *path_dest, ///< host Socket path if unix socket int rrm_inst ///< instance of the rrm entity -) -{ +) { /* Unix socket */ int socket_fd ; int len ; @@ -109,8 +108,6 @@ int open_socket( s->un_dest_addr.sun_family = AF_UNIX; sprintf(s->un_dest_addr.sun_path,"%s%d", path_dest, rrm_inst ); msg("Dest %s\n",s->un_dest_addr.sun_path); - - s->s = socket_fd ; return socket_fd ; } @@ -121,8 +118,7 @@ int open_socket( */ void close_socket( sock_rrm_t *sock ///< the socket handle -) -{ +) { shutdown(sock->s, SHUT_RDWR); close(sock->s); } @@ -134,10 +130,9 @@ void close_socket( */ char BUFF[2048]; int send_msg_sock( - sock_rrm_t *s ,///< socket descriptor + sock_rrm_t *s, ///< socket descriptor msg_t *smsg ///< the message to send -) -{ +) { /* Unix socket */ int ret = 0 ; // char *buf = NULL; @@ -156,13 +151,10 @@ int send_msg_sock( //buf = RRM_MALLOC(char, taille); //if (buf ==NULL) //return -1 ; - - memcpy( BUFF , &(smsg->head) , sizeof(msg_head_t) ) ; + memcpy( BUFF, &(smsg->head), sizeof(msg_head_t) ) ; memcpy( BUFF+sizeof(msg_head_t), smsg->data, smsg->head.size ) ; - iov.iov_base = (void *)BUFF; iov.iov_len = taille ; - msghd.msg_name = (void *)&(s->un_dest_addr); msghd.msg_namelen = sizeof(s->un_dest_addr); msghd.msg_iov = &iov; @@ -179,7 +171,6 @@ int send_msg_sock( //RRM_FREE(buf) ; //RRM_FREE(msg->data) ; //RRM_FREE(msg) ; - return ret ; } @@ -191,8 +182,7 @@ int send_msg_sock( */ char *recv_msg( sock_rrm_t *s ///< socket descriptor -) -{ +) { /* Unix socket */ char *buf = NULL; char *smsg = NULL; @@ -201,9 +191,7 @@ char *recv_msg( int size_msg ; msg_head_t *head ; int ret ; - int taille = SIZE_MAX_PAYLOAD ; - buf = RRM_CALLOC( char,taille); if ( buf == NULL ) { @@ -218,8 +206,7 @@ char *recv_msg( msghd.msg_iovlen = 1; msghd.msg_control = NULL ; msghd.msg_controllen= 0 ; - - ret = recvmsg(s->s, &msghd , 0 ) ; + ret = recvmsg(s->s, &msghd, 0 ) ; if ( ret <= 0 ) { // non-blocking socket @@ -236,22 +223,19 @@ char *recv_msg( head = (msg_head_t *) buf ; size_msg = sizeof(msg_head_t) + head->size ; - - smsg = RRM_CALLOC(char , size_msg ) ; + smsg = RRM_CALLOC(char, size_msg ) ; if ( smsg != NULL ) { - memcpy( smsg , buf , size_msg ) ; + memcpy( smsg, buf, size_msg ) ; } RRM_FREE( buf ) ; - return smsg ; } #else //XFACE -int send_msg_fifo(int *s, msg_t *fmsg) -{ +int send_msg_fifo(int *s, msg_t *fmsg) { int ret = 0, ret1; int taille = sizeof(msg_head_t) ; msg("write on fifos %d, msg %p\n",*s,fmsg); @@ -261,9 +245,7 @@ int send_msg_fifo(int *s, msg_t *fmsg) } // envoi le header - - - ret1 = rtf_put (*s,(char*) &(fmsg->head) , taille); + ret1 = rtf_put (*s,(char *) &(fmsg->head), taille); if(ret1 <0) { msg("rtf_put H ERR %d\n",ret1); @@ -275,7 +257,7 @@ int send_msg_fifo(int *s, msg_t *fmsg) // envoi les datas si elles sont definis if ( fmsg->data != NULL ) { - ret1 += rtf_put (*s,(char*) fmsg->data, fmsg->head.size); + ret1 += rtf_put (*s,(char *) fmsg->data, fmsg->head.size); if(ret1 <0) { msg("rtf_put D ERR %d\n",ret1); @@ -290,7 +272,6 @@ int send_msg_fifo(int *s, msg_t *fmsg) #endif //XFACE -int send_msg(void *s, msg_t *smsg) -{ +int send_msg(void *s, msg_t *smsg) { send_msg_sock((sock_rrm_t *)s, smsg); } diff --git a/openair2/RRC/LTE/rrm_2_rrc_msg.c b/openair2/RRC/LTE/rrm_2_rrc_msg.c index 3ed3a9d859..79cdc74e2b 100644 --- a/openair2/RRC/LTE/rrm_2_rrc_msg.c +++ b/openair2/RRC/LTE/rrm_2_rrc_msg.c @@ -51,26 +51,22 @@ //#include "openair_rrc_utils.h" //#include "openair_rrc_main.h" #ifdef PHY_EMUL -#include "SIMULATION/simulation_defs.h" -extern EMULATION_VARS *Emul_vars; -extern CH_MAC_INST *CH_mac_inst; -extern UE_MAC_INST *UE_mac_inst; + #include "SIMULATION/simulation_defs.h" + extern EMULATION_VARS *Emul_vars; + extern CH_MAC_INST *CH_mac_inst; + extern UE_MAC_INST *UE_mac_inst; #endif /******************************************************************************/ -void fn_rrc (void) -{ +void fn_rrc (void) { /******************************************************************************/ - msg_head_t *Header ; char *Data; - L2_ID Mac_id; while(1) { - Header = (msg_head_t *) recv_msg(&S_rrc) ; if(Header==NULL) { @@ -86,118 +82,107 @@ void fn_rrc (void) msg("Got MSG of Type %d on Inst %d\n",Header->msg_type,Header->inst); switch ( Header->msg_type ) { - case RRM_INIT_CH_REQ: { - rrm_init_ch_req_t *p = (rrm_init_ch_req_t *) Data; - msg( "[RRM]>[RRC][Inst %d]:RRM_INIT_CH_REQ\n",Header->inst); - rrc_init_ch_req(Header->inst,p); - break; - } - - case RRCI_INIT_MR_REQ: { - rrci_init_mr_req_t *p = (rrci_init_mr_req_t *) Data; - msg( "[RRM]>[RRC][Inst %d]:RRCI_INIT_MR_REQ\n",Header->inst); - rrc_init_mr_req(Header->inst,p); - break; - } - - case RRM_RB_ESTABLISH_REQ: { - send_msg((void *)&S_rrc,msg_rrc_rb_establish_resp(Header->inst,Header->Trans_id)); - msg( "[RRM]>[RRC][Inst %d]:RRM_RB_ESTABLISH_REQ, size %d\n",Header->inst,sizeof(rrm_rb_establish_req_t)); - rrc_config_req(Header->inst,(void*)Data,Header->msg_type,Header->Trans_id); - break ; - } - - case RRM_RB_MODIFY_REQ: { - send_msg((void *)&S_rrc,msg_rrc_rb_modify_resp(Header->inst,Header->Trans_id)); - msg( "[RRM]>[RRC][Inst %d]:RRM_RB_MODIFY_REQ\n",Header->inst); - rrc_config_req(Header->inst,Data,Header->msg_type,Header->Trans_id); - } - - case RRM_RB_RELEASE_REQ: { - send_msg((void *)&S_rrc,msg_rrc_rb_release_resp(Header->inst,Header->Trans_id)); - msg( "[RRM]>[RRC][Inst %d]:RRM_RB_RELEASE_REQ\n",Header->inst); - rrc_config_req(Header->inst,Data,Header->msg_type,Header->Trans_id); - } - - case RRCI_CX_ESTABLISH_RESP: { - rrci_cx_establish_resp_t *p = (rrci_cx_establish_resp_t *) Data; - unsigned char CH_index,i; - msg( "[RRCI]>[RRC][Inst %d]:RRCI_CX_ESTABLISH_RESP\n",Header->inst); - - for(i=0; i<NB_SIG_CNX_UE; i++) - if(!bcmp(&UE_rrc_inst[Header->inst-NB_CH_INST].Info[i].CH_mac_id,&p->L2_id,sizeof(L2_ID))) { - CH_index=i; - break; - } - - if(i==NB_SIG_CNX_UE) { - msg("[RRC] FATAL: CH_INDEX NOT FOUND\n"); - return; + case RRM_INIT_CH_REQ: { + rrm_init_ch_req_t *p = (rrm_init_ch_req_t *) Data; + msg( "[RRM]>[RRC][Inst %d]:RRM_INIT_CH_REQ\n",Header->inst); + rrc_init_ch_req(Header->inst,p); + break; } - UE_rrc_inst[Header->inst-NB_CH_INST].Srb2[CH_index].Srb_info.IP_addr_type=p->L3_info_t; - - if(p->L3_info_t == IPv4_ADDR) { - memcpy(&UE_rrc_inst[Header->inst-NB_CH_INST].Srb2[CH_index].Srb_info.IP_addr,p->L3_info,4); + case RRCI_INIT_MR_REQ: { + rrci_init_mr_req_t *p = (rrci_init_mr_req_t *) Data; + msg( "[RRM]>[RRC][Inst %d]:RRCI_INIT_MR_REQ\n",Header->inst); + rrc_init_mr_req(Header->inst,p); + break; } - else { - memcpy(&UE_rrc_inst[Header->inst-NB_CH_INST].Srb2[CH_index].Srb_info.IP_addr,p->L3_info,16); + case RRM_RB_ESTABLISH_REQ: { + send_msg((void *)&S_rrc,msg_rrc_rb_establish_resp(Header->inst,Header->Trans_id)); + msg( "[RRM]>[RRC][Inst %d]:RRM_RB_ESTABLISH_REQ, size %d\n",Header->inst,sizeof(rrm_rb_establish_req_t)); + rrc_config_req(Header->inst,(void *)Data,Header->msg_type,Header->Trans_id); + break ; } - } - break ; - case RRM_SENSING_MEAS_REQ: { - // rrm_sensing_meas_req_t *p = (rrm_sensing_meas_req_t *) sock_msg ; - send_msg((void *)&S_rrc,msg_rrc_sensing_meas_resp(Header->inst,Header->Trans_id)); - msg( "[RRM]>[RRC][Inst %d]:RRM_SENSING_MEAS_REQ\n",Header->inst); - // rrc_meas_req(header->inst,p,RRC_MEAS_ADD); - } - break ; - - - case RRM_SENSING_MEAS_RESP: { - msg( "[RRM]>[RRC][Inst %d]:RRM_SENSING_MEAS_RESP\n",Header->inst); - //rrm_rrc_meas_resp(header->inst,header->Trans_id); - } - break ; - - - case RRM_SCAN_ORD: - msg( "[RRM]>[RRC][Inst %d]:RRM_SCAN_ORD\n",Header->inst); - //memcpy(&CH_rrc_inst[0].Rrm_init_scan_req,(rrm_init_scan_req_t *) Data,sizeof(rrm_init_scan_req_t)); - //CH_rrc_inst[0].Last_scan_req=Rrc_xface->Frame_index; - ///send over air + case RRM_RB_MODIFY_REQ: { + send_msg((void *)&S_rrc,msg_rrc_rb_modify_resp(Header->inst,Header->Trans_id)); + msg( "[RRM]>[RRC][Inst %d]:RRM_RB_MODIFY_REQ\n",Header->inst); + rrc_config_req(Header->inst,Data,Header->msg_type,Header->Trans_id); + } - break; + case RRM_RB_RELEASE_REQ: { + send_msg((void *)&S_rrc,msg_rrc_rb_release_resp(Header->inst,Header->Trans_id)); + msg( "[RRM]>[RRC][Inst %d]:RRM_RB_RELEASE_REQ\n",Header->inst); + rrc_config_req(Header->inst,Data,Header->msg_type,Header->Trans_id); + } - case RRM_INIT_SCAN_REQ: - msg( "[RRM]>[RRC][Inst %d]:RRM_INIT_SCAN_REQ\n",Header->inst); - memcpy(&CH_rrc_inst[0].Rrm_init_scan_req,(rrm_init_scan_req_t *) Data,sizeof(rrm_init_scan_req_t)); - CH_rrc_inst[0].Last_scan_req=Rrc_xface->Frame_index; - ///send over air + case RRCI_CX_ESTABLISH_RESP: { + rrci_cx_establish_resp_t *p = (rrci_cx_establish_resp_t *) Data; + unsigned char CH_index,i; + msg( "[RRCI]>[RRC][Inst %d]:RRCI_CX_ESTABLISH_RESP\n",Header->inst); - break; + for(i=0; i<NB_SIG_CNX_UE; i++) + if(!bcmp(&UE_rrc_inst[Header->inst-NB_CH_INST].Info[i].CH_mac_id,&p->L2_id,sizeof(L2_ID))) { + CH_index=i; + break; + } - case RRM_END_SCAN_REQ: + if(i==NB_SIG_CNX_UE) { + msg("[RRC] FATAL: CH_INDEX NOT FOUND\n"); + return; + } - msg( "[RRM]>[RRC][Inst %d]:RRM_END_SCAN_REQ\n",Header->inst); - memcpy(&Mac_id.L2_id[0],Data,sizeof(L2_ID)); - unsigned char UE_index=Mac_id.L2_id[0]-NB_CH_MAX+1; + UE_rrc_inst[Header->inst-NB_CH_INST].Srb2[CH_index].Srb_info.IP_addr_type=p->L3_info_t; + if(p->L3_info_t == IPv4_ADDR) { + memcpy(&UE_rrc_inst[Header->inst-NB_CH_INST].Srb2[CH_index].Srb_info.IP_addr,p->L3_info,4); + } else { + memcpy(&UE_rrc_inst[Header->inst-NB_CH_INST].Srb2[CH_index].Srb_info.IP_addr,p->L3_info,16); + } + } + break ; - UE_rrc_inst[0].Srb2[UE_index].Srb_info.Tx_buffer.Payload[0]=100; - msg("SRB_ID %d\n",CH_rrc_inst[0].Srb2[UE_index].Srb_info.Srb_id); - Mac_rlc_xface->rrc_rlc_data_req(0,CH_rrc_inst[0].Srb2[UE_index].Srb_info.Srb_id,0,0,1,CH_rrc_inst[0].Srb2[UE_index].Srb_info.Tx_buffer.Payload); - //CH_rrc_inst[0].Last_scan_req=Rrc_xface->Frame_index; - ///send over air + case RRM_SENSING_MEAS_REQ: { + // rrm_sensing_meas_req_t *p = (rrm_sensing_meas_req_t *) sock_msg ; + send_msg((void *)&S_rrc,msg_rrc_sensing_meas_resp(Header->inst,Header->Trans_id)); + msg( "[RRM]>[RRC][Inst %d]:RRM_SENSING_MEAS_REQ\n",Header->inst); + // rrc_meas_req(header->inst,p,RRC_MEAS_ADD); + } + break ; - break; + case RRM_SENSING_MEAS_RESP: { + msg( "[RRM]>[RRC][Inst %d]:RRM_SENSING_MEAS_RESP\n",Header->inst); + //rrm_rrc_meas_resp(header->inst,header->Trans_id); + } + break ; - default : - msg("[L3_xface]WARNING: msg unknown %d\n",Header->msg_type) ; + case RRM_SCAN_ORD: + msg( "[RRM]>[RRC][Inst %d]:RRM_SCAN_ORD\n",Header->inst); + //memcpy(&CH_rrc_inst[0].Rrm_init_scan_req,(rrm_init_scan_req_t *) Data,sizeof(rrm_init_scan_req_t)); + //CH_rrc_inst[0].Last_scan_req=Rrc_xface->Frame_index; + ///send over air + break; + + case RRM_INIT_SCAN_REQ: + msg( "[RRM]>[RRC][Inst %d]:RRM_INIT_SCAN_REQ\n",Header->inst); + memcpy(&CH_rrc_inst[0].Rrm_init_scan_req,(rrm_init_scan_req_t *) Data,sizeof(rrm_init_scan_req_t)); + CH_rrc_inst[0].Last_scan_req=Rrc_xface->Frame_index; + ///send over air + break; + + case RRM_END_SCAN_REQ: + msg( "[RRM]>[RRC][Inst %d]:RRM_END_SCAN_REQ\n",Header->inst); + memcpy(&Mac_id.L2_id[0],Data,sizeof(L2_ID)); + unsigned char UE_index=Mac_id.L2_id[0]-NB_CH_MAX+1; + UE_rrc_inst[0].Srb2[UE_index].Srb_info.Tx_buffer.Payload[0]=100; + msg("SRB_ID %d\n",CH_rrc_inst[0].Srb2[UE_index].Srb_info.Srb_id); + Mac_rlc_xface->rrc_rlc_data_req(0,CH_rrc_inst[0].Srb2[UE_index].Srb_info.Srb_id,0,0,1,CH_rrc_inst[0].Srb2[UE_index].Srb_info.Tx_buffer.Payload); + //CH_rrc_inst[0].Last_scan_req=Rrc_xface->Frame_index; + ///send over air + break; + + default : + msg("[L3_xface]WARNING: msg unknown %d\n",Header->msg_type) ; } - } } diff --git a/openair2/RRC/LTE/utils.c b/openair2/RRC/LTE/utils.c index bbf97046bf..08637e0e67 100644 --- a/openair2/RRC/LTE/utils.c +++ b/openair2/RRC/LTE/utils.c @@ -34,8 +34,7 @@ ________________________________________________________________*/ //------------------------------------------------------------------------------------------------------------------// -uint16_t find_free_dtch_position(uint8_t Mod_id, uint16_t UE_CH_index) -{ +uint16_t find_free_dtch_position(uint8_t Mod_id, uint16_t UE_CH_index) { uint16_t i,j; if(UE_CH_index==0) { @@ -45,22 +44,18 @@ uint16_t find_free_dtch_position(uint8_t Mod_id, uint16_t UE_CH_index) } for(i=j; i<NB_RAB_MAX; i++) { //first RAB IS BROADCAST DTCH - if(CH_rrc_inst[Mod_id].Rab[i][UE_CH_index].Active==0) { return( i); } } msg("NO FREE DTCH LCHAN, exit... \n"); - Mac_rlc_xface->macphy_exit("NO FREE DTCH LCHAN, exit"); - return 0; } //-------------------------------------------------------------------------------------------// -uint8_t rrc_find_free_ue_index(uint8_t Mod_id) -{ +uint8_t rrc_find_free_ue_index(uint8_t Mod_id) { //-------------------------------------------------------------------------------------------// uint16_t i; @@ -78,8 +73,7 @@ uint8_t rrc_find_free_ue_index(uint8_t Mod_id) //-------------------------------------------------------------------------------------------// -unsigned short rrc_find_ue_index(unsigned char Mod_id, L2_ID Mac_id) -{ +unsigned short rrc_find_ue_index(unsigned char Mod_id, L2_ID Mac_id) { //-------------------------------------------------------------------------------------------// unsigned char i; /* @@ -90,8 +84,7 @@ unsigned short rrc_find_ue_index(unsigned char Mod_id, L2_ID Mac_id) */ } //-------------------------------------------------------------------------------------------// -uint8_t rrc_is_node_isolated(uint8_t Mod_id) -{ +uint8_t rrc_is_node_isolated(uint8_t Mod_id) { //-------------------------------------------------------------------------------------------// /*uint8_t i; for(i=0;i<NB_CNX_UE;i++) @@ -102,8 +95,7 @@ uint8_t rrc_is_node_isolated(uint8_t Mod_id) } //-------------------------------------------------------------------------------------------// -uint8_t find_rrc_info_index(uint8_t Mod_id,uint8_t CH_id) -{ +uint8_t find_rrc_info_index(uint8_t Mod_id,uint8_t CH_id) { //-------------------------------------------------------------------------------------------// /*uint8_t i; @@ -170,8 +162,7 @@ RB_INFO* rrc_find_rb_info(uint8_t Mod_id,uint16_t Rb_id){ */ /*------------------------------------------------------------------------------*/ -unsigned char rrc_is_mobile_already_associated(uint8_t Mod_id, L2_ID Mac_id) -{ +unsigned char rrc_is_mobile_already_associated(uint8_t Mod_id, L2_ID Mac_id) { /*------------------------------------------------------------------------------*/ /* unsigned char i; @@ -184,8 +175,7 @@ unsigned char rrc_is_mobile_already_associated(uint8_t Mod_id, L2_ID Mac_id) //-------------------------------------------------------------------------------------------// -void rrc_reset_buffer(RRC_BUFFER *Rrc_buffer) -{ +void rrc_reset_buffer(RRC_BUFFER *Rrc_buffer) { //-------------------------------------------------------------------------------------------// // Rrc_buffer->Header->Rv_tb_idx=0; // Rrc_buffer->W_idx=0; -- GitLab