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=f73c392665c0e7668b009237c8e865a252e5e1f7;hpb=ce93275b1b45815fc9daab73f3da21cef0aa618e;p=o-du%2Fl2.git diff --git a/src/du_app/du_cfg.c b/src/du_app/du_cfg.c index f73c39266..239285ab2 100644 --- a/src/du_app/du_cfg.c +++ b/src/du_app/du_cfg.c @@ -102,349 +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() -{ - CmLList *node; - uint8_t srvdCellIdx, bandIdx, sliceIdx, plmnIdx, ranFuncIdx, eventTriggerStyleIdx, reportStyleIdx, tnlAssocIdx; - uint8_t brdcstPlmnIdx, freqBandIdx, srvdPlmnIdx; - MibParams mib; - Sib1Params sib1; - SupportedSliceList *taiSliceSuppLst; - uint8_t measurementInfoIdx =0, measurementInfoLen=0; - char shortName[] = SHORT_NAME; - char serviceModelOID[]= SERVICE_MODEL_OID; - char description[] = DESCRIPTION; - char event_trigger_style_name[]= EVENT_TRIGGER_STYLE_NAME; - char ric_report_style_name[]= REPORT_STYLE_NAME; - -#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 - - duCb.e2apDb.e2TransInfo.transIdCounter = 0; - duCb.e2apDb.numOfRanFunction = 1; - for(ranFuncIdx =0; ranFuncIdxmeasurementTypeId = measurementInfoIdx+1; - memcpy(measurementInfoForAction->measurementTypeName, MEASUREMENT_TYPE_NAME[measurementInfoIdx], measurementInfoLen+1); - } - DU_ALLOC(node, sizeof(CmLList)); - if(node) - { - node->node = (PTR) measurementInfoForAction; - cmLListAdd2Tail(&duCb.e2apDb.ranFunction[ranFuncIdx].reportStyleList[reportStyleIdx].measurementInfoList, node); - } - else - { - - DU_FREE(measurementInfoForAction, sizeof(MeasurementInfoForAction)); - } - } - } - - duCb.e2apDb.ranFunction[ranFuncIdx].ricIndicationHeaderFormat = RIC_INDICATION_HEADER_FORMAT; - duCb.e2apDb.ranFunction[ranFuncIdx].ricIndicationMessageFormat = RIC_INDICATION_MESSAGE_FORMAT; - - cmLListInit(&duCb.e2apDb.ranFunction[ranFuncIdx].subscriptionList); - } - memset(duCb.e2apDb.e2TransInfo.e2InitTransaction, 0, MAX_NUM_TRANSACTION * sizeof(E2TransInfo)); - memset(duCb.e2apDb.e2TransInfo.ricInitTransaction, 0, MAX_NUM_TRANSACTION * sizeof(E2TransInfo)); - - 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 @@ -948,7 +605,6 @@ uint8_t parseSupportedSliceList(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, Supp return ROK; } -#ifdef XML_BASED_CONFIG /******************************************************************* * * @brief Fill Served PLMN @@ -1083,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; @@ -1099,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; @@ -1152,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; @@ -1202,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)) { @@ -1241,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)) { @@ -1283,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)) { @@ -1446,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) { @@ -1456,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) { @@ -1565,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)); @@ -1574,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)) { @@ -1605,7 +1258,6 @@ uint8_t parseF1DuCellInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1DuCellIn return RFAILED; } } - cur = cur -> next; } return ROK; @@ -1694,7 +1346,7 @@ uint8_t fillDuSrvdCellSysInfo(F1DuSysInfo *sysInfo) return ROK; } -#ifdef O1_ENABLED +#ifdef O1_ENABLE /******************************************************************* * * @brief Fill PLMN received from O1 interface @@ -1723,7 +1375,6 @@ void fillPlmnFromO1(Plmn *PLMN, uint8_t srvdPlmnIdx) PLMN->mnc[2] = cellParams.plmnList[srvdPlmnIdx].mnc[2]; } #endif -#endif /******************************************************************* * @@ -2030,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)) @@ -2234,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)) @@ -2244,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 @@ -2932,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; @@ -3359,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; @@ -4352,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)) { @@ -4644,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 @@ -4672,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 /******************************************************************* * @@ -4863,13 +4532,13 @@ uint8_t parseTnlAssoc(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, TNLAssociation /******************************************************************* * - * @brief Fill E2 config Parameters + * @brief Fill ric style parmeters * * @details * - * Function : parseE2ConfigParams + * Function : parseRicStyle * - * Functionality: Fill E2 config Parmeters + * Functionality: Fill ric style parmeters * * @params[in] XML document pointer * XML namespace @@ -4879,125 +4548,664 @@ uint8_t parseTnlAssoc(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, TNLAssociation * RFAILED - failure * * ****************************************************************/ -uint8_t parseE2ConfigParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, E2apDb *e2apDb) +uint8_t parseRicStyle(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, RicStyle *ricStyle) { - uint8_t tnlIdx=0; - xmlNodePtr child = NULLP; + char *tempName; + memset(ricStyle, 0, sizeof(RicStyle)); - memset(e2apDb, 0, sizeof(E2apDb)); cur = cur->xmlChildrenNode; while (cur != NULL) { - if ((!xmlStrcmp(cur->name, (const xmlChar *)"E2_NODE_ID")) && (cur->ns == ns)) + if ((!xmlStrcmp(cur->name, (const xmlChar *)"STYLE_TYPE")) && (cur->ns == ns)) { - e2apDb->e2NodeId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); + ricStyle->styleType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); } - if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_OF_TNL_ASSOC")) && (cur->ns == ns)) + if ((!xmlStrcmp(cur->name, (const xmlChar *)"NAME")) && (cur->ns == ns)) { - e2apDb->numOfTNLAssoc = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); + tempName =(char*) xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); + strcpy((char*)ricStyle->name, tempName); } - if ((!xmlStrcmp(cur->name, (const xmlChar *)"TNL_ASSOC_LIST")) && (cur->ns == ns)) + if ((!xmlStrcmp(cur->name, (const xmlChar *)"FORMAT_TYPE")) && (cur->ns == ns)) { - child = cur->xmlChildrenNode; - while(child != NULL) - { - if ((!xmlStrcmp(child->name, (const xmlChar *)"TNL_ASSOC")) && (child->ns == ns)) - { - if(parseTnlAssoc(doc, ns, child,&e2apDb->tnlAssoc[tnlIdx]) != ROK) - { - return RFAILED; - } - tnlIdx++; - - } - child = child -> next; - } - } - cur = cur -> next; + ricStyle->formatType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); + } + cur = cur -> next; } return ROK; } /******************************************************************* * - * @brief Fill DU Config Parmeters + * @brief Fill measurement info parameters * * @details * - * Function : parseDuCfgParams + * Function : parseMeasurementInfo * - * Functionality: + * Functionality: Fill measurement info 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 parseDuCfgParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur) +uint8_t parseMeasurementInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, CmLListCp *measurementInfoList) { - char *tempDuName = ""; - char *duIpV4Addr; - char *cuIpV4Addr; - char *ricIpV4Addr; - CmInetIpAddr duIp; - CmInetIpAddr cuIp; - CmInetIpAddr ricIp; + CmLList *node; + char *tempName; + MeasurementInfoForAction *measurementInfoForAction; + + DU_ALLOC(measurementInfoForAction, sizeof(MeasurementInfoForAction)); + if(!measurementInfoForAction) + { + return RFAILED; + } cur = cur->xmlChildrenNode; - while(cur != NULL) + while (cur != NULL) { - if ((!xmlStrcmp(cur->name, (const xmlChar *)"THREAD_AFFINITY")) && (cur->ns == ns)) + if ((!xmlStrcmp(cur->name, (const xmlChar *)"ID")) && (cur->ns == ns)) { -#ifdef THREAD_AFFINITY - if(parseThreadAffinity(doc, ns, cur, &duCfgParam.threadInfo) != ROK) - { - return RFAILED; - } -#endif + measurementInfoForAction->measurementTypeId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); } - if ((!xmlStrcmp(cur->name, (const xmlChar *)"GNB_ID")) && (cur->ns == ns)) + if ((!xmlStrcmp(cur->name, (const xmlChar *)"NAME")) && (cur->ns == ns)) { - duCb.gnbId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); + tempName =(char*) xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); + strcpy((char*)measurementInfoForAction->measurementTypeName, tempName); } - if ((!xmlStrcmp(cur->name, (const xmlChar *)"DU_ID")) && (cur->ns == ns)) - { - duCfgParam.duId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); - } + cur = cur -> next; + } - if ((!xmlStrcmp(cur->name, (const xmlChar *)"DU_NAME")) && (cur->ns == ns)) + DU_ALLOC(node, sizeof(CmLList)); + if(node) + { + node->node = (PTR) measurementInfoForAction; + cmLListAdd2Tail(measurementInfoList, node); + } + else + { + DU_FREE(measurementInfoForAction, sizeof(MeasurementInfoForAction)); + return RFAILED; + } + + return ROK; +} + +/******************************************************************* + * + * @brief Fill report style parameters + * + * @details + * + * Function : parseReportStyle + * + * Functionality: Fill report style 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 parseReportStyle(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, RicReportStyle *ricReportStyle) +{ + xmlNodePtr child = NULLP; + memset(ricReportStyle, 0, sizeof(RicReportStyle)); + + cur = cur->xmlChildrenNode; + while (cur != NULL) + { + if ((!xmlStrcmp(cur->name, (const xmlChar *)"RIC_STYLE")) && (cur->ns == ns)) { - tempDuName =(char*) xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); - DU_ALLOC(duCfgParam.duName, strlen(tempDuName)); - if(!duCfgParam.duName) + if(parseRicStyle(doc, ns, cur, &ricReportStyle->reportStyle) != ROK) { - DU_LOG("\nERROR --> DU_APP: %s: Memory allocation failed at line %d", __func__, __LINE__); return RFAILED; } - 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)) + if ((!xmlStrcmp(cur->name, (const xmlChar *)"MEASUREMENT_INFO_LIST")) && (cur->ns == ns)) { - duCfgParam.maxUe = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); - } - -#ifdef O1_ENABLE + child = cur->xmlChildrenNode; + while(child != NULL) + { + if ((!xmlStrcmp(child->name, (const xmlChar *)"MEASUREMENT_INFO")) && (child->ns == ns)) + { + if(parseMeasurementInfo(doc, ns, child, &ricReportStyle->measurementInfoList) != ROK) + { + return RFAILED; + } + } + child = child -> next; + } + } + + cur = cur -> next; + } + return ROK; +} + +/******************************************************************* + * + * @brief Fill RAN function name parameters + * + * @details + * + * Function : parseRanFuncName + * + * Functionality: Fill RAN function name 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 parseRanFuncName(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, RanFunctionName *ranFunctionName) +{ + char *tempShortName; + char *tempServiceModelOid; + char *tempDiscription; + + memset(ranFunctionName, 0, sizeof(RanFunctionName)); + + cur = cur->xmlChildrenNode; + while (cur != NULL) + { + if ((!xmlStrcmp(cur->name, (const xmlChar *)"SHORT_NAME")) && (cur->ns == ns)) + { + tempShortName =(char*) xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); + strcpy((char*)ranFunctionName->shortName, tempShortName); + } + + if ((!xmlStrcmp(cur->name, (const xmlChar *)"SEVICE_MODEL_OID")) && (cur->ns == ns)) + { + tempServiceModelOid =(char*) xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); + strcpy((char*)ranFunctionName->serviceModelOID, tempServiceModelOid); + } + + if ((!xmlStrcmp(cur->name, (const xmlChar *)"DESCRIPTION")) && (cur->ns == ns)) + { + tempDiscription =(char*) xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); + strcpy((char*)ranFunctionName->description, tempDiscription); + } + cur = cur -> next; + } + return ROK; +} + +/******************************************************************* + * + * @brief Fill RAN function parameters + * + * @details + * + * Function : parseRanFunctionParams + * + * Functionality: Fill RAN function 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 parseRanFunctionParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, RanFunction *ranFunction) +{ + xmlNodePtr child = NULLP; + uint8_t eventTriggerStyleIdx=0, reportStyleIdx=0; + + memset(ranFunction, 0, sizeof(RanFunction)); + + cur = cur->xmlChildrenNode; + + while (cur != NULL) + { + if ((!xmlStrcmp(cur->name, (const xmlChar *)"ID")) && (cur->ns == ns)) + { + ranFunction->id = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); + } + + if ((!xmlStrcmp(cur->name, (const xmlChar *)"RAN_FUNCTION_NAME")) && (cur->ns == ns)) + { + if(parseRanFuncName(doc, ns, cur, &ranFunction->name) != ROK) + { + return RFAILED; + } + } + + if ((!xmlStrcmp(cur->name, (const xmlChar *)"REVISION_COUNTER")) && (cur->ns == ns)) + { + ranFunction->revisionCounter = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); + } + + if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_OF_EVENT_TRIGGER_STYLE_SUPPORTED")) && (cur->ns == ns)) + { + ranFunction->numOfEventTriggerStyleSupported = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); + } + + + if ((!xmlStrcmp(cur->name, (const xmlChar *)"EVENT_TRIGGERED_STYLE_LIST")) && (cur->ns == ns)) + { + child = cur->xmlChildrenNode; + while(child != NULL) + { + if ((!xmlStrcmp(child->name, (const xmlChar *)"EVENT_TRIGGERED_STYLE")) && (child->ns == ns)) + { + if(parseRicStyle(doc, ns, child,&ranFunction->eventTriggerStyleList[eventTriggerStyleIdx]) != ROK) + { + return RFAILED; + } + eventTriggerStyleIdx++; + + } + child = child -> next; + } + + } + + child = NULLP; + if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_OF_REPORT_STYLE_SUPPORTED")) && (cur->ns == ns)) + { + ranFunction->numOfReportStyleSupported = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); + } + + if ((!xmlStrcmp(cur->name, (const xmlChar *)"REPORT_STYLE_SUPPORTED_LIST")) && (cur->ns == ns)) + { + child = cur->xmlChildrenNode; + while(child != NULL) + { + if ((!xmlStrcmp(child->name, (const xmlChar *)"REPORT_STYLE")) && (child->ns == ns)) + { + if(parseReportStyle(doc, ns, child,&ranFunction->reportStyleList[reportStyleIdx]) != ROK) + { + return RFAILED; + } + reportStyleIdx++; + + } + child = child -> next; + } + + } + + if ((!xmlStrcmp(cur->name, (const xmlChar *)"RIC_INDICATION_HEADER_FORMAT")) && (cur->ns == ns)) + { + ranFunction->ricIndicationHeaderFormat = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); + } + + if ((!xmlStrcmp(cur->name, (const xmlChar *)"RIC_INDICATION_MESSAGE_FORMAT")) && (cur->ns == ns)) + { + ranFunction->ricIndicationMessageFormat = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); + } + cur = cur -> next; + } + return ROK; +} + +/******************************************************************* + * + * @brief Fill E2 config Parameters + * + * @details + * + * Function : parseE2ConfigParams + * + * Functionality: Fill E2 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 parseE2ConfigParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, E2apDb *e2apDb) +{ + uint8_t tnlIdx=0,ranFuncIdx=0; + xmlNodePtr child = NULLP; + + memset(e2apDb, 0, sizeof(E2apDb)); + cur = cur->xmlChildrenNode; + while (cur != NULL) + { + if ((!xmlStrcmp(cur->name, (const xmlChar *)"E2_NODE_ID")) && (cur->ns == ns)) + { + e2apDb->e2NodeId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); + } + + if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_OF_TNL_ASSOC")) && (cur->ns == ns)) + { + e2apDb->numOfTNLAssoc = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); + } + + if ((!xmlStrcmp(cur->name, (const xmlChar *)"TNL_ASSOC_LIST")) && (cur->ns == ns)) + { + child = cur->xmlChildrenNode; + while(child != NULL) + { + if ((!xmlStrcmp(child->name, (const xmlChar *)"TNL_ASSOC")) && (child->ns == ns)) + { + if(parseTnlAssoc(doc, ns, child,&e2apDb->tnlAssoc[tnlIdx]) != ROK) + { + return RFAILED; + } + tnlIdx++; + + } + child = child -> next; + } + } + + if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_OF_RAN_FUNCTION")) && (cur->ns == ns)) + { + e2apDb->numOfRanFunction = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); + } + + if ((!xmlStrcmp(cur->name, (const xmlChar *)"RAN_FUNCTION_LIST")) && (cur->ns == ns)) + { + child = cur->xmlChildrenNode; + while(child != NULL) + { + if ((!xmlStrcmp(child->name, (const xmlChar *)"RAN_FUNCTION")) && (child->ns == ns)) + { + if(parseRanFunctionParams(doc, ns, child,&e2apDb->ranFunction[ranFuncIdx]) != ROK) + { + return RFAILED; + } + cmLListInit(&e2apDb->ranFunction[ranFuncIdx].subscriptionList); + ranFuncIdx++; + + } + child = child -> next; + } + } + + cur = cur -> next; + } + 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 + * + * @details + * + * Function : parseDuCfgParams + * + * Functionality: + * + * @params[in] XML document pointer + * XML namespace + * Current node in XML + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t parseDuCfgParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur) +{ + uint8_t ret=ROK; + char *tempDuName = ""; + char *duIpV4Addr; + char *cuIpV4Addr; + char *ricIpV4Addr; + CmInetIpAddr duIp; + CmInetIpAddr cuIp; + CmInetIpAddr ricIp; + + cur = cur->xmlChildrenNode; + while(cur != NULL) + { + if ((!xmlStrcmp(cur->name, (const xmlChar *)"THREAD_AFFINITY")) && (cur->ns == ns)) + { + if(parseThreadAffinity(doc, ns, cur, &duCfgParam.threadInfo) != ROK) + { + ret = RFAILED; + break; + } + } + + if ((!xmlStrcmp(cur->name, (const xmlChar *)"GNB_ID")) && (cur->ns == ns)) + { + duCb.gnbId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); + } + + if ((!xmlStrcmp(cur->name, (const xmlChar *)"DU_ID")) && (cur->ns == ns)) + { + duCfgParam.duId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); + } + + if ((!xmlStrcmp(cur->name, (const xmlChar *)"DU_NAME")) && (cur->ns == ns)) + { + tempDuName =(char*) xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); + DU_ALLOC(duCfgParam.duName, strlen(tempDuName)); + if(!duCfgParam.duName) + { + DU_LOG("\nERROR --> DU_APP: %s: Memory allocation failed at line %d", __func__, __LINE__); + ret = RFAILED; + break; + } + 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)); + } + +#ifdef O1_ENABLE if( getStartupConfig(&g_cfg) != ROK ) { RETVALUE(RFAILED); @@ -5030,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; @@ -5044,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; } } @@ -5065,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; } } @@ -5092,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 @@ -5101,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; } } @@ -5109,12 +5323,34 @@ uint8_t parseDuCfgParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur) { if(parseE2ConfigParams(doc, ns, cur, &duCb.e2apDb) != ROK) { - return RFAILED; + ret = RFAILED; + break; + } + else + { + cmInitTimers(&(duCb.e2apDb.e2TimersInfo.e2Timers.e2SetupTimer), 1); + cmInitTimers(&(duCb.e2apDb.e2TimersInfo.e2Timers.ricServiceUpdateTimer.timer), 1); + 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; } /******************************************************************* @@ -5136,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) { @@ -5159,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; @@ -5186,10 +5419,6 @@ uint8_t duReadCfg() pst.selector = ODU_SELECTOR_TC; pst.pool= DU_POOL; - /* Initialize the timer blocks */ - cmInitTimers(&(duCb.e2apDb.e2TimersInfo.e2Timers.e2SetupTimer), 1); - cmInitTimers(&(duCb.e2apDb.e2TimersInfo.e2Timers.ricServiceUpdateTimer.timer), 1); - cmInitTimers(&(duCb.e2apDb.e2TimersInfo.e2Timers.e2NodeConfigUpdate.timer), 1); /* Timer Registration request to system services */ if (ODU_REG_TMR_MT(pst.srcEnt, pst.srcInst, duCb.duTimersInfo.tmrRes, duActvTmr) != ROK) @@ -5230,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; @@ -5287,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; @@ -5307,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"); @@ -5898,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); + } } /**********************************************************************