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**
25 Desc: This file contain the hash definations for RLC
29 *********************************************************************21*/
31 @brief RLC Hash definitions
45 /* RLC-SPLIT Activity */
52 #define RLC_2K_BYTE 2048
54 /* RLC RB flag bits */
55 #define RLC_RB_REESTABLISH_DL RLC_BIT0
56 #define RLC_RB_REESTABLISH_UL RLC_BIT1
57 #define RLC_RB_DELETE_DL RLC_BIT2
58 #define RLC_RB_DELETE_UL RLC_BIT3
61 #define RLC_MOD_1024 0x3FF /* used for MOD 1024 */
65 /************************************************************************
67 ************************************************************************/
69 #define RLC_SAP_NOT_CFG 0 /*!< SAP Not Configured */
70 #define RLC_SAP_CFG 1 /*!< SAP Configured but not not bound */
71 #define RLC_SAP_BND 2 /*!< SAP Bound */
72 #define RLC_SAP_BINDING 3 /*!< SAP Bind initiated */
73 #define RLC_SAP_UBND 4 /*!< SAP Unbind */
75 #define RLC_MAX_SAP_BND_RETRY 3 /*!< Maximum SAP Bin Retries */
77 #define RLC_MAX_UE 0xffffffff /*!< Maximum number of UEs. */
79 /* Maximum number of Saps */
80 #define RLC_MAX_UDXSAPS 1 /*!< Maximum number of UDX Saps */
81 #define RLC_MAX_KWUSAPS 2 /*!< Maximum number of KWU Saps. */
82 #define RLC_MAX_CKWSAPS 1 /*!< Maximum number of CKW Saps. */
84 #define RLC_MAX_RGUSAPS 4//5 /*!< Maximum number of RGU Saps. */
86 #define RLC_MAX_RGUSAP_TMR 1 /*!< Maximum number of RGU SAP Timers. */
88 #define RLC_UI_RRC 0 /*!< Upper interface RRC sap Id. */
89 #define RLC_UI_PDCP 1 /*!< Upper interface PDCP sap Id. */
92 /* TODO. This works for FDD only. For TDD the array dimension
93 * should be changed according to the number of Harq Procs */
94 #define RLC_MAX_TB_PER_UE 64 /*!< Maximum number of tbCb for UE */
95 #define RLC_INVALID_TBID RLC_MAX_TB_PER_UE
97 /*******************************************************************************
98 * Memory related Defines
99 ******************************************************************************/
101 /* Allocate function */
102 #define RLC_ALLOC(_cb,_buf, _size) \
104 SGetSBuf(_cb->init.region, _cb->init.pool, (Data **)&_buf, \
106 memset((_buf), 0, _size); \
109 #define RLC_RMV_SDU(_cb,_sduQ,_sdu) \
111 SPutMsg(_sdu->mBuf); \
112 cmLListDelFrm(_sduQ,&_sdu->lstEnt); \
113 RLC_FREE(_cb,_sdu, sizeof(RlcSdu)); \
116 #define RLC_FREE(_cb,_buf, _size) \
118 (Void) SPutSBuf(_cb->init.region, _cb->init.pool, \
119 (Data *) _buf, (Size) _size); \
125 #define RLC_FREE_SHRABL_BUF(_region, _pool,_buf, _size) \
129 (Void) SPutStaticBuffer(_region, _pool, \
130 (Data *) _buf, (Size) _size, 0); \
135 #define RLC_FREE_SHRABL_BUF_WC(_region, _pool,_buf, _size) \
137 (Void) SPutStaticBuffer(_region, _pool, \
138 (Data *) _buf, (Size) _size, 0); \
142 #define RLC_ALLOC_SHRABL_BUF_WC(_region, _pool,_buf, _size) \
144 SGetStaticBuffer(_region, _pool, (Data **)&_buf, \
148 #define RLC_ALLOC_SHRABL_BUF(_region, _pool,_buf, _size) \
150 if (SGetStaticBuffer(_region, _pool, (Data **)&_buf, \
151 (Size) _size, 0) == ROK) \
153 memset((_buf), 0, _size); \
160 /* Allocate function */
161 #define RLC_ALLOC(_cb,_buf, _size) \
163 if (SGetSBuf(_cb->init.region, _cb->init.pool, (Data **)&_buf, \
164 (Size) _size) == ROK) \
166 memset((_buf), 0, _size); \
174 #define RLC_ALLOC_WC(_cb,_buf, _size) \
175 SGetSBuf(_cb->init.region, _cb->init.pool, (Data **)&_buf, (Size) _size)
177 #define RLC_RMV_SDU(_cb,_sduQ,_sdu) \
181 SPutMsg(_sdu->mBuf); \
183 cmLListDelFrm(_sduQ,&_sdu->lstEnt); \
184 RLC_FREE(_cb,_sdu, sizeof(RlcSdu)); \
187 #define RLC_FREE(_cb,_buf, _size) \
191 (Void) SPutSBuf(_cb->init.region, _cb->init.pool, \
192 (Data *) _buf, (Size) _size); \
199 /* kw002.201 Freeing from region of pst */
200 #define RLC_PST_FREE(_region, _pool, _buf, _size) \
204 (Void) SPutSBuf(_region, _pool, \
205 (Data *) _buf, (Size) _size); \
210 #ifdef XEON_SPECIFIC_CHANGES
211 #ifdef SS_LOCKLESS_MEMORY
212 #define RLC_SHRABL_STATIC_BUF_FREE(_region, _pool, _buf, _size) \
216 (Void) SPutStaticBuffer(_region, _pool, \
217 (Data *) _buf, (Size) _size, 0); \
222 #define RLC_SHRABL_STATIC_BUF_ALLOC(_region, _pool, _buf, _size) \
224 SGetStaticBuffer(_region, _pool, (Data **)&_buf, \
230 #define RLC_SHRABL_STATIC_BUF_FREE(_region, _pool, _buf, _size) \
234 (Void) SPutSBuf(_region, _pool, \
235 (Data *) _buf, (Size) _size); \
240 #define RLC_SHRABL_STATIC_BUF_ALLOC(_region, _pool, _buf, _size) \
242 SGetSBuf(_region, _pool, (Data **)&_buf, \
245 #endif /* SS_LOCKLESS_MEMORY */
249 #define RLC_SHRABL_STATIC_BUF_FREE(_region, _pool, _buf, _size) \
253 (Void) SPutStaticBuffer(_region, _pool, \
254 (Data *) _buf, (Size) _size, 0); \
259 #define RLC_SHRABL_STATIC_BUF_ALLOC(_region, _pool, _buf, _size) \
261 SGetStaticBuffer(_region, _pool, (Data **)&_buf, \
266 #define RLC_MEM_CPY(_dst, _src, _size) memcpy(_dst, _src, _size);
268 #define RLC_MEM_ZERO(_buf, _size) memset((_buf), 0, _size);
270 #define RLC_GET_MEM_REGION(_cb) (_cb->init.region)
272 #define RLC_GET_MEM_POOL(_cb) (_cb->init.pool)
274 #define RLC_GET_MEM_POOL_ADDRESS(_cb) (&_cb->init.pool)
276 /* Memset to value */
277 #define RLC_MEM_SET(_arg, _val, _size) memset(_arg, _val, _size);
280 /* Send an alarm for sapId events */
281 /* kw005.201 added support for L2 Measurement */
283 #define RLC_GETSDUIDX(_sduIdx) \
285 _sduIdx = (((_sduIdx)+1) % RLC_L2MEAS_MAX_OUTSTNGSDU);\
287 #define RLC_SEND_SAPID_ALARM(_cb,_sapId, _evnt, _cause) \
289 rlcLmmSendAlarm(_cb,LCM_CATEGORY_INTERFACE, _evnt, _cause, _sapId, 0, 0); \
291 #define RLC_SEND_UEID_ALARM(_cb,_ueId, _qci, _evnt, _cause) \
293 rlcLmmSendAlarm(_cb,LCM_CATEGORY_INTERFACE, _evnt, _cause, 0, _ueId, _qci); \
295 #else /* LTE_L2_MEAS */
296 #define RLC_SEND_SAPID_ALARM(_cb,_sapId, _evnt, _cause) \
298 rlcLmmSendAlarm(_cb,LCM_CATEGORY_INTERFACE, _evnt, _cause, _sapId, 0); \
300 #define RLC_SEND_UEID_ALARM(_cb,_ueId, _evnt, _cause) \
302 rlcLmmSendAlarm(_cb,LCM_CATEGORY_INTERFACE, _evnt, _cause, 0, _ueId); \
304 #endif /* LTE_L2_MEAS */
306 /*******************************************************************************
308 ******************************************************************************/
310 /* RLC Configuration parameters */
311 #define RLC_MAX_UL_LI (2 * RLC_MAX_LI)
312 /*macro RLC_MAX_DL_LI is moved to kw_env.h file */
313 #define RLC_MAX_DAT RLC_MAXIMUM_DAT
314 /*macro RLC_MAX_PDU is moved to kw_env.h file */
315 #define RLC_MAX_RB_PER_CELL 10
316 #define RLC_MAX_SRB_PER_UE 3
317 #define RLC_MAX_DRB_PER_UE 32
318 #define RLC_MAX_LCH_PER_UE 12
319 #define RLC_MAX_LCH_PER_CELL 6
320 #define RLC_MAX_NUM_RB 24
321 #define RLC_MAX_UE 0xffffffff
322 #define RLC_UE_LIST_BUCKET_SIZE 128
323 #define RLC_CELL_LIST_BUCKET_SIZE 10
324 #define RLC_TRANS_ID_LST_BKT_SIZE 10
325 #define RLC_MAX_RB 32
327 /* RLC Mode defines */
328 #define RLC_MODE_TM 1
329 #define RLC_MODE_UM 2
330 #define RLC_MODE_AM 3
332 /* Direction defines */
333 #define RLC_DIR_UL 1 /*!< Unlink direction */
334 #define RLC_DIR_DL 2 /*!< Downlink direction */
335 #define RLC_DIR_BOTH 3 /*!< Both Downlink and Unlink */
337 #define RLC_DEF_SEQ_NUM 0 /**< Sequence number to pick in case of duplicate
338 entries in hash list searches*/
343 * Macro to find the miniumum of two numbers
345 * @param[in] x First number
346 * @param[in] y Second number
349 #define RLC_MIN(x,y) (x) < (y) ? (x) : (y)
354 * Macro to the RLC instance
356 * @param[in] _inst Instance Id
359 #define RLC_GET_RLCCB(_inst) rlcCb[_inst]
361 #define RLC_ADD_SDU 1 /*!< Add SDU. */
362 #define RLC_DEL_SDU 2 /*!< Delete SDU. */
364 #define RLC_CFM_NOK 0 /*!< Do not send DatCfm */
365 #define RLC_CFM_OK 1 /*!< Send DatCfm */
367 /* Set the unsolictated Status flag */
368 #define RLC_SET_USTA_FLAG(_rlcCb, _value) \
370 _rlcCb->init.usta = _value; \
373 /* Macros to get the init parameters */
374 #define RLC_GET_DBG_MASK(_rlcCb) (_rlcCb->init.dbgMask)
375 #define RLC_GET_LMPST_MEM_POOL(_rlcCb) (_rlcCb->init.lmPst.pool)
376 #define RLC_GET_LMPST_MEM_REGION(_rlcCb) (_rlcCb->init.lmPst.region)
378 /* Macros for configuration module */
379 #define RLC_CFG_FILL_CFG_CFM(_entCfm, _rbId, _rbType, _status, _reason) \
381 _entCfm->rbId = _rbId; \
382 _entCfm->rbType = _rbType; \
383 _entCfm->status.status = _status; \
384 _entCfm->status.reason = _reason; \
388 * @def RLC_VALIDATE_UE_RBID
390 * This macro validates whether the _rbId passed is valid or not. It checks
391 * if the _rbId is within the maximum value depending on the _rbType.
392 * Returns TRUE if valid else FALSE
394 * @param[in] _rbType Type of the Radio Bearer; SRB or DRB
395 * @param[in] _rbId RB Id of the RB to be validated
398 #define RLC_VALIDATE_UE_RBID(_rbType, _rbId) \
399 ((_rbType == CM_LTE_SRB && _rbId < RLC_MAX_SRB_PER_UE) || \
400 (_rbType == CM_LTE_DRB && _rbId < RLC_MAX_DRB_PER_UE))
402 /*******************************************************************************
404 ******************************************************************************/
405 #if (ERRCLASS & ERRCLS_INT_PAR)
406 #define RLC_VALDATE_SAP(_cb,_chkSpId, _sap, _ret) \
408 if (_chkSpId != _sap->spId) \
410 RLCLOGERROR(_cb,ERRCLS_DEBUG, EKWxxx, (ErrVal) RFAILED, \
411 "Sap Id Validation Failed."); \
414 /* SAP state validation */ \
415 if(_sap->state != RLC_SAP_BND) \
417 RLCLOGERROR(_cb,ERRCLS_INT_PAR, EKWXXX, (ErrVal) RFAILED, \
418 "Sap State Invalid."); \
419 RLC_SEND_SAPID_ALARM(_cb,0, LCM_EVENT_UI_INV_EVT, LCM_CAUSE_INV_STATE); \
423 #else /* ERRCLASS & ERRCLS_INT_PAR */
424 #define RLC_VALDATE_SAP(_cb,_chkSpId, _sap, _ret) \
426 /* SAP state validation */ \
427 if(_sap->state != RLC_SAP_BND) \
429 RLCLOGERROR(_cb,ERRCLS_INT_PAR, EKWXXX, (ErrVal) RFAILED, \
430 "Sap State Invalid."); \
431 RLC_SEND_SAPID_ALARM(_cb,0, LCM_EVENT_UI_INV_EVT, LCM_CAUSE_INV_STATE); \
435 #endif /* ERRCLASS & ERRCLS_INT_PAR */
437 /*******************************************************************************
439 ******************************************************************************/
440 #define RLC_TMR_LEN 10
441 #define RLC_MAX_UM_TMR 1
442 #define RLC_MAX_AM_TMR 3
443 #define RLC_MAX_THPT_TMR 1
446 #define EVENT_RLC_UMUL_REASSEMBLE_TMR 1
447 #define EVENT_RLC_AMUL_REASSEMBLE_TMR 2
448 #define EVENT_RLC_AMUL_STA_PROH_TMR 3
449 #define EVENT_RLC_AMDL_POLL_RETX_TMR 4
450 #define EVENT_RLC_WAIT_BNDCFM 5
451 /* kw005.201 added support for L2 Measurement */
453 #define EVENT_RLC_L2_TMR 6
454 #endif /* LTE_L2_MEAS */
455 #define EVENT_RLC_THROUGHPUT_TMR 7
457 /*******************************************************************************
459 ******************************************************************************/
461 * @def RLC_DBM_GET_RBCB_FROM_UECB
463 * This macro makes _rbCb point to the RB in _ueCb based on the passed
464 * _rbId and _rbType. _rbCb can point to NULLP
466 * @param[in] _rbId RB Id of the RB to be fetched
467 * @param[in] _rbType Type of the RB, SRB or DRB
468 * @param[in] _ueCb Pointer to the UECb for which to get the RB
469 * @param[out] _rbCb Pointer to the found RbCb
472 #define RLC_DBM_GET_RBCB_FROM_UECB(_rbId, _rbType, _ueCb, _rbCb) \
473 (_rbCb) = ((_rbType) == CM_LTE_SRB) ? (_ueCb)->srbCb[(_rbId)] : \
474 (_ueCb)->drbCb[(_rbId)];
476 * @def RLC_DBM_GET_CELL_RBCB
478 * This macro makes _rbCb point to the RB in the _rbCbLst.
479 * _rbCb can point to NULLP
481 * @param[in] _rbId RB Id of the RB to be fetched
482 * @param[in] _rbCbLst Pointer to array of RBCbs
483 * @param[out] _rbCb Pointer to the found RbCb
486 #define RLC_DBM_GET_CELL_RBCB(_rbId, _rbCbLst, _rbCb) \
487 (_rbCb) = (_rbCbLst)[(_rbId)];
489 /*******************************************************************************
491 ******************************************************************************/
492 #define RLC_UMDL rbCb->m.umDl
493 #define RLC_UMUL rbCb->m.umUl
495 /* Sequence Number length defines */
496 #define RLC_UM_CFG_6BIT_SN_LEN 1 /**< UM 6-bit Sequence number length
498 #define RLC_UM_CFG_12BIT_SN_LEN 2 /**< UM 12-bit Sequence number length
501 /* Sequence Number length defines */
502 #define RLC_AM_CFG_12BIT_SN_LEN 1 /**< AM 12-bit Sequence number length
504 #define RLC_AM_CFG_18BIT_SN_LEN 2 /**< AM 18-bit Sequence number length
508 * @def RLC_RMV_MAC_HDR_SZ
510 * If PDU size is greater than 127, MAC header would be 3 bytes else 2 bytes
512 * @param[in,out] _pduSz Size of the pdu
515 #define RLC_RMV_MAC_HDR_SZ(_pduSz) (_pduSz) -= ((_pduSz) > 127) ? 3 : 2;
518 * @def RLC_UM_GET_VALUE
520 * This macro is used to calculate the value of UM state variables used
521 * in comparisons. VR(UH) - UM Window Size is taken as the base modulus.
522 * Returns the modifed value
524 * @param[in] _val Value of the state variable
525 * @param[in] _kwUmUl Um Uplink control block
528 #define RLC_UM_GET_VALUE(_val,_kwUmUl) \
529 (((_val) - ((_kwUmUl).vrUh - (_kwUmUl).umWinSz)) & ((_kwUmUl).modBitMask))
531 /*******************************************************************************
533 ******************************************************************************/
534 #define RLC_AMDL rbCb->m.amDl
535 #define RLC_AMUL rbCb->m.amUl
538 #define RLC_DATA_PDU 1
539 #define RLC_CNTRL_PDU 0
541 #define RLC_FI_FIRST_SEG 0x02
542 #define RLC_FI_LAST_SEG 0x01
543 #define RLC_SI_FIRST_SEG 0x01
544 #define RLC_SI_LAST_SEG 0x02
545 #define RLC_SI_MID_SEG 0x03
547 #define RLC_POLL_SET 0x40 /* 01000000 */
548 #define RLC_POLL_UNSET 0xbf /* 10111111 */
549 #define RLC_MAX_NACK_CNT 100
550 /*RLC_MAX_CNTRL_FIELDS (Maximum size of Status Pdu)
551 * = MAX_NACK_CNT * sizeof(NACK_SN,E1,E2,E3,soStart,soEnd, nackRange)
552 * for 18 bit SN + Fixed Header*/
553 #define RLC_MAX_CNTRL_FIELDS ((RLC_MAX_NACK_CNT * 8) + 3)
555 /* Each LI(Length Indicator) holds approx 1+1/2 byte and some other fields thus keeping Header Size equal to twice of MAX LI */
556 /* 5GNR_RLC: Need to change value of HDRSZ as per number of PDUs going in one datReq */
557 #define RLC_MIN_HDRSZ 1
558 #define RLC_MAX_HDRSZ 5
559 #define RLC_AM_PDU_FIXED_HDRSZ 2
560 #define RLC_AM_PDU_12BIT_SN_HDRSZ 2
561 #define RLC_AM_PDU_18BIT_SN_HDRSZ 3
562 #define RLC_AM_SEG_12BIT_SN_WITH_SO_HDRSZ 4
563 #define RLC_AM_SEG_18BIT_SN_WITH_SO_HDRSZ 5
564 #define RLC_AM_SEG_12BIT_SN_WITHOUT_SO_HDRSZ 2
565 #define RLC_AM_SEG_18BIT_SN_WITHOUT_SO_HDRSZ 3
566 #define RLC_EXTN_HDRSZ 2
567 #define RLC_CNTRL_PDU_FIXED_HDRSZ 3
568 #define RLC_MAC_HDR_SZ2 2
569 #define RLC_MAC_HDR_SZ3 3
570 #define RLC_BYTE_LEN 8
571 #define RLC_2BYTE_LEN 16
573 #define RLC_NACK_E1E2_LEN 12
574 #define RLC_SO_LEN 15
576 #define RLC_CPT_LEN 3
582 #define RLC_SN_LEN 10
583 #define RLC_SN_LEN_12BITS 12
584 #define RLC_SN_LEN_18BITS 18
585 #define RLC_LSF_LEN 1
586 #define RLC_LI_LEN 11
587 #define RLC_STA_PDU_R_BITS_ACKSN_12BITS 7 /* 5GNR : Num Reserved bits in STATUS PDU */
588 #define RLC_STA_PDU_R_BITS_ACKSN_18BITS 1
589 #define RLC_STA_PDU_R_BITS_NACKSN_12BITS 1
590 #define RLC_STA_PDU_R_BITS_NACKSN_18BITS 3
591 #define RLC_NACK_RANGE_LEN 8
592 #define RLC_SO_LEN_5GNR 16
594 #define RLC_DC_POS 0x80
596 #define RLC_POLL_POS 0x40 /* 5GNR */
597 #define RLC_POLL_SHT 6 /* 5GNR */
598 #define RLC_SI_POS 0x30 /* 5GNR */
599 #define RLC_SI_SHT 4 /* 5GNR */
600 #define RLC_SN_POS_12BIT 0x0F
601 #define RLC_SN_POS_18BIT 0x03
602 #define RLC_AM_GET_WIN_SZ(_snLen) ((RLC_AM_CFG_12BIT_SN_LEN == (_snLen)) ? (2048) : (131072)) /* 5GNR */
603 #define RLC_RCV_BUF_BIN_SIZE 512 /* receive buffer size */
604 #define RLC_TX_BUF_BIN_SIZE 512 /* receive buffer size */
606 #define RLC_SDU_LST 1
607 #define RLC_SEG_LST 2
608 #define RLC_RETX_LST 3
609 #define RLC_ALL_BYTES_MISSING 0xffff
611 #define RLC_MAX_PDU_MAP 30 /*!< Maximum PDU Map. */
613 #define RLC_LLIST_FIRST_SDU(lstCp, nod) \
616 /*CM_LLIST_FIRST_NODE(&(lstCp), tmpNode);*/ \
617 /*if (tmpNode != NULLP)*/ \
618 if((tmpNode=cmLListFirst(&lstCp))) \
619 nod = (RlcSdu *)tmpNode->node; \
625 #define RLC_LLIST_FIRST_SEG(lstCp, nod) \
628 /*CM_LLIST_FIRST_NODE(&(lstCp), tmpNode);*/ \
629 /*if (tmpNode != NULLP)*/ \
630 if((tmpNode=cmLListFirst(&lstCp))) \
631 nod = (RlcSeg *)tmpNode->node; \
636 #define RLC_LLIST_FIRST_RETX(lstCp, nod) \
639 /*CM_LLIST_FIRST_NODE(&(lstCp), tmpNode);*/ \
640 /*if (tmpNode != NULLP)*/ \
641 if((tmpNode=cmLListFirst(&lstCp))) \
642 nod = (RlcRetx *)tmpNode->node; \
647 #define RLC_LLIST_NEXT_SDU(lstCp, nod) \
650 /*CM_LLIST_NEXT_NODE(&(lstCp), tmpNode);*/ \
651 /*if (tmpNode != NULLP) */ \
652 if((tmpNode = cmLListNext(&lstCp))) \
653 nod = (RlcSdu *)tmpNode->node; \
659 #define RLC_LLIST_NEXT_SEG(lstCp, nod) \
662 (lstCp).crnt = &((nod)->lstEnt); \
663 /*CM_LLIST_NEXT_NODE(&(lstCp), tmpNode);*/ \
664 /*if (tmpNode != NULLP)*/ \
665 if((tmpNode = cmLListNext(&lstCp))) \
666 nod = (RlcSeg *)tmpNode->node; \
672 #define RLC_LLIST_NEXT_RETX(lstCp, nod) \
675 /*CM_LLIST_NEXT_NODE(&(lstCp), tmpNode);*/ \
676 /*if (tmpNode != NULLP) */ \
677 if ((tmpNode = cmLListNext(&lstCp))) \
678 nod = (RlcRetx *)tmpNode->node; \
684 #define RLC_LLIST_LAST_RETX(lstCp, nod) \
686 CmLList *tempNode = NULLP; \
687 cmLListLast(&lstCp); \
688 tempNode = cmLListCrnt(&lstCp); \
689 if (tempNode != NULLP) \
690 nod = (RlcRetx *)tempNode->node; \
695 #define RLC_LLIST_LAST_SEG(lstCp, nod) \
697 CmLList *tempNode = NULLP; \
698 cmLListLast(&lstCp); \
699 tempNode = cmLListCrnt(&lstCp); \
700 if (tempNode != NULLP) \
701 nod = (RlcSeg *)tempNode->node; \
706 #define RLC_LLIST_LAST_SDU(lstCp, nod) \
708 CmLList *tempNode = NULLP; \
709 cmLListLast(&lstCp); \
710 tempNode = cmLListCrnt(&lstCp); \
711 if (tempNode != NULLP) \
712 nod = (RlcSdu *)tempNode->node; \
717 #define CM_LLIST_INS_AFT_CRNT(lstCp, nod) \
719 CmLList *nodeToIns = &nod->lstEnt;\
720 nodeToIns->node = (PTR) nod;\
721 cmLListInsAfterCrnt(&lstCp, nodeToIns); \
724 #define CM_LLIST_INS_BEF_CRNT(lstCp, nod) \
726 CmLList *nodeToIns = &nod->lstEnt; \
727 nodeToIns->node = (PTR) nod; \
728 cmLListInsCrnt(&lstCp, nodeToIns); \
731 #define RLC_LLIST_DEL_RECBUF(_recBuf) \
733 RlcSeg *_seg = NULLP; \
734 RLC_LLIST_FIRST_SEG(_recBuf->segLst, _seg); \
737 cmLListDelFrm(&_recBuf->segLst, &_seg->lstEnt); \
738 RLC_FREE(_seg, sizeof(RlcSeg)); \
739 RLC_LLIST_NEXT_SEG(_recBuf->segLst, _seg); \
743 #define RLC_UMM_LLIST_FIRST_SEG(lstCp, nod) \
746 if((tmpNode=cmLListFirst(&lstCp))) \
747 nod = (RlcUmSeg *)tmpNode->node; \
750 } /*!< um mode first segment of linked list*/
752 #define RLC_UMM_LLIST_NEXT_SEG(lstCp, nod) \
755 (lstCp).crnt = &((nod)->lstEnt); \
756 if((tmpNode = cmLListNext(&lstCp))) \
757 nod = (RlcUmSeg *)tmpNode->node; \
760 }/*!< next segment in um mode linked list*/
762 #define MODAMT(x, y, z,_snModMask) \
764 y = (x - z) & _snModMask; \
767 #define MODAMR(x, y, z , _snModMask) \
769 y = (x - z) & (_snModMask); \
773 * @def RLC_AM_IS_TRANS_WIN_STALLED
775 * This macro is used to check if the AM transmit window is stalled or not.
776 * The tramist window is stalled when the distance between txNext and txNextAck
777 * is greater than equal to Window Size. Actually it should never be greater
779 * Returns TRUE if the window is stalled else FALSE
781 * @param[in] _amDl AM Downlink control block
784 #define RLC_AM_IS_TRANS_WIN_STALLED(_amDl) \
785 ((((_amDl)->txNext - (_amDl)->txNextAck) & _amDl->snModMask) >= (RLC_AM_GET_WIN_SZ(_amDl->snLen)))
788 #define RLC_AM_TRANS_WIN_SIZE(_amDl) \
789 (((_amDl)->txNext - (_amDl)->txNextAck) & _amDl->snModMask)
792 #define RLC_AM_IS_POLL_BIT_SET(_amDl) \
793 (RLC_AMDL.pollSn == ((RLC_AMDL.txNext - 1) & RLC_AMDL.snModMask))
795 #define RLC_FILL_CNTRL_INFO(cntrlInfo, _val, _len, _idx, _eb)\
797 cntrlInfo.val = _val; \
798 cntrlInfo.len = _len; \
799 cntrlInfo.idx = _idx; \
800 cntrlInfo.emtBits = _eb; \
802 #define RLC_FILL_PREV_IDX(cntrlInfo, _e1Idx, _e1eb, _idx, _eb) \
804 _e1Idx = cntrlInfo.e1Idx; \
805 _e1eb = cntrlInfo.e1eb; \
806 _idx = cntrlInfo.idx; \
807 _eb = cntrlInfo.emtBits; \
810 #define RLC_FILL_HDR_ARGS(hdrInfo, _val, _len) \
812 hdrInfo.val = _val; \
813 hdrInfo.len = _len; \
816 /* kw003.201 - This macro provides the header size other than the */
817 /* fixed header of 2 bytes for each AMD PDU or 4 bytes*/
818 /* for an AM PDU segment */
819 #define RLC_AM_EXTN_HDRSZ(_numLi, _eHdrSz) \
821 if ((_numLi - 1) % 2) \
823 _eHdrSz = ((3 * (_numLi - 2)) >> 1) + 2; \
827 _eHdrSz = (3 * (_numLi - 1)) >> 1; \
831 /* Update poll bit in the buffer */
832 #define RLC_UPD_POLL_BIT(_gCb, _retx, _poll) \
836 if (_poll != _retx->amHdr.p) \
838 /* Get the first byte of the buffer */ \
839 SRemPreMsg((Data *)&fHdr, _retx->seg); \
842 fHdr = fHdr | RLC_POLL_SET; \
846 fHdr = fHdr & RLC_POLL_UNSET; \
848 /* Concatenated updated hdr to the mBuf */ \
849 SAddPreMsg ((Data)fHdr, _retx->seg); \
851 /* Update poll bit in the hdrInfo */ \
852 _retx->amHdr.p = _poll; \
855 #define RLC_AM_ELIMINATE_EXTN_HDR(_pduSz, _sduSz, _numLi) \
857 if ( (_pduSz > _sduSz) && (_sduSz < 2048) ) \
859 _pduSz -= (_numLi % 2) ? 1 : 2; \
863 * @def RLC_AM_CHK_SN_WITHIN_RECV_WINDOW
865 * This macro is used to check if a Sequence Number falls within the AM
866 * reception window or not.
867 * The condition is VR(R) <= SN < VR(MR), which are subtracting the base
868 * modulus becomes 0 <= (SN - VR(R)) % SNLen < (VR(MR) - VR(R)) % SnLen
869 * NOTE: Careful with the parantheses
871 * Returns TRUE if within the window; FALSE otherwise
873 * @param[in] _sn The sequence number to be checked
874 * @param[in] _amUl AM Uplink control block
877 #define RLC_AM_CHK_SN_WITHIN_RECV_WINDOW(_sn, _amUl) \
878 ((((_sn) - (_amUl->rxNext)) & (_amUl->snModMask)) < (((_amUl->vrMr) - (_amUl->rxNext)) & (_amUl->snModMask)))
880 #define RLC_POWER(x, y) x << (y-1);
883 #define rlcCpyMsg(_cb,x, y) \
884 (SAddMsgRef((x), RLC_GET_MEM_REGION(_cb), RLC_GET_MEM_POOL(_cb), (y)))
886 /* L2 optimization for mUe/Tti: Removing dup buf*/
887 #define rlcCpyMsg(_cb,x, y) \
888 (SIncMsgRef((x), RLC_GET_MEM_REGION(_cb), RLC_GET_MEM_POOL(_cb), (y)))
891 // printf("Copy Msg %x \n",x);
893 /*******************************************************************************
895 ******************************************************************************/
896 #define RLC_DBG_SUB_MASK DBGMASK_MI /**< Use for sub-mask */
897 #define RLC_DBGMASK_DETAIL (RLC_DBG_SUB_MASK << 0) /**< Parameters, It will give
899 #define RLC_DBGMASK_BRIEF (RLC_DBG_SUB_MASK << 1) /**< Info, It will give info at
900 entry and exit places along
901 with certain state changes */
902 #define RLC_DBGMASK_ERROR (RLC_DBG_SUB_MASK << 2) /**< Error information */
903 #define RLC_DBGMASK_FATAL (RLC_DBG_SUB_MASK << 3) /**< FATAL errors like memory
904 resource failure etc., */
906 #define RLC_DBG_MDL_MASK (RLC_DBG_SUB_MASK << 4)
908 #define RLC_DBGMASK_TM (RLC_DBG_MDL_MASK << 0) /**< TM */
909 #define RLC_DBGMASK_UM (RLC_DBG_MDL_MASK << 1) /**< UM */
910 #define RLC_DBGMASK_AM (RLC_DBG_MDL_MASK << 2) /**< AM */
911 #define RLC_DBGMASK_DL (RLC_DBG_MDL_MASK << 3) /**< DL */
912 #define RLC_DBGMASK_UL (RLC_DBG_MDL_MASK << 4) /**< UL */
913 #define RLC_DBGMASK_CFG (RLC_DBG_MDL_MASK << 5) /**< CFG */
914 #define RLC_DBGMASK_LMM (RLC_DBG_MDL_MASK << 6) /**< LMM */
915 #define RLC_DBGMASK_INF (RLC_DBG_MDL_MASK << 7) /**< UI, LI */
916 #define RLC_DBGMASK_DUT (RLC_DBG_MDL_MASK << 8) /**< DBM, UTL, TMR */
917 #define RLC_DBGMASK_MBUF_PRNT (RLC_DBG_MDL_MASK << 9) /**< MBUF, useful in
920 #define RLC_DBGMASK_MEM_INFO (RLC_DBG_MDL_MASK << 10) /**< Print SSI memory
922 #define RLC_DBGMASK_UDX (RLC_DBG_MDL_MASK << 11) /**< UDX interface */
925 #define RLC_PRNT_BORDER \
928 RLC_PRNT((_kwPBuf, "\n==========================\n")); \
931 #define RLC_PRNT_HLINE(_cb,_pMsg) \
933 sprintf((_cb)->init.prntBuf, "[RLC_LAYER: %s:%d]::", __FILE__, __LINE__); \
934 SPrint((_cb)->init.prntBuf); \
935 RLC_PRNT_TSTAMP(_cb); \
936 sprintf((_cb)->init.prntBuf, _pMsg); \
937 SPrint((_cb)->init.prntBuf); \
940 #define RLC_PRNT(_cb,_prntbuf) \
943 SPrint(_cb->init.prntBuf); \
946 #define RLC_PRINT_TO_BUFFER(_cb,...) \
948 snprintf((_cb)->init.prntBuf, PRNTSZE, "[%s]::", __func__); \
949 SPrint((_cb)->init.prntBuf); \
950 snprintf(_cb->init.prntBuf, PRNTSZE,__VA_ARGS__); \
951 SPrint(_cb->init.prntBuf); \
954 #define RLC_PRNT_TSTAMP(_cb) \
958 memset((&dt), 0, sizeof(DateTime)); \
960 sprintf(_buf, "date: %02d/%02d/%04d time: %02d:%02d:%02d", \
961 (int)dt.month,(int)dt.day,(int)dt.year + 1900, \
962 (int)dt.hour,(int)dt.min,(int)dt.sec); \
963 RLC_PRNT(_cb,(_cb->init.prntBuf,("[%s]", _buf))); \
966 #define RLC_PRNT_MBUF(_cb,_mBufPtr) \
969 if(_cb->init.dbgMask & (RLC_DBGMASK_MBUF_PRNT)) \
971 RLC_PRNT_HLINE(_cb,("\nMessage Buffer Contents:\n")); \
972 SPrntMsg ((Buffer *)_mBufPtr, 0, 0); \
976 #define RLC_PRNT_MEMINFO(_cb) \
980 if(_cb->init.dbgMask & (RLC_DBGMASK_MEM_INFO)) \
982 RLC_PRNT_HLINE(_cb,("\nMemory Information:\n")); \
983 SRegInfoShow(0, &_memInfo); \
987 #define RLCDBGP_INTERNAL(_cb,_mask,...) \
990 if (!((_cb->init.dbgMask & _mask) ^ _mask)) \
992 RLC_PRINT_TO_BUFFER(_cb, __VA_ARGS__); \
996 #define RLCDBGP_ERROR(_cb, ...) \
997 RLCDBGP_INTERNAL(_cb,(RLC_DBGMASK_ERROR | RLC_MODULE),__VA_ARGS__)
999 #define RLCDBGP_DETAIL(_cb, ...) \
1000 RLCDBGP_INTERNAL(_cb,(RLC_DBGMASK_DETAIL | RLC_MODULE),__VA_ARGS__)
1002 #define RLCDBGP_BRIEF(_cb, ...) \
1003 RLCDBGP_INTERNAL(_cb,(RLC_DBGMASK_BRIEF | RLC_MODULE),__VA_ARGS__)
1006 #define RLC_PRNT_HLINE(_cb,_pMsg)
1007 #define RLC_PRNT(_cb,_prntbuf)
1008 #define RLC_PRNT_TSTAMP(_cb)
1009 #define RLC_PRNT_MBUF(_cb,_mBufPtr)
1010 #define RLC_PRNT_MEMINFO(_cb)
1011 #define RLCDBGP(_cb,_mask, _arg)
1012 #define RLCDBGP_ERROR(_cb, ...)
1013 #define RLCDBGP_DETAIL(_cb, ...)
1014 #define RLCDBGP_BRIEF(_cb, ...)
1017 /*******************************************************************************
1019 ******************************************************************************/
1020 #define RLC_LMM_RB_STS_INC(_cb) (_cb)->genSts.numOfRb++;
1022 #define RLC_LMM_RB_STS_DEC(_cb) (_cb)->genSts.numOfRb--;
1024 #if defined(SS_MULTICORE_SUPPORT) && defined(SS_M_PROTO_REGION)
1025 #define RLC_FILL_SAP_HELPER(_Sap, _cfg, _gCb)\
1027 _Sap->pst.selector = _cfg->selector; \
1028 _Sap->pst.route = _cfg->route; \
1029 _Sap->pst.prior = _cfg->priority; \
1030 _Sap->pst.region = _gCb->init.region;\
1031 _Sap->pst.pool = _gCb->init.pool;\
1032 _Sap->pst.dstProcId = _cfg->procId; \
1033 _Sap->pst.dstEnt = _cfg->ent; \
1034 _Sap->pst.dstInst = _cfg->inst; \
1035 _Sap->pst.srcProcId = _gCb->init.procId; \
1036 _Sap->pst.srcEnt = _gCb->init.ent; \
1037 _Sap->pst.srcInst = _gCb->init.inst; \
1038 _Sap->pst.event = EVTNONE; \
1039 _Sap->spId = _cfg->sapId; \
1040 _Sap->state = RLC_SAP_CFG; \
1042 #else /* defined(SS_MULTICORE_SUPPORT) && defined(SS_M_PROTO_REGION) */
1043 #define RLC_FILL_SAP_HELPER(_Sap, _cfg, _gCb)\
1045 _Sap->pst.selector = _cfg->selector; \
1046 _Sap->pst.route = _cfg->route; \
1047 _Sap->pst.prior = _cfg->priority; \
1048 _Sap->pst.region = _cfg->mem.region;\
1049 _Sap->pst.pool = _cfg->mem.pool;\
1050 _Sap->pst.dstProcId = _cfg->procId;\
1051 _Sap->pst.dstEnt = _cfg->ent;\
1052 _Sap->pst.dstInst = _cfg->inst;\
1053 _Sap->pst.srcProcId = _gCb->init.procId;\
1054 _Sap->pst.srcEnt = _gCb->init.ent;\
1055 _Sap->pst.srcInst = _gCb->init.inst;\
1056 _Sap->pst.event = EVTNONE;\
1057 _Sap->spId = _cfg->sapId;\
1058 _Sap->state = RLC_SAP_CFG;\
1062 /*******************************************************************************
1064 ******************************************************************************/
1065 #define RLC_GET_DL_SAPCB(_cb, _rbCb) (_cb->u.dlCb->udxDlSap + _rbCb->udxSapId)
1066 #define RLC_GET_UDX_SAP(_cb) (_cb->u.ulCb->udxUlSap)
1068 /* kw005.201 added support for L2 Measurement */
1070 #define RLC_L2_MAX_TIMERS 1
1071 #define RLC_QCI_LIST_BUCKET_SIZE 10
1072 #define RLC_TB_LIST_BUCKET_SIZE 10
1073 #define RLC_MAX_L2MEAS_EVT 10
1074 /* L2 Measurement index to be used in rbCb to store measData */
1075 #define RLC_L2MEAS_ACT_UE 0
1076 #define RLC_L2MEAS_DL_DELAY 1
1077 #define RLC_L2MEAS_DL_DISC 2
1078 #define RLC_L2MEAS_UU_LOSS 3
1079 #define RLC_L2MEAS_DL_IP 4
1080 #define RLC_L2MEAS_UL_IP 5
1081 #endif /* LTE_L2_MEAS */
1083 #define RLC_RDWR_LOCK(_lockPtr)
1084 #define RLC_RDWR_UNLOCK(_lockPtr)
1085 #define RLC_TIME_DIFF(t1,t2) \
1086 (t1<t2 ? ((0xffffffff - t2) + t1 ): (t1 - t2))
1088 #endif /* __KWH__ */
1090 /********************************************************************30**
1093 **********************************************************************/