From 1b90c4a02d3924e99d2fc8039b8f30fd882b2aa0 Mon Sep 17 00:00:00 2001 From: Konstantinos Alexandris <konstantinos.alexandris@eurecom.fr> Date: Fri, 10 May 2019 17:45:47 +0200 Subject: [PATCH] Create RRC setters for Periodic, A1-A5 event and offsets related to RRC Measurement Report --- cmake_targets/CMakeLists.txt | 1 + .../RRC/flexran_agent_rrc_internal.c | 147 +++++ .../RRC/flexran_agent_rrc_internal.h | 31 ++ openair2/ENB_APP/MESSAGES/V2/flexran.proto | 5 +- openair2/ENB_APP/flexran_agent_common.c | 53 +- openair2/ENB_APP/flexran_agent_ran_api.c | 398 ++++++++++++- openair2/ENB_APP/flexran_agent_ran_api.h | 39 ++ openair2/RRC/LTE/rrc_eNB.c | 524 ++++++++++++------ openair2/RRC/LTE/rrc_proto.h | 3 +- 9 files changed, 1018 insertions(+), 183 deletions(-) create mode 100644 openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc_internal.c create mode 100644 openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc_internal.h diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 29792d12600..8f08c2375ff 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -887,6 +887,7 @@ add_library(FLEXRAN_AGENT ${OPENAIR2_DIR}/ENB_APP/CONTROL_MODULES/PHY/flexran_agent_phy.c ${OPENAIR2_DIR}/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac.c ${OPENAIR2_DIR}/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc.c + ${OPENAIR2_DIR}/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc_internal.c ${OPENAIR2_DIR}/ENB_APP/CONTROL_MODULES/PDCP/flexran_agent_pdcp.c ${OPENAIR2_DIR}/ENB_APP/flexran_agent.c ${OPENAIR2_DIR}/ENB_APP/flexran_agent_task_manager.c diff --git a/openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc_internal.c b/openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc_internal.c new file mode 100644 index 00000000000..e8bbd13af48 --- /dev/null +++ b/openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc_internal.c @@ -0,0 +1,147 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include "flexran_agent_rrc_internal.h" +#include "flexran_agent_ran_api.h" + +int update_rrc_reconfig(mid_t mod_id, rnti_t rnti, Protocol__FlexRrcTriggering *trigg) { + + // Measurement info reconfiguration + + if (trigg->meas_info) { + + /* Set serving cell frequency offset */ + if (trigg->meas_info->has_offset_freq_serving) { + if (flexran_set_rrc_ofp(mod_id, rnti, trigg->meas_info->offset_freq_serving) < 0) { + LOG_E(FLEXRAN_AGENT, "Cannot set Serving cell frequency offset\n"); + return -1; + } + } + + /* Set neighbouring cell frequency offset */ + if (trigg->meas_info->has_offset_freq_neighbouring) { + if (flexran_set_rrc_ofn(mod_id, rnti, trigg->meas_info->offset_freq_neighbouring) < 0) { + LOG_E(FLEXRAN_AGENT, "Cannot set Neighbouring cell frequency offset\n"); + return -1; + } + } + + if (trigg->meas_info->n_cell_individual_offset > 0) { + /* Set the serving cell offset */ + if (flexran_set_rrc_ocp(mod_id, rnti, trigg->meas_info->cell_individual_offset[0]) < 0) { + LOG_E(FLEXRAN_AGENT, "Cannot set Serving cell offset\n"); + return -1; + } + + /* Set the neighbouring cell offset */ + for (int i=0; i<(trigg->meas_info->n_cell_individual_offset-1); i++) { + if (flexran_set_rrc_ocn(mod_id, rnti, i, trigg->meas_info->cell_individual_offset[i+1]) < 0) { + LOG_E(FLEXRAN_AGENT, "Cannot set Neighbouring cell offset\n"); + return -1; + } + } + } + + if (trigg->meas_info->has_offset_freq_neighbouring) { + if (flexran_set_rrc_ofn(mod_id, rnti, trigg->meas_info->offset_freq_neighbouring) < 0) { + LOG_E(FLEXRAN_AGENT, "Cannot set Neighbouring cell frequency offset\n"); + return -1; + } + } + + + /* Set rsrp filter coefficient */ + if (trigg->meas_info->has_filter_coefficient_rsrp) { + if (flexran_set_filter_coeff_rsrp(mod_id, rnti, trigg->meas_info->filter_coefficient_rsrp) < 0) { + LOG_E(FLEXRAN_AGENT, "Cannot set RSRP filter coefficient\n"); + return -1; + } + } + + /* Set rsrq filter coefficient */ + if (trigg->meas_info->has_filter_coefficient_rsrq) { + if (flexran_set_filter_coeff_rsrq(mod_id, rnti, trigg->meas_info->filter_coefficient_rsrq) < 0) { + LOG_E(FLEXRAN_AGENT, "Cannot set RSRQ filter coefficient\n"); + return -1; + } + } + + if (trigg->meas_info->event) { + + /* Set Periodic event parameters */ + if (trigg->meas_info->event->periodical) { + + /* Set Periodic event maximum number of reported cells */ + if (trigg->meas_info->event->periodical->has_max_report_cells) { + if (flexran_set_rrc_per_event_maxReportCells(mod_id, rnti, trigg->meas_info->event->periodical->max_report_cells) < 0) { + LOG_E(FLEXRAN_AGENT, "Cannot set Periodic event max\n"); + return -1; + } + } + } + + /* Set A3 event parameters */ + if (trigg->meas_info->event->a3) { + + /* Set A3 event a3 offset */ + if (trigg->meas_info->event->a3->has_a3_offset) { + if (flexran_set_rrc_a3_event_a3_offset(mod_id, rnti, trigg->meas_info->event->a3->a3_offset) < 0) { + LOG_E(FLEXRAN_AGENT, "Cannot set A3 event offset\n"); + return -1; + } + } + + /* Set A3 event report on leave */ + if (trigg->meas_info->event->a3->has_report_on_leave) { + if (flexran_set_rrc_a3_event_reportOnLeave(mod_id, rnti, trigg->meas_info->event->a3->report_on_leave) < 0) { + LOG_E(FLEXRAN_AGENT, "Cannot set A3 event report on leave\n"); + return -1; + } + } + + /* Set A3 event hysteresis */ + if (trigg->meas_info->event->a3->has_hysteresis) { + if (flexran_set_rrc_a3_event_hysteresis(mod_id, rnti, trigg->meas_info->event->a3->hysteresis) < 0) { + LOG_E(FLEXRAN_AGENT, "Cannot set A3 event hysteresis\n"); + return -1; + } + } + + /* Set A3 event time to trigger */ + if (trigg->meas_info->event->a3->has_time_to_trigger) { + if (flexran_set_rrc_a3_event_timeToTrigger(mod_id, rnti, trigg->meas_info->event->a3->time_to_trigger) < 0) { + LOG_E(FLEXRAN_AGENT, "Cannot set A3 event time to trigger\n"); + return -1; + } + } + + /* Set A3 event maximum number of reported cells */ + if (trigg->meas_info->event->a3->has_max_report_cells) { + if (flexran_set_rrc_a3_event_maxReportCells(mod_id, rnti, trigg->meas_info->event->a3->max_report_cells) < 0) { + LOG_E(FLEXRAN_AGENT, "Cannot set A3 event max report cells\n"); + return -1; + } + } + } + } + } + return 0; +} diff --git a/openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc_internal.h b/openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc_internal.h new file mode 100644 index 00000000000..3987cb8f3f0 --- /dev/null +++ b/openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc_internal.h @@ -0,0 +1,31 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#ifndef FLEXRAN_AGENT_RRC_INTERNAL_H_ +#define FLEXRAN_AGENT_RRC_INTERNAL_H_ + +#include "flexran_agent_rrc_internal.h" +#include "flexran_agent_ran_api.h" + +int update_rrc_reconfig(mid_t mod_id, rnti_t rnti, Protocol__FlexRrcTriggering *trigg); + +#endif /*FLEXRAN_AGENT_RRC_INTERNAL_H_*/ + diff --git a/openair2/ENB_APP/MESSAGES/V2/flexran.proto b/openair2/ENB_APP/MESSAGES/V2/flexran.proto index b1702f949e4..840e53f6168 100644 --- a/openair2/ENB_APP/MESSAGES/V2/flexran.proto +++ b/openair2/ENB_APP/MESSAGES/V2/flexran.proto @@ -7,7 +7,7 @@ import "time_common.proto"; import "config_messages.proto"; import "controller_commands.proto"; import "control_delegation.proto"; - +import "config_common.proto"; message flexran_message { optional flexran_direction msg_dir = 100; @@ -188,7 +188,8 @@ message flex_ul_mac_config { message flex_rrc_triggering { optional flex_header header = 1; - optional string rrc_trigger = 2; + optional string rrc_trigger = 2; + optional flex_measurement_info meas_info = 3; } // diff --git a/openair2/ENB_APP/flexran_agent_common.c b/openair2/ENB_APP/flexran_agent_common.c index 5cbcee370a8..e2bd5f8146b 100644 --- a/openair2/ENB_APP/flexran_agent_common.c +++ b/openair2/ENB_APP/flexran_agent_common.c @@ -41,6 +41,7 @@ //#include "PHY/extern.h" #include "common/utils/LOG/log.h" #include "flexran_agent_mac_internal.h" +#include "flexran_agent_rrc_internal.h" //#include "SCHED/defs.h" #include "RRC/LTE/rrc_extern.h" @@ -805,10 +806,12 @@ error: int flexran_agent_rrc_measurement(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg) { - protocol_ctxt_t ctxt; + //protocol_ctxt_t ctxt; Protocol__FlexranMessage *input = (Protocol__FlexranMessage *)params; Protocol__FlexRrcTriggering *triggering = input->rrc_triggering; - agent_reconf_rrc *reconf_param = malloc(sizeof(agent_reconf_rrc)); + //agent_reconf_rrc *rrc_reconf = malloc(sizeof(agent_reconf_rrc)); + + #if 0 reconf_param->trigger_policy = triggering->rrc_trigger; reconf_param->report_interval = 0; reconf_param->report_amount = 0; @@ -817,9 +820,51 @@ int flexran_agent_rrc_measurement(mid_t mod_id, const void *params, Protocol__Fl PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, mod_id, ENB_FLAG_YES, ue_context_p->ue_context.rnti, flexran_get_current_frame(mod_id), flexran_get_current_subframe (mod_id), mod_id); flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(&ctxt, ue_context_p, 0, reconf_param); } + #endif + + // TODO: Step 1 - Verification process + + // Step 2 - Set the proper values using FlexRAN API (protected with mutex ?) + int num_ue = 0; + + if (flexran_agent_get_rrc_xface(mod_id)) + num_ue = flexran_get_rrc_num_ues(mod_id); + else if (flexran_agent_get_mac_xface(mod_id)) + num_ue = flexran_get_mac_num_ues(mod_id); + + if (flexran_agent_get_rrc_xface(mod_id) && flexran_agent_get_mac_xface(mod_id) + && flexran_get_rrc_num_ues(mod_id) != flexran_get_mac_num_ues(mod_id)) { + const int nrrc = flexran_get_rrc_num_ues(mod_id); + const int nmac = flexran_get_mac_num_ues(mod_id); + num_ue = nrrc < nmac ? nrrc : nmac; + LOG_E(FLEXRAN_AGENT, "%s(): different numbers of UEs in RRC (%d) and MAC (%d), reporting for %d UEs\n", + __func__, nrrc, nmac, num_ue); + } + + if (num_ue == 0) + return 0; + + int error = 0; + rnti_t rntis[num_ue]; + flexran_get_rrc_rnti_list(mod_id, rntis, num_ue); + for (int i = 0; i < num_ue; i++) { + const rnti_t rnti = rntis[i]; + if (flexran_agent_get_rrc_xface(mod_id)) + error = update_rrc_reconfig(mod_id, rnti, triggering); + if (error < 0) { + LOG_E(FLEXRAN_AGENT, "Error in updating user %d\n", i); + } + else { + // Step 3 - Call the proper wrapper in FlexRAN API + if (flexran_call_rrc_reconfiguration (mod_id, rnti) <0) { + LOG_E(FLEXRAN_AGENT, "Error in reconfiguring user %d\n", i); + } + } + } + *msg = NULL; - free(reconf_param); - reconf_param = NULL; + //free(reconf_param); + //reconf_param = NULL; return 0; } diff --git a/openair2/ENB_APP/flexran_agent_ran_api.c b/openair2/ENB_APP/flexran_agent_ran_api.c index b418e9cbb35..b711e9b13e7 100644 --- a/openair2/ENB_APP/flexran_agent_ran_api.c +++ b/openair2/ENB_APP/flexran_agent_ran_api.c @@ -1434,6 +1434,19 @@ uint32_t flexran_get_pdcp_rx_oo(mid_t mod_id, uint16_t uid, lcid_t lcid) } /******************** RRC *****************************/ +/* RRC Wrappers */ +int flexran_call_rrc_reconfiguration (mid_t mod_id, rnti_t rnti) { + if (!rrc_is_present(mod_id)) return -1; + protocol_ctxt_t ctxt; + memset(&ctxt, 0, sizeof(ctxt)); + struct rrc_eNB_ue_context_s* ue_context_p = rrc_eNB_get_ue_context(RC.rrc[mod_id], rnti); + if (!ue_context_p) return -1; + PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, mod_id, ENB_FLAG_YES, ue_context_p->ue_context.rnti, flexran_get_current_frame(mod_id), flexran_get_current_subframe (mod_id), mod_id); + flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(&ctxt, ue_context_p, 0); + return 0; +} + +/* RRC Getters */ LTE_MeasId_t flexran_get_rrc_pcell_measid(mid_t mod_id, rnti_t rnti) { if (!rrc_is_present(mod_id)) return -1; @@ -1565,6 +1578,8 @@ float flexran_get_rrc_neigh_rsrq(mid_t mod_id, rnti_t rnti, long cell_id) { return RSRQ_meas_mapping[*(ue_context_p->ue_context.measResults->measResultNeighCells->choice.measResultListEUTRA.list.array[cell_id]->measResult.rsrqResult)]; } +/* Measurement offsets */ + long flexran_get_rrc_ofp(mid_t mod_id, rnti_t rnti) { if (!rrc_is_present(mod_id)) return -1; struct rrc_eNB_ue_context_s* ue_context_p = rrc_eNB_get_ue_context(RC.rrc[mod_id], rnti); @@ -1586,7 +1601,40 @@ long flexran_get_rrc_ocp(mid_t mod_id, rnti_t rnti) { struct rrc_eNB_ue_context_s* ue_context_p = rrc_eNB_get_ue_context(RC.rrc[mod_id], rnti); if (!ue_context_p) return -1; if (!ue_context_p->ue_context.measurement_info) return -1; - return ue_context_p->ue_context.measurement_info->cellIndividualOffset[0]; + switch (ue_context_p->ue_context.measurement_info->cellIndividualOffset[0]) { + case LTE_Q_OffsetRange_dB_24: return -24; + case LTE_Q_OffsetRange_dB_22: return -22; + case LTE_Q_OffsetRange_dB_20: return -20; + case LTE_Q_OffsetRange_dB_18: return -18; + case LTE_Q_OffsetRange_dB_16: return -16; + case LTE_Q_OffsetRange_dB_14: return -14; + case LTE_Q_OffsetRange_dB_12: return -12; + case LTE_Q_OffsetRange_dB_10: return -10; + case LTE_Q_OffsetRange_dB_8: return -8; + case LTE_Q_OffsetRange_dB_6: return -6; + case LTE_Q_OffsetRange_dB_5: return -5; + case LTE_Q_OffsetRange_dB_4: return -4; + case LTE_Q_OffsetRange_dB_3: return -3; + case LTE_Q_OffsetRange_dB_2: return -2; + case LTE_Q_OffsetRange_dB_1: return -1; + case LTE_Q_OffsetRange_dB0: return 0; + case LTE_Q_OffsetRange_dB1: return 1; + case LTE_Q_OffsetRange_dB2: return 2; + case LTE_Q_OffsetRange_dB3: return 3; + case LTE_Q_OffsetRange_dB4: return 4; + case LTE_Q_OffsetRange_dB5: return 5; + case LTE_Q_OffsetRange_dB6: return 6; + case LTE_Q_OffsetRange_dB8: return 8; + case LTE_Q_OffsetRange_dB10: return 10; + case LTE_Q_OffsetRange_dB12: return 12; + case LTE_Q_OffsetRange_dB14: return 14; + case LTE_Q_OffsetRange_dB16: return 16; + case LTE_Q_OffsetRange_dB18: return 18; + case LTE_Q_OffsetRange_dB20: return 20; + case LTE_Q_OffsetRange_dB22: return 22; + case LTE_Q_OffsetRange_dB24: return 24; + default: return -99; + } } long flexran_get_rrc_ocn(mid_t mod_id, rnti_t rnti, long cell_id) { @@ -1594,7 +1642,40 @@ long flexran_get_rrc_ocn(mid_t mod_id, rnti_t rnti, long cell_id) { struct rrc_eNB_ue_context_s* ue_context_p = rrc_eNB_get_ue_context(RC.rrc[mod_id], rnti); if (!ue_context_p) return -1; if (!ue_context_p->ue_context.measurement_info) return -1; - return ue_context_p->ue_context.measurement_info->cellIndividualOffset[cell_id+1]; + switch (ue_context_p->ue_context.measurement_info->cellIndividualOffset[cell_id+1]) { + case LTE_Q_OffsetRange_dB_24: return -24; + case LTE_Q_OffsetRange_dB_22: return -22; + case LTE_Q_OffsetRange_dB_20: return -20; + case LTE_Q_OffsetRange_dB_18: return -18; + case LTE_Q_OffsetRange_dB_16: return -16; + case LTE_Q_OffsetRange_dB_14: return -14; + case LTE_Q_OffsetRange_dB_12: return -12; + case LTE_Q_OffsetRange_dB_10: return -10; + case LTE_Q_OffsetRange_dB_8: return -8; + case LTE_Q_OffsetRange_dB_6: return -6; + case LTE_Q_OffsetRange_dB_5: return -5; + case LTE_Q_OffsetRange_dB_4: return -4; + case LTE_Q_OffsetRange_dB_3: return -3; + case LTE_Q_OffsetRange_dB_2: return -2; + case LTE_Q_OffsetRange_dB_1: return -1; + case LTE_Q_OffsetRange_dB0: return 0; + case LTE_Q_OffsetRange_dB1: return 1; + case LTE_Q_OffsetRange_dB2: return 2; + case LTE_Q_OffsetRange_dB3: return 3; + case LTE_Q_OffsetRange_dB4: return 4; + case LTE_Q_OffsetRange_dB5: return 5; + case LTE_Q_OffsetRange_dB6: return 6; + case LTE_Q_OffsetRange_dB8: return 8; + case LTE_Q_OffsetRange_dB10: return 10; + case LTE_Q_OffsetRange_dB12: return 12; + case LTE_Q_OffsetRange_dB14: return 14; + case LTE_Q_OffsetRange_dB16: return 16; + case LTE_Q_OffsetRange_dB18: return 18; + case LTE_Q_OffsetRange_dB20: return 20; + case LTE_Q_OffsetRange_dB22: return 22; + case LTE_Q_OffsetRange_dB24: return 24; + default: return -99; + } } long flexran_get_filter_coeff_rsrp(mid_t mod_id, rnti_t rnti) { @@ -1602,7 +1683,25 @@ long flexran_get_filter_coeff_rsrp(mid_t mod_id, rnti_t rnti) { struct rrc_eNB_ue_context_s* ue_context_p = rrc_eNB_get_ue_context(RC.rrc[mod_id], rnti); if (!ue_context_p) return -1; if (!ue_context_p->ue_context.measurement_info) return -1; - return ue_context_p->ue_context.measurement_info->filterCoefficientRSRP; + switch (ue_context_p->ue_context.measurement_info->filterCoefficientRSRP) { + case LTE_FilterCoefficient_fc0: return 0; + case LTE_FilterCoefficient_fc1: return 1; + case LTE_FilterCoefficient_fc2: return 2; + case LTE_FilterCoefficient_fc3: return 3; + case LTE_FilterCoefficient_fc4: return 4; + case LTE_FilterCoefficient_fc5: return 5; + case LTE_FilterCoefficient_fc6: return 6; + case LTE_FilterCoefficient_fc7: return 7; + case LTE_FilterCoefficient_fc8: return 8; + case LTE_FilterCoefficient_fc9: return 9; + case LTE_FilterCoefficient_fc11: return 11; + case LTE_FilterCoefficient_fc13: return 13; + case LTE_FilterCoefficient_fc15: return 15; + case LTE_FilterCoefficient_fc17: return 17; + case LTE_FilterCoefficient_fc19: return 19; + case LTE_FilterCoefficient_spare1: return -1; /* spare means no coefficient */ + default: return -1; + } } long flexran_get_filter_coeff_rsrq(mid_t mod_id, rnti_t rnti) { @@ -1610,7 +1709,25 @@ long flexran_get_filter_coeff_rsrq(mid_t mod_id, rnti_t rnti) { struct rrc_eNB_ue_context_s* ue_context_p = rrc_eNB_get_ue_context(RC.rrc[mod_id], rnti); if (!ue_context_p) return -1; if (!ue_context_p->ue_context.measurement_info) return -1; - return ue_context_p->ue_context.measurement_info->filterCoefficientRSRQ; + switch (ue_context_p->ue_context.measurement_info->filterCoefficientRSRQ) { + case LTE_FilterCoefficient_fc0: return 0; + case LTE_FilterCoefficient_fc1: return 1; + case LTE_FilterCoefficient_fc2: return 2; + case LTE_FilterCoefficient_fc3: return 3; + case LTE_FilterCoefficient_fc4: return 4; + case LTE_FilterCoefficient_fc5: return 5; + case LTE_FilterCoefficient_fc6: return 6; + case LTE_FilterCoefficient_fc7: return 7; + case LTE_FilterCoefficient_fc8: return 8; + case LTE_FilterCoefficient_fc9: return 9; + case LTE_FilterCoefficient_fc11: return 11; + case LTE_FilterCoefficient_fc13: return 13; + case LTE_FilterCoefficient_fc15: return 15; + case LTE_FilterCoefficient_fc17: return 17; + case LTE_FilterCoefficient_fc19: return 19; + case LTE_FilterCoefficient_spare1: return -1; /* spare means no coefficient */ + default: return -1; + } } /* Periodic event */ @@ -1644,7 +1761,25 @@ long flexran_get_rrc_a3_event_timeToTrigger(mid_t mod_id, rnti_t rnti) { if (!ue_context_p->ue_context.measurement_info) return -1; if (!ue_context_p->ue_context.measurement_info->events) return -1; if (!ue_context_p->ue_context.measurement_info->events->a3_event) return -1; - return ue_context_p->ue_context.measurement_info->events->a3_event->timeToTrigger; + switch (ue_context_p->ue_context.measurement_info->events->a3_event->timeToTrigger) { + case LTE_TimeToTrigger_ms0: return 0; + case LTE_TimeToTrigger_ms40: return 40; + case LTE_TimeToTrigger_ms64: return 64; + case LTE_TimeToTrigger_ms80: return 80; + case LTE_TimeToTrigger_ms100: return 100; + case LTE_TimeToTrigger_ms128: return 128; + case LTE_TimeToTrigger_ms160: return 160; + case LTE_TimeToTrigger_ms256: return 256; + case LTE_TimeToTrigger_ms320: return 320; + case LTE_TimeToTrigger_ms480: return 480; + case LTE_TimeToTrigger_ms512: return 512; + case LTE_TimeToTrigger_ms640: return 640; + case LTE_TimeToTrigger_ms1024: return 1024; + case LTE_TimeToTrigger_ms1280: return 1280; + case LTE_TimeToTrigger_ms2560: return 2560; + case LTE_TimeToTrigger_ms5120: return 5120; + default: return -1; + } } long flexran_get_rrc_a3_event_maxReportCells(mid_t mod_id, rnti_t rnti) { @@ -1677,6 +1812,259 @@ int flexran_get_rrc_a3_event_reportOnLeave(mid_t mod_id, rnti_t rnti) { return ue_context_p->ue_context.measurement_info->events->a3_event->reportOnLeave; } +/* RRC Setters */ + +/* Measurement offsets */ + +int flexran_set_rrc_ofp(mid_t mod_id, rnti_t rnti, long offsetFreq) { + if (!rrc_is_present(mod_id)) return -1; + struct rrc_eNB_ue_context_s* ue_context_p = rrc_eNB_get_ue_context(RC.rrc[mod_id], rnti); + if (!ue_context_p) return -1; + if (!ue_context_p->ue_context.measurement_info) return -1; + ue_context_p->ue_context.measurement_info->offsetFreq = offsetFreq; + return 0; +} + +int flexran_set_rrc_ofn(mid_t mod_id, rnti_t rnti, long offsetFreq) { + if (!rrc_is_present(mod_id)) return -1; + struct rrc_eNB_ue_context_s* ue_context_p = rrc_eNB_get_ue_context(RC.rrc[mod_id], rnti); + if (!ue_context_p) return -1; + if (!ue_context_p->ue_context.measurement_info) return -1; + ue_context_p->ue_context.measurement_info->offsetFreq = offsetFreq; + return 0; +} + +int flexran_set_rrc_ocp(mid_t mod_id, rnti_t rnti, long cellIndividualOffset) { + if (!rrc_is_present(mod_id)) return -1; + struct rrc_eNB_ue_context_s* ue_context_p = rrc_eNB_get_ue_context(RC.rrc[mod_id], rnti); + if (!ue_context_p) return -1; + if (!ue_context_p->ue_context.measurement_info) return -1; + LTE_Q_OffsetRange_t *cio = &ue_context_p->ue_context.measurement_info->cellIndividualOffset[0]; + switch (cellIndividualOffset) { + case -24: *cio = LTE_Q_OffsetRange_dB_24; break; + case -22: *cio = LTE_Q_OffsetRange_dB_22; break; + case -20: *cio = LTE_Q_OffsetRange_dB_20; break; + case -18: *cio = LTE_Q_OffsetRange_dB_18; break; + case -16: *cio = LTE_Q_OffsetRange_dB_16; break; + case -14: *cio = LTE_Q_OffsetRange_dB_14; break; + case -12: *cio = LTE_Q_OffsetRange_dB_12; break; + case -10: *cio = LTE_Q_OffsetRange_dB_10; break; + case -8: *cio = LTE_Q_OffsetRange_dB_8; break; + case -6: *cio = LTE_Q_OffsetRange_dB_6; break; + case -5: *cio = LTE_Q_OffsetRange_dB_5; break; + case -4: *cio = LTE_Q_OffsetRange_dB_4; break; + case -3: *cio = LTE_Q_OffsetRange_dB_3; break; + case -2: *cio = LTE_Q_OffsetRange_dB_2; break; + case -1: *cio = LTE_Q_OffsetRange_dB_1; break; + case 0: *cio = LTE_Q_OffsetRange_dB0; break; + case 1: *cio = LTE_Q_OffsetRange_dB1; break; + case 2: *cio = LTE_Q_OffsetRange_dB2; break; + case 3: *cio = LTE_Q_OffsetRange_dB3; break; + case 4: *cio = LTE_Q_OffsetRange_dB4; break; + case 5: *cio = LTE_Q_OffsetRange_dB5; break; + case 6: *cio = LTE_Q_OffsetRange_dB6; break; + case 8: *cio = LTE_Q_OffsetRange_dB8; break; + case 10: *cio = LTE_Q_OffsetRange_dB10; break; + case 12: *cio = LTE_Q_OffsetRange_dB12; break; + case 14: *cio = LTE_Q_OffsetRange_dB14; break; + case 16: *cio = LTE_Q_OffsetRange_dB16; break; + case 18: *cio = LTE_Q_OffsetRange_dB18; break; + case 20: *cio = LTE_Q_OffsetRange_dB20; break; + case 22: *cio = LTE_Q_OffsetRange_dB22; break; + case 24: *cio = LTE_Q_OffsetRange_dB24; break; + default: return -1; + } + return 0; +} + +int flexran_set_rrc_ocn(mid_t mod_id, rnti_t rnti, long cell_id, long cellIndividualOffset) { + if (!rrc_is_present(mod_id)) return -1; + struct rrc_eNB_ue_context_s* ue_context_p = rrc_eNB_get_ue_context(RC.rrc[mod_id], rnti); + if (!ue_context_p) return -1; + if (!ue_context_p->ue_context.measurement_info) return -1; + LTE_Q_OffsetRange_t *cio = &ue_context_p->ue_context.measurement_info->cellIndividualOffset[cell_id+1]; + switch (cellIndividualOffset) { + case -24: *cio = LTE_Q_OffsetRange_dB_24; break; + case -22: *cio = LTE_Q_OffsetRange_dB_22; break; + case -20: *cio = LTE_Q_OffsetRange_dB_20; break; + case -18: *cio = LTE_Q_OffsetRange_dB_18; break; + case -16: *cio = LTE_Q_OffsetRange_dB_16; break; + case -14: *cio = LTE_Q_OffsetRange_dB_14; break; + case -12: *cio = LTE_Q_OffsetRange_dB_12; break; + case -10: *cio = LTE_Q_OffsetRange_dB_10; break; + case -8: *cio = LTE_Q_OffsetRange_dB_8; break; + case -6: *cio = LTE_Q_OffsetRange_dB_6; break; + case -5: *cio = LTE_Q_OffsetRange_dB_5; break; + case -4: *cio = LTE_Q_OffsetRange_dB_4; break; + case -3: *cio = LTE_Q_OffsetRange_dB_3; break; + case -2: *cio = LTE_Q_OffsetRange_dB_2; break; + case -1: *cio = LTE_Q_OffsetRange_dB_1; break; + case 0: *cio = LTE_Q_OffsetRange_dB0; break; + case 1: *cio = LTE_Q_OffsetRange_dB1; break; + case 2: *cio = LTE_Q_OffsetRange_dB2; break; + case 3: *cio = LTE_Q_OffsetRange_dB3; break; + case 4: *cio = LTE_Q_OffsetRange_dB4; break; + case 5: *cio = LTE_Q_OffsetRange_dB5; break; + case 6: *cio = LTE_Q_OffsetRange_dB6; break; + case 8: *cio = LTE_Q_OffsetRange_dB8; break; + case 10: *cio = LTE_Q_OffsetRange_dB10; break; + case 12: *cio = LTE_Q_OffsetRange_dB12; break; + case 14: *cio = LTE_Q_OffsetRange_dB14; break; + case 16: *cio = LTE_Q_OffsetRange_dB16; break; + case 18: *cio = LTE_Q_OffsetRange_dB18; break; + case 20: *cio = LTE_Q_OffsetRange_dB20; break; + case 22: *cio = LTE_Q_OffsetRange_dB22; break; + case 24: *cio = LTE_Q_OffsetRange_dB24; break; + default: return -1; + } + return 0; +} + +int flexran_set_filter_coeff_rsrp(mid_t mod_id, rnti_t rnti, long filterCoefficientRSRP) { + if (!rrc_is_present(mod_id)) return -1; + struct rrc_eNB_ue_context_s* ue_context_p = rrc_eNB_get_ue_context(RC.rrc[mod_id], rnti); + if (!ue_context_p) return -1; + if (!ue_context_p->ue_context.measurement_info) return -1; + LTE_FilterCoefficient_t *fc = &ue_context_p->ue_context.measurement_info->filterCoefficientRSRP; + switch (filterCoefficientRSRP) { + case 0: *fc = LTE_FilterCoefficient_fc0; break; + case 1: *fc = LTE_FilterCoefficient_fc1; break; + case 2: *fc = LTE_FilterCoefficient_fc2; break; + case 3: *fc = LTE_FilterCoefficient_fc3; break; + case 4: *fc = LTE_FilterCoefficient_fc4; break; + case 5: *fc = LTE_FilterCoefficient_fc5; break; + case 6: *fc = LTE_FilterCoefficient_fc6; break; + case 7: *fc = LTE_FilterCoefficient_fc7; break; + case 8: *fc = LTE_FilterCoefficient_fc8; break; + case 9: *fc = LTE_FilterCoefficient_fc9; break; + case 11: *fc = LTE_FilterCoefficient_fc11; break; + case 13: *fc = LTE_FilterCoefficient_fc13; break; + case 15: *fc = LTE_FilterCoefficient_fc15; break; + case 17: *fc = LTE_FilterCoefficient_fc17; break; + case 19: *fc = LTE_FilterCoefficient_fc19; break; + case -1: *fc = LTE_FilterCoefficient_spare1; break; + default: return -1; + } + return 0; +} + +int flexran_set_filter_coeff_rsrq(mid_t mod_id, rnti_t rnti, long filterCoefficientRSRQ) { + if (!rrc_is_present(mod_id)) return -1; + struct rrc_eNB_ue_context_s* ue_context_p = rrc_eNB_get_ue_context(RC.rrc[mod_id], rnti); + if (!ue_context_p) return -1; + if (!ue_context_p->ue_context.measurement_info) return -1; + LTE_FilterCoefficient_t *fc = &ue_context_p->ue_context.measurement_info->filterCoefficientRSRQ; + switch (filterCoefficientRSRQ) { + case 0: *fc = LTE_FilterCoefficient_fc0; break; + case 1: *fc = LTE_FilterCoefficient_fc1; break; + case 2: *fc = LTE_FilterCoefficient_fc2; break; + case 3: *fc = LTE_FilterCoefficient_fc3; break; + case 4: *fc = LTE_FilterCoefficient_fc4; break; + case 5: *fc = LTE_FilterCoefficient_fc5; break; + case 6: *fc = LTE_FilterCoefficient_fc6; break; + case 7: *fc = LTE_FilterCoefficient_fc7; break; + case 8: *fc = LTE_FilterCoefficient_fc8; break; + case 9: *fc = LTE_FilterCoefficient_fc9; break; + case 11: *fc = LTE_FilterCoefficient_fc11; break; + case 13: *fc = LTE_FilterCoefficient_fc13; break; + case 15: *fc = LTE_FilterCoefficient_fc15; break; + case 17: *fc = LTE_FilterCoefficient_fc17; break; + case 19: *fc = LTE_FilterCoefficient_fc19; break; + case -1: *fc = LTE_FilterCoefficient_spare1; break; + default: return -1; + } + return 0; +} + +/* Periodic event */ + +int flexran_set_rrc_per_event_maxReportCells(mid_t mod_id, rnti_t rnti, long maxReportCells) { + if (!rrc_is_present(mod_id)) return -1; + struct rrc_eNB_ue_context_s* ue_context_p = rrc_eNB_get_ue_context(RC.rrc[mod_id], rnti); + if (!ue_context_p) return -1; + if (!ue_context_p->ue_context.measurement_info) return -1; + if (!ue_context_p->ue_context.measurement_info->events) return -1; + if (!ue_context_p->ue_context.measurement_info->events->per_event) return -1; + ue_context_p->ue_context.measurement_info->events->per_event->maxReportCells = maxReportCells; + return 0; +} + +/* A3 event */ + +int flexran_set_rrc_a3_event_hysteresis(mid_t mod_id, rnti_t rnti, long hysteresis) { + if (!rrc_is_present(mod_id)) return -1; + struct rrc_eNB_ue_context_s* ue_context_p = rrc_eNB_get_ue_context(RC.rrc[mod_id], rnti); + if (!ue_context_p) return -1; + if (!ue_context_p->ue_context.measurement_info) return -1; + if (!ue_context_p->ue_context.measurement_info->events) return -1; + if (!ue_context_p->ue_context.measurement_info->events->a3_event) return -1; + ue_context_p->ue_context.measurement_info->events->a3_event->hysteresis = hysteresis; + return 0; +} + +int flexran_set_rrc_a3_event_timeToTrigger(mid_t mod_id, rnti_t rnti, long timeToTrigger) { + if (!rrc_is_present(mod_id)) return -1; + struct rrc_eNB_ue_context_s* ue_context_p = rrc_eNB_get_ue_context(RC.rrc[mod_id], rnti); + if (!ue_context_p) return -1; + if (!ue_context_p->ue_context.measurement_info) return -1; + if (!ue_context_p->ue_context.measurement_info->events) return -1; + if (!ue_context_p->ue_context.measurement_info->events->a3_event) return -1; + LTE_TimeToTrigger_t *ttt = &ue_context_p->ue_context.measurement_info->events->a3_event->timeToTrigger; + switch (timeToTrigger) { + case 0: *ttt = LTE_TimeToTrigger_ms0; break; + case 40: *ttt = LTE_TimeToTrigger_ms40; break; + case 64: *ttt = LTE_TimeToTrigger_ms64; break; + case 80: *ttt = LTE_TimeToTrigger_ms80; break; + case 100: *ttt = LTE_TimeToTrigger_ms100; break; + case 128: *ttt = LTE_TimeToTrigger_ms128; break; + case 160: *ttt = LTE_TimeToTrigger_ms160; break; + case 256: *ttt = LTE_TimeToTrigger_ms256; break; + case 320: *ttt = LTE_TimeToTrigger_ms320; break; + case 480: *ttt = LTE_TimeToTrigger_ms480; break; + case 512: *ttt = LTE_TimeToTrigger_ms512; break; + case 640: *ttt = LTE_TimeToTrigger_ms640; break; + case 1024: *ttt = LTE_TimeToTrigger_ms1024; break; + case 1280: *ttt = LTE_TimeToTrigger_ms1280; break; + case 2560: *ttt = LTE_TimeToTrigger_ms2560; break; + case 5120: *ttt = LTE_TimeToTrigger_ms5120; break; + default: return -1; + } + return 0; +} + +int flexran_set_rrc_a3_event_maxReportCells(mid_t mod_id, rnti_t rnti, long maxReportCells) { + if (!rrc_is_present(mod_id)) return -1; + struct rrc_eNB_ue_context_s* ue_context_p = rrc_eNB_get_ue_context(RC.rrc[mod_id], rnti); + if (!ue_context_p) return -1; + if (!ue_context_p->ue_context.measurement_info) return -1; + if (!ue_context_p->ue_context.measurement_info->events) return -1; + if (!ue_context_p->ue_context.measurement_info->events->a3_event) return -1; + ue_context_p->ue_context.measurement_info->events->a3_event->maxReportCells = maxReportCells; + return 0; +} + +int flexran_set_rrc_a3_event_a3_offset(mid_t mod_id, rnti_t rnti, long a3_offset) { + if (!rrc_is_present(mod_id)) return -1; + struct rrc_eNB_ue_context_s* ue_context_p = rrc_eNB_get_ue_context(RC.rrc[mod_id], rnti); + if (!ue_context_p) return -1; + if (!ue_context_p->ue_context.measurement_info) return -1; + if (!ue_context_p->ue_context.measurement_info->events) return -1; + if (!ue_context_p->ue_context.measurement_info->events->a3_event) return -1; + ue_context_p->ue_context.measurement_info->events->a3_event->a3_offset = a3_offset; + return 0; +} + +int flexran_set_rrc_a3_event_reportOnLeave(mid_t mod_id, rnti_t rnti, int reportOnLeave) { + if (!rrc_is_present(mod_id)) return -1; + struct rrc_eNB_ue_context_s* ue_context_p = rrc_eNB_get_ue_context(RC.rrc[mod_id], rnti); + if (!ue_context_p) return -1; + if (!ue_context_p->ue_context.measurement_info) return -1; + if (!ue_context_p->ue_context.measurement_info->events) return -1; + if (!ue_context_p->ue_context.measurement_info->events->a3_event) return -1; + ue_context_p->ue_context.measurement_info->events->a3_event->reportOnLeave = reportOnLeave; + return 0; +} + uint8_t flexran_get_rrc_num_plmn_ids(mid_t mod_id) { if (!rrc_is_present(mod_id)) return 0; return RC.rrc[mod_id]->configuration.num_plmn; diff --git a/openair2/ENB_APP/flexran_agent_ran_api.h b/openair2/ENB_APP/flexran_agent_ran_api.h index 6efa7986ddf..aabd3276387 100644 --- a/openair2/ENB_APP/flexran_agent_ran_api.h +++ b/openair2/ENB_APP/flexran_agent_ran_api.h @@ -498,6 +498,9 @@ uint32_t flexran_get_pdcp_rx_aiat_w(mid_t mod_id, uint16_t uid, lcid_t lcid); uint32_t flexran_get_pdcp_rx_oo(mid_t mod_id, uint16_t uid, lcid_t lcid); /*********************RRC**********************/ +/* Call RRC Reconfiguration wrapper function */ +int flexran_call_rrc_reconfiguration (mid_t mod_id, rnti_t rnti); + /*Get primary cell measuremeant id flexRAN*/ LTE_MeasId_t flexran_get_rrc_pcell_measid(mid_t mod_id, rnti_t rnti); @@ -576,6 +579,42 @@ long flexran_get_filter_coeff_rsrp(mid_t mod_id, rnti_t rnti); /* Get filter coefficient for rsrq */ long flexran_get_filter_coeff_rsrq(mid_t mod_id, rnti_t rnti); +/* Set ofp offset */ +int flexran_set_rrc_ofp(mid_t mod_id, rnti_t rnti, long offsetFreq); + +/* Set ofn offset */ +int flexran_set_rrc_ofn(mid_t mod_id, rnti_t rnti, long offsetFreq); + +/* Set ocp offset */ +int flexran_set_rrc_ocp(mid_t mod_id, rnti_t rnti, long cellIndividualOffset); + +/* Set ocn offset */ +int flexran_set_rrc_ocn(mid_t mod_id, rnti_t rnti, long cell_id, long cellIndividualOffset); + +/* Set Periodic Event max reported cells */ +int flexran_set_rrc_per_event_maxReportCells(mid_t mod_id, rnti_t rnti, long maxReportCells); + +/* Set A3 Event hysteresis */ +int flexran_set_rrc_a3_event_hysteresis(mid_t mod_id, rnti_t rnti, long hysteresis); + +/* Set A3 Event time to trigger */ +int flexran_set_rrc_a3_event_timeToTrigger(mid_t mod_id, rnti_t rnti, long timeToTrigger); + +/* Set A3 Event max reported cells */ +int flexran_set_rrc_a3_event_maxReportCells(mid_t mod_id, rnti_t rnti, long maxReportCells); + +/* Set A3 Event a3 offset */ +int flexran_set_rrc_a3_event_a3_offset(mid_t mod_id, rnti_t rnti, long a3_offset); + +/* Set A3 Event report on leave */ +int flexran_set_rrc_a3_event_reportOnLeave(mid_t mod_id, rnti_t rnti, int reportOnLeave); + +/* Set filter coefficient for rsrp */ +int flexran_set_filter_coeff_rsrp(mid_t mod_id, rnti_t rnti, long filterCoefficientRSRP); + +/* Set filter coefficient for rsrq */ +int flexran_set_filter_coeff_rsrq(mid_t mod_id, rnti_t rnti, long filterCoefficientRSRQ); + /* Get number of PLMNs that is broadcasted in SIB1 */ uint8_t flexran_get_rrc_num_plmn_ids(mid_t mod_id); diff --git a/openair2/RRC/LTE/rrc_eNB.c b/openair2/RRC/LTE/rrc_eNB.c index 814f3aa1788..40e82bb74eb 100644 --- a/openair2/RRC/LTE/rrc_eNB.c +++ b/openair2/RRC/LTE/rrc_eNB.c @@ -3617,16 +3617,15 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t void flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t *const ctxt_pP, rrc_eNB_ue_context_t *const ue_context_pP, - const uint8_t ho_state, - agent_reconf_rrc *trig_param - ) + const uint8_t ho_state) //----------------------------------------------------------------------------- { - uint8_t buffer[RRC_BUF_SIZE]; - uint16_t size; - int i; - // configure SRB1/SRB2, PhysicalConfigDedicated, LTE_MAC_MainConfig for UE - eNB_RRC_INST *rrc_inst = RC.rrc[ctxt_pP->module_id]; + uint8_t buffer[RRC_BUF_SIZE]; + uint16_t size; + int i; + + /* Configure SRB1/SRB2, PhysicalConfigDedicated, LTE_MAC_MainConfig for UE */ + eNB_RRC_INST *rrc_inst = RC.rrc[ctxt_pP->module_id]; struct LTE_PhysicalConfigDedicated **physicalConfigDedicated = &ue_context_pP->ue_context.physicalConfigDedicated; struct LTE_SRB_ToAddMod *SRB2_config = NULL; struct LTE_SRB_ToAddMod__rlc_Config *SRB2_rlc_config = NULL; @@ -3634,7 +3633,7 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt struct LTE_LogicalChannelConfig__ul_SpecificParameters *SRB2_ul_SpecificParameters = NULL; LTE_SRB_ToAddModList_t *SRB_configList = ue_context_pP->ue_context.SRB_configList; - LTE_SRB_ToAddModList_t **SRB_configList2 = NULL; + LTE_SRB_ToAddModList_t **SRB_configList2 = NULL; struct LTE_DRB_ToAddMod *DRB_config = NULL; struct LTE_RLC_Config *DRB_rlc_config = NULL; struct LTE_PDCP_Config *DRB_pdcp_config = NULL; @@ -3644,22 +3643,24 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt struct LTE_LogicalChannelConfig__ul_SpecificParameters *DRB_ul_SpecificParameters = NULL; LTE_DRB_ToAddModList_t **DRB_configList = &ue_context_pP->ue_context.DRB_configList; - LTE_DRB_ToAddModList_t **DRB_configList2 = NULL; + LTE_DRB_ToAddModList_t **DRB_configList2 = NULL; LTE_MAC_MainConfig_t *mac_MainConfig = NULL; LTE_MeasObjectToAddModList_t *MeasObj_list = NULL; LTE_MeasObjectToAddMod_t *MeasObj = NULL; LTE_ReportConfigToAddModList_t *ReportConfig_list = NULL; - LTE_ReportConfigToAddMod_t *ReportConfig_per;//, *ReportConfig_A1, - // *ReportConfig_A2, *ReportConfig_A3, *ReportConfig_A4, *ReportConfig_A5; + LTE_ReportConfigToAddMod_t *ReportConfig_per, *ReportConfig_A1, + *ReportConfig_A2, *ReportConfig_A3, *ReportConfig_A4, *ReportConfig_A5; LTE_MeasIdToAddModList_t *MeasId_list = NULL; - LTE_MeasIdToAddMod_t *MeasId0; //, *MeasId1, *MeasId2, *MeasId3, *MeasId4, *MeasId5; -#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0)) - long *sr_ProhibitTimer_r9 = NULL; - // uint8_t sCellIndexToAdd = rrc_find_free_SCell_index(enb_mod_idP, ue_mod_idP, 1); - //uint8_t sCellIndexToAdd = 0; + LTE_MeasIdToAddMod_t *MeasId0, *MeasId1, *MeasId2, *MeasId3, *MeasId4, *MeasId5; + +#if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0)) + long *sr_ProhibitTimer_r9 = NULL; #endif - long *logicalchannelgroup, *logicalchannelgroup_drb; - long *maxHARQ_Tx, *periodicBSR_Timer; + + long *logicalchannelgroup = NULL; + long *logicalchannelgroup_drb = NULL; + long *maxHARQ_Tx = NULL; + long *periodicBSR_Timer = NULL; LTE_RSRP_Range_t *rsrp = NULL; struct LTE_MeasConfig__speedStatePars *Sparams = NULL; LTE_QuantityConfig_t *quantityConfig = NULL; @@ -3667,13 +3668,16 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt LTE_CellsToAddModList_t *CellsToAddModList = NULL; struct LTE_RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList *dedicatedInfoNASList = NULL; LTE_DedicatedInfoNAS_t *dedicatedInfoNas = NULL; - /* for no gcc warnings */ - (void)dedicatedInfoNas; + + /* For no gcc warnings */ + (void) dedicatedInfoNas; LTE_C_RNTI_t *cba_RNTI = NULL; int measurements_enabled; uint8_t xid = rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id); //Transaction_id, -#ifdef CBA - //struct PUSCH_CBAConfigDedicated_vlola *pusch_CBAConfigDedicated_vlola; + uint8_t cc_id = ue_context_pP->ue_context.primaryCC_id; + LTE_UE_EUTRA_Capability_t *UEcap = ue_context_pP->ue_context.UE_Capability; + +#ifdef CBA // Contention Based Access uint8_t *cba_RNTI_buf; cba_RNTI = CALLOC(1, sizeof(LTE_C_RNTI_t)); cba_RNTI_buf = CALLOC(1, 2 * sizeof(uint8_t)); @@ -3681,27 +3685,33 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt cba_RNTI->size = 2; cba_RNTI->bits_unused = 0; - // associate UEs to the CBa groups as a function of their UE id + /* Associate UEs to the CBA groups as a function of their UE id */ if (rrc_inst->num_active_cba_groups) { cba_RNTI->buf[0] = rrc_inst->cba_rnti[ue_mod_idP % rrc_inst->num_active_cba_groups] & 0xff; cba_RNTI->buf[1] = 0xff; - LOG_D(RRC, - "[eNB %d] Frame %d: cba_RNTI = %x in group %d is attribued to UE %d\n", - enb_mod_idP, frameP, + LOG_D(RRC, "[eNB %d] Frame %d: cba_RNTI = %x in group %d is attribued to UE %d\n", + enb_mod_idP, + frameP, rrc_inst->cba_rnti[ue_mod_idP % rrc_inst->num_active_cba_groups], ue_mod_idP % rrc_inst->num_active_cba_groups, ue_mod_idP); } else { cba_RNTI->buf[0] = 0x0; cba_RNTI->buf[1] = 0x0; - LOG_D(RRC, "[eNB %d] Frame %d: no cba_RNTI is configured for UE %d\n", enb_mod_idP, frameP, ue_mod_idP); + LOG_D(RRC, "[eNB %d] Frame %d: no cba_RNTI is configured for UE %d\n", + enb_mod_idP, + frameP, + ue_mod_idP); } - #endif - T(T_ENB_RRC_CONNECTION_RECONFIGURATION, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame), - T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti)); - // Configure SRB2 - /// SRB2 - SRB_configList2=&ue_context_pP->ue_context.SRB_configList2[xid]; + + T(T_ENB_RRC_CONNECTION_RECONFIGURATION, + T_INT(ctxt_pP->module_id), + T_INT(ctxt_pP->frame), + T_INT(ctxt_pP->subframe), + T_INT(ctxt_pP->rnti)); + + /* Configure SRB2 */ + SRB_configList2 = &(ue_context_pP->ue_context.SRB_configList2[xid]); if (*SRB_configList2) { free(*SRB_configList2); @@ -3726,22 +3736,19 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt SRB2_lchan_config->present = LTE_SRB_ToAddMod__logicalChannelConfig_PR_explicitValue; SRB2_ul_SpecificParameters = CALLOC(1, sizeof(*SRB2_ul_SpecificParameters)); SRB2_ul_SpecificParameters->priority = 3; // let some priority for SRB1 and dedicated DRBs - SRB2_ul_SpecificParameters->prioritisedBitRate = - LTE_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity; - SRB2_ul_SpecificParameters->bucketSizeDuration = - LTE_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms50; - // LCG for CCCH and DCCH is 0 as defined in 36331 + SRB2_ul_SpecificParameters->prioritisedBitRate = LTE_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity; + SRB2_ul_SpecificParameters->bucketSizeDuration = LTE_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms50; + + /* LCG for CCCH and DCCH is 0 as defined in 36331 */ logicalchannelgroup = CALLOC(1, sizeof(long)); *logicalchannelgroup = 0; SRB2_ul_SpecificParameters->logicalChannelGroup = logicalchannelgroup; SRB2_lchan_config->choice.explicitValue.ul_SpecificParameters = SRB2_ul_SpecificParameters; - // this list has the configuration for SRB1 and SRB2 - ASN_SEQUENCE_ADD(&SRB_configList->list, SRB2_config); - // this list has only the configuration for SRB2 - ASN_SEQUENCE_ADD(&(*SRB_configList2)->list, SRB2_config); - // Configure DRB - //*DRB_configList = CALLOC(1, sizeof(*DRB_configList)); + ASN_SEQUENCE_ADD(&SRB_configList->list, SRB2_config); // this list has the configuration for SRB1 and SRB2 + ASN_SEQUENCE_ADD(&(*SRB_configList2)->list, SRB2_config); // this list has only the configuration for SRB2 + + /* Configure DRB */ // list for all the configured DRB if (*DRB_configList) { free(*DRB_configList); @@ -3749,8 +3756,8 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt *DRB_configList = CALLOC(1, sizeof(**DRB_configList)); memset(*DRB_configList, 0, sizeof(**DRB_configList)); - // list for the configured DRB for a this xid - DRB_configList2=&ue_context_pP->ue_context.DRB_configList2[xid]; + + DRB_configList2=&ue_context_pP->ue_context.DRB_configList2[xid]; // list for the configured DRB for a this xid if (*DRB_configList2) { free(*DRB_configList2); @@ -3758,17 +3765,17 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt *DRB_configList2 = CALLOC(1, sizeof(**DRB_configList2)); memset(*DRB_configList2, 0, sizeof(**DRB_configList2)); - /// DRB + DRB_config = CALLOC(1, sizeof(*DRB_config)); DRB_config->eps_BearerIdentity = CALLOC(1, sizeof(long)); *(DRB_config->eps_BearerIdentity) = 5L; // LW set to first value, allowed value 5..15, value : x+4 - // DRB_config->drb_Identity = (LTE_DRB_Identity_t) 1; //allowed values 1..32 // NN: this is the 1st DRB for this ue, so set it to 1 DRB_config->drb_Identity = (LTE_DRB_Identity_t) 1; // (ue_mod_idP+1); //allowed values 1..32, value: x DRB_config->logicalChannelIdentity = CALLOC(1, sizeof(long)); *(DRB_config->logicalChannelIdentity) = (long)3; // value : x+2 DRB_rlc_config = CALLOC(1, sizeof(*DRB_rlc_config)); DRB_config->rlc_Config = DRB_rlc_config; + #ifdef RRC_DEFAULT_RAB_IS_AM DRB_rlc_config->present = LTE_RLC_Config_PR_am; DRB_rlc_config->choice.am.ul_AM_RLC.t_PollRetransmit = LTE_T_PollRetransmit_ms50; @@ -3781,21 +3788,25 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt DRB_rlc_config->present = LTE_RLC_Config_PR_um_Bi_Directional; DRB_rlc_config->choice.um_Bi_Directional.ul_UM_RLC.sn_FieldLength = LTE_SN_FieldLength_size10; DRB_rlc_config->choice.um_Bi_Directional.dl_UM_RLC.sn_FieldLength = LTE_SN_FieldLength_size10; + #ifdef CBA - DRB_rlc_config->choice.um_Bi_Directional.dl_UM_RLC.t_Reordering = LTE_T_Reordering_ms5;//T_Reordering_ms25; + DRB_rlc_config->choice.um_Bi_Directional.dl_UM_RLC.t_Reordering = LTE_T_Reordering_ms5; //T_Reordering_ms25; #else DRB_rlc_config->choice.um_Bi_Directional.dl_UM_RLC.t_Reordering = LTE_T_Reordering_ms35; #endif + #endif + DRB_pdcp_config = CALLOC(1, sizeof(*DRB_pdcp_config)); DRB_config->pdcp_Config = DRB_pdcp_config; DRB_pdcp_config->discardTimer = CALLOC(1, sizeof(long)); *DRB_pdcp_config->discardTimer = LTE_PDCP_Config__discardTimer_infinity; DRB_pdcp_config->rlc_AM = NULL; DRB_pdcp_config->rlc_UM = NULL; - /* avoid gcc warnings */ + /* Avoid gcc warnings */ (void)PDCP_rlc_AM; (void)PDCP_rlc_UM; + #ifdef RRC_DEFAULT_RAB_IS_AM // EXMIMO_IOT PDCP_rlc_AM = CALLOC(1, sizeof(*PDCP_rlc_AM)); DRB_pdcp_config->rlc_AM = PDCP_rlc_AM; @@ -3805,52 +3816,97 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt DRB_pdcp_config->rlc_UM = PDCP_rlc_UM; PDCP_rlc_UM->pdcp_SN_Size = LTE_PDCP_Config__rlc_UM__pdcp_SN_Size_len12bits; #endif + DRB_pdcp_config->headerCompression.present = LTE_PDCP_Config__headerCompression_PR_notUsed; DRB_lchan_config = CALLOC(1, sizeof(*DRB_lchan_config)); DRB_config->logicalChannelConfig = DRB_lchan_config; DRB_ul_SpecificParameters = CALLOC(1, sizeof(*DRB_ul_SpecificParameters)); DRB_lchan_config->ul_SpecificParameters = DRB_ul_SpecificParameters; - DRB_ul_SpecificParameters->priority = 12; // lower priority than srb1, srb2 and other dedicated bearer - DRB_ul_SpecificParameters->prioritisedBitRate = LTE_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_kBps8 ; - //LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity; - DRB_ul_SpecificParameters->bucketSizeDuration = - LTE_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms50; + DRB_ul_SpecificParameters->priority = 12; // lower priority than srb1, srb2 and other dedicated bearer + DRB_ul_SpecificParameters->prioritisedBitRate = LTE_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_kBps8; // LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity; + DRB_ul_SpecificParameters->bucketSizeDuration = LTE_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms50; // LCG for DTCH can take the value from 1 to 3 as defined in 36331: normally controlled by upper layers (like RRM) logicalchannelgroup_drb = CALLOC(1, sizeof(long)); *logicalchannelgroup_drb = 1; DRB_ul_SpecificParameters->logicalChannelGroup = logicalchannelgroup_drb; + ASN_SEQUENCE_ADD(&(*DRB_configList)->list, DRB_config); ASN_SEQUENCE_ADD(&(*DRB_configList2)->list, DRB_config); - //ue_context_pP->ue_context.DRB_configList2[0] = &(*DRB_configList); + + /* MAC Main Config */ + // The different parts of MAC main config are set below mac_MainConfig = CALLOC(1, sizeof(*mac_MainConfig)); - // ue_context_pP->ue_context.mac_MainConfig = LTE_MAC_MainConfig; + ue_context_pP->ue_context.mac_MainConfig = mac_MainConfig; mac_MainConfig->ul_SCH_Config = CALLOC(1, sizeof(*mac_MainConfig->ul_SCH_Config)); 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 -#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0)) + 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 + + if (!NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) { + /* CDRX Configuration */ + // Need to check if UE is a BR UE + rnti_t rnti = ue_context_pP->ue_id_rnti; + module_id_t module_id = ctxt_pP->module_id; + int UE_id = find_UE_id(module_id, rnti); + eNB_MAC_INST *mac = RC.mac[module_id]; + UE_list_t *UE_list = &(mac->UE_list); + + if (UE_id != -1) { + if ((rrc_inst->carrier[cc_id].sib1->tdd_Config == NULL) && + (UE_list->UE_template[ue_context_pP->ue_context.primaryCC_id][UE_id].rach_resource_type == 0)) { + // CDRX can be only configured in case of FDD and non BR UE (09/04/19) + + 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(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(module_id, ue_context_pP->ue_id_rnti, mac_MainConfig->drx_Config); + + LOG_D(RRC, "DRX configured in mac main config for RRC Connection Reconfiguration\n"); + + } else { // CDRX not implemented for TDD and LTE-M (09/04/19) + mac_MainConfig->drx_Config = NULL; + } + } else { // UE_id invalid + LOG_E(RRC, "Invalid UE_id found!\n"); + mac_MainConfig->drx_Config = NULL; + } + } else { // No CDRX with the CU/DU split in this version + LOG_E(RRC, "CU/DU split activated\n"); + mac_MainConfig->drx_Config = NULL; + } + +#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; #endif - //change the transmission mode for the primary component carrier - //TODO: add codebook subset restriction here - //TODO: change TM for secondary CC in SCelltoaddmodlist + // change the transmission mode for the primary component carrier + // TODO: add codebook subset restriction here + // TODO: change TM for secondary CC in SCelltoaddmodlist if (*physicalConfigDedicated) { if ((*physicalConfigDedicated)->antennaInfo) { (*physicalConfigDedicated)->antennaInfo->choice.explicitValue.transmissionMode = rrc_inst->configuration.radioresourceconfig[0].ue_TransmissionMode; @@ -3897,19 +3953,20 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt LOG_E(RRC,"antenna_info not present in physical_config_dedicated. Not reconfiguring!\n"); } - /* CSI Configuration through RRC */ + /* 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 aperiodic reporting mode to rm31 (hardcoded)\n"); + + // 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 } } else { @@ -3927,9 +3984,33 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt MeasId0->measObjectId = 1; MeasId0->reportConfigId = 1; ASN_SEQUENCE_ADD(&MeasId_list->list, MeasId0); - /* - * Add one EUTRA Measurement Object - */ + MeasId1 = CALLOC(1, sizeof(*MeasId1)); + MeasId1->measId = 2; + MeasId1->measObjectId = 1; + MeasId1->reportConfigId = 2; + ASN_SEQUENCE_ADD(&MeasId_list->list, MeasId1); + MeasId2 = CALLOC(1, sizeof(*MeasId2)); + MeasId2->measId = 3; + MeasId2->measObjectId = 1; + MeasId2->reportConfigId = 3; + ASN_SEQUENCE_ADD(&MeasId_list->list, MeasId2); + MeasId3 = CALLOC(1, sizeof(*MeasId3)); + MeasId3->measId = 4; + MeasId3->measObjectId = 1; + MeasId3->reportConfigId = 4; + ASN_SEQUENCE_ADD(&MeasId_list->list, MeasId3); + MeasId4 = CALLOC(1, sizeof(*MeasId4)); + MeasId4->measId = 5; + MeasId4->measObjectId = 1; + MeasId4->reportConfigId = 5; + ASN_SEQUENCE_ADD(&MeasId_list->list, MeasId4); + MeasId5 = CALLOC(1, sizeof(*MeasId5)); + MeasId5->measId = 6; + MeasId5->measObjectId = 1; + MeasId5->reportConfigId = 6; + ASN_SEQUENCE_ADD(&MeasId_list->list, MeasId5); + // LTE_RRCConnectionReconfiguration->criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.measConfig->measIdToAddModList = MeasId_list; + // Add one EUTRA Measurement Object MeasObj_list = CALLOC(1, sizeof(*MeasObj_list)); memset((void *)MeasObj_list, 0, sizeof(*MeasObj_list)); // Configure MeasObject @@ -3937,64 +4018,161 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt memset((void *)MeasObj, 0, sizeof(*MeasObj)); MeasObj->measObjectId = 1; MeasObj->measObject.present = LTE_MeasObjectToAddMod__measObject_PR_measObjectEUTRA; - MeasObj->measObject.choice.measObjectEUTRA.carrierFreq = 3350; //band 7, 2.68GHz - //MeasObj->measObject.choice.measObjectEUTRA.carrierFreq = 36090; //band 33, 1.909GHz + MeasObj->measObject.choice.measObjectEUTRA.carrierFreq = + to_earfcn_DL(RC.rrc[ctxt_pP->module_id]->configuration.eutra_band[0], + RC.rrc[ctxt_pP->module_id]->configuration.downlink_frequency[0], + RC.rrc[ctxt_pP->module_id]->configuration.N_RB_DL[0]); MeasObj->measObject.choice.measObjectEUTRA.allowedMeasBandwidth = LTE_AllowedMeasBandwidth_mbw25; MeasObj->measObject.choice.measObjectEUTRA.presenceAntennaPort1 = 1; MeasObj->measObject.choice.measObjectEUTRA.neighCellConfig.buf = CALLOC(1, sizeof(uint8_t)); MeasObj->measObject.choice.measObjectEUTRA.neighCellConfig.buf[0] = 0; MeasObj->measObject.choice.measObjectEUTRA.neighCellConfig.size = 1; MeasObj->measObject.choice.measObjectEUTRA.neighCellConfig.bits_unused = 6; - MeasObj->measObject.choice.measObjectEUTRA.offsetFreq = NULL; // Default is 15 or 0dB - MeasObj->measObject.choice.measObjectEUTRA.cellsToAddModList = - (LTE_CellsToAddModList_t *) CALLOC(1, sizeof(*CellsToAddModList)); - CellsToAddModList = MeasObj->measObject.choice.measObjectEUTRA.cellsToAddModList; + *(MeasObj->measObject.choice.measObjectEUTRA.offsetFreq) = ue_context_pP->ue_context.measurement_info->offsetFreq; // Default is 15 or 0dB - // Add adjacent cell lists (6 per eNB) - for (i = 0; i < 6; i++) { + if (RC.rrc[ctxt_pP->module_id]->num_neigh_cells > 0) { + MeasObj->measObject.choice.measObjectEUTRA.cellsToAddModList = + (LTE_CellsToAddModList_t *) CALLOC(1, sizeof(*CellsToAddModList)); + CellsToAddModList = MeasObj->measObject.choice.measObjectEUTRA.cellsToAddModList; + } + + /* TODO: Extend to multiple carriers */ + // Add adjacent cell lists (max 6 per eNB) + for (i = 0; i < RC.rrc[ctxt_pP->module_id]->num_neigh_cells; i++) { CellToAdd = (LTE_CellsToAddMod_t *) CALLOC(1, sizeof(*CellToAdd)); CellToAdd->cellIndex = i + 1; - CellToAdd->physCellId = get_adjacent_cell_id(ctxt_pP->module_id, i); - CellToAdd->cellIndividualOffset = LTE_Q_OffsetRange_dB0; + CellToAdd->physCellId = RC.rrc[ctxt_pP->module_id]->neigh_cells_id[i][0];//get_adjacent_cell_id(ctxt_pP->module_id, i); + CellToAdd->cellIndividualOffset = ue_context_pP->ue_context.measurement_info->cellIndividualOffset[i+1]; ASN_SEQUENCE_ADD(&CellsToAddModList->list, CellToAdd); } - ASN_SEQUENCE_ADD(&MeasObj_list->list, MeasObj); // LTE_RRCConnectionReconfiguration->criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.measConfig->measObjectToAddModList = MeasObj_list; // Report Configurations for periodical, A1-A5 events - - /* RRC Strategy Measurement */ - - if (strcmp("one_shot", trig_param->trigger_policy) == 0) { - trig_param->report_interval = 0; - trig_param->report_amount = 0; - } else if (strcmp("event_driven", trig_param->trigger_policy) == 0) { - trig_param->report_interval = 6; - trig_param->report_amount = 2; - } else if (strcmp("periodical", trig_param->trigger_policy) == 0) { - trig_param->report_interval = 1; - trig_param->report_amount = 7; - } else { - LOG_E(FLEXRAN_AGENT, "There is something wrong on RRC agent!"); - } - ReportConfig_list = CALLOC(1, sizeof(*ReportConfig_list)); ReportConfig_per = CALLOC(1, sizeof(*ReportConfig_per)); - // Periodical Measurement Report + ReportConfig_A1 = CALLOC(1, sizeof(*ReportConfig_A1)); + ReportConfig_A2 = CALLOC(1, sizeof(*ReportConfig_A2)); + ReportConfig_A3 = CALLOC(1, sizeof(*ReportConfig_A3)); + ReportConfig_A4 = CALLOC(1, sizeof(*ReportConfig_A4)); + ReportConfig_A5 = CALLOC(1, sizeof(*ReportConfig_A5)); ReportConfig_per->reportConfigId = 1; ReportConfig_per->reportConfig.present = LTE_ReportConfigToAddMod__reportConfig_PR_reportConfigEUTRA; ReportConfig_per->reportConfig.choice.reportConfigEUTRA.triggerType.present = LTE_ReportConfigEUTRA__triggerType_PR_periodical; ReportConfig_per->reportConfig.choice.reportConfigEUTRA.triggerType.choice.periodical.purpose = LTE_ReportConfigEUTRA__triggerType__periodical__purpose_reportStrongestCells; - // ReportConfig_per->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.timeToTrigger = TimeToTrigger_ms40; ReportConfig_per->reportConfig.choice.reportConfigEUTRA.triggerQuantity = LTE_ReportConfigEUTRA__triggerQuantity_rsrp; ReportConfig_per->reportConfig.choice.reportConfigEUTRA.reportQuantity = LTE_ReportConfigEUTRA__reportQuantity_both; ReportConfig_per->reportConfig.choice.reportConfigEUTRA.maxReportCells = 2; - ReportConfig_per->reportConfig.choice.reportConfigEUTRA.reportInterval = trig_param->report_interval ;//ReportInterval_ms2048; // RRC counter frame- ms1024 is 1ms - ReportConfig_per->reportConfig.choice.reportConfigEUTRA.reportAmount = trig_param->report_amount; //ReportConfigEUTRA__reportAmount_r2; // put r1 to see once, r2 for 2 times and ... + ReportConfig_per->reportConfig.choice.reportConfigEUTRA.reportInterval = LTE_ReportInterval_ms120; + ReportConfig_per->reportConfig.choice.reportConfigEUTRA.reportAmount = LTE_ReportConfigEUTRA__reportAmount_infinity; ASN_SEQUENCE_ADD(&ReportConfig_list->list, ReportConfig_per); + ReportConfig_A1->reportConfigId = 2; + ReportConfig_A1->reportConfig.present = LTE_ReportConfigToAddMod__reportConfig_PR_reportConfigEUTRA; + ReportConfig_A1->reportConfig.choice.reportConfigEUTRA.triggerType.present = + LTE_ReportConfigEUTRA__triggerType_PR_event; + ReportConfig_A1->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.present = + LTE_ReportConfigEUTRA__triggerType__event__eventId_PR_eventA1; + ReportConfig_A1->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.choice.eventA1. + a1_Threshold.present = LTE_ThresholdEUTRA_PR_threshold_RSRP; + ReportConfig_A1->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.choice.eventA1. + a1_Threshold.choice.threshold_RSRP = 10; + ReportConfig_A1->reportConfig.choice.reportConfigEUTRA.triggerQuantity = LTE_ReportConfigEUTRA__triggerQuantity_rsrp; + ReportConfig_A1->reportConfig.choice.reportConfigEUTRA.reportQuantity = LTE_ReportConfigEUTRA__reportQuantity_both; + ReportConfig_A1->reportConfig.choice.reportConfigEUTRA.maxReportCells = 2; + ReportConfig_A1->reportConfig.choice.reportConfigEUTRA.reportInterval = LTE_ReportInterval_ms120; + ReportConfig_A1->reportConfig.choice.reportConfigEUTRA.reportAmount = LTE_ReportConfigEUTRA__reportAmount_infinity; + ASN_SEQUENCE_ADD(&ReportConfig_list->list, ReportConfig_A1); + //if (ho_state == 1 /*HO_MEASURMENT */ ) { + LOG_I(RRC, "[eNB %d] frame %d: requesting A2, A3, A4, and A5 event reporting\n", + ctxt_pP->module_id, ctxt_pP->frame); + ReportConfig_A2->reportConfigId = 3; + ReportConfig_A2->reportConfig.present = LTE_ReportConfigToAddMod__reportConfig_PR_reportConfigEUTRA; + ReportConfig_A2->reportConfig.choice.reportConfigEUTRA.triggerType.present = + LTE_ReportConfigEUTRA__triggerType_PR_event; + ReportConfig_A2->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.present = + LTE_ReportConfigEUTRA__triggerType__event__eventId_PR_eventA2; + ReportConfig_A2->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.choice. + eventA2.a2_Threshold.present = LTE_ThresholdEUTRA_PR_threshold_RSRP; + ReportConfig_A2->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.choice. + eventA2.a2_Threshold.choice.threshold_RSRP = 10; + ReportConfig_A2->reportConfig.choice.reportConfigEUTRA.triggerQuantity = + LTE_ReportConfigEUTRA__triggerQuantity_rsrp; + ReportConfig_A2->reportConfig.choice.reportConfigEUTRA.reportQuantity = LTE_ReportConfigEUTRA__reportQuantity_both; + ReportConfig_A2->reportConfig.choice.reportConfigEUTRA.maxReportCells = 2; + ReportConfig_A2->reportConfig.choice.reportConfigEUTRA.reportInterval = LTE_ReportInterval_ms120; + ReportConfig_A2->reportConfig.choice.reportConfigEUTRA.reportAmount = LTE_ReportConfigEUTRA__reportAmount_infinity; + ASN_SEQUENCE_ADD(&ReportConfig_list->list, ReportConfig_A2); + ReportConfig_A3->reportConfigId = 4; + ReportConfig_A3->reportConfig.present = LTE_ReportConfigToAddMod__reportConfig_PR_reportConfigEUTRA; + ReportConfig_A3->reportConfig.choice.reportConfigEUTRA.triggerType.present = + LTE_ReportConfigEUTRA__triggerType_PR_event; + ReportConfig_A3->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.present = + LTE_ReportConfigEUTRA__triggerType__event__eventId_PR_eventA3; + ReportConfig_A3->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.choice.eventA3.a3_Offset = ue_context_pP->ue_context.measurement_info->events->a3_event->a3_offset;//10; + ReportConfig_A3->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.choice. + eventA3.reportOnLeave = ue_context_pP->ue_context.measurement_info->events->a3_event->reportOnLeave; + ReportConfig_A3->reportConfig.choice.reportConfigEUTRA.triggerQuantity = + LTE_ReportConfigEUTRA__triggerQuantity_rsrp; + ReportConfig_A3->reportConfig.choice.reportConfigEUTRA.reportQuantity = LTE_ReportConfigEUTRA__reportQuantity_both; + ReportConfig_A3->reportConfig.choice.reportConfigEUTRA.maxReportCells = ue_context_pP->ue_context.measurement_info->events->a3_event->maxReportCells; + ReportConfig_A3->reportConfig.choice.reportConfigEUTRA.reportInterval = LTE_ReportInterval_ms120; + ReportConfig_A3->reportConfig.choice.reportConfigEUTRA.reportAmount = LTE_ReportConfigEUTRA__reportAmount_infinity; + ReportConfig_A3->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.hysteresis = ue_context_pP->ue_context.measurement_info->events->a3_event->hysteresis; + ReportConfig_A3->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.timeToTrigger = + ue_context_pP->ue_context.measurement_info->events->a3_event->timeToTrigger; + ASN_SEQUENCE_ADD(&ReportConfig_list->list, ReportConfig_A3); + ReportConfig_A4->reportConfigId = 5; + ReportConfig_A4->reportConfig.present = LTE_ReportConfigToAddMod__reportConfig_PR_reportConfigEUTRA; + ReportConfig_A4->reportConfig.choice.reportConfigEUTRA.triggerType.present = + LTE_ReportConfigEUTRA__triggerType_PR_event; + ReportConfig_A4->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.present = + LTE_ReportConfigEUTRA__triggerType__event__eventId_PR_eventA4; + ReportConfig_A4->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.choice. + eventA4.a4_Threshold.present = LTE_ThresholdEUTRA_PR_threshold_RSRP; + ReportConfig_A4->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.choice. + eventA4.a4_Threshold.choice.threshold_RSRP = 10; + ReportConfig_A4->reportConfig.choice.reportConfigEUTRA.triggerQuantity = + LTE_ReportConfigEUTRA__triggerQuantity_rsrp; + ReportConfig_A4->reportConfig.choice.reportConfigEUTRA.reportQuantity = LTE_ReportConfigEUTRA__reportQuantity_both; + ReportConfig_A4->reportConfig.choice.reportConfigEUTRA.maxReportCells = 2; + ReportConfig_A4->reportConfig.choice.reportConfigEUTRA.reportInterval = LTE_ReportInterval_ms120; + ReportConfig_A4->reportConfig.choice.reportConfigEUTRA.reportAmount = LTE_ReportConfigEUTRA__reportAmount_infinity; + ASN_SEQUENCE_ADD(&ReportConfig_list->list, ReportConfig_A4); + ReportConfig_A5->reportConfigId = 6; + ReportConfig_A5->reportConfig.present = LTE_ReportConfigToAddMod__reportConfig_PR_reportConfigEUTRA; + ReportConfig_A5->reportConfig.choice.reportConfigEUTRA.triggerType.present = + LTE_ReportConfigEUTRA__triggerType_PR_event; + ReportConfig_A5->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.present = + LTE_ReportConfigEUTRA__triggerType__event__eventId_PR_eventA5; + ReportConfig_A5->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.choice. + eventA5.a5_Threshold1.present = LTE_ThresholdEUTRA_PR_threshold_RSRP; + ReportConfig_A5->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.choice. + eventA5.a5_Threshold2.present = LTE_ThresholdEUTRA_PR_threshold_RSRP; + ReportConfig_A5->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.choice. + eventA5.a5_Threshold1.choice.threshold_RSRP = 10; + ReportConfig_A5->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.choice. + eventA5.a5_Threshold2.choice.threshold_RSRP = 10; + ReportConfig_A5->reportConfig.choice.reportConfigEUTRA.triggerQuantity = + LTE_ReportConfigEUTRA__triggerQuantity_rsrp; + ReportConfig_A5->reportConfig.choice.reportConfigEUTRA.reportQuantity = LTE_ReportConfigEUTRA__reportQuantity_both; + ReportConfig_A5->reportConfig.choice.reportConfigEUTRA.maxReportCells = 2; + ReportConfig_A5->reportConfig.choice.reportConfigEUTRA.reportInterval = LTE_ReportInterval_ms120; + ReportConfig_A5->reportConfig.choice.reportConfigEUTRA.reportAmount = LTE_ReportConfigEUTRA__reportAmount_infinity; + ASN_SEQUENCE_ADD(&ReportConfig_list->list, ReportConfig_A5); + // LTE_RRCConnectionReconfiguration->criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.measConfig->reportConfigToAddModList = ReportConfig_list; + + rsrp = CALLOC(1, sizeof(LTE_RSRP_Range_t)); + *rsrp = 20; + Sparams = CALLOC(1, sizeof(*Sparams)); + Sparams->present = LTE_MeasConfig__speedStatePars_PR_setup; + Sparams->choice.setup.timeToTrigger_SF.sf_High = LTE_SpeedStateScaleFactors__sf_Medium_oDot75; + Sparams->choice.setup.timeToTrigger_SF.sf_Medium = LTE_SpeedStateScaleFactors__sf_High_oDot5; + Sparams->choice.setup.mobilityStateParameters.n_CellChangeHigh = 10; + Sparams->choice.setup.mobilityStateParameters.n_CellChangeMedium = 5; + Sparams->choice.setup.mobilityStateParameters.t_Evaluation = LTE_MobilityStateParameters__t_Evaluation_s60; + Sparams->choice.setup.mobilityStateParameters.t_HystNormal = LTE_MobilityStateParameters__t_HystNormal_s120; quantityConfig = CALLOC(1, sizeof(*quantityConfig)); memset((void *)quantityConfig, 0, sizeof(*quantityConfig)); quantityConfig->quantityConfigEUTRA = CALLOC(1, sizeof(struct LTE_QuantityConfigEUTRA)); @@ -4006,8 +4184,9 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt CALLOC(1, sizeof(*(quantityConfig->quantityConfigEUTRA->filterCoefficientRSRP))); quantityConfig->quantityConfigEUTRA->filterCoefficientRSRQ = CALLOC(1, sizeof(*(quantityConfig->quantityConfigEUTRA->filterCoefficientRSRQ))); - *quantityConfig->quantityConfigEUTRA->filterCoefficientRSRP = LTE_FilterCoefficient_fc4; - *quantityConfig->quantityConfigEUTRA->filterCoefficientRSRQ = LTE_FilterCoefficient_fc4; + *quantityConfig->quantityConfigEUTRA->filterCoefficientRSRP = ue_context_pP->ue_context.measurement_info->filterCoefficientRSRP; + *quantityConfig->quantityConfigEUTRA->filterCoefficientRSRQ = ue_context_pP->ue_context.measurement_info->filterCoefficientRSRQ; + /* Initialize NAS list */ dedicatedInfoNASList = CALLOC(1, sizeof(struct LTE_RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList)); @@ -4023,12 +4202,13 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt } /* TODO parameters yet to process ... */ - // { - // ue_context_pP->ue_context.e_rab[i].param.qos; - // ue_context_pP->ue_context.e_rab[i].param.sgw_addr; - // ue_context_pP->ue_context.e_rab[i].param.gtp_teid; - // } - /* TODO should test if e RAB are Ok before! */ + { + // ue_context_pP->ue_context.e_rab[i].param.qos; + // ue_context_pP->ue_context.e_rab[i].param.sgw_addr; + // ue_context_pP->ue_context.e_rab[i].param.gtp_teid; + } + + /* TODO should test if e RAB are OK before! */ ue_context_pP->ue_context.e_rab[i].status = E_RAB_STATUS_DONE; LOG_D(RRC, "setting the status for the default DRB (index %d) to (%d,%s)\n", i, ue_context_pP->ue_context.e_rab[i].status, "E_RAB_STATUS_DONE"); @@ -4044,38 +4224,35 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt RC.rrc[ENB_INSTANCE_TO_MODULE_ID(ctxt_pP->instance)]->configuration.enable_measurement_reports; memset(buffer, 0, RRC_BUF_SIZE); + size = do_RRCConnectionReconfiguration(ctxt_pP, buffer, - xid, //Transaction_id, - (LTE_SRB_ToAddModList_t *)NULL, // SRB_configList - (LTE_DRB_ToAddModList_t *)NULL, - (LTE_DRB_ToReleaseList_t *)NULL, // DRB2_list, - (struct LTE_SPS_Config *)NULL, // *sps_Config, - (struct LTE_PhysicalConfigDedicated *)*physicalConfigDedicated, - // #ifdef EXMIMO_IOT - // NULL, NULL, NULL,NULL, - // #else - measurements_enabled ? (LTE_MeasObjectToAddModList_t *)MeasObj_list : NULL, - measurements_enabled ? (LTE_ReportConfigToAddModList_t *)ReportConfig_list : NULL, - measurements_enabled ? (LTE_QuantityConfig_t *)quantityConfig : NULL, - measurements_enabled ? (LTE_MeasIdToAddModList_t *)MeasId_list : NULL, - // #endif - (LTE_MAC_MainConfig_t *)mac_MainConfig, - (LTE_MeasGapConfig_t *)NULL, - (LTE_MobilityControlInfo_t *)NULL, - (LTE_SecurityConfigHO_t *)NULL, - (struct LTE_MeasConfig__speedStatePars *)Sparams, - (LTE_RSRP_Range_t *)rsrp, - (LTE_C_RNTI_t *)cba_RNTI, - (struct LTE_RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList *)dedicatedInfoNASList, - (LTE_SL_CommConfig_r12_t *)NULL, - (LTE_SL_DiscConfig_r12_t *)NULL + xid, // Transaction_id, + (LTE_SRB_ToAddModList_t *) *SRB_configList2, // SRB_configList + (LTE_DRB_ToAddModList_t *) *DRB_configList, + (LTE_DRB_ToReleaseList_t *) NULL, // DRB2_list, + (struct LTE_SPS_Config *) NULL, // *sps_Config, + (struct LTE_PhysicalConfigDedicated *) *physicalConfigDedicated, + measurements_enabled ? (LTE_MeasObjectToAddModList_t *) MeasObj_list : NULL, + measurements_enabled ? (LTE_ReportConfigToAddModList_t *) ReportConfig_list : NULL, + measurements_enabled ? (LTE_QuantityConfig_t *) quantityConfig : NULL, + measurements_enabled ? (LTE_MeasIdToAddModList_t *) MeasId_list : NULL, + (LTE_MAC_MainConfig_t *) mac_MainConfig, + (LTE_MeasGapConfig_t *) NULL, + (LTE_MobilityControlInfo_t *) NULL, + (LTE_SecurityConfigHO_t *) NULL, + (struct LTE_MeasConfig__speedStatePars *) Sparams, + (LTE_RSRP_Range_t *) rsrp, + (LTE_C_RNTI_t *) cba_RNTI, + (struct LTE_RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList *) dedicatedInfoNASList, + (LTE_SL_CommConfig_r12_t *) NULL, + (LTE_SL_DiscConfig_r12_t *) NULL #if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0)) - , (LTE_SCellToAddMod_r10_t *)NULL + , (LTE_SCellToAddMod_r10_t *) NULL #endif ); - LOG_DUMPMSG(RRC,DEBUG_RRC,(char *)buffer,size, - "[MSG] RRC Connection Reconfiguration\n"); + + LOG_DUMPMSG(RRC, DEBUG_RRC,(char *)buffer, size, "[MSG] RRC Connection Reconfiguration\n"); /* Free all NAS PDUs */ for (i = 0; i < ue_context_pP->ue_context.nb_of_e_rabs; i++) { @@ -4086,30 +4263,38 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt } } - LOG_I(RRC, - "[eNB %d] Frame %d, Logical Channel DL-DCCH, Generate LTE_RRCConnectionReconfiguration (bytes %d, UE id %x)\n", - ctxt_pP->module_id, ctxt_pP->frame, size, ue_context_pP->ue_context.rnti); - LOG_D(RRC, - "[FRAME %05d][RRC_eNB][MOD %u][][--- PDCP_DATA_REQ/%d Bytes (rrcConnectionReconfiguration to UE %x MUI %d) --->][PDCP][MOD %u][RB %u]\n", - ctxt_pP->frame, ctxt_pP->module_id, size, ue_context_pP->ue_context.rnti, rrc_eNB_mui, ctxt_pP->module_id, DCCH); - MSC_LOG_TX_MESSAGE( - MSC_RRC_ENB, - MSC_RRC_UE, - buffer, - size, - MSC_AS_TIME_FMT" LTE_RRCConnectionReconfiguration UE %x MUI %d size %u", - MSC_AS_TIME_ARGS(ctxt_pP), - ue_context_pP->ue_context.rnti, - rrc_eNB_mui, - size); - rrc_data_req( - ctxt_pP, - DCCH, - rrc_eNB_mui++, - SDU_CONFIRM_NO, - size, - buffer, - PDCP_TRANSMISSION_MODE_CONTROL); + LOG_I(RRC, "[eNB %d] Frame %d, Logical Channel DL-DCCH, Generate LTE_RRCConnectionReconfiguration (bytes %d, UE id %x)\n", + ctxt_pP->module_id, + ctxt_pP->frame, + size, + ue_context_pP->ue_context.rnti); + + LOG_D(RRC, "[FRAME %05d][RRC_eNB][MOD %u][][--- PDCP_DATA_REQ/%d Bytes (rrcConnectionReconfiguration to UE %x MUI %d) --->][PDCP][MOD %u][RB %u]\n", + ctxt_pP->frame, + ctxt_pP->module_id, + size, + ue_context_pP->ue_context.rnti, + rrc_eNB_mui, + ctxt_pP->module_id, + DCCH); + + MSC_LOG_TX_MESSAGE(MSC_RRC_ENB, + MSC_RRC_UE, + buffer, + size, + MSC_AS_TIME_FMT" LTE_RRCConnectionReconfiguration UE %x MUI %d size %u", + MSC_AS_TIME_ARGS(ctxt_pP), + ue_context_pP->ue_context.rnti, + rrc_eNB_mui, + size); + + rrc_data_req(ctxt_pP, + DCCH, + rrc_eNB_mui++, + SDU_CONFIRM_NO, + size, + buffer, + PDCP_TRANSMISSION_MODE_CONTROL); free(quantityConfig->quantityConfigEUTRA->filterCoefficientRSRQ); quantityConfig->quantityConfigEUTRA->filterCoefficientRSRQ = NULL; @@ -4133,7 +4318,6 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt mac_MainConfig = NULL; } - //----------------------------------------------------------------------------- int rrc_eNB_generate_RRCConnectionReconfiguration_SCell( diff --git a/openair2/RRC/LTE/rrc_proto.h b/openair2/RRC/LTE/rrc_proto.h index 5fc935c0ea0..8aa0125c0e0 100644 --- a/openair2/RRC/LTE/rrc_proto.h +++ b/openair2/RRC/LTE/rrc_proto.h @@ -306,8 +306,7 @@ void flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration( const protocol_ctxt_t *const ctxt_pP, rrc_eNB_ue_context_t *const ue_context_pP, - const uint8_t ho_state, - agent_reconf_rrc *trig_param + const uint8_t ho_state ); void rrc_eNB_generate_HO_RRCConnectionReconfiguration(const protocol_ctxt_t *const ctxt_pP, -- GitLab