+/******************************************************************
+ *
+ * @brief Fills Physical Cell Group Info
+ *
+ * @details
+ *
+ * Function : fillPhyCellGrpInfo
+ *
+ * Functionality: Fills Physical Cell Group Info
+ *
+ *
+ *****************************************************************/
+void fillPhyCellGrpInfo(PhyCellGrpCfg *cellGrp)
+{
+ if(cellGrp)
+ {
+ cellGrp->pdschHarqAckCodebook = PDSCH_HARQ_ACK_CODEBOOK_DYNAMIC;
+ cellGrp->pNrFr1 = P_NR_FR1;
+ }
+ else
+ {
+ DU_LOG("\nDUAPP: Memory is NULL for Physical Cell Group");
+ }
+}
+
+/******************************************************************
+ *
+ * @brief Fills Mac Cell Group Info
+ *
+ * @details
+ *
+ * Function : fillMacCellGrpInfo
+ *
+ * Functionality: Fills Mac Cell Group Info
+ *
+ *
+ *****************************************************************/
+void fillMacCellGrpInfo(MacCellGrpCfg *cellGrp)
+{
+ uint8_t idx;
+
+ if(cellGrp)
+ {
+ /* Filling Scheduling Request Config */
+ cellGrp->schReqCfg.addModListCount = 1;
+ if(cellGrp->schReqCfg.addModListCount <= MAX_NUM_SR_CFG_PER_CELL_GRP)
+ {
+ for(idx = 0; idx < cellGrp->schReqCfg.addModListCount; idx++)
+ {
+ cellGrp->schReqCfg.addModList[idx].schedReqId = SCH_REQ_ID;
+ cellGrp->schReqCfg.addModList[idx].srProhibitTmr = SR_PROHIBIT_MS_32;
+ cellGrp->schReqCfg.addModList[idx].srTransMax = SR_TRANS_MAX_N_16;
+ }
+ }
+ cellGrp->schReqCfg.relListCount = 0;
+
+ /* Filling Tag config */
+ cellGrp->tagCfg.addModListCount = 1;
+ if(cellGrp->tagCfg.addModListCount <= MAC_NUM_TAGS)
+ {
+ for(idx = 0; idx < cellGrp->tagCfg.addModListCount; idx++)
+ {
+ cellGrp->tagCfg.addModList[idx].tagId = TAG_ID;
+ cellGrp->tagCfg.addModList[idx].timeAlignTimer = TIME_ALIGNMENT_TIMER_INFINITY;
+ }
+ }
+ cellGrp->tagCfg.relListCount = 0;
+
+ /* Filling BSR config */
+ cellGrp->bsrTmrCfg.periodicTimer = PERIODIC_BSR_TMR;
+ cellGrp->bsrTmrCfg.retxTimer = RETX_BSR_TMR;
+ cellGrp->bsrTmrCfg.srDelayTimer = SR_DELAY_TMR;
+
+ /* Filling PHR config */
+ cellGrp->phrCfgSetupPres = true;
+ cellGrp->phrCfg.periodicTimer = PHR_PERIODIC_TIMER_INFINITY;
+ cellGrp->phrCfg.prohibitTimer = PHR_PROHIBIT_TIMER_SF_0;
+ cellGrp->phrCfg.txPowerFactor = PHR_TX_PWR_FACTOR_CHANGE_INFINITY;
+ cellGrp->phrCfg.multiplePHR = false;
+ cellGrp->phrCfg.dummy = false;
+ cellGrp->phrCfg.phrType2OtherCell = false;
+ cellGrp->phrCfg.phrOtherCG = PHR_MODE_OTHER_CG_REAL;
+
+ }
+ else
+ {
+ DU_LOG("\nDUAPP: Memory is NULL for Master Cell Group");
+ }
+}
+
+/******************************************************************
+ *
+ * @brief Fills Logical Channel Config List
+ *
+ * @details
+ *
+ * Function : fillLcCfgList
+ *
+ * Functionality: Fills Logical channel Config List
+ *
+ *
+ *****************************************************************/
+void fillLcCfgList(LcCfg *lcCfgInfo)
+{
+ if(lcCfgInfo)
+ {
+ lcCfgInfo->lcId = SRB_ID_1;
+ lcCfgInfo->drbQos = NULLP;
+ lcCfgInfo->snssai = NULLP;
+ lcCfgInfo->ulLcCfg = NULLP;
+ lcCfgInfo->dlLcCfg.lcp = LC_PRIORITY_1;
+
+#if 0
+ /* TODO: To be filled on receving UE CONTEXT SETUP from CU */
+ /* Filling Qos characteristics */
+ lcCfgInfo->drbQos.fiveQiType = QoS_Characteristics_PR_non_Dynamic_5QI;
+ lcCfgInfo->drbQos.u.nonDyn5Qi.fiveQi = 0;
+ lcCfgInfo->drbQos.u.nonDyn5Qi.priorLevel = 0;
+ lcCfgInfo->drbQos.u.nonDyn5Qi.avgWindow = 0;
+ lcCfgInfo->drbQos.u.nonDyn5Qi.maxDataBurstVol = 0;
+
+ /* Filling NgRAN */
+ lcCfgInfo->drbQos.ngRanRetPri.priorityLevel = PriorityLevel_highest;
+ lcCfgInfo->drbQos.ngRanRetPri.preEmptionCap = \
+ Pre_emptionCapability_may_trigger_pre_emption;
+ lcCfgInfo->drbQos.ngRanRetPri.preEmptionVul = \
+ Pre_emptionVulnerability_not_pre_emptable;
+
+ /* Filling Grb Qos */
+ lcCfgInfo->drbQos.grbQosInfo.maxFlowBitRateDl = 0;
+ lcCfgInfo->drbQos.grbQosInfo.maxFlowBitRateUl = 0;
+ lcCfgInfo->drbQos.grbQosInfo.guarFlowBitRateDl = 0;
+ lcCfgInfo->drbQos.grbQosInfo.guarFlowBitRateUl = 0;
+
+ /* Filling S-NSSAI */
+ /* TODO :To be filled when UE Context Setup Request is sent from CU */
+ /* Filling UL Logical Channel Config */
+ lcCfgInfo->ulLcCfg.priority = 0;
+ lcCfgInfo->ulLcCfg.lcGroup = 0;
+ lcCfgInfo->ulLcCfg.schReqId = 0;
+ lcCfgInfo->ulLcCfg.pbr = 0;
+ lcCfgInfo->ulLcCfg.bsd = 0;
+
+ /* Filling DL Logical Channel Config */
+ lcCfgInfo->dlLcCfg.lcp = 0;
+#endif
+ }
+ else
+ {
+ DU_LOG("\n Memory is null for LcCfgList");
+ }
+}
+
+/******************************************************************
+ *
+ * @brief Fills MacUeCfg structure
+ *
+ * @details
+ *
+ * Function : fillMacUeCfg
+ *
+ * Functionality: Fills MacUeCfg
+ *
+ *
+ *****************************************************************/
+void fillMacUeCfg(MacUeCfg *ueCfg)
+{
+ uint8_t idx;
+
+ /* Filling MacCellGroup Config */
+ fillMacCellGrpInfo(&ueCfg->macCellGrpCfg);
+ /* Filling PhyCellGroup Config */
+ fillPhyCellGrpInfo(&ueCfg->phyCellGrpCfg);
+ /* Filling SpCellGroup Config */
+ fillSpCellGrpInfo(&ueCfg->spCellCfg);
+ /* Filling AMBR for UL and DL */
+ ueCfg->maxAggrBitRate = NULLP;
+ /* Filling LC Context */
+ ueCfg->numLcs = SRB_ID_1;
+ if(ueCfg->numLcs < MAX_NUM_LOGICAL_CHANNELS)
+ {
+ for(idx = 0; idx < ueCfg->numLcs; idx++)
+ {
+ fillLcCfgList(&ueCfg->lcCfgList[idx]);
+ }
+ }
+
+}
+
+/******************************************************************
+ *
+ * @brief creates UE context
+ *
+ * @details
+ *
+ * Function : duCreateUeCb
+ *
+ * Functionality: Creates UE Conetxt
+ *
+ * @params[in] UeCcchCtxt Pointer
+ * UeIdx Pointer
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ * ****************************************************************/
+uint8_t duCreateUeCb(UeCcchCtxt *ueCcchCtxt, uint32_t gnbCuUeF1apId)
+{
+ uint8_t cellIdx = 0;
+ uint8_t ret = ROK;
+ uint8_t ueIdx;
+
+ for(cellIdx = 0; cellIdx < MAX_NUM_CELL; cellIdx++)
+ {
+ if(ueCcchCtxt->cellId == duCb.actvCellLst[cellIdx]->cellId)
+ {
+ GET_UE_IDX(ueCcchCtxt->crnti, ueIdx);
+ DU_LOG("\nDU_APP: Filling UeCb for ueIdx [%d]", ueIdx);
+
+ duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId = ueCcchCtxt->gnbDuUeF1apId;
+ duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId = gnbCuUeF1apId;
+ duCb.actvCellLst[cellIdx]->ueCb[ueIdx].ueState = UE_ACTIVE;
+
+ /* Filling Mac Ue Config */
+ memset(&duCb.actvCellLst[cellIdx]->ueCb[ueIdx].macUeCfg, 0, sizeof(MacUeCfg));
+ duCb.actvCellLst[cellIdx]->ueCb[ueIdx].macUeCfg.cellId = ueCcchCtxt->cellId;
+ duCb.actvCellLst[cellIdx]->ueCb[ueIdx].macUeCfg.ueIdx = ueIdx;
+ duCb.actvCellLst[cellIdx]->ueCb[ueIdx].macUeCfg.crnti = ueCcchCtxt->crnti;
+ fillMacUeCfg(&duCb.actvCellLst[cellIdx]->ueCb[ueIdx].macUeCfg);
+ duCb.actvCellLst[cellIdx]->numActvUes++;
+ memset(ueCcchCtxt, 0, sizeof(UeCcchCtxt));
+
+ /* Send Ue Create Request to MAC */
+ ret = duBuildAndSendUeCreateReqToMac(duCb.actvCellLst[cellIdx]->ueCb[ueIdx].macUeCfg.cellId, ueIdx);
+ if(ret)
+ DU_LOG("\nDU_APP: Failed to send UE create request to MAC");
+ }
+ }
+
+ return ret;
+}
+
+/******************************************************************
+ *
+ * @brief Builds and Send UE Create Request to MAC
+ *
+ * @details
+ *
+ * Function : duBuildAndSendUeCreateReqToMac
+ *
+ * Functionality: Builds and Send UE Create Request to MAC
+ *
+ * @Params[in] cellId,
+ * ueIdx
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+
+uint8_t duBuildAndSendUeCreateReqToMac(uint16_t cellId, uint8_t ueIdx)
+{
+ uint8_t ret = ROK;
+ MacUeCfg *macUeCfg = NULLP;
+ Pst pst;
+
+ memset(&pst, 0, sizeof(Pst));
+
+ /* Fill Pst */
+ FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_UE_CREATE_REQ);
+
+ /* Copying ueCb to a sharable buffer */
+ DU_ALLOC_SHRABL_BUF(macUeCfg, sizeof(MacUeCfg));
+ if(macUeCfg)
+ {
+ memset(macUeCfg, 0, sizeof(MacUeCfg));
+ memcpy(macUeCfg, &duCb.actvCellLst[cellId - 1]->ueCb[ueIdx].macUeCfg, sizeof(MacUeCfg));
+ /* Processing one Ue at a time to MAC */
+ ret = (*packMacUeCreateReqOpts[pst.selector])(&pst, macUeCfg);
+ if(ret)
+ {
+ DU_LOG("\nDU_APP : Failure in sending Ue Create Req to MAC");
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, macUeCfg, sizeof(MacUeCfg));
+ ret = RFAILED;
+ }
+ }
+ else
+ {
+ DU_LOG("\n DU_APP: Memory alloc failed at duBuildAndSendUeCreateReq()");
+ ret = RFAILED;
+ }
+ return ret;
+}
+
+/*******************************************************************
+ *
+ * @brief Handle UE create response from MAC
+ *
+ * @details
+ *
+ * Function : duHandleMacUeCreateRsp
+ *
+ * Functionality: Handle UE create response from MAC
+ *
+ * @params[in]
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t duHandleMacUeCreateRsp(Pst *pst, MacUeCfgRsp *cfgRsp)
+{
+ if(cfgRsp->result == MAC_DU_APP_RSP_OK)
+ {
+ DU_LOG("\nDU APP : MAC UE Create Response : SUCCESS [UE IDX : %d]", cfgRsp->ueIdx);
+ }
+ else
+ {
+ DU_LOG("\nDU APP : MAC UE Create Response : FAILURE [UE IDX : %d]", cfgRsp->ueIdx);
+ }
+ return ROK;
+}