X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Fdu_app%2Fdu_f1ap_msg_hdl.c;h=b30f89d3017f2c4dc9a39af975e5b82a3665e495;hb=5b0a8c1ccec481f354d22c1dff57b35bf72a1622;hp=d9151a4d140d54e6eea878f29540fac16042c273;hpb=6bd517aac8dc6e3166389be3f468c58ba56d5608;p=o-du%2Fl2.git diff --git a/src/du_app/du_f1ap_msg_hdl.c b/src/du_app/du_f1ap_msg_hdl.c index d9151a4d1..b30f89d30 100644 --- a/src/du_app/du_f1ap_msg_hdl.c +++ b/src/du_app/du_f1ap_msg_hdl.c @@ -18,6 +18,7 @@ /* This file contains F1AP message handler functions */ #include "common_def.h" +#include "du_tmr.h" #include "ckw.h" #include "ckw.x" #include "kwu.h" @@ -28,15 +29,67 @@ #include "lkw.x" #include "lrg.x" #include "F1AP-PDU.h" +#include "InitiatingMessage.h" +#include "SuccessfulOutcome.h" #include "du_app_mac_inf.h" #include "du_cfg.h" #include "du_app_rlc_inf.h" +#include "du_e2ap_mgr.h" +#include "du_e2ap_msg_hdl.h" #include "du_mgr_main.h" #include "du_mgr.h" #include "du_utils.h" #include "du_ue_mgr.h" #include "RAT-Type.h" +#include "NRFreqInfo.h" +#include "NRCGI.h" +#include "TDD-Info.h" +#include "NR-Mode-Info.h" +#include "ServedPLMNs-List.h" +#include "GNB-DU-Served-Cells-List.h" +#include "Served-Cell-Information.h" +#include "ProtocolExtensionContainer.h" +#include "RRC-Version.h" +#include "FDD-Info.h" +#include "FreqBandNrItem.h" +#include "ServedPLMNs-Item.h" +#include "GNB-DU-Served-Cells-Item.h" +#include "SliceSupportItem.h" #include "FeatureSetUplinkPerCC.h" +#include "SliceSupportItem.h" +#include "Served-Cells-To-Modify-Item.h" +#include "Served-Cells-To-Delete-List.h" +#include "Served-Cells-To-Delete-Item.h" +#include "QoSInformation.h" +#include "ULUPTNLInformation-ToBeSetup-List.h" +#include "DRB-Information.h" +#include "DRBs-ToBeSetup-Item.h" +#include "DRBs-ToBeSetupMod-Item.h" +#include "DRBs-ToBeModified-Item.h" +#include "CUtoDURRCInformation.h" +#include "SCell-ToBeSetup-List.h" +#include "SRBs-ToBeSetup-List.h" +#include "DRBs-ToBeSetup-List.h" +#include "SRBs-ToBeSetup-Item.h" +#include "DRBs-ToBeModified-List.h" +#include "RRCContainer.h" +#include "UE-CapabilityRAT-ContainerList.h" +#include "DRBs-Setup-List.h" +#include "CellGroupConfig.h" +#include "ResetAll.h" +#include "ResetType.h" +#include "Cells-to-be-Activated-List.h" +#include "GNB-CU-Name.h" +#include "SRBs-SetupMod-List.h" +#include "DRBs-SetupMod-List.h" +#include "DRBs-ToBeSetupMod-List.h" +#include "PagingCell-Item.h" +#include "PagingCell-list.h" +#include "QoS-Characteristics.h" +#include "ULUPTNLInformation-ToBeSetup-Item.h" +#include "Flows-Mapped-To-DRB-Item.h" +#include "NonDynamic5QIDescriptor.h" +#include "Dynamic5QIDescriptor.h" #include "FeatureSetDownlinkPerCC.h" #include "FeatureSets.h" #include "UE-NR-Capability.h" @@ -110,7 +163,6 @@ #include "UPTransportLayerInformation.h" #include "GTPTunnel.h" #include "SupportedSULFreqBandItem.h" -#include "du_e2ap_msg_hdl.h" #include "du_f1ap_conversions.h" #include "CNUEPagingIdentity.h" #include "PCCH-Config.h" @@ -124,8 +176,15 @@ #include "CFRA-SSB-Resource.h" #include "BWP-UplinkCommon.h" #include "ReconfigurationWithSync.h" +#include "BCCH-DL-SCH-Message.h" #include "du_sys_info_hdl.h" #include "DRX-ConfigRrc.h" +#include "MeasurementTimingConfigurationRrc.h" +#include "MeasurementTimingConfigurationRrc-IEs.h" +#include "MeasTimingList.h" +#include "MeasTiming.h" +#include "Cells-Status-List.h" +#include "Cells-Status-Item.h" #ifdef O1_ENABLE #include "CmInterface.h" @@ -160,13 +219,13 @@ uint8_t fetchLcId(uint8_t drbId) { if(duCb.actvCellLst[cellIdx] != NULLP) { - numLcs = duCb.actvCellLst[cellIdx]->ueCb[ueIdx].rlcUeCfg.numLcs; + numLcs = duCb.actvCellLst[cellIdx]->ueCb[ueIdx].duRlcUeCfg.numLcs; for(lcIdx = 0; lcIdx < numLcs; lcIdx++) { - if(duCb.actvCellLst[cellIdx]->ueCb[ueIdx].rlcUeCfg.rlcLcCfg[lcIdx].rbId == drbId && \ - duCb.actvCellLst[cellIdx]->ueCb[ueIdx].rlcUeCfg.rlcLcCfg[lcIdx].rbType == RB_TYPE_DRB) + if(duCb.actvCellLst[cellIdx]->ueCb[ueIdx].duRlcUeCfg.rlcLcCfg[lcIdx].rlcBearerCfg.rbId == drbId && \ + duCb.actvCellLst[cellIdx]->ueCb[ueIdx].duRlcUeCfg.rlcLcCfg[lcIdx].rlcBearerCfg.rbType == RB_TYPE_DRB) { - lcId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx].rlcUeCfg.rlcLcCfg[lcIdx].lcId; + lcId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx].duRlcUeCfg.rlcLcCfg[lcIdx].rlcBearerCfg.lcId; return lcId; } } @@ -490,6 +549,7 @@ uint8_t fillNrTddInfo(TDD_Info_t *tddInfo) freqInfo->freqBandListNr.list.array[freqBandListIdx]->freqBandIndicatorNr = duCfgParam.srvdCellLst[0].duCellInfo.\ f1Mode.mode.tdd.nrFreqInfo.freqBand[0].nrFreqBand; + freqInfo->freqBandListNr.list.array[freqBandListIdx]->supportedSULBandList.list.count = elementCnt; freqInfo->freqBandListNr.list.array[freqBandListIdx]->supportedSULBandList.list.size = freqInfo->freqBandListNr.list.array[freqBandListIdx]->\ supportedSULBandList.list.count * sizeof(SupportedSULFreqBandItem_t*); @@ -774,6 +834,186 @@ uint8_t BuildServedPlmn(ServedPLMNs_List_t *srvplmn) } return ROK; } + +/******************************************************************* + * + * @brief Frees Measurement Timing configuration + * + * @details + * + * Function : FreeMeasTimingConf + * + * Functionality: Frees Timing Configuration + * + * @params[in] MeasurementTimingConfigurationRrc_t measTimingConfRrc + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +void FreeMeasTimingConf(MeasurementTimingConfigurationRrc_t measTimingConfRrc) +{ + uint8_t measIeIdx = 0; + MeasurementTimingConfigurationRrc_IEs_t *measTimingConfIEs = NULLP; + + if(measTimingConfRrc.criticalExtensions.choice.c1) + { + if(measTimingConfRrc.criticalExtensions.choice.c1->choice.measTimingConf) + { + measTimingConfIEs = measTimingConfRrc.criticalExtensions.choice.c1->choice.measTimingConf; + if(measTimingConfIEs->measTiming) + { + if(measTimingConfIEs->measTiming->list.array) + { + for(measIeIdx = 0; measIeIdx < measTimingConfIEs->measTiming->list.count; measIeIdx++) + { + if(measTimingConfIEs->measTiming->list.array[measIeIdx]) + { + DU_FREE(measTimingConfIEs->measTiming->list.array[measIeIdx]->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming)); + DU_FREE(measTimingConfIEs->measTiming->list.array[measIeIdx], sizeof(MeasTiming_t)); + } + } + DU_FREE(measTimingConfIEs->measTiming->list.array, measTimingConfIEs->measTiming->list.size); + } + DU_FREE(measTimingConfIEs->measTiming, sizeof(MeasTimingList_t)); + } + DU_FREE(measTimingConfRrc.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(MeasurementTimingConfigurationRrc_IEs_t)); + } + DU_FREE(measTimingConfRrc.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1)); + } +} + +/******************************************************************* + * + * @brief Builds MEasuerment Timing Configuration + * + * @details + * + * Function : BuildMeasTimingConf + * + * Functionality: Building Measurement Timing Configuration + * + * @params[in] Pointer to octet string to store Measurement timing + * Configuration + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t BuildMeasTimingConf(OCTET_STRING_t *measTimingConf) +{ + uint8_t ret = RFAILED; + uint8_t elementCnt = 0; + uint8_t measIeIdx = 0; + asn_enc_rval_t encRetVal; + MeasurementTimingConfigurationRrc_t measTimingConfRrc; + MeasurementTimingConfigurationRrc_IEs_t *measTimingConfIEs = NULLP; + struct MeasTiming__frequencyAndTiming *freqAndTiming = NULLP; + + while(true) + { + measTimingConfRrc.criticalExtensions.present = MeasurementTimingConfigurationRrc__criticalExtensions_PR_c1; + DU_ALLOC(measTimingConfRrc.criticalExtensions.choice.c1, sizeof(struct MeasurementTimingConfigurationRrc__criticalExtensions__c1)); + if(!measTimingConfRrc.criticalExtensions.choice.c1) + { + DU_LOG("ERROR --> DU_APP : BuildMeasTimingConf(): Memory allocation failure for critical extension choice C1"); + break; + } + measTimingConfRrc.criticalExtensions.choice.c1->present = MeasurementTimingConfigurationRrc__criticalExtensions__c1_PR_measTimingConf; + + DU_ALLOC(measTimingConfRrc.criticalExtensions.choice.c1->choice.measTimingConf, sizeof(MeasurementTimingConfigurationRrc_IEs_t)); + if(!measTimingConfRrc.criticalExtensions.choice.c1->choice.measTimingConf) + { + DU_LOG("ERROR --> DU_APP : BuildMeasTimingConf(): Memory allocation failure for measTimingConf"); + break; + } + measTimingConfIEs = measTimingConfRrc.criticalExtensions.choice.c1->choice.measTimingConf; + + DU_ALLOC(measTimingConfIEs->measTiming, sizeof(MeasTimingList_t)); + if(!measTimingConfIEs->measTiming) + { + DU_LOG("ERROR --> DU_APP : BuildMeasTimingConf(): Memory allocation failure for MeasTimingList"); + break; + } + + elementCnt = 1; + measTimingConfIEs->measTiming->list.count = elementCnt; + measTimingConfIEs->measTiming->list.size = elementCnt * sizeof(MeasTiming_t *); + DU_ALLOC(measTimingConfIEs->measTiming->list.array, measTimingConfIEs->measTiming->list.size); + if(!measTimingConfIEs->measTiming->list.array) + { + DU_LOG("ERROR --> DU_APP : BuildMeasTimingConf(): Memory allocation failure for MeasTimingList array"); + break; + } + + for(measIeIdx = 0; measIeIdx < elementCnt; measIeIdx++) + { + DU_ALLOC(measTimingConfIEs->measTiming->list.array[measIeIdx], sizeof(MeasTiming_t)); + if(!measTimingConfIEs->measTiming->list.array[measIeIdx]) + { + DU_LOG("ERROR --> DU_APP : BuildMeasTimingConf(): Memory allocation failure for MeasTimingList array index %d", measIeIdx); + break; + } + } + if(measIeIdx < elementCnt) + { + break; + } + + measIeIdx = 0; + DU_ALLOC(measTimingConfIEs->measTiming->list.array[measIeIdx]->frequencyAndTiming, sizeof(struct MeasTiming__frequencyAndTiming)); + if(!measTimingConfIEs->measTiming->list.array[measIeIdx]->frequencyAndTiming) + { + DU_LOG("ERROR --> DU_APP : BuildMeasTimingConf(): Memory allocation failure for frequencyAndTiming"); + break; + } + freqAndTiming = measTimingConfIEs->measTiming->list.array[measIeIdx]->frequencyAndTiming; + freqAndTiming->carrierFreq = MEAS_TIMING_ARFCN; + freqAndTiming->ssbSubcarrierSpacing = duCfgParam.macCellCfg.ssbCfg.scsCmn; + freqAndTiming->ssb_MeasurementTimingConfiguration.periodicityAndOffset.present = duCfgParam.macCellCfg.ssbCfg.ssbPeriod + 1; + freqAndTiming->ssb_MeasurementTimingConfiguration.periodicityAndOffset.choice.sf20 = duCfgParam.macCellCfg.ssbCfg.ssbScOffset; + freqAndTiming->ssb_MeasurementTimingConfiguration.duration = duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfgDuration; + + /* Encode the F1SetupRequest type as APER */ + xer_fprint(stdout, &asn_DEF_MeasurementTimingConfigurationRrc, &measTimingConfRrc); + + memset(encBuf, 0, ENC_BUF_MAX_LEN); + encBufSize = 0; + encRetVal = uper_encode(&asn_DEF_MeasurementTimingConfigurationRrc, 0, &measTimingConfRrc, PrepFinalEncBuf, encBuf); + + /* Encode results */ + if(encRetVal.encoded == ENCODE_FAIL) + { + DU_LOG("\nERROR --> F1AP : Could not encode Measurement Timing Configuration structure (at %s)\n",\ + encRetVal.failed_type ? encRetVal.failed_type->name : "unknown"); + break; + } + else + { + DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Measurement Timing Configuration \n"); +#ifdef DEBUG_ASN_PRINT + for(measIeIdx=0; measIeIdx< encBufSize; measIeIdx++) + { + printf("%x",encBuf[measIeIdx]); + } +#endif + + measTimingConf->size = encBufSize; + DU_ALLOC(measTimingConf->buf, encBufSize); + if(measTimingConf->buf == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed for MeasurementTimingConfiguration buffer"); + return RFAILED; + } + memcpy(measTimingConf->buf, &encBuf, encBufSize); + + FreeMeasTimingConf(measTimingConfRrc); + + ret = ROK; + break; + } + } + return ret; +} + /******************************************************************* * * @brief Builds Served Cell List @@ -811,19 +1051,19 @@ uint8_t BuildServedCellList(GNB_DU_Served_Cells_List_t *duServedCell) for(plmnidx=0; plmnidxlist.array[plmnidx],\ - sizeof(GNB_DU_Served_Cells_ItemIEs_t)); + sizeof(GNB_DU_Served_Cells_ItemIEs_t)); if(duServedCell->list.array[plmnidx] == NULLP) { - return RFAILED; + return RFAILED; } } idx = 0; duServedCell->list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_Served_Cells_Item; duServedCell->list.array[idx]->criticality = Criticality_reject; duServedCell->list.array[idx]->value.present = \ - GNB_DU_Served_Cells_ItemIEs__value_PR_GNB_DU_Served_Cells_Item; + GNB_DU_Served_Cells_ItemIEs__value_PR_GNB_DU_Served_Cells_Item; srvCellItem = \ - &duServedCell->list.array[idx]->value.choice.GNB_DU_Served_Cells_Item; + &duServedCell->list.array[idx]->value.choice.GNB_DU_Served_Cells_Item; /*nRCGI*/ BuildNrcgiret = BuildNrcgi(&srvCellItem->served_Cell_Information.nRCGI); if(BuildNrcgiret != ROK) @@ -832,42 +1072,36 @@ uint8_t BuildServedCellList(GNB_DU_Served_Cells_List_t *duServedCell) } /*nRPCI*/ srvCellItem->served_Cell_Information.nRPCI = \ - duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci; + duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci; - /*fiveGS_TAC*/ + /* fiveGS_TAC */ BuildFiveGSTacret = BuildFiveGSTac(&srvCellItem->served_Cell_Information); if(BuildFiveGSTacret != ROK) { return RFAILED; } - /*Served PLMNs*/ + + /* Served PLMNs */ BuildServedPlmnret = BuildServedPlmn(&srvCellItem->served_Cell_Information.servedPLMNs); if(BuildServedPlmnret !=ROK) { return RFAILED; } - /*nR Mode Info with FDD*/ + + /* nR Mode Info with FDD/TDD */ BuildNrModeret = BuildNrMode(&srvCellItem->served_Cell_Information.nR_Mode_Info); if(BuildNrModeret != ROK) { return RFAILED; } + /*Measurement timing Config*/ - srvCellItem->served_Cell_Information.measurementTimingConfiguration.\ - size = sizeof(uint8_t); - DU_ALLOC(srvCellItem->served_Cell_Information.\ - measurementTimingConfiguration.buf,srvCellItem->served_Cell_Information.measurementTimingConfiguration.size); - if(srvCellItem->served_Cell_Information.\ - measurementTimingConfiguration.buf == NULLP) - { + if(BuildMeasTimingConf(&srvCellItem->served_Cell_Information.measurementTimingConfiguration) != ROK) return RFAILED; - } - srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf[0] = \ - duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg; /* GNB DU System Information */ DU_ALLOC(srvCellItem->gNB_DU_System_Information, - sizeof(GNB_DU_System_Information_t)); + sizeof(GNB_DU_System_Information_t)); if(!srvCellItem->gNB_DU_System_Information) { return RFAILED; @@ -875,20 +1109,20 @@ uint8_t BuildServedCellList(GNB_DU_Served_Cells_List_t *duServedCell) /* MIB */ srvCellItem->gNB_DU_System_Information->mIB_message.size = duCfgParam.srvdCellLst[0].duSysInfo.mibLen; DU_ALLOC(srvCellItem->gNB_DU_System_Information->mIB_message.buf, - srvCellItem->gNB_DU_System_Information->mIB_message.size); + srvCellItem->gNB_DU_System_Information->mIB_message.size); if(!srvCellItem->gNB_DU_System_Information->mIB_message.buf) { return RFAILED; } memcpy(srvCellItem->gNB_DU_System_Information->mIB_message.buf, duCfgParam.srvdCellLst[0].duSysInfo.mibMsg, \ - srvCellItem->gNB_DU_System_Information->mIB_message.size); + srvCellItem->gNB_DU_System_Information->mIB_message.size); /* SIB1 */ srvCellItem->gNB_DU_System_Information->sIB1_message.size =\ - duCfgParam.srvdCellLst[0].duSysInfo.sib1Len; + duCfgParam.srvdCellLst[0].duSysInfo.sib1Len; DU_ALLOC(srvCellItem->gNB_DU_System_Information->sIB1_message.buf, - srvCellItem->gNB_DU_System_Information->sIB1_message.size); + srvCellItem->gNB_DU_System_Information->sIB1_message.size); if(!srvCellItem->gNB_DU_System_Information->sIB1_message.buf) { return RFAILED; @@ -896,7 +1130,7 @@ uint8_t BuildServedCellList(GNB_DU_Served_Cells_List_t *duServedCell) for(int x=0; xgNB_DU_System_Information->sIB1_message.size; x++) { srvCellItem->gNB_DU_System_Information->sIB1_message.buf[x]=\ - duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg[x]; + duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg[x]; } return ROK; } @@ -1164,7 +1398,7 @@ void freeFddNrFreqInfo(FDD_Info_t *fDD) * ****************************************************************/ void FreeServedCellList( GNB_DU_Served_Cells_List_t *duServedCell) { - uint8_t plmnCnt=MAX_PLMN; + uint8_t plmnCnt= 1; uint8_t extensionCnt=IE_EXTENSION_LIST_COUNT; uint8_t plmnIdx=0, sliceIdx=0; GNB_DU_Served_Cells_Item_t *srvCellItem; @@ -1309,50 +1543,136 @@ void FreeF1SetupReq(F1AP_PDU_t *f1apMsg) { if(f1apMsg->choice.initiatingMessage != NULLP) { - f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest; - if(f1SetupReq->protocolIEs.list.array != NULLP) - { - for(ieIdx = 0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++) - { - if(f1SetupReq->protocolIEs.list.array[ieIdx] != NULLP) - { - switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id) - { - case ProtocolIE_ID_id_TransactionID: - break; - case ProtocolIE_ID_id_gNB_DU_ID: - DU_FREE(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf,\ - f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size); - break; - case ProtocolIE_ID_id_gNB_DU_Name: - DU_FREE(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.buf,\ - strlen((char *)duCfgParam.duName)); - break; - case ProtocolIE_ID_id_gNB_DU_Served_Cells_List: - FreeServedCellList(&f1SetupReq->protocolIEs.list.\ - array[ieIdx]->value.choice.GNB_DU_Served_Cells_List); - break; - case ProtocolIE_ID_id_GNB_DU_RRC_Version: - FreeRrcVer(&f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.RRC_Version); - break; - default: - DU_LOG("\nERROR --> Invalid Event Type %ld", f1SetupReq->protocolIEs.list.array[ieIdx]->id); - break; - } - } - } - for(ieIdx2=0; ieIdx2< ieIdx; ieIdx2++) - { - DU_FREE(f1SetupReq->protocolIEs.list.array[ieIdx2],sizeof(F1SetupRequestIEs_t)); - } - DU_FREE(f1SetupReq->protocolIEs.list.array,\ - f1SetupReq->protocolIEs.list.size); - } - DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t)); + f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest; + if(f1SetupReq->protocolIEs.list.array != NULLP) + { + for(ieIdx = 0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++) + { + if(f1SetupReq->protocolIEs.list.array[ieIdx] != NULLP) + { + switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id) + { + case ProtocolIE_ID_id_TransactionID: + break; + case ProtocolIE_ID_id_gNB_DU_ID: + DU_FREE(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf,\ + f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size); + break; + case ProtocolIE_ID_id_gNB_DU_Name: + DU_FREE(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.buf,\ + strlen((char *)duCfgParam.duName)); + break; + case ProtocolIE_ID_id_gNB_DU_Served_Cells_List: + FreeServedCellList(&f1SetupReq->protocolIEs.list.\ + array[ieIdx]->value.choice.GNB_DU_Served_Cells_List); + break; + case ProtocolIE_ID_id_GNB_DU_RRC_Version: + FreeRrcVer(&f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.RRC_Version); + break; + default: + DU_LOG("\nERROR --> Invalid Event Type %ld", f1SetupReq->protocolIEs.list.array[ieIdx]->id); + break; + } + } + } + for(ieIdx2=0; ieIdx2< ieIdx; ieIdx2++) + { + DU_FREE(f1SetupReq->protocolIEs.list.array[ieIdx2],sizeof(F1SetupRequestIEs_t)); + } + DU_FREE(f1SetupReq->protocolIEs.list.array,\ + f1SetupReq->protocolIEs.list.size); + } + DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t)); } DU_FREE(f1apMsg, sizeof(F1AP_PDU_t)); } } + +/******************************************************************* + * + * @brief add or modify E2NodeComponent list + * + * @details + * + * Function : addOrModifyE2NodeComponent + * + * Functionality: add or modify E2NodeComponent list + * + * @parameter uint8_t componentactiontype, bool reqPart, uint8_t bufSize, char *bufString + * @return ROK - success + * RFAILED - failure + * + ******************************************************************/ +uint8_t addOrModifyE2NodeComponent(uint8_t action, bool reqPart, uint8_t bufSize, char *bufString) +{ + E2NodeComponent *e2NodeComponentInfo; + CmLList *node = NULLP; + + if(action == E2_NODE_COMPONENT_ADD) + { + if(reqPart == true) + { + DU_ALLOC(e2NodeComponentInfo, sizeof(E2NodeComponent)); + if(!e2NodeComponentInfo) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed for e2NodeComponentInfo in %s",__func__); + return RFAILED; + } + e2NodeComponentInfo->interfaceType =F1; + e2NodeComponentInfo->componentId=duCfgParam.duId; + e2NodeComponentInfo->componentActionType = action; + e2NodeComponentInfo->reqBufSize = bufSize; + + DU_ALLOC(e2NodeComponentInfo->componentRequestPart, bufSize); + if(e2NodeComponentInfo->componentRequestPart == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed for componentRequestPart"); + DU_FREE(e2NodeComponentInfo, sizeof(E2NodeComponent)); + return RFAILED; + } + memcpy(e2NodeComponentInfo->componentRequestPart, bufString, e2NodeComponentInfo->reqBufSize); + DU_ALLOC(node, sizeof(CmLList)); + if(node) + { + node->node = (PTR) e2NodeComponentInfo; + cmLListAdd2Tail(&duCb.e2apDb.e2NodeComponentList, node); + } + else + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed for e2NodeComponentList node"); + DU_FREE(e2NodeComponentInfo->componentRequestPart, bufSize); + DU_FREE(e2NodeComponentInfo, sizeof(E2NodeComponent)); + return RFAILED; + } + } + else + { + if(duCb.e2apDb.e2NodeComponentList.count) + { + CM_LLIST_FIRST_NODE(&duCb.e2apDb.e2NodeComponentList, node); + while(node) + { + e2NodeComponentInfo = (E2NodeComponent*)node->node; + if((e2NodeComponentInfo->interfaceType == F1) && (e2NodeComponentInfo->componentActionType == action)) + { + e2NodeComponentInfo->rspBufSize = bufSize; + + DU_ALLOC(e2NodeComponentInfo->componentResponsePart, bufSize); + if(e2NodeComponentInfo->componentResponsePart == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed to store the encoding of f1setup rsp"); + return RFAILED; + } + memcpy(e2NodeComponentInfo->componentResponsePart, bufString, e2NodeComponentInfo->rspBufSize); + break; + } + node = node->next; + } + } + } + } + return ROK; +} /******************************************************************* * * @brief Builds and Send the F1SetupRequest @@ -1383,40 +1703,40 @@ uint8_t BuildAndSendF1SetupReq() DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t)); if(f1apMsg == NULLP) { - break; + break; } f1apMsg->present = F1AP_PDU_PR_initiatingMessage; DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t)); if(f1apMsg->choice.initiatingMessage == NULLP) { - break; + break; } f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_F1Setup; f1apMsg->choice.initiatingMessage->criticality = Criticality_reject; f1apMsg->choice.initiatingMessage->value.present = \ - InitiatingMessage__value_PR_F1SetupRequest; + InitiatingMessage__value_PR_F1SetupRequest; f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest; - elementCnt = (duCfgParam.duName != NULL) ? 5 : 4; + elementCnt = 5; f1SetupReq->protocolIEs.list.count = elementCnt; - f1SetupReq->protocolIEs.list.size = elementCnt * sizeof(F1SetupRequestIEs_t ); + f1SetupReq->protocolIEs.list.size = elementCnt * sizeof(F1SetupRequestIEs_t *); /* Initialize the F1Setup members */ DU_ALLOC(f1SetupReq->protocolIEs.list.array,f1SetupReq->protocolIEs.list.size); if(f1SetupReq->protocolIEs.list.array == NULLP) { - break; + break; } for(ieIdx=0; ieIdxprotocolIEs.list.array[ieIdx],\ - sizeof(F1SetupRequestIEs_t)); - if(f1SetupReq->protocolIEs.list.array[ieIdx] == NULLP) - { - break; - } + DU_ALLOC(f1SetupReq->protocolIEs.list.array[ieIdx],\ + sizeof(F1SetupRequestIEs_t)); + if(f1SetupReq->protocolIEs.list.array[ieIdx] == NULLP) + { + break; + } } ieIdx = 0; @@ -1424,84 +1744,86 @@ uint8_t BuildAndSendF1SetupReq() f1SetupReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransactionID; f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject; f1SetupReq->protocolIEs.list.array[ieIdx]->value.present =\ - F1SetupRequestIEs__value_PR_TransactionID; + F1SetupRequestIEs__value_PR_TransactionID; f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = \ - TRANS_ID; + TRANS_ID; /*DU ID*/ ieIdx++; f1SetupReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_ID; f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject; f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = \ - F1SetupRequestIEs__value_PR_GNB_DU_ID; + F1SetupRequestIEs__value_PR_GNB_DU_ID; f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size =\ - sizeof(uint8_t); + sizeof(uint8_t); DU_ALLOC(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf,\ - f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size); + f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size); if(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf == \ - NULLP) + NULLP) { - break; + break; } f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0] =\ - duCfgParam.duId; - + duCfgParam.duId; + /* DU name IE is of type printableString_t which wireshark is unable to decode. + * However this string is decoded successfully on online decoders. + * Since this is an optional IE and the value received in it are not + * used as of now, eliminating this IE for now to avoid wireshark error. + */ /*DU Name*/ if(duCfgParam.duName != NULL) { - ieIdx++; - f1SetupReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_Name; - f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore; - f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = F1SetupRequestIEs__value_PR_GNB_DU_Name; - f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.size =\ - strlen((char *)duCfgParam.duName); - DU_ALLOC(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.\ - GNB_DU_Name.buf, strlen((char *)duCfgParam.duName)); - if(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.\ - buf == NULLP) - { - break; - } - strcpy((char*)f1SetupReq->protocolIEs.list.array[ieIdx]->value.\ - choice.GNB_DU_Name.buf, - (char*)&duCfgParam.duName); - + ieIdx++; + f1SetupReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_Name; + f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore; + f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = F1SetupRequestIEs__value_PR_GNB_DU_Name; + f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.size = strlen((char *)duCfgParam.duName); + DU_ALLOC(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.buf, \ + f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.size); + if(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.buf == NULLP) + { + break; + } + strcpy((char*)f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.buf, + (char*)duCfgParam.duName); } /*Served Cell list */ ieIdx++; f1SetupReq->protocolIEs.list.array[ieIdx]->id = \ - ProtocolIE_ID_id_gNB_DU_Served_Cells_List; + ProtocolIE_ID_id_gNB_DU_Served_Cells_List; f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject; f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = \ - F1SetupRequestIEs__value_PR_GNB_DU_Served_Cells_List; + F1SetupRequestIEs__value_PR_GNB_DU_Served_Cells_List; duServedCell = &f1SetupReq->protocolIEs.list.\ - array[ieIdx]->value.choice.GNB_DU_Served_Cells_List; + array[ieIdx]->value.choice.GNB_DU_Served_Cells_List; if(BuildServedCellList(duServedCell)) { - break; + break; } + /*RRC Version*/ ieIdx++; f1SetupReq->protocolIEs.list.array[ieIdx]->id = \ - ProtocolIE_ID_id_GNB_DU_RRC_Version ; + ProtocolIE_ID_id_GNB_DU_RRC_Version ; f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject; f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = \ - F1SetupRequestIEs__value_PR_RRC_Version; + F1SetupRequestIEs__value_PR_RRC_Version; rrcVer = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.RRC_Version; if(BuildRrcVer(rrcVer)) { - break; + break; } + xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg); /* Encode the F1SetupRequest type as APER */ memset(encBuf, 0, ENC_BUF_MAX_LEN); encBufSize = 0; encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\ - encBuf); + encBuf); /* Encode results */ if(encRetVal.encoded == ENCODE_FAIL) @@ -1520,16 +1842,9 @@ uint8_t BuildAndSendF1SetupReq() } #endif - duCb.f1SetupReqAndRspMsg.f1MsgReqBufSize = encBufSize; - DU_ALLOC(duCb.f1SetupReqAndRspMsg.f1MsgReqBuf, encBufSize); - if(duCb.f1SetupReqAndRspMsg.f1MsgReqBuf == NULLP) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed to store the encoding of f1setup req"); - return RFAILED; - } - memcpy(duCb.f1SetupReqAndRspMsg.f1MsgReqBuf, &encBuf, duCb.f1SetupReqAndRspMsg.f1MsgReqBufSize); - } + } + addOrModifyE2NodeComponent(E2_NODE_COMPONENT_ADD, true, encBufSize, encBuf); /* Sending msg */ if(sendF1APMsg() != ROK) { @@ -1650,7 +1965,7 @@ void freeCellsToModifyItem(Served_Cells_To_Modify_Item_t *modifyItem) } } DU_FREE(modifyItem->served_Cell_Information.measurementTimingConfiguration.buf,\ - modifyItem->served_Cell_Information.measurementTimingConfiguration.size); + modifyItem->served_Cell_Information.measurementTimingConfiguration.size); } /******************************************************************* @@ -1671,12 +1986,13 @@ void freeCellsToModifyItem(Served_Cells_To_Modify_Item_t *modifyItem) * ****************************************************************/ void FreeDUConfigUpdate(F1AP_PDU_t *f1apDuCfg) { - uint8_t ieIdx=0, cellModifyIdx=0, cellDeleteIdx=0; + uint8_t idx=0,ieIdx=0, cellModifyIdx=0, cellDeleteIdx=0; GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP; Served_Cells_To_Modify_List_t *cellsToModify=NULLP; Served_Cells_To_Delete_List_t *cellsToDelete=NULLP; Served_Cells_To_Delete_Item_t *deleteItem = NULLP; Served_Cells_To_Delete_ItemIEs_t *deleteItemIe = NULLP; + Cells_Status_ItemIEs_t *cellStatusItemIE; if(f1apDuCfg != NULLP) { @@ -1744,6 +2060,18 @@ void FreeDUConfigUpdate(F1AP_PDU_t *f1apDuCfg) duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size); break; } + case ProtocolIE_ID_id_Cells_Status_List: + { + for(idx = 0; idx < duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.Cells_Status_List.list.count; idx++) + { + cellStatusItemIE = (Cells_Status_ItemIEs_t *)duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.Cells_Status_List.list.array[idx]; + DU_FREE(cellStatusItemIE->value.choice.Cells_Status_Item.nRCGI.nRCellIdentity.buf, cellStatusItemIE->value.choice.Cells_Status_Item.nRCGI.nRCellIdentity.size); + DU_FREE(cellStatusItemIE->value.choice.Cells_Status_Item.nRCGI.pLMN_Identity.buf, cellStatusItemIE->value.choice.Cells_Status_Item.nRCGI.pLMN_Identity.size); + DU_FREE(duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.Cells_Status_List.list.array[idx],sizeof(Cells_Status_ItemIEs_t)); + } + DU_FREE(duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.Cells_Status_List.list.array,\ + duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.Cells_Status_List.list.size); + } } DU_FREE(duCfgUpdate->protocolIEs.list.array[ieIdx],\ sizeof(GNBDUConfigurationUpdateIEs_t)); @@ -2087,15 +2415,8 @@ uint8_t fillServedCellInfo(Served_Cell_Information_t *srvCellInfo) #endif /*Measurement timing Config*/ - srvCellInfo->measurementTimingConfiguration.size = sizeof(uint8_t); - DU_ALLOC(srvCellInfo->measurementTimingConfiguration.\ - buf,srvCellInfo->measurementTimingConfiguration.size); - if(srvCellInfo->measurementTimingConfiguration.buf == NULLP) - { + if(BuildMeasTimingConf(&srvCellInfo->measurementTimingConfiguration) != ROK) return RFAILED; - } - srvCellInfo->measurementTimingConfiguration.\ - buf[0] = duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg; return ROK; } @@ -2243,6 +2564,7 @@ uint8_t fillCellToDeleteItem(struct Served_Cells_To_Delete_ItemIEs *deleteItemIe fillBitString(&deleteItem->oldNRCGI.nRCellIdentity, ODU_VALUE_FOUR, ODU_VALUE_FIVE, duCfgParam.sib1Params.cellIdentity); return ROK; } + /******************************************************************* * * @brief Builds ServCellToDeleteList @@ -2294,6 +2616,56 @@ uint8_t buildServCellToDeleteList(Served_Cells_To_Delete_List_t *cellsToDelete) return ROK; } +/******************************************************************* + * + * @brief Builds CellsStatusList + * + * @details + * + * Function : buildCellsStatusList + * + * Functionality: Builds the Cell Status List + * + * @params[in] Pointer to Cells_Status_List_t * + * + * @return ROK - success + * RFAILED - failure + * + *****************************************************************/ +uint8_t buildCellsStatusList(Cells_Status_List_t *cellStatusList) +{ + uint8_t elementCnt = 0, idx = 0, ret = ROK; + Cells_Status_ItemIEs_t *cellStatusItemIE; + + elementCnt = 1; + cellStatusList->list.count = elementCnt; + cellStatusList->list.size = elementCnt * sizeof(Cells_Status_ItemIEs_t *); + DU_ALLOC(cellStatusList->list.array, cellStatusList->list.size); + + for(idx = 0; idx < elementCnt; idx++) + { + DU_ALLOC(cellStatusList->list.array[idx], sizeof(Cells_Status_ItemIEs_t)); + if(!cellStatusList->list.array[idx]) + { + DU_LOG("ERROR --> F1AP: buildCellsStatusList() memory allocation failure"); + return RFAILED; + } + } + idx = 0; + cellStatusItemIE = (Cells_Status_ItemIEs_t *)cellStatusList->list.array[idx]; + cellStatusItemIE->id = ProtocolIE_ID_id_Cells_Status_Item; + cellStatusItemIE->criticality = Criticality_reject; + cellStatusItemIE->value.present = Cells_Status_ItemIEs__value_PR_Cells_Status_Item; + ret = BuildNrcgi(&cellStatusItemIE->value.choice.Cells_Status_Item.nRCGI); + if(ret == RFAILED) + { + DU_LOG("ERROR --> F1AP: buildCellsStatusList() NRCGI failed"); + return RFAILED; + } + cellStatusItemIE->value.choice.Cells_Status_Item.service_status.service_state = Service_State_in_service; + return ROK; +} + /******************************************************************* * * @brief Builds and sends the DUConfigUpdate @@ -2349,7 +2721,7 @@ uint8_t BuildAndSendDUConfigUpdate(ServCellAction servCellAction) InitiatingMessage__value_PR_GNBDUConfigurationUpdate; duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->value.\ choice.GNBDUConfigurationUpdate; - elementCnt = 3; + elementCnt = 4; duCfgUpdate->protocolIEs.list.count = elementCnt; duCfgUpdate->protocolIEs.list.size = \ elementCnt * sizeof(GNBDUConfigurationUpdateIEs_t*); @@ -2416,7 +2788,21 @@ uint8_t BuildAndSendDUConfigUpdate(ServCellAction servCellAction) } } - // NOTE :GNB DU SYS INFO:MIB AND SIB1 INFORMATION TO BE BUILT AND FILLED HERE + // TODO :GNB DU SYS INFO:MIB AND SIB1 INFORMATION TO BE BUILT AND FILLED HERE + + /*Cell Status List*/ + ieIdx++; + duCfgUpdate->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_Cells_Status_List; + duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject; + duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \ + GNBDUConfigurationUpdateIEs__value_PR_Cells_Status_List; + ret = buildCellsStatusList(&duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.Cells_Status_List); + if(ret == RFAILED) + { + DU_LOG("ERROR --> DU APP : BuildAndSendDUConfigUpdate(): Cell Status List building failed"); + break; + } + /*GNB DU ID */ ieIdx++; duCfgUpdate->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_ID; @@ -2551,7 +2937,7 @@ uint8_t BuildAndSendULRRCMessageTransfer(DuUeCb *ueCb, uint8_t lcId, \ while(true) { - DU_LOG("\n INFO --> F1AP : Building UL RRC Message Transfer Message\n"); + DU_LOG("\nINFO --> F1AP : Building UL RRC Message Transfer Message\n"); DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t)); if(f1apMsg == NULLP) @@ -2652,7 +3038,7 @@ uint8_t BuildAndSendULRRCMessageTransfer(DuUeCb *ueCb, uint8_t lcId, \ } else { - DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for ULRRCMessageTransfer\n"); + DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for ULRRCMessageTransfer\n"); #ifdef DEBUG_ASN_PRINT for(int i=0; i< encBufSize; i++) { @@ -2708,7 +3094,7 @@ uint8_t BuildTagConfig(DuUeCb *ueCb, struct TAG_Config *tagConfig) if(ueCb == NULLP) elementCnt = ODU_VALUE_ONE; else - elementCnt = ueCb->macUeCfg.macCellGrpCfg.tagCfg.addModListCount; + elementCnt = ueCb->duMacUeCfg.macCellGrpCfg.tagCfg.addModListCount; tagList = tagConfig->tag_ToAddModList; tagList->list.count = elementCnt; @@ -2743,8 +3129,8 @@ uint8_t BuildTagConfig(DuUeCb *ueCb, struct TAG_Config *tagConfig) { for(idx=0; idxlist.count; idx++) { - tagList->list.array[idx]->tag_Id = ueCb->macUeCfg.macCellGrpCfg.tagCfg.addModList[idx].tagId; - tagList->list.array[idx]->timeAlignmentTimer = ueCb->macUeCfg.macCellGrpCfg.tagCfg.addModList[idx].timeAlignTimer; + tagList->list.array[idx]->tag_Id = ueCb->duMacUeCfg.macCellGrpCfg.tagCfg.addModList[idx].tagId; + tagList->list.array[idx]->timeAlignmentTimer = ueCb->duMacUeCfg.macCellGrpCfg.tagCfg.addModList[idx].timeAlignTimer; } } @@ -2791,13 +3177,13 @@ uint8_t BuildPhrConfig(DuUeCb *ueCb, struct MAC_CellGroupConfig__phr_Config *phr } else { - phrConfig->choice.setup->phr_PeriodicTimer = ueCb->macUeCfg.macCellGrpCfg.phrCfg.periodicTimer; - phrConfig->choice.setup->phr_ProhibitTimer = ueCb->macUeCfg.macCellGrpCfg.phrCfg.prohibitTimer; - phrConfig->choice.setup->phr_Tx_PowerFactorChange = ueCb->macUeCfg.macCellGrpCfg.phrCfg.txPowerFactor; - phrConfig->choice.setup->multiplePHR = ueCb->macUeCfg.macCellGrpCfg.phrCfg.multiplePHR; - phrConfig->choice.setup->dummy = ueCb->macUeCfg.macCellGrpCfg.phrCfg.dummy; - phrConfig->choice.setup->phr_Type2OtherCell = ueCb->macUeCfg.macCellGrpCfg.phrCfg.phrType2OtherCell; - phrConfig->choice.setup->phr_ModeOtherCG = ueCb->macUeCfg.macCellGrpCfg.phrCfg.phrOtherCG; + phrConfig->choice.setup->phr_PeriodicTimer = ueCb->duMacUeCfg.macCellGrpCfg.phrCfg.periodicTimer; + phrConfig->choice.setup->phr_ProhibitTimer = ueCb->duMacUeCfg.macCellGrpCfg.phrCfg.prohibitTimer; + phrConfig->choice.setup->phr_Tx_PowerFactorChange = ueCb->duMacUeCfg.macCellGrpCfg.phrCfg.txPowerFactor; + phrConfig->choice.setup->multiplePHR = ueCb->duMacUeCfg.macCellGrpCfg.phrCfg.multiplePHR; + phrConfig->choice.setup->dummy = ueCb->duMacUeCfg.macCellGrpCfg.phrCfg.dummy; + phrConfig->choice.setup->phr_Type2OtherCell = ueCb->duMacUeCfg.macCellGrpCfg.phrCfg.phrType2OtherCell; + phrConfig->choice.setup->phr_ModeOtherCG = ueCb->duMacUeCfg.macCellGrpCfg.phrCfg.phrOtherCG; } return ROK; @@ -2829,8 +3215,8 @@ uint8_t BuildBsrConfig(DuUeCb *ueCb, struct BSR_Config *bsrConfig) } else { - bsrConfig->periodicBSR_Timer = convertBsrPeriodicTmrValueToEnum(ueCb->macUeCfg.macCellGrpCfg.bsrTmrCfg.periodicTimer); - bsrConfig->retxBSR_Timer = convertBsrRetxTmrValueToEnum(ueCb->macUeCfg.macCellGrpCfg.bsrTmrCfg.retxTimer); + bsrConfig->periodicBSR_Timer = convertBsrPeriodicTmrValueToEnum(ueCb->duMacUeCfg.macCellGrpCfg.bsrTmrCfg.periodicTimer); + bsrConfig->retxBSR_Timer = convertBsrRetxTmrValueToEnum(ueCb->duMacUeCfg.macCellGrpCfg.bsrTmrCfg.retxTimer); bsrConfig->logicalChannelSR_DelayTimer = NULLP; DU_ALLOC(bsrConfig->logicalChannelSR_DelayTimer, sizeof(long)); @@ -2839,7 +3225,7 @@ uint8_t BuildBsrConfig(DuUeCb *ueCb, struct BSR_Config *bsrConfig) DU_LOG("\nERROR --> DU APP: Memory allocation failed in BuildBsrConfig"); return RFAILED; } - *(bsrConfig->logicalChannelSR_DelayTimer) = convertLcSrDelayTmrValueToEnum(ueCb->macUeCfg.macCellGrpCfg.bsrTmrCfg.srDelayTimer); + *(bsrConfig->logicalChannelSR_DelayTimer) = convertLcSrDelayTmrValueToEnum(ueCb->duMacUeCfg.macCellGrpCfg.bsrTmrCfg.srDelayTimer); } return ROK; @@ -2878,7 +3264,7 @@ uint8_t BuildSchedulingReqConfig(DuUeCb *ueCb, struct SchedulingRequestConfig *s if(ueCb == NULLP) elementCnt = ODU_VALUE_ONE; else - elementCnt = ueCb->macUeCfg.macCellGrpCfg.schReqCfg.addModListCount; + elementCnt = ueCb->duMacUeCfg.macCellGrpCfg.schReqCfg.addModListCount; schReqList = schedulingRequestConfig->schedulingRequestToAddModList; schReqList->list.count = elementCnt; @@ -2922,7 +3308,7 @@ uint8_t BuildSchedulingReqConfig(DuUeCb *ueCb, struct SchedulingRequestConfig *s { for(idx=0; idxlist.count; idx++) { - schReqList->list.array[idx]->schedulingRequestId = ueCb->macUeCfg.macCellGrpCfg.schReqCfg.addModList[idx].schedReqId; + schReqList->list.array[idx]->schedulingRequestId = ueCb->duMacUeCfg.macCellGrpCfg.schReqCfg.addModList[idx].schedReqId; schReqList->list.array[idx]->sr_ProhibitTimer = NULLP; DU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long)); @@ -2931,8 +3317,8 @@ uint8_t BuildSchedulingReqConfig(DuUeCb *ueCb, struct SchedulingRequestConfig *s DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig"); return RFAILED; } - *(schReqList->list.array[idx]->sr_ProhibitTimer) = ueCb->macUeCfg.macCellGrpCfg.schReqCfg.addModList[idx].srProhibitTmr; - schReqList->list.array[idx]->sr_TransMax = ueCb->macUeCfg.macCellGrpCfg.schReqCfg.addModList[idx].srTransMax; + *(schReqList->list.array[idx]->sr_ProhibitTimer) = ueCb->duMacUeCfg.macCellGrpCfg.schReqCfg.addModList[idx].srProhibitTmr; + schReqList->list.array[idx]->sr_TransMax = ueCb->duMacUeCfg.macCellGrpCfg.schReqCfg.addModList[idx].srTransMax; } } @@ -2981,7 +3367,8 @@ uint8_t BuildRlcConfigAm(AmBearerCfg *amCfg, struct RLC_Config *rlcConfig) /* Fill default AM UL configuration if input pointer to DU database is NULL */ if(amCfg == NULLP) { - *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN; + + *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN_12BIT; /*As per Spec 38.331, "Network configures only value size12 in SN-FieldLengthAM for SRB"*/ rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = T_POLL_RETRANSMIT; rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU; rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE; @@ -3008,7 +3395,7 @@ uint8_t BuildRlcConfigAm(AmBearerCfg *amCfg, struct RLC_Config *rlcConfig) /* Fill default AM DL configuration if input pointer to DU database is NULL */ if(amCfg == NULLP) { - *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN; + *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN_12BIT; /*As per Spec 38.331, "Network configures only value size12 in SN-FieldLengthAM for SRB"*/ rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY; rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT; } @@ -3322,12 +3709,12 @@ uint8_t BuildRlcBearerToAddModList(DuUeCb *ueCb, struct CellGroupConfigRrc__rlc_ if(ueCb == NULLP) elementCnt = 1; else if(ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY) - elementCnt = ueCb->rlcUeCfg.numLcs; + elementCnt = ueCb->duRlcUeCfg.numLcs; else { - for(lcIdx = 0; lcIdxrlcUeCfg.numLcs; lcIdx++) + for(lcIdx = 0; lcIdxduRlcUeCfg.numLcs; lcIdx++) { - if(ueCb->rlcUeCfg.rlcLcCfg[lcIdx].isLcAddModRspSent == false) + if(ueCb->duRlcUeCfg.rlcLcCfg[lcIdx].rlcBearerCfg.isLcAddModRspSent == false) elementCnt++; } } @@ -3398,13 +3785,13 @@ uint8_t BuildRlcBearerToAddModList(DuUeCb *ueCb, struct CellGroupConfigRrc__rlc_ else { idx=0; - for(lcIdx=0; lcIdxrlcUeCfg.numLcs; lcIdx++) + for(lcIdx=0; lcIdxduRlcUeCfg.numLcs; lcIdx++) { - if((ueCb->f1UeDb->actionType != UE_CTXT_CFG_QUERY) && (ueCb->rlcUeCfg.rlcLcCfg[lcIdx].isLcAddModRspSent == true)) + if((ueCb->f1UeDb->actionType != UE_CTXT_CFG_QUERY) && (ueCb->duRlcUeCfg.rlcLcCfg[lcIdx].rlcBearerCfg.isLcAddModRspSent == true)) continue; /* Fill Logical channel identity */ - rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->rlcUeCfg.rlcLcCfg[lcIdx].lcId; + rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->duRlcUeCfg.rlcLcCfg[lcIdx].rlcBearerCfg.lcId; /* Fill Radio Bearer Id and type (DRB/SRB) for this logical channel */ DU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer)); @@ -3414,20 +3801,20 @@ uint8_t BuildRlcBearerToAddModList(DuUeCb *ueCb, struct CellGroupConfigRrc__rlc_ return RFAILED; } rlcBearerList->list.array[idx]->servedRadioBearer->present = \ - covertRbTypeFromIntEnumToRrcEnum(ueCb->rlcUeCfg.rlcLcCfg[lcIdx].rbType); + covertRbTypeFromIntEnumToRrcEnum(ueCb->duRlcUeCfg.rlcLcCfg[lcIdx].rlcBearerCfg.rbType); switch(rlcBearerList->list.array[idx]->servedRadioBearer->present) { case RLC_BearerConfig__servedRadioBearer_PR_srb_Identity: - rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = ueCb->rlcUeCfg.rlcLcCfg[lcIdx].rbId; + rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = ueCb->duRlcUeCfg.rlcLcCfg[lcIdx].rlcBearerCfg.rbId; break; case RLC_BearerConfig__servedRadioBearer_PR_drb_Identity: - rlcBearerList->list.array[idx]->servedRadioBearer->choice.drb_Identity = ueCb->rlcUeCfg.rlcLcCfg[lcIdx].rbId; + rlcBearerList->list.array[idx]->servedRadioBearer->choice.drb_Identity = ueCb->duRlcUeCfg.rlcLcCfg[lcIdx].rlcBearerCfg.rbId; break; case RLC_BearerConfig__servedRadioBearer_PR_NOTHING: default: break; } - ueCb->rlcUeCfg.rlcLcCfg[lcIdx].isLcAddModRspSent = true; + ueCb->duRlcUeCfg.rlcLcCfg[lcIdx].rlcBearerCfg.isLcAddModRspSent = true; rlcBearerList->list.array[idx]->reestablishRLC = NULLP; @@ -3439,7 +3826,7 @@ uint8_t BuildRlcBearerToAddModList(DuUeCb *ueCb, struct CellGroupConfigRrc__rlc_ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList"); return RFAILED; } - if(BuildRlcConfig(&ueCb->rlcUeCfg.rlcLcCfg[lcIdx], rlcBearerList->list.array[idx]->rlc_Config) != ROK) + if(BuildRlcConfig(&ueCb->duRlcUeCfg.rlcLcCfg[lcIdx].rlcBearerCfg, rlcBearerList->list.array[idx]->rlc_Config) != ROK) { DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed"); return RFAILED; @@ -3453,11 +3840,11 @@ uint8_t BuildRlcBearerToAddModList(DuUeCb *ueCb, struct CellGroupConfigRrc__rlc_ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList"); return RFAILED; } - for(macLcIdx = 0; macLcIdx < ueCb->macUeCfg.numLcs; macLcIdx++) + for(macLcIdx = 0; macLcIdx < ueCb->duMacUeCfg.numLcs; macLcIdx++) { - if(ueCb->macUeCfg.lcCfgList[macLcIdx].lcId == ueCb->rlcUeCfg.rlcLcCfg[lcIdx].lcId) + if(ueCb->duMacUeCfg.lcCfgList[macLcIdx].lcConfig.lcId == ueCb->duRlcUeCfg.rlcLcCfg[lcIdx].rlcBearerCfg.lcId) { - if(BuildMacLCConfig(&ueCb->macUeCfg.lcCfgList[macLcIdx], rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK) + if(BuildMacLCConfig(&ueCb->duMacUeCfg.lcCfgList[macLcIdx].lcConfig, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK) { DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed"); return RFAILED; @@ -4028,14 +4415,16 @@ elementCnt = pdschCfg->numTimeDomRsrcAlloc; for(idx = 0; idx < elementCnt; idx++) { timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx]; - DU_ALLOC(timeDomAlloc->k0, sizeof(long)); - if(!timeDomAlloc->k0) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList"); - return RFAILED; - } if(pdschCfg->timeDomRsrcAllociList[idx].k0) + { + DU_ALLOC(timeDomAlloc->k0, sizeof(long)); + if(!timeDomAlloc->k0) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList"); + return RFAILED; + } *(timeDomAlloc->k0) = *(pdschCfg->timeDomRsrcAllociList[idx].k0); + } timeDomAlloc->mappingType = pdschCfg->timeDomRsrcAllociList[idx].mappingType; timeDomAlloc->startSymbolAndLength = pdschCfg->timeDomRsrcAllociList[idx].startSymbolAndLength; } @@ -5450,6 +5839,7 @@ uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *reso DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcAddModList"); return RFAILED; } + resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID; return ROK; @@ -5615,7 +6005,6 @@ uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg) { return RFAILED; } - srsCfg->tpc_Accumulation = NULLP; return ROK; @@ -5654,6 +6043,7 @@ uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *pusch puschCfg->choice.setup->rateMatching = NULLP; puschCfg->choice.setup->xOverhead = NULLP; puschCfg->choice.setup->ext1 = NULLP; + DU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1)); if(!puschCfg->choice.setup->ext1) { @@ -5678,6 +6068,7 @@ uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *pusch return RFAILED; } *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED; + return ROK; } @@ -5799,13 +6190,13 @@ uint8_t BuildInitialUlBWP(InitialUlBwp *initUlBwp, BWP_UplinkDedicated_t *ulBwp) * RFAILED - failure * * ****************************************************************/ -uint8_t BuildUlCfg(ServCellCfgInfo *servCellCfg, UplinkConfig_t *ulCfg) +uint8_t BuildUlCfg(ServCellRecfgInfo *servCellRecfg, UplinkConfig_t *ulCfg) { InitialUlBwp *initUlBwp = NULLP; - if(servCellCfg) + if(servCellRecfg) { - initUlBwp = &servCellCfg->initUlBwp; + initUlBwp = &servCellRecfg->initUlBwp; } ulCfg->initialUplinkBWP = NULLP; @@ -5830,10 +6221,10 @@ uint8_t BuildUlCfg(ServCellCfgInfo *servCellCfg, UplinkConfig_t *ulCfg) DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg"); return RFAILED; } - if(servCellCfg == NULLP) + if(servCellRecfg == NULLP) *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID; else - *(ulCfg->firstActiveUplinkBWP_Id) = servCellCfg->firstActvUlBwpId; + *(ulCfg->firstActiveUplinkBWP_Id) = servCellRecfg->firstActvUlBwpId; ulCfg->pusch_ServingCellConfig = NULLP; DU_ALLOC(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig)); @@ -5987,18 +6378,18 @@ uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg) * * Functionality: Builds DL BWP to add/modify list * - * @params[in] ServCellCfgInfo *servCellCfg, + * @params[in] ServCellRecfgInfo *servCellRecfg, * struct ServingCellConfig__downlinkBWP_ToAddModList *dlBwpAddModList * * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t BuildDlBwpToAddModList(ServCellCfgInfo *servCellCfg, struct ServingCellConfig__downlinkBWP_ToAddModList *dlBwpAddModList) +uint8_t BuildDlBwpToAddModList(ServCellRecfgInfo *servCellRecfg, struct ServingCellConfig__downlinkBWP_ToAddModList *dlBwpAddModList) { uint8_t elementCnt, idx; - elementCnt = servCellCfg->numDlBwpToAdd; + elementCnt = servCellRecfg->numDlBwpToAddOrMod; dlBwpAddModList->list.count = elementCnt; dlBwpAddModList->list.size = elementCnt * sizeof(struct BWP_Downlink *); dlBwpAddModList->list.array = NULLP; @@ -6021,7 +6412,7 @@ uint8_t BuildDlBwpToAddModList(ServCellCfgInfo *servCellCfg, struct ServingCellC for(idx=0; idxlist.count; idx++) { - dlBwpAddModList->list.array[idx]->bwp_Id = servCellCfg->DlBwpToAddList[idx].bwpId; + dlBwpAddModList->list.array[idx]->bwp_Id = servCellRecfg->dlBwpToAddOrModList[idx].bwpId; dlBwpAddModList->list.array[idx]->bwp_Common = NULLP; dlBwpAddModList->list.array[idx]->bwp_Dedicated = NULLP; } @@ -6045,24 +6436,18 @@ uint8_t BuildDlBwpToAddModList(ServCellCfgInfo *servCellCfg, struct ServingCellC * ****************************************************************/ uint8_t BuildSpCellCfgDed(DuUeCb *ueCb, ServingCellConfig_t *srvCellCfg) { - ServCellCfgInfo *servCellCfg = NULLP; + ServCellRecfgInfo *servCellRecfg = NULLP; InitialDlBwp *initDlBwp = NULLP; PdschServCellCfg *pdschServCellDb = NULLP; if(ueCb) { - servCellCfg = &ueCb->macUeCfg.spCellCfg.servCellCfg; - initDlBwp = &servCellCfg->initDlBwp; - pdschServCellDb = &servCellCfg->pdschServCellCfg; + servCellRecfg = &ueCb->duMacUeCfg.spCellCfg.servCellCfg; + initDlBwp = &servCellRecfg->initDlBwp; + pdschServCellDb = &servCellRecfg->pdschServCellCfg; } srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP; - DU_ALLOC(srvCellCfg->tdd_UL_DL_ConfigurationDedicated, sizeof(TDD_UL_DL_ConfigDedicated_t)); - if(!srvCellCfg->tdd_UL_DL_ConfigurationDedicated) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed"); - return RFAILED; - } srvCellCfg->initialDownlinkBWP = NULLP; DU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t)); @@ -6081,7 +6466,7 @@ uint8_t BuildSpCellCfgDed(DuUeCb *ueCb, ServingCellConfig_t *srvCellCfg) srvCellCfg->downlinkBWP_ToReleaseList = NULLP; srvCellCfg->downlinkBWP_ToAddModList = NULLP; - if(ueCb && ueCb->macUeCfg.spCellCfg.servCellCfg.numDlBwpToAdd) + if(ueCb && ueCb->duMacUeCfg.spCellCfg.servCellCfg.numDlBwpToAddOrMod) { DU_ALLOC(srvCellCfg->downlinkBWP_ToAddModList, sizeof(struct ServingCellConfig__downlinkBWP_ToAddModList)); if(srvCellCfg->downlinkBWP_ToAddModList == NULLP) @@ -6090,7 +6475,7 @@ uint8_t BuildSpCellCfgDed(DuUeCb *ueCb, ServingCellConfig_t *srvCellCfg) return RFAILED; } - if(BuildDlBwpToAddModList(&ueCb->macUeCfg.spCellCfg.servCellCfg, srvCellCfg->downlinkBWP_ToAddModList) != ROK) + if(BuildDlBwpToAddModList(&ueCb->duMacUeCfg.spCellCfg.servCellCfg, srvCellCfg->downlinkBWP_ToAddModList) != ROK) { DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed"); return RFAILED; @@ -6107,7 +6492,7 @@ uint8_t BuildSpCellCfgDed(DuUeCb *ueCb, ServingCellConfig_t *srvCellCfg) if(ueCb == NULLP) *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID; else - *(srvCellCfg->firstActiveDownlinkBWP_Id) = ueCb->macUeCfg.spCellCfg.servCellCfg.firstActvDlBwpId; + *(srvCellCfg->firstActiveDownlinkBWP_Id) = ueCb->duMacUeCfg.spCellCfg.servCellCfg.firstActvDlBwpId; srvCellCfg->bwp_InactivityTimer = NULLP; @@ -6121,7 +6506,7 @@ uint8_t BuildSpCellCfgDed(DuUeCb *ueCb, ServingCellConfig_t *srvCellCfg) if(ueCb == NULLP) *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID; else - *(srvCellCfg->defaultDownlinkBWP_Id) = ueCb->macUeCfg.spCellCfg.servCellCfg.defaultDlBwpId; + *(srvCellCfg->defaultDownlinkBWP_Id) = ueCb->duMacUeCfg.spCellCfg.servCellCfg.defaultDlBwpId; srvCellCfg->uplinkConfig = NULLP; DU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t)); @@ -6131,7 +6516,7 @@ uint8_t BuildSpCellCfgDed(DuUeCb *ueCb, ServingCellConfig_t *srvCellCfg) return RFAILED; } - if(BuildUlCfg(servCellCfg, srvCellCfg->uplinkConfig) != ROK) + if(BuildUlCfg(servCellRecfg, srvCellCfg->uplinkConfig) != ROK) { DU_LOG("\nERROR --> F1AP : BuildUlCfg failed"); return RFAILED; @@ -6664,7 +7049,7 @@ uint8_t BuildSpCellConfigCommon(ServingCellConfigCommon_t *spCellConfigCommon) convertSsbPeriodicityValueToEnum(duCfgParam.sib1Params.srvCellCfgCommSib.ssbPrdServingCell); /* DMRS Type A position */ - spCellConfigCommon->dmrs_TypeA_Position = convertDmrsTypeAPosValueToEnum(duCfgParam.macCellCfg.dmrsTypeAPos); + spCellConfigCommon->dmrs_TypeA_Position = convertDmrsTypeAPosValueToEnum(duCfgParam.macCellCfg.ssbCfg.dmrsTypeAPos); /* SSB subcarrier spacing */ DU_ALLOC(spCellConfigCommon->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t)); @@ -6889,7 +7274,7 @@ uint8_t BuildSpCellCfg(DuUeCb *ueCb, SpCellConfig_t *spCellCfg) if(ueCb == NULLP) *(spCellCfg->servCellIndex) = SERV_CELL_IDX; else - *(spCellCfg->servCellIndex) = ueCb->macUeCfg.spCellCfg.servCellIdx; + *(spCellCfg->servCellIndex) = ueCb->duMacUeCfg.spCellCfg.servCellIdx; spCellCfg->reconfigurationWithSync = NULLP; if(ueCb && (ueCb->ueState == UE_HANDIN_IN_PROGRESS)) @@ -6971,8 +7356,8 @@ uint8_t BuildPhyCellGrpCfg(DuUeCb *ueCb, PhysicalCellGroupConfig_t *phyCellGrpCf } else { - *(phyCellGrpCfg->p_NR_FR1) = ueCb->macUeCfg.phyCellGrpCfg.pNrFr1; - phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = ueCb->macUeCfg.phyCellGrpCfg.pdschHarqAckCodebook; + *(phyCellGrpCfg->p_NR_FR1) = ueCb->duMacUeCfg.phyCellGrpCfg.pNrFr1; + phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = ueCb->duMacUeCfg.phyCellGrpCfg.pdschHarqAckCodebook; } phyCellGrpCfg->tpc_SRS_RNTI = NULLP; @@ -7139,36 +7524,36 @@ uint8_t BuildDrxConfigRrc(DuUeCb *ueCb, struct MAC_CellGroupConfig__drx_ConfigRr DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDrxConfigRrc"); return RFAILED; } - if(ueCb->macUeCfg.macCellGrpCfg.drxCfg.drxOnDurationTimer.onDurationTimerValInMs) + if(ueCb->duMacUeCfg.macCellGrpCfg.drxCfg.drxOnDurationTimer.onDurationTimerValInMs) { drxCfg->choice.setup->drx_onDurationTimer.present = DRX_ConfigRrc__drx_onDurationTimer_PR_milliSeconds; - drxCfg->choice.setup->drx_onDurationTimer.choice.milliSeconds = convertOnDurationTimerMilliSecondsValueToEnum(ueCb->macUeCfg.\ + drxCfg->choice.setup->drx_onDurationTimer.choice.milliSeconds = convertOnDurationTimerMilliSecondsValueToEnum(ueCb->duMacUeCfg.\ macCellGrpCfg.drxCfg.drxOnDurationTimer.onDurationtimerValue.milliSeconds); } else { drxCfg->choice.setup->drx_onDurationTimer.present = DRX_ConfigRrc__drx_onDurationTimer_PR_subMilliSeconds; - drxCfg->choice.setup->drx_onDurationTimer.choice.subMilliSeconds = ueCb->macUeCfg.macCellGrpCfg.drxCfg.\ + drxCfg->choice.setup->drx_onDurationTimer.choice.subMilliSeconds = ueCb->duMacUeCfg.macCellGrpCfg.drxCfg.\ drxOnDurationTimer.onDurationtimerValue.subMilliSeconds; } - drxCfg->choice.setup->drx_InactivityTimer = convertDrxInactivityTimerValueToEnum(ueCb->macUeCfg.macCellGrpCfg.drxCfg.drxInactivityTimer); - drxCfg->choice.setup->drx_HARQ_RTT_TimerDL = ueCb->macUeCfg.macCellGrpCfg.drxCfg.drxHarqRttTimerDl; - drxCfg->choice.setup->drx_HARQ_RTT_TimerUL = ueCb->macUeCfg.macCellGrpCfg.drxCfg.drxHarqRttTimerUl; - drxCfg->choice.setup->drx_RetransmissionTimerDL = convertDrxRetransmissionTimerDlValueToEnum(ueCb->macUeCfg.macCellGrpCfg.drxCfg.\ + drxCfg->choice.setup->drx_InactivityTimer = convertDrxInactivityTimerValueToEnum(ueCb->duMacUeCfg.macCellGrpCfg.drxCfg.drxInactivityTimer); + drxCfg->choice.setup->drx_HARQ_RTT_TimerDL = ueCb->duMacUeCfg.macCellGrpCfg.drxCfg.drxHarqRttTimerDl; + drxCfg->choice.setup->drx_HARQ_RTT_TimerUL = ueCb->duMacUeCfg.macCellGrpCfg.drxCfg.drxHarqRttTimerUl; + drxCfg->choice.setup->drx_RetransmissionTimerDL = convertDrxRetransmissionTimerDlValueToEnum(ueCb->duMacUeCfg.macCellGrpCfg.drxCfg.\ drxRetransmissionTimerDl); - drxCfg->choice.setup->drx_RetransmissionTimerUL = convertDrxRetransmissionTimerUlValueToEnum(ueCb->macUeCfg.macCellGrpCfg.drxCfg.\ + drxCfg->choice.setup->drx_RetransmissionTimerUL = convertDrxRetransmissionTimerUlValueToEnum(ueCb->duMacUeCfg.macCellGrpCfg.drxCfg.\ drxRetransmissionTimerUl); - drxCfg->choice.setup->drx_SlotOffset = ueCb->macUeCfg.macCellGrpCfg.drxCfg.drxSlotOffset; - fillLongCycleOffsetValFromDuCb(ueCb->macUeCfg.macCellGrpCfg.drxCfg.drxLongCycleStartOffset, &drxCfg->choice.setup->drx_LongCycleStartOffset); + drxCfg->choice.setup->drx_SlotOffset = ueCb->duMacUeCfg.macCellGrpCfg.drxCfg.drxSlotOffset; + fillLongCycleOffsetValFromDuCb(ueCb->duMacUeCfg.macCellGrpCfg.drxCfg.drxLongCycleStartOffset, &drxCfg->choice.setup->drx_LongCycleStartOffset); - if(ueCb->macUeCfg.macCellGrpCfg.drxCfg.shortDrxPres) + if(ueCb->duMacUeCfg.macCellGrpCfg.drxCfg.shortDrxPres) { DU_ALLOC(drxCfg->choice.setup->shortDRX, sizeof(struct DRX_ConfigRrc__shortDRX)); if(drxCfg->choice.setup->shortDRX) { - drxCfg->choice.setup->shortDRX->drx_ShortCycle = convertShortDrxCycleLengthValueToEnum(ueCb->macUeCfg.macCellGrpCfg.drxCfg.\ + drxCfg->choice.setup->shortDRX->drx_ShortCycle = convertShortDrxCycleLengthValueToEnum(ueCb->duMacUeCfg.macCellGrpCfg.drxCfg.\ shortDrx.drxShortCycle); - drxCfg->choice.setup->shortDRX->drx_ShortCycleTimer = ueCb->macUeCfg.macCellGrpCfg.drxCfg.shortDrx.drxShortCycleTimer; + drxCfg->choice.setup->shortDRX->drx_ShortCycleTimer = ueCb->duMacUeCfg.macCellGrpCfg.drxCfg.shortDrx.drxShortCycleTimer; } else { @@ -8556,7 +8941,7 @@ uint8_t BuildCellGroupConfigRrc(DuUeCb *ueCb, OCTET_STRING_t *duToCuRrcContainer xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg); memset(encBuf, 0, ENC_BUF_MAX_LEN); encBufSize = 0; - encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf); + encRetVal = uper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf); /* Encode results */ if(encRetVal.encoded == ENCODE_FAIL) { @@ -8881,32 +9266,6 @@ uint8_t BuildAndSendInitialRrcMsgTransfer(uint32_t gnbDuUeF1apId, uint16_t crnti /***** UE SETUP REQUEST *****/ -/******************************************************************* - * - * @brief Free Qos And Snssai Drb Info - * - * @details - * - * Function : freeDrbQosAndSnssaiInfo - * - * Functionality: Free Qos And Snssai Drb Info - * - * @params[in] LcCfg *lcCfg, - * @return void - * - * ****************************************************************/ -void freeDrbQosAndSnssaiInfo(LcCfg *lcCfg) -{ - if(lcCfg->snssai) - { - DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->snssai, sizeof(Snssai)); - } - if(lcCfg->drbQos) - { - DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->drbQos, sizeof(DrbQosInfo)); - } -} - /****************************************************************** * * @brief Function to delete the RLC Lc cfg from UE APP DB @@ -8966,7 +9325,7 @@ void freeRlcLcCfg(RlcBearerCfg *lcCfg) * * ****************************************************************/ -void freeMacLcCfg(LcCfg *lcCfg) +void freeMacLcCfg(LcCfg *lcCfg) { /* Deleting DRBQOS */ if(lcCfg->drbQos) @@ -9711,13 +10070,13 @@ void freeDuUeCfg(UeCtxtActionType actionType, DuUeCfg *ueCfg) { for(lcIdx = 0; lcIdx < ueCfg->numRlcLcs; lcIdx++) { - freeRlcLcCfg(&ueCfg->rlcLcCfg[lcIdx]); + freeRlcLcCfg(&ueCfg->rlcLcCfg[lcIdx].rlcBearerCfg); } } for(lcIdx = 0; lcIdx < ueCfg->numMacLcs; lcIdx++) { - freeMacLcCfg(&ueCfg->macLcCfg[lcIdx]); + freeMacLcCfg(&ueCfg->macLcCfg[lcIdx].lcConfig); } for(lcIdx = 0; lcIdx < ueCfg->numDrb; lcIdx++) @@ -10057,30 +10416,30 @@ uint8_t extractDrbSnssaiCfg(SNSSAI_t *RecvSnssai, Snssai **snssaiToBeShared) * ****************************************************************/ void procRlcLcCfg(uint8_t rbId, uint8_t lcId, uint8_t rbType, uint8_t rlcMode,\ - uint8_t configType, RLC_Config_t *f1RlcCfg, RlcBearerCfg *lcCfg, QoSInformation_t *qoSInformation) + uint8_t configType, RLC_Config_t *f1RlcCfg, DuRlcBearerCfg *lcCfg, QoSInformation_t *qoSInformation) { DRB_Information_t *drbInfo; - lcCfg->rbId = rbId; + lcCfg->rlcBearerCfg.rbId = rbId; lcCfg->configType = configType; if(rbType == RB_TYPE_SRB) { - lcCfg->rbType = RB_TYPE_SRB; - lcCfg->lcId = rbId; - lcCfg->lcType = LCH_DCCH; - lcCfg->rlcMode = RLC_AM; + lcCfg->rlcBearerCfg.rbType = RB_TYPE_SRB; + lcCfg->rlcBearerCfg.lcId = rbId; + lcCfg->rlcBearerCfg.lcType = LCH_DCCH; + lcCfg->rlcBearerCfg.rlcMode = RLC_AM; } else if(rbType == RB_TYPE_DRB) { - lcCfg->rbType = RB_TYPE_DRB; - lcCfg->lcId = lcId; - lcCfg->lcType = LCH_DTCH; - lcCfg->rlcMode = rlcMode; + lcCfg->rlcBearerCfg.rbType = RB_TYPE_DRB; + lcCfg->rlcBearerCfg.lcId = lcId; + lcCfg->rlcBearerCfg.lcType = LCH_DTCH; + lcCfg->rlcBearerCfg.rlcMode = rlcMode; } if(f1RlcCfg) /* rlc mode config recived */ { - extractRlcModeCfg(lcCfg->rlcMode, lcCfg, f1RlcCfg); + extractRlcModeCfg(lcCfg->rlcBearerCfg.rlcMode, &lcCfg->rlcBearerCfg, f1RlcCfg); } if(qoSInformation != NULLP) { @@ -10090,7 +10449,7 @@ void procRlcLcCfg(uint8_t rbId, uint8_t lcId, uint8_t rbType, uint8_t rlcMode,\ QoSInformation_ExtIEs__value_PR_DRB_Information) { drbInfo = &qoSInformation->choice.choice_extension->value.choice.DRB_Information; - if(extractDrbSnssaiCfg(&drbInfo->sNSSAI, &lcCfg->snssai) != ROK) + if(extractDrbSnssaiCfg(&drbInfo->sNSSAI, &lcCfg->rlcBearerCfg.snssai) != ROK) { DU_LOG("\nERROR --> DUAPP: Unable to extract Snssai information at procRlcLcCfg()"); return; @@ -10289,7 +10648,7 @@ uint8_t extractDrbQosCfg(DRB_Information_t *drbInfo, LcCfg *macLcToAdd ) * * ****************************************************************/ uint8_t extractDrbCfg(DRBs_ToBeSetup_Item_t *drbItem, DRBs_ToBeSetupMod_Item_t *drbSetupModItem,\ -DRBs_ToBeModified_Item_t *drbModItem, LcCfg *macLcToAdd, UpTnlCfg *upTnlInfo) +DRBs_ToBeModified_Item_t *drbModItem, DuLcCfg *lcCfgToAdd, UpTnlCfg *upTnlInfo) { DRB_Information_t *drbInfo = NULLP; @@ -10305,7 +10664,7 @@ DRBs_ToBeModified_Item_t *drbModItem, LcCfg *macLcToAdd, UpTnlCfg *upTnlInfo) if(drbItem->qoSInformation.choice.choice_extension->value.present == QoSInformation_ExtIEs__value_PR_DRB_Information) { drbInfo = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information; - if(extractDrbQosCfg(drbInfo , macLcToAdd) != ROK) + if(extractDrbQosCfg(drbInfo , &lcCfgToAdd->lcConfig) != ROK) { DU_LOG("\nERROR --> DUAPP : Failed to extract qos Cfg at extractDrbCfg()"); return RFAILED; @@ -10327,7 +10686,7 @@ DRBs_ToBeModified_Item_t *drbModItem, LcCfg *macLcToAdd, UpTnlCfg *upTnlInfo) QoSInformation_ExtIEs__value_PR_DRB_Information) { drbInfo = &drbSetupModItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information; - if(extractDrbQosCfg(drbInfo , macLcToAdd) != ROK) + if(extractDrbQosCfg(drbInfo , &lcCfgToAdd->lcConfig) != ROK) { DU_LOG("\nERROR --> DUAPP : Failed to extract qos Cfg at extractDrbCfg()"); return RFAILED; @@ -10352,7 +10711,7 @@ DRBs_ToBeModified_Item_t *drbModItem, LcCfg *macLcToAdd, UpTnlCfg *upTnlInfo) QoSInformation_ExtIEs__value_PR_DRB_Information) { drbInfo = &drbModItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information; - if(extractDrbQosCfg(drbInfo , macLcToAdd) != ROK) + if(extractDrbQosCfg(drbInfo , &lcCfgToAdd->lcConfig) != ROK) { DU_LOG("\nERROR --> DUAPP : Failed to extract qos Cfg at extractDrbCfg()"); return RFAILED; @@ -10381,7 +10740,7 @@ DRBs_ToBeModified_Item_t *drbModItem, LcCfg *macLcToAdd, UpTnlCfg *upTnlInfo) * ****************************************************************/ uint8_t extractMacRbCfg(uint8_t lcId, DRBs_ToBeSetup_Item_t *drbCfg,\ -DRBs_ToBeSetupMod_Item_t *drbSetupModCfg, DRBs_ToBeModified_Item_t *drbModCfg, LogicalChannelConfig_t *ulLcCfg, LcCfg *lcCfg, UpTnlCfg *upTnlInfo) +DRBs_ToBeSetupMod_Item_t *drbSetupModCfg, DRBs_ToBeModified_Item_t *drbModCfg, LogicalChannelConfig_t *ulLcCfg, DuLcCfg *lcCfg, UpTnlCfg *upTnlInfo) { if(drbCfg != NULLP) { @@ -10409,20 +10768,21 @@ DRBs_ToBeSetupMod_Item_t *drbSetupModCfg, DRBs_ToBeModified_Item_t *drbModCfg, } else { - lcCfg->drbQos = NULLP; - lcCfg->snssai = NULLP; - if(lcCfg->lcId == SRB2_LCID) - lcCfg->dlLcCfg.lcp = LC_PRIORITY_3; + lcCfg->lcConfig.drbQos = NULLP; + lcCfg->lcConfig.snssai = NULLP; + if(lcCfg->lcConfig.lcId == SRB2_LCID) + lcCfg->lcConfig.dlLcCfg.lcp = LC_PRIORITY_3; else - lcCfg->dlLcCfg.lcp = LC_PRIORITY_1; + lcCfg->lcConfig.dlLcCfg.lcp = LC_PRIORITY_1; + } if(ulLcCfg) { - lcCfg->ulLcCfgPres = true; - extractUlLcCfg(&lcCfg->ulLcCfg, ulLcCfg); + lcCfg->lcConfig.ulLcCfgPres = true; + extractUlLcCfg(&lcCfg->lcConfig.ulLcCfg, ulLcCfg); } else - lcCfg->ulLcCfgPres = false; + lcCfg->lcConfig.ulLcCfgPres = false; return ROK; } @@ -10443,17 +10803,17 @@ DRBs_ToBeSetupMod_Item_t *drbSetupModCfg, DRBs_ToBeModified_Item_t *drbModCfg, uint8_t procMacLcCfg(uint8_t lcId, uint8_t rbType, uint8_t configType, DRBs_ToBeSetup_Item_t *drbItem,\ DRBs_ToBeSetupMod_Item_t *drbSetupModItem, DRBs_ToBeModified_Item_t *drbModItem, LogicalChannelConfig_t *ulLcCfg,\ -LcCfg *lcCfg, UpTnlCfg *upTnlInfo) +DuLcCfg *lcCfg, UpTnlCfg *upTnlInfo) { uint8_t ret = ROK; - lcCfg->lcId = lcId; + lcCfg->lcConfig.lcId = lcId; lcCfg->configType = configType; if(rbType == RB_TYPE_SRB) { ret = extractMacRbCfg(lcId, NULL, NULL, NULL, ulLcCfg, lcCfg, NULL); } - else if(rbType == RB_TYPE_DRB) + else if(rbType == RB_TYPE_DRB && upTnlInfo != NULLP) { if(drbItem != NULL) ret = extractMacRbCfg(lcId, drbItem, NULL, NULL, ulLcCfg, lcCfg, upTnlInfo); @@ -10529,8 +10889,8 @@ uint8_t extractRlcCfgToAddMod(struct CellGroupConfigRrc__rlc_BearerToAddModList } /* Filling RLC/MAC Config*/ - memset(&ueCfgDb->macLcCfg[idx], 0, sizeof(LcCfg)); - memset(&ueCfgDb->rlcLcCfg[idx], 0, sizeof(RlcBearerCfg)); + memset(&ueCfgDb->macLcCfg[idx], 0, sizeof(DuLcCfg)); + memset(&ueCfgDb->rlcLcCfg[idx], 0, sizeof(DuRlcBearerCfg)); procRlcLcCfg(rbId, lcId, rbType, rlcMode, CONFIG_UNKNOWN, f1RlcCfg, &(ueCfgDb->rlcLcCfg[idx]), NULLP); if(procMacLcCfg(lcId, rbType, CONFIG_UNKNOWN, NULL, NULL, NULL, macUlLcCfg, &ueCfgDb->macLcCfg[idx], NULL) != ROK) { @@ -10595,7 +10955,7 @@ void freeMacPdschServCellInfo(PdschServCellCfg *pdsch) * @return void * * ****************************************************************/ -void freeMacServingCellInfo(ServCellCfgInfo *srvCellCfg) +void freeMacServingCellInfo(ServCellRecfgInfo *srvCellCfg) { uint8_t timeDomRsrcIdx; @@ -10626,16 +10986,16 @@ void freeMacServingCellInfo(ServCellCfgInfo *srvCellCfg) * * @details * - * Function : freeUeReCfgCellGrpInfo + * Function : freeUeRecfgCellGrpInfo * * Functionality: Free cell Grp Cfg Info * - * @params[in] MacUeCfg* duUeCfg + * @params[in] DuMacUeCfg* duUeCfg * @return void * * ****************************************************************/ -void freeUeReCfgCellGrpInfo(MacUeCfg *macUeCfg) +void freeUeRecfgCellGrpInfo(DuMacUeCfg *macUeCfg) { freeMacServingCellInfo(&macUeCfg->spCellCfg.servCellCfg); } @@ -11833,8 +12193,8 @@ PucchCfg *storedPucchCfg) * @return ROK/RFAILD * * ****************************************************************/ -uint8_t extractSpCellDedicatedCfg(ServingCellConfig_t *cuSrvCellCfg, ServCellCfgInfo *macSrvCellCfg,\ -ServCellCfgInfo *storedSrvCellCfg) +uint8_t extractSpCellDedicatedCfg(ServingCellConfig_t *cuSrvCellCfg, ServCellRecfgInfo *macSrvCellCfg,\ +ServCellRecfgInfo *storedSrvCellCfg) { uint8_t ret = ROK; BWP_DownlinkDedicated_t *dlBwp = NULLP; @@ -12188,23 +12548,23 @@ void extractDrxConfiguration(struct MAC_CellGroupConfig__drx_ConfigRrc *cuMacCel * * @details * - * Function : extractUeReCfgCellInfo + * Function : extractUeRecfgCellInfo * * Functionality: Fills Reconfig Cell group Info received by CU * * @params[in] CellGroupConfigRrc_t *cellGrp = CellGroupConfigRrc_t information which * is send by CU, which we have stored in F1UeContextSetupDb - * MacUeCfg *MacUeCfg = Used to Store the information, + * DuMacUeCfg *MacUeCfg = Used to Store the information, * which needs to send in other layer, as well as this can be * the variable which stores the information in DuCb, - * MacUeCfg *storedMacUeCfg = Null in case of sending the + * DuMacUeCfg *storedMacUeCfg = Null in case of sending the * information to other layer else it will have copyOfmacUeCfg * which we have stored in F1UeContextSetupDb. * * @return ROK/RFAILED * * ****************************************************************/ -uint8_t extractUeReCfgCellInfo(CellGroupConfigRrc_t *cellGrp, MacUeCfg *macUeCfg, MacUeCfg *storedMacUeCfg) +uint8_t extractUeRecfgCellInfo(CellGroupConfigRrc_t *cellGrp, DuMacUeCfg *macUeCfg, DuMacUeCfg *storedMacUeCfg) { uint8_t ret = ROK; MAC_CellGroupConfig_t *macCellGroup = NULLP; @@ -12695,14 +13055,14 @@ void freeAperDecodeDRBSetup(DRBs_ToBeSetup_List_t *drbSet) * * @details * - * Function : procUeReCfgCellInfo + * Function : procUeRecfgCellInfo * * Functionality: builds Mac Cell Cfg * - * @params[in] MacUeCfg *macUeCfgToSend = Used to Store the information which + * @params[in] DuMacUeCfg *macUeCfgToSend = Used to Store the information which * needs to send in other layer, as well as this can be * the variable which stores the information in DuCb. - * MacUeCfg *storedMacUeCfg = Null in case of sending the + * DuMacUeCfg *storedMacUeCfg = Null in case of sending the * information to other layer else it will have copyOfmacUeCfg * which we have stored in F1UeContextSetupDb * void *cellInfo = CellGroupConfigRrc_t information which is send @@ -12711,7 +13071,7 @@ void freeAperDecodeDRBSetup(DRBs_ToBeSetup_List_t *drbSet) * @return void * * ****************************************************************/ -uint8_t procUeReCfgCellInfo(MacUeCfg *macUeCfgToSend, MacUeCfg *storedMacUeCfg, void *cellInfo) +uint8_t procUeRecfgCellInfo(DuMacUeCfg *macUeCfgToSend, DuMacUeCfg *storedMacUeCfg, void *cellInfo) { uint8_t ret = ROK; CellGroupConfigRrc_t *cellGrp = NULLP; @@ -12719,13 +13079,13 @@ uint8_t procUeReCfgCellInfo(MacUeCfg *macUeCfgToSend, MacUeCfg *storedMacUeCfg, if(cellInfo) { cellGrp = (CellGroupConfigRrc_t *)cellInfo; - ret = extractUeReCfgCellInfo(cellGrp, macUeCfgToSend, storedMacUeCfg); + ret = extractUeRecfgCellInfo(cellGrp, macUeCfgToSend, storedMacUeCfg); if(ret == RFAILED) - DU_LOG("\nERROR --> F1AP : Failed at procUeReCfgCellInfo()"); + DU_LOG("\nERROR --> F1AP : Failed at procUeRecfgCellInfo()"); } if(ret == RFAILED) { - freeUeReCfgCellGrpInfo(macUeCfgToSend); + freeUeRecfgCellGrpInfo(macUeCfgToSend); } return ret; } @@ -12747,7 +13107,7 @@ uint8_t procUeReCfgCellInfo(MacUeCfg *macUeCfgToSend, MacUeCfg *storedMacUeCfg, * RFAILED - failure * * ****************************************************************/ -void duFillModulationDetails(MacUeCfg *ueCfg, MacUeCfg *oldUeCfg, void *ueCap) +void duFillModulationDetails(DuMacUeCfg *ueCfg, DuMacUeCfg *oldUeCfg, void *ueCap) { UE_NR_Capability_t *ueNrCap=NULLP; @@ -12891,7 +13251,7 @@ uint8_t extractCuToDuRrcInfoExt(ProtocolExtensionContainer_4624P16_t *protocolIe if(cellGrpCfg) { memset(cellGrpCfg, 0, sizeof(CellGroupConfigRrc_t)); - rval = aper_decode(0, &asn_DEF_CellGroupConfigRrc, (void **)&cellGrpCfg, + rval = uper_decode(0, &asn_DEF_CellGroupConfigRrc, (void **)&cellGrpCfg, extIeInfo->extensionValue.choice.CellGroupConfig.buf, recvBufLen, 0, 0); if(rval.code == RC_FAIL || rval.code == RC_WMORE) { @@ -12933,19 +13293,19 @@ uint8_t extractCuToDuRrcInfoExt(ProtocolExtensionContainer_4624P16_t *protocolIe * Functionality: Fills Srb List received by CU * * @params[in] SRBs_ToBeSetup_Item_t *cuSrbItem - * LcCfg pointer + * DuLcCfg pointer * RlcBearerCfg pointer * @return void * * ****************************************************************/ -uint8_t procSrbListToSetup(SRBs_ToBeSetup_Item_t * srbItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcLcToAdd) +uint8_t procSrbListToSetup(SRBs_ToBeSetup_Item_t * srbItem, DuLcCfg *duMacLcToAdd, DuRlcBearerCfg *rlcLcToAdd) { /* Filling RLC INFO */ procRlcLcCfg(srbItem->sRBID, srbItem->sRBID, RB_TYPE_SRB, RLC_AM, CONFIG_ADD, NULL, rlcLcToAdd, NULL); /* Filling MAC INFO */ - if(procMacLcCfg(srbItem->sRBID, RB_TYPE_SRB, CONFIG_ADD, NULL,NULL, NULL, NULL, macLcToAdd, NULL) != ROK) + if(procMacLcCfg(srbItem->sRBID, RB_TYPE_SRB, CONFIG_ADD, NULL,NULL, NULL, NULL, duMacLcToAdd, NULL) != ROK) { DU_LOG("\nERROR --> F1AP : Failed at MAC LC Cfg in procSrbListToSetup()"); return RFAILED; @@ -12977,8 +13337,8 @@ uint8_t extractSrbListToSetup(SRBs_ToBeSetup_List_t *srbCfg, DuUeCfg *ueCfgDb) { uint8_t ret = ROK, srbIdx = 0, rlcLcIdx = 0; SRBs_ToBeSetup_Item_t *srbItem = NULLP; - LcCfg *macLcCtxt = NULLP; - RlcBearerCfg *rlcLcCtxt = NULLP; + DuLcCfg *macLcCtxt = NULLP; + DuRlcBearerCfg *rlcLcCtxt = NULLP; if(srbCfg) { @@ -13003,7 +13363,7 @@ uint8_t extractSrbListToSetup(SRBs_ToBeSetup_List_t *srbCfg, DuUeCfg *ueCfgDb) for(rlcLcIdx = 0; rlcLcIdx < ueCfgDb->numMacLcs; rlcLcIdx++) { - if(ueCfgDb->rlcLcCfg[rlcLcIdx].rbId == srbItem->sRBID && ueCfgDb->rlcLcCfg[rlcLcIdx].rbType == RB_TYPE_SRB) + if(ueCfgDb->rlcLcCfg[rlcLcIdx].rlcBearerCfg.rbId == srbItem->sRBID && ueCfgDb->rlcLcCfg[rlcLcIdx].rlcBearerCfg.rbType == RB_TYPE_SRB) { macLcCtxt = &ueCfgDb->macLcCfg[rlcLcIdx]; rlcLcCtxt = &ueCfgDb->rlcLcCfg[rlcLcIdx]; @@ -13012,13 +13372,13 @@ uint8_t extractSrbListToSetup(SRBs_ToBeSetup_List_t *srbCfg, DuUeCfg *ueCfgDb) } if(!macLcCtxt) { - memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(LcCfg)); + memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(DuLcCfg)); macLcCtxt = &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs]; ueCfgDb->numMacLcs++; } if(!rlcLcCtxt) { - memset(&ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], 0, sizeof(RlcBearerCfg)); + memset(&ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], 0, sizeof(DuRlcBearerCfg)); rlcLcCtxt = &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs]; ueCfgDb->numRlcLcs++; } @@ -13052,14 +13412,14 @@ uint8_t extractSrbListToSetup(SRBs_ToBeSetup_List_t *srbCfg, DuUeCfg *ueCfgDb) * for both MAC and RLC * * @params[in] DRBs_ToBeSetup_Item_t , DRBs_ToBeSetupMod_Item_t, - * DRBs_ToBeModified_Item_t , lcId, LcCfg pointer, - * RlcBearerCfg , UpTnlCfg, RlcUeCfg + * DRBs_ToBeModified_Item_t , lcId, DuLcCfg pointer, + * RlcBearerCfg , UpTnlCfg, DuRlcUeCfg * @return void * * ****************************************************************/ uint8_t procDrbListToSetupMod(uint8_t lcId, DRBs_ToBeSetup_Item_t *drbItem,\ -DRBs_ToBeSetupMod_Item_t *drbSetupModItem, DRBs_ToBeModified_Item_t *drbModItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcLcToAdd, UpTnlCfg *upTnlInfo, RlcUeCfg *storedRlcUeCfg) +DRBs_ToBeSetupMod_Item_t *drbSetupModItem, DRBs_ToBeModified_Item_t *drbModItem, DuLcCfg *macLcToAdd, DuRlcBearerCfg *rlcLcToAdd, UpTnlCfg *upTnlInfo, DuRlcUeCfg *storedRlcUeCfg) { uint8_t cfgIdx = 0; RlcMode rlcModeInfo; @@ -13096,9 +13456,9 @@ DRBs_ToBeSetupMod_Item_t *drbSetupModItem, DRBs_ToBeModified_Item_t *drbModItem, { for(cfgIdx = 0; cfgIdx < storedRlcUeCfg->numLcs; cfgIdx++) { - if(storedRlcUeCfg->rlcLcCfg[cfgIdx].lcId == lcId) + if(storedRlcUeCfg->rlcLcCfg[cfgIdx].rlcBearerCfg.lcId == lcId) { - rlcModeInfo = storedRlcUeCfg->rlcLcCfg[cfgIdx].rlcMode; + rlcModeInfo = storedRlcUeCfg->rlcLcCfg[cfgIdx].rlcBearerCfg.rlcMode; break; } } @@ -13132,7 +13492,7 @@ DRBs_ToBeSetupMod_Item_t *drbSetupModItem, DRBs_ToBeModified_Item_t *drbModItem, * ****************************************************************/ uint8_t extractDrbListToSetupMod(DRBs_ToBeSetup_List_t *drbCfg, DRBs_ToBeSetupMod_List_t *drbSetupModCfg,\ - DRBs_ToBeModified_List_t *drbModCfg, uint8_t drbCount, DuUeCfg *ueCfgDb, uint32_t *drbBitMap, RlcUeCfg *rlcUeCfg) + DRBs_ToBeModified_List_t *drbModCfg, uint8_t drbCount, DuUeCfg *ueCfgDb, uint32_t *drbBitMap, DuRlcUeCfg *rlcUeCfg) { uint8_t ret = ROK; uint8_t drbIdx = 0, rlcLcIdx = 0; @@ -13140,8 +13500,8 @@ uint8_t extractDrbListToSetupMod(DRBs_ToBeSetup_List_t *drbCfg, DRBs_ToBeSetupMo DRBs_ToBeSetup_Item_t *drbItem = NULLP; DRBs_ToBeSetupMod_ItemIEs_t *drbSetupModItem = NULLP; DRBs_ToBeModified_ItemIEs_t *drbModItem = NULLP; - LcCfg *macLcCtxt = NULLP; - RlcBearerCfg *rlcLcCtxt = NULLP; + DuLcCfg *macLcCtxt = NULLP; + DuRlcBearerCfg *rlcLcCtxt = NULLP; ret = ROK; if(drbCount > 0) @@ -13179,7 +13539,8 @@ uint8_t extractDrbListToSetupMod(DRBs_ToBeSetup_List_t *drbCfg, DRBs_ToBeSetupMo for(rlcLcIdx = 0; rlcLcIdx < ueCfgDb->numRlcLcs; rlcLcIdx++) { - if(ueCfgDb->rlcLcCfg[rlcLcIdx].rbId == drbId && ueCfgDb->rlcLcCfg[rlcLcIdx].rbType == RB_TYPE_DRB) + if(ueCfgDb->rlcLcCfg[rlcLcIdx].rlcBearerCfg.rbId == drbId && \ + ueCfgDb->rlcLcCfg[rlcLcIdx].rlcBearerCfg.rbType == RB_TYPE_DRB) { macLcCtxt = &ueCfgDb->macLcCfg[rlcLcIdx]; rlcLcCtxt = &ueCfgDb->rlcLcCfg[rlcLcIdx]; @@ -13188,7 +13549,7 @@ uint8_t extractDrbListToSetupMod(DRBs_ToBeSetup_List_t *drbCfg, DRBs_ToBeSetupMo } if(!macLcCtxt) { - memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(LcCfg)); + memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(DuLcCfg)); macLcCtxt = &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs]; ueCfgDb->numMacLcs++; } @@ -13214,6 +13575,7 @@ uint8_t extractDrbListToSetupMod(DRBs_ToBeSetup_List_t *drbCfg, DRBs_ToBeSetupMo DU_LOG("\nERROR --> F1AP : Failed at extractDrbListToSetupMod() for Modified List"); break; } + ueCfgDb->numDrbModified++; } else { @@ -13247,14 +13609,128 @@ uint8_t extractDrbListToSetupMod(DRBs_ToBeSetup_List_t *drbCfg, DRBs_ToBeSetupMo } } ueCfgDb->numDrb++; - - DU_LOG("\nDEBUG --> DUAPP: extractDrbListToSetupMod:lcId:%x ,BitMap:%x, [RLC,MAC,NumDrb]:[%x,%x,%x]",\ - lcId,*drbBitMap, ueCfgDb->numRlcLcs, ueCfgDb->numMacLcs, ueCfgDb->numDrb); + + DU_LOG("\nDEBUG --> DUAPP: extractDrbListToSetupMod:lcId:%x ,BitMap:%x, [RLC,MAC,NumDrb]:[%x,%x,%x]",\ + lcId,*drbBitMap, ueCfgDb->numRlcLcs, ueCfgDb->numMacLcs, ueCfgDb->numDrb); + if(ret == RFAILED) + { + DU_LOG("\nERROR --> F1AP : Failed at extractDrbListToSetupMod()"); + break; + } + } + } + else + ret = RFAILED; + + return ret; +} + +/******************************************************************* + * + * @brief extract Drb List received from CU + * + * @details + * + * Function : extractDrbListToRelease + * + * Functionality: extract Drb List received from CU + * for both MAC and RLC + * + * @params[in] DRBs_ToBeReleased_Item_t pointer + * DuUeCfg pointer + * @return ROK/RFAIED + * + * ****************************************************************/ + +uint8_t extractDrbListToRelease(uint8_t ueId, DRBs_ToBeReleased_List_t *drbToRel, uint8_t drbCount, DuUeCfg *ueCfgDb, DuRlcUeCfg *rlcUeCfg) +{ + uint8_t ret = ROK, teIdx = 0; + uint8_t drbIdx = 0, rlcLcIdx = 0; + uint8_t drbId = 0, lcId = 0; + DRBs_ToBeReleased_ItemIEs_t *drbRelItem = NULLP; + DuLcCfg *macLcCtxt = NULLP; + DuRlcBearerCfg *rlcLcCtxt = NULLP; + + ret = ROK; + if(drbCount > 0) + { + for(drbIdx = 0; drbIdx < drbCount; drbIdx++) + { + macLcCtxt = NULL; + rlcLcCtxt = NULL; + + if(drbToRel != NULLP) + { + drbRelItem = (DRBs_ToBeReleased_ItemIEs_t *) drbToRel->list.array[drbIdx]; + drbId = drbRelItem->value.choice.DRBs_ToBeReleased_Item.dRBID; + } + else + { + DU_LOG("ERROR --> DU APP : DrbToRelease pointer is NULL in extractDrbListToRelease"); + return RFAILED; + } + + for(rlcLcIdx = 0; rlcLcIdx < ueCfgDb->numRlcLcs; rlcLcIdx++) + { + if(ueCfgDb->rlcLcCfg[rlcLcIdx].rlcBearerCfg.rbId == drbId && ueCfgDb->rlcLcCfg[rlcLcIdx].rlcBearerCfg.rbType == RB_TYPE_DRB) + { + macLcCtxt = &ueCfgDb->macLcCfg[rlcLcIdx]; + rlcLcCtxt = &ueCfgDb->rlcLcCfg[rlcLcIdx]; + break; + } + } + + if(!macLcCtxt) + { + memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(DuLcCfg)); + macLcCtxt = &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs]; + ueCfgDb->numMacLcs++; + } + if(!rlcLcCtxt) + { + memset(&ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], 0, sizeof(DuRlcBearerCfg)); + rlcLcCtxt = &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs]; + ueCfgDb->numRlcLcs++; + } + lcId = fetchLcId(drbId); + if(lcId < MIN_DRB_LCID) + { + DU_LOG("\nERROR --> F1AP : Failed fetching LCID %d in extractDrbListToRelease() for Modified List", lcId); + break; + } + + /* Filling RLC INFO */ + procRlcLcCfg(drbId, lcId, RB_TYPE_DRB, rlcLcCtxt->rlcBearerCfg.rlcMode, CONFIG_DEL, NULL, rlcLcCtxt, NULLP); + /* Filling MAC INFO */ + if(procMacLcCfg(lcId, RB_TYPE_DRB, CONFIG_DEL, NULL, NULL, NULL, NULL, macLcCtxt, NULLP) != ROK) + { + DU_LOG("\nERROR --> F1AP : Failed at RLC LC Cfg in extractDrbListToRelease()"); + return RFAILED; + } + ueCfgDb->upTnlInfo[ueCfgDb->numDrb].configType = CONFIG_DEL; + ueCfgDb->upTnlInfo[ueCfgDb->numDrb].drbId = drbId; + ueCfgDb->upTnlInfo[ueCfgDb->numDrb].ueId = ueId; + + for(teIdx = 0; teIdx < duCb.numTeId; teIdx++) + { + if((duCb.upTnlCfg[teIdx]->ueId == ueCfgDb->upTnlInfo[ueCfgDb->numDrb].ueId) && \ + (duCb.upTnlCfg[teIdx]->drbId == ueCfgDb->upTnlInfo[ueCfgDb->numDrb].drbId)) + { + DU_ALLOC(ueCfgDb->upTnlInfo[ueCfgDb->numDrb].tnlCfg1, sizeof(GtpTnlCfg)); + memcpy(ueCfgDb->upTnlInfo[ueCfgDb->numDrb].tnlCfg1, duCb.upTnlCfg[teIdx]->tnlCfg1, sizeof(GtpTnlCfg)); + break; + } + } + + ueCfgDb->numDrb++; if(ret == RFAILED) { - DU_LOG("\nERROR --> F1AP : Failed at extractDrbListToSetupMod()"); + DU_LOG("\nERROR --> F1AP : Failed at extractDrbListToRelease() for Modified List"); break; } + + DU_LOG("\nDEBUG --> DUAPP: extractDrbListToRelease():lcId:%x, [RLC,MAC,NumDrb]:[%x,%x,%x]",\ + lcId,ueCfgDb->numRlcLcs, ueCfgDb->numMacLcs, ueCfgDb->numDrb); } } else @@ -13336,7 +13812,7 @@ UE_NR_Capability_t *extractUeCapability(UE_CapabilityRAT_ContainerList_t *ueCapa } memset(ueCapRatContList, 0, sizeof(UE_CapabilityRAT_ContainerListRRC_t)); memset(&rval, 0, sizeof(asn_dec_rval_t)); - rval = aper_decode(0, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, (void **)&ueCapRatContList, + rval = uper_decode(0, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, (void **)&ueCapRatContList, ueCapablityListBuf->buf, recvBufLen, 0, 0); if(rval.code == RC_FAIL || rval.code == RC_WMORE) { @@ -13362,7 +13838,7 @@ UE_NR_Capability_t *extractUeCapability(UE_CapabilityRAT_ContainerList_t *ueCapa } memset(ueNrCap, 0, sizeof(UE_NR_Capability_t)); memset(&rval, 0, sizeof(asn_dec_rval_t)); - rval = aper_decode(0, &asn_DEF_UE_NR_Capability, (void **)&ueNrCap, + rval = uper_decode(0, &asn_DEF_UE_NR_Capability, (void **)&ueNrCap, ueCapRatContList->list.array[idx]->ue_CapabilityRAT_Container.buf, recvBufLen, 0, 0); if(rval.code == RC_FAIL || rval.code == RC_WMORE) { @@ -13494,7 +13970,8 @@ void freeAperDecodeF1UeContextSetupReq(UEContextSetupRequest_t *ueSetReq) uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg) { int8_t ueIdx = -1; - uint8_t ret=0, ieIdx=0, ieExtIdx = 0, servCellIdx = 0; + uint8_t ret=0, ieIdx=0, ieExtIdx = 0; + //uint8_t servCellIdx = 0; bool ueCbFound = false, hoInProgress = false; uint16_t cellIdx=0; uint64_t nrCellId = 0; @@ -13503,8 +13980,9 @@ uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg) UEContextSetupRequest_t *ueSetReq = NULL; DRBs_ToBeSetup_List_t *drbCfg = NULL; CUtoDURRCInformation_t *rrcInfo = NULL; +#ifdef NR_DRX DRXCycle_t *drxCycle; - +#endif ret = ROK; ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest; @@ -13539,7 +14017,7 @@ uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg) case ProtocolIE_ID_id_ServCellIndex: { - servCellIdx = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.ServCellIndex; + //servCellIdx = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.ServCellIndex; break; } @@ -13925,7 +14403,7 @@ uint8_t EncodeUeCntxtDuToCuInfo(CellGroupConfig_t *duToCuCellGrp, CellGroupConfi xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, duCellGrpCfg); memset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN); encBufSize = 0; - encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, duCellGrpCfg, PrepFinalEncBuf, encBuf); + encRetVal = uper_encode(&asn_DEF_CellGroupConfigRrc, 0, duCellGrpCfg, PrepFinalEncBuf, encBuf); /* Encode results */ if(encRetVal.encoded == ENCODE_FAIL) { @@ -14290,6 +14768,7 @@ uint8_t BuildAndSendUeContextSetupRsp(uint8_t cellId,uint8_t ueId) FreeUeContextSetupRsp(f1apMsg); return ret; }/* End of BuildAndSendUeContextSetupRsp */ + /******************************************************************* * * @brief Build And Send Ue Context Rsp @@ -15144,20 +15623,13 @@ uint8_t procF1SetupRsp(F1AP_PDU_t *f1apMsg, MsgLen recvBufLen, char *recvBuf) DU_LOG("\nERROR --> DU_APP : Invalid IE received in F1SetupRsp:%ld", f1SetRspMsg->protocolIEs.list.array[idx]->id); } - duProcF1SetupRsp(); } + duProcF1SetupRsp(); freeAperDecodeF1SetupRsp(f1SetRspMsg); - - duCb.f1SetupReqAndRspMsg.f1MsgRspBufSize = recvBufLen; - DU_ALLOC(duCb.f1SetupReqAndRspMsg.f1MsgRspBuf, duCb.f1SetupReqAndRspMsg.f1MsgRspBufSize); - if(duCb.f1SetupReqAndRspMsg.f1MsgReqBuf == NULLP) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed to store the buf of F1setup response"); - return RFAILED; - } - memcpy(duCb.f1SetupReqAndRspMsg.f1MsgRspBuf, recvBuf, recvBufLen); + addOrModifyE2NodeComponent(E2_NODE_COMPONENT_ADD, false, recvBufLen, recvBuf); + if(BuildAndSendE2SetupReq() != ROK) { DU_LOG("\nERROR --> F1AP : Failed to build and send E2 setup request "); @@ -15489,35 +15961,35 @@ uint8_t procF1DlRrcMsgTrans(F1AP_PDU_t *f1apMsg) { if(f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size > 0) { - dlMsg.rrcMsgSize = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size; - DU_ALLOC_SHRABL_BUF(dlMsg.rrcMsgPdu, dlMsg.rrcMsgSize); - if(dlMsg.rrcMsgPdu) - { - memcpy(dlMsg.rrcMsgPdu, f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\ - dlMsg.rrcMsgSize); - } - else - { - DU_LOG("\nERROR --> DU APP : Memory alloc Failed at RRC Container at procF1DlRrcMsgTrans()"); - return RFAILED; - } - } - else - { - DU_LOG("\nERROR --> DU_APP : RRC Container Size is invalid:%ld",\ - f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size); - return RFAILED; - } - break; - } - case ProtocolIE_ID_id_RRCDeliveryStatusRequest: - { - dlMsg.deliveryStatRpt = true; - break; - } - default: - DU_LOG("\nERROR --> DU_APP : Invalid IE received in DL RRC Msg Transfer:%ld", - f1DlRrcMsg->protocolIEs.list.array[idx]->id); + dlMsg.rrcMsgSize = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size; + DU_ALLOC_SHRABL_BUF(dlMsg.rrcMsgPdu, dlMsg.rrcMsgSize); + if(dlMsg.rrcMsgPdu) + { + memcpy(dlMsg.rrcMsgPdu, f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\ + dlMsg.rrcMsgSize); + } + else + { + DU_LOG("\nERROR --> DU APP : Memory alloc Failed at RRC Container at procF1DlRrcMsgTrans()"); + return RFAILED; + } + } + else + { + DU_LOG("\nERROR --> DU_APP : RRC Container Size is invalid:%ld",\ + f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size); + return RFAILED; + } + break; + } + case ProtocolIE_ID_id_RRCDeliveryStatusRequest: + { + dlMsg.deliveryStatRpt = true; + break; + } + default: + DU_LOG("\nERROR --> DU_APP : Invalid IE received in DL RRC Msg Transfer:%ld", + f1DlRrcMsg->protocolIEs.list.array[idx]->id); } } @@ -15573,8 +16045,8 @@ uint8_t BuildSrbSetupModList(SRBs_SetupMod_List_t *srbList, DuUeCfg *ueCfg) srbItemIe->id = ProtocolIE_ID_id_SRBs_SetupMod_Item; srbItemIe->criticality = Criticality_reject; srbItemIe->value.present = SRBs_SetupMod_ItemIEs__value_PR_SRBs_SetupMod_Item; - srbItemIe->value.choice.SRBs_SetupMod_Item.sRBID = ueCfg->rlcLcCfg[srbIdx].rbId; - srbItemIe->value.choice.SRBs_SetupMod_Item.lCID = ueCfg->rlcLcCfg[srbIdx].lcId; + srbItemIe->value.choice.SRBs_SetupMod_Item.sRBID = ueCfg->rlcLcCfg[srbIdx].rlcBearerCfg.rbId; + srbItemIe->value.choice.SRBs_SetupMod_Item.lCID = ueCfg->rlcLcCfg[srbIdx].rlcBearerCfg.lcId; } return ROK; } @@ -15604,12 +16076,6 @@ uint8_t BuildDrbSetupModList(DRBs_SetupMod_List_t *drbSet , DuUeCfg *ueCfg) drbCnt = ueCfg->numDrbSetupMod; - if(!drbCnt) - { - DU_LOG("\nINFO --> F1AP : BuildDrbToBeSetupModList(): No DRB information to avaialble to add"); - return ROK; - } - drbSet->list.count = drbCnt; drbSet->list.size = drbCnt * sizeof(DRBs_SetupMod_ItemIEs_t *); DU_ALLOC(drbSet->list.array, drbSet->list.size); @@ -15671,6 +16137,98 @@ void FreeDrbSetupModList(DRBs_SetupMod_List_t *drbSetupList) DU_FREE(drbSetupList->list.array, drbSetupList->list.size); } +/******************************************************************* +* +* @brief Builds the DRB to be Mod list +* +* @details +* +* Function : +* +* Functionality: Constructs the DRB to be Mod list +* +* @params[in] DRBs_Modified_List_t *drbModList +* +* @return ROK - success +* RFAILED - failure +* +* ****************************************************************/ + +uint8_t BuildDrbModList(DRBs_Modified_List_t *drbModList, DuUeCfg *ueCfg) +{ + uint8_t arrIdx =0, drbIdx = 0; + uint8_t drbCnt =0; + struct DRBs_Modified_ItemIEs *drbItemIe; + + drbCnt = ueCfg->numDrbModified; + + drbModList->list.count = drbCnt; + drbModList->list.size = drbCnt * sizeof(DRBs_Modified_ItemIEs_t *); + DU_ALLOC(drbModList->list.array, drbModList->list.size); + if(drbModList->list.array == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbModList()"); + return RFAILED; + } + + drbIdx = 0; + for(arrIdx = 0; arrIdx < ueCfg->numMacLcs; arrIdx++) + { + if(ueCfg->macLcCfg[arrIdx].configType == CONFIG_MOD) + { + DU_ALLOC(drbModList->list.array[drbIdx], sizeof(DRBs_Modified_ItemIEs_t)); + if(drbModList->list.array[drbIdx] == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbModList"); + return RFAILED; + } + + drbItemIe = (struct DRBs_Modified_ItemIEs *)drbModList->list.array[drbIdx]; + drbItemIe->id = ProtocolIE_ID_id_DRBs_Modified_Item; + drbItemIe->criticality = Criticality_reject; + drbItemIe->value.present = DRBs_Modified_ItemIEs__value_PR_DRBs_Modified_Item; + drbItemIe->value.choice.DRBs_Modified_Item.dRBID = ueCfg->upTnlInfo[arrIdx].drbId; + if(fillDlTnlSetupList(&drbItemIe->value.choice.DRBs_Modified_Item.dLUPTNLInformation_ToBeSetup_List,\ + &ueCfg->upTnlInfo[arrIdx])!= ROK) + { + DU_LOG("\nERROR --> F1AP : Failed to fill DlTnl SetupList in BuildDrbModList"); + return RFAILED; + } + drbIdx++; + } + } + + return ROK; +} + +/******************************************************************* +* @brief Free the memory allocated for DRB Mod List +* +* @details +* +* Function : FreeDrbModList +* +* Functionality: +* Free the memory allocated for DRB modified list +* +* @params[in] DRBs_Modified_List_t * +* @return void +* +* ****************************************************************/ +void FreeDrbModList(DRBs_Modified_List_t *drbModList) +{ + uint8_t arrIdx = 0; + DRBs_Modified_ItemIEs_t *drbItemIe = NULLP; + + for(arrIdx = 0; arrIdx < drbModList->list.count; arrIdx++) + { + drbItemIe = ((DRBs_Modified_ItemIEs_t *)drbModList->list.array[arrIdx]); + freeDlTnlInfo(&drbItemIe->value.choice.DRBs_Modified_Item.dLUPTNLInformation_ToBeSetup_List); + DU_FREE(drbModList->list.array[arrIdx], sizeof(DRBs_Modified_ItemIEs_t)); + } + DU_FREE(drbModList->list.array, drbModList->list.size); +} + /******************************************************************* * @brief Free the memory allocated for SRB setup List * @@ -15730,12 +16288,25 @@ void FreeUeContextModResp(F1AP_PDU_t *f1apMsg) break; case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID: break; + case ProtocolIE_ID_id_DUtoCURRCInformation: + { + DU_FREE(ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCInformation.\ + cellGroupConfig.buf, ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.choice.\ + DUtoCURRCInformation.cellGroupConfig.size); + break; + } case ProtocolIE_ID_id_DRBs_SetupMod_List: { FreeDrbSetupModList(&(ueContextModifyRes->protocolIEs.list.array[ieIdx]->\ value.choice.DRBs_SetupMod_List)); break; } + case ProtocolIE_ID_id_DRBs_Modified_List: + { + FreeDrbModList(&(ueContextModifyRes->protocolIEs.list.array[ieIdx]->\ + value.choice.DRBs_Modified_List)); + break; + } case ProtocolIE_ID_id_SRBs_SetupMod_List: { FreeSrbSetupModList(&(ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.choice.\ @@ -15807,13 +16378,16 @@ uint8_t BuildAndSendUeContextModRsp(DuUeCb *ueCb) if(ueCb->f1UeDb->actionType == UE_CTXT_MOD) { + elementCnt = 2; if(ueCb->f1UeDb->duUeCfg.numDrbSetupMod) - elementCnt =3; - else - elementCnt =2; + elementCnt++; + if(ueCb->f1UeDb->duUeCfg.numDrbModified) + elementCnt++; } if(ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY) + { elementCnt = 5; + } if(ueCb->f1UeDb->actionType == UE_CTXT_RRC_RECFG_COMPLETE) elementCnt = 2; ueContextModifyRes->protocolIEs.list.count = elementCnt; @@ -15861,7 +16435,8 @@ uint8_t BuildAndSendUeContextModRsp(DuUeCb *ueCb) BuildCellGroupConfigRrc(ueCb, &ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCInformation.cellGroupConfig); } - if((ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY) || ((ueCb->f1UeDb->actionType == UE_CTXT_MOD) && (ueCb->f1UeDb->duUeCfg.numDrbSetupMod))) + if((ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY) || \ + ((ueCb->f1UeDb->actionType == UE_CTXT_MOD) && (ueCb->f1UeDb->duUeCfg.numDrbSetupMod))) { ieIdx++; ueContextModifyRes->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_SetupMod_List; @@ -15887,6 +16462,22 @@ uint8_t BuildAndSendUeContextModRsp(DuUeCb *ueCb) } } + if((ueCb->f1UeDb->actionType == UE_CTXT_MOD) && (ueCb->f1UeDb->duUeCfg.numDrbModified)) + { + ieIdx++; + ueContextModifyRes->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_Modified_List; + ueContextModifyRes->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject; + ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.present =\ + UEContextModificationResponseIEs__value_PR_DRBs_Modified_List; + ret = BuildDrbModList(&(ueContextModifyRes->protocolIEs.list.array[ieIdx]->\ + value.choice.DRBs_Modified_List) , &ueCb->f1UeDb->duUeCfg); + if(ret != ROK) + { + DU_LOG( "\nERROR --> F1AP : Failed to build DRB Modified List "); + break; + } + } + if(ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY) { ieIdx++; @@ -15894,12 +16485,12 @@ uint8_t BuildAndSendUeContextModRsp(DuUeCb *ueCb) ueContextModifyRes->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject; ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.present = \ UEContextModificationResponseIEs__value_PR_SRBs_SetupMod_List; - for(rbIdx = 0; rbIdx < ueCb->rlcUeCfg.numLcs; rbIdx++) + for(rbIdx = 0; rbIdx < ueCb->duRlcUeCfg.numLcs; rbIdx++) { - if(ueCb->rlcUeCfg.rlcLcCfg[rbIdx].rbType == RB_TYPE_SRB) + if(ueCb->duRlcUeCfg.rlcLcCfg[rbIdx].rlcBearerCfg.rbType == RB_TYPE_SRB) { - memcpy(&ueCb->f1UeDb->duUeCfg.rlcLcCfg[ueCb->f1UeDb->duUeCfg.numRlcLcs++], &ueCb->rlcUeCfg.rlcLcCfg[rbIdx],\ - sizeof(RlcBearerCfg)); + memcpy(&ueCb->f1UeDb->duUeCfg.rlcLcCfg[ueCb->f1UeDb->duUeCfg.numRlcLcs++], &ueCb->duRlcUeCfg.rlcLcCfg[rbIdx],\ + sizeof(DuRlcBearerCfg)); } } ret = BuildSrbSetupModList(&ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.choice.SRBs_SetupMod_List, \ @@ -15924,7 +16515,7 @@ uint8_t BuildAndSendUeContextModRsp(DuUeCb *ueCb) /* Encode results */ if(encRetVal.encoded == ENCODE_FAIL) { - DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\ + DU_LOG( "\nERROR --> F1AP : Could not encode UE Modification Response structure (at %s)\n",\ encRetVal.failed_type ? encRetVal.failed_type->name : "unknown"); ret = RFAILED; break; @@ -15941,9 +16532,9 @@ uint8_t BuildAndSendUeContextModRsp(DuUeCb *ueCb) } /* Sending msg */ - if(sendF1APMsg() != ROK) + if(sendF1APMsg() != ROK && (ret == ROK)) { - DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Res Failed"); + DU_LOG("\nERROR --> F1AP : Sending UE Modification Res Failed"); ret = RFAILED; break; } @@ -15951,11 +16542,11 @@ uint8_t BuildAndSendUeContextModRsp(DuUeCb *ueCb) ret = ROK; break; } + FreeUeContextModResp(f1apMsg); - //sleep(5); - //BuildAndSendDUConfigUpdate(SERV_CELL_TO_DELETE); return ret; } + /******************************************************************* * * @brief Deallocating the memory allocated by the aper decoder @@ -16034,6 +16625,7 @@ void freeAperDecodeUlTnlInfoforDrbSetupMod(ULUPTNLInformation_ToBeSetup_List_t * free(ulInfo->list.array); } } + /******************************************************************* * * @brief Deallocating the memory allocated by the aper decoder @@ -16157,6 +16749,169 @@ void freeAperDecodeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet) free(drbSet->list.array); } +} + +/******************************************************************* + * + * @brief Deallocating the memory allocated by the aper decoder + * for DrbSetupModItem + * + * @details + * + * Function : freeAperDecodeDrbModifiedItem + * + * Functionality: Deallocating memory allocated for DrbModifedItem + * + * @params[in] DRBs_ToBeModified_Item_t *drbItem + * + * @return void + * + * ****************************************************************/ + +void freeAperDecodeDrbModifiedItem(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) + { + drbItem->qoSInformation->present = QoSInformation_PR_choice_extension; + switch(drbItem->qoSInformation->present) + { + case QoSInformation_PR_NOTHING: + break; + case QoSInformation_PR_eUTRANQoS: + { + if(drbItem->qoSInformation->choice.eUTRANQoS) + { + free(drbItem->qoSInformation->choice.eUTRANQoS); + } + break; + } + case QoSInformation_PR_choice_extension: + { + if(drbItem->qoSInformation->choice.choice_extension) + { + freeAperDecodeQosInfo(&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) + { + free(snssai->sST.buf); + } + if(snssai->sD) + { + if(snssai->sD->buf) + { + free(snssai->sD->buf); + } + free(snssai->sD); + } + + 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] ) + { + freeAperDecodeQosInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters); + free(flowMap->list.array[arrIdx]); + } + } + free(flowMap->list.array); + } + + free(drbItem->qoSInformation->choice.choice_extension); + } + break; + } + } + free(drbItem->qoSInformation); + } + freeAperDecodeUlTnlInfoforDrbSetupMod(&drbItem->uLUPTNLInformation_ToBeSetup_List); + if(drbItem->uLConfiguration) + { + free(drbItem->uLConfiguration); + } +} + +/******************************************************************* + * + * @brief Deallocating the memory allocated by the aper decoder + * for DrbToBeSetupModList + * + * @details + * + * Function : freeAperDecodeDrbToBeModifiedList + * + * Functionality: Deallocating memory allocated for DrbToBeModifiedList + * + * @params[in] DRBs_ToBeModified_List_t *drbSet + * + * @return void + * + * ****************************************************************/ + +void freeAperDecodeDrbToBeModifiedList(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) + { + if(arrIdx == 0) + { + drbItemIe = (DRBs_ToBeModified_ItemIEs_t *)drbSet->list.array[arrIdx]; + freeAperDecodeDrbModifiedItem(&(drbItemIe->value.choice.DRBs_ToBeModified_Item)); + } + free(drbSet->list.array[arrIdx]); + } + } + free(drbSet->list.array); + } + +} + +/******************************************************************* + * + * @brief Deallocating the memory allocated by the aper decoder + * for DrbToBeSetupModList + * + * @details + * + * Function : freeAperDecodeDrbToBeReleasedList + * + * Functionality: Deallocating memory allocated for DrbToBeReleasedList + * + * @params[in] DRBs_ToBeReleased_List_t *drbSet + * + * @return void + * + * ****************************************************************/ + +void freeAperDecodeDrbToBeReleasedList(DRBs_ToBeReleased_List_t *drbSet) +{ + uint8_t arrIdx =0; + + if(drbSet->list.array) + { + for(arrIdx=0; arrIdxlist.count ; arrIdx++) + { + if(drbSet->list.array[arrIdx] != NULLP) + { + free(drbSet->list.array[arrIdx]); + } + } + free(drbSet->list.array); + } + } /******************************************************************* * @@ -16198,6 +16953,18 @@ void freeAperDecodeUeContextModificationReqMsg(UEContextModificationRequest_t *u value.choice.DRBs_ToBeSetupMod_List); break; } + case ProtocolIE_ID_id_DRBs_ToBeModified_List: + { + freeAperDecodeDrbToBeModifiedList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->\ + value.choice.DRBs_ToBeModified_List); + break; + } + case ProtocolIE_ID_id_DRBs_ToBeReleased_List: + { + freeAperDecodeDrbToBeReleasedList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->\ + value.choice.DRBs_ToBeReleased_List); + break; + } case ProtocolIE_ID_id_TransmissionActionIndicator: break; case ProtocolIE_ID_id_RRCContainer: @@ -16230,8 +16997,9 @@ uint8_t procF1UeContextModificationReq(F1AP_PDU_t *f1apMsg) UEContextModificationRequest_t *ueContextModifyReq = NULLP; uint8_t ret = ROK, ieIdx = 0, cellIdx=0; DuUeCb *duUeCb = NULLP; - DRBs_ToBeSetupMod_List_t *drbSetupModCfg; - DRBs_ToBeModified_List_t *drbModifiedCfg; + DRBs_ToBeSetupMod_List_t *drbSetupModCfg = NULLP; + DRBs_ToBeModified_List_t *drbModifiedCfg = NULLP; + DRBs_ToBeReleased_List_t *drbToRelease = NULLP; uint32_t gnbCuUeF1apId, gnbDuUeF1apId; ueContextModifyReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest; @@ -16297,9 +17065,11 @@ uint8_t procF1UeContextModificationReq(F1AP_PDU_t *f1apMsg) case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List: case ProtocolIE_ID_id_DRBs_ToBeModified_List: + case ProtocolIE_ID_id_DRBs_ToBeReleased_List: { if(duUeCb->f1UeDb) { + /*DRBs to be Added*/ if(ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present ==\ UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List) { @@ -16314,6 +17084,7 @@ uint8_t procF1UeContextModificationReq(F1AP_PDU_t *f1apMsg) } } + /*DRBs to be Modified*/ if(ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present == \ UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List) @@ -16321,7 +17092,21 @@ uint8_t procF1UeContextModificationReq(F1AP_PDU_t *f1apMsg) drbModifiedCfg = &ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.\ choice.DRBs_ToBeModified_List; if(extractDrbListToSetupMod(NULL, NULL, drbModifiedCfg, drbModifiedCfg->list.count,\ - &duUeCb->f1UeDb->duUeCfg, &duUeCb->drbBitMap, &duUeCb->rlcUeCfg)) + &duUeCb->f1UeDb->duUeCfg, &duUeCb->drbBitMap, &duUeCb->duRlcUeCfg)) + { + DU_LOG("\nERROR --> DU APP : Failed at extractDrbListToSetupMod() for DrbModifiedList"); + ret = RFAILED; + } + } + /*DRBs to be Released*/ + if(ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present == \ + UEContextModificationRequestIEs__value_PR_DRBs_ToBeReleased_List) + + { + drbToRelease = &ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.\ + choice.DRBs_ToBeReleased_List; + if(extractDrbListToRelease(gnbDuUeF1apId, drbToRelease, drbToRelease->list.count,\ + &duUeCb->f1UeDb->duUeCfg, &duUeCb->duRlcUeCfg)) { DU_LOG("\nERROR --> DU APP : Failed at extractDrbListToSetupMod() for DrbModifiedList"); ret = RFAILED;