Commit fea64122 authored by Robert Schmidt's avatar Robert Schmidt

Start FlexRAN agent directly, lock with mutex&condition

- lock with mutexes
- don't start ENB_APP task, but Agent directly and wait in case of
  reconfiguration
parent 02291630
......@@ -50,21 +50,11 @@
# endif
#if defined(FLEXRAN_AGENT_SB_IF)
# include "flexran_agent.h"
# include "targets/RT/USER/lte-softmodem.h"
#endif
extern unsigned char NB_eNB_INST;
#endif
extern volatile int node_control_state;
void ltesm_wait_reconfig_cmd(void)
{
LOG_I(ENB_APP, "LTE Softmodem wait reconfiguration command\n");
while (node_control_state == ENB_WAIT_RECONFIGURATION_CMD) {
usleep(200000);
}
}
#if defined(ENABLE_ITTI)
......@@ -299,7 +289,6 @@ void *eNB_app_task(void *args_p)
uint32_t registered_enb;
long enb_register_retry_timer_id;
# endif
uint32_t enb_id;
MessageDef *msg_p = NULL;
const char *msg_name = NULL;
instance_t instance;
......@@ -328,24 +317,6 @@ void *eNB_app_task(void *args_p)
"Number of eNB is greater than eNB defined in configuration file (%d/%d)!",
enb_nb, enb_properties_p->number);
#if defined (FLEXRAN_AGENT_SB_IF)
for (enb_id = enb_id_start; (enb_id < enb_id_end) ; enb_id++) {
flexran_agent_start(enb_id, enb_properties_p);
}
// wait for config comd from the controller/network app plus some time so
// that the other Tasks are in place
ltesm_wait_reconfig_cmd();
sleep(2);
// set again the ran api vars
for (enb_id = enb_id_start; (enb_id < enb_id_end) ; enb_id++) {
LOG_I(ENB_APP, "set again enb vars %d\n", enb_id);
flexran_set_enb_vars(enb_id, RAN_LTE_OAI);
}
#endif
enb_app_start_phy_rrc(enb_id_start, enb_id_end);
# if defined(ENABLE_USE_MME)
......
......@@ -38,7 +38,4 @@ 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);
/* wait that FlexRAN left state ENB_WAIT_RECONFIGURATION_CMD */
void ltesm_wait_reconfig_cmd(void);
#endif /* ENB_APP_H_ */
......@@ -36,25 +36,34 @@
#include "targets/RT/USER/lte-softmodem.h"
#include "assertions.h"
#include "enb_app.h"
extern volatile int node_control_state;
void handle_reconfiguration(mid_t mod_id)
{
/* NOTE: this function might be extended by using stop_modem()
* to halt the modem so that it can later be resumed */
int do_restart = 0;
pthread_mutex_lock(&mutex_node_ctrl);
if (ENB_NORMAL_OPERATION != node_control_state) {
node_control_state = ENB_NORMAL_OPERATION;
pthread_cond_broadcast(&cond_node_ctrl);
} else {
do_restart = 1;
}
pthread_mutex_unlock(&mutex_node_ctrl);
if (do_restart) {
clock_t start_ms = 1000 * clock();
/* operator || enforces sequence points */
if (stop_L1L2(mod_id) < 0 || restart_L1L2(mod_id) < 0) {
LOG_E(ENB_APP, "could not restart, killing lte-softmodem\n");
/* shutdown the whole lte-softmodem */
itti_terminate_tasks(TASK_PHY_ENB);
return;
}
enb_app_start_phy_rrc(mod_id, mod_id+1);
LOG_I(ENB_APP, "lte-softmodem restart succeeded\n");
int diff_ms = (1000 * clock() - start_ms) / CLOCKS_PER_SEC;
LOG_I(ENB_APP, "lte-softmodem restart succeeded in %d ms\n", diff_ms);
}
}
......
......@@ -40,17 +40,6 @@
# endif
# include "enb_app.h"
int create_enb_app_task(uint32_t enb_nb)
{
if (enb_nb > 0) {
if (itti_create_task (TASK_ENB_APP, eNB_app_task, NULL) < 0) {
LOG_E(ENB_APP, "Create task for eNB APP failed\n");
return -1;
}
}
return 0;
}
int create_tasks(uint32_t enb_nb, uint32_t ue_nb)
{
itti_wait_ready(1);
......@@ -59,6 +48,14 @@ int create_tasks(uint32_t enb_nb, uint32_t ue_nb)
return -1;
}
if (enb_nb > 0) {
/* Last task to create, others task must be ready before its start */
if (itti_create_task (TASK_ENB_APP, eNB_app_task, NULL) < 0) {
LOG_E(ENB_APP, "Create task for eNB APP failed\n");
return -1;
}
}
# ifdef OPENAIR2
{
......
......@@ -27,7 +27,6 @@
extern void *l2l1_task(void *arg);
int create_tasks(uint32_t enb_nb, uint32_t ue_nb);
int create_enb_app_task(uint32_t enb_nb);
#endif
#endif /* CREATE_TASKS_H_ */
......@@ -174,8 +174,6 @@ eNB_func_t node_function[MAX_NUM_CCs];
eNB_timing_t node_timing[MAX_NUM_CCs];
int16_t node_synch_ref[MAX_NUM_CCs];
volatile int16_t node_control_state;
uint32_t target_dl_mcs = 28; //maximum allowed mcs
uint32_t target_ul_mcs = 20;
uint32_t timing_advance = 0;
......@@ -234,9 +232,7 @@ threads_t threads= {-1,-1,-1,-1,-1,-1,-1};
*/
uint8_t abstraction_flag=0;
/* */
/* overrid the enb configuration params*/
/* override the enb configuration parameters */
static void reconfigure_enb_params(int enb_id);
......@@ -1097,11 +1093,13 @@ static void get_options (int argc, char **argv) {
"lte-softmodem compiled with MAX_NUM_CCs=%d, but only %d CCs configured for eNB %d!",
MAX_NUM_CCs, enb_properties->properties[i]->nb_cc, i);
#ifdef FLEXRAN_AGENT_SB_IF
if (enb_properties->properties[i]->flexran_agent_reconf == 1) {
node_control_state = ENB_WAIT_RECONFIGURATION_CMD;
} else {
node_control_state = ENB_NORMAL_OPERATION;
}
#endif
eth_params = (eth_params_t*)malloc(enb_properties->properties[i]->nb_rrh_gw * sizeof(eth_params_t));
memset(eth_params, 0, enb_properties->properties[i]->nb_rrh_gw * sizeof(eth_params_t));
......@@ -1796,19 +1794,28 @@ int main( int argc, char **argv ) {
// N_ZC = (prach_fmt <4)?839:139;
}
create_enb_app_task(UE_flag ? 0 : 1);
#ifdef FLEXRAN_AGENT_SB_IF
/* wait command for flexran agent: only start when configuration received */
ltesm_wait_reconfig_cmd ();
#endif
pthread_mutex_init(&mutex_node_ctrl, NULL);
pthread_cond_init(&cond_node_ctrl, NULL);
for (i = 0; i < NB_eNB_INST; i++) {
flexran_agent_start(i, enb_config_get());
}
LOG_I(ENB_APP, " * Waiting for FlexRAN RTController command *\n");
pthread_mutex_lock(&mutex_node_ctrl);
while (ENB_NORMAL_OPERATION != node_control_state)
pthread_cond_wait(&cond_node_ctrl, &mutex_node_ctrl);
pthread_mutex_unlock(&mutex_node_ctrl);
// reconfigure_enb: 0 for wait, 1 for skip, and other values to reconfigure
for (i=0; (i < NB_eNB_INST && node_control_state == ENB_NORMAL_OPERATION ) ; i++){
/* reconfigure eNB in case FlexRAN controller applied changes */
for (i=0; i < NB_eNB_INST; i++){
LOG_I(ENB_APP, "Reconfigure eNB module %d and FlexRAN eNB variables\n", i);
reconfigure_enb_params(i);
printf("[ENB_APP] Reconfigured eNB module %d - continue\n", i);
flexran_set_enb_vars(i, RAN_LTE_OAI);
}
#endif
if (UE_flag==1) {
NB_UE_INST=1;
NB_INST=1;
......@@ -2175,6 +2182,10 @@ int main( int argc, char **argv ) {
stop_eNB(1);
}
#ifdef FLEXRAN_AGENT_SB_IF
pthread_cond_destroy(&cond_node_ctrl);
pthread_mutex_destroy(&mutex_node_ctrl);
#endif
pthread_cond_destroy(&sync_cond);
pthread_mutex_destroy(&sync_mutex);
......@@ -2200,5 +2211,6 @@ int main( int argc, char **argv ) {
logClean();
printf("Bye.\n");
return 0;
}
......@@ -92,4 +92,11 @@ extern void init_te_thread(PHY_VARS_eNB *, pthread_attr_t *);
extern int stop_L1L2(int enb_id);
extern int restart_L1L2(int enb_id);
#ifdef FLEXRAN_AGENT_SB_IF
#include "flexran_agent.h" // for locking
volatile ENB_MODULE_STATE node_control_state;
pthread_cond_t cond_node_ctrl;
pthread_mutex_t mutex_node_ctrl;
#endif
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment