X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Fdu_app%2Fdu_cfg.c;h=239285ab245526bd067b29fc425d3df8a88e434f;hb=49856df248fd976b4a9882ca4e650fc0bc3e4ee3;hp=800c7b5b3c9ec2b4774a5b687e771415fcf9a457;hpb=66888e8f5c21dbaf3ea4fbebf9d9867ba82eadf2;p=o-du%2Fl2.git diff --git a/src/du_app/du_cfg.c b/src/du_app/du_cfg.c index 800c7b5b3..239285ab2 100644 --- a/src/du_app/du_cfg.c +++ b/src/du_app/du_cfg.c @@ -102,284 +102,6 @@ uint16_t calcSliv(uint8_t startSymbol, uint8_t lengthSymbol) return sliv; } -/******************************************************************* - * - * @brief Configures the DU Parameters - * - * @details - * - * Function : readCfg - * - * Functionality: - * - Initializes the DuCfg members. - * - Calls readMacCfg() - * - * @params[in] system task ID - * @return ROK - success - * RFAILED - failure - * - * ****************************************************************/ - -uint8_t readCfg() -{ - uint8_t srvdCellIdx, bandIdx, sliceIdx, plmnIdx; - uint8_t brdcstPlmnIdx, freqBandIdx, srvdPlmnIdx; - Sib1Params sib1; - SupportedSliceList *taiSliceSuppLst; - -#ifndef O1_ENABLE - /* Note: Added these below variable for local testing*/ - Snssai snssai[NUM_OF_SUPPORTED_SLICE] = {{1,{2,3,4}},{5,{6,7,8}}}; -#endif - - for(srvdCellIdx=0; srvdCellIdxnumSupportedSlices = NUM_OF_SUPPORTED_SLICE; - if(taiSliceSuppLst->numSupportedSlices > MAX_NUM_OF_SLICE_ITEMS) - { - DU_LOG("\nERROR --> DU_APP: readCfg(): Number of supported slice [%d] is more than 1024",\ - taiSliceSuppLst->numSupportedSlices); - return RFAILED; - } - - DU_ALLOC(taiSliceSuppLst->snssai, taiSliceSuppLst->numSupportedSlices*sizeof(Snssai*)); - if(taiSliceSuppLst->snssai == NULLP) - { - DU_LOG("\nERROR --> DU_APP: readCfg():Memory allocation failed"); - return RFAILED; - } - - for(sliceIdx=0; sliceIdxnumSupportedSlices; sliceIdx++) - { - DU_ALLOC(taiSliceSuppLst->snssai[sliceIdx], sizeof(Snssai)); - if(taiSliceSuppLst->snssai[sliceIdx] == NULLP) - { - DU_LOG("\nERROR --> DU_APP: readCfg():Memory allocation failed"); - return RFAILED; - } -#ifdef O1_ENABLE - memcpy(taiSliceSuppLst->snssai[sliceIdx]->sd, cellParams.plmnList[sliceIdx].sd, \ - SD_SIZE*sizeof(uint8_t)); - taiSliceSuppLst->snssai[sliceIdx]->sst = cellParams.plmnList[sliceIdx].sst; -#else - memcpy(taiSliceSuppLst->snssai[sliceIdx], &snssai[sliceIdx], sizeof(Snssai)); -#endif - } - } - - /* NR Mode info */ -#ifdef NR_TDD - /* NR TDD Mode info */ -#ifdef O1_ENABLE - duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.nrArfcn = cellParams.arfcnUL; - duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulArfcn = cellParams.arfcnSUL; - duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulTxBw.nrScs = convertScsValToScsEnum(cellParams.ssbSubCarrierSpacing); -#else - duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.nrArfcn = NR_UL_ARFCN; - duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulArfcn = SUL_ARFCN; - duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulTxBw.nrScs = NR_SCS; -#endif - duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulTxBw.nrb = NRB_273; - - for(freqBandIdx=0; freqBandIdx DU APP : Memory allocation failure at readCfg"); - return RFAILED; - } - memcpy(duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.mibMsg, encBuf, encBufSize); - duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.mibLen = encBufSize; - - /*gnb DU System Info mib msg*/ - BuildSib1Msg(); - DU_ALLOC(duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.sib1Msg,\ - encBufSize); - if(!(duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.sib1Msg)) - { - DU_LOG("\nERROR --> DU APP : Memory allocation failure at readCfg"); - return RFAILED; - } - memcpy(duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.sib1Msg,\ - encBuf,encBufSize); - duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.sib1Len = encBufSize; - - } - - return ROK; -} - /******************************************************************* * * @brief Copy Slice Cfg in temp structre in duCfgParams @@ -883,7 +605,6 @@ uint8_t parseSupportedSliceList(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, Supp return ROK; } -#ifdef XML_BASED_CONFIG /******************************************************************* * * @brief Fill Served PLMN @@ -1018,7 +739,6 @@ uint8_t parseF1FreqBand(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1FreqBand * uint8_t sulIdx = 0; uint16_t sulValue = 0; xmlNodePtr child; - xmlNodePtr sulChild; memset(freqBand, 0, sizeof(F1FreqBand)); cur = cur->xmlChildrenNode; @@ -1034,27 +754,19 @@ uint8_t parseF1FreqBand(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1FreqBand * child = cur->xmlChildrenNode; while (child != NULL) { - if ((!xmlStrcmp(child->name, (const xmlChar *)"LIST")) && (child->ns == ns)) + sulIdx = 0; + if ((!xmlStrcmp(child->name, (const xmlChar *)"SUL_BAND")) && (child->ns == ns)) { - sulChild = child->xmlChildrenNode; - sulIdx = 0; - while (sulChild != NULL) + sulValue = atoi((char *)xmlNodeListGetString(doc, child->xmlChildrenNode, 1)); + if (sulIdx < MAX_NRCELL_BANDS) { - if ((!xmlStrcmp(sulChild->name, (const xmlChar *)"SUL_BAND")) && (sulChild->ns == ns)) - { - sulValue = atoi((char *)xmlNodeListGetString(doc, sulChild->xmlChildrenNode, 1)); - if (sulIdx < MAX_NRCELL_BANDS) - { - freqBand->sulBand[sulIdx] = sulValue; - sulIdx++; - } - else - { - DU_LOG("ERROR --> DU_APP : %s : SUL_BAND array overflow\n", __func__); - return RFAILED; - } - } - sulChild = sulChild->next; + freqBand->sulBand[sulIdx] = sulValue; + sulIdx++; + } + else + { + DU_LOG("ERROR --> DU_APP : %s : SUL_BAND array overflow\n", __func__); + return RFAILED; } } child = child->next; @@ -1087,27 +799,17 @@ uint8_t parseF1FreqBandList(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1NrFreq { uint8_t idx = 0; - xmlNodePtr child; cur = cur->xmlChildrenNode; while(cur != NULL) { - if ((!xmlStrcmp(cur->name, (const xmlChar *)"LIST")) && (cur->ns == ns)) + if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_FREQ_BAND")) && (cur->ns == ns)) { - child = cur->xmlChildrenNode; - while(child != NULL) + if(parseF1FreqBand(doc, ns, cur, &nrFreqInfo->freqBand[idx]) != ROK) { - if ((!xmlStrcmp(child->name, (const xmlChar *)"F1_FREQ_BAND")) && (child->ns == ns)) - { - if(parseF1FreqBand(doc, ns, child, &nrFreqInfo->freqBand[idx]) != ROK) - { - return RFAILED; - } - idx++; - } - child = child -> next; + return RFAILED; } + idx++; } - cur = cur -> next; } return ROK; @@ -1137,10 +839,14 @@ uint8_t parseF1TxBw(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1TxBw *txBw) cur = cur->xmlChildrenNode; while(cur != NULL) { +#ifdef O1_ENABLE + txBw->nrScs = convertScsValToScsEnum(cellParams.ssbSubCarrierSpacing); +#else if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_NR_SCS")) && (cur->ns == ns)) { txBw->nrScs = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); } +#endif if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_NRB")) && (cur->ns == ns)) { @@ -1176,10 +882,14 @@ uint8_t parseF1SulInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1SulInfo *su cur = cur->xmlChildrenNode; while(cur != NULL) { +#ifdef O1_ENABLE + sulInfo->sulArfcn = cellParams.arfcnSUL; +#else if ((!xmlStrcmp(cur->name, (const xmlChar *)"SUL_ARFCN")) && (cur->ns == ns)) { sulInfo->sulArfcn = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); } +#endif if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_TX_BW")) && (cur->ns == ns)) { @@ -1218,10 +928,14 @@ uint8_t parseF1NrFreqInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1NrFreqIn cur = cur->xmlChildrenNode; while(cur != NULL) { +#if O1_ENABLE + nrFreqInfo->nrArfcn = cellParams.arfcnUL; +#else if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_ARFCN")) && (cur->ns == ns)) { nrFreqInfo->nrArfcn = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); } +#endif if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_SUL_INFO")) && (cur->ns == ns)) { @@ -1381,9 +1095,9 @@ uint8_t parseNrModeInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, NrModeInfo * strcpy((char*)modeCfg, (char*)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); } - 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) { @@ -1391,10 +1105,9 @@ uint8_t parseNrModeInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, NrModeInfo * } } } - - 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) { @@ -1500,6 +1213,10 @@ uint8_t parseF1DuCellInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1DuCellIn } } +#ifdef O1_ENABLE + duCellInfo->tac = cellParams.nRTAC; + duCellInfo->epsTac = cellParams.nRTAC; +#else if ((!xmlStrcmp(cur->name, (const xmlChar *)"TAC")) && (cur->ns == ns)) { duCellInfo->tac = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); @@ -1509,6 +1226,7 @@ uint8_t parseF1DuCellInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1DuCellIn { duCellInfo->epsTac = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); } +#endif if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_MODE_INFO")) && (cur->ns == ns)) { @@ -1540,7 +1258,6 @@ uint8_t parseF1DuCellInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1DuCellIn return RFAILED; } } - cur = cur -> next; } return ROK; @@ -1629,7 +1346,7 @@ uint8_t fillDuSrvdCellSysInfo(F1DuSysInfo *sysInfo) return ROK; } -#ifdef O1_ENABLED +#ifdef O1_ENABLE /******************************************************************* * * @brief Fill PLMN received from O1 interface @@ -1658,7 +1375,6 @@ void fillPlmnFromO1(Plmn *PLMN, uint8_t srvdPlmnIdx) PLMN->mnc[2] = cellParams.plmnList[srvdPlmnIdx].mnc[2]; } #endif -#endif /******************************************************************* * @@ -1965,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)) @@ -2169,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)) @@ -2179,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 @@ -2867,7 +2591,6 @@ uint8_t parsePdschConfigCommon(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, Pdsch { uint8_t idx = 0; xmlNodePtr child = NULLP; - xmlNodePtr pdschNode = NULLP; memset(pdschCfgCmn, 0, sizeof(PdschConfigCommon)); cur = cur -> xmlChildrenNode; @@ -3294,7 +3017,6 @@ uint8_t parsePuschCfgCommon(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,PuschCfgC { uint8_t rsrcIdx = 0; xmlNodePtr child = NULLP; - xmlNodePtr rsrcNode = NULLP; memset(puschCfgCmn, 0, sizeof(PuschCfgCommon)); cur = cur -> xmlChildrenNode; @@ -4287,7 +4009,7 @@ uint8_t parseSib1Params(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,Sib1Params *s #ifdef O1_ENABLE sib1Params-> tac = cellParams.nRTAC; sib1Params->cellIdentity = CELL_IDENTITY * cellParams.cellLocalId; - DU_LOG("\nDEBUG --> DU_APP: readCfg(): OAM CellLocalId=%d", sib1Params->cellIdentity); + DU_LOG("\nDEBUG --> DU_APP: parseSib1Params(): OAM CellLocalId=%d", sib1Params->cellIdentity); #else if ((!xmlStrcmp(cur->name, (const xmlChar *)"TAC")) && (cur->ns == ns)) { @@ -4579,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 @@ -4607,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 /******************************************************************* * @@ -4925,7 +4659,6 @@ uint8_t parseMeasurementInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, CmLList uint8_t parseReportStyle(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, RicReportStyle *ricReportStyle) { xmlNodePtr child = NULLP; - uint8_t numOfMeasurementInfo=0; memset(ricReportStyle, 0, sizeof(RicReportStyle)); cur = cur->xmlChildrenNode; @@ -4939,11 +4672,6 @@ uint8_t parseReportStyle(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, RicReportSt } } - if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_OF_MEASUREMENT_INFO")) && (cur->ns == ns)) - { - numOfMeasurementInfo = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); - } - if ((!xmlStrcmp(cur->name, (const xmlChar *)"MEASUREMENT_INFO_LIST")) && (cur->ns == ns)) { child = cur->xmlChildrenNode; @@ -5211,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;sliceIdxnumSupportedSlices;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;ranFuncIdxnumOfReportStyleSupported;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 @@ -5230,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; @@ -5243,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)) @@ -5268,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); } @@ -5278,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 ) { @@ -5321,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; @@ -5335,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; } } @@ -5356,25 +5276,26 @@ uint8_t parseDuCfgParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur) { if(parseSib1Params(doc, ns, cur, &duCfgParam.sib1Params) != ROK) { - return RFAILED; + ret = RFAILED; + break; } } -#ifdef XML_BASED_CONFIG 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; + ret = RFAILED; + break; } } -#endif if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAC_CELL_CFG")) && (cur->ns == ns)) { if(parseMacCellCfg(doc, ns, cur, &duCfgParam.macCellCfg) != ROK) { - return RFAILED; + ret = RFAILED; + break; } } @@ -5383,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 @@ -5392,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; } } @@ -5400,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 { @@ -5409,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; } /******************************************************************* @@ -5433,11 +5372,18 @@ 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; + Pst pst; + Buffer *mBuf; + /* Parse, store and print DU configurations from XML file */ doc = xmlParseFile(filename); if(doc == NULL) { @@ -5456,21 +5402,11 @@ uint8_t duReadCfg() } parseDuCfgParams(doc, ns, cur); + printDuConfig(); xmlFreeDoc(doc); xmlCleanupParser(); - Pst pst; - Buffer *mBuf; - - /* Read configs into duCfgParams */ - if(readCfg() != ROK) - { - DU_LOG("\nERROR --> DU_APP : Reading configuration failed"); - return RFAILED; - } - printDuConfig(); - /* Fill pst structure */ memset(&(pst), 0, sizeof(Pst)); pst.srcEnt = (Ent)ENTDUAPP; @@ -5523,6 +5459,9 @@ uint8_t duReadCfg() * ****************************************************************/ void printDuConfig() { + + uint16_t ranFuncIdx; + uint8_t reportStyleIdx =0, eventStyleIdx=0, tnlIdx=0; uint8_t sliceIdx = 0, pfIdx = 0, rsrcIdx = 0, ssbMaskIdx = 0, fdmIdx = 0; uint8_t monitoringSymbIdx = 0, poIdx = 0, policyIdx = 0, memIdx = 0; __attribute__((unused)) SctpParams *sctp; @@ -5580,7 +5519,11 @@ void printDuConfig() MacSliceRrmPolicy *rrmPolicy; __attribute__((unused)) RrmPolicyRatio *rrmPolicyRatio; __attribute__((unused)) RrmPolicyMemberList *rrmPolicyMemberList; - + CmLList *node; + E2apDb *e2apDb; + RanFunction *ranFunc; + CmLListCp *measurementInfoList; + MeasurementInfoForAction *measurementInfoForAction; #ifdef NR_TDD F1NrTddInfo *f1NrTddInfo; TDDCfg *tddCfg; @@ -5600,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"); @@ -6191,6 +6132,65 @@ void printDuConfig() DU_LOG("\t\tSD %d %d %d\n",rrmPolicyMemberList->snssai.sd[0],rrmPolicyMemberList->snssai.sd[1],rrmPolicyMemberList->snssai.sd[2]); } } + + DU_LOG("\n ** E2 configuration ** \n"); + e2apDb = &duCb.e2apDb; + DU_LOG("E2 node id %lu\n", e2apDb->e2NodeId); + DU_LOG("Number of RAN function %d\n", e2apDb->numOfRanFunction); + for(ranFuncIdx=0; ranFuncIdxnumOfRanFunction; ranFuncIdx++) + { + ranFunc = &e2apDb->ranFunction[ranFuncIdx]; + DU_LOG("RAN function id %d\n", ranFunc->id); + DU_LOG("Short Name %s\n", ranFunc->name.shortName); + DU_LOG("Service Model OID %s\n", ranFunc->name.serviceModelOID); + DU_LOG("Description %s\n", ranFunc->name.description); + + DU_LOG("RevisionCounter %d\n",ranFunc->revisionCounter); + DU_LOG("NUM of Event Trigger Style Supported %d\n",ranFunc->numOfEventTriggerStyleSupported); + for(eventStyleIdx=0;eventStyleIdxnumOfEventTriggerStyleSupported; eventStyleIdx++) + { + DU_LOG("Style Type %d\n",ranFunc->eventTriggerStyleList[eventStyleIdx].styleType); + DU_LOG("Name %s\n",ranFunc->eventTriggerStyleList[eventStyleIdx].name); + DU_LOG("Format type %d\n",ranFunc->eventTriggerStyleList[eventStyleIdx].formatType); + } + + DU_LOG("Num of Report Style Supported %d\n",ranFunc->numOfReportStyleSupported); + for(reportStyleIdx=0;reportStyleIdxnumOfReportStyleSupported; reportStyleIdx++) + { + DU_LOG("Style Type %d\n",ranFunc->reportStyleList[reportStyleIdx].reportStyle.styleType); + DU_LOG("Name %s\n",ranFunc->reportStyleList[reportStyleIdx].reportStyle.name); + DU_LOG("Format type %d\n",ranFunc->reportStyleList[reportStyleIdx].reportStyle.formatType); + measurementInfoList = &ranFunc->reportStyleList[reportStyleIdx].measurementInfoList; + if(measurementInfoList->count) + { + CM_LLIST_FIRST_NODE(measurementInfoList, node); + while(node) + { + measurementInfoForAction = (MeasurementInfoForAction*) node->node; + if(measurementInfoForAction) + { + DU_LOG("Measurement Type Name %s\n",measurementInfoForAction->measurementTypeName); + DU_LOG("Measurement Type Id %d\n",measurementInfoForAction->measurementTypeId); + } + node = node->next; + } + } + } + DU_LOG("Ric Indication header format %d\n",ranFunc->ricIndicationHeaderFormat); + DU_LOG("Ric indication message format %d\n",ranFunc->ricIndicationMessageFormat); + + } + DU_LOG("Number of TNL association %d\n", e2apDb->numOfTNLAssoc); + for(tnlIdx=0;tnlIdxnumOfTNLAssoc;tnlIdx++) + { + DU_LOG("Local IPv4 Address present %u\n", e2apDb->tnlAssoc[tnlIdx].localIpAddress.ipV4Pres); + DU_LOG("local IP Address %u\n", e2apDb->tnlAssoc[tnlIdx].localIpAddress.ipV4Addr); + DU_LOG("Destination IPv4 Address present %u\n", e2apDb->tnlAssoc[tnlIdx].destIpAddress.ipV4Pres); + DU_LOG("Destination IP Address %u\n", e2apDb->tnlAssoc[tnlIdx].destIpAddress.ipV4Addr); + DU_LOG("Local port %d\n", e2apDb->tnlAssoc[tnlIdx].localPort); + DU_LOG("Destination port %d\n", e2apDb->tnlAssoc[tnlIdx].destPort); + DU_LOG("Tnl usage %d\n", e2apDb->tnlAssoc[tnlIdx].usage); + } } /**********************************************************************