cell->firstSsbTransmitted = false;
cell->firstSib1Transmitted = false;
fillSsbStartSymb(cell);
+ cmLListInit(&cell->ueToBeScheduled);
schCb[inst].cells[inst] = cell;
DU_LOG("\nINFO --> SCH : Cell init completed for cellId:%d", cell->cellId);
uint8_t MacSchDlRlcBoInfo(Pst *pst, DlRlcBoInfo *dlBoInfo)
{
uint8_t lcId = 0;
- uint16_t ueIdx = 0;
- uint16_t slot = 0;
-#ifdef NR_TDD
- uint16_t slotIdx = 0;
-#endif
+ uint16_t ueId = 0;
+ bool isLcIdValid = false;
SchUeCb *ueCb = NULLP;
SchCellCb *cell = NULLP;
- SchDlSlotInfo *schDlSlotInfo = NULLP;
Inst inst = pst->dstInst-SCH_INST_START;
+ CmLListCp *lcLL = NULLP;
#ifdef CALL_FLOW_DEBUG_LOG
DU_LOG("\nCall Flow: ENTMAC -> ENTSCH : EVENT_DL_RLC_BO_INFO_TO_SCH\n");
#endif
- DU_LOG("\nDEBUG --> SCH : Received RLC BO Status indication");
+ DU_LOG("\nDEBUG --> SCH : Received RLC BO Status indication LCId [%d] BO [%d]", dlBoInfo->lcId, dlBoInfo->dataVolume);
cell = schCb[inst].cells[inst];
if(cell == NULLP)
return RFAILED;
}
- GET_UE_IDX(dlBoInfo->crnti, ueIdx);
- ueCb = &cell->ueCb[ueIdx-1];
+ GET_UE_IDX(dlBoInfo->crnti, ueId);
+ ueCb = &cell->ueCb[ueId-1];
lcId = dlBoInfo->lcId;
+ CHECK_LCID(lcId, isLcIdValid);
+ if(isLcIdValid == FALSE)
+ {
+ DU_LOG("ERROR --> SCH: LCID:%d is not valid", lcId);
+ return RFAILED;
+ }
- if(lcId == SRB1_LCID || lcId == SRB2_LCID || lcId == SRB3_LCID || \
- (lcId >= MIN_DRB_LCID && lcId <= MAX_DRB_LCID))
+ /*Expected when theres a case of Retransmission Failure or Resetablishment
+ *By Zero BO, the RLC is informing that previous data can be cleared out
+ *Thus clearing out the LC from the Lc priority list*/
+ if(dlBoInfo->dataVolume == 0)
{
- SET_ONE_BIT(ueIdx, cell->boIndBitMap);
- if(ueCb->dlInfo.dlLcCtxt[lcId].lcId == lcId)
+ /*Check the LC is Dedicated or default and accordingly LCList will
+ * be used*/
+ if(ueCb->dlInfo.dlLcCtxt[lcId].isDedicated)
{
- ueCb->dlInfo.dlLcCtxt[lcId].bo = dlBoInfo->dataVolume;
+ lcLL = &(ueCb->dlLcPrbEst.dedLcInfo->dedLcList);
}
else
{
- DU_LOG("ERROR --> SCH: LCID:%d is not configured in SCH Cb",lcId);
- return RFAILED;
+ lcLL = &(ueCb->dlLcPrbEst.defLcList);
}
+ handleLcLList(lcLL, lcId, DELETE);
+ return ROK;
}
- else if(lcId != SRB0_LCID)
+
+ if(lcId == SRB0_LCID)
{
- DU_LOG("\nERROR --> SCH : Invalid LC Id %d in MacSchDlRlcBoInfo", lcId);
- return RFAILED;
+ cell->raCb[ueId -1].msg4recvd = true;
+ cell->raCb[ueId -1].dlMsgPduLen = dlBoInfo->dataVolume;
+
}
-
- slot = (cell->slotInfo.slot + SCHED_DELTA + PHY_DELTA_DL + BO_DELTA) % cell->numSlots;
-#ifdef NR_TDD
- while(schGetSlotSymbFrmt(cell->slotFrmtBitMap, slot) != DL_SLOT)
+ else
{
- slot = (slot + 1)%cell->numSlots;
- slotIdx++;
- if(slotIdx==cell->numSlots)
+ /* TODO : These part of changes will be corrected during DL scheduling as
+ * per K0 - K1 -K2 */
+ SET_ONE_BIT(ueId, cell->boIndBitMap);
+ if(ueCb->dlInfo.dlLcCtxt[lcId].lcId == lcId)
+ {
+ ueCb->dlInfo.dlLcCtxt[lcId].bo = dlBoInfo->dataVolume;
+ }
+ else
{
- DU_LOG("\nERROR --> SCH : No DL Slot available");
+ DU_LOG("ERROR --> SCH: LCID:%d is not configured in SCH Cb",lcId);
return RFAILED;
}
}
-#endif
-
- schDlSlotInfo = cell->schDlSlotInfo[slot];
-
- if(schDlSlotInfo == NULLP)
- {
- DU_LOG("\nERROR --> SCH : MacSchDlRlcBoInfo(): schDlSlotInfo does not exists");
- return RFAILED;
- }
- SCH_ALLOC(schDlSlotInfo->dlMsgInfo, sizeof(DlMsgInfo));
- if(schDlSlotInfo->dlMsgInfo == NULLP)
- {
- DU_LOG("\nERROR --> SCH : Memory allocation failed for dlMsgInfo");
- schDlSlotInfo = NULL;
- return RFAILED;
- }
-
- schDlSlotInfo->dlMsgInfo->crnti = dlBoInfo->crnti;
- schDlSlotInfo->dlMsgInfo->ndi = 1;
- schDlSlotInfo->dlMsgInfo->harqProcNum = 0;
- schDlSlotInfo->dlMsgInfo->dlAssignIdx = 0;
- schDlSlotInfo->dlMsgInfo->pucchTpc = 0;
- schDlSlotInfo->dlMsgInfo->pucchResInd = 0;
- schDlSlotInfo->dlMsgInfo->harqFeedbackInd = 0;
- schDlSlotInfo->dlMsgInfo->dciFormatId = 1;
- if(lcId == SRB0_LCID)
- {
- schDlSlotInfo->dlMsgInfo->isMsg4Pdu = true;
- schDlSlotInfo->dlMsgInfo->dlMsgPduLen = dlBoInfo->dataVolume;
- }
+
+ /* Adding UE Id to list of pending UEs to be scheduled */
+ addUeToBeScheduled(cell, ueId);
return ROK;
}
Inst schInst = pst->dstInst-SCH_INST_START;
SchCellCb *cellCb = NULLP;
SchUeCb *ueCb = NULLP;
- uint8_t lcgIdx;
+ uint8_t lcgIdx = 0;
#ifdef CALL_FLOW_DEBUG_LOG
DU_LOG("\nCall Flow: ENTMAC -> ENTSCH : EVENT_SHORT_BSR\n");
cellCb = schCb[schInst].cells[schInst];
ueCb = schGetUeCb(cellCb, bsrInd->crnti);
+ ueCb->bsrRcvd = true;
/* store dataVolume per lcg in uecb */
for(lcgIdx = 0; lcgIdx < bsrInd->numLcg; lcgIdx++)
{
ueCb->bsrInfo[lcgIdx].priority = 1; //TODO: determining LCG priority?
ueCb->bsrInfo[lcgIdx].dataVol = bsrInd->dataVolInfo[lcgIdx].dataVol;
}
+
+ /* Adding UE Id to list of pending UEs to be scheduled */
+ addUeToBeScheduled(cellCb, ueCb->ueIdx);
return ROK;
}
if(uciInd->numSrBits)
{
ueCb->srRcvd = true;
+
+ /* Adding UE Id to list of pending UEs to be scheduled */
+ addUeToBeScheduled(cellCb, ueCb->ueIdx);
}
return ROK;
}
return ROK;
}
+
+/*******************************************************************
+ *
+ * @brief Add UE to ueToBeScheduled List
+ *
+ * @details
+ *
+ * Function : addUeToBeScheduled
+ *
+ * Functionality:
+ * Search if UE entry present in the list
+ * If yes, return.
+ * If no, add UE to the list
+ *
+ * @params[in] Cell control block
+ * Ue Idx to be added
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t addUeToBeScheduled(SchCellCb *cell, uint8_t ueIdToAdd)
+{
+ uint8_t *ueId;
+ CmLList *node;
+
+ /* Search if UE entry is already present in ueToBeScheduled list.
+ * If yes, another entry for same UE not needed. Hence, return */
+ node = cell->ueToBeScheduled.first;
+ while(node)
+ {
+ ueId = (uint8_t *)node->node;
+ if(*ueId == ueIdToAdd)
+ return ROK;
+ node = node->next;
+ }
+
+ /* If UE entry not present already, add UE to the end of ueToBeScheduled list */
+ SCH_ALLOC(ueId, sizeof(uint8_t));
+ if(!ueId)
+ {
+ DU_LOG("\nERROR --> SCH : Memory allocation failure in addUeToBeScheduled");
+ return RFAILED;
+ }
+ *ueId = ueIdToAdd;
+ if(addNodeToLList(&cell->ueToBeScheduled, ueId, NULLP) != ROK)
+ {
+ DU_LOG("\nERROR --> SCH : Failed to add UeIdx to cell->ueToBeScheduled list");
+ return RFAILED;
+ }
+ return ROK;
+}
/*******************************************************************************
*