diff --git a/openair2/COMMON/flexran_messages_def.h b/openair2/COMMON/flexran_messages_def.h new file mode 100644 index 0000000000000000000000000000000000000000..fdcdf698dc76b45c29f13a4d186b99d1fb931c2e --- /dev/null +++ b/openair2/COMMON/flexran_messages_def.h @@ -0,0 +1,29 @@ +/* + * 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 + */ + +/* + * flexran_messages_def.h + * + * Created on: Apr 26, 2018 + * Author: R. Schmidt + */ + +MESSAGE_DEF(SOFT_RESTART_MESSAGE, MESSAGE_PRIORITY_MED_PLUS, IttiMsgEmpty, soft_restart_message) diff --git a/openair2/COMMON/messages_def.h b/openair2/COMMON/messages_def.h index 2434d157767bb2369c53eaf4aa2cb5fe07f5588b..f6e2dd0f4b0159defbbdc18c065957045972a3ec 100644 --- a/openair2/COMMON/messages_def.h +++ b/openair2/COMMON/messages_def.h @@ -38,4 +38,4 @@ #include "sctp_messages_def.h" #include "udp_messages_def.h" #include "gtpv1_u_messages_def.h" - +#include "flexran_messages_def.h" diff --git a/openair2/ENB_APP/enb_app.c b/openair2/ENB_APP/enb_app.c index f95fdd7e5ae8c7dfbecef187b1e2800320387284..89df62db7bd9499e0ffcf9d69e8aee3ceeac1724 100644 --- a/openair2/ENB_APP/enb_app.c +++ b/openair2/ENB_APP/enb_app.c @@ -65,6 +65,8 @@ extern RAN_CONTEXT_t RC; # define ENB_REGISTER_RETRY_DELAY 10 # endif +#include "targets/RT/USER/lte-softmodem.h" + /*------------------------------------------------------------------------------*/ /* @@ -245,6 +247,10 @@ void *eNB_app_task(void *args_p) LOG_I(ENB_APP, "Received %s\n", ITTI_MSG_NAME(msg_p)); break; + case SOFT_RESTART_MESSAGE: + handle_reconfiguration(instance); + break; + case S1AP_REGISTER_ENB_CNF: # if defined(ENABLE_USE_MME) LOG_I(ENB_APP, "[eNB %d] Received %s: associated MME %d\n", instance, ITTI_MSG_NAME (msg_p), @@ -322,3 +328,51 @@ void *eNB_app_task(void *args_p) return NULL; } + +void handle_reconfiguration(module_id_t mod_id) +{ + struct timespec start, end; + clock_gettime(CLOCK_MONOTONIC, &start); + flexran_agent_info_t *flexran = RC.flexran[mod_id]; + + if (ENB_WAIT == flexran->node_ctrl_state) { + /* this is already waiting, just release */ + pthread_mutex_lock(&flexran->mutex_node_ctrl); + flexran->node_ctrl_state = ENB_NORMAL_OPERATION; + pthread_mutex_unlock(&flexran->mutex_node_ctrl); + pthread_cond_signal(&flexran->cond_node_ctrl); + return; + } + + if (stop_L1L2(mod_id) < 0) { + LOG_E(ENB_APP, "can not stop lte-softmodem, aborting restart\n"); + return; + } + + /* node_ctrl_state should have value ENB_MAKE_WAIT only if this method is not + * executed by the FlexRAN thread */ + if (ENB_MAKE_WAIT == flexran->node_ctrl_state) { + LOG_I(ENB_APP, " * eNB %d: Waiting for FlexRAN RTController command *\n", mod_id); + pthread_mutex_lock(&flexran->mutex_node_ctrl); + flexran->node_ctrl_state = ENB_WAIT; + while (ENB_NORMAL_OPERATION != flexran->node_ctrl_state) + pthread_cond_wait(&flexran->cond_node_ctrl, &flexran->mutex_node_ctrl); + pthread_mutex_unlock(&flexran->mutex_node_ctrl); + } + + if (restart_L1L2(mod_id) < 0) { + LOG_F(ENB_APP, "can not restart, killing lte-softmodem\n"); + itti_terminate_tasks(TASK_PHY_ENB); + return; + } + + clock_gettime(CLOCK_MONOTONIC, &end); + end.tv_sec -= start.tv_sec; + if (end.tv_nsec >= start.tv_nsec) { + end.tv_nsec -= start.tv_nsec; + } else { + end.tv_sec -= 1; + end.tv_nsec = end.tv_nsec - start.tv_nsec + 1000000000; + } + LOG_I(ENB_APP, "lte-softmodem restart succeeded in %ld.%ld s\n", end.tv_sec, end.tv_nsec / 1000000); +} diff --git a/openair2/ENB_APP/enb_app.h b/openair2/ENB_APP/enb_app.h index 4dfea72eefbbbf6bc951f562b17f91b869e3ed4a..9eb5ea2400fee9a964fbd8a3fc2d026b612d437f 100644 --- a/openair2/ENB_APP/enb_app.h +++ b/openair2/ENB_APP/enb_app.h @@ -31,11 +31,11 @@ #define ENB_APP_H_ #include <stdint.h> +#include "platform_types.h" void *eNB_app_task(void *args_p); -/* needed for flexran: start PHY and RRC when restarting */ -void enb_app_start_phy_rrc(uint32_t enb_id_start, uint32_t enb_id_end); +void handle_reconfiguration(module_id_t mod_id); #endif /* ENB_APP_H_ */ diff --git a/openair2/ENB_APP/flexran_agent_common.c b/openair2/ENB_APP/flexran_agent_common.c index b6a7fa26cd02059aac8cd0922003b27025b188dc..7578dec03fcc9e7402a74268382d0fd4c645243f 100644 --- a/openair2/ENB_APP/flexran_agent_common.c +++ b/openair2/ENB_APP/flexran_agent_common.c @@ -1130,10 +1130,11 @@ int flexran_agent_handle_enb_config_reply(mid_t mod_id, const void *params, Prot if (enb_config->n_cell_config > 1) LOG_W(FLEXRAN_AGENT, "ignoring slice configs for other cell except cell 0\n"); - if (enb_config->cell_config[0]->slice_config) + if (enb_config->cell_config[0]->slice_config) { prepare_update_slice_config(mod_id, enb_config->cell_config[0]->slice_config); - - /* could test for cell configs here and maybe reconfigure/soft-restart */ + } else { + initiate_soft_restart(mod_id, enb_config->cell_config[0]); + } *msg = NULL; return 0; diff --git a/openair2/ENB_APP/flexran_agent_common_internal.c b/openair2/ENB_APP/flexran_agent_common_internal.c index 8874a0f64852f06ac619ba4eed39e7d02fe292ec..501e878d321114e1ee12da83fc41695818bafb44 100644 --- a/openair2/ENB_APP/flexran_agent_common_internal.c +++ b/openair2/ENB_APP/flexran_agent_common_internal.c @@ -31,57 +31,7 @@ #include "flexran_agent_common_internal.h" #include "flexran_agent_mac_internal.h" - -/* needed to soft-restart the lte-softmodem */ -#include "targets/RT/USER/lte-softmodem.h" - -void handle_reconfiguration(mid_t mod_id) -{ - struct timespec start, end; - clock_gettime(CLOCK_MONOTONIC, &start); - flexran_agent_info_t *flexran = RC.flexran[mod_id]; - - if (ENB_WAIT == flexran->node_ctrl_state) { - /* this is already waiting, just release */ - pthread_mutex_lock(&flexran->mutex_node_ctrl); - flexran->node_ctrl_state = ENB_NORMAL_OPERATION; - pthread_mutex_unlock(&flexran->mutex_node_ctrl); - pthread_cond_signal(&flexran->cond_node_ctrl); - return; - } - - if (stop_L1L2(mod_id) < 0) { - LOG_E(ENB_APP, "can not stop lte-softmodem, aborting restart\n"); - return; - } - - /* node_ctrl_state should have value ENB_MAKE_WAIT only if this method is not - * executed by the FlexRAN thread */ - if (ENB_MAKE_WAIT == flexran->node_ctrl_state) { - LOG_I(ENB_APP, " * eNB %d: Waiting for FlexRAN RTController command *\n", mod_id); - pthread_mutex_lock(&flexran->mutex_node_ctrl); - flexran->node_ctrl_state = ENB_WAIT; - while (ENB_NORMAL_OPERATION != flexran->node_ctrl_state) - pthread_cond_wait(&flexran->cond_node_ctrl, &flexran->mutex_node_ctrl); - pthread_mutex_unlock(&flexran->mutex_node_ctrl); - } - - if (restart_L1L2(mod_id) < 0) { - LOG_F(ENB_APP, "can not restart, killing lte-softmodem\n"); - itti_terminate_tasks(TASK_PHY_ENB); - return; - } - - clock_gettime(CLOCK_MONOTONIC, &end); - end.tv_sec -= start.tv_sec; - if (end.tv_nsec >= start.tv_nsec) { - end.tv_nsec -= start.tv_nsec; - } else { - end.tv_sec -= 1; - end.tv_nsec = end.tv_nsec - start.tv_nsec + 1000000000; - } - LOG_I(ENB_APP, "lte-softmodem restart succeeded in %ld.%ld s\n", end.tv_sec, end.tv_nsec / 1000000); -} +#include "enb_app.h" int apply_reconfiguration_policy(mid_t mod_id, const char *policy, size_t policy_length) { @@ -589,3 +539,32 @@ int apply_parameter_modification(void *parameter, yaml_parser_t *parser) { return -1; } + +void initiate_soft_restart(module_id_t mod_id, Protocol__FlexCellConfig *c) +{ + uint8_t cc_id = c->has_cell_id ? c->cell_id : 0; + if (c->has_eutra_band) { + flexran_agent_set_operating_eutra_band(mod_id, cc_id, c->eutra_band); + LOG_I(ENB_APP, "Setting eutra_band to %d\n", c->eutra_band); + } + if (c->has_dl_freq && c->has_ul_freq) { + flexran_agent_set_operating_dl_freq(mod_id, cc_id, c->dl_freq); + LOG_I(ENB_APP, "Setting dl_freq to %d\n", c->dl_freq); + int32_t ul_freq_offset = c->ul_freq - c->dl_freq; + flexran_agent_set_operating_ul_freq(mod_id, cc_id, ul_freq_offset); + LOG_I(ENB_APP, "Setting ul_freq to %d\n", c->ul_freq); + } + if (c->has_dl_bandwidth) { + flexran_agent_set_operating_bandwidth(mod_id, cc_id, c->dl_bandwidth); + LOG_I(ENB_APP, "Setting bandwidth to %d\n", c->dl_bandwidth); + if (c->has_ul_bandwidth && c->ul_bandwidth != c->dl_bandwidth) + LOG_W(ENB_APP, "UL/DL bandwidth mismatch, applied DL bandwidth\n"); + } else if (c->has_ul_bandwidth) { + flexran_agent_set_operating_bandwidth(mod_id, cc_id, c->ul_bandwidth); + LOG_I(ENB_APP, "Setting bandwidth to %d\n", c->ul_bandwidth); + } + + MessageDef *msg; + msg = itti_alloc_new_message(TASK_FLEXRAN_AGENT, SOFT_RESTART_MESSAGE); + itti_send_msg_to_task(ENB_APP, ENB_MODULE_ID_TO_INSTANCE(mod_id), msg); +} diff --git a/openair2/ENB_APP/flexran_agent_common_internal.h b/openair2/ENB_APP/flexran_agent_common_internal.h index bf908ac13232b8743c72411481a8be649d884519..544321e228017900d5334501be1da0d327e0a464 100644 --- a/openair2/ENB_APP/flexran_agent_common_internal.h +++ b/openair2/ENB_APP/flexran_agent_common_internal.h @@ -32,6 +32,7 @@ #include <yaml.h> #include "flexran_agent_defs.h" +#include "flexran.pb-c.h" int apply_reconfiguration_policy(mid_t mod_id, const char *policy, size_t policy_length); @@ -57,4 +58,7 @@ int skip_subsystem_parameters_config(yaml_parser_t *parser); //that is not yet implmeneted in order to skip its configuration, without affecting the rest int skip_parameter_modification(yaml_parser_t *parser); +// applies reconfiguration parameters and notifies ENB APP +void initiate_soft_restart(mid_t mod_id, Protocol__FlexCellConfig *c); + #endif