X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Fdu_app%2Fdu_cfg.c;h=070342922b8e9644defef17a4630462fb91feb48;hb=09f797a6a5e92ec60613189bfc99d73fe6cdfca2;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..070342922 100644 --- a/src/du_app/du_cfg.c +++ b/src/du_app/du_cfg.c @@ -122,81 +122,16 @@ uint16_t calcSliv(uint8_t startSymbol, uint8_t lengthSymbol) uint8_t readCfg() { - CmLList *node; - uint8_t srvdCellIdx, bandIdx, sliceIdx, plmnIdx, ranFuncIdx, eventTriggerStyleIdx, reportStyleIdx, tnlAssocIdx; + uint8_t srvdCellIdx, bandIdx, sliceIdx, plmnIdx; 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; srvdCellIdxxmlChildrenNode; + while (cur != NULL) + { + if ((!xmlStrcmp(cur->name, (const xmlChar *)"STYLE_TYPE")) && (cur->ns == ns)) + { + ricStyle->styleType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); + } + + if ((!xmlStrcmp(cur->name, (const xmlChar *)"NAME")) && (cur->ns == ns)) + { + tempName =(char*) xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); + strcpy((char*)ricStyle->name, tempName); + } + + if ((!xmlStrcmp(cur->name, (const xmlChar *)"FORMAT_TYPE")) && (cur->ns == ns)) + { + ricStyle->formatType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); + } + cur = cur -> next; + } + return ROK; +} + +/******************************************************************* + * + * @brief Fill measurement info parameters + * + * @details + * + * Function : parseMeasurementInfo + * + * 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 parseMeasurementInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, CmLListCp *measurementInfoList) +{ + CmLList *node; + char *tempName; + MeasurementInfoForAction *measurementInfoForAction; + + DU_ALLOC(measurementInfoForAction, sizeof(MeasurementInfoForAction)); + if(!measurementInfoForAction) + { + return RFAILED; + } + + cur = cur->xmlChildrenNode; + while (cur != NULL) + { + if ((!xmlStrcmp(cur->name, (const xmlChar *)"ID")) && (cur->ns == ns)) + { + measurementInfoForAction->measurementTypeId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); + } + + if ((!xmlStrcmp(cur->name, (const xmlChar *)"NAME")) && (cur->ns == ns)) + { + tempName =(char*) xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); + strcpy((char*)measurementInfoForAction->measurementTypeName, tempName); + } + + cur = cur -> next; + } + + 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)) + { + if(parseRicStyle(doc, ns, cur, &ricReportStyle->reportStyle) != ROK) + { + return RFAILED; + } + } + + if ((!xmlStrcmp(cur->name, (const xmlChar *)"MEASUREMENT_INFO_LIST")) && (cur->ns == ns)) + { + 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 @@ -4881,7 +5141,7 @@ uint8_t parseTnlAssoc(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, TNLAssociation * ****************************************************************/ uint8_t parseE2ConfigParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, E2apDb *e2apDb) { - uint8_t tnlIdx=0; + uint8_t tnlIdx=0,ranFuncIdx=0; xmlNodePtr child = NULLP; memset(e2apDb, 0, sizeof(E2apDb)); @@ -4904,18 +5164,43 @@ uint8_t parseE2ConfigParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, E2apDb * 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; + { + 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; } @@ -5111,6 +5396,12 @@ uint8_t parseDuCfgParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur) { return RFAILED; } + else + { + cmInitTimers(&(duCb.e2apDb.e2TimersInfo.e2Timers.e2SetupTimer), 1); + cmInitTimers(&(duCb.e2apDb.e2TimersInfo.e2Timers.ricServiceUpdateTimer.timer), 1); + cmInitTimers(&(duCb.e2apDb.e2TimersInfo.e2Timers.e2NodeConfigUpdate.timer), 1); + } } cur = cur -> next; } @@ -5186,10 +5477,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 +5517,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 +5577,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; @@ -5898,6 +6192,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); + } } /**********************************************************************