From: Harshita Lal Date: Mon, 14 Nov 2022 15:24:51 +0000 (+0000) Subject: Merge "[Epic-ID: ODUHIGH-462][Task-ID: ODUHIGH-472] Implementation of drx timer ... X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=0ee9d868ee051d37995fa518c7f7c908d10ebc27;hp=-c;p=o-du%2Fl2.git Merge "[Epic-ID: ODUHIGH-462][Task-ID: ODUHIGH-472] Implementation of drx timer [Onduration timer, short cycle timer, in active drx timer]" --- 0ee9d868ee051d37995fa518c7f7c908d10ebc27 diff --combined src/5gnrsch/sch.c index 31878a918,2e9a16c85..d11b611cf --- a/src/5gnrsch/sch.c +++ b/src/5gnrsch/sch.c @@@ -66,11 -66,11 +66,11 @@@ SchSliceCfgRspFunc SchSliceCfgRspOpts[ }; -SchSliceReCfgRspFunc SchSliceReCfgRspOpts[] = +SchSliceRecfgRspFunc SchSliceRecfgRspOpts[] = { - packSchSliceReCfgRsp, /* LC */ - MacProcSchSliceReCfgRsp, /* TC */ - packSchSliceReCfgRsp /* LWLC */ + packSchSliceRecfgRsp, /* LC */ + MacProcSchSliceRecfgRsp, /* TC */ + packSchSliceRecfgRsp /* LWLC */ }; /** @@@ -666,6 -666,10 +666,10 @@@ uint8_t schInitCellCb(Inst inst, SchCel cell->firstSib1Transmitted = false; fillSsbStartSymb(cell); cmLListInit(&cell->ueToBeScheduled); + + #ifdef NR_DRX + memset(cell->drxCb, 0, MAX_DRX_SIZE*sizeof(SchDrxCb)); + #endif schCb[inst].cells[inst] = cell; DU_LOG("\nINFO --> SCH : Cell init completed for cellId:%d", cell->cellId); @@@ -1114,6 -1118,13 +1118,13 @@@ uint8_t MacSchSrUciInd(Pst *pst, SrUciI DU_LOG("\nINFO --> SCH: UL Data transmission not allowed for UE %d", ueCb->ueCfg.ueId); return ROK; } + #ifdef NR_DRX + if(ueCb->ueDrxInfoPres) + { + if(!ueCb->drxUeCb.drxUlUeActiveStatus) + ueCb->drxUeCb.drxUlUeActiveStatus = true; + } + #endif if(uciInd->numSrBits) { ueCb->srRcvd = true; @@@ -1125,42 -1136,42 +1136,42 @@@ /******************************************************************* * - * @brief Processes HARQ UCI indication from MAC + * @brief Processes DL HARQ indication from MAC * * @details * - * Function : MacSchHarqUciInd + * Function : MacSchDlHarqInd * * Functionality: - * Processes HARQ UCI indication from MAC + * Processes DL HARQ indication from MAC * * @params[in] Post structure - * UCI Indication + * DL HARQ Indication * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t MacSchHarqUciInd(Pst *pst, HarqUciIndInfo *uciInd) +uint8_t MacSchDlHarqInd(Pst *pst, DlHarqInd *dlHarqInd) { Inst inst = pst->dstInst-SCH_INST_START; SchUeCb *ueCb; SchCellCb *cellCb = schCb[inst].cells[inst]; #ifdef CALL_FLOW_DEBUG_LOG - DU_LOG("\nCall Flow: ENTMAC -> ENTSCH : EVENT_UCI_IND_TO_SCH\n"); + DU_LOG("\nCall Flow: ENTMAC -> ENTSCH : EVENT_DL_HARQ_IND_TO_SCH\n"); #endif DU_LOG("\nDEBUG --> SCH : Received HARQ"); - ueCb = schGetUeCb(cellCb, uciInd->crnti); + ueCb = schGetUeCb(cellCb, dlHarqInd->crnti); if(ueCb->state == SCH_UE_STATE_INACTIVE) { - DU_LOG("\nERROR --> SCH : Crnti %d is inactive", uciInd->crnti); + DU_LOG("\nERROR --> SCH : Crnti %d is inactive", dlHarqInd->crnti); return ROK; } - schUpdateHarqFdbk(ueCb, uciInd->numHarq, uciInd->harqPayload, &uciInd->slotInd); + schUpdateHarqFdbk(ueCb, dlHarqInd->numHarq, dlHarqInd->harqPayload, &dlHarqInd->slotInd); return ROK; } @@@ -1670,7 -1681,7 +1681,7 @@@ void SchSendSliceCfgRspToMac(Inst inst * RFAILED - Failure * * ********************************************************************************/ -uint8_t fillSliceCfgRsp(bool sliceReCfg, SchSliceCfg *storedSliceCfg, SchCellCb *cellCb, SchSliceCfgReq *schSliceCfgReq, SchSliceCfgRsp *schSliceCfgRsp, uint8_t *count) +uint8_t fillSliceCfgRsp(bool sliceRecfg, SchSliceCfg *storedSliceCfg, SchCellCb *cellCb, SchSliceCfgReq *schSliceCfgReq, SchSliceCfgRsp *schSliceCfgRsp, uint8_t *count) { bool sliceFound = false; uint8_t cfgIdx = 0, sliceIdx = 0; @@@ -1687,7 -1698,7 +1698,7 @@@ { sliceFound = false; /* Here comparing the slice cfg request with the slice stored in cellCfg */ - if(sliceReCfg != true) + if(sliceRecfg != true) { for(sliceIdx = 0; sliceIdxcellCfg.plmnInfoList.numSliceSupport; sliceIdx++) { @@@ -1815,25 -1826,25 +1826,25 @@@ uint8_t addSliceCfgInSchDb(SchSliceCfg * ROK - Success * RFAILED - Failure * ********************************************************************************/ -void freeSchSliceCfgReq(SchSliceCfgReq *cfgReq) +void freeSchSliceCfgReq(SchSliceCfgReq *sliceCfgReq) { uint8_t cfgIdx = 0; - if(cfgReq) + if(sliceCfgReq) { - if(cfgReq->numOfConfiguredSlice) + if(sliceCfgReq->numOfConfiguredSlice) { - for(cfgIdx = 0; cfgIdxnumOfConfiguredSlice; cfgIdx++) + for(cfgIdx = 0; cfgIdxnumOfConfiguredSlice; cfgIdx++) { - if(cfgReq->listOfConfirguration[cfgIdx]) + if(sliceCfgReq->listOfConfirguration[cfgIdx]) { - SCH_FREE(cfgReq->listOfConfirguration[cfgIdx]->rrmPolicyRatioInfo, sizeof(SchRrmPolicyRatio)); - SCH_FREE(cfgReq->listOfConfirguration[cfgIdx], sizeof(SchRrmPolicyOfSlice)); + SCH_FREE(sliceCfgReq->listOfConfirguration[cfgIdx]->rrmPolicyRatioInfo, sizeof(SchRrmPolicyRatio)); + SCH_FREE(sliceCfgReq->listOfConfirguration[cfgIdx], sizeof(SchRrmPolicyOfSlice)); } } - SCH_FREE(cfgReq->listOfConfirguration, cfgReq->numOfConfiguredSlice * sizeof(SchRrmPolicyOfSlice*)); + SCH_FREE(sliceCfgReq->listOfConfirguration, sliceCfgReq->numOfConfiguredSlice * sizeof(SchRrmPolicyOfSlice*)); } - SCH_FREE(cfgReq, sizeof(SchSliceCfgReq)); + SCH_FREE(sliceCfgReq, sizeof(SchSliceCfgReq)); } } /******************************************************************************* @@@ -1906,7 -1917,7 +1917,7 @@@ uint8_t MacSchSliceCfgReq(Pst *pst, Sch * RFAILED - Failure * * ********************************************************************************/ -uint8_t modifySliceCfgInSchDb(SchSliceCfg *storeSliceCfg, SchSliceCfgReq *cfgReq, SchSliceCfgRsp cfgRsp, uint8_t count) +uint8_t modifySliceCfgInSchDb(SchSliceCfg *storeSliceCfg, SchSliceRecfgReq *recfgReq, SchSliceRecfgRsp recfgRsp, uint8_t count) { uint8_t cfgIdx = 0, sliceIdx = 0; @@@ -1918,15 -1929,15 +1929,15 @@@ return RFAILED; } - for(cfgIdx = 0; cfgIdxnumOfConfiguredSlice; cfgIdx++) + for(cfgIdx = 0; cfgIdxnumOfConfiguredSlice; cfgIdx++) { - if(cfgRsp.listOfSliceCfgRsp[cfgIdx]->rsp == RSP_OK) + if(recfgRsp.listOfSliceCfgRsp[cfgIdx]->rsp == RSP_OK) { for(sliceIdx = 0; sliceIdxnumOfSliceConfigured; sliceIdx++) { - if(!memcmp(&storeSliceCfg->listOfConfirguration[sliceIdx]->snssai, &cfgReq->listOfConfirguration[cfgIdx]->snssai, sizeof(Snssai))) + if(!memcmp(&storeSliceCfg->listOfConfirguration[sliceIdx]->snssai, &recfgReq->listOfConfirguration[cfgIdx]->snssai, sizeof(Snssai))) { - memcpy(storeSliceCfg->listOfConfirguration[sliceIdx]->rrmPolicyRatioInfo, cfgReq->listOfConfirguration[cfgIdx]->rrmPolicyRatioInfo, + memcpy(storeSliceCfg->listOfConfirguration[sliceIdx]->rrmPolicyRatioInfo, recfgReq->listOfConfirguration[cfgIdx]->rrmPolicyRatioInfo, sizeof(SchRrmPolicyRatio)); break; } @@@ -1934,7 -1945,7 +1945,7 @@@ } } } - freeSchSliceCfgReq(cfgReq); + freeSchSliceCfgReq(recfgReq); return ROK; } /******************************************************************************* @@@ -1943,17 -1954,17 +1954,17 @@@ * * @details * - * Function : SchSendSliceCfgRspToMac + * Function : SchSendSliceRecfgRspToMac * * Functionality: * function is used to send Slice re Cfg rsp to MAC * - * @params[in] Pst *pst, SchSliceCfgRsp schSliceReCfgRsp + * @params[in] Pst *pst, SchSliceRecfgRsp schSliceRecfgRsp * * @return- void * * ********************************************************************************/ -void SchSendSliceReCfgRspToMac(Inst inst, SchSliceCfgRsp schSliceReCfgRsp) +void SchSendSliceRecfgRspToMac(Inst inst, SchSliceRecfgRsp schSliceRecfgRsp) { Pst rspPst; @@@ -1961,7 -1972,7 +1972,7 @@@ FILL_PST_SCH_TO_MAC(rspPst, inst); rspPst.event = EVENT_SLICE_RECFG_RSP_TO_MAC; - SchSliceReCfgRspOpts[rspPst.selector](&rspPst, &schSliceReCfgRsp); + SchSliceRecfgRspOpts[rspPst.selector](&rspPst, &schSliceRecfgRsp); } /******************************************************************************* * @@@ -1969,48 -1980,48 +1980,48 @@@ * * @details * - * Function : MacSchSliceReCfgReq + * Function : MacSchSliceRecfgReq * * Functionality: * function is used to store the slice re configuration Sch DB * - * @params[in] Pst *pst, SchSliceCfgReq *schSliceReCfgReq + * @params[in] Pst *pst, SchSliceRecfgReq *schSliceRecfgReq * * @return * ROK - Success * RFAILED - Failure * * ********************************************************************************/ -uint8_t MacSchSliceReCfgReq(Pst *pst, SchSliceCfgReq *schSliceReCfgReq) +uint8_t MacSchSliceRecfgReq(Pst *pst, SchSliceRecfgReq *schSliceRecfgReq) { uint8_t count = 0; Inst inst = pst->dstInst - SCH_INST_START; - SchSliceCfgRsp schSliceReCfgRsp; + SchSliceRecfgRsp schSliceRecfgRsp; DU_LOG("\nINFO --> SCH : Received Slice ReCfg request from MAC"); - if(schSliceReCfgReq) + if(schSliceRecfgReq) { - if(schSliceReCfgReq->listOfConfirguration) + if(schSliceRecfgReq->listOfConfirguration) { /* filling the slice configuration response of each slice */ - if(fillSliceCfgRsp(true, &schCb[inst].sliceCfg, NULLP, schSliceReCfgReq, &schSliceReCfgRsp, &count) != ROK) + if(fillSliceCfgRsp(true, &schCb[inst].sliceCfg, NULLP, schSliceRecfgReq, &schSliceRecfgRsp, &count) != ROK) { DU_LOG("\nERROR --> SCH : Failed to fill sch slice cfg response"); return RFAILED; } /* Modify the slice configuration stored in schCb */ - if(modifySliceCfgInSchDb(&schCb[inst].sliceCfg, schSliceReCfgReq, schSliceReCfgRsp, count) != ROK) + if(modifySliceCfgInSchDb(&schCb[inst].sliceCfg, schSliceRecfgReq, schSliceRecfgRsp, count) != ROK) { DU_LOG("\nERROR --> SCH : Failed to modify slice cfg of SchDb"); return RFAILED; } - SchSendSliceReCfgRspToMac(inst, schSliceReCfgRsp); + SchSendSliceRecfgRspToMac(inst, schSliceRecfgRsp); } } else { - DU_LOG("\nERROR --> SCH : Received SchSliceCfgReq is NULL"); + DU_LOG("\nERROR --> SCH : Received SchSliceRecfgReq is NULL"); } return ROK; } diff --combined src/5gnrsch/sch_ue_mgr.c index 91b89b1fe,db1510825..b0300f0f4 --- a/src/5gnrsch/sch_ue_mgr.c +++ b/src/5gnrsch/sch_ue_mgr.c @@@ -28,6 -28,9 +28,9 @@@ #include "mac_sch_interface.h" #include "sch.h" #include "sch_utils.h" + #ifdef NR_DRX + #include "sch_drx.h" + #endif /* local defines */ SchUeCfgRspFunc SchUeCfgRspOpts[] = @@@ -256,8 -259,56 +259,56 @@@ uint8_t fillSchUeCb(Inst inst, SchUeCb { memcpy(&ueCb->ueCfg.macCellGrpCfg , &ueCfg->macCellGrpCfg, sizeof(SchMacCellGrpCfg)); ueCb->ueCfg.macCellGrpCfgPres = true; + #ifdef NR_DRX + if(ueCfg->macCellGrpCfg.drxCfgPresent == true) + { + if(ueCb->ueDrxInfoPres == false) + { + ueCb->ueDrxInfoPres = true; + /* intialize the drxUeCb */ + schInitDrxUeCb(ueCb); + + /* intialize the Dl drxHarqCb */ + for(idx =0; idxdlHqEnt.numHqPrcs; idx++) + { + schInitDrxHarqCb(&ueCb->dlHqEnt.procs[idx].drxHarqCb); + } + /* intialize the Ul drxHarqCb */ + for(idx =0; idxulHqEnt.numHqPrcs; idx++) + { + schInitDrxHarqCb(&ueCb->ulHqEnt.procs[idx].drxHarqCb); + } + /* 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); + /* Calculate the onduration timer and short cycle timer (if shortcycle configuration is present) as soon as we + * recived ueCfg request */ + schAddUeInOndurationAndShortCycleList(ueCb->cellCb, ueCb, 0); + + } + else + { + /* 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); + + /* Recalculate/Restart timer based on their presence */ + schDrxUeReCfgTimer(ueCb->cellCb, ueCb); + } + } + #endif } + #ifdef NR_DRX + if(ueCfg->drxConfigIndicatorRelease == true) + { + if(ueCb->ueDrxInfoPres == true) + { + schDeleteUeDrxInfo(ueCb->cellCb, ueCb); + ueCb->ueDrxInfoPres = false; + } + } + #endif + if(ueCfg->phyCellGrpCfgPres == true) { memcpy(&ueCb->ueCfg.phyCellGrpCfg , &ueCfg->phyCellGrpCfg, sizeof(SchPhyCellGrpCfg)); @@@ -1139,7 -1190,14 +1190,14 @@@ void deleteSchUeCb(SchUeCb *ueCb SCH_FREE(ueCb->ulInfo.ulLcCtxt[ueLcIdx].snssai, sizeof(Snssai)); SCH_FREE(ueCb->dlInfo.dlLcCtxt[ueLcIdx].snssai, sizeof(Snssai)); } - + #ifdef NR_DRX + if(ueCb->ueDrxInfoPres) + { + /* Removing all the calculated drx configuration timer list */ + schDeleteUeDrxInfo(ueCb->cellCb, ueCb); + ueCb->ueDrxInfoPres = false; + } + #endif memset(ueCb, 0, sizeof(SchUeCb)); } } @@@ -1243,7 -1301,7 +1301,7 @@@ uint8_t MacSchUeDeleteReq(Pst *pst, Sch * RFAILED - failure * * ****************************************************************/ -uint8_t SchSendCellDeleteRspToMac(SchCellDelete *ueDelete, Inst inst, SchMacRsp result) +uint8_t SchSendCellDeleteRspToMac(SchCellDeleteReq *ueDelete, Inst inst, SchMacRsp result) { Pst rspPst; uint8_t ret=0; @@@ -1384,7 -1442,7 +1442,7 @@@ void deleteSchCellCb(SchCellCb *cellCb * * ****************************************************************/ -uint8_t MacSchCellDeleteReq(Pst *pst, SchCellDelete *cellDelete) +uint8_t MacSchCellDeleteReq(Pst *pst, SchCellDeleteReq *cellDelete) { uint8_t cellIdx=0, ret = RFAILED; Inst inst = pst->dstInst - SCH_INST_START; diff --combined src/cm/du_app_mac_inf.h index 8df0b1082,cbb8935b0..06515e639 --- a/src/cm/du_app_mac_inf.h +++ b/src/cm/du_app_mac_inf.h @@@ -843,6 -843,7 +843,7 @@@ typedef struct macCellGrpCf bool phrCfgSetupPres; /* true/false: phrCfgSetup/phrCfgRelease */ PhrCfg phrCfg; #ifdef NR_DRX + bool drxCfgPresent; DrxCfg drxCfg; #endif }MacCellGrpCfg; @@@ -1300,6 -1301,9 +1301,9 @@@ typedef struct macUeCf LcCfg lcCfgList[MAX_NUM_LC]; UeCfgState macUeCfgState; /* InActive / Completed */ DataTransmissionAction transmissionAction; + #ifdef NR_DRX + bool drxConfigIndicatorRelease; + #endif }MacUeCfg; typedef struct nrcgi @@@ -1389,10 -1393,10 +1393,10 @@@ typedef struct ueDeleteRs UeDeleteStatus result; }MacUeDeleteRsp; -typedef struct macCellDelete +typedef struct macCellDeleteReq { uint16_t cellId; -}MacCellDelete; +}MacCellDeleteReq; typedef struct macCellDeleteRsp { @@@ -1432,27 -1436,14 +1436,27 @@@ typedef struct macSliceCfgRs MacSliceRsp **listOfSliceCfgRsp; }MacSliceCfgRsp; -typedef struct macPcchInd +/*As per ORAN-WG8, Slice Cfg and ReCfg are same structures*/ +typedef struct macSliceCfgReq MacSliceRecfgReq; +typedef struct macSliceCfgRsp MacSliceRecfgRsp; + +typedef struct dlPcchInd { uint16_t cellId; uint16_t pf; uint8_t i_s; uint16_t pduLen; uint8_t *pcchPdu; -}MacPcchInd; +}DlPcchInd; + +typedef struct cellInfo +{ + SlotTimingInfo slotInfo; + uint16_t cellId; +}CellInfo; + +typedef struct cellInfo CellStartInfo; +typedef struct cellInfo CellStopInfo; /* Functions for CellUp Ind from MAC to DU APP*/ typedef uint8_t (*DuMacCellUpInd) ARGS(( @@@ -1472,12 -1463,12 +1476,12 @@@ typedef uint8_t (*DuMacStopInd) ARGS( /* Functions for mac cell start req */ typedef uint8_t (*DuMacCellStart) ARGS(( Pst *pst, - OduCellId *cellId)); + CellStartInfo *cellId)); /* Functions for mac cell stop request */ typedef uint8_t (*DuMacCellStop) ARGS(( Pst *pst, - OduCellId *cellId )); + CellStopInfo *cellId )); /* Function pointers for packing macCellCfg Request and Confirm */ typedef uint8_t (*packMacCellCfgReq) ARGS(( @@@ -1549,7 -1540,7 +1553,7 @@@ typedef uint8_t (*MacDuUeDeleteRspFunc /* Cell Delete Request from DU APP to MAC*/ typedef uint8_t (*DuMacCellDeleteReq) ARGS(( Pst *pst, - MacCellDelete *cellDelete )); + MacCellDeleteReq *cellDelete )); /* Cell Delete Response from MAC to DU APP*/ typedef uint8_t (*MacDuCellDeleteRspFunc) ARGS(( @@@ -1569,29 -1560,29 +1573,29 @@@ typedef uint8_t (*MacDuSliceCfgRspFunc /* Slice ReReCfg Request from DU APP to MAC*/ typedef uint8_t (*DuMacSliceRecfgReq) ARGS(( Pst *pst, - MacSliceCfgReq *CfgReq)); + MacSliceRecfgReq *CfgReq)); /* Slice ReReCfg Response from MAC to DU APP */ -typedef uint8_t (*MacDuSliceReCfgRspFunc) ARGS(( +typedef uint8_t (*MacDuSliceRecfgRspFunc) ARGS(( Pst *pst, - MacSliceCfgRsp *cfgRsp)); + MacSliceRecfgRsp *cfgRsp)); /* Pcch indication from DU APP to MAC*/ typedef uint8_t (*DuMacDlPcchInd) ARGS(( Pst *pst, - MacPcchInd *pcchInd)); + DlPcchInd *pcchInd)); uint64_t ueBitMapPerCell[MAX_NUM_CELL]; /* Bit Map to store used/free UE-IDX per Cell */ uint8_t packMacCellUpInd(Pst *pst, OduCellId *cellId); uint8_t unpackMacCellUpInd(DuMacCellUpInd func, Pst *pst, Buffer *mBuf); uint8_t duHandleCellUpInd(Pst *pst, OduCellId *cellId); -uint8_t packMacCellStart(Pst *pst, OduCellId *cellId); +uint8_t packMacCellStart(Pst *pst, CellStartInfo *cellStartInfo); uint8_t unpackMacCellStart(DuMacCellStart func, Pst *pst, Buffer *mBuf); -uint8_t MacProcCellStart(Pst *pst, OduCellId *cellId); -uint8_t packMacCellStop(Pst *pst, OduCellId *cellId); +uint8_t MacProcCellStart(Pst *pst, CellStartInfo *cellStartInfo); +uint8_t packMacCellStop(Pst *pst, CellStopInfo *cellStopInfo); uint8_t unpackMacCellStop(DuMacCellStop func, Pst *pst, Buffer *mBuf); -uint8_t MacProcCellStop(Pst *pst, OduCellId *cellId); +uint8_t MacProcCellStop(Pst *pst, CellStopInfo *cellStopInfo); uint8_t packMacCellCfg(Pst *pst, MacCellCfg *macCellCfg); uint8_t unpackDuMacCellCfg(DuMacCellCfgReq func, Pst *pst, Buffer *mBuf); uint8_t MacProcCellCfgReq(Pst *pst, MacCellCfg *macCellCfg); @@@ -1632,8 -1623,8 +1636,8 @@@ uint8_t unpackMacUeDeleteReq(DuMacUeDel uint8_t packDuMacUeDeleteRsp(Pst *pst, MacUeDeleteRsp *deleteRsp); uint8_t DuProcMacUeDeleteRsp(Pst *pst, MacUeDeleteRsp *deleteRsp); uint8_t unpackDuMacUeDeleteRsp(MacDuUeDeleteRspFunc func, Pst *pst, Buffer *mBuf); -uint8_t packDuMacCellDeleteReq(Pst *pst, MacCellDelete *cellDelete); -uint8_t MacProcCellDeleteReq(Pst *pst, MacCellDelete *cellDelete); +uint8_t packDuMacCellDeleteReq(Pst *pst, MacCellDeleteReq *cellDelete); +uint8_t MacProcCellDeleteReq(Pst *pst, MacCellDeleteReq *cellDelete); uint8_t unpackMacCellDeleteReq(DuMacCellDeleteReq func, Pst *pst, Buffer *mBuf); uint8_t packDuMacCellDeleteRsp(Pst *pst, MacCellDeleteRsp *cellDeleteRsp); uint8_t DuProcMacCellDeleteRsp(Pst *pst, MacCellDeleteRsp *cellDeleteRsp); @@@ -1644,17 -1635,17 +1648,17 @@@ uint8_t unpackMacSliceCfgReq(DuMacSlice uint8_t DuProcMacSliceCfgRsp(Pst *pst, MacSliceCfgRsp *cfgRsp); uint8_t packDuMacSliceCfgRsp(Pst *pst, MacSliceCfgRsp *cfgRsp); uint8_t unpackDuMacSliceCfgRsp(MacDuSliceCfgRspFunc func, Pst *pst, Buffer *mBuf); -uint8_t packDuMacSliceRecfgReq(Pst *pst, MacSliceCfgReq *sliceReCfgReq); -uint8_t MacProcSliceReCfgReq(Pst *pst, MacSliceCfgReq *sliceReCfgReq); -uint8_t unpackMacSliceReCfgReq(DuMacSliceRecfgReq func, Pst *pst, Buffer *mBuf); -uint8_t DuProcMacSliceReCfgRsp(Pst *pst, MacSliceCfgRsp *cfgRsp); -uint8_t packDuMacSliceReCfgRsp(Pst *pst, MacSliceCfgRsp *cfgRsp); -uint8_t unpackDuMacSliceReCfgRsp(MacDuSliceReCfgRspFunc func, Pst *pst, Buffer *mBuf); +uint8_t packDuMacSliceRecfgReq(Pst *pst, MacSliceRecfgReq *sliceRecfgReq); +uint8_t MacProcSliceRecfgReq(Pst *pst, MacSliceRecfgReq *sliceRecfgReq); +uint8_t unpackMacSliceRecfgReq(DuMacSliceRecfgReq func, Pst *pst, Buffer *mBuf); +uint8_t DuProcMacSliceRecfgRsp(Pst *pst, MacSliceRecfgRsp *sliceRecfgRsp); +uint8_t packDuMacSliceRecfgRsp(Pst *pst, MacSliceRecfgRsp *sliceRecfgRsp); +uint8_t unpackDuMacSliceRecfgRsp(MacDuSliceRecfgRspFunc func, Pst *pst, Buffer *mBuf); uint8_t duHandleSlotInd(Pst *pst, SlotTimingInfo *slotIndInfo); uint8_t packMacSlotInd(Pst *pst, SlotTimingInfo *slotIndInfo); uint8_t unpackDuMacSlotInd(DuMacSlotInd func, Pst *pst, Buffer *mBuf); -uint8_t packDuMacDlPcchInd(Pst *pst, MacPcchInd *pcchInd); -uint8_t MacProcDlPcchInd(Pst *pst, MacPcchInd *pcchInd); +uint8_t packDuMacDlPcchInd(Pst *pst, DlPcchInd *pcchInd); +uint8_t MacProcDlPcchInd(Pst *pst, DlPcchInd *pcchInd); uint8_t unpackMacDlPcchInd(DuMacDlPcchInd func, Pst *pst, Buffer *mBuf); int8_t getFreeBitFromUeBitMap(uint16_t cellId); void unsetBitInUeBitMap(uint16_t cellId, uint8_t bitPos); diff --combined src/cm/mac_sch_interface.h index 6085d9506,a38e4077a..89789ca60 --- a/src/cm/mac_sch_interface.h +++ b/src/cm/mac_sch_interface.h @@@ -47,7 -47,6 +47,7 @@@ #define EVENT_PAGING_IND_TO_SCH 28 #define EVENT_DL_PAGING_ALLOC 29 #define EVENT_DL_REL_HQ_PROC 30 +#define EVENT_DL_HARQ_IND_TO_SCH 31 /*macros*/ #define MAX_SSB_IDX 1 /* forcing it as 1 for now. Right value is 64 */ #define SCH_SSB_MASK_SIZE 1 @@@ -837,8 -836,7 +837,8 @@@ typedef struct schCellCf typedef struct schCellCfgCfm { uint16_t cellId; /* Cell Id */ - SchMacRsp rsp; + SchMacRsp rsp; + SchFailureCause cause; }SchCellCfgCfm; typedef struct ssbInfo @@@ -1202,6 -1200,7 +1202,7 @@@ typedef struct schMacCellGrpCf SchTagCfg tagCfg; SchPhrCfg phrCfg; /* To be used only if phrCfgSetupPres is true */ #ifdef NR_DRX + bool drxCfgPresent; SchDrxCfg drxCfg; /* Drx configuration */ #endif }SchMacCellGrpCfg; @@@ -1656,6 -1655,9 +1657,9 @@@ typedef struct schUeCf uint8_t numLcs; SchLcCfg schLcCfg[MAX_NUM_LC]; SchDataTransmission dataTransmissionInfo; + #ifdef NR_DRX + bool drxConfigIndicatorRelease; + #endif }SchUeCfg; typedef struct schUeCfgRsp @@@ -1669,11 -1671,10 +1673,11 @@@ typedef struct schRachRsrcReq { - uint16_t cellId; - uint16_t crnti; - uint8_t numSsb; - uint8_t ssbIdx[MAX_NUM_SSB]; + SlotTimingInfo slotInd; + uint16_t cellId; + uint16_t crnti; + uint8_t numSsb; + uint8_t ssbIdx[MAX_NUM_SSB]; }SchRachRsrcReq; typedef struct schCfraSsbResource @@@ -1698,7 -1699,6 +1702,7 @@@ typedef struct schRachRsrcRs typedef struct schRachRsrcRel { + SlotTimingInfo slotInd; uint16_t cellId; uint16_t crnti; SchCfraResource cfraResource; @@@ -1718,17 -1718,16 +1722,17 @@@ typedef struct schUeDeleteRs ErrorCause cause; }SchUeDeleteRsp; -typedef struct schCellDelete +typedef struct schCellDeleteReq { uint16_t cellId; -}SchCellDelete; +}SchCellDeleteReq; typedef struct schCellDeleteRsp { - uint16_t cellId; - SchMacRsp rsp; + uint16_t cellId; + SchMacRsp rsp; + SchFailureCause cause; }SchCellDeleteRsp; typedef struct dataVolInfo @@@ -1755,14 -1754,14 +1759,14 @@@ typedef struct srUciIndInf uint8_t srPayload[MAX_SR_BITS_IN_BYTES]; }SrUciIndInfo; -typedef struct harqUciIndInfo +typedef struct dlHarqInd { uint16_t cellId; uint16_t crnti; SlotTimingInfo slotInd; uint8_t numHarq; uint8_t harqPayload[MAX_HARQ_BITS_IN_BYTES]; -}HarqUciIndInfo; +}DlHarqInd; typedef struct schRrmPolicyRatio { @@@ -1790,16 -1789,12 +1794,16 @@@ typedef struct sliceRs RspCause cause; }SliceRsp; -typedef struct schSliceRsp +typedef struct schSliceCfgRsp { uint8_t numSliceCfgRsp; SliceRsp **listOfSliceCfgRsp; }SchSliceCfgRsp; +/*As per ORAN-WG8, Slice Cfg and ReCfg are same structures*/ +typedef struct schSliceCfgReq SchSliceRecfgReq; +typedef struct schSliceCfgRsp SchSliceRecfgRsp; + typedef struct schPageInd { uint16_t cellId; @@@ -1877,9 -1872,9 +1881,9 @@@ typedef uint8_t (*MacSchBsrFunc) UlBufferStatusRptInd *bsrInd )); -typedef uint8_t (*MacSchHarqUciIndFunc) ARGS(( +typedef uint8_t (*MacSchDlHarqIndFunc) ARGS(( Pst *pst, /* Post structure */ - HarqUciIndInfo *uciInd)); /* UCI IND Info */ + DlHarqInd *dlHarqInd)); /* Dl HARQ IND Info */ typedef uint8_t (*MacSchSrUciIndFunc) ARGS(( Pst *pst, /* Post structure */ @@@ -1915,7 -1910,7 +1919,7 @@@ typedef uint8_t (*SchUeDeleteRspFunc) A typedef uint8_t (*MacSchCellDeleteReqFunc) ARGS(( Pst *pst, /* Post structure */ - SchCellDelete *schCellDelete)); /*Scheduler UE Del*/ + SchCellDeleteReq *schCellDelete)); /*Scheduler UE Del*/ typedef uint8_t (*SchCellDeleteRspFunc) ARGS(( Pst *pst, /* Post structure */ @@@ -1930,13 -1925,13 +1934,13 @@@ typedef uint8_t (*SchSliceCfgRspFunc SchSliceCfgRsp *schSliceCfgRsp /* Cell Cfg Cfm */ )); -typedef uint8_t (*MacSchSliceReCfgReqFunc) ARGS(( +typedef uint8_t (*MacSchSliceRecfgReqFunc) ARGS(( Pst *pst, /* Post structure */ - SchSliceCfgReq *schSliceReCfgReq)); /* Scheduler Slice ReCfg Req */ + SchSliceRecfgReq *schSliceRecfgReq)); /* Scheduler Slice ReCfg Req */ -typedef uint8_t (*SchSliceReCfgRspFunc) ARGS(( +typedef uint8_t (*SchSliceRecfgRspFunc) ARGS(( Pst *pst, /* Post Structure */ - SchSliceCfgRsp *schSliceReCfgRsp /* Cell ReCfg Cfm */ + SchSliceRecfgRsp *schSliceRecfgRsp /* Cell ReCfg Cfm */ )); typedef uint8_t (*MacSchPagingIndFunc) ARGS(( @@@ -1975,8 -1970,8 +1979,8 @@@ uint8_t unpackMacSchSlotInd(MacSchSlotI uint8_t packMacSchBsr(Pst *pst, UlBufferStatusRptInd *bsrInd); uint8_t MacSchBsr(Pst *pst, UlBufferStatusRptInd *bsrInd); uint8_t packMacSchSrUciInd(Pst *pst, SrUciIndInfo *uciInd); -uint8_t packMacSchHarqUciInd(Pst *pst, HarqUciIndInfo *uciInd); -uint8_t MacSchHarqUciInd(Pst *pst, HarqUciIndInfo *uciInd); +uint8_t packMacSchDlHarqInd(Pst *pst, DlHarqInd *dlHarqInd); +uint8_t MacSchDlHarqInd(Pst *pst, DlHarqInd *dlHarqInd); uint8_t MacSchSrUciInd(Pst *pst, SrUciIndInfo *uciInd); uint8_t packMacSchModUeConfigReq(Pst *pst, SchUeCfg *ueCfgToSch); uint8_t MacSchModUeConfigReq(Pst *pst, SchUeCfg *ueCfgToSch); @@@ -1992,18 -1987,18 +1996,18 @@@ uint8_t packMacSchUeDeleteReq(Pst *pst uint8_t MacSchUeDeleteReq(Pst *pst, SchUeDelete *ueDelete); uint8_t packSchUeDeleteRsp(Pst *pst, SchUeDeleteRsp *delRsp); uint8_t MacProcSchUeDeleteRsp(Pst *pst, SchUeDeleteRsp *schUeDelRsp); -uint8_t packMacSchCellDeleteReq(Pst *pst, SchCellDelete *schCellDelete); -uint8_t MacSchCellDeleteReq(Pst *pst, SchCellDelete *schCellDelete); +uint8_t packMacSchCellDeleteReq(Pst *pst, SchCellDeleteReq *schCellDelete); +uint8_t MacSchCellDeleteReq(Pst *pst, SchCellDeleteReq *schCellDelete); uint8_t packSchCellDeleteRsp(Pst *pst, SchCellDeleteRsp *schCellDeleteRsp); uint8_t MacProcSchCellDeleteRsp(Pst *pst, SchCellDeleteRsp *schCellDeleteRsp); uint8_t packMacSchSliceCfgReq(Pst *pst, SchSliceCfgReq *cfgReq); uint8_t MacSchSliceCfgReq(Pst *pst, SchSliceCfgReq *schSliceCfgReq); uint8_t packSchSliceCfgRsp(Pst *pst, SchSliceCfgRsp *cfgRsp); uint8_t MacProcSchSliceCfgRsp(Pst *pst, SchSliceCfgRsp *cfgRsp); -uint8_t packMacSchSliceReCfgReq(Pst *pst, SchSliceCfgReq *cfgReq); -uint8_t MacSchSliceReCfgReq(Pst *pst, SchSliceCfgReq *schSliceCfgReq); -uint8_t packSchSliceReCfgRsp(Pst *pst, SchSliceCfgRsp *cfgRsp); -uint8_t MacProcSchSliceReCfgRsp(Pst *pst, SchSliceCfgRsp *sliceReCfgrsp); +uint8_t packMacSchSliceRecfgReq(Pst *pst, SchSliceRecfgReq *recfgReq); +uint8_t MacSchSliceRecfgReq(Pst *pst, SchSliceRecfgReq *schSliceRecfgReq); +uint8_t packSchSliceRecfgRsp(Pst *pst, SchSliceRecfgRsp *schSliceRecfgRsp); +uint8_t MacProcSchSliceRecfgRsp(Pst *pst, SchSliceRecfgRsp *sliceRecfgrsp); uint8_t packMacSchPagingInd(Pst *pst, SchPageInd *pageInd); uint8_t MacSchPagingInd(Pst *pst, SchPageInd *pageInd); uint8_t packSchMacDlPageAlloc(Pst *pst, DlPageAlloc *dlPageAlloc); diff --combined src/cu_stub/cu_f1ap_msg_hdl.c index 6404c4d69,4920f8bc3..530b1fe66 --- a/src/cu_stub/cu_f1ap_msg_hdl.c +++ b/src/cu_stub/cu_f1ap_msg_hdl.c @@@ -24,18 -24,7 +24,18 @@@ #include "ProtocolIE-Field.h" #include "ProtocolExtensionField.h" #include "ProtocolIE-SingleContainer.h" +#include "F1SetupResponse.h" +#include "SuccessfulOutcome.h" +#include "InitiatingMessage.h" +#include "NonDynamic5QIDescriptor.h" +#include "AveragingWindow.h" +#include "MaxDataBurstVolume.h" +#include "Flows-Mapped-To-DRB-Item.h" +#include "SliceSupportItem.h" +#include "ServedPLMNs-Item.h" #include "F1AP-PDU.h" +#include "ULUPTNLInformation-ToBeSetup-Item.h" +#include "ULConfiguration.h" #include "ModulationOrder.h" #include "BandNR.h" #include "UE-CapabilityRAT-Container.h" @@@ -1965,25 -1954,22 +1965,22 @@@ void fillLongCycleOffsetValue(DrxLongCy * ****************************************************************/ void storeDrxCfgInUeCb(struct DRX_ConfigRrc *drxSetup, DrxCfg *drxCfg) { - if(drxSetup) + switch(drxSetup->drx_onDurationTimer.present) { - switch(drxSetup->drx_onDurationTimer.present) - { - case DRX_ConfigRrc__drx_onDurationTimer_PR_NOTHING: + case DRX_ConfigRrc__drx_onDurationTimer_PR_NOTHING: + break; + case DRX_ConfigRrc__drx_onDurationTimer_PR_milliSeconds: + { + drxCfg->drxOnDurationTimer.onDurationTimerValInMs = true; + drxCfg->drxOnDurationTimer.onDurationtimerValue.milliSeconds=drxSetup->drx_onDurationTimer.choice.milliSeconds; break; - case DRX_ConfigRrc__drx_onDurationTimer_PR_milliSeconds: - { - drxCfg->drxOnDurationTimer.onDurationTimerValInMs = true; - drxCfg->drxOnDurationTimer.onDurationtimerValue.milliSeconds=drxSetup->drx_onDurationTimer.choice.milliSeconds; - break; - } - case DRX_ConfigRrc__drx_onDurationTimer_PR_subMilliSeconds: - { - drxCfg->drxOnDurationTimer.onDurationTimerValInMs = false; - drxCfg->drxOnDurationTimer.onDurationtimerValue.subMilliSeconds = drxSetup->drx_onDurationTimer.choice.subMilliSeconds; - break; - } - } + } + case DRX_ConfigRrc__drx_onDurationTimer_PR_subMilliSeconds: + { + drxCfg->drxOnDurationTimer.onDurationTimerValInMs = false; + drxCfg->drxOnDurationTimer.onDurationtimerValue.subMilliSeconds = drxSetup->drx_onDurationTimer.choice.subMilliSeconds; + break; + } } fillLongCycleOffsetValue(&drxCfg->drxLongCycleStartOffset, &drxSetup->drx_LongCycleStartOffset); drxCfg->drxInactivityTimer = drxSetup->drx_InactivityTimer; @@@ -2060,7 -2046,11 +2057,11 @@@ uint8_t extractCellGroupConfig(CuUeCb * case MAC_CellGroupConfig__drx_ConfigRrc_PR_setup: { - storeDrxCfgInUeCb(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc->choice.setup, &ueCb->drxCfg); + if(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc->choice.setup) + { + ueCb->drxCfgPresent = true; + storeDrxCfgInUeCb(cellGrpCfg->mac_CellGroupConfig->drx_ConfigRrc->choice.setup, &ueCb->drxCfg); + } break; } @@@ -10948,14 -10938,18 +10949,18 @@@ uint8_t BuildAndSendUeContextModificati ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest; if(action == MODIFY_UE) - elementCnt = 4; + elementCnt = 5; else if(action == QUERY_CONFIG) elementCnt = 3; else if(action == RRC_RECONFIG_COMPLETE_IND) elementCnt = 3; else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX)) elementCnt = 5; - + + #ifdef NR_DRX + if(DRX_TO_BE_RELEASE) + elementCnt++; + #endif ueContextModifyReq->protocolIEs.list.count = elementCnt; ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *); @@@ -11081,6 -11075,20 +11086,20 @@@ ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true; } + #ifdef NR_DRX + if(DRX_TO_BE_RELEASE) + { + /* DRX Configuration Indicator */ + ieIdx++; + ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRXConfigurationIndicator; + ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore; + ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_DRXConfigurationIndicator; + ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.DRXConfigurationIndicator = DRXConfigurationIndicator_release; + ueCb->drxCfgPresent = false; + memset(&ueCb->drxCfg, 0, sizeof(DrxCfg)); + } + #endif + xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg); /* Encode the F1SetupRequest type as APER */ @@@ -11689,7 -11697,7 +11708,7 @@@ uint8_t procServedCellPlmnList(ServedPL * ****************************************************************/ uint8_t procUeContextModificationResponse(uint32_t duId, F1AP_PDU_t *f1apMsg) { - uint8_t idx=0, duIdx=0; + uint8_t idx=0, duIdx=0, countiX =1; uint8_t duUeF1apId = 0, cuUeF1apId = 0; DuDb *duDb = NULLP; CuUeCb *ueCb = NULLP; @@@ -11775,7 -11783,14 +11794,14 @@@ } } } - + #ifdef NR_DRX + if(countiX == 1) + { + countiX++; + DU_LOG("\nPBORLA INFO --> F1AP: Sending UE Context Modification Request to MODIFY_UE"); + //BuildAndSendUeContextModificationReq(duId, ueCb, MODIFY_UE); + } + #endif return ROK; } diff --combined src/du_app/du_f1ap_msg_hdl.c index fb113b04d,d9151a4d1..dd2e88fe8 --- a/src/du_app/du_f1ap_msg_hdl.c +++ b/src/du_app/du_f1ap_msg_hdl.c @@@ -28,8 -28,6 +28,8 @@@ #include "lkw.x" #include "lrg.x" #include "F1AP-PDU.h" +#include "InitiatingMessage.h" +#include "SuccessfulOutcome.h" #include "du_app_mac_inf.h" #include "du_cfg.h" #include "du_app_rlc_inf.h" @@@ -38,55 -36,7 +38,55 @@@ #include "du_utils.h" #include "du_ue_mgr.h" #include "RAT-Type.h" +#include "NRFreqInfo.h" +#include "NRCGI.h" +#include "TDD-Info.h" +#include "NR-Mode-Info.h" +#include "ServedPLMNs-List.h" +#include "GNB-DU-Served-Cells-List.h" +#include "Served-Cell-Information.h" +#include "ProtocolExtensionContainer.h" +#include "RRC-Version.h" +#include "FDD-Info.h" +#include "FreqBandNrItem.h" +#include "ServedPLMNs-Item.h" +#include "GNB-DU-Served-Cells-Item.h" +#include "SliceSupportItem.h" #include "FeatureSetUplinkPerCC.h" +#include "SliceSupportItem.h" +#include "Served-Cells-To-Modify-Item.h" +#include "Served-Cells-To-Delete-List.h" +#include "Served-Cells-To-Delete-Item.h" +#include "QoSInformation.h" +#include "ULUPTNLInformation-ToBeSetup-List.h" +#include "DRB-Information.h" +#include "DRBs-ToBeSetup-Item.h" +#include "DRBs-ToBeSetupMod-Item.h" +#include "DRBs-ToBeModified-Item.h" +#include "CUtoDURRCInformation.h" +#include "SCell-ToBeSetup-List.h" +#include "SRBs-ToBeSetup-List.h" +#include "DRBs-ToBeSetup-List.h" +#include "SRBs-ToBeSetup-Item.h" +#include "DRBs-ToBeModified-List.h" +#include "RRCContainer.h" +#include "UE-CapabilityRAT-ContainerList.h" +#include "DRBs-Setup-List.h" +#include "CellGroupConfig.h" +#include "ResetAll.h" +#include "ResetType.h" +#include "Cells-to-be-Activated-List.h" +#include "GNB-CU-Name.h" +#include "SRBs-SetupMod-List.h" +#include "DRBs-SetupMod-List.h" +#include "DRBs-ToBeSetupMod-List.h" +#include "PagingCell-Item.h" +#include "PagingCell-list.h" +#include "QoS-Characteristics.h" +#include "ULUPTNLInformation-ToBeSetup-Item.h" +#include "Flows-Mapped-To-DRB-Item.h" +#include "NonDynamic5QIDescriptor.h" +#include "Dynamic5QIDescriptor.h" #include "FeatureSetDownlinkPerCC.h" #include "FeatureSets.h" #include "UE-NR-Capability.h" @@@ -13456,62 -13406,72 +13456,72 @@@ void freeAperDecodeF1UeContextSetupReq( { for(ieIdx = 0; ieIdx < ueSetReq->protocolIEs.list.count; ieIdx++) { - if(ueSetReq->protocolIEs.list.array[ieIdx]) - { - switch(ueSetReq->protocolIEs.list.array[ieIdx]->id) - { - case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID: - break; - case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID: - break; - case ProtocolIE_ID_id_SpCell_ID: - freeAperDecodeNrcgi(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.NRCGI); - break; - case ProtocolIE_ID_id_ServCellIndex: - break; - case ProtocolIE_ID_id_SpCellULConfigured: - break; - case ProtocolIE_ID_id_CUtoDURRCInformation: + if(ueSetReq->protocolIEs.list.array[ieIdx]) + { + switch(ueSetReq->protocolIEs.list.array[ieIdx]->id) + { + case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID: + break; + case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID: + break; + case ProtocolIE_ID_id_SpCell_ID: + freeAperDecodeNrcgi(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.NRCGI); + break; + case ProtocolIE_ID_id_ServCellIndex: + break; + case ProtocolIE_ID_id_SpCellULConfigured: + break; + case ProtocolIE_ID_id_CUtoDURRCInformation: - freeAperDecodeCuToDuInfo(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation); - break; - case ProtocolIE_ID_id_SCell_ToBeSetup_List: + freeAperDecodeCuToDuInfo(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation); + break; + case ProtocolIE_ID_id_SCell_ToBeSetup_List: - freeAperDecodeSplCellList(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.SCell_ToBeSetup_List); - break; - case ProtocolIE_ID_id_SRBs_ToBeSetup_List: + freeAperDecodeSplCellList(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.SCell_ToBeSetup_List); + break; + case ProtocolIE_ID_id_SRBs_ToBeSetup_List: - freeAperDecodeSRBSetup(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.SRBs_ToBeSetup_List); - break; - case ProtocolIE_ID_id_DRBs_ToBeSetup_List: + freeAperDecodeSRBSetup(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.SRBs_ToBeSetup_List); + break; + case ProtocolIE_ID_id_DRBs_ToBeSetup_List: - freeAperDecodeDRBSetup(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.DRBs_ToBeSetup_List); - break; - case ProtocolIE_ID_id_RRCContainer: - { + freeAperDecodeDRBSetup(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.DRBs_ToBeSetup_List); + break; + case ProtocolIE_ID_id_RRCContainer: + { - if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf != NULLP) - { + if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf != NULLP) + { - free(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf); - } - break; - } - case ProtocolIE_ID_id_RRCDeliveryStatusRequest: - break; - case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL: - { - if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.buf) - { - free(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.buf); - } - break; - } - default: - DU_LOG("\nERROR --> F1AP: Invalid event type %ld " ,ueSetReq->protocolIEs.list.array[ieIdx]->id); - } - free(ueSetReq->protocolIEs.list.array[ieIdx]); - } + free(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf); + } + break; + } + case ProtocolIE_ID_id_RRCDeliveryStatusRequest: + break; + case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL: + { + if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.buf) + { + free(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.buf); + } + break; + } + #ifdef NR_DRX + case ProtocolIE_ID_id_DRXCycle: + { + if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.DRXCycle.shortDRXCycleLength) + free(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.DRXCycle.shortDRXCycleLength); + if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.DRXCycle.shortDRXCycleTimer) + free(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.DRXCycle.shortDRXCycleTimer); + break; + } + #endif + default: + DU_LOG("\nERROR --> F1AP: Invalid event type %ld " ,ueSetReq->protocolIEs.list.array[ieIdx]->id); + } + free(ueSetReq->protocolIEs.list.array[ieIdx]); + } } free(ueSetReq->protocolIEs.list.array); } @@@ -13890,50 -13850,52 +13900,52 @@@ void FreeUeContextSetupRsp(F1AP_PDU_t * { if(f1apMsg->choice.successfulOutcome) { - ueSetRsp = &f1apMsg->choice.successfulOutcome->value.choice.\ - UEContextSetupResponse; - if(ueSetRsp->protocolIEs.list.array) - { - for(idx = 0; idx < ueSetRsp->protocolIEs.list.count; idx++) - { - if(ueSetRsp->protocolIEs.list.array[idx]) - { - switch(ueSetRsp->protocolIEs.list.array[idx]->id) - { - case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID: - break; - case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID: - break; - case ProtocolIE_ID_id_DUtoCURRCInformation: - { - CellGroupConfig_t *cellGrpCfg = NULLP; - cellGrpCfg = &ueSetRsp->protocolIEs.list.array[idx]->value.choice.\ - DUtoCURRCInformation.cellGroupConfig; - if(cellGrpCfg->buf != NULLP) - { - DU_FREE(cellGrpCfg->buf, cellGrpCfg->size); - cellGrpCfg = NULLP; - } - break; - } - case ProtocolIE_ID_id_DRBs_Setup_List: - { + ueSetRsp = &f1apMsg->choice.successfulOutcome->value.choice.\ + UEContextSetupResponse; + if(ueSetRsp->protocolIEs.list.array) + { + for(idx = 0; idx < ueSetRsp->protocolIEs.list.count; idx++) + { + if(ueSetRsp->protocolIEs.list.array[idx]) + { + switch(ueSetRsp->protocolIEs.list.array[idx]->id) + { + case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID: + break; + case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID: + break; + case ProtocolIE_ID_id_C_RNTI: + break; + case ProtocolIE_ID_id_DUtoCURRCInformation: + { + CellGroupConfig_t *cellGrpCfg = NULLP; + cellGrpCfg = &ueSetRsp->protocolIEs.list.array[idx]->value.choice.\ + DUtoCURRCInformation.cellGroupConfig; + if(cellGrpCfg->buf != NULLP) + { + DU_FREE(cellGrpCfg->buf, cellGrpCfg->size); + cellGrpCfg = NULLP; + } + break; + } + case ProtocolIE_ID_id_DRBs_Setup_List: + { freeDrbSetupList(&ueSetRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List); break; - } - default: - DU_LOG("\nERROR --> DUAPP: Invalid Id %ld at FreeUeContextSetupRsp()",\ - ueSetRsp->protocolIEs.list.array[idx]->id); - break; - } - DU_FREE(ueSetRsp->protocolIEs.list.array[idx],\ - sizeof(UEContextSetupResponseIEs_t)); - } - } - DU_FREE(ueSetRsp->protocolIEs.list.array, \ - ueSetRsp->protocolIEs.list.size); - } - DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t)); + } + default: + DU_LOG("\nERROR --> DUAPP: Invalid Id %ld at FreeUeContextSetupRsp()",\ + ueSetRsp->protocolIEs.list.array[idx]->id); + break; + } + DU_FREE(ueSetRsp->protocolIEs.list.array[idx],\ + sizeof(UEContextSetupResponseIEs_t)); + } + } + DU_FREE(ueSetRsp->protocolIEs.list.array, \ + ueSetRsp->protocolIEs.list.size); + } + DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t)); } DU_FREE(f1apMsg, sizeof(F1AP_PDU_t)); } @@@ -15990,6 -15952,8 +16002,8 @@@ uint8_t BuildAndSendUeContextModRsp(DuU break; } FreeUeContextModResp(f1apMsg); + //sleep(5); + //BuildAndSendDUConfigUpdate(SERV_CELL_TO_DELETE); return ret; } /******************************************************************* @@@ -16410,6 -16374,13 +16424,13 @@@ uint8_t procF1UeContextModificationReq( } break; } + #ifdef NR_DRX + case ProtocolIE_ID_id_DRXConfigurationIndicator: + { + duUeCb->f1UeDb->duUeCfg.drxConfigIndicatorRelease = true; + break; + } + #endif } } diff --combined src/du_app/du_mgr_main.c index 21312b5b8,0d171a510..d4783923d --- a/src/du_app/du_mgr_main.c +++ b/src/du_app/du_mgr_main.c @@@ -165,7 -165,7 +165,7 @@@ uint8_t setRrmPolicy(RrmPolicyList rrmP } else { - BuildAndSendSliceReCfgReq(duCfgParam.tempSliceCfg.rrmPolicy, duCfgParam.tempSliceCfg.totalRrmPolicy,\ + BuildAndSendSliceRecfgReq(duCfgParam.tempSliceCfg.rrmPolicy, duCfgParam.tempSliceCfg.totalRrmPolicy,\ duCfgParam.tempSliceCfg.totalSliceCount); } } @@@ -548,7 -548,7 +548,7 @@@ uint8_t commonInit( DU_LOG("\nERROR --> DU_APP : System Task creation for DU APP failed"); return RFAILED; } - ODU_SET_THREAD_AFFINITY(&du_app_stsk, SS_AFFINITY_MODE_EXCL, 16, 0); + //ODU_SET_THREAD_AFFINITY(&du_app_stsk, SS_AFFINITY_MODE_EXCL, 16, 0); /* system task for EGTP */ if(ODU_CREATE_TASK(PRIOR0, &egtp_stsk) != ROK) @@@ -556,7 -556,7 +556,7 @@@ DU_LOG("\nERROR --> DU_APP : System Task creation for EGTP failed"); return RFAILED; } - ODU_SET_THREAD_AFFINITY(&egtp_stsk, SS_AFFINITY_MODE_EXCL, 27, 0); + //ODU_SET_THREAD_AFFINITY(&egtp_stsk, SS_AFFINITY_MODE_EXCL, 27, 0); /* system task for RLC_DL and MAC */ if(ODU_CREATE_TASK(PRIOR0, &rlc_mac_cl_stsk) != ROK) @@@ -566,7 -566,7 +566,7 @@@ } pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - ODU_SET_THREAD_AFFINITY(&rlc_mac_cl_stsk, SS_AFFINITY_MODE_EXCL, 18, 0); + //ODU_SET_THREAD_AFFINITY(&rlc_mac_cl_stsk, SS_AFFINITY_MODE_EXCL, 18, 0); /* system task for RLC UL */ if(ODU_CREATE_TASK(PRIOR1, &rlc_ul_stsk) != ROK) @@@ -574,7 -574,7 +574,7 @@@ DU_LOG("\nERROR --> DU_APP : System Task creation for RLC UL failed"); return RFAILED; } - ODU_SET_THREAD_AFFINITY(&rlc_ul_stsk, SS_AFFINITY_MODE_EXCL, 22, 0); + //ODU_SET_THREAD_AFFINITY(&rlc_ul_stsk, SS_AFFINITY_MODE_EXCL, 22, 0); /* system task for SCTP receiver thread */ if(ODU_CREATE_TASK(PRIOR0, &sctp_stsk) != ROK) @@@ -582,7 -582,7 +582,7 @@@ DU_LOG("\nERROR --> DU_APP : System Task creation for SCTP failed"); return RFAILED; } - ODU_SET_THREAD_AFFINITY(&sctp_stsk, SS_AFFINITY_MODE_EXCL, 25, 0); + //ODU_SET_THREAD_AFFINITY(&sctp_stsk, SS_AFFINITY_MODE_EXCL, 25, 0); /* system task for lower-mac receiver thread */ if(ODU_CREATE_TASK(PRIOR0, &lwr_mac_stsk) != ROK) @@@ -590,7 -590,7 +590,7 @@@ DU_LOG("\nERROR --> DU_APP : System Task creation for Lower MAC failed"); return RFAILED; } - ODU_SET_THREAD_AFFINITY(&lwr_mac_stsk, SS_AFFINITY_MODE_EXCL, 21, 0); + //ODU_SET_THREAD_AFFINITY(&lwr_mac_stsk, SS_AFFINITY_MODE_EXCL, 21, 0); #ifndef INTEL_WLS_MEM /* system task for phy stub's slot indication generator thread */