diff --git a/openair2/ENB_APP/flexran_agent.c b/openair2/ENB_APP/flexran_agent.c index bd353fdd2c2f62bb70605d713d290b6b6af99323..c2a1790380c9174134465b30016eea779a50b8cc 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 98b2505e84a6554b4070a12b2ded2385792f9ee3..b97e56092da7013169633c75fdcb36d807910883 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,