X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fdu_app%2Fdu_f1ap_msg_hdl.c;h=a44829db0afc326e725fafb50978aa6d4a8afadd;hb=refs%2Fchanges%2F15%2F9315%2F5;hp=5c907be92cc17962f3d76aa76dca4634b9d6c4df;hpb=ff0c6fbd56fc24b9c286dc6444e1e0fbe8871625;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 5c907be92..a44829db0 100644 --- a/src/du_app/du_f1ap_msg_hdl.c +++ b/src/du_app/du_f1ap_msg_hdl.c @@ -110,11 +110,22 @@ #include "UPTransportLayerInformation.h" #include "GTPTunnel.h" #include "SupportedSULFreqBandItem.h" -#include "du_sys_info_hdl.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" +#include "DRX-ConfigRrc.h" #ifdef O1_ENABLE #include "CmInterface.h" @@ -352,30 +363,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] = duCfgParam.sib1Params.cellIdentity; - nrcell->bits_unused = 4; - return ROK; -} - /******************************************************************* * * @brief Builds Nrcgi @@ -415,7 +402,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; } @@ -1526,10 +1513,12 @@ uint8_t BuildAndSendF1SetupReq() else { DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1SetupRequest\n"); +#ifdef DEBUG_ASN_PRINT for(ieIdx=0; ieIdx< encBufSize; ieIdx++) { printf("%x",encBuf[ieIdx]); } +#endif duCb.f1SetupReqAndRspMsg.f1MsgReqBufSize = encBufSize; DU_ALLOC(duCb.f1SetupReqAndRspMsg.f1MsgReqBuf, encBufSize); @@ -2461,10 +2450,12 @@ uint8_t BuildAndSendDUConfigUpdate(ServCellAction servCellAction) else { DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DUConfigUpdate\n"); +#ifdef DEBUG_ASN_PRINT for(ieIdx =0; ieIdx < encBufSize; ieIdx++) { printf("%x",encBuf[ieIdx]); } +#endif } /* Sending msg */ if(sendF1APMsg() != ROK) @@ -2547,16 +2538,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)); @@ -2611,7 +2600,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++; @@ -2619,7 +2608,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++; @@ -2664,10 +2653,12 @@ uint8_t BuildAndSendULRRCMessageTransfer(DuUeCb ueCb, uint8_t lcId, \ else { DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for ULRRCMessageTransfer\n"); +#ifdef DEBUG_ASN_PRINT for(int i=0; i< encBufSize; i++) { printf("%x",encBuf[i]); } +#endif } /* Sending msg */ @@ -6187,276 +6178,1183 @@ uint8_t BuildSpCellCfgDed(DuUeCb *ueCb, ServingCellConfig_t *srvCellCfg) return ROK; } + /******************************************************************* * - * @brief Builds Spcell config + * @brief Fills SCS specific carrier list in DL frequency info * * @details * - * Function : BuildSpCellCfg + * Function : BuildScsSpecificCarrierListDl * - * Functionality: Builds sp cell config in DuToCuRrcContainer + * Functionality: Fills SCS specific carrier list in DL frequency info * - * @params[in] SpCellConfig_t spCellCfg + * @params[in] Pointer to struct FrequencyInfoDL__scs_SpecificCarrierList * * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t BuildSpCellCfg(DuUeCb *ueCb, SpCellConfig_t *spCellCfg) +uint8_t BuildScsSpecificCarrierListDl(struct FrequencyInfoDL__scs_SpecificCarrierList *scsCarrierList) { - spCellCfg->servCellIndex = NULLP; - DU_ALLOC(spCellCfg->servCellIndex, sizeof(long)); - if(!spCellCfg->servCellIndex) + 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 --> F1AP : Memory allocation failure in BuildSpCellCfg"); + DU_LOG("\nERROR --> DU APP : Memory allocation failed for scs carrier list array \ + in BuildScsSpecificCarrierListDl()"); return RFAILED; } - if(ueCb == NULLP) - *(spCellCfg->servCellIndex) = SERV_CELL_IDX; - else - *(spCellCfg->servCellIndex) = ueCb->macUeCfg.spCellCfg.servCellIdx; + 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; + } + } - spCellCfg->reconfigurationWithSync = NULLP; - spCellCfg->rlf_TimersAndConstants = NULLP; - spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP; + listIdx = 0; + scsCarrierList->list.array[listIdx]->offsetToCarrier = duScsSpecCarrier.scsOffset; + scsCarrierList->list.array[listIdx]->subcarrierSpacing = duScsSpecCarrier.scs; + scsCarrierList->list.array[listIdx]->carrierBandwidth = duScsSpecCarrier.scsBw; - DU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long)); - if(!spCellCfg->rlmInSyncOutOfSyncThreshold) + 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 --> F1AP : Memory allocation failure in BuildSpCellCfg"); + DU_LOG("\nERROR --> DU APP : Memory allocation failed for Frequency Band List array in BuildFreqInfoDl()"); return RFAILED; } - *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD; - spCellCfg->spCellConfigDedicated = NULLP; - DU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t)); - if(!spCellCfg->spCellConfigDedicated) + for(freqBandIdx = 0; freqBandIdx < elementCnt; freqBandIdx++) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg"); - return RFAILED; + 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; + } } - if(BuildSpCellCfgDed(ueCb, spCellCfg->spCellConfigDedicated) != ROK) + + 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 --> F1AP : BuildSpCellCfgDed failed"); + DU_LOG("\nERROR --> DU APP : Failed to fill SCS specific carrier list DL in BuildFreqInfoDl()"); return RFAILED; } return ROK; + } /******************************************************************* * - * @brief Builds Phy cell group config + * @brief Fills DL config common in Serving cell config common * * @details * - * Function : BuildPhyCellGrpCfg + * Function : BuildDlConfigCommon * - * Functionality: Builds Phy cell group config in DuToCuRrcContainer + * Functionality: Fills DL config common in Serving cell config common * - * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg + * @params[in] Pointer to DownlinkConfigCommon_t * * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t BuildPhyCellGrpCfg(DuUeCb *ueCb, PhysicalCellGroupConfig_t *phyCellGrpCfg) +uint8_t BuildDlConfigCommon(DownlinkConfigCommon_t *dlCfgCommon) { - 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) + /* DL Frequency Info */ + DU_ALLOC(dlCfgCommon->frequencyInfoDL, sizeof(FrequencyInfoDL_t)); + if(!dlCfgCommon->frequencyInfoDL) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg"); + 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; } - if(ueCb == NULLP) + /* DL BWP config common */ + DU_ALLOC(dlCfgCommon->initialDownlinkBWP, sizeof(BWP_DownlinkCommon_t)); + if(!dlCfgCommon->initialDownlinkBWP) { - *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1; - phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK; + DU_LOG("\nERROR --> DU APP : Memory allocation failed for DL BWP config common in BuildDlConfigCommon()"); + return RFAILED; } - else + if((BuildBwpDlCommon(dlCfgCommon->initialDownlinkBWP)) != ROK) { - *(phyCellGrpCfg->p_NR_FR1) = ueCb->macUeCfg.phyCellGrpCfg.pNrFr1; - phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = ueCb->macUeCfg.phyCellGrpCfg.pdschHarqAckCodebook; + DU_LOG("\nERROR --> DU APP : Failed to fill DL DWP config common in BuildDlConfigCommon()"); + return RFAILED; } - 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 + * @brief Fills SCS specific carrier list in UL frequency Info * * @details * - * Function : BuildMacCellGrpCfg + * Function : BuildScsSpecificCarrierListUl * - * Functionality: Builds Mac cell group config in DuToCuRrcContainer + * Functionality: Fills SCS specific carrier list in UL frequency Info * - * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg + * @params[in] Pointer to struct FrequencyInfoUL__scs_SpecificCarrierList * * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t BuildMacCellGrpCfg(DuUeCb *ueCb, MAC_CellGroupConfig_t *macCellGrpCfg) +uint8_t BuildScsSpecificCarrierListUl(struct FrequencyInfoUL__scs_SpecificCarrierList *scsCarrierList) { - macCellGrpCfg->drx_Config = NULLP; - macCellGrpCfg->schedulingRequestConfig = NULLP; - DU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig)); - if(!macCellGrpCfg->schedulingRequestConfig) + 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 --> F1AP : Memory allocation failure in BuildMacCellGrpCfg"); + DU_LOG("\nERROR --> DU APP : SCS Specific Carrier list memory allocation failed"); return RFAILED; } - if(BuildSchedulingReqConfig(ueCb, macCellGrpCfg->schedulingRequestConfig) != ROK) + for(listIdx = 0; listIdx < scsCarrierList->list.count; listIdx++) { - DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed"); - return RFAILED; + 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; - macCellGrpCfg->bsr_Config = NULLP; - DU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config)); - if(!macCellGrpCfg->bsr_Config) + 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 --> F1AP : Memory allocation failure in BuildMacCellGrpCfg"); + DU_LOG("\nERROR --> DU APP : Memory allocation failed for frequency band list in BuildFreqInfoUl()"); return RFAILED; } - if(BuildBsrConfig(ueCb, macCellGrpCfg->bsr_Config) != ROK) + 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 --> F1AP : BuildBsrConfig failed"); + DU_LOG("\nERROR --> DU APP : Memory allocation failed for frequency band array in BuildFreqInfoUl()"); return RFAILED; } - macCellGrpCfg->tag_Config = NULLP; - DU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config)); - if(!macCellGrpCfg->tag_Config) + for(listIdx = 0; listIdx < elementCnt; listIdx++) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg"); - return RFAILED; + 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; + } } - if(BuildTagConfig(ueCb, macCellGrpCfg->tag_Config) != ROK) - { - DU_LOG("\nERROR --> F1AP : BuildTagConfig failed"); + 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) = ?; + */ - macCellGrpCfg->phr_Config = NULLP; - DU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config)); - if(!macCellGrpCfg->phr_Config) + /* Subcarrier Spacing specifc carrier */ + if((BuildScsSpecificCarrierListUl(&frequencyInfoUL->scs_SpecificCarrierList)) != ROK) { - DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg"); + DU_LOG("\nERROR --> DU APP : Failed to fill SCS Specific Carrier list UL in BuildFreqInfoUl()"); return RFAILED; } - if(BuildPhrConfig(ueCb, macCellGrpCfg->phr_Config) != ROK) + /* P-MAX */ + DU_ALLOC(frequencyInfoUL->p_Max, sizeof(P_Max_t)); + if(!frequencyInfoUL->p_Max) { - DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed"); + DU_LOG("\nERROR --> DU APP : UL Frequency Infoo memory allocation failure"); return RFAILED; } - - macCellGrpCfg->skipUplinkTxDynamic = false; - macCellGrpCfg->ext1 = NULLP; + *frequencyInfoUL->p_Max = ulCfg.pMax; return ROK; } + /******************************************************************* * - * @brief Frees memeory allocated for SearchSpcToAddModList + * @brief Fills UL config common in Serving cell config common * * @details * - * Function : FreeSearchSpcToAddModList + * Function : BuildUlConfigCommon * - * Functionality: Deallocating memory of SearchSpcToAddModList + * Functionality: Fills UL config common in Serving cell config common * - * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList + * @params[in] Pointer to UplinkConfigCommon_t * - * @return void + * @return ROK - success + * RFAILED - failure * - 4221 * ****************************************************************/ -void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList) + * ****************************************************************/ +uint8_t BuildUlConfigCommon(UplinkConfigCommon_t *ulCfgCommon) { - uint8_t idx1=0; - uint8_t idx2=0; - struct SearchSpace *searchSpc=NULLP; + /* 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(searchSpcList->list.array) + if((BuildFreqInfoUl(ulCfgCommon->frequencyInfoUL)) != ROK) { - 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->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); + 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 Frees memory allocated for PdschTimeDomAllocList + * @brief Fills SSB position in burst in SP cell config common * * @details * - * Function : FreePdschTimeDomAllocList + * Function : BuildSsbPosInBurst * - * Functionality: Deallocating memory of PdschTimeDomAllocList + * Functionality: + * Fills SSB position in burst in SP cell config common * - * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList + * @params[in] Pointer to struct ServingCellConfigCommon__ssb_PositionsInBurst * - * @return void + * @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; +} +#ifdef NR_DRX +/******************************************************************* + * + * @brief fill long cycle offset value of drx + * + * @details + * + * Function : fillLongCycleOffsetValFromDuCb + * + * Functionality: fill long cycle offset value of drx + * + * @params[in] DrxLongCycleStartOffset drxLongCycleStartOffset, + * struct DRX_ConfigRrc__drx_LongCycleStartOffset drx_LongCycleStartOffset + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +void fillLongCycleOffsetValFromDuCb(DrxLongCycleStartOffset drxLongCycleStartOffset,\ +struct DRX_ConfigRrc__drx_LongCycleStartOffset *drx_LongCycleStartOffset) +{ + + drx_LongCycleStartOffset->present = convertLongDrxCycleLengthValueToEnum(drxLongCycleStartOffset.drxLongCycleStartOffsetChoice); + switch(drx_LongCycleStartOffset->present) + { + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms10: + { + drx_LongCycleStartOffset->choice.ms10 = drxLongCycleStartOffset.drxLongCycleStartOffsetVal; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms20: + { + drx_LongCycleStartOffset->choice.ms20 = drxLongCycleStartOffset.drxLongCycleStartOffsetVal; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms32: + { + drx_LongCycleStartOffset->choice.ms32 = drxLongCycleStartOffset.drxLongCycleStartOffsetVal; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms40: + { + drx_LongCycleStartOffset->choice.ms40 = drxLongCycleStartOffset.drxLongCycleStartOffsetVal; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms60: + { + drx_LongCycleStartOffset->choice.ms60 = drxLongCycleStartOffset.drxLongCycleStartOffsetVal; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms64: + { + drx_LongCycleStartOffset->choice.ms64 = drxLongCycleStartOffset.drxLongCycleStartOffsetVal; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms70: + { + drx_LongCycleStartOffset->choice.ms70 = drxLongCycleStartOffset.drxLongCycleStartOffsetVal; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms80: + { + drx_LongCycleStartOffset->choice.ms80 = drxLongCycleStartOffset.drxLongCycleStartOffsetVal; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms128: + { + drx_LongCycleStartOffset->choice.ms128 = drxLongCycleStartOffset.drxLongCycleStartOffsetVal; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms160: + { + drx_LongCycleStartOffset->choice.ms160 = drxLongCycleStartOffset.drxLongCycleStartOffsetVal; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms256: + { + drx_LongCycleStartOffset->choice.ms256 = drxLongCycleStartOffset.drxLongCycleStartOffsetVal; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms320: + { + drx_LongCycleStartOffset->choice.ms320 = drxLongCycleStartOffset.drxLongCycleStartOffsetVal; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms512: + { + drx_LongCycleStartOffset->choice.ms512 = drxLongCycleStartOffset.drxLongCycleStartOffsetVal; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms640: + { + drx_LongCycleStartOffset->choice.ms640 = drxLongCycleStartOffset.drxLongCycleStartOffsetVal; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms1024: + { + drx_LongCycleStartOffset->choice.ms1024 = drxLongCycleStartOffset.drxLongCycleStartOffsetVal; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms1280: + { + drx_LongCycleStartOffset->choice.ms1280 = drxLongCycleStartOffset.drxLongCycleStartOffsetVal; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms2048: + { + drx_LongCycleStartOffset->choice.ms2048 = drxLongCycleStartOffset.drxLongCycleStartOffsetVal; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms2560: + { + drx_LongCycleStartOffset->choice.ms2560 = drxLongCycleStartOffset.drxLongCycleStartOffsetVal; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms5120: + { + drx_LongCycleStartOffset->choice.ms5120 = drxLongCycleStartOffset.drxLongCycleStartOffsetVal; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms10240: + { + drx_LongCycleStartOffset->choice.ms10240 = drxLongCycleStartOffset.drxLongCycleStartOffsetVal; + break; + } + default : + break; + } +} +/******************************************************************* + * + * @brief Builds drx config IE + * + * @details + * + * Function : BuildDrxConfigRrc + * + * Functionality: Build drx config in MacCellGrpCfg + * + * @params[in] struct MAC_CellGroupConfig__drx_ConfigRrc + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t BuildDrxConfigRrc(DuUeCb *ueCb, struct MAC_CellGroupConfig__drx_ConfigRrc *drxCfg) +{ + drxCfg->present = MAC_CellGroupConfig__drx_ConfigRrc_PR_setup; + DU_ALLOC(drxCfg->choice.setup, sizeof(struct DRX_ConfigRrc)); + if(!drxCfg->choice.setup) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDrxConfigRrc"); + return RFAILED; + } + if(ueCb->macUeCfg.macCellGrpCfg.drxCfg.drxOnDurationTimer.onDurationTimerValInMs) + { + drxCfg->choice.setup->drx_onDurationTimer.present = DRX_ConfigRrc__drx_onDurationTimer_PR_milliSeconds; + drxCfg->choice.setup->drx_onDurationTimer.choice.milliSeconds = convertOnDurationTimerMilliSecondsValueToEnum(ueCb->macUeCfg.\ + macCellGrpCfg.drxCfg.drxOnDurationTimer.onDurationtimerValue.milliSeconds); + } + else + { + drxCfg->choice.setup->drx_onDurationTimer.present = DRX_ConfigRrc__drx_onDurationTimer_PR_subMilliSeconds; + drxCfg->choice.setup->drx_onDurationTimer.choice.subMilliSeconds = ueCb->macUeCfg.macCellGrpCfg.drxCfg.\ + drxOnDurationTimer.onDurationtimerValue.subMilliSeconds; + } + drxCfg->choice.setup->drx_InactivityTimer = convertDrxInactivityTimerValueToEnum(ueCb->macUeCfg.macCellGrpCfg.drxCfg.drxInactivityTimer); + drxCfg->choice.setup->drx_HARQ_RTT_TimerDL = ueCb->macUeCfg.macCellGrpCfg.drxCfg.drxHarqRttTimerDl; + drxCfg->choice.setup->drx_HARQ_RTT_TimerUL = ueCb->macUeCfg.macCellGrpCfg.drxCfg.drxHarqRttTimerUl; + drxCfg->choice.setup->drx_RetransmissionTimerDL = convertDrxRetransmissionTimerDlValueToEnum(ueCb->macUeCfg.macCellGrpCfg.drxCfg.\ + drxRetransmissionTimerDl); + drxCfg->choice.setup->drx_RetransmissionTimerUL = convertDrxRetransmissionTimerUlValueToEnum(ueCb->macUeCfg.macCellGrpCfg.drxCfg.\ + drxRetransmissionTimerUl); + drxCfg->choice.setup->drx_SlotOffset = ueCb->macUeCfg.macCellGrpCfg.drxCfg.drxSlotOffset; + fillLongCycleOffsetValFromDuCb(ueCb->macUeCfg.macCellGrpCfg.drxCfg.drxLongCycleStartOffset, &drxCfg->choice.setup->drx_LongCycleStartOffset); + + if(ueCb->macUeCfg.macCellGrpCfg.drxCfg.shortDrxPres) + { + DU_ALLOC(drxCfg->choice.setup->shortDRX, sizeof(struct DRX_ConfigRrc__shortDRX)); + if(drxCfg->choice.setup->shortDRX) + { + drxCfg->choice.setup->shortDRX->drx_ShortCycle = convertShortDrxCycleLengthValueToEnum(ueCb->macUeCfg.macCellGrpCfg.drxCfg.\ + shortDrx.drxShortCycle); + drxCfg->choice.setup->shortDRX->drx_ShortCycleTimer = ueCb->macUeCfg.macCellGrpCfg.drxCfg.shortDrx.drxShortCycleTimer; + } + else + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDrxConfigRrc"); + return RFAILED; + } + } + return ROK; +} +#endif +/******************************************************************* + * + * @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_ConfigRrc = NULLP; +#ifdef NR_DRX + if(ueCb) + { + DU_ALLOC(macCellGrpCfg->drx_ConfigRrc, sizeof(struct MAC_CellGroupConfig__drx_ConfigRrc)); + if(!macCellGrpCfg->drx_ConfigRrc) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg"); + return RFAILED; + } + if(BuildDrxConfigRrc(ueCb, macCellGrpCfg->drx_ConfigRrc) != ROK) + { + DU_LOG("\nERROR --> F1AP : failed to build drx config"); + return RFAILED; + } + } +#endif + 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->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) @@ -6864,72 +7762,423 @@ void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp) DU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \ sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA)); } - DU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config)); + 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(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)); + } +} + +/******************************************************************* + * + * @brief Free SCS specific carrier list in DL frequency info + * + * @details + * + * Function : FreeScsSpecificCarrierListDl + * + * Functionality: Free SCS specific carrier list in DL frequency info + * + * @params[in] Pointer to struct FrequencyInfoDL__scs_SpecificCarrierList + * + * @return void + * + * ****************************************************************/ +void FreeScsSpecificCarrierListDl(struct FrequencyInfoDL__scs_SpecificCarrierList *scsCarrierList) +{ + uint8_t listIdx = 0; + + if(!scsCarrierList->list.array) + { + for(listIdx = 0; listIdx < scsCarrierList->list.count; listIdx++) + { + DU_FREE(scsCarrierList->list.array[listIdx], sizeof(SCS_SpecificCarrier_t)); + } + DU_FREE(scsCarrierList->list.array, scsCarrierList->list.size); + } +} + +/******************************************************************* + * + * @brief Free DL frequency info in DL config common + * + * @details + * + * Function : FreeFreqInfoDl + * + * Functionality: Free DL frequency info in DL config common + * + * @params[in] Pointer to DownlinkConfigCommon_t + * + * @return void + * + * ****************************************************************/ +void FreeFreqInfoDl(FrequencyInfoDL_t *frequencyInfoDL) +{ + uint8_t freqBandIdx = 0; + + /* SSB Absolute Frequency */ + DU_FREE(frequencyInfoDL->absoluteFrequencySSB, sizeof(ARFCN_ValueNR_t)); + + /* NR Multi Frequency Band List */ + if(frequencyInfoDL->frequencyBandList.list.array) + { + for(freqBandIdx = 0; freqBandIdx < frequencyInfoDL->frequencyBandList.list.count; freqBandIdx++) + { + DU_FREE(frequencyInfoDL->frequencyBandList.list.array[freqBandIdx], sizeof(FreqBandIndicatorNR_t)); + } + DU_FREE(frequencyInfoDL->frequencyBandList.list.array, frequencyInfoDL->frequencyBandList.list.size); + } + + /* Subcarrier Spacing specifc carrier List */ + FreeScsSpecificCarrierListDl(&frequencyInfoDL->scs_SpecificCarrierList); +} + +/******************************************************************* + * + * @brief Free DL config common in Serving cell config common + * + * @details + * + * Function : FreeDlConfigCommon + * + * Functionality: Free DL config common in Serving cell config common + * + * @params[in] Pointer to DownlinkConfigCommon_t + * + * @return void + * + * ****************************************************************/ +void FreeDlConfigCommon(DownlinkConfigCommon_t *dlCfgCommon) +{ + /* 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(scsCarrierList->list.array) + { + for(listIdx = 0; listIdx < scsCarrierList->list.count; listIdx++) + { + DU_FREE(scsCarrierList->list.array[listIdx], sizeof(SCS_SpecificCarrier_t)); + } + DU_FREE(scsCarrierList->list.array, scsCarrierList->list.size); + } +} + +/******************************************************************* + * + * @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(frequencyInfoUL->frequencyBandList->list.array) + { + for(listIdx = 0; listIdx < frequencyInfoUL->frequencyBandList->list.count; listIdx++) + { + DU_FREE(frequencyInfoUL->frequencyBandList->list.array[listIdx], sizeof(FreqBandIndicatorNR_t)); + } + DU_FREE(frequencyInfoUL->frequencyBandList->list.array, frequencyInfoUL->frequencyBandList->list.size); + } + DU_FREE(frequencyInfoUL->frequencyBandList, sizeof(MultiFrequencyBandListNR_t)); + } + + /* Absolute frequency point A */ + DU_FREE(frequencyInfoUL->absoluteFrequencyPointA, sizeof(ARFCN_ValueNR_t)); + + /* Subcarrier Spacing specifc carrier */ + FreeScsSpecificCarrierListUl(&frequencyInfoUL->scs_SpecificCarrierList); + + /* P-MAX */ + DU_FREE(frequencyInfoUL->p_Max, sizeof(P_Max_t)); +} + +/******************************************************************* + * + * @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)); + } + + /* UL BWP common */ + if(ulCfgCommon->initialUplinkBWP) + { + FreeBwpUlCommon(ulCfgCommon->initialUplinkBWP); + DU_FREE(ulCfgCommon->initialUplinkBWP, sizeof(BWP_UplinkCommon_t)); + } +} + +/******************************************************************* + * + * @brief Free SP cell config common in Reconfig with Sync + * + * @details + * + * Function : FreeSpCellConfigCommon + * + * Functionality: Free SP cell config common in Reconfig with Sync + * + * @params[in] Pointer to ServingCellConfigCommon_t + * + * @return void + * + * ****************************************************************/ +void FreeSpCellConfigCommon(ServingCellConfigCommon_t *spCellConfigCommon) +{ + /* Free Physical cell identity */ + DU_FREE(spCellConfigCommon->physCellId, sizeof(PhysCellId_t)); + + /* Free Downlink Config common */ + if(spCellConfigCommon->downlinkConfigCommon) + { + 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 Free dedicated RACH configuration in Reconfiguration with sync + * + * @details + * + * Function : FreeRecfgWithSync + * + * Functionality: + * Free dedicated RACH configuration in Reconfiguration with sync + * + * @params[in] Pinter to Rach config dedicated struct + * + * @return void + * + * ****************************************************************/ +void FreeRachConfigDedicated(struct ReconfigurationWithSync__rach_ConfigDedicated *rachCfgDed) +{ + uint8_t listIdx = 0; + CFRA_t *cfra = NULLP; + struct CFRA__resources__ssb *ssbResource = NULLP; + + /* Uplink */ + if(rachCfgDed->choice.uplink) + { + /* CFRA : Contention free Random Access */ + if(rachCfgDed->choice.uplink->cfra) + { + 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(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)); } -} +} /******************************************************************* * @@ -6958,6 +8207,7 @@ uint8_t FreeMemDuToCuRrcCont(CellGroupConfigRrc_t *cellGrpCfg) struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP; struct RLC_Config *rlcConfig=NULLP; struct LogicalChannelConfig *macLcConfig=NULLP; + struct MAC_CellGroupConfig__drx_ConfigRrc *drxCfg=NULLP; struct SchedulingRequestConfig *schedulingRequestConfig=NULLP; struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP; struct TAG_Config *tagConfig=NULLP; @@ -6978,11 +8228,49 @@ 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_NOTHING: + break; + + 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)); } @@ -7008,6 +8296,27 @@ uint8_t FreeMemDuToCuRrcCont(CellGroupConfigRrc_t *cellGrpCfg) macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig; if(macCellGrpCfg) { + drxCfg = macCellGrpCfg->drx_ConfigRrc; + + if(drxCfg) + { + switch(drxCfg->present) + { + case MAC_CellGroupConfig__drx_ConfigRrc_PR_NOTHING: + break; + case MAC_CellGroupConfig__drx_ConfigRrc_PR_setup: + { + if(drxCfg->choice.setup) + { + DU_FREE(drxCfg->choice.setup->shortDRX, sizeof(struct DRX_ConfigRrc__shortDRX)); + DU_FREE(drxCfg->choice.setup, sizeof(struct DRX_ConfigRrc)); + } + } + case MAC_CellGroupConfig__drx_ConfigRrc_PR_release: + break; + } + DU_FREE(drxCfg, sizeof(struct MAC_CellGroupConfig__drx_ConfigRrc)); + } schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig; if(schedulingRequestConfig) { @@ -7032,6 +8341,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; @@ -7073,61 +8383,74 @@ 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)); } - DU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long)); + + /* 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)); } - DU_FREE(spCellCfg->servCellIndex, sizeof(long)); + + /* 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(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig)); + } + + DU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t)); } DU_FREE(spCellCfg,sizeof(SpCellConfig_t)); } @@ -7245,10 +8568,12 @@ uint8_t BuildCellGroupConfigRrc(DuUeCb *ueCb, OCTET_STRING_t *duToCuRrcContainer else { DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DuToCuRrcContainer\n"); +#ifdef DEBUG_ASN_PRINT for(int i=0; i< encBufSize; i++) { printf("%x",encBuf[i]); } +#endif } duToCuRrcContainer->size = encBufSize; @@ -7534,10 +8859,12 @@ uint8_t BuildAndSendInitialRrcMsgTransfer(uint32_t gnbDuUeF1apId, uint16_t crnti DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Initial UL RRC\ Message transfer\n"); +#ifdef DEBUG_ASN_PRINT for(int i=0; i< encBufSize; i++) { printf("%x",encBuf[i]); } +#endif } /* Sending msg */ if(sendF1APMsg() != ROK) @@ -7599,35 +8926,22 @@ void freeRlcLcCfg(RlcBearerCfg *lcCfg) { case RLC_AM : { - if(lcCfg->u.amCfg) - { - DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.amCfg, sizeof(AmBearerCfg)); - } + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.amCfg, sizeof(AmBearerCfg)); break; } case RLC_UM_BI_DIRECTIONAL : { - if(lcCfg->u.umBiDirCfg) - { - DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umBiDirCfg, sizeof(UmBiDirBearerCfg)); - } + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umBiDirCfg, sizeof(UmBiDirBearerCfg)); break; } case RLC_UM_UNI_DIRECTIONAL_UL : { - if(lcCfg->u.umUniDirUlCfg) - { - DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umUniDirUlCfg, sizeof(UmUniDirUlBearerCfg)); - } + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umUniDirUlCfg, sizeof(UmUniDirUlBearerCfg)); break; - } case RLC_UM_UNI_DIRECTIONAL_DL : { - if(lcCfg->u.umUniDirDlCfg) - { - DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umUniDirDlCfg, sizeof(UmUniDirDlBearerCfg)); - } + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umUniDirDlCfg, sizeof(UmUniDirDlBearerCfg)); break; } default: @@ -8183,7 +9497,7 @@ void freeAperDecodeinitialUplinkBWPConfig(UplinkConfig_t *ulCfg) * @return void * * ****************************************************************/ -void freeDuUeCfg(DuUeCfg *ueCfg) +void freeDuUeCfg(UeCtxtActionType actionType, DuUeCfg *ueCfg) { uint8_t lcIdx = 0; uint8_t arrIdx = 0; @@ -8212,194 +9526,200 @@ void freeDuUeCfg(DuUeCfg *ueCfg) if(ueCfg->cellGrpCfg) { - rlcBearerList = cellGrpCfg->rlc_BearerToAddModList; if(rlcBearerList) { - if(rlcBearerList->list.array) - { - for(arrIdx=0; arrIdxlist.count; arrIdx++) - { - if(rlcBearerList->list.array[arrIdx]) - { - rlcConfig = rlcBearerList->list.array[arrIdx]->rlc_Config; - macLcConfig = rlcBearerList->list.array[arrIdx]->mac_LogicalChannelConfig; - - if(rlcBearerList->list.array[arrIdx]->servedRadioBearer) - { - free(rlcBearerList->list.array[arrIdx]->servedRadioBearer); - } - if(rlcConfig) - { - if(rlcConfig->choice.am) - { - free(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength); - free(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength); - free(rlcConfig->choice.am); - } - free(rlcBearerList->list.array[arrIdx]->rlc_Config); - } - if(macLcConfig) - { - if(macLcConfig->ul_SpecificParameters) - { - free(macLcConfig->ul_SpecificParameters->schedulingRequestID); - free(macLcConfig->ul_SpecificParameters->logicalChannelGroup); - free(macLcConfig->ul_SpecificParameters); - } - free(rlcBearerList->list.array[arrIdx]->mac_LogicalChannelConfig); - } - free(rlcBearerList->list.array[arrIdx]); - } - } - free(rlcBearerList->list.array); - } - free(cellGrpCfg->rlc_BearerToAddModList); + if(rlcBearerList->list.array) + { + for(arrIdx=0; arrIdxlist.count; arrIdx++) + { + if(rlcBearerList->list.array[arrIdx]) + { + rlcConfig = rlcBearerList->list.array[arrIdx]->rlc_Config; + macLcConfig = rlcBearerList->list.array[arrIdx]->mac_LogicalChannelConfig; + + if(rlcBearerList->list.array[arrIdx]->servedRadioBearer) + { + free(rlcBearerList->list.array[arrIdx]->servedRadioBearer); + } + if(rlcConfig) + { + if(rlcConfig->choice.am) + { + free(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength); + free(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength); + free(rlcConfig->choice.am); + } + free(rlcBearerList->list.array[arrIdx]->rlc_Config); + } + if(macLcConfig) + { + if(macLcConfig->ul_SpecificParameters) + { + free(macLcConfig->ul_SpecificParameters->schedulingRequestID); + free(macLcConfig->ul_SpecificParameters->logicalChannelGroup); + free(macLcConfig->ul_SpecificParameters); + } + free(rlcBearerList->list.array[arrIdx]->mac_LogicalChannelConfig); + } + free(rlcBearerList->list.array[arrIdx]); + } + } + free(rlcBearerList->list.array); + } + free(cellGrpCfg->rlc_BearerToAddModList); } macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig; if(macCellGrpCfg) { - schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig; - if(schedulingRequestConfig) - { - schReqList = schedulingRequestConfig->schedulingRequestToAddModList; - if(schReqList) - { - if(schReqList->list.array) - { - for(arrIdx=0;arrIdxlist.count; arrIdx++) - { - if(schReqList->list.array[arrIdx]) - { - free(schReqList->list.array[arrIdx]->sr_ProhibitTimer); - free(schReqList->list.array[arrIdx]); - } - } - free(schReqList->list.array); - } - free(schedulingRequestConfig->schedulingRequestToAddModList); - } - free(macCellGrpCfg->schedulingRequestConfig); - } - if(macCellGrpCfg->bsr_Config) - { - free(macCellGrpCfg->bsr_Config); - } - tagConfig = macCellGrpCfg->tag_Config; - if(tagConfig) - { - tagList = tagConfig->tag_ToAddModList; - if(tagList) - { - if(tagList->list.array) - { - for(arrIdx=0; arrIdxlist.count; arrIdx++) - { - free(tagList->list.array[arrIdx]); - } - free(tagList->list.array); - } - free(tagConfig->tag_ToAddModList); - } - free(tagConfig); - } + schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig; + if(schedulingRequestConfig) + { + schReqList = schedulingRequestConfig->schedulingRequestToAddModList; + if(schReqList) + { + if(schReqList->list.array) + { + for(arrIdx=0;arrIdxlist.count; arrIdx++) + { + if(schReqList->list.array[arrIdx]) + { + free(schReqList->list.array[arrIdx]->sr_ProhibitTimer); + free(schReqList->list.array[arrIdx]); + } + } + free(schReqList->list.array); + } + free(schedulingRequestConfig->schedulingRequestToAddModList); + } + free(macCellGrpCfg->schedulingRequestConfig); + } + if(macCellGrpCfg->bsr_Config) + { + free(macCellGrpCfg->bsr_Config); + } + tagConfig = macCellGrpCfg->tag_Config; + if(tagConfig) + { + tagList = tagConfig->tag_ToAddModList; + if(tagList) + { + if(tagList->list.array) + { + for(arrIdx=0; arrIdxlist.count; arrIdx++) + { + free(tagList->list.array[arrIdx]); + } + free(tagList->list.array); + } + free(tagConfig->tag_ToAddModList); + } + free(tagConfig); + } - phrConfig = macCellGrpCfg->phr_Config; - if(phrConfig) - { - free(phrConfig->choice.setup); - free(phrConfig); - } + phrConfig = macCellGrpCfg->phr_Config; + if(phrConfig) + { + free(phrConfig->choice.setup); + free(phrConfig); + } - free(macCellGrpCfg); + free(macCellGrpCfg); } phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig; if(phyCellGrpCfg) { - free(phyCellGrpCfg->p_NR_FR1); - free(phyCellGrpCfg); + free(phyCellGrpCfg->p_NR_FR1); + free(phyCellGrpCfg); } spCellCfg = cellGrpCfg->spCellConfig; - if(spCellCfg) - { - if(spCellCfg->servCellIndex) - { - if(spCellCfg->rlmInSyncOutOfSyncThreshold) - { - if(spCellCfg->spCellConfigDedicated) - { - srvCellCfg = spCellCfg->spCellConfigDedicated; - if(srvCellCfg->initialDownlinkBWP) - { - dlBwp = srvCellCfg->initialDownlinkBWP; - if(srvCellCfg->firstActiveDownlinkBWP_Id) - { - if(srvCellCfg->defaultDownlinkBWP_Id) - { - if(srvCellCfg->uplinkConfig) - { + if(spCellCfg) + { + if(spCellCfg->servCellIndex) + { + if(spCellCfg->rlmInSyncOutOfSyncThreshold) + { + if(spCellCfg->spCellConfigDedicated) + { + srvCellCfg = spCellCfg->spCellConfigDedicated; + 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) - { + if(srvCellCfg->pdsch_ServingCellConfig) + { + pdschCfg= + srvCellCfg->pdsch_ServingCellConfig; + if(pdschCfg->choice.setup) + { - free(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH); - free(pdschCfg->choice.setup); - } + free(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH); + free(pdschCfg->choice.setup); + } - free(srvCellCfg->pdsch_ServingCellConfig); - } + free(srvCellCfg->pdsch_ServingCellConfig); + } - freeAperDecodeinitialUplinkBWPConfig(srvCellCfg->uplinkConfig); - free(srvCellCfg->uplinkConfig); - } - free(srvCellCfg->defaultDownlinkBWP_Id); - } + freeAperDecodeinitialUplinkBWPConfig(srvCellCfg->uplinkConfig); + free(srvCellCfg->uplinkConfig); + } + free(srvCellCfg->defaultDownlinkBWP_Id); + } - free(srvCellCfg->firstActiveDownlinkBWP_Id); - } - if(dlBwp->pdcch_Config) - { - if(dlBwp->pdsch_Config) - { - freeAperDecodeBWPDlDedPdschConfig(dlBwp); - free(dlBwp->pdsch_Config); - } - freeAperDecodeBWPDlDedPdcchConfig(dlBwp); - free(dlBwp->pdcch_Config); - } - free(srvCellCfg->initialDownlinkBWP); - } + free(srvCellCfg->firstActiveDownlinkBWP_Id); + } + if(dlBwp->pdcch_Config) + { + if(dlBwp->pdsch_Config) + { + freeAperDecodeBWPDlDedPdschConfig(dlBwp); + free(dlBwp->pdsch_Config); + } + freeAperDecodeBWPDlDedPdcchConfig(dlBwp); + free(dlBwp->pdcch_Config); + } + free(srvCellCfg->initialDownlinkBWP); + } - free(spCellCfg->spCellConfigDedicated); - } - free(spCellCfg->rlmInSyncOutOfSyncThreshold); - } - free(spCellCfg->servCellIndex); - } - free(spCellCfg); + free(spCellCfg->spCellConfigDedicated); + } + free(spCellCfg->rlmInSyncOutOfSyncThreshold); + } + free(spCellCfg->servCellIndex); + } + free(spCellCfg); } DU_FREE(ueCfg->cellGrpCfg, sizeof(CellGroupConfigRrc_t)); ueCfg->cellGrpCfg = NULLP; } + if(ueCfg->ambrCfg) { DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueCfg->ambrCfg, sizeof(AmbrCfg)); } - for(lcIdx = 0; lcIdx < ueCfg->numRlcLcs; lcIdx++) + + if(actionType != UE_CTXT_CFG_QUERY) { - freeRlcLcCfg(&ueCfg->rlcLcCfg[lcIdx]); + for(lcIdx = 0; lcIdx < ueCfg->numRlcLcs; lcIdx++) + { + freeRlcLcCfg(&ueCfg->rlcLcCfg[lcIdx]); + } } + for(lcIdx = 0; lcIdx < ueCfg->numMacLcs; lcIdx++) { freeMacLcCfg(&ueCfg->macLcCfg[lcIdx]); } + for(lcIdx = 0; lcIdx < ueCfg->numDrb; lcIdx++) { DU_FREE(ueCfg->upTnlInfo[lcIdx].tnlCfg1, sizeof(GtpTnlCfg)); @@ -8433,7 +9753,7 @@ void freeF1UeDb(F1UeContextSetupDb *f1UeDb) } DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg)); } - freeDuUeCfg(&f1UeDb->duUeCfg); + freeDuUeCfg(f1UeDb->actionType, &f1UeDb->duUeCfg); memset(f1UeDb, 0, sizeof(F1UeContextSetupDb)); DU_FREE(f1UeDb, sizeof(F1UeContextSetupDb)); } @@ -10640,6 +11960,228 @@ ServCellCfgInfo *storedSrvCellCfg) } return ret; } + +#ifdef NR_DRX + +/******************************************************************* + * + * @brief fill long cycle offset value of drx in UE structure + * + * @details + * + * Function : fillLongCycleOffsetValueInUeDb + * + * Functionality: fill long cycle offset value of drx in UE structure + * + * @params[in] DrxLongCycleStartOffset drxLongCycleStartOffset, + * struct DRX_ConfigRrc__drx_LongCycleStartOffset drx_LongCycleStartOffset + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +void fillLongCycleOffsetValueInUeDb(DrxLongCycleStartOffset *drxLongCycleStartOffset, struct DRX_ConfigRrc__drx_LongCycleStartOffset *drx_LongCycleStartOffset) +{ + + drxLongCycleStartOffset->drxLongCycleStartOffsetChoice = convertLongDrxCycleLengthEnumToValue(drx_LongCycleStartOffset->present); + switch(drx_LongCycleStartOffset->present) + { + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms10: + { + drxLongCycleStartOffset->drxLongCycleStartOffsetVal = drx_LongCycleStartOffset->choice.ms10; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms20: + { + drxLongCycleStartOffset->drxLongCycleStartOffsetVal = drx_LongCycleStartOffset->choice.ms20; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms32: + { + drxLongCycleStartOffset->drxLongCycleStartOffsetVal = drx_LongCycleStartOffset->choice.ms32; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms40: + { + drxLongCycleStartOffset->drxLongCycleStartOffsetVal = drx_LongCycleStartOffset->choice.ms40; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms60: + { + drxLongCycleStartOffset->drxLongCycleStartOffsetVal = drx_LongCycleStartOffset->choice.ms60; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms64: + { + drxLongCycleStartOffset->drxLongCycleStartOffsetVal = drx_LongCycleStartOffset->choice.ms64; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms70: + { + drxLongCycleStartOffset->drxLongCycleStartOffsetVal = drx_LongCycleStartOffset->choice.ms70; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms80: + { + drxLongCycleStartOffset->drxLongCycleStartOffsetVal = drx_LongCycleStartOffset->choice.ms80; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms128: + { + drxLongCycleStartOffset->drxLongCycleStartOffsetVal = drx_LongCycleStartOffset->choice.ms128; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms160: + { + drxLongCycleStartOffset->drxLongCycleStartOffsetVal = drx_LongCycleStartOffset->choice.ms160; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms256: + { + drxLongCycleStartOffset->drxLongCycleStartOffsetVal = drx_LongCycleStartOffset->choice.ms256; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms320: + { + drxLongCycleStartOffset->drxLongCycleStartOffsetVal = drx_LongCycleStartOffset->choice.ms320; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms512: + { + drxLongCycleStartOffset->drxLongCycleStartOffsetVal = drx_LongCycleStartOffset->choice.ms512; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms640: + { + drxLongCycleStartOffset->drxLongCycleStartOffsetVal = drx_LongCycleStartOffset->choice.ms640; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms1024: + { + drxLongCycleStartOffset->drxLongCycleStartOffsetVal = drx_LongCycleStartOffset->choice.ms1024; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms1280: + { + drxLongCycleStartOffset->drxLongCycleStartOffsetVal = drx_LongCycleStartOffset->choice.ms1280; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms2048: + { + drxLongCycleStartOffset->drxLongCycleStartOffsetVal = drx_LongCycleStartOffset->choice.ms2048; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms2560: + { + drxLongCycleStartOffset->drxLongCycleStartOffsetVal = drx_LongCycleStartOffset->choice.ms2560; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms5120: + { + drxLongCycleStartOffset->drxLongCycleStartOffsetVal = drx_LongCycleStartOffset->choice.ms5120; + break; + } + case DRX_ConfigRrc__drx_LongCycleStartOffset_PR_ms10240: + { + drxLongCycleStartOffset->drxLongCycleStartOffsetVal = drx_LongCycleStartOffset->choice.ms10240; + break; + } + default : + break; + } +} + +/******************************************************************* + * + * @brief Fills drx configuration structure with the help of drx_ConfigRrc + *which recive from CU or storedDrxCfg which is already stored + * + * @details + * + * Function : extractDrxConfiguration + * + * Functionality: Fills Reconfig Cell group Info received by CU + * + * @params[in] cuMacCellGrpDrxConfig = MAC_CellGroupConfig__drx_ConfigRrc information which + * is send by CU, which we have stored in F1UeContextSetupDb + * DrxCfg * drxCfg = Used to Store the information, + * which needs to send in other layer, as well as this can be + * the variable which stores the information in DuCb, + * DrxCfg *storedDrxCfg = Null in case of sending the + * information to other layer else it will have the drx information + * stored in the copyOfmacUeCfg which we have stored in F1UeContextSetupDb. + * + * @return void + * + * ****************************************************************/ +void extractDrxConfiguration(struct MAC_CellGroupConfig__drx_ConfigRrc *cuMacCellGrpDrxConfig, DrxCfg * drxCfg, DrxCfg *storedDrxCfg) +{ + struct DRX_ConfigRrc *cuDrxConfig; + + if(storedDrxCfg) + { + memcpy(drxCfg, storedDrxCfg, sizeof(DrxCfg)); + } + else + { + if(cuMacCellGrpDrxConfig) + { + switch(cuMacCellGrpDrxConfig->present) + { + case MAC_CellGroupConfig__drx_ConfigRrc_PR_NOTHING: + break; + + case MAC_CellGroupConfig__drx_ConfigRrc_PR_setup: + { + cuDrxConfig = cuMacCellGrpDrxConfig->choice.setup; + if(cuDrxConfig) + { + switch(cuDrxConfig->drx_onDurationTimer.present) + { + case DRX_ConfigRrc__drx_onDurationTimer_PR_NOTHING: + break; + case DRX_ConfigRrc__drx_onDurationTimer_PR_milliSeconds: + { + drxCfg->drxOnDurationTimer.onDurationTimerValInMs = true; + drxCfg->drxOnDurationTimer.onDurationtimerValue.milliSeconds=convertOnDurationTimerMilliSecondsEnumToValue(cuDrxConfig->\ + drx_onDurationTimer.choice.milliSeconds); + break; + } + case DRX_ConfigRrc__drx_onDurationTimer_PR_subMilliSeconds: + { + drxCfg->drxOnDurationTimer.onDurationTimerValInMs = false; + drxCfg->drxOnDurationTimer.onDurationtimerValue.subMilliSeconds = cuDrxConfig->drx_onDurationTimer.choice.subMilliSeconds; + break; + } + } + } + fillLongCycleOffsetValueInUeDb(&drxCfg->drxLongCycleStartOffset, &cuDrxConfig->drx_LongCycleStartOffset); + drxCfg->drxInactivityTimer = convertDrxInactivityTimerEnumToValue(cuDrxConfig->drx_InactivityTimer); + drxCfg->drxHarqRttTimerDl = cuDrxConfig->drx_HARQ_RTT_TimerDL; + drxCfg->drxHarqRttTimerUl = cuDrxConfig->drx_HARQ_RTT_TimerUL; + drxCfg->drxRetransmissionTimerDl = convertDrxRetransmissionTimerDlEnumToValue(cuDrxConfig->drx_RetransmissionTimerDL); + drxCfg->drxRetransmissionTimerUl = convertDrxRetransmissionTimerUlEnumToValue(cuDrxConfig->drx_RetransmissionTimerUL); + drxCfg->drxSlotOffset = cuDrxConfig->drx_SlotOffset; + if(cuDrxConfig->shortDRX) + { + drxCfg->shortDrxPres=true; + drxCfg->shortDrx.drxShortCycle = convertShortDrxCycleLengthEnumToValue(cuDrxConfig->shortDRX->drx_ShortCycle); + drxCfg->shortDrx.drxShortCycleTimer = cuDrxConfig->shortDRX->drx_ShortCycleTimer; + } + else + drxCfg->shortDrxPres=false; + + break; + } + + case MAC_CellGroupConfig__drx_ConfigRrc_PR_release: + break; + } + } + } +} +#endif + /******************************************************************* * * @brief Fills Reconfig Cell group Info received by CU @@ -10677,6 +12219,28 @@ uint8_t extractUeReCfgCellInfo(CellGroupConfigRrc_t *cellGrp, MacUeCfg *macUeCfg { macUeCfg->macCellGrpCfgPres = true; macCellGroup = ((MAC_CellGroupConfig_t *)(cellGrp->mac_CellGroupConfig)); + +#ifdef NR_DRX + if(macCellGroup->drx_ConfigRrc) + { + if(storedMacUeCfg) + { + if(!storedMacUeCfg->macCellGrpCfgPres) + { + extractDrxConfiguration(macCellGroup->drx_ConfigRrc, &macUeCfg->macCellGrpCfg.drxCfg,NULL); + } + else + { + extractDrxConfiguration(macCellGroup->drx_ConfigRrc, &macUeCfg->macCellGrpCfg.drxCfg, &storedMacUeCfg->macCellGrpCfg.drxCfg); + } + } + else + { + extractDrxConfiguration(macCellGroup->drx_ConfigRrc, &macUeCfg->macCellGrpCfg.drxCfg,NULL); + } + } +#endif + if(macCellGroup->schedulingRequestConfig) { extractSchReqReConfig(macCellGroup->schedulingRequestConfig, &macUeCfg->macCellGrpCfg.schReqCfg); @@ -11920,14 +13484,16 @@ void freeAperDecodeF1UeContextSetupReq(UEContextSetupRequest_t *ueSetReq) uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg) { int8_t ueIdx = -1; - uint8_t ret=0, ieIdx=0, ieExtIdx = 0, cellIdx=0, servCellIdx = 0; + uint8_t ret=0, ieIdx=0, ieExtIdx = 0, servCellIdx = 0; bool ueCbFound = false, hoInProgress = false; - uint16_t nrCellId = 0; + 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; + DRXCycle_t *drxCycle; ret = ROK; @@ -11955,7 +13521,7 @@ uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg) GET_CELL_IDX(nrCellId, cellIdx); if(!duCb.actvCellLst[cellIdx]) { - DU_LOG("\nERROR --> F1AP : Cell Id [%d] not found", nrCellId); + DU_LOG("\nERROR --> F1AP : Cell Id [%lu] not found", nrCellId); ret = RFAILED; } break; @@ -12010,7 +13576,7 @@ uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg) gnbDuUeF1apId = ueIdx +1; else { - DU_LOG("\nERROR --> F1AP : No free UE IDX found in UE bit map of cell Id [%d]", nrCellId); + DU_LOG("\nERROR --> F1AP : No free UE IDX found in UE bit map of cell Id [%lu]", nrCellId); ret = RFAILED; break; } @@ -12018,6 +13584,7 @@ uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg) duUeCb->f1UeDb = NULL; duUeCb->gnbCuUeF1apId = gnbCuUeF1apId; duUeCb->gnbDuUeF1apId = gnbDuUeF1apId; + GET_CRNTI(duUeCb->crnti, duUeCb->gnbDuUeF1apId); duUeCb->ueState = UE_HANDIN_IN_PROGRESS; } @@ -12063,12 +13630,25 @@ uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg) break; } - case ProtocolIE_ID_id_SCell_ToBeSetup_List: +#ifdef NR_DRX + case ProtocolIE_ID_id_DRXCycle: { - DU_LOG("\nINFO --> DU_APP: Received SCell_ToBeSetup_List but Not processing the list"); + duUeCb->f1UeDb->duUeCfg.drxCyclePres = true; + drxCycle = &ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.DRXCycle; + duUeCb->f1UeDb->duUeCfg.drxCycle.drxLongCycleLength = convertLongDrxCycleLengthEnumToValue(drxCycle->longDRXCycleLength); + if(drxCycle->shortDRXCycleLength) + { + duUeCb->f1UeDb->duUeCfg.drxCycle.shortDrxCyclePres = true; + duUeCb->f1UeDb->duUeCfg.drxCycle.shortDrxCycle.drxShortCycle = \ + convertShortDrxCycleLengthEnumToValue(*(drxCycle->shortDRXCycleLength)); + } + if(drxCycle->shortDRXCycleTimer) + duUeCb->f1UeDb->duUeCfg.drxCycle.shortDrxCycle.drxShortCycleTimer = *(drxCycle->shortDRXCycleTimer); + break; } +#endif case ProtocolIE_ID_id_SRBs_ToBeSetup_List: { if(extractSrbListToSetup(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.SRBs_ToBeSetup_List,\ @@ -12093,7 +13673,6 @@ uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg) } break; } - case ProtocolIE_ID_id_RRCContainer: { /* Filling Dl RRC Msg Info */ @@ -12115,13 +13694,16 @@ uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg) 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; } @@ -12342,10 +13924,12 @@ uint8_t EncodeUeCntxtDuToCuInfo(CellGroupConfig_t *duToCuCellGrp, CellGroupConfi else { DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for UeCntxtDuToCuInfo\n"); +#ifdef DEBUG_ASN_PRINT for(int i=0; i< encBufSize; i++) { printf("%x",encBuf[i]); } +#endif } duToCuCellGrp->size = encBufSize; DU_ALLOC(duToCuCellGrp->buf, duToCuCellGrp->size); @@ -12566,7 +14150,7 @@ uint8_t BuildAndSendUeContextSetupRsp(uint8_t cellId,uint8_t ueId) ueSetRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse; - elementCnt = 4; + elementCnt = 5; ueSetRsp->protocolIEs.list.count = elementCnt; ueSetRsp->protocolIEs.list.size = \ elementCnt * sizeof(UEContextSetupResponse_t *); @@ -12626,6 +14210,14 @@ uint8_t BuildAndSendUeContextSetupRsp(uint8_t cellId,uint8_t ueId) 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 = \ @@ -12666,10 +14258,12 @@ uint8_t BuildAndSendUeContextSetupRsp(uint8_t cellId,uint8_t ueId) else { DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for UE Context Setup Response\n"); +#ifdef DEBUG_ASN_PRINT for(int i=0; i< encBufSize; i++) { printf("%x",encBuf[i]); } +#endif } /* Sending msg */ @@ -12710,12 +14304,20 @@ uint8_t BuildAndSendUeCtxtRsp(uint8_t cellId, uint8_t ueId) { case UE_CTXT_SETUP: { - BuildAndSendUeContextSetupRsp(cellId,ueId); + if((BuildAndSendUeContextSetupRsp(cellId,ueId)) != ROK) + { + DU_LOG("\nERROR --> F1AP : Failed at BuildAndSendUeContextSetupRsp()"); + return RFAILED; + } break; } case UE_CTXT_MOD: { - BuildAndSendUeContextModRsp(&duCb.actvCellLst[cellIdx]->ueCb[ueId-1]); + if((BuildAndSendUeContextModRsp(&duCb.actvCellLst[cellIdx]->ueCb[ueId-1])) != ROK) + { + DU_LOG("\nERROR --> F1AP : Failed at BuildAndSendUeContextModRsp"); + return RFAILED; + } break; } default: @@ -12873,10 +14475,12 @@ uint8_t BuildAndSendF1ResetReq() else { DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1Reset\n"); +#ifdef DEBUG_ASN_PRINT for(idx=0; idx< encBufSize; idx++) { printf("%x",encBuf[idx]); } +#endif } if(sendF1APMsg() != ROK) @@ -13026,10 +14630,12 @@ uint8_t BuildAndSendF1ResetAck() else { DU_LOG("\nDUBUG --> F1AP : Created APER encoded buffer for F1ResetAck\n"); +#ifdef DEBUG_ASN_PRINT for(int i=0; i< encBufSize; i++) { printf("%x",encBuf[i]); } +#endif } /* Sending msg */ if(sendF1APMsg() != ROK) @@ -13292,10 +14898,12 @@ uint8_t BuildAndSendRrcDeliveryReport(uint32_t gnbCuUeF1apId, \ else { DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRC Delivery Msg \n"); +#ifdef DEBUG_ASN_PRINT for(idx=0; idx< encBufSize; idx++) { printf("%x",encBuf[idx]); } +#endif } /* Sending msg */ @@ -13333,7 +14941,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 DU_APP : duProcGnbDuCfgUpdAckMsg(): Failed to send cell delete\ - request for cellId[%d]", cellId); + request for cellId[%lu]", cellId); } } else @@ -13675,7 +15285,7 @@ uint8_t duProcGnbDuCfgUpdAckMsg(uint8_t transId) if(ret == RFAILED) { DU_LOG("\nERROR --> DU_APP : duProcGnbDuCfgUpdAckMsg(): Failed to build and send UE delete\ - request for cellId[%d]", cellId); + request for cellId[%lu]", cellId); } ueIdx++; totalActiveUe--; @@ -13684,7 +15294,7 @@ uint8_t duProcGnbDuCfgUpdAckMsg(uint8_t transId) } else { - DU_LOG("\nERROR --> DU_APP : duProcGnbDuCfgUpdAckMsg(): CellId [%d] not found", cellId); + DU_LOG("\nERROR --> DU_APP : duProcGnbDuCfgUpdAckMsg(): CellId [%lu] not found", cellId); ret = RFAILED; } break; @@ -14160,7 +15770,7 @@ uint8_t BuildAndSendUeContextModRsp(DuUeCb *ueCb) DU_LOG("\nINFO --> F1AP : Building UE context modification response\n"); - while(1) + while(true) { DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t)); if(f1apMsg == NULLP) @@ -14239,32 +15849,29 @@ uint8_t BuildAndSendUeContextModRsp(DuUeCb *ueCb) BuildCellGroupConfigRrc(ueCb, &ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCInformation.cellGroupConfig); } - if((ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY) || (ueCb->f1UeDb->actionType == UE_CTXT_MOD)) + if((ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY) || ((ueCb->f1UeDb->actionType == UE_CTXT_MOD) && (ueCb->f1UeDb->duUeCfg.numDrbSetupMod))) { - if(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) { - 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++) { - for(tnlIdx = 0; tnlIdx < duCb.numTeId; tnlIdx++) + if(duCb.upTnlCfg[tnlIdx]->ueId == ueCb->gnbDuUeF1apId) { - if(duCb.upTnlCfg[tnlIdx]->ueId == ueCb->gnbDuUeF1apId) - { - memcpy(&ueCb->f1UeDb->duUeCfg.upTnlInfo[ueCb->f1UeDb->duUeCfg.numDrbSetupMod++], duCb.upTnlCfg[tnlIdx], sizeof(UpTnlCfg)); - } + 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 "); - break; - } + } + 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 "); + break; } } @@ -14313,10 +15920,12 @@ uint8_t BuildAndSendUeContextModRsp(DuUeCb *ueCb) else { DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for UE Context Modification Response\n"); +#ifdef DEBUG_ASN_PRINT for(int i=0; i< encBufSize; i++) { printf("%x",encBuf[i]); } +#endif } /* Sending msg */ @@ -14932,10 +16541,12 @@ uint8_t BuildAndSendUeContextReleaseReq(uint16_t cellId, uint8_t ueId) else { DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for UEContextReleaseRequest\n"); +#ifdef DEBUG_ASN_PRINT for(ieIdx=0; ieIdx< encBufSize; ieIdx++) { printf("%x",encBuf[ieIdx]); } +#endif } /* Sending msg */ @@ -15096,10 +16707,12 @@ uint8_t BuildAndSendUeContextReleaseComplete(uint16_t cellId, uint32_t gnbCuUeF1 else { DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for UEContextReleaseComplete\n"); +#ifdef DEBUG_ASN_PRINT for(ieIdx=0; ieIdx< encBufSize; ieIdx++) { printf("%x",encBuf[ieIdx]); } +#endif } /* Sending msg */ @@ -15419,14 +17032,13 @@ void freeAperDecodePagingMsg(Paging_t *paging) uint8_t procPagingMsg(F1AP_PDU_t *f1apMsg) { uint8_t ieIdx = 0, cellListIdx = 0; - uint16_t cellId = 0, cellIdx = 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) { @@ -15448,7 +17060,7 @@ uint8_t procPagingMsg(F1AP_PDU_t *f1apMsg) case ProtocolIE_ID_id_UEIdentityIndexValue: { bitStringToInt(&paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10,\ - &tmpPagingParam->ueId); + &tmpPagingParam->pagUeId); break; } @@ -15504,19 +17116,9 @@ uint8_t procPagingMsg(F1AP_PDU_t *f1apMsg) pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellListIdx]; pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item; bitStringToInt(&pagingCellItem->nRCGI.nRCellIdentity, &cellId); - GET_CELL_IDX(cellId, cellIdx); - if(duCb.actvCellLst[cellIdx]) - { - /* fill Ue Paging information*/ - if(FillPagingInfoInCellCb(duCb.actvCellLst[cellIdx], tmpPagingParam)!= ROK) - { - DU_LOG("\nERROR --> DU APP : CellCb:%d not present to fill UE Paging Information",cellIdx); - continue; - } - } - else + if(processPagingMsg(cellId, tmpPagingParam) != ROK) { - DU_LOG("\nERROR --> F1AP : CellId:%d Not in Activelist",cellId); + DU_LOG("\nERROR --> DU APP : Paging Processing Failed at CellId:%lu",cellId); continue; } } @@ -15584,11 +17186,13 @@ void F1APMsgHdlr(Buffer *mBuf) return; } +#ifdef DEBUG_ASN_PRINT printf("\nDEBUG --> F1AP : Received flat buffer to be decoded : "); for(i=0; i< recvBufLen; i++) { printf("%x",recvBuf[i]); } +#endif /* Decoding flat buffer into F1AP messsage */ f1apMsg = &f1apasnmsg;