- return true;
- }
- }
- /*
- * Number of symbols in case of retransmisson should be same as it was in
- * original transmisson. Symbol availablity checks need to be added.
- */
- return false;
-}
-
-/*******************************************************************
- *
- * @brief
- *
- * @details
- *
- * Function : schFillBoGrantDlSchedInfo
- *
- * Functionality:
-
- *
- * @params[in] SchCellCb *cell, SlotTimingInfo currTime, uint8_t ueId
- * @params[in] bool isRetx, SchDlHqProcCb **hqP
- * @return ROK - success
- * RFAILED - failure
- *
- * ****************************************************************/
-bool schFillBoGrantDlSchedInfo(SchCellCb *cell, SlotTimingInfo currTime, uint8_t ueId, bool isRetx, SchDlHqProcCb **hqP)
-{
- uint8_t lcIdx = 0;
- uint8_t pdschNumSymbols = 0, pdschStartSymbol = 0;
- uint16_t startPrb = 0, maxFreePRB = 0;
- uint16_t crnti = 0, mcsIdx = 0;
- uint32_t accumalatedSize = 0;
- SchUeCb *ueCb = NULLP;
- CmLListCp *lcLL = NULLP;
- DlMsgAlloc *dciSlotAlloc, *dlMsgAlloc;
- SlotTimingInfo pdcchTime, pdschTime, pucchTime;
- uint16_t rsvdDedicatedPRB = 0;
-
- /* TX_PAYLOAD_HDR_LEN: Overhead which is to be Added once for any UE while estimating Accumulated TB Size
- * Following flag added to keep the record whether TX_PAYLOAD_HDR_LEN is added to the first Node getting allocated.
- * If both Dedicated and Default LC lists are present then First LC in Dedicated List will include this overhead
- * else if only Default list is present then first node in this List will add this overhead len*/
- bool isTxPayloadLenAdded = FALSE;
- GET_CRNTI(crnti,ueId);
- ueCb = &cell->ueCb[ueId-1];
-
- if (isRetx == FALSE)
- {
- if(schDlGetAvlHqProcess(cell, ueCb, hqP) != ROK)
- {
- return false;
- }
- }
-
- if(findValidK0K1Value(cell, currTime, ueId, ueCb->ueCfg.spCellCfg.servCellCfg.initDlBwp.k0K1TblPrsnt,\
- &pdschStartSymbol, &pdschNumSymbols, &pdcchTime, &pdschTime, &pucchTime, isRetx, *hqP) != true )
- {
- /* If a valid combination of slots to scheduled PDCCH, PDSCH and PUCCH is
- * not found, do not perform resource allocation. Return from here. */
- return false;
- }
-
- /* allocate PDCCH and PDSCH resources for the ue */
- if(cell->schDlSlotInfo[pdcchTime.slot]->dlMsgAlloc[ueId-1] == NULL)
- {
-
- SCH_ALLOC(dciSlotAlloc, sizeof(DlMsgAlloc));
- if(!dciSlotAlloc)
- {
- DU_LOG("\nERROR --> SCH : Memory Allocation failed for ded DL msg alloc");
- return false;
- }
- cell->schDlSlotInfo[pdcchTime.slot]->dlMsgAlloc[ueId -1] = dciSlotAlloc;
- memset(dciSlotAlloc, 0, sizeof(DlMsgAlloc));
- dciSlotAlloc->crnti = crnti;
- }
- else
- {
- dciSlotAlloc = cell->schDlSlotInfo[pdcchTime.slot]->dlMsgAlloc[ueId -1];
- }
- /* Dl ded Msg info is copied, this was earlier filled in macSchDlRlcBoInfo */
- fillDlMsgInfo(&dciSlotAlloc->dlMsgSchedInfo[dciSlotAlloc->numSchedInfo].dlMsgInfo, dciSlotAlloc->crnti, isRetx, *hqP);
- dciSlotAlloc->dlMsgSchedInfo[dciSlotAlloc->numSchedInfo].isRetx = isRetx;
-
-
- if (isRetx == FALSE)
- {
- /*Re-Initalization per UE*/
- /* scheduled LC data fill */
- dciSlotAlloc->dlMsgSchedInfo[dciSlotAlloc->numSchedInfo].numLc = 0;
- isTxPayloadLenAdded = FALSE; /*Re-initlaize the flag for every UE*/
- accumalatedSize = 0;
-
- for(lcIdx = 0; lcIdx < MAX_NUM_LC; lcIdx++)
- {
- if(ueCb->dlInfo.dlLcCtxt[lcIdx].bo)
- {
- /*Check the LC is Dedicated or default and accordingly LCList will
- * be used*/
- if(ueCb->dlInfo.dlLcCtxt[lcIdx].isDedicated)
- {
- lcLL = &((*hqP)->dlLcPrbEst.dedLcList);
- rsvdDedicatedPRB = ueCb->dlInfo.dlLcCtxt[lcIdx].rsvdDedicatedPRB;
- }
- else
- {
- lcLL = &((*hqP)->dlLcPrbEst.defLcList);
- }
-
- /*[Step2]: Update the reqPRB and Payloadsize for this LC in the appropriate List*/
- if(updateLcListReqPRB(lcLL, ueCb->dlInfo.dlLcCtxt[lcIdx].lcId,\
- (ueCb->dlInfo.dlLcCtxt[lcIdx].bo + MAC_HDR_SIZE)) != ROK)
- {
- DU_LOG("\nERROR --> SCH : Updation in LC List Failed");
- /* Free the dl ded msg info allocated in macSchDlRlcBoInfo */
- if(dciSlotAlloc->numSchedInfo == 0)
- {
- SCH_FREE(dciSlotAlloc, sizeof(DlMsgAlloc));
- cell->schDlSlotInfo[pdcchTime.slot]->dlMsgAlloc[ueId -1] = NULL;
- }
- else
- memset(&dciSlotAlloc->dlMsgSchedInfo[dciSlotAlloc->numSchedInfo], 0, sizeof(DlMsgSchInfo));
- return false;
- }
- }
- ueCb->dlInfo.dlLcCtxt[lcIdx].bo = 0;
- }//End of for loop
- if (((*hqP)->dlLcPrbEst.defLcList.count == 0) && ( ((*hqP)->dlLcPrbEst.dedLcList.count == 0)))
- {
- DU_LOG("\nDEBUG --> SCH : No pending BO for any LC id\n");
- UNSET_ONE_BIT(ueId, cell->boIndBitMap);
-
- /* Free the dl ded msg info allocated in macSchDlRlcBoInfo */
- if(dciSlotAlloc->numSchedInfo == 0)
- {
- SCH_FREE(dciSlotAlloc, sizeof(DlMsgAlloc));
- cell->schDlSlotInfo[pdcchTime.slot]->dlMsgAlloc[ueId -1] = NULL;
- }
- else
- memset(&dciSlotAlloc->dlMsgSchedInfo[dciSlotAlloc->numSchedInfo], 0, sizeof(DlMsgSchInfo));
-
- /*TRUE because this UE has nothing to be scheduled*/
- return true;
- }
- }
-
- /*[Step3]: Calculate Best FREE BLOCK with MAX PRB count*/
- maxFreePRB = searchLargestFreeBlock(cell, pdschTime, &startPrb, DIR_DL);
-
- /*[Step4]: Estimation of PRB and BO which can be allocated to each LC in
- * the list based on RRM policy*/
-
- /*Either this UE contains no reservedPRB pool fir dedicated S-NSSAI or
- * Num of Free PRB available is not enough to reserve Dedicated PRBs*/
- if(isRetx == FALSE)
- {
- if(maxFreePRB != 0)
- {
- mcsIdx = ueCb->ueCfg.dlModInfo.mcsIndex;
-
- if(((*hqP)->dlLcPrbEst.dedLcList.count == NULLP)
- || ((maxFreePRB < rsvdDedicatedPRB)))
- {
- (*hqP)->dlLcPrbEst.sharedNumPrb = maxFreePRB;
- DU_LOG("\nDEBUG --> SCH : DL Only Default Slice is scheduled, sharedPRB Count:%d",\
- (*hqP)->dlLcPrbEst.sharedNumPrb);
-
- /*PRB Alloc for Default LCs*/
- prbAllocUsingRRMPolicy(&((*hqP)->dlLcPrbEst.defLcList), FALSE, mcsIdx, pdschNumSymbols,\
- &((*hqP)->dlLcPrbEst.sharedNumPrb), NULLP, &isTxPayloadLenAdded, NULLP);
- }
- else