/* 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"
/* fill Intial DL BWP */
duCfgParam.macCellCfg.cellCfg.initialDlBwp.bwp.firstPrb = 0;
- duCfgParam.macCellCfg.cellCfg.initialDlBwp.bwp.numPrb = TOTAL_PRB_20MHZ_MU0; /* configured to total BW */
+ duCfgParam.macCellCfg.cellCfg.initialDlBwp.bwp.numPrb = MAX_NUM_RB; /* configured to total BW */
duCfgParam.macCellCfg.cellCfg.initialDlBwp.bwp.scs = duCfgParam.macCellCfg.ssbCfg.scsCmn;
duCfgParam.macCellCfg.cellCfg.initialDlBwp.bwp.cyclicPrefix = NORMAL_CYCLIC_PREFIX;
duCfgParam.macCellCfg.cellCfg.initialDlBwp.pdcchCommon.commonSearchSpace.searchSpaceId = SEARCHSPACE_1_INDEX;
/* fill Intial UL BWP */
duCfgParam.macCellCfg.cellCfg.initialUlBwp.bwp.firstPrb = 0;
- duCfgParam.macCellCfg.cellCfg.initialUlBwp.bwp.numPrb = TOTAL_PRB_20MHZ_MU0; /* configured to total BW */
+ duCfgParam.macCellCfg.cellCfg.initialUlBwp.bwp.numPrb = MAX_NUM_RB; /* configured to total BW */
duCfgParam.macCellCfg.cellCfg.initialUlBwp.bwp.scs = duCfgParam.macCellCfg.ssbCfg.scsCmn;
duCfgParam.macCellCfg.cellCfg.initialUlBwp.bwp.cyclicPrefix = NORMAL_CYCLIC_PREFIX;
duCfgParam.macCellCfg.cellCfg.initialUlBwp.puschCommon.numTimeDomRsrcAlloc = 2;
/* fill PUCCH config common */
duCfgParam.macCellCfg.cellCfg.initialUlBwp.pucchCommon.pucchResourceCommon = PUCCH_RSRC_COMMON;
- duCfgParam.macCellCfg.cellCfg.initialUlBwp.pucchCommon.pucchGroupHopping = PUCCH_GROUP_HOPPING;
+ duCfgParam.macCellCfg.cellCfg.initialUlBwp.pucchCommon.pucchGroupHopping = PUCCH_NEITHER_HOPPING;
#ifndef O1_ENABLE
return ROK;
}
-/*******************************************************************
- *
- * @brief Configures the DU Parameters
- *
- * @details
- *
- * Function : fillDuPort
- *
- * Functionality:
- * - fills the DU Ports.
- *
- * @params[in] duPort array to be filled
- * @return ROK - success
- * RFAILED - failure
- *
- * ****************************************************************/
-uint8_t fillDuPort(uint16_t *duPort)
-{
-
-#ifdef O1_ENABLE
- duPort[F1_INTERFACE] = g_cfg.DU_Port;
- duPort[E2_INTERFACE] = g_cfg.RIC_Port;
-#else
- duPort[F1_INTERFACE] = F1_SCTP_PORT; /* DU Port idx 0 38472 */
- duPort[E2_INTERFACE] = E2_SCTP_PORT; /* RIC Port idx 1 36421 */
-#endif
- return ROK;
-}
-
/*******************************************************************
*
* @brief Configures the DU Parameters
CmLList *node;
uint8_t srvdCellIdx, bandIdx, sliceIdx, plmnIdx, ranFuncIdx, eventTriggerStyleIdx, reportStyleIdx, tnlAssocIdx;
uint8_t brdcstPlmnIdx, freqBandIdx, srvdPlmnIdx;
- uint32_t ipv4_du, ipv4_cu, ipv4_ric;
MibParams mib;
Sib1Params sib1;
SupportedSliceList *taiSliceSuppLst;
/* Gnb Id */
duCb.gnbId = GNB_ID;
-#ifdef O1_ENABLE
- if( getStartupConfig(&g_cfg) != ROK )
- {
- RETVALUE(RFAILED);
- }
- cmInetAddr((S8*)g_cfg.DU_IPV4_Addr, &ipv4_du);
- cmInetAddr((S8*)g_cfg.CU_IPV4_Addr, &ipv4_cu);
- cmInetAddr((S8*)g_cfg.RIC_IPV4_Addr, &ipv4_ric);
-
- duCfgParam.sctpParams.cuPort = g_cfg.CU_Port;
- duCfgParam.sctpParams.ricPort = g_cfg.RIC_Port;
-#else
- cmInetAddr((S8*)DU_IP_V4_ADDR, &ipv4_du);
- cmInetAddr((S8*)CU_IP_V4_ADDR, &ipv4_cu);
- cmInetAddr((S8*)RIC_IP_V4_ADDR, &ipv4_ric);
-
- duCfgParam.sctpParams.cuPort = F1_SCTP_PORT;
- duCfgParam.sctpParams.ricPort = E2_SCTP_PORT;
-#endif
-
- fillDuPort(duCfgParam.sctpParams.duPort);
-
- /* F1 DU IP Address and Port*/
- duCfgParam.sctpParams.duIpAddr.ipV4Addr = ipv4_du;
-
- /* F1 CU IP Address and Port*/
- duCfgParam.sctpParams.cuIpAddr.ipV4Addr = ipv4_cu;
-
- /* Fill RIC Params */
- duCfgParam.sctpParams.ricIpAddr.ipV4Addr = ipv4_ric;
-
- /* EGTP Parameters */
- duCfgParam.egtpParams.localIp.ipV4Pres = TRUE;
- duCfgParam.egtpParams.localIp.ipV4Addr = ipv4_du;
- duCfgParam.egtpParams.localPort = F1_EGTP_PORT;
- duCfgParam.egtpParams.destIp.ipV4Pres = TRUE;
- duCfgParam.egtpParams.destIp.ipV4Addr = ipv4_cu;
- duCfgParam.egtpParams.destPort = F1_EGTP_PORT;
- duCfgParam.egtpParams.minTunnelId = MIN_TEID;
- duCfgParam.egtpParams.maxTunnelId = MAX_TEID;
-
- duCfgParam.maxUe = 32; //TODO: Check
-
- /* DU Info */
- duCfgParam.duId = DU_ID;
- DU_ALLOC(duCfgParam.duName, sizeof(DU_NAME));
- if(!duCfgParam.duName)
- {
- DU_LOG("\nDEBUG --> DU_APP: readCfg(): Memory allocation failure for DU name");
- return RFAILED;
- }
- strcpy((char*)duCfgParam.duName,DU_NAME);
-
memset(&duCb.e2apDb, 0, sizeof(E2apDb));
- duCb.e2apDb.e2NodeId = DU_ID;
+ duCb.e2apDb.e2NodeId = 1; //Will be removed as part of E2 config parser
duCb.e2apDb.e2TransInfo.transIdCounter = 0;
duCb.e2apDb.numOfTNLAssoc = 1;
return ROK;
}
-#ifdef XML_BASED_CONFIG
/*******************************************************************
*
* @brief Fill SCTP Parameters
* ****************************************************************/
uint8_t parseSctpParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, SctpParams *sctp)
{
- uint8_t max_du_port;
- uint16_t f1_sctp_port;
- uint16_t e2_sctp_port;
+ uint8_t max_du_port = 0;
+ uint16_t f1_sctp_port = 0;
+ uint16_t e2_sctp_port = 0;
memset(sctp, 0, sizeof(SctpParams));
cur = cur->xmlChildrenNode;
while (cur != NULL)
{
+#ifdef O1_ENABLE
+ sctp->duPort[F1_INTERFACE] = g_cfg.DU_Port;
+ sctp->duPort[E2_INTERFACE] = g_cfg.RIC_Port;
+ sctp->cuPort = g_cfg.CU_Port;
+ sctp->ricPort = g_cfg.RIC_Port;
+#else
if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAX_DU_PORT")) && (cur->ns == ns))
{
max_du_port = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
sctp->duPort[E2_INTERFACE] = e2_sctp_port; /* RIC Port idx 1 */
}
}
+
if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_SCTP_PORT")) && (cur->ns == ns))
{
f1_sctp_port = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
e2_sctp_port = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
}
-#ifdef O1_ENABLE
- sctp->cuPort = g_cfg.CU_Port;
- sctp->ricPort = g_cfg.RIC_Port;
-#else
sctp->cuPort = f1_sctp_port;
sctp->ricPort = e2_sctp_port;
#endif
return ROK;
}
+#ifdef XML_BASED_CONFIG
/*******************************************************************
*
* @brief Fill MIB configuration
return ROK;
}
-/*******************************************************************
- *
- * @brief Fill RRC version
- *
- * @details
- *
- * Function : parseF1RrcVersion
- *
- * Functionality: Fill RRC version
- *
- * @params[in] XML document pointer
- * XML namespace
- * Current node in XML
- * Pointer to structure to be filled
- * @return ROK - success
- * RFAILED - failure
- *
- * ****************************************************************/
-uint8_t parseF1RrcVersion(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,F1RrcVersion *f1RrcVersion)
-{
- memset(f1RrcVersion, 0, sizeof(F1RrcVersion));
- cur = cur->xmlChildrenNode;
- while(cur != NULL)
- {
- if((!xmlStrcmp(cur->name, (const xmlChar *)"RRC_VER")) && (cur->ns == ns))
- {
- strcpy((char*)f1RrcVersion->rrcVer, (char*)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
- }
-
- if((!xmlStrcmp(cur->name, (const xmlChar *)"EXT_RRC_VER")) && (cur->ns == ns))
- {
- f1RrcVersion->extRrcVer = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
- }
- cur = cur -> next;
- }
- return ROK;
-}
-
/*******************************************************************
*
* @brief Fill PLMN ID
pucchCfgCmn->pucchResourceCommon = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
}
- if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUCCH_GROUP_HOPPING")) && (cur->ns == ns))
+ if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUCCH_NEITHER_HOPPING")) && (cur->ns == ns))
{
pucchCfgCmn->pucchGroupHopping = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
}
}
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 *)"MAX_NUM_DRB")) && (cur->ns == ns))
- {
- duCfgParam.maxNumDrb = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
- }
-
- if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAX_NUM_UE_SUPPORTED")) && (cur->ns == ns))
+ if ((!xmlStrcmp(cur->name, (const xmlChar *)"THREAD_AFFINITY")) && (cur->ns == ns))
{
- duCfgParam.maxSupportedUes = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
+#ifdef THREAD_AFFINITY
+ if(parseThreadAffinity(doc, ns, cur, &duCfgParam.threadInfo) != ROK)
+ {
+ return RFAILED;
+ }
+#endif
}
if ((!xmlStrcmp(cur->name, (const xmlChar *)"DU_ID")) && (cur->ns == ns))
strcpy((char*)duCfgParam.duName, tempDuName);
}
+ if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAX_NUM_DRB")) && (cur->ns == ns))
+ {
+ duCfgParam.maxNumDrb = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
+ }
+
+ if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAX_NUM_UE_SUPPORTED")) && (cur->ns == ns))
+ {
+ duCfgParam.maxSupportedUes = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
+ }
+
if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAX_NUM_UE")) && (cur->ns == ns))
{
duCfgParam.maxUe = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
duCfgParam.egtpParams.maxTunnelId = duCfgParam.maxNumDrb * duCfgParam.maxSupportedUes;
}
+#ifdef XML_BASED_CONFIG
if ((!xmlStrcmp(cur->name, (const xmlChar *)"MIB_PARAMS")) && (cur->ns == ns))
{
if(parseMibParams(doc, ns, cur, &duCfgParam.mibParams) != ROK)
}
}
- if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_RRC_VERSION")) && (cur->ns == ns))
- {
- if(parseF1RrcVersion(doc, ns, cur, &duCfgParam.rrcVersion) != ROK)
- {
- return RFAILED;
- }
- }
-
if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_DU_SRVD_CELL_INFO")) && (cur->ns == ns))
{
if(parseF1DuServedCellInfo(doc, ns, cur, &duCfgParam.srvdCellLst[0]) != ROK)
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);
DU_LOG("Cell Barred %ld\n", mib->cellBarred);
DU_LOG("Intra Frequency Reselection %ld\n", mib->intraFreqReselection);
- f1RrcVersion = &duCfgParam.rrcVersion;
- DU_LOG("\n ** RRC Version ** \n");
- DU_LOG("RRC Version %s\n", f1RrcVersion->rrcVer);
- DU_LOG("Extended RRC Version %d\n", f1RrcVersion->extRrcVer);
-
duSysInfo = &duCfgParam.srvdCellLst[0].duSysInfo;
DU_LOG("\n ** DU System Information ** \n");
DU_LOG("MIB length %d\n", duSysInfo->mibLen);