X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2F5gnrsch%2Fsch_ue_mgr.c;h=fcc671e314a82c49da4752557174db42814b7292;hb=2e3617064e27b8d7bb5ba74319f8c1c99491b8dd;hp=1711ecbe49c5abd6d770dde3fef6b2eeed8c5f50;hpb=95d4c229dc30cec27c98ee66b5b689779a48dcc9;p=o-du%2Fl2.git diff --git a/src/5gnrsch/sch_ue_mgr.c b/src/5gnrsch/sch_ue_mgr.c index 1711ecbe4..fcc671e31 100644 --- a/src/5gnrsch/sch_ue_mgr.c +++ b/src/5gnrsch/sch_ue_mgr.c @@ -27,6 +27,7 @@ #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" @@ -53,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; @@ -86,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; @@ -288,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) { @@ -363,11 +361,6 @@ 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) @@ -377,12 +370,17 @@ uint8_t fillSchUeCbFrmCfgReq(Inst inst, SchUeCb *ueCb, SchUeCfgReq *ueCfg) BuildK0K1Table(ueCb->cellCb, &ueCb->k0K1InfoTbl, false, pdschCfg,\ ueCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg, dlDataToUlAck->dlDataToUlAckListCount,\ dlDataToUlAck->dlDataToUlAckList); + } + 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->k2InfoTbl); ueCb->k2TblPrsnt = true; - } } } @@ -453,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; @@ -461,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) { @@ -541,11 +538,6 @@ 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) @@ -745,6 +737,7 @@ SchCellCb *getSchCellCb(uint16_t srcEvent, Inst inst, uint16_t cellId) 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; @@ -765,7 +758,8 @@ uint8_t SchAddUeConfigReq(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)) { @@ -777,11 +771,11 @@ uint8_t SchAddUeConfigReq(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)); @@ -804,7 +798,12 @@ uint8_t SchAddUeConfigReq(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 @@ -1163,7 +1162,7 @@ uint8_t SchModUeConfigReq(Pst *pst, SchUeRecfgReq *ueRecfg) SchUeRecfgRsp recfgRsp; Inst inst = pst->dstInst - SCH_INST_START; memset(&recfgRsp, 0, sizeof(SchUeRecfgRsp)); - + if(!ueRecfg) { DU_LOG("\nERROR --> SCH : Modifying Ue Config request failed at SchModUeConfigReq()"); @@ -1181,7 +1180,7 @@ uint8_t SchModUeConfigReq(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 SchModUeConfigReq() "); @@ -1192,6 +1191,11 @@ uint8_t SchModUeConfigReq(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; @@ -1303,7 +1307,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; @@ -1311,12 +1315,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)); @@ -1324,12 +1328,12 @@ 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)); @@ -1384,6 +1388,11 @@ 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)); } } @@ -1509,7 +1518,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]; @@ -1518,29 +1527,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