5fcd396a60a8d76efd75f5f0c57df36eb0551178
[o-du/l2.git] / src / 5gnrrlc / kw.h
1 /*******************************************************************************
2 ################################################################################
3 #   Copyright (c) [2017-2019] [Radisys]                                        #
4 #                                                                              #
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                                    #
8 #                                                                              #
9 #       http://www.apache.org/licenses/LICENSE-2.0                             #
10 #                                                                              #
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
19 /********************************************************************20**
20   
21         Name:     LTE RLC file 
22     
23         Type:     C include file
24   
25         Desc:     This file contain the hash definations for RLC 
26  
27         File:     kw.h
28   
29 *********************************************************************21*/
30 /** @file kw.h
31 @brief RLC Hash definitions
32 */
33
34 #ifndef __KWH__
35 #define __KWH__
36 #include "rl_interface.h"
37 #include "rl_common.h"
38 #include "du_log.h"
39 \f 
40 #define RLCLAYERNAME   "LTE RLC"     /* Layer Name */
41
42 #define EKWxxx 1
43 #define EMG099 1
44 #define EMG102 2
45 #define EMG103 3
46 #define EMG104 4
47
48 /* RLC-SPLIT Activity */
49 #define RLC_ONE       1
50 #define RLC_BIT0      0x01
51 #define RLC_BIT1      0x02
52 #define RLC_BIT2      0x04
53 #define RLC_BIT3      0x08
54
55 #define RLC_2K_BYTE   2048
56
57 /* RLC RB flag bits */
58 #define RLC_RB_REESTABLISH_DL  RLC_BIT0
59 #define RLC_RB_REESTABLISH_UL  RLC_BIT1
60 #define RLC_RB_DELETE_DL       RLC_BIT2
61 #define RLC_RB_DELETE_UL       RLC_BIT3
62
63
64 #define RLC_MOD_1024           0x3FF  /* used for MOD 1024 */
65
66
67 \f 
68 /************************************************************************
69  *                            SAP States
70  ************************************************************************/
71
72 #define RLC_SAP_NOT_CFG        0     /*!< SAP Not Configured */
73 #define RLC_SAP_CFG            1     /*!< SAP Configured but not not bound */
74 #define RLC_SAP_BND            2     /*!< SAP Bound */
75 #define RLC_SAP_BINDING        3     /*!< SAP Bind initiated */
76 #define RLC_SAP_UBND           4     /*!< SAP Unbind */
77
78 #define RLC_MAX_SAP_BND_RETRY  3     /*!< Maximum SAP Bin Retries */
79
80 #define RLC_MAX_UE             0xffffffff  /*!< Maximum number of UEs. */
81
82 /* Maximum number of Saps */
83 #define RLC_MAX_UDXSAPS        1     /*!< Maximum number of UDX Saps */
84 #define RLC_MAX_KWUSAPS        2     /*!< Maximum number of KWU Saps. */
85 #define RLC_MAX_CKWSAPS        1     /*!< Maximum number of CKW Saps. */
86 /*MCELL changes*/
87 #define RLC_MAX_RGUSAPS        4//5     /*!< Maximum number of RGU Saps. */
88
89 #define RLC_MAX_RGUSAP_TMR     1     /*!< Maximum number of RGU SAP Timers. */
90
91 #define RLC_UI_RRC             0     /*!< Upper interface RRC sap Id. */
92 #define RLC_UI_PDCP            1     /*!< Upper interface PDCP sap Id. */
93
94 #ifdef LTE_L2_MEAS
95 /* TODO. This works for FDD only. For TDD the array dimension
96  * should be changed according to the number of Harq Procs */
97 #define RLC_MAX_TB_PER_UE      64    /*!< Maximum number of tbCb for UE */
98 #define RLC_INVALID_TBID       RLC_MAX_TB_PER_UE
99 #endif
100 /*******************************************************************************
101  *                              Memory related Defines 
102  ******************************************************************************/
103 #ifdef MCCABE_COV
104 /* Allocate function */
105 #define RLC_ALLOC(_cb,_buf, _size)                                   \
106 {                                                                   \
107    SGetSBuf(_cb->init.region, _cb->init.pool, (Data **)&_buf,       \
108                 (Size) _size);                                     \
109       memset((_buf), 0, _size);                             \
110 }
111
112 #define RLC_RMV_SDU(_cb,_sduQ,_sdu)                    \
113 {                                                     \
114    SPutMsg(_sdu->mBuf);                               \
115    cmLListDelFrm(_sduQ,&_sdu->lstEnt);                \
116    RLC_FREE(_cb,_sdu, sizeof(RlcSdu));               \
117 }
118
119 #define RLC_FREE(_cb,_buf, _size)                          \
120 {                                                         \
121       (Void) SPutSBuf(_cb->init.region, _cb->init.pool,   \
122             (Data *) _buf, (Size) _size);                 \
123       _buf = NULLP;                                       \
124 }
125
126 #else
127
128 #define RLC_FREE_SHRABL_BUF(_region, _pool,_buf, _size)    \
129 {                                                         \
130    if (_buf != NULLP)                                     \
131    {                                                      \
132       (Void) SPutStaticBuffer(_region, _pool,             \
133             (Data *) _buf, (Size) _size, 0);                 \
134       _buf = NULLP;                                       \
135    }                                                      \
136 }
137
138 #define RLC_FREE_SHRABL_BUF_WC(_region, _pool,_buf, _size) \
139 {                                                         \
140   (Void) SPutStaticBuffer(_region, _pool,                 \
141         (Data *) _buf, (Size) _size, 0);                 \
142   _buf = NULLP;                                       \
143 }
144
145 #define RLC_ALLOC_SHRABL_BUF_WC(_region, _pool,_buf, _size)           \
146 {                                                                    \
147  SGetStaticBuffer(_region, _pool, (Data **)&_buf,                    \
148                 (Size) _size, 0);                                    \
149 }
150
151 #define RLC_ALLOC_SHRABL_BUF(_region, _pool,_buf, _size)              \
152 {                                                                    \
153  if (SGetStaticBuffer(_region, _pool, (Data **)&_buf,                \
154                 (Size) _size, 0) == ROK)                                \
155    {                                                                 \
156       memset((_buf), 0, _size);                              \
157    }                                                                 \
158    else                                                              \
159    {                                                                 \
160       (_buf) = NULLP;                                                \
161    }                                                                 \
162 }
163 /* Allocate function */
164 #define RLC_ALLOC(_cb,_buf, _size)                                    \
165 {                                                                    \
166  if (SGetSBuf(_cb->init.region, _cb->init.pool, (Data **)&_buf,      \
167                 (Size) _size) == ROK)                                \
168    {                                                                 \
169       memset((_buf), 0, _size);                              \
170    }                                                                 \
171    else                                                              \
172    {                                                                 \
173       (_buf) = NULLP;                                                \
174    }                                                                 \
175 }
176
177 #define RLC_ALLOC_WC(_cb,_buf, _size)  \
178            SGetSBuf(_cb->init.region, _cb->init.pool, (Data **)&_buf, (Size) _size)     
179
180 #define RLC_RMV_SDU(_cb,_sduQ,_sdu)              \
181 {                                               \
182    if(_sdu->mBuf)                               \
183    {                                            \
184       SPutMsg(_sdu->mBuf);    \
185    }                                            \
186    cmLListDelFrm(_sduQ,&_sdu->lstEnt);          \
187    RLC_FREE(_cb,_sdu, sizeof(RlcSdu));            \
188 }
189
190 #define RLC_FREE(_cb,_buf, _size)                          \
191 {                                                         \
192    if (_buf != NULLP)                                     \
193    {                                                      \
194       (Void) SPutSBuf(_cb->init.region, _cb->init.pool,   \
195             (Data *) _buf, (Size) _size);                 \
196       _buf = NULLP;                                       \
197    }                                                      \
198 }
199
200 #endif
201
202 /* kw002.201 Freeing from region of pst */
203 #define RLC_PST_FREE(_region, _pool, _buf, _size)          \
204 {                                                         \
205    if (_buf != NULLP)                                     \
206    {                                                      \
207       (Void) SPutSBuf(_region, _pool,                     \
208                       (Data *) _buf, (Size) _size);       \
209       _buf = NULLP;                                       \
210    }                                                      \
211 }
212
213 #ifdef XEON_SPECIFIC_CHANGES
214 #ifdef SS_LOCKLESS_MEMORY
215 #define RLC_SHRABL_STATIC_BUF_FREE(_region, _pool, _buf, _size)     \
216 {                                                                  \
217    if (_buf != NULLP)                                              \
218    {                                                               \
219       (Void) SPutStaticBuffer(_region, _pool,                      \
220                       (Data *) _buf, (Size) _size, 0);             \
221       _buf = NULLP;                                                \
222    }                                                               \
223 }
224
225 #define RLC_SHRABL_STATIC_BUF_ALLOC(_region, _pool, _buf, _size)     \
226 {                                                                        \
227  SGetStaticBuffer(_region, _pool, (Data **)&_buf,      \
228                 (Size) _size, 0);                                        \
229 }
230
231 #else
232
233 #define RLC_SHRABL_STATIC_BUF_FREE(_region, _pool, _buf, _size)     \
234 {                                                                  \
235    if (_buf != NULLP)                                              \
236    {                                                               \
237       (Void) SPutSBuf(_region, _pool,                      \
238                       (Data *) _buf, (Size) _size);             \
239       _buf = NULLP;                                                \
240    }                                                               \
241 }
242
243 #define RLC_SHRABL_STATIC_BUF_ALLOC(_region, _pool, _buf, _size)     \
244 {                                                                        \
245  SGetSBuf(_region, _pool, (Data **)&_buf,      \
246                 (Size) _size);                                        \
247 }
248 #endif /* SS_LOCKLESS_MEMORY */
249
250 #else 
251
252 #define RLC_SHRABL_STATIC_BUF_FREE(_region, _pool, _buf, _size)     \
253 {                                                                  \
254    if (_buf != NULLP)                                              \
255    {                                                               \
256       (Void) SPutStaticBuffer(_region, _pool,                      \
257                       (Data *) _buf, (Size) _size, 0);             \
258       _buf = NULLP;                                                \
259    }                                                               \
260 }
261
262 #define RLC_SHRABL_STATIC_BUF_ALLOC(_region, _pool, _buf, _size)     \
263 {                                                                        \
264  SGetStaticBuffer(_region, _pool, (Data **)&_buf,      \
265                 (Size) _size, 0);                                        \
266 }
267 #endif
268
269 #define RLC_MEM_CPY(_dst, _src, _size)  memcpy(_dst, _src, _size); 
270
271 #define RLC_MEM_ZERO(_buf, _size) memset((_buf), 0, _size);
272
273 #define RLC_GET_MEM_REGION(_cb) (_cb->init.region)
274
275 #define RLC_GET_MEM_POOL(_cb) (_cb->init.pool)
276
277 #define RLC_GET_MEM_POOL_ADDRESS(_cb) (&_cb->init.pool)
278
279 /* Memset to value */
280 #define RLC_MEM_SET(_arg, _val, _size) memset(_arg, _val, _size); 
281
282 /* Alarms */
283 /* Send an alarm for sapId events */
284 /* kw005.201 added support for L2 Measurement */
285 #ifdef LTE_L2_MEAS
286 #define RLC_GETSDUIDX(_sduIdx) \
287 {\
288    _sduIdx = (((_sduIdx)+1) % RLC_L2MEAS_MAX_OUTSTNGSDU);\
289 }
290 #define RLC_SEND_SAPID_ALARM(_cb,_sapId, _evnt, _cause) \
291 { \
292    rlcLmmSendAlarm(_cb,LCM_CATEGORY_INTERFACE, _evnt, _cause, _sapId, 0, 0); \
293 }
294 #define RLC_SEND_UEID_ALARM(_cb,_ueId, _qci, _evnt, _cause) \
295 { \
296    rlcLmmSendAlarm(_cb,LCM_CATEGORY_INTERFACE, _evnt, _cause, 0, _ueId, _qci); \
297 }
298 #else /* LTE_L2_MEAS */
299 #define RLC_SEND_SAPID_ALARM(_cb,_sapId, _evnt, _cause) \
300 { \
301    rlcLmmSendAlarm(_cb,LCM_CATEGORY_INTERFACE, _evnt, _cause, _sapId, 0); \
302 }
303 #define RLC_SEND_UEID_ALARM(_cb,_ueId, _evnt, _cause) \
304 { \
305    rlcLmmSendAlarm(_cb,LCM_CATEGORY_INTERFACE, _evnt, _cause, 0, _ueId); \
306 }
307 #endif /* LTE_L2_MEAS */
308
309 /*******************************************************************************
310  *                              Common Defines 
311  ******************************************************************************/
312
313 /* RLC Configuration parameters */
314 #define RLC_MAX_UL_LI                (2 * RLC_MAX_LI)
315 /*macro RLC_MAX_DL_LI is moved to kw_env.h file */
316 #define RLC_MAX_DAT                  RLC_MAXIMUM_DAT
317 /*macro RLC_MAX_PDU is moved to kw_env.h file */
318 #define RLC_MAX_RB_PER_CELL          10
319 #define RLC_MAX_SRB_PER_UE           3
320 #define RLC_MAX_DRB_PER_UE           32
321 #define RLC_MAX_LCH_PER_UE           12
322 #define RLC_MAX_LCH_PER_CELL         6
323 #define RLC_MAX_NUM_RB               24
324 #define RLC_MAX_UE                   0xffffffff 
325 #define RLC_UE_LIST_BUCKET_SIZE      128 
326 #define RLC_CELL_LIST_BUCKET_SIZE    10 
327 #define RLC_TRANS_ID_LST_BKT_SIZE    10 
328 #define RLC_MAX_RB                   32
329
330 /* Direction defines */
331 #define RLC_DIR_UL        1     /*!< Unlink direction */
332 #define RLC_DIR_DL        2     /*!< Downlink direction */
333 #define RLC_DIR_BOTH      3     /*!< Both Downlink and Unlink */
334
335 #define RLC_DEF_SEQ_NUM 0 /**< Sequence number to pick in case of duplicate
336                               entries in hash list searches*/
337
338 /**
339  * @def RLC_MIN
340  *
341  *    Macro to find the miniumum of two numbers
342  *
343  * @param[in] x    First number
344  * @param[in] y    Second number
345  *
346 */
347 #define RLC_MIN(x,y) (x) < (y) ? (x) : (y)
348
349 /**
350  * @def RLC_GET_RLCCB
351  *
352  *    Macro to the RLC instance
353  *
354  * @param[in] _inst    Instance Id
355  *
356 */
357 #define RLC_GET_RLCCB(_inst) rlcCb[_inst]                              
358
359 #define RLC_ADD_SDU            1     /*!< Add SDU. */
360 #define RLC_DEL_SDU            2     /*!< Delete SDU. */
361
362 #define RLC_CFM_NOK            0     /*!< Do not send DatCfm */
363 #define RLC_CFM_OK             1     /*!< Send DatCfm */
364
365 /* Set the unsolictated Status flag */
366 #define RLC_SET_USTA_FLAG(_rlcCb, _value) \
367 { \
368    _rlcCb->init.usta = _value; \
369 }
370
371 /* Macros to get the init parameters */
372 #define RLC_GET_DBG_MASK(_rlcCb) (_rlcCb->init.dbgMask)
373 #define RLC_GET_LMPST_MEM_POOL(_rlcCb) (_rlcCb->init.lmPst.pool)
374 #define RLC_GET_LMPST_MEM_REGION(_rlcCb) (_rlcCb->init.lmPst.region)
375
376 /* Macros for configuration module */
377 #define RLC_CFG_FILL_CFG_CFM(_entCfm, _rbId, _rbType, _status, _reason)  \
378 {                                                              \
379    _entCfm->rbId  = _rbId;                                     \
380    _entCfm->rbType = _rbType;                                  \
381    _entCfm->status.status = _status;                           \
382    _entCfm->status.reason = _reason;                           \
383
384
385 /**
386  * @def RLC_VALIDATE_UE_RBID
387  *
388  *    This macro validates whether the _rbId passed is valid or not. It checks
389  *    if the _rbId is within the maximum value depending on the _rbType.
390  *    Returns TRUE if valid else FALSE
391  *
392  * @param[in] _rbType    Type of the Radio Bearer; SRB or DRB
393  * @param[in] _rbId      RB Id of the RB to be validated
394  *
395 */ 
396 #define RLC_VALIDATE_UE_RBID(_rbType, _rbId)                     \
397        ((_rbType == CM_LTE_SRB && _rbId < RLC_MAX_SRB_PER_UE) || \
398        (_rbType == CM_LTE_DRB && _rbId < RLC_MAX_DRB_PER_UE))
399
400 /*******************************************************************************
401  *                              UIM Defines 
402  ******************************************************************************/
403 #if (ERRCLASS & ERRCLS_INT_PAR)
404 #define RLC_VALDATE_SAP(_cb,_chkSpId, _sap, _ret)                             \
405 {                                                                            \
406    if (_chkSpId != _sap->spId)                                               \
407    {                                                                         \
408       RLCLOGERROR(_cb,ERRCLS_DEBUG, EKWxxx, (ErrVal) RFAILED,                 \
409             "Sap Id Validation Failed.");                                    \
410       _ret = RFAILED;                                                        \
411    }                                                                         \
412    /* SAP state validation */                                                \
413    if(_sap->state != RLC_SAP_BND)                                             \
414    {                                                                         \
415       RLCLOGERROR(_cb,ERRCLS_INT_PAR, EKWXXX, (ErrVal) RFAILED,               \
416             "Sap State Invalid.");                                           \
417       RLC_SEND_SAPID_ALARM(_cb,0, LCM_EVENT_UI_INV_EVT, LCM_CAUSE_INV_STATE); \
418       _ret = RFAILED;                                                        \
419    }                                                                         \
420 }
421 #else /* ERRCLASS & ERRCLS_INT_PAR */
422 #define RLC_VALDATE_SAP(_cb,_chkSpId, _sap, _ret)                             \
423 {                                                                            \
424    /* SAP state validation */                                                \
425    if(_sap->state != RLC_SAP_BND)                                             \
426    {                                                                         \
427       RLCLOGERROR(_cb,ERRCLS_INT_PAR, EKWXXX, (ErrVal) RFAILED,               \
428             "Sap State Invalid.");                                           \
429       RLC_SEND_SAPID_ALARM(_cb,0, LCM_EVENT_UI_INV_EVT, LCM_CAUSE_INV_STATE); \
430       _ret = RFAILED;                                                        \
431    }                                                                         \
432 }
433 #endif /* ERRCLASS & ERRCLS_INT_PAR */
434
435 /*******************************************************************************
436  *                              Timer Defines 
437  ******************************************************************************/
438 #define RLC_TMR_LEN                     10
439 #define RLC_MAX_UM_TMR                  1
440 #define RLC_MAX_AM_TMR                  3
441 #define RLC_EVT_UMUL_REORD_TMR          1
442 #define RLC_EVT_AMUL_REORD_TMR          2
443 #define RLC_EVT_AMUL_STA_PROH_TMR       3
444 #define RLC_EVT_AMDL_POLL_RETX_TMR      4
445 #define RLC_EVT_WAIT_BNDCFM             5
446 /* kw005.201 added support for L2 Measurement */
447 #ifdef LTE_L2_MEAS
448 #define RLC_EVT_L2_TMR                  6
449 #endif /* LTE_L2_MEAS */
450
451 /*******************************************************************************
452  *                              DBM Defines 
453  ******************************************************************************/
454 /**
455  * @def RLC_DBM_GET_RBCB_FROM_UECB
456  *
457  *    This macro makes _rbCb point to the RB in _ueCb based on the passed 
458  *    _rbId and _rbType. _rbCb can point to NULLP
459  *
460  * @param[in] _rbId      RB Id of the RB to be fetched
461  * @param[in] _rbType    Type of the RB, SRB or DRB
462  * @param[in] _ueCb      Pointer to the UECb for which to get the RB
463  * @param[out] _rbCb     Pointer to the found RbCb
464  *
465 */
466 #define RLC_DBM_GET_RBCB_FROM_UECB(_rbId, _rbType, _ueCb, _rbCb)            \
467            (_rbCb) = ((_rbType) == CM_LTE_SRB) ? (_ueCb)->srbCb[(_rbId)] : \
468                                                  (_ueCb)->drbCb[(_rbId)];     
469 /**
470  * @def RLC_DBM_GET_CELL_RBCB
471  *
472  *    This macro makes _rbCb point to the RB in the _rbCbLst. 
473  *    _rbCb can point to NULLP
474  *
475  * @param[in] _rbId         RB Id of the RB to be fetched
476  * @param[in] _rbCbLst      Pointer to array of RBCbs
477  * @param[out] _rbCb        Pointer to the found RbCb
478  *
479 */
480 #define RLC_DBM_GET_CELL_RBCB(_rbId, _rbCbLst, _rbCb) \
481            (_rbCb) = (_rbCbLst)[(_rbId)]; 
482
483 /*******************************************************************************
484  *                              UMM Defines 
485  ******************************************************************************/
486 #define RLC_UMDL     rbCb->m.umDl 
487 #define RLC_UMUL     rbCb->m.umUl 
488
489 /* Sequence Number length defines */
490 #define RLC_UM_CFG_5BIT_SN_LEN      1 /**< UM 5-bit Sequence number length 
491                                           in bytes*/   
492 #define RLC_UM_CFG_10BIT_SN_LEN     2 /**< UM 10-bit Sequence number length 
493                                           in bytes*/
494 /* 5GNR */
495 /* Sequence Number length defines */
496 #define RLC_AM_CFG_12BIT_SN_LEN      1 /**< AM 12-bit Sequence number length 
497                                           in bytes*/   
498 #define RLC_AM_CFG_18BIT_SN_LEN      2 /**< AM 18-bit Sequence number length 
499                                           in bytes*/
500
501 /**
502  * @def RLC_RMV_MAC_HDR_SZ
503  *
504  *    If PDU size is greater than 127, MAC header would be 3 bytes else 2 bytes
505  *
506  * @param[in,out] _pduSz        Size of the pdu 
507  *
508 */
509 #define RLC_RMV_MAC_HDR_SZ(_pduSz) (_pduSz) -= ((_pduSz) > 127) ? 3 : 2;
510
511 /**
512  * @def RLC_UM_GET_VALUE
513  *
514  *    This macro is used to calculate the value of UM state variables used 
515  *    in comparisons.  VR(UH) - UM Window Size is taken as the base modulus.
516  *    Returns the modifed value
517  *
518  * @param[in] _val               Value of the state variable 
519  * @param[in] _kwUmUl        Um Uplink control block
520  *
521 */ 
522 #define RLC_UM_GET_VALUE(_val,_kwUmUl)  \
523      (((_val) - ((_kwUmUl).vrUh - (_kwUmUl).umWinSz)) & ((_kwUmUl).modBitMask))
524      
525 /*******************************************************************************
526  *                              AMM Defines 
527  ******************************************************************************/ 
528 #define RLC_AMDL                           rbCb->m.amDl 
529 #define RLC_AMUL                           rbCb->m.amUl
530
531 /* PDU Types */
532 #define RLC_DATA_PDU  1
533 #define RLC_CNTRL_PDU 0
534
535 #define RLC_FI_FIRST_SEG                0x02
536 #define RLC_FI_LAST_SEG                 0x01
537 #define RLC_SI_FIRST_SEG                0x01
538 #define RLC_SI_LAST_SEG                 0x02
539 #define RLC_SI_MID_SEG                  0x03
540
541 #define RLC_POLL_SET                    0x40 /* 01000000 */
542 #define RLC_POLL_UNSET                  0xbf /* 10111111 */
543 #define RLC_AM_WIN_SZ                   512
544 #define RLC_MAX_NACK_CNT                100
545 /*RLC_MAX_CNTRL_FIELDS (Maximum size of Status Pdu) 
546  *  = MAX_NACK_CNT * sizeof(NACK_SN,E1,E2,E3,soStart,soEnd, nackRange)
547  * for 18 bit SN + Fixed Header*/
548 #define RLC_MAX_CNTRL_FIELDS            ((RLC_MAX_NACK_CNT * 8) + 3)  
549
550 /* Each LI(Length Indicator) holds approx 1+1/2 byte and some other fields thus keeping Header Size equal to twice of MAX LI */
551 /* 5GNR_RLC: Need to change value of HDRSZ as per number of PDUs going in one datReq */
552 #define RLC_MAX_HDRSZ                         5 
553 #define RLC_AM_PDU_FIXED_HDRSZ                2
554 #define RLC_AM_PDU_12BIT_SN_HDRSZ             2
555 #define RLC_AM_PDU_18BIT_SN_HDRSZ             3
556 #define RLC_AM_SEG_12BIT_SN_WITH_SO_HDRSZ     4
557 #define RLC_AM_SEG_18BIT_SN_WITH_SO_HDRSZ     5
558 #define RLC_AM_SEG_12BIT_SN_WITHOUT_SO_HDRSZ  2
559 #define RLC_AM_SEG_18BIT_SN_WITHOUT_SO_HDRSZ  3
560 #define RLC_EXTN_HDRSZ                  2
561 #define RLC_CNTRL_PDU_FIXED_HDRSZ       3
562 #define RLC_MAC_HDR_SZ2                 2
563 #define RLC_MAC_HDR_SZ3                 3
564 #define RLC_BYTE_LEN                    8
565 #define RLC_2BYTE_LEN                   16
566 #define RLC_E1_LEN                      1
567 #define RLC_NACK_E1E2_LEN               12
568 #define RLC_SO_LEN                      15
569 #define RLC_DC_LEN                      1
570 #define RLC_CPT_LEN                     3
571 #define RLC_RF_LEN                      1
572 #define RLC_P_LEN                       1
573 #define RLC_FI_LEN                      2
574 #define RLC_SI_LEN                      2
575 #define RLC_E_LEN                       1
576 #define RLC_SN_LEN                      10
577 #define RLC_SN_LEN_12BITS               12
578 #define RLC_SN_LEN_18BITS               18
579 #define RLC_LSF_LEN                     1
580 #define RLC_LI_LEN                      11
581 #define RLC_STA_PDU_R_BITS_ACKSN_12BITS 7  /* 5GNR : Num Reserved bits in STATUS PDU */
582 #define RLC_STA_PDU_R_BITS_ACKSN_18BITS 1
583 #define RLC_STA_PDU_R_BITS_NACKSN_12BITS 1
584 #define RLC_STA_PDU_R_BITS_NACKSN_18BITS 3
585 #define RLC_NACK_RANGE_LEN               8
586 #define RLC_SO_LEN_5GNR                  16
587
588 #define RLC_DC_POS                      0x80
589 #define RLC_DC_SHT                      7      
590 #define RLC_POLL_POS                    0x40 /* 5GNR */
591 #define RLC_POLL_SHT                    6    /* 5GNR */
592 #define RLC_SI_POS                      0x30 /* 5GNR */
593 #define RLC_SI_SHT                      4    /* 5GNR */
594 #define RLC_SN_POS_12BIT                0x0F
595 #define RLC_SN_POS_18BIT                0x03
596 #define RLC_AM_GET_WIN_SZ(_snLen)       ((RLC_AM_CFG_12BIT_SN_LEN == (_snLen)) ? (2048) : (131072)) /* 5GNR */
597 #define RLC_RCV_BUF_BIN_SIZE 512   /* receive buffer size */
598 #define RLC_TX_BUF_BIN_SIZE 512   /* receive buffer size */
599
600 #define RLC_SDU_LST                     1
601 #define RLC_SEG_LST                     2
602 #define RLC_RETX_LST                    3
603 #define RLC_ALL_BYTES_MISSING           0xffff
604
605 #define RLC_MAX_PDU_MAP                 30       /*!< Maximum PDU Map. */
606
607 #define RLC_LLIST_FIRST_SDU(lstCp, nod)          \
608 {                                               \
609    CmLList *tmpNode;                            \
610    /*CM_LLIST_FIRST_NODE(&(lstCp), tmpNode);*/      \
611    /*if (tmpNode != NULLP)*/                        \
612    if((tmpNode=cmLListFirst(&lstCp)))            \
613       nod = (RlcSdu *)tmpNode->node;             \
614    else                                         \
615       nod = NULLP;                              \
616 }                                                          
617
618                                                            
619 #define RLC_LLIST_FIRST_SEG(lstCp, nod)         \
620 {                                              \
621    CmLList *tmpNode;                           \
622    /*CM_LLIST_FIRST_NODE(&(lstCp), tmpNode);*/     \
623    /*if (tmpNode != NULLP)*/                       \
624    if((tmpNode=cmLListFirst(&lstCp)))            \
625       nod = (RlcSeg *)tmpNode->node;            \
626    else                                        \
627       nod = NULLP;                             \
628 }                                                          
629
630 #define RLC_LLIST_FIRST_RETX(lstCp, nod)        \
631 {                                              \
632    CmLList *tmpNode;                           \
633    /*CM_LLIST_FIRST_NODE(&(lstCp), tmpNode);*/     \
634    /*if (tmpNode != NULLP)*/                       \
635    if((tmpNode=cmLListFirst(&lstCp)))            \
636       nod = (RlcRetx *)tmpNode->node;           \
637    else                                        \
638       nod = NULLP;                             \
639 }
640
641 #define RLC_LLIST_NEXT_SDU(lstCp, nod)          \
642 {                                              \
643    CmLList *tmpNode;                           \
644    /*CM_LLIST_NEXT_NODE(&(lstCp), tmpNode);*/      \
645    /*if (tmpNode != NULLP)  */                     \
646    if((tmpNode = cmLListNext(&lstCp)))          \
647       nod = (RlcSdu *)tmpNode->node;            \
648    else                                        \
649       nod = NULLP;                             \
650 }                                              
651
652
653 #define RLC_LLIST_NEXT_SEG(lstCp, nod)          \
654 {                                              \
655    CmLList *tmpNode;                           \
656    (lstCp).crnt = &((nod)->lstEnt);            \
657    /*CM_LLIST_NEXT_NODE(&(lstCp), tmpNode);*/      \
658    /*if (tmpNode != NULLP)*/                       \
659    if((tmpNode = cmLListNext(&lstCp)))           \
660       nod = (RlcSeg *)tmpNode->node;            \
661    else                                        \
662       nod = NULLP;                             \
663 }      
664
665                                         
666 #define RLC_LLIST_NEXT_RETX(lstCp, nod)         \
667 {                                              \
668    CmLList *tmpNode;                           \
669    /*CM_LLIST_NEXT_NODE(&(lstCp), tmpNode);*/      \
670    /*if (tmpNode != NULLP) */                      \
671    if ((tmpNode = cmLListNext(&lstCp)))          \
672       nod = (RlcRetx *)tmpNode->node;           \
673    else                                        \
674       nod = NULLP;                             \
675 }
676
677
678 #define RLC_LLIST_LAST_RETX(lstCp, nod)         \
679 {                                              \
680    CmLList *tempNode = NULLP;                  \
681    cmLListLast(&lstCp);                        \
682    tempNode = cmLListCrnt(&lstCp);             \
683    if (tempNode != NULLP)                      \
684       nod = (RlcRetx *)tempNode->node;          \
685    else                                        \
686       nod = NULLP;                             \
687 }
688
689 #define RLC_LLIST_LAST_SEG(lstCp, nod)          \
690 {                                              \
691    CmLList *tempNode = NULLP;                  \
692    cmLListLast(&lstCp);                        \
693    tempNode = cmLListCrnt(&lstCp);             \
694    if (tempNode != NULLP)                      \
695       nod = (RlcSeg *)tempNode->node;           \
696    else                                        \
697       nod = NULLP;                             \
698 }
699
700 #define RLC_LLIST_LAST_SDU(lstCp, nod)          \
701 {                                              \
702    CmLList *tempNode = NULLP;                  \
703    cmLListLast(&lstCp);                        \
704    tempNode = cmLListCrnt(&lstCp);             \
705    if (tempNode != NULLP)                      \
706       nod = (RlcSdu *)tempNode->node;           \
707    else                                        \
708       nod = NULLP;                             \
709 }
710
711 #define CM_LLIST_INS_AFT_CRNT(lstCp, nod)      \
712 {                                              \
713    CmLList *nodeToIns = &nod->lstEnt;\
714    nodeToIns->node = (PTR) nod;\
715    cmLListInsAfterCrnt(&lstCp, nodeToIns);     \
716 }
717
718 #define CM_LLIST_INS_BEF_CRNT(lstCp, nod)      \
719 {                                              \
720    CmLList *nodeToIns = &nod->lstEnt;          \
721    nodeToIns->node = (PTR) nod;                \
722    cmLListInsCrnt(&lstCp, nodeToIns);          \
723 }
724
725 #define RLC_LLIST_DEL_RECBUF(_recBuf)                       \
726 {                                                          \
727    RlcSeg  *_seg = NULLP;                                   \
728    RLC_LLIST_FIRST_SEG(_recBuf->segLst, _seg);              \
729    while (_seg)                                            \
730    {                                                       \
731       cmLListDelFrm(&_recBuf->segLst, &_seg->lstEnt);      \
732       RLC_FREE(_seg, sizeof(RlcSeg));                        \
733       RLC_LLIST_NEXT_SEG(_recBuf->segLst, _seg);            \
734    }                                                       \
735 }
736
737 #ifdef NR_RLC_UL
738 #define RLC_UMM_LLIST_FIRST_SEG(lstCp, nod)         \
739 {                                              \
740    CmLList *tmpNode;                           \
741    if((tmpNode=cmLListFirst(&lstCp)))            \
742       nod = (RlcUmSeg *)tmpNode->node;            \
743    else                                        \
744       nod = NULLP;                             \
745 } /*!< um mode first segment of linked list*/
746
747 #define RLC_UMM_LLIST_NEXT_SEG(lstCp, nod)          \
748 {                                              \
749    CmLList *tmpNode;                           \
750    (lstCp).crnt = &((nod)->lstEnt);            \
751    if((tmpNode = cmLListNext(&lstCp)))           \
752       nod = (RlcUmSeg *)tmpNode->node;            \
753    else                                        \
754       nod = NULLP;                             \
755 }/*!< next segment in um mode linked list*/
756
757 #endif
758
759 #define MODAMT(x, y, z,_snModMask)   \
760 {                         \
761    y = (x - z) & _snModMask;   \
762 }                                                         
763
764 #define MODAMR(x, y, z , _snModMask)   \
765 {                         \
766    y = (x - z) & (_snModMask);   \
767 }
768
769 /**
770  * @def RLC_AM_IS_TRANS_WIN_STALLED
771  *
772  *    This macro is used to check if the AM transmit window is stalled or not.
773  *    The tramist window is stalled when the distance between txNext and txNextAck
774  *    is greater than equal to Window Size. Actually it should never be greater 
775  *    than Window Size.
776  *    Returns TRUE if the window is stalled else FALSE
777  *
778  * @param[in] _amDl     AM Downlink control block
779  *
780 */ 
781 #define RLC_AM_IS_TRANS_WIN_STALLED(_amDl)  \
782      ((((_amDl)->txNext - (_amDl)->txNextAck) & _amDl->snModMask) >= (RLC_AM_GET_WIN_SZ(_amDl->snLen)))
783
784 #ifdef TENB_STATS
785 #define RLC_AM_TRANS_WIN_SIZE(_amDl)  \
786      (((_amDl)->txNext - (_amDl)->txNextAck) & _amDl->snModMask)
787 #endif
788
789 #define RLC_AM_IS_POLL_BIT_SET(_amDl) \
790   (RLC_AMDL.pollSn == ((RLC_AMDL.txNext - 1) & RLC_AMDL.snModMask))
791
792 #define RLC_FILL_CNTRL_INFO(cntrlInfo, _val, _len, _idx, _eb)\
793 {                                                           \
794    cntrlInfo.val = _val;                                    \
795    cntrlInfo.len = _len;                                    \
796    cntrlInfo.idx = _idx;                                    \
797    cntrlInfo.emtBits = _eb;                                 \
798 }
799 #define RLC_FILL_PREV_IDX(cntrlInfo, _e1Idx, _e1eb, _idx, _eb) \
800 {                                                                     \
801   _e1Idx = cntrlInfo.e1Idx;                                           \
802   _e1eb  = cntrlInfo.e1eb;                                            \
803   _idx   = cntrlInfo.idx;                                             \
804   _eb    = cntrlInfo.emtBits;                                         \
805 }
806
807 #define RLC_FILL_HDR_ARGS(hdrInfo, _val, _len)  \
808 {                                              \
809    hdrInfo.val = _val;                         \
810    hdrInfo.len = _len;                         \
811 }
812
813 /* kw003.201 - This macro provides the header size other than the */
814 /*             fixed header of 2 bytes for each AMD PDU or 4 bytes*/
815 /*             for an AM PDU segment                              */
816 #define RLC_AM_EXTN_HDRSZ(_numLi, _eHdrSz)       \
817 {                                               \
818    if ((_numLi - 1) % 2)                        \
819    {                                            \
820       _eHdrSz = ((3 * (_numLi - 2)) >> 1) + 2;  \
821    }                                            \
822    else                                         \
823    {                                            \
824       _eHdrSz = (3 * (_numLi - 1)) >> 1;        \
825    }                                            \
826 }
827
828 /* Update poll bit in the buffer */
829 #define RLC_UPD_POLL_BIT(_gCb, _retx, _poll)                \
830 {                                                          \
831    uint8_t fHdr;                                                \
832                                                            \
833    if (_poll != _retx->amHdr.p)                            \
834    {                                                       \
835       /* Get the first byte of the buffer */               \
836       SRemPreMsg((Data *)&fHdr, _retx->seg);               \
837       if (_poll == TRUE)                                   \
838       {                                                    \
839          fHdr = fHdr | RLC_POLL_SET;                        \
840       }                                                    \
841       else                                                 \
842       {                                                    \
843          fHdr = fHdr & RLC_POLL_UNSET;                      \
844       }                                                    \
845       /* Concatenated updated hdr to the mBuf */           \
846       SAddPreMsg ((Data)fHdr, _retx->seg);                 \
847    }                                                       \
848    /* Update poll bit in the hdrInfo */                    \
849    _retx->amHdr.p = _poll;                                 \
850 }
851
852 #define RLC_AM_ELIMINATE_EXTN_HDR(_pduSz, _sduSz, _numLi)   \
853 {                                                          \
854    if ( (_pduSz > _sduSz) && (_sduSz < 2048) )             \
855    {                                                       \
856       _pduSz -= (_numLi % 2) ? 1 : 2;                      \
857    }                                                       \
858 }
859 /**
860  * @def RLC_AM_CHK_SN_WITHIN_RECV_WINDOW
861  *
862  *    This macro is used to check if a Sequence Number falls within the AM
863  *    reception window or not.
864  *    The condition is VR(R) <= SN < VR(MR), which are subtracting the base
865  *    modulus becomes 0 <= (SN - VR(R)) % SNLen < (VR(MR) - VR(R)) % SnLen
866  *    NOTE: Careful with the parantheses
867  *
868  *    Returns TRUE if within the window; FALSE otherwise
869  *
870  * @param[in] _sn       The sequence number to be checked
871  * @param[in] _amUl     AM Uplink control block
872  *
873 */
874 #define RLC_AM_CHK_SN_WITHIN_RECV_WINDOW(_sn, _amUl)          \
875   ((((_sn) - (_amUl->rxNext)) & (_amUl->snModMask)) < (((_amUl->vrMr) - (_amUl->rxNext)) & (_amUl->snModMask))) 
876
877 #define RLC_POWER(x, y)  x << (y-1); 
878
879 #ifndef L2_OPTMZ
880 #define rlcCpyMsg(_cb,x, y) \
881       (SAddMsgRef((x), RLC_GET_MEM_REGION(_cb), RLC_GET_MEM_POOL(_cb), (y)))
882 #else
883 /* L2 optimization for mUe/Tti: Removing dup buf*/
884 #define rlcCpyMsg(_cb,x, y) \
885       (SIncMsgRef((x), RLC_GET_MEM_REGION(_cb), RLC_GET_MEM_POOL(_cb), (y)))
886 #endif
887
888 //      printf("Copy Msg %x \n",x);
889
890 /*******************************************************************************
891  *                              Debugging Defines 
892  ******************************************************************************/
893 #define RLC_DBG_SUB_MASK   DBGMASK_MI             /**< Use for sub-mask */
894 #define RLC_DBGMASK_DETAIL (RLC_DBG_SUB_MASK << 0) /**< Parameters, It will give
895                                                       in depth info */
896 #define RLC_DBGMASK_BRIEF  (RLC_DBG_SUB_MASK << 1) /**< Info, It will give info at
897                                                     entry and exit places along
898                                                    with certain state changes */
899 #define RLC_DBGMASK_ERROR  (RLC_DBG_SUB_MASK << 2) /**< Error information */
900 #define RLC_DBGMASK_FATAL  (RLC_DBG_SUB_MASK << 3) /**< FATAL errors like memory
901                                                     resource failure etc., */
902
903 #define RLC_DBG_MDL_MASK (RLC_DBG_SUB_MASK << 4)
904
905 #define RLC_DBGMASK_TM         (RLC_DBG_MDL_MASK << 0)    /**< TM */
906 #define RLC_DBGMASK_UM         (RLC_DBG_MDL_MASK << 1)    /**< UM */
907 #define RLC_DBGMASK_AM         (RLC_DBG_MDL_MASK << 2)    /**< AM */
908 #define RLC_DBGMASK_DL         (RLC_DBG_MDL_MASK << 3)    /**< DL */
909 #define RLC_DBGMASK_UL         (RLC_DBG_MDL_MASK << 4)    /**< UL */
910 #define RLC_DBGMASK_CFG        (RLC_DBG_MDL_MASK << 5)    /**< CFG */
911 #define RLC_DBGMASK_LMM        (RLC_DBG_MDL_MASK << 6)    /**< LMM */
912 #define RLC_DBGMASK_INF        (RLC_DBG_MDL_MASK << 7)    /**< UI, LI */
913 #define RLC_DBGMASK_DUT        (RLC_DBG_MDL_MASK << 8)    /**< DBM, UTL, TMR */
914 #define RLC_DBGMASK_MBUF_PRNT  (RLC_DBG_MDL_MASK << 9)    /**< MBUF, useful in
915                                                              integrated 
916                                                              testing */
917 #define RLC_DBGMASK_MEM_INFO   (RLC_DBG_MDL_MASK << 10)   /**< Print SSI memory
918                                                              information*/
919 #define RLC_DBGMASK_UDX        (RLC_DBG_MDL_MASK << 11)   /**< UDX interface */
920
921 #ifdef DEBUGP
922 #define RLC_PRNT_BORDER                                   \
923 do                                                       \
924 {                                                        \
925    RLC_PRNT((_kwPBuf, "\n==========================\n")); \
926 }while(0)
927
928 #define RLC_PRNT_HLINE(_cb,_pMsg)                                              \
929 {                                                                             \
930    sprintf((_cb)->init.prntBuf, "[RLC_LAYER: %s:%d]::", __FILE__, __LINE__);  \
931    SPrint((_cb)->init.prntBuf);                                               \
932    RLC_PRNT_TSTAMP(_cb);                                                       \
933    sprintf((_cb)->init.prntBuf, _pMsg);                                       \
934    SPrint((_cb)->init.prntBuf);                                               \
935 }
936
937 #define RLC_PRNT(_cb,_prntbuf)  \
938 {                              \
939    sprintf _prntbuf;           \
940    SPrint(_cb->init.prntBuf);  \
941 }
942
943 #define RLC_PRINT_TO_BUFFER(_cb,...)                             \
944 {                                                               \
945    snprintf((_cb)->init.prntBuf, PRNTSZE, "[%s]::", __func__);  \
946    SPrint((_cb)->init.prntBuf);                                 \
947    snprintf(_cb->init.prntBuf, PRNTSZE,__VA_ARGS__);            \
948    SPrint(_cb->init.prntBuf);                                   \
949 }
950
951 #define RLC_PRNT_TSTAMP(_cb)                                   \
952 {                                                             \
953    S8 _buf[60];                                               \
954    DateTime dt;                                               \
955    memset((&dt), 0, sizeof(DateTime));                \
956    SGetDateTime(&dt);                                         \
957    sprintf(_buf, "date: %02d/%02d/%04d time: %02d:%02d:%02d", \
958      (int)dt.month,(int)dt.day,(int)dt.year + 1900,           \
959      (int)dt.hour,(int)dt.min,(int)dt.sec);                   \
960    RLC_PRNT(_cb,(_cb->init.prntBuf,("[%s]", _buf)));           \
961 }
962
963 #define RLC_PRNT_MBUF(_cb,_mBufPtr)                          \
964 do                                                          \
965 {                                                           \
966    if(_cb->init.dbgMask & (RLC_DBGMASK_MBUF_PRNT))           \
967    {                                                        \
968      RLC_PRNT_HLINE(_cb,("\nMessage Buffer Contents:\n"));   \
969      SPrntMsg ((Buffer *)_mBufPtr, 0, 0);                   \
970    }                                                        \
971 }while(0)
972
973 #define RLC_PRNT_MEMINFO(_cb)                                  \
974 do                                                            \
975 {                                                             \
976    uint32_t  _memInfo;                                             \
977    if(_cb->init.dbgMask & (RLC_DBGMASK_MEM_INFO))              \
978    {                                                          \
979      RLC_PRNT_HLINE(_cb,("\nMemory Information:\n"));          \
980      SRegInfoShow(0, &_memInfo);                              \
981    }                                                          \
982 }while(0)
983
984 #define RLCDBGP_INTERNAL(_cb,_mask,...)           \
985 do                                               \
986 {                                                \
987    if (!((_cb->init.dbgMask & _mask) ^ _mask))   \
988    {                                             \
989       RLC_PRINT_TO_BUFFER(_cb, __VA_ARGS__);      \
990    }                                             \
991 }while(0)
992
993 #define RLCDBGP_ERROR(_cb, ...) \
994    RLCDBGP_INTERNAL(_cb,(RLC_DBGMASK_ERROR | RLC_MODULE),__VA_ARGS__)
995
996 #define RLCDBGP_DETAIL(_cb, ...) \
997    RLCDBGP_INTERNAL(_cb,(RLC_DBGMASK_DETAIL | RLC_MODULE),__VA_ARGS__)
998
999 #define RLCDBGP_BRIEF(_cb, ...) \
1000    RLCDBGP_INTERNAL(_cb,(RLC_DBGMASK_BRIEF | RLC_MODULE),__VA_ARGS__)   
1001    
1002 #else  /* DEBUGP */ 
1003 #define RLC_PRNT_HLINE(_cb,_pMsg)
1004 #define RLC_PRNT(_cb,_prntbuf)
1005 #define RLC_PRNT_TSTAMP(_cb)
1006 #define RLC_PRNT_MBUF(_cb,_mBufPtr)
1007 #define RLC_PRNT_MEMINFO(_cb)
1008 #define RLCDBGP(_cb,_mask, _arg)
1009 #define RLCDBGP_ERROR(_cb, ...) 
1010 #define RLCDBGP_DETAIL(_cb, ...)
1011 #define RLCDBGP_BRIEF(_cb, ...)
1012 #endif /* DEBUGP */
1013
1014 /*******************************************************************************
1015  *                              LMM Defines 
1016  ******************************************************************************/
1017 #define RLC_LMM_RB_STS_INC(_cb)    (_cb)->genSts.numOfRb++;
1018
1019 #define RLC_LMM_RB_STS_DEC(_cb)    (_cb)->genSts.numOfRb--;
1020
1021 #if defined(SS_MULTICORE_SUPPORT) && defined(SS_M_PROTO_REGION)
1022 #define RLC_FILL_SAP_HELPER(_Sap, _cfg, _gCb)\
1023 {\
1024    _Sap->pst.selector = _cfg->selector; \
1025    _Sap->pst.route = _cfg->route; \
1026    _Sap->pst.prior =  _cfg->priority; \
1027    _Sap->pst.region = _gCb->init.region;\
1028    _Sap->pst.pool = _gCb->init.pool;\
1029    _Sap->pst.dstProcId = _cfg->procId; \
1030    _Sap->pst.dstEnt = _cfg->ent; \
1031    _Sap->pst.dstInst = _cfg->inst; \
1032    _Sap->pst.srcProcId = _gCb->init.procId; \
1033    _Sap->pst.srcEnt = _gCb->init.ent; \
1034    _Sap->pst.srcInst = _gCb->init.inst; \
1035    _Sap->pst.event = EVTNONE; \
1036    _Sap->spId = _cfg->sapId; \
1037    _Sap->state = RLC_SAP_CFG; \
1038 }
1039 #else /* defined(SS_MULTICORE_SUPPORT) && defined(SS_M_PROTO_REGION) */
1040 #define RLC_FILL_SAP_HELPER(_Sap, _cfg, _gCb)\
1041 {\
1042    _Sap->pst.selector = _cfg->selector; \
1043    _Sap->pst.route = _cfg->route; \
1044    _Sap->pst.prior =  _cfg->priority; \
1045    _Sap->pst.region = _cfg->mem.region;\
1046    _Sap->pst.pool = _cfg->mem.pool;\
1047    _Sap->pst.dstProcId = _cfg->procId;\
1048    _Sap->pst.dstEnt = _cfg->ent;\
1049    _Sap->pst.dstInst = _cfg->inst;\
1050    _Sap->pst.srcProcId = _gCb->init.procId;\
1051    _Sap->pst.srcEnt = _gCb->init.ent;\
1052    _Sap->pst.srcInst = _gCb->init.inst;\
1053    _Sap->pst.event = EVTNONE;\
1054    _Sap->spId = _cfg->sapId;\
1055    _Sap->state = RLC_SAP_CFG;\
1056 }
1057 #endif
1058
1059 /*******************************************************************************
1060  *                              UDX Defines 
1061  ******************************************************************************/
1062 #define RLC_GET_DL_SAPCB(_cb, _rbCb) (_cb->u.dlCb->udxDlSap + _rbCb->udxSapId)
1063 #define RLC_GET_UDX_SAP(_cb) (_cb->u.ulCb->udxUlSap)
1064
1065 /* kw005.201 added support for L2 Measurement */
1066 #ifdef LTE_L2_MEAS
1067 #define RLC_L2_MAX_TIMERS        1
1068 #define RLC_QCI_LIST_BUCKET_SIZE 10
1069 #define RLC_TB_LIST_BUCKET_SIZE  10
1070 #define RLC_MAX_L2MEAS_EVT       10
1071 /* L2 Measurement index to be used in rbCb to store measData */                                       
1072 #define RLC_L2MEAS_ACT_UE       0                                       
1073 #define RLC_L2MEAS_DL_DELAY     1                                       
1074 #define RLC_L2MEAS_DL_DISC      2
1075 #define RLC_L2MEAS_UU_LOSS      3
1076 #define RLC_L2MEAS_DL_IP        4
1077 #define RLC_L2MEAS_UL_IP        5
1078 #endif /* LTE_L2_MEAS */
1079
1080 #define RLC_RDWR_LOCK(_lockPtr)
1081 #define RLC_RDWR_UNLOCK(_lockPtr)
1082 #define RLC_TIME_DIFF(t1,t2)                  \
1083    (t1<t2 ? ((0xffffffff - t2) + t1 ): (t1 - t2)) 
1084
1085 #endif /* __KWH__ */
1086 \f  
1087 /********************************************************************30**
1088   
1089          End of file
1090 **********************************************************************/