From d2b1e6aa9ae5a6f62bb5f3beeec17247647da026 Mon Sep 17 00:00:00 2001
From: Robert Schmidt <robert.schmidt@eurecom.fr>
Date: Fri, 20 Sep 2019 17:57:27 +0200
Subject: [PATCH] FlexRAN: report employed splits to controller

---
 openair2/ENB_APP/MESSAGES/V2/flexran.proto |  9 +++++++
 openair2/ENB_APP/flexran_agent_common.c    |  2 ++
 openair2/ENB_APP/flexran_agent_ran_api.c   | 28 ++++++++++++++++++++++
 openair2/ENB_APP/flexran_agent_ran_api.h   |  6 +++++
 4 files changed, 45 insertions(+)

diff --git a/openair2/ENB_APP/MESSAGES/V2/flexran.proto b/openair2/ENB_APP/MESSAGES/V2/flexran.proto
index 86f2e9329f..1d87a52b97 100644
--- a/openair2/ENB_APP/MESSAGES/V2/flexran.proto
+++ b/openair2/ENB_APP/MESSAGES/V2/flexran.proto
@@ -77,10 +77,19 @@ enum flex_bs_capability {
     RRC   = 7;
 }
 
+enum flex_bs_split {
+  F1    = 0;
+  nFAPI = 1;
+  IF4   = 2;
+  IF4p5 = 3;
+  IF5   = 4;
+}
+
 message flex_hello {
     optional flex_header header = 1;
     optional uint64 bs_id = 2;        // Unique id to distinguish the eNB
     repeated flex_bs_capability capabilities = 3;
+    repeated flex_bs_split splits = 4;
 }
 
 message flex_echo_request {
diff --git a/openair2/ENB_APP/flexran_agent_common.c b/openair2/ENB_APP/flexran_agent_common.c
index 552c58555b..fe65315fe9 100644
--- a/openair2/ENB_APP/flexran_agent_common.c
+++ b/openair2/ENB_APP/flexran_agent_common.c
@@ -128,6 +128,7 @@ int flexran_agent_hello(mid_t mod_id, const void *params, Protocol__FlexranMessa
   hello_msg->bs_id  = flexran_get_bs_id(mod_id);
   hello_msg->has_bs_id = 1;
   hello_msg->n_capabilities = flexran_get_capabilities(mod_id, &hello_msg->capabilities);
+  hello_msg->n_splits = flexran_get_splits(mod_id, &hello_msg->splits);
   *msg = malloc(sizeof(Protocol__FlexranMessage));
 
   if(*msg == NULL)
@@ -161,6 +162,7 @@ int flexran_agent_destroy_hello(Protocol__FlexranMessage *msg) {
 
   free(msg->hello_msg->header);
   free(msg->hello_msg->capabilities);
+  free(msg->hello_msg->splits);
   free(msg->hello_msg);
   free(msg);
   return 0;
diff --git a/openair2/ENB_APP/flexran_agent_ran_api.c b/openair2/ENB_APP/flexran_agent_ran_api.c
index dfac1ae7a0..f479198895 100644
--- a/openair2/ENB_APP/flexran_agent_ran_api.c
+++ b/openair2/ENB_APP/flexran_agent_ran_api.c
@@ -3570,3 +3570,31 @@ uint16_t flexran_get_capabilities_mask(mid_t mod_id) {
 
   return mask;
 }
+
+size_t flexran_get_splits(mid_t mod_id, Protocol__FlexBsSplit **splits) {
+  size_t n_splits = 0;
+  *splits = NULL;
+  if (rrc_is_present(mod_id) && !NODE_IS_MONOLITHIC(RC.rrc[mod_id]->node_type))
+    n_splits++;
+  if (NFAPI_MODE != NFAPI_MONOLITHIC)
+    n_splits++;
+  if (RC.ru && RC.ru[mod_id] && RC.ru[mod_id]->if_south != LOCAL_RF)
+    n_splits++;
+  if (n_splits == 0)
+    return 0;
+
+  AssertFatal(n_splits < 3, "illegal number of splits (%lu)\n", n_splits);
+  *splits = calloc(n_splits, sizeof(Protocol__FlexBsSplit));
+  AssertFatal(*splits, "could not allocate Protocol__FlexBsSplit array\n");
+  int n = 0;
+  if (rrc_is_present(mod_id) && !NODE_IS_MONOLITHIC(RC.rrc[mod_id]->node_type))
+    (*splits)[n++] = PROTOCOL__FLEX_BS_SPLIT__F1;
+  if (NFAPI_MODE != NFAPI_MONOLITHIC)
+    (*splits)[n++] = PROTOCOL__FLEX_BS_SPLIT__nFAPI;
+  if (RC.ru && RC.ru[mod_id] && RC.ru[mod_id]->if_south == REMOTE_IF4p5)
+    (*splits)[n++] = PROTOCOL__FLEX_BS_SPLIT__IF4p5;
+  if (RC.ru && RC.ru[mod_id] && RC.ru[mod_id]->if_south == REMOTE_IF5)
+    (*splits)[n++] = PROTOCOL__FLEX_BS_SPLIT__IF5;
+  DevAssert(n == n_splits);
+  return n_splits;
+}
diff --git a/openair2/ENB_APP/flexran_agent_ran_api.h b/openair2/ENB_APP/flexran_agent_ran_api.h
index f9d0d97405..6aef1c406b 100644
--- a/openair2/ENB_APP/flexran_agent_ran_api.h
+++ b/openair2/ENB_APP/flexran_agent_ran_api.h
@@ -44,6 +44,7 @@
 #include "RRC/LTE/rrc_eNB_UE_context.h"
 #include "PHY/phy_extern.h"
 #include "common/utils/LOG/log.h"
+#include "nfapi/oai_integration/vendor_ext.h"
 
 /****************************
  * get generic info from RAN
@@ -815,3 +816,8 @@ size_t flexran_get_capabilities(mid_t mod_id, Protocol__FlexBsCapability **caps)
 /* get the capabilities supported by the underlying network function as a bit
  * mask. */
 uint16_t flexran_get_capabilities_mask(mid_t mod_id);
+
+/* get the splits used by the underlying network function,
+ * return the number and stores list of this length in splits. If there are
+ * zero capabilities, splits will be NULL */
+size_t flexran_get_splits(mid_t mod_id, Protocol__FlexBsSplit **splits);
-- 
2.26.2