X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2F5gnrsch%2Fsch_ue_mgr.c;h=907ac340dd74ab2d79b6c1b065c62d111d0505bf;hb=e96cb439cd4a7a6f55e3fab7caed978e38bd62b4;hp=0923f9558b780c331c603d0f9742fcb26254f66a;hpb=c98e69a3cfa10b1b47dafe94062dc68817cae6a1;p=o-du%2Fl2.git diff --git a/src/5gnrsch/sch_ue_mgr.c b/src/5gnrsch/sch_ue_mgr.c index 0923f9558..907ac340d 100644 --- a/src/5gnrsch/sch_ue_mgr.c +++ b/src/5gnrsch/sch_ue_mgr.c @@ -27,40 +27,12 @@ #include "du_app_mac_inf.h" #include "mac_sch_interface.h" #include "sch.h" +#include "sch_tmr.h" #include "sch_utils.h" #ifdef NR_DRX #include "sch_drx.h" #endif -/* local defines */ -SchUeCfgRspFunc SchUeCfgRspOpts[] = -{ - packSchUeCfgRsp, /* LC */ - MacProcSchUeCfgRsp, /* TC */ - packSchUeCfgRsp /* LWLC */ -}; - -SchUeRecfgRspFunc SchUeRecfgRspOpts[] = -{ - packSchUeRecfgRsp, /* LC */ - MacProcSchUeRecfgRsp, /* TC */ - packSchUeRecfgRsp /* LWLC */ -}; - -SchUeDeleteRspFunc SchUeDeleteRspOpts[] = -{ - packSchUeDeleteRsp, /* LC */ - MacProcSchUeDeleteRsp, /* TC */ - packSchUeDeleteRsp /* LWLC */ -}; - -SchCellDeleteRspFunc SchCellDeleteRspOpts[]= -{ - packSchCellDeleteRsp, /* LC */ - MacProcSchCellDeleteRsp, /* TC */ - packSchCellDeleteRsp /* LWLC */ -}; - /******************************************************************* * * @brief Fill and send UE cfg response to MAC @@ -82,7 +54,6 @@ void SchSendUeCfgRspToMac(SchUeCfgReq *ueCfg, Inst inst,\ Pst rspPst; cfgRsp->cellId = ueCfg->cellId; - cfgRsp->ueId = ueCfg->ueId; cfgRsp->crnti = ueCfg->crnti; cfgRsp->rsp = result; @@ -91,7 +62,7 @@ void SchSendUeCfgRspToMac(SchUeCfgReq *ueCfg, Inst inst,\ FILL_PST_SCH_TO_MAC(rspPst, inst); rspPst.event = EVENT_UE_CONFIG_RSP_TO_MAC; DU_LOG("\nINFO --> SCH : Sending UE Config response to MAC"); - SchUeCfgRspOpts[rspPst.selector](&rspPst, cfgRsp); + MacMessageRouter(&rspPst, (void *)cfgRsp); } /******************************************************************* @@ -115,7 +86,6 @@ void SchSendUeRecfgRspToMac(SchUeRecfgReq *ueRecfgReq, Inst inst,\ Pst rspPst; reCfgRsp->cellId = ueRecfgReq->cellId; - reCfgRsp->ueId = ueRecfgReq->ueId; reCfgRsp->crnti = ueRecfgReq->crnti; reCfgRsp->rsp = result; @@ -124,7 +94,7 @@ void SchSendUeRecfgRspToMac(SchUeRecfgReq *ueRecfgReq, Inst inst,\ FILL_PST_SCH_TO_MAC(rspPst, inst); rspPst.event = EVENT_UE_RECONFIG_RSP_TO_MAC; DU_LOG("\nINFO --> SCH : Sending UE Reconfig response to MAC"); - SchUeRecfgRspOpts[rspPst.selector](&rspPst, reCfgRsp); + MacMessageRouter(&rspPst, (void *)reCfgRsp); } /******************************************************************* @@ -229,27 +199,27 @@ void fillSchUlLcCtxt(SchUlLcCtxt *ueCbLcCfg, SchLcCfg *lcCfg) uint8_t updateDedLcInfo(Inst inst, Snssai *snssai, uint16_t *rsvdDedicatedPRB, bool *isDedicated) { - uint8_t sliceCfgIdx =0; - SchSliceCfg sliceCfg = schCb[inst].sliceCfg; + CmLList *sliceCfg = schCb[inst].sliceCfg.first; + SchRrmPolicyOfSlice *rrmPolicyOfSlices; - if(sliceCfg.numOfSliceConfigured) + while(sliceCfg) { - for(sliceCfgIdx = 0; sliceCfgIdxnode; + if(rrmPolicyOfSlices && (memcmp(snssai, &(rrmPolicyOfSlices->snssai), sizeof(Snssai)) == 0)) { - if(memcmp(snssai, &(sliceCfg.listOfSlices[sliceCfgIdx]->snssai), sizeof(Snssai)) == 0) - { - /*Updating latest RrmPolicy*/ - *rsvdDedicatedPRB = \ - (uint16_t)(((sliceCfg.listOfSlices[sliceCfgIdx]->rrmPolicyRatioInfo.dedicatedRatio)*(MAX_NUM_RB))/100); - *isDedicated = TRUE; - DU_LOG("\nINFO --> SCH : Updated RRM policy, reservedPOOL:%d",*rsvdDedicatedPRB); - } - } - /*case: This LcCtxt is either a Default LC or this LC is part of someother RRM_MemberList*/ - if(*isDedicated != TRUE) - { - DU_LOG("\nINFO --> SCH : This SNSSAI is not a part of this RRMPolicy"); + /*Updating latest RrmPolicy*/ + *rsvdDedicatedPRB = \ + (uint16_t)(((rrmPolicyOfSlices->rrmPolicyRatioInfo.dedicatedRatio)*(MAX_NUM_RB))/100); + *isDedicated = TRUE; + DU_LOG("\nINFO --> SCH : Updated RRM policy, reservedPOOL:%d",*rsvdDedicatedPRB); + break; } + sliceCfg = sliceCfg->next; + } + /*case: This LcCtxt is either a Default LC or this LC is part of someother RRM_MemberList*/ + if(*isDedicated != TRUE) + { + DU_LOG("\nINFO --> SCH : This SNSSAI is not a part of this RRMPolicy"); } return ROK; } @@ -317,14 +287,13 @@ void fillSpCellInSchCb(SchSpCellRecfg *destSpCellCfg, SchSpCellCfg *srcSpCellCfg uint8_t fillSchUeCbFrmCfgReq(Inst inst, SchUeCb *ueCb, SchUeCfgReq *ueCfg) { uint8_t lcIdx, ueLcIdx, idx; - uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0}; SchPdschCfgCmn pdschCfg; SchPucchDlDataToUlAck *dlDataToUlAck; uint8_t retDL = ROK, retUL = ROK; bool isLcIdValid = FALSE; ueCb->ueCfg.cellId = ueCfg->cellId; - ueCb->ueCfg.ueId = ueCfg->ueId; + ueCb->ueCfg.ueId = ueCb->ueId; ueCb->ueCfg.crnti = ueCfg->crnti; if(ueCfg->macCellGrpCfgPres == true) { @@ -350,7 +319,7 @@ uint8_t fillSchUeCbFrmCfgReq(Inst inst, SchUeCb *ueCb, SchUeCfgReq *ueCfg) schInitDrxHarqCb(&ueCb->ulHqEnt.procs[idx].ulDrxHarqCb); } /* convert all the drx configuration recived in ms/subms into number of slots and store into the drxUeCb */ - schFillDrxUeCb(ueCb->cellCb->cellCfg.numerology, ueCfg->macCellGrpCfg.drxCfg, &ueCb->drxUeCb); + schFillDrxUeCb(ueCb->cellCb->numerology, ueCfg->macCellGrpCfg.drxCfg, &ueCb->drxUeCb); /* Calculate the onduration timer and short cycle timer (if shortcycle configuration is present) as soon as we * recived ueCfg request */ schAddUeInOndurationList(ueCb->cellCb, ueCb, 0); @@ -360,7 +329,7 @@ uint8_t fillSchUeCbFrmCfgReq(Inst inst, SchUeCb *ueCb, SchUeCfgReq *ueCfg) { /* convert all the drx configuration recived in ms/subms into number * of slots and store into the drxUeCb */ - schFillDrxUeCb(ueCb->cellCb->cellCfg.numerology, ueCfg->macCellGrpCfg.drxCfg, &ueCb->drxUeCb); + schFillDrxUeCb(ueCb->cellCb->numerology, ueCfg->macCellGrpCfg.drxCfg, &ueCb->drxUeCb); /* Recalculate/Restart timer based on their presence */ schDrxUeReCfgTimer(ueCb->cellCb, ueCb); @@ -392,26 +361,26 @@ uint8_t fillSchUeCbFrmCfgReq(Inst inst, SchUeCb *ueCb, SchUeCfgReq *ueCfg) } fillSpCellInSchCb(&ueCb->ueCfg.spCellCfg, &ueCfg->spCellCfg); - covertFreqDomRsrcMapToIAPIFormat(ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.pdcchCfg.cRSetToAddModList[0].freqDomainRsrc,\ - freqDomainResource); - memset(ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.pdcchCfg.cRSetToAddModList[0].freqDomainRsrc, 0, FREQ_DOM_RSRC_SIZE); - memcpy(ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.pdcchCfg.cRSetToAddModList[0].freqDomainRsrc, freqDomainResource, FREQ_DOM_RSRC_SIZE); - ueCb->ueCfg.spCellCfgPres = true; dlDataToUlAck = ueCfg->spCellCfg.servCellCfg.initUlBwp.pucchCfg.dlDataToUlAck; if(ueCb->cellCb) { if(dlDataToUlAck) { - BuildK0K1Table(ueCb->cellCb, &ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.k0K1InfoTbl, false, pdschCfg,\ + BuildK0K1Table(ueCb->cellCb, &ueCb->k0K1InfoTbl, false, pdschCfg,\ ueCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg, dlDataToUlAck->dlDataToUlAckListCount,\ dlDataToUlAck->dlDataToUlAckList); - ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.k0K1TblPrsnt = true; + } + else + { + BuildK0K1Table(ueCb->cellCb, &ueCb->k0K1InfoTbl, false, pdschCfg,\ + ueCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg, DEFAULT_UL_ACK_LIST_COUNT, defaultUlAckTbl); + } + ueCb->k0K1TblPrsnt = true; BuildK2InfoTable(ueCb->cellCb, ueCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg.timeDomRsrcAllocList,\ ueCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg.numTimeDomRsrcAlloc,\ - NULLP, &ueCb->ueCfg.spCellCfg.servCellRecfg.initUlBwp.k2InfoTbl); - ueCb->ueCfg.spCellCfg.servCellRecfg.initUlBwp.k2TblPrsnt = true; - } + NULLP, &ueCb->k2InfoTbl); + ueCb->k2TblPrsnt = true; } } @@ -482,7 +451,6 @@ uint8_t fillSchUeCbFrmCfgReq(Inst inst, SchUeCb *ueCb, SchUeCfgReq *ueCfg) uint8_t fillSchUeCbFrmRecfgReq(Inst inst, SchUeCb *ueCb, SchUeRecfgReq *ueRecfg) { uint8_t lcIdx, ueLcIdx, idx; - uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0}; SchPdschCfgCmn pdschCfg; SchPucchDlDataToUlAck *dlDataToUlAck; uint8_t retDL = ROK, retUL = ROK; @@ -490,8 +458,8 @@ uint8_t fillSchUeCbFrmRecfgReq(Inst inst, SchUeCb *ueCb, SchUeRecfgReq *ueRecfg) ueCb->ueCfg.cellId = ueRecfg->cellId; - ueCb->ueCfg.ueId = ueRecfg->ueId; ueCb->ueCfg.crnti = ueRecfg->crnti; + GET_UE_ID(ueRecfg->crnti, ueCb->ueCfg.ueId); ueCb->ueCfg.dataTransmissionAction = ueRecfg->dataTransmissionInfo; if(ueRecfg->macCellGrpRecfgPres == true) { @@ -517,7 +485,7 @@ uint8_t fillSchUeCbFrmRecfgReq(Inst inst, SchUeCb *ueCb, SchUeRecfgReq *ueRecfg) schInitDrxHarqCb(&ueCb->ulHqEnt.procs[idx].ulDrxHarqCb); } /* convert all the drx configuration recived in ms/subms into number of slots and store into the drxUeCb */ - schFillDrxUeCb(ueCb->cellCb->cellCfg.numerology, ueRecfg->macCellGrpRecfg.drxCfg, &ueCb->drxUeCb); + schFillDrxUeCb(ueCb->cellCb->numerology, ueRecfg->macCellGrpRecfg.drxCfg, &ueCb->drxUeCb); /* Calculate the onduration timer and short cycle timer (if shortcycle configuration is present) as soon as we * recived ueCfg request */ schAddUeInOndurationList(ueCb->cellCb, ueCb, 0); @@ -527,7 +495,7 @@ uint8_t fillSchUeCbFrmRecfgReq(Inst inst, SchUeCb *ueCb, SchUeRecfgReq *ueRecfg) { /* convert all the drx configuration recived in ms/subms into number * of slots and store into the drxUeCb */ - schFillDrxUeCb(ueCb->cellCb->cellCfg.numerology, ueRecfg->macCellGrpRecfg.drxCfg, &ueCb->drxUeCb); + schFillDrxUeCb(ueCb->cellCb->numerology, ueRecfg->macCellGrpRecfg.drxCfg, &ueCb->drxUeCb); /* Recalculate/Restart timer based on their presence */ schDrxUeReCfgTimer(ueCb->cellCb, ueCb); @@ -570,25 +538,20 @@ uint8_t fillSchUeCbFrmRecfgReq(Inst inst, SchUeCb *ueCb, SchUeRecfgReq *ueRecfg) } memcpy(&ueCb->ueCfg.spCellCfg , &ueRecfg->spCellRecfg, sizeof(SchSpCellRecfg)); - covertFreqDomRsrcMapToIAPIFormat(ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.pdcchCfg.cRSetToAddModList[0].freqDomainRsrc,\ - freqDomainResource); - memset(ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.pdcchCfg.cRSetToAddModList[0].freqDomainRsrc, 0, FREQ_DOM_RSRC_SIZE); - memcpy(ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.pdcchCfg.cRSetToAddModList[0].freqDomainRsrc, freqDomainResource, FREQ_DOM_RSRC_SIZE); - ueCb->ueCfg.spCellCfgPres = true; dlDataToUlAck = ueRecfg->spCellRecfg.servCellRecfg.initUlBwp.pucchCfg.dlDataToUlAck; if(ueCb->cellCb) { if(dlDataToUlAck) { - BuildK0K1Table(ueCb->cellCb, &ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.k0K1InfoTbl, false, pdschCfg,\ + BuildK0K1Table(ueCb->cellCb, &ueCb->k0K1InfoTbl, false, pdschCfg,\ ueRecfg->spCellRecfg.servCellRecfg.initDlBwp.pdschCfg, dlDataToUlAck->dlDataToUlAckListCount,\ dlDataToUlAck->dlDataToUlAckList); - ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.k0K1TblPrsnt = true; + ueCb->k0K1TblPrsnt = true; BuildK2InfoTable(ueCb->cellCb, ueRecfg->spCellRecfg.servCellRecfg.initUlBwp.puschCfg.timeDomRsrcAllocList,\ ueRecfg->spCellRecfg.servCellRecfg.initUlBwp.puschCfg.numTimeDomRsrcAlloc,\ - NULLP, &ueCb->ueCfg.spCellCfg.servCellRecfg.initUlBwp.k2InfoTbl); - ueCb->ueCfg.spCellCfg.servCellRecfg.initUlBwp.k2TblPrsnt = true; + NULLP, &ueCb->k2InfoTbl); + ueCb->k2TblPrsnt = true; } } } @@ -762,7 +725,7 @@ SchCellCb *getSchCellCb(uint16_t srcEvent, Inst inst, uint16_t cellId) * * @details * - * Function : MacSchAddUeConfigReq + * Function : SchAddUeConfigReq * * Functionality: Function to Add Ue config request from MAC * @@ -771,22 +734,19 @@ SchCellCb *getSchCellCb(uint16_t srcEvent, Inst inst, uint16_t cellId) * RFAILED - failure * * ****************************************************************/ -uint8_t MacSchAddUeConfigReq(Pst *pst, SchUeCfgReq *ueCfg) +uint8_t SchAddUeConfigReq(Pst *pst, SchUeCfgReq *ueCfg) { uint8_t lcIdx = 0, ret = ROK, idx = 0; + uint16_t ueId = 0; SchCellCb *cellCb = NULLP; SchUeCb *ueCb = NULLP; SchUeCfgRsp cfgRsp; Inst inst = pst->dstInst - SCH_INST_START; memset(&cfgRsp, 0, sizeof(SchUeCfgRsp)); -#ifdef CALL_FLOW_DEBUG_LOG - DU_LOG("\nCall Flow: ENTMAC -> ENTSCH : EVENT_ADD_UE_CONFIG_REQ_TO_SCH\n"); -#endif - if(!ueCfg) { - DU_LOG("\nERROR --> SCH : Adding UE Config Request failed at MacSchAddUeConfigReq()"); + DU_LOG("\nERROR --> SCH : Adding UE Config Request failed at SchAddUeConfigReq()"); return RFAILED; } DU_LOG("\nDEBUG --> SCH : Adding UE Config Request for CRNTI[%d]", ueCfg->crnti); @@ -798,7 +758,8 @@ uint8_t MacSchAddUeConfigReq(Pst *pst, SchUeCfgReq *ueCfg) return RFAILED; } /* Search if UE already configured */ - ueCb = &cellCb->ueCb[ueCfg->ueId - 1]; + GET_UE_ID(ueCfg->crnti, ueId); + ueCb = &cellCb->ueCb[ueId - 1]; if((ueCb->crnti == ueCfg->crnti) && (ueCb->state == SCH_UE_STATE_ACTIVE)) { @@ -810,11 +771,11 @@ uint8_t MacSchAddUeConfigReq(Pst *pst, SchUeCfgReq *ueCfg) /* Fill received Ue Configuration in UeCb */ memset(ueCb, 0, sizeof(SchUeCb)); - ueCb->ueId = ueCfg->ueId; ueCb->crnti = ueCfg->crnti; + GET_UE_ID(ueCb->crnti, ueCb->ueId); ueCb->cellCb = cellCb; - schUlHqEntInit(cellCb, &cellCb->ueCb[ueCfg->ueId-1]); - schDlHqEntInit(cellCb, &cellCb->ueCb[ueCfg->ueId-1]); + schUlHqEntInit(cellCb, &cellCb->ueCb[ueCb->ueId-1]); + schDlHqEntInit(cellCb, &cellCb->ueCb[ueCb->ueId-1]); SCH_ALLOC(ueCb->hqDlmap, sizeof(SchHqDlMap*)*(ueCb->cellCb->numSlots)); SCH_ALLOC(ueCb->hqUlmap, sizeof(SchHqUlMap*)*(ueCb->cellCb->numSlots)); @@ -837,7 +798,12 @@ uint8_t MacSchAddUeConfigReq(Pst *pst, SchUeCfgReq *ueCfg) cmLListInit(&ueCb->hqUlmap[idx]->hqList); } ret = fillSchUeCbFrmCfgReq(inst, ueCb, ueCfg); - + + if(fillUeCoresetAndSsInfo(ueCb) == RFAILED) + { + DU_LOG("\nERROR --> SCH : Memory Allocation Failed"); + return RFAILED; + } if(ret == ROK) { /* If UE has initiated RACH and then UE context is created, it means UE is @@ -862,6 +828,8 @@ uint8_t MacSchAddUeConfigReq(Pst *pst, SchUeCfgReq *ueCfg) SchSendUeCfgRspToMac(ueCfg, inst, RSP_OK, &cfgRsp); } + + cellCb->api->SchAddUeConfigReq(ueCb); return ret; } @@ -910,6 +878,7 @@ uint8_t schFillPuschAlloc(SchUeCb *ueCb, SlotTimingInfo puschTime, uint32_t tbSi if (isRetx == FALSE) { puschInfo.harqProcId = SCH_HARQ_PROC_ID; + puschInfo.crnti = ueCb->crnti; puschInfo.fdAlloc.resAllocType = SCH_ALLOC_TYPE_1; puschInfo.fdAlloc.resAlloc.type1.startPrb = startPrb; puschInfo.fdAlloc.resAlloc.type1.numPrb = numRb; @@ -947,6 +916,7 @@ uint8_t schFillPuschAlloc(SchUeCb *ueCb, SlotTimingInfo puschTime, uint32_t tbSi else { puschInfo.harqProcId = hqP->procId; + puschInfo.crnti = ueCb->crnti; puschInfo.fdAlloc.resAllocType = hqP->puschResType; puschInfo.fdAlloc.resAlloc.type1.startPrb = hqP->puschStartPrb; puschInfo.fdAlloc.resAlloc.type1.numPrb = hqP->puschNumPrb; @@ -966,16 +936,18 @@ uint8_t schFillPuschAlloc(SchUeCb *ueCb, SlotTimingInfo puschTime, uint32_t tbSi #endif } schUlSlotInfo = cellCb->schUlSlotInfo[puschTime.slot]; - SCH_ALLOC(schUlSlotInfo->schPuschInfo, sizeof(SchPuschInfo)); - if(!schUlSlotInfo->schPuschInfo) + SCH_ALLOC(schUlSlotInfo->schPuschInfo[ueCb->ueId - 1], sizeof(SchPuschInfo)); + if(!schUlSlotInfo->schPuschInfo[ueCb->ueId - 1]) { DU_LOG("\nERROR --> SCH: Memory allocation failed in schAllocMsg3Pusch"); return RFAILED; } - memcpy(schUlSlotInfo->schPuschInfo, &puschInfo, sizeof(SchPuschInfo)); + cellCb->schUlSlotInfo[puschTime.slot]->puschPres = true; + memcpy(schUlSlotInfo->schPuschInfo[ueCb->ueId - 1], &puschInfo, sizeof(SchPuschInfo)); return ROK; } + /******************************************************************* * * @brief Fills UL DCI information for MSG3 retransmission @@ -994,7 +966,7 @@ uint8_t schFillPuschAlloc(SchUeCb *ueCb, SlotTimingInfo puschTime, uint32_t tbSi uint8_t schFillUlDciForMsg3Retx(SchRaCb *raCb, SchPuschInfo *puschInfo, DciInfo *dciInfo) { SchCellCb *cellCb = raCb->cell; - dciInfo->cellId = cellCb->cellId; + dciInfo->crnti = raCb->tcrnti; SchUlHqProcCb *msg3HqProc = &raCb->msg3HqProc; if (msg3HqProc == NULLP) @@ -1003,10 +975,10 @@ uint8_t schFillUlDciForMsg3Retx(SchRaCb *raCb, SchPuschInfo *puschInfo, DciInfo } /* fill bwp cfg */ - dciInfo->bwpCfg.subcarrierSpacing = cellCb->cellCfg.sib1SchCfg.bwp.subcarrierSpacing; - dciInfo->bwpCfg.cyclicPrefix = cellCb->cellCfg.sib1SchCfg.bwp.cyclicPrefix; - dciInfo->bwpCfg.freqAlloc.startPrb = cellCb->cellCfg.schInitialDlBwp.bwp.freqAlloc.startPrb; - dciInfo->bwpCfg.freqAlloc.numPrb = cellCb->cellCfg.schInitialDlBwp.bwp.freqAlloc.numPrb; + dciInfo->bwpCfg.subcarrierSpacing = cellCb->sib1SchCfg.bwp.subcarrierSpacing; + dciInfo->bwpCfg.cyclicPrefix = cellCb->sib1SchCfg.bwp.cyclicPrefix; + dciInfo->bwpCfg.freqAlloc.startPrb = cellCb->cellCfg.dlCfgCommon.schInitialDlBwp.bwp.freqAlloc.startPrb; + dciInfo->bwpCfg.freqAlloc.numPrb = cellCb->cellCfg.dlCfgCommon.schInitialDlBwp.bwp.freqAlloc.numPrb; /*fill coreset cfg */ //Considering number of RBs in coreset1 is same as coreset0 @@ -1014,7 +986,7 @@ uint8_t schFillUlDciForMsg3Retx(SchRaCb *raCb, SchPuschInfo *puschInfo, DciInfo //Considering coreset1 also starts from same symbol as coreset0 dciInfo->coresetCfg.startSymbolIndex = searchSpaceIdxTable[0][3]; dciInfo->coresetCfg.durationSymbols = coresetIdxTable[0][2]; - memcpy(dciInfo->coresetCfg.freqDomainResource, cellCb->cellCfg.schInitialDlBwp.pdcchCommon.commonSearchSpace.freqDomainRsrc, FREQ_DOM_RSRC_SIZE); + memcpy(dciInfo->coresetCfg.freqDomainResource, cellCb->cellCfg.dlCfgCommon.schInitialDlBwp.pdcchCommon.commonSearchSpace.freqDomainRsrc, FREQ_DOM_RSRC_SIZE); dciInfo->coresetCfg.cceRegMappingType = 1; /* coreset0 is always interleaved */ dciInfo->coresetCfg.regBundleSize = 6; /* spec-38.211 sec 7.3.2.2 */ @@ -1026,24 +998,24 @@ uint8_t schFillUlDciForMsg3Retx(SchRaCb *raCb, SchPuschInfo *puschInfo, DciInfo dciInfo->coresetCfg.cceIndex = 0; /* 0-3 for UL and 4-7 for DL */ dciInfo->coresetCfg.aggregationLevel = 4; /* same as for sib1 */ - dciInfo->formatType = FORMAT0_0; + dciInfo->dciFormatInfo.formatType = FORMAT0_0; msg3HqProc->tbInfo.rvIdx++; msg3HqProc->tbInfo.rv = schCmnDlRvTbl[msg3HqProc->tbInfo.rvIdx & 0x03]; /* fill UL grant */ - dciInfo->format.format0_0.resourceAllocType = msg3HqProc->puschResType; - dciInfo->format.format0_0.freqAlloc.startPrb = msg3HqProc->puschStartPrb; - dciInfo->format.format0_0.freqAlloc.numPrb = msg3HqProc->puschNumPrb; - dciInfo->format.format0_0.timeAlloc.startSymb = msg3HqProc->strtSymbl; - dciInfo->format.format0_0.timeAlloc.numSymb = msg3HqProc->numSymbl; - dciInfo->format.format0_0.rowIndex = 0; /* row Index */ - dciInfo->format.format0_0.mcs = msg3HqProc->tbInfo.iMcs; - dciInfo->format.format0_0.harqProcId = msg3HqProc->procId; - dciInfo->format.format0_0.puschHopFlag = FALSE; /* disabled */ - dciInfo->format.format0_0.freqHopFlag = FALSE; /* disabled */ - dciInfo->format.format0_0.ndi = msg3HqProc->tbInfo.ndi; /* new transmission */ - dciInfo->format.format0_0.rv = msg3HqProc->tbInfo.rv; - dciInfo->format.format0_0.tpcCmd = 0; //Sphoorthi TODO: check - dciInfo->format.format0_0.sUlCfgd = FALSE; /* SUL not configured */ + dciInfo->dciFormatInfo.format.format0_0.resourceAllocType = msg3HqProc->puschResType; + dciInfo->dciFormatInfo.format.format0_0.freqAlloc.resAllocType = msg3HqProc->puschResType; + dciInfo->dciFormatInfo.format.format0_0.freqAlloc.resAlloc.type1.startPrb = msg3HqProc->puschStartPrb; + dciInfo->dciFormatInfo.format.format0_0.freqAlloc.resAlloc.type1.numPrb = msg3HqProc->puschNumPrb; + dciInfo->dciFormatInfo.format.format0_0.timeAlloc.startSymb = msg3HqProc->strtSymbl; + dciInfo->dciFormatInfo.format.format0_0.timeAlloc.numSymb = msg3HqProc->numSymbl; + dciInfo->dciFormatInfo.format.format0_0.rowIndex = 0; /* row Index */ + dciInfo->dciFormatInfo.format.format0_0.mcs = msg3HqProc->tbInfo.iMcs; + dciInfo->dciFormatInfo.format.format0_0.harqProcId = msg3HqProc->procId; + dciInfo->dciFormatInfo.format.format0_0.freqHopFlag = FALSE; /* disabled */ + dciInfo->dciFormatInfo.format.format0_0.ndi = msg3HqProc->tbInfo.ndi; /* new transmission */ + dciInfo->dciFormatInfo.format.format0_0.rvIndex = msg3HqProc->tbInfo.rv; + dciInfo->dciFormatInfo.format.format0_0.tpcCmd = 0; //Sphoorthi TODO: check + dciInfo->dciFormatInfo.format.format0_0.sulIndicator = FALSE; /* SUL not configured */ /* Fill DCI Structure */ dciInfo->dciInfo.rnti = raCb->tcrnti; @@ -1056,9 +1028,9 @@ uint8_t schFillUlDciForMsg3Retx(SchRaCb *raCb, SchPuschInfo *puschInfo, DciInfo dciInfo->dciInfo.beamPdcchInfo.digBfInterfaces = 0; dciInfo->dciInfo.beamPdcchInfo.prg[0].pmIdx = 0; dciInfo->dciInfo.beamPdcchInfo.prg[0].beamIdx[0] = 0; - dciInfo->dciInfo.txPdcchPower.powerValue = 0; + dciInfo->dciInfo.txPdcchPower.beta_pdcch_1_0 = 0; dciInfo->dciInfo.txPdcchPower.powerControlOffsetSS = 0; - dciInfo->dciInfo.pdschCfg = NULL; /* No DL data being sent */ + memset(&dciInfo->dciInfo.pdschCfg, 0, sizeof(PdschCfg)); msg3HqProc->tbInfo.txCntr++; puschInfo->harqProcId = msg3HqProc->procId; @@ -1108,14 +1080,13 @@ uint8_t schFillUlDci(SchUeCb *ueCb, SchPuschInfo *puschInfo, DciInfo *dciInfo, b coreset1 = ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.pdcchCfg.cRSetToAddModList[0]; } - dciInfo->cellId = cellCb->cellId; dciInfo->crnti = ueCb->crnti; /* fill bwp cfg */ - dciInfo->bwpCfg.subcarrierSpacing = cellCb->cellCfg.sib1SchCfg.bwp.subcarrierSpacing; - dciInfo->bwpCfg.cyclicPrefix = cellCb->cellCfg.sib1SchCfg.bwp.cyclicPrefix; - dciInfo->bwpCfg.freqAlloc.startPrb = cellCb->cellCfg.schInitialDlBwp.bwp.freqAlloc.startPrb; - dciInfo->bwpCfg.freqAlloc.numPrb = cellCb->cellCfg.schInitialDlBwp.bwp.freqAlloc.numPrb; + dciInfo->bwpCfg.subcarrierSpacing = cellCb->sib1SchCfg.bwp.subcarrierSpacing; + dciInfo->bwpCfg.cyclicPrefix = cellCb->sib1SchCfg.bwp.cyclicPrefix; + dciInfo->bwpCfg.freqAlloc.startPrb = cellCb->cellCfg.dlCfgCommon.schInitialDlBwp.bwp.freqAlloc.startPrb; + dciInfo->bwpCfg.freqAlloc.numPrb = cellCb->cellCfg.dlCfgCommon.schInitialDlBwp.bwp.freqAlloc.numPrb; /*fill coreset cfg */ //Considering number of RBs in coreset1 is same as coreset0 @@ -1134,23 +1105,25 @@ uint8_t schFillUlDci(SchUeCb *ueCb, SchPuschInfo *puschInfo, DciInfo *dciInfo, b dciInfo->coresetCfg.cceIndex = 0; /* 0-3 for UL and 4-7 for DL */ dciInfo->coresetCfg.aggregationLevel = 4; /* same as for sib1 */ - dciInfo->formatType = FORMAT0_0; + dciInfo->dciFormatInfo.formatType = FORMAT0_0; /* fill UL grant */ - dciInfo->format.format0_0.resourceAllocType = puschInfo->fdAlloc.resAllocType; - dciInfo->format.format0_0.freqAlloc.startPrb = puschInfo->fdAlloc.resAlloc.type1.startPrb; - dciInfo->format.format0_0.freqAlloc.numPrb = puschInfo->fdAlloc.resAlloc.type1.numPrb; - dciInfo->format.format0_0.timeAlloc.startSymb = puschInfo->tdAlloc.startSymb; - dciInfo->format.format0_0.timeAlloc.numSymb = puschInfo->tdAlloc.numSymb; - dciInfo->format.format0_0.rowIndex = 0; /* row Index */ - dciInfo->format.format0_0.mcs = puschInfo->tbInfo.mcs; - dciInfo->format.format0_0.harqProcId = puschInfo->harqProcId; - dciInfo->format.format0_0.puschHopFlag = FALSE; /* disabled */ - dciInfo->format.format0_0.freqHopFlag = FALSE; /* disabled */ - dciInfo->format.format0_0.ndi = puschInfo->tbInfo.ndi; /* new transmission */ - dciInfo->format.format0_0.rv = puschInfo->tbInfo.rv; - dciInfo->format.format0_0.tpcCmd = 0; //Sphoorthi TODO: check - dciInfo->format.format0_0.sUlCfgd = FALSE; /* SUL not configured */ + dciInfo->dciFormatInfo.format.format0_0.resourceAllocType = puschInfo->fdAlloc.resAllocType; + dciInfo->dciFormatInfo.format.format0_0.freqAlloc.resAllocType = puschInfo->fdAlloc.resAllocType; + dciInfo->dciFormatInfo.format.format0_0.freqAlloc.resAlloc.type1.startPrb = \ + puschInfo->fdAlloc.resAlloc.type1.startPrb; + dciInfo->dciFormatInfo.format.format0_0.freqAlloc.resAlloc.type1.numPrb = \ + puschInfo->fdAlloc.resAlloc.type1.numPrb; + dciInfo->dciFormatInfo.format.format0_0.timeAlloc.startSymb = puschInfo->tdAlloc.startSymb; + dciInfo->dciFormatInfo.format.format0_0.timeAlloc.numSymb = puschInfo->tdAlloc.numSymb; + dciInfo->dciFormatInfo.format.format0_0.rowIndex = 0; /* row Index */ + dciInfo->dciFormatInfo.format.format0_0.mcs = puschInfo->tbInfo.mcs; + dciInfo->dciFormatInfo.format.format0_0.harqProcId = puschInfo->harqProcId; + dciInfo->dciFormatInfo.format.format0_0.freqHopFlag = FALSE; /* disabled */ + dciInfo->dciFormatInfo.format.format0_0.ndi = puschInfo->tbInfo.ndi; /* new transmission */ + dciInfo->dciFormatInfo.format.format0_0.rvIndex = puschInfo->tbInfo.rv; + dciInfo->dciFormatInfo.format.format0_0.tpcCmd = 0; //Sphoorthi TODO: check + dciInfo->dciFormatInfo.format.format0_0.sulIndicator = FALSE; /* SUL not configured */ /* Fill DCI Structure */ dciInfo->dciInfo.rnti = ueCb->crnti; @@ -1163,9 +1136,9 @@ uint8_t schFillUlDci(SchUeCb *ueCb, SchPuschInfo *puschInfo, DciInfo *dciInfo, b dciInfo->dciInfo.beamPdcchInfo.digBfInterfaces = 0; dciInfo->dciInfo.beamPdcchInfo.prg[0].pmIdx = 0; dciInfo->dciInfo.beamPdcchInfo.prg[0].beamIdx[0] = 0; - dciInfo->dciInfo.txPdcchPower.powerValue = 0; + dciInfo->dciInfo.txPdcchPower.beta_pdcch_1_0 = 0; dciInfo->dciInfo.txPdcchPower.powerControlOffsetSS = 0; - dciInfo->dciInfo.pdschCfg = NULL; /* No DL data being sent */ + memset(&dciInfo->dciInfo.pdschCfg, 0, sizeof(PdschCfg)); return ROK; } @@ -1176,7 +1149,7 @@ uint8_t schFillUlDci(SchUeCb *ueCb, SchPuschInfo *puschInfo, DciInfo *dciInfo, b * * @details * - * Function : MacSchModUeConfigReq + * Function : SchModUeConfigReq * * Functionality: Function to modify Ue Config request from MAC * @@ -1185,7 +1158,7 @@ uint8_t schFillUlDci(SchUeCb *ueCb, SchPuschInfo *puschInfo, DciInfo *dciInfo, b * RFAILED - failure * * ****************************************************************/ -uint8_t MacSchModUeConfigReq(Pst *pst, SchUeRecfgReq *ueRecfg) +uint8_t SchModUeConfigReq(Pst *pst, SchUeRecfgReq *ueRecfg) { uint8_t ueId, lcIdx, ret = ROK; SchCellCb *cellCb = NULLP; @@ -1193,14 +1166,10 @@ uint8_t MacSchModUeConfigReq(Pst *pst, SchUeRecfgReq *ueRecfg) SchUeRecfgRsp recfgRsp; Inst inst = pst->dstInst - SCH_INST_START; memset(&recfgRsp, 0, sizeof(SchUeRecfgRsp)); - -#ifdef CALL_FLOW_DEBUG_LOG - DU_LOG("\nCall Flow: ENTMAC -> ENTSCH : EVENT_MODIFY_UE_CONFIG_REQ_TO_SCH\n"); -#endif if(!ueRecfg) { - DU_LOG("\nERROR --> SCH : Modifying Ue Config request failed at MacSchModUeConfigReq()"); + DU_LOG("\nERROR --> SCH : Modifying Ue Config request failed at SchModUeConfigReq()"); return RFAILED; } DU_LOG("\nDEBUG --> SCH : Modifying Ue Config Request for CRNTI[%d]", ueRecfg->crnti); @@ -1215,10 +1184,10 @@ uint8_t MacSchModUeConfigReq(Pst *pst, SchUeRecfgReq *ueRecfg) /* Search if UE already configured */ GET_UE_ID(ueRecfg->crnti, ueId); ueCb = &cellCb->ueCb[ueId -1]; - + if(!ueCb) { - DU_LOG("\nERROR --> SCH : SchUeCb not found at MacSchModUeConfigReq() "); + DU_LOG("\nERROR --> SCH : SchUeCb not found at SchModUeConfigReq() "); SchSendUeRecfgRspToMac(ueRecfg, inst, RSP_NOK, &recfgRsp); return RFAILED; } @@ -1226,6 +1195,11 @@ uint8_t MacSchModUeConfigReq(Pst *pst, SchUeRecfgReq *ueRecfg) { /* Found the UeCb to Reconfig */ ret = fillSchUeCbFrmRecfgReq(inst, ueCb, ueRecfg); + if(fillUeCoresetAndSsInfo(ueCb) == RFAILED) + { + DU_LOG("\nERROR --> SCH : Memory Allocation Failed"); + return RFAILED; + } if(ret == ROK) { ueCb->cellCb = cellCb; @@ -1240,39 +1214,6 @@ uint8_t MacSchModUeConfigReq(Pst *pst, SchUeRecfgReq *ueRecfg) return ret; } -/******************************************************************* -* -* @brief Fill and send UE delete response to MAC -* -* @details -* -* Function : SchSendUeDeleteRspToMac -* -* Functionality: Fill and send UE delete response to MAC -* -* @params[in] Inst inst, SchUeDelete *ueDelete, SchMacRsp result, -* ErrorCause cause -* @return ROK - success -* RFAILED - failure -* -* ****************************************************************/ -void SchSendUeDeleteRspToMac(Inst inst, SchUeDelete *ueDelete, SchMacRsp result, ErrorCause cause) -{ - Pst rspPst; - SchUeDeleteRsp delRsp; - - memset(&delRsp, 0, sizeof(SchUeDeleteRsp)); - delRsp.cellId = ueDelete->cellId; - delRsp.crnti = ueDelete->crnti; - delRsp.rsp = result; - delRsp.cause = cause; - - /* Filling response post */ - memset(&rspPst, 0, sizeof(Pst)); - FILL_PST_SCH_TO_MAC(rspPst, inst); - rspPst.event = EVENT_UE_DELETE_RSP_TO_MAC; - SchUeDeleteRspOpts[rspPst.selector](&rspPst, &delRsp); -} /******************************************************************* * @@ -1370,7 +1311,7 @@ void deleteSchPdschServCellCfg(SchPdschServCellCfg *pdschServCellCfg) * ****************************************************************/ void deleteSchUeCb(SchUeCb *ueCb) { - uint8_t timeDomRsrcIdx = 0, ueLcIdx = 0, idx =0; + uint8_t timeDomRsrcIdx = 0, ueLcIdx = 0, slotIdx =0, cRSetIdx = 0; SchPucchCfg *pucchCfg = NULLP; SchPdschConfig *pdschCfg = NULLP; @@ -1378,12 +1319,12 @@ void deleteSchUeCb(SchUeCb *ueCb) { if(ueCb->hqDlmap) { - for (idx = 0; idxcellCb->numSlots; idx++) + for (slotIdx = 0; slotIdxcellCb->numSlots; slotIdx++) { - if(ueCb->hqDlmap[idx]) + if(ueCb->hqDlmap[slotIdx]) { - cmLListDeleteLList(&ueCb->hqDlmap[idx]->hqList); - SCH_FREE(ueCb->hqDlmap[idx], sizeof(SchHqDlMap)); + cmLListDeleteLList(&ueCb->hqDlmap[slotIdx]->hqList); + SCH_FREE(ueCb->hqDlmap[slotIdx], sizeof(SchHqDlMap)); } } SCH_FREE(ueCb->hqDlmap, sizeof(SchHqDlMap*)*(ueCb->cellCb->numSlots)); @@ -1391,17 +1332,20 @@ void deleteSchUeCb(SchUeCb *ueCb) if(ueCb->hqUlmap) { - for (idx = 0; idxcellCb->numSlots; idx++) + for (slotIdx = 0; slotIdxcellCb->numSlots; slotIdx++) { - if(ueCb->hqUlmap[idx]) + if(ueCb->hqUlmap[slotIdx]) { - cmLListDeleteLList(&ueCb->hqUlmap[idx]->hqList); - SCH_FREE(ueCb->hqUlmap[idx], sizeof(SchHqUlMap)); + cmLListDeleteLList(&ueCb->hqUlmap[slotIdx]->hqList); + SCH_FREE(ueCb->hqUlmap[slotIdx], sizeof(SchHqUlMap)); } } SCH_FREE(ueCb->hqUlmap, sizeof(SchHqUlMap*)*(ueCb->cellCb->numSlots)); } + schDlHqEntDelete(ueCb); + schUlHqEntDelete(ueCb); + SCH_FREE(ueCb->ueCfg.ambrCfg, sizeof(SchAmbrCfg)); if(ueCb->ueCfg.spCellCfgPres) { @@ -1448,17 +1392,56 @@ void deleteSchUeCb(SchUeCb *ueCb) ueCb->ueDrxInfoPres = false; } #endif + + for(cRSetIdx=0; cRSetIdx < MAX_NUM_CRSET; cRSetIdx++) + { + SCH_FREE(ueCb->pdcchInfo[cRSetIdx].y, (sizeof(uint32_t) * ueCb->cellCb->numSlots)); + } memset(ueCb, 0, sizeof(SchUeCb)); } } +/******************************************************************* +* +* @brief Fill and send UE delete response to MAC +* +* @details +* +* Function : SchSendUeDeleteRspToMac +* +* Functionality: Fill and send UE delete response to MAC +* +* @params[in] Inst inst, SchUeDelete *ueDelete, SchMacRsp result, +* CauseOfResult cause +* @return ROK - success +* RFAILED - failure +* +* ****************************************************************/ +void SchSendUeDeleteRspToMac(Inst inst, SchUeDelete *ueDelete, SchMacRsp result, CauseOfResult cause) +{ + Pst rspPst; + SchUeDeleteRsp delRsp; + + memset(&delRsp, 0, sizeof(SchUeDeleteRsp)); + delRsp.cellId = ueDelete->cellId; + delRsp.crnti = ueDelete->crnti; + delRsp.rsp = result; + delRsp.cause = cause; + + /* Filling response post */ + memset(&rspPst, 0, sizeof(Pst)); + FILL_PST_SCH_TO_MAC(rspPst, inst); + rspPst.event = EVENT_UE_DELETE_RSP_TO_MAC; + MacMessageRouter(&rspPst, (void *)&delRsp); +} + /******************************************************************* * * @brief Function for Ue Delete request from MAC to SCH * * @details * -* Function : MacSchUeDeleteReq +* Function : SchProcUeDeleteReq * * Functionality: Function for Ue Delete request from MAC to SCH * @@ -1467,21 +1450,16 @@ void deleteSchUeCb(SchUeCb *ueCb) * RFAILED - failure * * ****************************************************************/ -uint8_t MacSchUeDeleteReq(Pst *pst, SchUeDelete *ueDelete) +uint8_t SchProcUeDeleteReq(Pst *pst, SchUeDelete *ueDelete) { - uint8_t idx=0, ueId=0, ueIdToDel=0, ret=ROK; - ErrorCause result; - SchCellCb *cellCb = NULLP; + uint8_t idx=0, ueId=0, ret=ROK; + CauseOfResult cause; + SchCellCb *cellCb = NULLP; Inst inst = pst->dstInst - SCH_INST_START; - CmLList *node = NULL, *next = NULL; -#ifdef CALL_FLOW_DEBUG_LOG - DU_LOG("\nCall Flow: ENTMAC -> ENTSCH : EVENT_UE_DELETE_REQ_TO_SCH\n"); -#endif - if(!ueDelete) { - DU_LOG("\nERROR --> SCH : MacSchUeDeleteReq(): Ue Delete request failed"); + DU_LOG("\nERROR --> SCH : SchProcUeDeleteReq(): Ue Delete request failed"); ret = RFAILED; } DU_LOG("\nDEBUG --> SCH : Ue Delete request received for crnti[%d]", ueDelete->crnti); @@ -1490,255 +1468,39 @@ uint8_t MacSchUeDeleteReq(Pst *pst, SchUeDelete *ueDelete) if(cellCb->cellId != ueDelete->cellId) { - DU_LOG("\nERROR --> SCH : MacSchUeDeleteReq(): cell Id is not available"); - result = INVALID_CELLID; + DU_LOG("\nERROR --> SCH : SchProcUeDeleteReq(): cell Id is not available"); + cause = CELLID_INVALID; } else { GET_UE_ID(ueDelete->crnti, ueId); if(( cellCb->ueCb[ueId-1].crnti == ueDelete->crnti) && ( cellCb->ueCb[ueId-1].state == SCH_UE_STATE_ACTIVE)) { - deleteSchUeCb(&cellCb->ueCb[ueId-1]); - ueIdToDel = ueId; /* Remove UE from ueToBeScheduled list */ - node = cellCb->ueToBeScheduled.first; - while(node) - { - next = node->next; - ueId = *(uint8_t *)node->node; - if(ueId == ueIdToDel) - { - SCH_FREE(node->node, sizeof(uint8_t)); - deleteNodeFromLList(&cellCb->ueToBeScheduled, node); - break; - } - node = next; - } + cellCb->api->SchUeDeleteReq(&cellCb->ueCb[ueId-1]); + deleteSchUeCb(&cellCb->ueCb[ueId-1]); cellCb->numActvUe--; - result = NOT_APPLICABLE; + cause = SUCCESSFUL; } else { - DU_LOG("\nERROR --> SCH : MacSchUeDeleteReq(): SchUeCb not found"); - result = INVALID_UEID; + DU_LOG("\nERROR --> SCH : SchProcUeDeleteReq(): SchUeCb not found"); + cause = UEID_INVALID; } } - if(result == NOT_APPLICABLE) + if(cause == SUCCESSFUL) { - SchSendUeDeleteRspToMac(inst, ueDelete, RSP_OK, result); + SchSendUeDeleteRspToMac(inst, ueDelete, RSP_OK, cause); } else { - SchSendUeDeleteRspToMac(inst, ueDelete, RSP_NOK, result); + SchSendUeDeleteRspToMac(inst, ueDelete, RSP_NOK, cause); ret = RFAILED; } return ret; } -/******************************************************************* - * - * @brief Fill and send Cell delete response to MAC - * - * @details - * - * Function : SchSendCellDeleteRspToMac - * - * Functionality: Fill and send Cell delete response to MAC - * - * @params[in] SchCellDelete *ueDelete, Inst inst, SchMacRsp result - * @return ROK - success - * RFAILED - failure - * - * ****************************************************************/ -uint8_t SchSendCellDeleteRspToMac(SchCellDeleteReq *ueDelete, Inst inst, SchMacRsp result) -{ - Pst rspPst; - uint8_t ret=0; - - SchCellDeleteRsp delRsp; - - DU_LOG("\nINFO --> SCH : Filling Cell Delete response"); - memset(&delRsp, 0, sizeof(SchCellDeleteRsp)); - delRsp.cellId = ueDelete->cellId; - delRsp.rsp = result; - - /* Filling response post */ - memset(&rspPst, 0, sizeof(Pst)); - FILL_PST_SCH_TO_MAC(rspPst, inst); - rspPst.event = EVENT_CELL_DELETE_RSP_TO_MAC; - ret = SchCellDeleteRspOpts[rspPst.selector](&rspPst, &delRsp); - if(ret == RFAILED) - { - DU_LOG("\nERROR --> SCH : SchSendCellDeleteRspToMac(): failed to send the Cell Delete response"); - return ret; - } - return ret; -} - -/******************************************************************* - * - * @brief Function for cellCb Deletion - * - * @details - * - * Function : deleteSchCellCb - * - * Functionality: Function for cellCb Deletion - * - * @params[in] SchCellDelete *cellDelete - * @return ROK - success - * RFAILED - failure - * - * ****************************************************************/ -void deleteSchCellCb(SchCellCb *cellCb) -{ - uint8_t sliceIdx=0, slotIdx=0; - CmLListCp *list=NULL; - CmLList *node=NULL, *next=NULL; - SchPageInfo *tempNode = NULLP; - - if(cellCb->schDlSlotInfo) - { - for(slotIdx=0; slotIdxnumSlots; slotIdx++) - { - list = &cellCb->schDlSlotInfo[slotIdx]->prbAlloc.freePrbBlockList; - node = list->first; - while(node) - { - next = node->next; - SCH_FREE(node->node, sizeof(FreePrbBlock)); - deleteNodeFromLList(list, node); - node = next; - } - SCH_FREE(cellCb->schDlSlotInfo[slotIdx], sizeof(SchDlSlotInfo)); - } - SCH_FREE(cellCb->schDlSlotInfo, cellCb->numSlots *sizeof(SchDlSlotInfo*)); - } - - if(cellCb->schUlSlotInfo) - { - for(slotIdx=0; slotIdxnumSlots; slotIdx++) - { - list = &cellCb->schUlSlotInfo[slotIdx]->prbAlloc.freePrbBlockList; - node = list->first; - while(node) - { - next = node->next; - SCH_FREE(node->node, sizeof(FreePrbBlock)); - deleteNodeFromLList(list, node); - node = next; - } - SCH_FREE(cellCb->schUlSlotInfo[slotIdx], sizeof(SchUlSlotInfo)); - } - SCH_FREE(cellCb->schUlSlotInfo, cellCb->numSlots * sizeof(SchUlSlotInfo*)); - } - - if(cellCb->cellCfg.plmnInfoList.snssai) - { - for(sliceIdx=0; sliceIdxcellCfg.plmnInfoList.numSliceSupport; sliceIdx++) - { - SCH_FREE(cellCb->cellCfg.plmnInfoList.snssai[sliceIdx], sizeof(Snssai)); - } - SCH_FREE(cellCb->cellCfg.plmnInfoList.snssai, cellCb->cellCfg.plmnInfoList.numSliceSupport*sizeof(Snssai*)); - } - - for(uint16_t idx =0; idxpageCb.pageIndInfoRecord[idx]; - node = list->first; - while(node) - { - next = node->next; - if(node->node) - { - tempNode = (SchPageInfo*)(node->node); - SCH_FREE(tempNode->pagePdu, tempNode->msgLen); - SCH_FREE(node->node, sizeof(SchPageInfo)); - } - deleteNodeFromLList(list, node); - node = next; - } - } - - /* Remove all UE from ueToBeScheduled list and deallocate */ - node = cellCb->ueToBeScheduled.first; - while(node) - { - next = node->next; - SCH_FREE(node->node, sizeof(uint8_t)); - cmLListDelFrm(&cellCb->ueToBeScheduled, node); - SCH_FREE(node, sizeof(CmLList)); - node = next; - } - - memset(cellCb, 0, sizeof(SchCellCb)); - -} - -/******************************************************************* - * - * @brief Function for cell Delete request from MAC to SCH - * - * @details - * - * Function : MacSchCellDeleteReq - * - * Functionality: Function for cell Delete request from MAC to SCH - * - * @params[in] Pst *pst, SchCellDelete *cellDelete - * @return ROK - success - * RFAILED - failure - * - * ****************************************************************/ - -uint8_t MacSchCellDeleteReq(Pst *pst, SchCellDeleteReq *cellDelete) -{ - uint8_t cellIdx=0, ret = RFAILED; - Inst inst = pst->dstInst - SCH_INST_START; - SchMacRsp result= RSP_OK; - -#ifdef CALL_FLOW_DEBUG_LOG - DU_LOG("\nCall Flow: ENTMAC -> ENTSCH : EVENT_CELL_DELETE_REQ_TO_SCH\n"); -#endif - - if(!cellDelete) - { - DU_LOG("\nERROR --> SCH : MacSchCellDeleteReq(): Ue Delete request failed"); - } - else - { - GET_CELL_IDX(cellDelete->cellId, cellIdx); - if(schCb[inst].cells[cellIdx] == NULLP) - { - DU_LOG("\nERROR --> SCH : MacSchCellDeleteReq(): cell Id[%d] is not available", cellDelete->cellId); - result = RSP_NOK; - } - else - { - if(schCb[inst].cells[cellIdx]->cellId == cellDelete->cellId) - { - deleteSchCellCb(schCb[inst].cells[cellIdx]); - result = RSP_OK; - ret = ROK; - SCH_FREE(schCb[inst].cells[cellIdx], sizeof(SchCellCb)); - DU_LOG("\nINFO --> SCH : Sending Cell Delete response to MAC"); - } - else - { - DU_LOG("\nERROR --> SCH : MacSchCellDeleteReq(): cell Id[%d] is not available",cellDelete->cellId); - result = RSP_NOK; - } - } - - if(SchSendCellDeleteRspToMac(cellDelete, inst, result)!=ROK) - { - DU_LOG("\nERROR --> SCH : MacSchCellDeleteReq(): failed to send Cell Delete response"); - ret = RFAILED; - } - } - return ret; -} /******************************************************************* * * @brief Function updates DL HARQ Feedback @@ -1760,7 +1522,7 @@ void schUpdateHarqFdbk(SchUeCb *ueCb, uint8_t numHarq, uint8_t *harqPayload, Slo { SchDlHqProcCb *hqP; SchHqDlMap *hqDlMap; - CmLList *node; + CmLList *node = NULLP; uint8_t fdbkPos = 0; hqDlMap = ueCb->hqDlmap[slotInd->slot]; @@ -1769,29 +1531,37 @@ void schUpdateHarqFdbk(SchUeCb *ueCb, uint8_t numHarq, uint8_t *harqPayload, Slo { return; } - if (ueCb->cellCb->raCb[ueCb->ueId-1].raState != SCH_RA_STATE_MSG4_PENDING) + + while(fdbkPos < numHarq) { node = hqDlMap->hqList.first; - while(node) + if(node == NULLP) + { + DU_LOG("\nERROR : SCH --> DL HARQ list is empty thus no need to process the dl harq feedback!"); + return; + } + if (ueCb->cellCb->raCb[ueCb->ueId-1].raState != SCH_RA_STATE_MSG4_PENDING) + { + while(node) + { + hqP = (SchDlHqProcCb*)node->node; + node = node->next; + cmLListDelFrm(&hqDlMap->hqList, &hqP->dlSlotLnk); + /* + Decode harq feedback if needed post FAPI message decoding also or check how to decode this FAPI msg. + case 1 semi static harq Ack/Nack codebook //Supported + case 2 dynamic harq ACK/NACK codebook //Not supported + */ + schDlHqFeedbackUpdate(hqP, harqPayload[fdbkPos++], HQ_TB_ACKED);//Marking 2nd TB as ACKED for now as only one TB to be used + } + } + else { hqP = (SchDlHqProcCb*)node->node; - node = node->next; - cmLListDelFrm(&hqDlMap->hqList, &hqP->ulSlotLnk); - /* - Decode harq feedback if needed post FAPI message decoding also or check how to decode this FAPI msg. - case 1 semi static harq Ack/Nack codebook //Supported - case 2 dynamic harq ACK/NACK codebook //Not supported - */ - schDlHqFeedbackUpdate(hqP, harqPayload[fdbkPos++], HQ_TB_ACKED);//Marking 2nd TB as ACKED for now as only one TB to be used + cmLListDelFrm(&hqDlMap->hqList, &hqP->dlSlotLnk); + schMsg4FeedbackUpdate(hqP, harqPayload[fdbkPos++]); } } - else - { - node = hqDlMap->hqList.first; - hqP = (SchDlHqProcCb*)node->node; - cmLListDelFrm(&hqDlMap->hqList, &hqP->ulSlotLnk); - schMsg4FeedbackUpdate(hqP, harqPayload[fdbkPos++]); - } } /********************************************************************** End of file