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