/*******************************************************************
*
- * @brief Builds Ran function add list
+ * @brief Builds Ran function item
*
* @details
*
- * Function : BuildRanFunctionAddList
+ * Function : BuildRanFunctionItem
*
- * Functionality: Building RAN addition addition list
+ * Functionality: Building RAN function item
*
- * @params[in] RANfunctions_List_t *RANfunctions_List
+ * @params[in]
+ * RAN function item that has to be filled
+ * Stored RAN Function information
* @return ROK - success
* RFAILED - failure
*
******************************************************************/
-uint8_t BuildRanFunctionAddList(RANfunctions_List_t *ranFunctionsList)
+uint8_t BuildRanFunctionItem(RANfunction_Item_t *ranFuncItem, RanFunction *ranFuncDb)
{
- asn_enc_rval_t encRetVal;
- RanFunction *ranFuncDb;
+ uint8_t ret =RFAILED;
+ RANfunctionDefinition_t *ranFunctionDefinition;
RANfunction_Name_t *ranFuncName;
- uint8_t ranFuncIdx;
- RANfunction_ItemIEs_t *ranFuncItemIe;
- RANfunction_Item_t *ranFuncItem;
+ asn_enc_rval_t encRetVal;
E2SM_KPM_RANfunction_Description_t *ranFuncDefinition;
-
- ranFunctionsList->list.count = duCb.e2apDb.numOfRanFunction;
- ranFunctionsList->list.size = ranFunctionsList->list.count * sizeof(RANfunction_ItemIEs_t*);
- DU_ALLOC(ranFunctionsList->list.array, ranFunctionsList->list.size);
- if(ranFunctionsList->list.array == NULLP)
- {
- DU_LOG("\nERROR --> E2AP: Memory allocation failed in %s at %d",__func__, __LINE__);
- return RFAILED;
- }
-
- for(ranFuncIdx = 0; ranFuncIdx< ranFunctionsList->list.count; ranFuncIdx++)
+
+ while(true)
{
- DU_ALLOC(ranFunctionsList->list.array[ranFuncIdx], sizeof(RANfunction_ItemIEs_t));
- if(ranFunctionsList->list.array[ranFuncIdx] == NULLP)
- {
- DU_LOG("\nERROR --> E2AP: Memory allocation failed in %s at %d",__func__, __LINE__);
- return RFAILED;
- }
-
- ranFuncItemIe = (RANfunction_ItemIEs_t *) ranFunctionsList->list.array[ranFuncIdx];
- ranFuncItemIe->id = ProtocolIE_IDE2_id_RANfunction_Item;
- ranFuncItemIe->criticality = CriticalityE2_ignore;
- ranFuncItemIe->value.present = RANfunction_ItemIEs__value_PR_RANfunction_Item;
- ranFuncItem = &ranFuncItemIe->value.choice.RANfunction_Item;
- ranFuncDb = &duCb.e2apDb.ranFunction[ranFuncIdx];
/* RAN function Id*/
ranFuncItem->ranFunctionID = ranFuncDb->id;
-
+
/* RAN Function Revision*/
ranFuncItem->ranFunctionRevision = ranFuncDb->revisionCounter;
-
+
/* RAN function OID*/
ranFuncItem->ranFunctionOID.size = strlen(ranFuncDb->name.serviceModelOID);
DU_ALLOC(ranFuncItem->ranFunctionOID.buf, ranFuncItem->ranFunctionOID.size);
if(!ranFuncItem->ranFunctionOID.buf)
{
DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
- return RFAILED;
+ break;
}
memcpy(ranFuncItem->ranFunctionOID.buf, ranFuncDb->name.serviceModelOID, ranFuncItem->ranFunctionOID.size);
if(!ranFuncDefinition)
{
DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
- return RFAILED;
+ break;
}
-
+
/* RAN function Name */
ranFuncName = &ranFuncDefinition->ranFunction_Name;
-
+
/* RAN function ShortName */
ranFuncName->ranFunction_ShortName.size = strlen(ranFuncDb->name.shortName);
DU_ALLOC(ranFuncName->ranFunction_ShortName.buf, ranFuncName->ranFunction_ShortName.size);
if(!ranFuncName->ranFunction_ShortName.buf)
{
DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
- return RFAILED;
+ break;
}
memcpy(ranFuncName->ranFunction_ShortName.buf, ranFuncDb->name.shortName, strlen(ranFuncDb->name.shortName));
-
+
/* RAN function E2SM_OID */
ranFuncName->ranFunction_E2SM_OID.size = strlen(ranFuncDb->name.serviceModelOID);
DU_ALLOC(ranFuncName->ranFunction_E2SM_OID.buf, ranFuncName->ranFunction_E2SM_OID.size);
if(!ranFuncName->ranFunction_E2SM_OID.buf)
{
DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
- return RFAILED;
+ break;
}
memcpy(ranFuncName->ranFunction_E2SM_OID.buf, ranFuncDb->name.serviceModelOID, ranFuncName->ranFunction_E2SM_OID.size);
- /* RAN function Description */
+ /* RAN Function Name Description */
ranFuncName->ranFunction_Description.size = strlen(ranFuncDb->name.description);
DU_ALLOC(ranFuncName->ranFunction_Description.buf, ranFuncName->ranFunction_Description.size);
if(!ranFuncName->ranFunction_Description.buf)
{
DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
- return RFAILED;
+ break;
}
memcpy(ranFuncName->ranFunction_Description.buf, ranFuncDb->name.description, ranFuncName->ranFunction_Description.size);
-
+
/* RIC Event Trigger Style List */
DU_ALLOC(ranFuncDefinition->ric_EventTriggerStyle_List, sizeof(struct E2SM_KPM_RANfunction_Description__ric_EventTriggerStyle_List));
if(!ranFuncDefinition->ric_EventTriggerStyle_List)
{
DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
- return RFAILED;
+ break;
}
-
+
if(fillRicEventTriggerStyle(ranFuncDb, ranFuncDefinition->ric_EventTriggerStyle_List)!=ROK)
{
DU_LOG("\nERROR --> E2AP: failed to fill ric event trigger style");
- return RFAILED;
+ break;
}
/* RIC Report Style List */
if(!ranFuncDefinition->ric_ReportStyle_List)
{
DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
- return RFAILED;
+ break;
}
if(fillRicReportStyle(ranFuncDb, ranFuncDefinition->ric_ReportStyle_List) != ROK)
{
DU_LOG("\nERROR --> E2AP: failed to fill ric report style");
- return RFAILED;
+ break;
}
/* Encode the F1SetupRequest type as APER */
{
printf("%x",encBuf[measIeIdx]);
}
-
+ ranFunctionDefinition = &ranFuncItem->ranFunctionDefinition;
+ ranFunctionDefinition->size = encBufSize;
+ DU_ALLOC(ranFunctionDefinition->buf, encBufSize);
+ if(ranFunctionDefinition->buf == NULLP)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed for RAN function definition buffer");
+ break;
+ }
+ memcpy(ranFunctionDefinition->buf, &encBuf, encBufSize);
+ ret = ROK;
+ break;
}
- ranFuncItem->ranFunctionDefinition.size = encBufSize;
- DU_ALLOC(ranFuncItem->ranFunctionDefinition.buf, encBufSize);
- if(ranFuncItem->ranFunctionDefinition.buf == NULLP)
+ }
+ freeE2smKpmRanFunctionDefinition(ranFuncDefinition);
+ return ret;
+}
+
+/*******************************************************************
+ *
+ * @brief Builds Ran function add list based on the procedure code
+ *
+ * @details
+ *
+ * Function : BuildRanFunctionAddList
+ *
+ * Functionality: Building RAN addition addition list
+ * In case of ProcedureCodeE2_id_E2setup we add all the RAN Function list
+ * which is present in E2 database.
+ * In the case of other procedures, we just fill the RAN functions whose ID
+ * is contained in recvList
+ *
+ * @params[in]
+ * RAN Function list
+ * Procedure code
+ * Count of ran functions to be added in the list
+ * Received list of RAN functions
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ ******************************************************************/
+
+uint8_t BuildRanFunctionAddList(RANfunctions_List_t *ranFunctionsList, uint8_t procedureCode, uint8_t count, uint8_t *recvList)
+{
+ uint16_t id;
+ RanFunction *ranFuncDb;
+ uint8_t ranFuncIdx;
+ RANfunction_ItemIEs_t *ranFuncItemIe;
+
+ /* For ProcedureCodeE2_id_E2setup, the number of RAN function list items is
+ * equal to the number of ran function entries stored in the database.
+ * For any other procedure, the RAN function list count is equal
+ * to the count of ran functions obtained from the function's caller */
+
+ if(procedureCode == ProcedureCodeE2_id_E2setup)
+ ranFunctionsList->list.count = duCb.e2apDb.numOfRanFunction;
+ else
+ ranFunctionsList->list.count = count;
+
+ ranFunctionsList->list.size = ranFunctionsList->list.count * sizeof(RANfunction_ItemIEs_t*);
+ DU_ALLOC(ranFunctionsList->list.array, ranFunctionsList->list.size);
+ if(ranFunctionsList->list.array == NULLP)
+ {
+ DU_LOG("\nERROR --> E2AP: Memory allocation failed in %s at %d",__func__, __LINE__);
+ return RFAILED;
+ }
+
+ for(ranFuncIdx = 0; ranFuncIdx< ranFunctionsList->list.count; ranFuncIdx++)
+ {
+ DU_ALLOC(ranFunctionsList->list.array[ranFuncIdx], sizeof(RANfunction_ItemIEs_t));
+ if(ranFunctionsList->list.array[ranFuncIdx] == NULLP)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed for RAN function definition buffer");
+ DU_LOG("\nERROR --> E2AP: Memory allocation failed in %s at %d",__func__, __LINE__);
return RFAILED;
}
- memcpy(ranFuncItem->ranFunctionDefinition.buf, &encBuf, encBufSize);
+ if(procedureCode == ProcedureCodeE2_id_E2setup)
+ {
+ /* Getting all of the RAN function's information from DuCb one by one*/
+ ranFuncDb = &duCb.e2apDb.ranFunction[ranFuncIdx];
+ }
+ else
+ {
+ /* Getting only the RAN function information from DuCb whose Id is
+ * present in the received array */
+ id =recvList[ranFuncIdx];
+ ranFuncDb = &duCb.e2apDb.ranFunction[id-1];
+ }
+ ranFuncItemIe = (RANfunction_ItemIEs_t *) ranFunctionsList->list.array[ranFuncIdx];
+ ranFuncItemIe->id = ProtocolIE_IDE2_id_RANfunction_Item;
+ ranFuncItemIe->criticality = CriticalityE2_ignore;
+ ranFuncItemIe->value.present = RANfunction_ItemIEs__value_PR_RANfunction_Item;
+ BuildRanFunctionItem(&ranFuncItemIe->value.choice.RANfunction_Item, ranFuncDb);
}
- freeE2smKpmRanFunctionDefinition(ranFuncDefinition);
return ROK;
-}
+}
/*******************************************************************
*
e2SetupReq->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionsAdded;
e2SetupReq->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
e2SetupReq->protocolIEs.list.array[arrIdx]->value.present = E2setupRequestIEs__value_PR_RANfunctions_List;
- if(BuildRanFunctionAddList(&(e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List))!=ROK)
+ if(BuildRanFunctionAddList(&(e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List), ProcedureCodeE2_id_E2setup, 0, NULL)!=ROK)
{
DU_LOG("\nERROR --> E2AP : Failed to create RAN Function");
break;
break;
}while(true);
- duCb.e2apDb.e2TransInfo.onGoingTransaction[transId].transactionId = transId;
- duCb.e2apDb.e2TransInfo.onGoingTransaction[transId].procedureCode = e2apMsg->choice.initiatingMessage->procedureCode;
+ duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].transactionId = transId;
+ duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].procedureCode = e2apMsg->choice.initiatingMessage->procedureCode;
FreeE2SetupReq(e2apMsg);
return ret;
case ProtocolIE_IDE2_id_TransactionID:
{
transId = e2SetRspMsg->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
- if((duCb.e2apDb.e2TransInfo.onGoingTransaction[transId].transactionId == transId) &&\
- (duCb.e2apDb.e2TransInfo.onGoingTransaction[transId].procedureCode == e2apMsg->choice.successfulOutcome->procedureCode))
- memset(&duCb.e2apDb.e2TransInfo.onGoingTransaction[transId], 0, sizeof(E2TransInfo));
+ if((duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].transactionId == transId) &&\
+ (duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].procedureCode == e2apMsg->choice.successfulOutcome->procedureCode))
+ {
+ memset(&duCb.e2apDb.e2TransInfo.e2InitTransaction[transId], 0, sizeof(E2TransInfo));
+ }
else
{
DU_LOG("\nERROR --> E2AP : Invalid transaction id [%d]", transId);
/* In case the message is sent successfully, store the transaction info to
* be used when response is received */
- duCb.e2apDb.e2TransInfo.onGoingTransaction[transId].transactionId = transId;
- duCb.e2apDb.e2TransInfo.onGoingTransaction[transId].procedureCode = e2apMsg->choice.initiatingMessage->procedureCode;
+ duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].transactionId = transId;
+ duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].procedureCode = e2apMsg->choice.initiatingMessage->procedureCode;
ret = ROK;
break;
{
case ProtocolIE_IDE2_id_TransactionID:
transId = resetResponse->protocolIEs.list.array[ieIdx]->value.choice.TransactionID;
- if((duCb.e2apDb.e2TransInfo.onGoingTransaction[transId].transactionId == transId) && \
- (duCb.e2apDb.e2TransInfo.onGoingTransaction[transId].procedureCode == e2apMsg->choice.successfulOutcome->procedureCode))
- memset(&duCb.e2apDb.e2TransInfo.onGoingTransaction[transId], 0, sizeof(E2TransInfo));
+ if((duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].transactionId == transId) && \
+ (duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].procedureCode == e2apMsg->choice.successfulOutcome->procedureCode))
+ {
+ memset(&duCb.e2apDb.e2TransInfo.e2InitTransaction[transId], 0, sizeof(E2TransInfo));
+ }
else
{
DU_LOG("\nERROR --> E2AP : Invalid transaction id [%d]", transId);
case ProtocolIE_IDE2_id_TransactionID:
{
transId = e2SetupFailure->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
- if((duCb.e2apDb.e2TransInfo.onGoingTransaction[transId].transactionId == transId) &&\
- (duCb.e2apDb.e2TransInfo.onGoingTransaction[transId].procedureCode == e2apMsg->choice.unsuccessfulOutcome->procedureCode))
- memset(&duCb.e2apDb.e2TransInfo.onGoingTransaction[transId], 0, sizeof(E2TransInfo));
+ if((duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].transactionId == transId) &&\
+ (duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].procedureCode == e2apMsg->choice.unsuccessfulOutcome->procedureCode))
+ {
+ memset(&duCb.e2apDb.e2TransInfo.e2InitTransaction[transId], 0, sizeof(E2TransInfo));
+ }
else
{
DU_LOG("\nERROR --> E2AP : Invalid transaction id [%d]", transId);
case ProtocolIE_IDE2_id_TimeToWaitE2:
{
timerValue = covertE2WaitTimerEnumToValue(e2SetupFailure->protocolIEs.list.array[arrIdx]->value.choice.TimeToWaitE2);
- if((duChkTmr((PTR)&(duCb.e2apDb), EVENT_E2_SETUP_TMR)) == FALSE)
+ if((duChkTmr((PTR)&(duCb.e2apDb.e2TimersInfo.e2Timers.e2SetupTimer), EVENT_E2_SETUP_TMR)) == FALSE)
{
- duStartTmr((PTR)&(duCb.e2apDb), EVENT_E2_SETUP_TMR, timerValue);
+ duStartTmr((PTR)&(duCb.e2apDb.e2TimersInfo.e2Timers.e2SetupTimer), EVENT_E2_SETUP_TMR, timerValue);
}
else
{