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 @@ ...@@ -50,21 +50,11 @@
# endif # endif
#if defined(FLEXRAN_AGENT_SB_IF) #if defined(FLEXRAN_AGENT_SB_IF)
# include "flexran_agent.h" # include "targets/RT/USER/lte-softmodem.h"
#endif #endif
extern unsigned char NB_eNB_INST; extern unsigned char NB_eNB_INST;
#endif #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) #if defined(ENABLE_ITTI)
...@@ -299,7 +289,6 @@ void *eNB_app_task(void *args_p) ...@@ -299,7 +289,6 @@ void *eNB_app_task(void *args_p)
uint32_t registered_enb; uint32_t registered_enb;
long enb_register_retry_timer_id; long enb_register_retry_timer_id;
# endif # endif
uint32_t enb_id;
MessageDef *msg_p = NULL; MessageDef *msg_p = NULL;
const char *msg_name = NULL; const char *msg_name = NULL;
instance_t instance; instance_t instance;
...@@ -328,24 +317,6 @@ void *eNB_app_task(void *args_p) ...@@ -328,24 +317,6 @@ void *eNB_app_task(void *args_p)
"Number of eNB is greater than eNB defined in configuration file (%d/%d)!", "Number of eNB is greater than eNB defined in configuration file (%d/%d)!",
enb_nb, enb_properties_p->number); 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); enb_app_start_phy_rrc(enb_id_start, enb_id_end);
# if defined(ENABLE_USE_MME) # if defined(ENABLE_USE_MME)
......
...@@ -38,7 +38,4 @@ void *eNB_app_task(void *args_p); ...@@ -38,7 +38,4 @@ void *eNB_app_task(void *args_p);
/* needed for flexran: start PHY and RRC when restarting */ /* 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 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_ */ #endif /* ENB_APP_H_ */
...@@ -36,25 +36,34 @@ ...@@ -36,25 +36,34 @@
#include "targets/RT/USER/lte-softmodem.h" #include "targets/RT/USER/lte-softmodem.h"
#include "assertions.h" #include "assertions.h"
#include "enb_app.h" #include "enb_app.h"
extern volatile int node_control_state;
void handle_reconfiguration(mid_t mod_id) void handle_reconfiguration(mid_t mod_id)
{ {
/* NOTE: this function might be extended by using stop_modem() /* NOTE: this function might be extended by using stop_modem()
* to halt the modem so that it can later be resumed */ * 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) { if (ENB_NORMAL_OPERATION != node_control_state) {
node_control_state = ENB_NORMAL_OPERATION; node_control_state = ENB_NORMAL_OPERATION;
pthread_cond_broadcast(&cond_node_ctrl);
} else { } 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) { if (stop_L1L2(mod_id) < 0 || restart_L1L2(mod_id) < 0) {
LOG_E(ENB_APP, "could not restart, killing lte-softmodem\n"); LOG_E(ENB_APP, "could not restart, killing lte-softmodem\n");
/* shutdown the whole lte-softmodem */ /* shutdown the whole lte-softmodem */
itti_terminate_tasks(TASK_PHY_ENB); itti_terminate_tasks(TASK_PHY_ENB);
return; return;
} }
enb_app_start_phy_rrc(mod_id, mod_id+1); 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 @@ ...@@ -40,17 +40,6 @@
# endif # endif
# include "enb_app.h" # 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) int create_tasks(uint32_t enb_nb, uint32_t ue_nb)
{ {
itti_wait_ready(1); itti_wait_ready(1);
...@@ -59,6 +48,14 @@ int create_tasks(uint32_t enb_nb, uint32_t ue_nb) ...@@ -59,6 +48,14 @@ int create_tasks(uint32_t enb_nb, uint32_t ue_nb)
return -1; 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 # ifdef OPENAIR2
{ {
......
...@@ -27,7 +27,6 @@ ...@@ -27,7 +27,6 @@
extern void *l2l1_task(void *arg); extern void *l2l1_task(void *arg);
int create_tasks(uint32_t enb_nb, uint32_t ue_nb); int create_tasks(uint32_t enb_nb, uint32_t ue_nb);
int create_enb_app_task(uint32_t enb_nb);
#endif #endif
#endif /* CREATE_TASKS_H_ */ #endif /* CREATE_TASKS_H_ */
...@@ -174,8 +174,6 @@ eNB_func_t node_function[MAX_NUM_CCs]; ...@@ -174,8 +174,6 @@ eNB_func_t node_function[MAX_NUM_CCs];
eNB_timing_t node_timing[MAX_NUM_CCs]; eNB_timing_t node_timing[MAX_NUM_CCs];
int16_t node_synch_ref[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_dl_mcs = 28; //maximum allowed mcs
uint32_t target_ul_mcs = 20; uint32_t target_ul_mcs = 20;
uint32_t timing_advance = 0; uint32_t timing_advance = 0;
...@@ -234,9 +232,7 @@ threads_t threads= {-1,-1,-1,-1,-1,-1,-1}; ...@@ -234,9 +232,7 @@ threads_t threads= {-1,-1,-1,-1,-1,-1,-1};
*/ */
uint8_t abstraction_flag=0; uint8_t abstraction_flag=0;
/* */ /* override the enb configuration parameters */
/* overrid the enb configuration params*/
static void reconfigure_enb_params(int enb_id); static void reconfigure_enb_params(int enb_id);
...@@ -1097,11 +1093,13 @@ static void get_options (int argc, char **argv) { ...@@ -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!", "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); MAX_NUM_CCs, enb_properties->properties[i]->nb_cc, i);
#ifdef FLEXRAN_AGENT_SB_IF
if (enb_properties->properties[i]->flexran_agent_reconf == 1) { if (enb_properties->properties[i]->flexran_agent_reconf == 1) {
node_control_state = ENB_WAIT_RECONFIGURATION_CMD; node_control_state = ENB_WAIT_RECONFIGURATION_CMD;
} else { } else {
node_control_state = ENB_NORMAL_OPERATION; node_control_state = ENB_NORMAL_OPERATION;
} }
#endif
eth_params = (eth_params_t*)malloc(enb_properties->properties[i]->nb_rrh_gw * sizeof(eth_params_t)); 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)); 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 ) { ...@@ -1796,19 +1794,28 @@ int main( int argc, char **argv ) {
// N_ZC = (prach_fmt <4)?839:139; // N_ZC = (prach_fmt <4)?839:139;
} }
create_enb_app_task(UE_flag ? 0 : 1);
#ifdef FLEXRAN_AGENT_SB_IF #ifdef FLEXRAN_AGENT_SB_IF
/* wait command for flexran agent: only start when configuration received */ pthread_mutex_init(&mutex_node_ctrl, NULL);
ltesm_wait_reconfig_cmd (); pthread_cond_init(&cond_node_ctrl, NULL);
#endif
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 /* reconfigure eNB in case FlexRAN controller applied changes */
for (i=0; (i < NB_eNB_INST && node_control_state == ENB_NORMAL_OPERATION ) ; i++){ 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); 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) { if (UE_flag==1) {
NB_UE_INST=1; NB_UE_INST=1;
NB_INST=1; NB_INST=1;
...@@ -2175,6 +2182,10 @@ int main( int argc, char **argv ) { ...@@ -2175,6 +2182,10 @@ int main( int argc, char **argv ) {
stop_eNB(1); 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_cond_destroy(&sync_cond);
pthread_mutex_destroy(&sync_mutex); pthread_mutex_destroy(&sync_mutex);
...@@ -2200,5 +2211,6 @@ int main( int argc, char **argv ) { ...@@ -2200,5 +2211,6 @@ int main( int argc, char **argv ) {
logClean(); logClean();
printf("Bye.\n");
return 0; return 0;
} }
...@@ -92,4 +92,11 @@ extern void init_te_thread(PHY_VARS_eNB *, pthread_attr_t *); ...@@ -92,4 +92,11 @@ extern void init_te_thread(PHY_VARS_eNB *, pthread_attr_t *);
extern int stop_L1L2(int enb_id); extern int stop_L1L2(int enb_id);
extern int restart_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 #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