From 47ca7e895246eb7bdc052757c03f8e8f45e2ca97 Mon Sep 17 00:00:00 2001
From: winckel <winckel@eurecom.fr>
Date: Mon, 3 Feb 2014 21:33:27 +0000
Subject: [PATCH] Reorganized eNB configuration code.

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@5012 818b1a75-f10b-46b9-bf7c-635c3b92a50f
---
 openair2/ENB_APP/enb_app.c    | 95 +++++++++++++++++------------------
 openair2/ENB_APP/enb_config.c | 76 +++++++++++++++-------------
 openair2/ENB_APP/enb_config.h |  9 +++-
 3 files changed, 96 insertions(+), 84 deletions(-)

diff --git a/openair2/ENB_APP/enb_app.c b/openair2/ENB_APP/enb_app.c
index 1c199f555c..afccaa471b 100644
--- a/openair2/ENB_APP/enb_app.c
+++ b/openair2/ENB_APP/enb_app.c
@@ -60,44 +60,40 @@ extern char         *g_conf_config_file_name;
 # endif
 
 /*------------------------------------------------------------------------------*/
-static Enb_properties_t    *enb_properties[MAX_ENB];
-static int                  enb_nb_properties;
-
-/*------------------------------------------------------------------------------*/
-static void configure_phy(uint32_t enb_id)
+static void configure_phy(uint32_t enb_id, const Enb_properties_array_t *enb_properties)
 {
     MessageDef *msg_p;
 
     msg_p = itti_alloc_new_message (TASK_ENB_APP, PHY_CONFIGURATION_REQ);
 
-    PHY_CONFIGURATION_REQ (msg_p).frame_type =              enb_properties[enb_id]->frame_type;
-    PHY_CONFIGURATION_REQ (msg_p).prefix_type =             enb_properties[enb_id]->prefix_type;
-    PHY_CONFIGURATION_REQ (msg_p).downlink_frequency =      enb_properties[enb_id]->downlink_frequency;
-    PHY_CONFIGURATION_REQ (msg_p).uplink_frequency_offset = enb_properties[enb_id]->uplink_frequency_offset;
+    PHY_CONFIGURATION_REQ (msg_p).frame_type =              enb_properties->properties[enb_id]->frame_type;
+    PHY_CONFIGURATION_REQ (msg_p).prefix_type =             enb_properties->properties[enb_id]->prefix_type;
+    PHY_CONFIGURATION_REQ (msg_p).downlink_frequency =      enb_properties->properties[enb_id]->downlink_frequency;
+    PHY_CONFIGURATION_REQ (msg_p).uplink_frequency_offset = enb_properties->properties[enb_id]->uplink_frequency_offset;
 
     itti_send_msg_to_task (TASK_PHY_ENB, enb_id, msg_p);
 }
 
 /*------------------------------------------------------------------------------*/
-static void configure_rrc(uint32_t enb_id)
+static void configure_rrc(uint32_t enb_id, const Enb_properties_array_t *enb_properties)
 {
     MessageDef *msg_p;
 
     msg_p = itti_alloc_new_message (TASK_ENB_APP, RRC_CONFIGURATION_REQ);
 
-    RRC_CONFIGURATION_REQ (msg_p).cell_identity =   enb_properties[enb_id]->eNB_id;
-    RRC_CONFIGURATION_REQ (msg_p).tac =             enb_properties[enb_id]->tac;
-    RRC_CONFIGURATION_REQ (msg_p).mcc =             enb_properties[enb_id]->mcc;
-    RRC_CONFIGURATION_REQ (msg_p).mnc =             enb_properties[enb_id]->mnc;
-    RRC_CONFIGURATION_REQ (msg_p).default_drx =     enb_properties[enb_id]->default_drx;
-    RRC_CONFIGURATION_REQ (msg_p).frame_type =      enb_properties[enb_id]->frame_type;
+    RRC_CONFIGURATION_REQ (msg_p).cell_identity =   enb_properties->properties[enb_id]->eNB_id;
+    RRC_CONFIGURATION_REQ (msg_p).tac =             enb_properties->properties[enb_id]->tac;
+    RRC_CONFIGURATION_REQ (msg_p).mcc =             enb_properties->properties[enb_id]->mcc;
+    RRC_CONFIGURATION_REQ (msg_p).mnc =             enb_properties->properties[enb_id]->mnc;
+    RRC_CONFIGURATION_REQ (msg_p).default_drx =     enb_properties->properties[enb_id]->default_drx;
+    RRC_CONFIGURATION_REQ (msg_p).frame_type =      enb_properties->properties[enb_id]->frame_type;
 
     itti_send_msg_to_task (TASK_RRC_ENB, enb_id, msg_p);
 }
 
 /*------------------------------------------------------------------------------*/
 # if defined(ENABLE_USE_MME)
-static uint32_t eNB_app_register(uint32_t enb_id_start, uint32_t enb_id_end)
+static uint32_t eNB_app_register(uint32_t enb_id_start, uint32_t enb_id_end, const Enb_properties_array_t *enb_properties)
 {
     uint32_t enb_id;
     uint32_t mme_id;
@@ -122,26 +118,26 @@ static uint32_t eNB_app_register(uint32_t enb_id_start, uint32_t enb_id_end)
             s1ap_register_eNB = &S1AP_REGISTER_ENB_REQ(msg_p);
 
             /* Some default/random parameters */
-            s1ap_register_eNB->eNB_id = enb_properties[enb_id]->eNB_id;
-            s1ap_register_eNB->cell_type = enb_properties[enb_id]->cell_type;
-            s1ap_register_eNB->eNB_name = enb_properties[enb_id]->eNB_name;
-            s1ap_register_eNB->tac = enb_properties[enb_id]->tac;
-            s1ap_register_eNB->mcc = enb_properties[enb_id]->mcc;
-            s1ap_register_eNB->mnc = enb_properties[enb_id]->mnc;
-            s1ap_register_eNB->default_drx = enb_properties[enb_id]->default_drx;
-
-            s1ap_register_eNB->nb_mme = enb_properties[enb_id]->nb_mme;
+            s1ap_register_eNB->eNB_id =         enb_properties->properties[enb_id]->eNB_id;
+            s1ap_register_eNB->cell_type =      enb_properties->properties[enb_id]->cell_type;
+            s1ap_register_eNB->eNB_name =       enb_properties->properties[enb_id]->eNB_name;
+            s1ap_register_eNB->tac =            enb_properties->properties[enb_id]->tac;
+            s1ap_register_eNB->mcc =            enb_properties->properties[enb_id]->mcc;
+            s1ap_register_eNB->mnc =            enb_properties->properties[enb_id]->mnc;
+            s1ap_register_eNB->default_drx =    enb_properties->properties[enb_id]->default_drx;
+
+            s1ap_register_eNB->nb_mme =         enb_properties->properties[enb_id]->nb_mme;
             AssertFatal (s1ap_register_eNB->nb_mme <= S1AP_MAX_NB_MME_IP_ADDRESS, "Too many MME for eNB %d (%d/%d)!", enb_id, s1ap_register_eNB->nb_mme, S1AP_MAX_NB_MME_IP_ADDRESS);
 
             for (mme_id = 0; mme_id < s1ap_register_eNB->nb_mme; mme_id++)
             {
-                s1ap_register_eNB->mme_ip_address[mme_id].ipv4 = enb_properties[enb_id]->mme_ip_address[mme_id].ipv4;
-                s1ap_register_eNB->mme_ip_address[mme_id].ipv6 = enb_properties[enb_id]->mme_ip_address[mme_id].ipv6;
+                s1ap_register_eNB->mme_ip_address[mme_id].ipv4 = enb_properties->properties[enb_id]->mme_ip_address[mme_id].ipv4;
+                s1ap_register_eNB->mme_ip_address[mme_id].ipv6 = enb_properties->properties[enb_id]->mme_ip_address[mme_id].ipv6;
                 strncpy (s1ap_register_eNB->mme_ip_address[mme_id].ipv4_address,
-                         enb_properties[enb_id]->mme_ip_address[mme_id].ipv4_address,
+                         enb_properties->properties[enb_id]->mme_ip_address[mme_id].ipv4_address,
                          sizeof(s1ap_register_eNB->mme_ip_address[0].ipv4_address));
                 strncpy (s1ap_register_eNB->mme_ip_address[mme_id].ipv6_address,
-                         enb_properties[enb_id]->mme_ip_address[mme_id].ipv6_address,
+                         enb_properties->properties[enb_id]->mme_ip_address[mme_id].ipv6_address,
                          sizeof(s1ap_register_eNB->mme_ip_address[0].ipv6_address));
             }
 
@@ -159,20 +155,21 @@ static uint32_t eNB_app_register(uint32_t enb_id_start, uint32_t enb_id_end)
 /*------------------------------------------------------------------------------*/
 void *eNB_app_task(void *args_p)
 {
+    const Enb_properties_array_t   *enb_properties;
 #if defined(ENABLE_ITTI)
-    uint32_t    enb_nb = 1; /* Default number of eNB is 1 */
-    uint32_t    enb_id_start = 0;
-    uint32_t    enb_id_end = enb_id_start + enb_nb;
+    uint32_t                        enb_nb = 1; /* Default number of eNB is 1 */
+    uint32_t                        enb_id_start = 0;
+    uint32_t                        enb_id_end = enb_id_start + enb_nb;
 # if defined(ENABLE_USE_MME)
-    uint32_t    register_enb_pending;
-    uint32_t    registered_enb;
-    long    enb_register_retry_timer_id;
+    uint32_t                        register_enb_pending;
+    uint32_t                        registered_enb;
+    long                            enb_register_retry_timer_id;
 # endif
-    uint32_t    enb_id;
-    MessageDef *msg_p;
-    const char *msg_name;
-    instance_t  instance;
-    int         result;
+    uint32_t                        enb_id;
+    MessageDef                     *msg_p;
+    const char                     *msg_name;
+    instance_t                      instance;
+    int                             result;
 
     itti_mark_task_ready (TASK_ENB_APP);
 
@@ -188,22 +185,22 @@ void *eNB_app_task(void *args_p)
 #   endif
 # endif
 
-    enb_nb_properties = enb_config_init(g_conf_config_file_name, enb_properties);
+    enb_properties = enb_config_init(g_conf_config_file_name);
 
-    AssertFatal (enb_nb <= enb_nb_properties,
+    AssertFatal (enb_nb <= enb_properties->number,
                  "Number of eNB is greater than eNB defined in configuration file %s (%d/%d)!",
-                 g_conf_config_file_name, enb_nb, enb_nb_properties);
+                 g_conf_config_file_name, enb_nb, enb_properties->number);
 
     for (enb_id = enb_id_start; (enb_id < enb_id_end) ; enb_id++)
     {
-        configure_phy(enb_id);
-        configure_rrc(enb_id);
+        configure_phy(enb_id, enb_properties);
+        configure_rrc(enb_id, enb_properties);
     }
 
 # if defined(ENABLE_USE_MME)
     /* Try to register each eNB */
     registered_enb = 0;
-    register_enb_pending = eNB_app_register (enb_id_start, enb_id_end);
+    register_enb_pending = eNB_app_register (enb_id_start, enb_id_end, enb_properties);
 # else
     /* Start L2L1 task */
     msg_p = itti_alloc_new_message(TASK_ENB_APP, INITIALIZE_MESSAGE);
@@ -279,7 +276,7 @@ void *eNB_app_task(void *args_p)
                             sleep(ENB_REGISTER_RETRY_DELAY);
                             /* Restart the registration process */
                             registered_enb = 0;
-                            register_enb_pending = eNB_app_register (enb_id_start, enb_id_end);
+                            register_enb_pending = eNB_app_register (enb_id_start, enb_id_end, enb_properties);
                         }
                     }
                 }
@@ -299,7 +296,7 @@ void *eNB_app_task(void *args_p)
                 {
                     /* Restart the registration process */
                     registered_enb = 0;
-                    register_enb_pending = eNB_app_register (enb_id_start, enb_id_end);
+                    register_enb_pending = eNB_app_register (enb_id_start, enb_id_end, enb_properties);
                 }
                 break;
 # endif
diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c
index 25882769b0..811cbdb720 100755
--- a/openair2/ENB_APP/enb_config.c
+++ b/openair2/ENB_APP/enb_config.c
@@ -48,8 +48,9 @@
 
 #include "LAYER2/MAC/extern.h"
 
-int enb_config_init(char* lib_config_file_name_pP, Enb_properties_t **enb_properties) {
+static Enb_properties_array_t enb_properties;
 
+const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) {
   config_t          cfg;
   config_setting_t *setting;
   config_setting_t *setting_mme_addresses;
@@ -79,7 +80,7 @@ int enb_config_init(char* lib_config_file_name_pP, Enb_properties_t **enb_proper
   char*             preference;
   const char*       active_enb[MAX_ENB];
 
-  memset((char*)enb_properties, 0 , MAX_ENB * sizeof(Enb_properties_t*));
+  memset((char*) (enb_properties.properties), 0 , MAX_ENB * sizeof(Enb_properties_t *));
   memset((char*)active_enb,     0 , MAX_ENB * sizeof(char*));
 
   config_init(&cfg);
@@ -154,31 +155,31 @@ int enb_config_init(char* lib_config_file_name_pP, Enb_properties_t **enb_proper
           // search if in active list
           for (j=0; j < num_enb_properties; j++) {
               if (strcmp(active_enb[j], enb_name) == 0) {
-                  enb_properties[enb_properties_index] = calloc(1, sizeof(Enb_properties_t));
+                  enb_properties.properties[enb_properties_index] = calloc(1, sizeof(Enb_properties_t));
 
-                  enb_properties[enb_properties_index]->eNB_id   = enb_id;
+                  enb_properties.properties[enb_properties_index]->eNB_id   = enb_id;
                   if (strcmp(cell_type, "CELL_MACRO_ENB") == 0) {
-                      enb_properties[enb_properties_index]->cell_type = CELL_MACRO_ENB;
+                      enb_properties.properties[enb_properties_index]->cell_type = CELL_MACRO_ENB;
                   } else  if (strcmp(cell_type, "CELL_HOME_ENB") == 0) {
-                      enb_properties[enb_properties_index]->cell_type = CELL_HOME_ENB;
+                      enb_properties.properties[enb_properties_index]->cell_type = CELL_HOME_ENB;
                   } else {
                       AssertError (0, parse_error ++,
                               "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for cell_type choice: CELL_MACRO_ENB or CELL_HOME_ENB !\n",
                               lib_config_file_name_pP, i, cell_type);
                   }
-                  enb_properties[enb_properties_index]->eNB_name = strdup(enb_name);
-                  enb_properties[enb_properties_index]->tac      = (uint16_t)tac;
-                  enb_properties[enb_properties_index]->mcc      = (uint16_t)mcc;
-                  enb_properties[enb_properties_index]->mnc      = (uint16_t)mnc;
+                  enb_properties.properties[enb_properties_index]->eNB_name = strdup(enb_name);
+                  enb_properties.properties[enb_properties_index]->tac      = (uint16_t)tac;
+                  enb_properties.properties[enb_properties_index]->mcc      = (uint16_t)mcc;
+                  enb_properties.properties[enb_properties_index]->mnc      = (uint16_t)mnc;
 
                   if (strcmp(default_drx, "PAGING_DRX_32") == 0) {
-                      enb_properties[enb_properties_index]->default_drx = PAGING_DRX_32;
+                      enb_properties.properties[enb_properties_index]->default_drx = PAGING_DRX_32;
                   } else  if (strcmp(default_drx, "PAGING_DRX_64") == 0) {
-                      enb_properties[enb_properties_index]->default_drx = PAGING_DRX_64;
+                      enb_properties.properties[enb_properties_index]->default_drx = PAGING_DRX_64;
                   } else  if (strcmp(default_drx, "PAGING_DRX_128") == 0) {
-                      enb_properties[enb_properties_index]->default_drx = PAGING_DRX_128;
+                      enb_properties.properties[enb_properties_index]->default_drx = PAGING_DRX_128;
                   } else  if (strcmp(default_drx, "PAGING_DRX_256") == 0) {
-                      enb_properties[enb_properties_index]->default_drx = PAGING_DRX_256;
+                      enb_properties.properties[enb_properties_index]->default_drx = PAGING_DRX_256;
                   } else {
                       AssertError (0, parse_error ++,
                               "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for default_drx choice: PAGING_DRX_32..PAGING_DRX_256 !\n",
@@ -188,47 +189,47 @@ int enb_config_init(char* lib_config_file_name_pP, Enb_properties_t **enb_proper
                   // Parse optional physical parameters
                   if(config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_FRAME_TYPE, &frame_type)) {
                       if (strcmp(frame_type, "FDD") == 0) {
-                          enb_properties[enb_properties_index]->frame_type = FDD;
+                          enb_properties.properties[enb_properties_index]->frame_type = FDD;
                       } else  if (strcmp(frame_type, "TDD") == 0) {
-                          enb_properties[enb_properties_index]->frame_type = TDD;
+                          enb_properties.properties[enb_properties_index]->frame_type = TDD;
                       } else {
                           AssertError (0, parse_error ++,
                                   "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for frame_type choice: FDD or TDD !\n",
                                   lib_config_file_name_pP, i, frame_type);
                       }
                   } else {
-                      enb_properties[enb_properties_index]->frame_type = FDD; // Default frame type
+                      enb_properties.properties[enb_properties_index]->frame_type = FDD; // Default frame type
                   }
 
                   if(config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_PREFIX_TYPE, &prefix_type)) {
                       if (strcmp(prefix_type, "NORMAL") == 0) {
-                          enb_properties[enb_properties_index]->prefix_type = NORMAL;
+                          enb_properties.properties[enb_properties_index]->prefix_type = NORMAL;
                       } else  if (strcmp(prefix_type, "EXTENDED") == 0) {
-                          enb_properties[enb_properties_index]->prefix_type = EXTENDED;
+                          enb_properties.properties[enb_properties_index]->prefix_type = EXTENDED;
                       } else {
                           AssertError (0, parse_error ++,
                                   "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prefix_type choice: NORMAL or EXTENDED !\n",
                                   lib_config_file_name_pP, i, prefix_type);
                       }
                   } else {
-                      enb_properties[enb_properties_index]->prefix_type = NORMAL; // Default prefix type
+                      enb_properties.properties[enb_properties_index]->prefix_type = NORMAL; // Default prefix type
                   }
 
                   if(config_setting_lookup_int64(setting_enb, ENB_CONFIG_STRING_DOWNLINK_FREQUENCY, &downlink_frequency)) {
-                      enb_properties[enb_properties_index]->downlink_frequency = downlink_frequency;
+                      enb_properties.properties[enb_properties_index]->downlink_frequency = downlink_frequency;
                   } else {
-                      enb_properties[enb_properties_index]->downlink_frequency = 2680000000UL; // Default downlink frequency
+                      enb_properties.properties[enb_properties_index]->downlink_frequency = 2680000000UL; // Default downlink frequency
                   }
 
                   if(config_setting_lookup_int(setting_enb, ENB_CONFIG_STRING_UPLINK_FREQUENCY_OFFSET, &uplink_frequency_offset)) {
-                      enb_properties[enb_properties_index]->uplink_frequency_offset = uplink_frequency_offset;
+                      enb_properties.properties[enb_properties_index]->uplink_frequency_offset = uplink_frequency_offset;
                   } else {
-                      enb_properties[enb_properties_index]->uplink_frequency_offset = -120000000; // Default uplink frequency offset
+                      enb_properties.properties[enb_properties_index]->uplink_frequency_offset = -120000000; // Default uplink frequency offset
                   }
 
                   setting_mme_addresses = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_MME_IP_ADDRESS);
                   num_mme_address     = config_setting_length(setting_mme_addresses);
-                  enb_properties[enb_properties_index]->nb_mme = 0;
+                  enb_properties.properties[enb_properties_index]->nb_mme = 0;
                   for (j = 0; j < num_mme_address; j++) {
                       setting_mme_address = config_setting_get_elem(setting_mme_addresses, j);
                       if(  !(
@@ -242,24 +243,24 @@ int enb_config_init(char* lib_config_file_name_pP, Enb_properties_t **enb_proper
                                   "Failed to parse eNB configuration file %s, %u th enb %u th mme address !\n",
                                   lib_config_file_name_pP, i, j);
                       }
-                      enb_properties[enb_properties_index]->nb_mme += 1;
+                      enb_properties.properties[enb_properties_index]->nb_mme += 1;
 
-                      enb_properties[enb_properties_index]->mme_ip_address[j].ipv4_address = strdup(ipv4);
-                      enb_properties[enb_properties_index]->mme_ip_address[j].ipv6_address = strdup(ipv6);
+                      enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv4_address = strdup(ipv4);
+                      enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv6_address = strdup(ipv6);
                       if (strcmp(active, "yes") == 0) {
-                          enb_properties[enb_properties_index]->mme_ip_address[j].active = 1;
+                          enb_properties.properties[enb_properties_index]->mme_ip_address[j].active = 1;
 #if defined(ENABLE_USE_MME)
                           EPC_MODE_ENABLED = 1;
 #endif
                       } // else { (calloc)
 
                       if (strcmp(preference, "ipv4") == 0) {
-                          enb_properties[enb_properties_index]->mme_ip_address[j].ipv4 = 1;
+                          enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv4 = 1;
                       } else if (strcmp(preference, "ipv6") == 0) {
-                          enb_properties[enb_properties_index]->mme_ip_address[j].ipv6 = 1;
+                          enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv6 = 1;
                       } else if (strcmp(preference, "no") == 0) {
-                          enb_properties[enb_properties_index]->mme_ip_address[j].ipv4 = 1;
-                          enb_properties[enb_properties_index]->mme_ip_address[j].ipv6 = 1;
+                          enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv4 = 1;
+                          enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv6 = 1;
                       }
                   }
                   enb_properties_index += 1;
@@ -268,6 +269,8 @@ int enb_config_init(char* lib_config_file_name_pP, Enb_properties_t **enb_proper
           }
       }
   }
+  enb_properties.number = num_enb_properties;
+
   AssertError (enb_properties_index == num_enb_properties, parse_error ++,
           "Failed to parse eNB configuration file %s, mismatch between %u active eNBs and %u corresponding defined eNBs !\n",
           lib_config_file_name_pP, num_enb_properties, enb_properties_index);
@@ -275,5 +278,10 @@ int enb_config_init(char* lib_config_file_name_pP, Enb_properties_t **enb_proper
   AssertFatal (parse_error == 0,
                "Failed to parse eNB configuration file %s, found %d error%s !\n",
                lib_config_file_name_pP, parse_error, parse_error > 1 ? "s" : "");
-  return num_enb_properties;
+
+  return &enb_properties;
+}
+
+const Enb_properties_array_t *enb_config_get(void) {
+    return &enb_properties;
 }
diff --git a/openair2/ENB_APP/enb_config.h b/openair2/ENB_APP/enb_config.h
index 8eb743fe80..0ba16efc3f 100755
--- a/openair2/ENB_APP/enb_config.h
+++ b/openair2/ENB_APP/enb_config.h
@@ -132,6 +132,13 @@ typedef struct Enb_properties_s {
 
 } Enb_properties_t;
 
-int enb_config_init(char* lib_config_file_name_pP, Enb_properties_t **enb_properties);
+typedef struct Enb_properties_array_s {
+    int                  number;
+    Enb_properties_t    *properties[MAX_ENB];
+} Enb_properties_array_t;
+
+const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP);
+
+const Enb_properties_array_t *enb_config_get(void);
 
 #endif /* ENB_CONFIG_H_ */
-- 
GitLab