diff --git a/openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc.c b/openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc.c index 32038ee153..7e6d83f748 100644 --- a/openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc.c +++ b/openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc.c @@ -832,6 +832,9 @@ void flexran_agent_fill_rrc_cell_config(mid_t mod_id, uint8_t cc_id, } else { conf->n_plmn_id = 0; } + + conf->x2_ho_net_control = flexran_get_x2_ho_net_control(mod_id); + conf->has_x2_ho_net_control = 1; } int flexran_agent_unregister_rrc_xface(mid_t mod_id) diff --git a/openair2/ENB_APP/MESSAGES/V2/config_messages.proto b/openair2/ENB_APP/MESSAGES/V2/config_messages.proto index c339ad0bf6..6d24e5a0ac 100644 --- a/openair2/ENB_APP/MESSAGES/V2/config_messages.proto +++ b/openair2/ENB_APP/MESSAGES/V2/config_messages.proto @@ -45,6 +45,7 @@ message flex_cell_config { repeated flex_plmn plmn_id = 40; // The PLMN cell id of this cell optional flex_slice_config slice_config = 42; + optional bool x2_ho_net_control = 43; } message flex_slice_config { diff --git a/openair2/ENB_APP/flexran_agent_common.c b/openair2/ENB_APP/flexran_agent_common.c index 757a796233..d3c0a89182 100644 --- a/openair2/ENB_APP/flexran_agent_common.c +++ b/openair2/ENB_APP/flexran_agent_common.c @@ -914,6 +914,12 @@ int flexran_agent_handle_enb_config_reply(mid_t mod_id, const void *params, Prot // initiate_soft_restart(mod_id, enb_config->cell_config[0]); } + if (flexran_agent_get_rrc_xface(mod_id) && enb_config->cell_config[0]->has_x2_ho_net_control) { + if (flexran_set_x2_ho_net_control(mod_id, enb_config->cell_config[0]->x2_ho_net_control) < 0) { + LOG_E(FLEXRAN_AGENT, "Error in configuring X2 handover controlled by network"); + } + } + *msg = NULL; return 0; } diff --git a/openair2/ENB_APP/flexran_agent_ran_api.c b/openair2/ENB_APP/flexran_agent_ran_api.c index cd91e73a7c..1465f46854 100644 --- a/openair2/ENB_APP/flexran_agent_ran_api.c +++ b/openair2/ENB_APP/flexran_agent_ran_api.c @@ -2082,6 +2082,18 @@ int flexran_set_rrc_a3_event_reportOnLeave(mid_t mod_id, rnti_t rnti, int report return 0; } +int flexran_set_x2_ho_net_control(mid_t mod_id, int x2_ho_net_control) { + if (!rrc_is_present(mod_id)) return -1; + if (!((x2_ho_net_control == 0) || (x2_ho_net_control == 1))) return -1; + RC.rrc[mod_id]->x2_ho_net_control = x2_ho_net_control; + return 0; +} + +int flexran_get_x2_ho_net_control(mid_t mod_id) { + if (!rrc_is_present(mod_id)) return -1; + return RC.rrc[mod_id]->x2_ho_net_control; +} + 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 d3229bd462..7dd6b69b61 100644 --- a/openair2/ENB_APP/flexran_agent_ran_api.h +++ b/openair2/ENB_APP/flexran_agent_ran_api.h @@ -630,6 +630,12 @@ uint16_t flexran_get_rrc_mnc(mid_t mod_id, uint8_t index); /* Get index'th MNC's digit length broadcasted in SIB1 */ uint8_t flexran_get_rrc_mnc_digit_length(mid_t mod_id, uint8_t index); +/* Get X2 handover controlled by network */ +int flexran_get_x2_ho_net_control(mid_t mod_id); + +/* Set X2 handover controlled by network */ +int flexran_set_x2_ho_net_control(mid_t mod_id, int x2_ho_net_control); + /* Get number of adjacent cells via X2 interface */ int flexran_get_rrc_num_adj_cells(mid_t mod_id); /************************** Slice configuration **************************/ diff --git a/openair2/RRC/LTE/rrc_defs.h b/openair2/RRC/LTE/rrc_defs.h index 21feaf5e4c..ef0598a40a 100644 --- a/openair2/RRC/LTE/rrc_defs.h +++ b/openair2/RRC/LTE/rrc_defs.h @@ -826,6 +826,9 @@ typedef struct eNB_RRC_INST_s { /// NR cell id uint64_t nr_cellid; + // X2 handover controlled by network + int x2_ho_net_control; + // Neighborouring cells id int num_neigh_cells; int num_neigh_cells_cc[MAX_NUM_CCs]; diff --git a/openair2/RRC/LTE/rrc_eNB.c b/openair2/RRC/LTE/rrc_eNB.c index fd308caebe..58f5ed53a7 100644 --- a/openair2/RRC/LTE/rrc_eNB.c +++ b/openair2/RRC/LTE/rrc_eNB.c @@ -4515,6 +4515,9 @@ rrc_eNB_process_MeasurementReport( if (!RC.rrc[ENB_INSTANCE_TO_MODULE_ID(ctxt_pP->instance)]->configuration.enable_x2) return; + if (RC.rrc[ctxt_pP->module_id]->x2_ho_net_control) + return; + LOG_D(RRC, "A3 event is triggered...\n"); /* if the UE is not in handover mode, start handover procedure */