1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
18 /* This file contains UE management handling functionality for DU APP */
19 #include "du_ue_mgr.h"
25 DuMacDlCcchInd packMacDlCcchIndOpts[] =
27 packMacDlCcchInd, /* Loose coupling */
28 MacHdlDlCcchInd, /* TIght coupling */
29 packMacDlCcchInd /* Light weight-loose coupling */
32 /******************************************************************
34 * @brief Send UE configuration to RLC
38 * Function : duSendUeCreateReqToRlc
40 * Functionality: Send UeCreateReqToRlc
42 * @return ROK - success
45 * ****************************************************************/
46 S16 duSendUeCreateReqToRlc()
52 DU_SET_ZERO(&ueCfg, sizeof(ueCfg));
53 DU_SET_ZERO(&pst, sizeof(Pst));
55 DU_ALLOC(ueCfg, sizeof(CkwCfgInfo));
60 ueCfg->cellId = NR_CELL_ID;
63 for(idx = 0; idx < ueCfg->numEnt; idx++)
66 ueCfg->entCfg[idx].rbId = RB_ID;
67 ueCfg->entCfg[idx].rbType = CM_LTE_DRB;
68 ueCfg->entCfg[idx].lCh[0].lChId = LC_ID;
69 ueCfg->entCfg[idx].lCh[0].type = CM_LTE_LCH_DTCH;
71 ueCfg->entCfg[idx].entMode = CM_LTE_MODE_UM;
72 ueCfg->entCfg[idx].dir = CKW_CFG_DIR_BOTH;
73 switch(ueCfg->entCfg[idx].entMode)
82 ueCfg->entCfg[idx].m.umInfo.dl.snLen = 1; /* For 12 bit SN */
83 ueCfg->entCfg[idx].m.umInfo.ul.snLen = 1; /* For 12 bit SN */
84 ueCfg->entCfg[idx].m.umInfo.ul.reOrdTmr = 10; /* in msec */
95 } /* End of switch(entMode) */
96 } /* End of entity configuration for loop */
99 pst.selector = DU_SELECTOR_LWLC;
100 pst.srcEnt = ENTDUAPP;
102 pst.dstInst = RLC_UL_INST;
103 pst.dstProcId = DU_PROC;
104 pst.srcProcId = DU_PROC;
105 pst.region = duCb.init.region;
108 packUeCreateReq(&pst, ueCfg);
111 } /* End of duSendUeCreateReqToRlc */
113 /*******************************************************************
115 * @brief Handles EGTP data from CU
119 * Function : duHdlEgtpData
122 * Processes EGTP header and sends data to RLC
124 * @params[in] Pointer to EGTP Message
125 * @return ROK - success
128 * ****************************************************************/
129 S16 duHdlEgtpDlData(EgtpMsg *egtpMsg)
131 /* TODO : Extract RbId/UeID/CellID/SduId from database
132 using tunnel id in egtp header */
134 DU_LOG("\nDU_APP : Processing DL data");
137 KwuDatReqInfo datReqInfo;
140 datReqInfo.rlcId.rbId = RB_ID;
141 datReqInfo.rlcId.rbType = CM_LTE_DRB;
142 datReqInfo.rlcId.ueId = UE_ID;
143 datReqInfo.rlcId.cellId = NR_CELL_ID;
145 datReqInfo.sduId = ++sduId;
146 datReqInfo.lcType = CM_LTE_LCH_DTCH;
148 /* Filling pst and Sending to RLC DL */
149 pst.selector = DU_SELECTOR_LWLC;
150 pst.srcEnt = ENTDUAPP;
152 pst.dstInst = RLC_DL_INST;
153 pst.dstProcId = DU_PROC;
154 pst.srcProcId = DU_PROC;
155 pst.region = duCb.init.region;
157 cmPkKwuDatReq(&pst, &datReqInfo, egtpMsg->msg);
161 /*******************************************************************
163 * @brief Handles UL data and send to CU
167 * Function : duHdlRlcUlData
170 * Processes UL Data from RLC and sends to CU
172 * @params[in] Pointer to EGTP Message
173 * @return ROK - success
176 *****************************************************************/
178 PUBLIC S16 duHdlRlcUlData(Pst *pst, KwuDatIndInfo* datInd, Buffer *mBuf)
180 DU_LOG("\nDU_APP : Received UL Data at DU_APP");
182 /* Send UL data to CU via EGTP */
183 duSendEgtpDatInd(mBuf);
189 /******************************************************************
191 * @brief Builds and Sends DL CCCH Ind to MAC
195 * Function : duBuildAndSendDlCcchInd
197 * Functionality: Builds and sends DL CCCH Ind Msg to MAC
199 * @params[in] dlCcchMsg - uint8_t*
200 * @return ROK - success
203 * ****************************************************************/
204 uint8_t duBuildAndSendDlCcchInd(uint8_t *dlCcchMsg, uint16_t crnti, uint16_t cellId, DlCcchMsgType msgType)
208 DlCcchIndInfo *dlCcchIndInfo = NULLP;
210 DU_LOG("\nDU APP : Building and Sending DL CCCH Ind to MAC");
212 DU_ALLOC_SHRABL_BUF(dlCcchIndInfo, sizeof(DlCcchIndInfo));
216 DU_LOG("\nDU APP : Memory alloc failed while building DL CCCH Ind");
220 dlCcchIndInfo->cellId = cellId;
221 dlCcchIndInfo->crnti = crnti;
222 dlCcchIndInfo->msgType = msgType;
223 DU_ALLOC_SHRABL_BUF(dlCcchIndInfo->dlCcchMsg, strlen((const char*)dlCcchMsg));
224 if(!dlCcchIndInfo->dlCcchMsg)
226 DU_LOG("\nDU APP : Memory alloc failed while building DL CCCH Ind");
227 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlCcchIndInfo, sizeof(DlCcchIndInfo));
230 memcpy(dlCcchIndInfo->dlCcchMsg, dlCcchMsg, strlen((const char*)dlCcchMsg));
231 DU_FREE(dlCcchMsg, strlen((const char*)dlCcchMsg));
234 pst.selector = DU_MAC_LWLC;
235 pst.srcEnt = ENTDUAPP;
239 pst.dstProcId = DU_PROC;
240 pst.srcProcId = DU_PROC;
241 pst.region = DU_APP_MEM_REGION;
243 pst.event = EVENT_MAC_DL_CCCH_IND;
245 ret = (*packMacDlCcchIndOpts[pst.selector])(&pst, dlCcchIndInfo);
248 DU_LOG("\nDU_APP : Failure in sending DL CCCH to MAC");
249 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlCcchIndInfo->dlCcchMsg, strlen((const char*)dlCcchMsg));
250 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlCcchIndInfo, sizeof(DlCcchIndInfo));
258 /******************************************************************
260 * @brief Processes DL RRC Message Transfer sent by CU
264 * Function : procDlRrcMsgTrans
266 * Functionality: Processes DL RRC Message Transfer sent by CU
268 * @params[in] F1AP_PDU_t ASN decoded F1AP message
269 * @return ROK - success
272 * ****************************************************************/
273 uint8_t procDlRrcMsgTrans(F1AP_PDU_t *f1apMsg)
275 DLRRCMessageTransfer_t *dlRrcMsg = NULLP;
276 uint8_t *dlCcchMsg = NULLP;
277 uint8_t srbId, idx, ret;
278 uint16_t crnti, cellId;
279 uint32_t gnbCuUeF1apId, gnbDuUeF1apId;
282 DU_LOG("\nDU_APP : DL RRC message transfer Recevied");
283 dlRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
287 for(idx=0; idx<dlRrcMsg->protocolIEs.list.count; idx++)
289 switch(dlRrcMsg->protocolIEs.list.array[idx]->id)
291 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
293 gnbCuUeF1apId = dlRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
294 UNUSED(gnbCuUeF1apId); //This is currently not used
297 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
299 gnbDuUeF1apId = dlRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
302 case ProtocolIE_ID_id_SRBID:
304 srbId = dlRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
307 case ProtocolIE_ID_id_RRCContainer:
309 DU_ALLOC(dlCcchMsg, dlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
311 dlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,
312 dlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
317 DU_LOG("\nDU_APP : Invalid IE received in DL RRC Msg Transfer:%ld",
318 dlRrcMsg->protocolIEs.list.array[idx]->id);
322 for(idx=0; idx<duCb.numUe; idx++)
324 if(gnbDuUeF1apId == duCb.ueCcchCtxt[idx].gnbDuUeF1apId)
326 crnti = duCb.ueCcchCtxt[idx].crnti;
327 cellId = duCb.ueCcchCtxt[idx].cellId;
330 if(srbId == 0) //RRC connection setup
332 ret = duBuildAndSendDlCcchInd(dlCcchMsg, crnti, cellId, RRC_SETUP);
337 /******************************************************************
339 * @brief Generates GNB DU Ue F1AP ID
343 * Function : genGnbDuUeF1apId
345 * Functionality: Generates GNB DU Ue F1AP ID
348 * @return gnbDuF1apId
350 * ****************************************************************/
351 uint32_t genGnbDuUeF1apId()
353 static uint32_t gnbDuUeF1apId = 0;
355 return ++gnbDuUeF1apId;
357 /******************************************************************
359 * @brief Processes UL CCCH Ind recvd from MAC
363 * Function : duProcUlCcchInd
365 * Functionality: Processes UL CCCH Ind recvd from MAC
367 * @params[in] UlCcchIndInfo *ulCcchIndInfo
368 * @return ROK - success
371 * ****************************************************************/
372 uint8_t duProcUlCcchInd(UlCcchIndInfo *ulCcchIndInfo)
376 uint32_t gnbDuUeF1apId = 0;
378 gnbDuUeF1apId = genGnbDuUeF1apId();
380 /* Store Ue mapping */
381 duCb.ueCcchCtxt[duCb.numUe].gnbDuUeF1apId = gnbDuUeF1apId;
382 duCb.ueCcchCtxt[duCb.numUe].crnti = ulCcchIndInfo->crnti;
383 duCb.ueCcchCtxt[duCb.numUe].cellId = ulCcchIndInfo->cellId;
387 ret = (BuildAndSendInitialRrcMsgTransfer(gnbDuUeF1apId, ulCcchIndInfo->crnti,
388 ulCcchIndInfo->ulCcchMsg));
391 DU_LOG("\nDU_APP : BuildAndSendInitialRrcMsgTransfer failed");
394 DU_FREE_SHRABL_BUF(MAC_MEM_REGION, RG_POOL, ulCcchIndInfo->ulCcchMsg, strlen((const char*)ulCcchIndInfo->ulCcchMsg));
395 DU_FREE_SHRABL_BUF(MAC_MEM_REGION, RG_POOL, ulCcchIndInfo, sizeof(UlCcchIndInfo));
402 /**********************************************************************
404 ***********************************************************************/