X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Fdu_app%2Fdu_ue_mgr.c;h=5d790bd4a1f555bca1e7397261a0bb42db71cefc;hb=9c929d38c3bc6ae39ed658d0a7297612e5525b00;hp=aed5cc026c0169d7de8e6744ae7036e638919464;hpb=4d45b914f9e94203603d3b9fdbcb1aad361301dd;p=o-du%2Fl2.git diff --git a/src/du_app/du_ue_mgr.c b/src/du_app/du_ue_mgr.c index aed5cc026..5d790bd4a 100644 --- a/src/du_app/du_ue_mgr.c +++ b/src/du_app/du_ue_mgr.c @@ -61,6 +61,13 @@ DuRlcUlUeCreateReq packRlcUlUeCreateReqOpts[] = packDuRlcUlUeCreateReq, /* Light weight-loose coupling */ }; +DuDlRrcMsgToRlcFunc duSendDlRrcMsgToRlcOpts[] = +{ + packDlRrcMsgToRlc, /* Loose coupling */ + RlcProcDlRrcMsgTransfer, /* Tight coupling */ + packDlRrcMsgToRlc /* Light weight-loose coupling */ +}; + /******************************************************************* * * @brief Handles EGTP data from CU @@ -79,15 +86,15 @@ DuRlcUlUeCreateReq packRlcUlUeCreateReqOpts[] = * ****************************************************************/ uint8_t duHdlEgtpDlData(EgtpMsg *egtpMsg) { + /* TODO : Extract RbId/UeID/CellID/SduId from database using tunnel id in egtp header */ DU_LOG("\nDU_APP : Processing DL data"); - +#ifdef EGTP_TEST Pst pst; KwuDatReqInfo datReqInfo; -#ifdef EGTP_TEST datReqInfo.rlcId.rbId = RB_ID; datReqInfo.rlcId.rbType = CM_LTE_DRB; datReqInfo.rlcId.ueId = UE_ID; @@ -95,17 +102,20 @@ uint8_t duHdlEgtpDlData(EgtpMsg *egtpMsg) datReqInfo.sduId = ++sduId; datReqInfo.lcType = CM_LTE_LCH_DTCH; -#endif + /* Filling pst and Sending to RLC DL */ pst.selector = ODU_SELECTOR_LWLC; pst.srcEnt = ENTDUAPP; - pst.dstEnt = ENTKW; + pst.dstEnt = ENTRLC; pst.dstInst = RLC_DL_INST; pst.dstProcId = DU_PROC; pst.srcProcId = DU_PROC; pst.region = duCb.init.region; cmPkKwuDatReq(&pst, &datReqInfo, egtpMsg->msg); +#else + //duBuildAndSendDlRrcMsgToRlc(); +#endif return ROK; } @@ -132,7 +142,7 @@ uint8_t duHdlRlcUlData(Pst *pst, KwuDatIndInfo* datInd, Buffer *mBuf) /* Send UL data to CU via EGTP */ duSendEgtpDatInd(mBuf); - ODU_PUT_MSG(mBuf); + ODU_PUT_MSG_BUF(mBuf); return ROK; } @@ -206,6 +216,182 @@ uint8_t duBuildAndSendDlCcchInd(uint16_t *cellId, uint16_t *crnti, \ } +/******************************************************************* + * + * @brief Build and Send DL RRC Message transfer to RLC + * + * @details + * + * Function : duBuildAndSendDlRrcMsgToRlc + * + * Functionality: + * Build and Send DL RRC Message transfer to RLC + * + * @params[in] Cell ID + * UE Index + * Logical Channgel ID + * RRC Message + * RRC Message Length + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t duBuildAndSendDlRrcMsgToRlc(uint16_t cellId, RlcUeCfg ueCfg, \ + uint8_t lcId, bool deliveryStaReq, uint16_t rrcMsgLen, uint8_t *rrcMsg) +{ + Pst pst; + uint8_t ret; + uint8_t lcIdx; + RlcDlRrcMsgInfo *dlRrcMsgInfo; + + DU_ALLOC_SHRABL_BUF(dlRrcMsgInfo, sizeof(RlcDlRrcMsgInfo)); + if(!dlRrcMsgInfo) + { + DU_LOG("\nDU APP : Memory allocation failed for dlRrcMsgInfo in \ + duBuildAndSendDlRrcMsgToRlc"); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rrcMsg, rrcMsgLen); + return RFAILED; + } + + /* Filling up the RRC msg info */ + dlRrcMsgInfo->cellId = cellId; + dlRrcMsgInfo->ueIdx = ueCfg.ueIdx; + for(lcIdx = 0; lcIdx <= MAX_NUM_LOGICAL_CHANNELS; lcIdx++) + { + if(ueCfg.rlcBearerCfg[lcIdx].lcId == lcId) + { + dlRrcMsgInfo->rbType = ueCfg.rlcBearerCfg[lcIdx].rbType; + dlRrcMsgInfo->rbId = ueCfg.rlcBearerCfg[lcIdx].rbId; + dlRrcMsgInfo->lcType = ueCfg.rlcBearerCfg[lcIdx].lcType; + dlRrcMsgInfo->lcId = ueCfg.rlcBearerCfg[lcIdx].lcId; + break; + } + } + dlRrcMsgInfo->execDup = false; + dlRrcMsgInfo->deliveryStaRpt = deliveryStaReq; + dlRrcMsgInfo->rrcMsg = rrcMsg; + dlRrcMsgInfo->msgLen = rrcMsgLen; + + /* Filling post structure and sending msg */ + memset(&pst, 0, sizeof(Pst)); + FILL_PST_DUAPP_TO_RLC(pst, RLC_DL_INST, EVENT_DL_RRC_MSG_TRANS_TO_RLC); + ret = (*duSendDlRrcMsgToRlcOpts[pst.selector])(&pst, dlRrcMsgInfo); + if(ret != ROK) + { + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rrcMsg, rrcMsgLen); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlRrcMsgInfo, sizeof(RlcDlRrcMsgInfo)); + return RFAILED; + } + + return ROK; +} + +/******************************************************************* + * + * @brief Process UE context setup request from CU + * + * @details + * + * Function : procUeCintextSetupReq + * + * Functionality: Process UE context setup request from CU + * + * @params[in] F1AP message + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t procUeContextSetupReq(F1AP_PDU_t *f1apMsg) +{ + uint8_t ret = ROK; + uint8_t ieIdx, byteIdx, ueIdx; + uint8_t *rrcMsg = NULLP; + uint16_t rrcMsgLen; + uint16_t cellId, cellIdx; + uint32_t gnbDuUeF1apId; /* GNB DU UE F1AP ID */ + uint32_t gnbCuUeF1apId; /* GNB CU UE F1AP ID */ + bool deliveryStaReq = false; /* RRC msg delivery status request */ + DuUeCb *ueCb = NULLP; + UEContextSetupRequest_t *ueSetReq = NULLP; + + ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest; + + /* TODO : fetch remaining values from f1ap msg */ + for(ieIdx=0; ieIdx < ueSetReq->protocolIEs.list.count; ieIdx++) + { + switch(ueSetReq->protocolIEs.list.array[ieIdx]->id) + { + case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID: + { + gnbCuUeF1apId = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID; + break; + } + case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID: + { + gnbDuUeF1apId = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID; + break; + } + case ProtocolIE_ID_id_ServCellIndex: + { + cellIdx = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.ServCellIndex; + break; + } + case ProtocolIE_ID_id_RRCContainer: + { + rrcMsgLen = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size; + DU_ALLOC_SHRABL_BUF(rrcMsg, rrcMsgLen); + if(!rrcMsg) + { + DU_LOG("\nDU APP : Memory allocation failed for RRC Msg in procUeCtxtSetupReq"); + return RFAILED; + } + memcpy(rrcMsg, ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,\ + rrcMsgLen); + break; + } + case ProtocolIE_ID_id_RRCDeliveryStatusRequest: + { + deliveryStaReq = true; + break; + } + default: + { + break; + } + } + } + + cellId = duCb.actvCellLst[cellIdx]->cellId; + for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++) + { + if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId) && + (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId && + duCb.actvCellLst[cellIdx]->ueCb[ueIdx].ueState == UE_ACTIVE)) + { + ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx]; + break; + } + } + + /* TODO : send RB config to MAC/RLC */ + + /* Sending DL RRC Message to RLC */ + if(ueIdx != MAX_NUM_UE) + { + ret = duBuildAndSendDlRrcMsgToRlc(cellId, ueCb->rlcUeCfg, SRB_ID_1, \ + deliveryStaReq, rrcMsgLen, rrcMsg); + } + else + { + DU_LOG("\nDU APP : No UE found for CuUeF1apId[%d] and DuUeF1apId[%d]", \ + gnbCuUeF1apId, gnbDuUeF1apId); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rrcMsg, rrcMsgLen); + ret = RFAILED; + } + + return ret; +} + /****************************************************************** * * @brief Processes DL RRC Message Transfer sent by CU