X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Fdu_app%2Fdu_f1ap_msg_hdl.c;h=ecd15d2b80a9bed1f5dcf96ed6575208ed46578c;hb=964fd8f1dc9c969e70caf8885332cc086ff22d74;hp=9336f8158c52bcb8a91d49918fec6e912952f7c6;hpb=9610be940d43a65a221ad21cd7716796f6908e75;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 9336f8158..ecd15d2b8 100644 --- a/src/du_app/du_f1ap_msg_hdl.c +++ b/src/du_app/du_f1ap_msg_hdl.c @@ -18,6 +18,11 @@ /* This file contains F1AP message handler functions */ #include "common_def.h" +#include "ckw.h" +#include "ckw.x" +#include "kwu.h" +#include "kwu.x" +#include "lkw.h" #include "lrg.h" #include "legtp.h" #include "lkw.x" @@ -27,7 +32,9 @@ #include "du_cfg.h" #include "du_app_rlc_inf.h" #include "du_mgr_main.h" +#include "du_mgr.h" #include "du_utils.h" +#include "du_ue_mgr.h" #include "RAT-Type.h" #include "FeatureSetUplinkPerCC.h" #include "FeatureSetDownlinkPerCC.h" @@ -63,6 +70,7 @@ #include "DMRS-DownlinkConfig.h" #include "PDSCH-Config.h" #include "BWP-DownlinkDedicated.h" +#include "BWP-Downlink.h" #include "PUSCH-TimeDomainResourceAllocation.h" #include "PUSCH-TimeDomainResourceAllocationList.h" #include "DMRS-UplinkConfig.h" @@ -101,501 +109,71 @@ #include "DLUPTNLInformation-ToBeSetup-Item.h" #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" +#include "SCS-SpecificCarrier.h" +#include "FrequencyInfoDL.h" +#include "DownlinkConfigCommon.h" +#include "FrequencyInfoUL.h" +#include "UplinkConfigCommon.h" +#include "TDD-UL-DL-ConfigCommon.h" +#include "RACH-ConfigDedicated.h" +#include "CFRA-SSB-Resource.h" +#include "BWP-UplinkCommon.h" +#include "ReconfigurationWithSync.h" +#include "du_sys_info_hdl.h" #ifdef O1_ENABLE -#include "ConfigInterface.h" +#include "CmInterface.h" extern StartupConfig g_cfg; #endif DuCfgParams duCfgParam; -/************************************************************************ - * - * @brief Converts enum values into actual value of Poll retransmit timer - * - * @details - * - * Function : getPollPdu - * - * Functionality: Converts enum values into actual value of poll - * retransmit timer - * - * @params[in] Enum value of pollPdu - * @return Actual value of pollPdu - * - * **********************************************************************/ - -uint16_t getPollRetxTmr(uint8_t pollRetxTmrCfg) -{ - uint16_t pollRetxTmr; - - /* All values of poll retx timer are at interval of 5ms. - * This is valid upto 250ms - * Hence converting the enum value to actual value by multiplying it to 5 - */ - if(pollRetxTmrCfg <= T_PollRetransmit_ms250) - pollRetxTmr = (pollRetxTmrCfg + 1) * 5; - else - { - switch(pollRetxTmrCfg) - { - case T_PollRetransmit_ms300: - pollRetxTmr = 300; - break; - case T_PollRetransmit_ms350: - pollRetxTmr = 350; - break; - case T_PollRetransmit_ms400: - pollRetxTmr = 400; - break; - case T_PollRetransmit_ms450: - pollRetxTmr = 450; - break; - case T_PollRetransmit_ms500: - pollRetxTmr = 500; - break; - case T_PollRetransmit_ms800: - pollRetxTmr = 800; - break; - default: - DU_LOG("\nERROR --> F1AP: Invalid value of Poll Retransmit timer"); - pollRetxTmr = 0; - } - } - return pollRetxTmr; -} - -/******************************************************************* - * - * @brief Converts enum values into actual value of PollPdu - * - * @details - * - * Function : getPollPdu - * - * Functionality: Converts enum values into actual value of PollPdu - * - * @params[in] Enum value of pollPdu - * @return Actual value of pollPdu - * - * ****************************************************************/ -int32_t getPollPdu(uint8_t pollPduCfg) -{ - int32_t pollPdu; - switch(pollPduCfg) - { - case PollPDU_p4: - pollPdu = 4; - break; - case PollPDU_p8: - pollPdu = 8; - break; - case PollPDU_p16: - pollPdu = 16; - break; - case PollPDU_p32: - pollPdu = 32; - break; - case PollPDU_p64: - pollPdu = 64; - break; - case PollPDU_p128: - pollPdu = 128; - break; - case PollPDU_p256: - pollPdu = 256; - break; - case PollPDU_p512: - pollPdu = 512; - break; - case PollPDU_p1024: - pollPdu = 1024; - break; - case PollPDU_p2048: - pollPdu = 2048; - break; - case PollPDU_p4096: - pollPdu = 4096; - break; - case PollPDU_p6144: - pollPdu = 6144; - break; - case PollPDU_p8192: - pollPdu = 8192; - break; - case PollPDU_p12288: - pollPdu = 12288; - break; - case PollPDU_p16384: - pollPdu = 16384; - break; - case PollPDU_p20480: - pollPdu = 20480; - break; - case PollPDU_p24576: - pollPdu = 24576; - break; - case PollPDU_p28672: - pollPdu = 28672; - break; - case PollPDU_p32768: - pollPdu = 32768; - break; - case PollPDU_p40960: - pollPdu = 40960; - break; - case PollPDU_p49152: - pollPdu = 49152; - break; - case PollPDU_p57344: - pollPdu = 57344; - break; - case PollPDU_p65536: - pollPdu = 65536; - break; - case PollPDU_infinity: - pollPdu = -1; - break; - default: - DU_LOG("\nERROR --> F1AP: Invalid value of poll pdu"); - pollPdu = 0; - break; - } - return pollPdu; -} - -/******************************************************************* - * - * @brief Converts enum values into actual value of poll bytes - * - * @details - * - * Function : getPollByte - * - * Functionality: Converts enum values into actual value of pollBytes - * - * @params[in] Enum value - * @return Actual value - * - * ****************************************************************/ -int32_t getPollByte(uint16_t pollBytesCfg) -{ - int32_t pollBytes; - switch(pollBytesCfg) - { - case PollByte_kB1: - pollBytes = 1000; - break; - case PollByte_kB2: - pollBytes = 2000; - break; - case PollByte_kB5: - pollBytes = 5000; - break; - case PollByte_kB8: - pollBytes = 8000; - break; - case PollByte_kB10: - pollBytes = 10000; - break; - case PollByte_kB15: - pollBytes = 15000; - break; - case PollByte_kB25: - pollBytes = 25000; - break; - case PollByte_kB50: - pollBytes = 50000; - break; - case PollByte_kB75: - pollBytes = 75000; - break; - case PollByte_kB100: - pollBytes = 100000; - break; - case PollByte_kB125: - pollBytes = 125000; - break; - case PollByte_kB250: - pollBytes = 250000; - break; - case PollByte_kB375: - pollBytes = 375000; - break; - case PollByte_kB500: - pollBytes = 500000; - break; - case PollByte_kB750: - pollBytes = 750000; - break; - case PollByte_kB1000: - pollBytes = 1000000; - break; - case PollByte_kB1250: - pollBytes = 1250000; - break; - case PollByte_kB1500: - pollBytes = 1500000; - break; - case PollByte_kB2000: - pollBytes = 2000000; - break; - case PollByte_kB3000: - pollBytes = 3000000; - break; - case PollByte_kB4000: - pollBytes = 4000000; - break; - case PollByte_kB4500: - pollBytes = 4500000; - break; - case PollByte_kB5000: - pollBytes = 5000000; - break; - case PollByte_kB5500: - pollBytes = 5500000; - break; - case PollByte_kB6000: - pollBytes = 6000000; - break; - case PollByte_kB6500: - pollBytes = 6500000; - break; - case PollByte_kB7000: - pollBytes = 7000000; - break; - case PollByte_kB7500: - pollBytes = 7500000; - break; - case PollByte_mB8: - pollBytes = 8000000; - break; - case PollByte_mB9: - pollBytes = 9000000; - break; - case PollByte_mB10: - pollBytes = 10000000; - break; - case PollByte_mB11: - pollBytes = 11000000; - break; - case PollByte_mB12: - pollBytes = 12000000; - break; - case PollByte_mB13: - pollBytes = 13000000; - break; - case PollByte_mB14: - pollBytes = 14000000; - break; - case PollByte_mB15: - pollBytes = 15000000; - break; - case PollByte_mB16: - pollBytes = 16000000; - break; - case PollByte_mB17: - pollBytes = 17000000; - break; - case PollByte_mB18: - pollBytes = 18000000; - break; - case PollByte_mB20: - pollBytes = 20000000; - break; - case PollByte_mB25: - pollBytes = 25000000; - break; - case PollByte_mB30: - pollBytes = 30000000; - break; - case PollByte_mB40: - pollBytes = 40000000; - break; - case PollByte_infinity: - pollBytes = -1; - break; - default: - DU_LOG("\nERROR --> F1AP: Invalid value of poll bytes"); - pollBytes = 0; - } - return pollBytes; -} - -/******************************************************************* - * - * @brief Converts enum values into actual value of maxRetx - * - * @details - * - * Function : getMaxRetx - * - * Functionality: Converts enum values into actual value of maxRetx - * - * @params[in] Enum value - * @return Actual value +/****************************************************************** * - * ****************************************************************/ -uint8_t getMaxRetx(uint8_t maxRetxCfg) -{ - uint8_t maxRetx; - switch(maxRetxCfg) - { - case UL_AM_RLC__maxRetxThreshold_t1: - maxRetx = 1; - break; - case UL_AM_RLC__maxRetxThreshold_t2: - maxRetx = 2; - break; - case UL_AM_RLC__maxRetxThreshold_t3: - maxRetx = 3; - break; - case UL_AM_RLC__maxRetxThreshold_t4: - maxRetx = 4; - break; - case UL_AM_RLC__maxRetxThreshold_t6: - maxRetx = 6; - break; - case UL_AM_RLC__maxRetxThreshold_t8: - maxRetx = 8; - break; - case UL_AM_RLC__maxRetxThreshold_t16: - maxRetx = 16; - break; - case UL_AM_RLC__maxRetxThreshold_t32: - maxRetx = 32; - break; - default: - DU_LOG("\nERROR --> F1AP: Invalid configuration for Max retransmission threshold"); - maxRetx = 0; - } - return maxRetx; -} - -/******************************************************************* - * @brief Converts enum values into actual value of reassembly timer + * @brief Function to fetch lcId based on DRB Id * * @details * - * Function : getReAsmblTmr + * Function : fetchLcId * - * Functionality: Converts enum values into actual value of reassembly - * timer + * @params[in] drbId * - * @params[in] Enum value of reassembly timer - * @return Actual value of reassembly timer + * Functionality: Function to fetch lcId based on DRB Id * - * **********************************************************************/ + * Returns: lcId - SUCCESS + * RFAILED - FAILURE + *****************************************************************/ -int8_t getReAsmblTmr(uint8_t reAsmblTmrCfg) +uint8_t fetchLcId(uint8_t drbId) { - int8_t reAsmblTmr = 0; - - if(reAsmblTmrCfg == T_Reassembly_ms0) - { - reAsmblTmr = 0; - } - else if(reAsmblTmrCfg >= T_Reassembly_ms5 || reAsmblTmrCfg <= T_Reassembly_ms100) - { - /* All values of re assembly timer are at interval of 5ms. - * This is valid upto 100ms - * Hence converting the enum value to actual value by multiplying it to 5 - */ - reAsmblTmr = reAsmblTmrCfg * 5; - } - else if(reAsmblTmrCfg >= T_Reassembly_ms110 || reAsmblTmrCfg <= T_Reassembly_ms200) - { - /* All values of re assembly timer are at interval of 10ms. - * This is valid upto 200ms - * since enum value starts from 20 for 100ms, subtracting 10 and - * converting the enum value to actual value by multiplying it to 10 - */ - reAsmblTmr = ((reAsmblTmrCfg-10) * 10); - } - else - { - DU_LOG("\nERROR --> F1AP : Invalid value of Re Assembly timer %d", reAsmblTmrCfg); - reAsmblTmr = -1; - } - return reAsmblTmr; -} - -/************************************************************************ - * - * @brief Converts enum values into actual value of status prohibit timer - * - * @details - * - * Function : getStatProhTmr - * - * Functionality: Converts enum values into actual value of status prohibit - * timer - * - * @params[in] Enum value of status prohibit timer - * @return Actual value of status prohibit timer - * - * **********************************************************************/ + uint8_t cellIdx = 0, ueIdx = 0, lcIdx = 0, numLcs = 0, lcId = 0; -int16_t getStatProhTmr(uint8_t statProhTmrCfg) -{ - int16_t statProhTmr =0; - - if(statProhTmrCfg == T_StatusProhibit_ms0) - { - statProhTmr = 0; - } - else if(statProhTmrCfg >= T_StatusProhibit_ms5 || statProhTmrCfg <= T_StatusProhibit_ms250) - { - /* All values of re assembly timer are at interval of 5ms. - * This is valid upto 250ms - * Hence converting the enum value to actual value by multiplying it to 5 - */ - statProhTmr = statProhTmrCfg * 5; - } - else + for(cellIdx = 0; cellIdx < MAX_NUM_CELL; cellIdx++) { - switch(statProhTmrCfg) + for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++) { - case T_StatusProhibit_ms300: - statProhTmr = 300; - break; - case T_StatusProhibit_ms350: - statProhTmr = 350; - break; - case T_StatusProhibit_ms400: - statProhTmr = 400; - break; - case T_StatusProhibit_ms450: - statProhTmr = 450; - break; - case T_StatusProhibit_ms500: - statProhTmr = 500; - break; - case T_StatusProhibit_ms800: - statProhTmr = 800; - break; - case T_StatusProhibit_ms1000: - statProhTmr = 1000; - break; - case T_StatusProhibit_ms1200: - statProhTmr = 1200; - break; - case T_StatusProhibit_ms1600: - statProhTmr = 1600; - break; - case T_StatusProhibit_ms2000: - statProhTmr = 2000; - break; - case T_StatusProhibit_ms2400: - statProhTmr = 2400; - break; - default: - DU_LOG("\nInvalid value of Status Prohibit timer %d", statProhTmrCfg); - statProhTmr = -1; - break; + if(duCb.actvCellLst[cellIdx] != NULLP) + { + numLcs = duCb.actvCellLst[cellIdx]->ueCb[ueIdx].rlcUeCfg.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) + { + lcId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx].rlcUeCfg.rlcLcCfg[lcIdx].lcId; + return lcId; + } + } + } } } - return statProhTmr; + DU_LOG("\nERROR --> DU_APP: fetchLcId() failed for drbId %d", drbId); + return RFAILED; } /******************************************************************* @@ -615,7 +193,6 @@ int16_t getStatProhTmr(uint8_t statProhTmrCfg) * RFAILED - failure * * ****************************************************************/ - void addToReservedF1apPduList(uint8_t transId, F1AP_PDU_t *f1apPdu) { CmLList *node = NULLP; @@ -785,30 +362,6 @@ uint8_t BuildDLNRInfo(NRFreqInfo_t *dlnrfreq) return ROK; } -/******************************************************************* - * - * @brief Builds NRCell ID - * - * @details - * - * Function : BuildNrCellId - * - * Functionality: Building the NR Cell ID - * - * @params[in] BIT_STRING_t *nrcell - * @return ROK - success - * RFAILED - failure - * - * ****************************************************************/ - -S16 BuildNrCellId(BIT_STRING_t *nrcell) -{ - memset(nrcell->buf, 0, nrcell->size); - nrcell->buf[4] = 16; - nrcell->bits_unused = 4; - return ROK; -} - /******************************************************************* * * @brief Builds Nrcgi @@ -848,7 +401,7 @@ uint8_t BuildNrcgi(NRCGI_t *nrcgi) { return RFAILED; } - BuildNrCellId(&nrcgi->nRCellIdentity); + fillBitString(&nrcgi->nRCellIdentity, ODU_VALUE_FOUR, ODU_VALUE_FIVE, duCfgParam.sib1Params.cellIdentity); return ROK; } @@ -886,62 +439,170 @@ uint8_t BuildFiveGSTac(Served_Cell_Information_t *servcell) servcell->fiveGS_TAC->buf[2] = duCfgParam.srvdCellLst[0].duCellInfo.tac; return ROK; } + /******************************************************************* * - * @brief Builds NR Mode + * @brief fill nr frequency information * * @details * - * Function : BuildNrMode + * Function : fillNrTddInfo * - * Functionality: Building the NR Mode + * Functionality: fill nr frequency information * - * @params[in] NR_Mode_Info_t *fdd + * @params[in] NRFreqInfo_t freqInfo * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t BuildNrMode(NR_Mode_Info_t *mode) +uint8_t fillNrTddInfo(TDD_Info_t *tddInfo) { - uint8_t BuildDLNRInforet=0; - uint8_t BuildULNRInforet=0; - /* FDD Mode */ - mode->present = NR_Mode_Info_PR_fDD; - if(mode->present == NR_Mode_Info_PR_fDD) + uint8_t elementCnt = 1, freqBandListIdx = 0, supportedBandIdx = 0; + NRFreqInfo_t *freqInfo = NULLP; + + if(tddInfo == NULLP) { - DU_ALLOC(mode->choice.fDD,sizeof(FDD_Info_t)); - if(mode->choice.fDD == NULLP) + DU_LOG("\nERROR --> DU APP : Null pointer received at fillNrTddInfo"); + return RFAILED; + } + + freqInfo = &tddInfo->nRFreqInfo; + freqInfo->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.nrArfcn; + + freqInfo->freqBandListNr.list.count = elementCnt; + freqInfo->freqBandListNr.list.size = freqInfo->freqBandListNr.list.count * sizeof(FreqBandNrItem_t *); + DU_ALLOC(freqInfo->freqBandListNr.list.array, freqInfo->freqBandListNr.list.size ); + if(!freqInfo->freqBandListNr.list.array) + { + DU_LOG("\nERROR --> DU APP : Memory allocation failed at fillNrTddInfo"); + return RFAILED; + } + + for(freqBandListIdx = 0; freqBandListIdxfreqBandListNr.list.count; freqBandListIdx++) + { + DU_ALLOC(freqInfo->freqBandListNr.list.array[freqBandListIdx], sizeof(FreqBandNrItem_t )); + if(!freqInfo->freqBandListNr.list.array[freqBandListIdx]) { - return RFAILED; + DU_LOG("\nERROR --> DU APP : Memory allocation failed at fillNrTddInfo"); + return RFAILED; } - BuildULNRInforet = BuildULNRInfo(&mode->choice.fDD->uL_NRFreqInfo); - if(BuildULNRInforet != ROK) + + 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*); + + DU_ALLOC(freqInfo->freqBandListNr.list.array[freqBandListIdx]->supportedSULBandList.list.array,\ + freqInfo->freqBandListNr.list.array[freqBandListIdx]->supportedSULBandList.list.size); + if(!freqInfo->freqBandListNr.list.array[freqBandListIdx]->supportedSULBandList.list.array) { - return RFAILED; + DU_LOG("\nERROR --> DU APP : Memory allocation failed at fillNrTddInfo"); + return RFAILED; } - BuildDLNRInforet = BuildDLNRInfo(&mode->choice.fDD->dL_NRFreqInfo); - if(BuildDLNRInforet != ROK) + + for(supportedBandIdx = 0; supportedBandIdxfreqBandListNr.list.array[freqBandListIdx]->supportedSULBandList.list.count; supportedBandIdx++) { - return RFAILED; + DU_ALLOC(freqInfo->freqBandListNr.list.array[freqBandListIdx]->supportedSULBandList.list.array[supportedBandIdx],\ + sizeof(SupportedSULFreqBandItem_t)); + if(!freqInfo->freqBandListNr.list.array[freqBandListIdx]->supportedSULBandList.list.array[supportedBandIdx]) + { + DU_LOG("\nERROR --> DU APP : Memory allocation failed at fillNrTddInfo"); + return RFAILED; + } + + freqInfo->freqBandListNr.list.array[freqBandListIdx]->supportedSULBandList.list.array[supportedBandIdx]->freqBandIndicatorNr =\ + duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.freqBand[0].sulBand[0]; } } - mode->choice.fDD->uL_Transmission_Bandwidth.nRSCS = \ - duCfgParam.srvdCellLst[0].duCellInfo.\ - f1Mode.mode.fdd.ulTxBw.nrScs; - mode->choice.fDD->uL_Transmission_Bandwidth.nRNRB = \ - duCfgParam.srvdCellLst[0].duCellInfo.\ - f1Mode.mode.fdd.ulTxBw.nrb; - mode->choice.fDD->dL_Transmission_Bandwidth.nRSCS = \ - duCfgParam.srvdCellLst[0].duCellInfo.\ - f1Mode.mode.fdd.dlTxBw.nrScs; - mode->choice.fDD->dL_Transmission_Bandwidth.nRNRB = \ - duCfgParam.srvdCellLst[0].duCellInfo.\ - f1Mode.mode.fdd.dlTxBw.nrb; + + tddInfo->transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulTxBw.nrScs; + tddInfo->transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulTxBw.nrb; + return ROK; } + /******************************************************************* * - * @brief Builds IE Extensions for Served PLMNs + * @brief Builds NR Mode + * + * @details + * + * Function : BuildNrMode + * + * Functionality: Building the NR Mode + * + * @params[in] NR_Mode_Info_t *fdd + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t BuildNrMode(NR_Mode_Info_t *mode) +{ + uint8_t BuildDLNRInforet=0; + uint8_t BuildULNRInforet=0; + +#ifdef NR_TDD + mode->present = NR_Mode_Info_PR_tDD; +#else + mode->present = NR_Mode_Info_PR_fDD; +#endif + + if(mode->present == NR_Mode_Info_PR_fDD) + { + DU_ALLOC(mode->choice.fDD,sizeof(FDD_Info_t)); + if(mode->choice.fDD == NULLP) + { + DU_LOG("\nERROR --> Memory allocation failed in BuildNrMode"); + return RFAILED; + } + BuildULNRInforet = BuildULNRInfo(&mode->choice.fDD->uL_NRFreqInfo); + if(BuildULNRInforet != ROK) + { + DU_LOG("\nERROR --> Failed to build UlNrFreqInfo"); + return RFAILED; + } + BuildDLNRInforet = BuildDLNRInfo(&mode->choice.fDD->dL_NRFreqInfo); + if(BuildDLNRInforet != ROK) + { + DU_LOG("\nERROR --> Failed to build DlNrFreqInfo"); + return RFAILED; + } + mode->choice.fDD->uL_Transmission_Bandwidth.nRSCS = \ + duCfgParam.srvdCellLst[0].duCellInfo.\ + f1Mode.mode.fdd.ulTxBw.nrScs; + mode->choice.fDD->uL_Transmission_Bandwidth.nRNRB = \ + duCfgParam.srvdCellLst[0].duCellInfo.\ + f1Mode.mode.fdd.ulTxBw.nrb; + mode->choice.fDD->dL_Transmission_Bandwidth.nRSCS = \ + duCfgParam.srvdCellLst[0].duCellInfo.\ + f1Mode.mode.fdd.dlTxBw.nrScs; + mode->choice.fDD->dL_Transmission_Bandwidth.nRNRB = \ + duCfgParam.srvdCellLst[0].duCellInfo.\ + f1Mode.mode.fdd.dlTxBw.nrb; + } + else if(mode->present == NR_Mode_Info_PR_tDD) + { + DU_ALLOC(mode->choice.tDD,sizeof(TDD_Info_t)); + if(mode->choice.tDD == NULLP) + { + DU_LOG("\nERROR --> Memory allocation failed in BuildNrMode"); + return RFAILED; + } + + if(fillNrTddInfo(mode->choice.tDD) != ROK) + { + DU_LOG("\nERROR --> Failed to fill Nr TDD information"); + return RFAILED; + } + + } + + return ROK; +} +/******************************************************************* + * + * @brief Builds IE Extensions for Served PLMNs * * @details * @@ -986,7 +647,7 @@ uint8_t BuildExtensions(ProtocolExtensionContainer_4624P3_t **ieExtend) } } - elementCnt = NUM_OF_SUPPORTED_SLICE; + elementCnt = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].taiSliceSuppLst.numSupportedSlices; idx = 0; (*ieExtend)->list.array[idx]->id = ProtocolIE_ID_id_TAISliceSupportList; (*ieExtend)->list.array[idx]->criticality = Criticality_ignore; @@ -1400,6 +1061,90 @@ void FreeRrcVer(RRC_Version_t *rrcVer) DU_FREE(rrcVer->latest_RRC_Version.buf,rrcVer->latest_RRC_Version.size); } } + +/******************************************************************* + * + * @brief Deallocating memory of TDD NrFreqInfo + * + * @details + * + * Function : freeTddNrFreqInfo + * + * Functionality: freeTddNrFreqInfo + * + * @params[in] F1AP_PDU_t *f1apDuCfg + * + * @return ROK - void + * + * ****************************************************************/ +void freeTddNrFreqInfo(NRFreqInfo_t *freqInfo) +{ + uint8_t freqBandListIdx = 0, supportedBandIdx = 0; + + if(freqInfo->freqBandListNr.list.array) + { + for(freqBandListIdx = 0; freqBandListIdxfreqBandListNr.list.count; freqBandListIdx++) + { + if(freqInfo->freqBandListNr.list.array[freqBandListIdx]) + { + if(freqInfo->freqBandListNr.list.array[freqBandListIdx]->supportedSULBandList.list.array) + { + for(supportedBandIdx = 0; supportedBandIdxfreqBandListNr.list.array[freqBandListIdx]->supportedSULBandList.list.count; supportedBandIdx++) + { + DU_FREE(freqInfo->freqBandListNr.list.array[freqBandListIdx]->supportedSULBandList.list.array[supportedBandIdx],\ + sizeof(SupportedSULFreqBandItem_t)); + } + DU_FREE(freqInfo->freqBandListNr.list.array[freqBandListIdx]->supportedSULBandList.list.array,\ + freqInfo->freqBandListNr.list.array[freqBandListIdx]->supportedSULBandList.list.size); + + } + DU_FREE(freqInfo->freqBandListNr.list.array[freqBandListIdx], sizeof(FreqBandNrItem_t )); + } + } + DU_FREE(freqInfo->freqBandListNr.list.array, freqInfo->freqBandListNr.list.size ); + } +} + +/******************************************************************* + * + * @brief Deallocating memory allocated for Nr fdd frequencey mode + * + * @details + * + * Function : freeFddNrFreqInfo + * + * Functionality:Free memory allocated for Nr fdd frequencey mode + * + * @params[in] + * + * @return ROK - void + * + * ****************************************************************/ +void freeFddNrFreqInfo(FDD_Info_t *fDD) +{ + uint8_t arrIdx =0; + + if(fDD != NULLP) + { + if(fDD->uL_NRFreqInfo.freqBandListNr.list.array != NULLP) + { + DU_FREE(fDD->uL_NRFreqInfo.freqBandListNr.list.\ + array[arrIdx], sizeof(FreqBandNrItem_t)); + DU_FREE(fDD->uL_NRFreqInfo.freqBandListNr.list.array, \ + fDD->uL_NRFreqInfo.freqBandListNr.list.size); + } + + if(fDD->dL_NRFreqInfo.freqBandListNr.list.array != NULLP) + { + DU_FREE(fDD->dL_NRFreqInfo.freqBandListNr.list.\ + array[arrIdx], sizeof(FreqBandNrItem_t)); + DU_FREE(fDD->dL_NRFreqInfo.freqBandListNr.list.array,\ + fDD->dL_NRFreqInfo.freqBandListNr.list.size); + } + DU_FREE(fDD,sizeof(FDD_Info_t)); + } +} + /******************************************************************* * * @brief deallocating the memory of function BuildAndSendF1SetupReq() @@ -1457,70 +1202,62 @@ void FreeServedCellList( GNB_DU_Served_Cells_List_t *duServedCell) if(servedPlmnItem->iE_Extensions->list.array[0] != NULLP) { if(servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.choice.\ - SliceSupportList.list.array != NULLP) + SliceSupportList.list.array != NULLP) { for(sliceIdx =0; sliceIdxiE_Extensions->list.array[0]->\ - extensionValue.choice.SliceSupportList.list.count; sliceIdx++) + extensionValue.choice.SliceSupportList.list.count; sliceIdx++) { if(servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.choice.\ - SliceSupportList.list.array[sliceIdx] != NULLP) + SliceSupportList.list.array[sliceIdx] != NULLP) { sliceSupportItem = servedPlmnItem->iE_Extensions->list.array[0]->\ - extensionValue.choice.SliceSupportList.list.array[sliceIdx]; + extensionValue.choice.SliceSupportList.list.array[sliceIdx]; DU_FREE(sliceSupportItem->sNSSAI.sST.buf, sizeof(uint8_t)); if(sliceSupportItem->sNSSAI.sD != NULLP) { DU_FREE(sliceSupportItem->sNSSAI.sD->buf,\ - sliceSupportItem->sNSSAI.sD->size); + sliceSupportItem->sNSSAI.sD->size); DU_FREE(sliceSupportItem->sNSSAI.sD, sizeof(OCTET_STRING_t)); } DU_FREE(servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.\ - choice.SliceSupportList.list.array[sliceIdx], sizeof(SliceSupportItem_t)); + choice.SliceSupportList.list.array[sliceIdx], sizeof(SliceSupportItem_t)); } } DU_FREE(servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.choice.\ - SliceSupportList.list.array, sizeof(SliceSupportItem_t*)); + SliceSupportList.list.array, servedPlmnItem->iE_Extensions->list.array[0]->\ + extensionValue.choice.SliceSupportList.list.size); } DU_FREE(servedPlmnItem->iE_Extensions->list.array[0],\ - sizeof(ServedPLMNs_ItemExtIEs_t)); + sizeof(ServedPLMNs_ItemExtIEs_t)); } DU_FREE(servedPlmnItem->iE_Extensions->list.array,\ - extensionCnt*sizeof(ServedPLMNs_ItemExtIEs_t*)); + extensionCnt*sizeof(ServedPLMNs_ItemExtIEs_t*)); } DU_FREE(servedPlmnItem->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P3_t)); } DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[plmnIdx],\ - sizeof(ServedPLMNs_Item_t)); + sizeof(ServedPLMNs_Item_t)); } DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array,\ - sizeof(ServedPLMNs_Item_t *)); + sizeof(ServedPLMNs_Item_t *)); } - if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD != NULLP) + if(srvCellItem->served_Cell_Information.nR_Mode_Info.present == NR_Mode_Info_PR_fDD) { - if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\ - freqBandListNr.list.array != NULLP) - { - DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\ - uL_NRFreqInfo.freqBandListNr.list.array[0],sizeof(FreqBandNrItem_t)); - DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\ - uL_NRFreqInfo.freqBandListNr.list.array,sizeof(FreqBandNrItem_t*)); - } - - if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\ - freqBandListNr.list.array) + freeFddNrFreqInfo(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD); + } + else + { + if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.tDD != NULLP) { - DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\ - freqBandListNr.list.array[0],sizeof(FreqBandNrItem_t)); - DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\ - freqBandListNr.list.array,sizeof(FreqBandNrItem_t *)); + freeTddNrFreqInfo(&srvCellItem->served_Cell_Information.nR_Mode_Info.choice.tDD->nRFreqInfo); + DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.tDD, sizeof(TDD_Info_t)); } - DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD, sizeof(FDD_Info_t)); } - + DU_FREE(srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf,\ srvCellItem->served_Cell_Information.measurementTimingConfiguration.size); @@ -1768,24 +1505,33 @@ uint8_t BuildAndSendF1SetupReq() /* Encode results */ if(encRetVal.encoded == ENCODE_FAIL) { - DU_LOG("\nERROR --> F1AP : Could not encode F1SetupRequest structure (at %s)\n",\ - encRetVal.failed_type ? encRetVal.failed_type->name : "unknown"); - break; + DU_LOG("\nERROR --> F1AP : Could not encode F1SetupRequest structure (at %s)\n",\ + encRetVal.failed_type ? encRetVal.failed_type->name : "unknown"); + break; } else { - DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1SetupRequest\n"); - for(ieIdx=0; ieIdx< encBufSize; ieIdx++) - { - printf("%x",encBuf[ieIdx]); - } + DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1SetupRequest\n"); + for(ieIdx=0; ieIdx< encBufSize; ieIdx++) + { + printf("%x",encBuf[ieIdx]); + } + + 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); } /* Sending msg */ if(sendF1APMsg() != ROK) { - DU_LOG("\nERROR --> F1AP : Sending F1 Setup request failed"); - break; + DU_LOG("\nERROR --> F1AP : Sending F1 Setup request failed"); + break; } ret=ROK; @@ -1887,27 +1633,19 @@ void freeCellsToModifyItem(Served_Cells_To_Modify_Item_t *modifyItem) DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array,\ modifyItem->served_Cell_Information.servedPLMNs.list.size); } - - if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD != NULLP) + + if(modifyItem->served_Cell_Information.nR_Mode_Info.present == NR_Mode_Info_PR_fDD) { - if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array != NULLP) - { - DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.list.\ - array[arrIdx], sizeof(FreqBandNrItem_t)); - DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array, \ - modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.list.size); - } - - if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array != NULLP) + freeFddNrFreqInfo(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD); + } + else + { + if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.tDD) { - DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.freqBandListNr.list.\ - array[arrIdx], sizeof(FreqBandNrItem_t)); - DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array,\ - modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size); + freeTddNrFreqInfo(&modifyItem->served_Cell_Information.nR_Mode_Info.choice.tDD->nRFreqInfo); + DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.tDD, sizeof(TDD_Info_t)); } - DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD,sizeof(FDD_Info_t)); } - DU_FREE(modifyItem->served_Cell_Information.measurementTimingConfiguration.buf,\ modifyItem->served_Cell_Information.measurementTimingConfiguration.size); } @@ -2076,7 +1814,7 @@ uint8_t fillServedPlmns(ServedPLMNs_List_t *servedPlmn) } ieIdx = 0; - elementCnt = NUM_OF_SUPPORTED_SLICE; + elementCnt = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].taiSliceSuppLst.numSupportedSlices; servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array[ieIdx]->id =ProtocolIE_ID_id_TAISliceSupportList; servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array[ieIdx]->criticality = Criticality_ignore; servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array[ieIdx]->extensionValue.present = \ @@ -2177,64 +1915,70 @@ uint8_t fillServedPlmns(ServedPLMNs_List_t *servedPlmn) * * Functionality: Fills Nr Fdd Info required in ServCellInfo IE * - * @params[in] Pointer to NR_Mode_Info_t * + * @params[in] FDD_Info_t *fDD * * @return ROK - success * RFAILED - failure * *****************************************************************/ -uint8_t fillNrFddInfo(NR_Mode_Info_t *nrFdd) +uint8_t fillNrFddInfo(FDD_Info_t *fDD) { - nrFdd->choice.fDD->uL_NRFreqInfo.nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.\ + fDD->uL_NRFreqInfo.nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.\ f1Mode.mode.fdd.ulNrFreqInfo.nrArfcn; - nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.count = 1; - nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.size = sizeof(FreqBandNrItem_t*); - DU_ALLOC(nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.\ - array, nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.size); - if(nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array == NULLP) + fDD->uL_NRFreqInfo.freqBandListNr.list.count = 1; + fDD->uL_NRFreqInfo.freqBandListNr.list.size = sizeof(FreqBandNrItem_t*); + DU_ALLOC(fDD->uL_NRFreqInfo.freqBandListNr.list.\ + array, fDD->uL_NRFreqInfo.freqBandListNr.list.size); + if(fDD->uL_NRFreqInfo.freqBandListNr.list.array == NULLP) { + DU_LOG("\nERROR --> Memory allocation failed in fillNrFddInfo"); return RFAILED; } - DU_ALLOC(nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array[0], \ + + DU_ALLOC(fDD->uL_NRFreqInfo.freqBandListNr.list.array[0], \ sizeof(FreqBandNrItem_t)); - if(nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP) + if(fDD->uL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP) { + DU_LOG("\nERROR --> Memory allocation failed in fillNrFddInfo"); return RFAILED; } - nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array[0]->freqBandIndicatorNr = \ + + fDD->uL_NRFreqInfo.freqBandListNr.list.array[0]->freqBandIndicatorNr = \ duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\ freqBand[0].nrFreqBand; - nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array[0]->supportedSULBandList.list.count=0; - nrFdd->choice.fDD->dL_NRFreqInfo.nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.\ + fDD->uL_NRFreqInfo.freqBandListNr.list.array[0]->supportedSULBandList.list.count=0; + fDD->dL_NRFreqInfo.nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.\ dlNrFreqInfo.nrArfcn; - nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.count = 1; - nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size = sizeof(FreqBandNrItem_t *); - DU_ALLOC(nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array,nrFdd->\ - choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size); - if(nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array == NULLP) + fDD->dL_NRFreqInfo.freqBandListNr.list.count = 1; + fDD->dL_NRFreqInfo.freqBandListNr.list.size = sizeof(FreqBandNrItem_t *); + DU_ALLOC(fDD->dL_NRFreqInfo.freqBandListNr.list.array, fDD->dL_NRFreqInfo.freqBandListNr.list.size); + if(fDD->dL_NRFreqInfo.freqBandListNr.list.array == NULLP) { + DU_LOG("\nERROR --> Memory allocation failed in fillNrFddInfo"); return RFAILED; } - DU_ALLOC(nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array[0],\ - sizeof(FreqBandNrItem_t)); - if(nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP) + + DU_ALLOC(fDD->dL_NRFreqInfo.freqBandListNr.list.array[0], sizeof(FreqBandNrItem_t)); + if(fDD->dL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP) { + DU_LOG("\nERROR --> Memory allocation failed in fillNrFddInfo"); return RFAILED; } - nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array[0]->freqBandIndicatorNr = \ + + fDD->dL_NRFreqInfo.freqBandListNr.list.array[0]->freqBandIndicatorNr = \ duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\ freqBand[0].nrFreqBand; - nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array[0]->supportedSULBandList.list.count=0; + fDD->dL_NRFreqInfo.freqBandListNr.list.array[0]->supportedSULBandList.list.count=0; /*Transmission Bandwidth*/ - nrFdd->choice.fDD->uL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\ + fDD->uL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\ f1Mode.mode.fdd.ulTxBw.nrScs; - nrFdd->choice.fDD->uL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\ + fDD->uL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\ f1Mode.mode.fdd.ulTxBw.nrb; - nrFdd->choice.fDD->dL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\ + fDD->dL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\ f1Mode.mode.fdd.dlTxBw.nrScs; - nrFdd->choice.fDD->dL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\ + fDD->dL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\ f1Mode.mode.fdd.dlTxBw.nrb; return ROK; @@ -2259,7 +2003,7 @@ uint8_t fillNrFddInfo(NR_Mode_Info_t *nrFdd) uint8_t fillServedCellInfo(Served_Cell_Information_t *srvCellInfo) { - uint8_t tmp, ieIdx, ieListCnt; + uint8_t ieIdx, ieListCnt; /*nRCGI*/ srvCellInfo->nRCGI.pLMN_Identity.size =3*sizeof(uint8_t); @@ -2267,6 +2011,7 @@ uint8_t fillServedCellInfo(Served_Cell_Information_t *srvCellInfo) srvCellInfo->nRCGI.pLMN_Identity.size); if(srvCellInfo->nRCGI.pLMN_Identity.buf == NULLP) { + DU_LOG("\nERROR --> Memory allocation failed in fillServedCellInfo"); return RFAILED; } buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\ @@ -2275,17 +2020,12 @@ uint8_t fillServedCellInfo(Served_Cell_Information_t *srvCellInfo) DU_ALLOC(srvCellInfo->nRCGI.nRCellIdentity.buf,\ srvCellInfo->nRCGI.nRCellIdentity.size); if(srvCellInfo->nRCGI.nRCellIdentity.buf == NULLP) - { + { + DU_LOG("\nERROR --> Memory allocation failed in fillServedCellInfo"); return RFAILED; } - for (tmp = 0 ; tmp < srvCellInfo->\ - nRCGI.nRCellIdentity.size-1 ; tmp++) - { - srvCellInfo->nRCGI.nRCellIdentity.buf[tmp] = 0; - } - srvCellInfo->nRCGI.nRCellIdentity.buf[4] = 16; - srvCellInfo->nRCGI.nRCellIdentity.bits_unused =4; - + + fillBitString(&srvCellInfo->nRCGI.nRCellIdentity, ODU_VALUE_FOUR, ODU_VALUE_FIVE, duCfgParam.sib1Params.cellIdentity); /*nRPCI*/ srvCellInfo->nRPCI = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci; @@ -2293,36 +2033,55 @@ uint8_t fillServedCellInfo(Served_Cell_Information_t *srvCellInfo) ieListCnt = 1; srvCellInfo->servedPLMNs.list.count = ieListCnt; srvCellInfo->servedPLMNs.list.size = ieListCnt*sizeof(ServedPLMNs_Item_t *); - DU_ALLOC(srvCellInfo->servedPLMNs.list.array,\ - srvCellInfo->servedPLMNs.list.size); + DU_ALLOC(srvCellInfo->servedPLMNs.list.array, srvCellInfo->servedPLMNs.list.size); if(srvCellInfo->servedPLMNs.list.array == NULLP) { + DU_LOG("\nERROR --> Memory allocation failed in fillServedCellInfo"); return RFAILED; } for(ieIdx=0; ieIdx < ieListCnt; ieIdx++) { - DU_ALLOC(srvCellInfo->servedPLMNs.list.array[ieIdx],\ - sizeof(ServedPLMNs_Item_t)); + DU_ALLOC(srvCellInfo->servedPLMNs.list.array[ieIdx], sizeof(ServedPLMNs_Item_t)); if(srvCellInfo->servedPLMNs.list.array[ieIdx]== NULLP) { - return RFAILED; + DU_LOG("\nERROR --> Memory allocation failed in fillServedCellInfo"); + return RFAILED; } } if(fillServedPlmns(&srvCellInfo->servedPLMNs)) { + DU_LOG("\nERROR --> Failed to fill Served Plmn info"); return RFAILED; } +#ifndef NR_TDD /*nR Mode Info with FDD*/ srvCellInfo->nR_Mode_Info.present = NR_Mode_Info_PR_fDD; - DU_ALLOC(srvCellInfo->nR_Mode_Info.choice.fDD,\ - sizeof(FDD_Info_t)); + DU_ALLOC(srvCellInfo->nR_Mode_Info.choice.fDD, sizeof(FDD_Info_t)); if(srvCellInfo->nR_Mode_Info.choice.fDD == NULLP) { + DU_LOG("\nERROR --> Memory allocation failed in fillServedCellInfo"); + return RFAILED; + } + if(fillNrFddInfo(srvCellInfo->nR_Mode_Info.choice.fDD)) + { + DU_LOG("\nERROR --> Failed to fill the Nr FDD information"); return RFAILED; } - if(fillNrFddInfo(&srvCellInfo->nR_Mode_Info)) +#else + srvCellInfo->nR_Mode_Info.present = NR_Mode_Info_PR_tDD; + DU_ALLOC(srvCellInfo->nR_Mode_Info.choice.tDD, sizeof(TDD_Info_t)); + if(srvCellInfo->nR_Mode_Info.choice.tDD == NULLP) + { + DU_LOG("\nERROR --> Memory allocation failed in fillServedCellInfo"); + return RFAILED; + } + if(fillNrTddInfo(srvCellInfo->nR_Mode_Info.choice.tDD) != ROK) + { + DU_LOG("\nERROR --> Failed to fill the Nr TDD information"); return RFAILED; + } +#endif /*Measurement timing Config*/ srvCellInfo->measurementTimingConfiguration.size = sizeof(uint8_t); @@ -2357,8 +2116,6 @@ uint8_t fillServedCellInfo(Served_Cell_Information_t *srvCellInfo) uint8_t fillServCellToModItem(Served_Cells_To_Modify_Item_t *modifyItem) { - uint8_t ieIdx; - /*pLMN_Identity*/ modifyItem->oldNRCGI.pLMN_Identity.size = 3*sizeof(uint8_t); DU_ALLOC(modifyItem->oldNRCGI.pLMN_Identity.buf,modifyItem->oldNRCGI.pLMN_Identity.size); @@ -2377,12 +2134,7 @@ uint8_t fillServCellToModItem(Served_Cells_To_Modify_Item_t *modifyItem) { return RFAILED; } - for(ieIdx = 0; ieIdx < modifyItem->oldNRCGI.nRCellIdentity.size-1; ieIdx++) - { - modifyItem->oldNRCGI.nRCellIdentity.buf[ieIdx] = 0; - } - modifyItem->oldNRCGI.nRCellIdentity.buf[4] = 16; - modifyItem->oldNRCGI.nRCellIdentity.bits_unused = 4; + fillBitString(&modifyItem->oldNRCGI.nRCellIdentity, ODU_VALUE_FOUR, ODU_VALUE_FIVE, duCfgParam.sib1Params.cellIdentity); if(fillServedCellInfo(&modifyItem->served_Cell_Information)) return RFAILED; @@ -2457,7 +2209,6 @@ uint8_t buildServCellToModList(Served_Cells_To_Modify_List_t *cellsToModify) *****************************************************************/ uint8_t fillCellToDeleteItem(struct Served_Cells_To_Delete_ItemIEs *deleteItemIe) { - uint8_t arrIdx; Served_Cells_To_Delete_Item_t *deleteItem=NULLP; deleteItemIe->id = ProtocolIE_ID_id_Served_Cells_To_Delete_Item; @@ -2486,12 +2237,7 @@ uint8_t fillCellToDeleteItem(struct Served_Cells_To_Delete_ItemIEs *deleteItemIe DU_LOG("ERROR --> F1AP: fillCellToDeleteItem(): Failed to allocate the memory"); return RFAILED; } - for(arrIdx = 0; arrIdx < deleteItem->oldNRCGI.nRCellIdentity.size-1; arrIdx++) - { - deleteItem->oldNRCGI.nRCellIdentity.buf[arrIdx] = 0; - } - deleteItem->oldNRCGI.nRCellIdentity.buf[4] = 16; - deleteItem->oldNRCGI.nRCellIdentity.bits_unused = 4; + fillBitString(&deleteItem->oldNRCGI.nRCellIdentity, ODU_VALUE_FOUR, ODU_VALUE_FIVE, duCfgParam.sib1Params.cellIdentity); return ROK; } /******************************************************************* @@ -2787,16 +2533,14 @@ void FreeULRRCMessageTransfer( F1AP_PDU_t *f1apMsg) * RFAILED - failure * * ****************************************************************/ -uint8_t BuildAndSendULRRCMessageTransfer(DuUeCb ueCb, uint8_t lcId, \ +uint8_t BuildAndSendULRRCMessageTransfer(DuUeCb *ueCb, uint8_t lcId, \ uint16_t msgLen, uint8_t *rrcMsg) { - uint8_t elementCnt =0; - uint8_t idx1 =0; - uint8_t idx =0; - F1AP_PDU_t *f1apMsg = NULLP; - ULRRCMessageTransfer_t *ulRRCMsg = NULLP; - asn_enc_rval_t encRetVal; /* Encoder return value */ - uint8_t ret =RFAILED; + uint8_t elementCnt=0, idx1=0, idx=0; + uint8_t ret = RFAILED; + F1AP_PDU_t *f1apMsg = NULLP; + ULRRCMessageTransfer_t *ulRRCMsg = NULLP; + asn_enc_rval_t encRetVal; /* Encoder return value */ memset(&encRetVal, 0, sizeof(asn_enc_rval_t)); @@ -2851,7 +2595,7 @@ uint8_t BuildAndSendULRRCMessageTransfer(DuUeCb ueCb, uint8_t lcId, \ ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject; ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \ ULRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID; - ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_CU_UE_F1AP_ID = ueCb.gnbCuUeF1apId; + ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId; /*GNB DU UE F1AP ID*/ idx1++; @@ -2859,7 +2603,7 @@ uint8_t BuildAndSendULRRCMessageTransfer(DuUeCb ueCb, uint8_t lcId, \ ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject; ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \ ULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID; - ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = ueCb.gnbDuUeF1apId; + ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId; /*SRBID*/ idx1++; @@ -2940,7 +2684,7 @@ uint8_t BuildAndSendULRRCMessageTransfer(DuUeCb ueCb, uint8_t lcId, \ * RFAILED - failure * * ****************************************************************/ -uint8_t BuildTagConfig(struct TAG_Config *tagConfig) +uint8_t BuildTagConfig(DuUeCb *ueCb, struct TAG_Config *tagConfig) { struct TAG_Config__tag_ToAddModList *tagList; uint8_t idx, elementCnt; @@ -2954,7 +2698,11 @@ uint8_t BuildTagConfig(struct TAG_Config *tagConfig) return RFAILED; } - elementCnt = 1; //ODU_VALUE_ONE; + if(ueCb == NULLP) + elementCnt = ODU_VALUE_ONE; + else + elementCnt = ueCb->macUeCfg.macCellGrpCfg.tagCfg.addModListCount; + tagList = tagConfig->tag_ToAddModList; tagList->list.count = elementCnt; tagList->list.size = elementCnt * sizeof(struct TAG *); @@ -2973,14 +2721,25 @@ uint8_t BuildTagConfig(struct TAG_Config *tagConfig) DU_ALLOC(tagList->list.array[idx], sizeof(struct TAG)); if(!tagList->list.array[idx]) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig"); - return RFAILED; + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig"); + return RFAILED; } } - idx = 0; - tagList->list.array[idx]->tag_Id = TAG_ID; - tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR; + if(ueCb == NULLP) + { + idx = 0; + tagList->list.array[idx]->tag_Id = TAG_ID; + tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR; + } + else + { + 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; + } + } return ROK; } @@ -3001,7 +2760,7 @@ uint8_t BuildTagConfig(struct TAG_Config *tagConfig) * RFAILED - failure * * ****************************************************************/ -uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig) +uint8_t BuildPhrConfig(DuUeCb *ueCb, struct MAC_CellGroupConfig__phr_Config *phrConfig) { phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup; @@ -3013,13 +2772,26 @@ uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig) return RFAILED; } - phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR; - phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR; - phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE; - phrConfig->choice.setup->multiplePHR = false; - phrConfig->choice.setup->dummy = false; - phrConfig->choice.setup->phr_Type2OtherCell = false; - phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG; + if(ueCb == NULLP) + { + phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR; + phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR; + phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE; + phrConfig->choice.setup->multiplePHR = false; + phrConfig->choice.setup->dummy = false; + phrConfig->choice.setup->phr_Type2OtherCell = false; + phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG; + } + 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; + } return ROK; } @@ -3040,11 +2812,28 @@ uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig) * RFAILED - failure * * ****************************************************************/ -uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig) +uint8_t BuildBsrConfig(DuUeCb *ueCb, struct BSR_Config *bsrConfig) { - bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR; - bsrConfig->retxBSR_Timer = RETX_BSR_TMR; - bsrConfig->logicalChannelSR_DelayTimer = NULLP; + if(ueCb == NULLP) + { + bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR; + bsrConfig->retxBSR_Timer = RETX_BSR_TMR; + bsrConfig->logicalChannelSR_DelayTimer = NULLP; + } + else + { + bsrConfig->periodicBSR_Timer = convertBsrPeriodicTmrValueToEnum(ueCb->macUeCfg.macCellGrpCfg.bsrTmrCfg.periodicTimer); + bsrConfig->retxBSR_Timer = convertBsrRetxTmrValueToEnum(ueCb->macUeCfg.macCellGrpCfg.bsrTmrCfg.retxTimer); + + bsrConfig->logicalChannelSR_DelayTimer = NULLP; + DU_ALLOC(bsrConfig->logicalChannelSR_DelayTimer, sizeof(long)); + if(bsrConfig->logicalChannelSR_DelayTimer == NULLP) + { + DU_LOG("\nERROR --> DU APP: Memory allocation failed in BuildBsrConfig"); + return RFAILED; + } + *(bsrConfig->logicalChannelSR_DelayTimer) = convertLcSrDelayTmrValueToEnum(ueCb->macUeCfg.macCellGrpCfg.bsrTmrCfg.srDelayTimer); + } return ROK; } @@ -3065,7 +2854,7 @@ uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig) * RFAILED - failure * * ****************************************************************/ -uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig) +uint8_t BuildSchedulingReqConfig(DuUeCb *ueCb, struct SchedulingRequestConfig *schedulingRequestConfig) { struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList; uint8_t idx, elementCnt; @@ -3079,7 +2868,11 @@ uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingReque return RFAILED; } - elementCnt = 1; //ODU_VALUE_ONE; + if(ueCb == NULLP) + elementCnt = ODU_VALUE_ONE; + else + elementCnt = ueCb->macUeCfg.macCellGrpCfg.schReqCfg.addModListCount; + schReqList = schedulingRequestConfig->schedulingRequestToAddModList; schReqList->list.count = elementCnt; schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *); @@ -3092,29 +2885,50 @@ uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingReque return RFAILED; } - for(idx=0;idxlist.count; idx++) + for(idx=0; idxlist.count; idx++) { schReqList->list.array[idx] = NULLP; DU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod)); if(!schReqList->list.array[idx]) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig"); - return RFAILED; + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig"); + return RFAILED; } } - idx = 0; - schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID; + if(ueCb == NULLP) + { + idx = 0; + schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID; - schReqList->list.array[idx]->sr_ProhibitTimer = NULLP; - DU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long)); - if(!schReqList->list.array[idx]->sr_ProhibitTimer) + schReqList->list.array[idx]->sr_ProhibitTimer = NULLP; + DU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long)); + if(!schReqList->list.array[idx]->sr_ProhibitTimer) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig"); + return RFAILED; + } + *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR; + schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX; + } + else { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig"); - return RFAILED; + for(idx=0; idxlist.count; idx++) + { + schReqList->list.array[idx]->schedulingRequestId = ueCb->macUeCfg.macCellGrpCfg.schReqCfg.addModList[idx].schedReqId; + + schReqList->list.array[idx]->sr_ProhibitTimer = NULLP; + DU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long)); + if(!schReqList->list.array[idx]->sr_ProhibitTimer) + { + 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) = SR_PROHIBIT_TMR; - schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX; + schedulingRequestConfig->schedulingRequestToReleaseList = NULLP; return ROK; @@ -3122,209 +2936,183 @@ uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingReque /******************************************************************* * - * @brief Builds RLC Config + * @brief Builds RLC Configuration for AM mode * * @details * - * Function : BuildRlcConfig + * Function : BuildRlcConfigAm * - * Functionality: Builds RLC Config in BuildRlcBearerToAddModList + * Functionality: + * Builds AM mode RLC Config in BuildRlcBearerToAddModList * - * @params[in] RLC_Config *rlcConfig + * @params[in] AmBearerCfg *amCfg + * RLC_Config_t *rlcConfig * * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig) +uint8_t BuildRlcConfigAm(AmBearerCfg *amCfg, struct RLC_Config *rlcConfig) { - - rlcConfig->present = RLC_Config_PR_am; - rlcConfig->choice.am = NULLP; DU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am)); if(!rlcConfig->choice.am) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig"); + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfigAm"); return RFAILED; } - /* UL */ + /* Fill AM UL configuration */ rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP; DU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t)); if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig"); + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfigAm"); return RFAILED; } - *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN; - 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; - rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD; - /* DL */ + /* 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.t_PollRetransmit = T_POLL_RETRANSMIT; + rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU; + rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE; + rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD; + } + else + { + *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = covertAmSnLenFromIntEnumToRrcEnum(amCfg->dlAmCfg.snLenDl); + rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = covertPollRetxTmrValueToEnum(amCfg->dlAmCfg.pollRetxTmr); + rlcConfig->choice.am->ul_AM_RLC.pollPDU = covertPollPduValueToEnum(amCfg->dlAmCfg.pollPdu); + rlcConfig->choice.am->ul_AM_RLC.pollByte = covertPollByteValueToEnum(amCfg->dlAmCfg.pollByte); + rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = covertMaxRetxValueToEnum(amCfg->dlAmCfg.maxRetxTh); + } + + /* Fill AM DL configuraion */ rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP; DU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t)); if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig"); + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfigAm"); return RFAILED; } - *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN; - rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY; - rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT; + /* 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.t_Reassembly = T_REASSEMBLY; + rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT; + } + else /* Fill AM configuration from DU database */ + { + *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = covertAmSnLenFromIntEnumToRrcEnum(amCfg->ulAmCfg.snLenUl); + rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = convertReasmblTmrValueToEnum(amCfg->ulAmCfg.reAssemTmr); + rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = convertProhibitTmrValueToEnum(amCfg->ulAmCfg.statProhTmr); + } return ROK; } /******************************************************************* * - * @brief Builds MAC LC Config + * @brief Builds RLC Config for UM Bidirection * * @details * - * Function : BuildMacLCConfig + * Function : BuildRlcConfig UmBiDir * - * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList + * Functionality: + * Builds RLC Config for UM Bidirection in BuildRlcBearerToAddModList * - * @params[in] struct LogicalChannelConfig macLcConfig + * @params[in] UmBiDirBearerCfg *umBiDirCfg + * RLC_Config_t *rlcConfig * * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig) +uint8_t BuildRlcConfigUmBiDir(UmBiDirBearerCfg *umBiDirCfg, struct RLC_Config *rlcConfig) { + rlcConfig->choice.um_Bi_Directional = NULLP; + DU_ALLOC(rlcConfig->choice.um_Bi_Directional, sizeof(struct RLC_Config__um_Bi_Directional)); + if(rlcConfig->choice.um_Bi_Directional == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfigUmBiDir"); + return RFAILED; + } - macLcConfig->ul_SpecificParameters = NULLP; - DU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters)); - if(!macLcConfig->ul_SpecificParameters) + /* Fill UM Bidirectional UL configuration */ + rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength = NULLP; + DU_ALLOC(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t)); + if(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength == NULLP) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig"); + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfigUmBiDir"); return RFAILED; } - macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY; - macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE; - macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION; - macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP; - macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP; - macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP; - macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP; + if(umBiDirCfg != NULLP) + { + *(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength) = covertUmSnLenFromIntEnumToRrcEnum(umBiDirCfg->dlUmCfg.snLenDlUm); + } - macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP; - DU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long)); - if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup) + /* Fill UM Bidirectional DL configuration */ + rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength = NULLP; + DU_ALLOC(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t)); + if(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength == NULLP) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig"); + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfigUmBiDir"); return RFAILED; } - *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP; - macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP; - DU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t)); - if(!macLcConfig->ul_SpecificParameters->schedulingRequestID) + if(umBiDirCfg != NULLP) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig"); - return RFAILED; + *(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength) = covertUmSnLenFromIntEnumToRrcEnum(umBiDirCfg->ulUmCfg.snLenUlUm); + rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly = convertReasmblTmrValueToEnum(umBiDirCfg->ulUmCfg.reAssemTmr); } - *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID; - - macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false; - macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false; - macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP; return ROK; } /******************************************************************* * - * @brief Builds RLC Bearer to Add/Mod list + * @brief Builds RLC Config for UM Uni directional UL * * @details * - * Function :BuildRlcBearerToAddModList + * Function : BuildRlcConfigUmUniDirUl * - * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer + * Functionality: + * Builds RLC Config for UM Unidirection UL in BuildRlcBearerToAddModList * - * @params[in] rlc_BearerToAddModList + * @params[in] UmUniDirDlBearerCfg *umUniDirDlCfg + * RLC_Config_t *rlcConfig * * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList) +uint8_t BuildRlcConfigUmUniDirUl(UmUniDirDlBearerCfg *umUniDirDlCfg, RLC_Config_t *rlcConfig) { - uint8_t idx, elementCnt; - - elementCnt = 1; - rlcBearerList->list.count = elementCnt; - rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *); - - rlcBearerList->list.array = NULLP; - DU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size); - if(!rlcBearerList->list.array) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList"); - return RFAILED; - } - - for(idx=0; idxlist.count; idx++) - { - rlcBearerList->list.array[idx] = NULLP; - DU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig)); - if(!rlcBearerList->list.array[idx]) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList"); - return RFAILED; - } - } - - idx = 0; - rlcBearerList->list.array[idx]->logicalChannelIdentity = SRB1_LCID; - - DU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, \ - sizeof(struct RLC_BearerConfig__servedRadioBearer)); - if(!rlcBearerList->list.array[idx]->servedRadioBearer) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList"); - return RFAILED; - } - - rlcBearerList->list.array[idx]->servedRadioBearer->present = \ - RLC_BearerConfig__servedRadioBearer_PR_srb_Identity; - rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = \ - SRB1_LCID; - - rlcBearerList->list.array[idx]->reestablishRLC = NULLP; - rlcBearerList->list.array[idx]->rlc_Config = NULLP; - DU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config)); - if(!rlcBearerList->list.array[idx]->rlc_Config) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList"); - return RFAILED; - } - - if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK) + rlcConfig->choice.um_Uni_Directional_UL = NULLP; + DU_ALLOC(rlcConfig->choice.um_Uni_Directional_UL , sizeof(struct RLC_Config__um_Uni_Directional_UL)); + if(rlcConfig->choice.um_Uni_Directional_UL == NULLP) { - DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed"); + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfigUmUniDirUl"); return RFAILED; } - rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP; - DU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, \ - sizeof(struct LogicalChannelConfig)); - if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) + rlcConfig->choice.um_Uni_Directional_UL->ul_UM_RLC.sn_FieldLength = NULLP; + DU_ALLOC(rlcConfig->choice.um_Uni_Directional_UL->ul_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t)); + if(rlcConfig->choice.um_Uni_Directional_UL->ul_UM_RLC.sn_FieldLength == NULLP) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList"); + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfigUmUniDirUl"); return RFAILED; } - if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK) + if(umUniDirDlCfg != NULLP) { - DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed"); - return RFAILED; + *(rlcConfig->choice.um_Uni_Directional_UL->ul_UM_RLC.sn_FieldLength) = covertUmSnLenFromIntEnumToRrcEnum(umUniDirDlCfg->dlUmCfg.snLenDlUm); } return ROK; @@ -3332,2314 +3120,4849 @@ uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddMod /******************************************************************* * - * @brief Build Control resource set to add/modify list + * @brief Builds RLC Config for UM Uni directional DL * * @details * - * Function : BuildControlRSetToAddModList + * Function : BuildRlcConfigUmUniDirDl * - * Functionality: Build Control resource set to add/modify list + * Functionality: + * Builds RLC Config for UM Unidirection DL in BuildRlcBearerToAddModList * - * @params[in] - * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList + * @params[in] UmUniDirUlBearerCfg *umUniDirUlCfg + * RLC_Config_t *rlcConfig * * @return ROK - success * RFAILED - failure * * ****************************************************************/ - uint8_t BuildControlRSetToAddModList -( - struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList - ) +uint8_t BuildRlcConfigUmUniDirDl(UmUniDirUlBearerCfg *umUniDirUlCfg, RLC_Config_t *rlcConfig) { - uint8_t idx; - uint8_t elementCnt; - uint8_t numBytes, bitsUnused; - struct ControlResourceSet *controlRSet; - uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0}; - uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb; - - - elementCnt = 1; - controlRSetList->list.count = elementCnt; - controlRSetList->list.size = \ - elementCnt * sizeof(struct ControlResourceSet *); - - controlRSetList->list.array = NULLP; - DU_ALLOC(controlRSetList->list.array, controlRSetList->list.size); - if(!controlRSetList->list.array) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList"); - return RFAILED; - } - - for(idx = 0; idx < elementCnt; idx++) - { - controlRSetList->list.array[idx] = NULLP; - DU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet)); - if(!controlRSetList->list.array[idx]) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList"); - return RFAILED; - } - } - - idx=0; - controlRSet = controlRSetList->list.array[idx]; - - controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID; - - /* size 6 bytes - * 3 LSBs unsued - * Bit string stored ff0000000000 - */ - numBytes = 6; - bitsUnused = 3; - controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t); - - controlRSet->frequencyDomainResources.buf = NULLP; - DU_ALLOC(controlRSet->frequencyDomainResources.buf, \ - controlRSet->frequencyDomainResources.size); - if(!controlRSet->frequencyDomainResources.buf) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList"); - return RFAILED; - } - - memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE); - coreset0EndPrb = CORESET0_END_PRB; - coreset1StartPrb = coreset0EndPrb + 6; - coreset1NumPrb = CORESET1_NUM_PRB; - /* calculate the PRBs */ - freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource); - memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE); - controlRSet->frequencyDomainResources.bits_unused = bitsUnused; - - controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION; - controlRSet->cce_REG_MappingType.present = \ - ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved; - - controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY; - controlRSet->tci_StatesPDCCH_ToAddList = NULLP; - controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP; - controlRSet->tci_PresentInDCI = NULLP; -#if 0 - uint8_t tciStateIdx; - - DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \ - sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList)); - if(!controlRset->tci_StatesPDCCH_ToAddList) + rlcConfig->choice.um_Uni_Directional_DL = NULLP; + DU_ALLOC(rlcConfig->choice.um_Uni_Directional_DL , sizeof(struct RLC_Config__um_Uni_Directional_DL)); + if(rlcConfig->choice.um_Uni_Directional_DL == NULLP) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList"); + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfigUmUniDirDl"); return RFAILED; } - elementCnt = 1; - controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt; - controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *); - DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \ - controlRset->tci_StatesPDCCH_ToAddList->list.size) - if(!controlRset->tci_StatesPDCCH_ToAddList->list.array) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList"); - return RFAILED; - } - - for(tciStateIdx = 0; tciStateIdx tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t)); - if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList"); - return RFAILED; - } - } - - tciStateIdx = 0; - /* TODO */ - *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]); - - DU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long)); - if(!controlRset->tci_PresentInDCI) + rlcConfig->choice.um_Uni_Directional_DL->dl_UM_RLC.sn_FieldLength = NULLP; + DU_ALLOC(rlcConfig->choice.um_Uni_Directional_DL->dl_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t)); + if(rlcConfig->choice.um_Uni_Directional_DL->dl_UM_RLC.sn_FieldLength == NULLP) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList"); + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfigUmUniDirDl"); return RFAILED; } - /* TODO */ - *(controlRset->tci_PresentInDCI); -#endif - controlRSet->pdcch_DMRS_ScramblingID = NULLP; - DU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long)); - if(!controlRSet->pdcch_DMRS_ScramblingID) + if(umUniDirUlCfg != NULLP) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList"); - return RFAILED; + *(rlcConfig->choice.um_Uni_Directional_DL->dl_UM_RLC.sn_FieldLength) = covertUmSnLenFromIntEnumToRrcEnum(umUniDirUlCfg->ulUmCfg.snLenUlUm); + rlcConfig->choice.um_Uni_Directional_DL->dl_UM_RLC.t_Reassembly = convertReasmblTmrValueToEnum(umUniDirUlCfg->ulUmCfg.reAssemTmr); } - *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID; return ROK; -} /* End BuildControlRSetToAddModList */ +} /******************************************************************* * - * @brief Build search space to add/modify list + * @brief Builds RLC Config * * @details * - * Function : BuildSearchSpcToAddModList + * Function : BuildRlcConfig * - * Functionality: Build search space to add/modify list + * Functionality: Builds RLC Config in BuildRlcBearerToAddModList + * + * @params[in] RLC_Config_t *rlcConfig * - * @params[in] * @return ROK - success * RFAILED - failure * * ****************************************************************/ - uint8_t BuildSearchSpcToAddModList -( - struct PDCCH_Config__searchSpacesToAddModList *searchSpcList - ) +uint8_t BuildRlcConfig(RlcBearerCfg *rbCfg, struct RLC_Config *rlcConfig) { - uint8_t idx; - uint8_t numBytes; - uint8_t byteIdx; - uint8_t bitsUnused; - uint8_t elementCnt; - struct SearchSpace *searchSpc; - - elementCnt = 1; - searchSpcList->list.count = elementCnt; - searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *); - - searchSpcList->list.array = NULLP; - DU_ALLOC(searchSpcList->list.array, searchSpcList->list.size); - if(!searchSpcList->list.array) + + /* Fill default values if rbCfg is NULL */ + if(rbCfg == NULLP) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList"); - return RFAILED; + rlcConfig->present = RLC_Config_PR_am; + BuildRlcConfigAm(NULLP, rlcConfig); } - - for(idx = 0; idx < elementCnt; idx++) + /* If RbCfg is present, fill RLC configurations from DU Database */ + else { - searchSpcList->list.array[idx] = NULLP; - DU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace)); - if(!searchSpcList->list.array[idx]) + rlcConfig->present = covertRlcModeFromIntEnumToRrcEnum(rbCfg->rlcMode); + switch(rlcConfig->present) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList"); - return RFAILED; + case RLC_Config_PR_am: + BuildRlcConfigAm(rbCfg->u.amCfg, rlcConfig); + break; + case RLC_Config_PR_um_Bi_Directional: + BuildRlcConfigUmBiDir(rbCfg->u.umBiDirCfg, rlcConfig); + break; + case RLC_Config_PR_um_Uni_Directional_UL: + BuildRlcConfigUmUniDirUl(rbCfg->u.umUniDirDlCfg, rlcConfig); + break; + case RLC_Config_PR_um_Uni_Directional_DL: + BuildRlcConfigUmUniDirDl(rbCfg->u.umUniDirUlCfg, rlcConfig); + break; + case RLC_Config_PR_NOTHING: + default: + break; } } - idx = 0; - searchSpc = searchSpcList->list.array[idx]; - - searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID; - - searchSpc->controlResourceSetId = NULLP; - DU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t)); - if(!searchSpc->controlResourceSetId) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList"); - return RFAILED; - } - *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID; + return ROK; +} - searchSpc->monitoringSlotPeriodicityAndOffset = NULLP; - DU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \ - sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset)); - if(!searchSpc->monitoringSlotPeriodicityAndOffset) +/******************************************************************* + * + * @brief Builds MAC LC Config + * + * @details + * + * Function : BuildMacLCConfig + * + * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList + * + * @params[in] struct LogicalChannelConfig macLcConfig + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t BuildMacLCConfig(LcCfg *lcCfgDb, struct LogicalChannelConfig *macLcConfig) +{ + macLcConfig->ul_SpecificParameters = NULLP; + DU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters)); + if(!macLcConfig->ul_SpecificParameters) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList"); + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig"); return RFAILED; } - searchSpc->monitoringSlotPeriodicityAndOffset->present = \ - SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1; - searchSpc->duration = NULLP; - searchSpc->monitoringSymbolsWithinSlot = NULLP; - DU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t)); - if(!searchSpc->monitoringSymbolsWithinSlot) + if(lcCfgDb == NULLP) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList"); - return RFAILED; + macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY; + macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE; + macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION; } - - /* Values taken from reference logs : - * size 2 bytes - * 2 LSBs unsued - * Bit string stores 8000 - */ - numBytes = 2; - bitsUnused = 2; - - searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t); - searchSpc->monitoringSymbolsWithinSlot->buf = NULLP; - DU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \ - searchSpc->monitoringSymbolsWithinSlot->size); - if(!searchSpc->monitoringSymbolsWithinSlot->buf) + else { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList"); - return RFAILED; + macLcConfig->ul_SpecificParameters->priority = lcCfgDb->ulLcCfg.priority; + macLcConfig->ul_SpecificParameters->prioritisedBitRate = lcCfgDb->ulLcCfg.pbr; + macLcConfig->ul_SpecificParameters->bucketSizeDuration = lcCfgDb->ulLcCfg.bsd; } - byteIdx = 0; - searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \ - PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */; - searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0; - searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused; + macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP; + macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP; + macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP; + macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP; - searchSpc->nrofCandidates = NULLP; - DU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates)); - if(!searchSpc->nrofCandidates) + macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP; + DU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long)); + if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList"); + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig"); return RFAILED; } - searchSpc->nrofCandidates->aggregationLevel1 = \ - PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE; - searchSpc->nrofCandidates->aggregationLevel2 = \ - PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE; - searchSpc->nrofCandidates->aggregationLevel4 = \ - PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE; - searchSpc->nrofCandidates->aggregationLevel8 = \ - PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE; - searchSpc->nrofCandidates->aggregationLevel16 = \ - PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE; + if(lcCfgDb == NULLP) + *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP; + else + *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = lcCfgDb->ulLcCfg.lcGroup; - searchSpc->searchSpaceType = NULLP; - DU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType)); - if(!searchSpc->searchSpaceType) + macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP; + DU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t)); + if(!macLcConfig->ul_SpecificParameters->schedulingRequestID) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList"); + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig"); return RFAILED; } - searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific; + if(lcCfgDb == NULLP) + *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID; + else + *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = lcCfgDb->ulLcCfg.schReqId; - searchSpc->searchSpaceType->choice.ue_Specific = NULLP; - DU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \ - sizeof(struct SearchSpace__searchSpaceType__ue_Specific)); - if(!searchSpc->searchSpaceType->choice.ue_Specific) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList"); - return RFAILED; - } - searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \ - PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT; + macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false; + macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false; + macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP; return ROK; -}/* End BuildSearchSpcToAddModList */ +} /******************************************************************* * - * @brief Builds BWP DL dedicated PDCCH config + * @brief Builds RLC Bearer to Add/Mod list * * @details * - * Function : BuildBWPDlDedPdcchCfg + * Function :BuildRlcBearerToAddModList * - * Functionality: Builds BWP DL dedicated PDCCH config + * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer * - * @params[in] struct PDCCH_Config *pdcchCfg + * @params[in] rlc_BearerToAddModList * * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg) +uint8_t BuildRlcBearerToAddModList(DuUeCb *ueCb, struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList) { - pdcchCfg->controlResourceSetToAddModList = NULLP; - DU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \ - sizeof(struct PDCCH_Config__controlResourceSetToAddModList)); - if(!pdcchCfg->controlResourceSetToAddModList) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg"); - return RFAILED; - } + uint8_t idx = 0, lcIdx=0, macLcIdx = 0, elementCnt = 0; - if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK) + if(ueCb == NULLP) + elementCnt = 1; + else if(ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY) + elementCnt = ueCb->rlcUeCfg.numLcs; + else { - return RFAILED; + for(lcIdx = 0; lcIdxrlcUeCfg.numLcs; lcIdx++) + { + if(ueCb->rlcUeCfg.rlcLcCfg[lcIdx].isLcAddModRspSent == false) + elementCnt++; + } } + rlcBearerList->list.count = elementCnt; + rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *); - pdcchCfg->controlResourceSetToReleaseList = NULLP; - - pdcchCfg->searchSpacesToAddModList = NULLP; - DU_ALLOC(pdcchCfg->searchSpacesToAddModList, \ - sizeof(struct PDCCH_Config__searchSpacesToAddModList)); - if(!pdcchCfg->searchSpacesToAddModList) + rlcBearerList->list.array = NULLP; + DU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size); + if(!rlcBearerList->list.array) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg"); + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList"); return RFAILED; } - if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK) + for(idx=0; idxlist.count; idx++) { - return RFAILED; + rlcBearerList->list.array[idx] = NULLP; + DU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig)); + if(!rlcBearerList->list.array[idx]) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList"); + return RFAILED; + } } - pdcchCfg->searchSpacesToReleaseList = NULLP; - pdcchCfg->downlinkPreemption = NULLP; - pdcchCfg->tpc_PUSCH = NULLP; - pdcchCfg->tpc_PUCCH = NULLP; - pdcchCfg->tpc_SRS = NULLP; + if(ueCb == NULLP) + { + idx=0; + rlcBearerList->list.array[idx]->logicalChannelIdentity = SRB1_LCID; + DU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer)); + if(!rlcBearerList->list.array[idx]->servedRadioBearer) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList"); + return RFAILED; + } + rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity; + rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = SRB1_LCID; + rlcBearerList->list.array[idx]->reestablishRLC = NULLP; - return ROK; -} + /* Fill RLC related Configurations for this Radio Bearer */ + rlcBearerList->list.array[idx]->rlc_Config = NULLP; + DU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config)); + if(!rlcBearerList->list.array[idx]->rlc_Config) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList"); + return RFAILED; + } + if(BuildRlcConfig(NULLP, rlcBearerList->list.array[idx]->rlc_Config) != ROK) + { + DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed"); + return RFAILED; + } -/******************************************************************* - * - * @brief Builds DMRS DL PDSCH Mapping type A - * - * @details - * - * Function : BuildDMRSDLPdschMapTypeA - * - * Functionality: Builds DMRS DL PDSCH Mapping type A - * - * @params[in] - * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg - * @return ROK - success - * RFAILED - failure - * - * ****************************************************************/ - uint8_t BuildDMRSDLPdschMapTypeA -( - struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg - ) -{ - dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup; - dmrsDlCfg->choice.setup = NULLP; - DU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig)); - if(!dmrsDlCfg->choice.setup) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg"); - return RFAILED; + /* Fill MAC related configurations for this Radio Bearer */ + rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP; + DU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig)); + if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList"); + return RFAILED; + } + if(BuildMacLCConfig(NULLP, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK) + { + DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed"); + return RFAILED; + } } - - dmrsDlCfg->choice.setup->dmrs_Type = NULLP; - dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP; - DU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long)); - if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) + else { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA"); - return RFAILED; - } - *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS; + idx=0; + for(lcIdx=0; lcIdxrlcUeCfg.numLcs; lcIdx++) + { + if((ueCb->f1UeDb->actionType != UE_CTXT_CFG_QUERY) && (ueCb->rlcUeCfg.rlcLcCfg[lcIdx].isLcAddModRspSent == true)) + continue; - dmrsDlCfg->choice.setup->maxLength = NULLP; - dmrsDlCfg->choice.setup->scramblingID0 = NULLP; - dmrsDlCfg->choice.setup->scramblingID1 = NULLP; - dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP; + /* Fill Logical channel identity */ + rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->rlcUeCfg.rlcLcCfg[lcIdx].lcId; - return ROK; -} + /* Fill Radio Bearer Id and type (DRB/SRB) for this logical channel */ + DU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer)); + if(!rlcBearerList->list.array[idx]->servedRadioBearer) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList"); + return RFAILED; + } + rlcBearerList->list.array[idx]->servedRadioBearer->present = \ + covertRbTypeFromIntEnumToRrcEnum(ueCb->rlcUeCfg.rlcLcCfg[lcIdx].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; + break; + case RLC_BearerConfig__servedRadioBearer_PR_drb_Identity: + rlcBearerList->list.array[idx]->servedRadioBearer->choice.drb_Identity = ueCb->rlcUeCfg.rlcLcCfg[lcIdx].rbId; + break; + case RLC_BearerConfig__servedRadioBearer_PR_NOTHING: + default: + break; + } + ueCb->rlcUeCfg.rlcLcCfg[lcIdx].isLcAddModRspSent = true; -/******************************************************************* - * - * @brief Builds TCI states to add/modify list - * - * @details - * - * Function : BuildTCIStatesToAddModList - * - * Functionality:Builds TCI states to add/modify list - * - * @params[in] - * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList - * - * @return ROK - success - * RFAILED - failure - * - * ****************************************************************/ -uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList) -{ + rlcBearerList->list.array[idx]->reestablishRLC = NULLP; + + /* Fill RLC related Configurations for this Radio Bearer */ + rlcBearerList->list.array[idx]->rlc_Config = NULLP; + DU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config)); + if(!rlcBearerList->list.array[idx]->rlc_Config) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList"); + return RFAILED; + } + if(BuildRlcConfig(&ueCb->rlcUeCfg.rlcLcCfg[lcIdx], rlcBearerList->list.array[idx]->rlc_Config) != ROK) + { + DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed"); + return RFAILED; + } + + /* Fill MAC related configurations for this Radio Bearer */ + rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP; + DU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig)); + if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList"); + return RFAILED; + } + for(macLcIdx = 0; macLcIdx < ueCb->macUeCfg.numLcs; macLcIdx++) + { + if(ueCb->macUeCfg.lcCfgList[macLcIdx].lcId == ueCb->rlcUeCfg.rlcLcCfg[lcIdx].lcId) + { + if(BuildMacLCConfig(&ueCb->macUeCfg.lcCfgList[macLcIdx], rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK) + { + DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed"); + return RFAILED; + } + break; + } + } + + idx++; + } + } return ROK; } /******************************************************************* * - * @brief Builds PDSCH time domain allocation list + * @brief Build Control resource set to add/modify list * * @details * - * Function : BuildPdschTimeDomAllocList + * Function : BuildControlRSetToAddModList * - * Functionality: Builds PDSCH time domain allocation list + * Functionality: Build Control resource set to add/modify list * * @params[in] - * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList + * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList * * @return ROK - success * RFAILED - failure * * ****************************************************************/ - uint8_t BuildPdschTimeDomAllocList -( - struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList - ) +uint8_t BuildControlRSetToAddModList(PdcchConfig *pdcchCfg, struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList) { uint8_t idx; uint8_t elementCnt; - struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc; - - timeDomAllocList->present = \ - PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup; + uint8_t numBytes, bitsUnused; + struct ControlResourceSet *controlRSet; + uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0}; + uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb; - timeDomAllocList->choice.setup = NULLP; - DU_ALLOC(timeDomAllocList->choice.setup, \ - sizeof(struct PDSCH_TimeDomainResourceAllocationList)); - if(!timeDomAllocList->choice.setup) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList"); - return RFAILED; - } + if(pdcchCfg == NULLP) + elementCnt = 1; + else + elementCnt = pdcchCfg->numCRsetToAddMod; - elementCnt = 2; - timeDomAllocList->choice.setup->list.count = elementCnt; - timeDomAllocList->choice.setup->list.size = \ - elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *); + controlRSetList->list.count = elementCnt; + controlRSetList->list.size = elementCnt * sizeof(struct ControlResourceSet *); - timeDomAllocList->choice.setup->list.array = NULLP; - DU_ALLOC(timeDomAllocList->choice.setup->list.array, \ - timeDomAllocList->choice.setup->list.size); - if(!timeDomAllocList->choice.setup->list.array) + controlRSetList->list.array = NULLP; + DU_ALLOC(controlRSetList->list.array, controlRSetList->list.size); + if(!controlRSetList->list.array) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList"); return RFAILED; } for(idx = 0; idx < elementCnt; idx++) { - timeDomAllocList->choice.setup->list.array[idx] = NULLP; - DU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \ - sizeof(struct PDSCH_TimeDomainResourceAllocation)); - if(!timeDomAllocList->choice.setup->list.array[idx]) + controlRSetList->list.array[idx] = NULLP; + DU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet)); + if(!controlRSetList->list.array[idx]) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList"); - return RFAILED; + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList"); + return RFAILED; } } - idx = 0; - timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx]; - DU_ALLOC(timeDomAlloc->k0, sizeof(long)); - if(!timeDomAlloc->k0) + for(idx = 0; idx < elementCnt; idx++) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList"); - return RFAILED; - } - *(timeDomAlloc->k0) = 0; - timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A; - timeDomAlloc->startSymbolAndLength = \ - calcSliv(PDSCH_START_SYMBOL, PDSCH_LENGTH_SYMBOL); + controlRSet = controlRSetList->list.array[idx]; - 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; - } - *(timeDomAlloc->k0) = 1; - timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A; - timeDomAlloc->startSymbolAndLength = calcSliv(PDSCH_START_SYMBOL, PDSCH_LENGTH_SYMBOL); + if(pdcchCfg == NULLP) + controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID; + else + controlRSet->controlResourceSetId = pdcchCfg->cRSetToAddModList[idx].cRSetId; + + /* size 6 bytes + * 3 LSBs unsued + * Bit string stored ff0000000000 + */ + numBytes = 6; + bitsUnused = 3; + controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t); + + controlRSet->frequencyDomainResources.buf = NULLP; + DU_ALLOC(controlRSet->frequencyDomainResources.buf, controlRSet->frequencyDomainResources.size); + if(!controlRSet->frequencyDomainResources.buf) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList"); + return RFAILED; + } + + memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE); + + if(pdcchCfg == NULLP) + { + coreset0EndPrb = CORESET0_END_PRB; + coreset1StartPrb = coreset0EndPrb + 6; + coreset1NumPrb = CORESET1_NUM_PRB; + /* calculate the PRBs */ + fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource); + memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE); + controlRSet->frequencyDomainResources.bits_unused = bitsUnused; + + controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION; + controlRSet->cce_REG_MappingType.present = ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved; + controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY; + } + else + { + memcpy(controlRSet->frequencyDomainResources.buf, pdcchCfg->cRSetToAddModList[idx].freqDomainRsrc, FREQ_DOM_RSRC_SIZE); + controlRSet->frequencyDomainResources.bits_unused = bitsUnused; + controlRSet->duration = pdcchCfg->cRSetToAddModList[idx].duration; + controlRSet->cce_REG_MappingType.present = pdcchCfg->cRSetToAddModList[idx].cceRegMappingType; + controlRSet->precoderGranularity = pdcchCfg->cRSetToAddModList[idx].precoderGranularity; + } + controlRSet->tci_StatesPDCCH_ToAddList = NULLP; + controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP; + controlRSet->tci_PresentInDCI = NULLP; + +#if 0 + uint8_t tciStateIdx; + + DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \ + sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList)); + if(!controlRset->tci_StatesPDCCH_ToAddList) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList"); + return RFAILED; + } + + elementCnt = 1; + controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt; + controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *); + DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \ + controlRset->tci_StatesPDCCH_ToAddList->list.size) + if(!controlRset->tci_StatesPDCCH_ToAddList->list.array) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList"); + return RFAILED; + } + + for(tciStateIdx = 0; tciStateIdx tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t)); + if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList"); + return RFAILED; + } + } + + tciStateIdx = 0; + /* TODO */ + *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]); + + DU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long)); + if(!controlRset->tci_PresentInDCI) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList"); + return RFAILED; + } + /* TODO */ + *(controlRset->tci_PresentInDCI); +#endif + controlRSet->pdcch_DMRS_ScramblingID = NULLP; + DU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long)); + if(!controlRSet->pdcch_DMRS_ScramblingID) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList"); + return RFAILED; + } + if(pdcchCfg == NULLP) + *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID; + else + *(controlRSet->pdcch_DMRS_ScramblingID) = pdcchCfg->cRSetToAddModList[idx].dmrsScramblingId; + } return ROK; -} +} /* End BuildControlRSetToAddModList */ /******************************************************************* * - * @brief Builds PDSCH PRB Bundling type + * @brief Build search space to add/modify list * * @details * - * Function : BuildPdschPrbBundlingType + * Function : BuildSearchSpcToAddModList * - * Functionality: Builds PDSCH PRB Bundling type + * Functionality: Build search space to add/modify list * * @params[in] - * struct PDSCH_Config__prb_BundlingType *prbBndlType - * * @return ROK - success * RFAILED - failure * * ****************************************************************/ - uint8_t BuildPdschPrbBundlingType -( - struct PDSCH_Config__prb_BundlingType *prbBndlType - ) +uint8_t BuildSearchSpcToAddModList(PdcchConfig *pdcchCfg, struct PDCCH_Config__searchSpacesToAddModList *searchSpcList) { - prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling; + uint8_t idx; + uint8_t numBytes; + uint8_t byteIdx; + uint8_t bitsUnused; + uint8_t elementCnt; + struct SearchSpace *searchSpc; - prbBndlType->choice.staticBundling = NULLP; - DU_ALLOC(prbBndlType->choice.staticBundling, \ - sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling)); - if(!prbBndlType->choice.staticBundling) + if(pdcchCfg == NULLP) + elementCnt = 1; + else + elementCnt = pdcchCfg->numSearchSpcToAddMod; + + searchSpcList->list.count = elementCnt; + searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *); + + searchSpcList->list.array = NULLP; + DU_ALLOC(searchSpcList->list.array, searchSpcList->list.size); + if(!searchSpcList->list.array) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList"); return RFAILED; } - prbBndlType->choice.staticBundling->bundleSize = NULLP; - return ROK; -} + for(idx = 0; idx < elementCnt; idx++) + { + searchSpcList->list.array[idx] = NULLP; + DU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace)); + if(!searchSpcList->list.array[idx]) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList"); + return RFAILED; + } + } -/******************************************************************* - * - * @brief Builds BWP DL dedicated PDSCH config + for(idx = 0; idx < elementCnt; idx++) + { + searchSpc = searchSpcList->list.array[idx]; + + if(pdcchCfg == NULLP) + searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID; + else + searchSpc->searchSpaceId = pdcchCfg->searchSpcToAddModList[idx].searchSpaceId; + + searchSpc->controlResourceSetId = NULLP; + DU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t)); + if(!searchSpc->controlResourceSetId) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList"); + return RFAILED; + } + if(pdcchCfg == NULLP) + *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID; + else + *(searchSpc->controlResourceSetId) = pdcchCfg->searchSpcToAddModList[idx].cRSetId; + + searchSpc->monitoringSlotPeriodicityAndOffset = NULLP; + DU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset)); + if(!searchSpc->monitoringSlotPeriodicityAndOffset) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList"); + return RFAILED; + } + if(pdcchCfg == NULLP) + searchSpc->monitoringSlotPeriodicityAndOffset->present = SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1; + else + searchSpc->monitoringSlotPeriodicityAndOffset->present = pdcchCfg->searchSpcToAddModList[idx].mSlotPeriodicityAndOffset; + + searchSpc->duration = NULLP; + searchSpc->monitoringSymbolsWithinSlot = NULLP; + DU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t)); + if(!searchSpc->monitoringSymbolsWithinSlot) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList"); + return RFAILED; + } + + /* Values taken from reference logs : + * size 2 bytes + * 2 LSBs unsued + * Bit string stores 8000 + */ + numBytes = 2; + bitsUnused = 2; + searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t); + searchSpc->monitoringSymbolsWithinSlot->buf = NULLP; + DU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, searchSpc->monitoringSymbolsWithinSlot->size); + if(!searchSpc->monitoringSymbolsWithinSlot->buf) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList"); + return RFAILED; + } + if(pdcchCfg == NULLP) + { + byteIdx = 0; + searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */; + searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0; + } + else + memcpy(searchSpc->monitoringSymbolsWithinSlot->buf, pdcchCfg->searchSpcToAddModList[idx].mSymbolsWithinSlot, numBytes); + searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused; + + searchSpc->nrofCandidates = NULLP; + DU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates)); + if(!searchSpc->nrofCandidates) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList"); + return RFAILED; + } + + if(pdcchCfg == NULLP) + { + searchSpc->nrofCandidates->aggregationLevel1 = PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE; + searchSpc->nrofCandidates->aggregationLevel2 = PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE; + searchSpc->nrofCandidates->aggregationLevel4 = PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE; + searchSpc->nrofCandidates->aggregationLevel8 = PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE; + searchSpc->nrofCandidates->aggregationLevel16 = PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE; + } + else + { + searchSpc->nrofCandidates->aggregationLevel1 = pdcchCfg->searchSpcToAddModList[idx].numCandidatesAggLevel1; + searchSpc->nrofCandidates->aggregationLevel2 = pdcchCfg->searchSpcToAddModList[idx].numCandidatesAggLevel2; + searchSpc->nrofCandidates->aggregationLevel4 = pdcchCfg->searchSpcToAddModList[idx].numCandidatesAggLevel4; + searchSpc->nrofCandidates->aggregationLevel8 = pdcchCfg->searchSpcToAddModList[idx].numCandidatesAggLevel8; + searchSpc->nrofCandidates->aggregationLevel16 = pdcchCfg->searchSpcToAddModList[idx].numCandidatesAggLevel16; + } + + searchSpc->searchSpaceType = NULLP; + DU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType)); + if(!searchSpc->searchSpaceType) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList"); + return RFAILED; + } + if(pdcchCfg == NULLP) + searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific; + else + searchSpc->searchSpaceType->present = pdcchCfg->searchSpcToAddModList[idx].searchSpaceType; + + searchSpc->searchSpaceType->choice.ue_Specific = NULLP; + DU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, sizeof(struct SearchSpace__searchSpaceType__ue_Specific)); + if(!searchSpc->searchSpaceType->choice.ue_Specific) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList"); + return RFAILED; + } + if(pdcchCfg == NULLP) + searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT; + else + searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = pdcchCfg->searchSpcToAddModList[idx].ueSpecificDciFormat; + } + return ROK; +}/* End BuildSearchSpcToAddModList */ + +/******************************************************************* + * + * @brief Builds BWP DL dedicated PDCCH config * * @details * - * Function : BuildBWPDlDedPdschCfg + * Function : BuildBWPDlDedPdcchCfg * - * Functionality: Builds BWP DL dedicated PDSCH config + * Functionality: Builds BWP DL dedicated PDCCH config * - * @params[in] struct PDSCH_Config *pdschCfg + * @params[in] struct PDCCH_Config *pdcchCfg * * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg) +uint8_t BuildBWPDlDedPdcchCfg(PdcchConfig *pdcchCfgDb, struct PDCCH_Config *pdcchCfg) { - pdschCfg->dataScramblingIdentityPDSCH = NULLP; - - pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP; - DU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \ - sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA)); - if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg"); - return RFAILED; - } - - if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK) - { - return RFAILED; - } - - pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP; - pdschCfg->tci_StatesToAddModList = NULLP; - pdschCfg->tci_StatesToReleaseList = NULLP; - pdschCfg->vrb_ToPRB_Interleaver = NULLP; -#if 0 - DU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList)); - if(!pdschCfg->tci_StatesToAddModList) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg"); - return RFAILED; - } - if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK) - { - return RFAILED; - } -#endif - - pdschCfg->resourceAllocation = RES_ALLOC_TYPE; - - pdschCfg->pdsch_TimeDomainAllocationList = NULLP; - DU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \ - sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList)); - if(!pdschCfg->pdsch_TimeDomainAllocationList) + pdcchCfg->controlResourceSetToAddModList = NULLP; + DU_ALLOC(pdcchCfg->controlResourceSetToAddModList, sizeof(struct PDCCH_Config__controlResourceSetToAddModList)); + if(!pdcchCfg->controlResourceSetToAddModList) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg"); return RFAILED; } - if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK) + if(BuildControlRSetToAddModList(pdcchCfgDb, pdcchCfg->controlResourceSetToAddModList) != ROK) { + DU_LOG("\nERROR --> F1AP : Failed in BuildControlRSetToAddModList()"); return RFAILED; } - pdschCfg->pdsch_AggregationFactor = NULLP; - pdschCfg->rateMatchPatternToAddModList = NULLP; - pdschCfg->rateMatchPatternToReleaseList = NULLP; - pdschCfg->rateMatchPatternGroup1 = NULLP; - pdschCfg->rateMatchPatternGroup2 = NULLP; - pdschCfg->rbg_Size = PDSCH_RBG_SIZE; - pdschCfg->mcs_Table = NULLP; + pdcchCfg->controlResourceSetToReleaseList = NULLP; - pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP; - DU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long)); - if(!pdschCfg->maxNrofCodeWordsScheduledByDCI) + pdcchCfg->searchSpacesToAddModList = NULLP; + DU_ALLOC(pdcchCfg->searchSpacesToAddModList, sizeof(struct PDCCH_Config__searchSpacesToAddModList)); + if(!pdcchCfg->searchSpacesToAddModList) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg"); return RFAILED; } - *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI; - if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK) + if(BuildSearchSpcToAddModList(pdcchCfgDb, pdcchCfg->searchSpacesToAddModList) != ROK) { + DU_LOG("\nERROR --> F1AP : Failed in BuildSearchSpcToAddModList()"); return RFAILED; } - pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP; - pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP; - pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP; - pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP; - pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP; - pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP; - pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP; + pdcchCfg->searchSpacesToReleaseList = NULLP; + pdcchCfg->downlinkPreemption = NULLP; + pdcchCfg->tpc_PUSCH = NULLP; + pdcchCfg->tpc_PUCCH = NULLP; + pdcchCfg->tpc_SRS = NULLP; return ROK; } /******************************************************************* * - * @brief Builds intitial DL BWP - * @details + * @brief Builds DMRS DL PDSCH Mapping type A * - * Function : BuildInitialDlBWP + * @details * - * Functionality: Builds intitial DL BWP in spCellCfgDed + * Function : BuildDMRSDLPdschMapTypeA * - * @params[in] BWP_DownlinkDedicated_t *dlBwp + * Functionality: Builds DMRS DL PDSCH Mapping type A * + * @params[in] + * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp) +uint8_t BuildDMRSDLPdschMapTypeA(PdschConfig *pdschCfg, struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg) { - dlBwp->pdcch_Config = NULLP; - DU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config)); - if(!dlBwp->pdcch_Config) - { - DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP"); - return RFAILED; - } - dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup; - - dlBwp->pdcch_Config->choice.setup = NULLP; - DU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config)); - if(!dlBwp->pdcch_Config->choice.setup) - { - DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP"); - return RFAILED; - } - if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK) - { - return RFAILED; - } - - dlBwp->pdsch_Config = NULLP; - DU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config)); - if(!dlBwp->pdsch_Config) + dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup; + dmrsDlCfg->choice.setup = NULLP; + DU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig)); + if(!dmrsDlCfg->choice.setup) { - DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA"); return RFAILED; } - dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup; - dlBwp->pdsch_Config->choice.setup = NULLP; - DU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config)); - if(!dlBwp->pdsch_Config->choice.setup) + dmrsDlCfg->choice.setup->dmrs_Type = NULLP; + dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP; + DU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long)); + if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) { - DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA"); return RFAILED; } + if(pdschCfg == NULLP) + *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS; + else + *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = pdschCfg->dmrsDlCfgForPdschMapTypeA.addPos; - if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK) - { - return RFAILED; - } + dmrsDlCfg->choice.setup->maxLength = NULLP; + dmrsDlCfg->choice.setup->scramblingID0 = NULLP; + dmrsDlCfg->choice.setup->scramblingID1 = NULLP; + dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP; - dlBwp->sps_Config = NULLP; - dlBwp->radioLinkMonitoringConfig = NULLP; return ROK; } /******************************************************************* * - * @brief Builds DMRS UL Pusch Mapping type A + * @brief Builds TCI states to add/modify list * * @details * - * Function : BuildDMRSULPuschMapTypeA + * Function : BuildTCIStatesToAddModList * - * Functionality: Builds DMRS UL Pusch Mapping type A + * Functionality:Builds TCI states to add/modify list * * @params[in] - * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg + * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList + * * @return ROK - success * RFAILED - failure * * ****************************************************************/ - uint8_t BuildDMRSULPuschMapTypeA -( - struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg - ) +uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList) { - dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup; - dmrsUlCfg->choice.setup= NULLP; - DU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t)); - if(!dmrsUlCfg->choice.setup) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA"); - return RFAILED; - } - - dmrsUlCfg->choice.setup->dmrs_Type = NULLP; - dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP; - DU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long)); - if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA"); - return RFAILED; - } - *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS; - - dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP; - dmrsUlCfg->choice.setup->maxLength = NULLP; - dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP; - DU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \ - sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled)); - if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA"); - return RFAILED; - } - - dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP; - DU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\ - sizeof(long)); - if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA"); - return RFAILED; - } - *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID; - - dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP; - dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP; return ROK; } /******************************************************************* * - * @brief Build PUSCH time domain allocation list + * @brief Builds PDSCH time domain allocation list * * @details * - * Function : BuildPuschTimeDomAllocList + * Function : BuildPdschTimeDomAllocList * - * Functionality: Build PUSCH time domain allocation list + * Functionality: Builds PDSCH time domain allocation list * * @params[in] - * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList + * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList * * @return ROK - success * RFAILED - failure * * ****************************************************************/ - uint8_t BuildPuschTimeDomAllocList -( - struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList - ) +uint8_t BuildPdschTimeDomAllocList(PdschConfig *pdschCfg, struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList) { uint8_t idx; uint8_t elementCnt; - PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc; + struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc; + + timeDomAllocList->present = PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup; - timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup; timeDomAllocList->choice.setup = NULLP; - DU_ALLOC(timeDomAllocList->choice.setup, \ - sizeof(struct PUSCH_TimeDomainResourceAllocationList)); + DU_ALLOC(timeDomAllocList->choice.setup, sizeof(struct PDSCH_TimeDomainResourceAllocationList)); if(!timeDomAllocList->choice.setup) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList"); return RFAILED; } +if(pdschCfg == NULLP) elementCnt = 2; +else +elementCnt = pdschCfg->numTimeDomRsrcAlloc; timeDomAllocList->choice.setup->list.count = elementCnt; - timeDomAllocList->choice.setup->list.size = \ - elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *); + timeDomAllocList->choice.setup->list.size = elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *); + timeDomAllocList->choice.setup->list.array = NULLP; - DU_ALLOC(timeDomAllocList->choice.setup->list.array, \ - timeDomAllocList->choice.setup->list.size); + DU_ALLOC(timeDomAllocList->choice.setup->list.array, timeDomAllocList->choice.setup->list.size); if(!timeDomAllocList->choice.setup->list.array) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList"); return RFAILED; } for(idx = 0; idx < elementCnt; idx++) { timeDomAllocList->choice.setup->list.array[idx] = NULLP; - DU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\ - sizeof(PUSCH_TimeDomainResourceAllocation_t)); + DU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \ + sizeof(struct PDSCH_TimeDomainResourceAllocation)); if(!timeDomAllocList->choice.setup->list.array[idx]) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList"); - return RFAILED; + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList"); + return RFAILED; } } - idx = 0; - timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx]; - DU_ALLOC(timeDomAlloc->k2, sizeof(long)); - if(!timeDomAlloc->k2) + if(pdschCfg == NULLP) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList"); - return RFAILED; + idx = 0; + 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; + } + *(timeDomAlloc->k0) = 0; + timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A; + timeDomAlloc->startSymbolAndLength = \ + calcSliv(PDSCH_START_SYMBOL, PDSCH_LENGTH_SYMBOL); + + 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; + } + *(timeDomAlloc->k0) = 1; + timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A; + timeDomAlloc->startSymbolAndLength = calcSliv(PDSCH_START_SYMBOL, PDSCH_LENGTH_SYMBOL); + } + else + { + 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) + *(timeDomAlloc->k0) = *(pdschCfg->timeDomRsrcAllociList[idx].k0); + timeDomAlloc->mappingType = pdschCfg->timeDomRsrcAllociList[idx].mappingType; + timeDomAlloc->startSymbolAndLength = pdschCfg->timeDomRsrcAllociList[idx].startSymbolAndLength; + } } - *(timeDomAlloc->k2) = PUSCH_K2_CFG1; - timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A; - timeDomAlloc->startSymbolAndLength = calcSliv(PUSCH_START_SYMBOL, PUSCH_LENGTH_SYMBOL); - idx++; - timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx]; - DU_ALLOC(timeDomAlloc->k2, sizeof(long)); - if(!timeDomAlloc->k2) + return ROK; +} + +/******************************************************************* + * + * @brief Builds PDSCH PRB Bundling type + * + * @details + * + * Function : BuildPdschPrbBundlingType + * + * Functionality: Builds PDSCH PRB Bundling type + * + * @params[in] + * struct PDSCH_Config__prb_BundlingType *prbBndlType + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t BuildPdschPrbBundlingType(PdschConfig *pdschCfg, struct PDSCH_Config__prb_BundlingType *prbBndlType) +{ + if(pdschCfg == NULLP) + prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling; + else + prbBndlType->present = pdschCfg->bundlingType; + + prbBndlType->choice.staticBundling = NULLP; + DU_ALLOC(prbBndlType->choice.staticBundling, \ + sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling)); + if(!prbBndlType->choice.staticBundling) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType"); return RFAILED; } - *(timeDomAlloc->k2) = PUSCH_K2_CFG2; - timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A; - timeDomAlloc->startSymbolAndLength = calcSliv(PUSCH_START_SYMBOL, PUSCH_LENGTH_SYMBOL); + prbBndlType->choice.staticBundling->bundleSize = NULLP; return ROK; } /******************************************************************* * - * @brief Builds BWP UL dedicated PUSCH Config + * @brief Builds BWP DL dedicated PDSCH config * * @details * - * Function : BuildBWPUlDedPuschCfg + * Function : BuildBWPDlDedPdschCfg * - * Functionality: - * Builds BWP UL dedicated PUSCH Config + * Functionality: Builds BWP DL dedicated PDSCH config + * + * @params[in] struct PDSCH_Config *pdschCfg * - * @params[in] : PUSCH_Config_t *puschCfg - * * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg) +uint8_t BuildBWPDlDedPdschCfg(PdschConfig *pdschCfgDb, struct PDSCH_Config *pdschCfg) { - puschCfg->dataScramblingIdentityPUSCH = NULLP; - DU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long)); - if(!puschCfg->dataScramblingIdentityPUSCH) + pdschCfg->dataScramblingIdentityPDSCH = NULLP; + + pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP; + DU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA)); + if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg"); return RFAILED; } - *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID; - puschCfg->txConfig = NULLP; - puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP; - DU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \ - sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA)); - if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) + if(BuildDMRSDLPdschMapTypeA(pdschCfgDb, pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg"); return RFAILED; } - if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK) + pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP; + pdschCfg->tci_StatesToAddModList = NULLP; + pdschCfg->tci_StatesToReleaseList = NULLP; + pdschCfg->vrb_ToPRB_Interleaver = NULLP; +#if 0 + DU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList)); + if(!pdschCfg->tci_StatesToAddModList) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg"); + return RFAILED; + } + if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK) { return RFAILED; } +#endif - puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP; - puschCfg->pusch_PowerControl = NULLP; - puschCfg->frequencyHopping = NULLP; - puschCfg->frequencyHoppingOffsetLists = NULLP; - puschCfg->resourceAllocation = RES_ALLOC_TYPE; +if(pdschCfgDb == NULLP) + pdschCfg->resourceAllocation = RES_ALLOC_TYPE; +else +pdschCfg->resourceAllocation = pdschCfgDb->resourceAllocType; - puschCfg->pusch_TimeDomainAllocationList = NULLP; - DU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \ - sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList)); - if(!puschCfg->pusch_TimeDomainAllocationList) + pdschCfg->pdsch_TimeDomainAllocationList = NULLP; + DU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList)); + if(!pdschCfg->pdsch_TimeDomainAllocationList) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg"); return RFAILED; } + if(BuildPdschTimeDomAllocList(pdschCfgDb, pdschCfg->pdsch_TimeDomainAllocationList) != ROK) + { + return RFAILED; + } + + pdschCfg->pdsch_AggregationFactor = NULLP; + pdschCfg->rateMatchPatternToAddModList = NULLP; + pdschCfg->rateMatchPatternToReleaseList = NULLP; + pdschCfg->rateMatchPatternGroup1 = NULLP; + pdschCfg->rateMatchPatternGroup2 = NULLP; + if(pdschCfgDb == NULLP) + pdschCfg->rbg_Size = PDSCH_RBG_SIZE; + else + pdschCfg->rbg_Size = pdschCfgDb->rbgSize; + pdschCfg->mcs_Table = NULLP; - if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK) + pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP; + DU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long)); + if(!pdschCfg->maxNrofCodeWordsScheduledByDCI) { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg"); return RFAILED; } + if(pdschCfgDb == NULLP) + *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI; + else + *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = pdschCfgDb->numCodeWordsSchByDci; - puschCfg->pusch_AggregationFactor = NULLP; - puschCfg->mcs_Table = NULLP; - puschCfg->mcs_TableTransformPrecoder = NULLP; - puschCfg->transformPrecoder = NULLP; - DU_ALLOC(puschCfg->transformPrecoder, sizeof(long)); - if(!puschCfg->transformPrecoder) + if(BuildPdschPrbBundlingType(pdschCfgDb, &pdschCfg->prb_BundlingType) != ROK) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg"); return RFAILED; } - *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER; - puschCfg->codebookSubset = NULLP; - puschCfg->maxRank = NULLP; - puschCfg->rbg_Size = NULLP; - puschCfg->uci_OnPUSCH = NULLP; - puschCfg->tp_pi2BPSK = NULLP; + pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP; + pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP; + pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP; + pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP; + pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP; + pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP; + pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP; return ROK; } /******************************************************************* * - * @brief Builds BWP UL dedicated PUCCH Config - * + * @brief Builds intitial DL BWP * @details * - * Function : BuildBWPUlDedPucchCfg + * Function : BuildInitialDlBWP * - * Functionality: - * Builds BWP UL dedicated PUCCH Config + * Functionality: Builds intitial DL BWP in spCellCfgDed * - * @params[in] : PUCCH_Config_t *pucchCfg + * @params[in] BWP_DownlinkDedicated_t *dlBwp * * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t BuildBWPUlDedPucchCfg(PUCCH_Config_t *pucchCfg) +uint8_t BuildInitialDlBWP(InitialDlBwp *initiDlBwp, BWP_DownlinkDedicated_t *dlBwp) { - uint8_t arrIdx, elementCnt; + PdcchConfig *pdcchCfg = NULLP; + PdschConfig *pdschCfg = NULLP; - DU_ALLOC(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK)); - if(pucchCfg->dl_DataToUL_ACK == NULLP) + if(initiDlBwp) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg"); + if(initiDlBwp->pdcchPresent) + pdcchCfg = &initiDlBwp->pdcchCfg; + if(initiDlBwp->pdschPresent) + pdschCfg = &initiDlBwp->pdschCfg; + } + + dlBwp->pdcch_Config = NULLP; + DU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config)); + if(!dlBwp->pdcch_Config) + { + DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP"); return RFAILED; } - - elementCnt = 2; - pucchCfg->dl_DataToUL_ACK->list.count = elementCnt; - pucchCfg->dl_DataToUL_ACK->list.size = elementCnt * sizeof(long *); - DU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size); - if(pucchCfg->dl_DataToUL_ACK->list.array == NULLP) + dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup; + + dlBwp->pdcch_Config->choice.setup = NULLP; + DU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config)); + if(!dlBwp->pdcch_Config->choice.setup) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg"); + DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP"); return RFAILED; - } + } + if(BuildBWPDlDedPdcchCfg(pdcchCfg, dlBwp->pdcch_Config->choice.setup) != ROK) + { + return RFAILED; + } - for(arrIdx = 0; arrIdx < pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++) + dlBwp->pdsch_Config = NULLP; + DU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config)); + if(!dlBwp->pdsch_Config) { - DU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long)); - if(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx] == NULLP) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg"); - return RFAILED; - } + DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP"); + return RFAILED; } - - arrIdx = 0; - *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx++]) = 1; - *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx]) = 2; + dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup; + + dlBwp->pdsch_Config->choice.setup = NULLP; + DU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config)); + if(!dlBwp->pdsch_Config->choice.setup) + { + DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP"); + return RFAILED; + } + + if(BuildBWPDlDedPdschCfg(pdschCfg, dlBwp->pdsch_Config->choice.setup) != ROK) + { + return RFAILED; + } + + dlBwp->sps_Config = NULLP; + dlBwp->radioLinkMonitoringConfig = NULLP; return ROK; } /******************************************************************* * - * @brief Fills SRS resource to add/modify list + * @brief Builds DMRS UL Pusch Mapping type A * * @details * - * Function : BuildSrsRsrcAddModList + * Function : BuildDMRSULPuschMapTypeA * - * Functionality: Fills SRS resource to add/modify list + * Functionality: Builds DMRS UL Pusch Mapping type A * * @params[in] + * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList) +uint8_t BuildDMRSULPuschMapTypeA(DmrsUlCfg *ulDmrsCfgDb, struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg) { - uint8_t elementCnt; - uint8_t rsrcIdx; - - elementCnt = 1; - resourceList->list.count = elementCnt; - resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *); - resourceList->list.array = NULLP; - DU_ALLOC(resourceList->list.array, resourceList->list.size); - if(!resourceList->list.array) + dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup; + dmrsUlCfg->choice.setup= NULLP; + DU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t)); + if(!dmrsUlCfg->choice.setup) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcAddModList"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA"); return RFAILED; } - for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++) + dmrsUlCfg->choice.setup->dmrs_Type = NULLP; + dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP; + DU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long)); + if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) { - DU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t)); - if(!resourceList->list.array[rsrcIdx]) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcAddModList"); - return RFAILED; - } + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA"); + return RFAILED; } + if(ulDmrsCfgDb == NULLP) + *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS; + else + *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = ulDmrsCfgDb->addPos; - rsrcIdx = 0; - resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID; - resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1; - resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2; + dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP; + dmrsUlCfg->choice.setup->maxLength = NULLP; + dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP; + DU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled)); + if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA"); + return RFAILED; + } - resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP; - DU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \ - sizeof(struct SRS_Resource__transmissionComb__n2)); - if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2) + dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP; + DU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\ + sizeof(long)); + if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcAddModList"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA"); return RFAILED; } - resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\ - = SRS_COMB_OFFSET_N2; - resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\ - = SRS_CYCLIC_SHIFT_N2; - - resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = \ - PUSCH_START_SYMBOL; - resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \ - SRS_Resource__resourceMapping__nrofSymbols_n1; - resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \ - SRS_Resource__resourceMapping__repetitionFactor_n1; - - resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS; - resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT; - resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS; - resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS; - resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP; - resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \ - SRS_Resource__groupOrSequenceHopping_neither; - - /* Setting resource type to aperiodic for intergration purposes */ - resourceList->list.array[rsrcIdx]->resourceType.present = \ - SRS_Resource__resourceType_PR_aperiodic; - resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP; - DU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic, - sizeof(struct SRS_Resource__resourceType__aperiodic)); - if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcAddModList"); - return RFAILED; - } - resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID; + if(ulDmrsCfgDb == NULLP) + *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID; + else + *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = ulDmrsCfgDb->transPrecodDisabled.scramblingId0; + dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP; + dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP; return ROK; } /******************************************************************* * - * @brief Build SRS resource set Add/mod list + * @brief Build PUSCH time domain allocation list * * @details * - * Function : BuildSrsRsrcSetAddModList + * Function : BuildPuschTimeDomAllocList * - * Functionality: Build SRS resource set Add/mod list + * Functionality: Build PUSCH time domain allocation list * * @params[in] + * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList + * * @return ROK - success * RFAILED - failure * * ****************************************************************/ - uint8_t BuildSrsRsrcSetAddModList -( - struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList - ) +uint8_t BuildPuschTimeDomAllocList(PuschCfg *puschCfgDb, struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList) { - uint8_t elementCnt; - uint8_t rSetIdx; - uint8_t rsrcIdx; - struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList; + uint8_t idx; + uint8_t elementCnt; + PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc; - elementCnt = 1; - rsrcSetList->list.count = elementCnt; - rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *); - rsrcSetList->list.array = NULLP; - DU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size); - if(!rsrcSetList->list.array) + timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup; + timeDomAllocList->choice.setup = NULLP; + DU_ALLOC(timeDomAllocList->choice.setup, sizeof(struct PUSCH_TimeDomainResourceAllocationList)); + if(!timeDomAllocList->choice.setup) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList"); return RFAILED; } - for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++) - { - DU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t)); - if(!rsrcSetList->list.array[rSetIdx]) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList"); - return RFAILED; - } - } - - rSetIdx = 0; - rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID; + if(puschCfgDb == NULLP) + elementCnt = 2; + else + elementCnt = puschCfgDb->numTimeDomRsrcAlloc; - /* Fill Resource Id list in resource set */ - rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP; - DU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\ - sizeof(struct SRS_ResourceSet__srs_ResourceIdList)); - if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList) + timeDomAllocList->choice.setup->list.count = elementCnt; + timeDomAllocList->choice.setup->list.size = elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *); + timeDomAllocList->choice.setup->list.array = NULLP; + DU_ALLOC(timeDomAllocList->choice.setup->list.array, timeDomAllocList->choice.setup->list.size); + if(!timeDomAllocList->choice.setup->list.array) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList"); return RFAILED; } - elementCnt = 1; - rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList; - rsrcIdList->list.count = elementCnt; - rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *); - rsrcIdList->list.array = NULLP; - DU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size); - if(!rsrcIdList->list.array) + for(idx = 0; idx < elementCnt; idx++) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList"); - return RFAILED; + timeDomAllocList->choice.setup->list.array[idx] = NULLP; + DU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], sizeof(PUSCH_TimeDomainResourceAllocation_t)); + if(!timeDomAllocList->choice.setup->list.array[idx]) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList"); + return RFAILED; + } } - for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++) + for(idx = 0; idx < elementCnt; idx++) { - DU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t)); - if(!rsrcIdList->list.array[rsrcIdx]) + timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx]; + DU_ALLOC(timeDomAlloc->k2, sizeof(long)); + if(!timeDomAlloc->k2) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList"); - return RFAILED; + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList"); + return RFAILED; } - } - - rsrcIdx = 0; - *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID; - - /* Fill resource type */ - rsrcSetList->list.array[rSetIdx]->resourceType.present = \ - SRS_ResourceSet__resourceType_PR_aperiodic; + if(puschCfgDb == NULLP) + { + if(idx == 0) + *(timeDomAlloc->k2) = PUSCH_K2_CFG1; + else if(idx == 1) + *(timeDomAlloc->k2) = PUSCH_K2_CFG2; - rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP; - DU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \ - sizeof(struct SRS_ResourceSet__resourceType__aperiodic)); - if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList"); - return RFAILED; + timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A; + timeDomAlloc->startSymbolAndLength = calcSliv(PUSCH_START_SYMBOL, PUSCH_LENGTH_SYMBOL); + } + else + { + *(timeDomAlloc->k2) = puschCfgDb->timeDomRsrcAllocList[idx].k2; + timeDomAlloc->mappingType = puschCfgDb->timeDomRsrcAllocList[idx].mappingType; + timeDomAlloc->startSymbolAndLength = puschCfgDb->timeDomRsrcAllocList[idx].startSymbolAndLength; + } } - rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \ - = APERIODIC_SRS_RESRC_TRIGGER; - - /* TODO : Fill values for below IEs as expected by Viavi */ - rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP; - rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP; - - - rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook; - rsrcSetList->list.array[rSetIdx]->alpha = NULLP; - rsrcSetList->list.array[rSetIdx]->p0 = NULLP; - rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP; - rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP; return ROK; } /******************************************************************* * - * @brief Builds BWP UL dedicated SRS Config + * @brief Builds BWP UL dedicated PUSCH Config * * @details * - * Function : BuildBWPUlDedSrsCfg + * Function : BuildBWPUlDedPuschCfg * - * Functionality: Builds BWP UL dedicated SRS Config + * Functionality: + * Builds BWP UL dedicated PUSCH Config * - * @params[in] SRS Config + * @params[in] : PUSCH_Config_t *puschCfg + * * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg) +uint8_t BuildBWPUlDedPuschCfg(PuschCfg *puschCfgDb, PUSCH_Config_t *puschCfg) { - srsCfg->srs_ResourceSetToReleaseList = NULLP; - srsCfg->srs_ResourceSetToAddModList = NULLP; - DU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \ - sizeof(struct SRS_Config__srs_ResourceSetToAddModList)); - if(!srsCfg->srs_ResourceSetToAddModList) + DmrsUlCfg *ulDmrsCfg = NULLP; + + if(puschCfgDb) + ulDmrsCfg = &puschCfgDb->dmrsUlCfgForPuschMapTypeA; + + puschCfg->dataScramblingIdentityPUSCH = NULLP; + DU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long)); + if(!puschCfg->dataScramblingIdentityPUSCH) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedSrsCfg"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg"); return RFAILED; } - if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK) + if(puschCfgDb == NULLP) + *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID; + else + *(puschCfg->dataScramblingIdentityPUSCH) = puschCfgDb->dataScramblingId; + + puschCfg->txConfig = NULLP; + puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP; + DU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA)); + if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg"); return RFAILED; } - srsCfg->srs_ResourceToReleaseList = NULLP; + if(BuildDMRSULPuschMapTypeA(ulDmrsCfg, puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK) + { + return RFAILED; + } - /* Resource to Add/Modify list */ - srsCfg->srs_ResourceToAddModList = NULLP; - DU_ALLOC(srsCfg->srs_ResourceToAddModList, \ - sizeof(struct SRS_Config__srs_ResourceToAddModList)); - if(!srsCfg->srs_ResourceToAddModList) + puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP; + puschCfg->pusch_PowerControl = NULLP; + puschCfg->frequencyHopping = NULLP; + puschCfg->frequencyHoppingOffsetLists = NULLP; + + if(puschCfgDb == NULLP) + puschCfg->resourceAllocation = RES_ALLOC_TYPE; + else + puschCfg->resourceAllocation = puschCfgDb->resourceAllocType; + + puschCfg->pusch_TimeDomainAllocationList = NULLP; + DU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList)); + if(!puschCfg->pusch_TimeDomainAllocationList) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedSrsCfg"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg"); return RFAILED; } - if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK) + if(BuildPuschTimeDomAllocList(puschCfgDb, puschCfg->pusch_TimeDomainAllocationList) != ROK) { return RFAILED; } - srsCfg->tpc_Accumulation = NULLP; + puschCfg->pusch_AggregationFactor = NULLP; + puschCfg->mcs_Table = NULLP; + puschCfg->mcs_TableTransformPrecoder = NULLP; + puschCfg->transformPrecoder = NULLP; + DU_ALLOC(puschCfg->transformPrecoder, sizeof(long)); + if(!puschCfg->transformPrecoder) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg"); + return RFAILED; + } + if(puschCfgDb == NULLP) + *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER; + else + *(puschCfg->transformPrecoder) = puschCfgDb->transformPrecoder; + + puschCfg->codebookSubset = NULLP; + puschCfg->maxRank = NULLP; + puschCfg->rbg_Size = NULLP; + puschCfg->uci_OnPUSCH = NULLP; + puschCfg->tp_pi2BPSK = NULLP; return ROK; } - - /******************************************************************* * - * @brief Builds Pusch Serving cell Config + * @brief Builds PUCCH resource set add/modify list * * @details * - * Function : BuildPuschSrvCellCfg + * Function : BuildPucchRsrcSetAddModList * - * Functionality: Builds Pusch Serving cell Config + * Functionality: + * Builds PUCCH resource set add/modify list * - * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg + * @params[in] : PucchResrcSetCfg *rsrcSetCfgDb + * struct PUCCH_Config__resourceSetToAddModList *rsrcSetAddModList * * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg) +uint8_t BuildPucchRsrcSetAddModList(PucchResrcSetCfg *rsrcSetCfgDb, \ + struct PUCCH_Config__resourceSetToAddModList *resourceSetToAddModList) { - puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup; - puschCfg->choice.setup = NULLP; - DU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig)); - if(!puschCfg->choice.setup) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg"); - return RFAILED; - } + uint8_t elementCnt = 0, rsrcSetIdx = 0, rsrcIdx = 0; + PUCCH_ResourceSet_t *rsrcSet = NULLP; - puschCfg->choice.setup->codeBlockGroupTransmission = NULLP; - 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) + if(rsrcSetCfgDb == NULLP) + elementCnt = 1; + else + elementCnt = rsrcSetCfgDb->resrcSetToAddModListCount; + + resourceSetToAddModList->list.count = elementCnt; + resourceSetToAddModList->list.size = elementCnt * sizeof(PUCCH_ResourceSet_t *); + DU_ALLOC(resourceSetToAddModList->list.array, resourceSetToAddModList->list.size); + if(resourceSetToAddModList->list.array == NULLP) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcSetAddModList"); return RFAILED; } - - puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP; - DU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long)); - if(!puschCfg->choice.setup->ext1->maxMIMO_Layers) + for(rsrcSetIdx=0; rsrcSetIdx < resourceSetToAddModList->list.count; rsrcSetIdx++) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg"); - return RFAILED; + DU_ALLOC(resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t)); + if(resourceSetToAddModList->list.array[rsrcSetIdx] == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcSetAddModList"); + return RFAILED; + } } - *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS; - puschCfg->choice.setup->ext1->processingType2Enabled= NULLP; - DU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t)); - if(!puschCfg->choice.setup->ext1->processingType2Enabled) + for(rsrcSetIdx=0; rsrcSetIdx < resourceSetToAddModList->list.count; rsrcSetIdx++) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg"); - return RFAILED; - } - *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED; - return ROK; -} + rsrcSet = resourceSetToAddModList->list.array[rsrcSetIdx]; -/******************************************************************* - * - * @brief Builds inital UL BWP - * - * @details + /* Resource set Id */ + if(rsrcSetCfgDb == NULLP) + rsrcSet->pucch_ResourceSetId = 1; + else + rsrcSet->pucch_ResourceSetId = rsrcSetCfgDb->resrcSetToAddModList[rsrcSetIdx].resrcSetId; + + /* Resource list of a resource set */ + if(rsrcSetCfgDb == NULLP) + elementCnt = 1; + else + elementCnt = rsrcSetCfgDb->resrcSetToAddModList[rsrcSetIdx].resrcListCount; + rsrcSet->resourceList.list.count = elementCnt; + rsrcSet->resourceList.list.size = elementCnt * sizeof(PUCCH_ResourceId_t *); + DU_ALLOC(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size); + if(rsrcSet->resourceList.list.array == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcSetAddModList"); + return RFAILED; + } + + for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++) + { + DU_ALLOC(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t)); + if(rsrcSet->resourceList.list.array[rsrcIdx] == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcSetAddModList"); + return RFAILED; + } + } + for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++) + { + if(rsrcSetCfgDb == NULLP) + *(rsrcSet->resourceList.list.array[rsrcIdx]) = 1; + else + *(rsrcSet->resourceList.list.array[rsrcIdx]) = rsrcSetCfgDb->resrcSetToAddModList[rsrcSetIdx].resrcList[rsrcIdx]; + } + + /* Max payload size (minus 1) in a Resource set */ + rsrcSet->maxPayloadMinus1 = NULLP; + if(rsrcSetCfgDb && rsrcSetCfgDb->resrcSetToAddModList[rsrcSetIdx].maxPayLoadSize) + { + DU_ALLOC(rsrcSet->maxPayloadMinus1, sizeof(long)); + if(rsrcSet->maxPayloadMinus1 == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcSetAddModList"); + return RFAILED; + } + *(rsrcSet->maxPayloadMinus1) = rsrcSetCfgDb->resrcSetToAddModList[rsrcSetIdx].maxPayLoadSize; + } + } + return ROK; +} + +/******************************************************************* * - * Function : BuildInitialUlBWP + * @brief Builds PUCCH resource add/modify list * - * Functionality: Builds initial UL BWP + * @details + * + * Function : BuildPucchRsrcAdddModList + * + * Functionality: + * Builds PUCCH resource add/modify list + * + * @params[in] : PucchResrcCfg *rsrcSetCfgDb + * struct PUCCH_Config__resourceSetToAddModList *rsrcSetAddModList * - * @params[in] BWP_UplinkDedicated_t *ulBwp * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp) +uint8_t BuildPucchRsrcAddModList(PucchResrcCfg *rsrcCfgDb, struct PUCCH_Config__resourceToAddModList *resourceToAddModList) { - ulBwp->pucch_Config = NULLP; - DU_ALLOC(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config)); - if(!ulBwp->pucch_Config) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP"); - return RFAILED; - } - - ulBwp->pucch_Config->present = BWP_UplinkDedicated__pucch_Config_PR_setup; - ulBwp->pucch_Config->choice.setup = NULLP; - DU_ALLOC(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t)); - if(!ulBwp->pucch_Config->choice.setup) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP"); - return RFAILED; - } + uint8_t elementCnt = 0, rsrcIdx = 0; + PUCCH_Resource_t *rsrc = NULLP; - if(BuildBWPUlDedPucchCfg(ulBwp->pucch_Config->choice.setup) != ROK) + if(rsrcCfgDb == NULLP) + elementCnt = 1; + else + elementCnt = rsrcCfgDb->resrcToAddModListCount; + resourceToAddModList->list.count = elementCnt; + resourceToAddModList->list.size = elementCnt * sizeof(PUCCH_Resource_t *); + DU_ALLOC(resourceToAddModList->list.array, resourceToAddModList->list.size); + if(resourceToAddModList->list.array == NULLP) { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcAddModList"); return RFAILED; } - - /* Fill BWP UL dedicated PUSCH config */ - ulBwp->pusch_Config = NULLP; - DU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config)); - if(!ulBwp->pusch_Config) + for(rsrcIdx=0; rsrcIdx < resourceToAddModList->list.count; rsrcIdx++) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP"); - return RFAILED; + DU_ALLOC(resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t)); + if(resourceToAddModList->list.array[rsrcIdx] == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcAddModList"); + return RFAILED; + } } - ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup; - ulBwp->pusch_Config->choice.setup = NULLP; - DU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t)); - if(!ulBwp->pusch_Config->choice.setup) + for(rsrcIdx=0; rsrcIdx < resourceToAddModList->list.count; rsrcIdx++) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP"); - return RFAILED; - } + rsrc = resourceToAddModList->list.array[rsrcIdx]; - if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK) - { - return RFAILED; - } + if(rsrcCfgDb == NULLP) + { + rsrc->pucch_ResourceId = 1; + rsrc->startingPRB = 0; + rsrc->format.present = PUCCH_Resource__format_PR_format1; + DU_ALLOC(rsrc->format.choice.format1, sizeof(PUCCH_format1_t)); + if(rsrc->format.choice.format1 == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcAddModList"); + return RFAILED; + } + rsrc->format.choice.format1->initialCyclicShift = 0; + rsrc->format.choice.format1->nrofSymbols = 4; + rsrc->format.choice.format1->startingSymbolIndex = 0; + rsrc->format.choice.format1->timeDomainOCC = 0; + } + else + { + rsrc->pucch_ResourceId = rsrcCfgDb->resrcToAddModList[rsrcIdx].resrcId; + rsrc->startingPRB = rsrcCfgDb->resrcToAddModList[rsrcIdx].startPrb; + if(rsrcCfgDb->resrcToAddModList[rsrcIdx].intraFreqHop) + { + DU_ALLOC(rsrc->intraSlotFrequencyHopping, sizeof(long)); + if(rsrc->intraSlotFrequencyHopping == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcAddModList"); + return RFAILED; + } + *(rsrc->intraSlotFrequencyHopping) = rsrcCfgDb->resrcToAddModList[rsrcIdx].intraFreqHop; + } + else + rsrc->intraSlotFrequencyHopping = NULLP; - ulBwp->configuredGrantConfig = NULLP; + if(rsrcCfgDb->resrcToAddModList[rsrcIdx].secondPrbHop) + { + DU_ALLOC(rsrc->secondHopPRB, sizeof(PRB_Id_t)); + if(rsrc->secondHopPRB == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcAddModList"); + return RFAILED; + } + *(rsrc->secondHopPRB) = rsrcCfgDb->resrcToAddModList[rsrcIdx].secondPrbHop; + } + else + rsrc->secondHopPRB = NULLP; + rsrc->format.present = covertPucchFormatIntEnumToRrcEnum(rsrcCfgDb->resrcToAddModList[rsrcIdx].pucchFormat); - /* Fill BPW UL dedicated SRS config */ - ulBwp->srs_Config = NULLP; - DU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config)); - if(!ulBwp->srs_Config) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP"); - return RFAILED; - } + switch(rsrc->format.present) + { + case PUCCH_Resource__format_PR_NOTHING: + break; + case PUCCH_Resource__format_PR_format0: + { + DU_ALLOC(rsrc->format.choice.format0, sizeof(PUCCH_format0_t)); + if(rsrc->format.choice.format0 == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcAddModList"); + return RFAILED; + } + rsrc->format.choice.format0->initialCyclicShift = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format0->initialCyclicShift; + rsrc->format.choice.format0->nrofSymbols = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format0->numSymbols; + rsrc->format.choice.format0->startingSymbolIndex = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format0->startSymbolIdx; + break; + } - ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup; - ulBwp->srs_Config->choice.setup = NULLP; - DU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t)); - if(!ulBwp->srs_Config->choice.setup) - { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP"); - return RFAILED; - } + case PUCCH_Resource__format_PR_format1: + { + DU_ALLOC(rsrc->format.choice.format1, sizeof(PUCCH_format1_t)); + if(rsrc->format.choice.format1 == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcAddModList"); + return RFAILED; + } + rsrc->format.choice.format1->initialCyclicShift = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format1->initialCyclicShift; + rsrc->format.choice.format1->nrofSymbols = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format1->numSymbols; + rsrc->format.choice.format1->startingSymbolIndex = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format1->startSymbolIdx; + rsrc->format.choice.format1->timeDomainOCC = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format1->timeDomOCC; + break; + } - if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK) - { - return RFAILED; - } + case PUCCH_Resource__format_PR_format2: + { + DU_ALLOC(rsrc->format.choice.format2, sizeof(PUCCH_format2_t)); + if(rsrc->format.choice.format2 == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcAddModList"); + return RFAILED; + } + rsrc->format.choice.format2->nrofPRBs = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format2->numPrbs; + rsrc->format.choice.format2->nrofSymbols = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format2->numSymbols; + rsrc->format.choice.format2->startingSymbolIndex = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format2->startSymbolIdx; + break; + } - ulBwp->beamFailureRecoveryConfig = NULLP; + case PUCCH_Resource__format_PR_format3: + { + DU_ALLOC(rsrc->format.choice.format3, sizeof(PUCCH_format3_t)); + if(rsrc->format.choice.format3 == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcAddModList"); + return RFAILED; + } + rsrc->format.choice.format3->nrofPRBs = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format3->numPrbs; + rsrc->format.choice.format3->nrofSymbols = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format3->numSymbols; + rsrc->format.choice.format3->startingSymbolIndex = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format3->startSymbolIdx; + break; + } + case PUCCH_Resource__format_PR_format4: + { + DU_ALLOC(rsrc->format.choice.format4, sizeof(PUCCH_format4_t)); + if(rsrc->format.choice.format4 == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcAddModList"); + return RFAILED; + } + rsrc->format.choice.format4->nrofSymbols = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format4->numSymbols; + rsrc->format.choice.format4->occ_Length = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format4->occLen; + rsrc->format.choice.format4->occ_Index = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format4->occIdx; + rsrc->format.choice.format4->startingSymbolIndex = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format4->startSymbolIdx; + break; + } + } + } + } return ROK; } /******************************************************************* * - * @brief Builds UL config + * @brief Builds PUCCH format config + * * @details * - * Function : BuildUlCfg + * Function : BuildPucchFormat * - * Functionality: Builds UL config in spCellCfgDed + * Functionality: Builds PUCCH format config * - * @params[in] UplinkConfig_t *ulCfg + * @params[in] : PucchFormatCfg *formatDb + * PUCCH_FormatConfig_t *format * * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t BuildUlCfg(UplinkConfig_t *ulCfg) +uint8_t BuildPucchFormat(PucchFormatCfg *formatDb, PUCCH_FormatConfig_t *format) { - ulCfg->initialUplinkBWP = NULLP; - DU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t)); - if(!ulCfg->initialUplinkBWP) + /* Inter Slot Fequency hopping */ + format->interslotFrequencyHopping = NULLP; + if((formatDb != NULLP) && (formatDb->interSlotFreqHop == true)) { - DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg"); - return RFAILED; + DU_ALLOC(format->interslotFrequencyHopping, sizeof(long)); + if(format->interslotFrequencyHopping) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchFormat"); + return RFAILED; + } + *(format->interslotFrequencyHopping) = PUCCH_FormatConfig__interslotFrequencyHopping_enabled; } - if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK) + /* Additional DMRS */ + format->additionalDMRS = NULLP; + if((formatDb != NULLP) && (formatDb->addDmrs == true)) { - return RFAILED; + DU_ALLOC(format->additionalDMRS, sizeof(long)); + if(format->additionalDMRS) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchFormat"); + return RFAILED; + } + *(format->additionalDMRS) = PUCCH_FormatConfig__additionalDMRS_true; } - ulCfg->uplinkBWP_ToReleaseList = NULLP; - ulCfg->uplinkBWP_ToAddModList = NULLP; - ulCfg->firstActiveUplinkBWP_Id = NULLP; - DU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t)); - if(!ulCfg->firstActiveUplinkBWP_Id) + /* Maximum code rate */ + format->maxCodeRate = NULLP; + if((formatDb != NULLP) && (formatDb->maxCodeRate != 0)) { - DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg"); - return RFAILED; + DU_ALLOC(format->maxCodeRate, sizeof(long)); + if(format->maxCodeRate) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchFormat"); + return RFAILED; + } + *(format->maxCodeRate) = formatDb->maxCodeRate; + } + + /* Number of slots */ + format->nrofSlots = NULLP; + if((formatDb == NULLP) || ((formatDb != NULLP) && (formatDb->numSlots != 0))) + { + DU_ALLOC(format->nrofSlots, sizeof(long)); + if(format->nrofSlots == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchFormat"); + return RFAILED; + } + if(formatDb == NULLP) + *(format->nrofSlots) = PUCCH_FormatConfig__nrofSlots_n4; + else + *(format->nrofSlots) = formatDb->numSlots; } - *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID; - ulCfg->pusch_ServingCellConfig = NULLP; - DU_ALLOC(ulCfg->pusch_ServingCellConfig, \ - sizeof(struct UplinkConfig__pusch_ServingCellConfig)); - if(!ulCfg->pusch_ServingCellConfig) + /* Pi2BPSK*/ + format->pi2BPSK = NULLP; + if((formatDb != NULLP) && (formatDb->pi2BPSK == true)) { - DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg"); - return RFAILED; + DU_ALLOC(format->pi2BPSK, sizeof(long)); + if(format->pi2BPSK) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchFormat"); + return RFAILED; + } + *(format->pi2BPSK) = PUCCH_FormatConfig__pi2BPSK_enabled; } - if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK) + /* Simultaneous HARQ ACK and CSI */ + format->simultaneousHARQ_ACK_CSI = NULLP; + if((formatDb != NULLP) && (formatDb->harqAckCSI == true)) { - return RFAILED; + DU_ALLOC(format->simultaneousHARQ_ACK_CSI, sizeof(long)); + if(format->simultaneousHARQ_ACK_CSI) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchFormat"); + return RFAILED; + } + *(format->simultaneousHARQ_ACK_CSI) = PUCCH_FormatConfig__simultaneousHARQ_ACK_CSI_true; } - ulCfg->carrierSwitching = NULLP; - ulCfg->ext1 = NULLP; return ROK; } + /******************************************************************* * - * @brief Builds PDSCH serving cell config + * @brief Builds PUCCH scheduling request list + * * @details * - * Function : BuildPdschSrvCellCfg + * Function : BuildPucchSchReqAddModList * - * Functionality: Builds PDSCH serving cell config in spCellCfgDed + * Functionality: + * Builds PUCCH scheduling request list * - * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg + * @params[in] : PucchSchedReqCfg *schReqDb + * struct PUCCH_Config__schedulingRequestResourceToAddModList *schReqRsrcToAddModList * * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg) +uint8_t BuildPucchSchReqAddModList(PucchSchedReqCfg *schReqDb, \ + struct PUCCH_Config__schedulingRequestResourceToAddModList *schReqRsrcToAddModList) { - pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup; - pdschCfg->choice.setup = NULLP; - DU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig)); - if(!pdschCfg->choice.setup) + uint8_t elementCnt = 0, schReqIdx = 0; + SchedulingRequestResourceConfig_t *schReqRsrc; + + elementCnt = schReqDb->schedAddModListCount; + schReqRsrcToAddModList->list.count = elementCnt; + schReqRsrcToAddModList->list.size = elementCnt *sizeof(struct SchedulingRequestResourceConfig *); + + schReqRsrcToAddModList->list.array = NULLP; + DU_ALLOC(schReqRsrcToAddModList->list.array, schReqRsrcToAddModList->list.size); + if(schReqRsrcToAddModList->list.array == NULLP) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg"); + DU_LOG("\nERROR --> DU APP: Memory allocation failed in BuildPucchSchReqAddModList"); return RFAILED; } - pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP; - pdschCfg->choice.setup->xOverhead = NULLP; - pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP; - DU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long)); - if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH) + for(schReqIdx = 0; schReqIdx < schReqRsrcToAddModList->list.count; schReqIdx++) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg"); - return RFAILED; + DU_ALLOC(schReqRsrcToAddModList->list.array[schReqIdx], schReqRsrcToAddModList->list.size); + if(schReqRsrcToAddModList->list.array[schReqIdx] == NULLP) + { + DU_LOG("\nERROR --> DU APP: Memory allocation failed in BuildPucchSchReqAddModList"); + return RFAILED; + } } - *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC; - pdschCfg->choice.setup->pucch_Cell = NULLP; - pdschCfg->choice.setup->ext1 = NULLP; + for(schReqIdx = 0; schReqIdx < schReqRsrcToAddModList->list.count; schReqIdx++) + { + schReqRsrc = schReqRsrcToAddModList->list.array[schReqIdx]; + schReqRsrc->schedulingRequestResourceId = schReqDb->schedAddModList[schReqIdx].resrcId; + schReqRsrc->schedulingRequestID = schReqDb->schedAddModList[schReqIdx].requestId; + + if(schReqDb->schedAddModList[schReqIdx].periodicity) + { + schReqRsrc->periodicityAndOffset = NULLP; + DU_ALLOC(schReqRsrc->periodicityAndOffset, sizeof(struct SchedulingRequestResourceConfig__periodicityAndOffset)); + if(schReqRsrc->periodicityAndOffset == NULLP) + { + DU_LOG("\nERROR --> DU APP: Memory allocation failed in BuildPucchSchReqAddModList"); + return RFAILED; + } + + schReqRsrc->periodicityAndOffset->present = schReqDb->schedAddModList[schReqIdx].periodicity; + switch(schReqRsrc->periodicityAndOffset->present) + { + case SchedulingRequestResourceConfig__periodicityAndOffset_PR_NOTHING: + break; + case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sym2: + schReqRsrc->periodicityAndOffset->choice.sym2 = schReqDb->schedAddModList[schReqIdx].offset; + break; + case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sym6or7: + schReqRsrc->periodicityAndOffset->choice.sym6or7 = schReqDb->schedAddModList[schReqIdx].offset; + break; + case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl1: + schReqRsrc->periodicityAndOffset->choice.sl1 = schReqDb->schedAddModList[schReqIdx].offset; + break; + case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl2: + schReqRsrc->periodicityAndOffset->choice.sl2 = schReqDb->schedAddModList[schReqIdx].offset; + break; + case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl4: + schReqRsrc->periodicityAndOffset->choice.sl4 = schReqDb->schedAddModList[schReqIdx].offset; + break; + case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl5: + schReqRsrc->periodicityAndOffset->choice.sl5 = schReqDb->schedAddModList[schReqIdx].offset; + break; + case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl8: + schReqRsrc->periodicityAndOffset->choice.sl8 = schReqDb->schedAddModList[schReqIdx].offset; + break; + case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl10: + schReqRsrc->periodicityAndOffset->choice.sl10 = schReqDb->schedAddModList[schReqIdx].offset; + break; + case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl16: + schReqRsrc->periodicityAndOffset->choice.sl16 = schReqDb->schedAddModList[schReqIdx].offset; + break; + case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl20: + schReqRsrc->periodicityAndOffset->choice.sl20 = schReqDb->schedAddModList[schReqIdx].offset; + break; + case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl40: + schReqRsrc->periodicityAndOffset->choice.sl40 = schReqDb->schedAddModList[schReqIdx].offset; + break; + case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl80: + schReqRsrc->periodicityAndOffset->choice.sl80 = schReqDb->schedAddModList[schReqIdx].offset; + break; + case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl160: + schReqRsrc->periodicityAndOffset->choice.sl160 = schReqDb->schedAddModList[schReqIdx].offset; + break; + case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl320: + schReqRsrc->periodicityAndOffset->choice.sl320 = schReqDb->schedAddModList[schReqIdx].offset; + break; + case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl640: + schReqRsrc->periodicityAndOffset->choice.sl640 = schReqDb->schedAddModList[schReqIdx].offset; + break; + } + } + + if(schReqDb->schedAddModList[schReqIdx].resrc) + { + schReqRsrc->resource = NULLP; + DU_ALLOC(schReqRsrc->resource, sizeof(PUCCH_ResourceId_t)); + if(schReqRsrc->resource == NULLP) + { + DU_LOG("\nERROR --> DU APP: Memory allocation failed in BuildPucchSchReqAddModList"); + return RFAILED; + } + *(schReqRsrc->resource) = schReqDb->schedAddModList[schReqIdx].resrc; + + } + } return ROK; } /******************************************************************* * - * @brief Builds CSI Meas config + * @brief Builds PUCCH multi csi resource list + * * @details * - * Function : BuildCsiMeasCfg + * Function : BuildPucchMultiCsiRsrcList * - * Functionality: Builds CSI Meas config in spCellCfgDed + * Functionality: + * Builds PUCCH multi csi resource list * - * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg + * @params[in] : PucchMultiCsiCfg *multiCsiDb + * struct PUCCH_Config__multi_CSI_PUCCH_ResourceList *multiCsiRsrcList * * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg) +uint8_t BuildPucchMultiCsiRsrcList(PucchMultiCsiCfg *multiCsiDb, struct PUCCH_Config__multi_CSI_PUCCH_ResourceList *multiCsiRsrcList) { + uint8_t elementCnt = 0, rsrcIdx = 0; + elementCnt = multiCsiDb->multiCsiResrcListCount; + multiCsiRsrcList->list.count = elementCnt; + multiCsiRsrcList->list.size = elementCnt * sizeof(PUCCH_ResourceId_t *); + multiCsiRsrcList->list.array = NULLP; + DU_ALLOC(multiCsiRsrcList->list.array, multiCsiRsrcList->list.size); + if(multiCsiRsrcList->list.array == NULLP) + { + DU_LOG("\nERROR --> DU APP: Memory allocation failed in BuildPucchMultiCsiRsrcList"); + return RFAILED; + } + + for(rsrcIdx = 0; rsrcIdxlist.count; rsrcIdx++) + { + DU_ALLOC(multiCsiRsrcList->list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t)); + if(multiCsiRsrcList->list.array[rsrcIdx] == NULLP) + { + DU_LOG("\nERROR --> DU APP: Memory allocation failed in BuildPucchMultiCsiRsrcList"); + return RFAILED; + } + } + + for(rsrcIdx = 0; rsrcIdxlist.count; rsrcIdx++) + { + *(multiCsiRsrcList->list.array[rsrcIdx]) = multiCsiDb->multiCsiResrcList[rsrcIdx]; + } return ROK; } /******************************************************************* * - * @brief Builds Spcell config dedicated + * @brief Builds DL data -to- Ul Ack list + * * @details * - * Function : BuildSpCellCfgDed + * Function : BuildDlDataToUlAckList * - * Functionality: Builds sp cell config dedicated in spCellCfg + * Functionality: Builds DL data -to- Ul Ack list * - * @params[in] ServingCellConfig_t srvCellCfg + * @params[in] : PucchDlDataToUlAck *dlDataToUlAckDb + * struct PUCCH_Config__dl_DataToUL_ACK * dlDataToUlACKList * * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg) +uint8_t BuildDlDataToUlAckList(PucchDlDataToUlAck *dlDataToUlAckDb, struct PUCCH_Config__dl_DataToUL_ACK * dlDataToUlACKList) { - 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) + uint8_t elementCnt = 0, arrIdx = 0; + + if(dlDataToUlAckDb == NULLP) + elementCnt = 2; + else + elementCnt = dlDataToUlAckDb->dlDataToUlAckListCount; + + dlDataToUlACKList->list.count = elementCnt; + dlDataToUlACKList->list.size = elementCnt * sizeof(long *); + DU_ALLOC(dlDataToUlACKList->list.array, dlDataToUlACKList->list.size); + if(dlDataToUlACKList->list.array == NULLP) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDlDataToUlAckList"); return RFAILED; + } + + for(arrIdx = 0; arrIdx < dlDataToUlACKList->list.count; arrIdx++) + { + DU_ALLOC(dlDataToUlACKList->list.array[arrIdx], sizeof(long)); + if(dlDataToUlACKList->list.array[arrIdx] == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDlDataToUlAckList"); + return RFAILED; + } } - srvCellCfg->initialDownlinkBWP = NULLP; - DU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t)); - if(!srvCellCfg->initialDownlinkBWP) + if(dlDataToUlAckDb == NULLP) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed"); - return RFAILED; + arrIdx = 0; + *(dlDataToUlACKList->list.array[arrIdx++]) = 1; + *(dlDataToUlACKList->list.array[arrIdx]) = 2; + } + else + { + for(arrIdx = 0; arrIdx < dlDataToUlACKList->list.count; arrIdx++) + { + *(dlDataToUlACKList->list.array[arrIdx]) = dlDataToUlAckDb->dlDataToUlAckList[arrIdx]; + } } + return ROK; +} - if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK) +/******************************************************************* + * + * @brief Builds BWP UL dedicated PUCCH Config + * + * @details + * + * Function : BuildBWPUlDedPucchCfg + * + * Functionality: + * Builds BWP UL dedicated PUCCH Config + * + * @params[in] : PUCCH_Config_t *pucchCfg + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t BuildBWPUlDedPucchCfg(PucchCfg *pucchCfgDb, PUCCH_Config_t *pucchCfg) +{ + PucchResrcSetCfg *rsrcSetCfgDb = NULLP; + PucchResrcCfg *rsrcCfgDb = NULLP; + PucchFormatCfg *format1Db = NULLP; + PucchFormatCfg *format2Db = NULLP; + PucchFormatCfg *format3Db = NULLP; + PucchFormatCfg *format4Db = NULLP; + PucchSchedReqCfg *schReqDb = NULLP; + PucchMultiCsiCfg *multiCsiDb = NULLP; + PucchDlDataToUlAck *dlDataToUlAckDb = NULLP; + + if(pucchCfgDb) + { + rsrcSetCfgDb = pucchCfgDb->resrcSet; + rsrcCfgDb = pucchCfgDb->resrc; + format1Db = pucchCfgDb->format1; + format2Db = pucchCfgDb->format2; + format3Db = pucchCfgDb->format3; + format4Db = pucchCfgDb->format4; + schReqDb = pucchCfgDb->schedReq; + multiCsiDb = pucchCfgDb->multiCsiCfg; + dlDataToUlAckDb = pucchCfgDb->dlDataToUlAck; + } + + /* RESOURCE SET */ + DU_ALLOC(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList)); + if(pucchCfg->resourceSetToAddModList == NULL) { - DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg"); return RFAILED; } - srvCellCfg->downlinkBWP_ToReleaseList = NULLP; - srvCellCfg->downlinkBWP_ToAddModList = NULLP; - srvCellCfg->firstActiveDownlinkBWP_Id = NULLP; - DU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long)); - if(!srvCellCfg->firstActiveDownlinkBWP_Id) + if(BuildPucchRsrcSetAddModList(rsrcSetCfgDb, pucchCfg->resourceSetToAddModList) != ROK) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg"); return RFAILED; } - *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID; - - srvCellCfg->bwp_InactivityTimer = NULLP; - srvCellCfg->defaultDownlinkBWP_Id = NULLP; - DU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long)); - if(!srvCellCfg->defaultDownlinkBWP_Id) + /* PUCCH RESOURCE */ + DU_ALLOC(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList)); + if(pucchCfg->resourceToAddModList == NULLP) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg"); return RFAILED; } - *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID; - srvCellCfg->uplinkConfig = NULLP; - DU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t)); - if(!srvCellCfg->uplinkConfig) + if(BuildPucchRsrcAddModList(rsrcCfgDb, pucchCfg->resourceToAddModList) != ROK) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg"); return RFAILED; } - if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK) + /* PUCCH Format 1 */ + DU_ALLOC(pucchCfg->format1, sizeof(struct PUCCH_Config__format1)); + if(pucchCfg->format1 == NULLP) { - DU_LOG("\nERROR --> F1AP : BuildUlCfg failed"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg"); return RFAILED; } - srvCellCfg->supplementaryUplink = NULLP; - srvCellCfg->pdcch_ServingCellConfig = NULLP; - - srvCellCfg->pdsch_ServingCellConfig = NULLP; - DU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig)); - if(!srvCellCfg->pdsch_ServingCellConfig) + + pucchCfg->format1->present = PUCCH_Config__format1_PR_setup; + DU_ALLOC(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t)); + if(pucchCfg->format1->choice.setup == NULLP) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg"); return RFAILED; } - if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK) + if(BuildPucchFormat(format1Db, pucchCfg->format1->choice.setup) != ROK) { - DU_LOG("\nERROR --> F1AP : BuildPdschSrvCellCfg failed"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg"); return RFAILED; } - srvCellCfg->csi_MeasConfig = NULLP; -#if 0 - DU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig)) - if(!srvCellCfg->csi_MeasConfig) + /* PUCCH Format 2 */ + if(format2Db) + { + DU_ALLOC(pucchCfg->format2, sizeof(struct PUCCH_Config__format2)); + if(pucchCfg->format2 == NULLP) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed"); - return RFAILED; + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg"); + return RFAILED; } - if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK) + pucchCfg->format2->present = PUCCH_Config__format2_PR_setup; + DU_ALLOC(pucchCfg->format2->choice.setup, sizeof(PUCCH_FormatConfig_t)); + if(pucchCfg->format2->choice.setup == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg"); + return RFAILED; + } + + if(BuildPucchFormat(format2Db, pucchCfg->format2->choice.setup) != ROK) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg"); + return RFAILED; + } + } + + /* PUCCH Format 3 */ + if(format3Db) { - DU_LOG("\nF1AP : BuildCsiMeasCfg failed"); - return RFAILED; + DU_ALLOC(pucchCfg->format3, sizeof(struct PUCCH_Config__format3)); + if(pucchCfg->format3 == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg"); + return RFAILED; + } + + pucchCfg->format3->present = PUCCH_Config__format3_PR_setup; + DU_ALLOC(pucchCfg->format3->choice.setup, sizeof(PUCCH_FormatConfig_t)); + if(pucchCfg->format3->choice.setup == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg"); + return RFAILED; + } + + if(BuildPucchFormat(format3Db, pucchCfg->format3->choice.setup) != ROK) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg"); + return RFAILED; + } } -#endif - srvCellCfg->sCellDeactivationTimer = NULLP; - srvCellCfg->crossCarrierSchedulingConfig = NULLP; - srvCellCfg->tag_Id = TAG_ID; - srvCellCfg->dummy = NULLP; - srvCellCfg->pathlossReferenceLinking = NULLP; - srvCellCfg->servingCellMO = NULLP; - srvCellCfg->ext1 = NULLP; - return ROK; -} -/******************************************************************* - * - * @brief Builds Spcell config - * - * @details - * - * Function : BuildSpCellCfg - * - * Functionality: Builds sp cell config in DuToCuRrcContainer - * - * @params[in] SpCellConfig_t spCellCfg - * - * @return ROK - success - * RFAILED - failure - * - * ****************************************************************/ -uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg) -{ + /* PUCCH Format 4 */ + if(format4Db) + { + DU_ALLOC(pucchCfg->format4, sizeof(struct PUCCH_Config__format4)); + if(pucchCfg->format4 == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg"); + return RFAILED; + } - spCellCfg->servCellIndex = NULLP; - DU_ALLOC(spCellCfg->servCellIndex, sizeof(long)); - if(!spCellCfg->servCellIndex) + pucchCfg->format4->present = PUCCH_Config__format4_PR_setup; + DU_ALLOC(pucchCfg->format4->choice.setup, sizeof(PUCCH_FormatConfig_t)); + if(pucchCfg->format4->choice.setup == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg"); + return RFAILED; + } + + if(BuildPucchFormat(format4Db, pucchCfg->format4->choice.setup) != ROK) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg"); + return RFAILED; + } + } + + /* Scheduling Request */ + if(schReqDb && (schReqDb->schedAddModListCount != 0)) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg"); - return RFAILED; + pucchCfg->schedulingRequestResourceToAddModList = NULLP; + DU_ALLOC(pucchCfg->schedulingRequestResourceToAddModList, sizeof(struct PUCCH_Config__schedulingRequestResourceToAddModList)); + if(pucchCfg->schedulingRequestResourceToAddModList == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg"); + return RFAILED; + } + + if(BuildPucchSchReqAddModList(schReqDb, pucchCfg->schedulingRequestResourceToAddModList) != ROK) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg"); + return RFAILED; + } } - *(spCellCfg->servCellIndex) = SERV_CELL_IDX; - spCellCfg->reconfigurationWithSync = NULLP; - spCellCfg->rlf_TimersAndConstants = NULLP; - spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP; - DU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long)); - if(!spCellCfg->rlmInSyncOutOfSyncThreshold) + /* Multi CSI */ + if(multiCsiDb && (multiCsiDb->multiCsiResrcListCount != 0)) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg"); - return RFAILED; + pucchCfg->multi_CSI_PUCCH_ResourceList = NULLP; + DU_ALLOC(pucchCfg->multi_CSI_PUCCH_ResourceList, sizeof(struct PUCCH_Config__multi_CSI_PUCCH_ResourceList)); + if(pucchCfg->multi_CSI_PUCCH_ResourceList == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg"); + return RFAILED; + } + + if(BuildPucchMultiCsiRsrcList(multiCsiDb, pucchCfg->multi_CSI_PUCCH_ResourceList) != ROK) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg"); + return RFAILED; + } } - *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD; - spCellCfg->spCellConfigDedicated = NULLP; - DU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t)); - if(!spCellCfg->spCellConfigDedicated) + /* DL DATA TO UL ACK */ + DU_ALLOC(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK)); + if(pucchCfg->dl_DataToUL_ACK == NULLP) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg"); return RFAILED; } - if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK) + + if(BuildDlDataToUlAckList(dlDataToUlAckDb, pucchCfg->dl_DataToUL_ACK) != ROK) { - DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg"); return RFAILED; } + + /* TODO : spatial relation info add/mod list and power control*/ + return ROK; } + /******************************************************************* * - * @brief Builds Phy cell group config + * @brief Fills SRS resource to add/modify list * * @details * - * Function : BuildPhyCellGrpCfg - * - * Functionality: Builds Phy cell group config in DuToCuRrcContainer + * Function : BuildSrsRsrcAddModList * - * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg + * Functionality: Fills SRS resource to add/modify list * + * @params[in] * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg) +uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList) { - phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP; - phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP; + uint8_t elementCnt; + uint8_t rsrcIdx; - phyCellGrpCfg->p_NR_FR1 = NULLP; - DU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long)); - if(!phyCellGrpCfg->p_NR_FR1) + elementCnt = 1; + resourceList->list.count = elementCnt; + resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *); + resourceList->list.array = NULLP; + DU_ALLOC(resourceList->list.array, resourceList->list.size); + if(!resourceList->list.array) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcAddModList"); return RFAILED; } - *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1; - phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK; - phyCellGrpCfg->tpc_SRS_RNTI = NULLP; - phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP; - phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP; - phyCellGrpCfg->sp_CSI_RNTI = NULLP; - phyCellGrpCfg->cs_RNTI = NULLP; - phyCellGrpCfg->ext1 = NULLP; - phyCellGrpCfg->ext2 = NULLP; - return ROK; -} -/******************************************************************* - * - * @brief Builds Mac cell group config - * - * @details - * - * Function : BuildMacCellGrpCfg - * - * Functionality: Builds Mac cell group config in DuToCuRrcContainer - * - * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg - * - * @return ROK - success - * RFAILED - failure - * - * ****************************************************************/ -uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg) -{ - macCellGrpCfg->drx_Config = NULLP; - macCellGrpCfg->schedulingRequestConfig = NULLP; - DU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig)); - if(!macCellGrpCfg->schedulingRequestConfig) + for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg"); + DU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t)); + if(!resourceList->list.array[rsrcIdx]) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcAddModList"); + return RFAILED; + } + } + + rsrcIdx = 0; + resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID; + resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1; + resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2; + + resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP; + DU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \ + sizeof(struct SRS_Resource__transmissionComb__n2)); + if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcAddModList"); return RFAILED; } + resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\ + = SRS_COMB_OFFSET_N2; + resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\ + = SRS_CYCLIC_SHIFT_N2; + + resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = \ + PUSCH_START_SYMBOL; + resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \ + SRS_Resource__resourceMapping__nrofSymbols_n1; + resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \ + SRS_Resource__resourceMapping__repetitionFactor_n1; + + resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS; + resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT; + resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS; + resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS; + resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP; + resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \ + SRS_Resource__groupOrSequenceHopping_neither; - if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK) + /* Setting resource type to aperiodic for intergration purposes */ + resourceList->list.array[rsrcIdx]->resourceType.present = \ + SRS_Resource__resourceType_PR_aperiodic; + resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP; + DU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic, + sizeof(struct SRS_Resource__resourceType__aperiodic)); + if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic) { - DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcAddModList"); return RFAILED; } + resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID; - macCellGrpCfg->bsr_Config = NULLP; - DU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config)); - if(!macCellGrpCfg->bsr_Config) + return ROK; +} + +/******************************************************************* + * + * @brief Build SRS resource set Add/mod list + * + * @details + * + * Function : BuildSrsRsrcSetAddModList + * + * Functionality: Build SRS resource set Add/mod list + * + * @params[in] + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ + uint8_t BuildSrsRsrcSetAddModList +( + struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList + ) +{ + uint8_t elementCnt; + uint8_t rSetIdx; + uint8_t rsrcIdx; + struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList; + + elementCnt = 1; + rsrcSetList->list.count = elementCnt; + rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *); + rsrcSetList->list.array = NULLP; + DU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size); + if(!rsrcSetList->list.array) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList"); return RFAILED; } - if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK) + for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++) { - DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed"); + DU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t)); + if(!rsrcSetList->list.array[rSetIdx]) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList"); + return RFAILED; + } + } + + rSetIdx = 0; + rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID; + + /* Fill Resource Id list in resource set */ + rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP; + DU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\ + sizeof(struct SRS_ResourceSet__srs_ResourceIdList)); + if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList"); return RFAILED; } - macCellGrpCfg->tag_Config = NULLP; - DU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config)); - if(!macCellGrpCfg->tag_Config) + elementCnt = 1; + rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList; + rsrcIdList->list.count = elementCnt; + rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *); + rsrcIdList->list.array = NULLP; + DU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size); + if(!rsrcIdList->list.array) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList"); return RFAILED; } - if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK) + for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++) { - DU_LOG("\nERROR --> F1AP : BuildTagConfig failed"); + DU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t)); + if(!rsrcIdList->list.array[rsrcIdx]) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList"); + return RFAILED; + } + } + + rsrcIdx = 0; + *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID; + + /* Fill resource type */ + rsrcSetList->list.array[rSetIdx]->resourceType.present = \ + SRS_ResourceSet__resourceType_PR_aperiodic; + + rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP; + DU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \ + sizeof(struct SRS_ResourceSet__resourceType__aperiodic)); + if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList"); return RFAILED; } + rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \ + = APERIODIC_SRS_RESRC_TRIGGER; - macCellGrpCfg->phr_Config = NULLP; - DU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config)); - if(!macCellGrpCfg->phr_Config) + /* TODO : Fill values for below IEs as expected by Viavi */ + rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP; + rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP; + + + rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook; + rsrcSetList->list.array[rSetIdx]->alpha = NULLP; + rsrcSetList->list.array[rSetIdx]->p0 = NULLP; + rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP; + rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP; + + return ROK; +} + +/******************************************************************* + * + * @brief Builds BWP UL dedicated SRS Config + * + * @details + * + * Function : BuildBWPUlDedSrsCfg + * + * Functionality: Builds BWP UL dedicated SRS Config + * + * @params[in] SRS Config + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg) +{ + srsCfg->srs_ResourceSetToReleaseList = NULLP; + srsCfg->srs_ResourceSetToAddModList = NULLP; + DU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \ + sizeof(struct SRS_Config__srs_ResourceSetToAddModList)); + if(!srsCfg->srs_ResourceSetToAddModList) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedSrsCfg"); + return RFAILED; + } + if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg"); return RFAILED; } - if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK) + srsCfg->srs_ResourceToReleaseList = NULLP; + + /* Resource to Add/Modify list */ + srsCfg->srs_ResourceToAddModList = NULLP; + DU_ALLOC(srsCfg->srs_ResourceToAddModList, \ + sizeof(struct SRS_Config__srs_ResourceToAddModList)); + if(!srsCfg->srs_ResourceToAddModList) { - DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed"); + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedSrsCfg"); return RFAILED; } - macCellGrpCfg->skipUplinkTxDynamic = false; - macCellGrpCfg->ext1 = NULLP; + if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK) + { + return RFAILED; + } + + srsCfg->tpc_Accumulation = NULLP; return ROK; } + + + /******************************************************************* * - * @brief Frees memeory allocated for SearchSpcToAddModList + * @brief Builds Pusch Serving cell Config * * @details * - * Function : FreeSearchSpcToAddModList + * Function : BuildPuschSrvCellCfg * - * Functionality: Deallocating memory of SearchSpcToAddModList + * Functionality: Builds Pusch Serving cell Config * - * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList + * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg * - * @return void + * @return ROK - success + * RFAILED - failure * - 4221 * ****************************************************************/ -void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList) + * ****************************************************************/ +uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg) { - uint8_t idx1=0; - uint8_t idx2=0; - struct SearchSpace *searchSpc=NULLP; + puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup; + puschCfg->choice.setup = NULLP; + DU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig)); + if(!puschCfg->choice.setup) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg"); + return RFAILED; + } - if(searchSpcList->list.array) + puschCfg->choice.setup->codeBlockGroupTransmission = NULLP; + 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) { - if(searchSpcList->list.array[idx2]) - { - searchSpc = searchSpcList->list.array[idx2]; - if(searchSpc->controlResourceSetId) - { - if(searchSpc->monitoringSlotPeriodicityAndOffset) - { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg"); + return RFAILED; + } + + puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP; + DU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long)); + if(!puschCfg->choice.setup->ext1->maxMIMO_Layers) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg"); + return RFAILED; + } + *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS; + + puschCfg->choice.setup->ext1->processingType2Enabled= NULLP; + DU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t)); + if(!puschCfg->choice.setup->ext1->processingType2Enabled) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg"); + return RFAILED; + } + *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED; + return ROK; +} + +/******************************************************************* + * + * @brief Builds inital UL BWP + * + * @details + * + * Function : BuildInitialUlBWP + * + * Functionality: Builds initial UL BWP + * + * @params[in] BWP_UplinkDedicated_t *ulBwp + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t BuildInitialUlBWP(InitialUlBwp *initUlBwp, BWP_UplinkDedicated_t *ulBwp) +{ + PucchCfg *pucchCfg = NULLP; + PuschCfg *puschCfg = NULLP; + + if(initUlBwp) + { + if(initUlBwp->pucchPresent) + pucchCfg = &initUlBwp->pucchCfg; + if(initUlBwp->puschPresent) + puschCfg = &initUlBwp->puschCfg; + } + + ulBwp->pucch_Config = NULLP; + DU_ALLOC(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config)); + if(!ulBwp->pucch_Config) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP"); + return RFAILED; + } + + ulBwp->pucch_Config->present = BWP_UplinkDedicated__pucch_Config_PR_setup; + ulBwp->pucch_Config->choice.setup = NULLP; + DU_ALLOC(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t)); + if(!ulBwp->pucch_Config->choice.setup) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP"); + return RFAILED; + } + + if(BuildBWPUlDedPucchCfg(pucchCfg, ulBwp->pucch_Config->choice.setup) != ROK) + { + return RFAILED; + } + + /* Fill BWP UL dedicated PUSCH config */ + ulBwp->pusch_Config = NULLP; + DU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config)); + if(!ulBwp->pusch_Config) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP"); + return RFAILED; + } + + ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup; + ulBwp->pusch_Config->choice.setup = NULLP; + DU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t)); + if(!ulBwp->pusch_Config->choice.setup) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP"); + return RFAILED; + } + + if(BuildBWPUlDedPuschCfg(puschCfg, ulBwp->pusch_Config->choice.setup) != ROK) + { + return RFAILED; + } + + ulBwp->configuredGrantConfig = NULLP; + + /* Fill BPW UL dedicated SRS config */ + ulBwp->srs_Config = NULLP; + DU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config)); + if(!ulBwp->srs_Config) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP"); + return RFAILED; + } + + ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup; + ulBwp->srs_Config->choice.setup = NULLP; + DU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t)); + if(!ulBwp->srs_Config->choice.setup) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP"); + return RFAILED; + } + + if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK) + { + return RFAILED; + } + + ulBwp->beamFailureRecoveryConfig = NULLP; + + return ROK; +} + +/******************************************************************* + * + * @brief Builds UL config + * @details + * + * Function : BuildUlCfg + * + * Functionality: Builds UL config in spCellCfgDed + * + * @params[in] UplinkConfig_t *ulCfg + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t BuildUlCfg(ServCellCfgInfo *servCellCfg, UplinkConfig_t *ulCfg) +{ + InitialUlBwp *initUlBwp = NULLP; + + if(servCellCfg) + { + initUlBwp = &servCellCfg->initUlBwp; + } + + ulCfg->initialUplinkBWP = NULLP; + DU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t)); + if(!ulCfg->initialUplinkBWP) + { + DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg"); + return RFAILED; + } + + if(BuildInitialUlBWP(initUlBwp, ulCfg->initialUplinkBWP) != ROK) + { + return RFAILED; + } + + ulCfg->uplinkBWP_ToReleaseList = NULLP; + ulCfg->uplinkBWP_ToAddModList = NULLP; + ulCfg->firstActiveUplinkBWP_Id = NULLP; + DU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t)); + if(!ulCfg->firstActiveUplinkBWP_Id) + { + DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg"); + return RFAILED; + } + if(servCellCfg == NULLP) + *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID; + else + *(ulCfg->firstActiveUplinkBWP_Id) = servCellCfg->firstActvUlBwpId; + + ulCfg->pusch_ServingCellConfig = NULLP; + DU_ALLOC(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig)); + if(!ulCfg->pusch_ServingCellConfig) + { + DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg"); + return RFAILED; + } + + if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK) + { + return RFAILED; + } + + ulCfg->carrierSwitching = NULLP; + ulCfg->ext1 = NULLP; + return ROK; +} + +/******************************************************************* + * + * @brief Builds PDSCH serving cell config + * @details + * + * Function : BuildPdschSrvCellCfg + * + * Functionality: Builds PDSCH serving cell config in spCellCfgDed + * + * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t BuildPdschSrvCellCfg(PdschServCellCfg *pdschServCellDb, struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg) +{ + pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup; + pdschCfg->choice.setup = NULLP; + DU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig)); + if(!pdschCfg->choice.setup) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg"); + return RFAILED; + } + + /* Code Block Group Transmission */ + pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP; + if(pdschServCellDb && (pdschServCellDb->maxCodeBlkGrpPerTb || pdschServCellDb->codeBlkGrpFlushInd)) + { + DU_ALLOC(pdschCfg->choice.setup->codeBlockGroupTransmission, sizeof(struct PDSCH_ServingCellConfig__codeBlockGroupTransmission)); + if(pdschCfg->choice.setup->codeBlockGroupTransmission == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg"); + return RFAILED; + } + + pdschCfg->choice.setup->codeBlockGroupTransmission->present = PDSCH_ServingCellConfig__codeBlockGroupTransmission_PR_setup; + pdschCfg->choice.setup->codeBlockGroupTransmission->choice.setup = NULLP; + DU_ALLOC(pdschCfg->choice.setup->codeBlockGroupTransmission->choice.setup, sizeof(struct PDSCH_CodeBlockGroupTransmission )); + if(pdschCfg->choice.setup->codeBlockGroupTransmission->choice.setup == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg"); + return RFAILED; + } + + pdschCfg->choice.setup->codeBlockGroupTransmission->choice.setup->maxCodeBlockGroupsPerTransportBlock = \ + *(pdschServCellDb->maxCodeBlkGrpPerTb); + pdschCfg->choice.setup->codeBlockGroupTransmission->choice.setup->codeBlockGroupFlushIndicator = \ + *(pdschServCellDb->codeBlkGrpFlushInd); + } + + /* xOverhead */ + pdschCfg->choice.setup->xOverhead = NULLP; + if(pdschServCellDb && pdschServCellDb->xOverhead) + { + DU_ALLOC(pdschCfg->choice.setup->xOverhead, sizeof(long)); + if(pdschCfg->choice.setup->xOverhead == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg"); + return RFAILED; + } + *(pdschCfg->choice.setup->xOverhead) = *(pdschServCellDb->xOverhead); + } + + /* Number of HARQ processes */ + pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP; + DU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long)); + if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg"); + return RFAILED; + } + + if(pdschServCellDb == NULLP) + *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH) = PDSCH_NUM_HARQ_PROC; + else + *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH) = pdschServCellDb->numHarqProcForPdsch; + + pdschCfg->choice.setup->pucch_Cell = NULLP; + + /* Extension */ + pdschCfg->choice.setup->ext1 = NULLP; + if(pdschServCellDb && pdschServCellDb->maxMimoLayers) + { + DU_ALLOC(pdschCfg->choice.setup->ext1, sizeof(struct PDSCH_ServingCellConfig__ext1)); + if(pdschCfg->choice.setup->ext1 == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg"); + return RFAILED; + } + + DU_ALLOC(pdschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long)); + if(pdschCfg->choice.setup->ext1->maxMIMO_Layers == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg"); + return RFAILED; + } + *(pdschCfg->choice.setup->ext1->maxMIMO_Layers) = *(pdschServCellDb->maxMimoLayers); + } + + return ROK; +} + +/******************************************************************* + * + * @brief Builds CSI Meas config + * @details + * + * Function : BuildCsiMeasCfg + * + * Functionality: Builds CSI Meas config in spCellCfgDed + * + * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg) +{ + + return ROK; +} + +/******************************************************************* + * + * @brief Builds DL BWP to add/modify list + * @details + * + * Function : BuildDlBwpToAddModList + * + * Functionality: Builds DL BWP to add/modify list + * + * @params[in] ServCellCfgInfo *servCellCfg, + * struct ServingCellConfig__downlinkBWP_ToAddModList *dlBwpAddModList + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t BuildDlBwpToAddModList(ServCellCfgInfo *servCellCfg, struct ServingCellConfig__downlinkBWP_ToAddModList *dlBwpAddModList) +{ + uint8_t elementCnt, idx; + + elementCnt = servCellCfg->numDlBwpToAdd; + dlBwpAddModList->list.count = elementCnt; + dlBwpAddModList->list.size = elementCnt * sizeof(struct BWP_Downlink *); + dlBwpAddModList->list.array = NULLP; + DU_ALLOC(dlBwpAddModList->list.array, dlBwpAddModList->list.size); + if(dlBwpAddModList->list.array == NULLP) + { + DU_LOG("\nERROR --> DU APP: Memory allocation failure in BuildDlBwpToAddModList"); + return RFAILED; + } + + for(idx=0; idxlist.count; idx++) + { + DU_ALLOC(dlBwpAddModList->list.array[idx], sizeof(BWP_Downlink_t)); + if(dlBwpAddModList->list.array[idx] == NULLP) + { + DU_LOG("\nERROR --> DU APP: Memory allocation failure in BuildDlBwpToAddModList"); + return RFAILED; + } + } + + for(idx=0; idxlist.count; idx++) + { + dlBwpAddModList->list.array[idx]->bwp_Id = servCellCfg->DlBwpToAddList[idx].bwpId; + dlBwpAddModList->list.array[idx]->bwp_Common = NULLP; + dlBwpAddModList->list.array[idx]->bwp_Dedicated = NULLP; + } + return ROK; +} + +/******************************************************************* + * + * @brief Builds Spcell config dedicated + * @details + * + * Function : BuildSpCellCfgDed + * + * Functionality: Builds sp cell config dedicated in spCellCfg + * + * @params[in] ServingCellConfig_t srvCellCfg + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t BuildSpCellCfgDed(DuUeCb *ueCb, ServingCellConfig_t *srvCellCfg) +{ + ServCellCfgInfo *servCellCfg = NULLP; + InitialDlBwp *initDlBwp = NULLP; + PdschServCellCfg *pdschServCellDb = NULLP; + + if(ueCb) + { + servCellCfg = &ueCb->macUeCfg.spCellCfg.servCellCfg; + initDlBwp = &servCellCfg->initDlBwp; + pdschServCellDb = &servCellCfg->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)); + if(!srvCellCfg->initialDownlinkBWP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed"); + return RFAILED; + } + + if(BuildInitialDlBWP(initDlBwp, srvCellCfg->initialDownlinkBWP) != ROK) + { + DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed"); + return RFAILED; + } + + srvCellCfg->downlinkBWP_ToReleaseList = NULLP; + + srvCellCfg->downlinkBWP_ToAddModList = NULLP; + if(ueCb && ueCb->macUeCfg.spCellCfg.servCellCfg.numDlBwpToAdd) + { + DU_ALLOC(srvCellCfg->downlinkBWP_ToAddModList, sizeof(struct ServingCellConfig__downlinkBWP_ToAddModList)); + if(srvCellCfg->downlinkBWP_ToAddModList == NULLP) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed"); + return RFAILED; + } + + if(BuildDlBwpToAddModList(&ueCb->macUeCfg.spCellCfg.servCellCfg, srvCellCfg->downlinkBWP_ToAddModList) != ROK) + { + DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed"); + return RFAILED; + } + } + + srvCellCfg->firstActiveDownlinkBWP_Id = NULLP; + DU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long)); + if(!srvCellCfg->firstActiveDownlinkBWP_Id) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed"); + return RFAILED; + } + if(ueCb == NULLP) + *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID; + else + *(srvCellCfg->firstActiveDownlinkBWP_Id) = ueCb->macUeCfg.spCellCfg.servCellCfg.firstActvDlBwpId; + + srvCellCfg->bwp_InactivityTimer = NULLP; + + srvCellCfg->defaultDownlinkBWP_Id = NULLP; + DU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long)); + if(!srvCellCfg->defaultDownlinkBWP_Id) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed"); + return RFAILED; + } + if(ueCb == NULLP) + *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID; + else + *(srvCellCfg->defaultDownlinkBWP_Id) = ueCb->macUeCfg.spCellCfg.servCellCfg.defaultDlBwpId; + + srvCellCfg->uplinkConfig = NULLP; + DU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t)); + if(!srvCellCfg->uplinkConfig) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed"); + return RFAILED; + } + + if(BuildUlCfg(servCellCfg, srvCellCfg->uplinkConfig) != ROK) + { + DU_LOG("\nERROR --> F1AP : BuildUlCfg failed"); + return RFAILED; + } + srvCellCfg->supplementaryUplink = NULLP; + srvCellCfg->pdcch_ServingCellConfig = NULLP; + + srvCellCfg->pdsch_ServingCellConfig = NULLP; + DU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig)); + if(!srvCellCfg->pdsch_ServingCellConfig) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed"); + return RFAILED; + } + + if(BuildPdschSrvCellCfg(pdschServCellDb, srvCellCfg->pdsch_ServingCellConfig) != ROK) + { + DU_LOG("\nERROR --> F1AP : BuildPdschSrvCellCfg failed"); + return RFAILED; + } + + srvCellCfg->csi_MeasConfig = NULLP; +#if 0 + DU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig)) + if(!srvCellCfg->csi_MeasConfig) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed"); + return RFAILED; + } + + if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK) + { + DU_LOG("\nF1AP : BuildCsiMeasCfg failed"); + return RFAILED; + } +#endif + srvCellCfg->sCellDeactivationTimer = NULLP; + srvCellCfg->crossCarrierSchedulingConfig = NULLP; + srvCellCfg->tag_Id = TAG_ID; + srvCellCfg->dummy = NULLP; + srvCellCfg->pathlossReferenceLinking = NULLP; + srvCellCfg->servingCellMO = NULLP; + srvCellCfg->ext1 = NULLP; + + return ROK; +} + +/******************************************************************* + * + * @brief Fills SCS specific carrier list in DL frequency info + * + * @details + * + * Function : BuildScsSpecificCarrierListDl + * + * Functionality: Fills SCS specific carrier list in DL frequency info + * + * @params[in] Pointer to struct FrequencyInfoDL__scs_SpecificCarrierList + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t BuildScsSpecificCarrierListDl(struct FrequencyInfoDL__scs_SpecificCarrierList *scsCarrierList) +{ + uint8_t elementCnt = 0, listIdx = 0; + ScsSpecCarrier duScsSpecCarrier = duCfgParam.sib1Params.srvCellCfgCommSib.dlCfg.dlScsCarrier; + + elementCnt = ODU_VALUE_ONE; + scsCarrierList->list.count = elementCnt; + scsCarrierList->list.size = elementCnt * sizeof(SCS_SpecificCarrier_t *); + + DU_ALLOC(scsCarrierList->list.array, scsCarrierList->list.size); + if(!scsCarrierList->list.array) + { + DU_LOG("\nERROR --> DU APP : Memory allocation failed for scs carrier list array \ + in BuildScsSpecificCarrierListDl()"); + return RFAILED; + } + + for(listIdx = 0; listIdx < elementCnt; listIdx++) + { + DU_ALLOC(scsCarrierList->list.array[listIdx], sizeof(SCS_SpecificCarrier_t)); + if(!scsCarrierList->list.array[listIdx]) + { + DU_LOG("\nERROR --> DU APP : Memory allocation failed for SCS Specific Carrier list array \ + element in BuildScsSpecificCarrierListDl()"); + return RFAILED; + } + } + + listIdx = 0; + scsCarrierList->list.array[listIdx]->offsetToCarrier = duScsSpecCarrier.scsOffset; + scsCarrierList->list.array[listIdx]->subcarrierSpacing = duScsSpecCarrier.scs; + scsCarrierList->list.array[listIdx]->carrierBandwidth = duScsSpecCarrier.scsBw; + + return ROK; +} + +/******************************************************************* + * + * @brief Fills DL frequency info in DL config common + * + * @details + * + * Function : BuildFreqInfoDl + * + * Functionality: Fills DL frequency info in DL config common + * + * @params[in] Pointer to DownlinkConfigCommon_t + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t BuildFreqInfoDl(FrequencyInfoDL_t *frequencyInfoDL) +{ + uint8_t freqBandIdx = 0, elementCnt = 0; + DlCfgCommon dlCfg = duCfgParam.sib1Params.srvCellCfgCommSib.dlCfg; + + /* TODO : Fill SSB Absolute Frequency */ + /* + DU_ALLOC(frequencyInfoDL->absoluteFrequencySSB, sizeof(ARFCN_ValueNR_t)); + if(!frequencyInfoDL->absoluteFrequencySSB) + { + DU_LOG("\nERROR --> DU APP : Memory allocation failed for SSB Absolute Frequency in BuildFreqInfoDl()"); + return RFAILED; + } + frequencyInfoDL->absoluteFrequencySSB = ?; + */ + + /* NR Multi Frequency Band List */ + elementCnt = ODU_VALUE_ONE; + frequencyInfoDL->frequencyBandList.list.count = elementCnt; + frequencyInfoDL->frequencyBandList.list.size = elementCnt * sizeof(FreqBandIndicatorNR_t *); + + DU_ALLOC(frequencyInfoDL->frequencyBandList.list.array, frequencyInfoDL->frequencyBandList.list.size); + if(!frequencyInfoDL->frequencyBandList.list.array) + { + DU_LOG("\nERROR --> DU APP : Memory allocation failed for Frequency Band List array in BuildFreqInfoDl()"); + return RFAILED; + } + + for(freqBandIdx = 0; freqBandIdx < elementCnt; freqBandIdx++) + { + DU_ALLOC(frequencyInfoDL->frequencyBandList.list.array[freqBandIdx], sizeof(FreqBandIndicatorNR_t)); + if(!frequencyInfoDL->frequencyBandList.list.array[freqBandIdx]) + { + DU_LOG("\nERROR --> DU APP : Memory allocation failed for frequency band array element in BuildFreqInfoDl()"); + return RFAILED; + } + } + + freqBandIdx = 0; + *(frequencyInfoDL->frequencyBandList.list.array[freqBandIdx]) = dlCfg.freqBandInd; + + /* TODO : Absolute Frequency to Point A */ + //frequencyInfoDL->absoluteFrequencyPointA + + /* Subcarrier Spacing specifc carrier List */ + if((BuildScsSpecificCarrierListDl(&frequencyInfoDL->scs_SpecificCarrierList)) != ROK) + { + DU_LOG("\nERROR --> DU APP : Failed to fill SCS specific carrier list DL in BuildFreqInfoDl()"); + return RFAILED; + } + + return ROK; + +} + +/******************************************************************* + * + * @brief Fills DL config common in Serving cell config common + * + * @details + * + * Function : BuildDlConfigCommon + * + * Functionality: Fills DL config common in Serving cell config common + * + * @params[in] Pointer to DownlinkConfigCommon_t + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t BuildDlConfigCommon(DownlinkConfigCommon_t *dlCfgCommon) +{ + /* DL Frequency Info */ + DU_ALLOC(dlCfgCommon->frequencyInfoDL, sizeof(FrequencyInfoDL_t)); + if(!dlCfgCommon->frequencyInfoDL) + { + DU_LOG("\nERROR --> DU APP : Memory allocation failed for DL frequency info in BuildDlConfigCommon()"); + return RFAILED; + } + if((BuildFreqInfoDl(dlCfgCommon->frequencyInfoDL))!= ROK) + { + DU_LOG("\nERROR --> DU APP : Failed to fill DL frequency info in BuildDlConfigCommon()"); + return RFAILED; + } + + /* DL BWP config common */ + DU_ALLOC(dlCfgCommon->initialDownlinkBWP, sizeof(BWP_DownlinkCommon_t)); + if(!dlCfgCommon->initialDownlinkBWP) + { + DU_LOG("\nERROR --> DU APP : Memory allocation failed for DL BWP config common in BuildDlConfigCommon()"); + return RFAILED; + } + if((BuildBwpDlCommon(dlCfgCommon->initialDownlinkBWP)) != ROK) + { + DU_LOG("\nERROR --> DU APP : Failed to fill DL DWP config common in BuildDlConfigCommon()"); + return RFAILED; + } + + return ROK; +} + +/******************************************************************* + * + * @brief Fills SCS specific carrier list in UL frequency Info + * + * @details + * + * Function : BuildScsSpecificCarrierListUl + * + * Functionality: Fills SCS specific carrier list in UL frequency Info + * + * @params[in] Pointer to struct FrequencyInfoUL__scs_SpecificCarrierList + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t BuildScsSpecificCarrierListUl(struct FrequencyInfoUL__scs_SpecificCarrierList *scsCarrierList) +{ + uint8_t elementCnt = 0, listIdx = 0; + ScsSpecCarrier duScsSpecCarrier = duCfgParam.sib1Params.srvCellCfgCommSib.ulCfg.ulScsCarrier; + + elementCnt = ODU_VALUE_ONE; + scsCarrierList->list.count = elementCnt; + scsCarrierList->list.size = elementCnt * sizeof(SCS_SpecificCarrier_t *); + + DU_ALLOC(scsCarrierList->list.array, scsCarrierList->list.size); + if(!scsCarrierList->list.array) + { + DU_LOG("\nERROR --> DU APP : SCS Specific Carrier list memory allocation failed"); + return RFAILED; + } + + for(listIdx = 0; listIdx < scsCarrierList->list.count; listIdx++) + { + DU_ALLOC(scsCarrierList->list.array[listIdx], sizeof(SCS_SpecificCarrier_t)); + if(!scsCarrierList->list.array[listIdx]) + { + DU_LOG("\nERROR --> DU APP : SCS Specific Carrier list memory allocation failed"); + return RFAILED; + } + } + listIdx = 0; + scsCarrierList->list.array[listIdx]->offsetToCarrier = duScsSpecCarrier.scsOffset; + scsCarrierList->list.array[listIdx]->subcarrierSpacing = duScsSpecCarrier.scs; + scsCarrierList->list.array[listIdx]->carrierBandwidth = duScsSpecCarrier.scsBw; + + return ROK; +} + +/******************************************************************* + * + * @brief Fills frequency info in UL config common + * + * @details + * + * Function : BuildFreqInfoUl + * + * Functionality: Fills frequency info in UL config common + * + * @params[in] Pointer to FrequencyInfoUL_t + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t BuildFreqInfoUl(FrequencyInfoUL_t *frequencyInfoUL) +{ + uint8_t elementCnt = 0, listIdx= 0; + UlCfgCommon ulCfg = duCfgParam.sib1Params.srvCellCfgCommSib.ulCfg; + + /* NR Multi Frequency Band List */ + DU_ALLOC(frequencyInfoUL->frequencyBandList, sizeof(MultiFrequencyBandListNR_t)); + if(!frequencyInfoUL->frequencyBandList) + { + DU_LOG("\nERROR --> DU APP : Memory allocation failed for frequency band list in BuildFreqInfoUl()"); + return RFAILED; + } + + elementCnt = ODU_VALUE_ONE; + frequencyInfoUL->frequencyBandList->list.count = elementCnt; + frequencyInfoUL->frequencyBandList->list.size = elementCnt * sizeof(FreqBandIndicatorNR_t *); + + DU_ALLOC(frequencyInfoUL->frequencyBandList->list.array, frequencyInfoUL->frequencyBandList->list.size); + if(!frequencyInfoUL->frequencyBandList->list.array) + { + DU_LOG("\nERROR --> DU APP : Memory allocation failed for frequency band array in BuildFreqInfoUl()"); + return RFAILED; + } + + for(listIdx = 0; listIdx < elementCnt; listIdx++) + { + DU_ALLOC(frequencyInfoUL->frequencyBandList->list.array[listIdx], sizeof(FreqBandIndicatorNR_t)); + if(!frequencyInfoUL->frequencyBandList->list.array[listIdx]) + { + DU_LOG("\nERROR --> DU APP : Memory allocation failed for frequency band array element in BuildFreqInfoUl()"); + return RFAILED; + } + } + + listIdx = 0; + *(frequencyInfoUL->frequencyBandList->list.array[listIdx]) = ulCfg.freqBandInd; + + /* TODO : Fill Absolute frequency point A */ + /* + DU_ALLOC(frequencyInfoUL->absoluteFrequencyPointA, sizeof(ARFCN_ValueNR_t)); + if(!frequencyInfoUL->absoluteFrequencyPointA) + { + DU_LOG("\nERROR --> DU APP : Memory allocation failed for absolute frequency point A in BuildFreqInfoUl()"); + return RFAILED; + } + *(frequencyInfoUL->absoluteFrequencyPointA) = ?; + */ + + /* Subcarrier Spacing specifc carrier */ + if((BuildScsSpecificCarrierListUl(&frequencyInfoUL->scs_SpecificCarrierList)) != ROK) + { + DU_LOG("\nERROR --> DU APP : Failed to fill SCS Specific Carrier list UL in BuildFreqInfoUl()"); + return RFAILED; + } + + /* P-MAX */ + DU_ALLOC(frequencyInfoUL->p_Max, sizeof(P_Max_t)); + if(!frequencyInfoUL->p_Max) + { + DU_LOG("\nERROR --> DU APP : UL Frequency Infoo memory allocation failure"); + return RFAILED; + } + *frequencyInfoUL->p_Max = ulCfg.pMax; + + return ROK; +} + +/******************************************************************* + * + * @brief Fills UL config common in Serving cell config common + * + * @details + * + * Function : BuildUlConfigCommon + * + * Functionality: Fills UL config common in Serving cell config common + * + * @params[in] Pointer to UplinkConfigCommon_t + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t BuildUlConfigCommon(UplinkConfigCommon_t *ulCfgCommon) +{ + /* UL Frequency Info */ + DU_ALLOC(ulCfgCommon->frequencyInfoUL, sizeof(FrequencyInfoUL_t)); + if(!ulCfgCommon->frequencyInfoUL) + { + DU_LOG("\nERROR --> DU APP : Memory allocation failed for UL frequency info in BuildUlConfigCommon()"); + return RFAILED; + } + + if((BuildFreqInfoUl(ulCfgCommon->frequencyInfoUL)) != ROK) + { + DU_LOG("\nERROR --> DU APP : Failed to fill frequency info UL in BuildUlConfigCommon()"); + return RFAILED; + } + + /* UL BWP common */ + DU_ALLOC(ulCfgCommon->initialUplinkBWP, sizeof(BWP_UplinkCommon_t)); + if(!ulCfgCommon->initialUplinkBWP) + { + DU_LOG("\nERROR --> DU APP : Memory allocation failed for initial UL BWP in BuildUlConfigCommon()"); + return RFAILED; + } + + if((BuildBwpUlCommon(ulCfgCommon->initialUplinkBWP)) != ROK) + { + DU_LOG("\nERROR --> DU APP : Failed to fill BWP UL common in BuildUlConfigCommon()"); + return RFAILED; + } + + /* Time Alignment timer */ + ulCfgCommon->dummy = duCfgParam.sib1Params.srvCellCfgCommSib.ulCfg.timeAlignTimerComm; + + return ROK; +} + +/******************************************************************* + * + * @brief Fills SSB position in burst in SP cell config common + * + * @details + * + * Function : BuildSsbPosInBurst + * + * Functionality: + * Fills SSB position in burst in SP cell config common + * + * @params[in] Pointer to struct ServingCellConfigCommon__ssb_PositionsInBurst + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t BuildSsbPosInBurst(struct ServingCellConfigCommon__ssb_PositionsInBurst *ssbPosInBurst) +{ + uint8_t bitStringSizeInBytes = 0; + + ssbPosInBurst->present = ServingCellConfigCommon__ssb_PositionsInBurst_PR_mediumBitmap; + + /* As per spec 38.331,in the definition of ServingCellConfigCommon */ + bitStringSizeInBytes = 1; + ssbPosInBurst->choice.mediumBitmap.size = bitStringSizeInBytes * sizeof(uint8_t); + + DU_ALLOC(ssbPosInBurst->choice.mediumBitmap.buf, ssbPosInBurst->choice.mediumBitmap.size); + if(!ssbPosInBurst->choice.mediumBitmap.buf) + { + DU_LOG("\nERROR --> DU APP : Memory Allocation failed for medium bit map buffer in BuildSsbPosInBurst()"); + return RFAILED; + } + + if((fillBitString(&ssbPosInBurst->choice.mediumBitmap, 0, bitStringSizeInBytes, \ + duCfgParam.sib1Params.srvCellCfgCommSib.ssbPosInBurst)) != ROK) + { + DU_LOG("\nERROR --> DU APP : Failed to fill medium bit map in BuildSsbPosInBurst()"); + return RFAILED; + } + + return ROK; +} + +/******************************************************************* + * + * @brief Fills SP cell config common in Reconfig with Sync + * + * @details + * + * Function : BuildSpCellConfigCommon + * + * Functionality: Fills SP cell config common in Reconfig with Sync + * + * @params[in] Pointer to ServingCellConfigCommon_t + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t BuildSpCellConfigCommon(ServingCellConfigCommon_t *spCellConfigCommon) +{ + /* Physical Cell Identity */ + DU_ALLOC(spCellConfigCommon->physCellId, sizeof(PhysCellId_t)); + if(!spCellConfigCommon->physCellId) + { + DU_LOG("\nERROR --> DU APP : Failed to allocate memory for physical cell id in BuildSpCellConfigCommon()"); + return RFAILED; + } + *(spCellConfigCommon->physCellId) = NR_PCI; + + /* Downlink Config Common */ + DU_ALLOC(spCellConfigCommon->downlinkConfigCommon, sizeof(DownlinkConfigCommon_t)); + if(!spCellConfigCommon->downlinkConfigCommon) + { + DU_LOG("\nERROR --> DU APP : Failed to allocate memory for DL Config Common in BuildSpCellConfigCommon()"); + return RFAILED; + } + if((BuildDlConfigCommon(spCellConfigCommon->downlinkConfigCommon)) != ROK) + { + DU_LOG("\nERROR --> DU APP : Failed to fill DL config commin in BuildSpCellConfigCommon()"); + return RFAILED; + } + + /* Uplinlink Config Common */ + DU_ALLOC(spCellConfigCommon->uplinkConfigCommon, sizeof(UplinkConfigCommon_t)); + if(!spCellConfigCommon->uplinkConfigCommon) + { + DU_LOG("\nERROR --> DU APP : Failed to allocate memory for UL Config Common in BuildSpCellConfigCommon()"); + return RFAILED; + } + if((BuildUlConfigCommon(spCellConfigCommon->uplinkConfigCommon)) != ROK) + { + DU_LOG("\nERROR --> DU APP : Failed to fill UL config commin in BuildSpCellConfigCommon()"); + return RFAILED; + } + + /* Timing Advance offset */ + DU_ALLOC(spCellConfigCommon->n_TimingAdvanceOffset, sizeof(long)); + if(!spCellConfigCommon->n_TimingAdvanceOffset) + { + DU_LOG("\nERROR --> DU APP : Failed to allocate memory for Timing Advance Offset in BuildSpCellConfigCommon()"); + return RFAILED; + } + *(spCellConfigCommon->n_TimingAdvanceOffset) = ServingCellConfigCommon__n_TimingAdvanceOffset_n0; + + /* SSB Position In Burst */ + DU_ALLOC(spCellConfigCommon->ssb_PositionsInBurst, sizeof(struct ServingCellConfigCommon__ssb_PositionsInBurst)); + if(!spCellConfigCommon->ssb_PositionsInBurst) + { + DU_LOG("\nERROR --> DU APP : Failed to allocate memory for SSB Position In Burst in BuildSpCellConfigCommon()"); + return RFAILED; + } + if((BuildSsbPosInBurst(spCellConfigCommon->ssb_PositionsInBurst)) != ROK) + { + DU_LOG("\nERROR --> DU APP : Failed to fill SSB Position In Burst in BuildSpCellConfigCommon()"); + return RFAILED; + } + + /* SSB Periodicity in Serving cell */ + DU_ALLOC(spCellConfigCommon->ssb_periodicityServingCell, sizeof(long)); + if(!spCellConfigCommon->ssb_periodicityServingCell) + { + DU_LOG("\nERROR --> DU APP : Failed to allocate memory for SSB Periodicity serving cell in \ + BuildSpCellConfigCommon()"); + return RFAILED; + } + *(spCellConfigCommon->ssb_periodicityServingCell) = \ + convertSsbPeriodicityValueToEnum(duCfgParam.sib1Params.srvCellCfgCommSib.ssbPrdServingCell); + + /* DMRS Type A position */ + spCellConfigCommon->dmrs_TypeA_Position = convertDmrsTypeAPosValueToEnum(duCfgParam.macCellCfg.dmrsTypeAPos); + + /* SSB subcarrier spacing */ + DU_ALLOC(spCellConfigCommon->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t)); + if(!spCellConfigCommon->ssbSubcarrierSpacing) + { + DU_LOG("\nERROR --> DU APP : Failed to allocate memory for sub-carrier spacing in BuildSpCellConfigCommon()"); + return RFAILED; + } + *(spCellConfigCommon->ssbSubcarrierSpacing) = duCfgParam.sib1Params.srvCellCfgCommSib.scs; + + /* TDD UL-DL configuration common */ + DU_ALLOC(spCellConfigCommon->tdd_UL_DL_ConfigurationCommon, sizeof(TDD_UL_DL_ConfigCommon_t)); + if(!spCellConfigCommon->tdd_UL_DL_ConfigurationCommon) + { + DU_LOG("\nERROR --> DU APP : Memory allocation failed for TDD UL-DL config common in BuildSpCellConfigCommon()"); + return RFAILED; + } + if((BuildTddUlDlCfgComm(spCellConfigCommon->tdd_UL_DL_ConfigurationCommon)) != ROK) + { + DU_LOG("\nERROR --> DU APP : Failed to fill TDD UL-DL config common in BuildSpCellConfigCommon()"); + return RFAILED; + } + + /* SS PBCH Block Power */ + spCellConfigCommon->ss_PBCH_BlockPower = duCfgParam.sib1Params.srvCellCfgCommSib.ssPbchBlockPwr; + + return ROK; +} + +/******************************************************************* + * + * @brief Fills dedicated RACH configuration in Reconfiguration with sync + * + * @details + * + * Function : BuildRecfgWithSync + * + * Functionality: + * Fills dedicated RACH configuration in Reconfiguration with sync + * + * @params[in] DU UE CB + * Pointer to Rach config dedicated struct + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t BuildRachConfigDedicated(DuUeCb *ueCb, struct ReconfigurationWithSync__rach_ConfigDedicated *rachCfgDed) +{ + uint8_t elementCnt = 0, listIdx = 0; + CFRA_t *cfra = NULLP; + struct CFRA__resources__ssb *ssbResource = NULLP; + RachCfgCommon duRachCfg = duCfgParam.sib1Params.srvCellCfgCommSib.ulCfg.rachCfg; + + rachCfgDed->present = ReconfigurationWithSync__rach_ConfigDedicated_PR_uplink; + + /* Uplink */ + DU_ALLOC(rachCfgDed->choice.uplink, sizeof(RACH_ConfigDedicated_t)); + if(!rachCfgDed->choice.uplink) + { + DU_LOG("\nERROR --> DU APP : Memory allocation failed for RACH uplink configuration in BuildRachConfigDedicated()"); + return RFAILED; + } + + /* CFRA : Contention free Random Access */ + DU_ALLOC(rachCfgDed->choice.uplink->cfra, sizeof(CFRA_t)); + if(!rachCfgDed->choice.uplink->cfra) + { + DU_LOG("\nERROR --> DU APP : Memory allocation failed for CFRA in BuildRachConfigDedicated()"); + return RFAILED; + } + cfra = rachCfgDed->choice.uplink->cfra; + + /* CFRA occassions */ + DU_ALLOC(cfra->occasions, sizeof(struct CFRA__occasions)); + if(!cfra->occasions) + { + DU_LOG("\nERROR --> DU APP : Memory allocation failed for CFRA occassion in BuildRachConfigDedicated()"); + return RFAILED; + } + + /* CFRA occassions : RACH generic configuration */ + cfra->occasions->rach_ConfigGeneric.prach_ConfigurationIndex = duRachCfg.prachCfgIdx; + cfra->occasions->rach_ConfigGeneric.msg1_FDM = duRachCfg.msg1Fdm; + cfra->occasions->rach_ConfigGeneric.msg1_FrequencyStart = duRachCfg.msg1FreqStart; + cfra->occasions->rach_ConfigGeneric.zeroCorrelationZoneConfig = duRachCfg.zeroCorrZoneCfg; + cfra->occasions->rach_ConfigGeneric.preambleReceivedTargetPower = duRachCfg.preambleRcvdTgtPwr; + cfra->occasions->rach_ConfigGeneric.preambleTransMax = duRachCfg.preambleTransMax; + cfra->occasions->rach_ConfigGeneric.powerRampingStep = duRachCfg.pwrRampingStep; + cfra->occasions->rach_ConfigGeneric.ra_ResponseWindow = duRachCfg.raRspWindow; + + /* CFRA occassions : SSB per RACH occasion */ + DU_ALLOC(cfra->occasions->ssb_perRACH_Occasion, sizeof(long)); + if(!cfra->occasions->ssb_perRACH_Occasion) + { + DU_LOG("\nERROR --> DU APP : Memory allocation failed for SSB per RACH occassion in BuildRachConfigDedicated()"); + return RFAILED; + } + *(cfra->occasions->ssb_perRACH_Occasion) = convertCFRASsbPerRachOccasionValueToEnum(duCfgParam.macCellCfg.prachCfg.ssbPerRach); + + /* CFRA resource */ + cfra->resources.present = CFRA__resources_PR_ssb; + + /* CFRA resource : SSB */ + DU_ALLOC(cfra->resources.choice.ssb, sizeof(struct CFRA__resources__ssb)); + if(!cfra->resources.choice.ssb) + { + DU_LOG("\nERROR --> DU APP : Memory allocation failed for CFRA resource - SSB in BuildRachConfigDedicated()"); + return RFAILED; + } + ssbResource = cfra->resources.choice.ssb; + + /* CFRA SSB resource list */ + elementCnt = ueCb->cfraResource.numSsb; + ssbResource->ssb_ResourceList.list.count = elementCnt; + ssbResource->ssb_ResourceList.list.size = elementCnt * sizeof(CFRA_SSB_Resource_t *); + + DU_ALLOC(ssbResource->ssb_ResourceList.list.array, ssbResource->ssb_ResourceList.list.size); + if(!ssbResource->ssb_ResourceList.list.array) + { + DU_LOG("\nERROR --> DU APP : Memory allocation failed for SSB resource list in BuildRachConfigDedicated()"); + return RFAILED; + } + + for(listIdx = 0; listIdx < elementCnt; listIdx++) + { + DU_ALLOC(ssbResource->ssb_ResourceList.list.array[listIdx], sizeof(CFRA_SSB_Resource_t)); + if(!ssbResource->ssb_ResourceList.list.array[listIdx]) + { + DU_LOG("\nERROR --> DU APP : Memory allocation failed for SSB resource list element in BuildRachConfigDedicated()"); + return RFAILED; + } + ssbResource->ssb_ResourceList.list.array[listIdx]->ssb = ueCb->cfraResource.ssbResource[listIdx].ssbIdx; + ssbResource->ssb_ResourceList.list.array[listIdx]->ra_PreambleIndex = ueCb->cfraResource.ssbResource[listIdx].raPreambleIdx; + } + + return ROK; +} + +/******************************************************************* + * + * @brief Fills reconfiguration with sync in SP cell config + * + * @details + * + * Function : BuildRecfgWithSync + * + * Functionality: Fills reconfiguration with sync in SP cell config + * + * @params[in] DU UE CB + * Pointer to ReconfigurationWithSync_t + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t BuildRecfgWithSync(DuUeCb *ueCb, ReconfigurationWithSync_t *recfgWithSync) +{ + /* SP Cell Config Common */ + DU_ALLOC(recfgWithSync->spCellConfigCommon, sizeof(ServingCellConfigCommon_t)); + if(!recfgWithSync->spCellConfigCommon) + { + DU_LOG("\nERROR --> DU APP : Failed to allocate memory for spCellConfigCommon in BuildRecfgWithSync()"); + return RFAILED; + } + + if((BuildSpCellConfigCommon(recfgWithSync->spCellConfigCommon)) != ROK) + { + DU_LOG("\nERROR --> DU APP : Failed to build SpCellConfigCommon in BuildRecfgWithSync()"); + return RFAILED; + } + + /* New UE Identity */ + recfgWithSync->newUE_Identity = ueCb->crnti; + + /* T304 timer */ + recfgWithSync->t304 = ReconfigurationWithSync__t304_ms1000; + + /* RACH configuration dedicated */ + DU_ALLOC(recfgWithSync->rach_ConfigDedicated, sizeof(struct ReconfigurationWithSync__rach_ConfigDedicated)); + if(!recfgWithSync->rach_ConfigDedicated) + { + DU_LOG("\nERROR --> DU APP : Failed to allocate memory for RACH config dedicated in BuildRecfgWithSync()"); + return RFAILED; + } + + if((BuildRachConfigDedicated(ueCb, recfgWithSync->rach_ConfigDedicated)) != ROK) + { + DU_LOG("\nERROR --> DU APP : Failed to build RACH config dedicated in BuildRecfgWithSync()"); + return RFAILED; + } + + return ROK; +} + +/******************************************************************* + * + * @brief Builds Spcell config + * + * @details + * + * Function : BuildSpCellCfg + * + * Functionality: Builds sp cell config in DuToCuRrcContainer + * + * @params[in] SpCellConfig_t spCellCfg + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t BuildSpCellCfg(DuUeCb *ueCb, SpCellConfig_t *spCellCfg) +{ + spCellCfg->servCellIndex = NULLP; + DU_ALLOC(spCellCfg->servCellIndex, sizeof(long)); + if(!spCellCfg->servCellIndex) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg"); + return RFAILED; + } + + if(ueCb == NULLP) + *(spCellCfg->servCellIndex) = SERV_CELL_IDX; + else + *(spCellCfg->servCellIndex) = ueCb->macUeCfg.spCellCfg.servCellIdx; + + spCellCfg->reconfigurationWithSync = NULLP; + if(ueCb && (ueCb->ueState == UE_HANDIN_IN_PROGRESS)) + { + DU_ALLOC(spCellCfg->reconfigurationWithSync, sizeof(ReconfigurationWithSync_t)); + if(!spCellCfg->reconfigurationWithSync) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg"); + return RFAILED; + } + + if((BuildRecfgWithSync(ueCb, spCellCfg->reconfigurationWithSync)) != ROK) + { + DU_LOG("\nERROR --> F1AP : Building of reconfiguration with sync failed at BuildSpCellCfg"); + return RFAILED; + } + } + + spCellCfg->rlf_TimersAndConstants = NULLP; + spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP; + + DU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long)); + if(!spCellCfg->rlmInSyncOutOfSyncThreshold) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg"); + return RFAILED; + } + *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD; + + spCellCfg->spCellConfigDedicated = NULLP; + DU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t)); + if(!spCellCfg->spCellConfigDedicated) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg"); + return RFAILED; + } + if(BuildSpCellCfgDed(ueCb, spCellCfg->spCellConfigDedicated) != ROK) + { + DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed"); + return RFAILED; + } + + return ROK; +} + +/******************************************************************* + * + * @brief Builds Phy cell group config + * + * @details + * + * Function : BuildPhyCellGrpCfg + * + * Functionality: Builds Phy cell group config in DuToCuRrcContainer + * + * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t BuildPhyCellGrpCfg(DuUeCb *ueCb, PhysicalCellGroupConfig_t *phyCellGrpCfg) +{ + phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP; + phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP; + + phyCellGrpCfg->p_NR_FR1 = NULLP; + DU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long)); + if(!phyCellGrpCfg->p_NR_FR1) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg"); + return RFAILED; + } + + if(ueCb == NULLP) + { + *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1; + phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK; + } + else + { + *(phyCellGrpCfg->p_NR_FR1) = ueCb->macUeCfg.phyCellGrpCfg.pNrFr1; + phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = ueCb->macUeCfg.phyCellGrpCfg.pdschHarqAckCodebook; + } + + phyCellGrpCfg->tpc_SRS_RNTI = NULLP; + phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP; + phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP; + phyCellGrpCfg->sp_CSI_RNTI = NULLP; + phyCellGrpCfg->cs_RNTI = NULLP; + phyCellGrpCfg->ext1 = NULLP; + phyCellGrpCfg->ext2 = NULLP; + + return ROK; +} + +/******************************************************************* + * + * @brief Builds Mac cell group config + * + * @details + * + * Function : BuildMacCellGrpCfg + * + * Functionality: Builds Mac cell group config in DuToCuRrcContainer + * + * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t BuildMacCellGrpCfg(DuUeCb *ueCb, MAC_CellGroupConfig_t *macCellGrpCfg) +{ + macCellGrpCfg->drx_Config = NULLP; + macCellGrpCfg->schedulingRequestConfig = NULLP; + DU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig)); + if(!macCellGrpCfg->schedulingRequestConfig) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg"); + return RFAILED; + } + + if(BuildSchedulingReqConfig(ueCb, macCellGrpCfg->schedulingRequestConfig) != ROK) + { + DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed"); + return RFAILED; + } + + macCellGrpCfg->bsr_Config = NULLP; + DU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config)); + if(!macCellGrpCfg->bsr_Config) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg"); + return RFAILED; + } + + if(BuildBsrConfig(ueCb, macCellGrpCfg->bsr_Config) != ROK) + { + DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed"); + return RFAILED; + } + + macCellGrpCfg->tag_Config = NULLP; + DU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config)); + if(!macCellGrpCfg->tag_Config) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg"); + return RFAILED; + } + + if(BuildTagConfig(ueCb, macCellGrpCfg->tag_Config) != ROK) + { + DU_LOG("\nERROR --> F1AP : BuildTagConfig failed"); + return RFAILED; + } + + macCellGrpCfg->phr_Config = NULLP; + DU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config)); + if(!macCellGrpCfg->phr_Config) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg"); + return RFAILED; + } + + if(BuildPhrConfig(ueCb, macCellGrpCfg->phr_Config) != ROK) + { + DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed"); + return RFAILED; + } + + macCellGrpCfg->skipUplinkTxDynamic = false; + macCellGrpCfg->ext1 = NULLP; + + return ROK; +} +/******************************************************************* + * + * @brief Frees memeory allocated for SearchSpcToAddModList + * + * @details + * + * Function : FreeSearchSpcToAddModList + * + * Functionality: Deallocating memory of SearchSpcToAddModList + * + * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList + * + * @return void + * + 4221 * ****************************************************************/ +void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList) +{ + uint8_t idx1=0; + uint8_t idx2=0; + struct SearchSpace *searchSpc=NULLP; + + if(searchSpcList->list.array) + { + if(searchSpcList->list.array[idx2]) + { + searchSpc = searchSpcList->list.array[idx2]; + if(searchSpc->controlResourceSetId) + { + if(searchSpc->monitoringSlotPeriodicityAndOffset) + { if(searchSpc->monitoringSymbolsWithinSlot) { - if(searchSpc->monitoringSymbolsWithinSlot->buf) + if(searchSpc->monitoringSymbolsWithinSlot->buf) + { + if(searchSpc->nrofCandidates) + { + if(searchSpc->searchSpaceType) + { + DU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\ + sizeof(struct SearchSpace__searchSpaceType__ue_Specific)); + DU_FREE(searchSpc->searchSpaceType, sizeof(struct + SearchSpace__searchSpaceType)); + } + DU_FREE(searchSpc->nrofCandidates, + sizeof(struct SearchSpace__nrofCandidates)); + } + DU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \ + searchSpc->monitoringSymbolsWithinSlot->size); + } + DU_FREE(searchSpc->monitoringSymbolsWithinSlot, + sizeof(BIT_STRING_t)); + } + DU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \ + sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset)); + } + DU_FREE(searchSpc->controlResourceSetId, + sizeof(ControlResourceSetId_t)); + } + } + for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++) + { + DU_FREE(searchSpcList->list.array[idx1], + sizeof(struct SearchSpace)); + } + DU_FREE(searchSpcList->list.array,searchSpcList->list.size); + } +} +/******************************************************************* + * + * @brief Frees memory allocated for PdschTimeDomAllocList + * + * @details + * + * Function : FreePdschTimeDomAllocList + * + * Functionality: Deallocating memory of PdschTimeDomAllocList + * + * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList + * + * @return void + * + * ****************************************************************/ +void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList) +{ + uint8_t idx1=0; + + if(timeDomAllocList->choice.setup) + { + if(timeDomAllocList->choice.setup->list.array) + { + for(idx1 = 0; idx1 choice.setup->list.count ; idx1++) + { + DU_FREE(timeDomAllocList->choice.setup->list.array[idx1]->k0, sizeof(long)); + DU_FREE(timeDomAllocList->choice.setup->list.array[idx1], + sizeof(struct PDSCH_TimeDomainResourceAllocation)); + } + DU_FREE(timeDomAllocList->choice.setup->list.array, \ + timeDomAllocList->choice.setup->list.size); + } + DU_FREE(timeDomAllocList->choice.setup,\ + sizeof(struct PDSCH_TimeDomainResourceAllocationList)); + } +} +/******************************************************************* + * + * @brief Frees memory allocated for PuschTimeDomAllocList + * + *@details + * + * Function : FreePuschTimeDomAllocList + * + * Functionality: Deallocating memory of PuschTimeDomAllocList + * + * @params[in] PUSCH_Config_t *puschCfg + * + * @return void + * + * ****************************************************************/ +void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg) +{ + uint8_t rsrcListIdx=0; + struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP; + + if(puschCfg->pusch_TimeDomainAllocationList) + { + timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList; + if(timeDomAllocList_t->choice.setup) + { + if(timeDomAllocList_t->choice.setup->list.array) + { + for(rsrcListIdx = 0; rsrcListIdxchoice.setup->list.count; rsrcListIdx++) + { + DU_FREE(timeDomAllocList_t->choice.setup->list.array[rsrcListIdx]->k2, sizeof(long)); + DU_FREE(timeDomAllocList_t->choice.setup->list.array[rsrcListIdx],\ + sizeof(PUSCH_TimeDomainResourceAllocation_t)); + } + DU_FREE(timeDomAllocList_t->choice.setup->list.array, \ + timeDomAllocList_t->choice.setup->list.size); + } + DU_FREE(timeDomAllocList_t->choice.setup, \ + sizeof(struct PUSCH_TimeDomainResourceAllocationList)); + } + DU_FREE(puschCfg->transformPrecoder, sizeof(long)); + DU_FREE(puschCfg->pusch_TimeDomainAllocationList, \ + sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList)); + } + +} + +/******************************************************************* + * + * @brief Frees memory allocated for Dedicated PUCCH config + * + * @details + * + * Function : FreeBWPUlDedPucchCfg + * + * Functionality: Deallocating memory of Dedicated PUCCH cfg + * + * @params[in] BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg + * + * @return void + * + * ****************************************************************/ +void FreeBWPUlDedPucchCfg(struct BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg) +{ + uint8_t k1Idx, rsrcIdx, rsrcSetIdx; + PUCCH_Config_t *pucchCfg = NULLP; + PUCCH_ResourceSet_t *rsrcSet = NULLP; + PUCCH_Resource_t *rsrc = NULLP; + + if(ulBwpPucchCfg) + { + if(ulBwpPucchCfg->choice.setup) + { + pucchCfg = ulBwpPucchCfg->choice.setup; + + //Free resource set list + if(pucchCfg->resourceSetToAddModList) + { + if(pucchCfg->resourceSetToAddModList->list.array) + { + for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++) + { + rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx]; + if(rsrcSet->resourceList.list.array) + { + for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++) + { + DU_FREE(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t)); + } + DU_FREE(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size); + } + DU_FREE(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t)); + } + DU_FREE(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size); + } + DU_FREE(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList)); + } + + //Free resource list + if(pucchCfg->resourceToAddModList) + { + if(pucchCfg->resourceToAddModList->list.array) + { + for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++) + { + rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx]; + DU_FREE(rsrc->format.choice.format1, sizeof(PUCCH_format1_t)); + DU_FREE(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t)); + } + DU_FREE(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size); + } + DU_FREE(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList)); + } + + //PUCCH Format 1 + if(pucchCfg->format1) + { + if(pucchCfg->format1->choice.setup) + { + DU_FREE(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long)); + DU_FREE(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t)); + } + DU_FREE(pucchCfg->format1, sizeof(struct PUCCH_Config__format1)); + } + + //DL DATA TO UL ACK + if(pucchCfg->dl_DataToUL_ACK) + { + if(pucchCfg->dl_DataToUL_ACK->list.array) + { + for(k1Idx = 0; k1Idx < pucchCfg->dl_DataToUL_ACK->list.count; k1Idx++) + { + DU_FREE(pucchCfg->dl_DataToUL_ACK->list.array[k1Idx], sizeof(long)); + } + DU_FREE(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size); + } + DU_FREE(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK)); + } + + DU_FREE(ulBwpPucchCfg->choice.setup, sizeof(PUCCH_Config_t)); + } + DU_FREE(ulBwpPucchCfg, sizeof(struct BWP_UplinkDedicated__pucch_Config)); + } +} + +/******************************************************************* + * + * @brief Frees memory allocated for InitialUlBWP + * + * @details + * + * Function : FreeInitialUlBWP + * + * Functionality: Deallocating memory of InitialUlBWP + * + * @params[in] BWP_UplinkDedicated_t *ulBwp + * + * @return void + * + * ****************************************************************/ +void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp) +{ + uint8_t rSetIdx, rsrcIdx; + SRS_Config_t *srsCfg = NULLP; + PUSCH_Config_t *puschCfg = NULLP; + struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP; + struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP; + struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP; + struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP; + + FreeBWPUlDedPucchCfg(ulBwp->pucch_Config); + + if(ulBwp->pusch_Config) + { + if(ulBwp->pusch_Config->choice.setup) + { + puschCfg=ulBwp->pusch_Config->choice.setup; + if(puschCfg->dataScramblingIdentityPUSCH) + { + if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) + { + FreePuschTimeDomAllocList(puschCfg); + dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA; + if(dmrsUlCfg->choice.setup) + { + if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) + { + if(dmrsUlCfg->choice.setup->transformPrecodingDisabled) + { + DU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\ + sizeof(long)); + DU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled, + sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled)); + } + DU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, + sizeof(long)); + } + DU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t)); + } + DU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \ + sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA)); + } + DU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long)); + } + DU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t)); + } + DU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config)); + + /* Free SRS-Config */ + if(ulBwp->srs_Config) + { + if(ulBwp->srs_Config->choice.setup) + { + srsCfg = ulBwp->srs_Config->choice.setup; + + /* Free Resource Set to add/mod list */ + if(srsCfg->srs_ResourceSetToAddModList) + { + rsrcSetList = srsCfg->srs_ResourceSetToAddModList; + if(rsrcSetList->list.array) + { + rSetIdx = 0; + + /* Free SRS resource Id list in this SRS resource set */ + if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList) + { + rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList; + + if(rsrcIdList->list.array) + { + for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++) + { + DU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t)); + } + DU_FREE(rsrcIdList->list.array, rsrcIdList->list.size); + } + DU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\ + sizeof(struct SRS_ResourceSet__srs_ResourceIdList)); + } + + /* Free resource type info for this SRS resource set */ + DU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \ + sizeof(struct SRS_ResourceSet__resourceType__aperiodic)); + + /* Free memory for each resource set */ + for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++) + { + DU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t)); + } + DU_FREE(rsrcSetList->list.array, rsrcSetList->list.size); + } + DU_FREE(srsCfg->srs_ResourceSetToAddModList, \ + sizeof(struct SRS_Config__srs_ResourceSetToAddModList)); + } + + /* Free resource to add/modd list */ + if(srsCfg->srs_ResourceToAddModList) + { + resourceList = srsCfg->srs_ResourceToAddModList; + if(resourceList->list.array) + { + rsrcIdx = 0; + DU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\ + sizeof(struct SRS_Resource__transmissionComb__n2)); + DU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\ + sizeof(struct SRS_Resource__resourceType__aperiodic)); + + for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++) + { + DU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t)); + } + DU_FREE(resourceList->list.array, resourceList->list.size); + } + DU_FREE(srsCfg->srs_ResourceToAddModList, \ + sizeof(struct SRS_Config__srs_ResourceToAddModList)); + } + + DU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t)); + } + DU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config)); + } + } +} +/******************************************************************* + * + * @brief Frees memory allocated for initialUplinkBWP + * + * @details + * + * Function : FreeinitialUplinkBWP + * + * Functionality: Deallocating memory of initialUplinkBWP + * + * @params[in] UplinkConfig_t *ulCfg + * + * @return void + * + * + * ****************************************************************/ +void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg) +{ + BWP_UplinkDedicated_t *ulBwp=NULLP; + struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP; + + if(ulCfg->initialUplinkBWP) + { + ulBwp=ulCfg->initialUplinkBWP; + if(ulCfg->firstActiveUplinkBWP_Id) + { + if(ulCfg->pusch_ServingCellConfig) + { + puschCfg=ulCfg->pusch_ServingCellConfig; + if(puschCfg->choice.setup) + { + if(puschCfg->choice.setup->ext1) + { + DU_FREE(puschCfg->choice.setup->ext1->\ + processingType2Enabled,sizeof(BOOLEAN_t)); + DU_FREE(puschCfg->choice.setup->ext1->\ + maxMIMO_Layers,sizeof(long)); + DU_FREE(puschCfg->choice.setup->ext1, \ + sizeof(struct PUSCH_ServingCellConfig__ext1)); + } + DU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig)); + } + DU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig)); + } + DU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t)); + } + FreeInitialUlBWP(ulBwp); + DU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t)); + } +} +/******************************************************************* + * + * @brief Frees emmory allocated for BWPDlDedPdschCfg + * + * @details + * + * Function : FreeBWPDlDedPdschCfg + * + * Functionality: Deallocating memory of BWPDlDedPdschCfg + * + * @params[in] BWP_DownlinkDedicated_t *dlBwp + * + * @return void + * + * + * ****************************************************************/ +void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp) +{ + struct PDSCH_Config *pdschCfg=NULLP; + struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP; + struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP; + struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP; + + if(dlBwp->pdsch_Config->choice.setup) + { + pdschCfg=dlBwp->pdsch_Config->choice.setup; + if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) + { + if(pdschCfg->pdsch_TimeDomainAllocationList) + { + timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList; + if(pdschCfg->maxNrofCodeWordsScheduledByDCI) + { + prbBndlType=&pdschCfg->prb_BundlingType; + DU_FREE(prbBndlType->choice.staticBundling,\ + sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling)); + DU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long)); + } + FreePdschTimeDomAllocList(timeDomAllocList); + DU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \ + sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList)); + } + dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA; + if(dmrsDlCfg->choice.setup) + { + DU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, + sizeof(long)); + DU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig)); + } + DU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \ + sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA)); + } + DU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config)); + } +} +/******************************************************************* + * + * @brief Frees emmory allocated for BWPDlDedPdcchCfg + * + * @details + * + * Function : FreeBWPDlDedPdcchCfg + * + * Functionality: Deallocating memory of BWPDlDedPdcchCfg + * + * @params[in] BWP_DownlinkDedicated_t *dlBwp + * + * @return void + * + * + * ****************************************************************/ +void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp) +{ + uint8_t idx1=0; + uint8_t idx2=0; + struct PDCCH_Config *pdcchCfg=NULLP; + struct ControlResourceSet *controlRSet=NULLP; + struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP; + + if(dlBwp->pdcch_Config->choice.setup) + { + pdcchCfg=dlBwp->pdcch_Config->choice.setup; + if(pdcchCfg->controlResourceSetToAddModList) + { + controlRSetList = pdcchCfg->controlResourceSetToAddModList; + if(controlRSetList->list.array) + { + controlRSet = controlRSetList->list.array[idx2]; + if(controlRSet) + { + if(controlRSet->frequencyDomainResources.buf) + { + if(controlRSet->pdcch_DMRS_ScramblingID) { - if(searchSpc->nrofCandidates) + if(pdcchCfg->searchSpacesToAddModList) { - if(searchSpc->searchSpaceType) - { - DU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\ - sizeof(struct SearchSpace__searchSpaceType__ue_Specific)); - DU_FREE(searchSpc->searchSpaceType, sizeof(struct - SearchSpace__searchSpaceType)); - } - DU_FREE(searchSpc->nrofCandidates, - sizeof(struct SearchSpace__nrofCandidates)); + FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList); + DU_FREE(pdcchCfg->searchSpacesToAddModList, \ + sizeof(struct PDCCH_Config__searchSpacesToAddModList)); } - DU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \ - searchSpc->monitoringSymbolsWithinSlot->size); + DU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long)); } - DU_FREE(searchSpc->monitoringSymbolsWithinSlot, - sizeof(BIT_STRING_t)); + DU_FREE(controlRSet->frequencyDomainResources.buf, \ + controlRSet->frequencyDomainResources.size); } - DU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \ - sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset)); } - DU_FREE(searchSpc->controlResourceSetId, - sizeof(ControlResourceSetId_t)); + for(idx1 = 0; idx1 list.count; idx1++) + { + DU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet)); + } + DU_FREE(controlRSetList->list.array, controlRSetList->list.size); } + DU_FREE(pdcchCfg->controlResourceSetToAddModList, \ + sizeof(struct PDCCH_Config__controlResourceSetToAddModList)); } - for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++) - { - DU_FREE(searchSpcList->list.array[idx1], - sizeof(struct SearchSpace)); - } - DU_FREE(searchSpcList->list.array,searchSpcList->list.size); + DU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config)); } -} +} + /******************************************************************* * - * @brief Frees memory allocated for PdschTimeDomAllocList + * @brief Free SCS specific carrier list in DL frequency info * * @details * - * Function : FreePdschTimeDomAllocList + * Function : FreeScsSpecificCarrierListDl * - * Functionality: Deallocating memory of PdschTimeDomAllocList + * Functionality: Free SCS specific carrier list in DL frequency info * - * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList + * @params[in] Pointer to struct FrequencyInfoDL__scs_SpecificCarrierList * * @return void * * ****************************************************************/ -void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList) +void FreeScsSpecificCarrierListDl(struct FrequencyInfoDL__scs_SpecificCarrierList *scsCarrierList) { - uint8_t idx1=0; + uint8_t listIdx = 0; - if(timeDomAllocList->choice.setup) + if(!scsCarrierList->list.array) { - if(timeDomAllocList->choice.setup->list.array) + for(listIdx = 0; listIdx < scsCarrierList->list.count; listIdx++) { - for(idx1 = 0; idx1 choice.setup->list.count ; idx1++) - { - DU_FREE(timeDomAllocList->choice.setup->list.array[idx1]->k0, sizeof(long)); - DU_FREE(timeDomAllocList->choice.setup->list.array[idx1], - sizeof(struct PDSCH_TimeDomainResourceAllocation)); - } - DU_FREE(timeDomAllocList->choice.setup->list.array, \ - timeDomAllocList->choice.setup->list.size); + DU_FREE(scsCarrierList->list.array[listIdx], sizeof(SCS_SpecificCarrier_t)); } - DU_FREE(timeDomAllocList->choice.setup,\ - sizeof(struct PDSCH_TimeDomainResourceAllocationList)); + DU_FREE(scsCarrierList->list.array, scsCarrierList->list.size); } } + /******************************************************************* * - * @brief Frees memory allocated for PuschTimeDomAllocList + * @brief Free DL frequency info in DL config common * - *@details + * @details * - * Function : FreePuschTimeDomAllocList + * Function : FreeFreqInfoDl * - * Functionality: Deallocating memory of PuschTimeDomAllocList + * Functionality: Free DL frequency info in DL config common * - * @params[in] PUSCH_Config_t *puschCfg + * @params[in] Pointer to DownlinkConfigCommon_t * * @return void * * ****************************************************************/ -void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg) +void FreeFreqInfoDl(FrequencyInfoDL_t *frequencyInfoDL) { - uint8_t rsrcListIdx=0; - struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP; + uint8_t freqBandIdx = 0; - if(puschCfg->pusch_TimeDomainAllocationList) + /* SSB Absolute Frequency */ + DU_FREE(frequencyInfoDL->absoluteFrequencySSB, sizeof(ARFCN_ValueNR_t)); + + /* NR Multi Frequency Band List */ + if(frequencyInfoDL->frequencyBandList.list.array) { - timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList; - if(timeDomAllocList_t->choice.setup) + for(freqBandIdx = 0; freqBandIdx < frequencyInfoDL->frequencyBandList.list.count; freqBandIdx++) { - if(timeDomAllocList_t->choice.setup->list.array) - { - for(rsrcListIdx = 0; rsrcListIdxchoice.setup->list.count; rsrcListIdx++) - { - DU_FREE(timeDomAllocList_t->choice.setup->list.array[rsrcListIdx]->k2, sizeof(long)); - DU_FREE(timeDomAllocList_t->choice.setup->list.array[rsrcListIdx],\ - sizeof(PUSCH_TimeDomainResourceAllocation_t)); - } - DU_FREE(timeDomAllocList_t->choice.setup->list.array, \ - timeDomAllocList_t->choice.setup->list.size); - } - DU_FREE(timeDomAllocList_t->choice.setup, \ - sizeof(struct PUSCH_TimeDomainResourceAllocationList)); + DU_FREE(frequencyInfoDL->frequencyBandList.list.array[freqBandIdx], sizeof(FreqBandIndicatorNR_t)); } - DU_FREE(puschCfg->transformPrecoder, sizeof(long)); - DU_FREE(puschCfg->pusch_TimeDomainAllocationList, \ - sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList)); + DU_FREE(frequencyInfoDL->frequencyBandList.list.array, frequencyInfoDL->frequencyBandList.list.size); } + /* Subcarrier Spacing specifc carrier List */ + FreeScsSpecificCarrierListDl(&frequencyInfoDL->scs_SpecificCarrierList); } + /******************************************************************* * - * @brief Frees memory allocated for InitialUlBWP + * @brief Free DL config common in Serving cell config common * * @details * - * Function : FreeInitialUlBWP + * Function : FreeDlConfigCommon * - * Functionality: Deallocating memory of InitialUlBWP + * Functionality: Free DL config common in Serving cell config common * - * @params[in] BWP_UplinkDedicated_t *ulBwp + * @params[in] Pointer to DownlinkConfigCommon_t * * @return void * * ****************************************************************/ -void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp) +void FreeDlConfigCommon(DownlinkConfigCommon_t *dlCfgCommon) { - uint8_t rSetIdx, rsrcIdx, k1Idx; - SRS_Config_t *srsCfg = NULLP; - PUSCH_Config_t *puschCfg = NULLP; - PUCCH_Config_t *pucchCfg = NULLP; - struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP; - struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP; - struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP; - struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP; + /* DL Frequency Info */ + if(dlCfgCommon->frequencyInfoDL) + { + FreeFreqInfoDl(dlCfgCommon->frequencyInfoDL); + DU_FREE(dlCfgCommon->frequencyInfoDL, sizeof(FrequencyInfoDL_t)); + } + + /* DL BWP config common */ + if(dlCfgCommon->initialDownlinkBWP) + { + FreeBwpDlCommon(dlCfgCommon->initialDownlinkBWP); + DU_FREE(dlCfgCommon->initialDownlinkBWP, sizeof(BWP_DownlinkCommon_t)); + } +} + +/******************************************************************* + * + * @brief Free SCS specific carrier list in UL frequency Info + * + * @details + * + * Function : FreeScsSpecificCarrierListUl + * + * Functionality: Free SCS specific carrier list in UL frequency Info + * + * @params[in] Pointer to struct FrequencyInfoUL__scs_SpecificCarrierList + * + * @return void + * + * ****************************************************************/ +void FreeScsSpecificCarrierListUl(struct FrequencyInfoUL__scs_SpecificCarrierList *scsCarrierList) +{ + uint8_t listIdx = 0; - if(ulBwp->pucch_Config) + if(scsCarrierList->list.array) { - if(ulBwp->pucch_Config->choice.setup) + for(listIdx = 0; listIdx < scsCarrierList->list.count; listIdx++) { - pucchCfg = ulBwp->pucch_Config->choice.setup; - if(pucchCfg->dl_DataToUL_ACK) - { - if(pucchCfg->dl_DataToUL_ACK->list.array) - { - for(k1Idx = 0; k1Idx < pucchCfg->dl_DataToUL_ACK->list.count; k1Idx++) - { - DU_FREE(pucchCfg->dl_DataToUL_ACK->list.array[k1Idx], sizeof(long)); - } - DU_FREE(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size); - } - DU_FREE(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK)); - } - DU_FREE(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t)); + DU_FREE(scsCarrierList->list.array[listIdx], sizeof(SCS_SpecificCarrier_t)); } - DU_FREE(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config)); + DU_FREE(scsCarrierList->list.array, scsCarrierList->list.size); } +} - if(ulBwp->pusch_Config) +/******************************************************************* + * + * @brief Free frequency info in UL config common + * + * @details + * + * Function : FreeFreqInfoUl + * + * Functionality: Free frequency info in UL config common + * + * @params[in] Pointer to FrequencyInfoUL_t + * + * @return void + * + * ****************************************************************/ +void FreeFreqInfoUl(FrequencyInfoUL_t *frequencyInfoUL) +{ + uint8_t listIdx= 0; + + /* NR Multi Frequency Band List */ + if(!frequencyInfoUL->frequencyBandList) { - if(ulBwp->pusch_Config->choice.setup) + if(frequencyInfoUL->frequencyBandList->list.array) { - puschCfg=ulBwp->pusch_Config->choice.setup; - if(puschCfg->dataScramblingIdentityPUSCH) + for(listIdx = 0; listIdx < frequencyInfoUL->frequencyBandList->list.count; listIdx++) { - if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) - { - FreePuschTimeDomAllocList(puschCfg); - dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA; - if(dmrsUlCfg->choice.setup) - { - if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) - { - if(dmrsUlCfg->choice.setup->transformPrecodingDisabled) - { - DU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\ - sizeof(long)); - DU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled, - sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled)); - } - DU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, - sizeof(long)); - } - DU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t)); - } - DU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \ - sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA)); - } - DU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long)); + DU_FREE(frequencyInfoUL->frequencyBandList->list.array[listIdx], sizeof(FreqBandIndicatorNR_t)); } - DU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t)); + DU_FREE(frequencyInfoUL->frequencyBandList->list.array, frequencyInfoUL->frequencyBandList->list.size); } - DU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config)); - - /* Free SRS-Config */ - if(ulBwp->srs_Config) - { - if(ulBwp->srs_Config->choice.setup) - { - srsCfg = ulBwp->srs_Config->choice.setup; - - /* Free Resource Set to add/mod list */ - if(srsCfg->srs_ResourceSetToAddModList) - { - rsrcSetList = srsCfg->srs_ResourceSetToAddModList; - if(rsrcSetList->list.array) - { - rSetIdx = 0; - - /* Free SRS resource Id list in this SRS resource set */ - if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList) - { - rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList; - - if(rsrcIdList->list.array) - { - for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++) - { - DU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t)); - } - DU_FREE(rsrcIdList->list.array, rsrcIdList->list.size); - } - DU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\ - sizeof(struct SRS_ResourceSet__srs_ResourceIdList)); - } + DU_FREE(frequencyInfoUL->frequencyBandList, sizeof(MultiFrequencyBandListNR_t)); + } - /* Free resource type info for this SRS resource set */ - DU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \ - sizeof(struct SRS_ResourceSet__resourceType__aperiodic)); + /* Absolute frequency point A */ + DU_FREE(frequencyInfoUL->absoluteFrequencyPointA, sizeof(ARFCN_ValueNR_t)); - /* Free memory for each resource set */ - for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++) - { - DU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t)); - } - DU_FREE(rsrcSetList->list.array, rsrcSetList->list.size); - } - DU_FREE(srsCfg->srs_ResourceSetToAddModList, \ - sizeof(struct SRS_Config__srs_ResourceSetToAddModList)); - } + /* Subcarrier Spacing specifc carrier */ + FreeScsSpecificCarrierListUl(&frequencyInfoUL->scs_SpecificCarrierList); - /* Free resource to add/modd list */ - if(srsCfg->srs_ResourceToAddModList) - { - resourceList = srsCfg->srs_ResourceToAddModList; - if(resourceList->list.array) - { - rsrcIdx = 0; - DU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\ - sizeof(struct SRS_Resource__transmissionComb__n2)); - DU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\ - sizeof(struct SRS_Resource__resourceType__aperiodic)); + /* P-MAX */ + DU_FREE(frequencyInfoUL->p_Max, sizeof(P_Max_t)); +} - for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++) - { - DU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t)); - } - DU_FREE(resourceList->list.array, resourceList->list.size); - } - DU_FREE(srsCfg->srs_ResourceToAddModList, \ - sizeof(struct SRS_Config__srs_ResourceToAddModList)); - } +/******************************************************************* + * + * @brief Free UL config common in Serving cell config common + * + * @details + * + * Function : FreeUlConfigCommon + * + * Functionality: Free UL config common in Serving cell config common + * + * @params[in] Pointer to UplinkConfigCommon_t + * + * @return void + * + * ****************************************************************/ +void FreeUlConfigCommon(UplinkConfigCommon_t *ulCfgCommon) +{ + /* UL Frequency Info */ + if(ulCfgCommon->frequencyInfoUL) + { + FreeFreqInfoUl(ulCfgCommon->frequencyInfoUL); + DU_FREE(ulCfgCommon->frequencyInfoUL, sizeof(FrequencyInfoUL_t)); + } - DU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t)); - } - DU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config)); - } + /* UL BWP common */ + if(ulCfgCommon->initialUplinkBWP) + { + FreeBwpUlCommon(ulCfgCommon->initialUplinkBWP); + DU_FREE(ulCfgCommon->initialUplinkBWP, sizeof(BWP_UplinkCommon_t)); } -} +} + /******************************************************************* * - * @brief Frees memory allocated for initialUplinkBWP + * @brief Free SP cell config common in Reconfig with Sync * * @details * - * Function : FreeinitialUplinkBWP + * Function : FreeSpCellConfigCommon * - * Functionality: Deallocating memory of initialUplinkBWP + * Functionality: Free SP cell config common in Reconfig with Sync * - * @params[in] UplinkConfig_t *ulCfg + * @params[in] Pointer to ServingCellConfigCommon_t * * @return void - * * * ****************************************************************/ -void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg) +void FreeSpCellConfigCommon(ServingCellConfigCommon_t *spCellConfigCommon) { - BWP_UplinkDedicated_t *ulBwp=NULLP; - struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP; + /* Free Physical cell identity */ + DU_FREE(spCellConfigCommon->physCellId, sizeof(PhysCellId_t)); - if(ulCfg->initialUplinkBWP) + /* Free Downlink Config common */ + if(spCellConfigCommon->downlinkConfigCommon) { - ulBwp=ulCfg->initialUplinkBWP; - if(ulCfg->firstActiveUplinkBWP_Id) - { - if(ulCfg->pusch_ServingCellConfig) - { - puschCfg=ulCfg->pusch_ServingCellConfig; - if(puschCfg->choice.setup) - { - if(puschCfg->choice.setup->ext1) - { - DU_FREE(puschCfg->choice.setup->ext1->\ - processingType2Enabled,sizeof(BOOLEAN_t)); - DU_FREE(puschCfg->choice.setup->ext1->\ - maxMIMO_Layers,sizeof(long)); - DU_FREE(puschCfg->choice.setup->ext1, \ - sizeof(struct PUSCH_ServingCellConfig__ext1)); - } - DU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig)); - } - DU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig)); - } - DU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t)); - } - FreeInitialUlBWP(ulBwp); - DU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t)); + FreeDlConfigCommon(spCellConfigCommon->downlinkConfigCommon); + DU_FREE(spCellConfigCommon->downlinkConfigCommon, sizeof(DownlinkConfigCommon_t)); + } + + /* Free Uplink Config common */ + if(spCellConfigCommon->uplinkConfigCommon) + { + FreeUlConfigCommon(spCellConfigCommon->uplinkConfigCommon); + DU_FREE(spCellConfigCommon->uplinkConfigCommon, sizeof(UplinkConfigCommon_t)); + } + + /* Free Timing Advance offset */ + DU_FREE(spCellConfigCommon->n_TimingAdvanceOffset, sizeof(long)); + + /* Free SSB Position in Burst */ + if(spCellConfigCommon->ssb_PositionsInBurst) + { + DU_FREE(spCellConfigCommon->ssb_PositionsInBurst->choice.mediumBitmap.buf, \ + spCellConfigCommon->ssb_PositionsInBurst->choice.mediumBitmap.size); + DU_FREE(spCellConfigCommon->ssb_PositionsInBurst, sizeof(struct ServingCellConfigCommon__ssb_PositionsInBurst)); } + + /* Free SSB Periodicity in Serving cell */ + DU_FREE(spCellConfigCommon->ssb_periodicityServingCell, sizeof(long)); + + /* Free SSB subcarrier spacing */ + DU_FREE(spCellConfigCommon->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t)); + + /* TDD UL-DL configuration common */ + DU_FREE(spCellConfigCommon->tdd_UL_DL_ConfigurationCommon, sizeof(TDD_UL_DL_ConfigCommon_t)); } + /******************************************************************* * - * @brief Frees emmory allocated for BWPDlDedPdschCfg + * @brief Free dedicated RACH configuration in Reconfiguration with sync * * @details * - * Function : FreeBWPDlDedPdschCfg + * Function : FreeRecfgWithSync * - * Functionality: Deallocating memory of BWPDlDedPdschCfg + * Functionality: + * Free dedicated RACH configuration in Reconfiguration with sync * - * @params[in] BWP_DownlinkDedicated_t *dlBwp + * @params[in] Pinter to Rach config dedicated struct * * @return void * - * * ****************************************************************/ -void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp) +void FreeRachConfigDedicated(struct ReconfigurationWithSync__rach_ConfigDedicated *rachCfgDed) { - struct PDSCH_Config *pdschCfg=NULLP; - struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP; - struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP; - struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP; + uint8_t listIdx = 0; + CFRA_t *cfra = NULLP; + struct CFRA__resources__ssb *ssbResource = NULLP; - if(dlBwp->pdsch_Config->choice.setup) + /* Uplink */ + if(rachCfgDed->choice.uplink) { - pdschCfg=dlBwp->pdsch_Config->choice.setup; - if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) + /* CFRA : Contention free Random Access */ + if(rachCfgDed->choice.uplink->cfra) { - if(pdschCfg->pdsch_TimeDomainAllocationList) - { - timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList; - if(pdschCfg->maxNrofCodeWordsScheduledByDCI) - { - prbBndlType=&pdschCfg->prb_BundlingType; - DU_FREE(prbBndlType->choice.staticBundling,\ - sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling)); - DU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long)); - } - FreePdschTimeDomAllocList(timeDomAllocList); - DU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \ - sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList)); - } - dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA; - if(dmrsDlCfg->choice.setup) - { - DU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, - sizeof(long)); - DU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig)); - } - DU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \ - sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA)); + cfra = rachCfgDed->choice.uplink->cfra; + + /* CFRA occassions */ + if(cfra->occasions) + { + /* CFRA occassions : SSB per RACH occasion */ + DU_FREE(cfra->occasions->ssb_perRACH_Occasion, sizeof(long)); + DU_FREE(cfra->occasions, sizeof(struct CFRA__occasions)); + } + + /* CFRA resource */ + cfra->resources.present = CFRA__resources_PR_ssb; + + /* CFRA resource : SSB */ + if(cfra->resources.choice.ssb) + { + ssbResource = cfra->resources.choice.ssb; + + /* CFRA SSB resource list */ + if(ssbResource->ssb_ResourceList.list.array) + { + for(listIdx = 0; listIdx < ssbResource->ssb_ResourceList.list.count; listIdx++) + { + DU_FREE(ssbResource->ssb_ResourceList.list.array[listIdx], sizeof(CFRA_SSB_Resource_t)); + } + DU_FREE(ssbResource->ssb_ResourceList.list.array, ssbResource->ssb_ResourceList.list.size); + } + DU_FREE(cfra->resources.choice.ssb, sizeof(struct CFRA__resources__ssb)); + } + DU_FREE(rachCfgDed->choice.uplink->cfra, sizeof(CFRA_t)); } - DU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config)); + DU_FREE(rachCfgDed->choice.uplink, sizeof(RACH_ConfigDedicated_t)); } } + /******************************************************************* * - * @brief Frees emmory allocated for BWPDlDedPdcchCfg + * @brief Frees reconfiguration with sync in SP cell config * * @details * - * Function : FreeBWPDlDedPdcchCfg + * Function : FreeRecfgWithSync * - * Functionality: Deallocating memory of BWPDlDedPdcchCfg + * Functionality: Fress reconfiguration with sync in SP cell config * - * @params[in] BWP_DownlinkDedicated_t *dlBwp + * @params[in] Pointer to ReconfigurationWithSync_t * * @return void - * * * ****************************************************************/ -void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp) +void FreeRecfgWithSync(ReconfigurationWithSync_t *recfgWithSync) { - uint8_t idx1=0; - uint8_t idx2=0; - struct PDCCH_Config *pdcchCfg=NULLP; - struct ControlResourceSet *controlRSet=NULLP; - struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP; + /* Free SP Cell config common */ + if(recfgWithSync->spCellConfigCommon) + { + FreeSpCellConfigCommon(recfgWithSync->spCellConfigCommon); + DU_FREE(recfgWithSync->spCellConfigCommon, sizeof(ServingCellConfigCommon_t)); + } - if(dlBwp->pdcch_Config->choice.setup) + /* Free Dedicated RACH configuration */ + if(recfgWithSync->rach_ConfigDedicated) { - pdcchCfg=dlBwp->pdcch_Config->choice.setup; - if(pdcchCfg->controlResourceSetToAddModList) - { - controlRSetList = pdcchCfg->controlResourceSetToAddModList; - if(controlRSetList->list.array) - { - controlRSet = controlRSetList->list.array[idx2]; - if(controlRSet) - { - if(controlRSet->frequencyDomainResources.buf) - { - if(controlRSet->pdcch_DMRS_ScramblingID) - { - if(pdcchCfg->searchSpacesToAddModList) - { - FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList); - DU_FREE(pdcchCfg->searchSpacesToAddModList, \ - sizeof(struct PDCCH_Config__searchSpacesToAddModList)); - } - DU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long)); - } - DU_FREE(controlRSet->frequencyDomainResources.buf, \ - controlRSet->frequencyDomainResources.size); - } - } - for(idx1 = 0; idx1 list.count; idx1++) - { - DU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet)); - } - DU_FREE(controlRSetList->list.array, controlRSetList->list.size); - } - DU_FREE(pdcchCfg->controlResourceSetToAddModList, \ - sizeof(struct PDCCH_Config__controlResourceSetToAddModList)); - } - DU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config)); + FreeRachConfigDedicated(recfgWithSync->rach_ConfigDedicated); + DU_FREE(recfgWithSync->rach_ConfigDedicated, sizeof(struct ReconfigurationWithSync__rach_ConfigDedicated)); } -} +} /******************************************************************* * @@ -5688,11 +8011,46 @@ uint8_t FreeMemDuToCuRrcCont(CellGroupConfigRrc_t *cellGrpCfg) macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig; if(rlcConfig) { - if(rlcConfig->choice.am) + switch(rlcConfig->present) { - DU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t)); - DU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t)); - DU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am)); + case RLC_Config_PR_am: + { + if(rlcConfig->choice.am) + { + DU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t)); + DU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t)); + DU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am)); + } + break; + } + case RLC_Config_PR_um_Bi_Directional: + { + if(rlcConfig->choice.um_Bi_Directional) + { + DU_FREE(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t)); + DU_FREE(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t)); + DU_FREE(rlcConfig->choice.um_Bi_Directional, sizeof(struct RLC_Config__um_Bi_Directional)); + } + break; + } + case RLC_Config_PR_um_Uni_Directional_UL: + { + if(rlcConfig->choice.um_Uni_Directional_UL) + { + DU_FREE(rlcConfig->choice.um_Uni_Directional_UL->ul_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t)); + DU_FREE(rlcConfig->choice.um_Uni_Directional_UL , sizeof(struct RLC_Config__um_Uni_Directional_UL)); + } + break; + } + case RLC_Config_PR_um_Uni_Directional_DL: + { + if(rlcConfig->choice.um_Uni_Directional_DL ) + { + DU_FREE(rlcConfig->choice.um_Uni_Directional_DL->dl_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t)); + DU_FREE(rlcConfig->choice.um_Uni_Directional_DL , sizeof(struct RLC_Config__um_Uni_Directional_DL)); + } + break; + } } DU_FREE(rlcConfig, sizeof(struct RLC_Config)); } @@ -5742,6 +8100,7 @@ uint8_t FreeMemDuToCuRrcCont(CellGroupConfigRrc_t *cellGrpCfg) } if(macCellGrpCfg->bsr_Config) { + DU_FREE(macCellGrpCfg->bsr_Config->logicalChannelSR_DelayTimer, sizeof(long)); DU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config)); } tagConfig = macCellGrpCfg->tag_Config; @@ -5783,75 +8142,90 @@ uint8_t FreeMemDuToCuRrcCont(CellGroupConfigRrc_t *cellGrpCfg) spCellCfg = cellGrpCfg->spCellConfig; if(spCellCfg) { - if(spCellCfg->servCellIndex) + /* Free serving cell index */ + DU_FREE(spCellCfg->servCellIndex, sizeof(long)); + + /* Free Reconfiguration with sync */ + if(spCellCfg->reconfigurationWithSync) + { + FreeRecfgWithSync(spCellCfg->reconfigurationWithSync); + DU_FREE(spCellCfg->reconfigurationWithSync, sizeof(ReconfigurationWithSync_t)); + } + + /* Free rlmInSyncOutOfSyncThreshold */ + DU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long)); + + /* Free SP Cell config dedicated */ + if(spCellCfg->spCellConfigDedicated) { - if(spCellCfg->rlmInSyncOutOfSyncThreshold) + srvCellCfg = spCellCfg->spCellConfigDedicated; + + /* Free TDD UL-DL config dedicated */ + DU_FREE(srvCellCfg->tdd_UL_DL_ConfigurationDedicated, sizeof(TDD_UL_DL_ConfigDedicated_t)); + + /* Free Initial Downlink BWP */ + if(srvCellCfg->initialDownlinkBWP) { - if(spCellCfg->spCellConfigDedicated) + dlBwp = srvCellCfg->initialDownlinkBWP; + + /* Free DL BWP PDCCH Config */ + if(dlBwp->pdcch_Config) { - srvCellCfg = spCellCfg->spCellConfigDedicated; - if(srvCellCfg->tdd_UL_DL_ConfigurationDedicated) - { - if(srvCellCfg->initialDownlinkBWP) - { - dlBwp = srvCellCfg->initialDownlinkBWP; - if(srvCellCfg->firstActiveDownlinkBWP_Id) - { - if(srvCellCfg->defaultDownlinkBWP_Id) - { - if(srvCellCfg->uplinkConfig) - { - if(srvCellCfg->pdsch_ServingCellConfig) - { - pdschCfg= srvCellCfg->pdsch_ServingCellConfig; - if(pdschCfg->choice.setup) - { - DU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long)); - DU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig)); - } - DU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct - ServingCellConfig__pdsch_ServingCellConfig)); - } - FreeinitialUplinkBWP(srvCellCfg->uplinkConfig); - DU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t)); - } - DU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long)); - } - DU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long)); - } - if(dlBwp->pdcch_Config) - { - if(dlBwp->pdsch_Config) - { - FreeBWPDlDedPdschCfg(dlBwp); - DU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config)); - } - FreeBWPDlDedPdcchCfg(dlBwp); - DU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config)); - } - DU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t)); - } - DU_FREE(srvCellCfg->tdd_UL_DL_ConfigurationDedicated, sizeof(TDD_UL_DL_ConfigDedicated_t)); - } - DU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t)); + FreeBWPDlDedPdcchCfg(dlBwp); + DU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config)); + } + + /* Free DL BWP PDSCH config */ + if(dlBwp->pdsch_Config) + { + FreeBWPDlDedPdschCfg(dlBwp); + DU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config)); + } + DU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t)); + } + + /* Free First Active Downlink BWP */ + DU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long)); + + /* Free Default downlink BWP */ + DU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long)); + + /* Free Uplink config */ + if(srvCellCfg->uplinkConfig) + { + FreeinitialUplinkBWP(srvCellCfg->uplinkConfig); + DU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t)); + } + + /* Free PDSCH serving cell config */ + if(srvCellCfg->pdsch_ServingCellConfig) + { + pdschCfg= srvCellCfg->pdsch_ServingCellConfig; + if(pdschCfg->choice.setup) + { + DU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long)); + DU_FREE(pdschCfg->choice.setup, sizeof(struct PDSCH_ServingCellConfig)); } - DU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long)); + DU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig)); } - DU_FREE(spCellCfg->servCellIndex, sizeof(long)); + + DU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t)); } DU_FREE(spCellCfg,sizeof(SpCellConfig_t)); } return ROK; } + /******************************************************************* * - * @brief Builds DU To CU RRC Container + * @brief Builds CellGroupConfigRrc for DU To CU RRC Container * * @details * - * Function : BuildDuToCuRrcContainer + * Function : BuildCellGroupConfigRrc * - * Functionality: Builds DuToCuRrcContainer + * Functionality: Builds and copied Cell group config buffer into + * DuToCuRrcContainer * * @params[in] idx, index in F1AP msg * DuToCuRRCContainer, DuToCuRRCContainer @@ -5860,7 +8234,7 @@ uint8_t FreeMemDuToCuRrcCont(CellGroupConfigRrc_t *cellGrpCfg) * RFAILED - failure * * ****************************************************************/ -uint8_t BuildDuToCuRrcContainer(DUtoCURRCContainer_t *duToCuRrcContainer) +uint8_t BuildCellGroupConfigRrc(DuUeCb *ueCb, OCTET_STRING_t *duToCuRrcContainer) { uint8_t ret = ROK; CellGroupConfigRrc_t cellGrpCfg; @@ -5876,15 +8250,15 @@ uint8_t BuildDuToCuRrcContainer(DUtoCURRCContainer_t *duToCuRrcContainer) DU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList)); if(!cellGrpCfg.rlc_BearerToAddModList) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer"); - ret = RFAILED; - break; + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer"); + ret = RFAILED; + break; } - if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK) + if(BuildRlcBearerToAddModList(ueCb, cellGrpCfg.rlc_BearerToAddModList) != ROK) { - DU_LOG("\nERROR --> F1AP : BuildRlcBearerToAddModList failed"); - ret = RFAILED; - break; + DU_LOG("\nERROR --> F1AP : BuildRlcBearerToAddModList failed"); + ret = RFAILED; + break; } cellGrpCfg.rlc_BearerToReleaseList = NULLP; @@ -5892,45 +8266,45 @@ uint8_t BuildDuToCuRrcContainer(DUtoCURRCContainer_t *duToCuRrcContainer) DU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t)); if(!cellGrpCfg.mac_CellGroupConfig) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer"); - ret = RFAILED; - break; + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer"); + ret = RFAILED; + break; } - if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK) + if(BuildMacCellGrpCfg(ueCb, cellGrpCfg.mac_CellGroupConfig) != ROK) { - DU_LOG("\nERROR --> F1AP : BuildMacCellGrpCfg failed"); - ret = RFAILED; - break; + DU_LOG("\nERROR --> F1AP : BuildMacCellGrpCfg failed"); + ret = RFAILED; + break; } cellGrpCfg.physicalCellGroupConfig = NULLP; DU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t)); if(!cellGrpCfg.physicalCellGroupConfig) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer"); - ret = RFAILED; - break; + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer"); + ret = RFAILED; + break; } - if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK) + if(BuildPhyCellGrpCfg(ueCb, cellGrpCfg.physicalCellGroupConfig) != ROK) { - DU_LOG("\nERROR --> F1AP : BuildPhyCellGrpCfg failed"); - ret = RFAILED; - break; + DU_LOG("\nERROR --> F1AP : BuildPhyCellGrpCfg failed"); + ret = RFAILED; + break; } cellGrpCfg.spCellConfig = NULLP; DU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t)); if(!cellGrpCfg.spCellConfig) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer"); - ret = RFAILED; - break; + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer"); + ret = RFAILED; + break; } - if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK) + if(BuildSpCellCfg(ueCb, cellGrpCfg.spCellConfig) != ROK) { - DU_LOG("\nERROR --> F1AP : BuildSpCellCfg failed"); - ret = RFAILED; - break; + DU_LOG("\nERROR --> F1AP : BuildSpCellCfg failed"); + ret = RFAILED; + break; } cellGrpCfg.sCellToAddModList = NULLP; @@ -5945,27 +8319,27 @@ uint8_t BuildDuToCuRrcContainer(DUtoCURRCContainer_t *duToCuRrcContainer) /* Encode results */ if(encRetVal.encoded == ENCODE_FAIL) { - DU_LOG( "\nERROR --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\ - encRetVal.failed_type ? encRetVal.failed_type->name : "unknown"); - ret = RFAILED; - break; + DU_LOG( "\nERROR --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\ + encRetVal.failed_type ? encRetVal.failed_type->name : "unknown"); + ret = RFAILED; + break; } else { - DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DuToCuRrcContainer\n"); - for(int i=0; i< encBufSize; i++) - { - printf("%x",encBuf[i]); - } + DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DuToCuRrcContainer\n"); + for(int i=0; i< encBufSize; i++) + { + printf("%x",encBuf[i]); + } } duToCuRrcContainer->size = encBufSize; DU_ALLOC(duToCuRrcContainer->buf, duToCuRrcContainer->size); if(!duToCuRrcContainer->buf) { - DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDuToCuRrcContainer"); - ret = RFAILED; - break; + DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDuToCuRrcContainer"); + ret = RFAILED; + break; } if(ret == ROK) { @@ -6091,7 +8465,8 @@ uint8_t BuildAndSendInitialRrcMsgTransfer(uint32_t gnbDuUeF1apId, uint16_t crnti { uint8_t ret; uint8_t elementCnt; - uint8_t ieIdx; + uint8_t ieIdx, cellIdx, ueIdx; + DuUeCb *duUeCb = NULLP; asn_enc_rval_t encRetVal; F1AP_PDU_t *f1apMsg = NULLP; InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP; @@ -6203,7 +8578,19 @@ uint8_t BuildAndSendInitialRrcMsgTransfer(uint32_t gnbDuUeF1apId, uint16_t crnti initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present =\ InitialULRRCMessageTransferIEs__value_PR_DUtoCURRCContainer; - ret = BuildDuToCuRrcContainer(&initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCContainer); + for(cellIdx = 0; cellIdx < MAX_NUM_CELL; cellIdx++) + { + for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++) + { + if(duCb.actvCellLst[cellIdx] && (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\ + (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].crnti == crnti)) + { + duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx]; + } + } + } + + ret = BuildCellGroupConfigRrc(duUeCb, &initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCContainer); if(ret != ROK) { break; @@ -6211,7 +8598,7 @@ uint8_t BuildAndSendInitialRrcMsgTransfer(uint32_t gnbDuUeF1apId, uint16_t crnti xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg); - /* Encode the F1SetupRequest type as APER */ + /* Encode the Intial UL RRC Message transfer as APER */ memset(encBuf, 0, ENC_BUF_MAX_LEN); encBufSize = 0; encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf); @@ -6329,6 +8716,7 @@ void freeRlcLcCfg(RlcBearerCfg *lcCfg) DU_LOG("\nERROR --> DU_APP: Invalid Rlc Mode %d at freeRlcLcCfg()", lcCfg->rlcMode); break; } + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->snssai, sizeof(Snssai)); } /******************************************************************* @@ -7156,20 +9544,20 @@ void extractRlcAmCfg(AmBearerCfg *amCfgToSet, struct RLC_Config__am *rlcAmCfg) /* UL AM */ if(rlcAmCfg->dl_AM_RLC.sn_FieldLength) { - amCfgToSet->ulAmCfg.snLenUl = *(rlcAmCfg->dl_AM_RLC.sn_FieldLength); + amCfgToSet->ulAmCfg.snLenUl = covertAmSnLenFromRrcEnumToIntEnum(*(rlcAmCfg->dl_AM_RLC.sn_FieldLength)); /*TODO: Check the timer value when sent by real CU */ - amCfgToSet->ulAmCfg.reAssemTmr = rlcAmCfg->dl_AM_RLC.t_Reassembly; - amCfgToSet->ulAmCfg.statProhTmr = rlcAmCfg->dl_AM_RLC.t_StatusProhibit; + amCfgToSet->ulAmCfg.reAssemTmr = convertReasmblTmrEnumToValue(rlcAmCfg->dl_AM_RLC.t_Reassembly); + amCfgToSet->ulAmCfg.statProhTmr = convertProhibitTmrEnumToValue(rlcAmCfg->dl_AM_RLC.t_StatusProhibit); } /* DL AM */ if(rlcAmCfg->ul_AM_RLC.sn_FieldLength) { - amCfgToSet->dlAmCfg.snLenDl = *(rlcAmCfg->ul_AM_RLC.sn_FieldLength); - amCfgToSet->dlAmCfg.pollRetxTmr = rlcAmCfg->ul_AM_RLC.t_PollRetransmit; - amCfgToSet->dlAmCfg.pollPdu = rlcAmCfg->ul_AM_RLC.pollPDU; - amCfgToSet->dlAmCfg.pollByte = rlcAmCfg->ul_AM_RLC.pollByte; - amCfgToSet->dlAmCfg.maxRetxTh = rlcAmCfg->ul_AM_RLC.maxRetxThreshold; + amCfgToSet->dlAmCfg.snLenDl = covertAmSnLenFromRrcEnumToIntEnum(*(rlcAmCfg->ul_AM_RLC.sn_FieldLength)); + amCfgToSet->dlAmCfg.pollRetxTmr = covertPollRetxTmrEnumToValue(rlcAmCfg->ul_AM_RLC.t_PollRetransmit); + amCfgToSet->dlAmCfg.pollPdu = covertPollPduEnumToValue(rlcAmCfg->ul_AM_RLC.pollPDU); + amCfgToSet->dlAmCfg.pollByte = covertPollByteEnumToValue(rlcAmCfg->ul_AM_RLC.pollByte); + amCfgToSet->dlAmCfg.maxRetxTh = covertMaxRetxEnumToValue(rlcAmCfg->ul_AM_RLC.maxRetxThreshold); } } } @@ -7198,13 +9586,13 @@ void extractRlcUmBiCfg(UmBiDirBearerCfg *umBiCfgToSet, struct RLC_Config__um_Bi_ /* UL UM BI DIR Cfg */ if(rlcBiCfg->dl_UM_RLC.sn_FieldLength) { - umBiCfgToSet->ulUmCfg.snLenUlUm = *(rlcBiCfg->dl_UM_RLC.sn_FieldLength); - umBiCfgToSet->ulUmCfg.reAssemTmr = rlcBiCfg->dl_UM_RLC.t_Reassembly; + umBiCfgToSet->ulUmCfg.snLenUlUm = covertUmSnLenFromRrcEnumToIntEnum(*(rlcBiCfg->dl_UM_RLC.sn_FieldLength)); + umBiCfgToSet->ulUmCfg.reAssemTmr = convertReasmblTmrEnumToValue(rlcBiCfg->dl_UM_RLC.t_Reassembly); } /* DL UM BI DIR Cfg */ if(rlcBiCfg->ul_UM_RLC.sn_FieldLength) - umBiCfgToSet->dlUmCfg.snLenDlUm = *(rlcBiCfg->ul_UM_RLC.sn_FieldLength); + umBiCfgToSet->dlUmCfg.snLenDlUm = covertUmSnLenFromRrcEnumToIntEnum(*(rlcBiCfg->ul_UM_RLC.sn_FieldLength)); } } @@ -7231,8 +9619,8 @@ void extractRlcUmUlCfg(UmUniDirUlBearerCfg *umUlCfgToSet, struct RLC_Config__um_ { if(umUlCfg->dl_UM_RLC.sn_FieldLength) { - umUlCfgToSet->ulUmCfg.snLenUlUm = *(umUlCfg->dl_UM_RLC.sn_FieldLength); - umUlCfgToSet->ulUmCfg.reAssemTmr = umUlCfg->dl_UM_RLC.t_Reassembly; + umUlCfgToSet->ulUmCfg.snLenUlUm = covertUmSnLenFromRrcEnumToIntEnum(*(umUlCfg->dl_UM_RLC.sn_FieldLength)); + umUlCfgToSet->ulUmCfg.reAssemTmr = convertReasmblTmrEnumToValue(umUlCfg->dl_UM_RLC.t_Reassembly); } } } @@ -7258,7 +9646,7 @@ void extractRlcUmDlCfg(UmUniDirDlBearerCfg *umDlCfgToSet, struct RLC_Config__um_ if(umDlCfg) { if(umDlCfg->ul_UM_RLC.sn_FieldLength) - umDlCfgToSet->dlUmCfg.snLenDlUm = *(umDlCfg->ul_UM_RLC.sn_FieldLength); + umDlCfgToSet->dlUmCfg.snLenDlUm = covertUmSnLenFromRrcEnumToIntEnum(*(umDlCfg->ul_UM_RLC.sn_FieldLength)); } } @@ -7359,17 +9747,59 @@ void extractUlLcCfg(UlLcCfg *f1UlLcCfg, LogicalChannelConfig_t *ulLcCfg) f1UlLcCfg->lcGroup = \ *(ulLcCfg->ul_SpecificParameters->logicalChannelGroup); } - if(ulLcCfg->ul_SpecificParameters->schedulingRequestID) + if(ulLcCfg->ul_SpecificParameters->schedulingRequestID) + { + f1UlLcCfg->schReqId = \ + *(ulLcCfg->ul_SpecificParameters->schedulingRequestID); + } + f1UlLcCfg->pbr = \ + ulLcCfg->ul_SpecificParameters->prioritisedBitRate; + f1UlLcCfg->bsd = \ + ulLcCfg->ul_SpecificParameters->bucketSizeDuration; + } + } +} + +/******************************************************************* +* +* @brief Function to extract Snssai Cfg Info from CU +* +* @details +* +* Function : extractDrbSnssaiCfg +* +* Functionality: Function to extract Drb Snssai Cfg Info from CU +* +* @params[in] DRB_Information_t *drbInfo, Snssai *snssai +* @return ROK/RFAILED +* +* ****************************************************************/ + +uint8_t extractDrbSnssaiCfg(SNSSAI_t *RecvSnssai, Snssai **snssaiToBeShared) +{ + if(!(*snssaiToBeShared)) + { + DU_ALLOC_SHRABL_BUF((*snssaiToBeShared), sizeof(Snssai)); + if(snssaiToBeShared == NULLP) + { + DU_LOG("\nERROR --> DUAPP : extractDrbSnssaiCfg(): Memory failed at allocating for SNSSAI "); + return RFAILED; + } + } + if(RecvSnssai) + { + memcpy(&(*snssaiToBeShared)->sst, RecvSnssai->sST.buf, RecvSnssai->sST.size); + if(RecvSnssai->sD) { - f1UlLcCfg->schReqId = \ - *(ulLcCfg->ul_SpecificParameters->schedulingRequestID); + memcpy((*snssaiToBeShared)->sd, RecvSnssai->sD->buf, RecvSnssai->sD->size); } - f1UlLcCfg->pbr = \ - ulLcCfg->ul_SpecificParameters->prioritisedBitRate; - f1UlLcCfg->bsd = \ - ulLcCfg->ul_SpecificParameters->bucketSizeDuration; + else + { + DU_LOG("\nERROR --> DUAPP : extractDrbSnssaiCfg(): Received Null pointer of Snssai->SD"); + return RFAILED; } } + return ROK; } /******************************************************************* @@ -7389,8 +9819,9 @@ void extractUlLcCfg(UlLcCfg *f1UlLcCfg, LogicalChannelConfig_t *ulLcCfg) * ****************************************************************/ void procRlcLcCfg(uint8_t rbId, uint8_t lcId, uint8_t rbType, uint8_t rlcMode,\ - uint8_t configType, RLC_Config_t *f1RlcCfg, RlcBearerCfg *lcCfg) + uint8_t configType, RLC_Config_t *f1RlcCfg, RlcBearerCfg *lcCfg, QoSInformation_t *qoSInformation) { + DRB_Information_t *drbInfo; lcCfg->rbId = rbId; lcCfg->configType = configType; @@ -7413,10 +9844,24 @@ void procRlcLcCfg(uint8_t rbId, uint8_t lcId, uint8_t rbType, uint8_t rlcMode,\ { extractRlcModeCfg(lcCfg->rlcMode, lcCfg, f1RlcCfg); } + if(qoSInformation != NULLP) + { + if(qoSInformation->present == QoSInformation_PR_choice_extension) + { + if(qoSInformation->choice.choice_extension->value.present ==\ + QoSInformation_ExtIEs__value_PR_DRB_Information) + { + drbInfo = &qoSInformation->choice.choice_extension->value.choice.DRB_Information; + if(extractDrbSnssaiCfg(&drbInfo->sNSSAI, &lcCfg->snssai) != ROK) + { + DU_LOG("\nERROR --> DUAPP: Unable to extract Snssai information at procRlcLcCfg()"); + return; + } + } + } + } } - - /******************************************************************* * * @brief Fills DrbQos Info received by CU @@ -7435,43 +9880,64 @@ void procRlcLcCfg(uint8_t rbId, uint8_t lcId, uint8_t rbType, uint8_t rlcMode,\ void extractQosInfo(DrbQosInfo *qosToAdd, QoSFlowLevelQoSParameters_t *qosFlowCfg) { + uint8_t qosCntIdx = 0; + ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP; + qosToAdd->fiveQiType = qosFlowCfg->qoS_Characteristics.present; qosToAdd->u.nonDyn5Qi.fiveQi =\ - qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI; + qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI; if(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) { qosToAdd->u.nonDyn5Qi.avgWindow = \ - *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow); + *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow); } - qosToAdd->u.nonDyn5Qi.maxDataBurstVol = \ - *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume); + + if(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) + { + qosToAdd->u.nonDyn5Qi.maxDataBurstVol = \ + *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume); + } + if(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->qoSPriorityLevel) { qosToAdd->u.nonDyn5Qi.priorLevel = \ - *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->qoSPriorityLevel); + *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->qoSPriorityLevel); } qosToAdd->ngRanRetPri.priorityLevel = \ - qosFlowCfg->nGRANallocationRetentionPriority.priorityLevel; + qosFlowCfg->nGRANallocationRetentionPriority.priorityLevel; qosToAdd->ngRanRetPri.preEmptionCap = \ - qosFlowCfg->nGRANallocationRetentionPriority.pre_emptionCapability; + qosFlowCfg->nGRANallocationRetentionPriority.pre_emptionCapability; qosToAdd->ngRanRetPri.preEmptionVul = \ - qosFlowCfg->nGRANallocationRetentionPriority.pre_emptionVulnerability; + qosFlowCfg->nGRANallocationRetentionPriority.pre_emptionVulnerability; if(qosFlowCfg->gBR_QoS_Flow_Information) { memcpy(&qosToAdd->grbQosInfo.maxFlowBitRateDl, \ - qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateDownlink.buf, \ - qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateDownlink.size); + qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateDownlink.buf, \ + qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateDownlink.size); memcpy(&qosToAdd->grbQosInfo.maxFlowBitRateUl, \ - qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateUplink.buf, \ - qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateUplink.size); + qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateUplink.buf, \ + qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateUplink.size); memcpy(&qosToAdd->grbQosInfo.guarFlowBitRateDl,\ - qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateDownlink.buf, \ - qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateDownlink.size); + qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateDownlink.buf, \ + qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateDownlink.size); memcpy(&qosToAdd->grbQosInfo.guarFlowBitRateUl,\ - qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateUplink.buf, \ - qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateUplink.size); + qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateUplink.buf, \ + qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateUplink.size); + } + /*Extracting PDU_SESSION_ID*/ + qosIeExt = (ProtocolExtensionContainer_4624P74_t *)qosFlowCfg->iE_Extensions; + if(qosIeExt) + { + for(qosCntIdx = 0; qosCntIdx < qosIeExt->list.count; qosCntIdx++) + { + if(qosIeExt->list.array[qosCntIdx]->extensionValue.present == \ + QoSFlowLevelQoSParameters_ExtIEs__extensionValue_PR_PDUSessionID) + { + qosToAdd->pduSessionId = qosIeExt->list.array[qosCntIdx]->extensionValue.choice.PDUSessionID; + DU_LOG("\nDEBUG --> DU_F1AP : extractQosInfo: PDU SessionID:%d",qosToAdd->pduSessionId); + } + } } - qosToAdd->pduSessionId = 0; qosToAdd->ulPduSessAggMaxBitRate = 0; } @@ -7530,6 +9996,7 @@ uint8_t extractUpTnlInfo(uint8_t drbId, uint8_t configType,\ } return ROK; } + /******************************************************************* * * @brief Function to extract Drb Qos Cfg Info from CU @@ -7552,7 +10019,7 @@ uint8_t extractDrbQosCfg(DRB_Information_t *drbInfo, LcCfg *macLcToAdd ) DU_ALLOC_SHRABL_BUF(macLcToAdd->drbQos, sizeof(DrbQosInfo)); if(macLcToAdd->drbQos == NULLP) { - DU_LOG("\nERROR --> DUAPP:Memory failed at allocating DrbQos at extractDrbCfg()"); + DU_LOG("\nERROR --> DUAPP:Memory failed at allocating DrbQos at extractDrbQosCfg()"); return RFAILED; } @@ -7562,21 +10029,10 @@ uint8_t extractDrbQosCfg(DRB_Information_t *drbInfo, LcCfg *macLcToAdd ) extractQosInfo(macLcToAdd->drbQos, &drbInfo->dRB_QoS); macLcToAdd->dlLcCfg.lcp = macLcToAdd->drbQos->ngRanRetPri.priorityLevel; } - if(!macLcToAdd->snssai) - { - DU_ALLOC_SHRABL_BUF(macLcToAdd->snssai, sizeof(Snssai)); - if(macLcToAdd->snssai == NULLP) - { - DU_LOG("\nERROR --> DUAPP : Memory failed at allocating SNSSAI at extractDrbCfg()"); - return RFAILED; - } - } - memcpy(&macLcToAdd->snssai->sst, drbInfo->sNSSAI.sST.buf, \ - drbInfo->sNSSAI.sST.size); - if(drbInfo->sNSSAI.sD) + if(extractDrbSnssaiCfg(&drbInfo->sNSSAI, &macLcToAdd->snssai) != ROK) { - memcpy(macLcToAdd->snssai->sd, drbInfo->sNSSAI.sD->buf, \ - drbInfo->sNSSAI.sD->size); + DU_LOG("\nERROR --> DUAPP: Unable to extract Snssai information at extractDrbQosCfg()"); + return RFAILED; } return ROK; } @@ -7594,8 +10050,8 @@ uint8_t extractDrbQosCfg(DRB_Information_t *drbInfo, LcCfg *macLcToAdd ) * @return void * * ****************************************************************/ -uint8_t extractDrbCfg(DRBs_ToBeSetup_Item_t *drbItem,DRBs_ToBeSetupMod_Item_t *drbSetupModItem,\ -LcCfg *macLcToAdd, UpTnlCfg *upTnlInfo) +uint8_t extractDrbCfg(DRBs_ToBeSetup_Item_t *drbItem, DRBs_ToBeSetupMod_Item_t *drbSetupModItem,\ +DRBs_ToBeModified_Item_t *drbModItem, LcCfg *macLcToAdd, UpTnlCfg *upTnlInfo) { DRB_Information_t *drbInfo = NULLP; @@ -7642,7 +10098,32 @@ LcCfg *macLcToAdd, UpTnlCfg *upTnlInfo) } } } + else if(drbModItem != NULLP) + { + if(extractUpTnlInfo(drbModItem->dRBID, CONFIG_MOD, &drbModItem->uLUPTNLInformation_ToBeSetup_List,\ + upTnlInfo) != ROK) + { + DU_LOG("\nERROR --> DUAPP : Failed to extract tunnel Cfg at extractDrbCfg()"); + return RFAILED; + } + if(drbModItem->qoSInformation != NULLP) + { + if(drbModItem->qoSInformation->present == QoSInformation_PR_choice_extension) + { + if(drbModItem->qoSInformation->choice.choice_extension->value.present ==\ + QoSInformation_ExtIEs__value_PR_DRB_Information) + { + drbInfo = &drbModItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information; + if(extractDrbQosCfg(drbInfo , macLcToAdd) != ROK) + { + DU_LOG("\nERROR --> DUAPP : Failed to extract qos Cfg at extractDrbCfg()"); + return RFAILED; + } + } + } + } + } return ROK; } @@ -7662,11 +10143,11 @@ LcCfg *macLcToAdd, UpTnlCfg *upTnlInfo) * ****************************************************************/ uint8_t extractMacRbCfg(uint8_t lcId, DRBs_ToBeSetup_Item_t *drbCfg,\ -DRBs_ToBeSetupMod_Item_t *drbSetupModCfg, LogicalChannelConfig_t *ulLcCfg, LcCfg *lcCfg, UpTnlCfg *upTnlInfo) +DRBs_ToBeSetupMod_Item_t *drbSetupModCfg, DRBs_ToBeModified_Item_t *drbModCfg, LogicalChannelConfig_t *ulLcCfg, LcCfg *lcCfg, UpTnlCfg *upTnlInfo) { if(drbCfg != NULLP) { - if(extractDrbCfg(drbCfg, NULL, lcCfg, upTnlInfo) != ROK) + if(extractDrbCfg(drbCfg, NULL, NULL, lcCfg, upTnlInfo) != ROK) { DU_LOG("ERROR --> F1AP : Failed to build Drb Qos at extractMacRbCfg()"); return RFAILED; @@ -7674,7 +10155,15 @@ DRBs_ToBeSetupMod_Item_t *drbSetupModCfg, LogicalChannelConfig_t *ulLcCfg, LcCf } else if(drbSetupModCfg != NULLP) { - if(extractDrbCfg(NULL, drbSetupModCfg, lcCfg, upTnlInfo) != ROK) + if(extractDrbCfg(NULL, drbSetupModCfg, NULL, lcCfg, upTnlInfo) != ROK) + { + DU_LOG("ERROR --> F1AP : Failed to build Drb Qos at extractMacRbCfg()"); + return RFAILED; + } + } + else if(drbModCfg != NULLP) + { + if(extractDrbCfg(NULL, NULL, drbModCfg, lcCfg, upTnlInfo) != ROK) { DU_LOG("ERROR --> F1AP : Failed to build Drb Qos at extractMacRbCfg()"); return RFAILED; @@ -7714,8 +10203,8 @@ DRBs_ToBeSetupMod_Item_t *drbSetupModCfg, LogicalChannelConfig_t *ulLcCfg, LcCf * * ****************************************************************/ -uint8_t procMacLcCfg(uint8_t lcId, uint8_t rbType, uint8_t configType,\ -DRBs_ToBeSetup_Item_t *drbItem, DRBs_ToBeSetupMod_Item_t *drbSetupModItem, LogicalChannelConfig_t *ulLcCfg,\ +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) { uint8_t ret = ROK; @@ -7724,14 +10213,16 @@ LcCfg *lcCfg, UpTnlCfg *upTnlInfo) lcCfg->configType = configType; if(rbType == RB_TYPE_SRB) { - ret = extractMacRbCfg(lcId, NULL,NULL, ulLcCfg, lcCfg, NULL); + ret = extractMacRbCfg(lcId, NULL, NULL, NULL, ulLcCfg, lcCfg, NULL); } else if(rbType == RB_TYPE_DRB) { if(drbItem != NULL) - ret = extractMacRbCfg(lcId, drbItem, NULL, ulLcCfg, lcCfg, upTnlInfo); + ret = extractMacRbCfg(lcId, drbItem, NULL, NULL, ulLcCfg, lcCfg, upTnlInfo); else if(drbSetupModItem != NULL) - ret = extractMacRbCfg(lcId, NULL, drbSetupModItem, ulLcCfg, lcCfg, upTnlInfo); + ret = extractMacRbCfg(lcId, NULL, drbSetupModItem, NULL, ulLcCfg, lcCfg, upTnlInfo); + else if(drbModItem != NULL) + ret = extractMacRbCfg(lcId, NULL, NULL, drbModItem, ulLcCfg, lcCfg, upTnlInfo); } return ret; } @@ -7802,14 +10293,16 @@ 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)); - procRlcLcCfg(rbId, lcId, rbType, rlcMode, CONFIG_UNKNOWN, f1RlcCfg, &(ueCfgDb->rlcLcCfg[idx])); - if(procMacLcCfg(lcId, rbType, CONFIG_UNKNOWN, NULL, NULL, macUlLcCfg, &ueCfgDb->macLcCfg[idx], NULL) != ROK) + 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) { DU_LOG("\nERROR --> DU APP : Failed while filling MAC LC config at extractRlcCfgToAddMod()"); return RFAILED; } (ueCfgDb->numRlcLcs)++; (ueCfgDb->numMacLcs)++; + DU_LOG("\nDEBUG -> DUAPP: extractRlcCfgToAddMod:RBType:%d, DrbID: %d,lcId:%d, [RLC,MAC,NumDrb]:[%x,%x,%x]",\ + rbType, rbId, lcId, ueCfgDb->numRlcLcs, ueCfgDb->numMacLcs, ueCfgDb->numDrb); } //TODO: To send the failure cause in UeContextSetupRsp return ROK; @@ -8051,31 +10544,34 @@ void extractPdcchCfg(PDCCH_Config_t *cuPdcchCfg, PdcchConfig *macPdcchCfg) if(cRsetToAddModList->list.count) { macPdcchCfg->numCRsetToAddMod = cRsetToAddModList->list.count; - for(cRsetIdx = 0; cRsetIdx < cRsetToAddModList->list.count; cRsetIdx++) - { - macPdcchCfg->cRSetToAddModList[cRsetIdx].cRSetId = \ - cRsetToAddModList->list.array[cRsetIdx]->controlResourceSetId; - bitStringToInt(&cRsetToAddModList->list.array[cRsetIdx]->frequencyDomainResources,\ - macPdcchCfg->cRSetToAddModList[cRsetIdx].freqDomainRsrc); + for(cRsetIdx = 0; cRsetIdx < cRsetToAddModList->list.count; cRsetIdx++) + { + macPdcchCfg->cRSetToAddModList[cRsetIdx].cRSetId = \ + cRsetToAddModList->list.array[cRsetIdx]->controlResourceSetId; + //freqDomRsrcBitStringToInt(&cRsetToAddModList->list.array[cRsetIdx]->frequencyDomainResources,\ + macPdcchCfg->cRSetToAddModList[cRsetIdx].freqDomainRsrc); + memcpy(macPdcchCfg->cRSetToAddModList[cRsetIdx].freqDomainRsrc, \ + cRsetToAddModList->list.array[cRsetIdx]->frequencyDomainResources.buf, + cRsetToAddModList->list.array[cRsetIdx]->frequencyDomainResources.size); + macPdcchCfg->cRSetToAddModList[cRsetIdx].duration = \ - cRsetToAddModList->list.array[cRsetIdx]->duration; + cRsetToAddModList->list.array[cRsetIdx]->duration; - macPdcchCfg->cRSetToAddModList[cRsetIdx].cceRegMappingType = \ - cRsetToAddModList->list.array[cRsetIdx]->cce_REG_MappingType.present; + macPdcchCfg->cRSetToAddModList[cRsetIdx].cceRegMappingType = \ + cRsetToAddModList->list.array[cRsetIdx]->cce_REG_MappingType.present; if(macPdcchCfg->cRSetToAddModList[cRsetIdx].cceRegMappingType == CCE_REG_MAPPINGTYPE_PR_INTERLEAVED) - { - //TODO: handle the case for Interleaved + { + //TODO: handle the case for Interleaved } macPdcchCfg->cRSetToAddModList[cRsetIdx].precoderGranularity = \ - cRsetToAddModList->list.array[cRsetIdx]->precoderGranularity; - if(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID) - { - macPdcchCfg->cRSetToAddModList[cRsetIdx].dmrsScramblingId= \ - *(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID); - } + cRsetToAddModList->list.array[cRsetIdx]->precoderGranularity; + if(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID) + { + macPdcchCfg->cRSetToAddModList[cRsetIdx].dmrsScramblingId= \ + *(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID); + } } } - } /* Control Resource Set To Release List */ if(cuPdcchCfg->controlResourceSetToReleaseList) @@ -8084,10 +10580,10 @@ void extractPdcchCfg(PDCCH_Config_t *cuPdcchCfg, PdcchConfig *macPdcchCfg) if(cRsetToRelList->list.count) { macPdcchCfg->numCRsetToRel = cRsetToRelList->list.count; - for(cRsetIdx = 0; cRsetIdx < cRsetToRelList->list.count; cRsetIdx++) - { + for(cRsetIdx = 0; cRsetIdx < cRsetToRelList->list.count; cRsetIdx++) + { macPdcchCfg->cRSetToRelList[cRsetIdx] = *(cRsetToRelList->list.array[cRsetIdx]); - } + } } } @@ -8098,49 +10594,49 @@ void extractPdcchCfg(PDCCH_Config_t *cuPdcchCfg, PdcchConfig *macPdcchCfg) if(srchSpcToAddModList->list.count) { macPdcchCfg->numSearchSpcToAddMod = srchSpcToAddModList->list.count; - for(srchSpcIdx = 0; srchSpcIdx < srchSpcToAddModList->list.count; srchSpcIdx++) - { + for(srchSpcIdx = 0; srchSpcIdx < srchSpcToAddModList->list.count; srchSpcIdx++) + { macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceId =\ - srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceId; + srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceId; macPdcchCfg->searchSpcToAddModList[srchSpcIdx].cRSetId =\ - *(srchSpcToAddModList->list.array[srchSpcIdx]->controlResourceSetId); - if(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset) - { + *(srchSpcToAddModList->list.array[srchSpcIdx]->controlResourceSetId); + if(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset) + { macPdcchCfg->searchSpcToAddModList[srchSpcIdx].mSlotPeriodicityAndOffset =\ - srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset->present; + srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset->present; } if(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSymbolsWithinSlot) { - bitStringToInt(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSymbolsWithinSlot,\ - macPdcchCfg->searchSpcToAddModList[srchSpcIdx].mSymbolsWithinSlot); + bitStringToInt(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSymbolsWithinSlot,\ + macPdcchCfg->searchSpcToAddModList[srchSpcIdx].mSymbolsWithinSlot); } - if(srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates) + if(srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates) { - macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel1 = \ - srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel1; - macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel2 = \ - srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel2; - macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel4 = \ - srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel4; - - macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel8 = \ - srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel8; - - macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel16 = \ - srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel16; - } + macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel1 = \ + srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel1; + macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel2 = \ + srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel2; + macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel4 = \ + srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel4; + + macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel8 = \ + srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel8; + + macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel16 = \ + srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel16; + } if(srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType) - { - macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType =\ - srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->present; - if(macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType == SEARCHSPACETYPE_PR_UE_SPECIFIC) - { - macPdcchCfg->searchSpcToAddModList[srchSpcIdx].ueSpecificDciFormat =\ - srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->choice.ue_Specific->dci_Formats; - } - - } - } + { + macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType =\ + srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->present; + if(macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType == SEARCHSPACETYPE_PR_UE_SPECIFIC) + { + macPdcchCfg->searchSpcToAddModList[srchSpcIdx].ueSpecificDciFormat =\ + srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->choice.ue_Specific->dci_Formats; + } + + } + } } } /* Search space To Rel List */ @@ -8150,11 +10646,11 @@ void extractPdcchCfg(PDCCH_Config_t *cuPdcchCfg, PdcchConfig *macPdcchCfg) if(srchSpcToRelList->list.count) { macPdcchCfg->numSearchSpcToRel = srchSpcToRelList->list.count; - for(srchSpcIdx = 0; srchSpcIdx < srchSpcToRelList->list.count; srchSpcIdx++) - { + for(srchSpcIdx = 0; srchSpcIdx < srchSpcToRelList->list.count; srchSpcIdx++) + { macPdcchCfg->searchSpcToRelList[srchSpcIdx] =\ - *(srchSpcToRelList->list.array[srchSpcIdx]); - } + *(srchSpcToRelList->list.array[srchSpcIdx]); + } } } } @@ -8234,7 +10730,7 @@ void extractPdschCfg(PDSCH_Config_t *cuPdschCfg, PdschConfig *macPdschCfg, Pdsch if(!macPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0) { DU_LOG("\nERROR --> DU APP : Memory allocation failed for k0 at extractPdschCfg()"); - return RFAILED; + return; } } *(macPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0) = \ @@ -8552,8 +11048,16 @@ void extractResrcSetToAddModList(PucchResrcSetCfg *macRsrcSetList, struct PUCCH_ macRsrcSetList->resrcSetToAddModList[arrIdx].resrcList[rsrcListIdx] =\ *cuRsrcSetList->list.array[arrIdx]->resourceList.list.array[rsrcListIdx]; } - macRsrcSetList->resrcSetToAddModList[arrIdx].maxPayLoadSize =\ - *cuRsrcSetList->list.array[arrIdx]->maxPayloadMinus1; + + if(cuRsrcSetList->list.array[arrIdx]->maxPayloadMinus1) + { + macRsrcSetList->resrcSetToAddModList[arrIdx].maxPayLoadSize =\ + *cuRsrcSetList->list.array[arrIdx]->maxPayloadMinus1; + } + else + { + macRsrcSetList->resrcSetToAddModList[arrIdx].maxPayLoadSize = 0; + } } }/* End of extractResrcSetToAddModList */ @@ -9106,7 +11610,21 @@ ServCellCfgInfo *storedSrvCellCfg) if(dlBwp->pdcch_Config->choice.setup) { macSrvCellCfg->initDlBwp.pdcchPresent = true; - extractPdcchCfg(dlBwp->pdcch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdcchCfg); + if(storedSrvCellCfg) + { + if(!storedSrvCellCfg->initDlBwp.pdcchPresent) + { + extractPdcchCfg(dlBwp->pdcch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdcchCfg); + } + else + { + extractPdcchCfg(dlBwp->pdcch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdcchCfg); + } + } + else + { + extractPdcchCfg(dlBwp->pdcch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdcchCfg); + } } } if(dlBwp->pdsch_Config) @@ -9711,7 +12229,7 @@ void freeAperDecodeDRBSetup(DRBs_ToBeSetup_List_t *drbSet) * @return void * * ****************************************************************/ -uint8_t procUeReCfgCellInfo(MacUeCfg *macUeCfgToSend,MacUeCfg *storedMacUeCfg, void *cellInfo) +uint8_t procUeReCfgCellInfo(MacUeCfg *macUeCfgToSend, MacUeCfg *storedMacUeCfg, void *cellInfo) { uint8_t ret = ROK; CellGroupConfigRrc_t *cellGrp = NULLP; @@ -9751,7 +12269,7 @@ void duFillModulationDetails(MacUeCfg *ueCfg, MacUeCfg *oldUeCfg, void *ueCap) { UE_NR_Capability_t *ueNrCap=NULLP; - if(!ueCap) + if(!ueCap && oldUeCfg) { memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo)); memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo)); @@ -9792,14 +12310,16 @@ void duFillModulationDetails(MacUeCfg *ueCfg, MacUeCfg *oldUeCfg, void *ueCap) default: { DU_LOG("\nERROR --> DU APP: Incorrect downlink modulation order received. Reatining old modulation configuration"); - memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo)); + if(oldUeCfg) + memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo)); break; } } } else { - memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo)); + if(oldUeCfg) + memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo)); } /* Filling UL modulation info */ @@ -9834,40 +12354,40 @@ void duFillModulationDetails(MacUeCfg *ueCfg, MacUeCfg *oldUeCfg, void *ueCap) default: { DU_LOG("\nERROR --> DU APP: Incorrect uplink modulation order received. Reatining old modulation configuration"); - memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo)); + if(oldUeCfg) + memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo)); break; } } } else { - memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo)); + if(oldUeCfg) + memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo)); } } } /******************************************************************* * - * @brief Function to extract cellGrp Info present in cutoDu cont + * @brief Function to extract info from CU to DU RRC container extension * * @details * - * Function : extractCellGrpInfo + * Function : extractCuToDuRrcInfoExt * - * Functionality: Function to extract cellGrp Info present - * in cutoDu cont + * Functionality: Function to extract info from CU to DU RRC container + * extension * * @params[in] ProtocolExtensionContainer_4624P16_t pointer * - * @return CellGroupConfigRrc_t * + * @return ROK + * RFAILED * * ****************************************************************/ - -CellGroupConfigRrc_t *extractCellGrpInfo(ProtocolExtensionContainer_4624P16_t *protocolIeExtn,\ - DuUeCfg *ueCfgDb) +uint8_t extractCuToDuRrcInfoExt(ProtocolExtensionContainer_4624P16_t *protocolIeExtn, DuUeCfg *ueCfgDb) { - uint8_t idx2 =0; - uint16_t id =0; + uint8_t ieIdx =0; uint16_t recvBufLen =0; CellGroupConfigRrc_t *cellGrpCfg = NULLP; CUtoDURRCInformation_ExtIEs_t *extIeInfo = NULLP; @@ -9876,40 +12396,48 @@ CellGroupConfigRrc_t *extractCellGrpInfo(ProtocolExtensionContainer_4624P16_t *p if(protocolIeExtn) { - for(idx2 = 0; idx2 < protocolIeExtn->list.count; idx2++) + for(ieIdx = 0; ieIdx < protocolIeExtn->list.count; ieIdx++) { - extIeInfo = ((CUtoDURRCInformation_ExtIEs_t *)(protocolIeExtn->list.array[idx2])); - id = extIeInfo->id; - switch(id) + extIeInfo = ((CUtoDURRCInformation_ExtIEs_t *)(protocolIeExtn->list.array[ieIdx])); + switch(extIeInfo->id) { case ProtocolIE_ID_id_CellGroupConfig: - { - recvBufLen = extIeInfo->extensionValue.choice.CellGroupConfig.size; - /* decoding the CellGroup Buf received */ - DU_ALLOC(cellGrpCfg, sizeof(CellGroupConfigRrc_t)); - if(cellGrpCfg) - { - memset(cellGrpCfg, 0, sizeof(CellGroupConfigRrc_t)); - rval = aper_decode(0, &asn_DEF_CellGroupConfigRrc, (void **)&cellGrpCfg, - extIeInfo->extensionValue.choice.CellGroupConfig.buf, recvBufLen, 0, 0); - if(rval.code == RC_FAIL || rval.code == RC_WMORE) + { + /* decoding the CellGroup Buf received */ + recvBufLen = extIeInfo->extensionValue.choice.CellGroupConfig.size; + DU_ALLOC(cellGrpCfg, sizeof(CellGroupConfigRrc_t)); + if(cellGrpCfg) { - DU_LOG("\nERROR --> F1AP : ASN decode failed at decodeCellGrpCfg()"); - return NULLP; + memset(cellGrpCfg, 0, sizeof(CellGroupConfigRrc_t)); + rval = aper_decode(0, &asn_DEF_CellGroupConfigRrc, (void **)&cellGrpCfg, + extIeInfo->extensionValue.choice.CellGroupConfig.buf, recvBufLen, 0, 0); + if(rval.code == RC_FAIL || rval.code == RC_WMORE) + { + DU_LOG("\nERROR --> F1AP : ASN decode failed at decodeCellGrpCfg()"); + return RFAILED; + } + xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, cellGrpCfg); + + if(extractRlcCfgToAddMod(cellGrpCfg->rlc_BearerToAddModList, ueCfgDb)) + return NULLP; + ueCfgDb->cellGrpCfg = cellGrpCfg; } - xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, cellGrpCfg); - if(extractRlcCfgToAddMod(cellGrpCfg->rlc_BearerToAddModList, ueCfgDb)) - return NULLP; - } - break; - } + break; + } + + case ProtocolIE_ID_id_HandoverPreparationInformation: + { + DU_LOG("\nINFO --> F1AP : Received HANDOVER PREPARATION INFO in UE CONTEXT SETUP REQUEST"); + break; + } + default: - DU_LOG("\nERROR --> F1AP : Invalid IE received CUtoDURRCInformation:%d at decodeCellGrpCfg()", id); - break; + DU_LOG("\nERROR --> F1AP : Invalid IE received CUtoDURRCInformation: %ld at decodeCellGrpCfg()", extIeInfo->id); + break; } } } - return cellGrpCfg; + return ROK; } /******************************************************************* @@ -9930,19 +12458,18 @@ CellGroupConfigRrc_t *extractCellGrpInfo(ProtocolExtensionContainer_4624P16_t *p * ****************************************************************/ uint8_t procSrbListToSetup(SRBs_ToBeSetup_Item_t * srbItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcLcToAdd) { - uint8_t ret = ROK; /* Filling RLC INFO */ - procRlcLcCfg(srbItem->sRBID, srbItem->sRBID, RB_TYPE_SRB, RLC_AM, CONFIG_ADD, NULL, rlcLcToAdd); + procRlcLcCfg(srbItem->sRBID, srbItem->sRBID, RB_TYPE_SRB, RLC_AM, CONFIG_ADD, NULL, rlcLcToAdd, NULL); /* Filling MAC INFO */ - ret = procMacLcCfg(srbItem->sRBID, RB_TYPE_SRB, CONFIG_ADD, NULL,NULL, NULL, macLcToAdd, NULL); - if(ret == RFAILED) + if(procMacLcCfg(srbItem->sRBID, RB_TYPE_SRB, CONFIG_ADD, NULL,NULL, NULL, NULL, macLcToAdd, NULL) != ROK) { DU_LOG("\nERROR --> F1AP : Failed at MAC LC Cfg in procSrbListToSetup()"); - return ret; + return RFAILED; } - return ret; + + return ROK; } @@ -9966,37 +12493,63 @@ uint8_t procSrbListToSetup(SRBs_ToBeSetup_Item_t * srbItem, LcCfg *macLcToAdd, R uint8_t extractSrbListToSetup(SRBs_ToBeSetup_List_t *srbCfg, DuUeCfg *ueCfgDb) { - uint8_t ret, srbIdx; + uint8_t ret = ROK, srbIdx = 0, rlcLcIdx = 0; SRBs_ToBeSetup_Item_t *srbItem = NULLP; + LcCfg *macLcCtxt = NULLP; + RlcBearerCfg *rlcLcCtxt = NULLP; if(srbCfg) { for(srbIdx = 0; srbIdx < srbCfg->list.count; srbIdx++) { + macLcCtxt = NULL; + rlcLcCtxt = NULL; + srbItem = &srbCfg->list.array[srbIdx]->value.choice.SRBs_ToBeSetup_Item; if(ueCfgDb->numMacLcs > MAX_NUM_LC) - { + { DU_LOG("\nERROR --> F1AP: MAX LC Reached in MAC"); - ret = RFAILED; - break; - } + ret = RFAILED; + break; + } if(ueCfgDb->numRlcLcs > MAX_NUM_LC) - { + { DU_LOG("\nERROR --> F1AP: MAX LC Reached in RLC"); - ret = RFAILED; - break; - } - memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(LcCfg)); - memset(&ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], 0, sizeof(RlcBearerCfg)); - ret = procSrbListToSetup(srbItem, &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs],\ - &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs]); - ueCfgDb->numRlcLcs++; - ueCfgDb->numMacLcs++; - if(ret == RFAILED) - { + ret = RFAILED; + break; + } + + for(rlcLcIdx = 0; rlcLcIdx < ueCfgDb->numMacLcs; rlcLcIdx++) + { + if(ueCfgDb->rlcLcCfg[rlcLcIdx].rbId == srbItem->sRBID && ueCfgDb->rlcLcCfg[rlcLcIdx].rbType == RB_TYPE_SRB) + { + macLcCtxt = &ueCfgDb->macLcCfg[rlcLcIdx]; + rlcLcCtxt = &ueCfgDb->rlcLcCfg[rlcLcIdx]; + break; + } + } + if(!macLcCtxt) + { + memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(LcCfg)); + macLcCtxt = &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs]; + ueCfgDb->numMacLcs++; + } + if(!rlcLcCtxt) + { + memset(&ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], 0, sizeof(RlcBearerCfg)); + rlcLcCtxt = &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs]; + ueCfgDb->numRlcLcs++; + } + + ret = procSrbListToSetup(srbItem, macLcCtxt, rlcLcCtxt); + + DU_LOG("\nDEBUG --> DUAPP: extractSrbListToSetup: SRBID: %ld [RLC,MAC,NumDrb]:[%x,%x,%x]",\ + srbItem->sRBID, ueCfgDb->numRlcLcs, ueCfgDb->numMacLcs, ueCfgDb->numDrb); + if(ret == RFAILED) + { DU_LOG("\nERROR --> F1AP: Failed at extractSrbListToSetup()"); - break; - } + break; + } } } else @@ -10011,41 +12564,68 @@ uint8_t extractSrbListToSetup(SRBs_ToBeSetup_List_t *srbCfg, DuUeCfg *ueCfgDb) * * @details * - * Function : procDrbListToSetup + * Function : procDrbListToSetupMod * * Functionality: Fills Drb List received by CU * for both MAC and RLC * - * @params[in] SRBs_ToBeSetup_Item_t pointer - * LcCfg pointer, - * RlcBearerCfg pointer + * @params[in] DRBs_ToBeSetup_Item_t , DRBs_ToBeSetupMod_Item_t, + * DRBs_ToBeModified_Item_t , lcId, LcCfg pointer, + * RlcBearerCfg , UpTnlCfg, RlcUeCfg * @return void * * ****************************************************************/ -uint8_t procDrbListToSetup(uint8_t lcId, DRBs_ToBeSetup_Item_t *drbItem,\ -DRBs_ToBeSetupMod_Item_t *drbSetupModItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcLcToAdd, UpTnlCfg *upTnlInfo) +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) { + uint8_t cfgIdx = 0; + RlcMode rlcModeInfo; if(drbItem != NULLP) { /* Filling RLC INFO */ - procRlcLcCfg(drbItem->dRBID, lcId, RB_TYPE_DRB, drbItem->rLCMode, CONFIG_ADD, NULL, rlcLcToAdd); + procRlcLcCfg(drbItem->dRBID, lcId, RB_TYPE_DRB, drbItem->rLCMode, CONFIG_ADD, NULL, rlcLcToAdd, &drbItem->\ + qoSInformation); /* Filling MAC INFO */ - if(procMacLcCfg(lcId, RB_TYPE_DRB, CONFIG_ADD, drbItem, NULL, NULL, macLcToAdd, upTnlInfo) != ROK) + if(procMacLcCfg(lcId, RB_TYPE_DRB, CONFIG_ADD, drbItem, NULL, NULL, NULL, macLcToAdd, upTnlInfo) != ROK) { - DU_LOG("\nERROR --> F1AP : Failed at RLC LC Cfg in procDrbListToSetup()"); + DU_LOG("\nERROR --> F1AP : Failed at RLC LC Cfg in procDrbListToSetupMod()"); return RFAILED; } } else if(drbSetupModItem != NULLP) { - procRlcLcCfg(drbSetupModItem->dRBID, lcId, RB_TYPE_DRB, drbSetupModItem->rLCMode, CONFIG_ADD, NULL, rlcLcToAdd); + procRlcLcCfg(drbSetupModItem->dRBID, lcId, RB_TYPE_DRB, drbSetupModItem->rLCMode, CONFIG_ADD, NULL, rlcLcToAdd, + &drbSetupModItem->qoSInformation); + + if(procMacLcCfg(lcId, RB_TYPE_DRB, CONFIG_ADD, NULL, drbSetupModItem, NULL, NULL, macLcToAdd, upTnlInfo) != ROK) + { + DU_LOG("\nERROR --> F1AP : Failed at RLC LC Cfg in procDrbListToSetupMod()"); + return RFAILED; + } + } + else if(drbModItem != NULLP) + { + /* Drb to Mod IEs doesnot have rlcMode to be modified + * in ASN. Hence no change in RLC configurations */ + if(storedRlcUeCfg != NULLP) + { + for(cfgIdx = 0; cfgIdx < storedRlcUeCfg->numLcs; cfgIdx++) + { + if(storedRlcUeCfg->rlcLcCfg[cfgIdx].lcId == lcId) + { + rlcModeInfo = storedRlcUeCfg->rlcLcCfg[cfgIdx].rlcMode; + break; + } + } + } - if(procMacLcCfg(lcId, RB_TYPE_DRB, CONFIG_ADD, NULL, drbSetupModItem, NULL, macLcToAdd, upTnlInfo) != ROK) + procRlcLcCfg(drbModItem->dRBID, lcId, RB_TYPE_DRB, rlcModeInfo, CONFIG_MOD, NULL, rlcLcToAdd, drbModItem->qoSInformation); + if(procMacLcCfg(lcId, RB_TYPE_DRB, CONFIG_MOD, NULL, NULL, drbModItem, NULL, macLcToAdd, upTnlInfo) != ROK) { - DU_LOG("\nERROR --> F1AP : Failed at RLC LC Cfg in procDrbListToSetup()"); + DU_LOG("\nERROR --> F1AP : Failed at RLC LC Cfg in procDrbListToSetupMod()"); return RFAILED; } } @@ -10058,7 +12638,7 @@ DRBs_ToBeSetupMod_Item_t *drbSetupModItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcL * * @details * - * Function : extractDrbListToSetup + * Function : extractDrbListToSetupMod * * Functionality: extract Drb List received by CU * for both MAC and RLC @@ -10069,62 +12649,128 @@ DRBs_ToBeSetupMod_Item_t *drbSetupModItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcL * * ****************************************************************/ -uint8_t extractDrbListToSetup(uint8_t lcId, DRBs_ToBeSetup_List_t *drbCfg,DRBs_ToBeSetupMod_List_t *drbSetupModCfg,\ -uint8_t drbCount, DuUeCfg *ueCfgDb) +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) { - uint8_t ret, drbIdx; + uint8_t ret = ROK; + uint8_t drbIdx = 0, rlcLcIdx = 0; + uint8_t drbId = 0, lcId = 0; DRBs_ToBeSetup_Item_t *drbItem = NULLP; DRBs_ToBeSetupMod_ItemIEs_t *drbSetupModItem = NULLP; + DRBs_ToBeModified_ItemIEs_t *drbModItem = NULLP; + LcCfg *macLcCtxt = NULLP; + RlcBearerCfg *rlcLcCtxt = NULLP; ret = ROK; if(drbCount > 0) { for(drbIdx = 0; drbIdx < drbCount; drbIdx++) { + macLcCtxt = NULL; + rlcLcCtxt = NULL; + if(ueCfgDb->numMacLcs > MAX_NUM_LC) { - DU_LOG("\nERROR --> F1AP : MAX LC Reached in MAC at extractDrbListToSetup()"); + DU_LOG("\nERROR --> F1AP : MAX LC Reached in MAC at extractDrbListToSetupMod()"); ret = RFAILED; break; } if(ueCfgDb->numRlcLcs > MAX_NUM_LC) { - DU_LOG("\nERROR --> F1AP : MAX LC Reached in RLC at extractDrbListToSetup()"); + DU_LOG("\nERROR --> F1AP : MAX LC Reached in RLC at extractDrbListToSetupMod()"); ret = RFAILED; break; } - memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(LcCfg)); - memset(&ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], 0, sizeof(RlcBearerCfg)); - - if(drbCfg != NULL) + + if(drbModCfg != NULLP) { - drbItem = &drbCfg->list.array[drbIdx]->value.choice.DRBs_ToBeSetup_Item; - ret = procDrbListToSetup(lcId, drbItem, NULL, &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs],\ - &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], &ueCfgDb->upTnlInfo[ueCfgDb->numDrb]); - if(ret == RFAILED) + drbModItem = (DRBs_ToBeModified_ItemIEs_t *) drbModCfg->list.array[drbIdx]; + drbId = drbModItem->value.choice.DRBs_ToBeModified_Item.dRBID; + } + else if(drbCfg != NULLP) + drbId = drbCfg->list.array[drbIdx]->value.choice.DRBs_ToBeSetup_Item.dRBID; + else if(drbSetupModCfg != NULL) + { + drbSetupModItem = (DRBs_ToBeSetupMod_ItemIEs_t *) drbSetupModCfg->list.array[drbIdx]; + drbId = drbSetupModItem->value.choice.DRBs_ToBeSetupMod_Item.dRBID; + } + + for(rlcLcIdx = 0; rlcLcIdx < ueCfgDb->numRlcLcs; rlcLcIdx++) + { + if(ueCfgDb->rlcLcCfg[rlcLcIdx].rbId == drbId && ueCfgDb->rlcLcCfg[rlcLcIdx].rbType == RB_TYPE_DRB) { - DU_LOG("\nERROR --> F1AP : Failed at extractDrbListToSetup()"); + macLcCtxt = &ueCfgDb->macLcCfg[rlcLcIdx]; + rlcLcCtxt = &ueCfgDb->rlcLcCfg[rlcLcIdx]; break; } } - else if(drbSetupModCfg != NULL) + if(!macLcCtxt) { - drbSetupModItem = (DRBs_ToBeSetupMod_ItemIEs_t *) drbSetupModCfg->list.array[drbIdx]; - ret = procDrbListToSetup(lcId, NULL, &(drbSetupModItem->value.choice.DRBs_ToBeSetupMod_Item) ,\ - &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs],\ - &ueCfgDb->upTnlInfo[ueCfgDb->numDrb]); + memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(LcCfg)); + macLcCtxt = &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs]; + ueCfgDb->numMacLcs++; + } + if(!rlcLcCtxt) + { + memset(&ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], 0, sizeof(RlcBearerCfg)); + rlcLcCtxt = &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs]; + ueCfgDb->numRlcLcs++; + } + + if(drbModCfg != NULLP) + { + lcId = fetchLcId(drbId); + if(lcId < MIN_DRB_LCID) + { + DU_LOG("\nERROR --> F1AP : Failed fetching LCID %d in extractDrbListToSetupMod() for Modified List", lcId); + break; + } + ret = procDrbListToSetupMod(lcId, NULL, NULL, &(drbModItem->value.choice.DRBs_ToBeModified_Item),\ + macLcCtxt, rlcLcCtxt, &ueCfgDb->upTnlInfo[ueCfgDb->numDrb], rlcUeCfg); if(ret == RFAILED) { - DU_LOG("\nERROR --> F1AP : Failed at extractDrbListToSetup()"); + DU_LOG("\nERROR --> F1AP : Failed at extractDrbListToSetupMod() for Modified List"); + break; + } + } + else + { + lcId = getDrbLcId(drbBitMap); + if(lcId == RFAILED) + { + DU_LOG("\nERROR --> F1AP : InCorrect LCID extractDrbListToSetupMod()"); + ret = RFAILED; break; } + if(drbCfg != NULL) + { + drbItem = &drbCfg->list.array[drbIdx]->value.choice.DRBs_ToBeSetup_Item; + ret = procDrbListToSetupMod(lcId, drbItem, NULL, NULL, macLcCtxt, rlcLcCtxt, &ueCfgDb->upTnlInfo[ueCfgDb->numDrb], rlcUeCfg); + if(ret == RFAILED) + { + DU_LOG("\nERROR --> F1AP : Failed at extractDrbListToSetupMod() for DrbSetup List"); + break; + } + } + else if(drbSetupModCfg != NULL) + { + ret = procDrbListToSetupMod(lcId, NULL, &(drbSetupModItem->value.choice.DRBs_ToBeSetupMod_Item), NULL,\ + macLcCtxt, rlcLcCtxt, &ueCfgDb->upTnlInfo[ueCfgDb->numDrb], rlcUeCfg); + if(ret == RFAILED) + { + DU_LOG("\nERROR --> F1AP : Failed at extractDrbListToSetupMod() for DrbSetupMod List"); + break; + } + ueCfgDb->numDrbSetupMod++; + } } - 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 extractDrbListToSetup()"); + DU_LOG("\nERROR --> F1AP : Failed at extractDrbListToSetupMod()"); break; } } @@ -10355,99 +13001,162 @@ void freeAperDecodeF1UeContextSetupReq(UEContextSetupRequest_t *ueSetReq) * ****************************************************************/ uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg) { - uint8_t ret=0, ieIdx=0, ueIdx=0, lcId=0, cellIdx=0; - bool ueCbFound = false; + int8_t ueIdx = -1; + uint8_t ret=0, ieIdx=0, ieExtIdx = 0, servCellIdx = 0; + bool ueCbFound = false, hoInProgress = false; + uint16_t cellIdx=0; + uint64_t nrCellId = 0; uint32_t gnbCuUeF1apId=0, gnbDuUeF1apId=0, bitRateSize=0; DuUeCb *duUeCb = NULL; UEContextSetupRequest_t *ueSetReq = NULL; DRBs_ToBeSetup_List_t *drbCfg = NULL; + CUtoDURRCInformation_t *rrcInfo = NULL; ret = ROK; - ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest; - for(ieIdx=0; (ieIdx < ueSetReq->protocolIEs.list.count && ret == ROK); ieIdx++) - { - switch(ueSetReq->protocolIEs.list.array[ieIdx]->id) - { - case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID: + ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest; + for(ieIdx=0; (ieIdx < ueSetReq->protocolIEs.list.count && ret == ROK); ieIdx++) + { + switch(ueSetReq->protocolIEs.list.array[ieIdx]->id) + { + case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID: + { + gnbCuUeF1apId = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID; + break; + } + + case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID: + { + gnbDuUeF1apId = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID; + break; + } + + case ProtocolIE_ID_id_SpCell_ID: + { + bitStringToInt(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.nRCellIdentity, &nrCellId); + + GET_CELL_IDX(nrCellId, cellIdx); + if(!duCb.actvCellLst[cellIdx]) + { + DU_LOG("\nERROR --> F1AP : Cell Id [%d] not found", nrCellId); + ret = RFAILED; + } + break; + } + + case ProtocolIE_ID_id_ServCellIndex: { - gnbCuUeF1apId = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID; + servCellIdx = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.ServCellIndex; break; } - case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID: + + case ProtocolIE_ID_id_SpCellULConfigured: { - gnbDuUeF1apId = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID; + /* Indicates whether the gNB-CU requests the gNB-DU to configure the uplink as no UL, + UL, SUL or UL+SUL for the indicated cell for the UE */ break; } - case ProtocolIE_ID_id_ServCellIndex: + + case ProtocolIE_ID_id_CUtoDURRCInformation: { - cellIdx = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.ServCellIndex; + rrcInfo = &ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation; + + /* Search if UE context is present */ for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++) { - if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\ - (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId)) + if(duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId) { ueCbFound = true; duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx]; - DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb)); - if(duUeCb->f1UeDb) - { - memset(duUeCb->f1UeDb, 0, sizeof(F1UeContextSetupDb)); - duUeCb->f1UeDb->actionType = UE_CTXT_SETUP; - duUeCb->f1UeDb->cellIdx = cellIdx; - } - else + break; + } + } + + /* Check if UE Handover scenario */ + if(rrcInfo->iE_Extensions) + { + for(ieExtIdx = 0; ieExtIdx < rrcInfo->iE_Extensions->list.count; ieExtIdx++) + { + if(rrcInfo->iE_Extensions->list.array[ieExtIdx]->id == ProtocolIE_ID_id_HandoverPreparationInformation) { - DU_LOG("\nERROR --> F1AP: Memory Alloc Failed at procF1UeContextSetupReq()"); - ret = RFAILED; + hoInProgress = true; + break; } - break; } + } + + /* If UE context is not present, but UE is in handover */ + if(!ueCbFound && hoInProgress) + { + ueIdx = getFreeBitFromUeBitMap(nrCellId); + if(ueIdx != -1) + gnbDuUeF1apId = ueIdx +1; else - ueCbFound = false; + { + DU_LOG("\nERROR --> F1AP : No free UE IDX found in UE bit map of cell Id [%d]", nrCellId); + ret = RFAILED; + break; + } + duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx]; + duUeCb->f1UeDb = NULL; + duUeCb->gnbCuUeF1apId = gnbCuUeF1apId; + duUeCb->gnbDuUeF1apId = gnbDuUeF1apId; + GET_CRNTI(duUeCb->crnti, duUeCb->gnbDuUeF1apId); + duUeCb->ueState = UE_HANDIN_IN_PROGRESS; + } + if(duUeCb) + { + DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb)); + if(duUeCb->f1UeDb) + { + memset(duUeCb->f1UeDb, 0, sizeof(F1UeContextSetupDb)); + duUeCb->f1UeDb->actionType = UE_CTXT_SETUP; + duUeCb->f1UeDb->cellIdx = cellIdx; + } + else + { + DU_LOG("\nERROR --> F1AP: Memory Alloc Failed at procF1UeContextSetupReq()"); + ret = RFAILED; + break; + } } - if(!ueCbFound) + else { DU_LOG("\nERROR --> F1AP: DuUeCb is not found at procF1UeContextSetupReq()"); ret = RFAILED; + break; } - break; - } - case ProtocolIE_ID_id_SpCellULConfigured: - /* Indicates whether the gNB-CU requests the gNB-DU to configure the uplink as no UL, - UL, SUL or UL+SUL for the indicated cell for the UE */ - break; - case ProtocolIE_ID_id_CUtoDURRCInformation: - { - if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList) + + /* Extract UE capability info */ + if(rrcInfo->uE_CapabilityRAT_ContainerList) { - duUeCb->f1UeDb->duUeCfg.ueNrCapability = \ - extractUeCapability(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation.\ - uE_CapabilityRAT_ContainerList, duUeCb); + duUeCb->f1UeDb->duUeCfg.ueNrCapability = extractUeCapability(rrcInfo->uE_CapabilityRAT_ContainerList, duUeCb); } - if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation.iE_Extensions) + + /* Extract IE extension */ + if(rrcInfo->iE_Extensions) { - duUeCb->f1UeDb->duUeCfg.cellGrpCfg = extractCellGrpInfo(ueSetReq->protocolIEs.list.array[ieIdx]->\ - value.choice.CUtoDURRCInformation.iE_Extensions, &duUeCb->f1UeDb->duUeCfg); - if(!duUeCb->f1UeDb->duUeCfg.cellGrpCfg) + if(extractCuToDuRrcInfoExt(rrcInfo->iE_Extensions, &duUeCb->f1UeDb->duUeCfg) != ROK) { - DU_LOG("\nERROR --> F1AP: Failed to extract cell Grp Info"); + DU_LOG("\nERROR --> F1AP: Failed to extract CU to DU RRC information extension IE"); //TODO: Update the failure cause in ue context Setup Response ret = RFAILED; } } break; } + case ProtocolIE_ID_id_SCell_ToBeSetup_List: { DU_LOG("\nINFO --> DU_APP: Received SCell_ToBeSetup_List but Not processing the list"); break; } + case ProtocolIE_ID_id_SRBs_ToBeSetup_List: { if(extractSrbListToSetup(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.SRBs_ToBeSetup_List,\ - &duUeCb->f1UeDb->duUeCfg)) + &duUeCb->f1UeDb->duUeCfg)) { DU_LOG("\nERROR --> DU APP : Failed at extractSrbListToSetup()"); //TODO: Update the failure cause in ue context Setup Response @@ -10455,23 +13164,20 @@ uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg) } break; } + case ProtocolIE_ID_id_DRBs_ToBeSetup_List: { - lcId = getDrbLcId(&duUeCb->drbBitMap); - if(lcId != RFAILED) + drbCfg = &ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.DRBs_ToBeSetup_List; + + if(extractDrbListToSetupMod(drbCfg, NULL, NULL, drbCfg->list.count, &duUeCb->f1UeDb->duUeCfg, &duUeCb->drbBitMap, NULLP)) { - drbCfg = &ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.DRBs_ToBeSetup_List; - if(extractDrbListToSetup(lcId, drbCfg, NULL, drbCfg->list.count, &duUeCb->f1UeDb->duUeCfg)) - { - DU_LOG("\nERROR --> DU APP : Failed at extractDrbListToSetup()"); - //TODO: Update the failure cause in ue context Setup Response - ret = RFAILED; - } - } - else + DU_LOG("\nERROR --> DU APP : Failed at extractDrbListToSetupMod()"); + //TODO: Update the failure cause in ue context Setup Response ret = RFAILED; + } break; } + case ProtocolIE_ID_id_RRCContainer: { /* Filling Dl RRC Msg Info */ @@ -10490,18 +13196,23 @@ uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg) } break; } + case ProtocolIE_ID_id_RRCDeliveryStatusRequest: { - if(duUeCb->f1UeDb->dlRrcMsg->rrcMsgPdu) - { - duUeCb->f1UeDb->dlRrcMsg->deliveryStatRpt = true; - } - else + if(duUeCb->f1UeDb->dlRrcMsg) { - DU_LOG("\nERROR --> Ignoring delivery report, since rrcContainer is not present"); + if(duUeCb->f1UeDb->dlRrcMsg->rrcMsgPdu) + { + duUeCb->f1UeDb->dlRrcMsg->deliveryStatRpt = true; + } + else + { + DU_LOG("\nERROR --> Ignoring delivery report, since rrcContainer is not present"); + } } break; } + case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL: { /* MaximumBitRate Uplink */ @@ -10525,19 +13236,23 @@ uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg) ret = RFAILED; break; } + default: { break; } + } /* End of switch */ + + /* In case of any failure in any IE */ + if(ret == RFAILED) + { + // BuildAndSendUeContextSetupRsp(cellId,ueId); + DU_LOG("\nERROR --> F1AP: Failed to process UE CNTXT SETUP REQ at procF1UeContextSetupReq()"); + break; } - } - if(ret == RFAILED) - { - /*TODO : Negative case*/ - // BuildAndSendUeContextSetupRsp(cellId,ueIdx); - DU_LOG("\nERROR --> F1AP: Failed to process UE CNTXT SETUP REQ at procF1UeContextSetupReq()"); - } - else + } /* End of for loop of IEs */ + + if(ret == ROK) ret = duProcUeContextSetupRequest(duUeCb); freeAperDecodeF1UeContextSetupReq(ueSetReq); @@ -10892,13 +13607,13 @@ uint8_t fillDrbSetupList(DRBs_Setup_List_t *drbSetupList, DuUeCfg *ueCfg) * Functionality: Constructs the UE Setup Response and sends * it to the DU through SCTP. * - * @params[in] uint8_t cellId,uint8_t ueIdx + * @params[in] uint8_t cellId,uint8_t ueId * * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t BuildAndSendUeContextSetupRsp(uint8_t cellId,uint8_t ueIdx) +uint8_t BuildAndSendUeContextSetupRsp(uint8_t cellId,uint8_t ueId) { uint8_t idx, ret, cellIdx, elementCnt; uint32_t gnbCuUeF1apId; /* gNB-CU UE F1AP Id */ @@ -10906,129 +13621,115 @@ uint8_t BuildAndSendUeContextSetupRsp(uint8_t cellId,uint8_t ueIdx) asn_enc_rval_t encRetVal; /* Encoder return value */ F1AP_PDU_t *f1apMsg = NULLP; UEContextSetupResponse_t *ueSetRsp = NULLP; - CellGroupConfigRrc_t *cellGrpCfg = NULLP; DuUeCb *ueCb = NULLP; - DU_LOG("\n INFO --> F1AP : Building UE Context Setup Response for cellId %d, ueIdx %d\n", cellId, ueIdx); + DU_LOG("\n INFO --> F1AP : Building UE Context Setup Response for cellId %d, ueId %d\n", cellId, ueId); while(true) { DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t)); if(f1apMsg == NULLP) { - DU_LOG(" ERROR --> F1AP : Memory allocation for F1AP-PDU failed"); - ret = RFAILED; - break; + DU_LOG(" ERROR --> F1AP : Memory allocation for F1AP-PDU failed"); + ret = RFAILED; + break; } f1apMsg->present = F1AP_PDU_PR_successfulOutcome; DU_ALLOC(f1apMsg->choice.successfulOutcome, - sizeof(SuccessfulOutcome_t)); + sizeof(SuccessfulOutcome_t)); if(f1apMsg->choice.successfulOutcome == NULLP) { - DU_LOG(" ERROR --> F1AP : Memory allocation for F1AP-PDU failed"); - ret = RFAILED; - break; + DU_LOG(" ERROR --> F1AP : Memory allocation for F1AP-PDU failed"); + ret = RFAILED; + break; } f1apMsg->choice.successfulOutcome->procedureCode = \ - ProcedureCode_id_UEContextSetup; + ProcedureCode_id_UEContextSetup; f1apMsg->choice.successfulOutcome->criticality = Criticality_reject; f1apMsg->choice.successfulOutcome->value.present = \ - SuccessfulOutcome__value_PR_UEContextSetupResponse; + SuccessfulOutcome__value_PR_UEContextSetupResponse; ueSetRsp = - &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse; - elementCnt = 4; + &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse; + elementCnt = 5; ueSetRsp->protocolIEs.list.count = elementCnt; ueSetRsp->protocolIEs.list.size = \ - elementCnt * sizeof(UEContextSetupResponse_t *); + elementCnt * sizeof(UEContextSetupResponse_t *); /* Initialize the UESetup members */ DU_ALLOC(ueSetRsp->protocolIEs.list.array, \ - ueSetRsp->protocolIEs.list.size); + ueSetRsp->protocolIEs.list.size); if(ueSetRsp->protocolIEs.list.array == NULLP) { - DU_LOG(" ERROR --> F1AP : Memory allocation for UE Setup Response failed"); - ret = RFAILED; - break; + DU_LOG(" ERROR --> F1AP : Memory allocation for UE Setup Response failed"); + ret = RFAILED; + break; } for(idx=0; idxprotocolIEs.list.array[idx],\ - sizeof(UEContextSetupResponseIEs_t)); - if(ueSetRsp->protocolIEs.list.array[idx] == NULLP) - { - DU_LOG(" ERROR --> F1AP : Memory allocation for UE Setup Response failed"); - ret = RFAILED; - break; - } + DU_ALLOC(ueSetRsp->protocolIEs.list.array[idx],\ + sizeof(UEContextSetupResponseIEs_t)); + if(ueSetRsp->protocolIEs.list.array[idx] == NULLP) + { + DU_LOG(" ERROR --> F1AP : Memory allocation for UE Setup Response failed"); + ret = RFAILED; + break; + } } /* Fetching Ue Cb Info*/ GET_CELL_IDX(cellId, cellIdx); - gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbDuUeF1apId; - gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbCuUeF1apId; - ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1]; + gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueId-1].gnbDuUeF1apId; + gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueId-1].gnbCuUeF1apId; + ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueId-1]; idx = 0; /*GNB CU UE F1AP ID*/ ueSetRsp->protocolIEs.list.array[idx]->id = \ - ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID; + ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID; ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject; ueSetRsp->protocolIEs.list.array[idx]->value.present = \ - UEContextSetupResponseIEs__value_PR_GNB_CU_UE_F1AP_ID; + UEContextSetupResponseIEs__value_PR_GNB_CU_UE_F1AP_ID; ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = gnbCuUeF1apId; /*GNB DU UE F1AP ID*/ idx++; ueSetRsp->protocolIEs.list.array[idx]->id = \ - ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID; + ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID; ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject; ueSetRsp->protocolIEs.list.array[idx]->value.present = \ - UEContextSetupResponseIEs__value_PR_GNB_DU_UE_F1AP_ID; + UEContextSetupResponseIEs__value_PR_GNB_DU_UE_F1AP_ID; ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId; /*DUtoCURRC Information */ idx++; ueSetRsp->protocolIEs.list.array[idx]->id = \ - ProtocolIE_ID_id_DUtoCURRCInformation; + ProtocolIE_ID_id_DUtoCURRCInformation; ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject; ueSetRsp->protocolIEs.list.array[idx]->value.present =\ - UEContextSetupResponseIEs__value_PR_DUtoCURRCInformation; - if(ueCb->f1UeDb) - { - if(ueCb->f1UeDb->duUeCfg.cellGrpCfg) - { - cellGrpCfg = (CellGroupConfigRrc_t*)ueCb->f1UeDb->duUeCfg.cellGrpCfg; - ret = EncodeUeCntxtDuToCuInfo(&ueSetRsp->protocolIEs.list.array[idx]->value.\ - choice.DUtoCURRCInformation.cellGroupConfig, cellGrpCfg); - if(ret == RFAILED) - { - DU_LOG("\nERROR --> F1AP : Failed to EncodeUeCntxtDuToCuInfo in BuildAndSendUeContextSetupRsp()"); - freeF1UeDb(ueCb->f1UeDb); - ueCb->f1UeDb = NULLP; - break; - } - } - } - else - { - DU_LOG("\nERROR --> F1AP : Failed to form DUtoCU RRCInfo at BuildAndSendUeContextSetupRsp()"); - ret = RFAILED; - break; - } + UEContextSetupResponseIEs__value_PR_DUtoCURRCInformation; + BuildCellGroupConfigRrc(ueCb, &ueSetRsp->protocolIEs.list.array[idx]->value.choice.DUtoCURRCInformation.cellGroupConfig); + + /* CRNTI */ + idx++; + ueSetRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_C_RNTI; + ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject; + ueSetRsp->protocolIEs.list.array[idx]->value.present = UEContextSetupResponseIEs__value_PR_C_RNTI; + ueSetRsp->protocolIEs.list.array[idx]->value.choice.C_RNTI = ueCb->crnti; + /* Drb Setup List */ idx++; ueSetRsp->protocolIEs.list.array[idx]->id = \ - ProtocolIE_ID_id_DRBs_Setup_List; + ProtocolIE_ID_id_DRBs_Setup_List; ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject; ueSetRsp->protocolIEs.list.array[idx]->value.present =\ - UEContextSetupResponseIEs__value_PR_DRBs_Setup_List; + UEContextSetupResponseIEs__value_PR_DRBs_Setup_List; ret = fillDrbSetupList(&ueSetRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List,\ - &ueCb->f1UeDb->duUeCfg); + &ueCb->f1UeDb->duUeCfg); if(ret == RFAILED) { DU_LOG("\nERROR --> F1AP : Failed to fillDrbSetupList in BuildAndSendUeContextSetupRsp()"); @@ -11037,9 +13738,9 @@ uint8_t BuildAndSendUeContextSetupRsp(uint8_t cellId,uint8_t ueIdx) break; } - /* Free UeContext Db created during Ue context Req */ - freeF1UeDb(ueCb->f1UeDb); - ueCb->f1UeDb = NULLP; + /* Free UeContext Db created during Ue context Req */ + freeF1UeDb(ueCb->f1UeDb); + ueCb->f1UeDb = NULLP; /* TODO: To send Drb list */ xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg); @@ -11048,30 +13749,30 @@ uint8_t BuildAndSendUeContextSetupRsp(uint8_t cellId,uint8_t ueIdx) memset((uint8_t *)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) { - DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Response structure (at %s)\n",\ - encRetVal.failed_type ? encRetVal.failed_type->name : "unknown"); - ret = RFAILED; - break; + DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Response structure (at %s)\n",\ + encRetVal.failed_type ? encRetVal.failed_type->name : "unknown"); + ret = RFAILED; + break; } else { - DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for UE Context Setup Response\n"); - for(int i=0; i< encBufSize; i++) - { - printf("%x",encBuf[i]); - } + DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for UE Context Setup Response\n"); + for(int i=0; i< encBufSize; i++) + { + printf("%x",encBuf[i]); + } } /* Sending msg */ if(sendF1APMsg() != ROK) { - DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Response failed"); - ret = RFAILED; - break; + DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Response failed"); + ret = RFAILED; + break; } break; } @@ -11093,23 +13794,31 @@ uint8_t BuildAndSendUeContextSetupRsp(uint8_t cellId,uint8_t ueIdx) * failure = RFAILED * * ****************************************************************/ -uint8_t BuildAndSendUeCtxtRsp(uint8_t cellId, uint8_t ueIdx) +uint8_t BuildAndSendUeCtxtRsp(uint8_t cellId, uint8_t ueId) { uint8_t cellIdx = 0, actionType = 0; GET_CELL_IDX(cellId, cellIdx); - actionType = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].f1UeDb->actionType; + actionType = duCb.actvCellLst[cellIdx]->ueCb[ueId-1].f1UeDb->actionType; switch(actionType) { case UE_CTXT_SETUP: { - BuildAndSendUeContextSetupRsp(cellId,ueIdx); + if((BuildAndSendUeContextSetupRsp(cellId,ueId)) != ROK) + { + DU_LOG("\nERROR --> F1AP : Failed at BuildAndSendUeContextSetupRsp()"); + return RFAILED; + } break; } case UE_CTXT_MOD: { - BuildAndSendUeContextModRsp(cellId, ueIdx); + if((BuildAndSendUeContextModRsp(&duCb.actvCellLst[cellIdx]->ueCb[ueId-1])) != ROK) + { + DU_LOG("\nERROR --> F1AP : Failed at BuildAndSendUeContextModRsp"); + return RFAILED; + } break; } default: @@ -11727,7 +14436,8 @@ uint8_t BuildAndSendRrcDeliveryReport(uint32_t gnbCuUeF1apId, \ uint8_t extractCellsToBeActivated(Cells_to_be_Activated_List_t cellsToActivate) { uint8_t ret = ROK; - uint16_t idx, nci, pci = 0; + uint16_t idx, pci = 0; + uint64_t nci; Cells_to_be_Activated_List_Item_t cell; for(idx=0; idx F1AP : Memory allocation failed to store the buf of F1setup response"); + return RFAILED; + } + memcpy(duCb.f1SetupReqAndRspMsg.f1MsgRspBuf, recvBuf, recvBufLen); + + if(BuildAndSendE2SetupReq() != ROK) + { + DU_LOG("\nERROR --> F1AP : Failed to build and send E2 setup request "); + return RFAILED; + } return ret; } /******************************************************************* @@ -11976,8 +14701,9 @@ void freeAperDecodeGnbDuAck(GNBDUConfigurationUpdateAcknowledge_t *gnbDuAck) uint8_t duProcGnbDuCfgUpdAckMsg(uint8_t transId) { uint8_t ieIdx=0, arrIdx=0,ret=ROK; - uint8_t ueId =0 , ueIdx =0; - uint16_t cellId =0, cellIdx =0, crnti=0; + uint8_t ueId =0 , ueIdx =0, totalActiveUe = 0; + uint16_t cellIdx =0, crnti=0; + uint64_t cellId =0; CmLList *f1apPduNode = NULLP; ReservedF1apPduInfo *f1apPduInfo =NULLP; F1AP_PDU_t *f1apMsgPdu = NULLP; @@ -12015,41 +14741,55 @@ uint8_t duProcGnbDuCfgUpdAckMsg(uint8_t transId) { cellIdentity = &deleteItem->oldNRCGI.nRCellIdentity; bitStringToInt(cellIdentity, &cellId); + + GET_CELL_IDX(cellId, cellIdx); + if(duCb.actvCellLst[cellIdx] != NULLP) + { + duCb.actvCellLst[cellId-1]->cellStatus = DELETION_IN_PROGRESS; + } } } } - GET_CELL_IDX(cellId, cellIdx); if(duCb.actvCellLst[cellIdx] != NULLP) { if(duCb.actvCellLst[cellIdx]->numActvUes == 0) { - duCb.actvCellLst[cellId-1]->cellStatus = DELETION_IN_PROGRESS; ret = duSendCellDeletReq(cellId); if(ret == RFAILED) { - DU_LOG("ERROR --> DU_APP : duProcGnbDuCfgUpdAckMsg(): Failed to send cell delete\ + DU_LOG("\nERROR --> DU_APP : duProcGnbDuCfgUpdAckMsg(): Failed to send cell delete\ request for cellId[%d]", cellId); } } else { - for(ueIdx = 0; ueIdx < duCb.actvCellLst[cellIdx]->numActvUes; ueIdx++) + totalActiveUe = duCb.actvCellLst[cellIdx]->numActvUes; + while(totalActiveUe) { + if(duCb.actvCellLst[cellIdx]->ueCb[ueIdx].ueState != UE_ACTIVE) + { + ueIdx++; + continue; + } + crnti = duCb.actvCellLst[cellIdx]->ueCb[ueIdx].crnti; - GET_UE_IDX(crnti,ueId); + GET_UE_ID(crnti,ueId); + /* Sending Ue Context release request only for maximum supporting UEs */ ret = BuildAndSendUeContextReleaseReq(cellId, ueId); if(ret == RFAILED) { - DU_LOG("ERROR --> DU_APP : duProcGnbDuCfgUpdAckMsg(): Failed to build and send UE delete\ + DU_LOG("\nERROR --> DU_APP : duProcGnbDuCfgUpdAckMsg(): Failed to build and send UE delete\ request for cellId[%d]", cellId); } + ueIdx++; + totalActiveUe--; } } } else { - DU_LOG("ERROR --> DU_APP : duProcGnbDuCfgUpdAckMsg(): CellId [%d] not found", cellId); + DU_LOG("\nERROR --> DU_APP : duProcGnbDuCfgUpdAckMsg(): CellId [%d] not found", cellId); ret = RFAILED; } break; @@ -12269,6 +15009,59 @@ uint8_t procF1DlRrcMsgTrans(F1AP_PDU_t *f1apMsg) freeAperDecodef1DlRrcMsg(f1DlRrcMsg); return ret; } +/******************************************************************* + * +* @brief Builds the DRB to be Setup Mod list +* +* @details +* +* Function : +* +* Functionality: Constructs the DRB to be Setup Mod list +* +* @params[in] DRBs_SetupMod_List_t *drbSet +* +* @return ROK - success +* RFAILED - failure +* +* ****************************************************************/ +uint8_t BuildSrbSetupModList(SRBs_SetupMod_List_t *srbList, DuUeCfg *ueCfg) +{ + uint8_t srbIdx = 0; + struct SRBs_SetupMod_ItemIEs *srbItemIe; + + srbList->list.count = ueCfg->numRlcLcs; + srbList->list.size = srbList->list.count * sizeof(SRBs_SetupMod_ItemIEs_t *); + + DU_ALLOC(srbList->list.array, srbList->list.size); + if(srbList->list.array == NULLP) + { + DU_LOG("\nERROR --> DU APP : Memory allocation failed in BuildSrbSetupModList"); + return RFAILED; + } + + for(srbIdx = 0; srbIdx < srbList->list.count; srbIdx++) + { + DU_ALLOC(srbList->list.array[srbIdx], sizeof(SRBs_SetupMod_ItemIEs_t)); + if(srbList->list.array[srbIdx] == NULLP) + { + DU_LOG("\nERROR --> DU APP : Memory allocation failed in BuildSrbSetupModList"); + return RFAILED; + } + } + + for(srbIdx=0; srbIdx < srbList->list.count; srbIdx++) + { + srbItemIe = (struct SRBs_SetupMod_ItemIEs *)srbList->list.array[srbIdx]; + 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; + } + return ROK; +} + /******************************************************************* * * @brief Builds the DRB to be Setup Mod list @@ -12292,7 +15085,14 @@ uint8_t BuildDrbSetupModList(DRBs_SetupMod_List_t *drbSet , DuUeCfg *ueCfg) uint8_t drbCnt =0; struct DRBs_SetupMod_ItemIEs *drbItemIe; - drbCnt = 1; + 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); @@ -12353,6 +15153,30 @@ void FreeDrbSetupModList(DRBs_SetupMod_List_t *drbSetupList) } DU_FREE(drbSetupList->list.array, drbSetupList->list.size); } + +/******************************************************************* +* @brief Free the memory allocated for SRB setup List +* +* @details +* +* Function : FreeSrbSetupModList +* +* Functionality: +* Free the memory allocated for SRB setup list +* +* @params[in] SRBs_Setup_List_t * +* @return void +* +* ****************************************************************/ +void FreeSrbSetupModList(SRBs_SetupMod_List_t *srbSetupList) +{ + uint8_t srbIdx = 0; + + for(srbIdx = 0; srbIdx < srbSetupList->list.count; srbIdx++) + DU_FREE(srbSetupList->list.array[srbIdx], sizeof(SRBs_SetupMod_ItemIEs_t)); + DU_FREE(srbSetupList->list.array, srbSetupList->list.size); +} + /******************************************************************* * @brief Free the memory allocated for UE Context Mod Response * @@ -12393,7 +15217,13 @@ void FreeUeContextModResp(F1AP_PDU_t *f1apMsg) { FreeDrbSetupModList(&(ueContextModifyRes->protocolIEs.list.array[ieIdx]->\ value.choice.DRBs_SetupMod_List)); - break; + break; + } + case ProtocolIE_ID_id_SRBs_SetupMod_List: + { + FreeSrbSetupModList(&(ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.choice.\ + SRBs_SetupMod_List)); + break; } } DU_FREE(ueContextModifyRes->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationResponse_t)); @@ -12419,25 +15249,21 @@ void FreeUeContextModResp(F1AP_PDU_t *f1apMsg) * Functionality: * - Creating the ue context modifcation response * -* @params[in] uint8_t cellId,uint8_t ueIdx +* @params[in] uint8_t cellId,uint8_t ueId * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t BuildAndSendUeContextModRsp(uint8_t cellId,uint8_t ueIdx) +uint8_t BuildAndSendUeContextModRsp(DuUeCb *ueCb) { - uint8_t ieIdx = 0; - uint8_t cellIdx =0; + uint8_t ieIdx = 0, tnlIdx = 0, rbIdx = 0; uint8_t elementCnt = 0; uint8_t ret = RFAILED; - uint32_t gnbCuUeF1apId; /* gNB-CU UE F1AP Id */ - uint32_t gnbDuUeF1apId; /* gNB-DU UE F1AP Id */ F1AP_PDU_t *f1apMsg = NULLP; - asn_enc_rval_t encRetVal; + asn_enc_rval_t encRetVal; UEContextModificationResponse_t *ueContextModifyRes = NULLP; - DuUeCb *ueCb = NULLP; - DU_LOG("\nINFO --> F1AP : Building Ue context modification response\n"); + DU_LOG("\nINFO --> F1AP : Building UE context modification response\n"); while(1) { @@ -12461,8 +15287,18 @@ uint8_t BuildAndSendUeContextModRsp(uint8_t cellId,uint8_t ueIdx) f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_UEContextModificationResponse; ueContextModifyRes =&f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse; - - elementCnt = 3; + + if(ueCb->f1UeDb->actionType == UE_CTXT_MOD) + { + if(ueCb->f1UeDb->duUeCfg.numDrbSetupMod) + elementCnt =3; + else + elementCnt =2; + } + 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; ueContextModifyRes->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationResponse_t*); @@ -12484,43 +15320,83 @@ uint8_t BuildAndSendUeContextModRsp(uint8_t cellId,uint8_t ueIdx) } } - /* Fetching Ue Cb Info*/ - GET_CELL_IDX(cellId, cellIdx); - gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbDuUeF1apId; - gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbCuUeF1apId; - ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1]; - ieIdx=0; ueContextModifyRes->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID; ueContextModifyRes->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject; ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.present =\ UEContextModificationResponseIEs__value_PR_GNB_CU_UE_F1AP_ID; - ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID = gnbCuUeF1apId; + ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId; ieIdx++; ueContextModifyRes->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID; ueContextModifyRes->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject; ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.present=\ UEContextModificationResponseIEs__value_PR_GNB_DU_UE_F1AP_ID; - ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId; + ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId; - ieIdx++; - ueContextModifyRes->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_SetupMod_List; - ueContextModifyRes->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject; - ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.present =\ - UEContextModificationResponseIEs__value_PR_DRBs_SetupMod_List; - if(ueCb->f1UeDb) + if(ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY) { + ieIdx++; + ueContextModifyRes->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DUtoCURRCInformation; + ueContextModifyRes->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject; + ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.present = \ + UEContextModificationResponseIEs__value_PR_DUtoCURRCInformation; + 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))) + { + ieIdx++; + ueContextModifyRes->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_SetupMod_List; + ueContextModifyRes->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject; + ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.present =\ + UEContextModificationResponseIEs__value_PR_DRBs_SetupMod_List; + if(ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY) + { + for(tnlIdx = 0; tnlIdx < duCb.numTeId; tnlIdx++) + { + if(duCb.upTnlCfg[tnlIdx]->ueId == ueCb->gnbDuUeF1apId) + { + memcpy(&ueCb->f1UeDb->duUeCfg.upTnlInfo[ueCb->f1UeDb->duUeCfg.numDrbSetupMod++], duCb.upTnlCfg[tnlIdx], sizeof(UpTnlCfg)); + } + } + } ret = BuildDrbSetupModList(&(ueContextModifyRes->protocolIEs.list.array[ieIdx]->\ value.choice.DRBs_SetupMod_List) , &ueCb->f1UeDb->duUeCfg); if(ret != ROK) { - DU_LOG( "\nERROR --> F1AP : Failed to build drb setupmod List "); + DU_LOG( "\nERROR --> F1AP : Failed to build DRB setupmod List "); + break; + } + } + + if(ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY) + { + ieIdx++; + ueContextModifyRes->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_SRBs_SetupMod_List; + 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++) + { + if(ueCb->rlcUeCfg.rlcLcCfg[rbIdx].rbType == RB_TYPE_SRB) + { + memcpy(&ueCb->f1UeDb->duUeCfg.rlcLcCfg[ueCb->f1UeDb->duUeCfg.numRlcLcs++], &ueCb->rlcUeCfg.rlcLcCfg[rbIdx],\ + sizeof(RlcBearerCfg)); + } + } + ret = BuildSrbSetupModList(&ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.choice.SRBs_SetupMod_List, \ + &ueCb->f1UeDb->duUeCfg); + if(ret != ROK) + { + DU_LOG( "\nERROR --> F1AP : Failed to build SRB setupmod List "); break; } - freeF1UeDb(ueCb->f1UeDb); - ueCb->f1UeDb = NULLP; } + + freeF1UeDb(ueCb->f1UeDb); + ueCb->f1UeDb = NULLP; + xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg); /* Encode the F1SetupRequest type as APER */ @@ -12552,6 +15428,8 @@ uint8_t BuildAndSendUeContextModRsp(uint8_t cellId,uint8_t ueIdx) ret = RFAILED; break; } + + ret = ROK; break; } FreeUeContextModResp(f1apMsg); @@ -12776,17 +15654,17 @@ void freeAperDecodeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet) * @return void * * ****************************************************************/ -void freeAperDecodeUeContextModificationReqMsg(UEContextModificationRequest_t *UeContextModifyReq ) +void freeAperDecodeUeContextModificationReqMsg(UEContextModificationRequest_t *ueContextModifyReq ) { uint8_t arrIdx, ieId; - if(UeContextModifyReq->protocolIEs.list.array) + if(ueContextModifyReq->protocolIEs.list.array) { - for( arrIdx = 0 ; arrIdxprotocolIEs.list.count ; arrIdx++) + for( arrIdx = 0 ; arrIdxprotocolIEs.list.count ; arrIdx++) { - if(UeContextModifyReq->protocolIEs.list.array[arrIdx]) + if(ueContextModifyReq->protocolIEs.list.array[arrIdx]) { - ieId = UeContextModifyReq->protocolIEs.list.array[arrIdx]->id; + ieId = ueContextModifyReq->protocolIEs.list.array[arrIdx]->id; switch(ieId) { case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID: @@ -12795,15 +15673,21 @@ void freeAperDecodeUeContextModificationReqMsg(UEContextModificationRequest_t *U break; case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List: { - freeAperDecodeDrbToBeSetupModList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->\ + freeAperDecodeDrbToBeSetupModList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->\ value.choice.DRBs_ToBeSetupMod_List); break; } + case ProtocolIE_ID_id_TransmissionActionIndicator: + break; + case ProtocolIE_ID_id_RRCContainer: + { + free(ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.buf); + } } - free(UeContextModifyReq->protocolIEs.list.array[arrIdx]); + free(ueContextModifyReq->protocolIEs.list.array[arrIdx]); } } - free(UeContextModifyReq->protocolIEs.list.array); + free(ueContextModifyReq->protocolIEs.list.array); } } /******************************************************************* @@ -12823,9 +15707,10 @@ void freeAperDecodeUeContextModificationReqMsg(UEContextModificationRequest_t *U uint8_t procF1UeContextModificationReq(F1AP_PDU_t *f1apMsg) { UEContextModificationRequest_t *ueContextModifyReq = NULLP; - uint8_t ret = ROK, ieIdx = 0, lcId =0,cellIdx=0, ueIdx=0; + uint8_t ret = ROK, ieIdx = 0, cellIdx=0; DuUeCb *duUeCb = NULLP; DRBs_ToBeSetupMod_List_t *drbSetupModCfg; + DRBs_ToBeModified_List_t *drbModifiedCfg; uint32_t gnbCuUeF1apId, gnbDuUeF1apId; ueContextModifyReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest; @@ -12841,56 +15726,145 @@ uint8_t procF1UeContextModificationReq(F1AP_PDU_t *f1apMsg) case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID: { gnbDuUeF1apId = ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID; + for(cellIdx = 0; cellIdx < MAX_NUM_CELL; cellIdx++) + { + if(duCb.actvCellLst[cellIdx]) + { + if((duCb.actvCellLst[cellIdx]->ueCb[gnbDuUeF1apId-1].gnbDuUeF1apId == gnbDuUeF1apId)&&\ + (duCb.actvCellLst[cellIdx]->ueCb[gnbDuUeF1apId-1].gnbCuUeF1apId == gnbCuUeF1apId)) + { + duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[gnbDuUeF1apId-1]; + if(duUeCb->f1UeDb == NULLP) + { + DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb)); + duUeCb->f1UeDb->cellIdx = cellIdx; + duUeCb->f1UeDb->actionType = UE_CTXT_MOD; + } + break; + } + } + } + if(duUeCb == NULLP) + { + DU_LOG("\nERROR --> DU APP : wrong values of gnbCuUeF1apId and gnbDuUeF1apId "); + ret = RFAILED; + } + break; + } + + case ProtocolIE_ID_id_RRCContainer: + { + /* Filling Dl RRC Msg Info */ + DU_ALLOC_SHRABL_BUF(duUeCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg)); + if(!duUeCb->f1UeDb->dlRrcMsg) + { + DU_LOG("\nERROR --> DU APP : procF1UeContextReleaseCommand(): \ + Memory allocation failed "); + ret = RFAILED; + } + else + { + duUeCb->f1UeDb->dlRrcMsgPres = true; + memset(duUeCb->f1UeDb->dlRrcMsg, 0, sizeof(F1DlRrcMsg)); + ret = extractDlRrcMsg(gnbDuUeF1apId, gnbCuUeF1apId, duUeCb->f1UeDb->dlRrcMsg,\ + &ueContextModifyReq->protocolIEs.list.array[ieIdx]->\ + value.choice.RRCContainer); + } + break; } + case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List: + case ProtocolIE_ID_id_DRBs_ToBeModified_List: { - for(cellIdx = 0; cellIdx < duCb.numActvCells; cellIdx++) + if(duUeCb->f1UeDb) { - for(ueIdx = 0; ueIdx < duCb.actvCellLst[cellIdx]->numActvUes; ueIdx++) + if(ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present ==\ + UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List) { - if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\ - (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId)) + drbSetupModCfg = &ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.\ + choice.DRBs_ToBeSetupMod_List; + + if(extractDrbListToSetupMod(NULL, drbSetupModCfg, NULL, drbSetupModCfg->list.count,\ + &duUeCb->f1UeDb->duUeCfg, &duUeCb->drbBitMap, NULL)) { + DU_LOG("\nERROR --> DU APP : Failed at extractDrbListToSetupMod() for DrbSetupModList"); + ret = RFAILED; + } + } - duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx]; - lcId = getDrbLcId(&duUeCb->drbBitMap); - if(lcId != RFAILED) - { - DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb)); - if(duUeCb->f1UeDb) - { - duUeCb->f1UeDb->actionType = UE_CTXT_MOD; - drbSetupModCfg = &ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.\ - choice.DRBs_ToBeSetupMod_List; - if(extractDrbListToSetup(lcId, NULL, drbSetupModCfg ,drbSetupModCfg->list.count, \ - &duUeCb->f1UeDb->duUeCfg)) - { - DU_LOG("\nERROR --> DU APP : Failed at extractDrbListToSetup()"); - ret = RFAILED; - } - } - } - break; + if(ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present == \ + UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List) + + { + 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)) + { + DU_LOG("\nERROR --> DU APP : Failed at extractDrbListToSetupMod() for DrbModifiedList"); + ret = RFAILED; } } - if(ueIdx >= duCb.actvCellLst[cellIdx]->numActvUes) + } + break; + } + + case ProtocolIE_ID_id_GNB_DUConfigurationQuery: + { + DU_LOG("\nINFO --> DU APP : Received GNB DU Configuration Query in UE Context Modification Request from CU"); + if(duUeCb->f1UeDb) + { + duUeCb->f1UeDb->actionType = UE_CTXT_CFG_QUERY; + } + break; + } + + case ProtocolIE_ID_id_RRCReconfigurationCompleteIndicator: + { + if(ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCReconfigurationCompleteIndicator == \ + RRCReconfigurationCompleteIndicator_true) + { + duUeCb->f1UeDb->actionType = UE_CTXT_RRC_RECFG_COMPLETE; + } + break; + } + case ProtocolIE_ID_id_TransmissionActionIndicator: + { + if(duUeCb->f1UeDb) + { + if(ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator == TransmissionActionIndicator_stop) { - DU_LOG("\nERROR --> DU APP : wrong values of gnbCuUeF1apId and gnbDuUeF1apId "); - ret = RFAILED; + duUeCb->f1UeDb->duUeCfg.dataTransmissionAction = STOP_TRANSMISSION; + } + else + { + duUeCb->f1UeDb->duUeCfg.dataTransmissionAction = RESTART_TRANSMISSION; } } break; } + + case ProtocolIE_ID_id_RRCDeliveryStatusRequest: + { + if(duUeCb->f1UeDb->dlRrcMsg->rrcMsgPdu) + { + duUeCb->f1UeDb->dlRrcMsg->deliveryStatRpt = true; + } + break; + } + } } - if(ret != RFAILED) + + if(ret != RFAILED) { ret = duProcUeContextModReq(duUeCb); } freeAperDecodeUeContextModificationReqMsg(ueContextModifyReq); return ret; } + /*****************************************************************i * * @brief Free memory allocated for UE Context Release Request @@ -12946,7 +15920,7 @@ void FreeUeContextReleaseReq(F1AP_PDU_t *f1apMsg) * RFAILED - failure * * *************************************************************/ -uint8_t BuildAndSendUeContextReleaseReq(uint16_t cellId, uint8_t ueIdx) +uint8_t BuildAndSendUeContextReleaseReq(uint16_t cellId, uint8_t ueId) { bool memAllocFail = false; uint8_t ieIdx =0; @@ -13020,14 +15994,14 @@ uint8_t BuildAndSendUeContextReleaseReq(uint16_t cellId, uint8_t ueIdx) } else { - GET_CRNTI(crnti, ueIdx); - if(duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].crnti != crnti) + GET_CRNTI(crnti, ueId); + if(duCb.actvCellLst[cellIdx]->ueCb[ueId-1].crnti != crnti) { DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseReq(): crnti[%d] does not exist", crnti); break; } - gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbDuUeF1apId; - gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbCuUeF1apId; + gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueId-1].gnbDuUeF1apId; + gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueId-1].gnbCuUeF1apId; } ieIdx=0; @@ -13240,9 +16214,9 @@ uint8_t BuildAndSendUeContextReleaseComplete(uint16_t cellId, uint32_t gnbCuUeF1 break; }while(true); - if(ret == ROK) + if((ret == ROK) && (duCb.actvCellLst[cellId-1]) && (duCb.actvCellLst[cellId-1]->cellStatus == DELETION_IN_PROGRESS) + && (duCb.actvCellLst[cellId-1]->numActvUes == 0)) { - duCb.actvCellLst[cellId-1]->cellStatus = DELETION_IN_PROGRESS; ret = duSendCellDeletReq(cellId); if(ret != ROK) { @@ -13326,8 +16300,8 @@ void freeAperDecodeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg) uint8_t procF1UeContextReleaseCommand(F1AP_PDU_t *f1apMsg) { uint8_t ieIdx=0, ret=ROK, ueIdx=0; - uint16_t cellIdx =0; - bool ueIdxFound; + uint16_t cellIdx =0, cellId = 0; + bool ueIdxFound = false; uint32_t gnbCuUeF1apId=0, gnbDuUeF1apId=0; DuUeCb *duUeCb = NULLP; UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP; @@ -13358,51 +16332,15 @@ uint8_t procF1UeContextReleaseCommand(F1AP_PDU_t *f1apMsg) case ProtocolIE_ID_id_Cause: { - break; - } - - case ProtocolIE_ID_id_RRCContainer: - { - for(cellIdx = 0; cellIdx < duCb.numActvCells; cellIdx++) + for(cellIdx = 0; cellIdx < MAX_NUM_CELL; cellIdx++) { - for(ueIdx = 0; ueIdx < duCb.actvCellLst[cellIdx]->numActvUes; ueIdx++) + for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++) { - if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\ + if(duCb.actvCellLst[cellIdx] && (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\ (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId)) { + cellId = duCb.actvCellLst[cellIdx]->cellId; duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx]; - DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb)); - if(duUeCb->f1UeDb) - { - memset(duUeCb->f1UeDb, 0, sizeof(F1UeContextSetupDb)); - duUeCb->f1UeDb->actionType = UE_CTXT_RELEASE; - duUeCb->f1UeDb->cellIdx = cellIdx; - /* Filling Dl RRC Msg Info */ - DU_ALLOC_SHRABL_BUF(duUeCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg)); - if(!duUeCb->f1UeDb->dlRrcMsg) - { - DU_LOG("\nERROR --> DU APP : procF1UeContextReleaseCommand(): \ - Memory allocation failed "); - ret = RFAILED; - } - else - { - duUeCb->f1UeDb->dlRrcMsgPres = true; - memset(duUeCb->f1UeDb->dlRrcMsg, 0, sizeof(F1DlRrcMsg)); - ret = extractDlRrcMsg(gnbDuUeF1apId, gnbCuUeF1apId, duUeCb->f1UeDb->dlRrcMsg,\ - &ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->\ - value.choice.RRCContainer); - } - - } - else - { - DU_LOG("\nERROR --> DU APP : procF1UeContextReleaseCommand(): \ - Memory allocation failed "); - ret = RFAILED; - - } - ueIdxFound = true; break; } @@ -13412,13 +16350,51 @@ uint8_t procF1UeContextReleaseCommand(F1AP_PDU_t *f1apMsg) break; } } + if(!ueIdxFound) { - DU_LOG("\nERROR --> F1AP: DuUeCb is not found at procF1UeContextSetupReq()"); + DU_LOG("\nERROR --> F1AP: procF1UeContextReleaseCommand(): Ue Information is not available"); ret = RFAILED; } + break; + } + + case ProtocolIE_ID_id_RRCContainer: + { + if(ueIdxFound == true) + { + DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb)); + if(duUeCb->f1UeDb) + { + memset(duUeCb->f1UeDb, 0, sizeof(F1UeContextSetupDb)); + duUeCb->f1UeDb->actionType = UE_CTXT_RELEASE; + duUeCb->f1UeDb->cellIdx = cellIdx; + /* Filling Dl RRC Msg Info */ + DU_ALLOC_SHRABL_BUF(duUeCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg)); + if(!duUeCb->f1UeDb->dlRrcMsg) + { + DU_LOG("\nERROR --> DU APP : procF1UeContextReleaseCommand(): \ + Memory allocation failed "); + ret = RFAILED; + } + else + { + duUeCb->f1UeDb->dlRrcMsgPres = true; + memset(duUeCb->f1UeDb->dlRrcMsg, 0, sizeof(F1DlRrcMsg)); + ret = extractDlRrcMsg(gnbDuUeF1apId, gnbCuUeF1apId, duUeCb->f1UeDb->dlRrcMsg,\ + &ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->\ + value.choice.RRCContainer); + } + } + else + { + DU_LOG("\nERROR --> DU APP : procF1UeContextReleaseCommand(): \ + Memory allocation failed "); + ret = RFAILED; + } + } break; } default : @@ -13431,11 +16407,231 @@ uint8_t procF1UeContextReleaseCommand(F1AP_PDU_t *f1apMsg) } if(ret != RFAILED) { - duProcUeContextReleaseCommand(duUeCb); + duProcUeContextReleaseCommand(cellId, duUeCb); } freeAperDecodeUeContextReleaseCommand(f1apMsg); return ret; } + +/************************************************************** + * + * @brief free the memory allocated by aper decoder for paging + * + * @details + * + * Function : freeAperDecodePagingMsg + * + * Functionality: + * - free the memory allocated by aper decoder for + * the paging f1ap msg + * + * @params[in] Paging_t *paging + * @return ROK - success + * RFAILED - failure + * + ****************************************************************/ +void freeAperDecodePagingMsg(Paging_t *paging) +{ + uint8_t ieIdx, cellIdx; + PagingCell_ItemIEs_t *pagingCellItemIes; + PagingCell_Item_t *pagingCellItem; + PagingCell_list_t *pagingCelllist; + + if(paging) + { + if(paging->protocolIEs.list.array) + { + for(ieIdx=0 ; ieIdxprotocolIEs.list.count; ieIdx++) + { + if(paging->protocolIEs.list.array[ieIdx]) + { + switch(paging->protocolIEs.list.array[ieIdx]->id) + { + case ProtocolIE_ID_id_UEIdentityIndexValue: + { + free(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf); + break; + } + case ProtocolIE_ID_id_PagingIdentity: + { + if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present == PagingIdentity_PR_cNUEPagingIdentity) + { + if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity) + { + if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present == \ + CNUEPagingIdentity_PR_fiveG_S_TMSI) + { + free(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf); + } + free(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity); + } + } + break; + } + case ProtocolIE_ID_id_PagingCell_List: + { + pagingCelllist = &paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list; + if(pagingCelllist->list.array) + { + for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++) + { + if(pagingCelllist->list.array[cellIdx]) + { + pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx]; + if(pagingCellItemIes->id == ProtocolIE_ID_id_PagingCell_Item) + { + pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item; + free(pagingCellItem->nRCGI.pLMN_Identity.buf); + free(pagingCellItem->nRCGI.nRCellIdentity.buf); + } + free(pagingCelllist->list.array[cellIdx]); + } + } + free(pagingCelllist->list.array); + } + break; + } + } + free(paging->protocolIEs.list.array[ieIdx]); + } + } + free(paging->protocolIEs.list.array); + + } + } +} + +/************************************************************** + * + * @brief processing the paging f1ap msg received from CU + * + * @details + * + * Function : procPagingMsg + * + * Functionality: + * - processing the paging f1ap msg received from CU + * + * @params[in] F1AP_PDU_t *f1apMsg + * @return ROK - success + * RFAILED - failure + * + * + ****************************************************************/ +uint8_t procPagingMsg(F1AP_PDU_t *f1apMsg) +{ + uint8_t ieIdx = 0, cellListIdx = 0; + uint64_t cellId = 0; + Paging_t *paging = NULLP; + PagingCell_list_t *pagingCelllist = NULLP; + PagingCell_ItemIEs_t *pagingCellItemIes = NULLP; + PagingCell_Item_t *pagingCellItem = NULLP; + DuPagingMsg *tmpPagingParam = NULLP; + + DU_LOG("\nINFO --> DU APP : Processing the Paging Message"); + paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging; + if(paging) + { + if(paging->protocolIEs.list.array) + { + DU_ALLOC(tmpPagingParam, sizeof(DuPagingMsg)); + if(tmpPagingParam == NULLP) + { + DU_LOG("\nERROR --> DU APP : Memory Allocation Failure in procPagingMsg"); + freeAperDecodePagingMsg(paging); + return RFAILED; + } + for(ieIdx=0 ; ieIdxprotocolIEs.list.count; ieIdx++) + { + if(paging->protocolIEs.list.array[ieIdx]) + { + switch(paging->protocolIEs.list.array[ieIdx]->id) + { + case ProtocolIE_ID_id_UEIdentityIndexValue: + { + bitStringToInt(&paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10,\ + &tmpPagingParam->pagUeId); + break; + } + + case ProtocolIE_ID_id_PagingIdentity: + { + switch(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present) + { + case PagingIdentity_PR_cNUEPagingIdentity: + { + if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity) + { + bitStringToInt(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.\ + cNUEPagingIdentity->choice.fiveG_S_TMSI, &tmpPagingParam->sTmsi); + + } + break; + } + case PagingIdentity_PR_rANUEPagingIdentity: + { + /*TODO: This Identifier is specific to RAN Initiated Paging – Connected Mode Paging*/ + break; + } + default: + { + DU_LOG("ERROR --> DU APP: Invalid UE Paging Identity, Skipping this Paging Message:"); + continue; + } + } + } + + case ProtocolIE_ID_id_PagingDRX: + { + tmpPagingParam->pagingDrxPres = TRUE; + tmpPagingParam->pagingDrx = convertPagingCycleEnumToValue(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingDRX); + break; + } + + case ProtocolIE_ID_id_PagingPriority: + { + tmpPagingParam->pagPriority = paging->protocolIEs.list.array[ieIdx]->value.choice.PagingPriority; + break; + } + + case ProtocolIE_ID_id_PagingCell_List: + { + pagingCelllist = &paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list; + if(pagingCelllist->list.array) + { + for(cellListIdx = 0; cellListIdx < pagingCelllist->list.count; cellListIdx++) + { + if(pagingCelllist->list.array[cellListIdx]) + { + pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellListIdx]; + pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item; + bitStringToInt(&pagingCellItem->nRCGI.nRCellIdentity, &cellId); + if(processPagingMsg(cellId, tmpPagingParam) != ROK) + { + DU_LOG("\nERROR --> DU APP : Paging Processing Failed at CellId:%d",cellId); + continue; + } + } + } + } + break; + } + default: + { + DU_LOG("\nERROR --> F1AP : Incorrect Paging IE option"); + break; + } + } + } + } + } + } + DU_FREE(tmpPagingParam, sizeof(DuPagingMsg)); + freeAperDecodePagingMsg(paging); + + return ROK; +} + /************************************************************** * * @brief Handles received F1AP message and sends back response @@ -13491,7 +16687,6 @@ void F1APMsgHdlr(Buffer *mBuf) memset(f1apMsg, 0, sizeof(F1AP_PDU_t)); rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0); - DU_FREE(recvBuf, (Size)recvBufLen); if(rval.code == RC_FAIL || rval.code == RC_WMORE) { @@ -13515,7 +16710,7 @@ void F1APMsgHdlr(Buffer *mBuf) case SuccessfulOutcome__value_PR_F1SetupResponse: { #ifndef ODU_TEST_STUB - procF1SetupRsp(f1apMsg); + procF1SetupRsp(f1apMsg, recvBufLen, recvBuf); #endif break; } @@ -13565,6 +16760,11 @@ void F1APMsgHdlr(Buffer *mBuf) procF1UeContextReleaseCommand(f1apMsg); break; } + case InitiatingMessage__value_PR_Paging: + { + procPagingMsg(f1apMsg); + break; + } default: { DU_LOG("\nERROR --> F1AP : Invalid type of F1AP_PDU_PR_initiatingMessage [%d]", @@ -13584,7 +16784,8 @@ void F1APMsgHdlr(Buffer *mBuf) free(f1apMsg); }/* End of switch(f1apMsg->present) */ - + + DU_FREE(recvBuf, (Size)recvBufLen); } /* End of F1APMsgHdlr */ /**********************************************************************