MacUlSlot ulSlot[MAX_SLOTS];
uint16_t numActvUe;
MacUeCfg *ueCfgTmpData[MAX_NUM_UE];
+ MacUeRecfg *ueRecfgTmpData[MAX_NUM_UE];
MacUeCb ueCb[MAX_NUM_UE];
MacCellCfg macCellCfg;
SlotTimingInfo currTime;
uint8_t macProcLongBsr(uint16_t cellId, uint16_t crnti,uint8_t numLcg,\
DataVolInfo dataVolInfo[MAX_NUM_LOGICAL_CHANNEL_GROUPS]);
void freeMacSliceCfgReq(MacSliceCfgReq *cfgReq,Pst *pst);
+void deleteMacRaCb(uint16_t cellIdx, MacUeCb *ueCb);
#endif
/**********************************************************************
End of file
packDuMacUeCfgRsp /* packing for light weight loosly coupled */
};
+MacDuUeRecfgRspFunc macDuUeRecfgRspOpts[] =
+{
+ packDuMacUeRecfgRsp, /* packing for loosely coupled */
+ DuProcMacUeRecfgRsp, /* packing for tightly coupled */
+ packDuMacUeRecfgRsp /* packing for light weight loosly coupled */
+};
+
MacSchModUeConfigReqFunc macSchModUeConfigReqOpts[] =
{
packMacSchModUeConfigReq, /* packing for loosely coupled */
servCellCfg->numDlBwpToAdd = macSpCellCfg.servCellCfg.numDlBwpToAdd;
if(servCellCfg->numDlBwpToAdd > MAX_NUM_BWP)
{
- DU_LOG("\nERROR --> MAC : Number of DL BWP to ADD/MOD [%d] exceeds max limit [%d]",\
+ DU_LOG("\nERROR --> MAC : Number of DL BWP to ADD [%d] exceeds max limit [%d]",\
servCellCfg->numDlBwpToAdd, MAX_NUM_BWP);
return RFAILED;
}
for(idx = 0; idx < servCellCfg->numDlBwpToAdd; idx++)
{
- /* TODO : As of now numDlBwpToAdd = 0 */
+ memcpy(&servCellCfg->dlBwpToAddList[idx], &macSpCellCfg.servCellCfg.dlBwpToAddList[idx], sizeof(DlBwpInfo));
}
-
servCellCfg->firstActvDlBwpId = macSpCellCfg.servCellCfg.firstActvDlBwpId;
servCellCfg->defaultDlBwpId = macSpCellCfg.servCellCfg.defaultDlBwpId;
servCellCfg->bwpInactivityTmr = NULL;
servCellCfg->numUlBwpToAdd = macSpCellCfg.servCellCfg.numUlBwpToAdd;
if(servCellCfg->numUlBwpToAdd > MAX_NUM_BWP)
{
- DU_LOG("\nERROR --> MAC : Number of UL BWP to ADD/MOD [%d] exceeds max limit [%d]",\
+ DU_LOG("\nERROR --> MAC : Number of UL BWP to ADD [%d] exceeds max limit [%d]",\
servCellCfg->numUlBwpToAdd, MAX_NUM_BWP);
return RFAILED;
}
for(idx = 0; idx < servCellCfg->numUlBwpToAdd; idx++)
{
- /* TODO : As of now numDlBwpToAdd = 0 */
+ memcpy(&servCellCfg->ulBwpToAddList[idx], &macSpCellCfg.servCellCfg.ulBwpToAddList[idx], sizeof(UlBwpInfo));
}
servCellCfg->firstActvUlBwpId = macSpCellCfg.servCellCfg.firstActvUlBwpId;
return ROK;
}
+/*******************************************************************
+ *
+ * @brief Fills Sp Cell Reconfig to be sent to scheduler
+ *
+ * @details
+ *
+ * Function : fillSpCellRecfg
+ *
+ * Functionality: Fills Sp Cell Reconfig to be sent to scheduler
+ *
+ * @params[in] macSpCellRecfg : SP cell Recfg at MAC
+ * schSpCellRecfg : SP cell Recfg to be filled
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t fillSpCellRecfg(SpCellRecfg macSpCellRecfg, SchSpCellRecfg *schSpCellRecfg)
+{
+ uint8_t idx;
+ SchServCellRecfgInfo *servCellRecfg;
+
+ schSpCellRecfg->servCellIdx = macSpCellRecfg.servCellIdx;
+ servCellRecfg = &schSpCellRecfg->servCellRecfg;
+
+ /* Fill initial DL BWP */
+ if(fillInitialDlBwp(macSpCellRecfg.servCellCfg.initDlBwp, \
+ &servCellRecfg->initDlBwp) != ROK )
+ {
+ DU_LOG("\nERROR --> MAC : fillInitialDlBwp() failed");
+ return RFAILED;
+ }
+
+ servCellRecfg->numDlBwpToAddOrMod = macSpCellRecfg.servCellCfg.numDlBwpToAddOrMod;
+ if(servCellRecfg->numDlBwpToAddOrMod > MAX_NUM_BWP)
+ {
+ DU_LOG("\nERROR --> MAC : Number of DL BWP to ADD/MOD [%d] exceeds max limit [%d]",\
+ servCellRecfg->numDlBwpToAddOrMod, MAX_NUM_BWP);
+ return RFAILED;
+ }
+ for(idx = 0; idx < servCellRecfg->numDlBwpToAddOrMod; idx++)
+ {
+ memcpy(&servCellRecfg->dlBwpToAddOrModList[idx], &macSpCellRecfg.servCellCfg.dlBwpToAddOrModList[idx], sizeof(DlBwpInfo));
+ }
+ servCellRecfg->numDlBwpToRel = macSpCellRecfg.servCellCfg.numDlBwpToRel;
+ if(servCellRecfg->numDlBwpToRel > MAX_NUM_BWP)
+ {
+ DU_LOG("\nERROR --> MAC : Number of DL BWP to RELEASE [%d] exceeds max limit [%d]",\
+ servCellRecfg->numDlBwpToRel, MAX_NUM_BWP);
+ return RFAILED;
+ }
+ for(idx = 0; idx < servCellRecfg->numDlBwpToRel; idx++)
+ {
+ memcpy(&servCellRecfg->dlBwpToRelList[idx], &macSpCellRecfg.servCellCfg.dlBwpToRelList[idx], sizeof(DlBwpInfo));
+ }
+ servCellRecfg->firstActvDlBwpId = macSpCellRecfg.servCellCfg.firstActvDlBwpId;
+ servCellRecfg->defaultDlBwpId = macSpCellRecfg.servCellCfg.defaultDlBwpId;
+ servCellRecfg->bwpInactivityTmr = NULL;
+ if(macSpCellRecfg.servCellCfg.bwpInactivityTmr)
+ {
+ /* TODO : This is an optional parameter, not filled currently */
+ }
+
+ /* Fill PDSCH serving cell config */
+ if(fillPdschServCellCfg(macSpCellRecfg.servCellCfg.pdschServCellCfg, \
+ &servCellRecfg->pdschServCellCfg) != ROK)
+ {
+ DU_LOG("\nERROR --> MAC : fillPdschServCellCfg() failed");
+ return RFAILED;
+ }
+
+ /* Fill Initail UL BWP */
+ if(fillInitialUlBwp(macSpCellRecfg.servCellCfg.initUlBwp, \
+ &servCellRecfg->initUlBwp) != ROK)
+ {
+ DU_LOG("\nERROR --> MAC : fillInitialUlBwp() failed");
+ return RFAILED;
+ }
+
+ servCellRecfg->numUlBwpToAddOrMod = macSpCellRecfg.servCellCfg.numUlBwpToAddOrMod;
+ if(servCellRecfg->numUlBwpToAddOrMod > MAX_NUM_BWP)
+ {
+ DU_LOG("\nERROR --> MAC : Number of UL BWP to ADD/MOD [%d] exceeds max limit [%d]",\
+ servCellRecfg->numUlBwpToAddOrMod, MAX_NUM_BWP);
+ return RFAILED;
+ }
+ for(idx = 0; idx < servCellRecfg->numUlBwpToAddOrMod; idx++)
+ {
+ memcpy(&servCellRecfg->ulBwpToAddOrModList[idx], &macSpCellRecfg.servCellCfg.ulBwpToAddOrModList[idx], sizeof(UlBwpInfo));
+ }
+ servCellRecfg->numUlBwpToRel = macSpCellRecfg.servCellCfg.numUlBwpToRel;
+ if(servCellRecfg->numUlBwpToRel > MAX_NUM_BWP)
+ {
+ DU_LOG("\nERROR --> MAC : Number of UL BWP to RELEASE [%d] exceeds max limit [%d]",\
+ servCellRecfg->numUlBwpToRel, MAX_NUM_BWP);
+ return RFAILED;
+ }
+ for(idx = 0; idx < servCellRecfg->numUlBwpToRel; idx++)
+ {
+ memcpy(&servCellRecfg->ulBwpToRelList[idx], &macSpCellRecfg.servCellCfg.ulBwpToRelList[idx], sizeof(UlBwpInfo));
+ }
+ servCellRecfg->firstActvUlBwpId = macSpCellRecfg.servCellCfg.firstActvUlBwpId;
+
+ return ROK;
+}
+
/*******************************************************************
*
* @brief Sends UE configuration to Scheduler
*
* ****************************************************************/
-uint8_t sendUeReqToSch(Pst *pst, SchUeCfg *schUeCfg)
+uint8_t sendUeReqToSch(Pst *pst, void *schUeCfg)
{
Pst schPst;
switch(pst->event)
{
case EVENT_MAC_UE_CREATE_REQ:
- FILL_PST_MAC_TO_SCH(schPst, EVENT_ADD_UE_CONFIG_REQ_TO_SCH);
- return(*macSchAddUeConfigReqOpts[schPst.selector])(&schPst, schUeCfg);
-
+ {
+ SchUeCfgReq *schUeCfgReq = NULLP;
+ schUeCfgReq = (SchUeCfgReq *)schUeCfg;
+ FILL_PST_MAC_TO_SCH(schPst, EVENT_ADD_UE_CONFIG_REQ_TO_SCH);
+ return(*macSchAddUeConfigReqOpts[schPst.selector])(&schPst, schUeCfgReq);
+ }
case EVENT_MAC_UE_RECONFIG_REQ:
- FILL_PST_MAC_TO_SCH(schPst, EVENT_MODIFY_UE_CONFIG_REQ_TO_SCH);
- return(*macSchModUeConfigReqOpts[schPst.selector])(&schPst,schUeCfg);
+ {
+ SchUeRecfgReq *schUeRecfgReq = NULLP;
+ schUeRecfgReq = (SchUeRecfgReq *)schUeCfg;
+ FILL_PST_MAC_TO_SCH(schPst, EVENT_MODIFY_UE_CONFIG_REQ_TO_SCH);
+ return(*macSchModUeConfigReqOpts[schPst.selector])(&schPst,schUeRecfgReq);
+ }
default:
- DU_LOG("\nERROR --> Invalid Pst received %d", pst->event);
- return RFAILED;
+ {
+ DU_LOG("\nERROR --> Invalid Pst received %d", pst->event);
+ return RFAILED;
+ }
}
}
uint8_t sdIdx;
uint8_t ret = ROK;
schLcCfg->lcId = macLcCfg->lcId;
- schLcCfg->configType = macLcCfg->configType;
schLcCfg->dlLcCfg.lcp = macLcCfg->dlLcCfg.lcp;
fillSchUlLcCfg(&schLcCfg->ulLcCfg, &macLcCfg->ulLcCfg);
/*******************************************************************
*
- * @brief Fills Logical channel Cfg List to Add/Mod/Del
+ * @brief Fills Logical channel Cfg List to Add
*
* @details
*
* Function : fillSchLcCfgList
*
- * Functionality: Fills Logical channel Cfg List to Add/Mod/Del
+ * Functionality: Fills Logical channel Cfg List to Add
*
* @params[in] MAC UE Cb Cfg , MAC UE Configuration
* @return ROK - success
*
* ****************************************************************/
-uint8_t fillSchLcCfgList(SchUeCfg *schUeCfg, MacUeCfg *ueCfg)
+uint8_t fillSchLcCfgList(SchUeCfgReq *schUeCfg, MacUeCfg *ueCfg)
{
uint8_t lcIdx;
{
if(fillLogicalChannelCfg(&schUeCfg->schLcCfg[lcIdx], &ueCfg->lcCfgList[lcIdx]) != ROK)
{
- DU_LOG("\nERROR --> MAC : fillLogicalChannelCfg() failed for lc Idx[%d]", lcIdx);
- return RFAILED;
+ DU_LOG("\nERROR --> MAC : fillLogicalChannelCfg() failed for lc Idx[%d]", lcIdx);
+ return RFAILED;
}
- schUeCfg->numLcs++;
+ schUeCfg->numLcsToAdd++;
+ }
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Fills Logical channel Recfg List to Add/Mod/Del
+ *
+ * @details
+ *
+ * Function : fillSchLcRecfgList
+ *
+ * Functionality: Fills Logical channel Recfg List to Add/Mod/Del
+ *
+ * @params[in] MAC UE Cb Recfg , MAC UE ReConfiguration
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+
+uint8_t fillSchLcRecfgList(SchUeRecfgReq *schUeRecfg, MacUeRecfg *ueRecfg)
+{
+ uint8_t lcIdx;
+
+ /*LC to ADD*/
+ for(lcIdx = 0; lcIdx < ueRecfg->numLcsToAdd; lcIdx++)
+ {
+ if(fillLogicalChannelCfg(&schUeRecfg->schLcCfgAdd[lcIdx], &ueRecfg->lcCfgAdd[lcIdx]) != ROK)
+ {
+ DU_LOG("\nERROR --> MAC : fillLogicalChannelCfg() failed for lc Idx[%d]", lcIdx);
+ return RFAILED;
+ }
+ schUeRecfg->numLcsToAdd++;
+ }
+ /*LC to DEL*/
+ for(lcIdx = 0; lcIdx < ueRecfg->numLcsToDel; lcIdx++)
+ {
+ schUeRecfg->lcIdToDel[lcIdx] = ueRecfg->lcIdToDel[lcIdx];
+ schUeRecfg->numLcsToDel++;
+ }
+ /*LC to MOD*/
+ for(lcIdx = 0; lcIdx < ueRecfg->numLcsToMod; lcIdx++)
+ {
+ if(fillLogicalChannelCfg(&schUeRecfg->schLcCfgMod[lcIdx], &ueRecfg->lcCfgMod[lcIdx]) != ROK)
+ {
+ DU_LOG("\nERROR --> MAC : fillLogicalChannelCfg() failed for lc Idx[%d]", lcIdx);
+ return RFAILED;
+ }
+ schUeRecfg->numLcsToMod++;
}
return ROK;
}
* RFAILED - failure
*
* ****************************************************************/
-uint8_t fillSchUeCfg(Pst *pst, SchUeCfg *schUeCfg, MacUeCfg *ueCfg)
+uint8_t fillSchUeCfg(SchUeCfgReq *schUeCfg, MacUeCfg *ueCfg)
{
uint8_t ret = ROK;
schUeCfg->cellId = ueCfg->cellId;
schUeCfg->ueId = ueCfg->ueId;
schUeCfg->crnti = ueCfg->crnti;
- schUeCfg->dataTransmissionInfo = ueCfg->transmissionAction;
/* Copy MAC cell group config */
if(ueCfg->macCellGrpCfgPres == true)
{
schUeCfg->ulModInfo.mcsIndex = ueCfg->ulModInfo.mcsIndex;
schUeCfg->ulModInfo.mcsTable = ueCfg->ulModInfo.mcsTable;
- /* Fill sch Lc Cfg to Add/ Mod/ Del */
+ /* Fill sch Lc Cfg to Add*/
ret = fillSchLcCfgList(schUeCfg, ueCfg);
if(ret == RFAILED)
{
return ret;
}
+ return ret;
+}
+
+/*******************************************************************
+ *
+ * @brief Fills and sends UE Re-configuration to Scheduler
+ *
+ * @details
+ *
+ * Function : fillSchUeRecfg
+ *
+ * Functionality: Fills and sends UE Reconfiguration to Scheduler
+ *
+ * @params[in] Ue configuration from DU APP
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t fillSchUeRecfg(SchUeRecfgReq *schUeRecfg, MacUeRecfg *ueRecfg)
+{
+ uint8_t ret = ROK;
+
+ schUeRecfg->cellId = ueRecfg->cellId;
+ schUeRecfg->ueId = ueRecfg->ueId;
+ schUeRecfg->crnti = ueRecfg->crnti;
+ schUeRecfg->dataTransmissionInfo = ueRecfg->transmissionAction;
+ /* Copy MAC cell group config */
+ if(ueRecfg->macCellGrpRecfgPres == true)
+ {
+ schUeRecfg->macCellGrpRecfgPres = true;
+ memset(&schUeRecfg->macCellGrpRecfg, 0, sizeof(SchMacCellGrpCfg));
+ if(fillMacCellGroupCfg(ueRecfg->macCellGrpRecfg, &schUeRecfg->macCellGrpRecfg) != ROK)
+ {
+ DU_LOG("\nERROR --> MAC : fillMacCellGroupRecfg() failed");
+ return RFAILED;
+ }
+ }
+ if(ueRecfg->phyCellGrpRecfgPres == true)
+ {
+ schUeRecfg->phyCellGrpRecfgPres = true;
+ /* Copy Physical cell group config */
+ memset(&schUeRecfg->phyCellGrpRecfg, 0,sizeof(SchPhyCellGrpCfg));
+ if(fillPhyCellGroupCfg(ueRecfg->phyCellGrpRecfg, &schUeRecfg->phyCellGrpRecfg) != ROK)
+ {
+ DU_LOG("\nERROR --> MAC : fillPhyCellGroupRecfg() failed");
+ return RFAILED;
+ }
+ }
+
+ if(ueRecfg->spCellRecfgPres == true)
+ {
+ schUeRecfg->spCellRecfgPres = true;
+ /* Copy sp cell config */
+ memset(&schUeRecfg->spCellRecfg, 0, sizeof(SchSpCellCfg));
+ if(fillSpCellRecfg(ueRecfg->spCellRecfg, &schUeRecfg->spCellRecfg) != ROK)
+ {
+ DU_LOG("\nERROR --> MAC : fillSpCellRecfg() failed");
+ return RFAILED;
+ }
+ }
+ if(ueRecfg->ambrRecfg != NULLP)
+ {
+ MAC_ALLOC(schUeRecfg->ambrRecfg, sizeof(SchAmbrCfg));
+ if(!schUeRecfg->ambrRecfg)
+ {
+ DU_LOG("\nERROR --> MAC : Memory allocation failed in sendReconfigReqToSch");
+ return RFAILED;
+ }
+ schUeRecfg->ambrRecfg->ulBr = ueRecfg->ambrRecfg->ulBr;
+ }
+ else
+ {
+ schUeRecfg->ambrRecfg = NULLP;
+ }
+ /* Fill DL modulation infor */
+ schUeRecfg->dlModInfo.modOrder = ueRecfg->dlModInfo.modOrder;
+ schUeRecfg->dlModInfo.mcsIndex = ueRecfg->dlModInfo.mcsIndex;
+ schUeRecfg->dlModInfo.mcsTable = ueRecfg->dlModInfo.mcsTable;
+
+ /* Fill UL modulation infor */
+ schUeRecfg->ulModInfo.modOrder = ueRecfg->ulModInfo.modOrder;
+ schUeRecfg->ulModInfo.mcsIndex = ueRecfg->ulModInfo.mcsIndex;
+ schUeRecfg->ulModInfo.mcsTable = ueRecfg->ulModInfo.mcsTable;
+
+ /* Fill sch Lc Cfg to Add/ Mod/ Del */
+ ret = fillSchLcRecfgList(schUeRecfg, ueRecfg);
+ if(ret == RFAILED)
+ {
+ DU_LOG("\nERROR --> MAC : Failed to copy LCs at fillSchUeRecfg()");
+ return ret;
+ }
+
#ifdef NR_DRX
- schUeCfg->drxConfigIndicatorRelease = ueCfg->drxConfigIndicatorRelease;;
+ schUeRecfg->drxConfigIndicatorRelease = ueRecfg->drxConfigIndicatorRelease;;
#endif
return ret;
*
* Functionality: Update UeUlCb Lc List
*
- * @params[in] UeUlCb pointer, ueLcCfg(received from DUAPP)
+ * @params[in] UeUlCb pointer [For DEL case, NULL is passed]
+ * ueLcCfg(received from DUAPP)
+ * lcIdToDel [For MOD case, Invalid Value = MAX_NUM_LC is passed]
* @return void
*
* ****************************************************************/
-void updateMacUlLcCtxt(UeUlCb *ulInfo, LcCfg *ueLcCfg)
+void updateMacUlLcCtxt(UeUlCb *ulInfo, LcCfg *ueLcCfg, uint8_t lcIdToDel)
{
uint8_t ueLcIdx = 0;
/*Traversing UL LC to be updated/Deleted*/
for(ueLcIdx = 0; ueLcIdx < ulInfo->numUlLc; ueLcIdx++)
{
- if(ulInfo->lcCb[ueLcIdx].lcId == ueLcCfg->lcId)
+ if((ueLcCfg != NULLP) && (ulInfo->lcCb[ueLcIdx].lcId == ueLcCfg->lcId))
{
- if(ueLcCfg->configType == CONFIG_MOD)
- {
- /*Modify UL LC CB */
- ulInfo->lcCb[ueLcIdx].lcGrpId = ueLcCfg->ulLcCfg.lcGroup;
+ /*Modify UL LC CB */
+ ulInfo->lcCb[ueLcIdx].lcGrpId = ueLcCfg->ulLcCfg.lcGroup;
- /*Commenting as S-NSSAI and PDU session will be stored in MAC DB in future scope*/
+ /*Commenting as S-NSSAI and PDU session will be stored in MAC DB in future scope*/
#if 0
- /*Modifying/Copying PduSession ID and S-NSSAI into MAC's UECB*/
- if(ueLcCfg->drbQos)
+ /*Modifying/Copying PduSession ID and S-NSSAI into MAC's UECB*/
+ if(ueLcCfg->drbQos)
+ {
+ ulInfo->lcCb[ueLcIdx].pduSessionId = ueLcCfg->drbQos->pduSessionId;
+ }
+ if(ueLcCfg->snssai)
+ {
+ if(ulInfo->lcCb[ueLcIdx].snssai == NULLP)
{
- ulInfo->lcCb[ueLcIdx].pduSessionId = ueLcCfg->drbQos->pduSessionId;
+ MAC_ALLOC(ulInfo->lcCb[ueLcIdx].snssai, sizeof(Snssai));
}
- if(ueLcCfg->snssai)
- {
- if(ulInfo->lcCb[ueLcIdx].snssai == NULLP)
- {
- MAC_ALLOC(ulInfo->lcCb[ueLcIdx].snssai, sizeof(Snssai));
- }
- memcpy(ulInfo->lcCb[ueLcIdx].snssai, ueLcCfg->snssai, sizeof(Snssai));
- }
-#endif
- DU_LOG("\nINFO --> MAC: Successfully Modified LC context for lcId[%d], ueLcIdx:%d",\
- ueLcCfg->lcId,ueLcIdx);
- break;
- }
- if(ueLcCfg->configType == CONFIG_DEL)
- {
- memset(&ulInfo->lcCb[ueLcIdx], 0, sizeof(UlLcCb));
- (ulInfo->numUlLc)--;
- updateMacUlCb(ueLcIdx, ulInfo);
- DU_LOG("\nINFO --> MAC: Successfully Deleted LC context for lcId[%d]", ueLcCfg->lcId);
- break;
+ memcpy(ulInfo->lcCb[ueLcIdx].snssai, ueLcCfg->snssai, sizeof(Snssai));
}
+#endif
+ DU_LOG("\nINFO --> MAC: Successfully Modified LC context for lcId[%d], ueLcIdx:%d",\
+ ueLcCfg->lcId,ueLcIdx);
+ break;
+ }
+ else if(lcIdToDel != MAX_NUM_LC && (ulInfo->lcCb[ueLcIdx].lcId == lcIdToDel))
+ {
+ memset(&ulInfo->lcCb[ueLcIdx], 0, sizeof(UlLcCb));
+ (ulInfo->numUlLc)--;
+ updateMacUlCb(ueLcIdx, ulInfo);
+ DU_LOG("\nINFO --> MAC: Successfully Deleted LC context for lcId[%d]", lcIdToDel);
+ break;
}
}
}
*
* Functionality: Update UeDlCb Lc List
*
- * @params[in] UeDlCb pointer, ueLcCfg(received from DUAPP)
+ * @params[in] UeDlCb pointer [For DEL case, NULL is passed]
+ * ueLcCfg(received from DUAPP)
+ * lcIdToDel [For MOD case, Invalid Value = MAX_NUM_LC is passed]
* @return void
*
* ****************************************************************/
-void updateMacDlLcCtxt(UeDlCb *dlInfo, LcCfg *ueLcCfg)
+void updateMacDlLcCtxt(UeDlCb *dlInfo, LcCfg *ueLcCfg, uint8_t lcIdToDel)
{
uint8_t ueLcIdx = 0;
/*Traversing DL LC to be updated/Deleted*/
for(ueLcIdx = 0; ueLcIdx < dlInfo->numDlLc; ueLcIdx++)
{
- if(dlInfo->lcCb[ueLcIdx].lcId == ueLcCfg->lcId)
+ if((ueLcCfg != NULLP) && (dlInfo->lcCb[ueLcIdx].lcId == ueLcCfg->lcId))
{
- if(ueLcCfg->configType == CONFIG_MOD)
- {
- /*Commenting as S-NSSAI and PDU session will be stored in MAC DB in future scope*/
+ /*Commenting as S-NSSAI and PDU session will be stored in MAC DB in future scope*/
#if 0
- /*Modifying/Copying PduSession ID and S-NSSAI into MAC's UECB*/
- if(ueLcCfg->drbQos)
+ /*Modifying/Copying PduSession ID and S-NSSAI into MAC's UECB*/
+ if(ueLcCfg->drbQos)
+ {
+ dlInfo->lcCb[ueLcIdx].pduSessionId = ueLcCfg->drbQos->pduSessionId;
+ }
+ if(ueLcCfg->snssai)
+ {
+ if(dlInfo->lcCb[ueLcIdx].snssai == NULLP)
{
- dlInfo->lcCb[ueLcIdx].pduSessionId = ueLcCfg->drbQos->pduSessionId;
+ MAC_ALLOC(dlInfo->lcCb[ueLcIdx].snssai, sizeof(Snssai));
}
- if(ueLcCfg->snssai)
- {
- if(dlInfo->lcCb[ueLcIdx].snssai == NULLP)
- {
- MAC_ALLOC(dlInfo->lcCb[ueLcIdx].snssai, sizeof(Snssai));
- }
- memcpy(dlInfo->lcCb[ueLcIdx].snssai, ueLcCfg->snssai, sizeof(Snssai));
- }
-#endif
- DU_LOG("\nINFO --> MAC: Successfully Modified LC context for lcId[%d], ueLcIdx:%d",\
- ueLcCfg->lcId,ueLcIdx);
- break;
- }
- if(ueLcCfg->configType == CONFIG_DEL)
- {
- memset(&dlInfo->lcCb[ueLcIdx], 0, sizeof(DlLcCb));
- (dlInfo->numDlLc)--;
- updateMacDlCb(ueLcIdx, dlInfo);
- DU_LOG("\nINFO --> MAC: Successfully Deleted LC context for lcId[%d]", ueLcCfg->lcId);
- break;
+ memcpy(dlInfo->lcCb[ueLcIdx].snssai, ueLcCfg->snssai, sizeof(Snssai));
}
+#endif
+ DU_LOG("\nINFO --> MAC: Successfully Modified LC context for lcId[%d], ueLcIdx:%d",\
+ ueLcCfg->lcId,ueLcIdx);
+ break;
+ }
+ else if(lcIdToDel != MAX_NUM_LC && (dlInfo->lcCb[ueLcIdx].lcId == lcIdToDel))
+ {
+ memset(&dlInfo->lcCb[ueLcIdx], 0, sizeof(DlLcCb));
+ (dlInfo->numDlLc)--;
+ updateMacDlCb(ueLcIdx, dlInfo);
+ DU_LOG("\nINFO --> MAC: Successfully Deleted LC context for lcId[%d]", lcIdToDel);
+ break;
}
}
}
+
/*******************************************************************
*
* @brief Fills Logical channel Cfg List to Add/Mod/Del
{
if(ueCb->dlInfo.numDlLc < MAX_NUM_LC)
{
- if(ueCfg->lcCfgList[lcIdx].configType == CONFIG_ADD)
- {
/*Commenting as S-NSSAI and PDU session will be stored in MAC DB in future scope*/
#if 0
/*Copying PduSession ID and S-NSSAI into MAC's UECB*/
ueCb->ulInfo.lcCb[ueCb->ulInfo.numUlLc].lcGrpId = ueCfg->lcCfgList[lcIdx].ulLcCfg.lcGroup;
ueCb->ulInfo.lcCb[ueCb->ulInfo.numUlLc].lcActive = MAC_LC_STATE_ACTIVE;
ueCb->ulInfo.numUlLc++;
- }/*End of Add Config */
- else
+ }
+ }
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Fills Logical channel Cfg List to Add/Mod/Del
+ *
+ * @details
+ *
+ * Function : updateMacLcCfgList
+ *
+ * Functionality: Fills Logical channel Cfg List to Add/Mod/Del
+ *
+ * @params[in] MAC UE Cb Cfg , MAC UE Configuration
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+
+uint8_t updateMacLcCfgList(MacUeCb *ueCb, MacUeRecfg *ueRecfg)
+{
+ uint8_t lcIdx = 0;
+
+ for(lcIdx = 0; lcIdx < ueRecfg->numLcsToAdd; lcIdx++)
+ {
+ if(ueCb->dlInfo.numDlLc < MAX_NUM_LC)
+ {
+ /*Commenting as S-NSSAI and PDU session will be stored in MAC DB in future scope*/
+#if 0
+ /*Copying PduSession ID and S-NSSAI into MAC's UECB*/
+ if(ueRecfg->lcCfgList[lcIdx].drbQos)
+ {
+ ueCb->dlInfo.lcCb[ueCb->dlInfo.numDlLc].pduSessionId = \
+ ueRecfg->lcCfgList[lcIdx].drbQos->pduSessionId;
+
+ ueCb->ulInfo.lcCb[ueCb->ulInfo.numUlLc].pduSessionId = \
+ ueRecfg->lcCfgList[lcIdx].drbQos->pduSessionId;
+ }
+ if(ueRecfg->lcCfgList[lcIdx].snssai)
{
- updateMacUlLcCtxt(&ueCb->ulInfo, &ueCfg->lcCfgList[lcIdx]);
- updateMacDlLcCtxt(&ueCb->dlInfo, &ueCfg->lcCfgList[lcIdx]);
- }/*End of Mod Config */
+ if(ueCb->dlInfo.lcCb[ueCb->dlInfo.numDlLc].snssai == NULLP)
+ {
+ MAC_ALLOC(ueCb->dlInfo.lcCb[ueCb->dlInfo.numDlLc].snssai, sizeof(Snssai));
+ }
+ if(ueCb->ulInfo.lcCb[ueCb->ulInfo.numUlLc].snssai == NULLP)
+ {
+ MAC_ALLOC(ueCb->ulInfo.lcCb[ueCb->ulInfo.numUlLc].snssai, sizeof(Snssai));
+ }
+
+ memcpy(ueCb->dlInfo.lcCb[ueCb->dlInfo.numDlLc].snssai, \
+ ueRecfg->lcCfgList[lcIdx].snssai, sizeof(Snssai));
+
+ memcpy(ueCb->ulInfo.lcCb[ueCb->ulInfo.numUlLc].snssai, \
+ ueRecfg->lcCfgList[lcIdx].snssai, sizeof(Snssai));
+
+ }
+#endif
+ /*Filling DL LC CB */
+ ueCb->dlInfo.lcCb[ueCb->dlInfo.numDlLc].lcId = ueRecfg->lcCfgAdd[lcIdx].lcId;
+ ueCb->dlInfo.lcCb[ueCb->dlInfo.numDlLc].lcState = MAC_LC_STATE_ACTIVE;
+ ueCb->dlInfo.numDlLc++;
+ /*Filling UL LC CB */
+ ueCb->ulInfo.lcCb[ueCb->ulInfo.numUlLc].lcId = ueRecfg->lcCfgAdd[lcIdx].lcId;
+ ueCb->ulInfo.lcCb[ueCb->ulInfo.numUlLc].lcGrpId = ueRecfg->lcCfgAdd[lcIdx].ulLcCfg.lcGroup;
+ ueCb->ulInfo.lcCb[ueCb->ulInfo.numUlLc].lcActive = MAC_LC_STATE_ACTIVE;
+ ueCb->ulInfo.numUlLc++;
+ }/*End of Add Config */
+ }
+ for(lcIdx = 0; lcIdx < ueRecfg->numLcsToDel; lcIdx++)
+ {
+ if(ueCb->dlInfo.numDlLc < MAX_NUM_LC)
+ {
+ updateMacUlLcCtxt(&ueCb->ulInfo, NULLP, ueRecfg->lcIdToDel[lcIdx]);
+ updateMacDlLcCtxt(&ueCb->dlInfo, NULLP, ueRecfg->lcIdToDel[lcIdx]);
+ }
+ }
+ for(lcIdx = 0; lcIdx < ueRecfg->numLcsToMod; lcIdx++)
+ {
+ if(ueCb->dlInfo.numDlLc < MAX_NUM_LC)
+ {
+ updateMacUlLcCtxt(&ueCb->ulInfo, &ueRecfg->lcCfgMod[lcIdx], MAX_NUM_LC);
+ updateMacDlLcCtxt(&ueCb->dlInfo, &ueRecfg->lcCfgMod[lcIdx], MAX_NUM_LC);
}
}
return ROK;
{
DU_LOG("\nERROR --> MAC: Failed while filing MAC LC List at fillMacUeCb()");
}
- ueCb->transmissionAction = ueCfg->transmissionAction;
+ return ret;
+}
+
+/*******************************************************************
+ *
+ * @brief Fills MAC UE Cb Cfg
+ *
+ * @details
+ *
+ * Function : updateMacUeCb
+ *
+ * Functionality: updateMacUeCbs MAC UE Cb Cfg
+ *
+ * @params[in] MAC UE Cb Recfg , MAC UE Configuration
+ * cellIdx
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+
+uint8_t updateMacUeCb(MacUeCb *ueCb, MacUeRecfg *ueRecfg, uint8_t cellIdx)
+{
+ uint8_t ret = ROK;
+
+ ueCb->ueId = ueRecfg->ueId;
+ ueCb->crnti = ueRecfg->crnti;
+ ueCb->cellCb = macCb.macCell[cellIdx];
+ if(ueRecfg->spCellRecfgPres)
+ {
+ ueCb->dlInfo.dlHarqEnt.numHarqProcs = \
+ ueRecfg->spCellRecfg.servCellCfg.pdschServCellCfg.numHarqProcForPdsch;
+ }
+
+ /*TODO: To check the bsr value during implementation */
+ if(ueRecfg->macCellGrpRecfgPres)
+ {
+ ueCb->bsrTmrCfg.periodicTimer = ueRecfg->macCellGrpRecfg.bsrTmrCfg.periodicTimer;
+ ueCb->bsrTmrCfg.retxTimer = ueRecfg->macCellGrpRecfg.bsrTmrCfg.retxTimer;
+ ueCb->bsrTmrCfg.srDelayTimer = ueRecfg->macCellGrpRecfg.bsrTmrCfg.srDelayTimer;
+ }
+ ret = updateMacLcCfgList(ueCb, ueRecfg);
+ if(ret == RFAILED)
+ {
+ DU_LOG("\nERROR --> MAC: Failed while filing MAC LC List at updateMacUeCb()");
+ }
+ ueCb->transmissionAction = ueRecfg->transmissionAction;
return ret;
}
* RFAILED - failure
*
* ****************************************************************/
-uint8_t modifyUeCb(uint8_t cellIdx, MacUeCb *ueCb, MacUeCfg *ueCfg)
+uint8_t modifyUeCb(uint8_t cellIdx, MacUeCb *ueCb, MacUeRecfg *ueRecfg)
{
uint8_t ret = ROK;
- if((ueCb->ueId == ueCfg->ueId) && (ueCb->crnti == ueCfg->crnti)\
+ if((ueCb->ueId == ueRecfg->ueId) && (ueCb->crnti == ueRecfg->crnti)\
&&(ueCb->state == UE_STATE_ACTIVE))
{
- DU_LOG("\nINFO --> MAC : Modifying Ue config Req for CRNTI %d ", ueCfg->crnti);
- ret = fillMacUeCb(ueCb, ueCfg, cellIdx);
+ DU_LOG("\nINFO --> MAC : Modifying Ue config Req for CRNTI %d ", ueRecfg->crnti);
+ ret = updateMacUeCb(ueCb, ueRecfg, cellIdx);
if(ret != ROK)
{
DU_LOG("\nERROR --> MAC : Failed to modify MacUeCb at modifyUeCb()");
*
* ****************************************************************/
-uint8_t procMacUeCfgData(Pst *pst, MacUeCfg *ueCfg)
+uint8_t procMacUeCfgData(Pst *pst, MacUeCfg *ueCfg, MacUeRecfg *ueRecfg)
{
- uint8_t ret = ROK;
- uint16_t cellIdx;
+ uint8_t ret = ROK, ueId = 0;
+ uint16_t cellIdx, cellId;
MacUeCb *ueCb = NULLP;
+ if(ueCfg != NULLP)
+ {
+ cellId = ueCfg->cellId;
+ ueId = ueCfg->ueId;
+ }
+ else if(ueRecfg != NULLP)
+ {
+ cellId = ueRecfg->cellId;
+ ueId = ueRecfg->ueId;
+ }
+
- GET_CELL_IDX(ueCfg->cellId, cellIdx);
+ GET_CELL_IDX(cellId, cellIdx);
/* Validate cell id */
- if(macCb.macCell[cellIdx]->cellId != ueCfg->cellId)
+ if(macCb.macCell[cellIdx]->cellId != cellId)
{
- DU_LOG("\nERROR --> MAC : Cell Id %d not configured", ueCfg->cellId);
+ DU_LOG("\nERROR --> MAC : Cell Id %d not configured", cellId);
return RFAILED;
}
}
/* Check if UE already configured */
- ueCb = &macCb.macCell[cellIdx]->ueCb[ueCfg->ueId -1];
+ ueCb = &macCb.macCell[cellIdx]->ueCb[ueId -1];
switch(pst->event)
{
case EVENT_UE_RECONFIG_RSP_TO_MAC:
{
- ret = modifyUeCb(cellIdx, ueCb, ueCfg);
+ ret = modifyUeCb(cellIdx, ueCb, ueRecfg);
if(ret != ROK)
DU_LOG("\nERROR --> MAC: ModifyUeConfigReq for cellIdx :%d failed at procMacUeCfgData()", cellIdx);
break;
*
* ****************************************************************/
-uint8_t copyToTmpData(MacUeCfg *ueCfg)
+uint8_t copyToTmpData(MacUeCfg *ueCfg, MacUeRecfg *ueRecfg)
{
uint8_t cellIdx;
- MacUeCfg *tmpData = NULLP;
- MAC_ALLOC(tmpData, sizeof(MacUeCfg));
- if(!tmpData)
+ if(ueCfg != NULLP)
{
- DU_LOG("\nERROR --> MAC: Memory Alloc Failed at copyToTmpData()");
- return RFAILED;
+ MacUeCfg *tmpData = NULLP;
+
+ MAC_ALLOC(tmpData, sizeof(MacUeCfg));
+ if(!tmpData)
+ {
+ DU_LOG("\nERROR --> MAC: Memory Alloc Failed at copyToTmpData()");
+ return RFAILED;
+ }
+ memcpy(tmpData, ueCfg, sizeof(MacUeCfg));
+ GET_CELL_IDX(ueCfg->cellId, cellIdx);
+ macCb.macCell[cellIdx]->ueCfgTmpData[ueCfg->ueId-1] = tmpData;
+ }
+ else if(ueRecfg != NULLP)
+ {
+ MacUeRecfg *tmpData = NULLP;
+
+ MAC_ALLOC(tmpData, sizeof(MacUeRecfg));
+ if(!tmpData)
+ {
+ DU_LOG("\nERROR --> MAC: Memory Alloc Failed at copyToTmpData()");
+ return RFAILED;
+ }
+ memcpy(tmpData, ueRecfg, sizeof(MacUeRecfg));
+ GET_CELL_IDX(ueRecfg->cellId, cellIdx);
+ macCb.macCell[cellIdx]->ueRecfgTmpData[ueRecfg->ueId-1] = tmpData;
}
- memcpy(tmpData, ueCfg, sizeof(MacUeCfg));
- GET_CELL_IDX(ueCfg->cellId, cellIdx);
- macCb.macCell[cellIdx]->ueCfgTmpData[ueCfg->ueId-1] = tmpData;
return ROK;
}
uint8_t MacProcUeCreateReq(Pst *pst, MacUeCfg *ueCfg)
{
uint8_t ret = ROK;
- SchUeCfg schUeCfg;
- memset(&schUeCfg, 0, sizeof(SchUeCfg));
+ SchUeCfgReq schUeCfg;
+ memset(&schUeCfg, 0, sizeof(SchUeCfgReq));
DU_LOG("\nINFO --> MAC : UE Create Request for CRNTI[%d]", ueCfg->crnti);
}
/*Storing received ueCfg in ueCfgTmpData */
- ret = copyToTmpData(ueCfg);
+ ret = copyToTmpData(ueCfg, NULLP);
if(ret == ROK)
{
/*Sending Cfg Req to SCH */
- ret = fillSchUeCfg(pst, &schUeCfg, ueCfg);
+ ret = fillSchUeCfg(&schUeCfg, ueCfg);
if(ret != ROK)
DU_LOG("\nERROR --> MAC : Failed to fill Sch Ue Cfg at MacProcUeCreateReq()");
else
* RFAILED - failure
*
* ****************************************************************/
-uint8_t MacSendUeReconfigRsp(MacRsp result, SchUeCfgRsp *schCfgRsp)
+uint8_t MacSendUeReconfigRsp(MacRsp result, SchUeRecfgRsp *schCfgRsp)
{
- MacUeCfgRsp *cfgRsp;
+ MacUeRecfgRsp *recfgRsp;
Pst rspPst;
- MAC_ALLOC_SHRABL_BUF(cfgRsp, sizeof(MacUeCfgRsp));
- if(!cfgRsp)
+ MAC_ALLOC_SHRABL_BUF(recfgRsp, sizeof(MacUeRecfgRsp));
+ if(!recfgRsp)
{
DU_LOG("\nERROR --> MAC: Memory allocation for UE Reconfig response failed");
return RFAILED;
}
/* Filling UE Config response */
- memset(cfgRsp, 0, sizeof(MacUeCfgRsp));
- cfgRsp->cellId = schCfgRsp->cellId;
- cfgRsp->ueId = schCfgRsp->ueId;
- cfgRsp->result = result;
+ memset(recfgRsp, 0, sizeof(MacUeRecfgRsp));
+ recfgRsp->cellId = schCfgRsp->cellId;
+ recfgRsp->ueId = schCfgRsp->ueId;
+ recfgRsp->result = result;
/* Fill Post structure and send UE Create response*/
memset(&rspPst, 0, sizeof(Pst));
FILL_PST_MAC_TO_DUAPP(rspPst, EVENT_MAC_UE_RECONFIG_RSP);
- return (*macDuUeCfgRspOpts[rspPst.selector])(&rspPst, cfgRsp);
+ return (*macDuUeRecfgRspOpts[rspPst.selector])(&rspPst, recfgRsp);
}
/*******************************************************************
return ueCfg;
}
+/*******************************************************************
+ *
+ * @brief Function to return Mac Ue Recfg pointer
+ *
+ * @details
+ *
+ * Function : getMacUeRecfg
+ *
+ * Functionality:
+ * Function to return Mac Ue Recfg pointer
+ *
+ * @params[in] cellIdx, ueId
+ *
+ * @return MacUeRecfg pointer - success
+ * NULLP - failure
+ *
+ * ****************************************************************/
+
+MacUeRecfg *getMacUeRecfg(uint16_t cellIdx, uint8_t ueId)
+{
+ MacUeRecfg *ueRecfg = NULLP;
+ if(macCb.macCell[cellIdx])
+ {
+ ueRecfg = macCb.macCell[cellIdx]->ueRecfgTmpData[ueId-1];
+ }
+ else
+ {
+ DU_LOG("\nERROR --> MAC: Failed to get macCellCb in getMacUeRecfg()");
+ }
+ return ueRecfg;
+}
+
/*******************************************************************
*
* @brief Processes UE create response from scheduler
break;
}
#endif
-
+
GET_CELL_IDX(schCfgRsp->cellId, cellIdx);
ueCfg = getMacUeCfg(cellIdx, schCfgRsp->ueId);
if(ueCfg == NULLP)
ret = RFAILED;
}
- switch(pst->event)
+ if(schCfgRsp->rsp != RSP_NOK)
{
- case EVENT_UE_CONFIG_RSP_TO_MAC:
+ DU_LOG("\nINFO --> MAC: SCH UeConfigRsp for CRNTI[%d] is success in MacProcSchUeCfgRsp()", schCfgRsp->crnti);
+ if(ret == ROK)
+ {
+ ret = procMacUeCfgData(pst, ueCfg, NULLP);
+ if(ret == ROK)
{
- if(schCfgRsp->rsp != RSP_NOK)
- {
- DU_LOG("\nINFO --> MAC: SCH UeConfigRsp for CRNTI[%d] is success in MacProcSchUeCfgRsp()", schCfgRsp->crnti);
- if(ret == ROK)
- {
- ret = procMacUeCfgData(pst, ueCfg);
- if(ret == ROK)
- {
- result = MAC_DU_APP_RSP_OK;
- }
- }
- }
- else
- {
- DU_LOG("\nERROR --> MAC: SCH UeConfigRsp for CRNTI[%d] is failed in MacProcSchUeCfgRsp()", schCfgRsp->crnti);
- }
- ret = MacSendUeCreateRsp(result, schCfgRsp);
+ result = MAC_DU_APP_RSP_OK;
}
- break;
+ }
+ }
+ else
+ {
+ DU_LOG("\nERROR --> MAC: SCH UeConfigRsp for CRNTI[%d] is failed in MacProcSchUeCfgRsp()", schCfgRsp->crnti);
+ }
+ ret = MacSendUeCreateRsp(result, schCfgRsp);
+ MAC_FREE(ueCfg, sizeof(MacUeCfg));
+ ueCfg = NULLP;
+ return ret;
+}
+
+/*******************************************************************
+ *
+ * @brief Processes UE create response from scheduler
+ *
+ * @details
+ *
+ * Function : MacProcSchUeRecfgRsp
+ *
+ * Functionality:
+ * Processes UE ReConfig response from scheduler
+ * Sends UE Reconfig response to DU APP
+ *
+ * @params[in] Pst : Post structure
+ * schRecfgRsp : Scheduler UE Recfg response
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t MacProcSchUeRecfgRsp(Pst *pst, SchUeRecfgRsp *schRecfgRsp)
+{
+ uint8_t result = MAC_DU_APP_RSP_NOK;
+ uint8_t ret = ROK;
+ uint16_t cellIdx;
+ MacUeRecfg *ueRecfg = NULLP;
+#ifdef CALL_FLOW_DEBUG_LOG
+ switch(pst->event)
+ {
case EVENT_UE_RECONFIG_RSP_TO_MAC:
- {
+ DU_LOG("\nCall Flow: ENTSCH -> ENTMAC : EVENT_UE_RECONFIG_RSP_TO_MAC\n");
+ break;
+ default:
+ DU_LOG("\nCall Flow: ENTSCH -> ENTMAC : Invalid Event\n");
+ break;
+ }
+#endif
- if(schCfgRsp->rsp != RSP_NOK)
- {
- DU_LOG("\nINFO --> MAC: SCH UeReconfigRsp for CRNTI[%d] is success in MacProcSchUeCfgRsp()",\
- schCfgRsp->crnti);
- if(ret == ROK)
- {
- ret = procMacUeCfgData(pst, ueCfg);
- if(ret == ROK)
- {
- result = MAC_DU_APP_RSP_OK;
- }
- }
- }
- else
- {
- DU_LOG("\nERROR --> MAC: SCH UeReconfigRsp for CRNTI[%d] is failed in MacProcSchUeCfgRsp()",\
- schCfgRsp->crnti);
- }
- ret = MacSendUeReconfigRsp(result, schCfgRsp);
+ GET_CELL_IDX(schRecfgRsp->cellId, cellIdx);
+ ueRecfg = getMacUeRecfg(cellIdx, schRecfgRsp->ueId);
+ if(ueRecfg == NULLP)
+ {
+ DU_LOG("\nERROR --> MAC : Failed to find the Mac Ue Cfg for event [%d] in MacProcSchUeCfgRsp()", pst->event);
+ ret = RFAILED;
+ }
+
+
+ if(schRecfgRsp->rsp != RSP_NOK)
+ {
+ DU_LOG("\nINFO --> MAC: SCH UeReconfigRsp for CRNTI[%d] is success in MacProcSchUeCfgRsp()",\
+ schRecfgRsp->crnti);
+ if(ret == ROK)
+ {
+ ret = procMacUeCfgData(pst, NULLP, ueRecfg);
+ if(ret == ROK)
+ {
+ result = MAC_DU_APP_RSP_OK;
}
- break;
+ }
}
- MAC_FREE(ueCfg, sizeof(MacUeCfg));
- ueCfg = NULLP;
+ else
+ {
+ DU_LOG("\nERROR --> MAC: SCH UeReconfigRsp for CRNTI[%d] is failed in MacProcSchUeCfgRsp()",\
+ schRecfgRsp->crnti);
+ }
+ ret = MacSendUeReconfigRsp(result, schRecfgRsp);
+ MAC_FREE(ueRecfg, sizeof(MacUeRecfg));
+ ueRecfg = NULLP;
return ret;
}
* RFAILED - failure
*
* ****************************************************************/
-uint8_t MacProcUeReconfigReq(Pst *pst, MacUeCfg *ueCfg)
+uint8_t MacProcUeReconfigReq(Pst *pst, MacUeRecfg *ueRecfg)
{
uint8_t ret = ROK;
- SchUeCfg schUeCfg;
- memset(&schUeCfg, 0, sizeof(SchUeCfg));
+ SchUeRecfgReq schUeRecfg;
+ memset(&schUeRecfg, 0, sizeof(SchUeRecfgReq));
- DU_LOG("\nINFO --> MAC : UE Reconfig Request for CRNTI[%d]", ueCfg->crnti);
+ DU_LOG("\nINFO --> MAC : UE Reconfig Request for CRNTI[%d]", ueRecfg->crnti);
- if(ueCfg)
+ if(ueRecfg)
{
- /*Storing received ueCfg in ueCfgTmpData */
- ret = copyToTmpData(ueCfg);
+ /*Storing received ueRecfg in ueCfgTmpData */
+ ret = copyToTmpData(NULLP, ueRecfg);
if(ret == ROK)
{
/*Sending Cfg Req to SCH */
- ret = fillSchUeCfg(pst, &schUeCfg, ueCfg);
+ ret = fillSchUeRecfg(&schUeRecfg, ueRecfg);
if(ret != ROK)
DU_LOG("\nERROR --> MAC : Failed to fill sch Ue Cfg at MacProcUeReconfigReq()");
else
{
- /* Fill event and send UE create request to SCH */
- ret = sendUeReqToSch(pst, &schUeCfg);
+ /* Fill event and send UE Reconfiguration request to SCH */
+ ret = sendUeReqToSch(pst, &schUeRecfg);
if(ret != ROK)
DU_LOG("\nERROR --> MAC : Failed to send UE Reconfig Request to SCH");
}
}
else
{
- DU_LOG("\nERROR --> MAC : MAC UE Create request processing failed");
+ DU_LOG("\nERROR --> MAC : MAC UE Reconfiguration request processing failed");
ret = RFAILED;
}
/* FREE shared memory */
- MAC_FREE_SHRABL_BUF(pst->region, pst->pool, ueCfg, sizeof(MacUeCfg));
+ MAC_FREE_SHRABL_BUF(pst->region, pst->pool, ueRecfg, sizeof(MacUeRecfg));
return ROK;
}
bool phyCellGrpCfgPres;
SchPhyCellGrpCfg phyCellGrpCfg;
bool spCellCfgPres;
- SchSpCellCfg spCellCfg;
+ SchSpCellRecfg spCellCfg;
SchAmbrCfg *ambrCfg;
SchModulationInfo dlModInfo;
SchModulationInfo ulModInfo;
return RFAILED;
}
#endif
- if(cell->ueCb[ueIdx].ueCfg.spCellCfg.servCellCfg.initUlBwp.pucchCfgPres)
+ if(cell->ueCb[ueIdx].ueCfg.spCellCfg.servCellRecfg.initUlBwp.pucchCfgPres)
{
/* fill pucch dedicated cfg */
ret = fillUlSchedPucchDedicatedCfg(cell,\
- &cell->ueCb[ueIdx].ueCfg.spCellCfg.servCellCfg.initUlBwp.pucchCfg, &slotInfo, schPucchInfo);
+ &cell->ueCb[ueIdx].ueCfg.spCellCfg.servCellRecfg.initUlBwp.pucchCfg, &slotInfo, schPucchInfo);
if(ret == RFAILED)
{
memset(schPucchInfo, 0, sizeof(SchPucchInfo));
GET_UE_ID(crnti, ueId);
ueCb = cell->ueCb[ueId-1];
- coreset1 = ueCb.ueCfg.spCellCfg.servCellCfg.initDlBwp.pdcchCfg.cRSetToAddModList[0];
- pdschCfg = ueCb.ueCfg.spCellCfg.servCellCfg.initDlBwp.pdschCfg;
+ coreset1 = ueCb.ueCfg.spCellCfg.servCellRecfg.initDlBwp.pdcchCfg.cRSetToAddModList[0];
+ pdschCfg = ueCb.ueCfg.spCellCfg.servCellRecfg.initDlBwp.pdschCfg;
/* fill BWP */
bwp->freqAlloc.numPrb = MAX_NUM_RB;
if(schGetSlotSymbFrmt(dciTime.slot, cell->slotFrmtBitMap) == DL_SLOT)
#endif
{
- if(ueCb->ueCfg.spCellCfg.servCellCfg.initUlBwp.k2TblPrsnt)
- k2InfoTbl = &ueCb->ueCfg.spCellCfg.servCellCfg.initUlBwp.k2InfoTbl;
+ if(ueCb->ueCfg.spCellCfg.servCellRecfg.initUlBwp.k2TblPrsnt)
+ k2InfoTbl = &ueCb->ueCfg.spCellCfg.servCellRecfg.initUlBwp.k2InfoTbl;
else
k2InfoTbl = &cell->cellCfg.schInitialUlBwp.k2InfoTbl;
{
k2Index = k2InfoTbl->k2TimingInfo[dciTime.slot].k2Indexes[k2TblIdx];
- if(!ueCb->ueCfg.spCellCfg.servCellCfg.initUlBwp.k2TblPrsnt)
+ if(!ueCb->ueCfg.spCellCfg.servCellRecfg.initUlBwp.k2TblPrsnt)
{
k2Val = cell->cellCfg.schInitialUlBwp.puschCommon.timeDomRsrcAllocList[k2Index].k2;
startSymb = cell->cellCfg.schInitialUlBwp.puschCommon.timeDomRsrcAllocList[k2Index].startSymbol;
}
else
{
- k2Val = ueCb->ueCfg.spCellCfg.servCellCfg.initUlBwp.puschCfg.timeDomRsrcAllocList[k2Index].k2;
- startSymb = ueCb->ueCfg.spCellCfg.servCellCfg.initUlBwp.puschCfg.timeDomRsrcAllocList[k2Index].startSymbol;
- symbLen = ueCb->ueCfg.spCellCfg.servCellCfg.initUlBwp.puschCfg.timeDomRsrcAllocList[k2Index].symbolLength;
+ k2Val = ueCb->ueCfg.spCellCfg.servCellRecfg.initUlBwp.puschCfg.timeDomRsrcAllocList[k2Index].k2;
+ startSymb = ueCb->ueCfg.spCellCfg.servCellRecfg.initUlBwp.puschCfg.timeDomRsrcAllocList[k2Index].startSymbol;
+ symbLen = ueCb->ueCfg.spCellCfg.servCellRecfg.initUlBwp.puschCfg.timeDomRsrcAllocList[k2Index].symbolLength;
}
/* Check for number of Symbol of PUSCH should be same as original in case of transmisson*/
/* Calculating time frame to send PUSCH for SR */
for(k1TblIdx = 0; k1TblIdx < numK1; k1TblIdx++)
{
k1Index = k0K1InfoTbl->k0k1TimingInfo[dciTime.slot].k0Indexes[k0TblIdx].k1TimingInfo.k1Indexes[k1TblIdx];
- if(cell->raReq[ueId-1]->ueCb->ueCfg.spCellCfg.servCellCfg.initUlBwp.pucchCfg.dlDataToUlAck)
+ if(cell->raReq[ueId-1]->ueCb->ueCfg.spCellCfg.servCellRecfg.initUlBwp.pucchCfg.dlDataToUlAck)
{
- k1 = cell->raReq[ueId-1]->ueCb->ueCfg.spCellCfg.servCellCfg.initUlBwp.pucchCfg.dlDataToUlAck->\
+ k1 = cell->raReq[ueId-1]->ueCb->ueCfg.spCellCfg.servCellRecfg.initUlBwp.pucchCfg.dlDataToUlAck->\
dlDataToUlAckList[k1Index];
}
else
if(dedMsg == true)
{
ueCb = &cell->ueCb[ueId-1];
- k0K1InfoTbl = &ueCb->ueCfg.spCellCfg.servCellCfg.initDlBwp.k0K1InfoTbl;
+ k0K1InfoTbl = &ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.k0K1InfoTbl;
}
else
{
}
else
{
- if(ueCb->ueCfg.spCellCfg.servCellCfg.initDlBwp.pdschCfg.timeDomRsrcAllociList[k0Index].k0 != NULLP)
+ if(ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.pdschCfg.timeDomRsrcAllociList[k0Index].k0 != NULLP)
{
- k0Val = *(ueCb->ueCfg.spCellCfg.servCellCfg.initDlBwp.pdschCfg.timeDomRsrcAllociList[k0Index].k0);
- *pdschStartSymbol = ueCb->ueCfg.spCellCfg.servCellCfg.initDlBwp.pdschCfg.timeDomRsrcAllociList[k0Index].startSymbol;
- *pdschSymblLen = ueCb->ueCfg.spCellCfg.servCellCfg.initDlBwp.pdschCfg.timeDomRsrcAllociList[k0Index].symbolLength;
+ k0Val = *(ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.pdschCfg.timeDomRsrcAllociList[k0Index].k0);
+ *pdschStartSymbol = ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.pdschCfg.timeDomRsrcAllociList[k0Index].startSymbol;
+ *pdschSymblLen = ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.pdschCfg.timeDomRsrcAllociList[k0Index].symbolLength;
}
}
}
else
{
- if(ueCb->ueCfg.spCellCfg.servCellCfg.initUlBwp.pucchCfg.dlDataToUlAck)
+ if(ueCb->ueCfg.spCellCfg.servCellRecfg.initUlBwp.pucchCfg.dlDataToUlAck)
{
- k1Val = ueCb->ueCfg.spCellCfg.servCellCfg.initUlBwp.pucchCfg.dlDataToUlAck->dlDataToUlAckList[k1Index];
+ k1Val = ueCb->ueCfg.spCellCfg.servCellRecfg.initUlBwp.pucchCfg.dlDataToUlAck->dlDataToUlAckList[k1Index];
}
}
ADD_DELTA_TO_TIME((*pdschTime),(*pucchTime), k1Val, cell->numSlots);
}
}
- if(findValidK0K1Value(cell, currTime, ueId, ueCb->ueCfg.spCellCfg.servCellCfg.initDlBwp.k0K1TblPrsnt,\
+ if(findValidK0K1Value(cell, currTime, ueId, ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.k0K1TblPrsnt,\
&pdschStartSymbol, &pdschNumSymbols, &pdcchTime, &pdschTime, &pucchTime, isRetx, *hqP) != true )
{
/* If a valid combination of slots to scheduled PDCCH, PDSCH and PUCCH is
packSchUeCfgRsp /* LWLC */
};
+SchUeRecfgRspFunc SchUeRecfgRspOpts[] =
+{
+ packSchUeRecfgRsp, /* LC */
+ MacProcSchUeRecfgRsp, /* TC */
+ packSchUeRecfgRsp /* LWLC */
+};
+
SchUeDeleteRspFunc SchUeDeleteRspOpts[] =
{
packSchUeDeleteRsp, /* LC */
* RFAILED - failure
*
* ****************************************************************/
-void SchSendUeCfgRspToMac(uint16_t event, SchUeCfg *ueCfg, Inst inst,\
+void SchSendUeCfgRspToMac(SchUeCfgReq *ueCfg, Inst inst,\
SchMacRsp result, SchUeCfgRsp *cfgRsp)
{
Pst rspPst;
/* Filling response post */
memset(&rspPst, 0, sizeof(Pst));
FILL_PST_SCH_TO_MAC(rspPst, inst);
- if(event == EVENT_ADD_UE_CONFIG_REQ_TO_SCH)
- {
- rspPst.event = EVENT_UE_CONFIG_RSP_TO_MAC;
- DU_LOG("\nINFO --> SCH : Sending UE Config response to MAC");
- }
- else if(event == EVENT_MODIFY_UE_CONFIG_REQ_TO_SCH)
- {
- rspPst.event = EVENT_UE_RECONFIG_RSP_TO_MAC;
- DU_LOG("\nINFO --> SCH : Sending UE Reconfig response to MAC");
- }
+ rspPst.event = EVENT_UE_CONFIG_RSP_TO_MAC;
+ DU_LOG("\nINFO --> SCH : Sending UE Config response to MAC");
SchUeCfgRspOpts[rspPst.selector](&rspPst, cfgRsp);
}
+/*******************************************************************
+ *
+ * @brief Fill and send UE Recfg response to MAC
+ *
+ * @details
+ *
+ * Function : SchSendUeRecfgRspToMac
+ *
+ * Functionality: Fill and send UE Recfg response to MAC
+ *
+ * @params[in]
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+void SchSendUeRecfgRspToMac(SchUeRecfgReq *ueRecfgReq, Inst inst,\
+ SchMacRsp result, SchUeRecfgRsp *reCfgRsp)
+{
+ Pst rspPst;
+
+ reCfgRsp->cellId = ueRecfgReq->cellId;
+ reCfgRsp->ueId = ueRecfgReq->ueId;
+ reCfgRsp->crnti = ueRecfgReq->crnti;
+ reCfgRsp->rsp = result;
+
+ /* Filling response post */
+ memset(&rspPst, 0, sizeof(Pst));
+ 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);
+}
+
/*******************************************************************
*
/*******************************************************************
*
- * @brief Function to fill SchUeCb
+ * @brief Function to fill SpCellCfg in SchUeCb From SchUeCfg Req
*
* @details
*
- * Function : fillSchUeCb
+ * Function : fillSpCellInSchCb
+ *
+ * Functionality: Function to fill SpCellCfg in SchUeCb
+ *
+ * @params[in] Scheduler instance,
+ * SchUeCb pointer,
+ * SchUeCfg pointer
+ * @return ROK/RFAILED
+ *
+ * ****************************************************************/
+
+void fillSpCellInSchCb(SchSpCellRecfg *destSpCellCfg, SchSpCellCfg *srcSpCellCfg)
+{
+ destSpCellCfg->servCellIdx = srcSpCellCfg->servCellIdx;
+ memcpy(&destSpCellCfg->servCellRecfg.initDlBwp, &srcSpCellCfg->servCellCfg.initDlBwp, sizeof(SchInitalDlBwp));
+ destSpCellCfg->servCellRecfg.numDlBwpToAddOrMod = srcSpCellCfg->servCellCfg.numDlBwpToAdd;
+ if(destSpCellCfg->servCellRecfg.numDlBwpToAddOrMod > 0)
+ {
+ memcpy(destSpCellCfg->servCellRecfg.dlBwpToAddOrModList, srcSpCellCfg->servCellCfg.dlBwpToAddList,\
+ (sizeof(SchDlBwpInfo) * srcSpCellCfg->servCellCfg.numDlBwpToAdd));
+ }
+ destSpCellCfg->servCellRecfg.firstActvDlBwpId = srcSpCellCfg->servCellCfg.firstActvDlBwpId;
+ destSpCellCfg->servCellRecfg.defaultDlBwpId = srcSpCellCfg->servCellCfg.defaultDlBwpId;
+ destSpCellCfg->servCellRecfg.bwpInactivityTmr = srcSpCellCfg->servCellCfg.bwpInactivityTmr;
+ memcpy(&destSpCellCfg->servCellRecfg.pdschServCellCfg, &srcSpCellCfg->servCellCfg.pdschServCellCfg, sizeof(SchPdschServCellCfg));
+ memcpy(&destSpCellCfg->servCellRecfg.initUlBwp, &srcSpCellCfg->servCellCfg.initUlBwp, sizeof(SchInitialUlBwp));
+
+ destSpCellCfg->servCellRecfg.numDlBwpToAddOrMod = srcSpCellCfg->servCellCfg.numDlBwpToAdd;
+ if(destSpCellCfg->servCellRecfg.numDlBwpToAddOrMod > 0)
+ {
+ memcpy(destSpCellCfg->servCellRecfg.ulBwpToAddOrModList, srcSpCellCfg->servCellCfg.ulBwpToAddList,\
+ (sizeof(SchUlBwpInfo) * srcSpCellCfg->servCellCfg.numUlBwpToAdd));
+ }
+ destSpCellCfg->servCellRecfg.firstActvUlBwpId = srcSpCellCfg->servCellCfg.firstActvUlBwpId;
+ return;
+}
+
+/*******************************************************************
+ *
+ * @brief Function to fill SchUeCb From UeCfg Req
+ *
+ * @details
+ *
+ * Function : fillSchUeCbFrmCfgReq
*
* Functionality: Function to fill SchUeCb
*
*
* ****************************************************************/
-uint8_t fillSchUeCb(Inst inst, SchUeCb *ueCb, SchUeCfg *ueCfg)
+uint8_t fillSchUeCbFrmCfgReq(Inst inst, SchUeCb *ueCb, SchUeCfgReq *ueCfg)
{
uint8_t lcIdx, ueLcIdx, idx;
uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
ueCb->ueCfg.cellId = ueCfg->cellId;
ueCb->ueCfg.ueId = ueCfg->ueId;
ueCb->ueCfg.crnti = ueCfg->crnti;
- ueCb->ueCfg.dataTransmissionAction = ueCfg->dataTransmissionInfo;
if(ueCfg->macCellGrpCfgPres == true)
{
memcpy(&ueCb->ueCfg.macCellGrpCfg , &ueCfg->macCellGrpCfg, sizeof(SchMacCellGrpCfg));
ueCb->ueDrxInfoPres = true;
/* intialize the drxUeCb */
schInitDrxUeCb(ueCb);
-
+
/* intialize the Dl drxHarqCb */
for(idx =0; idx<ueCb->dlHqEnt.numHqPrcs; idx++)
{
#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));
{
if(ueCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfgPres == true)
{
- if(ueCb->ueCfg.spCellCfgPres && ueCb->ueCfg.spCellCfg.servCellCfg.initDlBwp.pdschCfgPres == true)
+ if(ueCb->ueCfg.spCellCfgPres && ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.pdschCfgPres == true)
{
for(idx = 0; idx < ueCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg.numTimeDomRsrcAlloc; idx++)
{
- if(ueCb->ueCfg.spCellCfg.servCellCfg.initDlBwp.pdschCfg.timeDomRsrcAllociList[idx].k0 && ueCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg.timeDomRsrcAllociList[idx].k0)
+ if(ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.pdschCfg.timeDomRsrcAllociList[idx].k0 && ueCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg.timeDomRsrcAllociList[idx].k0)
{
- SCH_FREE(ueCb->ueCfg.spCellCfg.servCellCfg.initDlBwp.pdschCfg.timeDomRsrcAllociList[idx].k0, sizeof(uint8_t));
+ SCH_FREE(ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.pdschCfg.timeDomRsrcAllociList[idx].k0, sizeof(uint8_t));
}
}
}
}
- memcpy(&ueCb->ueCfg.spCellCfg , &ueCfg->spCellCfg, sizeof(SchSpCellCfg));
+ fillSpCellInSchCb(&ueCb->ueCfg.spCellCfg, &ueCfg->spCellCfg);
- covertFreqDomRsrcMapToIAPIFormat(ueCb->ueCfg.spCellCfg.servCellCfg.initDlBwp.pdcchCfg.cRSetToAddModList[0].freqDomainRsrc,\
+ covertFreqDomRsrcMapToIAPIFormat(ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.pdcchCfg.cRSetToAddModList[0].freqDomainRsrc,\
freqDomainResource);
- memset(ueCb->ueCfg.spCellCfg.servCellCfg.initDlBwp.pdcchCfg.cRSetToAddModList[0].freqDomainRsrc, 0, FREQ_DOM_RSRC_SIZE);
- memcpy(ueCb->ueCfg.spCellCfg.servCellCfg.initDlBwp.pdcchCfg.cRSetToAddModList[0].freqDomainRsrc, freqDomainResource, FREQ_DOM_RSRC_SIZE);
+ 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(dlDataToUlAck)
{
- BuildK0K1Table(ueCb->cellCb, &ueCb->ueCfg.spCellCfg.servCellCfg.initDlBwp.k0K1InfoTbl, false, pdschCfg,\
+ BuildK0K1Table(ueCb->cellCb, &ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.k0K1InfoTbl, false, pdschCfg,\
ueCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg, dlDataToUlAck->dlDataToUlAckListCount,\
dlDataToUlAck->dlDataToUlAckList);
- ueCb->ueCfg.spCellCfg.servCellCfg.initDlBwp.k0K1TblPrsnt = true;
+ ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.k0K1TblPrsnt = true;
BuildK2InfoTable(ueCb->cellCb, ueCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg.timeDomRsrcAllocList,\
ueCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg.numTimeDomRsrcAlloc,\
- NULLP, &ueCb->ueCfg.spCellCfg.servCellCfg.initUlBwp.k2InfoTbl);
- ueCb->ueCfg.spCellCfg.servCellCfg.initUlBwp.k2TblPrsnt = true;
+ NULLP, &ueCb->ueCfg.spCellCfg.servCellRecfg.initUlBwp.k2InfoTbl);
+ ueCb->ueCfg.spCellCfg.servCellRecfg.initUlBwp.k2TblPrsnt = true;
}
}
}
memcpy(&ueCb->ueCfg.dlModInfo, &ueCfg->dlModInfo , sizeof(SchModulationInfo));
memcpy(&ueCb->ueCfg.ulModInfo, &ueCfg->ulModInfo , sizeof(SchModulationInfo));
//Updating SchUlCb and SchDlCb DB in SchUeCb
- for(lcIdx = 0; lcIdx < ueCfg->numLcs; lcIdx++)
+ for(lcIdx = 0; lcIdx < ueCfg->numLcsToAdd; lcIdx++)
{
isLcIdValid = FALSE; /*Re-Initializing*/
DU_LOG("ERROR --> SCH: LCID:%d is not Valid",ueLcIdx);
continue;
}
- if(ueCfg->schLcCfg[lcIdx].configType == CONFIG_ADD)
+ fillSchUlLcCtxt(&ueCb->ulInfo.ulLcCtxt[ueLcIdx], &ueCfg->schLcCfg[lcIdx]);
+ fillSchDlLcCtxt(&ueCb->dlInfo.dlLcCtxt[ueLcIdx], &ueCfg->schLcCfg[lcIdx]);
+
+ /*Checking whether this LC belong to Dedicated S-NSSAI
+ * and Create the Dedicated LC List & Update the Reserve PRB number*/
+ if(ueCb->dlInfo.dlLcCtxt[ueLcIdx].snssai != NULLP)
+ {
+ retDL = updateDedLcInfo(inst, ueCb->dlInfo.dlLcCtxt[ueLcIdx].snssai, &(ueCb->dlInfo.dlLcCtxt[ueLcIdx].rsvdDedicatedPRB),\
+ &(ueCb->dlInfo.dlLcCtxt[ueLcIdx].isDedicated));
+ }
+ if(ueCb->ulInfo.ulLcCtxt[ueLcIdx].snssai != NULLP)
+ {
+ retUL = updateDedLcInfo(inst, ueCb->ulInfo.ulLcCtxt[ueLcIdx].snssai, &(ueCb->ulInfo.ulLcCtxt[ueLcIdx].rsvdDedicatedPRB),\
+ &(ueCb->ulInfo.ulLcCtxt[ueLcIdx].isDedicated));
+ }
+
+ if(retUL == RFAILED || retDL == RFAILED)/*FATAL error*/
{
- fillSchUlLcCtxt(&ueCb->ulInfo.ulLcCtxt[ueLcIdx], &ueCfg->schLcCfg[lcIdx]);
- fillSchDlLcCtxt(&ueCb->dlInfo.dlLcCtxt[ueLcIdx], &ueCfg->schLcCfg[lcIdx]);
+ DU_LOG("\nERROR --> SCH : Failure in updateDedLcInfo");
+ return RFAILED;
+ }
+ SCH_FREE(ueCfg->schLcCfg[lcIdx].drbQos, sizeof(SchDrbQosInfo));
+ SCH_FREE(ueCfg->schLcCfg[lcIdx].snssai, sizeof(Snssai));
- /*Checking whether this LC belong to Dedicated S-NSSAI
- * and Create the Dedicated LC List & Update the Reserve PRB number*/
- if(ueCb->dlInfo.dlLcCtxt[ueLcIdx].snssai != NULLP)
+ }/* End of outer for loop */
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Function to fill SchUeCb From UeReconfig Req
+ *
+ * @details
+ *
+ * Function : fillSchUeCbFrmRecfgReq
+ *
+ * Functionality: Function to fill SchUeCb
+ *
+ * @params[in] Scheduler instance,
+ * SchUeCb pointer,
+ * SchUeCfg pointer
+ * @return ROK/RFAILED
+ *
+ * ****************************************************************/
+
+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;
+ bool isLcIdValid = FALSE;
+
+
+ ueCb->ueCfg.cellId = ueRecfg->cellId;
+ ueCb->ueCfg.ueId = ueRecfg->ueId;
+ ueCb->ueCfg.crnti = ueRecfg->crnti;
+ ueCb->ueCfg.dataTransmissionAction = ueRecfg->dataTransmissionInfo;
+ if(ueRecfg->macCellGrpRecfgPres == true)
+ {
+ memcpy(&ueCb->ueCfg.macCellGrpCfg , &ueRecfg->macCellGrpRecfg, sizeof(SchMacCellGrpCfg));
+ ueCb->ueCfg.macCellGrpCfgPres = true;
+#ifdef NR_DRX
+ if(ueRecfg->macCellGrpRecfg.drxCfgPresent == true)
+ {
+ if(ueCb->ueDrxInfoPres == false)
{
- retDL = updateDedLcInfo(inst, ueCb->dlInfo.dlLcCtxt[ueLcIdx].snssai, &(ueCb->dlInfo.dlLcCtxt[ueLcIdx].rsvdDedicatedPRB),\
- &(ueCb->dlInfo.dlLcCtxt[ueLcIdx].isDedicated));
+ ueCb->ueDrxInfoPres = true;
+ /* intialize the drxUeCb */
+ schInitDrxUeCb(ueCb);
+
+ /* intialize the Dl drxHarqCb */
+ for(idx =0; idx<ueCb->dlHqEnt.numHqPrcs; idx++)
+ {
+ schInitDrxHarqCb(&ueCb->dlHqEnt.procs[idx].dlDrxHarqCb);
+ }
+ /* intialize the Ul drxHarqCb */
+ for(idx =0; idx<ueCb->ulHqEnt.numHqPrcs; idx++)
+ {
+ 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);
+ /* 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);
+
}
- if(ueCb->ulInfo.ulLcCtxt[ueLcIdx].snssai != NULLP)
+ else
{
- retUL = updateDedLcInfo(inst, ueCb->ulInfo.ulLcCtxt[ueLcIdx].snssai, &(ueCb->ulInfo.ulLcCtxt[ueLcIdx].rsvdDedicatedPRB),\
- &(ueCb->ulInfo.ulLcCtxt[ueLcIdx].isDedicated));
- }
+ /* 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);
- if(retUL == RFAILED || retDL == RFAILED)/*FATAL error*/
- {
- DU_LOG("\nERROR --> SCH : Failure in updateDedLcInfo");
- return RFAILED;
+ /* Recalculate/Restart timer based on their presence */
+ schDrxUeReCfgTimer(ueCb->cellCb, ueCb);
}
}
- else
+#endif
+ }
+
+#ifdef NR_DRX
+ if(ueRecfg->drxConfigIndicatorRelease == true)
+ {
+ if(ueCb->ueDrxInfoPres == true)
{
- if(ueCb->ulInfo.ulLcCtxt[ueLcIdx].lcId == ueCfg->schLcCfg[lcIdx].lcId)
+ schDeleteUeDrxInfo(ueCb->cellCb, ueCb);
+ ueCb->ueDrxInfoPres = false;
+ }
+ }
+#endif
+
+ if(ueRecfg->phyCellGrpRecfgPres == true)
+ {
+ memcpy(&ueCb->ueCfg.phyCellGrpCfg , &ueRecfg->phyCellGrpRecfg, sizeof(SchPhyCellGrpCfg));
+ ueCb->ueCfg.phyCellGrpCfgPres = true;
+ }
+
+ if(ueRecfg->spCellRecfgPres == true)
+ {
+ if(ueRecfg->spCellRecfg.servCellRecfg.initDlBwp.pdschCfgPres == true)
+ {
+ if(ueCb->ueCfg.spCellCfgPres && ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.pdschCfgPres == true)
{
- if(ueCfg->schLcCfg[lcIdx].configType == CONFIG_MOD)
+ for(idx = 0; idx < ueRecfg->spCellRecfg.servCellRecfg.initDlBwp.pdschCfg.numTimeDomRsrcAlloc; idx++)
{
- fillSchUlLcCtxt(&ueCb->ulInfo.ulLcCtxt[ueLcIdx], &ueCfg->schLcCfg[lcIdx]);
- /*Updating the RRM reserved pool PRB count*/
- if(ueCb->ulInfo.ulLcCtxt[ueLcIdx].snssai != NULLP)
+ if(ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.pdschCfg.timeDomRsrcAllociList[idx].k0 && ueRecfg->spCellRecfg.servCellRecfg.initDlBwp.pdschCfg.timeDomRsrcAllociList[idx].k0)
{
- retUL = updateDedLcInfo(inst, ueCb->ulInfo.ulLcCtxt[ueLcIdx].snssai, &(ueCb->ulInfo.ulLcCtxt[ueLcIdx].rsvdDedicatedPRB),\
- &(ueCb->ulInfo.ulLcCtxt[ueLcIdx].isDedicated));
- }
- if(retUL == RFAILED)
- {
- DU_LOG("\nERROR --> SCH : Failed in updating Ded Lc info");
- return RFAILED;
+ SCH_FREE(ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.pdschCfg.timeDomRsrcAllociList[idx].k0, sizeof(uint8_t));
}
}
- if(ueCfg->schLcCfg[lcIdx].configType == CONFIG_DEL)
- {
- /*Delete the LC node from the UL LC List*/
- if(ueCb->ulInfo.ulLcCtxt[ueLcIdx].isDedicated)
- {
- /*Remove from HARQ Transmission or retransmission*/
- }
- else/*Default LC list*/
- {
+ }
+ }
+ memcpy(&ueCb->ueCfg.spCellCfg , &ueRecfg->spCellRecfg, sizeof(SchSpCellRecfg));
- }
- SCH_FREE(ueCb->ulInfo.ulLcCtxt[ueLcIdx].snssai, sizeof(Snssai));
- memset(&ueCb->ulInfo.ulLcCtxt[ueLcIdx], 0, sizeof(SchUlLcCtxt));
- }
- }/*End of UL LC Ctxt*/
+ 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);
- if(ueCb->dlInfo.dlLcCtxt[ueLcIdx].lcId == ueCfg->schLcCfg[lcIdx].lcId)
+ ueCb->ueCfg.spCellCfgPres = true;
+ dlDataToUlAck = ueRecfg->spCellRecfg.servCellRecfg.initUlBwp.pucchCfg.dlDataToUlAck;
+ if(ueCb->cellCb)
+ {
+ if(dlDataToUlAck)
{
- if(ueCfg->schLcCfg[lcIdx].configType == CONFIG_MOD)
- {
- fillSchDlLcCtxt(&ueCb->dlInfo.dlLcCtxt[ueLcIdx], &ueCfg->schLcCfg[lcIdx]);
- /*Updating the RRM policy*/
- if(ueCb->dlInfo.dlLcCtxt[ueLcIdx].snssai != NULLP)
- {
- retDL = updateDedLcInfo(inst, ueCb->dlInfo.dlLcCtxt[ueLcIdx].snssai, &(ueCb->dlInfo.dlLcCtxt[ueLcIdx].rsvdDedicatedPRB), \
- &(ueCb->dlInfo.dlLcCtxt[ueLcIdx].isDedicated));
- }
- if(retDL == RFAILED)
- {
- DU_LOG("\nERROR --> SCH : Failed in updating Ded Lc info");
- return RFAILED;
- }
- }
- if(ueCfg->schLcCfg[lcIdx].configType == CONFIG_DEL)
- {
- /*Delete the LC node from the DL LC List*/
- if(ueCb->dlInfo.dlLcCtxt[ueLcIdx].isDedicated)
- {
- /*Remove from HARQ Transmission or retransmission*/
- }
- else
- {
- }
- SCH_FREE(ueCb->dlInfo.dlLcCtxt[ueLcIdx].snssai, sizeof(Snssai));
- memset(&ueCb->dlInfo.dlLcCtxt[ueLcIdx], 0, sizeof(SchDlLcCtxt));
- }
- }/*End of DL LC ctxt*/
+ BuildK0K1Table(ueCb->cellCb, &ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.k0K1InfoTbl, false, pdschCfg,\
+ ueRecfg->spCellRecfg.servCellRecfg.initDlBwp.pdschCfg, dlDataToUlAck->dlDataToUlAckListCount,\
+ dlDataToUlAck->dlDataToUlAckList);
+ ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.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;
+ }
}
+ }
- SCH_FREE(ueCfg->schLcCfg[lcIdx].drbQos, sizeof(SchDrbQosInfo));
- SCH_FREE(ueCfg->schLcCfg[lcIdx].snssai, sizeof(Snssai));
+ if(ueRecfg->ambrRecfg)
+ {
+ SCH_FREE(ueCb->ueCfg.ambrCfg, sizeof(SchAmbrCfg));
+ ueCb->ueCfg.ambrCfg = ueRecfg->ambrRecfg;
+ }
+ memcpy(&ueCb->ueCfg.dlModInfo, &ueRecfg->dlModInfo , sizeof(SchModulationInfo));
+ memcpy(&ueCb->ueCfg.ulModInfo, &ueRecfg->ulModInfo , sizeof(SchModulationInfo));
+ //Updating Num of LC to ADD SchUlCb and SchDlCb DB in SchUeCb
+ for(lcIdx = 0; lcIdx < ueRecfg->numLcsToAdd; lcIdx++)
+ {
+ isLcIdValid = FALSE; /*Re-Initializing*/
+
+ ueLcIdx = ueRecfg->schLcCfgAdd[lcIdx].lcId;
+ CHECK_LCID(ueLcIdx, isLcIdValid);
+ if(isLcIdValid == FALSE)
+ {
+ DU_LOG("ERROR --> SCH: LCID:%d is not Valid",ueLcIdx);
+ continue;
+ }
+ fillSchUlLcCtxt(&ueCb->ulInfo.ulLcCtxt[ueLcIdx], &ueRecfg->schLcCfgAdd[lcIdx]);
+ fillSchDlLcCtxt(&ueCb->dlInfo.dlLcCtxt[ueLcIdx], &ueRecfg->schLcCfgAdd[lcIdx]);
+
+ /*Checking whether this LC belong to Dedicated S-NSSAI
+ * and Create the Dedicated LC List & Update the Reserve PRB number*/
+ if(ueCb->dlInfo.dlLcCtxt[ueLcIdx].snssai != NULLP)
+ {
+ retDL = updateDedLcInfo(inst, ueCb->dlInfo.dlLcCtxt[ueLcIdx].snssai, &(ueCb->dlInfo.dlLcCtxt[ueLcIdx].rsvdDedicatedPRB),\
+ &(ueCb->dlInfo.dlLcCtxt[ueLcIdx].isDedicated));
+ }
+ if(ueCb->ulInfo.ulLcCtxt[ueLcIdx].snssai != NULLP)
+ {
+ retUL = updateDedLcInfo(inst, ueCb->ulInfo.ulLcCtxt[ueLcIdx].snssai, &(ueCb->ulInfo.ulLcCtxt[ueLcIdx].rsvdDedicatedPRB),\
+ &(ueCb->ulInfo.ulLcCtxt[ueLcIdx].isDedicated));
+ }
+ if(retUL == RFAILED || retDL == RFAILED)/*FATAL error*/
+ {
+ DU_LOG("\nERROR --> SCH : Failure in updateDedLcInfo");
+ return RFAILED;
+ }
+ SCH_FREE(ueRecfg->schLcCfgAdd[lcIdx].drbQos, sizeof(SchDrbQosInfo));
+ SCH_FREE(ueRecfg->schLcCfgAdd[lcIdx].snssai, sizeof(Snssai));
+ }
+ //Updating Num of LC to DEL SchUlCb and SchDlCb DB in SchUeCb
+ for(lcIdx = 0; lcIdx < ueRecfg->numLcsToDel; lcIdx++)
+ {
+ ueLcIdx = ueRecfg->lcIdToDel[lcIdx];
+
+ if(ueCb->dlInfo.dlLcCtxt[ueLcIdx].lcId == ueRecfg->lcIdToDel[lcIdx])
+ {
+ /*Delete the LC node from the DL LC List*/
+ if(ueCb->dlInfo.dlLcCtxt[ueLcIdx].isDedicated)
+ {
+ /*Remove from HARQ Transmission or retransmission*/
+ }
+ else
+ {
+ }
+ SCH_FREE(ueCb->dlInfo.dlLcCtxt[ueLcIdx].snssai, sizeof(Snssai));
+ memset(&ueCb->dlInfo.dlLcCtxt[ueLcIdx], 0, sizeof(SchDlLcCtxt));
+ }
+ if(ueCb->ulInfo.ulLcCtxt[ueLcIdx].lcId == ueRecfg->lcIdToDel[lcIdx])
+ {
+ /*Delete the LC node from the UL LC List*/
+ if(ueCb->ulInfo.ulLcCtxt[ueLcIdx].isDedicated)
+ {
+ /*Remove from HARQ Transmission or retransmission*/
+ }
+ else/*Default LC list*/
+ {
+
+ }
+ SCH_FREE(ueCb->ulInfo.ulLcCtxt[ueLcIdx].snssai, sizeof(Snssai));
+ memset(&ueCb->ulInfo.ulLcCtxt[ueLcIdx], 0, sizeof(SchUlLcCtxt));
+ }
+ }
+ //Updating Num of LC to DEL SchUlCb and SchDlCb DB in SchUeCb
+ for(lcIdx = 0; lcIdx < ueRecfg->numLcsToMod; lcIdx++)
+ {
+ ueLcIdx = ueRecfg->schLcCfgMod[lcIdx].lcId;
+
+ if(ueCb->ulInfo.ulLcCtxt[ueLcIdx].lcId == ueRecfg->schLcCfgMod[lcIdx].lcId)
+ {
+ fillSchUlLcCtxt(&ueCb->ulInfo.ulLcCtxt[ueLcIdx], &ueRecfg->schLcCfgMod[lcIdx]);
+ /*Updating the RRM reserved pool PRB count*/
+ if(ueCb->ulInfo.ulLcCtxt[ueLcIdx].snssai != NULLP)
+ {
+ retUL = updateDedLcInfo(inst, ueCb->ulInfo.ulLcCtxt[ueLcIdx].snssai, &(ueCb->ulInfo.ulLcCtxt[ueLcIdx].rsvdDedicatedPRB),\
+ &(ueCb->ulInfo.ulLcCtxt[ueLcIdx].isDedicated));
+ }
+ if(retUL == RFAILED)
+ {
+ DU_LOG("\nERROR --> SCH : Failed in updating Ded Lc info");
+ return RFAILED;
+ }
+ }/*End of UL LC Ctxt*/
+
+ if(ueCb->dlInfo.dlLcCtxt[ueLcIdx].lcId == ueRecfg->schLcCfgMod[lcIdx].lcId)
+ {
+ fillSchDlLcCtxt(&ueCb->dlInfo.dlLcCtxt[ueLcIdx], &ueRecfg->schLcCfgMod[lcIdx]);
+ /*Updating the RRM policy*/
+ if(ueCb->dlInfo.dlLcCtxt[ueLcIdx].snssai != NULLP)
+ {
+ retDL = updateDedLcInfo(inst, ueCb->dlInfo.dlLcCtxt[ueLcIdx].snssai, &(ueCb->dlInfo.dlLcCtxt[ueLcIdx].rsvdDedicatedPRB), \
+ &(ueCb->dlInfo.dlLcCtxt[ueLcIdx].isDedicated));
+ }
+ if(retDL == RFAILED)
+ {
+ DU_LOG("\nERROR --> SCH : Failed in updating Ded Lc info");
+ return RFAILED;
+ }
+ }/*End of DL LC ctxt*/
+
+ SCH_FREE(ueRecfg->schLcCfgMod[lcIdx].drbQos, sizeof(SchDrbQosInfo));
+ SCH_FREE(ueRecfg->schLcCfgMod[lcIdx].snssai, sizeof(Snssai));
}/* End of outer for loop */
return ROK;
}
*
* ****************************************************************/
-SchCellCb *getSchCellCb(uint16_t srcEvent, Inst inst, SchUeCfg *ueCfg)
+SchCellCb *getSchCellCb(uint16_t srcEvent, Inst inst, uint16_t cellId)
{
- uint8_t idx;
+ uint8_t idx = 0;
SchCellCb *cellCb = NULLP;
- SchUeCfgRsp cfgRsp;
- memset(&cfgRsp, 0, sizeof(SchUeCfgRsp));
/* Search of cell cb */
for(idx = 0; idx < MAX_NUM_CELL; idx++)
{
cellCb = schCb[inst].cells[idx];
- if(cellCb->cellId == ueCfg->cellId)
- break;
+ if((cellCb != NULLP) && (cellCb->cellId == cellId))
+ break;
}
- if(idx == MAX_NUM_CELL)
+ if((idx == MAX_NUM_CELL) || (cellCb == NULLP))
{
- DU_LOG("\nERROR --> SCH : Ue create request failed. Invalid cell id %d", ueCfg->cellId);
- SchSendUeCfgRspToMac(srcEvent, ueCfg, inst, RSP_NOK, &cfgRsp);
+ DU_LOG("\nERROR --> SCH : Ue create request failed. Invalid cell id %d", cellId);
return NULLP;
}
if(cellCb->numActvUe > MAX_NUM_UE)
{
DU_LOG("\nERROR --> SCH : Max number of UE [%d] already configured", MAX_NUM_UE);
- SchSendUeCfgRspToMac(srcEvent, ueCfg, inst, RSP_NOK, &cfgRsp);
return NULLP;
}
return cellCb;
* RFAILED - failure
*
* ****************************************************************/
-uint8_t MacSchAddUeConfigReq(Pst *pst, SchUeCfg *ueCfg)
+uint8_t MacSchAddUeConfigReq(Pst *pst, SchUeCfgReq *ueCfg)
{
uint8_t lcIdx = 0, ret = ROK, idx = 0;
SchCellCb *cellCb = NULLP;
return RFAILED;
}
DU_LOG("\nDEBUG --> SCH : Adding UE Config Request for CRNTI[%d]", ueCfg->crnti);
- cellCb = getSchCellCb(pst->event, inst, ueCfg);
+ cellCb = getSchCellCb(pst->event, inst, ueCfg->cellId);
+ if(cellCb == NULLP)
+ {
+ SchSendUeCfgRspToMac(ueCfg, inst, RSP_NOK, &cfgRsp);
+ return RFAILED;
+ }
/* Search if UE already configured */
ueCb = &cellCb->ueCb[ueCfg->ueId - 1];
if((ueCb->crnti == ueCfg->crnti) && (ueCb->state == SCH_UE_STATE_ACTIVE))
{
DU_LOG("\nDEBUG --> SCH : CRNTI %d already configured ", ueCfg->crnti);
- SchSendUeCfgRspToMac(pst->event, ueCfg, inst, RSP_OK, &cfgRsp);
+ SchSendUeCfgRspToMac(ueCfg, inst, RSP_OK, &cfgRsp);
return ROK;
}
cmLListInit(&ueCb->hqDlmap[idx]->hqList);
cmLListInit(&ueCb->hqUlmap[idx]->hqList);
}
- ret = fillSchUeCb(inst, ueCb, ueCfg);
+ ret = fillSchUeCbFrmCfgReq(inst, ueCb, ueCfg);
if(ret == ROK)
{
for(lcIdx=0; lcIdx<MAX_NUM_LOGICAL_CHANNEL_GROUPS; lcIdx++)
ueCb->bsrInfo[lcIdx].dataVol = 0;
- SchSendUeCfgRspToMac(pst->event, ueCfg, inst, RSP_OK, &cfgRsp);
+ SchSendUeCfgRspToMac(ueCfg, inst, RSP_OK, &cfgRsp);
}
return ret;
}
memset(&coreset1, 0, sizeof(SchControlRsrcSet));
if(ueCb->ueCfg.spCellCfgPres == true)
{
- coreset1 = ueCb->ueCfg.spCellCfg.servCellCfg.initDlBwp.pdcchCfg.cRSetToAddModList[0];
+ coreset1 = ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.pdcchCfg.cRSetToAddModList[0];
}
dciInfo->cellId = cellCb->cellId;
* RFAILED - failure
*
* ****************************************************************/
-uint8_t MacSchModUeConfigReq(Pst *pst, SchUeCfg *ueCfg)
+uint8_t MacSchModUeConfigReq(Pst *pst, SchUeRecfgReq *ueRecfg)
{
uint8_t ueId, lcIdx, ret = ROK;
SchCellCb *cellCb = NULLP;
SchUeCb *ueCb = NULLP;
- SchUeCfgRsp cfgRsp;
+ SchUeRecfgRsp recfgRsp;
Inst inst = pst->dstInst - SCH_INST_START;
- memset(&cfgRsp, 0, sizeof(SchUeCfgRsp));
+ 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(!ueCfg)
+ if(!ueRecfg)
{
DU_LOG("\nERROR --> SCH : Modifying Ue Config request failed at MacSchModUeConfigReq()");
return RFAILED;
}
- DU_LOG("\nDEBUG --> SCH : Modifying Ue Config Request for CRNTI[%d]", ueCfg->crnti);
- cellCb = getSchCellCb(pst->event, inst, ueCfg);
+ DU_LOG("\nDEBUG --> SCH : Modifying Ue Config Request for CRNTI[%d]", ueRecfg->crnti);
+ cellCb = getSchCellCb(pst->event, inst, ueRecfg->cellId);
+
+ if(cellCb == NULLP)
+ {
+ SchSendUeRecfgRspToMac(ueRecfg, inst, RSP_NOK, &recfgRsp);
+ return RFAILED;
+ }
/* Search if UE already configured */
- GET_UE_ID(ueCfg->crnti, ueId);
+ GET_UE_ID(ueRecfg->crnti, ueId);
ueCb = &cellCb->ueCb[ueId -1];
if(!ueCb)
{
DU_LOG("\nERROR --> SCH : SchUeCb not found at MacSchModUeConfigReq() ");
- SchSendUeCfgRspToMac(pst->event, ueCfg, inst, RSP_NOK, &cfgRsp);
+ SchSendUeRecfgRspToMac(ueRecfg, inst, RSP_NOK, &recfgRsp);
return RFAILED;
}
- if((ueCb->crnti == ueCfg->crnti) && (ueCb->state == SCH_UE_STATE_ACTIVE))
+ if((ueCb->crnti == ueRecfg->crnti) && (ueCb->state == SCH_UE_STATE_ACTIVE))
{
/* Found the UeCb to Reconfig */
- ret = fillSchUeCb(inst, ueCb, ueCfg);
+ ret = fillSchUeCbFrmRecfgReq(inst, ueCb, ueRecfg);
if(ret == ROK)
{
ueCb->cellCb = cellCb;
for(lcIdx=0; lcIdx<MAX_NUM_LOGICAL_CHANNEL_GROUPS; lcIdx++)
ueCb->bsrInfo[lcIdx].dataVol = 0;
- SchSendUeCfgRspToMac(pst->event, ueCfg, inst, RSP_OK, &cfgRsp);
+ SchSendUeRecfgRspToMac(ueRecfg, inst, RSP_OK, &recfgRsp);
}
}
return ret;
SCH_FREE(ueCb->ueCfg.ambrCfg, sizeof(SchAmbrCfg));
if(ueCb->ueCfg.spCellCfgPres)
{
- if(ueCb->ueCfg.spCellCfg.servCellCfg.initDlBwp.pdschCfgPres == true)
+ if(ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.pdschCfgPres == true)
{
- pdschCfg = &ueCb->ueCfg.spCellCfg.servCellCfg.initDlBwp.pdschCfg;
+ pdschCfg = &ueCb->ueCfg.spCellCfg.servCellRecfg.initDlBwp.pdschCfg;
for(timeDomRsrcIdx = 0; timeDomRsrcIdx < pdschCfg->numTimeDomRsrcAlloc; timeDomRsrcIdx++)
SCH_FREE(pdschCfg->timeDomRsrcAllociList[timeDomRsrcIdx].k0, sizeof(uint8_t));
}
- if(ueCb->ueCfg.spCellCfg.servCellCfg.initUlBwp.pucchCfgPres == true)
+ if(ueCb->ueCfg.spCellCfg.servCellRecfg.initUlBwp.pucchCfgPres == true)
{
- pucchCfg = &ueCb->ueCfg.spCellCfg.servCellCfg.initUlBwp.pucchCfg;
+ pucchCfg = &ueCb->ueCfg.spCellCfg.servCellRecfg.initUlBwp.pucchCfg;
SCH_FREE(pucchCfg->resrcSet,sizeof(SchPucchResrcSetCfg));
if(pucchCfg->resrc)
{
SCH_FREE(pucchCfg->dlDataToUlAck, sizeof(SchPucchDlDataToUlAck));
SCH_FREE(pucchCfg->powerControl,sizeof(SchPucchPowerControl));
}
- SCH_FREE(ueCb->ueCfg.spCellCfg.servCellCfg.bwpInactivityTmr, sizeof(uint8_t));
- deleteSchPdschServCellCfg(&ueCb->ueCfg.spCellCfg.servCellCfg.pdschServCellCfg);
+ SCH_FREE(ueCb->ueCfg.spCellCfg.servCellRecfg.bwpInactivityTmr, sizeof(uint8_t));
+ deleteSchPdschServCellCfg(&ueCb->ueCfg.spCellCfg.servCellRecfg.pdschServCellCfg);
}
/*Need to Free the memory allocated for S-NSSAI*/
for(ueLcIdx = 0; ueLcIdx < MAX_NUM_LC; ueLcIdx++)
if (ODU_GET_MSG_BUF(pst->region, pst->pool, &mBuf) != ROK)
{
- DU_LOG("\nERROR --> DU APP : Memory allocation failed for cell stop req pack");
- return RFAILED;
+ DU_LOG("\nERROR --> DU APP : Memory allocation failed for cell stop req pack");
+ return RFAILED;
}
/* pack the address of the structure */
* RFAILED - failure
*
* ****************************************************************/
-uint8_t packDuMacUeReconfigReq(Pst *pst, MacUeCfg *ueCfg)
+uint8_t packDuMacUeReconfigReq(Pst *pst, MacUeRecfg *ueCfg)
{
Buffer *mBuf = NULLP;
{
if(pst->selector == ODU_SELECTOR_LWLC)
{
- MacUeCfg *ueCfg;
+ MacUeRecfg *ueRecfg;
/* unpack the address of the structure */
- CMCHKUNPK(oduUnpackPointer, (PTR *)&ueCfg, mBuf);
+ CMCHKUNPK(oduUnpackPointer, (PTR *)&ueRecfg, mBuf);
ODU_PUT_MSG_BUF(mBuf);
- return (*func)(pst, ueCfg);
+ return (*func)(pst, ueRecfg);
}
else
{
return RFAILED;
}
+/*******************************************************************
+ *
+ * @brief Pack and send UE Reconfig response from MAC to DU APP
+ *
+ * @details
+ *
+ * Function : packDuMacUeRecfgRsp
+ *
+ * Functionality:
+ * Pack and send UE Reconfig response from MAC to DU APP
+ *
+ * @params[in]
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t packDuMacUeRecfgRsp(Pst *pst, MacUeRecfgRsp *recfgRsp)
+{
+ Buffer *mBuf = NULLP;
+
+ if(pst->selector == ODU_SELECTOR_LWLC)
+ {
+ if (ODU_GET_MSG_BUF(pst->region, pst->pool, &mBuf) != ROK)
+ {
+ DU_LOG("\nERROR --> MAC : Memory allocation failed at packDuMacUeRecfgRsp");
+ return RFAILED;
+ }
+ /* pack the address of the structure */
+ CMCHKPK(oduPackPointer,(PTR)recfgRsp, mBuf);
+ }
+ else
+ {
+ DU_LOG("\nERROR --> MAC: Only LWLC supported for packDuMacUeRecfgRsp");
+ return RFAILED;
+ }
+
+ return ODU_POST_TASK(pst,mBuf);
+}
+
+/*******************************************************************
+ *
+ * @brief Unpack UE ReConfig Response from MAC to DU APP
+ *
+ * @details
+ *
+ * Function :unpackDuMacUeRecfgRsp
+ *
+ * Functionality: Unpack UE ReConfig Response from MAC to DU APP
+ *
+ * @params[in]
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t unpackDuMacUeRecfgRsp(MacDuUeRecfgRspFunc func, Pst *pst, Buffer *mBuf)
+{
+ if(pst->selector == ODU_SELECTOR_LWLC)
+ {
+ MacUeRecfgRsp *recfgRsp = NULLP;
+
+ /* unpack the address of the structure */
+ CMCHKUNPK(oduUnpackPointer, (PTR *)&recfgRsp, mBuf);
+ ODU_PUT_MSG_BUF(mBuf);
+ return (*func)(pst, recfgRsp);
+ }
+
+ ODU_PUT_MSG_BUF(mBuf);
+ return RFAILED;
+}
+
/*******************************************************************
*
* @brief Packs and Sends RACH Resource request from DUAPP to MAC
{
InitialDlBwp initDlBwp;
uint8_t numDlBwpToAdd;
- DlBwpInfo DlBwpToAddList[MAX_NUM_BWP];
+ DlBwpInfo dlBwpToAddList[MAX_NUM_BWP];
uint8_t firstActvDlBwpId;
uint8_t defaultDlBwpId;
uint8_t *bwpInactivityTmr;
PdschServCellCfg pdschServCellCfg;
InitialUlBwp initUlBwp;
uint8_t numUlBwpToAdd;
- UlBwpInfo UlBwpToAddList[MAX_NUM_BWP];
+ UlBwpInfo ulBwpToAddList[MAX_NUM_BWP];
uint8_t firstActvUlBwpId;
}ServCellCfgInfo;
ServCellCfgInfo servCellCfg;
}SpCellCfg;
+/* Serving cell Re-configuration */
+typedef struct servCellRecfgInfo
+{
+ InitialDlBwp initDlBwp;
+ uint8_t numDlBwpToAddOrMod;
+ DlBwpInfo dlBwpToAddOrModList[MAX_NUM_BWP];
+ uint8_t numDlBwpToRel;
+ DlBwpInfo dlBwpToRelList[MAX_NUM_BWP];
+ uint8_t firstActvDlBwpId;
+ uint8_t defaultDlBwpId;
+ uint8_t *bwpInactivityTmr;
+ PdschServCellCfg pdschServCellCfg;
+ InitialUlBwp initUlBwp;
+ uint8_t numUlBwpToAddOrMod;
+ UlBwpInfo ulBwpToAddOrModList[MAX_NUM_BWP];
+ uint8_t numUlBwpToRel;
+ UlBwpInfo ulBwpToRelList[MAX_NUM_BWP];
+ uint8_t firstActvUlBwpId;
+}ServCellRecfgInfo;
+
+/* Special cell Re-configuration */
+typedef struct spCellRecfg
+{
+ uint8_t servCellIdx;
+ ServCellRecfgInfo servCellCfg;
+}SpCellRecfg;
+
typedef struct ambrCfg
{
uint32_t ulBr; /* UL Bit rate */
BucketSizeDur bsd; // bucketSizeDuration
}UlLcCfg;
-typedef struct duLcCfg
+typedef struct dlLcCfg
{
LcPriority lcp; // logical Channel Prioritization
}DlLcCfg;
typedef struct lcCfg
{
- ConfigType configType;
uint8_t lcId;
- DrbQosInfo *drbQos;
Snssai *snssai;
+ DrbQosInfo *drbQos;
bool ulLcCfgPres;
UlLcCfg ulLcCfg;
DlLcCfg dlLcCfg;
typedef struct macUeCfg
{
- uint16_t cellId;
- uint8_t ueId;
- uint16_t crnti;
- bool macCellGrpCfgPres;
- MacCellGrpCfg macCellGrpCfg;
- bool phyCellGrpCfgPres;
- PhyCellGrpCfg phyCellGrpCfg;
- bool spCellCfgPres;
- SpCellCfg spCellCfg;
- AmbrCfg *ambrCfg;
- ModulationInfo dlModInfo; /* DL modulation info */
- ModulationInfo ulModInfo; /* UL modulation info */
- uint8_t numLcs;
- LcCfg lcCfgList[MAX_NUM_LC];
- UeCfgState macUeCfgState; /* InActive / Completed */
+ uint16_t cellId;
+ uint8_t ueId;
+ uint16_t crnti;
+ bool macCellGrpCfgPres;
+ MacCellGrpCfg macCellGrpCfg;
+ bool phyCellGrpCfgPres;
+ PhyCellGrpCfg phyCellGrpCfg;
+ bool spCellCfgPres;
+ SpCellCfg spCellCfg;
+ AmbrCfg *ambrCfg;
+ ModulationInfo dlModInfo; /* DL modulation info */
+ ModulationInfo ulModInfo; /* UL modulation info */
+ uint8_t numLcs;
+ LcCfg lcCfgList[MAX_NUM_LC];
+}MacUeCfg;
+
+/* UE Re-configuration */
+typedef struct macUeRecfg
+{
+ uint16_t cellId;
+ uint8_t ueId;
+ uint8_t beamIdx;
+ uint16_t crnti;
+ bool macCellGrpRecfgPres;
+ MacCellGrpCfg macCellGrpRecfg;
+ bool phyCellGrpRecfgPres;
+ PhyCellGrpCfg phyCellGrpRecfg;
+ bool spCellRecfgPres;
+ SpCellRecfg spCellRecfg;
+ AmbrCfg *ambrRecfg;
+ ModulationInfo dlModInfo;
+ ModulationInfo ulModInfo;
+ uint8_t numLcsToAdd;
+ LcCfg lcCfgAdd[MAX_NUM_LC];
+ uint8_t numLcsToDel;
+ uint8_t lcIdToDel[MAX_NUM_LC];
+ uint8_t numLcsToMod;
+ LcCfg lcCfgMod[MAX_NUM_LC];
DataTransmissionAction transmissionAction;
#ifdef NR_DRX
- bool drxConfigIndicatorRelease;
+ bool drxConfigIndicatorRelease;
#endif
-}MacUeCfg;
+}MacUeRecfg;
typedef struct nrcgi
{
DRBFailInfo *failedDRBlist;
uint8_t numSCellFailed; /* valid values : 0 to MAX_NUM_SCELL */
SCellFailInfo *failedSCellList;
+ uint8_t numDRBModFailed; /* valid values : 0 to MAX_NUM_DRB */
+ DRBFailInfo *failedDRBModlist;
}MacUeCfgRsp;
+typedef struct ueCfgRsp MacUeRecfgRsp;
+
typedef struct rachRsrcReq
{
uint16_t cellId;
/* UE Reconfig Request from DU APP to MAC */
typedef uint8_t (*DuMacUeReconfigReq) ARGS((
Pst *pst,
- MacUeCfg *ueCfg ));
+ MacUeRecfg *ueCfg ));
+
+/* UE Reconfig Response from MAC to DU APP */
+typedef uint8_t (*MacDuUeRecfgRspFunc) ARGS((
+ Pst *pst,
+ MacUeRecfgRsp *cfgRsp));
/* RACH Resource Request from DU APP to MAC */
typedef uint8_t (*DuMacRachRsrcReq) ARGS((
uint8_t packDuMacUeCfgRsp(Pst *pst, MacUeCfgRsp *cfgRsp);
uint8_t unpackDuMacUeCfgRsp(MacDuUeCfgRspFunc func, Pst *pst, Buffer *mBuf);
uint8_t DuProcMacUeCfgRsp(Pst *pst, MacUeCfgRsp *cfgRsp);
-uint8_t packDuMacUeReconfigReq(Pst *pst, MacUeCfg *ueCfg);
+uint8_t packDuMacUeReconfigReq(Pst *pst, MacUeRecfg *ueRecfg);
uint8_t unpackMacUeReconfigReq(DuMacUeReconfigReq func, Pst *pst, Buffer *mBuf);
-uint8_t MacProcUeReconfigReq(Pst *pst, MacUeCfg *ueCfg);
+uint8_t MacProcUeReconfigReq(Pst *pst, MacUeRecfg *ueRecfg);
+uint8_t packDuMacUeRecfgRsp(Pst *pst, MacUeRecfgRsp *recfgRsp);
+uint8_t unpackDuMacUeRecfgRsp(MacDuUeRecfgRspFunc func, Pst *pst, Buffer *mBuf);
+uint8_t DuProcMacUeRecfgRsp(Pst *pst, MacUeRecfgRsp *recfgRsp);
uint8_t packDuMacRachRsrcReq(Pst *pst, MacRachRsrcReq *rachRsrcReq);
uint8_t unpackMacRachRsrcReq(DuMacRachRsrcReq func, Pst *pst, Buffer *mBuf);
uint8_t MacProcRachRsrcReq(Pst *pst, MacRachRsrcReq *rachRsrcReq);
* RFAILED - failure
*
* ****************************************************************/
-uint8_t packMacSchAddUeConfigReq(Pst *pst, SchUeCfg *ueCfg)
+uint8_t packMacSchAddUeConfigReq(Pst *pst, SchUeCfgReq *ueCfg)
{
if((pst->selector == ODU_SELECTOR_LC) || (pst->selector == ODU_SELECTOR_LC))
{
{
return ROK;
}
+
+/*******************************************************************
+ *
+ * @brief Packs and send UE reconfig response
+ *
+ * @details
+ *
+ * Function : packSchUeRecfgRsp
+ *
+ * Functionality:
+ * Packs and send UE reconfig response
+ *
+ * @params[in] Post structure
+ * UE re-config response
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t packSchUeRecfgRsp(Pst *pst, SchUeRecfgRsp *recfgRsp)
+{
+ return ROK;
+}
+
/*******************************************************************
*
* @brief Pack and Send BSR from MAC to SCH
* RFAILED - failure
*
* ****************************************************************/
-uint8_t packMacSchModUeConfigReq(Pst *pst, SchUeCfg *ueCfg)
+uint8_t packMacSchModUeConfigReq(Pst *pst, SchUeRecfgReq *ueRecfg)
{
if((pst->selector == ODU_SELECTOR_LC) || (pst->selector == ODU_SELECTOR_LC))
{
uint8_t bwpId;
}SchUlBwpInfo;
+/* Serving cell configuration */
+typedef struct schServCellRecfgInfo
+{
+ SchInitalDlBwp initDlBwp;
+ uint8_t numDlBwpToAddOrMod;
+ SchDlBwpInfo dlBwpToAddOrModList[MAX_NUM_BWP];
+ uint8_t numDlBwpToRel;
+ SchDlBwpInfo dlBwpToRelList[MAX_NUM_BWP];
+ uint8_t firstActvDlBwpId;
+ uint8_t defaultDlBwpId;
+ uint8_t *bwpInactivityTmr;
+ SchPdschServCellCfg pdschServCellCfg;
+ SchInitialUlBwp initUlBwp;
+ uint8_t numUlBwpToAddOrMod;
+ SchUlBwpInfo ulBwpToAddOrModList[MAX_NUM_BWP];
+ uint8_t numUlBwpToRel;
+ SchUlBwpInfo ulBwpToRelList[MAX_NUM_BWP];
+ uint8_t firstActvUlBwpId;
+}SchServCellRecfgInfo;
+
/* Serving cell configuration */
typedef struct schServCellCfgInfo
{
SchInitalDlBwp initDlBwp;
uint8_t numDlBwpToAdd;
- SchDlBwpInfo DlBwpToAddList[MAX_NUM_BWP];
+ SchDlBwpInfo dlBwpToAddList[MAX_NUM_BWP];
uint8_t firstActvDlBwpId;
uint8_t defaultDlBwpId;
uint8_t *bwpInactivityTmr;
SchPdschServCellCfg pdschServCellCfg;
SchInitialUlBwp initUlBwp;
uint8_t numUlBwpToAdd;
- SchUlBwpInfo UlBwpToAddList[MAX_NUM_BWP];
+ SchUlBwpInfo ulBwpToAddList[MAX_NUM_BWP];
uint8_t firstActvUlBwpId;
}SchServCellCfgInfo;
SchServCellCfgInfo servCellCfg;
}SchSpCellCfg;
+/* Special cell Reconfiguration */
+typedef struct schSpCellRecfg
+{
+ uint8_t servCellIdx;
+ SchServCellRecfgInfo servCellRecfg;
+}SchSpCellRecfg;
+
/* Uplink logical channel configuration */
typedef struct SchUlLcCfg
{
/* Logical Channel configuration */
typedef struct schLcCfg
{
- ConfigType configType;
uint8_t lcId;
- SchDrbQosInfo *drbQos;
Snssai *snssai;
+ SchDrbQosInfo *drbQos;
SchDlLcCfg dlLcCfg;
SchUlLcCfg ulLcCfg;
}SchLcCfg;
}SchModulationInfo;
/* UE configuration */
-typedef struct schUeCfg
+typedef struct schUeCfgReq
{
uint16_t cellId;
uint8_t ueId;
+ uint8_t beamIdx;
uint16_t crnti;
bool macCellGrpCfgPres;
SchMacCellGrpCfg macCellGrpCfg;
SchAmbrCfg *ambrCfg;
SchModulationInfo dlModInfo;
SchModulationInfo ulModInfo;
- uint8_t numLcs;
+ uint8_t numLcsToAdd;
SchLcCfg schLcCfg[MAX_NUM_LC];
+}SchUeCfgReq;
+
+/* UE Re-configuration */
+typedef struct schUeRecfgReq
+{
+ uint16_t cellId;
+ uint8_t ueId;
+ uint8_t beamIdx;
+ uint16_t crnti;
+ bool macCellGrpRecfgPres;
+ SchMacCellGrpCfg macCellGrpRecfg;
+ bool phyCellGrpRecfgPres;
+ SchPhyCellGrpCfg phyCellGrpRecfg;
+ bool spCellRecfgPres;
+ SchSpCellRecfg spCellRecfg;
+ SchAmbrCfg *ambrRecfg;
+ SchModulationInfo dlModInfo;
+ SchModulationInfo ulModInfo;
+ uint8_t numLcsToAdd;
+ SchLcCfg schLcCfgAdd[MAX_NUM_LC];
+ uint8_t numLcsToDel;
+ uint8_t lcIdToDel[MAX_NUM_LC];
+ uint8_t numLcsToMod;
+ SchLcCfg schLcCfgMod[MAX_NUM_LC];
SchDataTransmission dataTransmissionInfo;
#ifdef NR_DRX
bool drxConfigIndicatorRelease;
#endif
-}SchUeCfg;
+}SchUeRecfgReq;
typedef struct schUeCfgRsp
{
uint16_t cellId;
+ uint8_t beamIdx;
uint16_t ueId;
uint16_t crnti;
SchMacRsp rsp;
SchFailureCause cause;
}SchUeCfgRsp;
+/*As per WG8, UE ReCFG and UECFG have same structure definition*/
+typedef struct schUeCfgRsp SchUeRecfgRsp;
+
typedef struct schRachRsrcReq
{
SlotTimingInfo slotInd;
SliceRsp **listOfSliceCfgRsp;
}SchSliceCfgRsp;
-/*As per ORAN-WG8, Slice Cfg and ReCfg are same structures*/
+/*As per ORAN-WG8, Slice Cfg and Recfg are same structures*/
typedef struct schSliceCfgReq SchSliceRecfgReq;
typedef struct schSliceCfgRsp SchSliceRecfgRsp;
typedef uint8_t (*MacSchAddUeConfigReqFunc) ARGS((
Pst *pst, /* Post structure */
- SchUeCfg *ueCfgToSch)); /* Scheduler UE Cfg */
+ SchUeCfgReq *ueCfgToSch)); /* Scheduler UE Cfg */
typedef uint8_t (*SchUeCfgRspFunc) ARGS((
Pst *pst, /* Post structure */
typedef uint8_t (*MacSchModUeConfigReqFunc) ARGS((
Pst *pst, /* Post structure */
- SchUeCfg *ueCfgToSch)); /* Scheduler UE Cfg */
+ SchUeRecfgReq *ueRecfgToSch)); /* Scheduler UE Recfg */
-typedef uint8_t (*SchUeReCfgRspFunc) ARGS((
+typedef uint8_t (*SchUeRecfgRspFunc) ARGS((
Pst *pst, /* Post structure */
- SchUeCfgRsp *cfgRsp)); /* Scheduler UE Cfg response */
+ SchUeRecfgRsp *recfgRsp)); /* Scheduler UE Cfg response */
typedef uint8_t (*MacSchRachRsrcReqFunc) ARGS((
Pst *pst, /* Post structure */
typedef uint8_t (*MacSchSliceRecfgReqFunc) ARGS((
Pst *pst, /* Post structure */
- SchSliceRecfgReq *schSliceRecfgReq)); /* Scheduler Slice ReCfg Req */
+ SchSliceRecfgReq *schSliceRecfgReq)); /* Scheduler Slice Recfg Req */
typedef uint8_t (*SchSliceRecfgRspFunc) ARGS((
Pst *pst, /* Post Structure */
- SchSliceRecfgRsp *schSliceRecfgRsp /* Cell ReCfg Cfm */
+ SchSliceRecfgRsp *schSliceRecfgRsp /* Cell Recfg Cfm */
));
typedef uint8_t (*MacSchPagingIndFunc) ARGS((
uint8_t MacSchCrcInd(Pst *pst, CrcIndInfo *crcInd);
uint8_t packMacSchDlRlcBoInfo(Pst *pst, DlRlcBoInfo *dlBoInfo);
uint8_t MacSchDlRlcBoInfo(Pst *pst, DlRlcBoInfo *dlBoInfo);
-uint8_t packMacSchAddUeConfigReq(Pst *pst, SchUeCfg *ueCfgToSch);
-uint8_t MacSchAddUeConfigReq(Pst *pst, SchUeCfg *ueCfgToSch);
+uint8_t packMacSchAddUeConfigReq(Pst *pst, SchUeCfgReq *ueCfgToSch);
+uint8_t MacSchAddUeConfigReq(Pst *pst, SchUeCfgReq *ueCfgToSch);
uint8_t packSchUeCfgRsp(Pst *pst, SchUeCfgRsp *cfgRsp);
uint8_t MacProcSchUeCfgRsp(Pst *pst, SchUeCfgRsp *cfgRsp);
+uint8_t packSchUeRecfgRsp(Pst *pst, SchUeRecfgRsp *cfgRsp);
+uint8_t MacProcSchUeRecfgRsp(Pst *pst, SchUeRecfgRsp *reCfgRsp);
uint8_t MacSchSlotInd ARGS((Pst * pst, SlotTimingInfo * slotInd));
uint8_t packMacSchSlotInd(Pst * pst, SlotTimingInfo * slotInd);
uint8_t unpackMacSchSlotInd(MacSchSlotIndFunc func, Pst *pst, Buffer *mBuf);
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);
-uint8_t packSchUeReconfigRsp(Pst *pst, SchUeCfgRsp *cfgRsp);
-uint8_t MacProcSchUeReconfigRsp(Pst *pst, SchUeCfgRsp *cfgRsp);
+uint8_t packMacSchModUeConfigReq(Pst *pst, SchUeRecfgReq *ueRecfgToSch);
+uint8_t MacSchModUeConfigReq(Pst *pst, SchUeRecfgReq *ueRecfgToSch);
+uint8_t packSchUeReconfigRsp(Pst *pst, SchUeRecfgRsp *recfgRsp);
+uint8_t MacProcSchUeReconfigRsp(Pst *pst, SchUeRecfgRsp *recfgRsp);
uint8_t packMacSchRachRsrcReq(Pst *pst, SchRachRsrcReq *schRachRsrcReq);
uint8_t MacSchRachRsrcReq(Pst *pst, SchRachRsrcReq *schRachRsrcReq);
uint8_t packSchRachRsrcRsp(Pst *pst, SchRachRsrcRsp *schRachRsrcRsp);
return ret;
}
+/*******************************************************************
+*
+* @brief Builds the DRB to be released Item IE
+*
+* @details
+*
+* Function : FillDrbToBeRelItemList
+*
+* Functionality: Constructs the DRB to be modified Mod Item Ies
+*
+* @params[in] struct DRBs_ToBeReleased_ItemIEs *drbItemIe
+*
+* @return ROK - success
+* RFAILED - failure
+*
+* ****************************************************************/
+
+uint8_t FillDrbToBeRelItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeReleased_ItemIEs *drbItemIe)
+{
+ uint8_t drbIdx;
+
+ drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeReleased_Item;
+ drbItemIe->criticality = Criticality_reject;
+ drbItemIe->value.present = DRBs_ToBeReleased_ItemIEs__value_PR_DRBs_ToBeReleased_Item;
+ drbItemIe->value.choice.DRBs_ToBeReleased_Item.dRBID = DRB1 + arrIdx;
+
+ for(drbIdx = 0; drbIdx < ueCb->numDrb; drbIdx++)
+ {
+ if(ueCb->drbList[drbIdx].drbId == drbItemIe->value.choice.DRBs_ToBeReleased_Item.dRBID)
+ {
+ deleteEgtpTunnel(duId, ueCb->drbList[drbIdx].dlUpTnlInfo.teId);
+ CU_FREE(ueCb->drbList[drbIdx].snssai, sizeof(Snssai));
+ break;
+ }
+ }
+ return ROK;
+}
+
+/*******************************************************************
+*
+* @brief Builds the DRB to be released list
+*
+* @details
+*
+* Function : BuildDrbToBeReleasedList
+*
+* Functionality: Constructs the DRB to be released list
+*
+* @params[in] DRBs_ToBeReleased_List_t *drbSet
+*
+* @return ROK - success
+* RFAILED - failure
+*
+* ****************************************************************/
+
+uint8_t BuildDrbToBeReleasedList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeReleased_List_t *drbSet)
+{
+ uint8_t ret = ROK;
+ uint8_t arrIdx =0;
+ uint8_t drbCnt =0;
+
+ drbCnt = MAX_DRB_MODIFIED_UE_MOD_REQ;
+ drbSet->list.count = drbCnt;
+ drbSet->list.size = drbCnt * sizeof(DRBs_ToBeReleased_ItemIEs_t *);
+ CU_ALLOC(drbSet->list.array, drbSet->list.size);
+ if(drbSet->list.array == NULLP)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeReleasedList");
+ return RFAILED;
+ }
+ for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
+ {
+ CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeReleased_ItemIEs_t));
+ if(drbSet->list.array[arrIdx] == NULLP)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeReleasedList");
+ return RFAILED;
+ }
+
+ ret = FillDrbToBeRelItemList(duId, ueCb, arrIdx, (DRBs_ToBeReleased_ItemIEs_t *)drbSet->list.array[arrIdx]);
+ if(ret != ROK)
+ {
+ DU_LOG("\nERROR --> F1AP : FillDrbToBeRelItemList failed");
+ }
+ }
+
+ return ret;
+}
+
/*******************************************************************
*
* @brief freeing the DRB item
}
+/*******************************************************************
+*
+* @brief free the DRB to be modfified list
+*
+* @details
+*
+* Function : FreeDrbToBeReleasedList
+*
+* Functionality: free the DRB to be Release list
+*
+* @params[in] FreeDrbToBeReleasedList_t *drbSet
+*
+* @return ROK - success
+* RFAILED - failure
+*
+* ****************************************************************/
+void FreeDrbToBeReleasedList(DRBs_ToBeReleased_List_t *drbSet)
+{
+ uint8_t arrIdx =0;
+ struct DRBs_ToBeReleased_ItemIEs *drbItemIe;
+
+ if(drbSet->list.array)
+ {
+ for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
+ {
+ if(drbSet->list.array[arrIdx] != NULLP)
+ {
+ CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeReleased_ItemIEs_t));
+ }
+ }
+ CU_FREE(drbSet->list.array, drbSet->list.size);
+ }
+}
+
/*******************************************************************
*
* @brief free the UeContextModification Request
choice.DRBs_ToBeModified_List);
break;
}
+ case ProtocolIE_ID_id_DRBs_ToBeReleased_List:
+ {
+ FreeDrbToBeReleasedList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
+ choice.DRBs_ToBeReleased_List);
+ break;
+ }
case ProtocolIE_ID_id_TransmissionActionIndicator:
break;
case ProtocolIE_ID_id_RRCContainer:
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)
ret = BuildDrbToBeModifiedList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
value.choice.DRBs_ToBeModified_List));
- /* TODO: DRB to be release list */
-
if(ret != ROK)
{
DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextModificationReq(): Failed to build drb to be modified list");
break;
}
- /* TODO: fill the RRC reconfiguration information in RRC Contaiiner ie in case of MODIFY_UE */
+ /* DRB to be released list */
+ ieIdx++;
+ ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeReleased_List;
+ ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
+ ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
+ UEContextModificationRequestIEs__value_PR_DRBs_ToBeReleased_List;
+ ret = BuildDrbToBeReleasedList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
+ value.choice.DRBs_ToBeReleased_List));
+
+ if(ret != ROK)
+ {
+ DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextModificationReq(): Failed to build drb to be deleted list");
+ break;
+ }
}
else if(action == QUERY_CONFIG)
{
break;
}
+ case ProtocolIE_ID_id_DRBs_Modified_List:
+ {
+ DU_LOG("\nINFO --> Received DRBs Modified List");
+ break;
+ }
case ProtocolIE_ID_id_SRBs_SetupMod_List:
{
procSrbSetupModList(ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.SRBs_SetupMod_List);
}
continue;
}
+ else if(ch == 'm')
+ {
+ uint8_t ueId = 1;
+ uint8_t duId = 1;
+ uint8_t duIdx = 0;
+
+ DU_LOG("\nINFO --> CU_STUB: UE Context Mod for ueId [%d] at DU ID [%d]", \
+ ueId, duId );
+ DuDb *duDb = NULLP;
+ CuUeCb *ueCb = NULLP;
+
+ SEARCH_DU_DB(duIdx, duId, duDb);
+ if(duDb)
+ ueCb = &duDb->ueCb[ueId-1];
+ BuildAndSendUeContextModificationReq(duId, ueCb, MODIFY_UE);
+
+ }
}
}
/**********************************************************************
if(ueCb == NULLP)
elementCnt = ODU_VALUE_ONE;
else
- elementCnt = ueCb->macUeCfg.macCellGrpCfg.tagCfg.addModListCount;
+ elementCnt = ueCb->duMacUeCfg.macCellGrpCfg.tagCfg.addModListCount;
tagList = tagConfig->tag_ToAddModList;
tagList->list.count = elementCnt;
{
for(idx=0; idx<tagList->list.count; idx++)
{
- tagList->list.array[idx]->tag_Id = ueCb->macUeCfg.macCellGrpCfg.tagCfg.addModList[idx].tagId;
- tagList->list.array[idx]->timeAlignmentTimer = ueCb->macUeCfg.macCellGrpCfg.tagCfg.addModList[idx].timeAlignTimer;
+ tagList->list.array[idx]->tag_Id = ueCb->duMacUeCfg.macCellGrpCfg.tagCfg.addModList[idx].tagId;
+ tagList->list.array[idx]->timeAlignmentTimer = ueCb->duMacUeCfg.macCellGrpCfg.tagCfg.addModList[idx].timeAlignTimer;
}
}
}
else
{
- phrConfig->choice.setup->phr_PeriodicTimer = ueCb->macUeCfg.macCellGrpCfg.phrCfg.periodicTimer;
- phrConfig->choice.setup->phr_ProhibitTimer = ueCb->macUeCfg.macCellGrpCfg.phrCfg.prohibitTimer;
- phrConfig->choice.setup->phr_Tx_PowerFactorChange = ueCb->macUeCfg.macCellGrpCfg.phrCfg.txPowerFactor;
- phrConfig->choice.setup->multiplePHR = ueCb->macUeCfg.macCellGrpCfg.phrCfg.multiplePHR;
- phrConfig->choice.setup->dummy = ueCb->macUeCfg.macCellGrpCfg.phrCfg.dummy;
- phrConfig->choice.setup->phr_Type2OtherCell = ueCb->macUeCfg.macCellGrpCfg.phrCfg.phrType2OtherCell;
- phrConfig->choice.setup->phr_ModeOtherCG = ueCb->macUeCfg.macCellGrpCfg.phrCfg.phrOtherCG;
+ phrConfig->choice.setup->phr_PeriodicTimer = ueCb->duMacUeCfg.macCellGrpCfg.phrCfg.periodicTimer;
+ phrConfig->choice.setup->phr_ProhibitTimer = ueCb->duMacUeCfg.macCellGrpCfg.phrCfg.prohibitTimer;
+ phrConfig->choice.setup->phr_Tx_PowerFactorChange = ueCb->duMacUeCfg.macCellGrpCfg.phrCfg.txPowerFactor;
+ phrConfig->choice.setup->multiplePHR = ueCb->duMacUeCfg.macCellGrpCfg.phrCfg.multiplePHR;
+ phrConfig->choice.setup->dummy = ueCb->duMacUeCfg.macCellGrpCfg.phrCfg.dummy;
+ phrConfig->choice.setup->phr_Type2OtherCell = ueCb->duMacUeCfg.macCellGrpCfg.phrCfg.phrType2OtherCell;
+ phrConfig->choice.setup->phr_ModeOtherCG = ueCb->duMacUeCfg.macCellGrpCfg.phrCfg.phrOtherCG;
}
return ROK;
}
else
{
- bsrConfig->periodicBSR_Timer = convertBsrPeriodicTmrValueToEnum(ueCb->macUeCfg.macCellGrpCfg.bsrTmrCfg.periodicTimer);
- bsrConfig->retxBSR_Timer = convertBsrRetxTmrValueToEnum(ueCb->macUeCfg.macCellGrpCfg.bsrTmrCfg.retxTimer);
+ bsrConfig->periodicBSR_Timer = convertBsrPeriodicTmrValueToEnum(ueCb->duMacUeCfg.macCellGrpCfg.bsrTmrCfg.periodicTimer);
+ bsrConfig->retxBSR_Timer = convertBsrRetxTmrValueToEnum(ueCb->duMacUeCfg.macCellGrpCfg.bsrTmrCfg.retxTimer);
bsrConfig->logicalChannelSR_DelayTimer = NULLP;
DU_ALLOC(bsrConfig->logicalChannelSR_DelayTimer, sizeof(long));
DU_LOG("\nERROR --> DU APP: Memory allocation failed in BuildBsrConfig");
return RFAILED;
}
- *(bsrConfig->logicalChannelSR_DelayTimer) = convertLcSrDelayTmrValueToEnum(ueCb->macUeCfg.macCellGrpCfg.bsrTmrCfg.srDelayTimer);
+ *(bsrConfig->logicalChannelSR_DelayTimer) = convertLcSrDelayTmrValueToEnum(ueCb->duMacUeCfg.macCellGrpCfg.bsrTmrCfg.srDelayTimer);
}
return ROK;
if(ueCb == NULLP)
elementCnt = ODU_VALUE_ONE;
else
- elementCnt = ueCb->macUeCfg.macCellGrpCfg.schReqCfg.addModListCount;
+ elementCnt = ueCb->duMacUeCfg.macCellGrpCfg.schReqCfg.addModListCount;
schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
schReqList->list.count = elementCnt;
{
for(idx=0; idx<schReqList->list.count; idx++)
{
- schReqList->list.array[idx]->schedulingRequestId = ueCb->macUeCfg.macCellGrpCfg.schReqCfg.addModList[idx].schedReqId;
+ schReqList->list.array[idx]->schedulingRequestId = ueCb->duMacUeCfg.macCellGrpCfg.schReqCfg.addModList[idx].schedReqId;
schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
DU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
return RFAILED;
}
- *(schReqList->list.array[idx]->sr_ProhibitTimer) = ueCb->macUeCfg.macCellGrpCfg.schReqCfg.addModList[idx].srProhibitTmr;
- schReqList->list.array[idx]->sr_TransMax = ueCb->macUeCfg.macCellGrpCfg.schReqCfg.addModList[idx].srTransMax;
+ *(schReqList->list.array[idx]->sr_ProhibitTimer) = ueCb->duMacUeCfg.macCellGrpCfg.schReqCfg.addModList[idx].srProhibitTmr;
+ schReqList->list.array[idx]->sr_TransMax = ueCb->duMacUeCfg.macCellGrpCfg.schReqCfg.addModList[idx].srTransMax;
}
}
DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
return RFAILED;
}
- for(macLcIdx = 0; macLcIdx < ueCb->macUeCfg.numLcs; macLcIdx++)
+ for(macLcIdx = 0; macLcIdx < ueCb->duMacUeCfg.numLcs; macLcIdx++)
{
- if(ueCb->macUeCfg.lcCfgList[macLcIdx].lcId == ueCb->rlcUeCfg.rlcLcCfg[lcIdx].lcId)
+ if(ueCb->duMacUeCfg.lcCfgList[macLcIdx].lcConfig.lcId == ueCb->rlcUeCfg.rlcLcCfg[lcIdx].lcId)
{
- if(BuildMacLCConfig(&ueCb->macUeCfg.lcCfgList[macLcIdx], rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
+ if(BuildMacLCConfig(&ueCb->duMacUeCfg.lcCfgList[macLcIdx].lcConfig, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
{
DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
return RFAILED;
* RFAILED - failure
*
* ****************************************************************/
-uint8_t BuildUlCfg(ServCellCfgInfo *servCellCfg, UplinkConfig_t *ulCfg)
+uint8_t BuildUlCfg(ServCellRecfgInfo *servCellRecfg, UplinkConfig_t *ulCfg)
{
InitialUlBwp *initUlBwp = NULLP;
- if(servCellCfg)
+ if(servCellRecfg)
{
- initUlBwp = &servCellCfg->initUlBwp;
+ initUlBwp = &servCellRecfg->initUlBwp;
}
ulCfg->initialUplinkBWP = NULLP;
DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
return RFAILED;
}
- if(servCellCfg == NULLP)
+ if(servCellRecfg == NULLP)
*(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
else
- *(ulCfg->firstActiveUplinkBWP_Id) = servCellCfg->firstActvUlBwpId;
+ *(ulCfg->firstActiveUplinkBWP_Id) = servCellRecfg->firstActvUlBwpId;
ulCfg->pusch_ServingCellConfig = NULLP;
DU_ALLOC(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
*
* Functionality: Builds DL BWP to add/modify list
*
- * @params[in] ServCellCfgInfo *servCellCfg,
+ * @params[in] ServCellRecfgInfo *servCellRecfg,
* struct ServingCellConfig__downlinkBWP_ToAddModList *dlBwpAddModList
*
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
-uint8_t BuildDlBwpToAddModList(ServCellCfgInfo *servCellCfg, struct ServingCellConfig__downlinkBWP_ToAddModList *dlBwpAddModList)
+uint8_t BuildDlBwpToAddModList(ServCellRecfgInfo *servCellRecfg, struct ServingCellConfig__downlinkBWP_ToAddModList *dlBwpAddModList)
{
uint8_t elementCnt, idx;
- elementCnt = servCellCfg->numDlBwpToAdd;
+ elementCnt = servCellRecfg->numDlBwpToAddOrMod;
dlBwpAddModList->list.count = elementCnt;
dlBwpAddModList->list.size = elementCnt * sizeof(struct BWP_Downlink *);
dlBwpAddModList->list.array = NULLP;
for(idx=0; idx<dlBwpAddModList->list.count; idx++)
{
- dlBwpAddModList->list.array[idx]->bwp_Id = servCellCfg->DlBwpToAddList[idx].bwpId;
+ dlBwpAddModList->list.array[idx]->bwp_Id = servCellRecfg->dlBwpToAddOrModList[idx].bwpId;
dlBwpAddModList->list.array[idx]->bwp_Common = NULLP;
dlBwpAddModList->list.array[idx]->bwp_Dedicated = NULLP;
}
* ****************************************************************/
uint8_t BuildSpCellCfgDed(DuUeCb *ueCb, ServingCellConfig_t *srvCellCfg)
{
- ServCellCfgInfo *servCellCfg = NULLP;
+ ServCellRecfgInfo *servCellRecfg = NULLP;
InitialDlBwp *initDlBwp = NULLP;
PdschServCellCfg *pdschServCellDb = NULLP;
if(ueCb)
{
- servCellCfg = &ueCb->macUeCfg.spCellCfg.servCellCfg;
- initDlBwp = &servCellCfg->initDlBwp;
- pdschServCellDb = &servCellCfg->pdschServCellCfg;
+ servCellRecfg = &ueCb->duMacUeCfg.spCellCfg.servCellCfg;
+ initDlBwp = &servCellRecfg->initDlBwp;
+ pdschServCellDb = &servCellRecfg->pdschServCellCfg;
}
srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
srvCellCfg->downlinkBWP_ToAddModList = NULLP;
- if(ueCb && ueCb->macUeCfg.spCellCfg.servCellCfg.numDlBwpToAdd)
+ if(ueCb && ueCb->duMacUeCfg.spCellCfg.servCellCfg.numDlBwpToAddOrMod)
{
DU_ALLOC(srvCellCfg->downlinkBWP_ToAddModList, sizeof(struct ServingCellConfig__downlinkBWP_ToAddModList));
if(srvCellCfg->downlinkBWP_ToAddModList == NULLP)
return RFAILED;
}
- if(BuildDlBwpToAddModList(&ueCb->macUeCfg.spCellCfg.servCellCfg, srvCellCfg->downlinkBWP_ToAddModList) != ROK)
+ if(BuildDlBwpToAddModList(&ueCb->duMacUeCfg.spCellCfg.servCellCfg, srvCellCfg->downlinkBWP_ToAddModList) != ROK)
{
DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed");
return RFAILED;
if(ueCb == NULLP)
*(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
else
- *(srvCellCfg->firstActiveDownlinkBWP_Id) = ueCb->macUeCfg.spCellCfg.servCellCfg.firstActvDlBwpId;
+ *(srvCellCfg->firstActiveDownlinkBWP_Id) = ueCb->duMacUeCfg.spCellCfg.servCellCfg.firstActvDlBwpId;
srvCellCfg->bwp_InactivityTimer = NULLP;
if(ueCb == NULLP)
*(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
else
- *(srvCellCfg->defaultDownlinkBWP_Id) = ueCb->macUeCfg.spCellCfg.servCellCfg.defaultDlBwpId;
+ *(srvCellCfg->defaultDownlinkBWP_Id) = ueCb->duMacUeCfg.spCellCfg.servCellCfg.defaultDlBwpId;
srvCellCfg->uplinkConfig = NULLP;
DU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
return RFAILED;
}
- if(BuildUlCfg(servCellCfg, srvCellCfg->uplinkConfig) != ROK)
+ if(BuildUlCfg(servCellRecfg, srvCellCfg->uplinkConfig) != ROK)
{
DU_LOG("\nERROR --> F1AP : BuildUlCfg failed");
return RFAILED;
if(ueCb == NULLP)
*(spCellCfg->servCellIndex) = SERV_CELL_IDX;
else
- *(spCellCfg->servCellIndex) = ueCb->macUeCfg.spCellCfg.servCellIdx;
+ *(spCellCfg->servCellIndex) = ueCb->duMacUeCfg.spCellCfg.servCellIdx;
spCellCfg->reconfigurationWithSync = NULLP;
if(ueCb && (ueCb->ueState == UE_HANDIN_IN_PROGRESS))
}
else
{
- *(phyCellGrpCfg->p_NR_FR1) = ueCb->macUeCfg.phyCellGrpCfg.pNrFr1;
- phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = ueCb->macUeCfg.phyCellGrpCfg.pdschHarqAckCodebook;
+ *(phyCellGrpCfg->p_NR_FR1) = ueCb->duMacUeCfg.phyCellGrpCfg.pNrFr1;
+ phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = ueCb->duMacUeCfg.phyCellGrpCfg.pdschHarqAckCodebook;
}
phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDrxConfigRrc");
return RFAILED;
}
- if(ueCb->macUeCfg.macCellGrpCfg.drxCfg.drxOnDurationTimer.onDurationTimerValInMs)
+ if(ueCb->duMacUeCfg.macCellGrpCfg.drxCfg.drxOnDurationTimer.onDurationTimerValInMs)
{
drxCfg->choice.setup->drx_onDurationTimer.present = DRX_ConfigRrc__drx_onDurationTimer_PR_milliSeconds;
- drxCfg->choice.setup->drx_onDurationTimer.choice.milliSeconds = convertOnDurationTimerMilliSecondsValueToEnum(ueCb->macUeCfg.\
+ drxCfg->choice.setup->drx_onDurationTimer.choice.milliSeconds = convertOnDurationTimerMilliSecondsValueToEnum(ueCb->duMacUeCfg.\
macCellGrpCfg.drxCfg.drxOnDurationTimer.onDurationtimerValue.milliSeconds);
}
else
/***** UE SETUP REQUEST *****/
-/*******************************************************************
- *
- * @brief Free Qos And Snssai Drb Info
- *
- * @details
- *
- * Function : freeDrbQosAndSnssaiInfo
- *
- * Functionality: Free Qos And Snssai Drb Info
- *
- * @params[in] LcCfg *lcCfg,
- * @return void
- *
- * ****************************************************************/
-void freeDrbQosAndSnssaiInfo(LcCfg *lcCfg)
-{
- if(lcCfg->snssai)
- {
- DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->snssai, sizeof(Snssai));
- }
- if(lcCfg->drbQos)
- {
- DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->drbQos, sizeof(DrbQosInfo));
- }
-}
-
/******************************************************************
*
* @brief Function to delete the RLC Lc cfg from UE APP DB
*
* ****************************************************************/
-void freeMacLcCfg(LcCfg *lcCfg)
+void freeMacLcCfg(LcCfg *lcCfg)
{
/* Deleting DRBQOS */
if(lcCfg->drbQos)
for(lcIdx = 0; lcIdx < ueCfg->numMacLcs; lcIdx++)
{
- freeMacLcCfg(&ueCfg->macLcCfg[lcIdx]);
+ freeMacLcCfg(&ueCfg->macLcCfg[lcIdx].lcConfig);
}
for(lcIdx = 0; lcIdx < ueCfg->numDrb; lcIdx++)
*
* ****************************************************************/
uint8_t extractDrbCfg(DRBs_ToBeSetup_Item_t *drbItem, DRBs_ToBeSetupMod_Item_t *drbSetupModItem,\
-DRBs_ToBeModified_Item_t *drbModItem, LcCfg *macLcToAdd, UpTnlCfg *upTnlInfo)
+DRBs_ToBeModified_Item_t *drbModItem, DuLcCfg *lcCfgToAdd, UpTnlCfg *upTnlInfo)
{
DRB_Information_t *drbInfo = NULLP;
if(drbItem->qoSInformation.choice.choice_extension->value.present == QoSInformation_ExtIEs__value_PR_DRB_Information)
{
drbInfo = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information;
- if(extractDrbQosCfg(drbInfo , macLcToAdd) != ROK)
+ if(extractDrbQosCfg(drbInfo , &lcCfgToAdd->lcConfig) != ROK)
{
DU_LOG("\nERROR --> DUAPP : Failed to extract qos Cfg at extractDrbCfg()");
return RFAILED;
QoSInformation_ExtIEs__value_PR_DRB_Information)
{
drbInfo = &drbSetupModItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information;
- if(extractDrbQosCfg(drbInfo , macLcToAdd) != ROK)
+ if(extractDrbQosCfg(drbInfo , &lcCfgToAdd->lcConfig) != ROK)
{
DU_LOG("\nERROR --> DUAPP : Failed to extract qos Cfg at extractDrbCfg()");
return RFAILED;
QoSInformation_ExtIEs__value_PR_DRB_Information)
{
drbInfo = &drbModItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information;
- if(extractDrbQosCfg(drbInfo , macLcToAdd) != ROK)
+ if(extractDrbQosCfg(drbInfo , &lcCfgToAdd->lcConfig) != ROK)
{
DU_LOG("\nERROR --> DUAPP : Failed to extract qos Cfg at extractDrbCfg()");
return RFAILED;
* ****************************************************************/
uint8_t extractMacRbCfg(uint8_t lcId, DRBs_ToBeSetup_Item_t *drbCfg,\
-DRBs_ToBeSetupMod_Item_t *drbSetupModCfg, DRBs_ToBeModified_Item_t *drbModCfg, LogicalChannelConfig_t *ulLcCfg, LcCfg *lcCfg, UpTnlCfg *upTnlInfo)
+DRBs_ToBeSetupMod_Item_t *drbSetupModCfg, DRBs_ToBeModified_Item_t *drbModCfg, LogicalChannelConfig_t *ulLcCfg, DuLcCfg *lcCfg, UpTnlCfg *upTnlInfo)
{
if(drbCfg != NULLP)
{
}
else
{
- lcCfg->drbQos = NULLP;
- lcCfg->snssai = NULLP;
- if(lcCfg->lcId == SRB2_LCID)
- lcCfg->dlLcCfg.lcp = LC_PRIORITY_3;
+ lcCfg->lcConfig.drbQos = NULLP;
+ lcCfg->lcConfig.snssai = NULLP;
+ if(lcCfg->lcConfig.lcId == SRB2_LCID)
+ lcCfg->lcConfig.dlLcCfg.lcp = LC_PRIORITY_3;
else
- lcCfg->dlLcCfg.lcp = LC_PRIORITY_1;
+ lcCfg->lcConfig.dlLcCfg.lcp = LC_PRIORITY_1;
+
}
if(ulLcCfg)
{
- lcCfg->ulLcCfgPres = true;
- extractUlLcCfg(&lcCfg->ulLcCfg, ulLcCfg);
+ lcCfg->lcConfig.ulLcCfgPres = true;
+ extractUlLcCfg(&lcCfg->lcConfig.ulLcCfg, ulLcCfg);
}
else
- lcCfg->ulLcCfgPres = false;
+ lcCfg->lcConfig.ulLcCfgPres = false;
return ROK;
}
uint8_t procMacLcCfg(uint8_t lcId, uint8_t rbType, uint8_t configType, DRBs_ToBeSetup_Item_t *drbItem,\
DRBs_ToBeSetupMod_Item_t *drbSetupModItem, DRBs_ToBeModified_Item_t *drbModItem, LogicalChannelConfig_t *ulLcCfg,\
-LcCfg *lcCfg, UpTnlCfg *upTnlInfo)
+DuLcCfg *lcCfg, UpTnlCfg *upTnlInfo)
{
uint8_t ret = ROK;
- lcCfg->lcId = lcId;
+ lcCfg->lcConfig.lcId = lcId;
lcCfg->configType = configType;
if(rbType == RB_TYPE_SRB)
{
ret = extractMacRbCfg(lcId, NULL, NULL, NULL, ulLcCfg, lcCfg, NULL);
}
- else if(rbType == RB_TYPE_DRB)
+ else if(rbType == RB_TYPE_DRB && upTnlInfo != NULLP)
{
if(drbItem != NULL)
ret = extractMacRbCfg(lcId, drbItem, NULL, NULL, ulLcCfg, lcCfg, upTnlInfo);
}
/* Filling RLC/MAC Config*/
- memset(&ueCfgDb->macLcCfg[idx], 0, sizeof(LcCfg));
+ memset(&ueCfgDb->macLcCfg[idx], 0, sizeof(DuLcCfg));
memset(&ueCfgDb->rlcLcCfg[idx], 0, sizeof(RlcBearerCfg));
procRlcLcCfg(rbId, lcId, rbType, rlcMode, CONFIG_UNKNOWN, f1RlcCfg, &(ueCfgDb->rlcLcCfg[idx]), NULLP);
if(procMacLcCfg(lcId, rbType, CONFIG_UNKNOWN, NULL, NULL, NULL, macUlLcCfg, &ueCfgDb->macLcCfg[idx], NULL) != ROK)
* @return void
*
* ****************************************************************/
-void freeMacServingCellInfo(ServCellCfgInfo *srvCellCfg)
+void freeMacServingCellInfo(ServCellRecfgInfo *srvCellCfg)
{
uint8_t timeDomRsrcIdx;
*
* @details
*
- * Function : freeUeReCfgCellGrpInfo
+ * Function : freeUeRecfgCellGrpInfo
*
* Functionality: Free cell Grp Cfg Info
*
- * @params[in] MacUeCfg* duUeCfg
+ * @params[in] DuMacUeCfg* duUeCfg
* @return void
*
* ****************************************************************/
-void freeUeReCfgCellGrpInfo(MacUeCfg *macUeCfg)
+void freeUeRecfgCellGrpInfo(DuMacUeCfg *macUeCfg)
{
freeMacServingCellInfo(&macUeCfg->spCellCfg.servCellCfg);
}
* @return ROK/RFAILD
*
* ****************************************************************/
-uint8_t extractSpCellDedicatedCfg(ServingCellConfig_t *cuSrvCellCfg, ServCellCfgInfo *macSrvCellCfg,\
-ServCellCfgInfo *storedSrvCellCfg)
+uint8_t extractSpCellDedicatedCfg(ServingCellConfig_t *cuSrvCellCfg, ServCellRecfgInfo *macSrvCellCfg,\
+ServCellRecfgInfo *storedSrvCellCfg)
{
uint8_t ret = ROK;
BWP_DownlinkDedicated_t *dlBwp = NULLP;
*
* @details
*
- * Function : extractUeReCfgCellInfo
+ * Function : extractUeRecfgCellInfo
*
* Functionality: Fills Reconfig Cell group Info received by CU
*
* @params[in] CellGroupConfigRrc_t *cellGrp = CellGroupConfigRrc_t information which
* is send by CU, which we have stored in F1UeContextSetupDb
- * MacUeCfg *MacUeCfg = Used to Store the information,
+ * DuMacUeCfg *MacUeCfg = Used to Store the information,
* which needs to send in other layer, as well as this can be
* the variable which stores the information in DuCb,
- * MacUeCfg *storedMacUeCfg = Null in case of sending the
+ * DuMacUeCfg *storedMacUeCfg = Null in case of sending the
* information to other layer else it will have copyOfmacUeCfg
* which we have stored in F1UeContextSetupDb.
*
* @return ROK/RFAILED
*
* ****************************************************************/
-uint8_t extractUeReCfgCellInfo(CellGroupConfigRrc_t *cellGrp, MacUeCfg *macUeCfg, MacUeCfg *storedMacUeCfg)
+uint8_t extractUeRecfgCellInfo(CellGroupConfigRrc_t *cellGrp, DuMacUeCfg *macUeCfg, DuMacUeCfg *storedMacUeCfg)
{
uint8_t ret = ROK;
MAC_CellGroupConfig_t *macCellGroup = NULLP;
*
* @details
*
- * Function : procUeReCfgCellInfo
+ * Function : procUeRecfgCellInfo
*
* Functionality: builds Mac Cell Cfg
*
- * @params[in] MacUeCfg *macUeCfgToSend = Used to Store the information which
+ * @params[in] DuMacUeCfg *macUeCfgToSend = Used to Store the information which
* needs to send in other layer, as well as this can be
* the variable which stores the information in DuCb.
- * MacUeCfg *storedMacUeCfg = Null in case of sending the
+ * DuMacUeCfg *storedMacUeCfg = Null in case of sending the
* information to other layer else it will have copyOfmacUeCfg
* which we have stored in F1UeContextSetupDb
* void *cellInfo = CellGroupConfigRrc_t information which is send
* @return void
*
* ****************************************************************/
-uint8_t procUeReCfgCellInfo(MacUeCfg *macUeCfgToSend, MacUeCfg *storedMacUeCfg, void *cellInfo)
+uint8_t procUeRecfgCellInfo(DuMacUeCfg *macUeCfgToSend, DuMacUeCfg *storedMacUeCfg, void *cellInfo)
{
uint8_t ret = ROK;
CellGroupConfigRrc_t *cellGrp = NULLP;
if(cellInfo)
{
cellGrp = (CellGroupConfigRrc_t *)cellInfo;
- ret = extractUeReCfgCellInfo(cellGrp, macUeCfgToSend, storedMacUeCfg);
+ ret = extractUeRecfgCellInfo(cellGrp, macUeCfgToSend, storedMacUeCfg);
if(ret == RFAILED)
- DU_LOG("\nERROR --> F1AP : Failed at procUeReCfgCellInfo()");
+ DU_LOG("\nERROR --> F1AP : Failed at procUeRecfgCellInfo()");
}
if(ret == RFAILED)
{
- freeUeReCfgCellGrpInfo(macUeCfgToSend);
+ freeUeRecfgCellGrpInfo(macUeCfgToSend);
}
return ret;
}
* RFAILED - failure
*
* ****************************************************************/
-void duFillModulationDetails(MacUeCfg *ueCfg, MacUeCfg *oldUeCfg, void *ueCap)
+void duFillModulationDetails(DuMacUeCfg *ueCfg, DuMacUeCfg *oldUeCfg, void *ueCap)
{
UE_NR_Capability_t *ueNrCap=NULLP;
* Functionality: Fills Srb List received by CU
*
* @params[in] SRBs_ToBeSetup_Item_t *cuSrbItem
- * LcCfg pointer
+ * DuLcCfg pointer
* RlcBearerCfg pointer
* @return void
*
* ****************************************************************/
-uint8_t procSrbListToSetup(SRBs_ToBeSetup_Item_t * srbItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcLcToAdd)
+uint8_t procSrbListToSetup(SRBs_ToBeSetup_Item_t * srbItem, DuLcCfg *duMacLcToAdd, RlcBearerCfg *rlcLcToAdd)
{
/* Filling RLC INFO */
procRlcLcCfg(srbItem->sRBID, srbItem->sRBID, RB_TYPE_SRB, RLC_AM, CONFIG_ADD, NULL, rlcLcToAdd, NULL);
/* Filling MAC INFO */
- if(procMacLcCfg(srbItem->sRBID, RB_TYPE_SRB, CONFIG_ADD, NULL,NULL, NULL, NULL, macLcToAdd, NULL) != ROK)
+ if(procMacLcCfg(srbItem->sRBID, RB_TYPE_SRB, CONFIG_ADD, NULL,NULL, NULL, NULL, duMacLcToAdd, NULL) != ROK)
{
DU_LOG("\nERROR --> F1AP : Failed at MAC LC Cfg in procSrbListToSetup()");
return RFAILED;
{
uint8_t ret = ROK, srbIdx = 0, rlcLcIdx = 0;
SRBs_ToBeSetup_Item_t *srbItem = NULLP;
- LcCfg *macLcCtxt = NULLP;
+ DuLcCfg *macLcCtxt = NULLP;
RlcBearerCfg *rlcLcCtxt = NULLP;
if(srbCfg)
}
if(!macLcCtxt)
{
- memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(LcCfg));
+ memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(DuLcCfg));
macLcCtxt = &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs];
ueCfgDb->numMacLcs++;
}
* for both MAC and RLC
*
* @params[in] DRBs_ToBeSetup_Item_t , DRBs_ToBeSetupMod_Item_t,
- * DRBs_ToBeModified_Item_t , lcId, LcCfg pointer,
+ * DRBs_ToBeModified_Item_t , lcId, DuLcCfg pointer,
* RlcBearerCfg , UpTnlCfg, RlcUeCfg
* @return void
*
* ****************************************************************/
uint8_t procDrbListToSetupMod(uint8_t lcId, DRBs_ToBeSetup_Item_t *drbItem,\
-DRBs_ToBeSetupMod_Item_t *drbSetupModItem, DRBs_ToBeModified_Item_t *drbModItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcLcToAdd, UpTnlCfg *upTnlInfo, RlcUeCfg *storedRlcUeCfg)
+DRBs_ToBeSetupMod_Item_t *drbSetupModItem, DRBs_ToBeModified_Item_t *drbModItem, DuLcCfg *macLcToAdd, RlcBearerCfg *rlcLcToAdd, UpTnlCfg *upTnlInfo, RlcUeCfg *storedRlcUeCfg)
{
uint8_t cfgIdx = 0;
RlcMode rlcModeInfo;
DRBs_ToBeSetup_Item_t *drbItem = NULLP;
DRBs_ToBeSetupMod_ItemIEs_t *drbSetupModItem = NULLP;
DRBs_ToBeModified_ItemIEs_t *drbModItem = NULLP;
- LcCfg *macLcCtxt = NULLP;
+ DuLcCfg *macLcCtxt = NULLP;
RlcBearerCfg *rlcLcCtxt = NULLP;
ret = ROK;
}
if(!macLcCtxt)
{
- memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(LcCfg));
+ memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(DuLcCfg));
macLcCtxt = &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs];
ueCfgDb->numMacLcs++;
}
DU_LOG("\nERROR --> F1AP : Failed at extractDrbListToSetupMod() for Modified List");
break;
}
+ ueCfgDb->numDrbModified++;
}
else
{
return ret;
}
+/*******************************************************************
+ *
+ * @brief extract Drb List received from CU
+ *
+ * @details
+ *
+ * Function : extractDrbListToRelease
+ *
+ * Functionality: extract Drb List received from CU
+ * for both MAC and RLC
+ *
+ * @params[in] DRBs_ToBeReleased_Item_t pointer
+ * DuUeCfg pointer
+ * @return ROK/RFAIED
+ *
+ * ****************************************************************/
+
+uint8_t extractDrbListToRelease(uint8_t ueId, DRBs_ToBeReleased_List_t *drbToRel, uint8_t drbCount, DuUeCfg *ueCfgDb, RlcUeCfg *rlcUeCfg)
+{
+ uint8_t ret = ROK, teIdx = 0;
+ uint8_t drbIdx = 0, rlcLcIdx = 0;
+ uint8_t drbId = 0, lcId = 0;
+ DRBs_ToBeReleased_ItemIEs_t *drbRelItem = NULLP;
+ DuLcCfg *macLcCtxt = NULLP;
+ RlcBearerCfg *rlcLcCtxt = NULLP;
+
+ ret = ROK;
+ if(drbCount > 0)
+ {
+ for(drbIdx = 0; drbIdx < drbCount; drbIdx++)
+ {
+ macLcCtxt = NULL;
+ rlcLcCtxt = NULL;
+
+ if(drbToRel != NULLP)
+ {
+ drbRelItem = (DRBs_ToBeReleased_ItemIEs_t *) drbToRel->list.array[drbIdx];
+ drbId = drbRelItem->value.choice.DRBs_ToBeReleased_Item.dRBID;
+ }
+ else
+ {
+ DU_LOG("ERROR --> DU APP : DrbToRelease pointer is NULL in extractDrbListToRelease");
+ return RFAILED;
+ }
+
+ for(rlcLcIdx = 0; rlcLcIdx < ueCfgDb->numRlcLcs; rlcLcIdx++)
+ {
+ if(ueCfgDb->rlcLcCfg[rlcLcIdx].rbId == drbId && ueCfgDb->rlcLcCfg[rlcLcIdx].rbType == RB_TYPE_DRB)
+ {
+ macLcCtxt = &ueCfgDb->macLcCfg[rlcLcIdx];
+ rlcLcCtxt = &ueCfgDb->rlcLcCfg[rlcLcIdx];
+ break;
+ }
+ }
+
+ if(!macLcCtxt)
+ {
+ memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(DuLcCfg));
+ macLcCtxt = &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs];
+ ueCfgDb->numMacLcs++;
+ }
+ if(!rlcLcCtxt)
+ {
+ memset(&ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], 0, sizeof(RlcBearerCfg));
+ rlcLcCtxt = &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs];
+ ueCfgDb->numRlcLcs++;
+ }
+ lcId = fetchLcId(drbId);
+ if(lcId < MIN_DRB_LCID)
+ {
+ DU_LOG("\nERROR --> F1AP : Failed fetching LCID %d in extractDrbListToRelease() for Modified List", lcId);
+ break;
+ }
+
+ /* Filling RLC INFO */
+ procRlcLcCfg(drbId, lcId, RB_TYPE_DRB, rlcLcCtxt->rlcMode, CONFIG_DEL, NULL, rlcLcCtxt, NULLP);
+ /* Filling MAC INFO */
+ if(procMacLcCfg(lcId, RB_TYPE_DRB, CONFIG_DEL, NULL, NULL, NULL, NULL, macLcCtxt, NULLP) != ROK)
+ {
+ DU_LOG("\nERROR --> F1AP : Failed at RLC LC Cfg in extractDrbListToRelease()");
+ return RFAILED;
+ }
+ ueCfgDb->upTnlInfo[ueCfgDb->numDrb].configType = CONFIG_DEL;
+ ueCfgDb->upTnlInfo[ueCfgDb->numDrb].drbId = drbId;
+ ueCfgDb->upTnlInfo[ueCfgDb->numDrb].ueId = ueId;
+
+ for(teIdx = 0; teIdx < duCb.numTeId; teIdx++)
+ {
+ if((duCb.upTnlCfg[teIdx]->ueId == ueCfgDb->upTnlInfo[ueCfgDb->numDrb].ueId) && \
+ (duCb.upTnlCfg[teIdx]->drbId == ueCfgDb->upTnlInfo[ueCfgDb->numDrb].drbId))
+ {
+ DU_ALLOC(ueCfgDb->upTnlInfo[ueCfgDb->numDrb].tnlCfg1, sizeof(GtpTnlCfg));
+ memcpy(ueCfgDb->upTnlInfo[ueCfgDb->numDrb].tnlCfg1, duCb.upTnlCfg[teIdx]->tnlCfg1, sizeof(GtpTnlCfg));
+ break;
+ }
+ }
+
+ ueCfgDb->numDrb++;
+ if(ret == RFAILED)
+ {
+ DU_LOG("\nERROR --> F1AP : Failed at extractDrbListToRelease() for Modified List");
+ break;
+ }
+
+ DU_LOG("\nDEBUG --> DUAPP: extractDrbListToRelease():lcId:%x, [RLC,MAC,NumDrb]:[%x,%x,%x]",\
+ lcId,ueCfgDb->numRlcLcs, ueCfgDb->numMacLcs, ueCfgDb->numDrb);
+ }
+ }
+ else
+ ret = RFAILED;
+
+ return ret;
+}
+
/*******************************************************************
*
* @brief Function to extract Dl RRC Msg received from CU
FreeUeContextSetupRsp(f1apMsg);
return ret;
}/* End of BuildAndSendUeContextSetupRsp */
+
/*******************************************************************
*
* @brief Build And Send Ue Context Rsp
drbCnt = ueCfg->numDrbSetupMod;
- if(!drbCnt)
- {
- DU_LOG("\nINFO --> F1AP : BuildDrbToBeSetupModList(): No DRB information to avaialble to add");
- return ROK;
- }
-
drbSet->list.count = drbCnt;
drbSet->list.size = drbCnt * sizeof(DRBs_SetupMod_ItemIEs_t *);
DU_ALLOC(drbSet->list.array, drbSet->list.size);
DU_FREE(drbSetupList->list.array, drbSetupList->list.size);
}
+/*******************************************************************
+*
+* @brief Builds the DRB to be Mod list
+*
+* @details
+*
+* Function :
+*
+* Functionality: Constructs the DRB to be Mod list
+*
+* @params[in] DRBs_Modified_List_t *drbModList
+*
+* @return ROK - success
+* RFAILED - failure
+*
+* ****************************************************************/
+
+uint8_t BuildDrbModList(DRBs_Modified_List_t *drbModList, DuUeCfg *ueCfg)
+{
+ uint8_t arrIdx =0, drbIdx = 0;
+ uint8_t drbCnt =0;
+ struct DRBs_Modified_ItemIEs *drbItemIe;
+
+ /*VS: Below for loop is for debug purpose, to remove in final patch*/
+ for(arrIdx = 0; arrIdx < ueCfg->numDrb; arrIdx++)
+ {
+ if(ueCfg->upTnlInfo[arrIdx].configType == CONFIG_MOD)
+ {
+ drbCnt++;
+ }
+ }
+
+ drbCnt = ueCfg->numDrbModified;
+
+ drbModList->list.count = drbCnt;
+ drbModList->list.size = drbCnt * sizeof(DRBs_Modified_ItemIEs_t *);
+ DU_ALLOC(drbModList->list.array, drbModList->list.size);
+ if(drbModList->list.array == NULLP)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbModList()");
+ return RFAILED;
+ }
+
+ drbIdx = 0;
+ for(arrIdx = 0; arrIdx < ueCfg->numMacLcs; arrIdx++)
+ {
+ if(ueCfg->macLcCfg[arrIdx].configType == CONFIG_MOD)
+ {
+ DU_ALLOC(drbModList->list.array[drbIdx], sizeof(DRBs_Modified_ItemIEs_t));
+ if(drbModList->list.array[drbIdx] == NULLP)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbModList");
+ return RFAILED;
+ }
+
+ drbItemIe = (struct DRBs_Modified_ItemIEs *)drbModList->list.array[drbIdx];
+ drbItemIe->id = ProtocolIE_ID_id_DRBs_Modified_Item;
+ drbItemIe->criticality = Criticality_reject;
+ drbItemIe->value.present = DRBs_Modified_ItemIEs__value_PR_DRBs_Modified_Item;
+ drbItemIe->value.choice.DRBs_Modified_Item.dRBID = ueCfg->upTnlInfo[arrIdx].drbId;
+ if(fillDlTnlSetupList(&drbItemIe->value.choice.DRBs_Modified_Item.dLUPTNLInformation_ToBeSetup_List,\
+ &ueCfg->upTnlInfo[arrIdx])!= ROK)
+ {
+ DU_LOG("\nERROR --> F1AP : Failed to fill DlTnl SetupList in BuildDrbModList");
+ return RFAILED;
+ }
+ drbIdx++;
+ }
+ }
+
+ return ROK;
+}
+
+/*******************************************************************
+* @brief Free the memory allocated for DRB Mod List
+*
+* @details
+*
+* Function : FreeDrbModList
+*
+* Functionality:
+* Free the memory allocated for DRB modified list
+*
+* @params[in] DRBs_Modified_List_t *
+* @return void
+*
+* ****************************************************************/
+void FreeDrbModList(DRBs_Modified_List_t *drbModList)
+{
+ uint8_t arrIdx = 0;
+ DRBs_Modified_ItemIEs_t *drbItemIe = NULLP;
+
+ for(arrIdx = 0; arrIdx < drbModList->list.count; arrIdx++)
+ {
+ drbItemIe = ((DRBs_Modified_ItemIEs_t *)drbModList->list.array[arrIdx]);
+ freeDlTnlInfo(&drbItemIe->value.choice.DRBs_Modified_Item.dLUPTNLInformation_ToBeSetup_List);
+ DU_FREE(drbModList->list.array[arrIdx], sizeof(DRBs_Modified_ItemIEs_t));
+ }
+ DU_FREE(drbModList->list.array, drbModList->list.size);
+}
+
/*******************************************************************
* @brief Free the memory allocated for SRB setup List
*
value.choice.DRBs_SetupMod_List));
break;
}
+ case ProtocolIE_ID_id_DRBs_Modified_List:
+ {
+ FreeDrbModList(&(ueContextModifyRes->protocolIEs.list.array[ieIdx]->\
+ value.choice.DRBs_Modified_List));
+ break;
+ }
case ProtocolIE_ID_id_SRBs_SetupMod_List:
{
FreeSrbSetupModList(&(ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.choice.\
if(ueCb->f1UeDb->actionType == UE_CTXT_MOD)
{
+ elementCnt = 2;
if(ueCb->f1UeDb->duUeCfg.numDrbSetupMod)
- elementCnt =3;
- else
- elementCnt =2;
+ elementCnt++;
+ if(ueCb->f1UeDb->duUeCfg.numDrbModified)
+ elementCnt++;
}
if(ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY)
+ {
elementCnt = 5;
+ }
if(ueCb->f1UeDb->actionType == UE_CTXT_RRC_RECFG_COMPLETE)
elementCnt = 2;
ueContextModifyRes->protocolIEs.list.count = elementCnt;
BuildCellGroupConfigRrc(ueCb, &ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCInformation.cellGroupConfig);
}
- if((ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY) || ((ueCb->f1UeDb->actionType == UE_CTXT_MOD) && (ueCb->f1UeDb->duUeCfg.numDrbSetupMod)))
+ if((ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY) || \
+ ((ueCb->f1UeDb->actionType == UE_CTXT_MOD) && (ueCb->f1UeDb->duUeCfg.numDrbSetupMod)))
{
ieIdx++;
ueContextModifyRes->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_SetupMod_List;
}
}
+ if((ueCb->f1UeDb->actionType == UE_CTXT_MOD) && (ueCb->f1UeDb->duUeCfg.numDrbModified))
+ {
+ ieIdx++;
+ ueContextModifyRes->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_Modified_List;
+ ueContextModifyRes->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
+ ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.present =\
+ UEContextModificationResponseIEs__value_PR_DRBs_Modified_List;
+ ret = BuildDrbModList(&(ueContextModifyRes->protocolIEs.list.array[ieIdx]->\
+ value.choice.DRBs_Modified_List) , &ueCb->f1UeDb->duUeCfg);
+ if(ret != ROK)
+ {
+ DU_LOG( "\nERROR --> F1AP : Failed to build DRB Modified List ");
+ break;
+ }
+ }
+
if(ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY)
{
ieIdx++;
/* Encode results */
if(encRetVal.encoded == ENCODE_FAIL)
{
- DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
+ DU_LOG( "\nERROR --> F1AP : Could not encode UE Modification Response structure (at %s)\n",\
encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
ret = RFAILED;
break;
}
/* Sending msg */
- if(sendF1APMsg() != ROK)
+ if(sendF1APMsg() != ROK && (ret == ROK))
{
- DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Res Failed");
+ DU_LOG("\nERROR --> F1AP : Sending UE Modification Res Failed");
ret = RFAILED;
break;
}
FreeUeContextModResp(f1apMsg);
return ret;
}
+
/*******************************************************************
*
* @brief Deallocating the memory allocated by the aper decoder
free(ulInfo->list.array);
}
}
+
/*******************************************************************
*
* @brief Deallocating the memory allocated by the aper decoder
free(drbSet->list.array);
}
+}
+
+/*******************************************************************
+ *
+ * @brief Deallocating the memory allocated by the aper decoder
+ * for DrbSetupModItem
+ *
+ * @details
+ *
+ * Function : freeAperDecodeDrbModifiedItem
+ *
+ * Functionality: Deallocating memory allocated for DrbModifedItem
+ *
+ * @params[in] DRBs_ToBeModified_Item_t *drbItem
+ *
+ * @return void
+ *
+ * ****************************************************************/
+
+void freeAperDecodeDrbModifiedItem(DRBs_ToBeModified_Item_t *drbItem)
+{
+ uint8_t arrIdx =0;
+ SNSSAI_t *snssai =NULLP;
+ Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
+
+ if(drbItem->qoSInformation != NULLP)
+ {
+ drbItem->qoSInformation->present = QoSInformation_PR_choice_extension;
+ switch(drbItem->qoSInformation->present)
+ {
+ case QoSInformation_PR_NOTHING:
+ break;
+ case QoSInformation_PR_eUTRANQoS:
+ {
+ if(drbItem->qoSInformation->choice.eUTRANQoS)
+ {
+ free(drbItem->qoSInformation->choice.eUTRANQoS);
+ }
+ break;
+ }
+ case QoSInformation_PR_choice_extension:
+ {
+ if(drbItem->qoSInformation->choice.choice_extension)
+ {
+ freeAperDecodeQosInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.\
+ DRB_Information.dRB_QoS);
+ snssai = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.sNSSAI;
+ if(snssai->sST.buf)
+ {
+ free(snssai->sST.buf);
+ }
+ if(snssai->sD)
+ {
+ if(snssai->sD->buf)
+ {
+ free(snssai->sD->buf);
+ }
+ free(snssai->sD);
+ }
+
+ flowMap = &drbItem->qoSInformation->choice.choice_extension->value.choice.\
+ DRB_Information.flows_Mapped_To_DRB_List;
+ if(flowMap->list.array)
+ {
+ for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
+ {
+ if(flowMap->list.array[arrIdx] )
+ {
+ freeAperDecodeQosInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
+ free(flowMap->list.array[arrIdx]);
+ }
+ }
+ free(flowMap->list.array);
+ }
+
+ free(drbItem->qoSInformation->choice.choice_extension);
+ }
+ break;
+ }
+ }
+ free(drbItem->qoSInformation);
+ }
+ freeAperDecodeUlTnlInfoforDrbSetupMod(&drbItem->uLUPTNLInformation_ToBeSetup_List);
+ if(drbItem->uLConfiguration)
+ {
+ free(drbItem->uLConfiguration);
+ }
+}
+
+/*******************************************************************
+ *
+ * @brief Deallocating the memory allocated by the aper decoder
+ * for DrbToBeSetupModList
+ *
+ * @details
+ *
+ * Function : freeAperDecodeDrbToBeModifiedList
+ *
+ * Functionality: Deallocating memory allocated for DrbToBeModifiedList
+ *
+ * @params[in] DRBs_ToBeModified_List_t *drbSet
+ *
+ * @return void
+ *
+ * ****************************************************************/
+
+void freeAperDecodeDrbToBeModifiedList(DRBs_ToBeModified_List_t *drbSet)
+{
+ uint8_t arrIdx =0;
+ struct DRBs_ToBeModified_ItemIEs *drbItemIe;
+
+ if(drbSet->list.array)
+ {
+ for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
+ {
+ if(drbSet->list.array[arrIdx] != NULLP)
+ {
+ if(arrIdx == 0)
+ {
+ drbItemIe = (DRBs_ToBeModified_ItemIEs_t *)drbSet->list.array[arrIdx];
+ freeAperDecodeDrbModifiedItem(&(drbItemIe->value.choice.DRBs_ToBeModified_Item));
+ }
+ free(drbSet->list.array[arrIdx]);
+ }
+ }
+ free(drbSet->list.array);
+ }
+
+}
+
+/*******************************************************************
+ *
+ * @brief Deallocating the memory allocated by the aper decoder
+ * for DrbToBeSetupModList
+ *
+ * @details
+ *
+ * Function : freeAperDecodeDrbToBeReleasedList
+ *
+ * Functionality: Deallocating memory allocated for DrbToBeReleasedList
+ *
+ * @params[in] DRBs_ToBeReleased_List_t *drbSet
+ *
+ * @return void
+ *
+ * ****************************************************************/
+
+void freeAperDecodeDrbToBeReleasedList(DRBs_ToBeReleased_List_t *drbSet)
+{
+ uint8_t arrIdx =0;
+
+ if(drbSet->list.array)
+ {
+ for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
+ {
+ if(drbSet->list.array[arrIdx] != NULLP)
+ {
+ free(drbSet->list.array[arrIdx]);
+ }
+ }
+ free(drbSet->list.array);
+ }
+
}
/*******************************************************************
*
value.choice.DRBs_ToBeSetupMod_List);
break;
}
+ case ProtocolIE_ID_id_DRBs_ToBeModified_List:
+ {
+ freeAperDecodeDrbToBeModifiedList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->\
+ value.choice.DRBs_ToBeModified_List);
+ break;
+ }
+ case ProtocolIE_ID_id_DRBs_ToBeReleased_List:
+ {
+ freeAperDecodeDrbToBeReleasedList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->\
+ value.choice.DRBs_ToBeReleased_List);
+ break;
+ }
case ProtocolIE_ID_id_TransmissionActionIndicator:
break;
case ProtocolIE_ID_id_RRCContainer:
UEContextModificationRequest_t *ueContextModifyReq = NULLP;
uint8_t ret = ROK, ieIdx = 0, cellIdx=0;
DuUeCb *duUeCb = NULLP;
- DRBs_ToBeSetupMod_List_t *drbSetupModCfg;
- DRBs_ToBeModified_List_t *drbModifiedCfg;
+ DRBs_ToBeSetupMod_List_t *drbSetupModCfg = NULLP;
+ DRBs_ToBeModified_List_t *drbModifiedCfg = NULLP;
+ DRBs_ToBeReleased_List_t *drbToRelease = NULLP;
uint32_t gnbCuUeF1apId, gnbDuUeF1apId;
ueContextModifyReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
case ProtocolIE_ID_id_DRBs_ToBeModified_List:
+ case ProtocolIE_ID_id_DRBs_ToBeReleased_List:
{
if(duUeCb->f1UeDb)
{
+ /*DRBs to be Added*/
if(ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present ==\
UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List)
{
}
}
+ /*DRBs to be Modified*/
if(ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present == \
UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List)
ret = RFAILED;
}
}
+ /*DRBs to be Released*/
+ if(ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present == \
+ UEContextModificationRequestIEs__value_PR_DRBs_ToBeReleased_List)
+
+ {
+ drbToRelease = &ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.\
+ choice.DRBs_ToBeReleased_List;
+ if(extractDrbListToRelease(gnbDuUeF1apId, drbToRelease, drbToRelease->list.count,\
+ &duUeCb->f1UeDb->duUeCfg, &duUeCb->rlcUeCfg))
+ {
+ DU_LOG("\nERROR --> DU APP : Failed at extractDrbListToSetupMod() for DrbModifiedList");
+ ret = RFAILED;
+ }
+ }
}
break;
}
uint8_t BuildAndSendInitialRrcMsgTransfer(uint32_t gnbDuUeF1apId, uint16_t crnti, uint16_t rrcContSize,
uint8_t *rrcContainer);
uint8_t BuildAndSendULRRCMessageTransfer(DuUeCb *ueCb, uint8_t lcId, uint16_t msgLen, uint8_t *rrcMsg);
-uint8_t procUeReCfgCellInfo(MacUeCfg *macUeCfg, MacUeCfg *storedMacUeCfg, void *cellGrp);
-void freeUeReCfgCellGrpInfo(MacUeCfg *macUeCfg);
+uint8_t procUeRecfgCellInfo(DuMacUeCfg *macUeCfg, DuMacUeCfg *storedMacUeCfg, void *cellGrp);
+void freeUeRecfgCellGrpInfo(DuMacUeCfg *macUeCfg);
uint8_t BuildAndSendUeCtxtRsp(uint8_t cellId, uint8_t ueId);
uint8_t getDrbLcId(uint32_t *drbBitMap);
void freeMacLcCfg(LcCfg *lcCfg);
uint8_t sctpSend(Buffer *mBuf, uint8_t itfType);
uint8_t duProcDlRrcMsg(F1DlRrcMsg *dlRrcMsg);
uint8_t duProcUeContextSetupRequest(DuUeCb *ueCb);
-void duFillModulationDetails(MacUeCfg *ueCfg, MacUeCfg *oldUeCfg, void *ueCap);
+void duFillModulationDetails(DuMacUeCfg *ueCfg, DuMacUeCfg *oldUeCfg, void *ueCap);
int8_t getReAsmblTmr(uint8_t reAsmblTmrCfg);
int16_t getStatProhTmr(uint8_t statProhTmrCfg);
uint8_t duProcUeContextModReq(DuUeCb *ueCb);
}DrxCycle;
#endif
+typedef struct duLcCfg
+{
+ ConfigType configType;
+ LcCfg lcConfig;
+}DuLcCfg;
+
+typedef struct duMacUeCfg
+{
+ uint16_t cellId;
+ uint8_t ueId;
+ uint16_t crnti;
+ bool macCellGrpCfgPres;
+ MacCellGrpCfg macCellGrpCfg;
+ bool phyCellGrpCfgPres;
+ PhyCellGrpCfg phyCellGrpCfg;
+ bool spCellCfgPres;
+ SpCellRecfg spCellCfg;
+ AmbrCfg *ambrCfg;
+ ModulationInfo dlModInfo; /* DL modulation info */ //TBD
+ ModulationInfo ulModInfo; /* UL modulation info */ //TBD
+ uint8_t numLcs;
+ DuLcCfg lcCfgList[MAX_NUM_LC];
+ UeCfgState macUeCfgState; /* InActive / Completed */ //TBD
+ DataTransmissionAction transmissionAction; //TBD
+#ifdef NR_DRX
+ bool drxConfigIndicatorRelease;
+#endif
+}DuMacUeCfg;
+
typedef struct duUeCfg
{
void *cellGrpCfg;
uint8_t numRlcLcs; /* Rlc Ue Cfg */
RlcBearerCfg rlcLcCfg[MAX_NUM_LC];
uint8_t numMacLcs; /* Mac Ue Cfg */
- LcCfg macLcCfg[MAX_NUM_LC];
+ DuLcCfg macLcCfg[MAX_NUM_LC];
AmbrCfg *ambrCfg;
uint8_t numDrb;
UpTnlCfg upTnlInfo[MAX_NUM_DRB]; /* User plane TNL Info*/
uint8_t numDrbSetupMod; /*No. of DRB Added during Modification*/
- MacUeCfg copyOfmacUeCfg;
+ uint8_t numDrbModified; /*No. of DRB Modified during Modification*/
+ DuMacUeCfg copyOfmacUeCfg;
DataTransmissionAction dataTransmissionAction;
#ifdef NR_DRX
bool drxCyclePres;
uint32_t drbBitMap; /* Drb Bit Map */
UeState ueState; /* UE Active/ Ue Inactive state */
MacCfraResource cfraResource; /* CF-RA resource assigned by MAC/SCH */
- MacUeCfg macUeCfg; /* Mac Ue Cfg */
+ DuMacUeCfg duMacUeCfg; /* Mac Ue Cfg */
RlcUeCfg rlcUeCfg; /* Rlc Ue Cfg */
}DuUeCb;
}
case EVENT_MAC_UE_RECONFIG_RSP:
{
- ret = unpackDuMacUeCfgRsp(DuProcMacUeCfgRsp, pst, mBuf);
+ ret = unpackDuMacUeRecfgRsp(DuProcMacUeRecfgRsp, pst, mBuf);
break;
}
case EVENT_MAC_UE_DELETE_RSP:
if(initUlBwp->puschPresent)
{
initUlBwp->puschCfg.dataScramblingId = SCRAMBLING_ID;
- initUlBwp->puschCfg.dmrsUlCfgForPuschMapTypeA.addPos = ADDITIONALPOSITION_POS0;
- initUlBwp->puschCfg.dmrsUlCfgForPuschMapTypeA.transPrecodDisabled. \
- scramblingId0 = SCRAMBLING_ID;
- initUlBwp->puschCfg.resourceAllocType = RESOURCEALLOCATION_TYPE1;
- initUlBwp->puschCfg.numTimeDomRsrcAlloc = 2;
- idx = 0;
- if(initUlBwp->puschCfg.numTimeDomRsrcAlloc <= MAX_NUM_UL_ALLOC)
- {
- initUlBwp->puschCfg.timeDomRsrcAllocList[idx].k2 = PUSCH_K2_CFG1;
- initUlBwp->puschCfg.timeDomRsrcAllocList[idx].mappingType =\
- MAPPING_TYPEA;
- initUlBwp->puschCfg.timeDomRsrcAllocList[idx].startSymbol = PUSCH_START_SYMBOL;
- initUlBwp->puschCfg.timeDomRsrcAllocList[idx].symbolLength = PUSCH_LENGTH_SYMBOL;
- initUlBwp->puschCfg.timeDomRsrcAllocList[idx].startSymbolAndLength =\
- calcSliv(PUSCH_START_SYMBOL, PUSCH_LENGTH_SYMBOL);
-
- idx++;
- initUlBwp->puschCfg.timeDomRsrcAllocList[idx].k2 = PUSCH_K2_CFG2;
- initUlBwp->puschCfg.timeDomRsrcAllocList[idx].mappingType = MAPPING_TYPEA;
- initUlBwp->puschCfg.timeDomRsrcAllocList[idx].startSymbol = PUSCH_START_SYMBOL;
- initUlBwp->puschCfg.timeDomRsrcAllocList[idx].symbolLength = PUSCH_LENGTH_SYMBOL;
- initUlBwp->puschCfg.timeDomRsrcAllocList[idx].startSymbolAndLength =\
- calcSliv(PUSCH_START_SYMBOL, PUSCH_LENGTH_SYMBOL);
- }
- initUlBwp->puschCfg.transformPrecoder = TRANSFORM_PRECODER_DISABLED;
+ initUlBwp->puschCfg.dmrsUlCfgForPuschMapTypeA.addPos = ADDITIONALPOSITION_POS0;
+ initUlBwp->puschCfg.dmrsUlCfgForPuschMapTypeA.transPrecodDisabled. \
+ scramblingId0 = SCRAMBLING_ID;
+ initUlBwp->puschCfg.resourceAllocType = RESOURCEALLOCATION_TYPE1;
+ initUlBwp->puschCfg.numTimeDomRsrcAlloc = 2;
+ idx = 0;
+ if(initUlBwp->puschCfg.numTimeDomRsrcAlloc <= MAX_NUM_UL_ALLOC)
+ {
+ initUlBwp->puschCfg.timeDomRsrcAllocList[idx].k2 = PUSCH_K2_CFG1;
+ initUlBwp->puschCfg.timeDomRsrcAllocList[idx].mappingType =\
+ MAPPING_TYPEA;
+ initUlBwp->puschCfg.timeDomRsrcAllocList[idx].startSymbol = PUSCH_START_SYMBOL;
+ initUlBwp->puschCfg.timeDomRsrcAllocList[idx].symbolLength = PUSCH_LENGTH_SYMBOL;
+ initUlBwp->puschCfg.timeDomRsrcAllocList[idx].startSymbolAndLength =\
+ calcSliv(PUSCH_START_SYMBOL, PUSCH_LENGTH_SYMBOL);
+
+ idx++;
+ initUlBwp->puschCfg.timeDomRsrcAllocList[idx].k2 = PUSCH_K2_CFG2;
+ initUlBwp->puschCfg.timeDomRsrcAllocList[idx].mappingType = MAPPING_TYPEA;
+ initUlBwp->puschCfg.timeDomRsrcAllocList[idx].startSymbol = PUSCH_START_SYMBOL;
+ initUlBwp->puschCfg.timeDomRsrcAllocList[idx].symbolLength = PUSCH_LENGTH_SYMBOL;
+ initUlBwp->puschCfg.timeDomRsrcAllocList[idx].startSymbolAndLength =\
+ calcSliv(PUSCH_START_SYMBOL, PUSCH_LENGTH_SYMBOL);
+ }
+ initUlBwp->puschCfg.transformPrecoder = TRANSFORM_PRECODER_DISABLED;
}
}
else
*
* Functionality: Fills Sp Cell Group Info
*
- * @params[in] MacUeCfg *macUeCfg
+ * @params[in] DuMacUeCfg *macUeCfg
* @return ROK - Success
* RFAILED - Failure
*
*****************************************************************/
-uint8_t fillDefaultSpCellGrpInfo(MacUeCfg *macUeCfg)
+uint8_t fillDefaultSpCellGrpInfo(DuMacUeCfg *macUeCfg)
{
- SpCellCfg *spCell = NULL;
+ SpCellRecfg *spCell = NULL;
if(macUeCfg)
spCell = &macUeCfg->spCellCfg;
return RFAILED;
}
- spCell->servCellCfg.numDlBwpToAdd = 0;
+ spCell->servCellCfg.numDlBwpToAddOrMod = 0;
+ spCell->servCellCfg.numDlBwpToRel = 0;
spCell->servCellCfg.firstActvDlBwpId = ACTIVE_DL_BWP_ID;
spCell->servCellCfg.defaultDlBwpId = ACTIVE_DL_BWP_ID;
spCell->servCellCfg.bwpInactivityTmr = NULLP;
/* Filling Initial UL Bwp*/
fillDefaultInitUlBwp(&spCell->servCellCfg.initUlBwp);
- spCell->servCellCfg.numUlBwpToAdd = 0;
- spCell->servCellCfg.firstActvUlBwpId = ACTIVE_DL_BWP_ID;
+ spCell->servCellCfg.numUlBwpToAddOrMod = 0;
+ spCell->servCellCfg.numUlBwpToRel = 0;
+ spCell->servCellCfg.firstActvUlBwpId = ACTIVE_DL_BWP_ID;
}
else
{
*
* Functionality: Fills Physical Cell Group Info
*
- * @params[in] MacUeCfg *macUeCfg
+ * @params[in] DuMacUeCfg *macUeCfg
* @return void
*
*****************************************************************/
-void fillDefaultPhyCellGrpInfo(MacUeCfg *macUeCfg)
+void fillDefaultPhyCellGrpInfo(DuMacUeCfg *macUeCfg)
{
PhyCellGrpCfg *cellGrp = NULL;
*
* Functionality: Fills Mac Cell Group Info
*
- * @params[in] MacUeCfg *macUeCfg
+ * @params[in] DuMacUeCfg *macUeCfg
* @return void
*
*****************************************************************/
-void fillDefaultMacCellGrpInfo(MacUeCfg *macUeCfg)
+void fillDefaultMacCellGrpInfo(DuMacUeCfg *macUeCfg)
{
uint8_t idx;
MacCellGrpCfg *cellGrp = NULL;
* RFAILED - failure
*
* ****************************************************************/
-void fillDefaultModulation(MacUeCfg *ueCfg)
+void fillDefaultModulation(DuMacUeCfg *ueCfg)
{
ueCfg->dlModInfo.modOrder = MOD_ORDER_QPSK;
ueCfg->dlModInfo.mcsIndex = DEFAULT_MCS;
* @return void
*****************************************************************/
-void fillMacSrb1LcCfg(LcCfg *macLcCfg)
+void fillMacSrb1LcCfg(DuLcCfg *macLcCfg)
{
- macLcCfg->lcId = SRB1_LCID;
+ macLcCfg->lcConfig.lcId = SRB1_LCID;
macLcCfg->configType = CONFIG_ADD;
- macLcCfg->drbQos = NULLP;
- macLcCfg->snssai = NULLP;
- macLcCfg->ulLcCfgPres = true;
- fillDefaultUlLcCfg(&macLcCfg->ulLcCfg);
+ macLcCfg->lcConfig.drbQos = NULLP;
+ macLcCfg->lcConfig.snssai = NULLP;
+ macLcCfg->lcConfig.ulLcCfgPres = true;
+ fillDefaultUlLcCfg(&macLcCfg->lcConfig.ulLcCfg);
}
/******************************************************************
*
*****************************************************************/
-uint8_t fillMacLcCfgToAddMod(LcCfg *macLcCfgToSend, LcCfg *ueLcCfgDb, LcCfg *oldLcCfg, Bool toUpdate)
+uint8_t fillMacLcCfgToAddMod(DuLcCfg *macLcCfgToSend, DuLcCfg *ueLcCfgDb, DuLcCfg *oldLcCfg, Bool toUpdate)
{
if(!toUpdate)
{
if(macLcCfgToSend)
{
- macLcCfgToSend->lcId = ueLcCfgDb->lcId;
+ macLcCfgToSend->lcConfig.lcId = ueLcCfgDb->lcConfig.lcId;
macLcCfgToSend->configType = ueLcCfgDb->configType;
- if(ueLcCfgDb->drbQos)
- macLcCfgToSend->drbQos = ueLcCfgDb->drbQos;
+ if(ueLcCfgDb->lcConfig.drbQos)
+ macLcCfgToSend->lcConfig.drbQos = ueLcCfgDb->lcConfig.drbQos;
else if(oldLcCfg)
- macLcCfgToSend->drbQos = oldLcCfg->drbQos;
+ macLcCfgToSend->lcConfig.drbQos = oldLcCfg->lcConfig.drbQos;
else
- macLcCfgToSend->drbQos = NULL;
+ macLcCfgToSend->lcConfig.drbQos = NULL;
- if(ueLcCfgDb->snssai)
- macLcCfgToSend->snssai = ueLcCfgDb->snssai;
+ if(ueLcCfgDb->lcConfig.snssai)
+ macLcCfgToSend->lcConfig.snssai = ueLcCfgDb->lcConfig.snssai;
else if(oldLcCfg)
- macLcCfgToSend->snssai = oldLcCfg->snssai;
+ macLcCfgToSend->lcConfig.snssai = oldLcCfg->lcConfig.snssai;
else
- macLcCfgToSend->snssai = NULL;
+ macLcCfgToSend->lcConfig.snssai = NULL;
- macLcCfgToSend->ulLcCfgPres = ueLcCfgDb->ulLcCfgPres;
- memcpy(&macLcCfgToSend->ulLcCfg, &ueLcCfgDb->ulLcCfg, sizeof(UlLcCfg));
- memcpy(&macLcCfgToSend->dlLcCfg, &ueLcCfgDb->dlLcCfg, sizeof(DlLcCfg));
+ macLcCfgToSend->lcConfig.ulLcCfgPres = ueLcCfgDb->lcConfig.ulLcCfgPres;
+ memcpy(&macLcCfgToSend->lcConfig.ulLcCfg, &ueLcCfgDb->lcConfig.ulLcCfg, sizeof(UlLcCfg));
+ memcpy(&macLcCfgToSend->lcConfig.dlLcCfg, &ueLcCfgDb->lcConfig.dlLcCfg, sizeof(DlLcCfg));
}
}
else
{
- oldLcCfg->lcId = ueLcCfgDb->lcId;
+ oldLcCfg->lcConfig.lcId = ueLcCfgDb->lcConfig.lcId;
oldLcCfg->configType = ueLcCfgDb->configType;
- if(ueLcCfgDb->drbQos)
+ if(ueLcCfgDb->lcConfig.drbQos)
{
- if(oldLcCfg->drbQos)
- DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, oldLcCfg->drbQos, sizeof(DrbQosInfo));
+ if(oldLcCfg->lcConfig.drbQos)
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, oldLcCfg->lcConfig.drbQos, sizeof(DrbQosInfo));
- DU_ALLOC_SHRABL_BUF(oldLcCfg->drbQos, sizeof(DrbQosInfo));
- if(oldLcCfg->drbQos == NULL)
+ DU_ALLOC_SHRABL_BUF(oldLcCfg->lcConfig.drbQos, sizeof(DrbQosInfo));
+ if(oldLcCfg->lcConfig.drbQos == NULL)
{
DU_LOG("\nERROR --> DU APP : Memory Alloc Failed at fillMacLcCfgToAddMod()");
return RFAILED;
}
- memcpy(oldLcCfg->drbQos, ueLcCfgDb->drbQos, sizeof(DrbQosInfo));
+ memcpy(oldLcCfg->lcConfig.drbQos, ueLcCfgDb->lcConfig.drbQos, sizeof(DrbQosInfo));
}
- if(ueLcCfgDb->snssai)
+ if(ueLcCfgDb->lcConfig.snssai)
{
- if(oldLcCfg->snssai)
- DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, oldLcCfg->snssai, sizeof(Snssai));
+ if(oldLcCfg->lcConfig.snssai)
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, oldLcCfg->lcConfig.snssai, sizeof(Snssai));
- DU_ALLOC_SHRABL_BUF(oldLcCfg->snssai, sizeof(Snssai));
- if(oldLcCfg->snssai == NULL)
+ DU_ALLOC_SHRABL_BUF(oldLcCfg->lcConfig.snssai, sizeof(Snssai));
+ if(oldLcCfg->lcConfig.snssai == NULL)
{
DU_LOG("\nERROR --> DU APP : Memory Alloc Failed at fillMacLcCfgToAddMod()");
- DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, oldLcCfg->drbQos, sizeof(DrbQosInfo));
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, oldLcCfg->lcConfig.drbQos, sizeof(DrbQosInfo));
return RFAILED;
}
- memcpy(oldLcCfg->snssai, ueLcCfgDb->snssai, sizeof(Snssai));
+ memcpy(oldLcCfg->lcConfig.snssai, ueLcCfgDb->lcConfig.snssai, sizeof(Snssai));
}
- oldLcCfg->ulLcCfgPres = ueLcCfgDb->ulLcCfgPres;
- memcpy(&oldLcCfg->ulLcCfg, &ueLcCfgDb->ulLcCfg, sizeof(UlLcCfg));
- memcpy(&oldLcCfg->dlLcCfg, &ueLcCfgDb->dlLcCfg, sizeof(DlLcCfg));
+ oldLcCfg->lcConfig.ulLcCfgPres = ueLcCfgDb->lcConfig.ulLcCfgPres;
+ memcpy(&oldLcCfg->lcConfig.ulLcCfg, &ueLcCfgDb->lcConfig.ulLcCfg, sizeof(UlLcCfg));
+ memcpy(&oldLcCfg->lcConfig.dlLcCfg, &ueLcCfgDb->lcConfig.dlLcCfg, sizeof(DlLcCfg));
}
return ROK;
}
*
* @details
*
- * Function : sendUeReCfgReqToMac
+ * Function : sendUeRecfgReqToMac
*
* Functionality: Builds and Send UE ReConfig Request to MAC
*
- * @Params[in] MacUeCfg pointer
+ * @Params[in] MacUeRecfg pointer
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
-uint8_t sendUeReCfgReqToMac(MacUeCfg *macUeCfg)
+uint8_t sendUeRecfgReqToMac(MacUeRecfg *macUeRecfg)
{
uint8_t ret = ROK;
Pst pst;
-
+
/* Fill Pst */
FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_UE_RECONFIG_REQ);
-
- if(macUeCfg)
+
+ if(macUeRecfg)
{
/* Processing one Ue at a time to MAC */
DU_LOG("\nDEBUG --> DU_APP: Sending Ue Reconfig Request to MAC");
- ret = (*packMacUeReconfigReqOpts[pst.selector])(&pst, macUeCfg);
+ ret = (*packMacUeReconfigReqOpts[pst.selector])(&pst, macUeRecfg);
if(ret == RFAILED)
{
- DU_LOG("\nERROR --> DU APP : Failed to send Reconfig Request to MAC at sendUeReCfgReqToMac()");
- DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, macUeCfg, sizeof(MacUeCfg));
+ DU_LOG("\nERROR --> DU APP : Failed to send Reconfig Request to MAC at sendUeRecfgReqToMac()");
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, macUeRecfg, sizeof(MacUeRecfg));
}
}
else
{
- DU_LOG("\nERROR --> DU_APP: Received macUeCfg is NULLP at sendUeReCfgReqToMac()");
+ DU_LOG("\nERROR --> DU_APP: Received macUeRecfg is NULLP at sendUeRecfgReqToMac()");
ret = RFAILED;
}
return ret;
/******************************************************************
*
- * @brief Fills MacUeCfg structure
+ * @brief update DuMacUeCfg structure
*
* @details
*
- * Function : fillMacUeCfg
+ * Function : updateDuMacUeCfg
*
- * Functionality: Fills MacUeCfg
+ * Functionality: Fills DuMacUeCfg
*
* @params[in] cellId, ueId, crnti,
* DuUeCfg pointer,
- * MacUeCfg pointer
+ * DuMacUeCfg pointer
* @return ROK/RFAILED
*
*****************************************************************/
-uint8_t fillMacUeCfg(uint16_t cellId, uint8_t gnbDuUef1apId, uint16_t crnti, DuUeCfg *ueCfgDb, MacUeCfg *macUeCfg)
+uint8_t updateDuMacUeCfg(uint16_t cellId, uint8_t gnbDuUef1apId, uint16_t crnti, DuUeCfg *ueCfgDb, DuMacUeCfg *duMacUeCfg)
{
uint8_t ret = ROK, dbIdx = 0, lcIdx = 0, cellIdx = 0;
bool lcIdFound = false;
- MacUeCfg *duMacDb = NULLP;
+ DuMacUeCfg *duMacDb = NULLP;
- macUeCfg->cellId = cellId;
- macUeCfg->ueId = gnbDuUef1apId;
- macUeCfg->crnti = crnti;
+ duMacUeCfg->cellId = cellId;
+ duMacUeCfg->ueId = gnbDuUef1apId;
+ duMacUeCfg->crnti = crnti;
if(!ueCfgDb)
{
- fillDefaultMacCellGrpInfo(macUeCfg);
- fillDefaultPhyCellGrpInfo(macUeCfg);
+ fillDefaultMacCellGrpInfo(duMacUeCfg);
+ fillDefaultPhyCellGrpInfo(duMacUeCfg);
- if((fillDefaultSpCellGrpInfo(macUeCfg)) != ROK)
+ if((fillDefaultSpCellGrpInfo(duMacUeCfg)) != ROK)
{
DU_LOG("\nERROR --> DUAPP : Failed in fillDefaultSpCellGrpInfo");
return RFAILED;
}
- macUeCfg->ambrCfg = NULLP;
- fillDefaultModulation(macUeCfg);
- fillMacSrb1LcCfg(&macUeCfg->lcCfgList[0]);
- macUeCfg->numLcs++;
+ duMacUeCfg->ambrCfg = NULLP;
+ fillDefaultModulation(duMacUeCfg);
+ fillMacSrb1LcCfg(&duMacUeCfg->lcCfgList[0]);
+ duMacUeCfg->numLcs++;
}
else
{
if(ueCfgDb->dataTransmissionAction == STOP_TRANSMISSION)
{
- macUeCfg->transmissionAction = ueCfgDb->dataTransmissionAction;
+ duMacUeCfg->transmissionAction = ueCfgDb->dataTransmissionAction;
return ROK;
}
GET_CELL_IDX(cellId, cellIdx);
if(duCb.actvCellLst[cellIdx])
- duMacDb = &duCb.actvCellLst[cellIdx]->ueCb[macUeCfg->ueId-1].macUeCfg;
+ duMacDb = &duCb.actvCellLst[cellIdx]->ueCb[duMacUeCfg->ueId-1].duMacUeCfg;
else
{
DU_LOG("\nERROR --> DU APP : Cell Id [%d] does not exist", cellId);
if(ueCfgDb->cellGrpCfg)
{
- ret = procUeReCfgCellInfo(macUeCfg, duMacDb, ueCfgDb->cellGrpCfg);
+ ret = procUeRecfgCellInfo(duMacUeCfg, duMacDb, ueCfgDb->cellGrpCfg);
if(ret == ROK)
{
- if(macUeCfg->spCellCfgPres == true)
+ if(duMacUeCfg->spCellCfgPres == true)
{
- if(macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschPresent)
+ if(duMacUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschPresent)
{
- fillStartSymbolAndLen(macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg.numTimeDomRsrcAlloc,\
- &macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg, NULL);
+ fillStartSymbolAndLen(duMacUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg.numTimeDomRsrcAlloc,\
+ &duMacUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg, NULL);
}
- if(macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschPresent)
+ if(duMacUeCfg->spCellCfg.servCellCfg.initUlBwp.puschPresent)
{
- fillStartSymbolAndLen(macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg.numTimeDomRsrcAlloc,\
- NULL, &macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg);
+ fillStartSymbolAndLen(duMacUeCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg.numTimeDomRsrcAlloc,\
+ NULL, &duMacUeCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg);
}
}
if(duMacDb)
- ret = fillAmbr(&macUeCfg->ambrCfg, ueCfgDb->ambrCfg , &duMacDb->ambrCfg, FALSE);
+ ret = fillAmbr(&duMacUeCfg->ambrCfg, ueCfgDb->ambrCfg , &duMacDb->ambrCfg, FALSE);
else
- ret = fillAmbr(&macUeCfg->ambrCfg, ueCfgDb->ambrCfg , NULL, FALSE);
+ ret = fillAmbr(&duMacUeCfg->ambrCfg, ueCfgDb->ambrCfg , NULL, FALSE);
- duFillModulationDetails(macUeCfg, duMacDb, ueCfgDb->ueNrCapability);
+ duFillModulationDetails(duMacUeCfg, duMacDb, ueCfgDb->ueNrCapability);
}
}
else
{
- fillDefaultMacCellGrpInfo(macUeCfg);
- fillDefaultPhyCellGrpInfo(macUeCfg);
- fillDefaultSpCellGrpInfo(macUeCfg);
- fillDefaultModulation(macUeCfg);
- macUeCfg->ambrCfg = NULLP;
+ fillDefaultMacCellGrpInfo(duMacUeCfg);
+ fillDefaultPhyCellGrpInfo(duMacUeCfg);
+ fillDefaultSpCellGrpInfo(duMacUeCfg);
+ fillDefaultModulation(duMacUeCfg);
+ duMacUeCfg->ambrCfg = NULLP;
}
#ifdef NR_DRX
- macUeCfg->drxConfigIndicatorRelease = ueCfgDb->drxConfigIndicatorRelease;
+ duMacUeCfg->drxConfigIndicatorRelease = ueCfgDb->drxConfigIndicatorRelease;
if(ueCfgDb->drxCyclePres)
{
- macUeCfg->macCellGrpCfg.drxCfg.drxLongCycleStartOffset.drxLongCycleStartOffsetChoice = ueCfgDb->drxCycle.drxLongCycleLength;
+ duMacUeCfg->macCellGrpCfg.drxCfg.drxLongCycleStartOffset.drxLongCycleStartOffsetChoice = ueCfgDb->drxCycle.drxLongCycleLength;
if(ueCfgDb->drxCycle.shortDrxCyclePres)
{
- macUeCfg->macCellGrpCfg.drxCfg.shortDrxPres = true;
- macUeCfg->macCellGrpCfg.drxCfg.shortDrx.drxShortCycle = ueCfgDb->drxCycle.shortDrxCycle.drxShortCycle;
- macUeCfg->macCellGrpCfg.drxCfg.shortDrx.drxShortCycleTimer = ueCfgDb->drxCycle.shortDrxCycle.drxShortCycleTimer;
+ duMacUeCfg->macCellGrpCfg.drxCfg.shortDrxPres = true;
+ duMacUeCfg->macCellGrpCfg.drxCfg.shortDrx.drxShortCycle = ueCfgDb->drxCycle.shortDrxCycle.drxShortCycle;
+ duMacUeCfg->macCellGrpCfg.drxCfg.shortDrx.drxShortCycleTimer = ueCfgDb->drxCycle.shortDrxCycle.drxShortCycleTimer;
}
else
{
- macUeCfg->macCellGrpCfg.drxCfg.shortDrxPres = false;
+ duMacUeCfg->macCellGrpCfg.drxCfg.shortDrxPres = false;
}
}
#endif
/* Filling LC Context */
for(dbIdx = 0; (dbIdx < ueCfgDb->numMacLcs && ret == ROK); dbIdx++)
{
- if(!ueCfgDb->macLcCfg[dbIdx].ulLcCfgPres)
+ if(!ueCfgDb->macLcCfg[dbIdx].lcConfig.ulLcCfgPres)
{
/* Filling default UL LC config in MAC if not present */
- ueCfgDb->macLcCfg[dbIdx].ulLcCfgPres = true;
- fillDefaultUlLcCfg(&ueCfgDb->macLcCfg[dbIdx].ulLcCfg);
+ ueCfgDb->macLcCfg[dbIdx].lcConfig.ulLcCfgPres = true;
+ fillDefaultUlLcCfg(&ueCfgDb->macLcCfg[dbIdx].lcConfig.ulLcCfg);
}
if(duMacDb)
{
for(lcIdx = 0; lcIdx < duMacDb->numLcs; lcIdx++)
{
- if(ueCfgDb->macLcCfg[dbIdx].lcId == duMacDb->lcCfgList[lcIdx].lcId)
+ if(ueCfgDb->macLcCfg[dbIdx].lcConfig.lcId == duMacDb->lcCfgList[lcIdx].lcConfig.lcId)
{
lcIdFound = true;
if((ueCfgDb->macLcCfg[dbIdx].configType == CONFIG_UNKNOWN) ||
(ueCfgDb->macLcCfg[dbIdx].configType == CONFIG_MOD))
{
ueCfgDb->macLcCfg[dbIdx].configType = CONFIG_MOD;
- ret = fillMacLcCfgToAddMod(&macUeCfg->lcCfgList[dbIdx], &ueCfgDb->macLcCfg[dbIdx],\
+ ret = fillMacLcCfgToAddMod(&duMacUeCfg->lcCfgList[dbIdx], &ueCfgDb->macLcCfg[dbIdx],\
&duMacDb->lcCfgList[lcIdx], FALSE);
}
}
if(!lcIdFound)
{
/* ADD/DEL CONFIG */
- ret = fillMacLcCfgToAddMod(&macUeCfg->lcCfgList[dbIdx], &ueCfgDb->macLcCfg[dbIdx], NULL, FALSE);
+ ret = fillMacLcCfgToAddMod(&duMacUeCfg->lcCfgList[dbIdx], &ueCfgDb->macLcCfg[dbIdx], NULL, FALSE);
}
if(ret == ROK)
{
- macUeCfg->numLcs++;
+ duMacUeCfg->numLcs++;
}
else
{
- DU_LOG("\nERROR --> DU APP : Failed to add Lc at Idx %d in fillMacUeCfg()", dbIdx);
+ DU_LOG("\nERROR --> DU APP : Failed to add Lc at Idx %d in updateDuMacUeCfg()", dbIdx);
break;
}
}/*End of Outer FOR loop */
- memcpy(&ueCfgDb->copyOfmacUeCfg, macUeCfg, sizeof(MacUeCfg));
+ memcpy(&ueCfgDb->copyOfmacUeCfg, duMacUeCfg, sizeof(DuMacUeCfg));
}
return ret;
}
*
* @details
*
- * Function : sendUeReCfgReqToRlc
+ * Function : sendUeRecfgReqToRlc
*
* Functionality:
* Processes UE Reconfig Req to RLC UL
*
*****************************************************************/
-uint8_t sendUeReCfgReqToRlc(RlcUeCfg *rlcUeCfg)
+uint8_t sendUeRecfgReqToRlc(RlcUeCfg *rlcUeCfg)
{
uint8_t ret;
Pst pst;
ret = (*packRlcUeReconfigReqOpts[pst.selector])(&pst, rlcUeCfg);
if(ret == RFAILED)
{
- DU_LOG("\nERROR --> DU_APP : Failed to send Ue Reconfig Req to RLC at sendUeReCfgReqToRlc()");
+ DU_LOG("\nERROR --> DU_APP : Failed to send Ue Reconfig Req to RLC at sendUeRecfgReqToRlc()");
DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rlcUeCfg, sizeof(RlcUeCfg));
}
}
else
{
- DU_LOG("\nERROR --> DU_APP: Received RlcUeCfg is NULL at sendUeReCfgReqToRlc()");
+ DU_LOG("\nERROR --> DU_APP: Received RlcUeCfg is NULL at sendUeRecfgReqToRlc()");
ret = RFAILED;
}
return ret;
duCb.actvCellLst[cellIdx]->ueCb[ueIdx].ueState = UE_ACTIVE;
/* Filling Mac Ue Config */
- memset(&duCb.actvCellLst[cellIdx]->ueCb[ueIdx].macUeCfg, 0, sizeof(MacUeCfg));
+ memset(&duCb.actvCellLst[cellIdx]->ueCb[ueIdx].duMacUeCfg, 0, sizeof(DuMacUeCfg));
ret = duBuildAndSendUeCreateReqToMac(ueCcchCtxt->cellId, ueCcchCtxt->gnbDuUeF1apId, ueCcchCtxt->crnti, NULL,
- &duCb.actvCellLst[cellIdx]->ueCb[ueIdx].macUeCfg);
+ &duCb.actvCellLst[cellIdx]->ueCb[ueIdx].duMacUeCfg);
if(ret == RFAILED)
DU_LOG("\nERROR --> DU APP : Failed to send UE create request to MAC");
return ret;
}
+/**********************************************************************************
+ *
+ * @brief Fills Ue Cfg from DU DB to MacUeCfg
+ *
+ * @details
+ *
+ * Function : fillMacUeCfg
+ *
+ * Functionality: fills ue Cfg to be sent to MAC
+ *
+ * @params[in] DuMacUeCfg Pointer
+ * MacUeCfg Pointer
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ * *******************************************************************************/
+void fillMacUeCfg(DuMacUeCfg *duMacUeCfg, MacUeCfg *macUeCfg)
+{
+ uint8_t lcIdx = 0;
+
+ macUeCfg->cellId = duMacUeCfg->cellId;
+ macUeCfg->ueId = duMacUeCfg->ueId;
+ macUeCfg->crnti = duMacUeCfg->crnti;
+ macUeCfg->macCellGrpCfgPres = duMacUeCfg->macCellGrpCfgPres;
+ if(macUeCfg->macCellGrpCfgPres)
+ {
+ memcpy(&macUeCfg->macCellGrpCfg, &duMacUeCfg->macCellGrpCfg, sizeof(MacCellGrpCfg));
+ }
+ macUeCfg->phyCellGrpCfgPres = duMacUeCfg->phyCellGrpCfgPres;
+ if(macUeCfg->phyCellGrpCfgPres)
+ {
+ memcpy(&macUeCfg->phyCellGrpCfg, &duMacUeCfg->phyCellGrpCfg, sizeof(PhyCellGrpCfg));
+ }
+ macUeCfg->spCellCfgPres = duMacUeCfg->spCellCfgPres;
+ if(macUeCfg->spCellCfgPres)
+ {
+ macUeCfg->spCellCfg.servCellIdx = duMacUeCfg->spCellCfg.servCellIdx;
+ macUeCfg->spCellCfg.servCellCfg.initDlBwp = duMacUeCfg->spCellCfg.servCellCfg.initDlBwp;
+ macUeCfg->spCellCfg.servCellCfg.numDlBwpToAdd = duMacUeCfg->spCellCfg.servCellCfg.numDlBwpToAddOrMod;
+ if(macUeCfg->spCellCfg.servCellCfg.numDlBwpToAdd > 0)
+ {
+ memcpy(macUeCfg->spCellCfg.servCellCfg.dlBwpToAddList, duMacUeCfg->spCellCfg.servCellCfg.dlBwpToAddOrModList, \
+ (sizeof(DlBwpInfo) * MAX_NUM_BWP));
+ }
+ macUeCfg->spCellCfg.servCellCfg.firstActvDlBwpId = duMacUeCfg->spCellCfg.servCellCfg.firstActvDlBwpId;
+ macUeCfg->spCellCfg.servCellCfg.defaultDlBwpId = duMacUeCfg->spCellCfg.servCellCfg.defaultDlBwpId;
+ macUeCfg->spCellCfg.servCellCfg.bwpInactivityTmr = duMacUeCfg->spCellCfg.servCellCfg.bwpInactivityTmr;
+ memcpy(&macUeCfg->spCellCfg.servCellCfg.pdschServCellCfg, &duMacUeCfg->spCellCfg.servCellCfg.pdschServCellCfg, sizeof(PdschServCellCfg));
+ memcpy(&macUeCfg->spCellCfg.servCellCfg.initUlBwp, &duMacUeCfg->spCellCfg.servCellCfg.initUlBwp, sizeof(InitialUlBwp));
+ macUeCfg->spCellCfg.servCellCfg.numUlBwpToAdd = duMacUeCfg->spCellCfg.servCellCfg.numUlBwpToAddOrMod;
+ if(macUeCfg->spCellCfg.servCellCfg.numUlBwpToAdd > 0)
+ {
+ memcpy(macUeCfg->spCellCfg.servCellCfg.ulBwpToAddList, duMacUeCfg->spCellCfg.servCellCfg.ulBwpToAddOrModList,\
+ (sizeof(UlBwpInfo) * MAX_NUM_BWP));
+ }
+ macUeCfg->spCellCfg.servCellCfg.firstActvUlBwpId = duMacUeCfg->spCellCfg.servCellCfg.firstActvUlBwpId;
+ }
+ if(duMacUeCfg->ambrCfg != NULLP)
+ {
+ memcpy(macUeCfg->ambrCfg, duMacUeCfg->ambrCfg, sizeof(AmbrCfg));
+ }
+ memcpy(&macUeCfg->dlModInfo, &duMacUeCfg->dlModInfo, sizeof(ModulationInfo));
+ memcpy(&macUeCfg->ulModInfo, &duMacUeCfg->ulModInfo, sizeof(ModulationInfo));
+ if(duMacUeCfg->numLcs > 0)
+ {
+ macUeCfg->numLcs = 0;
+ for(lcIdx = 0; lcIdx < duMacUeCfg->numLcs; lcIdx++)
+ {
+ if(duMacUeCfg->lcCfgList[lcIdx].configType == CONFIG_ADD)
+ {
+ //VS: To thoroughly check
+ memcpy(&macUeCfg->lcCfgList[macUeCfg->numLcs], &duMacUeCfg->lcCfgList[lcIdx].lcConfig, sizeof(LcCfg));
+ macUeCfg->numLcs++;
+ }
+ }
+ }
+}
+
/******************************************************************
*
* @brief Builds and Send UE Create Request to MAC
*
* ****************************************************************/
-uint8_t duBuildAndSendUeCreateReqToMac(uint16_t cellId, uint8_t gnbDuUeF1apId, uint16_t crnti, DuUeCfg *ueCfgDb, MacUeCfg *duMacUeCfg)
+uint8_t duBuildAndSendUeCreateReqToMac(uint16_t cellId, uint8_t gnbDuUeF1apId, uint16_t crnti, DuUeCfg *ueCfgDb, DuMacUeCfg *duMacUeCfg)
{
uint8_t ret = ROK;
MacUeCfg *macUeCfg = NULLP;
memset(&pst, 0, sizeof(Pst));
- ret = fillMacUeCfg(cellId, gnbDuUeF1apId, crnti, ueCfgDb, duMacUeCfg);
+ ret = updateDuMacUeCfg(cellId, gnbDuUeF1apId, crnti, ueCfgDb, duMacUeCfg);
if(ret == RFAILED)
{
DU_LOG("\nERROR --> DU APP : Failed to fill MacUeCfg at duBuildAndSendUeCreateReqToMac()");
if(macUeCfg)
{
memset(macUeCfg, 0, sizeof(MacUeCfg));
- memcpy(macUeCfg, duMacUeCfg, sizeof(MacUeCfg));
+ fillMacUeCfg(duMacUeCfg, macUeCfg);
DU_LOG("\nDEBUG --> DU_APP: Sending UE create request to MAC");
/* Processing one Ue at a time to MAC */
* RFAILED - failure
*
* ****************************************************************/
-uint8_t duUpdateMacCfg(MacUeCfg *macUeCfg, F1UeContextSetupDb *f1UeDb)
+uint8_t duUpdateMacCfg(DuMacUeCfg *macUeCfg, F1UeContextSetupDb *f1UeDb)
{
uint8_t ret, lcIdx, dbIdx, numLcs, lcDelIdx, cellIdx;
- MacUeCfg *oldMacUeCfg;
+ DuMacUeCfg *oldMacUeCfg;
ret = ROK;
-
+
GET_CELL_IDX(macUeCfg->cellId, cellIdx);
if(duCb.actvCellLst[cellIdx] == NULLP)
{
DU_LOG("\nERROR --> DU APP: CellId[%d] not found", macUeCfg->cellId);
return RFAILED;
}
- oldMacUeCfg = &duCb.actvCellLst[cellIdx]->ueCb[macUeCfg->ueId-1].macUeCfg;
+ oldMacUeCfg = &duCb.actvCellLst[cellIdx]->ueCb[macUeCfg->ueId-1].duMacUeCfg;
/*Filling Cell Group Cfg*/
- ret = procUeReCfgCellInfo(macUeCfg, &f1UeDb->duUeCfg.copyOfmacUeCfg, f1UeDb->duUeCfg.cellGrpCfg);
+ ret = procUeRecfgCellInfo(macUeCfg, &f1UeDb->duUeCfg.copyOfmacUeCfg, f1UeDb->duUeCfg.cellGrpCfg);
#ifdef NR_DRX
memcpy(&macUeCfg->macCellGrpCfg.drxCfg, &f1UeDb->duUeCfg.copyOfmacUeCfg.macCellGrpCfg.drxCfg, sizeof(DrxCfg));
#endif
if(macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschPresent)
{
fillStartSymbolAndLen(macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg.numTimeDomRsrcAlloc,\
- &macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg, NULL);
+ &macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg, NULL);
}
if(macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschPresent)
{
fillStartSymbolAndLen(macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg.numTimeDomRsrcAlloc,\
- NULL, &macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg);
+ NULL, &macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg);
}
ret = fillAmbr(NULL, f1UeDb->duUeCfg.ambrCfg, &oldMacUeCfg->ambrCfg, true);
duFillModulationDetails(macUeCfg, oldMacUeCfg, f1UeDb->duUeCfg.ueNrCapability);
numLcs = macUeCfg->numLcs;
for(lcIdx = 0; lcIdx < numLcs; lcIdx++)
{
- if(f1UeDb->duUeCfg.macLcCfg[dbIdx].lcId == macUeCfg->lcCfgList[lcIdx].lcId)
- {
- if(f1UeDb->duUeCfg.macLcCfg[dbIdx].configType == CONFIG_MOD)
- {
- ret = fillMacLcCfgToAddMod(NULL, &f1UeDb->duUeCfg.macLcCfg[dbIdx], &macUeCfg->lcCfgList[lcIdx], true);
- }
- else if(f1UeDb->duUeCfg.macLcCfg[dbIdx].configType == CONFIG_DEL)
- {
- /* Free memory at matched lcIdx index */
- freeMacLcCfg(&macUeCfg->lcCfgList[lcIdx]);
- macUeCfg->numLcs--;
- for(lcDelIdx = lcIdx; lcDelIdx < macUeCfg->numLcs; lcDelIdx++)
- {
- /* moving all elements one index ahead */
- ret = fillMacLcCfgToAddMod(NULL, &macUeCfg->lcCfgList[lcDelIdx+1], &macUeCfg->lcCfgList[lcDelIdx], true);
- freeMacLcCfg(&macUeCfg->lcCfgList[lcDelIdx+1]);
- if(ret == RFAILED)
- {
+ if(f1UeDb->duUeCfg.macLcCfg[dbIdx].lcConfig.lcId == macUeCfg->lcCfgList[lcIdx].lcConfig.lcId)
+ {
+ if(f1UeDb->duUeCfg.macLcCfg[dbIdx].configType == CONFIG_MOD)
+ {
+ ret = fillMacLcCfgToAddMod(NULL, &f1UeDb->duUeCfg.macLcCfg[dbIdx], &macUeCfg->lcCfgList[lcIdx], true);
+ }
+ else if(f1UeDb->duUeCfg.macLcCfg[dbIdx].configType == CONFIG_DEL)
+ {
+ /* Free memory at matched lcIdx index */
+ freeMacLcCfg(&macUeCfg->lcCfgList[lcIdx].lcConfig);
+ macUeCfg->numLcs--;
+ for(lcDelIdx = lcIdx; lcDelIdx < macUeCfg->numLcs; lcDelIdx++)
+ {
+ /* moving all elements one index ahead */
+ ret = fillMacLcCfgToAddMod(NULL, &macUeCfg->lcCfgList[lcDelIdx+1], &macUeCfg->lcCfgList[lcDelIdx], true);
+ freeMacLcCfg(&macUeCfg->lcCfgList[lcDelIdx+1].lcConfig);
+ if(ret == RFAILED)
+ {
DU_LOG("\nERROR --> DU APP : Failed to delete LC at Idx %d in duUpdateMacCfg()", lcDelIdx);
- break;
- }
- }
- }
- }
+ break;
+ }
+ }
+ }
+ }
}
if(f1UeDb->duUeCfg.macLcCfg[dbIdx].configType == CONFIG_ADD)
{
- ret = fillMacLcCfgToAddMod(NULL, &f1UeDb->duUeCfg.macLcCfg[dbIdx], &macUeCfg->lcCfgList[numLcs], true);
- if(ret == RFAILED)
- {
- DU_LOG("\nERROR --> DU APP : Failed to add LC at Idx %d in duUpdateMacCfg()", numLcs);
- break;
- }
- macUeCfg->numLcs++;
+ ret = fillMacLcCfgToAddMod(NULL, &f1UeDb->duUeCfg.macLcCfg[dbIdx], &macUeCfg->lcCfgList[numLcs], true);
+ if(ret == RFAILED)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to add LC at Idx %d in duUpdateMacCfg()", numLcs);
+ break;
+ }
+ macUeCfg->numLcs++;
}
-
+
}
return ret;
}
break;
}
}
- else
- break;
}
return ret;
}
{
/*Filling MAC Ue Cfg */
GET_CRNTI(crnti, ueId);
- ueCb->macUeCfg.cellId = cellId;
- ueCb->macUeCfg.ueId = ueId;
- ueCb->macUeCfg.crnti = crnti;
- ret = duUpdateMacCfg(&ueCb->macUeCfg, ueCb->f1UeDb);
+ ueCb->duMacUeCfg.cellId = cellId;
+ ueCb->duMacUeCfg.ueId = ueId;
+ ueCb->duMacUeCfg.crnti = crnti;
+ ret = duUpdateMacCfg(&ueCb->duMacUeCfg, ueCb->f1UeDb);
if(ret == RFAILED)
DU_LOG("\nERROR --> DU APP : Failed while updating MAC LC Config at duUpdateDuUeCbCfg()");
else
if(duCb.actvCellLst[cellIdx] && (duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].gnbDuUeF1apId == cfgRsp->ueId))
{
- duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].macUeCfg.macUeCfgState = UE_CREATE_COMPLETE;
+ duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].duMacUeCfg.macUeCfgState = UE_CREATE_COMPLETE;
if((duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].ueState == UE_HANDIN_IN_PROGRESS) &&
- (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].macUeCfg.macUeCfgState == UE_CREATE_COMPLETE) &&
+ (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].duMacUeCfg.macUeCfgState == UE_CREATE_COMPLETE) &&
(duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].rlcUeCfg.rlcUeCfgState == UE_CREATE_COMPLETE))
{
if((ret = duUpdateDuUeCbCfg(cfgRsp->ueId, cfgRsp->cellId)) == ROK)
}
}
}
- else if(pst->event == EVENT_MAC_UE_RECONFIG_RSP)
+ }
+ else
+ {
+ DU_LOG("\nERROR --> DU APP : MAC UE CFG Response for EVENT[%d]: FAILURE [DU UE F1AP ID : %d]", pst->event, cfgRsp->ueId);
+ ret = RFAILED;
+ }
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCfgRsp));
+ }
+ else
+ {
+ DU_LOG("\nERROR --> DU APP : Received MAC Ue Config Response is NULL at DuProcMacUeCfgRsp()");
+ ret = RFAILED;
+ }
+ return ret;
+}
+
+/*******************************************************************
+ *
+ * @brief Handle UE Reconfig response from MAC
+ *
+ * @details
+ *
+ * Function : DuProcMacUeRecfgRsp
+ *
+ * Functionality: Handle UE ReConfig response from MAC
+ *
+ * @params[in] Pointer to MacUeRecfgRsp and Pst
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t DuProcMacUeRecfgRsp(Pst *pst, MacUeRecfgRsp *reCfgRsp)
+{
+ uint8_t ret = ROK;
+ uint16_t cellIdx;
+
+ if(reCfgRsp)
+ {
+ GET_CELL_IDX(reCfgRsp->cellId, cellIdx);
+ if(reCfgRsp->result == MAC_DU_APP_RSP_OK)
+ {
+ if(pst->event == EVENT_MAC_UE_RECONFIG_RSP)
{
- DU_LOG("\nINFO --> DU APP : MAC UE Reconfig Response : SUCCESS [DU UE F1AP ID : %d]", cfgRsp->ueId);
+ DU_LOG("\nINFO --> DU APP : MAC UE Reconfig Response : SUCCESS [DU UE F1AP ID : %d]", reCfgRsp->ueId);
if(duCb.actvCellLst[cellIdx] &&
- (duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].gnbDuUeF1apId == cfgRsp->ueId))
+ (duCb.actvCellLst[cellIdx]->ueCb[reCfgRsp->ueId -1].gnbDuUeF1apId == reCfgRsp->ueId))
{
- duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].macUeCfg.macUeCfgState = UE_RECFG_COMPLETE;
- if((duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].macUeCfg.macUeCfgState == UE_RECFG_COMPLETE) &&
- (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].rlcUeCfg.rlcUeCfgState == UE_RECFG_COMPLETE))
+ duCb.actvCellLst[cellIdx]->ueCb[reCfgRsp->ueId -1].duMacUeCfg.macUeCfgState = UE_RECFG_COMPLETE;
+ if((duCb.actvCellLst[cellIdx]->ueCb[reCfgRsp->ueId -1].duMacUeCfg.macUeCfgState == UE_RECFG_COMPLETE) &&
+ (duCb.actvCellLst[reCfgRsp->cellId -1]->ueCb[reCfgRsp->ueId -1].rlcUeCfg.rlcUeCfgState == UE_RECFG_COMPLETE))
{
- if((ret = duUpdateDuUeCbCfg(cfgRsp->ueId, cfgRsp->cellId)) == ROK)
+ if((ret = duUpdateDuUeCbCfg(reCfgRsp->ueId, reCfgRsp->cellId)) == ROK)
{
- if((BuildAndSendUeCtxtRsp(cfgRsp->cellId, cfgRsp->ueId)) != ROK)
+ if((BuildAndSendUeCtxtRsp(reCfgRsp->cellId, reCfgRsp->ueId)) != ROK)
{
DU_LOG("\nERROR -> DU APP : Failure in BuildAndSendUeCtxtRsp()");
- DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCfgRsp));
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, reCfgRsp, sizeof(MacUeRecfgRsp));
return RFAILED;
}
}
else
{
DU_LOG("\nERROR -> DU APP : Failure in updating DU UE CB");
- DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCfgRsp));
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, reCfgRsp, sizeof(MacUeRecfgRsp));
return RFAILED;
}
}
}
else
{
- DU_LOG("\nERROR --> DU APP : MAC UE CFG Response for EVENT[%d]: FAILURE [DU UE F1AP ID : %d]", pst->event, cfgRsp->ueId);
+ DU_LOG("\nERROR --> DU APP : MAC UE RECFG Response for EVENT[%d]: FAILURE [DU UE F1AP ID : %d]", pst->event, reCfgRsp->ueId);
if(pst->event == EVENT_MAC_UE_RECONFIG_RSP)
{
//TODO: Send the failure case in Ue Context Setup Response
}
ret = RFAILED;
}
- DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCfgRsp));
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, reCfgRsp, sizeof(MacUeRecfgRsp));
}
else
{
- DU_LOG("\nERROR --> DU APP : Received MAC Ue Config Response is NULL at DuProcMacUeCfgRsp()");
+ DU_LOG("\nERROR --> DU APP : Received MAC Ue ReConfig Response is NULL at DuProcMacUeRecfgRsp()");
ret = RFAILED;
}
return ret;
}
-
/*******************************************************************
*
* @brief Processes UE create Req to RLC UL
duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].rlcUeCfg.rlcUeCfgState = UE_CREATE_COMPLETE;
if((duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].ueState == UE_HANDIN_IN_PROGRESS) &&
- (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].macUeCfg.macUeCfgState == UE_CREATE_COMPLETE) &&
+ (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].duMacUeCfg.macUeCfgState == UE_CREATE_COMPLETE) &&
(duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].rlcUeCfg.rlcUeCfgState == UE_CREATE_COMPLETE))
{
if((ret = duUpdateDuUeCbCfg(cfgRsp->ueId, cfgRsp->cellId)) == ROK)
DU_LOG("\nINFO --> DU_APP: RLC UE Reconfig Response : SUCCESS [UE IDX:%d]", cfgRsp->ueId);
duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].rlcUeCfg.rlcUeCfgState = UE_RECFG_COMPLETE;
- if((duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].macUeCfg.macUeCfgState == UE_RECFG_COMPLETE) &&
+ if((duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].duMacUeCfg.macUeCfgState == UE_RECFG_COMPLETE) &&
(duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].rlcUeCfg.rlcUeCfgState == UE_RECFG_COMPLETE))
{
if((ret = duUpdateDuUeCbCfg(cfgRsp->ueId, cfgRsp->cellId)) == ROK)
*
* @details
*
- * Function : duBuildAndSendUeReCfgReqToRLC
+ * Function : duBuildAndSendUeRecfgReqToRLC
*
* Functionality: Builds and Send Ue Reconfig Req to RLC
*
*
* ****************************************************************/
-uint8_t duBuildAndSendUeReCfgReqToRlc(uint8_t cellId, uint8_t gnbDuUeF1apId, uint8_t crnti, DuUeCfg *ueCfgDb)
+uint8_t duBuildAndSendUeRecfgReqToRlc(uint8_t cellId, uint8_t gnbDuUeF1apId, uint8_t crnti, DuUeCfg *ueCfgDb)
{
uint8_t ret = ROK;
RlcUeCfg *rlcUeCfg = NULLP;
memset(rlcUeCfg, 0, sizeof(RlcUeCfg));
ret = fillRlcUeCfg(cellId, gnbDuUeF1apId, ueCfgDb, rlcUeCfg);
if(ret == RFAILED)
- DU_LOG("\nERROR --> DU APP : Failed at duBuildAndSendUeReCfgReqToRlc()");
+ DU_LOG("\nERROR --> DU APP : Failed at duBuildAndSendUeRecfgReqToRlc()");
else
- ret = sendUeReCfgReqToRlc(rlcUeCfg);
+ ret = sendUeRecfgReqToRlc(rlcUeCfg);
}
else
{
- DU_LOG("\nERROR --> DU APP : Memory Alloc failed at duBuildAndSendUeReCfgReqToRlc()");
+ DU_LOG("\nERROR --> DU APP : Memory Alloc failed at duBuildAndSendUeRecfgReqToRlc()");
ret = RFAILED;
}
return ret;
}
+/**********************************************************************************
+ *
+ * @brief Fills Ue ReCfg from DU DB to MacUeRecfg
+ *
+ * @details
+ *
+ * Function : fillMacUeRecfg
+ *
+ * Functionality: fills ue ReCfg to be sent to MAC
+ *
+ * @params[in] DuMacUeCfg Pointer
+ * MacUeRecfg Pointer
+ *
+ * @return void
+ * *******************************************************************************/
+void fillMacUeRecfg(DuMacUeCfg *duMacUeCfg, MacUeRecfg *macUeRecfg)
+{
+ uint8_t lcIdx = 0;
+
+ macUeRecfg->cellId = duMacUeCfg->cellId;
+ macUeRecfg->ueId = duMacUeCfg->ueId;
+ macUeRecfg->crnti = duMacUeCfg->crnti;
+ macUeRecfg->macCellGrpRecfgPres = duMacUeCfg->macCellGrpCfgPres;
+ if(macUeRecfg->macCellGrpRecfgPres)
+ {
+ memcpy(&macUeRecfg->macCellGrpRecfg, &duMacUeCfg->macCellGrpCfg, sizeof(MacCellGrpCfg));
+ }
+ macUeRecfg->phyCellGrpRecfgPres = duMacUeCfg->phyCellGrpCfgPres;
+ if(macUeRecfg->phyCellGrpRecfgPres)
+ {
+ memcpy(&macUeRecfg->phyCellGrpRecfg, &duMacUeCfg->phyCellGrpCfg, sizeof(PhyCellGrpCfg));
+ }
+ macUeRecfg->spCellRecfgPres = duMacUeCfg->spCellCfgPres;
+ if(macUeRecfg->spCellRecfgPres)
+ {
+ memcpy(&macUeRecfg->spCellRecfg, &duMacUeCfg->spCellCfg, sizeof(SpCellRecfg));
+ }
+ if(duMacUeCfg->ambrCfg != NULLP)
+ {
+ DU_ALLOC_SHRABL_BUF(macUeRecfg->ambrRecfg, sizeof(AmbrCfg));
+ memcpy(macUeRecfg->ambrRecfg, duMacUeCfg->ambrCfg, sizeof(AmbrCfg));
+ }
+ memcpy(&macUeRecfg->dlModInfo, &duMacUeCfg->dlModInfo, sizeof(ModulationInfo));
+ memcpy(&macUeRecfg->ulModInfo, &duMacUeCfg->ulModInfo, sizeof(ModulationInfo));
+ if(duMacUeCfg->numLcs > 0)
+ {
+ macUeRecfg->numLcsToAdd = 0;
+ macUeRecfg->numLcsToDel = 0;
+ macUeRecfg->numLcsToMod = 0;
+
+ for(lcIdx = 0; lcIdx < duMacUeCfg->numLcs; lcIdx++)
+ {
+ if(duMacUeCfg->lcCfgList[lcIdx].configType == CONFIG_ADD)
+ {
+ /*VS: To thoroughly check*/
+ memcpy(&macUeRecfg->lcCfgAdd[macUeRecfg->numLcsToAdd], &duMacUeCfg->lcCfgList[lcIdx].lcConfig, sizeof(LcCfg));
+ macUeRecfg->numLcsToAdd++;
+ }
+ if(duMacUeCfg->lcCfgList[lcIdx].configType == CONFIG_DEL)
+ {
+ /*VS: To thoroughly check*/
+ macUeRecfg->lcIdToDel[macUeRecfg->numLcsToDel] = duMacUeCfg->lcCfgList[lcIdx].lcConfig.lcId;
+ macUeRecfg->numLcsToDel++;
+ }
+ if(duMacUeCfg->lcCfgList[lcIdx].configType == CONFIG_MOD)
+ {
+ /*VS: To thoroughly check*/
+ memcpy(&macUeRecfg->lcCfgMod[macUeRecfg->numLcsToMod], &duMacUeCfg->lcCfgList[lcIdx].lcConfig, sizeof(LcCfg));
+ macUeRecfg->numLcsToMod++;
+ }
+ }
+ }
+ macUeRecfg->transmissionAction = duMacUeCfg->transmissionAction;
+#ifdef NR_DRX
+ macUeRecfg->drxConfigIndicatorRelease = duMacUeCfg->drxConfigIndicatorRelease;
+#endif
+}
+
/*******************************************************************
*
* @brief Builds and Send Ue Reconfig Req to MAC
*
* @details
*
- * Function : duBuildAndSendUeReCfgReqToMac
+ * Function : duBuildAndSendUeRecfgReqToMac
*
* Functionality: Builds and Send Ue Reconfig Req to MAC
*
* @params[in] CellGroupConfigRrc_t *macCellGrpCfg
* DuUeCfg *ueCfgDb
- * MacUeCfg *macUeCfg
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
-uint8_t duBuildAndSendUeReCfgReqToMac(uint8_t cellId, uint8_t duUeF1apId, uint8_t crnti, DuUeCfg *ueCfgDb)
+uint8_t duBuildAndSendUeRecfgReqToMac(uint8_t cellId, uint8_t duUeF1apId, uint8_t crnti, DuUeCfg *ueCfgDb)
{
uint8_t ret = ROK;
- MacUeCfg *macUeCfg = NULLP;
+ DuMacUeCfg *duMacUeCfg = NULLP;
+ MacUeRecfg *macUeRecfg = NULLP;
- DU_ALLOC_SHRABL_BUF(macUeCfg, sizeof(MacUeCfg));
- if(macUeCfg)
+ DU_ALLOC(duMacUeCfg, sizeof(DuMacUeCfg));
+ DU_ALLOC_SHRABL_BUF(macUeRecfg, sizeof(MacUeRecfg));
+ if(macUeRecfg && duMacUeCfg)
{
- memset(macUeCfg, 0, sizeof(MacUeCfg));
- ret = fillMacUeCfg(cellId, duUeF1apId, crnti, ueCfgDb, macUeCfg);
+ memset(duMacUeCfg, 0, sizeof(DuMacUeCfg));
+ memset(macUeRecfg, 0, sizeof(MacUeRecfg));
+ ret = updateDuMacUeCfg(cellId, duUeF1apId, crnti, ueCfgDb, duMacUeCfg);
+ fillMacUeRecfg(duMacUeCfg, macUeRecfg);
if(ret == RFAILED)
- DU_LOG("\nERROR --> DU APP : Failed to fill Mac Ue Cfg at duBuildAndSendUeReCfgReqToMac()");
+ DU_LOG("\nERROR --> DU APP : Failed to fill Mac Ue Cfg at duBuildAndSendUeRecfgReqToMac()");
else
- ret = sendUeReCfgReqToMac(macUeCfg);
+ ret = sendUeRecfgReqToMac(macUeRecfg);
}
else
{
- DU_LOG("\nERROR --> DU APP : Memory alloc failed for macUeCfg at duBuildAndSendUeReCfgReqToMac()");
+ DU_LOG("\nERROR --> DU APP : Memory alloc failed for macUeCfg at duBuildAndSendUeRecfgReqToMac()");
ret = RFAILED;
}
+ DU_FREE(duMacUeCfg, sizeof(DuMacUeCfg));
+
return ret;
}
if(ueCb->ueState == UE_HANDIN_IN_PROGRESS)
{
/* Filling MAC UE Config */
- memset(&ueCb->macUeCfg, 0, sizeof(MacUeCfg));
+ memset(&ueCb->duMacUeCfg, 0, sizeof(DuMacUeCfg));
/* Since UE attach has not yet happened, crnti is unknow. Hence passing 0 */
- ret = duBuildAndSendUeCreateReqToMac(cellId, ueCb->gnbDuUeF1apId, 0, duUeCfg, &ueCb->macUeCfg);
+ ret = duBuildAndSendUeCreateReqToMac(cellId, ueCb->gnbDuUeF1apId, 0, duUeCfg, &ueCb->duMacUeCfg);
if(ret == RFAILED)
DU_LOG("\nERROR --> DU APP : Failed to send UE create request to MAC");
else
{
/* Filling RLC UE Reconfig */
- ret = duBuildAndSendUeReCfgReqToRlc(cellId, ueCb->gnbDuUeF1apId, crnti, duUeCfg);
+ ret = duBuildAndSendUeRecfgReqToRlc(cellId, ueCb->gnbDuUeF1apId, crnti, duUeCfg);
if(ret == RFAILED)
DU_LOG("\nERROR --> DU APP : Failed to build ctxt setup req for RLC at duBuildAndSendUeContextSetupReq()");
/* Filling MAC UE Reconfig */
- ret = duBuildAndSendUeReCfgReqToMac(cellId, ueCb->gnbDuUeF1apId, crnti, duUeCfg);
+ ret = duBuildAndSendUeRecfgReqToMac(cellId, ueCb->gnbDuUeF1apId, crnti, duUeCfg);
if(ret == RFAILED)
DU_LOG("\nERROR --> DU APP : Failed at build ctxt setup req for MAC at duBuildAndSendUeContextSetupReq()");
}
DU_LOG("\nDEBUG --> DU_APP: Processing Ue Context Mod Request for cellId [%d]", cellId);
/* Filling RLC Ue Reconfig */
- ret = duBuildAndSendUeReCfgReqToRlc(cellId, gnbDuUeF1apId, crnti, duUeCfg);
+ ret = duBuildAndSendUeRecfgReqToRlc(cellId, gnbDuUeF1apId, crnti, duUeCfg);
if(ret == RFAILED)
DU_LOG("\nERROR --> DU APP : Failed to build ctxt setup req for RLC at duBuildAndSendUeContextModReq()");
/* Filling MAC Ue Reconfig */
- ret = duBuildAndSendUeReCfgReqToMac(cellId, gnbDuUeF1apId, crnti, duUeCfg);
+ ret = duBuildAndSendUeRecfgReqToMac(cellId, gnbDuUeF1apId, crnti, duUeCfg);
if(ret == RFAILED)
DU_LOG("\nERROR --> DU APP : Failed at build ctxt setup req for MAC at duBuildAndSendUeContextModReq()");
/*******************************************************************
*
-* @brief delete MacUeCfg from duCb
+* @brief delete DuMacUeCfg from duCb
*
* @details
*
* Function : deleteMacUeCfg
*
-* Functionality: delete MacUeCfg from duCb
+* Functionality: delete DuMacUeCfg from duCb
*
-* @params[in] Pointer to MacUeCfg
+* @params[in] Pointer to DuMacUeCfg
* @return ROK - success
* RFAILED - failure
*
*******************************************************************/
-void deleteMacUeCfg(MacUeCfg *ueCfg)
+void deleteMacUeCfg(DuMacUeCfg *ueCfg)
{
uint8_t lcCfgIdx=0;
- DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,ueCfg->ambrCfg, sizeof(AmbrCfg));
if(ueCfg->spCellCfgPres)
{
- freeUeReCfgCellGrpInfo(ueCfg);
+ freeUeRecfgCellGrpInfo(ueCfg);
+ }
+ if(ueCfg->ambrCfg)
+ {
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,ueCfg->ambrCfg, sizeof(AmbrCfg));
}
for(lcCfgIdx=0; lcCfgIdx< ueCfg->numLcs; lcCfgIdx++)
{
- freeMacLcCfg(&ueCfg->lcCfgList[lcCfgIdx]);
+ freeMacLcCfg(&ueCfg->lcCfgList[lcCfgIdx].lcConfig);
}
- memset(ueCfg, 0, sizeof(MacUeCfg));
+ memset(ueCfg, 0, sizeof(DuMacUeCfg));
}
/*******************************************************************
GET_CELL_IDX(cellId, cellIdx);
if(duCb.actvCellLst[cellIdx] != NULLP)
{
- if((duCb.actvCellLst[cellIdx]->ueCb[ueId-1].macUeCfg.macUeCfgState == UE_DELETE_COMPLETE)\
+ if((duCb.actvCellLst[cellIdx]->ueCb[ueId-1].duMacUeCfg.macUeCfgState == UE_DELETE_COMPLETE)\
&&(duCb.actvCellLst[cellIdx]->ueCb[ueId-1].rlcUeCfg.rlcUeCfgState == UE_DELETE_COMPLETE))
{
ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueId-1];
- deleteMacUeCfg(&ueCb->macUeCfg);
+ deleteMacUeCfg(&ueCb->duMacUeCfg);
deleteRlcUeCfg(&ueCb->rlcUeCfg);
if(ueCb->f1UeDb !=NULLP)
{
GET_CELL_IDX(deleteRsp->cellId, cellIdx);
if(duCb.actvCellLst[cellIdx])
{
- duCb.actvCellLst[cellIdx]->ueCb[deleteRsp->ueId -1].macUeCfg.macUeCfgState = UE_DELETE_COMPLETE;
+ duCb.actvCellLst[cellIdx]->ueCb[deleteRsp->ueId -1].duMacUeCfg.macUeCfgState = UE_DELETE_COMPLETE;
ueId = deleteRsp->ueId;
gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueId-1].gnbCuUeF1apId;
gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueId-1].gnbDuUeF1apId;
uint8_t duHdlRlcUlData(Pst *pst, KwuDatIndInfo* datInd, Buffer *mBuf);
uint8_t cmPkRlcDatReq(Pst * pst,RlcDatReqInfo* datReq,Buffer * mBuf);
-uint8_t duBuildAndSendUeCreateReqToMac(uint16_t cellId, uint8_t duUeF1apId, uint16_t crnti, DuUeCfg *ueCfgDb, MacUeCfg *duMacUeCfg);
+uint8_t duBuildAndSendUeCreateReqToMac(uint16_t cellId, uint8_t duUeF1apId, uint16_t crnti, DuUeCfg *ueCfgDb, DuMacUeCfg *duMacUeCfg);
uint8_t duBuildAndSendUeCreateReqToRlc(uint16_t cellId, uint8_t duUeF1apId, DuUeCfg *ueCfgDb, RlcUeCfg *duRlcUeCfg);
uint8_t duCreateUeCb(UeCcchCtxt *ueCcchCtxt, uint32_t gnbCuUeF1apId);
uint8_t duProcUlCcchInd(UlCcchIndInfo *ulCcchIndInfo);