From e8af3bd464b6dde9c5a0f0815b3d48d5d715704c Mon Sep 17 00:00:00 2001
From: Robert Schmidt <robert.schmidt@eurecom.fr>
Date: Wed, 24 Oct 2018 17:37:04 +0200
Subject: [PATCH] Selectively load FlexRAN CMs depending on BS capability

---
 openair2/ENB_APP/flexran_agent.c      | 38 ++++++++++++++++++++++-----
 openair2/ENB_APP/flexran_agent_defs.h | 16 +++++------
 2 files changed, 40 insertions(+), 14 deletions(-)

diff --git a/openair2/ENB_APP/flexran_agent.c b/openair2/ENB_APP/flexran_agent.c
index bd353fdd2c..c2a1790380 100644
--- a/openair2/ENB_APP/flexran_agent.c
+++ b/openair2/ENB_APP/flexran_agent.c
@@ -230,15 +230,41 @@ int flexran_agent_start(mid_t mod_id)
   
   new_thread(receive_thread, flexran);
 
-  /* Register and initialize the control modules */
-  flexran_agent_register_phy_xface(mod_id);
+  /* Register and initialize the control modules depending on capabilities.
+   * After registering, calling flexran_agent_get_*_xface() tells whether a
+   * control module is operational */
+  uint16_t caps = flexran_get_capabilities_mask(mod_id);
+  LOG_I(FLEXRAN_AGENT, "Agent handles BS ID %ld, capabilities=0x%x => handling%s%s%s%s%s%s%s%s\n",
+        flexran_get_bs_id(mod_id), caps,
+        FLEXRAN_CAP_LOPHY(caps) ? " LOPHY" : "",
+        FLEXRAN_CAP_HIPHY(caps) ? " HIPHY" : "",
+        FLEXRAN_CAP_LOMAC(caps) ? " LOMAC" : "",
+        FLEXRAN_CAP_HIMAC(caps) ? " HIMAC" : "",
+        FLEXRAN_CAP_RLC(caps)   ? " RLC"   : "",
+        FLEXRAN_CAP_PDCP(caps)  ? " PDCP"  : "",
+        FLEXRAN_CAP_SDAP(caps)  ? " SDAP"  : "",
+        FLEXRAN_CAP_RRC(caps)   ? " RRC"   : "");
+
+  if (FLEXRAN_CAP_LOPHY(caps) || FLEXRAN_CAP_HIPHY(caps)) {
+    flexran_agent_register_phy_xface(mod_id);
+    LOG_I(FLEXRAN_AGENT, "registered PHY interface/CM for eNB %d\n", mod_id);
+  }
 
-  flexran_agent_register_mac_xface(mod_id);
-  flexran_agent_init_mac_agent(mod_id);
+  if (FLEXRAN_CAP_LOMAC(caps) || FLEXRAN_CAP_HIMAC(caps)) {
+    flexran_agent_register_mac_xface(mod_id);
+    flexran_agent_init_mac_agent(mod_id);
+    LOG_I(FLEXRAN_AGENT, "registered MAC interface/CM for eNB %d\n", mod_id);
+  }
 
-  flexran_agent_register_rrc_xface(mod_id);
+  if (FLEXRAN_CAP_RRC(caps)) {
+    flexran_agent_register_rrc_xface(mod_id);
+    LOG_I(FLEXRAN_AGENT, "registered RRC interface/CM for eNB %d\n", mod_id);
+  }
 
-  flexran_agent_register_pdcp_xface(mod_id);
+  if (FLEXRAN_CAP_PDCP(caps)) {
+    flexran_agent_register_pdcp_xface(mod_id);
+    LOG_I(FLEXRAN_AGENT, "registered PDCP interface/CM for eNB %d\n", mod_id);
+  }
 
   /* 
    * initilize a timer 
diff --git a/openair2/ENB_APP/flexran_agent_defs.h b/openair2/ENB_APP/flexran_agent_defs.h
index 98b2505e84..b97e56092d 100644
--- a/openair2/ENB_APP/flexran_agent_defs.h
+++ b/openair2/ENB_APP/flexran_agent_defs.h
@@ -138,14 +138,14 @@ typedef enum {
   FLEXRAN_AGENT_TIMER_STATE_MAX,
 } flexran_agent_timer_state_t;
 
-#define FLEXRAN_CAP_LOPHY 1
-#define FLEXRAN_CAP_HIPHY 2
-#define FLEXRAN_CAP_LOMAC 4
-#define FLEXRAN_CAP_HIMAC 8
-#define FLEXRAN_CAP_RLC   16
-#define FLEXRAN_CAP_PDCP  32
-#define FLEXRAN_CAP_SDAP  64
-#define FLEXRAN_CAP_RRC   128
+#define FLEXRAN_CAP_LOPHY(cApS) (((cApS) & (1 << PROTOCOL__FLEX_BS_CAPABILITY__LOPHY)) > 0)
+#define FLEXRAN_CAP_HIPHY(cApS) (((cApS) & (1 << PROTOCOL__FLEX_BS_CAPABILITY__HIPHY)) > 0)
+#define FLEXRAN_CAP_LOMAC(cApS) (((cApS) & (1 << PROTOCOL__FLEX_BS_CAPABILITY__LOMAC)) > 0)
+#define FLEXRAN_CAP_HIMAC(cApS) (((cApS) & (1 << PROTOCOL__FLEX_BS_CAPABILITY__HIMAC)) > 0)
+#define FLEXRAN_CAP_RLC(cApS)   (((cApS) & (1 << PROTOCOL__FLEX_BS_CAPABILITY__RLC))   > 0)
+#define FLEXRAN_CAP_PDCP(cApS)  (((cApS) & (1 << PROTOCOL__FLEX_BS_CAPABILITY__PDCP))  > 0)
+#define FLEXRAN_CAP_SDAP(cApS)  (((cApS) & (1 << PROTOCOL__FLEX_BS_CAPABILITY__SDAP))  > 0)
+#define FLEXRAN_CAP_RRC(cApS)   (((cApS) & (1 << PROTOCOL__FLEX_BS_CAPABILITY__RRC))   > 0)
 
 typedef enum {
   ENB_NORMAL_OPERATION = 0x0,
-- 
GitLab