[ Jira id - ODUHIGH-593 ] Pack and unpack function nomenclature correction
[o-du/l2.git] / src / du_app / du_cfg.c
index ffd077b..239285a 100644 (file)
@@ -1019,7 +1019,6 @@ uint8_t parseF1NrFddInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1NrFddInfo
    return ROK;
 }
 
-#ifdef NR_TDD
 /*******************************************************************
  *
  * @brief Fill NR TDD Info
@@ -1064,7 +1063,6 @@ uint8_t parseF1NrTddInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1NrTddInfo
    }
    return ROK;
 }
-#endif
 
 /*******************************************************************
  *
@@ -1097,10 +1095,9 @@ uint8_t parseNrModeInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, NrModeInfo *
          strcpy((char*)modeCfg, (char*)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));      
       }
 
-#ifndef NR_TDD
-      if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_NR_FDD_INFO")) && (cur->ns == ns))
+      if(strcmp(modeCfg, "FDD") == 0)
       {
-         if(strcmp(modeCfg, "FDD") == 0)
+         if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_NR_FDD_INFO")) && (cur->ns == ns))
          {
             if(parseF1NrFddInfo(doc, ns, cur, &nrModeInfo->mode.fdd) != ROK)
             {
@@ -1108,10 +1105,9 @@ uint8_t parseNrModeInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, NrModeInfo *
             }
          }
       }
-#else
-      if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_NR_TDD_INFO")) && (cur->ns == ns))
+      else
       {
-         if(strcmp(modeCfg, "TDD") == 0)
+         if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_NR_TDD_INFO")) && (cur->ns == ns))
          {
             if(parseF1NrTddInfo(doc, ns, cur, &nrModeInfo->mode.tdd) != ROK)
             {
@@ -1120,7 +1116,6 @@ uint8_t parseNrModeInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, NrModeInfo *
          }
       }
 
-#endif            
       cur = cur -> next;
    }
    return ROK;
@@ -1686,13 +1681,21 @@ uint8_t parsePrachCfg(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, PrachCfg *prac
  * ****************************************************************/
 uint8_t parseCsiRsCfg(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, CsiRsCfg *csiRsCfg)
 {
+   uint8_t csiFreqDomainAlloc=0;
    memset(csiRsCfg, 0, sizeof(CsiRsCfg));
    cur = cur -> xmlChildrenNode;
    while(cur != NULL)
    {
       if ((!xmlStrcmp(cur->name, (const xmlChar *)"CSIRS_FREQ")) && (cur->ns == ns))
       {
-         csiRsCfg->csiFreqDomainAlloc = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
+         csiFreqDomainAlloc = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
+         DU_ALLOC(csiRsCfg->csiFreqDomainAlloc, sizeof(uint8_t));
+         if(!csiRsCfg->csiFreqDomainAlloc)
+         {
+            DU_LOG("\nERROR  --> DU APP : %s: Memory allocation failed at line %d", __func__, __LINE__);
+            return RFAILED;
+         }
+         memcpy(csiRsCfg->csiFreqDomainAlloc, &csiFreqDomainAlloc,  sizeof(uint8_t));
       }
 
       if ((!xmlStrcmp(cur->name, (const xmlChar *)"CSIRS_PORTS")) && (cur->ns == ns))
@@ -1890,7 +1893,7 @@ uint8_t parseCarrierCfg(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,CarrierCfg *c
 
       if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_DL_ARFCN")) && (cur->ns == ns))
       {
-         carrierCfg->arfcnDL = convertArfcnToFreqKhz(atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)));
+         carrierCfg->arfcnDL = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
       }
 
       if ((!xmlStrcmp(cur->name, (const xmlChar *)"UL_BW")) && (cur->ns == ns))
@@ -1900,7 +1903,7 @@ uint8_t parseCarrierCfg(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,CarrierCfg *c
 
       if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_UL_ARFCN")) && (cur->ns == ns))
       {
-         carrierCfg->arfcnUL = convertArfcnToFreqKhz(atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)));
+         carrierCfg->arfcnUL = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
       }
 #endif
 
@@ -4298,7 +4301,6 @@ uint8_t parseMacSliceCfgReq(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,MacSliceC
 }
 #endif
 
-#ifdef THREAD_AFFINITY
 /*******************************************************************
  *
  * @brief Set thread affinity to the core configured via XML file
@@ -4326,50 +4328,63 @@ uint8_t parseThreadAffinity(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, ThreadIn
       if ((!xmlStrcmp(cur->name, (const xmlChar *)"DU_APP_CORE")) && (cur->ns == ns))
       {
          threads->duAppCoreId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
+#ifdef THREAD_AFFINITY
          ODU_SET_THREAD_AFFINITY(&threads->duAppSTskId, SS_AFFINITY_MODE_EXCL, threads->duAppCoreId, 0);
+#endif
       }
 
       if ((!xmlStrcmp(cur->name, (const xmlChar *)"EGTP_CORE")) && (cur->ns == ns))
       {
          threads->egtpCoreId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
+#ifdef THREAD_AFFINITY
          ODU_SET_THREAD_AFFINITY(&threads->egtpSTskId, SS_AFFINITY_MODE_EXCL, threads->egtpCoreId, 0);
+#endif
       }
 
       if ((!xmlStrcmp(cur->name, (const xmlChar *)"RLC_MAC_CORE")) && (cur->ns == ns))
       {
          threads->rlcMacCoreId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
+#ifdef THREAD_AFFINITY
          ODU_SET_THREAD_AFFINITY(&threads->rlcMacSTskId, SS_AFFINITY_MODE_EXCL, threads->rlcMacCoreId, 0);
+#endif
       }
 
       if ((!xmlStrcmp(cur->name, (const xmlChar *)"RLC_UL_CORE")) && (cur->ns == ns))
       {
          threads->rlcUlCoreId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
+#ifdef THREAD_AFFINITY
          ODU_SET_THREAD_AFFINITY(&threads->rlcUlSTskId, SS_AFFINITY_MODE_EXCL, threads->rlcUlCoreId, 0);
+#endif
       }
 
       if ((!xmlStrcmp(cur->name, (const xmlChar *)"SCH_CORE")) && (cur->ns == ns))
       {
          threads->schCoreId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
+#ifdef THREAD_AFFINITY
          ODU_SET_THREAD_AFFINITY(&threads->schSTskId, SS_AFFINITY_MODE_EXCL, threads->schCoreId, 0);
+#endif
       }
 
       if ((!xmlStrcmp(cur->name, (const xmlChar *)"SCTP_CORE")) && (cur->ns == ns))
       {
          threads->sctpCoreId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
+#ifdef THREAD_AFFINITY
          ODU_SET_THREAD_AFFINITY(&threads->sctpSTskId, SS_AFFINITY_MODE_EXCL, threads->sctpCoreId, 0);
+#endif
       }
 
       if ((!xmlStrcmp(cur->name, (const xmlChar *)"LOWER_MAC_CORE")) && (cur->ns == ns))
       {
          threads->lwrMacCoreId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
+#ifdef THREAD_AFFINITY
          ODU_SET_THREAD_AFFINITY(&threads->lwrMacSTskId, SS_AFFINITY_MODE_EXCL, threads->lwrMacCoreId, 0);
+#endif
       }
 
       cur = cur -> next;
    }
    return ROK;
 }
-#endif
 
 /*******************************************************************
  *
@@ -4924,6 +4939,204 @@ uint8_t parseE2ConfigParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, E2apDb *
    return ROK;
 }
 
+/*******************************************************************
+ *
+ * @brief Fill Global config Parameters
+ *
+ * @details
+ *
+ *    Function : parseGlobalConfigParams
+ *
+ *    Functionality: Fill Global config Parmeters
+ *
+ * @params[in] XML document pointer
+ *             XML namespace
+ *             Current node in XML
+ *             Pointer to structure to be filled
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t parseGlobalConfigParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur)
+{
+
+   memset(&gConfigInfo, 0, sizeof(GConfiguration));
+   cur = cur->xmlChildrenNode;
+   while (cur != NULL)
+   {
+
+     if ((!xmlStrcmp(cur->name, (const xmlChar *)"RADIO_FRAME_DURATION")) && (cur->ns == ns))
+     {
+        gConfigInfo.gRadioFrameDuration = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
+     }
+
+     if ((!xmlStrcmp(cur->name, (const xmlChar *)"ODU_UE_THROUGHPUT_PRINT_TIME_INTERVAL")) && (cur->ns == ns))
+     {
+        gConfigInfo.gUeThrptTimeIntervl = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
+     }
+
+     if ((!xmlStrcmp(cur->name, (const xmlChar *)"ODU_SNSSAI_THROUGHPUT_PRINT_TIME_INTERVAL")) && (cur->ns == ns))
+     {
+        gConfigInfo.gSnssaiThrptTimeIntervl = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
+     }
+
+     if ((!xmlStrcmp(cur->name, (const xmlChar *)"PHY_DELTA_DL")) && (cur->ns == ns))
+     {
+        gConfigInfo.gPhyDeltaDl = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
+     }
+
+     if ((!xmlStrcmp(cur->name, (const xmlChar *)"PHY_DELTA_UL")) && (cur->ns == ns))
+     {
+        gConfigInfo.gPhyDeltaUl = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
+     }
+      cur = cur -> next;
+   }
+   return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Free the memory allocate for slice supported list 
+ *
+ * @details
+ *
+ *    Function : parseDuCfgParams
+ *
+ *    Functionality: Free the memory allocate for slice supported list 
+ *
+ * @return void
+ *
+ * ****************************************************************/
+void freeSliceSuppLst(SupportedSliceList *sliceSuppLst) 
+{
+   uint8_t sliceIdx=0;
+
+   if(sliceSuppLst->numSupportedSlices&&sliceSuppLst->snssai)
+   {
+      for(sliceIdx=0;sliceIdx<sliceSuppLst->numSupportedSlices;sliceIdx++)
+      {
+         if(sliceSuppLst->snssai)
+         {
+            if(sliceSuppLst->snssai[sliceIdx])
+            {
+               DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, sliceSuppLst->snssai[sliceIdx], sizeof(Snssai));
+            }
+            DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, \
+            sliceSuppLst->snssai, (sliceSuppLst->numSupportedSlices) * sizeof(Snssai*));
+         }
+      }
+   }
+}
+
+/*******************************************************************
+ *
+ * @brief Free the memory allocate in parseDuCfgParams 
+ *
+ * @details
+ *
+ *    Function : parseDuCfgParams
+ *
+ *    Functionality: Free the memory allocate in parseDuCfgParams
+ *
+ * @return void
+ *
+ * ****************************************************************/
+void freeDuCfgParams()
+{
+   uint8_t ranFuncIdx=0,reportStyleIdx=0;
+   uint8_t policyIdx = 0,memIdx=0;
+   MacSliceRrmPolicy *rrmPolicy =NULLP;
+   MacSliceCfgReq *macSliceCfgReq=NULLP;
+   F1DuSysInfo *sysInfo;
+   CsiRsCfg *csiRsCfg;
+   RanFunction  *ranFunction;
+   RicReportStyle  *ricReportStyle;
+   CmLListCp  *measurementInfoList;
+   CmLList *measInfoNode = NULLP;
+
+   if(duCfgParam.duName)
+   {
+      DU_FREE(duCfgParam.duName, strlen(duCfgParam.duName));
+   }
+   
+   freeSliceSuppLst(&duCfgParam.macCellCfg.cellCfg.plmnInfoList[0].suppSliceList);
+   csiRsCfg=&duCfgParam.macCellCfg.csiRsCfg;
+   if(csiRsCfg->csiFreqDomainAlloc)
+   {
+      DU_FREE(csiRsCfg->csiFreqDomainAlloc, sizeof(uint8_t));
+   }
+   if(duCfgParam.macCellCfg.cellCfg.sib1Cfg.sib1Pdu)
+   {
+      DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, \
+      duCfgParam.macCellCfg.cellCfg.sib1Cfg.sib1Pdu, duCfgParam.macCellCfg.cellCfg.sib1Cfg.sib1PduLen);
+   }
+
+   if(duCb.e2apDb.numOfRanFunction)
+   {
+      for(ranFuncIdx=0;ranFuncIdx<duCb.e2apDb.numOfRanFunction;ranFuncIdx++)
+      {
+         ranFunction=&duCb.e2apDb.ranFunction[ranFuncIdx];
+         for(reportStyleIdx=0;reportStyleIdx<ranFunction->numOfReportStyleSupported;reportStyleIdx++)
+         {
+            ricReportStyle=&ranFunction->reportStyleList[reportStyleIdx];
+            measurementInfoList=&ricReportStyle->measurementInfoList;
+            CM_LLIST_FIRST_NODE(measurementInfoList, measInfoNode);
+            while(measInfoNode)
+            {
+               MeasurementInfoForAction *measurementInfoForAction;
+               measurementInfoForAction= (MeasurementInfoForAction*)measInfoNode->node;
+               cmLListDelFrm(measurementInfoList, measInfoNode);
+               DU_FREE(measurementInfoForAction, sizeof(MeasurementInfoForAction));
+               DU_FREE(measInfoNode, sizeof(CmLList));
+               CM_LLIST_FIRST_NODE(measurementInfoList, measInfoNode);
+            }
+         }
+      }
+   }
+   
+   freeSliceSuppLst(&duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].taiSliceSuppLst);
+   sysInfo=&duCfgParam.srvdCellLst[0].duSysInfo;
+   if(sysInfo->mibMsg)
+   {
+      DU_FREE(sysInfo->mibMsg, sysInfo->mibLen);
+   }
+   if(sysInfo->sib1Msg)
+   {
+      DU_FREE(sysInfo->sib1Msg, sysInfo->sib1Len);
+   }
+
+   macSliceCfgReq=&duCfgParam.tempSliceCfg;
+   if(macSliceCfgReq->listOfRrmPolicy)
+   {
+      for(policyIdx = 0; policyIdx < macSliceCfgReq->numOfRrmPolicy; policyIdx++)
+      {
+         if (macSliceCfgReq->listOfRrmPolicy[policyIdx])
+         {
+            rrmPolicy=macSliceCfgReq->listOfRrmPolicy[policyIdx];
+            if(rrmPolicy->rRMPolicyMemberList)
+            {
+               for(memIdx = 0; memIdx < rrmPolicy->numOfRrmPolicyMem; memIdx++)
+               {
+                  if (rrmPolicy->rRMPolicyMemberList[memIdx])
+                  {
+                     DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,\
+                           rrmPolicy->rRMPolicyMemberList[memIdx], sizeof(RrmPolicyMemberList));
+                  }
+               }
+               DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,rrmPolicy->rRMPolicyMemberList,\
+                     rrmPolicy->numOfRrmPolicyMem * sizeof(RrmPolicyMemberList*));
+            }
+
+            DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, \
+                  macSliceCfgReq->listOfRrmPolicy[policyIdx], sizeof(MacSliceRrmPolicy));
+         }
+      }
+      DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, \
+            macSliceCfgReq->listOfRrmPolicy,  macSliceCfgReq->numOfRrmPolicy * sizeof(MacSliceRrmPolicy*));
+   }
+}
+
+
 /*******************************************************************
  *
  * @brief Fill DU Config Parmeters 
@@ -4943,6 +5156,7 @@ uint8_t parseE2ConfigParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, E2apDb *
  * ****************************************************************/
 uint8_t parseDuCfgParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur)
 {
+   uint8_t ret=ROK;
    char *tempDuName = "";
    char *duIpV4Addr;
    char *cuIpV4Addr;
@@ -4956,12 +5170,11 @@ uint8_t parseDuCfgParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur)
    {
       if ((!xmlStrcmp(cur->name, (const xmlChar *)"THREAD_AFFINITY")) && (cur->ns == ns))
       {
-#ifdef THREAD_AFFINITY      
          if(parseThreadAffinity(doc, ns, cur, &duCfgParam.threadInfo) != ROK)
          {
-            return RFAILED;
+            ret = RFAILED;
+            break;
          }
-#endif         
       }
 
       if ((!xmlStrcmp(cur->name, (const xmlChar *)"GNB_ID")) && (cur->ns == ns))
@@ -4981,7 +5194,8 @@ uint8_t parseDuCfgParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur)
          if(!duCfgParam.duName)
          {
             DU_LOG("\nERROR --> DU_APP: %s: Memory allocation failed at line %d", __func__, __LINE__);
-            return RFAILED;
+            ret = RFAILED;
+            break;
          }
          strcpy((char*)duCfgParam.duName, tempDuName);
       }
@@ -4991,16 +5205,6 @@ uint8_t parseDuCfgParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur)
          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));
-      }
-
 #ifdef O1_ENABLE
       if( getStartupConfig(&g_cfg) != ROK )
       {
@@ -5034,7 +5238,8 @@ uint8_t parseDuCfgParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur)
       {
          if(parseSctpParams(doc, ns, cur, &duCfgParam.sctpParams) != ROK)
          {
-            return RFAILED;
+            ret = RFAILED;
+            break;
          }
          duCfgParam.sctpParams.duIpAddr.ipV4Pres = true;
          duCfgParam.sctpParams.duIpAddr.ipV4Addr = duIp;
@@ -5048,20 +5253,22 @@ uint8_t parseDuCfgParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur)
       {
          if(parseEgtpParams(doc, ns, cur, &duCfgParam.egtpParams) != ROK)
          {
-            return RFAILED;
+            ret = RFAILED;
+            break;
          }
          duCfgParam.egtpParams.localIp.ipV4Addr = duIp;
          duCfgParam.egtpParams.localIp.ipV4Pres = true;
          duCfgParam.egtpParams.destIp.ipV4Pres = true;
          duCfgParam.egtpParams.destIp.ipV4Addr = cuIp;
-         duCfgParam.egtpParams.maxTunnelId = duCfgParam.maxNumDrb * duCfgParam.maxSupportedUes
+         duCfgParam.egtpParams.maxTunnelId = duCfgParam.maxNumDrb * MAX_NUM_UE
       }
 
       if ((!xmlStrcmp(cur->name, (const xmlChar *)"MIB_PARAMS")) && (cur->ns == ns))
       {
          if(parseMibParams(doc, ns, cur, &duCfgParam.mibParams) != ROK)
          {
-            return RFAILED;
+            ret = RFAILED;
+            break;
          }
       }
 
@@ -5069,7 +5276,8 @@ uint8_t parseDuCfgParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur)
       {
          if(parseSib1Params(doc, ns, cur, &duCfgParam.sib1Params) != ROK)
          {
-            return RFAILED;
+            ret = RFAILED;
+            break;
          }
       }
 
@@ -5077,7 +5285,8 @@ uint8_t parseDuCfgParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur)
       {
          if(parseF1DuServedCellInfo(doc, ns, cur, &duCfgParam.srvdCellLst[0]) != ROK)
          {
-            return RFAILED;
+            ret = RFAILED;
+            break;
          }
       }
 
@@ -5085,7 +5294,8 @@ uint8_t parseDuCfgParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur)
       {
          if(parseMacCellCfg(doc, ns, cur, &duCfgParam.macCellCfg) != ROK)
          {
-            return RFAILED;
+            ret = RFAILED;
+            break;
          }
       }
 
@@ -5094,7 +5304,8 @@ uint8_t parseDuCfgParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur)
       {
          if(parseMacSliceCfgReq(doc, ns, cur, &duCfgParam.tempSliceCfg) != ROK)
          {
-            return RFAILED;
+            ret = RFAILED;
+            break;
          }
       }
 #endif      
@@ -5103,7 +5314,8 @@ uint8_t parseDuCfgParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur)
       {
          if(parseDuTimerParams(doc, ns, cur, &duCb.duTimersInfo) != ROK)
          {
-            return RFAILED;
+            ret = RFAILED;
+            break;
          }
       }
 
@@ -5111,7 +5323,8 @@ uint8_t parseDuCfgParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur)
       {
          if(parseE2ConfigParams(doc, ns, cur, &duCb.e2apDb) != ROK)
          {
-            return RFAILED;
+            ret = RFAILED;
+            break;
          }
          else
          {
@@ -5120,9 +5333,24 @@ uint8_t parseDuCfgParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur)
             cmInitTimers(&(duCb.e2apDb.e2TimersInfo.e2Timers.e2NodeConfigUpdate.timer), 1);
          }
       }
+      
+      if((!xmlStrcmp(cur->name, (const xmlChar *)"GLOBAL_CFG")) && (cur->ns == ns))
+      {
+         if(parseGlobalConfigParams(doc, ns, cur) != ROK)
+         {
+            ret = RFAILED;
+            break;
+         }
+      }
+
       cur = cur -> next;
    }
-   return ROK;
+
+   if(ret != ROK)
+   {
+      freeDuCfgParams();
+   }
+   return ret;
 }
 
 /*******************************************************************
@@ -5144,7 +5372,11 @@ uint8_t parseDuCfgParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur)
  * ****************************************************************/
 uint8_t duReadCfg()
 {
-   const char *filename = "../build/config/odu_config.xml";
+#ifdef NR_TDD
+   const char *filename = "../build/config/tdd_odu_config.xml";
+#else
+   const char *filename = "../build/config/fdd_odu_config.xml";
+#endif
    xmlDocPtr doc = NULLP;
    xmlNodePtr cur = NULLP;
    xmlNsPtr ns = NULLP;
@@ -5311,8 +5543,6 @@ void printDuConfig()
    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);
 
    sctp = &duCfgParam.sctpParams;
    DU_LOG("\n ** SCTP PARAMETER ** \n");