X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2F5gnrsch%2Fsch.c;h=090d3896df6d055ceaa8ae5eed315231ebb08627;hb=8e6123e23f6d831b1fe972f8229e9594a2e92237;hp=8fd6a871da1e62307c5041dce320840be0f0b22f;hpb=a733e46886692ec1525a60243fcfe4465da6457b;p=o-du%2Fl2.git diff --git a/src/5gnrsch/sch.c b/src/5gnrsch/sch.c index 8fd6a871d..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,22 +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 - DlMsgInfo dlMsgInfo; + 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) @@ -950,81 +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; - - memset(&dlMsgInfo, 0, sizeof(DlMsgInfo)); - dlMsgInfo.crnti = dlBoInfo->crnti; - dlMsgInfo.ndi = 1; - dlMsgInfo.harqProcNum = 0; - dlMsgInfo.dlAssignIdx = 0; - dlMsgInfo.pucchTpc = 0; - dlMsgInfo.pucchResInd = 0; - dlMsgInfo.harqFeedbackInd = 0; - dlMsgInfo.dciFormatId = 1; - - if(lcId == SRB0_LCID) + CHECK_LCID(lcId, isLcIdValid); + if(isLcIdValid == FALSE) { - cell->raCb[ueIdx -1].msg4recvd = true; - dlMsgInfo.dlMsgPduLen = dlBoInfo->dataVolume; - cell->raCb[ueIdx -1].dlMsgInfo = dlMsgInfo; + DU_LOG("ERROR --> SCH: LCID:%d is not valid", lcId); + return RFAILED; } - else + + /*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) { - /* TODO : These part of changes will be corrected during DL scheduling as - * per K0 - K1 -K2 */ - if(lcId == SRB1_LCID || lcId == SRB2_LCID || lcId == SRB3_LCID || \ - (lcId >= MIN_DRB_LCID && lcId <= MAX_DRB_LCID)) + /*Check the LC is Dedicated or default and accordingly LCList will + * be used*/ + if(ueCb->dlInfo.dlLcCtxt[lcId].isDedicated) { - SET_ONE_BIT(ueIdx, cell->boIndBitMap); - if(ueCb->dlInfo.dlLcCtxt[lcId].lcId == lcId) - { - ueCb->dlInfo.dlLcCtxt[lcId].bo = dlBoInfo->dataVolume; - } - else - { - DU_LOG("ERROR --> SCH: LCID:%d is not configured in SCH Cb",lcId); - return RFAILED; - } + lcLL = &(ueCb->dlLcPrbEst.dedLcInfo->dedLcList); } - else if(lcId != SRB0_LCID) + else { - DU_LOG("\nERROR --> SCH : Invalid LC Id %d in MacSchDlRlcBoInfo", lcId); - return RFAILED; + lcLL = &(ueCb->dlLcPrbEst.defLcList); } + handleLcLList(lcLL, lcId, DELETE); + return ROK; + } - slot = (cell->slotInfo.slot + SCHED_DELTA + PHY_DELTA_DL + BO_DELTA) % cell->numSlots; -#ifdef NR_TDD - while(schGetSlotSymbFrmt(cell->slotFrmtBitMap, slot) != DL_SLOT) + if(lcId == SRB0_LCID) + { + cell->raCb[ueId -1].msg4recvd = true; + cell->raCb[ueId -1].dlMsgPduLen = dlBoInfo->dataVolume; + + } + else + { + /* 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) { - slot = (slot + 1)%cell->numSlots; - slotIdx++; - if(slotIdx==cell->numSlots) - { - DU_LOG("\nERROR --> SCH : No DL Slot available"); - return RFAILED; - } + ueCb->dlInfo.dlLcCtxt[lcId].bo = dlBoInfo->dataVolume; } -#endif - - schDlSlotInfo = cell->schDlSlotInfo[slot]; - if(schDlSlotInfo == NULLP) + else { - DU_LOG("\nERROR --> SCH : MacSchDlRlcBoInfo(): schDlSlotInfo does not exists"); + DU_LOG("ERROR --> SCH: LCID:%d is not configured in SCH Cb",lcId); return RFAILED; } - - SCH_ALLOC(schDlSlotInfo->dlMsgAlloc, sizeof(DlMsgAlloc)); - if(schDlSlotInfo->dlMsgAlloc == NULLP) - { - DU_LOG("\nERROR --> SCH : Memory allocation failed for dlMsgInfo"); - schDlSlotInfo = NULL; - return RFAILED; - } - - schDlSlotInfo->dlMsgAlloc->dlMsgInfo = dlMsgInfo; } + + /* Adding UE Id to list of pending UEs to be scheduled */ + addUeToBeScheduled(cell, ueId); return ROK; } @@ -1372,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; +} /******************************************************************************* *