ADD . /opt/o-du-l2
WORKDIR /opt/o-du-l2
-RUN apt-get update && apt-get install -y libpcap-dev
+RUN apt-get update && apt-get install -y libpcap-dev && apt-get install -y libxml2-dev
RUN cd build/odu && make clean_odu odu MACHINE=BIT64 MODE=FDD
ADD . /opt/o-du-l2
WORKDIR /opt/o-du-l2
-RUN apt-get update && apt-get install -y libpcap-dev
+RUN apt-get update && apt-get install -y libpcap-dev && apt-get install -y libxml2-dev
RUN cd build/odu && make clean_cu cu_stub NODE=TEST_STUB MACHINE=BIT64 MODE=FDD
lib: $(LIB_DIR)/libduapp.a
include $(COM_BUILD_DIR)/compile.mak
-ifdef XML_BASED_CONFIG
-I_OPTS+=-I/usr/include/libxml2
-endif
I_OPTS+=-I$(ROOT_DIR)/src/mt
I_OPTS+=-I$(ROOT_DIR)/src/codec_utils/common
I_OPTS+=-I$(ROOT_DIR)/src/codec_utils/F1AP
I_OPTS+=-I$(ROOT_DIR)/src/codec_utils/RRC
I_OPTS+=-I$(ROOT_DIR)/src/codec_utils/E2AP
I_OPTS+=-I$(ROOT_DIR)/src/codec_utils/E2SM_KPM
+I_OPTS+=-I/usr/include/libxml2
ifeq ($(O1_ENABLE),YES)
I_OPTS+=-I$(ROOT_DIR)/src/o1
<?xml version="1.0" encoding="UTF-8"?>
-<DU_CFG_PARAMS xmlns = "odu_config.xml">
+<DU_CFG_PARAMS xmlns = "urn:o-ran:odu:configuration">
+ <THREAD_AFFINITY>
+ <DU_APP_CORE>16</DU_APP_CORE>
+ <EGTP_CORE>27</EGTP_CORE>
+ <RLC_MAC_CORE>18</RLC_MAC_CORE>
+ <RLC_UL_CORE>22</RLC_UL_CORE>
+ <SCH_CORE>22</SCH_CORE>
+ <SCTP_CORE>25</SCTP_CORE>
+ <LOWER_MAC_CORE>21</LOWER_MAC_CORE>
+ </THREAD_AFFINITY>
<DU_ID>1</DU_ID>
<DU_NAME>ORAN OAM DU</DU_NAME>
<MAX_NUM_DRB>29</MAX_NUM_DRB>
<MAX_SFN>1024</MAX_SFN>
<BASE_SCS>15</BASE_SCS>
<MAX_SYMB_PER_SLOT>14</MAX_SYMB_PER_SLOT>
+<!--
+ <GNB_ID>1</GNB_ID>
+ <DU_TIMER_INFO>
+ <TIMER_TQ_CP>
+ <TIMER_LEN>2</TIMER_LEN>
+ </TIMER_TQ_CP>
+ <TIMER_RESOLUTION>1</TIMER_RESOLUTION>
+ </DU_TIMER_INFO>
+ <E2AP_CFG>
+ <E2_NODE_ID>1</E2_NODE_ID>
+ <NUM_OF_TNL_ASSOC>1</NUM_OF_TNL_ASSOC>
+ <TNL_ASSOC_LIST>
+ <TNL_ASSOC>
+ <LOCAL_IP>192.168.130.71</LOCAL_IP>
+ <LOCAL_PORT>36421<LOCAL_PORT>
+ <DESTINATION_IP>192.168.130.70</DESTINATION_IP>
+ <DESTINATION_PORT>36421</DESTINATION_PORT>
+ <ASSOC_USAGE>2</ASSOC_USAGE>
+ </TNL_ASSOC>
+ </TNL_ASSOC_LIST>
+ <NUM_OF_RAN_FUNCTION>1</NUM_OF_RAN_FUNCTION>
+ <RAN_FUNCTION_LIST>
+ <RAN_FUNCTION>
+ <ID>1</ID>
+ <RAN_FUNCTION_NAME>
+ <SHORT_NAME>ORAN-E2SM-KPM</SHORT_NAME>
+ <SEVICE_MODEL_OID>1.3.6.1.4.1.53148.1.2.2.2</SEVICE_MODEL_OID>
+ <DESCRIPTION>KPM Monitor</DESCRIPTION>
+ </RAN_FUNCTION_NAME>
+ <REVISION_COUNTER>0</REVISION_COUNTER>
+ <NUM_OF_EVENT_TRIGGER_STYLE_SUPPORTED>1</NUM_OF_EVENT_TRIGGER_STYLE_SUPPORTED>
+ <EVENT_TRIGGERED_STYLE_LIST>
+ <EVENT_TRIGGERED_STYLE>
+ <STYLE_TYPE>1</STYLE_TYPE>
+ <NAME>Periodic Report</NAME>
+ <FORMAT_TYPE>1</FORMAT_TYPE>
+ </EVENT_TRIGGERED_STYLE>
+ </EVENT_TRIGGERED_STYLE_LIST>
+ <NUM_OF_REPORT_STYLE_SUPPORTED>1</NUM_OF_REPORT_STYLE_SUPPORTED>
+ <REPORT_STYLE_SUPPORTED_LIST>
+ <REPORT_STYLE>
+ <RIC_STYLE>
+ <STYLE_TYPE>1</STYLE_TYPE>
+ <NAME>E2 Node Measurement</NAME>
+ <FORMAT_TYPE>1</FORMAT_TYPE>
+ </RIC_STYLE>
+ <NUM_OF_MEASUREMENT_INFO>2</NUM_OF_MEASUREMENT_INFO>
+ <MEASUREMENT_INFO_LIST>
+ <MEASUREMENT_INFO>
+ <ID>1</ID>
+ <NAME>RRU.PrbTotDl</NAME>
+ </MEASUREMENT_INFO>
+ <MEASUREMENT_INFO>
+ <ID>2</ID>
+ <NAME>RRU.PrbTotUl</NAME>
+ </MEASUREMENT_INFO>
+ </MEASUREMENT_INFO_LIST>
+ </REPORT_STYLE>
+ </REPORT_STYLE_SUPPORTED_LIST>
+ <RIC_INDICATION_HEADER_FORMAT>1</RIC_INDICATION_HEADER_FORMAT>
+ <RIC_INDICATION_MESSAGE_FORMAT>1</RIC_INDICATION_MESSAGE_FORMAT>
+ </RAN_FUNCTION>
+ </RAN_FUNCTION_LIST>
+ </E2AP_CFG>
+-->
</DU_CFG_PARAMS>
# macro for output file name and makefile name
#
-PLTFRM_FLAGS= -UMSPD -DODU -DINTEL_FAPI -UODU_MEMORY_DEBUG_LOG -DDEBUG_ASN_PRINT -UDEBUG_PRINT -DERROR_PRINT -USTART_DL_UL_DATA -UNR_DRX -UCALL_FLOW_DEBUG_LOG -UODU_SLOT_IND_DEBUG_LOG
+PLTFRM_FLAGS=-UMSPD -DODU -DINTEL_FAPI -UODU_MEMORY_DEBUG_LOG -DDEBUG_ASN_PRINT -UDEBUG_PRINT -DERROR_PRINT -USTART_DL_UL_DATA -UNR_DRX -UCALL_FLOW_DEBUG_LOG -UODU_SLOT_IND_DEBUG_LOG
ifeq ($(MODE),TDD)
PLTFRM_FLAGS += -DNR_TDD
ifeq ($(NODE),TEST_STUB)
PLTFRM_FLAGS+=-DODU_TEST_STUB
endif
+ifdef PHY
+ PLTFRM_FLAGS+=-DTHREAD_AFFINITY
+endif
ifeq ($(PHY), INTEL_L1)
- PLTFRM_FLAGS+=-DSS_USE_WLS_MEM -DINTEL_WLS_MEM -DDEBUG_MODE -DINTEL_L1_V20_03_ONWARDS -DINTEL_THREAD_AFFINITY
+ PLTFRM_FLAGS+=-DSS_USE_WLS_MEM -DINTEL_WLS_MEM -DDEBUG_MODE -DINTEL_L1_V20_03_ONWARDS
ifeq ($(PHY_MODE),TIMER)
PLTFRM_FLAGS+=-DINTEL_TIMER_MODE
endif
export I_OPTS
# Add to the linker options the platform specific components
-L_OPTS+=-lnsl -lrt -lm -lpthread -lsctp
-ifdef XML_BASED_CONFIG
-L_OPTS+=-lxml2
-endif
+L_OPTS+=-lnsl -lrt -lm -lpthread -lsctp -lxml2
ifeq ($(PHY), INTEL_L1)
L_OPTS+=-L/root/Intel-L1-20.11.1/phy/wls_lib/ -lwls \
/* This file contains all utility functions */
#include "common_def.h"
-#ifdef XML_BASED_CONFIG
#include <libxml/parser.h>
#include <libxml/tree.h>
#include <libxml/xmlmemory.h>
#include <arpa/inet.h>
-#endif
#include "du_tmr.h"
#include "legtp.h"
}
return ROK;
}
+#endif
+
+#ifdef THREAD_AFFINITY
+/*******************************************************************
+ *
+ * @brief Set thread affinity to the core configured via XML file
+ *
+ * @details
+ *
+ * Function : parseThreadAffinity
+ *
+ * Functionality: Set thread affinity to the core configured
+ * via XML file
+ *
+ * @params[in] XML document pointer
+ * XML namespace
+ * Current node in XML
+ * Thread information
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t parseThreadAffinity(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, ThreadInfo *threads)
+{
+ cur = cur -> xmlChildrenNode;
+ while(cur != NULL)
+ {
+ if ((!xmlStrcmp(cur->name, (const xmlChar *)"DU_APP_CORE")) && (cur->ns == ns))
+ {
+ threads->duAppCoreId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
+ ODU_SET_THREAD_AFFINITY(&threads->duAppSTskId, SS_AFFINITY_MODE_EXCL, threads->duAppCoreId, 0);
+ }
+
+ if ((!xmlStrcmp(cur->name, (const xmlChar *)"EGTP_CORE")) && (cur->ns == ns))
+ {
+ threads->egtpCoreId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
+ ODU_SET_THREAD_AFFINITY(&threads->egtpSTskId, SS_AFFINITY_MODE_EXCL, threads->egtpCoreId, 0);
+ }
+
+ if ((!xmlStrcmp(cur->name, (const xmlChar *)"RLC_MAC_CORE")) && (cur->ns == ns))
+ {
+ threads->rlcMacCoreId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
+ ODU_SET_THREAD_AFFINITY(&threads->rlcMacSTskId, SS_AFFINITY_MODE_EXCL, threads->rlcMacCoreId, 0);
+ }
+
+ if ((!xmlStrcmp(cur->name, (const xmlChar *)"RLC_UL_CORE")) && (cur->ns == ns))
+ {
+ threads->rlcUlCoreId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
+ ODU_SET_THREAD_AFFINITY(&threads->rlcUlSTskId, SS_AFFINITY_MODE_EXCL, threads->rlcUlCoreId, 0);
+ }
+
+ if ((!xmlStrcmp(cur->name, (const xmlChar *)"SCH_CORE")) && (cur->ns == ns))
+ {
+ threads->schCoreId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
+ ODU_SET_THREAD_AFFINITY(&threads->schSTskId, SS_AFFINITY_MODE_EXCL, threads->schCoreId, 0);
+ }
+
+ if ((!xmlStrcmp(cur->name, (const xmlChar *)"SCTP_CORE")) && (cur->ns == ns))
+ {
+ threads->sctpCoreId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
+ ODU_SET_THREAD_AFFINITY(&threads->sctpSTskId, SS_AFFINITY_MODE_EXCL, threads->sctpCoreId, 0);
+ }
+
+ if ((!xmlStrcmp(cur->name, (const xmlChar *)"LOWER_MAC_CORE")) && (cur->ns == ns))
+ {
+ threads->lwrMacCoreId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
+ ODU_SET_THREAD_AFFINITY(&threads->lwrMacSTskId, SS_AFFINITY_MODE_EXCL, threads->lwrMacCoreId, 0);
+ }
+
+ cur = cur -> next;
+ }
+ return ROK;
+}
+#endif
/*******************************************************************
*
CmInetIpAddr cuIp;
CmInetIpAddr ricIp;
- memset(&duCfgParam, 0, sizeof(struct duCfgParams));
cur = cur->xmlChildrenNode;
while(cur != NULL)
{
+ if ((!xmlStrcmp(cur->name, (const xmlChar *)"THREAD_AFFINITY")) && (cur->ns == ns))
+ {
+#ifdef THREAD_AFFINITY
+ if(parseThreadAffinity(doc, ns, cur, &duCfgParam.threadInfo) != ROK)
+ {
+ return RFAILED;
+ }
+#endif
+ }
+
+#ifdef XML_BASED_CONFIG
if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAX_NUM_DRB")) && (cur->ns == ns))
{
duCfgParam.maxNumDrb = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
return RFAILED;
}
}
+#endif
cur = cur -> next;
}
return ROK;
}
-#endif
/*******************************************************************
*
* ****************************************************************/
uint8_t duReadCfg()
{
-#ifdef XML_BASED_CONFIG
const char *filename = "../build/config/odu_config.xml";
xmlDocPtr doc = NULLP;
xmlNodePtr cur = NULLP;
}
cur = xmlDocGetRootElement(doc);
- ns = xmlSearchNsByHref(doc, cur, (const xmlChar *)"odu_config.xml");
+ ns = xmlSearchNsByHref(doc, cur, (const xmlChar *)"urn:o-ran:odu:configuration");
if(ns == NULL)
{
DU_LOG("\nERROR --> DU_APP: XML Namespace not found.\n");
xmlFreeDoc(doc);
xmlCleanupParser();
-#endif
Pst pst;
Buffer *mBuf;
- memset(&duCfgParam, 0, sizeof(DuCfgParams));
-
/* Read configs into duCfgParams */
if(readCfg() != ROK)
{
DU_LOG("\n ** DU CONFIGURATION ** \n");
DU_LOG("DU ID %d\n", duCfgParam.duId);
DU_LOG("DU Name %s\n", duCfgParam.duName);
+
+ DU_LOG("\n ** Thread Affinity ** \n");
+ DU_LOG("DU APP CORE ID %d\n", duCfgParam.threadInfo.duAppCoreId);
+ DU_LOG("EGTP CORE ID %d\n", duCfgParam.threadInfo.egtpCoreId);
+ DU_LOG("SCTP CORE ID %d\n", duCfgParam.threadInfo.sctpCoreId);
+ DU_LOG("RLC-UL CORE ID %d\n", duCfgParam.threadInfo.rlcUlCoreId);
+ DU_LOG("RLC-DL and MAC CORE ID %d\n", duCfgParam.threadInfo.rlcMacCoreId);
+ DU_LOG("SCH CORE ID %d\n", duCfgParam.threadInfo.schCoreId);
+ DU_LOG("Lower MAC CORE ID %d\n", duCfgParam.threadInfo.lwrMacCoreId);
+
DU_LOG("MAX NUM DRB %d\n", duCfgParam.maxNumDrb);
DU_LOG("MAX SUPPORTED UE %d\n", duCfgParam.maxSupportedUes);
DU_LOG("MAX UE %d\n",duCfgParam.maxUe);
SrvCellCfgCommSib srvCellCfgCommSib;
}Sib1Params;
+typedef struct threadInfo
+{
+ SSTskId duAppSTskId;
+ uint8_t duAppCoreId;
+ SSTskId egtpSTskId;
+ uint8_t egtpCoreId;
+ SSTskId sctpSTskId;
+ uint8_t sctpCoreId;
+ SSTskId rlcUlSTskId;
+ uint8_t rlcUlCoreId;
+ SSTskId rlcMacSTskId;
+ uint8_t rlcMacCoreId;
+ SSTskId schSTskId;
+ uint8_t schCoreId;
+ SSTskId lwrMacSTskId;
+ uint8_t lwrMacCoreId;
+}ThreadInfo;
+
typedef struct duCfgParams
{
uint32_t duId;
uint16_t maxNumDrb;
uint16_t maxSupportedUes;
uint32_t maxUe;
+ ThreadInfo threadInfo;
SctpParams sctpParams; /* SCTP Params */
F1EgtpParams egtpParams; /* EGTP Params */
SchedulerCfg schedCfg;
uint8_t commonInit()
{
/* Declare system task Ids */
- SSTskId du_app_stsk, egtp_stsk, sctp_stsk, rlc_ul_stsk, rlc_mac_cl_stsk, sch_stsk, lwr_mac_stsk, phy_stub_slot_ind_stsk;
+ SSTskId phyStubSlotIndSTskId;
pthread_attr_t attr;
/* Intel L1 using core 0-15. ODU-High using 16-21 */
/* system task for DU APP */
- if(ODU_CREATE_TASK(PRIOR0, &du_app_stsk) != ROK)
+ if(ODU_CREATE_TASK(PRIOR0, &duCfgParam.threadInfo.duAppSTskId) != ROK)
{
DU_LOG("\nERROR --> DU_APP : System Task creation for DU APP failed");
return RFAILED;
}
-#ifdef INTEL_THREAD_AFFINITY
- ODU_SET_THREAD_AFFINITY(&du_app_stsk, SS_AFFINITY_MODE_EXCL, 16, 0);
-#endif
-
/* system task for EGTP */
- if(ODU_CREATE_TASK(PRIOR0, &egtp_stsk) != ROK)
+ if(ODU_CREATE_TASK(PRIOR0, &duCfgParam.threadInfo.egtpSTskId) != ROK)
{
DU_LOG("\nERROR --> DU_APP : System Task creation for EGTP failed");
return RFAILED;
}
-#ifdef INTEL_THREAD_AFFINITY
- ODU_SET_THREAD_AFFINITY(&egtp_stsk, SS_AFFINITY_MODE_EXCL, 27, 0);
-#endif
-
/* system task for RLC_DL and MAC */
- if(ODU_CREATE_TASK(PRIOR0, &rlc_mac_cl_stsk) != ROK)
+ if(ODU_CREATE_TASK(PRIOR0, &duCfgParam.threadInfo.rlcMacSTskId) != ROK)
{
DU_LOG("\nERROR --> DU_APP : System Task creation for RLC DL/MAC failed");
return RFAILED;
}
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-#ifdef INTEL_THREAD_AFFINITY
- ODU_SET_THREAD_AFFINITY(&rlc_mac_cl_stsk, SS_AFFINITY_MODE_EXCL, 18, 0);
-#endif
/* system task for RLC UL */
- if(ODU_CREATE_TASK(PRIOR1, &rlc_ul_stsk) != ROK)
+ if(ODU_CREATE_TASK(PRIOR1, &duCfgParam.threadInfo.rlcUlSTskId) != ROK)
{
DU_LOG("\nERROR --> DU_APP : System Task creation for RLC UL failed");
return RFAILED;
}
-#ifdef INTEL_THREAD_AFFINITY
- ODU_SET_THREAD_AFFINITY(&rlc_ul_stsk, SS_AFFINITY_MODE_EXCL, 22, 0);
-#endif
/* system task for SCH */
- if(ODU_CREATE_TASK(PRIOR1, &sch_stsk) != ROK)
+ if(ODU_CREATE_TASK(PRIOR1, &duCfgParam.threadInfo.schSTskId) != ROK)
{
DU_LOG("\nERROR --> DU_APP : System Task creation for SCH failed");
return RFAILED;
}
-#ifdef INTEL_THREAD_AFFINITY
- ODU_SET_THREAD_AFFINITY(&sch_stsk, SS_AFFINITY_MODE_EXCL, 22, 0);
-#endif
/* system task for SCTP receiver thread */
- if(ODU_CREATE_TASK(PRIOR0, &sctp_stsk) != ROK)
+ if(ODU_CREATE_TASK(PRIOR0, &duCfgParam.threadInfo.sctpSTskId) != ROK)
{
DU_LOG("\nERROR --> DU_APP : System Task creation for SCTP failed");
return RFAILED;
}
-#ifdef INTEL_THREAD_AFFINITY
- ODU_SET_THREAD_AFFINITY(&sctp_stsk, SS_AFFINITY_MODE_EXCL, 25, 0);
-#endif
/* system task for lower-mac receiver thread */
- if(ODU_CREATE_TASK(PRIOR0, &lwr_mac_stsk) != ROK)
+ if(ODU_CREATE_TASK(PRIOR0, &duCfgParam.threadInfo.lwrMacSTskId) != ROK)
{
DU_LOG("\nERROR --> DU_APP : System Task creation for Lower MAC failed");
return RFAILED;
}
-#ifdef INTEL_THREAD_AFFINITY
- ODU_SET_THREAD_AFFINITY(&lwr_mac_stsk, SS_AFFINITY_MODE_EXCL, 21, 0);
-#endif
#ifndef INTEL_WLS_MEM
/* system task for phy stub's slot indication generator thread */
- if(ODU_CREATE_TASK(PRIOR0, &phy_stub_slot_ind_stsk) != ROK)
+ if(ODU_CREATE_TASK(PRIOR0, &phyStubSlotIndSTskId) != ROK)
{
DU_LOG("\nERROR --> DU_APP : System Task creation for Phy stub slot indication generator failed. MAX STSK [%d]", SS_MAX_STSKS);
return RFAILED;
#endif
/* Create TAPA tasks */
- if(duAppInit(du_app_stsk) != ROK)
+ if(duAppInit(duCfgParam.threadInfo.duAppSTskId) != ROK)
{
DU_LOG("\nERROR --> DU_APP : DU APP TAPA Task initialization failed");
return RFAILED;
}
- if(egtpInit(egtp_stsk) != ROK)
+ if(egtpInit(duCfgParam.threadInfo.egtpSTskId) != ROK)
{
DU_LOG("\nERROR --> DU_APP : EGTP TAPA Task initialization failed");
return RFAILED;
}
- if(sctpInit(sctp_stsk) != ROK)
+ if(sctpInit(duCfgParam.threadInfo.sctpSTskId) != ROK)
{
DU_LOG("\nERROR --> DU_APP : SCTP TAPA Task initialization failed");
return RFAILED;
}
- if(rlcDlInit(rlc_mac_cl_stsk) != ROK)
+ if(rlcDlInit(duCfgParam.threadInfo.rlcMacSTskId) != ROK)
{
DU_LOG("\nERROR --> DU_APP : RLC DL Tapa Task initialization failed");
return RFAILED;
}
- if(rlcUlInit(rlc_ul_stsk) != ROK)
+ if(rlcUlInit(duCfgParam.threadInfo.rlcUlSTskId) != ROK)
{
DU_LOG("\nERROR --> DU_APP : RLC UL Tapa Task initialization failed");
return RFAILED;
}
- if(schInit(sch_stsk) != ROK)
+ if(schInit(duCfgParam.threadInfo.schSTskId) != ROK)
{
DU_LOG("\nERROR --> DU_APP : SCH Tapa Task initialization failed");
return RFAILED;
}
- if(lwrMacInit(lwr_mac_stsk) != ROK)
+ if(lwrMacInit(duCfgParam.threadInfo.lwrMacSTskId) != ROK)
{
DU_LOG("\nERROR --> DU_APP : Lower MAC Tapa Task initialization failed");
return RFAILED;
}
#ifndef INTEL_WLS_MEM
- if(phyStubInit(phy_stub_slot_ind_stsk) != ROK)
+ if(phyStubInit(phyStubSlotIndSTskId) != ROK)
{
DU_LOG("\nERROR --> DU_APP : PHY stub slot indication Tapa Task initialization failed");
return RFAILED;
if(start_O1_module() != ROK)
return RFAILED;
#endif
+
+ memset(&duCfgParam, 0, sizeof(DuCfgParams));
+
//Initialize TAPA layers
if(duInit() != ROK)
{