X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2F5gnrmac%2Fmac_ue_mgr.c;h=fda65cf45bf067103fd18ae1bfe9edd2243b3cb0;hb=aae1fb8fd1e149a7b3a6a6ca799c56aceadc6184;hp=a201e52c587db0a4c76cc70233f0643080f06b95;hpb=84670fed17a640ca68c199055b740c41f04c9f4d;p=o-du%2Fl2.git diff --git a/src/5gnrmac/mac_ue_mgr.c b/src/5gnrmac/mac_ue_mgr.c index a201e52c5..fda65cf45 100644 --- a/src/5gnrmac/mac_ue_mgr.c +++ b/src/5gnrmac/mac_ue_mgr.c @@ -136,6 +136,32 @@ uint8_t fillMacCellGroupCfg(MacCellGrpCfg macCellGrp, SchMacCellGrpCfg *macCell macCellGrpCfg->phrCfg.modeOtherCG = macCellGrp.phrCfg.phrOtherCG; } +#ifdef NR_DRX + /* Copy Drx configuration */ + macCellGrpCfg->drxCfgPresent = true; + macCellGrpCfg->drxCfg.drxOnDurationTimer.onDurationTimerValInMs = macCellGrp.drxCfg.drxOnDurationTimer.onDurationTimerValInMs; + if(!macCellGrp.drxCfg.drxOnDurationTimer.onDurationTimerValInMs) + macCellGrpCfg->drxCfg.drxOnDurationTimer.onDurationtimerValue.subMilliSeconds = \ + macCellGrp.drxCfg.drxOnDurationTimer.onDurationtimerValue.subMilliSeconds; + else + macCellGrpCfg->drxCfg.drxOnDurationTimer.onDurationtimerValue.milliSeconds = \ + macCellGrp.drxCfg.drxOnDurationTimer.onDurationtimerValue.milliSeconds; + macCellGrpCfg->drxCfg.drxInactivityTimer = macCellGrp.drxCfg.drxInactivityTimer; + macCellGrpCfg->drxCfg.drxHarqRttTimerDl = macCellGrp.drxCfg.drxHarqRttTimerDl; + macCellGrpCfg->drxCfg.drxHarqRttTimerUl = macCellGrp.drxCfg.drxHarqRttTimerUl; + macCellGrpCfg->drxCfg.drxRetransmissionTimerDl = macCellGrp.drxCfg.drxRetransmissionTimerDl; + macCellGrpCfg->drxCfg.drxRetransmissionTimerUl = macCellGrp.drxCfg.drxRetransmissionTimerUl; + macCellGrpCfg->drxCfg.drxLongCycleStartOffset.drxLongCycleStartOffsetChoice = macCellGrp.drxCfg.drxLongCycleStartOffset.\ + drxLongCycleStartOffsetChoice; + macCellGrpCfg->drxCfg.drxLongCycleStartOffset.drxLongCycleStartOffsetVal = macCellGrp.drxCfg.drxLongCycleStartOffset.drxLongCycleStartOffsetVal; + macCellGrpCfg->drxCfg.shortDrxPres = macCellGrp.drxCfg.shortDrxPres; + if(macCellGrpCfg->drxCfg.shortDrxPres) + { + macCellGrpCfg->drxCfg.shortDrx.drxShortCycle = macCellGrp.drxCfg.shortDrx.drxShortCycle; + macCellGrpCfg->drxCfg.shortDrx.drxShortCycleTimer = macCellGrp.drxCfg.shortDrx.drxShortCycleTimer; + } + macCellGrpCfg->drxCfg.drxSlotOffset = macCellGrp.drxCfg.drxSlotOffset; +#endif return ROK; } @@ -1616,7 +1642,7 @@ uint8_t fillSchUeCfg(Pst *pst, SchUeCfg *schUeCfg, MacUeCfg *ueCfg) uint8_t ret = ROK; schUeCfg->cellId = ueCfg->cellId; - schUeCfg->duUeF1apId = ueCfg->duUeF1apId; + schUeCfg->ueId = ueCfg->ueId; schUeCfg->crnti = ueCfg->crnti; schUeCfg->dataTransmissionInfo = ueCfg->transmissionAction; /* Copy MAC cell group config */ @@ -1684,6 +1710,11 @@ uint8_t fillSchUeCfg(Pst *pst, SchUeCfg *schUeCfg, MacUeCfg *ueCfg) DU_LOG("\nERROR --> MAC : Failed to copy LCs at fillSchUeCfg()"); return ret; } + +#ifdef NR_DRX + schUeCfg->drxConfigIndicatorRelease = ueCfg->drxConfigIndicatorRelease;; +#endif + return ret; } @@ -1995,11 +2026,6 @@ uint8_t fillMacUeCb(MacUeCb *ueCb, MacUeCfg *ueCfg, uint8_t cellIdx) ueCfg->spCellCfg.servCellCfg.pdschServCellCfg.numHarqProcForPdsch; } - if(ueCfg->crnti) - ueCb->state = UE_STATE_ACTIVE; - else - ueCb->state = UE_HANDIN_IN_PROGRESS; - /*TODO: To check the bsr value during implementation */ if(ueCfg->macCellGrpCfgPres) { @@ -2013,6 +2039,7 @@ uint8_t fillMacUeCb(MacUeCb *ueCb, MacUeCfg *ueCfg, uint8_t cellIdx) DU_LOG("\nERROR --> MAC: Failed while filing MAC LC List at fillMacUeCb()"); } ueCb->transmissionAction = ueCfg->transmissionAction; + return ret; } @@ -2034,15 +2061,15 @@ uint8_t fillMacUeCb(MacUeCb *ueCb, MacUeCfg *ueCfg, uint8_t cellIdx) uint8_t updateMacRaCb(uint16_t cellIdx, MacUeCb *ueCb) { - uint8_t ueIdx; /* Copy RA Cb */ - for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++) + if(macCb.macCell[cellIdx]->macRaCb[ueCb->ueId-1].crnti == ueCb->crnti) { - if(macCb.macCell[cellIdx]->macRaCb[ueIdx].crnti == ueCb->crnti) - { - ueCb->raCb = &macCb.macCell[cellIdx]->macRaCb[ueIdx]; - break; - } + ueCb->raCb = &macCb.macCell[cellIdx]->macRaCb[ueCb->ueId-1]; + } + else + { + DU_LOG("\nERROR --> MAC : No RA CB found for UE ID [%d]", ueCb->ueId); + return RFAILED; } return ROK; } @@ -2064,27 +2091,21 @@ uint8_t updateMacRaCb(uint16_t cellIdx, MacUeCb *ueCb) void deleteMacRaCb(uint16_t cellIdx, MacUeCb *ueCb) { - uint8_t ueIdx; + uint8_t tbIdx; + MacRaCbInfo *raCb = ueCb->raCb; + DlHarqProcCb *hqProcCb; - for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++) + if(raCb && (raCb->crnti == ueCb->crnti)) { - if(macCb.macCell[cellIdx]->macRaCb[ueIdx].crnti == ueCb->crnti) + hqProcCb = &raCb->msg4HqInfo; + MAC_FREE(raCb->msg4Pdu, raCb->msg4PduLen); + for(tbIdx = 0; tbIdx < raCb->msg4HqInfo.numTb; tbIdx++) { - if(macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4Pdu) - { - MAC_FREE(macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4Pdu, \ - macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4PduLen); - } - if(macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4TxPdu) - { - MAC_FREE(macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4TxPdu, \ - macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4TbSize); - } - memset(&macCb.macCell[cellIdx]->macRaCb[ueIdx], 0, sizeof(MacRaCbInfo)); - break; + MAC_FREE(raCb->msg4HqInfo.tbInfo[tbIdx].tb, \ + raCb->msg4HqInfo.tbInfo[tbIdx].tbSize - TX_PAYLOAD_HDR_LEN); } + memset(raCb, 0, sizeof(MacRaCbInfo)); } - } /******************************************************************* @@ -2104,7 +2125,8 @@ void deleteMacRaCb(uint16_t cellIdx, MacUeCb *ueCb) * ****************************************************************/ uint8_t createUeCb(uint8_t cellIdx, MacUeCb *ueCb, MacUeCfg *ueCfg) { - uint8_t ret =ROK; + uint8_t ret = ROK; + uint8_t hqProcIdx = 0; if((ueCb->ueId == ueCfg->ueId) && (ueCb->crnti == ueCfg->crnti)\ &&(ueCb->state == UE_STATE_ACTIVE)) @@ -2123,16 +2145,27 @@ uint8_t createUeCb(uint8_t cellIdx, MacUeCb *ueCb, MacUeCfg *ueCfg) } else { - if(ueCb->state == UE_STATE_ACTIVE) + /* Initialize all DL HARQ PROC ID to MAX NUM OF HARQ PROC */ + for(hqProcIdx = 0; hqProcIdx < MAX_NUM_HARQ_PROC; hqProcIdx++) { + ueCb->dlInfo.dlHarqEnt.harqProcCb[hqProcIdx].procId = MAX_NUM_HARQ_PROC; + } + + /* If UE has not requested for RACH yet, it means UE context is created for a + * UE in handover */ + if(macCb.macCell[cellIdx]->macRaCb[ueCb->ueId-1].crnti == ueCb->crnti) + { + ueCb->state = UE_STATE_ACTIVE; macCb.macCell[cellIdx]->numActvUe++; updateMacRaCb(cellIdx, ueCb); } + else + ueCb->state = UE_HANDIN_IN_PROGRESS; + return ROK; } - } - + return ROK; } /******************************************************************* @@ -2166,7 +2199,6 @@ uint8_t modifyUeCb(uint8_t cellIdx, MacUeCb *ueCb, MacUeCfg *ueCfg) } else { - deleteMacRaCb(cellIdx, ueCb); return ROK; } } @@ -2214,10 +2246,7 @@ uint8_t procMacUeCfgData(Pst *pst, MacUeCfg *ueCfg) } /* Check if UE already configured */ - if(ueCfg->crnti) - ueCb = &macCb.macCell[cellIdx]->ueCb[ueCfg->ueId -1]; - else - ueCb = &macCb.macCell[cellIdx]->hoUeCb[ueCfg->duUeF1apId -1]; + ueCb = &macCb.macCell[cellIdx]->ueCb[ueCfg->ueId -1]; switch(pst->event) { @@ -2273,7 +2302,7 @@ uint8_t copyToTmpData(MacUeCfg *ueCfg) } memcpy(tmpData, ueCfg, sizeof(MacUeCfg)); GET_CELL_IDX(ueCfg->cellId, cellIdx); - macCb.macCell[cellIdx]->ueCfgTmpData[ueCfg->duUeF1apId-1] = tmpData; + macCb.macCell[cellIdx]->ueCfgTmpData[ueCfg->ueId-1] = tmpData; return ROK; } @@ -2302,6 +2331,13 @@ uint8_t MacProcUeCreateReq(Pst *pst, MacUeCfg *ueCfg) if(ueCfg) { + /* If CRNTI = 0, MAC must allot a CRNTI to this UE. This scenario hits in + * case of UE in handover */ + if(ueCfg->crnti == 0) + { + GET_CRNTI(ueCfg->crnti, ueCfg->ueId); + } + /*Storing received ueCfg in ueCfgTmpData */ ret = copyToTmpData(ueCfg); if(ret == ROK) @@ -2365,7 +2401,7 @@ uint8_t MacSendUeCreateRsp(MacRsp result, SchUeCfgRsp *schCfgRsp) /* Filling UE Config response */ memset(cfgRsp, 0, sizeof(MacUeCfgRsp)); cfgRsp->cellId = schCfgRsp->cellId; - cfgRsp->duUeF1apId = schCfgRsp->duUeF1apId; + cfgRsp->ueId = schCfgRsp->ueId; cfgRsp->result = result; /* Fill Post structure and send UE Create response*/ @@ -2405,7 +2441,7 @@ uint8_t MacSendUeReconfigRsp(MacRsp result, SchUeCfgRsp *schCfgRsp) /* Filling UE Config response */ memset(cfgRsp, 0, sizeof(MacUeCfgRsp)); cfgRsp->cellId = schCfgRsp->cellId; - cfgRsp->duUeF1apId = schCfgRsp->duUeF1apId; + cfgRsp->ueId = schCfgRsp->ueId; cfgRsp->result = result; /* Fill Post structure and send UE Create response*/ @@ -2432,12 +2468,12 @@ uint8_t MacSendUeReconfigRsp(MacRsp result, SchUeCfgRsp *schCfgRsp) * * ****************************************************************/ -MacUeCfg *getMacUeCfg(uint16_t cellIdx, uint8_t duUeF1apId) +MacUeCfg *getMacUeCfg(uint16_t cellIdx, uint8_t ueId) { MacUeCfg *ueCfg = NULLP; if(macCb.macCell[cellIdx]) { - ueCfg = macCb.macCell[cellIdx]->ueCfgTmpData[duUeF1apId-1]; + ueCfg = macCb.macCell[cellIdx]->ueCfgTmpData[ueId-1]; } else { @@ -2487,7 +2523,7 @@ uint8_t MacProcSchUeCfgRsp(Pst *pst, SchUeCfgRsp *schCfgRsp) #endif GET_CELL_IDX(schCfgRsp->cellId, cellIdx); - ueCfg = getMacUeCfg(cellIdx, schCfgRsp->duUeF1apId); + ueCfg = getMacUeCfg(cellIdx, schCfgRsp->ueId); if(ueCfg == NULLP) { DU_LOG("\nERROR --> MAC : Failed to find the Mac Ue Cfg for event [%d] in MacProcSchUeCfgRsp()", pst->event); @@ -2703,10 +2739,10 @@ void deletePucchResourcesCfg(PucchResrcCfg *resrcCfg) * * @details * -* Function : MacProcSchUeCfgRsp +* Function : MacProcSchUeDeleteRsp * * Functionality: -* Processes UE create delete from scheduler +* Processes UE delete from scheduler * * @params[in] Pst : Post structure * schUeDelRsp : Scheduler UE delete respons @@ -2717,10 +2753,11 @@ void deletePucchResourcesCfg(PucchResrcCfg *resrcCfg) uint8_t MacProcSchUeDeleteRsp(Pst *pst, SchUeDeleteRsp *schUeDelRsp) { - uint8_t ueId =0, isCrntiValid = 0; + uint8_t ueId =0, isCrntiValid = 0, tbIdx =0, idx=0; uint16_t cellIdx=0; uint8_t ret = RFAILED; UeDeleteStatus result; + DlHarqEnt *dlHarqEnt; #ifdef CALL_FLOW_DEBUG_LOG DU_LOG("\nCall Flow: ENTSCH -> ENTMAC : EVENT_UE_DELETE_RSP_TO_MAC\n"); @@ -2759,9 +2796,21 @@ uint8_t MacProcSchUeDeleteRsp(Pst *pst, SchUeDeleteRsp *schUeDelRsp) MAC_FREE(macCb.macCell[cellIdx]->ueCb[ueId -1].dlInfo.lcCb[lcIdx].snssai, sizeof(Snssai)); } #endif + dlHarqEnt = &macCb.macCell[cellIdx]->ueCb[ueId -1].dlInfo.dlHarqEnt; + for(idx =0 ; idxharqProcCb[idx].numTb) + { + + MAC_FREE(dlHarqEnt->harqProcCb[idx].tbInfo[tbIdx].tb, dlHarqEnt->harqProcCb[idx].tbInfo[tbIdx].tbSize); + dlHarqEnt->harqProcCb[idx].numTb--; + tbIdx++; + } + } memset(&macCb.macCell[cellIdx]->ueCb[ueId -1], 0, sizeof(MacUeCb)); macCb.macCell[cellIdx]->numActvUe--; - result = SUCCESS; + result = DEL_SUCCESSFUL; ret = ROK; } else @@ -2852,7 +2901,7 @@ uint8_t MacProcUeDeleteReq(Pst *pst, MacUeDelete *ueDelete) { uint8_t ret = ROK; uint8_t cellIdx=0; - UeDeleteStatus result=SUCCESS; + UeDeleteStatus result=DEL_SUCCESSFUL; MacUeCb *ueCb = NULLP; MacCellCb *cellCb = NULLP; @@ -2886,7 +2935,7 @@ uint8_t MacProcUeDeleteReq(Pst *pst, MacUeDelete *ueDelete) result = CELLID_INVALID; } - if(result != SUCCESS) + if(result != DEL_SUCCESSFUL) { MacSendUeDeleteRsp(ueDelete->cellId, ueDelete->crnti, result); MAC_FREE_SHRABL_BUF(pst->region, pst->pool, ueDelete, sizeof(MacUeDelete));