+/******************************************************************
+ *
+ * @brief Fills RLC UM Uni Directional DL Information
+ *
+ * @details
+ *
+ * Function : fillUmUniDirDlInfo
+ *
+ * Functionality: Fills RLC UM Uni Directional DL Info
+ *
+ *
+ *****************************************************************/
+void fillUmUniDirDlInfo(UmUniDirDlBearerCfg *umUniDirDlCfg)
+{
+ umUniDirDlCfg->dlUmCfg.snLenDlUm = UM_SIZE_12;
+}
+
+/******************************************************************
+ *
+ * @brief Fills RlcBearerCfg structure
+ *
+ * @details
+ *
+ * Function : fillRlcBearerCfg
+ *
+ * Functionality: Fills Rlc Bearer Cfg
+ *
+ *
+ *****************************************************************/
+void fillRlcBearerCfg(uint16_t cellId, uint8_t ueIdx, RlcUeCfg *ueCfg)
+{
+ uint8_t idx;
+ ueCfg->cellId = cellId;
+ ueCfg->ueIdx = ueIdx;
+ ueCfg->numLcs = SRB_ID_1;
+
+ for(idx = 0; idx < ueCfg->numLcs; idx++)
+ {
+ ueCfg->rlcBearerCfg[idx].rbId = RB_ID_SRB;
+ ueCfg->rlcBearerCfg[idx].rbType = RB_TYPE_SRB;
+ ueCfg->rlcBearerCfg[idx].lcId = SRB_ID_1;
+ ueCfg->rlcBearerCfg[idx].lcType = LCH_DCCH;
+ ueCfg->rlcBearerCfg[idx].rlcMode = RLC_AM;
+ switch(ueCfg->rlcBearerCfg[idx].rlcMode)
+ {
+ case RLC_AM:
+ memset(&ueCfg->rlcBearerCfg[idx].u.amCfg, 0, sizeof(AmBearerCfg));
+ fillAmInfo(&ueCfg->rlcBearerCfg[idx].u.amCfg);
+ break;
+ case RLC_UM_BI_DIRECTIONAL:
+ memset(&ueCfg->rlcBearerCfg[idx].u.umBiDirCfg, 0, sizeof(UmBiDirBearerCfg));
+ fillUmBiDirInfo(&ueCfg->rlcBearerCfg[idx].u.umBiDirCfg);
+ break;
+ case RLC_UM_UNI_DIRECTIONAL_UL:
+ memset(&ueCfg->rlcBearerCfg[idx].u.umUniDirUlCfg, 0, sizeof(UmUniDirUlBearerCfg));
+ fillUmUniDirUlInfo(&ueCfg->rlcBearerCfg[idx].u.umUniDirUlCfg);
+ break;
+ case RLC_UM_UNI_DIRECTIONAL_DL:
+ memset(&ueCfg->rlcBearerCfg[idx].u.umUniDirDlCfg, 0, sizeof(UmUniDirDlBearerCfg));
+ fillUmUniDirDlInfo(&ueCfg->rlcBearerCfg[idx].u.umUniDirDlCfg);
+ break;
+ default :
+ DU_LOG("\nDU_APP: Rlc Mode invalid %d", ueCfg->rlcBearerCfg[idx].rlcMode);
+ break;
+ }
+ }
+}
+
+/******************************************************************
+ *
+ * @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-1].gnbDuUeF1apId = ueCcchCtxt->gnbDuUeF1apId;
+ duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbCuUeF1apId = gnbCuUeF1apId;
+ duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].ueState = UE_ACTIVE;
+
+ /* Filling Mac Ue Config */
+ memset(&duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].macUeCfg, 0, sizeof(MacUeCfg));
+ ret = duBuildAndSendUeCreateReqToMac(ueCcchCtxt->cellId, ueIdx, ueCcchCtxt->crnti,\
+ &duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].macUeCfg);
+ if(ret)
+ DU_LOG("\nDU_APP: Failed to send UE create request to MAC");
+
+ /* Filling Rlc Ue Config */
+ memset(&duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].rlcUeCfg, 0, sizeof(RlcUeCfg));
+ ret = duBuildAndSendUeCreateReqToRlc(ueCcchCtxt->cellId, ueIdx, \
+ &duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].rlcUeCfg);
+ if(ret)
+ DU_LOG("\nDU_APP: Failed to send UE create request to RLC");
+
+ duCb.actvCellLst[cellIdx]->numActvUes++;
+ memset(ueCcchCtxt, 0, sizeof(UeCcchCtxt));
+ }
+ }
+ 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,\
+ uint16_t crnti, MacUeCfg *duMacUeCfg)
+{
+ uint8_t ret = ROK;
+ MacUeCfg *macUeCfg = NULLP;
+ Pst pst;
+ memset(&pst, 0, sizeof(Pst));
+
+ fillMacUeCfg(cellId, ueIdx, crnti, duMacUeCfg);
+
+ /* 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 -1].macUeCfg, sizeof(MacUeCfg));
+ DU_LOG("\nDU_APP: Sending UE create request to MAC");
+
+ /* 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 duBuildAndSendUeCreateReqToMac()");
+ ret = RFAILED;
+ }
+ return ret;
+}
+
+/*******************************************************************
+ *
+ * @brief Handle UE create response from MAC
+ *
+ * @details
+ *
+ * Function : DuHandleMacUeCreateRsp
+ *
+ * Functionality: Handle UE create response from MAC
+ *
+ * @params[in] Pointer to MacUeCfgRsp and Pst
+ * @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;
+}
+
+/*******************************************************************
+ *
+ * @brief Processes UE create Req to RLC UL
+ *
+ * @details
+ *
+ * Function : duBuildAndSendUeCreateReqToRlc
+ *
+ * Functionality:
+ * Processes UE create Req to RLC UL
+ *
+ * @params[in] cellId,
+ * ueIdx,
+ * Pointer to RlcUeCfg
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ *****************************************************************/
+
+uint8_t duBuildAndSendUeCreateReqToRlc(uint16_t cellId, uint8_t ueIdx, RlcUeCfg *duRlcUeCfg)
+{
+ uint8_t ret = ROK;
+ RlcUeCfg *rlcUeCfg = NULLP;
+ Pst pst;
+ memset(&pst, 0, sizeof(Pst));
+
+ fillRlcBearerCfg(cellId, ueIdx, duRlcUeCfg);
+ FILL_PST_DUAPP_TO_RLC(pst, RLC_UL_INST, EVENT_RLC_UL_UE_CREATE_REQ);
+
+ /* Copying ueCfg to a sharable buffer */
+ DU_ALLOC_SHRABL_BUF(rlcUeCfg, sizeof(RlcUeCfg));
+ if(rlcUeCfg)
+ {
+ memset(rlcUeCfg, 0, sizeof(RlcUeCfg));
+ memcpy(rlcUeCfg, duRlcUeCfg, sizeof(RlcUeCfg));
+ /* Processing one Ue at a time to RLC */
+ DU_LOG("\nDU_APP: Sending UE create request to RLC UL");
+ ret = (*packRlcUlUeCreateReqOpts[pst.selector])(&pst, rlcUeCfg);
+ if(ret)
+ {
+ DU_LOG("\nDU_APP : Failure in sending Ue Create Req to RLC");
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rlcUeCfg, sizeof(RlcUeCfg));
+ ret = RFAILED;
+ }
+ }
+ else
+ {
+ DU_LOG("\n DU_APP: Memory alloc failed at duBuildAndSendUeCreateReqToRlc()");
+ ret = RFAILED;
+ }
+ return ret;
+}
+
+
+
+/*******************************************************************
+ *
+ * @brief Processes UE create Rsp received from RLC UL
+ *
+ * @details
+ *
+ * Function : DuProcRlcUlUeCfgRsp
+ *
+ * Functionality:
+ * Processes UE create Rsp received from RLC UL
+ *
+ * @params[in] Post structure
+ * Pointer to RlcCfgCfm
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ *****************************************************************/
+
+uint8_t DuProcRlcUlUeCreateRsp(Pst *pst, RlcUeCfgRsp *cfgRsp)
+{
+ uint8_t ret = ROK;
+
+ if(cfgRsp)
+ {
+ if(cfgRsp->result == RLC_DU_APP_RSP_OK)
+ {
+ DU_LOG("\nDU_APP: RLC UE Create Response : SUCCESS [UE IDX:%d]", cfgRsp->ueIdx);
+ }
+ else
+ {
+ DU_LOG("\nDU_APP: RLC UE Create Response : FAILED [UE IDX:%d, REASON :%d]",\
+ cfgRsp->ueIdx, cfgRsp->reason);
+ ret = RFAILED;
+ }
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeCfgRsp));
+ }
+ else
+ {
+ DU_LOG("\nDU_APP: Received RLC Ue Create Response is NULL");
+ ret = RFAILED;
+ }
+ return ret;
+}