X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Fcu_stub%2Fcu_f1ap_msg_hdl.c;h=009f0a1ecd8e43aea95b963c574f6f1daf6a8d2b;hb=154ac5a3676b120c741184f7e58627df8003b5c0;hp=c5f5866424963daf3fd82d6d69b96cc5009c055c;hpb=ab583728b1581b9d4d9536fdfc3fd34b6596781f;p=o-du%2Fl2.git diff --git a/src/cu_stub/cu_f1ap_msg_hdl.c b/src/cu_stub/cu_f1ap_msg_hdl.c index c5f586642..009f0a1ec 100644 --- a/src/cu_stub/cu_f1ap_msg_hdl.c +++ b/src/cu_stub/cu_f1ap_msg_hdl.c @@ -87,6 +87,7 @@ #include "DLUPTNLInformation-ToBeSetup-Item.h" #include "UPTransportLayerInformation.h" #include "GTPTunnel.h" +#include "QoSInformation.h" /* MACRO for CUtoDURRCInformation */ #define CELL_GRP_ID 1 @@ -119,8 +120,8 @@ #define PDSCH_MAPPING_TYPE_B 1 /* MACRO Define for PUSCH Configuration */ -#define PUSCH_K2_CFG1 3 -#define PUSCH_K2_CFG2 4 +#define PUSCH_K2_CFG1 1 +#define PUSCH_K2_CFG2 2 #define PUSCH_MSG3_DELTA_PREAMBLE 0 #define PUSCH_P0_NOMINAL_WITH_GRANT -70 @@ -179,7 +180,11 @@ #define SCRAMBLING_ID NR_PCI #define DMRS_ADDITIONAL_POS 0 /* DMRS Additional poistion */ #define RES_ALLOC_TYPE 1 /* Resource allocation type */ -#define FIVE_QI_VALUE 9 /*spec 23.501, Table 5.7.4-1*/ +#define FIVE_QI_VALUE9 9 /*spec 23.501, Table 5.7.4-1*/ +#define FIVE_QI_VALUE8 8 /*spec 23.501, Table 5.7.4-1*/ +#define PDU_SESSION_ID_1 1 +#define PDU_SESSION_ID_2 2 +#define INVALID_PDU_SESSION_ID -1 /******************************************************************* * @@ -1808,7 +1813,7 @@ uint8_t procInitULRRCMsg(F1AP_PDU_t *f1apMsg) uint8_t idx, rrcMsgType, gnbDuUeF1apId; uint8_t ret =ROK; InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP; - DU_LOG("\nINFO --> F1AP : filling the required values in DB in procInitULRRCMsg"); + DU_LOG("\nINFO --> F1AP : filling the required values in DB in procInitULRRCMsg"); initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer; @@ -2027,13 +2032,18 @@ uint8_t BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet) * Functionality: Constructs the QOS Info for DRB Setup Item * * @params[in] QoSInformation_t *qosinfo + * int16_t pduSessionID * * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos) +uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos, uint8_t actionType, \ + int16_t pduSessionID) { + uint8_t elementCnt = 0, qosCntIdx = 0; + ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP; + /* NonDynamic5QIDescriptor */ drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI; CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t)); @@ -2042,21 +2052,25 @@ uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos) return RFAILED; } /*FiveQI*/ - drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE; + if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item) + drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE8; + else + drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE9; + /*AveragingWindow*/ CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\ - sizeof(AveragingWindow_t)); + sizeof(AveragingWindow_t)); if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \ - NULLP) + NULLP) { return RFAILED; } *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0; /*MaxDataBurstVolume*/ CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\ - sizeof(MaxDataBurstVolume_t)); + sizeof(MaxDataBurstVolume_t)); if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \ - NULLP) + NULLP) { return RFAILED; } @@ -2067,6 +2081,54 @@ uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos) drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption; drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable; + /*If PDU Session ID is INVALID thus not to be included in Qos IE, skip the PDU Session IE */ + if(pduSessionID <= INVALID_PDU_SESSION_ID) + { + DU_LOG("\nINFO --> F1AP : Invalid PDU_SESSION_ID"); + return ROK; + } + + CU_ALLOC(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t)); + qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions; + + if(qosIeExt) + { + elementCnt = NUM_QOS_EXT; + qosIeExt->list.count = elementCnt; + qosIeExt->list.size = elementCnt * sizeof(QoSFlowLevelQoSParameters_ExtIEs_t *); + + /*Initialize QoSFlowLevelQoSParameters_ExtIEs_t*/ + CU_ALLOC(qosIeExt->list.array, qosIeExt->list.size); + + if(qosIeExt->list.array == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t failed"); + return RFAILED; + } + + for(qosCntIdx=0; qosCntIdx < elementCnt; qosCntIdx++) + { + CU_ALLOC(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t)); + if(qosIeExt->list.array[qosCntIdx] == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t array failed"); + return RFAILED; + } + /*Filling QoSFlowLevelQoSParameters_ExtIEs_t*/ + qosIeExt->list.array[qosCntIdx]->id = ProtocolIE_ID_id_PDUSessionID; + /*Below Criticality mentioned in Spec38.473, 15.4.1 and later*/ + qosIeExt->list.array[qosCntIdx]->criticality = Criticality_ignore; + qosIeExt->list.array[qosCntIdx]->extensionValue.present = \ + QoSFlowLevelQoSParameters_ExtIEs__extensionValue_PR_PDUSessionID; + qosIeExt->list.array[qosCntIdx]->extensionValue.choice.PDUSessionID = (PDUSessionID_t)pduSessionID; + } + } + else + { + DU_LOG("\nERROR --> F1AP : Memory allocation for QosIE_extension failed"); + return RFAILED; + } + return ROK; }/*End of BuildQOSInfo*/ @@ -2081,12 +2143,13 @@ uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos) * Functionality: Constructs the SNSSAI For DRB list * * @params[in] SNSSAI_t *snssai + * Snssai *snssaiToCopy S-NSSAI from CuCfgParam to be copied * * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t BuildSNSSAI(SNSSAI_t *snssai) +uint8_t BuildSNSSAI(SNSSAI_t *snssai, Snssai *snssaiToCopy) { /*SNSSAI*/ /*ssT*/ @@ -2096,7 +2159,7 @@ uint8_t BuildSNSSAI(SNSSAI_t *snssai) { return RFAILED; } - snssai->sST.buf[0] = 3; + memcpy(snssai->sST.buf, &snssaiToCopy->sst, snssai->sST.size); /*sD*/ CU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t)); if(snssai->sD == NULLP) @@ -2109,9 +2172,7 @@ uint8_t BuildSNSSAI(SNSSAI_t *snssai) { return RFAILED; } - snssai->sD->buf[0] = 3; - snssai->sD->buf[1] = 6; - snssai->sD->buf[2] = 9; + memcpy(snssai->sD->buf, snssaiToCopy->sd, snssai->sD->size); return ROK; }/*End of BuildSNSSAI*/ @@ -2131,17 +2192,17 @@ uint8_t BuildSNSSAI(SNSSAI_t *snssai) * RFAILED - failure * * ****************************************************************/ -uint8_t BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap) +uint8_t BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap , uint8_t actionType) { - uint8_t ret; - uint8_t idx; - uint8_t flowCnt; + uint8_t ret = ROK, idx = 0, flowCnt = 0; + flowCnt = 1; flowMap->list.count = flowCnt; flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *); CU_ALLOC(flowMap->list.array,flowMap->list.size); if(flowMap->list.array == NULLP) { + DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildFlowsMap()"); return RFAILED; } for(idx=0; idxlist.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t)); if(flowMap->list.array[idx] == NULLP) { - return RFAILED; + DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx[%d] in BuildFlowsMap()", idx); + return RFAILED; } } idx = 0; flowMap->list.array[idx]->qoSFlowIdentifier = 0; - ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters); + ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters,\ + actionType, INVALID_PDU_SESSION_ID); if(ret != ROK) { + DU_LOG("\nERROR --> F1AP : Failed to Build QOS Info in BuildFlowsMap()"); return RFAILED; } return ROK; @@ -2187,7 +2251,8 @@ uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo) ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *); CU_ALLOC(ulInfo->list.array,ulInfo->list.size); if(ulInfo->list.array == NULLP) - { + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed for array in BuildULTnlInfo()"); return RFAILED; } for(idx=0; idxlist.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t)); if(ulInfo->list.array[idx] == NULLP) { - return RFAILED; + DU_LOG("\nERROR --> F1AP : Memory allocation failed for arrayIdx [%d] in BuildULTnlInfo()", idx); + return RFAILED; } } idx = 0; @@ -2206,6 +2272,7 @@ uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo) sizeof(GTPTunnel_t)); if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP) { + DU_LOG("\nERROR --> F1AP : Memory allocation failed for gTPTunnel in BuildULTnlInfo()"); return RFAILED; } ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\ @@ -2216,6 +2283,7 @@ uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo) if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\ transportLayerAddress.buf == NULLP) { + DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel arrayIdx[%d] in BuildULTnlInfo()", idx); return RFAILED; } /* NOTE: Below IP address must be changed if running on different IP configuration */ @@ -2238,6 +2306,7 @@ uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo) if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\ == NULLP) { + DU_LOG("\nERROR --> F1AP : Memory allocation failed for gtp tunnel buffer in BuildULTnlInfo()"); return RFAILED; } ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\ @@ -2274,12 +2343,13 @@ uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet) uint8_t BuildFlowsMapret =0, BuildULTnlInforet =0, drbCnt = 0; DRBs_ToBeSetup_Item_t *drbSetItem; - drbCnt = MAX_DRB_SET; + drbCnt = MAX_DRB_SET_UE_CONTEXT_SETUP_REQ; drbSet->list.count = drbCnt; drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *); CU_ALLOC(drbSet->list.array,drbSet->list.size); if(drbSet->list.array == NULLP) { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup"); return RFAILED; } for(idx=0; idxlist.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t)); if(drbSet->list.array[idx] == NULLP) { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDRBSetup for arry idx [%d]", idx); return RFAILED; } @@ -2302,6 +2373,7 @@ uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet) CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t)); if(drbSetItem->qoSInformation.choice.choice_extension == NULLP) { + DU_LOG("\nERROR --> F1AP : Memory allocation failed for QOS choice extension in BuildDRBSetup"); return RFAILED; } drbSetItem->qoSInformation.choice.choice_extension->id = \ @@ -2311,41 +2383,39 @@ uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet) drbSetItem->qoSInformation.choice.choice_extension->value.present = \ QoSInformation_ExtIEs__value_PR_DRB_Information; BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\ - choice_extension->value.choice.DRB_Information.dRB_QoS); + choice_extension->value.choice.DRB_Information.dRB_QoS,\ + ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1); if(BuildQOSInforet != ROK) { + DU_LOG("\nERROR --> F1AP : Failed to build QOS Info in BuildDRBSetup"); return RFAILED; } /*SNSSAI*/ BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\ - choice_extension->value.choice.DRB_Information.sNSSAI); + choice_extension->value.choice.DRB_Information.sNSSAI, cuCfgParams.snssaiList[0]); if(BuildSNSSAIret != ROK) { + DU_LOG("\nERROR --> F1AP : Failed to build SNSSAI Info in BuildDRBSetup"); return RFAILED; } /*Flows mapped to DRB List*/ BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\ - choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List); + choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\ + ProtocolIE_ID_id_DRBs_ToBeSetup_Item); if(BuildFlowsMapret != ROK) { + DU_LOG("\nERROR --> F1AP : Failed to build Flow Map Info in BuildDRBSetup"); return RFAILED; } /*ULUPTNLInformation To Be Setup List*/ BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List); if(BuildULTnlInforet != ROK) { + DU_LOG("\nERROR --> F1AP : Failed to build tunnel Info in BuildDRBSetup"); return RFAILED; } /*RLCMode*/ drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional; - - /*UL Configuration*/ - CU_ALLOC(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t)); - if(drbSetItem->uLConfiguration == NULLP) - { - return RFAILED; - } - drbSetItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data; } return ROK; }/* End of BuildDRBSetup*/ @@ -2459,20 +2529,40 @@ void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet) * ****************************************************************/ void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos) { + ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP; + uint8_t qosCntIdx = 0; + if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP) { if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP) { - if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP) - { - CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\ - sizeof(MaxDataBurstVolume_t)); - } - CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\ - sizeof(AveragingWindow_t)); + if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP) + { + CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\ + sizeof(MaxDataBurstVolume_t)); + } + CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\ + sizeof(AveragingWindow_t)); } CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\ - sizeof(NonDynamic5QIDescriptor_t)); + sizeof(NonDynamic5QIDescriptor_t)); + } + if(drbQos->iE_Extensions) + { + qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions; + if(qosIeExt->list.array != NULLP) + { + for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++) + { + if(qosIeExt->list.array[qosCntIdx]) + { + CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t)); + } + } + CU_FREE(qosIeExt->list.array, qosIeExt->list.size); + } + + CU_FREE(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t)); } } /******************************************************************* @@ -2546,9 +2636,12 @@ void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo) void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet) { DRBs_ToBeSetup_Item_t *drbSetItem; - uint8_t flowidx; - uint8_t drbidx; - if(drbSet->list.array == NULLP) + ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP; + + uint8_t flowidx = 0, drbidx = 0, qosCntIdx = 0; + + /*BUG: Need to check drbSet->list.array is not Empty to procced with Deletion*/ + if(drbSet->list.array != NULLP) { for(drbidx=0; drbidxlist.count; drbidx++) { @@ -2639,6 +2732,26 @@ void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet) CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\ qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t)); } + if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\ + iE_Extensions != NULLP) + { + qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbSetItem->qoSInformation.choice.\ + choice_extension->value.choice.DRB_Information.dRB_QoS.iE_Extensions; + if(qosIeExt->list.array != NULLP) + { + for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++) + { + if(qosIeExt->list.array[qosCntIdx] != NULLP) + { + CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t)); + } + } + CU_FREE(qosIeExt->list.array, qosIeExt->list.size); + } + CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\ + iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t)); + } + CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t)); } CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t)); @@ -2674,62 +2787,63 @@ void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg) { if(f1apMsg->choice.initiatingMessage != NULLP) { - ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest; - if(ueSetReq->protocolIEs.list.array != NULLP) - { - for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++) - { - if(ueSetReq->protocolIEs.list.array[idx]) - { - switch(ueSetReq->protocolIEs.list.array[idx]->id) - { - case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID: - break; - case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID: - break; - case ProtocolIE_ID_id_SpCell_ID: - FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI); - break; - case ProtocolIE_ID_id_ServCellIndex: - break; - case ProtocolIE_ID_id_SpCellULConfigured: - break; - case ProtocolIE_ID_id_CUtoDURRCInformation: - FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation); - break; - case ProtocolIE_ID_id_SCell_ToBeSetup_List: - FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List); - break; - case ProtocolIE_ID_id_SRBs_ToBeSetup_List: - FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List); - break; - case ProtocolIE_ID_id_DRBs_ToBeSetup_List: - FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List); - break; - case ProtocolIE_ID_id_RRCContainer: - if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP) - { - CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \ - ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size); - } - break; - default: - DU_LOG("\nERROR --> F1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id); - } - } - break; - } - for(ieId=0; ieIdprotocolIEs.list.array[ieId] != NULLP) - { - CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t)); - } - } - CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size); - } - CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t)); - } + ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest; + if(ueSetReq->protocolIEs.list.array != NULLP) + { + for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++) + { + if(ueSetReq->protocolIEs.list.array[idx]) + { + switch(ueSetReq->protocolIEs.list.array[idx]->id) + { + case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID: + break; + case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID: + break; + case ProtocolIE_ID_id_SpCell_ID: + FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI); + break; + case ProtocolIE_ID_id_ServCellIndex: + break; + case ProtocolIE_ID_id_SpCellULConfigured: + break; + case ProtocolIE_ID_id_CUtoDURRCInformation: + FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation); + break; + case ProtocolIE_ID_id_SCell_ToBeSetup_List: + FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List); + break; + case ProtocolIE_ID_id_SRBs_ToBeSetup_List: + FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List); + break; + case ProtocolIE_ID_id_DRBs_ToBeSetup_List: + FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List); + break; + case ProtocolIE_ID_id_RRCContainer: + if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP) + { + CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \ + ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size); + } + break; + default: + DU_LOG("\nERROR --> F1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id); + break; + } + } + /*BUG: Break is causing to exit the for Loop before complete traversing and freeing of each IE*/ + } + for(ieId=0; ieIdprotocolIEs.list.array[ieId] != NULLP) + { + CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t)); + } + } + CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size); + } + CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t)); + } CU_FREE(f1apMsg, sizeof(F1AP_PDU_t)); } } @@ -2814,7 +2928,7 @@ void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg) coreset1StartPrb = coreset0EndPrb + 6; coreset1NumPrb = CORESET1_NUM_PRB; /* calculate the PRBs */ - freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource); + fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource); memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE); controlRSet->frequencyDomainResources.bits_unused = bitsUnused; @@ -3740,8 +3854,8 @@ uint8_t BuildBWPUlDedPucchCfg(PUCCH_Config_t *pucchCfg) } arrIdx = 0; - *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx++]) = 1; - *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx]) = 2; + *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx++]) = 4; + *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx]) = 5; return ROK; } @@ -7027,13 +7141,52 @@ void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo) CU_FREE(ulInfo->list.array,ulInfo->list.size); } } + +/******************************************************************* +* +* @brief Deletes the EGTP tunnel +* +* @details +* +* Function : deleteEgtpTunnel +* +* Functionality: Deletes the EGTP tunnel +* +* @params[in] uint8_t *buf +* +* @return ROK - success +* RFAILED - failure +* +* ****************************************************************/ +uint8_t deleteEgtpTunnel(uint8_t *buf) +{ + uint32_t teId = 0; + EgtpTnlEvt tnlEvt; + + teIdStringToInt(buf, &teId); + if(teId > MAX_TEID || teId < MIN_TEID) + { + DU_LOG("\nERROR --> EGTP : TEID(%d) OUT Of Range", teId); + return RFAILED; + } + memset(&tnlEvt, 0, sizeof(EgtpTnlEvt)); + tnlEvt.action = EGTP_TNL_MGMT_DEL; + tnlEvt.lclTeid = teId; + tnlEvt.remTeid = teId; + if((cuEgtpTnlMgmtReq(tnlEvt)) != ROK) + { + DU_LOG("\nERROR --> EGTP : Failed to delete tunnel Id %d", teId); + } + return ROK; +} + /******************************************************************* * * @brief Builds the Uplink Tunnel Info * * @details * -* Function : BuildUlTnlInfoforDrb2 +* Function : BuildUlTnlInfoforSetupMod * * Functionality: Constructs the UL TnlInfo For DRB list * @@ -7043,7 +7196,7 @@ void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo) * RFAILED - failure * * ****************************************************************/ -uint8_t BuildUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo) +uint8_t BuildUlTnlInfoforSetupMod(uint8_t ueId, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, uint8_t actionType) { uint8_t arrIdx; uint8_t ulCnt; @@ -7054,7 +7207,7 @@ uint8_t BuildUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo) CU_ALLOC(ulInfo->list.array,ulInfo->list.size); if(ulInfo->list.array == NULLP) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod"); return RFAILED; } for(arrIdx=0; arrIdxlist.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t)); if(ulInfo->list.array[arrIdx] == NULLP) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod"); return RFAILED; } } @@ -7076,7 +7229,7 @@ uint8_t BuildUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo) sizeof(GTPTunnel_t)); if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel == NULLP) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod"); return RFAILED; } ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\ @@ -7087,7 +7240,7 @@ uint8_t BuildUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo) if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\ transportLayerAddress.buf == NULLP) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod"); return RFAILED; } @@ -7111,7 +7264,7 @@ uint8_t BuildUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo) if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\ == NULLP) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod"); return RFAILED; } ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\ @@ -7120,20 +7273,44 @@ uint8_t BuildUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo) gTP_TEID.buf[1] = 0; ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\ gTP_TEID.buf[2] = 0; - ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\ - gTP_TEID.buf[3] = cuCfgParams.egtpParams.currTunnelId++; + if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item) + { + /*TODO: DRB context to be stored in CU STUB so that tunnel Id can be easily + * fetched based on the Drb Id */ + if(ueId == 1) + { + /* Tunnel Id for DRB 2 of UE 1 is 2. Hence passing the same TeId */ + ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = 2; + } + else if(ueId == 2) + { + /* Tunnel Id for DRB 2 of UE 2 is 5. Hence passing the same TeId */ + ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = 5; + } + else if(ueId == 3) + { + /* Tunnel Id for DRB 2 of UE 3 is 8. Hence passing the same TeId */ + ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = 8; + } + } + else + { + ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\ + gTP_TEID.buf[3] = cuCfgParams.egtpParams.currTunnelId++; + } return ROK; }/*End of BuildULTnlInfo*/ + /******************************************************************* * -* @brief freeing the DRB 2 item +* @brief freeing the DRB item * * @details * -* Function : FreeDrb2Item +* Function : FreeDrbItem * -* Functionality: freeing the DRB 2 item +* Functionality: freeing the DRB item * * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem * @@ -7142,7 +7319,7 @@ uint8_t BuildUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo) * * ****************************************************************/ -void FreeDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem) +void FreeDrbItem(DRBs_ToBeSetupMod_Item_t *drbItem) { uint8_t arrIdx =0; SNSSAI_t *snssai =NULLP; @@ -7207,16 +7384,18 @@ void FreeDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem) CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t)); } } + /******************************************************************* * -* @brief filling the DRB 2 item +* @brief filling the DRB setup Mod item * * @details * -* Function : FillDrb2Item -* -* Functionality: filling the DRB 2 item +* Function : FillDrbItemToSetupMod * +* Functionality: filling the DRB setup Mod item +* +* * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem * * @return ROK - success @@ -7224,12 +7403,12 @@ void FreeDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem) * * ****************************************************************/ -uint8_t FillDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem) +uint8_t FillDrbItemToSetupMod(uint8_t ueId, uint8_t arrIdx, DRBs_ToBeSetupMod_Item_t *drbItem) { uint8_t ret = ROK; /*Drb Id */ - drbItem->dRBID = DRB2; + drbItem->dRBID = arrIdx + DRB3; /*qoSInformation*/ drbItem->qoSInformation.present = QoSInformation_PR_choice_extension; @@ -7246,7 +7425,7 @@ uint8_t FillDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem) CU_ALLOC(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t)); if(drbItem->qoSInformation.choice.eUTRANQoS) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrb2Item"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod"); return RFAILED; } drbItem->qoSInformation.choice.eUTRANQoS->qCI = QCI; @@ -7266,14 +7445,15 @@ uint8_t FillDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem) CU_ALLOC(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t)); if(drbItem->qoSInformation.choice.choice_extension == NULLP) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrb2Item"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod"); return RFAILED; } drbItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information; drbItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore; drbItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information; - ret = BuildQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS); + ret = BuildQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\ + ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, PDU_SESSION_ID_2); if(ret != ROK) { DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed"); @@ -7282,7 +7462,7 @@ uint8_t FillDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem) /*SNSSAI*/ ret = BuildSNSSAI(&drbItem->qoSInformation.choice.\ - choice_extension->value.choice.DRB_Information.sNSSAI); + choice_extension->value.choice.DRB_Information.sNSSAI, cuCfgParams.snssaiList[1]); if(ret != ROK) { DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed"); @@ -7291,7 +7471,8 @@ uint8_t FillDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem) /*Flows mapped to DRB List*/ ret = BuildFlowsMap(&drbItem->qoSInformation.choice.\ - choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List); + choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\ + ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item); if(ret != ROK) { DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed"); @@ -7301,26 +7482,19 @@ uint8_t FillDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem) } /*ULUPTNLInformation To Be Setup List*/ - ret = BuildUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List); + ret = BuildUlTnlInfoforSetupMod(ueId, &drbItem->uLUPTNLInformation_ToBeSetup_List, \ + ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item); if(ret != ROK) { - DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforDrb2 failed"); + DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed"); return RFAILED; } /*RLCMode*/ drbItem->rLCMode = RLCMode_rlc_um_bidirectional; - - /*UL Configuration*/ - CU_ALLOC(drbItem->uLConfiguration,sizeof(ULConfiguration_t)); - if(drbItem->uLConfiguration == NULLP) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrb2Item"); - return RFAILED; - } - drbItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data; return ROK; } + /******************************************************************* * * @brief Builds the DRB to be Setup Mod ItemIes @@ -7338,15 +7512,15 @@ uint8_t FillDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem) * * ****************************************************************/ -uint8_t FillDrbItemList(struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe) +uint8_t FillDrbItemList(uint8_t ueId, uint8_t arrIdx, struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe) { drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item; drbItemIe->criticality = Criticality_reject; drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item; - if(FillDrb2Item(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item)) != ROK) + if(FillDrbItemToSetupMod(ueId, arrIdx, (&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item))) != ROK) { - DU_LOG("\nERROR --> F1AP : FillDrb2Item failed"); + DU_LOG("\nERROR --> F1AP : FillDrbItemToSetupMod failed"); return RFAILED; } return ROK; @@ -7381,7 +7555,7 @@ void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet) if(arrIdx == 0) { drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]; - FreeDrb2Item(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item)); + FreeDrbItem(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item)); } CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t)); } @@ -7391,14 +7565,13 @@ void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet) } - /******************************************************************* * * @brief Builds the DRB to be Setup Mod list * * @details * -* Function : BuildDrbToBeSetupModList +* Function : BuildDrbToBeSetupList * * Functionality: Constructs the DRB to be Setup Mod list * @@ -7409,33 +7582,34 @@ void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet) * * ****************************************************************/ -uint8_t BuildDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet) +uint8_t BuildDrbToBeSetupList(uint8_t ueId, DRBs_ToBeSetupMod_List_t *drbSet) { uint8_t ret = ROK; uint8_t arrIdx =0; uint8_t drbCnt =0; - drbCnt = 1; + drbCnt = MAX_DRB_SET_UE_CONTEXT_MOD_REQ; drbSet->list.count = drbCnt; drbSet->list.size = drbCnt * sizeof(DRBs_ToBeSetupMod_ItemIEs_t *); CU_ALLOC(drbSet->list.array, drbSet->list.size); if(drbSet->list.array == NULLP) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupModList"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList"); return RFAILED; } + for(arrIdx=0; arrIdxlist.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t)); if(drbSet->list.array[arrIdx] == NULLP) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupModList"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList for array idx [%d]", arrIdx); return RFAILED; } } - arrIdx=0; - ret = FillDrbItemList((DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]); + arrIdx = 0; + ret = FillDrbItemList(ueId, arrIdx, (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]); if(ret != ROK) { DU_LOG("\nERROR --> F1AP : FillDrbItemList failed"); @@ -7443,122 +7617,445 @@ uint8_t BuildDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet) return ret; } + /******************************************************************* - * - * @brief free the UeContextModification Request - * - * @details - * - * Function : FreeUeContextModicationRequest - * - * Functionality : deallocation of memory allocated in UeContextModiification - request - * - * @params[in] F1AP_PDU_t *f1apMsg - * - * @return void +* +* @brief Filling the DRB to be modified item +* +* @details +* +* Function : FillDrbToBeModItem +* +* Functionality: filling the DRB to be modified item +* +* @params[in] DRBs_ToBeModified_Item_t *drbItem +* +* @return ROK - success +* RFAILED - failure * * ****************************************************************/ -void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg) -{ - uint8_t arrIdx =0 , ieId=0; - UEContextModificationRequest_t *UeContextModifyReq = NULLP; - if(f1apMsg) - { - if(f1apMsg->choice.initiatingMessage) - { - UeContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest; - if(UeContextModifyReq->protocolIEs.list.array) - { - for( arrIdx = 0 ; arrIdxprotocolIEs.list.count ; arrIdx++) - { - if(UeContextModifyReq->protocolIEs.list.array[arrIdx]) - { - ieId = UeContextModifyReq->protocolIEs.list.array[arrIdx]->id; - switch(ieId) - { - case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID: - break; - case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID: - break; - case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List: - { - FreeDrbToBeSetupModList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->value.\ - choice.DRBs_ToBeSetupMod_List); - break; - } - } - CU_FREE(UeContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t)); - } - } - CU_FREE(UeContextModifyReq->protocolIEs.list.array, UeContextModifyReq->protocolIEs.list.size); - } - CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t)); - } - CU_FREE(f1apMsg, sizeof(F1AP_PDU_t)); - } -} -/******************************************************************* - * - * @brief Builds the Ue Context Modification Req - * - * @details - * - * Function : BuildAndSendUeContextModificationReq - * - * Functionality: Constructs the Ue Context Modification Req - * - * @params[in] - * - * @return ROK - success - * RFAILED - failure - * - * ****************************************************************/ -uint8_t BuildAndSendUeContextModificationReq(uint8_t ueId) +uint8_t FillDrbToBeModItem(uint8_t ueId, DRBs_ToBeModified_Item_t *drbItem) { - uint8_t ieIdx = 0; - uint8_t elementCnt = 0; - uint8_t ret = RFAILED; - F1AP_PDU_t *f1apMsg = NULLP; - UEContextModificationRequest_t *ueContextModifyReq = NULLP; + uint8_t ret = ROK; - asn_enc_rval_t encRetVal; - DU_LOG("\nINFO --> F1AP : Building Ue context modification request\n"); + /*Drb Id */ + drbItem->dRBID = DRB2; - while(1) + /*qoSInformation*/ + drbItem->qoSInformation = NULLP; + CU_ALLOC(drbItem->qoSInformation, sizeof(QoSInformation_t)); + if(drbItem->qoSInformation != NULLP) { - CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t)); - if(f1apMsg == NULLP) + drbItem->qoSInformation->present = QoSInformation_PR_choice_extension; + + switch(drbItem->qoSInformation->present) { - DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification"); - break; - } + case QoSInformation_PR_NOTHING: + { + break; + } + case QoSInformation_PR_eUTRANQoS: + { - f1apMsg->present = F1AP_PDU_PR_initiatingMessage; + CU_ALLOC(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t)); + if(drbItem->qoSInformation->choice.eUTRANQoS) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbToBeModItem"); + return RFAILED; + } + drbItem->qoSInformation->choice.eUTRANQoS->qCI = QCI; + drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel = + PriorityLevel_no_priority; - CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t)); - if(f1apMsg->choice.initiatingMessage == NULLP) - { - DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification"); - break; - } - f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification; - f1apMsg->choice.initiatingMessage->criticality = Criticality_reject; - f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest; + drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability = + Pre_emptionCapability_may_trigger_pre_emption; - ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest; + drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability = + Pre_emptionVulnerability_pre_emptable; - elementCnt = 3; - ueContextModifyReq->protocolIEs.list.count = elementCnt; - ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *); + break; + } + case QoSInformation_PR_choice_extension: + { + CU_ALLOC(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t)); + if(drbItem->qoSInformation->choice.choice_extension == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in FillDrbItemToSetupMod"); + return RFAILED; + } - /* Initialize the UE context modification members */ - CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size); - if(ueContextModifyReq->protocolIEs.list.array == NULLP) - { - DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed"); - break; + drbItem->qoSInformation->choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information; + drbItem->qoSInformation->choice.choice_extension->criticality = Criticality_ignore; + drbItem->qoSInformation->choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information; + ret = BuildQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\ + ProtocolIE_ID_id_DRBs_ToBeModified_Item, INVALID_PDU_SESSION_ID); + if(ret != ROK) + { + DU_LOG("\nERROR --> F1AP : BuildQOSInfo failed"); + return RFAILED; + } + + /*SNSSAI*/ + ret = BuildSNSSAI(&drbItem->qoSInformation->choice.\ + choice_extension->value.choice.DRB_Information.sNSSAI,cuCfgParams.snssaiList[0]); + if(ret != ROK) + { + DU_LOG("\nERROR --> F1AP : BuildSNSSAI failed"); + return RFAILED; + } + + /*Flows mapped to DRB List*/ + ret = BuildFlowsMap(&drbItem->qoSInformation->choice.\ + choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\ + ProtocolIE_ID_id_DRBs_ToBeModified_Item); + if(ret != ROK) + { + DU_LOG("\nERROR --> F1AP : BuildFlowsMap failed"); + return RFAILED; + } + } + } + }/* End of QoS */ + + /*ULUPTNLInformation To Be Setup List*/ + ret = BuildUlTnlInfoforSetupMod(ueId, &drbItem->uLUPTNLInformation_ToBeSetup_List,\ + ProtocolIE_ID_id_DRBs_ToBeModified_Item); + if(ret != ROK) + { + DU_LOG("\nERROR --> F1AP : BuildUlTnlInfoforSetupMod failed"); + return RFAILED; + } + return ROK; +} + +/******************************************************************* +* +* @brief Builds the DRB to be modified Item IE +* +* @details +* +* Function : FillDrbToBeModItemList +* +* Functionality: Constructs the DRB to be modified Mod Item Ies +* +* @params[in] struct DRBs_ToBeModified_ItemIEs *drbItemIe +* +* @return ROK - success +* RFAILED - failure +* +* ****************************************************************/ + +uint8_t FillDrbToBeModItemList(uint8_t ueId, struct DRBs_ToBeModified_ItemIEs *drbItemIe) +{ + drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeModified_Item; + drbItemIe->criticality = Criticality_reject; + drbItemIe->value.present = DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item; + if(FillDrbToBeModItem(ueId, &(drbItemIe->value.choice.DRBs_ToBeModified_Item)) != ROK) + { + DU_LOG("\nERROR --> F1AP : FillDrbToBeModItem failed"); + return RFAILED; + } + + return ROK; +} + +/******************************************************************* +* +* @brief Builds the DRB to be modified list +* +* @details +* +* Function : BuildDrbToBeModList +* +* Functionality: Constructs the DRB to be modified list +* +* @params[in] DRBs_ToBeModified_List_t *drbSet +* +* @return ROK - success +* RFAILED - failure +* +* ****************************************************************/ + +uint8_t BuildDrbToBeModifiedList(uint8_t ueId, DRBs_ToBeModified_List_t *drbSet) +{ + uint8_t ret = ROK; + uint8_t arrIdx =0; + uint8_t drbCnt =0; + + drbCnt = 1; + drbSet->list.count = drbCnt; + drbSet->list.size = drbCnt * sizeof(DRBs_ToBeModified_ItemIEs_t *); + CU_ALLOC(drbSet->list.array, drbSet->list.size); + if(drbSet->list.array == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeModifiedList"); + return RFAILED; + } + for(arrIdx=0; arrIdxlist.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t)); + if(drbSet->list.array[arrIdx] == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupList"); + return RFAILED; + } + } + + arrIdx=0; + ret = FillDrbToBeModItemList(ueId, (DRBs_ToBeModified_ItemIEs_t *)drbSet->list.array[arrIdx]); + if(ret != ROK) + { + DU_LOG("\nERROR --> F1AP : FillDrbToBeModItemList failed"); + } + + return ret; +} + +/******************************************************************* +* +* @brief freeing the DRB item +* +* @details +* +* Function : FreeModifiedDrbItem +* +* Functionality: freeing the DRB 2 item +* +* @params[in] DRBs_ToBeSetupMod_Item_t *drbItem +* +* @return ROK - success +* RFAILED - failure +* +* ****************************************************************/ + +void FreeModifiedDrbItem(DRBs_ToBeModified_Item_t *drbItem) +{ + uint8_t arrIdx =0; + SNSSAI_t *snssai =NULLP; + Flows_Mapped_To_DRB_List_t *flowMap = NULLP; + + if(drbItem->qoSInformation != NULLP) + { + switch(drbItem->qoSInformation->present) + { + case QoSInformation_PR_NOTHING: + break; + case QoSInformation_PR_eUTRANQoS: + { + if(drbItem->qoSInformation->choice.eUTRANQoS) + { + CU_FREE(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t)); + } + break; + } + case QoSInformation_PR_choice_extension: + { + if(drbItem->qoSInformation->choice.choice_extension) + { + FreeQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS); + + snssai = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.sNSSAI; + if(snssai->sST.buf) + { + CU_FREE(snssai->sST.buf,snssai->sST.size); + } + if(snssai->sD) + { + if(snssai->sD->buf) + { + CU_FREE(snssai->sD->buf,snssai->sD->size); + } + CU_FREE(snssai->sD,sizeof(OCTET_STRING_t)); + } + + flowMap = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List; + if(flowMap->list.array) + { + for(arrIdx=0; arrIdxlist.count; arrIdx++) + { + if(flowMap->list.array[arrIdx] ) + { + FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters); + CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t)); + } + } + CU_FREE(flowMap->list.array,flowMap->list.size); + } + + CU_FREE(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t)); + } + break; + } + } + } + FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List); + if(drbItem->uLConfiguration) + { + CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t)); + } +} + +/******************************************************************* +* +* @brief free the DRB to be modfified list +* +* @details +* +* Function : FreeDrbToBeModifiedList +* +* Functionality: free the DRB to be Setup Mod list +* +* @params[in] FreeDrbToBeModifiedList_t *drbSet +* +* @return ROK - success +* RFAILED - failure +* +* ****************************************************************/ +void FreeDrbToBeModifiedList(DRBs_ToBeModified_List_t *drbSet) +{ + uint8_t arrIdx =0; + struct DRBs_ToBeModified_ItemIEs *drbItemIe; + + if(drbSet->list.array) + { + for(arrIdx=0; arrIdxlist.count ; arrIdx++) + { + if(drbSet->list.array[arrIdx] != NULLP) + { + drbItemIe = (struct DRBs_ToBeModified_ItemIEs *)drbSet->list.array[arrIdx]; + FreeModifiedDrbItem(&(drbItemIe->value.choice.DRBs_ToBeModified_Item)); + CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t)); + } + } + CU_FREE(drbSet->list.array, drbSet->list.size); + } + +} + +/******************************************************************* + * + * @brief free the UeContextModification Request + * + * @details + * + * Function : FreeUeContextModicationRequest + * + * Functionality : deallocation of memory allocated in UeContextModiification + request + * + * @params[in] F1AP_PDU_t *f1apMsg + * + * @return void +* +* ****************************************************************/ +void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg) +{ + uint8_t arrIdx =0 , ieId=0; + UEContextModificationRequest_t *UeContextModifyReq = NULLP; + + if(f1apMsg) + { + if(f1apMsg->choice.initiatingMessage) + { + UeContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest; + if(UeContextModifyReq->protocolIEs.list.array) + { + for( arrIdx = 0 ; arrIdxprotocolIEs.list.count ; arrIdx++) + { + if(UeContextModifyReq->protocolIEs.list.array[arrIdx]) + { + ieId = UeContextModifyReq->protocolIEs.list.array[arrIdx]->id; + switch(ieId) + { + case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID: + break; + case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID: + break; + case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List: + { + FreeDrbToBeSetupModList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->value.\ + choice.DRBs_ToBeSetupMod_List); + break; + } + case ProtocolIE_ID_id_DRBs_ToBeModified_List: + { + FreeDrbToBeModifiedList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->value.\ + choice.DRBs_ToBeSetupMod_List); + break; + } + + } + CU_FREE(UeContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t)); + } + } + CU_FREE(UeContextModifyReq->protocolIEs.list.array, UeContextModifyReq->protocolIEs.list.size); + } + CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t)); + } + CU_FREE(f1apMsg, sizeof(F1AP_PDU_t)); + } +} +/******************************************************************* + * + * @brief Builds the Ue Context Modification Req + * + * @details + * + * Function : BuildAndSendUeContextModificationReq + * + * Functionality: Constructs the Ue Context Modification Req + * + * @params[in] + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t BuildAndSendUeContextModificationReq(uint8_t ueId) +{ + uint8_t ieIdx = 0; + uint8_t elementCnt = 0; + uint8_t ret = RFAILED; + F1AP_PDU_t *f1apMsg = NULLP; + UEContextModificationRequest_t *ueContextModifyReq = NULLP; + + asn_enc_rval_t encRetVal; + DU_LOG("\nINFO --> F1AP : Building Ue context modification request\n"); + + while(1) + { + CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t)); + if(f1apMsg == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification"); + break; + } + + f1apMsg->present = F1AP_PDU_PR_initiatingMessage; + + CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t)); + if(f1apMsg->choice.initiatingMessage == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification"); + break; + } + f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification; + f1apMsg->choice.initiatingMessage->criticality = Criticality_reject; + f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest; + + ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest; + + elementCnt = 4; + ueContextModifyReq->protocolIEs.list.count = elementCnt; + ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *); + + /* Initialize the UE context modification members */ + CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size); + if(ueContextModifyReq->protocolIEs.list.array == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed"); + break; } for(ieIdx=0 ; ieIdxprotocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = ueId; + /* DRB to be setup list */ ieIdx++; ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List; ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject; ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\ UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List; - ret = BuildDrbToBeSetupModList(&(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\ + ret = BuildDrbToBeSetupList(ueId, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\ value.choice.DRBs_ToBeSetupMod_List)); + + /* DRB to be modified list */ + ieIdx++; + ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeModified_List; + ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject; + ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\ + UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List; + ret = BuildDrbToBeModifiedList(ueId, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\ + value.choice.DRBs_ToBeModified_List)); + + /* TODO: DRB to be release list */ + if(ret != ROK) { break; @@ -7784,7 +8294,7 @@ uint8_t BuildAndSendUeContextReleaseCommand(uint8_t cuUeF1apId, uint8_t duUeF1ap ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size); if(!ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf) { - DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed"); + DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextReleaseCommand failed"); break; } memset(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, 0, bufLen); @@ -7898,7 +8408,6 @@ uint8_t procGnbDuUpdate(F1AP_PDU_t *f1apMsg) GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP; duCfgUpdate = &f1apMsg->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate; - for(ieIdx=0; ieIdx < duCfgUpdate->protocolIEs.list.count; ieIdx++) { switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id) @@ -7942,6 +8451,267 @@ uint8_t procGnbDuUpdate(F1AP_PDU_t *f1apMsg) return ROK; } + +/******************************************************************* +* +* @brief storing slice list in CU database +* +* @details +* +* Function : buildSliceList +* +* Functionality: +* - storing slice list in CU database +* +* @params[in] SliceSupportList_t *sliceSupportList +* @return ROK - success +* RFAILED - failure +* +* ****************************************************************/ +uint8_t buildSliceList(SliceSupportList_t *sliceSupportList) +{ + uint8_t sliceListIdx = 0; + + if(sliceSupportList) + { + if(sliceSupportList->list.array) + { + cuCfgParams.numSnssaiSupported = sliceSupportList->list.count; + for(sliceListIdx=0; sliceListIdxlist.count; sliceListIdx++) + { + if(sliceSupportList->list.array[sliceListIdx]) + { + CU_ALLOC(cuCfgParams.snssaiList[sliceListIdx], sizeof(Snssai)); + if(cuCfgParams.snssaiList[sliceListIdx] == NULLP) + { + DU_LOG("\nERROR --> CU_STUB: buildSliceList(): Memory allocation failed"); + return RFAILED; + } + if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.buf) + { + memcpy(&cuCfgParams.snssaiList[sliceListIdx]->sst, sliceSupportList->list.array[sliceListIdx]->\ + sNSSAI.sST.buf, sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.size); + } + if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size) + { + memcpy(&cuCfgParams.snssaiList[sliceListIdx]->sd,\ + sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->buf,\ + sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size); + } + } + } + } + } + return ROK; +} + +/**************************************************************** + * @brief Function to process Drb Setup Mod List + * + * @details + * + * Function : procDrbSetupModList + * + * Functionality: + * - Function to process DRB Setup Mod List + * + * @params[in] + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t procDrbSetupModList(DRBs_SetupMod_List_t *drbSetupList) +{ + uint8_t arrIdx = 0; + uint32_t teId = 0; + struct DRBs_SetupMod_ItemIEs *drbItemIe = NULLP; + + if(drbSetupList != NULLP) + { + for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++) + { + drbItemIe = ((struct DRBs_SetupMod_ItemIEs *)drbSetupList->list.array[arrIdx]); + if(drbItemIe->value.present == DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item) + { + /* extracting teId */ + teId = extractTeId(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List); + if(teId > 0) + { + if(addDrbTunnels(teId)== ROK) + { + DU_LOG("\nDEBUG --> EGTP: Tunnel Added for TeId %d", teId); + } + } + else + return RFAILED; + } + } + } + return ROK; +} + +/******************************************************************* +* +* @brief processing of GNB_DU_Served_Cells Plmn list information +* +* @details +* +* Function : procServedCellPlmnList +* +* Functionality: +* - processing of GNB_DU_Served_Cells Plmn list information for storing +* SNSSAI list +* +* @params[in] F1AP_PDU_t *f1apMsg +* @return ROK - success +* RFAILED - failure +* +* ****************************************************************/ +uint8_t procServedCellPlmnList(ServedPLMNs_List_t *srvPlmn) +{ + uint8_t srvPlmnIdx=0, ieExtensionsLstIdx=0; + ProtocolExtensionContainer_4624P3_t **ieExtend; + + if(srvPlmn->list.array) + { + for(srvPlmnIdx=0; srvPlmnIdxlist.count; srvPlmnIdx++) + { + if(srvPlmn->list.array[srvPlmnIdx]) + { + ieExtend = &srvPlmn->list.array[srvPlmnIdx]->iE_Extensions; + if(*ieExtend) + { + if((*ieExtend)->list.array) + { + for(ieExtensionsLstIdx = 0; ieExtensionsLstIdx<(*ieExtend)->list.count; ieExtensionsLstIdx++) + { + if((*ieExtend)->list.array[ieExtensionsLstIdx]) + { + switch((*ieExtend)->list.array[ieExtensionsLstIdx]->id ) + { + case ProtocolIE_ID_id_TAISliceSupportList: + { + if(buildSliceList(&(*ieExtend)->list.array[ieExtensionsLstIdx]->\ + extensionValue.choice.SliceSupportList) != ROK) + { + DU_LOG("\nERROR --> CU_STUB: procServedCellPlmnList(): Failed to build slice List"); + return RFAILED; + } + } + } + } + } + } + } + } + } + } + return ROK; +} + +/**************************************************************** + * @brief Function to process Ue Context Modification Response + * + * @details + * + * Function : procUeContextModificationResponse + * + * Functionality: + * - Function to process Ue Context Modification Response + * + * @params[in] + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t procUeContextModificationResponse(F1AP_PDU_t *f1apMsg) +{ + uint8_t idx, duUeF1apId; + UEContextModificationResponse_t *ueCtxtModRsp = NULLP; + ueCtxtModRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse; + + for(idx=0; idx < ueCtxtModRsp->protocolIEs.list.count; idx++) + { + switch(ueCtxtModRsp->protocolIEs.list.array[idx]->id) + { + case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID: + { + duUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID; + break; + } + case ProtocolIE_ID_id_DRBs_SetupMod_List: + { + /* Adding Tunnels for successful DRB */ + procDrbSetupModList(&ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.DRBs_SetupMod_List); + break; + + } + } + } + return ROK; +} + +/******************************************************************* +* +* @brief processing of F1 setup request +* +* @details +* +* Function : procF1SetupReq +* +* Functionality: +* - processing of F1 setup request +* +* @params[in] F1AP_PDU_t *f1apMsg +* @return ROK - success +* RFAILED - failure +* +* ****************************************************************/ +void procF1SetupReq(F1AP_PDU_t *f1apMsg) +{ + uint8_t ieIdx = 0, plmnidx=0, ret=ROK; + F1SetupRequest_t *f1SetupReq = NULLP; + GNB_DU_Served_Cells_Item_t *srvCellItem = NULLP; + GNB_DU_Served_Cells_List_t *duServedCell = NULLP; + + f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest; + for(ieIdx=0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++) + { + switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id) + { + case ProtocolIE_ID_id_gNB_DU_Served_Cells_List: + { + duServedCell = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Served_Cells_List; + if(duServedCell->list.array) + { + for(plmnidx=0; plmnidxlist.count; plmnidx++) + { + if(duServedCell->list.array[plmnidx]) + { + switch(duServedCell->list.array[plmnidx]->id) + { + case ProtocolIE_ID_id_GNB_DU_Served_Cells_Item: + { + srvCellItem = &duServedCell->list.array[plmnidx]->value.choice.GNB_DU_Served_Cells_Item; + ret = procServedCellPlmnList(&srvCellItem->served_Cell_Information.servedPLMNs); + } + } + } + } + } + } + } + } + if(ret == ROK) + { + BuildAndSendF1SetupRsp(); + } + else + { + DU_LOG("\nERROR --> CU_STUB: procF1SetupReq(): Failed to process F1 setup request"); + } +} + /******************************************************************* * * @brief Handles received F1AP message and sends back response @@ -8024,7 +8794,7 @@ void F1APMsgHdlr(Buffer *mBuf) case InitiatingMessage__value_PR_F1SetupRequest: { DU_LOG("\nINFO --> F1AP : F1 setup request received"); - BuildAndSendF1SetupRsp(); + procF1SetupReq(f1apMsg); break; } @@ -8086,6 +8856,7 @@ void F1APMsgHdlr(Buffer *mBuf) case SuccessfulOutcome__value_PR_UEContextModificationResponse: { DU_LOG("\nINFO --> F1AP : UE Context Modification Response received"); + procUeContextModificationResponse(f1apMsg); break; } case SuccessfulOutcome__value_PR_UEContextReleaseComplete: