X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2F5gnrsch%2Fsch.c;h=090d3896df6d055ceaa8ae5eed315231ebb08627;hb=8e6123e23f6d831b1fe972f8229e9594a2e92237;hp=a98832ac3a095757843b87453f9d89cfe0113262;hpb=53d1aa768db96eca4c320f5e46da800c08c82006;p=o-du%2Fl2.git diff --git a/src/5gnrsch/sch.c b/src/5gnrsch/sch.c index a98832ac3..090d3896d 100644 --- a/src/5gnrsch/sch.c +++ b/src/5gnrsch/sch.c @@ -664,6 +664,7 @@ uint8_t schInitCellCb(Inst inst, SchCellCfg *schCellCfg) 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); @@ -926,21 +927,18 @@ uint8_t SchHdlCellCfgReq(Pst *pst, SchCellCfg *schCellCfg) 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) @@ -949,72 +947,59 @@ uint8_t MacSchDlRlcBoInfo(Pst *pst, DlRlcBoInfo *dlBoInfo) 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; } @@ -1362,6 +1347,58 @@ uint8_t allocatePrbUl(SchCellCb *cell, SlotTimingInfo slotTime, \ 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; +} /******************************************************************************* *