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 *******************************************************************************/
19 /**********************************************************************
25 Desc: Source code for RLC Transparent mode assembly and
26 reassembly.This file contains following functions
35 **********************************************************************/
38 @brief RLC Transparent Mode module
41 /* header (.h) include files */
42 #include "common_def.h"
43 #include "lkw.h" /* LKW defines */
44 #include "ckw.h" /* CKW defines */
45 #include "kwu.h" /* KWU defines */
46 #include "rgu.h" /* RGU defines */
47 #include "kw_env.h" /* RLC environment options */
49 #include "kw.h" /* RLC defines */
50 #include "kw_err.h" /* RLC defines */
53 /* extern (.x) include files */
54 #include "lkw.x" /* LKW */
55 #include "ckw.x" /* CKW */
56 #include "kwu.x" /* KWU */
57 #include "rgu.x" /* RGU */
61 #include "du_app_rlc_inf.h"
62 #include "rlc_utils.h"
63 #include "rlc_upr_inf_api.h"
65 #if defined(PRE_DEF_UE_CTX) || defined(PRE_DEF_UE_CTX_HO)
66 #ifdef EG_GEN_LOAD_5GTF
70 S16 PjUiPjuDatInd(Pst* pst,SuId suId,CmLtePdcpId * pdcpId,Buffer *mBuf);
77 KwuDatIndInfo *datIndInfo; /* Data Indication Information */
78 uint8_t rrcConReq[6] ={ 0x50, 0x30, 0x30, 0x30, 0x30, 0x34 };
79 uint8_t rrcConSetupComplete[34] ={ 0x20, 0x00, 0x3e, 0x0e, 0x82, 0x02, 0x10, 0x12, 0x20, 0x02, 0x20, 0x64, 0xa8, 0x2c, 0x48, 0x05, 0x00, 0x80, 0x00, 0x08, 0x04, 0x03, 0xa0, 0x02, 0xa0, 0x10, 0x12, 0x20, 0x02, 0x20, 0x64, 0xa8, 0x2c, 0x48};
81 uint8_t rrcUeCapabilityInfo[12] ={0x38, 0x01, 0x00, 0x80, 0x1b, 0xff, 0x0c, 0x00, 0x20, 0x00, 0x80, 0x00};
83 /* uint8_t rrcUeCapabilityInfo[44] ={0x38,0x01,0x02,0x84,0x9b,0xff,0x0c,0x00,0x20,0x00,0x80,0x1f,0xfe,0xf4,0x4f,0xe0,0x40,0x03,0x80,0x11,0x04,0x0c,0x20,0x88,0x20,0x7f,0xff,0xff,0xff,0xf3,0xff,0x81,0xff,0xff,0xff,0xff,0x7f,0xf0,0x3f,0xff,0xff,0xff,0xe0,0x00};
85 uint8_t rrcUeCapabilityInfo[] =
87 0x38,0x01,0x03,0x34,0x9b,0xff,0x0c,0x00,0x20,0x00,0x80,0x1f,0xfe,0xf4,0x4f,0xe0
88 ,0x40,0x09,0x80,0x11,0x04,0x0c,0x20,0x88,0x20,0x63,0x04,0x41,0x03,0x20,0x22,0x08
89 ,0x19,0x61,0x10,0x40,0xff,0xff,0xff,0xff,0xe7,0xff,0x03,0xff,0xff,0xff,0xfe,0xff
90 ,0xe0,0x7f,0xff,0xff,0xff,0xc0,0x00
94 uint8_t rrcSecurityModeComplete[2] ={0x28, 0x80};
95 uint8_t rrcReconfigComplete[2] ={0x10, 0x80};
99 Pst ulPst1 ={100,100,217,0,215,0,PRIOR0,0,81,1,1,0,0};
101 Pst ulPst2 ={100,100,217,0,216,0,PRIOR0,0,68,0,1,0,0};
107 KwuDatIndInfo datIndInfoTmp;
108 datIndInfo = &datIndInfoTmp;
109 datIndInfo->rlcId.rbId = 5;
110 datIndInfo->rlcId.rbType = 0;
111 datIndInfo->rlcId.ueId = 0;
112 datIndInfo->rlcId.cellId = 1;
113 datIndInfo->tCrnti = crnti;
114 datIndInfo->isOutOfSeq = 16;
116 SGetMsg(DFLT_REGION, DFLT_POOL, (Buffer **) &pdu);
118 SAddPstMsgMult(rrcConReq,6,pdu);
120 DU_LOG("\nINFO --> RLC_UL : Profiling Framework Sending RRC Connection Req to RRC for UE :%d\n",crnti);
121 rlcSendUlDataToDu(&ulPst1, datIndInfo, pdu);
123 else if(2 == rrcMsgType)
132 SGetMsg(DFLT_REGION, DFLT_POOL, (Buffer **) &pdu);
134 SAddPstMsgMult(rrcConSetupComplete,34,pdu);
136 DU_LOG("\nINFO --> RLC_UL : Profiling Framework: Sending RRC Connection Setup Complete to RRC for UE :%d\n",crnti);
138 PjUiPjuDatInd(&ulPst2, 1, &pdcpId, pdu);
142 else if(3 == rrcMsgType)
151 SGetMsg(DFLT_REGION, DFLT_POOL, (Buffer **) &pdu);
154 SAddPstMsgMult(rrcUeCapabilityInfo,12,pdu);
156 SAddPstMsgMult(rrcUeCapabilityInfo,sizeof(rrcUeCapabilityInfo),pdu);
158 DU_LOG("\nINFO --> RLC_UL : Profiling Framework: Sending RRC UE Capability Info to RRC for UE :%d\n",crnti);
160 PjUiPjuDatInd(&ulPst2, 1, &pdcpId, pdu);
164 else if(4 == rrcMsgType)
174 SGetMsg(DFLT_REGION, DFLT_POOL, (Buffer **) &pdu);
176 SAddPstMsgMult(rrcSecurityModeComplete,2,pdu);
178 DU_LOG("\nINFO --> RLC_UL : Profiling Framework: Sending RRC Security Mode Complete to RRC for UE :%d\n",crnti);
180 PjUiPjuDatInd(&ulPst2, 1, &pdcpId, pdu);
183 else if(5 == rrcMsgType)
193 SGetMsg(DFLT_REGION, DFLT_POOL, (Buffer **) &pdu);
195 SAddPstMsgMult(rrcReconfigComplete,2,pdu);
197 DU_LOG("\nINFO --> RLC_UL : Profiling Framework: Sending RRC Reconfig Complete to RRC for UE :%d\n",crnti);
199 PjUiPjuDatInd(&ulPst2, 1, &pdcpId, pdu);
200 #ifdef EG_GEN_LOAD_5GTF
208 /** @addtogroup tmmode */
211 #define RLC_MODULE (RLC_DBGMASK_TM | RLC_DBGMASK_UL)
215 * Handler to process the Data Indication from the lower layer and send the
216 * SDU to upper layer.
219 * This function processes the PDU receivied from the lower layer and sends
220 * the same pdu as SDU to the upper layer.It sends CRNTI along with the SDU
223 * @param[in] gCb RLC Instance Control Block
224 * @param[in] rbCb RB control block.
225 * @param[in] tCrnti TCRNTI
233 void rlcTmmRcvFrmMac(RlcCb *gCb, RlcUlRbCb *rbCb, CmLteRnti tCrnti, Buffer *pdu)
235 void rlcTmmRcvFrmMac(RlcCb *gCb, RlcUlRbCb *rbCb, Buffer *pdu)
238 RlcUlRrcMsgInfo *ulRrcMsgInfo;
240 uint16_t copyLen; /* Number of bytes copied */
243 gCb->genSts.pdusRecv++;
244 ODU_GET_MSG_LEN(pdu, (MsgLen *)&msgLen);
245 gCb->genSts.bytesRecv += msgLen;
247 /* Filling UL RRC Message Info */
248 RLC_ALLOC_SHRABL_BUF(RLC_MEM_REGION_UL, RLC_POOL,
249 ulRrcMsgInfo, sizeof(RlcUlRrcMsgInfo));
252 ulRrcMsgInfo->cellId = rbCb->rlcId.cellId;
253 ulRrcMsgInfo->ueIdx = rbCb->rlcId.ueId;
254 ulRrcMsgInfo->lcId = rbCb->lch.lChId;
255 RLC_ALLOC_SHRABL_BUF(RLC_MEM_REGION_UL, RLC_POOL,
256 ulRrcMsgInfo->rrcMsg, msgLen);
257 if (ulRrcMsgInfo->rrcMsg)
259 ODU_COPY_MSG_TO_FIX_BUF(pdu, 0, msgLen, ulRrcMsgInfo->rrcMsg, (MsgLen *)©Len);
260 ulRrcMsgInfo->msgLen = msgLen;
262 /* Sending UL RRC Message transfeer to DU APP */
263 memset(&pst, 0, sizeof(Pst));
264 FILL_PST_RLC_TO_DUAPP(pst, RLC_UL_INST, EVENT_UL_RRC_MSG_TRANS_TO_DU);
265 rlcSendUlRrcMsgToDu(&pst, ulRrcMsgInfo);
269 DU_LOG("\nERROR --> RLC_UL : rlcTmmRcvFrmMac: Memory allocation failed for UL RRC Msg");
274 DU_LOG("\nERROR --> RLC_UL : rlcTmmRcvFrmMac: Memory allocation failed for ulRrcMsgInfo");
282 * Handler to process the re-establishment request received from the upper
283 * layer. It is just a hook for future enhancement.
286 * @param[in] gCb RLC Instance Control Block
287 * @param[in] rbCb RB control block.
293 Void rlcTmmUlReEstablish
299 DU_LOG("\nINFO --> RLC_UL : do nothing for TMM for ReEstablish");
307 /********************************************************************30**
309 **********************************************************************/