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;
46 * @brief Structure to hold a RLC UM PDU segment
49 * - lstEnt : This is required for the linked list in which the segments
51 * - seg : Holds the segment data
52 * - segSz : The length of the segment in bytes
54 * - umHdr : The UM Header for the PDU segment
57 typedef struct rlcUmSeg
59 CmLList lstEnt; /*!< List entry for PDU segment */
60 Buffer *seg; /*!< PDU segment */
61 MsgLen segSz; /*!< Buffer Size */
62 uint16_t soEnd; /*!< Segment Offset End */
63 RlcUmHdr umHdr; /*!<Um Header */
67 * @brief Structure to hold a UM PDU
70 * - pdu : Buffer holding the UM PDU data
71 * - umHdr : UM PDU Header Information
72 * - pduSz : Length of the PDU excluding the header
74 typedef struct rlcUmRecBuf
76 RlcSn sn; /*!< Sequence Number */
77 CmLList lnk; /*!< Link to the receive buffer list */
78 Bool allSegRcvd; /*!< Flag to check whether all seg are received */
79 Bool noMissingSeg; /*!< Flag to check all the bytes are received before the last byte of segment */
80 CmLListCp segLst; /*!< PDU Segments list */
81 uint16_t expSo; /*!< Next expected seg offset */
82 Bool allRcvd; /*!< All bytes received or not */
83 RlcUmSeg *expByteSeg; /*!< Next expected byte segment */
84 Buffer *pdu; /**< Buffer holding the UM PDU */
85 RlcUmHdr umHdr; /**< UM PDU Header Information */
86 MsgLen pduSz; /**< PDU Size */
90 * @brief Structure to hold uplink information in UM mode for a particular RB
93 * - snLen : The sequence number length can be 5 bits or 10 bits.
94 * Here it is stored as 1 or 2 (as the number of bytes)
95 * - recBuf : Holds all the received PDUs. PDU's are removed from this
96 * after a SDU is formed or during restablishment
97 * - umWinSz : The window size is 512 for 10 bits sequence number and 16
98 * for 5 bits sequence number
99 * - partialSdu : This is used to store the partially completed SDU.
100 * It remains till complete SDU is received
102 typedef struct rlcUmUl
104 uint8_t snLen; /**< Sequence number length */
105 uint8_t reAsmblTmrInt; /**< Timer Interval */
106 CmLListCp *recBufLst; /**!<Reception Buffer List */
107 RlcSn umWinSz; /**< UM window size */
108 uint16_t modBitMask; /**< Bitmask for modulus to wrap around variables */
109 RlcSn sn; /**< Sequence number */
110 RlcSn vrUr; /**< VR(UR) - Receive state variable */
111 RlcSn vrUh; /**< VR(UH) - Highest received state variable */
112 RlcSn vrUx; /**< VR(UX) - Reordering state variable */
113 CmTimer reAsmblTmr; /**< Reordering Timer */
114 Buffer *assembleSdu; /**< Assemble Sdu - Remains till the complete SDU is received */
115 uint16_t expSo; /*!< Expected SO for reassembly */
116 RlcSn expSn; /*!< Expected Sn */
121 * @brief Structure to hold a RLC AM PDU segment
124 * - lstEnt : This is required for the linked list in which the segments
126 * - seg : Holds the segment data
127 * - segSz : The length of the segment in bytes
129 * - amHdr : The AM Header for the PDU segment
132 typedef struct rlcSeg
134 CmLList lstEnt; /**< List entry for PDU segment */
135 Buffer *seg; /**< PDU segment */
136 MsgLen segSz; /**< Buffer Size */
137 uint16_t soEnd; /**< Segment Offset End */
138 RlcAmHdr amHdr; /**< AM header */
144 * @brief Structure to hold a received AM PDU or segments of a PDU
147 * - pdu : Holds the PDU data
148 * - pduSz : Length of the PDU in bytes
149 * - amHdr : The AM Header for the PDU
150 * - segLst : The length of the segment in bytes
151 * - expByteSeg : The next expected segment for re-ordering
152 * - expSo : The next expected SO so to be in sequence
153 * - allRcvd : Whether all the segments for this PDU has been recevied
156 typedef struct rlcAmRecBuf
158 CmLList lnk; /**< Link to the receive buffer list */
159 Buffer *pdu; /**< PDU buffer */
160 MsgLen pduSz; /**< Buffer Size */
161 RlcAmHdr amHdr; /**< AM header Info */
162 CmLListCp segLst; /**< PDU Segments list */
163 RlcSeg *expByteSeg; /**< Next expected byte segment */
164 uint16_t expSo; /**< Next expected seg offset */
165 Bool allRcvd; /**< All bytes received or not */
166 Bool isDelvUpperLayer; /**< Is it sent to upper layer */
167 Bool noMissingSeg; /*!< Flag to check all the bytes are received before the last byte of segment */
170 /** @addtogroup ammode */
174 * @brief Structure to hold information about an uplink AM Radio Bearer
177 * - recBuf : Reception buffer
178 * - rxNext : RX_Next - Receive state variable
179 * - rxNextHighestRcvd : RX_Next_Highest_Rcvd - Highest received state variable
180 * - rxNextStatusTrig : RX_Next_Status_Trigger - reorderig state variable
181 * - vrMr : VR(MR) - Maximum acceptable receive state variable
182 * - rxHighestStatus : RX_Highest_Status - Maximum STATUS transmit state variable
183 * - staTrg : Flag to indicate if status trigger occured
184 * - partialSdu : Partial SDU - Remains till the complete SDU
186 * - expSn : The expected sequence number for reassembly
187 * - expSo : The expected SO for reassembly
188 * - staProhTmr : The Status Probihit Timer
189 * - staProhTmrInt : Status Prohibit Timer interval (in ??)
190 * - reAsmblTmr : The Reordering Timer
191 * - reAsmblTmrInt : Re-ordering timer interval
192 * - gatherStaPduInfo : Whether to gather information required to create
196 typedef struct rlcAmUl
199 CmLListCp *recBufLst;
201 // RlcAmRecBuf *recBuf[1024]; /**< Reception buffer */
203 RlcSn rxNext; /**< RX_Next:Equvalent to VR(R) in 4G */
204 RlcSn rxNextHighestRcvd; /**< RX_Next_Highest_Rcvd: Equvalent to VR(H) in 4G */
205 RlcSn rxNextStatusTrig; /**< rxNextStatusTrig: Equvalent to VR(X) in 4G*/
206 RlcSn vrMr; /**< VR(MR) */
207 RlcSn rxHighestStatus; /**< rxHighestStatus: Eqvalent to VR(MS) in 4G*/
208 Bool staTrg; /**< Whether status trigger occured */
209 Buffer *partialSdu; /**< Partially received SDU */
210 RlcSn expSn; /**< Expected SN for reassembly */
211 uint16_t expSo; /**< Expected SO for reassembly */
212 CmTimer staProhTmr; /**< T_status_prohibit Timer */
213 uint16_t staProhTmrInt; /**< Timer Interval */
214 CmTimer reAsmblTmr; /**< T_reordering Timer */
215 uint8_t reAsmblTmrInt; /**< Timer Interval */
216 Bool gatherStaPduInfo; /**< Gather STATUS PDU creation info*/
217 Bool isOutOfSeq; /**< To identify whether packets are Out-Of-Seq or not */
218 uint8_t snLen; /*!< Sequence number length:12 bit or 18 bit : 5GNR RLC */
219 uint32_t snModMask; /*!< (2 Pwr SnLen - 1): 5GNR RLC */
225 * @brief Structure to hold uplink information about a Radio Bearer
228 * - rlcId : RLC identifier, uniquely identifies a Radio Bearer
229 * - lch : Information (type and id) of the logical channel associated
230 * with this Radio Bearer.
231 * - mode : The mode of the Radio Bearer; UM or AM
232 * - dir : The direction of the Radio Bearer, downlink or uplink or both
233 * - inst : Id of RLC instance where this Radio Bearer is present. Used
234 * to find the instance from the Radio Bearer for memory needs
235 * as different instances might have different memory.
236 * - k1wuSapId : KWU SAP identifier
237 * - udxSapId : UDX SAP idenrifier
238 * - transId : Stores the transaction identifier used to communicate
239 * with MAC, the same value as sent by MAC is passed back
240 * for it to be able to corelate
241 * - m : Mode of the RB (TM/UM/AM)
242 * - umDl : Unacknowledged Mode downlink information
243 * - amDl : Acknowledged Mode downlink information
245 typedef struct _rlcUlRbCb
247 /* kw005.201 added support for L2 Measurement */
249 RlcL2MeasRbCb rbL2Cb; /**< RB measurement L2 Cb */
250 RlcUlUeCb *ueCb; /*!< Pointer to UeCb */
251 uint8_t qci; /**< qci of the RB */
252 RlcL2MeasIpThruput l2MeasIpThruput; /**< Holds related parameter for
253 DL/Ul ip throughput>*/
254 #endif /* LTE_L2_MEAS */
255 CmLteRlcId rlcId; /**< RLC Identifier */
256 RlcLchInfo lch; /**< Logical Channel Info */
257 CmLteRlcMode mode; /**< Entity Mode */
258 uint8_t dir; /**< Direction for UL/DL */
259 Inst inst; /**< Tapa where Rb created Instance id */
260 SpId k1wuSapId; /**< KWU sap Id, to get the KwuSapCb */
261 SpId udxSapId; /**< KWU sap Id, to get the KwuSapCb */
262 uint32_t transId; /**< Transaction Id for RLC */
265 RlcUmUl umUl; /**< UM mode Ul elements */
266 RlcAmUl amUl; /**< AM mode uplink elements */
267 }m; /**< RLC mode specific Info */
271 * @brief Structure to hold mapping between logical channel and Radio Bearer
274 * - ulRbCb : Pointer to the uplink Radio Bearer
276 typedef struct rlcUlLch
278 RlcUlRbCb *ulRbCb; /**< Pointer to Uplink RbCb */
282 * @brief Structure to hold uplink information about the Cells
285 * - cellHlEnt : Information about cells are stored in a hash table. This is
287 * - cellId : Identity of the cell
288 * - rbCb : Radio Bearers in the cell
289 * - lCh : Logical Channels in the cell
290 * - selfPstUl : Pst structure for sending messages to self
292 typedef struct rlcUlCellCb
294 CmHashListEnt cellHlEnt; /**< Hash list entry for CellCb */
295 CmLteCellId cellId; /**< Cell Id */
296 RlcUlRbCb *rbCb[RLC_MAX_RB_PER_CELL]; /**< RbCbs within a Cell */
297 RlcUlLch lCh[RLC_MAX_LCH_PER_CELL]; /**< Logical channels in a cell */
302 * @brief Structure to hold uplink information about the UEs
305 * - ueHlEnt : Information about cells are stored in a hash table. This is
307 * - key : Key to store/find the UE in the hashtable
308 * - srbCb : Signaling Radio Bearers configured for the UE
309 * - drbCb : Data Radio Bearers configured for the UE
310 * - lCh : Logical Channels in the UE
314 CmHashListEnt ueHlEnt; /**< Hash list entry for UeCb */
315 CmLteRnti ueId; /*!< UE Id */
316 CmLteCellId cellId; /*!< Cell Id */
317 RlcUlRbCb *srbCb[RLC_MAX_SRB_PER_UE]; /**< SRB RbCbs within an UE */
318 RlcUlRbCb *drbCb[RLC_MAX_DRB_PER_UE]; /**< DRB RbCbs within an UE */
319 RlcUlLch lCh[RLC_MAX_LCH_PER_UE]; /**< Logical channels of an UE*/
320 /* kw005.201 added support for L2 Measurement */
322 uint32_t firstPacketTTI; /*!< is first packet of the burst */
323 uint16_t numActRb[LKW_MAX_QCI]; /**< number of RBs Active */
324 Bool isUlBurstActive; /*!<Has the Burst started for UL IP Thrpt meas */
325 #endif /* LTE_L2_MEAS */
329 * @brief Structure to hold temporary data of configuration
332 * - entUlCfgCfm : Holds the UL configuration status
335 typedef struct rlcUlEntTmpData
337 RlcEntCfgCfmInfo entUlCfgCfm; /**< Ul Configuration status*/
338 RlcUlRbCb *rbCb; /**< Rb Block */
342 * @brief Structure to hold transaction information in configuration request
345 * - transHlEnt : List entry for transaction block.
346 * - transId : Transaction Id
350 * - cellCb : Cell Block
351 * - cfgInfo : Configuration Information
352 * - ueInfo : UE Information
353 * - newUeInfo : New Ue Information
354 * - cfgTmpData : Temporary data per Configuration entity
356 typedef struct rlcUlCfgTmpData
358 CmHashListEnt transHlEnt; /**< List Entry of
360 uint32_t transId; /**< Locally generated Transaction Id */
361 uint32_t uprLyrTransId; /**< Transaction Id generated by upper layer.
362 This is used while sending confirm to the User Layer */
363 CmLteCellId cellId; /**< Cell Id */
364 CmLteRnti ueId; /**< Ue Id */
365 RlcUlUeCb *ueCb; /**< Ue Block */
366 RlcUlCellCb *cellCb; /**< Cell Block */
367 RlcCfgInfo *cfgInfo; /**< Config Information*/
368 CkwUeInfo *ueInfo; /**< Ue Information */
369 CkwUeInfo *newUeInfo; /**< New Ue Information */
370 RlcUlEntTmpData cfgEntData[CKW_MAX_ENT_CFG]; /**< Entity Data */
372 /****************************************************************************
374 ***************************************************************************/
375 /****************************************************************************
376 * Configuration Functions
377 ***************************************************************************/
379 S16 rlcValidateRbCfgParams ARGS ((RlcCb *gCb,
382 RlcEntCfgInfo *cfgToValidate,
384 S16 rlcCfgValidateUlRb ARGS (( RlcCb *gCb,
385 RlcEntCfgInfo *cfgToValidate,
386 RlcUlEntTmpData *cfgInfo,
387 RlcUlCfgTmpData *cfg));
389 S16 rlcCfgRollBackUlRb ARGS ((RlcCb *gCb,
391 RlcEntCfgInfo *cfgToValidate,
392 RlcUlEntTmpData *cfgTempData));
394 Void rlcCfgApplyUlRb ARGS ((RlcCb *gCb,
395 RlcEntCfgInfo *cfgToAply,
396 RlcUlEntTmpData *cfgTmpData,
397 RlcUlCfgTmpData *cfgTmpInfo));
399 S16 rlcCfgValidateReEstRb ARGS ((RlcCb *gCb,
402 RlcEntCfgInfo *cfgToValidate,
403 RlcUlEntTmpData *cfgTmpData));
405 Void rlcCfgApplyReEstUlRb ARGS ((RlcCb *gCb,
409 RlcUlEntTmpData *cfgTmpData));
411 Void rlcCfgApplyDelUlCell ARGS ((RlcCb *gCb,
412 RlcUlCfgTmpData *cfgTmpData));
414 S16 rlcCfgValidateDelUlCell ARGS ((RlcCb *gCb,
416 RlcEntCfgInfo *cfgToValidate,
417 RlcUlEntTmpData *cfgTmpData,
418 RlcUlCfgTmpData *cfgInfo));
420 S16 rlcCfgValidateDelUlUe ARGS ((RlcCb *gCb,
421 RlcEntCfgInfo *cfgToValidate,
422 RlcUlEntTmpData *cfgTmpData,
423 RlcUlCfgTmpData *cfgInfo));
425 Void rlcCfgApplyDelUlUe ARGS ((RlcCb *gCb,
426 RlcUlCfgTmpData *cfgTmpData));
428 Void rlcUlHdlCfgReq ARGS ((RlcCb *gCb,
429 RlcUlCfgTmpData *cfgInfo,
432 Void rlcCfgApplyUlUeIdChng ARGS ((RlcCb *gCb,
434 CkwUeInfo *newUeInfo,
435 RlcUlCfgTmpData *cfgTmpInfo));
437 S16 rlcCfgValidateUeIdChng ARGS ((RlcCb *gCb,
439 CkwUeInfo *newUeInfo,
440 RlcUlCfgTmpData *cfgTmpInfo));
442 /****************************************************************************
443 * DBM module Functions
444 ***************************************************************************/
445 S16 rlcDbmUlInit ARGS ((RlcCb *gCb));
447 Void rlcDbmUlDeInit ARGS ((RlcCb *gCb));
449 S16 rlcDbmAddUlUeCb ARGS ((RlcCb *gCb,
454 uint8_t rlcDbmFetchUlUeCb ARGS ((RlcCb *gCb,
459 Void rlcDbmDelUlUeCb ARGS ((RlcCb *gCb,
463 Void rlcDbmDelAllUlUe ARGS ((RlcCb *gCb));
465 S16 rlcDbmAddUlCellCb ARGS ((RlcCb *gCb,
467 RlcUlCellCb *cellCb));
469 Void rlcDbmFetchUlCellCb ARGS ((RlcCb *gCb,
471 RlcUlCellCb **cellCb));
473 Void rlcDbmDelUlCellCb ARGS ((RlcCb *gCb,
474 RlcUlCellCb *cellCb));
476 Void rlcDbmDelAllUlCell ARGS ((RlcCb *gCb));
478 Void rlcDbmFetchUlRbCbByRbId ARGS ((RlcCb *gCb,
482 Void rlcDbmFetchUlRbCbFromLchId ARGS ((RlcCb *gCb,
488 Void rlcDbmDelAllUlRb ARGS ((RlcCb *gCb,
492 S16 rlcDbmAddUlTransaction ARGS((RlcCb *gCb, RlcUlCfgTmpData *cfg));
494 S16 rlcDbmFindUlTransaction ARGS((RlcCb *gCb,
496 RlcUlCfgTmpData **cfg));
498 S16 rlcDbmDelUlTransaction ARGS((RlcCb *gCb, RlcUlCfgTmpData *cfg));
500 S16 rlcDbmDelAllUlTransactions ARGS((RlcCb *gCb));
502 Void rlcDbmUlShutdown ARGS ((RlcCb *gCb));
504 /****************************************************************************
505 * Transparent Mode Functions
506 ***************************************************************************/
508 void rlcTmmRcvFrmMac ARGS ((RlcCb *gCb,
514 void rlcTmmRcvFrmMac ARGS ((RlcCb *gCb,
519 Void rlcTmmUlReEstablish ARGS ((RlcCb *gCb, RlcUlRbCb *rbCb));
521 /****************************************************************************
522 * Unacknowledged Mode Functions
523 ***************************************************************************/
525 Void rlcUmmProcessPdus ARGS((RlcCb *gCb,
530 Void rlcUmmProcessPdus ARGS ((RlcCb *gCb,
532 KwPduInfo *pduInfo));
534 Void rlcUmmUlReEstablish ARGS ((RlcCb *gCb,
538 Void rlcUmmReAsmblTmrExp ARGS((RlcCb *gCb, RlcUlRbCb *rbCb));
541 Void rlcUmmFreeUlRbCb ARGS ((RlcCb *gCb, RlcUlRbCb *rbCb));
543 /****************************************************************************
544 * Acknowledged Mode Functions
545 ***************************************************************************/
546 Void rlcAmmUlReEstablish ARGS((RlcCb *gCb,
551 Void rlcAmmProcessPdus ARGS((RlcCb *gCb,
556 Void rlcAmmProcessPdus ARGS((RlcCb *gCb,
558 KwPduInfo *pduInfo));
561 Void rlcAmmReAsmblTmrExp ARGS((RlcCb *gCb, RlcUlRbCb *rbCb));
563 Void rlcAmmStaProTmrExp ARGS((RlcCb *gCb, RlcUlRbCb *rbCb));
565 Void rlcAmmFreeUlRbCb ARGS ((RlcCb *gCb, RlcUlRbCb *rbCb));
567 /****************************************************************************
569 ***************************************************************************/
571 void rlcUtlStoreUmRecBuf ARGS ((CmLListCp *recBufLst,
575 RlcUmRecBuf* rlcUtlGetUmRecBuf ARGS ((CmLListCp *recBufLst,
578 void rlcUtlDelUmRecBuf(RlcCb *gCb, CmLListCp *recBufLst, RlcUmRecBuf *recBuf);
580 Void rlcUtlStoreRecBuf ARGS ((CmLListCp *recBufLst,
584 RlcAmRecBuf* rlcUtlGetRecBuf ARGS ((CmLListCp *recBufLst,
587 Void rlcUtlDelRecBuf ARGS ((CmLListCp *recBufLst,
592 uint8_t rlcUtlRcvFrmMac ARGS ((RlcCb *gCb, KwDatIndInfo *datIndInfo));
594 uint8_t rlcUtlSendUlDataToDu ARGS ((RlcCb *gCb,RlcUlRbCb *rbCb, Buffer *sdu));
597 S16 rlcUtlHdlL2TmrExp ARGS (( RlcCb *gCb, RlcL2MeasEvtCb *measEvtCb));
599 Void rlcUtlCalUlIpThrPutIncTTI ARGS ((RlcCb *gCb,
603 Void rlcUtlCalUlIpThrPut ARGS((RlcCb *gCb,
608 S16 rlcUtlSndUlL2MeasCfm ARGS ((RlcCb *gCb, RlcL2MeasEvtCb *measEvtCb));
610 S16 rlcUtlSndUlL2MeasNCfm ARGS ((RlcCb *gCb,
611 RlcL2MeasReqEvt *measReqEvt,
612 RlcL2MeasCfmEvt *measCfmEvt));
614 S16 rlcUtlL2MeasUlInit ARGS((RlcCb *gCb));
616 Void rlcUtlResetUlL2MeasInRlcRb ARGS((RlcCb *gCb,
620 S16 rlcUtlValidateIpThL2Meas ARGS ((RlcL2MeasReqEvt *measReqEvt,
621 RlcL2MeasCfmEvt *measCfmEvt));
623 #endif /* LTE_L2_MEAS */
624 /****************************************************************************
625 * Activation Functions
626 ***************************************************************************/
627 S16 rlcUlActvInit ARGS ((Ent ent,
632 S16 rlcUlActvTsk ARGS ((Pst *pst, Buffer *mBuf));
634 /****************************************************************************
636 ***************************************************************************/
637 Void DumpRLCUlDebugInformation ARGS((Void));
639 uint8_t rlcProcCommLcUlData(Pst *pst, SuId suId, RguCDatIndInfo *datInd);
640 uint8_t rlcProcDedLcUlData(Pst *pst, SuId suId, RguDDatIndInfo *datInd);
644 #endif /* __cplusplus */
646 #endif /* __KW_ULX__ */
649 /********************************************************************30**
652 **********************************************************************/