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 /********************************************************************20**
21 Name: LTE RLC file for uplink and non real time tasks
25 Desc: This file contains all the data structures and
26 prototypes for LTE RLC in the uplink.
30 *********************************************************************21*/
33 * @brief RLC uplink structures, prototypes
41 #endif /* __cplusplus */
43 typedef struct rlcUlUeCb RlcUlUeCb;
47 * @brief Structure to hold a RLC UM PDU segment
50 * - lstEnt : This is required for the linked list in which the segments
52 * - seg : Holds the segment data
53 * - segSz : The length of the segment in bytes
55 * - umHdr : The UM Header for the PDU segment
58 typedef struct rlcUmSeg
60 CmLList lstEnt; /*!< List entry for PDU segment */
61 Buffer *seg; /*!< PDU segment */
62 MsgLen segSz; /*!< Buffer Size */
63 uint16_t soEnd; /*!< Segment Offset End */
64 RlcUmHdr umHdr; /*!<Um Header */
68 /** @defgroup um_uplink UM Uplink Module
72 * @brief Structure to hold a UM PDU
75 * - pdu : Buffer holding the UM PDU data
76 * - umHdr : UM PDU Header Information
77 * - pduSz : Length of the PDU excluding the header
79 typedef struct rlcUmRecBuf
82 RlcSn sn; /*!< Sequence Number */
83 CmLList lnk; /*!< Link to the receive buffer list */
84 Bool allSegRcvd; /*!< Flag to check whether all seg are received */
85 Bool noMissingSeg; /*!< Flag to check all the bytes are received before the last byte of segment */
86 CmLListCp segLst; /*!< PDU Segments list */
87 uint16_t expSo; /*!< Next expected seg offset */
88 Bool allRcvd; /*!< All bytes received or not */
89 RlcUmSeg *expByteSeg; /*!< Next expected byte segment */
91 Buffer *pdu; /**< Buffer holding the UM PDU */
92 RlcUmHdr umHdr; /**< UM PDU Header Information */
93 MsgLen pduSz; /**< PDU Size */
97 * @brief Structure to hold uplink information in UM mode for a particular RB
100 * - snLen : The sequence number length can be 5 bits or 10 bits.
101 * Here it is stored as 1 or 2 (as the number of bytes)
102 * - recBuf : Holds all the received PDUs. PDU's are removed from this
103 * after a SDU is formed or during restablishment
104 * - umWinSz : The window size is 512 for 10 bits sequence number and 16
105 * for 5 bits sequence number
106 * - partialSdu : This is used to store the partially completed SDU.
107 * It remains till complete SDU is received
109 typedef struct rlcUmUl
111 uint8_t snLen; /**< Sequence number length */
112 uint8_t reOrdTmrInt; /**< Timer Interval */
114 CmLListCp *recBufLst; /*!<Reception Buffer List */
116 RlcUmRecBuf **recBuf; /**< Reception buffer */
117 RlcSn umWinSz; /**< UM window size */
118 uint16_t modBitMask; /**< Bitmask for modulus to wrap around variables */
119 RlcSn sn; /**< Sequence number */
120 RlcSn vrUr; /**< VR(UR) - Receive state variable */
121 RlcSn vrUh; /**< VR(UH) - Highest received state variable */
122 RlcSn vrUx; /**< VR(UX) - Reordering state variable */
123 CmTimer reOrdTmr; /**< Reordering Timer */
124 Buffer *assembleSdu; /**< Assemble Sdu - Remains till the complete SDU is received */
125 uint16_t expSo; /*!< Expected SO for reassembly */
126 RlcSn expSn; /*!< Expected Sn */
131 * @brief Structure to hold a RLC AM PDU segment
134 * - lstEnt : This is required for the linked list in which the segments
136 * - seg : Holds the segment data
137 * - segSz : The length of the segment in bytes
139 * - amHdr : The AM Header for the PDU segment
142 typedef struct rlcSeg
144 CmLList lstEnt; /**< List entry for PDU segment */
145 Buffer *seg; /**< PDU segment */
146 MsgLen segSz; /**< Buffer Size */
147 uint16_t soEnd; /**< Segment Offset End */
148 RlcAmHdr amHdr; /**< AM header */
154 * @brief Structure to hold a received AM PDU or segments of a PDU
157 * - pdu : Holds the PDU data
158 * - pduSz : Length of the PDU in bytes
159 * - amHdr : The AM Header for the PDU
160 * - segLst : The length of the segment in bytes
161 * - expByteSeg : The next expected segment for re-ordering
162 * - expSo : The next expected SO so to be in sequence
163 * - allRcvd : Whether all the segments for this PDU has been recevied
166 typedef struct rlcAmRecBuf
168 CmLList lnk; /**< Link to the receive buffer list */
169 Buffer *pdu; /**< PDU buffer */
170 MsgLen pduSz; /**< Buffer Size */
171 RlcAmHdr amHdr; /**< AM header Info */
172 CmLListCp segLst; /**< PDU Segments list */
173 RlcSeg *expByteSeg; /**< Next expected byte segment */
174 uint16_t expSo; /**< Next expected seg offset */
175 Bool allRcvd; /**< All bytes received or not */
176 Bool isDelvUpperLayer; /**< Is it sent to upper layer */
179 /** @addtogroup ammode */
183 * @brief Structure to hold information about an uplink AM Radio Bearer
186 * - recBuf : Reception buffer
187 * - rxNext : RX_Next - Receive state variable
188 * - rxNextHighestRcvd : RX_Next_Highest_Rcvd - Highest received state variable
189 * - rxNextStatusTrig : RX_Next_Status_Trigger - reorderig state variable
190 * - vrMr : VR(MR) - Maximum acceptable receive state variable
191 * - rxHighestStatus : RX_Highest_Status - Maximum STATUS transmit state variable
192 * - staTrg : Flag to indicate if status trigger occured
193 * - partialSdu : Partial SDU - Remains till the complete SDU
195 * - expSn : The expected sequence number for reassembly
196 * - expSo : The expected SO for reassembly
197 * - staProhTmr : The Status Probihit Timer
198 * - staProhTmrInt : Status Prohibit Timer interval (in ??)
199 * - reOrdTmr : The Reordering Timer
200 * - reOrdTmrInt : Re-ordering timer interval
201 * - gatherStaPduInfo : Whether to gather information required to create
205 typedef struct rlcAmUl
208 CmLListCp *recBufLst;
210 // RlcAmRecBuf *recBuf[1024]; /**< Reception buffer */
212 RlcSn rxNext; /**< RX_Next:Equvalent to VR(R) in 4G */
213 RlcSn rxNextHighestRcvd; /**< RX_Next_Highest_Rcvd: Equvalent to VR(H) in 4G */
214 RlcSn rxNextStatusTrig; /**< rxNextStatusTrig: Equvalent to VR(X) in 4G*/
215 RlcSn vrMr; /**< VR(MR) */
216 RlcSn rxHighestStatus; /**< rxHighestStatus: Eqvalent to VR(MS) in 4G*/
217 Bool staTrg; /**< Whether status trigger occured */
218 Buffer *partialSdu; /**< Partially received SDU */
219 RlcSn expSn; /**< Expected SN for reassembly */
220 uint16_t expSo; /**< Expected SO for reassembly */
221 CmTimer staProhTmr; /**< T_status_prohibit Timer */
222 uint16_t staProhTmrInt; /**< Timer Interval */
223 CmTimer reOrdTmr; /**< T_reordering Timer */
224 uint8_t reOrdTmrInt; /**< Timer Interval */
225 Bool gatherStaPduInfo; /**< Gather STATUS PDU creation info*/
226 Bool isOutOfSeq; /**< To identify whether packets are Out-Of-Seq or not */
227 uint8_t snLen; /*!< Sequence number length:12 bit or 18 bit : 5GNR RLC */
228 uint32_t snModMask; /*!< (2 Pwr SnLen - 1): 5GNR RLC */
234 * @brief Structure to hold uplink information about a Radio Bearer
237 * - rlcId : RLC identifier, uniquely identifies a Radio Bearer
238 * - lch : Information (type and id) of the logical channel associated
239 * with this Radio Bearer.
240 * - mode : The mode of the Radio Bearer; UM or AM
241 * - dir : The direction of the Radio Bearer, downlink or uplink or both
242 * - inst : Id of RLC instance where this Radio Bearer is present. Used
243 * to find the instance from the Radio Bearer for memory needs
244 * as different instances might have different memory.
245 * - k1wuSapId : KWU SAP identifier
246 * - udxSapId : UDX SAP idenrifier
247 * - transId : Stores the transaction identifier used to communicate
248 * with MAC, the same value as sent by MAC is passed back
249 * for it to be able to corelate
250 * - m : Mode of the RB (TM/UM/AM)
251 * - umDl : Unacknowledged Mode downlink information
252 * - amDl : Acknowledged Mode downlink information
254 typedef struct _rlcUlRbCb
256 /* kw005.201 added support for L2 Measurement */
258 RlcL2MeasRbCb rbL2Cb; /**< RB measurement L2 Cb */
259 RlcUlUeCb *ueCb; /*!< Pointer to UeCb */
260 uint8_t qci; /**< qci of the RB */
261 RlcL2MeasIpThruput l2MeasIpThruput; /**< Holds related parameter for
262 DL/Ul ip throughput>*/
263 #endif /* LTE_L2_MEAS */
264 CmLteRlcId rlcId; /**< RLC Identifier */
265 RlcLchInfo lch; /**< Logical Channel Info */
266 CmLteRlcMode mode; /**< Entity Mode */
267 uint8_t dir; /**< Direction for UL/DL */
268 Inst inst; /**< Tapa where Rb created Instance id */
269 SpId k1wuSapId; /**< KWU sap Id, to get the KwuSapCb */
270 SpId udxSapId; /**< KWU sap Id, to get the KwuSapCb */
271 uint32_t transId; /**< Transaction Id for RLC */
274 RlcUmUl umUl; /**< UM mode Ul elements */
275 RlcAmUl amUl; /**< AM mode uplink elements */
276 }m; /**< RLC mode specific Info */
280 * @brief Structure to hold mapping between logical channel and Radio Bearer
283 * - ulRbCb : Pointer to the uplink Radio Bearer
285 typedef struct rlcUlLch
287 RlcUlRbCb *ulRbCb; /**< Pointer to Uplink RbCb */
291 * @brief Structure to hold uplink information about the Cells
294 * - cellHlEnt : Information about cells are stored in a hash table. This is
296 * - cellId : Identity of the cell
297 * - rbCb : Radio Bearers in the cell
298 * - lCh : Logical Channels in the cell
299 * - selfPstUl : Pst structure for sending messages to self
301 typedef struct rlcUlCellCb
303 CmHashListEnt cellHlEnt; /**< Hash list entry for CellCb */
304 CmLteCellId cellId; /**< Cell Id */
305 RlcUlRbCb *rbCb[RLC_MAX_RB_PER_CELL]; /**< RbCbs within a Cell */
306 RlcUlLch lCh[RLC_MAX_LCH_PER_CELL]; /**< Logical channels in a cell */
311 * @brief Structure to hold uplink information about the UEs
314 * - ueHlEnt : Information about cells are stored in a hash table. This is
316 * - key : Key to store/find the UE in the hashtable
317 * - srbCb : Signaling Radio Bearers configured for the UE
318 * - drbCb : Data Radio Bearers configured for the UE
319 * - lCh : Logical Channels in the UE
323 CmHashListEnt ueHlEnt; /**< Hash list entry for UeCb */
324 CmLteRnti ueId; /*!< UE Id */
325 CmLteCellId cellId; /*!< Cell Id */
326 RlcUlRbCb *srbCb[RLC_MAX_SRB_PER_UE]; /**< SRB RbCbs within an UE */
327 RlcUlRbCb *drbCb[RLC_MAX_DRB_PER_UE]; /**< DRB RbCbs within an UE */
328 RlcUlLch lCh[RLC_MAX_LCH_PER_UE]; /**< Logical channels of an UE*/
329 /* kw005.201 added support for L2 Measurement */
331 uint32_t firstPacketTTI; /*!< is first packet of the burst */
332 uint16_t numActRb[LKW_MAX_QCI]; /**< number of RBs Active */
333 Bool isUlBurstActive; /*!<Has the Burst started for UL IP Thrpt meas */
334 #endif /* LTE_L2_MEAS */
338 * @brief Structure to hold temporary data of configuration
341 * - entUlCfgCfm : Holds the UL configuration status
344 typedef struct rlcUlEntTmpData
346 RlcEntCfgCfmInfo entUlCfgCfm; /**< Ul Configuration status*/
347 RlcUlRbCb *rbCb; /**< Rb Block */
351 * @brief Structure to hold transaction information in configuration request
354 * - transHlEnt : List entry for transaction block.
355 * - transId : Transaction Id
359 * - cellCb : Cell Block
360 * - cfgInfo : Configuration Information
361 * - ueInfo : UE Information
362 * - newUeInfo : New Ue Information
363 * - cfgTmpData : Temporary data per Configuration entity
365 typedef struct rlcUlCfgTmpData
367 CmHashListEnt transHlEnt; /**< List Entry of
369 uint32_t transId; /**< Locally generated Transaction Id */
370 uint32_t uprLyrTransId; /**< Transaction Id generated by upper layer.
371 This is used while sending confirm to the User Layer */
372 CmLteCellId cellId; /**< Cell Id */
373 CmLteRnti ueId; /**< Ue Id */
374 RlcUlUeCb *ueCb; /**< Ue Block */
375 RlcUlCellCb *cellCb; /**< Cell Block */
376 RlcCfgInfo *cfgInfo; /**< Config Information*/
377 CkwUeInfo *ueInfo; /**< Ue Information */
378 CkwUeInfo *newUeInfo; /**< New Ue Information */
379 RlcUlEntTmpData cfgEntData[CKW_MAX_ENT_CFG]; /**< Entity Data */
381 /****************************************************************************
383 ***************************************************************************/
384 /****************************************************************************
385 * Configuration Functions
386 ***************************************************************************/
388 S16 rlcValidateRbCfgParams ARGS ((RlcCb *gCb,
391 RlcEntCfgInfo *cfgToValidate,
393 S16 rlcCfgValidateUlRb ARGS (( RlcCb *gCb,
394 RlcEntCfgInfo *cfgToValidate,
395 RlcUlEntTmpData *cfgInfo,
396 RlcUlCfgTmpData *cfg));
398 S16 rlcCfgRollBackUlRb ARGS ((RlcCb *gCb,
400 RlcEntCfgInfo *cfgToValidate,
401 RlcUlEntTmpData *cfgTempData));
403 Void rlcCfgApplyUlRb ARGS ((RlcCb *gCb,
404 RlcEntCfgInfo *cfgToAply,
405 RlcUlEntTmpData *cfgTmpData,
406 RlcUlCfgTmpData *cfgTmpInfo));
408 S16 rlcCfgValidateReEstRb ARGS ((RlcCb *gCb,
411 RlcEntCfgInfo *cfgToValidate,
412 RlcUlEntTmpData *cfgTmpData));
414 Void rlcCfgApplyReEstUlRb ARGS ((RlcCb *gCb,
418 RlcUlEntTmpData *cfgTmpData));
420 Void rlcCfgApplyDelUlCell ARGS ((RlcCb *gCb,
421 RlcUlCfgTmpData *cfgTmpData));
423 S16 rlcCfgValidateDelUlCell ARGS ((RlcCb *gCb,
425 RlcEntCfgInfo *cfgToValidate,
426 RlcUlEntTmpData *cfgTmpData,
427 RlcUlCfgTmpData *cfgInfo));
429 S16 rlcCfgValidateDelUlUe ARGS ((RlcCb *gCb,
430 RlcEntCfgInfo *cfgToValidate,
431 RlcUlEntTmpData *cfgTmpData,
432 RlcUlCfgTmpData *cfgInfo));
434 Void rlcCfgApplyDelUlUe ARGS ((RlcCb *gCb,
435 RlcUlCfgTmpData *cfgTmpData));
437 Void rlcUlHdlCfgReq ARGS ((RlcCb *gCb,
438 RlcUlCfgTmpData *cfgInfo,
441 Void rlcCfgApplyUlUeIdChng ARGS ((RlcCb *gCb,
443 CkwUeInfo *newUeInfo,
444 RlcUlCfgTmpData *cfgTmpInfo));
446 S16 rlcCfgValidateUeIdChng ARGS ((RlcCb *gCb,
448 CkwUeInfo *newUeInfo,
449 RlcUlCfgTmpData *cfgTmpInfo));
451 /****************************************************************************
452 * DBM module Functions
453 ***************************************************************************/
454 S16 rlcDbmUlInit ARGS ((RlcCb *gCb));
456 Void rlcDbmUlDeInit ARGS ((RlcCb *gCb));
458 S16 rlcDbmAddUlUeCb ARGS ((RlcCb *gCb,
463 uint8_t rlcDbmFetchUlUeCb ARGS ((RlcCb *gCb,
468 Void rlcDbmDelUlUeCb ARGS ((RlcCb *gCb,
472 Void rlcDbmDelAllUlUe ARGS ((RlcCb *gCb));
474 S16 rlcDbmAddUlCellCb ARGS ((RlcCb *gCb,
476 RlcUlCellCb *cellCb));
478 Void rlcDbmFetchUlCellCb ARGS ((RlcCb *gCb,
480 RlcUlCellCb **cellCb));
482 Void rlcDbmDelUlCellCb ARGS ((RlcCb *gCb,
483 RlcUlCellCb *cellCb));
485 Void rlcDbmDelAllUlCell ARGS ((RlcCb *gCb));
487 Void rlcDbmFetchUlRbCbByRbId ARGS ((RlcCb *gCb,
491 Void rlcDbmFetchUlRbCbFromLchId ARGS ((RlcCb *gCb,
497 Void rlcDbmDelAllUlRb ARGS ((RlcCb *gCb,
501 S16 rlcDbmAddUlTransaction ARGS((RlcCb *gCb, RlcUlCfgTmpData *cfg));
503 S16 rlcDbmFindUlTransaction ARGS((RlcCb *gCb,
505 RlcUlCfgTmpData **cfg));
507 S16 rlcDbmDelUlTransaction ARGS((RlcCb *gCb, RlcUlCfgTmpData *cfg));
509 S16 rlcDbmDelAllUlTransactions ARGS((RlcCb *gCb));
511 Void rlcDbmUlShutdown ARGS ((RlcCb *gCb));
513 /****************************************************************************
514 * Transparent Mode Functions
515 ***************************************************************************/
517 void rlcTmmRcvFrmMac ARGS ((RlcCb *gCb,
523 void rlcTmmRcvFrmMac ARGS ((RlcCb *gCb,
528 Void rlcTmmUlReEstablish ARGS ((RlcCb *gCb, RlcUlRbCb *rbCb));
530 /****************************************************************************
531 * Unacknowledged Mode Functions
532 ***************************************************************************/
534 Void rlcUmmProcessPdus ARGS((RlcCb *gCb,
539 Void rlcUmmProcessPdus ARGS ((RlcCb *gCb,
541 KwPduInfo *pduInfo));
543 Void rlcUmmUlReEstablish ARGS ((RlcCb *gCb,
547 Void rlcUmmReOrdTmrExp ARGS((RlcCb *gCb, RlcUlRbCb *rbCb));
550 Void rlcUmmFreeUlRbCb ARGS ((RlcCb *gCb, RlcUlRbCb *rbCb));
552 /****************************************************************************
553 * Acknowledged Mode Functions
554 ***************************************************************************/
555 Void rlcAmmUlReEstablish ARGS((RlcCb *gCb,
560 Void rlcAmmProcessPdus ARGS((RlcCb *gCb,
565 Void rlcAmmProcessPdus ARGS((RlcCb *gCb,
567 KwPduInfo *pduInfo));
570 Void rlcAmmReOrdTmrExp ARGS((RlcCb *gCb, RlcUlRbCb *rbCb));
572 Void rlcAmmStaProTmrExp ARGS((RlcCb *gCb, RlcUlRbCb *rbCb));
574 Void rlcAmmFreeUlRbCb ARGS ((RlcCb *gCb, RlcUlRbCb *rbCb));
576 /****************************************************************************
578 ***************************************************************************/
581 void rlcUtlStoreUmRecBuf ARGS ((CmLListCp *recBufLst,
585 RlcUmRecBuf* rlcUtlGetUmRecBuf ARGS ((CmLListCp *recBufLst,
589 void rlcUtlStoreRecBuf ARGS ((CmLListCp *recBufLst,
593 RlcAmRecBuf* rlcUtlGetRecBuf ARGS ((CmLListCp *recBufLst,
596 Void rlcUtlDelRecBuf ARGS ((CmLListCp *recBufLst,
601 uint8_t rlcUtlRcvFrmMac ARGS ((RlcCb *gCb, KwDatIndInfo *datIndInfo));
603 uint8_t rlcUtlSendUlDataToDu ARGS ((RlcCb *gCb,RlcUlRbCb *rbCb, Buffer *sdu));
606 S16 rlcUtlHdlL2TmrExp ARGS (( RlcCb *gCb, RlcL2MeasEvtCb *measEvtCb));
608 Void rlcUtlCalUlIpThrPutIncTTI ARGS ((RlcCb *gCb,
612 Void rlcUtlCalUlIpThrPut ARGS((RlcCb *gCb,
617 S16 rlcUtlSndUlL2MeasCfm ARGS ((RlcCb *gCb, RlcL2MeasEvtCb *measEvtCb));
619 S16 rlcUtlSndUlL2MeasNCfm ARGS ((RlcCb *gCb,
620 RlcL2MeasReqEvt *measReqEvt,
621 RlcL2MeasCfmEvt *measCfmEvt));
623 S16 rlcUtlL2MeasUlInit ARGS((RlcCb *gCb));
625 Void rlcUtlResetUlL2MeasInRlcRb ARGS((RlcCb *gCb,
629 S16 rlcUtlValidateIpThL2Meas ARGS ((RlcL2MeasReqEvt *measReqEvt,
630 RlcL2MeasCfmEvt *measCfmEvt));
632 #endif /* LTE_L2_MEAS */
633 /****************************************************************************
634 * Activation Functions
635 ***************************************************************************/
636 S16 rlcUlActvInit ARGS ((Ent ent,
641 S16 rlcUlActvTsk ARGS ((Pst *pst, Buffer *mBuf));
643 /****************************************************************************
645 ***************************************************************************/
646 Void DumpRLCUlDebugInformation ARGS((Void));
648 uint8_t rlcProcCommLcUlData(Pst *pst, SuId suId, RguCDatIndInfo *datInd);
649 uint8_t rlcProcDedLcUlData(Pst *pst, SuId suId, RguDDatIndInfo *datInd);
653 #endif /* __cplusplus */
655 #endif /* __KW_ULX__ */
658 /********************************************************************30**
661 **********************************************************************/