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(uint16_t cellId, uint16_t crnti, \
205 DlCcchMsgType msgType, uint8_t *dlCcchMsg, uint16_t dlCcchMsgSize)
209 DlCcchIndInfo *dlCcchIndInfo = NULLP;
212 memset(&pst, 0, sizeof(Pst));
213 DU_LOG("\nDU APP : Building and Sending DL CCCH Ind to MAC");
215 DU_ALLOC_SHRABL_BUF(dlCcchIndInfo, sizeof(DlCcchIndInfo));
219 DU_LOG("\nDU APP : Memory alloc failed while building DL CCCH Ind");
223 dlCcchIndInfo->cellId = cellId;
224 dlCcchIndInfo->crnti = crnti;
225 dlCcchIndInfo->msgType = msgType;
226 dlCcchIndInfo->dlCcchMsgLen = dlCcchMsgSize;
228 DU_ALLOC_SHRABL_BUF(dlCcchIndInfo->dlCcchMsg, dlCcchIndInfo->dlCcchMsgLen);
229 if(!dlCcchIndInfo->dlCcchMsg)
231 DU_LOG("\nDU APP : Memory alloc failed while building DL CCCH Ind");
232 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlCcchIndInfo, sizeof(DlCcchIndInfo));
235 for(idx2 = 0; idx2 < dlCcchIndInfo->dlCcchMsgLen; idx2++)
237 dlCcchIndInfo->dlCcchMsg[idx2] = dlCcchMsg[idx2];
239 DU_FREE(dlCcchMsg, dlCcchMsgSize);
242 pst.selector = DU_MAC_LWLC;
243 pst.srcEnt = ENTDUAPP;
247 pst.dstProcId = DU_PROC;
248 pst.srcProcId = DU_PROC;
249 pst.region = DU_APP_MEM_REGION;
251 pst.event = EVENT_MAC_DL_CCCH_IND;
253 ret = (*packMacDlCcchIndOpts[pst.selector])(&pst, dlCcchIndInfo);
256 DU_LOG("\nDU_APP : Failure in sending DL CCCH to MAC");
257 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlCcchIndInfo->dlCcchMsg,\
258 dlCcchIndInfo->dlCcchMsgLen);
259 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlCcchIndInfo, \
260 sizeof(DlCcchIndInfo));
268 /******************************************************************
270 * @brief Processes DL RRC Message Transfer sent by CU
274 * Function : procDlRrcMsgTrans
276 * Functionality: Processes DL RRC Message Transfer sent by CU
278 * @params[in] F1AP_PDU_t ASN decoded F1AP message
279 * @return ROK - success
282 * ****************************************************************/
283 uint8_t procDlRrcMsgTrans(F1AP_PDU_t *f1apMsg)
285 DLRRCMessageTransfer_t *dlRrcMsg = NULLP;
286 uint8_t *dlCcchMsg = NULLP;
287 uint8_t idx, ret, srbId;
288 uint16_t idx2, crnti, cellId, dlCcchMsgSize;
289 uint32_t gnbCuUeF1apId, gnbDuUeF1apId;
292 DU_LOG("\nDU_APP : DL RRC message transfer Recevied");
293 dlRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
297 for(idx=0; idx<dlRrcMsg->protocolIEs.list.count; idx++)
299 switch(dlRrcMsg->protocolIEs.list.array[idx]->id)
301 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
303 gnbCuUeF1apId = dlRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
304 UNUSED(gnbCuUeF1apId); //This is currently not used
307 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
309 gnbDuUeF1apId = dlRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
312 case ProtocolIE_ID_id_SRBID:
314 srbId = dlRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
317 case ProtocolIE_ID_id_ExecuteDuplication:
320 case ProtocolIE_ID_id_RRCContainer:
322 if(dlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size > 0)
324 dlCcchMsgSize = dlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
325 DU_ALLOC(dlCcchMsg, dlCcchMsgSize);
326 for(idx2 = 0; idx2 < dlCcchMsgSize; idx2++)
329 dlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf[idx2];
334 DU_LOG("\nDU_APP : RRC Container Size is invalid:%d",\
335 dlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
341 DU_LOG("\nDU_APP : Invalid IE received in DL RRC Msg Transfer:%ld",
342 dlRrcMsg->protocolIEs.list.array[idx]->id);
346 for(idx=0; idx<duCb.numUe; idx++)
348 if(gnbDuUeF1apId == duCb.ueCcchCtxt[idx].gnbDuUeF1apId)
350 crnti = duCb.ueCcchCtxt[idx].crnti;
351 cellId = duCb.ueCcchCtxt[idx].cellId;
354 if(srbId == SRB_ID_1) //RRC connection setup
356 ret = duBuildAndSendDlCcchInd(cellId, crnti, RRC_SETUP, dlCcchMsg, dlCcchMsgSize);
361 /******************************************************************
363 * @brief Generates GNB DU Ue F1AP ID
367 * Function : genGnbDuUeF1apId
369 * Functionality: Generates GNB DU Ue F1AP ID
372 * @return gnbDuF1apId
374 * ****************************************************************/
375 uint32_t genGnbDuUeF1apId()
377 static uint32_t gnbDuUeF1apId = 0;
379 return ++gnbDuUeF1apId;
381 /******************************************************************
383 * @brief Processes UL CCCH Ind recvd from MAC
387 * Function : duProcUlCcchInd
389 * Functionality: Processes UL CCCH Ind recvd from MAC
391 * @params[in] UlCcchIndInfo *ulCcchIndInfo
392 * @return ROK - success
395 * ****************************************************************/
396 uint8_t duProcUlCcchInd(UlCcchIndInfo *ulCcchIndInfo)
400 uint32_t gnbDuUeF1apId = 0;
402 gnbDuUeF1apId = genGnbDuUeF1apId();
404 /* Store Ue mapping */
405 duCb.ueCcchCtxt[duCb.numUe].gnbDuUeF1apId = gnbDuUeF1apId;
406 duCb.ueCcchCtxt[duCb.numUe].crnti = ulCcchIndInfo->crnti;
407 duCb.ueCcchCtxt[duCb.numUe].cellId = ulCcchIndInfo->cellId;
411 ret = (BuildAndSendInitialRrcMsgTransfer(gnbDuUeF1apId, ulCcchIndInfo->crnti,
412 ulCcchIndInfo->ulCcchMsg));
415 DU_LOG("\nDU_APP : BuildAndSendInitialRrcMsgTransfer failed");
418 DU_FREE_SHRABL_BUF(MAC_MEM_REGION, RG_POOL, ulCcchIndInfo->ulCcchMsg, strlen((const char*)ulCcchIndInfo->ulCcchMsg));
419 DU_FREE_SHRABL_BUF(MAC_MEM_REGION, RG_POOL, ulCcchIndInfo, sizeof(UlCcchIndInfo));
426 /**********************************************************************
428 ***********************************************************************/