From a60007e2f18988b79dae61c4a6ca74c164038d80 Mon Sep 17 00:00:00 2001 From: pborla Date: Wed, 21 Feb 2024 17:47:45 +0530 Subject: [PATCH] [Epic-ID: ODUHIGH-538][Issue-ID: ODUHIGH-564] Filling E2 configuration from XML | Part-2 Change-Id: Ic29e42d976d935801b1a32f51fdcb1410eb5e2cf Signed-off-by: pborla --- src/du_app/du_cfg.c | 459 ++++++++++++++++++++++++++++++++++++++--------- src/du_app/du_e2ap_mgr.h | 15 -- 2 files changed, 376 insertions(+), 98 deletions(-) diff --git a/src/du_app/du_cfg.c b/src/du_app/du_cfg.c index 9f50ac08d..42ae58044 100644 --- a/src/du_app/du_cfg.c +++ b/src/du_app/du_cfg.c @@ -380,81 +380,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; + uint8_t numOfMeasurementInfo=0; + 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 *)"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; + 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 @@ -5126,7 +5392,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)); @@ -5149,18 +5415,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; } @@ -5356,6 +5647,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; } @@ -5431,10 +5728,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) diff --git a/src/du_app/du_e2ap_mgr.h b/src/du_app/du_e2ap_mgr.h index 9ad52ad0a..1ed73514f 100644 --- a/src/du_app/du_e2ap_mgr.h +++ b/src/du_app/du_e2ap_mgr.h @@ -41,21 +41,6 @@ #define STRING_SIZE_150_BYTES 150 #define STRING_SIZE_1000_BYTES 1000 -#define SHORT_NAME "ORAN-E2SM-KPM" -#define SERVICE_MODEL_OID "1.3.6.1.4.1.53148.1.2.2.2" -#define DESCRIPTION "KPM Monitor" -#define NUM_OF_EVENT_TRIGGER_STYLE_SUPPORTED 1 -#define EVENT_TRIGGER_STYLE_NAME "Periodic Report" -#define EVENT_TRIGGER_STYLE_TYPE 1 -#define EVENT_TRIGGER_STYLE_FORMAT_TYPE 1 -#define NUM_OF_RIC_REPORT_STYLE_SUPPORTED 1 -#define REPORT_STYLE_NAME "E2 Node Measurement" -#define REPORT_STYLE_TYPE 1 -#define REPORT_ACTION_FORMAT_TYPE 1 -#define MEASUREMENT_TYPE_NAME (char*[]) {"RRU.PrbTotDl", "RRU.PrbTotUl"} -#define RIC_INDICATION_HEADER_FORMAT 1 -#define RIC_INDICATION_MESSAGE_FORMAT 1 - /* O-RAN.WG3.E2AP-R003-v03.00 : Section 9.2.26 */ typedef enum { -- 2.16.6