From 10b8f5687c5e7c5674afdf6d17f5fee477bb3e4a Mon Sep 17 00:00:00 2001
From: Cedric Roux <cedric.roux@eurecom.fr>
Date: Thu, 7 Nov 2013 14:02:16 +0000
Subject: [PATCH] - Generate "unique" eNB_id according to host name

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4345 818b1a75-f10b-46b9-bf7c-635c3b92a50f
---
 openair-cn/S1AP/s1ap_eNB.c          | 22 +++++++++++++++++++++-
 openair-cn/S1AP/s1ap_eNB.h          |  2 ++
 openair-cn/S1AP/s1ap_mme.c          | 12 ++++++------
 openair-cn/S1AP/s1ap_mme_handlers.c |  4 ++--
 targets/SIMU/USER/oaisim.c          |  6 +++++-
 5 files changed, 36 insertions(+), 10 deletions(-)

diff --git a/openair-cn/S1AP/s1ap_eNB.c b/openair-cn/S1AP/s1ap_eNB.c
index 51d9b95cb7..5e689b964e 100644
--- a/openair-cn/S1AP/s1ap_eNB.c
+++ b/openair-cn/S1AP/s1ap_eNB.c
@@ -32,6 +32,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdint.h>
+#include <crypt.h>
 
 #include "tree.h"
 #include "queue.h"
@@ -117,6 +118,25 @@ inline struct s1ap_eNB_mme_data_s *s1ap_eNB_get_MME(
     return NULL;
 }
 
+uint32_t s1ap_generate_eNB_id(void)
+{
+    char *out;
+    char  hostname[50];
+    int   ret;
+    uint32_t eNB_id;
+
+    /* Retrieve the host name */
+    ret = gethostname(hostname, sizeof(hostname));
+    DevAssert(ret == 0);
+
+    out = crypt(hostname, "eurecom");
+    DevAssert(out != NULL);
+
+    eNB_id = ((out[0] << 24) | (out[1] << 16) | (out[2] << 8) | out[3]);
+
+    return eNB_id;
+}
+
 // int s1ap_run(eNB_mme_desc_t *eNB_desc_p)
 // {
 //     int ret = 0;
@@ -350,7 +370,7 @@ static int s1ap_eNB_generate_s1_setup_request(
     SupportedTAs_Item_t  ta;
     uint8_t             *buffer;
     uint32_t             len;
-    int                  ret;
+    int                  ret = 0;
 
     DevAssert(instance_p != NULL);
     DevAssert(s1ap_mme_data_p != NULL);
diff --git a/openair-cn/S1AP/s1ap_eNB.h b/openair-cn/S1AP/s1ap_eNB.h
index 5d57251885..7b56db91b8 100644
--- a/openair-cn/S1AP/s1ap_eNB.h
+++ b/openair-cn/S1AP/s1ap_eNB.h
@@ -41,6 +41,8 @@
 
 void *s1ap_eNB_task(void *arg);
 
+uint32_t s1ap_generate_eNB_id(void);
+
 #endif /* S1AP_ENB_H_ */
 
 /**
diff --git a/openair-cn/S1AP/s1ap_mme.c b/openair-cn/S1AP/s1ap_mme.c
index 2de7b7a1ef..c8ed707dd3 100644
--- a/openair-cn/S1AP/s1ap_mme.c
+++ b/openair-cn/S1AP/s1ap_mme.c
@@ -198,12 +198,12 @@ void s1ap_dump_eNB(eNB_description_t *eNB_ref) {
     indent = 0;
     if (eNB_ref == NULL) return;
     eNB_LIST_OUT("");
-    eNB_LIST_OUT("eNB name:          %s", eNB_ref->eNB_name == NULL ? "not present" : eNB_ref->eNB_name);
-    eNB_LIST_OUT("eNB ID:            %d", eNB_ref->eNB_id);
-    eNB_LIST_OUT("SCTP assoc id:     %d", eNB_ref->sctp_assoc_id);
-    eNB_LIST_OUT("SCTP instreams:    %d", eNB_ref->instreams);
-    eNB_LIST_OUT("SCTP outstreams:   %d", eNB_ref->outstreams);
-    eNB_LIST_OUT("UE attache to eNB: %d", eNB_ref->nb_ue_associated);
+    eNB_LIST_OUT("eNB name:          %s",   eNB_ref->eNB_name == NULL ? "not present" : eNB_ref->eNB_name);
+    eNB_LIST_OUT("eNB ID:            %07x", eNB_ref->eNB_id);
+    eNB_LIST_OUT("SCTP assoc id:     %d",   eNB_ref->sctp_assoc_id);
+    eNB_LIST_OUT("SCTP instreams:    %d",   eNB_ref->instreams);
+    eNB_LIST_OUT("SCTP outstreams:   %d",   eNB_ref->outstreams);
+    eNB_LIST_OUT("UE attache to eNB: %d",   eNB_ref->nb_ue_associated);
 
     indent++;
     for (ue_ref = eNB_ref->ue_list_head; ue_ref; ue_ref = ue_ref->next_ue) {
diff --git a/openair-cn/S1AP/s1ap_mme_handlers.c b/openair-cn/S1AP/s1ap_mme_handlers.c
index 5e0b084faf..8dd87d0920 100644
--- a/openair-cn/S1AP/s1ap_mme_handlers.c
+++ b/openair-cn/S1AP/s1ap_mme_handlers.c
@@ -253,7 +253,7 @@ int s1ap_mme_handle_s1_setup_request(uint32_t assoc_id, uint32_t stream,
         }
         eNB_id = (eNB_id_buf[0] << 20) + (eNB_id_buf[1] << 12) +
                  (eNB_id_buf[2] << 4) + ((eNB_id_buf[3] & 0xf0) >> 4);
-        S1AP_DEBUG("home eNB id: %u\n", eNB_id);
+        S1AP_DEBUG("home eNB id: %07x\n", eNB_id);
     } else {
         // Macro eNB = 20 bits
         uint8_t *eNB_id_buf =
@@ -263,7 +263,7 @@ int s1ap_mme_handle_s1_setup_request(uint32_t assoc_id, uint32_t stream,
         }
         eNB_id = (eNB_id_buf[0] << 12) + (eNB_id_buf[1] << 4) + ((
                      eNB_id_buf[2] & 0xf0) >> 4);
-        S1AP_DEBUG("macro eNB id: %u\n", eNB_id);
+        S1AP_DEBUG("macro eNB id: %05x\n", eNB_id);
     }
 
     config_read_lock(&mme_config);
diff --git a/targets/SIMU/USER/oaisim.c b/targets/SIMU/USER/oaisim.c
index 004f9e98d1..8e63b41fbc 100644
--- a/targets/SIMU/USER/oaisim.c
+++ b/targets/SIMU/USER/oaisim.c
@@ -395,14 +395,18 @@ void *l2l1_task(void *args_p) {
         char *mme_address_v4 = "192.168.12.87";
         char *mme_address_v6 = "2001:660:5502:12:30da:829a:2343:b6cf";
         s1ap_register_eNB_t *s1ap_register_eNB;
+        uint32_t hash;
+
         message_p = itti_alloc_new_message(TASK_L2L1, S1AP_REGISTER_ENB);
 
         s1ap_register_eNB = &message_p->msg.s1ap_register_eNB;
 
+        hash = s1ap_generate_eNB_id();
+
         /* Some default/random parameters */
         s1ap_register_eNB->mod_id      = eNB_id;
         /* FIXME: generate unique eNB id */
-        s1ap_register_eNB->eNB_id      = 1 + eNB_id;
+        s1ap_register_eNB->eNB_id      = eNB_id + (hash & 0xFFFF8);
         s1ap_register_eNB->cell_type   = CELL_MACRO_ENB;
         s1ap_register_eNB->tac         = 8;
         s1ap_register_eNB->mcc         = 208;
-- 
GitLab