diff src/g23m-gprs/llc/llc.h @ 1:fa8dc04885d8

src/g23m-*: import from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 16 Oct 2020 06:25:50 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/g23m-gprs/llc/llc.h	Fri Oct 16 06:25:50 2020 +0000
@@ -0,0 +1,2038 @@
+/*
++-----------------------------------------------------------------------------
+|  Project :
+|  Modul   :
++-----------------------------------------------------------------------------
+|  Copyright 2002 Texas Instruments Berlin, AG
+|                 All rights reserved.
+|
+|                 This file is confidential and a trade secret of Texas
+|                 Instruments Berlin, AG
+|                 The receipt of or possession of this file does not convey
+|                 any rights to reproduce or disclose its contents or to
+|                 manufacture, use, or sell anything it may describe, in
+|                 whole, or in part, without the specific written consent of
+|                 Texas Instruments Berlin, AG.
++-----------------------------------------------------------------------------
+|  Purpose :  Definitions for the Protocol Stack Entity
+|             Logical Link Control (LLC)
++-----------------------------------------------------------------------------
+*/
+
+#ifndef LLC_H
+#define LLC_H
+
+/*#ifdef  FF_EGPRS
+#ifndef LLC_EDGE
+#define LLC_EDGE
+#endif  *//*LLC_EDGE*/
+/*#endif */  /*FF_EGPRS*/
+
+
+/*
+ * Shift of constants from SAPs LL and LLGMM to PS_include are handled here.
+ */
+#ifdef LL_2to1
+
+
+#ifndef DTACS_MOBILITY_MANAGEMENT
+#define DTACS_MOBILITY_MANAGEMENT GRLC_MOBILITY_MANAGEMENT
+#endif
+#ifndef GRR_DTACS_DEFGRR_DTACS_DEF
+#define GRR_DTACS_DEF GRLC_DTACS_DEF
+#endif
+#ifndef GRR_DTACS_MOBILITY_MANAGEMENT
+#define GRR_DTACS_MOBILITY_MANAGEMENT GRLC_DTACS_MOBILITY_MANAGEMENT
+#endif
+
+
+#ifndef LLC_MAX_CNF
+#define LLC_MAX_CNF LL_MAX_CNF
+#endif
+#ifndef LLC_MAX_L3_XID_LEN
+#define LLC_MAX_L3_XID_LEN LL_MAX_L3_XID_LEN
+#endif
+
+
+
+#ifndef LLGMM_ERRCS_ACK_NO_PEER_RES_REEST
+#define LLGMM_ERRCS_ACK_NO_PEER_RES_REEST CAUSE_LLC_ACK_NO_PEER_RES_REEST
+#endif
+#ifndef LLGMM_ERRCS_DISC_NO_PEER_RES
+#define LLGMM_ERRCS_DISC_NO_PEER_RES CAUSE_LLC_DISC_NO_PEER_RES
+#endif
+#ifndef LLGMM_ERRCS_DM1_RECEIVED
+#define LLGMM_ERRCS_DM1_RECEIVED CAUSE_LLC_DM1_RECEIVED
+#endif
+#ifndef LLGMM_ERRCS_DM1_RECEIVED_REEST
+#define LLGMM_ERRCS_DM1_RECEIVED_REEST CAUSE_LLC_DM1_RECEIVED_REEST
+#endif
+#ifndef LLGMM_ERRCS_FRMR_COND
+#define LLGMM_ERRCS_FRMR_COND CAUSE_LLC_FRMR_COND
+#endif
+#ifndef LLGMM_ERRCS_FRMR_COND_REEST
+#define LLGMM_ERRCS_FRMR_COND_REEST CAUSE_LLC_FRMR_COND_REEST
+#endif
+#ifndef LLGMM_ERRCS_FRMR_RECEIVED
+#define LLGMM_ERRCS_FRMR_RECEIVED CAUSE_LLC_FRMR_RECEIVED
+#endif
+#ifndef LLGMM_ERRCS_L3_REEST
+#define LLGMM_ERRCS_L3_REEST CAUSE_LLC_L3_REEST
+#endif
+#ifndef LLGMM_ERRCS_MULT_ASS_TLLI
+#define LLGMM_ERRCS_MULT_ASS_TLLI CAUSE_LLC_MULT_ASS_TLLI
+#endif
+#ifndef LLGMM_ERRCS_NO_PEER_RES
+#define LLGMM_ERRCS_NO_PEER_RES CAUSE_LLC_NO_PEER_RES
+#endif
+#ifndef LLGMM_ERRCS_PEER_BUSY_REEST
+#define LLGMM_ERRCS_PEER_BUSY_REEST CAUSE_LLC_PEER_BUSY_REEST
+#endif
+#ifndef LLGMM_ERRCS_PEER_REEST
+#define LLGMM_ERRCS_PEER_REEST CAUSE_LLC_PEER_REEST
+#endif
+#ifndef LLGMM_ERRCS_SABM_NO_PEER_RES
+#define LLGMM_ERRCS_SABM_NO_PEER_RES CAUSE_LLC_SABM_NO_PEER_RES
+#endif
+#ifndef LLGMM_ERRCS_XID_NO_PEER_RE
+#define LLGMM_ERRCS_XID_NO_PEER_RES CAUSE_LLC_XID_NO_PEER_RES
+#endif
+#ifndef LLGMM_ERRCS_DM0_RECEIVED_REEST
+#define LLGMM_ERRCS_DM0_RECEIVED_REEST CAUSE_LLC_DM0_RECEIVED_REEST
+#endif
+
+
+#ifndef LL_ERRCS_NO_PEER_RES
+#define LL_ERRCS_NO_PEER_RES CAUSE_LLC_NO_PEER_RES
+#endif
+#ifndef LL_ERRCS_INVALID_XID
+#define LL_ERRCS_INVALID_XID CAUSE_LLC_INVALID_XID
+#endif
+
+#ifndef LL_PEAK_SUB
+#define LL_PEAK_SUB PS_PEAK_SUB
+#endif
+#ifndef LL_RELCS_DM_RECEIVED
+#define LL_RELCS_DM_RECEIVED CAUSE_LLC_DM_RECEIVED
+#endif
+#ifndef LL_RELCS_INVALID_XID
+#define LL_RELCS_INVALID_XID CAUSE_LLC_INVALID_XID
+#endif
+#ifndef LL_RELCS_NORMAL
+#define LL_RELCS_NORMAL CAUSE_LLC_NORMAL_REL
+#endif
+#ifndef LL_RELCS_NO_PEER_RES
+#define LL_RELCS_NO_PEER_RES CAUSE_LLC_NO_PEER_RES
+#endif
+
+#ifndef LL_DELAY_SUB
+#define LL_DELAY_SUB PS_DELAY_SUB
+#endif
+#ifndef LL_MEAN_SUB
+#define LL_MEAN_SUB PS_MEAN_SUB
+#endif
+#ifndef LL_NO_REL
+#define LL_NO_REL PS_NO_REL
+#endif
+#ifndef LL_PRECED_SUB
+#define LL_PRECED_SUB PS_PRECED_SUB
+#endif
+#ifndef LL_RLC_PROT
+#define LL_RLC_PROT PS_RLC_PROT
+#endif
+
+#ifndef LL_SAPI_1
+#define LL_SAPI_1 PS_SAPI_1
+#endif
+#ifndef LL_SAPI_3
+#define LL_SAPI_3 PS_SAPI_3
+#endif
+#ifndef LL_SAPI_5
+#define LL_SAPI_5 PS_SAPI_5
+#endif
+#ifndef LL_SAPI_7
+#define LL_SAPI_7 PS_SAPI_7
+#endif
+#ifndef LL_SAPI_9
+#define LL_SAPI_9 PS_SAPI_9
+#endif
+#ifndef LL_SAPI_11
+#define LL_SAPI_11 PS_SAPI_11
+#endif
+#ifndef LL_RADIO_PRIO_1
+#define LL_RADIO_PRIO_1 PS_RADIO_PRIO_1
+#endif
+#ifndef LL_TLLI_INVALID
+#define LL_TLLI_INVALID PS_TLLI_INVALID
+#endif
+
+#ifndef GRLC_RADIO_PRIO_1
+#define GRLC_RADIO_PRIO_1 PS_RADIO_PRIO_1
+#endif
+#ifndef GRLC_PEAK_SUB
+#define GRLC_PEAK_SUB PS_PEAK_SUB
+#endif
+
+#ifndef T_desc_list3
+#define T_desc_list3 T_LL_desc_list3
+#endif
+
+#endif /* LL_2to1 */
+
+
+
+/* --------------------------------------------------------------------------------- */
+
+/* remove traces */
+#ifndef _SIMULATION_
+#ifdef GET_STATE
+  #undef GET_STATE
+  #define GET_STATE(P)        (ENTITY_DATA->P state)
+#endif
+#endif /* _SIMULATION_ */
+/* --------------------------------------------------------------------------------- */
+#ifdef TRACE_EVE
+  #define TRACE_0_INFO(s)                 TRACE_EVENT   ("Info: " s)
+  #define TRACE_1_INFO(s,p1)              TRACE_EVENT_P1("Info: " s,p1)
+  #define TRACE_2_INFO(s,p1,p2)           TRACE_EVENT_P2("Info: " s,p1,p2)
+  #define TRACE_3_INFO(s,p1,p2,p3)        TRACE_EVENT_P3("Info: " s,p1,p2,p3)
+  #define TRACE_4_INFO(s,p1,p2,p3,p4)     TRACE_EVENT_P4("Info: " s,p1,p2,p3,p4)
+#else
+  #define TRACE_0_INFO(s)
+  #define TRACE_1_INFO(s,p1)
+  #define TRACE_2_INFO(s,p1,p2)
+  #define TRACE_3_INFO(s,p1,p2,p3)
+  #define TRACE_4_INFO(s,p1,p2,p3,p4)
+#endif
+
+#ifdef TRACE_PRIM
+  #define TRACE_0_PARA(s)                 vsi_o_ttrace(VSI_CALLER TC_PRIM, "IPar: " s)
+  #define TRACE_1_PARA(s,p1)              vsi_o_ttrace(VSI_CALLER TC_PRIM, "IPar: " s,p1)
+  #define TRACE_2_PARA(s,p1,p2)           vsi_o_ttrace(VSI_CALLER TC_PRIM, "IPar: " s,p1,p2)
+  #define TRACE_3_PARA(s,p1,p2,p3)        vsi_o_ttrace(VSI_CALLER TC_PRIM, "IPar: " s,p1,p2,p3)
+  #define TRACE_4_PARA(s,p1,p2,p3,p4)     vsi_o_ttrace(VSI_CALLER TC_PRIM, "IPar: " s,p1,p2,p3,p4)
+
+  #define TRACE_0_OUT_PARA(s)             vsi_o_ttrace(VSI_CALLER TC_PRIM, "OPar: " s)
+  #define TRACE_1_OUT_PARA(s,p1)          vsi_o_ttrace(VSI_CALLER TC_PRIM, "OPar: " s,p1)
+  #define TRACE_2_OUT_PARA(s,p1,p2)       vsi_o_ttrace(VSI_CALLER TC_PRIM, "OPar: " s,p1,p2)
+  #define TRACE_3_OUT_PARA(s,p1,p2,p3)    vsi_o_ttrace(VSI_CALLER TC_PRIM, "OPar: " s,p1,p2,p3)
+  #define TRACE_4_OUT_PARA(s,p1,p2,p3,p4) vsi_o_ttrace(VSI_CALLER TC_PRIM, "OPar: " s,p1,p2,p3,p4)
+
+  #define TRACE_PRIM_FROM(s)              vsi_o_ttrace(VSI_CALLER TC_PRIM, "Pdir: " s)
+  #define TRACE_PRIM_TO(s)                vsi_o_ttrace(VSI_CALLER TC_PRIM, "Pdir: " s)
+#else
+  #define TRACE_0_PARA(s)
+  #define TRACE_1_PARA(s,p1)
+  #define TRACE_2_PARA(s,p1,p2)
+  #define TRACE_3_PARA(s,p1,p2,p3)
+  #define TRACE_4_PARA(s,p1,p2,p3,p4)
+
+  #define TRACE_0_OUT_PARA(s)
+  #define TRACE_1_OUT_PARA(s,p1)
+  #define TRACE_2_OUT_PARA(s,p1,p2)
+  #define TRACE_3_OUT_PARA(s,p1,p2,p3)
+  #define TRACE_4_OUT_PARA(s,p1,p2,p3,p4)
+
+  #define TRACE_PRIM_FROM(s)
+  #define TRACE_PRIM_TO(s)
+#endif
+/* --------------------------------------------------------------------------------- */
+
+/* 
+ * The following macro is similar to PFREE_DESC2. Instead of doing
+ * a PFREE(P) it does a MFREE(p). This macro is used to free CCI primitives
+ * which are removed from CCI SAP and added into this header file.
+ */
+#define MFREE_PRIM_DESC2(p) { MFREE_DESC2 ((p)->desc_list2.first);      \
+                              MFREE ((p));                              \
+                             }
+
+/* 
+ * The following macro is similar to PFREE_DESC. Instead of doing
+ * a PFREE(P) it does a MFREE(p). This macro is used to free CCI primitives
+ * which are removed from CCI SAP and added into this header file.
+ */
+#define MFREE_PRIM_DESC(p) { MFREE_DESC ((p)->desc_list.first);      \
+                             MFREE ((p));                            \
+                           }
+
+/*
+ * defines the user of the vsi interface
+ */
+#define VSI_CALLER            LLC_handle,
+#define VSI_CALLER_SINGLE     LLC_handle
+
+/*
+ * Macros
+ */
+
+/*
+ * Switch all LLC services with multiple incarnations to use the incarnation
+ * for the given SAPI. Current sapi is stored and all LLC layer parameters
+ * with multiple incarnations are switched to use the incarnation for the
+ * given SAPI.
+ */
+#define SWITCH_LLC(s)         llc_data->current_sapi = s;                     \
+                              SWITCH_PARAM (iov_i,     IMAP(s));              \
+                              SWITCH_PARAM (n200,     UIMAP(s));              \
+                              SWITCH_PARAM (n201_u,   UIMAP(s));              \
+                              SWITCH_PARAM (n201_i,    IMAP(s));              \
+                              SWITCH_PARAM (md,        IMAP(s));              \
+                              SWITCH_PARAM (mu,        IMAP(s));              \
+                              SWITCH_PARAM (kd,        IMAP(s));              \
+                              SWITCH_PARAM (ku,        IMAP(s));              \
+                              SWITCH_PARAM (requested_l3_xid, IMAP(s));       \
+                              SWITCH_SERVICE (llc, sapi,  UIMAP(s));          \
+                              SWITCH_SERVICE (llc, u,     UIMAP(s));          \
+                              SWITCH_SERVICE (llc, itx,    IMAP(s));          \
+                              SWITCH_SERVICE (llc, irx,    IMAP(s));          \
+                              SWITCH_SERVICE (llc, uitx,  UIMAP(s));          \
+                              SWITCH_SERVICE (llc, uirx,  UIMAP(s));          \
+                              SWITCH_SERVICE (llc, t200,  UIMAP(s));
+
+/*
+ * Switch service s of entity e to use incarnation i.
+ */
+#define SWITCH_SERVICE(e,s,i) e##_data->##s = &(##e##_data->##s##_base[i]);
+
+/*
+ * Switch LLC layer parameter p to incarnation i.
+ */
+#define SWITCH_PARAM(p,i) llc_data->##p = &(llc_data->##p##_base[i]);
+
+
+/*
+ * Map SAPI to incarnation, for either acknowledged (4 incarnations) or
+ * unacknowledged operation (6 incarnations)
+ */
+#ifdef LL_2to1
+#define IMAP(s)               (s == PS_SAPI_3 ? 0 :                           \
+                               s == PS_SAPI_5 ? 1 :                           \
+                               s == PS_SAPI_9 ? 2 :                           \
+                               s == PS_SAPI_11? 3 : 0)
+
+#define UIMAP(s)              (s == PS_SAPI_1 ? 0 :                           \
+                               s == PS_SAPI_3 ? 1 :                           \
+                               s == PS_SAPI_5 ? 2 :                           \
+                               s == PS_SAPI_7 ? 3 :                           \
+                               s == PS_SAPI_9 ? 4 :                           \
+                               s == PS_SAPI_11? 5 : 0)
+#else
+#define IMAP(s)               (s == LL_SAPI_3 ? 0 :                           \
+                               s == LL_SAPI_5 ? 1 :                           \
+                               s == LL_SAPI_9 ? 2 :                           \
+                               s == LL_SAPI_11? 3 : 0)
+
+#define UIMAP(s)              (s == LL_SAPI_1 ? 0 :                           \
+                               s == LL_SAPI_3 ? 1 :                           \
+                               s == LL_SAPI_5 ? 2 :                           \
+                               s == LL_SAPI_7 ? 3 :                           \
+                               s == LL_SAPI_9 ? 4 :                           \
+                               s == LL_SAPI_11? 5 : 0)
+#endif
+
+
+/*
+ * Add octet size of XID parameter P to variable V if the parameter is tagged.
+ */
+#define ADD_IF_TAGGED(V,P)                                                    \
+  if (llc_data->u->xid_tag & (0x00000001L << P))                              \
+  {                                                                           \
+    V += P##_LEN + P##_HDR_LEN;                                               \
+  }
+
+/*
+ * Tag XID parameter if requested to negotiate
+ */
+#define TAG_IF_REQUESTED(V,P)                                                 \
+  if (llc_data->##V##valid)                                                   \
+  {                                                                           \
+    llc_data->u->xid_tag |= (0x00000001L << P);                               \
+  }
+
+/*
+ * Tag XID parameter if requested to negotiate and sense of negotiation fits
+ */
+#define TAG_IF_REQUESTED_RSP(S,V,P)                                           \
+  if (llc_data->u->requested_xid.##V##.valid)                                 \
+  {                                                                           \
+    if (llc_data->decoded_xid.##V##.valid)                                    \
+    {                                                                         \
+      /* simple add parameter. Sense of negotiation is already checked */     \
+      llc_data->u->xid_tag |= (0x00000001L << P);                             \
+    }                                                                         \
+    else                                                                      \
+    {                                                                         \
+      /* Sense of negotiation compared with current values */                 \
+      if (llc_data->u->requested_xid.##V##.value  S  *(llc_data->##V))        \
+      {                                                                       \
+        llc_data->u->xid_tag |= (0x00000001L << P);                           \
+      }                                                                       \
+    }                                                                         \
+  }
+
+
+/*
+ * Timer values are negotiated in units of 0.1 seconds but internally stored
+ * in milliseconds. Therefore a conversion must be done with each XID
+ * negotiation of timer values.
+ */
+#define XID_TIMER_CONVERSION  100
+
+#define XID2INT(l)            (l * XID_TIMER_CONVERSION)
+#define INT2XID(l)            (l / XID_TIMER_CONVERSION)
+
+/*
+ * Timer start- and stop macros for LLC
+ */
+#define TIMERSTART(t,d)       itx_##t##_start((d))
+#define TIMERSTOP(t)          itx_##t##_stop()
+
+
+/*
+ * Number of service incarnations (LLME, TX, and RX have only one incarnation)
+ */
+#define ACKNOWLEDGED_INC      4
+#define UNACKNOWLEDGED_INC    6
+#define MAX_SAPI_INC          6
+
+
+#define U_NUM_INC             UNACKNOWLEDGED_INC
+
+#define ITX_NUM_INC           ACKNOWLEDGED_INC
+#define IRX_NUM_INC           ACKNOWLEDGED_INC
+
+#define UITX_NUM_INC          UNACKNOWLEDGED_INC
+#define UIRX_NUM_INC          UNACKNOWLEDGED_INC
+
+#define T200_NUM_INC          UNACKNOWLEDGED_INC
+#define T201_NUM_INC          ACKNOWLEDGED_INC
+
+
+/*
+ * Constants
+ */
+
+/*
+ * Value constants for attached_counter
+ */
+#define CCI_NO_ATTACHE                 (0x0)      /* no entity/service is attached to the primitive */
+/*
+ * Value constants for fcs_check
+ */
+#define CCI_FCS_PASSED                 (0x0)      /* FCS check has been successfully passed */
+#define CCI_FCS_FAILED                 (0x1)      /* FCS check has been failed      */
+/*
+ * Value constants for pm
+ */
+#define CCI_PM_UNPROTECTED             (0x0)      /* FCS covers frame header and information fields */
+#define CCI_PM_PROTECTED               (0x1)      /* FCS covers frame header field and first N202 octets of information field */
+/*
+ * Value constants for ciphering_algorithm
+ */
+#define CCI_CIPHER_NO_ALGORITHM        (0x0)      /* frame shall not be ciphered    */
+#define CCI_CIPHER_GPRS_A5_1           (0x1)      /* frame shall be ciphered using algorithm GPRS A5/1 */
+#define CCI_CIPHER_GPRS_A5_2           (0x2)      /* frame shall be ciphered using algorithm GPRS A5/2 */
+/*
+ * Value constants for direction
+ */
+#define CCI_DIRECTION_UPLINK           (0x0)      /* direction of LLC frame transmission is MS to SGSN */
+#define CCI_DIRECTION_DOWNLINK         (0x1)      /* direction of LLC frame transmission is SGSN to MS */
+
+
+
+/*
+ * Bitoffset for encoding/decoding
+ */
+#define ENCODE_OFFSET         0
+
+
+/*
+ * C/R bit
+ */
+#define SGSN_COMMAND          1
+#define SGSN_RESPONSE         0
+#define MS_COMMAND            0
+#define MS_RESPONSE           1
+
+/*
+ * Size definitions for common U frames (in octets and in bits).
+ * Define only the header of the frame. FCS_SIZE will be added when the FCS
+ * is calculated!
+ */
+#define U_HDR_SIZE            2
+#define U_HDR_SIZE_BITS       (U_HDR_SIZE * 8)
+#define FCS_SIZE              3
+#define FCS_SIZE_BITS         (FCS_SIZE * 8)
+
+#ifdef REL99 
+#define U_NULL_SIZE           (U_HDR_SIZE)
+#define U_NULL_SIZE_BITS      (U_NULL_SIZE * 8)
+#endif /* REL99 */
+
+#define U_DISC_SIZE           (U_HDR_SIZE)
+#define U_DISC_SIZE_BITS      (U_DISC_SIZE * 8)
+
+#define U_DM_SIZE             (U_HDR_SIZE)
+#define U_DM_SIZE_BITS        (U_DM_SIZE * 8)
+
+#define U_FRMR_INFO_SIZE      10
+#define U_FRMR_SIZE           (U_HDR_SIZE + U_FRMR_INFO_SIZE)
+#define U_FRMR_SIZE_BITS      (U_FRMR_SIZE * 8)
+
+/*
+ * Masks and IDs for the different frame formats. Bitwise AND *_MASK with
+ * the first octet of the control field must result in *_ID.
+ */
+#define I_FRAME_MASK          0x80
+#define S_FRAME_MASK          0xC0
+#define UI_FRAME_MASK         0xE0
+#define U_FRAME_MASK          0xE0
+
+#define I_FRAME_ID            0x00
+#define S_FRAME_ID            0x80
+#define UI_FRAME_ID           0xC0
+#define U_FRAME_ID            0xE0
+
+/*
+ * Number of octets that must be contained in a valid control field of a frame.
+ */
+#define I_CTRL_OCTETS         3
+#define S_CTRL_OCTETS         2
+#define UI_CTRL_OCTETS        2
+#define U_CTRL_OCTETS         1
+
+/*
+ * Minimum number of octets that must be contained in a frame to access
+ * the complete control field.
+ */
+#define CTRL_MIN_OCTETS       2
+#define I_CTRL_MIN_OCTETS     4
+#define S_CTRL_MIN_OCTETS     3
+#define UI_CTRL_MIN_OCTETS    3
+#define U_CTRL_MIN_OCTETS     2
+
+/*
+ * Minimum number of octets that must be contained in a valid frame, excluding
+ * the FCS field.
+ */
+#define I_FRAME_MIN_OCTETS_WITHOUT_FCS  5
+#define S_FRAME_MIN_OCTETS_WITHOUT_FCS  3
+#define UI_FRAME_MIN_OCTETS_WITHOUT_FCS 3
+#define U_FRAME_MIN_OCTETS_WITHOUT_FCS  2
+
+/*
+ * Minimum number of octets that must be contained in a valid frame.
+ */
+#define FRAME_MIN_OCTETS      5
+#define I_FRAME_MIN_OCTETS    8
+#define S_FRAME_MIN_OCTETS    6
+#define UI_FRAME_MIN_OCTETS   6
+#define U_FRAME_MIN_OCTETS    5
+
+#define U_FRAME_FRMR_INFO_OCTETS  U_FRMR_INFO_SIZE
+
+#define S_FRAME_SACK_MIN_CTRL_OCTETS  1
+#define S_FRAME_SACK_MAX_CTRL_OCTETS  32
+
+/*
+ * I frame and S frame commands/responses (bits S1, S2).
+ */
+#define I_FRAME_RR            0x00
+#define I_FRAME_ACK           0x01
+#define I_FRAME_RNR           0x02
+#define I_FRAME_SACK          0x03
+
+/*
+ * U frame commands/responses (bits M4, M3, M2, M1).
+ */
+#ifdef REL99 
+#define U_FRAME_NULL          0x00
+#endif /*REL99*/
+#define U_FRAME_DM            0x01
+#define U_FRAME_DISC          0x04
+#define U_FRAME_UA            0x06
+#define U_FRAME_SABM          0x07
+#define U_FRAME_FRMR          0x08
+#define U_FRAME_XID           0x0B
+
+/*
+ * Reasons of frame rejection condition. The lower nibble conforms
+ * to W4-W1 in the FRMR response frame.
+ */
+#define FRMR_W1                         0x01
+#define FRMR_W2                         0x02
+#define FRMR_W3                         0x04
+#define FRMR_W4                         0x08
+
+/*
+ * !!!!!asap <R.LLC.XCEPTION.A.010> "W1 bit: Bit W3 shall be set to 1 in
+ * conjunction with this bit." Is that always the case?
+ */
+#define FRMR_INCORRECT_LENGTH           FRMR_W1
+#define FRMR_INCORRECT_LENGTH_ABM       (FRMR_W1 | FRMR_W4)
+#define FRMR_EXCEEDS_N201               FRMR_W2
+#define FRMR_EXCEEDS_N201_ABM           (FRMR_W2 | FRMR_W4)
+#define FRMR_UNDEFINED_CTRL             FRMR_W3
+#define FRMR_UNDEFINED_CTRL_ABM         (FRMR_W3 | FRMR_W4)
+
+#define FRMR_CTRL_LENGTH_UNKNOWN        0x00
+
+
+/*
+ * Maximum value of LLC sequence numbers and state variables:
+ * N(S), N(R), V(S), V(R), ...
+ */
+#define MAX_SEQUENCE_NUMBER   511
+
+
+/*
+ * UITX_*_QUEUE_SIZE defines the maximum number of frames for the various
+ * UITX service incarnations (depeding on SAPI). UITX is the only service
+ * which is limited with uplink flow control. Enough memory must be present
+ * for all other services (U, ITX). U requires a maximum of 2 simultaneously
+ * stored frames per SAPI: the first being a received response to a
+ * previously sent command, and the second being a command which is to be sent
+ * directly afterwards.
+ */
+#define UITX_1_QUEUE_SIZE     10
+#define UITX_3_QUEUE_SIZE     1
+#define UITX_5_QUEUE_SIZE     1
+#define UITX_7_QUEUE_SIZE     1
+#define UITX_9_QUEUE_SIZE     1
+#define UITX_11_QUEUE_SIZE    1
+
+#define ITX_3_QUEUE_SIZE      1
+#define ITX_5_QUEUE_SIZE      1
+#define ITX_9_QUEUE_SIZE      1
+#define ITX_11_QUEUE_SIZE     1
+
+/*
+ * Because of the lack of flow control between GRLC and LLC, it is possible,
+ * that LLC recieve frames from GRLC, but can not forward them to the higher
+ * layers. The following constants define the number of UI frames to buffer
+ * per SAPI until we get an LL_GETUNITDATA_REQ
+ */
+#define UIRX_QUEUE_SIZE        32 
+
+/*
+ * The number of queued I-frames in ITX is limited to the windowsize ku.
+ * If only ku frames are queued and we got an acknowledge for this, LLC
+ * would have no more frames to send. The following variable defines a
+ * number of additional frames to buffer.
+ */
+#ifdef _SIMULATION_
+  #define ITX_ADD_QUEUE_SIZE     8
+#else
+  #define ITX_ADD_QUEUE_SIZE     1
+#endif
+/*
+ * Maximum supported LLC parameter which should be negotiated initial.
+ * Only values which are different to the default should be defined here.
+ * In future this value should be read from the flash file system.
+ */
+#define N201_U_SUPPORTED       520
+#define N201_I_SUPPORTED       520
+#define KD_KD_SUPPORTED         64
+#if defined (LL_2to1) || defined (REL99)  
+#define KD_KU_SUPPORTED         16
+#else
+#define KD_KU_SUPPORTED         8
+#endif
+#define KD_MD_SUPPORTED          0
+#define KD_MU_SUPPORTED          0
+
+/*
+ * Service definitions. Used to access service data with GET/SET_STATE.
+ *
+ * Services with multiple incarnation have to be defined as xxx->
+ * Services with only one incarnation have to be defined as xxx.
+ */
+#define LLME                  llme.
+#define SAPI                  sapi->
+#define U                     u->
+#define ITX                   itx->
+#define IRX                   irx->
+#define UITX                  uitx->
+#define UIRX                  uirx->
+#define T200                  t200->
+#define T201                  t201->
+#define TX                    tx.
+#define RX                    rx.
+
+
+/* #ifndef NTRACE*/
+
+/*
+ * These defintions are only needed for debugging purposes (!NTRACE).
+ */
+
+/*
+ * The following definitions are necessary for the state initialisation of
+ * services with the INIT_STATE() macro.
+ */
+#define U_0                   U
+#define U_1                   U
+#define U_2                   U
+#define U_3                   U
+#define U_4                   U
+#define U_5                   U
+
+#define ITX_0                 ITX
+#define ITX_1                 ITX
+#define ITX_2                 ITX
+#define ITX_3                 ITX
+
+#define IRX_0                 IRX
+#define IRX_1                 IRX
+#define IRX_2                 IRX
+#define IRX_3                 IRX
+
+#define UITX_0                UITX
+#define UITX_1                UITX
+#define UITX_2                UITX
+#define UITX_3                UITX
+#define UITX_4                UITX
+#define UITX_5                UITX
+
+#define UIRX_0                UIRX
+#define UIRX_1                UIRX
+#define UIRX_2                UIRX
+#define UIRX_3                UIRX
+#define UIRX_4                UIRX
+#define UIRX_5                UIRX
+
+#define T200_0                T200
+#define T200_1                T200
+#define T200_2                T200
+#define T200_3                T200
+#define T200_4                T200
+#define T200_5                T200
+
+#define T201_0                T201
+#define T201_1                T201
+#define T201_2                T201
+#define T201_3                T201
+
+/*
+ * Service name definitions for trace purposes. The service abbrevation
+ * (e.g. LLME) has to be the same as above for the service definitions.
+ */
+#define SERVICE_NAME_LLME     "LLME"
+
+#define SERVICE_NAME_U_0      "U_1"
+#define SERVICE_NAME_U_1      "U_3"
+#define SERVICE_NAME_U_2      "U_5"
+#define SERVICE_NAME_U_3      "U_7"
+#define SERVICE_NAME_U_4      "U_9"
+#define SERVICE_NAME_U_5      "U_11"
+
+#define SERVICE_NAME_ITX_0    "ITX_3"
+#define SERVICE_NAME_ITX_1    "ITX_5"
+#define SERVICE_NAME_ITX_2    "ITX_9"
+#define SERVICE_NAME_ITX_3    "ITX_11"
+
+#define SERVICE_NAME_IRX_0    "IRX_3"
+#define SERVICE_NAME_IRX_1    "IRX_5"
+#define SERVICE_NAME_IRX_2    "IRX_9"
+#define SERVICE_NAME_IRX_3    "IRX_11"
+
+#define SERVICE_NAME_UITX_0   "UITX_1"
+#define SERVICE_NAME_UITX_1   "UITX_3"
+#define SERVICE_NAME_UITX_2   "UITX_5"
+#define SERVICE_NAME_UITX_3   "UITX_7"
+#define SERVICE_NAME_UITX_4   "UITX_9"
+#define SERVICE_NAME_UITX_5   "UITX_11"
+
+#define SERVICE_NAME_UIRX_0   "UIRX_1"
+#define SERVICE_NAME_UIRX_1   "UIRX_3"
+#define SERVICE_NAME_UIRX_2   "UIRX_5"
+#define SERVICE_NAME_UIRX_3   "UIRX_7"
+#define SERVICE_NAME_UIRX_4   "UIRX_9"
+#define SERVICE_NAME_UIRX_5   "UIRX_11"
+
+#define SERVICE_NAME_T200_0   "T200_1"
+#define SERVICE_NAME_T200_1   "T200_3"
+#define SERVICE_NAME_T200_2   "T200_5"
+#define SERVICE_NAME_T200_3   "T200_7"
+#define SERVICE_NAME_T200_4   "T200_9"
+#define SERVICE_NAME_T200_5   "T200_11"
+
+#define SERVICE_NAME_TX       "TX"
+#define SERVICE_NAME_RX       "RX"
+
+/* #endif !NTRACE */
+
+
+/*
+ * Timer definitions. For each timer a BASE and MAX value is defined.
+ */
+#define TIMER_T200_BASE       (0)
+#define TIMER_T200_1          (TIMER_T200_BASE)
+#define TIMER_T200_3          (TIMER_T200_BASE+1)
+#define TIMER_T200_5          (TIMER_T200_BASE+2)
+#define TIMER_T200_7          (TIMER_T200_BASE+3)
+#define TIMER_T200_9          (TIMER_T200_BASE+4)
+#define TIMER_T200_11         (TIMER_T200_BASE+5)
+#define TIMER_T200_MAX        (TIMER_T200_11)
+
+#define TIMER_T201_BASE       (TIMER_T200_MAX+1)
+#define TIMER_T201_3          (TIMER_T201_BASE)
+#define TIMER_T201_5          (TIMER_T201_BASE+1)
+#define TIMER_T201_9          (TIMER_T201_BASE+2)
+#define TIMER_T201_11         (TIMER_T201_BASE+3)
+#define TIMER_T201_MAX        (TIMER_T201_11)
+
+#define TIMER_MAX             (TIMER_T201_MAX)
+#define TIMER_NUM             (TIMER_MAX+1)
+
+
+/*
+ * State definitions for each service.
+ */
+
+#define LLME_TLLI_UNASSIGNED            1
+#define LLME_TLLI_ASSIGNED              2
+#define LLME_TLLI_ASSIGNED_SUSPENDED    3
+
+#define U_TLLI_UNASSIGNED               1
+#define U_ADM                           2
+#define U_LOCAL_ESTABLISHMENT           3
+#define U_REMOTE_ESTABLISHMENT          4
+#define U_ABM                           5
+#define U_LOCAL_RELEASE                 6
+#define U_ESTABLISH_RES_PENDING         7
+
+#define ITX_TLLI_UNASSIGNED             1
+#define ITX_TLLI_ASSIGNED               2
+#define ITX_ABM                         3
+#define ITX_ABM_PEER_BUSY               4
+
+#define IRX_TLLI_UNASSIGNED             1
+#define IRX_TLLI_ASSIGNED               2
+#define IRX_ABM                         3
+#define IRX_ABM_BUSY                    4
+
+#define UITX_TLLI_UNASSIGNED_NOT_READY  1
+#define UITX_TLLI_UNASSIGNED_READY      2
+#define UITX_ADM_NOT_READY              3
+#define UITX_ADM_READY                  4
+
+#define UIRX_TLLI_UNASSIGNED_NOT_READY  1
+#define UIRX_TLLI_UNASSIGNED_READY      2
+#define UIRX_ADM_NOT_READY              3
+#define UIRX_ADM_READY                  4
+
+#define T200_TLLI_UNASSIGNED            1
+#define T200_RESET                      2
+#define T200_RUNNING                    3
+
+#define TX_TLLI_UNASSIGNED_NOT_READY    1
+#define TX_TLLI_UNASSIGNED_READY        2
+#define TX_TLLI_ASSIGNED_NOT_READY      3
+#define TX_TLLI_ASSIGNED_READY          4
+
+#define RX_TLLI_UNASSIGNED              1
+#define RX_TLLI_ASSIGNED                2
+
+#ifndef TI_PS_OP_CIPH_DRIVER
+
+/*
+ * user defined constants
+ */
+
+#define CIPH_SIZE_CK                   (0x10)     
+#define CIPH_MAX_ELEM                  (0x14)     
+#define CIPH_MAX_HEADER_SIZE           (0x25)     
+#define CIPH_N202                      (0x4)      
+
+/*==== TYPES ======================================================*/
+
+/*
+ * The following definitions was originally generated by CCD. The definitions are not used as 
+ * primitive definitions anymore, only for SNDCP internal usage.
+ */
+/* --------------------------------------------------------------------------------- */ 
+/*
+ * enum to Variable algo
+ * Ciphering algorithm.
+ * CCDGEN:WriteEnum_Count==2834
+ */
+#ifndef __T_CIPH_algo__
+#define __T_CIPH_algo__
+typedef enum
+{
+  CIPH_EA0                       = 0x0,           /* No encryption                  */
+  CIPH_EA1                       = 0x1,           /* Frame shall be ciphered using algorithm EA1 */
+  CIPH_EA2                       = 0x2,           /* Frame shall be ciphered using algorithm EA2 */
+  CIPH_EA3                       = 0x3            /* Frame shall be ciphered using algorithm EA3 */
+}T_CIPH_algo;
+#endif
+/*
+ * enum to Variable direction
+ * DIRECTION parameter
+ * CCDGEN:WriteEnum_Count==2836
+ */
+#ifndef __T_CIPH_direction__
+#define __T_CIPH_direction__
+typedef enum
+{
+  CIPH_UPLINK_DIR                = 0x0,           /* See [3G 33.102]                */
+  CIPH_DOWNLINK_DIR              = 0x1            /* See [3G 33.102]                */
+}T_CIPH_direction;
+#endif
+/*
+ * enum to Variable status
+ * Status of the ciphering process
+ * CCDGEN:WriteEnum_Count==2853
+ */
+#ifndef __T_CIPH_status__
+#define __T_CIPH_status__
+typedef enum
+{
+  CIPH_CIPH_FAIL                 = 0x0,           /* Ciphering successful           */
+  CIPH_CIPH_PASS                 = 0x1,           /* Ciphering failed               */
+  CIPH_CIPH_BUSY                 = 0x2,           /* Ongoing ciphering              */
+  CIPH_FCS_ERROR                 = 0x3            /* FCS error                      */
+}T_CIPH_status;
+#endif
+/*
+ * enum to Variable pm
+ * Protected or unprotected mode
+ * CCDGEN:WriteEnum_Count==2840
+ */
+#ifndef __T_CIPH_pm__
+#define __T_CIPH_pm__
+typedef enum
+{
+  CIPH_PM_UNPROTECTED            = 0x0,           /* FCS covers frame header field and first N202 octets of information field */
+  CIPH_PM_PROTECTED              = 0x1            /* FCS covers frame header and information fields */
+}T_CIPH_pm;
+#endif
+
+#ifndef __T_CIPH_ck__
+#define __T_CIPH_ck__
+/*
+ * Ciphering key.
+ * CCDGEN:WriteStruct_Count==13956
+ */
+typedef struct
+{
+  U8                        ck_element[CIPH_SIZE_CK]; /*<  0: 16> T_CIPH_ck_element,  Ciphering key element          */
+} T_CIPH_ck;
+#endif
+
+#ifndef __T_CIPH_init_cipher_req_parms__
+#define __T_CIPH_init_cipher_req_parms__
+/*
+ * Ciphering algorithm initialisation parameters.
+ * CCDGEN:WriteStruct_Count==13968
+ */
+typedef struct
+{
+  U8                        algo;                     /*<  0:  1> T_CIPH_algo,  Ciphering algorithm.                 */
+  U8                        direction;                /*<  1:  1> T_CIPH_direction,  DIRECTION parameter             */
+  U8                        zzz_align0;               /*<  2:  1> alignment                                          */
+  U8                        zzz_align1;               /*<  3:  1> alignment                                          */
+  T_CIPH_ck                 *ptr_ck;                  /*<  4:  4> pointer to Ciphering key.                          */
+} T_CIPH_init_cipher_req_parms;
+#endif
+
+
+#ifndef __T_CIPH_gprs_parameters__
+#define __T_CIPH_gprs_parameters__
+/*
+ * Structure containing LLC parameters
+ * CCDGEN:WriteStruct_Count==13976
+ */
+typedef struct
+{
+  U8                        pm;                       /*<  0:  1> T_CIPH_pm,  Protected or unprotected mode          */
+  U8                        zzz_align0;               /*<  1:  1> alignment                                          */
+  U16                       header_size;              /*<  2:  2> T_CIPH_header_size,  Frame header size             */
+  U32                       ciphering_input;          /*<  4:  4> frame-dependent ciphering input                    */
+  U32                       threshold;                /*<  8:  4> T_CIPH_threshold,  Threshold parameter             */
+} T_CIPH_gprs_parameters;
+#endif
+
+#ifndef __T_CIPH_umts_parameters__
+#define __T_CIPH_umts_parameters__
+/*
+ * Structure containing umts parameters
+ * CCDGEN:WriteStruct_Count==13980
+ */
+typedef struct
+{
+  U8                        bearer;                   /*<  0:  1> T_CIPH_bearer,  BEARER parameter                   */
+  U8                        zzz_align0;               /*<  1:  1> alignment                                          */
+  U8                        zzz_align1;               /*<  2:  1> alignment                                          */
+  U8                        zzz_align2;               /*<  3:  1> alignment                                          */
+  U32                       count_c;                  /*<  4:  4> COUNT-C parameter                                  */
+  U8                        dest_bit_offset;          /*<  8:  1> T_CIPH_dest_bit_offset,  Bit offset                */
+  U8                        org_bit_offset;           /*<  9:  1> T_CIPH_org_bit_offset,  Bit offset                 */
+  U8                        zzz_align3;               /*< 10:  1> alignment                                          */
+  U8                        zzz_align4;               /*< 11:  1> alignment                                          */
+  U32                       threshold;                /*< 12:  4> T_CIPH_threshold,  Threshold parameter             */
+} T_CIPH_umts_parameters;
+#endif
+
+#ifndef __T_CIPH_in_data__
+#define __T_CIPH_in_data__
+/*
+ * Structure containing length and pointer to the data
+ * CCDGEN:WriteStruct_Count==13984
+ */
+typedef struct
+{
+  U16                       len;                      /*<  0:  2> Length of buffer                                   */
+  U8                        zzz_align0;               /*<  2:  1> alignment                                          */
+  U8                        zzz_align1;               /*<  3:  1> alignment                                          */
+  U32                       buf;                      /*<  4:  4> Pointer to the data in buffer                      */
+} T_CIPH_in_data;
+#endif
+
+/*
+ * Stucture containing length and pointer to the data
+ * CCDGEN:WriteStruct_Count==13988
+ */
+#ifndef __T_CIPH_out_data__
+#define __T_CIPH_out_data__
+typedef T_CIPH_in_data T_CIPH_out_data;
+#endif
+#ifndef __T_CIPH_cipher_req_parms__
+#define __T_CIPH_cipher_req_parms__
+/*
+ * Ciphering algorithm parameters.
+ * CCDGEN:WriteStruct_Count==13990
+ */
+typedef union
+{
+  T_CIPH_gprs_parameters    gprs_parameters;          /*<  0: 12> Structure containing LLC parameters                */
+  T_CIPH_umts_parameters    umts_parameters;          /*<  0: 16> Structure containing umts parameters               */
+} T_CIPH_cipher_req_parms;
+#endif
+
+#ifndef __T_CIPH_in_data_list__
+#define __T_CIPH_in_data_list__
+/*
+ * Structure containing a list of in_data elements
+ * CCDGEN:WriteStruct_Count==13994
+ */
+typedef struct
+{
+  T_CIPH_in_data            *ptr_in_data;             /*<  0:  4> pointer to Structure containing length and pointer to the data */
+  U16                       c_in_data;                /*<  4:  2> Number of elements                                 */
+  U8                        zzz_align0;               /*<  6:  1> alignment                                          */
+  U8                        zzz_align1;               /*<  7:  1> alignment                                          */
+} T_CIPH_in_data_list;
+#endif
+
+#endif /* TI_PS_OP_CIPH_DRIVER */
+
+/* --------------------------------------------------------------------------------- */
+
+#ifndef __T_kc__
+#define __T_kc__
+typedef struct
+{
+  U8                        key[8];                   /*<  0:  8> ciphering key content                              */
+} T_kc;
+#endif
+
+#ifndef __T_CCI_CIPHER_REQ__
+#define __T_CCI_CIPHER_REQ__
+typedef struct
+{
+  U8                        pm;                       /*<  0:  1> protected mode                                     */
+  U8                        ciphering_algorithm;      /*< 16:  1> ciphering algorithm                                */
+  U8                        direction;                /*< 17:  1> ciphering transfer direction                       */
+  U8                        attached_counter;         /*< 29:  1> attached to primitive data counter                 */
+  U32                       ciphering_input;          /*<  4:  4> frame-dependent ciphering input                    */
+  T_kc                      kc;                       /*<  8:  8> ciphering key                                      */
+  U32                       reference1;               /*< 32:  4> frame reference number                             */
+  U16                       header_size;              /*< 36:  2> frame header size                                  */
+  U8                        zzz_align0;               /*< 38:  1> alignment                                          */
+  U8                        zzz_align1;               /*< 39:  1> alignment                                          */
+  T_sdu                     sdu;                      /*< 40: ? > service data unit                                  */
+} T_CCI_CIPHER_REQ;
+#endif
+
+#ifndef __T_CCI_DECIPHER_REQ__
+#define __T_CCI_DECIPHER_REQ__
+typedef struct
+{
+  U8                        pm;                       /*<  0:  1> protected mode                                     */
+  U8                        ciphering_algorithm;      /*<  1:  1> ciphering algorithm                                */
+  U8                        direction;                /*< 16:  1> ciphering transfer direction                       */
+  U8                        zzz_align0;               /*< 30:  1> alignment                                          */
+  T_kc                      kc;                       /*<  4:  8> ciphering key                                      */
+  U32                       ciphering_input;          /*< 12:  4> frame-dependent ciphering input                    */
+  U32                       reference1;               /*< 20:  4> frame reference number                             */
+  U32                       reference2;               /*< 24:  4> second frame reference number                      */
+  U16                       header_size;              /*< 28:  2> frame header size                                  */
+  U8                        zzz_align1;               /*< 30:  1> alignment                                          */
+  U8                        zzz_align2;               /*< 31:  1> alignment                                          */
+  T_desc_list               desc_list;                /*< 32: ? > list of generic data descriptors                   */
+} T_CCI_DECIPHER_REQ;
+#endif
+
+#ifndef __T_CCI_RESET_REQ__
+#define __T_CCI_RESET_REQ__
+typedef struct
+{
+  U8                        dummy;                    /*<  0:  1> no parameters                                      */
+} T_CCI_RESET_REQ;
+#endif
+
+#ifndef __T_CCI_CIPHER_DESC_REQ__
+#define __T_CCI_CIPHER_DESC_REQ__
+typedef struct
+{
+  U8                        pm;                       /*<  0:  1> protected mode                                     */
+  U8                        ciphering_algorithm;      /*< 16:  1> ciphering algorithm                                */
+  U8                        direction;                /*< 17:  1> ciphering transfer direction                       */
+  U8                        attached_counter;         /*< 29:  1> attached to primitive data counter                 */
+  U32                       ciphering_input;          /*<  4:  4> frame-dependent ciphering input                    */
+  T_kc                      kc;                       /*<  8:  8> ciphering key                                      */
+  U32                       reference1;               /*< 32:  4> frame reference number                             */
+  U16                       header_size;              /*< 36:  2> frame header size                                  */
+  U8                        zzz_align0;               /*< 38:  1> alignment                                          */
+  U8                        zzz_align1;               /*< 39:  1> alignment                                          */
+  T_desc_list3              desc_list3;               /*< 40:  8> List of generic data descriptors                   */
+} T_CCI_CIPHER_DESC_REQ;
+#endif
+
+/* --------------------------------------------------------------------------------- */
+
+/*
+ * LLC global typedefs
+ */
+
+typedef UBYTE       T_BIT_INT;
+typedef T_BIT_INT   T_BIT;
+
+/*
+ * T_FRAME_NUM must be unsigned!
+ */
+typedef USHORT      T_FRAME_NUM;
+
+/*
+ * FRAME_NUM_VALID(a, b, c) equal to ETSI: a <= b <= c
+ */
+#define FRAME_NUM_VALID(a,b,c)  ( (((T_FRAME_NUM)((b)-(a)))%(MAX_SEQUENCE_NUMBER+1)) <=    \
+                                  (((T_FRAME_NUM)((c)-(a)))%(MAX_SEQUENCE_NUMBER+1)) )
+
+/*
+ * FRAME_WIN_VALID(a, b, k)  equal to ETSI: a < b + k
+ */
+#define FRAME_WIN_VALID(a,b,k)  ( (((T_FRAME_NUM)((a)-(b)))%(MAX_SEQUENCE_NUMBER+1)) < (k) )
+
+/*
+ * FRAME_NUM_DISTANCE(a,b)  equal to b - a for frame nums
+ */
+#define FRAME_NUM_DISTANCE(a,b)  ((T_FRAME_NUM)((b)-(a))%(MAX_SEQUENCE_NUMBER+1))
+
+
+typedef struct
+{
+  UBYTE data[S_FRAME_SACK_MAX_CTRL_OCTETS];
+} T_SACK_BITMAP;
+
+
+typedef enum
+{
+  ABIT_NO_REQ,
+  ABIT_SET_REQ
+} T_ABIT_REQ_TYPE;
+
+typedef enum
+{
+  IQ_NO_FRAME,      /* return code only */
+  IQ_NEW_FRAME,     /* new in the queue */
+  IQ_RETR_FRAME,    /* ITX - marked for retransmission */
+  IQ_W4ACK_FRAME,   /* ITX - is send, but no ack up to now */
+  IQ_IS_ACK_FRAME   /* ITX - is ack and waiting for to be next in sequence */
+} T_IQ_STATUS;
+
+typedef enum
+{
+  NS_EQUAL_VR,
+  NS_NO_SEQUENCE_ERROR,
+  NS_EQUAL_VR_PLUS_1,
+  NS_IN_RANGE_VR_KU
+} T_LAST_NS_TYPE;
+
+typedef enum
+{
+  I_FRAME = I_FRAME_ID,
+  S_FRAME = S_FRAME_ID,
+  UI_FRAME = UI_FRAME_ID,
+  U_FRAME = U_FRAME_ID
+} T_PDU_TYPE;
+
+typedef enum
+{
+  /*
+   * The values are chosen to correspond with the Sx and Mx bits in the frame
+   * control field. Thus these commands can be used to build the header of a
+   * frame.
+   * NOTE:
+   * Some I and U frame commands have the same value.
+   */
+#ifdef REL99 
+  U_NULL = U_FRAME_NULL,
+#endif /* REL99 */
+  I_RR = I_FRAME_RR,
+  I_ACK = I_FRAME_ACK,
+  I_RNR = I_FRAME_RNR,
+  I_SACK = I_FRAME_SACK,
+  U_SABM = U_FRAME_SABM,
+  U_DISC = U_FRAME_DISC,
+  U_UA = U_FRAME_UA,
+  U_DM = U_FRAME_DM,
+  U_FRMR = U_FRAME_FRMR,
+  U_XID = U_FRAME_XID
+} T_COMMAND;
+
+typedef enum
+{
+  NO_SERVICE,
+  SERVICE_LLME,
+  SERVICE_ITX,
+  SERVICE_IRX,
+  SERVICE_UITX,
+  SERVICE_UIRX,
+  SERVICE_U,
+  SERVICE_TX,
+  SERVICE_RX,
+  SERVICE_T200
+} T_SERVICE;
+
+typedef enum
+{
+  PRIM_DATA,
+  PRIM_UNITDATA,
+  PRIM_REMOVED,
+  NO_PRIM
+} T_PRIM_TYPE;
+
+typedef enum
+{
+  EXPIRY_TIMED,
+  EXPIRY_REQUESTED
+} T_EXPIRY_MODE_TYPE;
+
+
+/*
+ * Don't use enum for SAPI, because that's larger in size than UBYTE.
+ */
+typedef UBYTE                 T_SAPI;
+
+#define SAPI_1                LL_SAPI_1
+#define SAPI_2                LL_SAPI_INVALID
+#define SAPI_3                LL_SAPI_3
+#define SAPI_4                LL_SAPI_INVALID
+#define SAPI_5                LL_SAPI_5
+#define SAPI_6                LL_SAPI_INVALID
+#define SAPI_7                LL_SAPI_7
+#define SAPI_8                LL_SAPI_INVALID
+#define SAPI_9                LL_SAPI_9
+#define SAPI_10               LL_SAPI_INVALID
+#define SAPI_11               LL_SAPI_11
+#define SAPI_12               LL_SAPI_INVALID
+#define SAPI_13               LL_SAPI_INVALID
+#define SAPI_14               LL_SAPI_INVALID
+#define SAPI_15               LL_SAPI_INVALID
+
+/*
+ * Indicates which primitive to use after successful (re-)establishment:
+ * LL_ESTABLISH_IND/CNF
+ */
+typedef UBYTE                 T_ESTABLISHMENT;
+
+#define IND_ESTABLISHMENT     1
+#define CNF_ESTABLISHMENT     2
+
+/*
+ * Local TX transmit queue.
+ * NOTE:
+ * The ph_* variables must exactly match the types of T_GRLC_DATA_REQ /
+ * T_GRLC_UNITDATA_REQ.
+ */
+typedef struct T_TX_QUEUE_ELEMENT
+{
+  struct T_TX_QUEUE_ELEMENT   *next;              /* pointer to next element */
+  ULONG                       primitive;          /* stored primitive */
+  ULONG                       reference;          /* entry reference number */
+  T_PRIM_TYPE                 prim_type;          /* primitive type */
+  UBYTE                       ph_sapi;            /* primitive header: sapi */
+  ULONG                       ph_tlli;            /*   tlli */
+  UBYTE                       ph_grlc_qos_peak;   /*   grlc_qos.peak */
+  UBYTE                       ph_radio_prio;      /*   radio_prio */
+  UBYTE                       ph_cause;           /*   cause */
+  T_SERVICE                   rx_service;         /* flow control service */
+  BOOL                        remove_frame;       /* TRUE: frame has to remove */
+#ifdef REL99 
+  UBYTE                       ph_pkt_flow_id;     /* packet flow identifier */
+#endif /* REL99 */
+} T_TX_QUEUE;
+
+
+typedef struct T_ITX_I_QUEUE_ENTRY
+{
+  struct T_ITX_I_QUEUE_ENTRY  *next;              /* pointer to next element */
+#ifdef LL_DESC
+  T_LL_DESC_REQ*              frame;              /* pointer to L3 prim */
+#else
+  T_LL_DATA_REQ*              frame;              /* pointer to L3 prim */
+#endif
+  USHORT                      n_retr;             /* retransmission counter */
+  T_IQ_STATUS                 status;             /* status flag */
+  T_FRAME_NUM                 ns;                 /* send sequence number N(S) */
+  ULONG                       oc_i_tx;            /* OC to use for this N(S) */
+
+  /*
+   * Copy of original LL_DATA_REQ parameter for attached_counter handling
+   */
+#ifdef LL_2to1
+  T_PS_qos_r97                ll_qos;             /* quality of service  */
+  T_LL_reference1             reference;          /* ciphering indicator     */
+#else
+  T_ll_qos                    ll_qos;             /* quality of service  */
+  T_reference1                reference;          /* ciphering indicator     */
+#endif
+#ifdef REL99 
+  UBYTE                       pkt_flow_id;         /*Packet Flow Identifier  */
+#endif /* REL99 */
+#ifdef LL_DESC
+  USHORT                      offset;             /* Offset of buffer     */
+  USHORT                      len;                /* Length of buffer      */
+#else
+  USHORT                      sdu_o_buf;          /* Offset of SDU data      */
+  USHORT                      sdu_l_buf;          /* Length of SDU data      */
+#endif
+  UBYTE                       radio_prio;         /* Radio Priority          */
+  UBYTE                       seg_pos;            /* First and/or last seg?  */
+
+} T_ITX_I_QUEUE_ENTRY;
+
+
+typedef struct
+{
+  struct T_ITX_I_QUEUE_ENTRY  *first;             /* pointer to first element */
+  USHORT                      entries;            /* number of Queue enties */
+} T_ITX_I_QUEUE;
+
+
+typedef struct T_ITX_S_QUEUE_ENTRY
+{
+  struct T_ITX_S_QUEUE_ENTRY  *next;              /* pointer to next element */
+  T_COMMAND                   sx;                 /* Supervisiory command Sx */
+  T_ABIT_REQ_TYPE             rt;                 /* A bit request flag */
+  T_FRAME_NUM                 nr;                 /* N(R) of command */
+  T_SACK_BITMAP               bitmap;             /* SACK bitmap */
+} T_ITX_S_QUEUE_ENTRY;
+
+
+typedef struct T_IRX_QUEUE
+{
+  struct T_IRX_QUEUE          *next;              /* pointer to next element */
+  T_LL_UNITDATA_IND*          frame;              /* pointer to L3 prim */
+  T_FRAME_NUM                 ns;                 /* received frame number N(S) */
+} T_IRX_QUEUE;
+
+typedef struct T_UIRX_QUEUE
+{
+  struct T_UIRX_QUEUE          *next;             /* pointer to next element */
+  T_LL_UNITDATA_IND*          frame;              /* pointer to L3 prim */
+} T_UIRX_QUEUE;
+
+
+typedef struct /* T_XID_PARAMETERS */
+{
+  struct /* Version */
+  {
+    BOOL                      valid;
+    UBYTE                     value;
+  } version;
+  struct /* IOV-UI */
+  {
+    BOOL                      valid;
+    ULONG                     value;
+  } iov_ui;
+  struct /* IOV-I */
+  {
+    BOOL                      valid;
+    ULONG                     value;
+  } iov_i;
+  struct /* T200 */
+  {
+    BOOL                      valid;
+    USHORT                    value;
+  } t200;
+  struct /* N200 */
+  {
+    BOOL                      valid;
+    UBYTE                     value;
+  } n200;
+  struct /* N201-U */
+  {
+    BOOL                      valid;
+    USHORT                    value;
+  } n201_u;
+  struct /* N201-I */
+  {
+    BOOL                      valid;
+    USHORT                    value;
+  } n201_i;
+  struct /* mD */
+  {
+    BOOL                      valid;
+    USHORT                    value;
+  } md;
+  struct /* mU */
+  {
+    BOOL                      valid;
+    USHORT                    value;
+  } mu;
+  struct /* kD */
+  {
+    BOOL                      valid;
+    UBYTE                     value;
+  } kd;
+  struct /* kU */
+  {
+    BOOL                      valid;
+    UBYTE                     value;
+  } ku;
+  struct /* Reset */
+  {
+    BOOL                      valid;
+  } reset;
+} T_XID_PARAMETERS;
+
+
+
+typedef struct /* T_FFS_XID_PARAMETERS */
+{
+  struct /* T200 */
+  {
+    BOOL                      valid;
+    USHORT                    value;
+  } t200[UNACKNOWLEDGED_INC];
+  struct /* N200 */
+  {
+    BOOL                      valid;
+    UBYTE                     value;
+  } n200[UNACKNOWLEDGED_INC];
+  struct /* N201-U */
+  {
+    BOOL                      valid;
+    USHORT                    value;
+  } n201_u[UNACKNOWLEDGED_INC];
+  struct /* N201-I */
+  {
+    BOOL                      valid;
+    USHORT                    value;
+  } n201_i[ACKNOWLEDGED_INC];
+  struct /* mD */
+  {
+    BOOL                      valid;
+    USHORT                    value;
+  } md[ACKNOWLEDGED_INC];
+  struct /* mU */
+  {
+    BOOL                      valid;
+    USHORT                    value;
+  } mu[ACKNOWLEDGED_INC];
+  struct /* kD */
+  {
+    BOOL                      valid;
+    UBYTE                     value;
+  } kd[ACKNOWLEDGED_INC];
+  struct /* kU */
+  {
+    BOOL                      valid;
+    UBYTE                     value;
+  } ku[ACKNOWLEDGED_INC];
+} T_FFS_XID_PARAMETERS;
+
+
+typedef struct /* T_LLME_DATA */
+{
+  UBYTE                       state;
+  /*
+   * Required for state traces.
+   */
+#ifndef NTRACE
+  char                        *name;
+  char                        *state_name;
+#endif
+} T_LLME_DATA;
+
+
+typedef struct /* T_U_DATA */
+{
+  UBYTE                       state;
+  /*
+   * Required for state traces.
+   */
+#ifndef NTRACE
+  char                        *name;
+  char                        *state_name;
+#endif
+  /*
+   * TLLI of current transaction (is set with incoming primitives, time-outs,
+   * and signals with primitive payload).
+   */
+  ULONG                       current_tlli;
+
+  /*
+   * Number of retransmissions per sent command frame.
+   */
+  UBYTE                       retransmission_counter;
+
+  /*
+   * If LLC receives an release request from Layer 3 and is not able to confirm
+   * the request immediately, release_requested has to be set to TRUE.
+   */
+  UBYTE                       release_requested;
+
+  /*
+   * Send LL_ESTABLISH_IND/CNF after successful establishment.
+   */
+  T_ESTABLISHMENT             ind_cnf_establishment;
+
+  /*
+   * Indicates if XID command has been sent.
+   */
+  BOOL                        xid_pending;
+
+  /*
+   * Indicates that an LL_XID_IND has been sent.
+   */
+  BOOL                        ll_xid_resp_pending;
+
+  /*
+   * Reason of frame rejection condition.
+   */
+  UBYTE                       frmr_reason;
+
+  /*
+   * Used to tag parameters for the next XID response. This is done by
+   * setting the corresponding bit (with the definitions from llc_uf.h) to 1.
+   * This variable is initialised by llme_init(), and with every call of
+   * u_eval_xid().
+   */
+  ULONG                       xid_tag;
+
+  /*
+   * Tags parameters for further negotiation that have not been included in
+   * the XID command but are included in the XID response. These parameters
+   * have to be included in every XID response until the parameter has been
+   * explicitly negotiated, either by responding to an XID command that
+   * included the parameter, or by explicitly including the parameter
+   * the next time an XID command is transmitted.
+   * <R.LLC.XIDNEG_R.A.015>
+   * This variable is initialised by llme_init().
+   */
+  ULONG                       xid_tag_negotiate;
+
+  /*
+   * Used to tag parameters that have actually been sent in the last command
+   * or response frame. It is used for collision checks and the like.
+   * This variable is initialised by llme_init(), and with every call of
+   * u_insert_xid().
+   */
+  ULONG                       xid_tag_sent;
+
+  /*
+   * Structure to contain XID parameters that are requested to be negotiated.
+   * Valid flags are initialised by llme_init(), and are being reset when
+   * the parameter has explicitly been included in a response.
+   */
+  T_XID_PARAMETERS            requested_xid;
+
+} T_U_DATA;
+
+
+typedef struct /* T_ITX_DATA */
+{
+  UBYTE                       state;
+  /*
+   * Required for state traces.
+   */
+#ifndef NTRACE
+  char                        *name;
+  char                        *state_name;
+#endif
+
+  BOOL                        tx_waiting;
+  BOOL                        buffer_was_full;
+
+  /*
+   * I frame buffer size variables: Total length of
+   * transmitted and not acknowlegded information fields.
+   */
+  ULONG                       B_tx;
+
+  /*
+   * Local transmit queues for I- and S frames
+   */
+  T_ITX_I_QUEUE               i_queue;
+  T_ITX_S_QUEUE_ENTRY         *s_queue;
+
+  /*
+   * T201 Data
+   */
+  T_ITX_I_QUEUE_ENTRY         *t201_entry;
+  USHORT                      n_pb_retr;
+
+} T_ITX_DATA;
+
+
+typedef struct /* T_IRX_DATA */
+{
+  UBYTE                       state;
+  /*
+   * Required for state traces.
+   */
+#ifndef NTRACE
+  char                        *name;
+  char                        *state_name;
+#endif
+
+  /*
+   * I frame buffer size variables: Total length of
+   * stored information fields.
+   */
+  ULONG                       B_rx;
+
+  /*
+   * Next frame number to forward to L3
+   */
+  T_FRAME_NUM                 vf;
+
+  /*
+   * L3 ready to receive a data indication flag
+   */
+  BOOL                        ll_send_ready;
+  T_LAST_NS_TYPE              last_ns;
+
+  T_IRX_QUEUE                 *queue;
+} T_IRX_DATA;
+
+
+typedef struct /* T_UITX_DATA */
+{
+  UBYTE                       state;
+  /*
+   * Required for state traces.
+   */
+#ifndef NTRACE
+  char                        *name;
+  char                        *state_name;
+#endif
+  /*
+   * Unacknowledged send sequence number
+   */
+  T_FRAME_NUM                 vu;
+} T_UITX_DATA;
+
+
+typedef struct /* T_UIRX_DATA */
+{
+  UBYTE                       state;
+  /*
+   * Required for state traces.
+   */
+#ifndef NTRACE
+  char                        *name;
+  char                        *state_name;
+#endif
+  /*
+   * Bit field for received N(U) values, relative to V(UR).
+   */
+  ULONG                       last_32_frames_bitfield;
+
+  T_UIRX_QUEUE                *queue;
+
+} T_UIRX_DATA;
+
+
+typedef struct /* T_T200_DATA */
+{
+  UBYTE                       state;
+  /*
+   * Required for state traces.
+   */
+#ifndef NTRACE
+  char                        *name;
+  char                        *state_name;
+#endif
+  /*
+   * Length of timer T200 in milliseconds (is negotiated in 0.1s!).
+   * LLC layer parameter.
+   */
+  T_TIME                      length;
+  /*
+   * The frame which is associated with the timer, the RLC/MAC cause of the
+   * frame, and the service that started the timer. This is the t200_data
+   * array of SDL.
+   */
+#ifdef LL_DESC
+  T_LL_UNITDESC_REQ           *frame;
+#else
+  T_LL_UNITDATA_REQ           *frame;
+#endif
+  UBYTE                       cause;
+  T_SERVICE                   originator;
+
+} T_T200_DATA;
+
+
+typedef struct /* T_TX_DATA */
+{
+  UBYTE                       state;
+  /*
+   * Required for state traces.
+   */
+#ifndef NTRACE
+  char                        *name;
+  char                        *state_name;
+#endif
+  /*
+   * Local transmit queue (single-linked dynamic list).
+   */
+  T_TX_QUEUE                  *queue;
+  /*
+   * Counter of available space for UITX primitives in the queue.
+   */
+  UBYTE                       queue_counter_itx[ITX_NUM_INC];
+  UBYTE                       queue_counter_uitx[UITX_NUM_INC];
+} T_TX_DATA;
+
+
+typedef struct /* T_RX_DATA */
+{
+  UBYTE                       state;
+  /*
+   * Required for state traces.
+   */
+#ifndef NTRACE
+  char                        *name;
+  char                        *state_name;
+#endif
+} T_RX_DATA;
+
+
+typedef struct /* T_SAPI_DATA */
+{
+  /*
+   * Unacknowledged receive sequence numbers (0..511)
+   */
+  T_FRAME_NUM                 vur;
+  T_FRAME_NUM                 last_vur;
+
+  /*
+   * Acknowledged mode frame numbers (0..511)
+   */
+  T_FRAME_NUM                 vr;
+  T_FRAME_NUM                 va;
+  T_FRAME_NUM                 vs;
+
+  /*
+   * Binary overflow counters for acknowledged/unacknowledged mode and
+   * uplink/downlink. These variables are initialised with llme_init(),
+   * and the unacknowledged OCs are reset when XID reset has been received.
+   */
+  ULONG                       oc_ui_tx;
+  ULONG                       oc_ui_rx;
+  ULONG                       oc_i_tx;
+  ULONG                       oc_i_rx;
+
+  /*
+   * pbit_outstanding set to TRUE indicates that a frame with P bit set to 1
+   * is currently outstanding
+   */
+  BOOL                        pbit_outstanding;
+
+} T_SAPI_DATA;
+
+typedef struct /* Layer 3 */
+{
+  BOOL                      valid;
+  UBYTE                     length;
+#ifdef LL_2to1
+  UBYTE                     value[LL_MAX_L3_XID_LEN];
+#else
+  UBYTE                     value[LLC_MAX_L3_XID_LEN];
+#endif
+} T_L3_XID;
+
+/*
+ * CCI global typedefs
+ */
+typedef enum
+{
+  CIPHER_REQ,
+  DECIPHER_REQ,
+  NO_REQ
+} T_CCI_PRIM_TYPE;
+
+/* CCI data base */
+typedef struct /*T_FBS_SERVICE */
+{
+  UBYTE                  state;
+#ifndef NTRACE
+  char                   *name;
+  char                   *state_name;
+#endif
+
+  USHORT volatile        *cntl_reg;
+  USHORT volatile        *status_reg;
+  USHORT volatile        *status_irq_reg;
+  USHORT volatile        *conf_ul_reg1;
+  USHORT volatile        *conf_ul_reg2;
+  USHORT volatile        *conf_ul_reg3;
+  USHORT volatile        *conf_ul_reg4;
+  USHORT volatile        *conf_ul_reg5;
+  USHORT volatile        *conf_dl_reg1;
+  USHORT volatile        *conf_dl_reg2;
+  USHORT volatile        *conf_dl_reg3;
+  USHORT volatile        *conf_dl_reg4;
+  USHORT volatile        *conf_dl_reg5;
+  USHORT volatile        *kc_reg1;
+  USHORT volatile        *kc_reg2;
+  USHORT volatile        *kc_reg3;
+  USHORT volatile        *kc_reg4;
+  USHORT volatile        *fcs_ul_reg1;
+  USHORT volatile        *fcs_ul_reg2;
+  USHORT volatile        *fcs_dl_reg1;
+  USHORT volatile        *fcs_dl_reg2;
+#if (BOARD == 61 OR BOARD == 71)	/* G-Sample or I-Sample */
+  USHORT volatile        *switch_reg;
+#endif
+  USHORT volatile        *data16_reg;
+  UBYTE  volatile        *data8_reg;
+
+#ifdef _GEA_SIMULATION_
+  UBYTE                  *simulated_reg;
+  UBYTE                  *simulated_reg_buffer;
+#endif
+
+  /*primitives should also be defined as global */
+#ifdef LL_DESC  
+  T_CCI_CIPHER_DESC_REQ       *cci_cipher_req;
+#else
+  T_CCI_CIPHER_REQ       *cci_cipher_req;
+#endif
+  T_CCI_DECIPHER_REQ     *cci_decipher_req;
+
+#ifndef TI_PS_OP_CIPH_DRIVER
+  T_CIPH_init_cipher_req_parms ciph_params;
+  BOOL initialized;
+#endif
+  ULONG                  cci_freed_partition;
+  BOOL                   cci_info_trace;
+
+} T_FBS_DATA;
+
+
+typedef struct /* T_LLC_DATA */
+{
+  /*
+   * Indicates LLC is suspended or not (default).
+   * This variable is initialised by llme_init().
+   */
+  BOOL                        suspended;
+
+  /*
+   * Indicates LLC that GRLC is suspended or not (default).
+   * This variable is initialised by llme_init().
+   */
+  BOOL                        grlc_suspended;
+
+  /*
+   * Current SAPI number. This is used for outgoing primitives. It is set
+   * with each external event, like an incoming primitive or a time-out.
+   */
+  T_SAPI                      current_sapi;
+
+  /*
+   * TLLI New and TLLI Old. These are set by GMM via LLGMM_ASSIGN_REQ.
+   * TLLI New is used for sending primitives (if the upper layer did not
+   * already specify the TLLI). TLLI Old is currently unused.
+   * Both variables are initialised by llme_init().
+   */
+  ULONG                       tlli_new;
+  ULONG                       tlli_old;
+
+  /*
+   * LLC layer parameters (according to GSM 04.64, Version 6.4.0). These
+   * parameters are initialised by llc_init_parameters().
+   */
+  UBYTE                       version;
+
+  ULONG                       iov_ui;
+  ULONG                       iov_i_base[ACKNOWLEDGED_INC];
+  ULONG                       *iov_i;
+
+  /*
+   * T200 and T201 values are defined in the respective service data arrays.
+   */
+  UBYTE                       n200_base[UNACKNOWLEDGED_INC];
+  UBYTE                       *n200;
+
+  USHORT                      n201_u_base[UNACKNOWLEDGED_INC];
+  USHORT                      n201_i_base[ACKNOWLEDGED_INC];
+  USHORT                      *n201_u;
+  USHORT                      *n201_i;
+
+  USHORT                      md_base[ACKNOWLEDGED_INC];
+  USHORT                      mu_base[ACKNOWLEDGED_INC];
+  USHORT                      *md;
+  USHORT                      *mu;
+
+  UBYTE                       kd_base[ACKNOWLEDGED_INC];
+  UBYTE                       ku_base[ACKNOWLEDGED_INC];
+  UBYTE                       *kd;
+  UBYTE                       *ku;
+
+  T_L3_XID                    requested_l3_xid_base[ACKNOWLEDGED_INC];
+  T_L3_XID                    *requested_l3_xid;
+
+  /*
+   * Structure to contain decoded XID parameters.
+   * Valid flags are initialized by u_check_xid() each time received XID
+   * is checked.
+   */
+  T_XID_PARAMETERS            decoded_xid;
+  T_L3_XID                    decoded_l3_xid;
+
+  /*
+   * LLC layer variables needed for ciphering (see services TX/RX). These
+   * variables are set with LLGMM_ASSIGN_REQ by GMM.
+   */
+#ifdef LL_2to1
+  T_LLGMM_llgmm_kc            kc;
+#else
+  T_llgmm_kc                  kc;
+#endif
+
+
+  UBYTE                       ciphering_algorithm;
+
+  /*
+   * Service data structures.
+   *
+   * Services with multiple incarnations require an array of structures
+   * named xxx_base[] with xxx = service abbrevation, and additionally a
+   * pointer named *xxx, which will be accessed instead of xxx_base.
+   *
+   * Services with only one incarnation just have to declare one structure
+   * named xxx (no need for xxx_base[] and *xxx).
+   *
+   * The differentiation between the two access possibilites is made with
+   * the defines of the service names above (LLC_SERVICE_XXX).
+   */
+  T_LLME_DATA                 llme;
+
+  T_SAPI_DATA                 sapi_base[MAX_SAPI_INC];
+  T_SAPI_DATA                 *sapi;
+
+  T_U_DATA                    u_base[U_NUM_INC];
+  T_U_DATA                    *u;
+
+  T_ITX_DATA                  itx_base[ITX_NUM_INC];
+  T_IRX_DATA                  irx_base[IRX_NUM_INC];
+  T_ITX_DATA                  *itx;
+  T_IRX_DATA                  *irx;
+
+  T_UITX_DATA                 uitx_base[UITX_NUM_INC];
+  T_UIRX_DATA                 uirx_base[UIRX_NUM_INC];
+  T_UITX_DATA                 *uitx;
+  T_UIRX_DATA                 *uirx;
+
+  T_T200_DATA                 t200_base[T200_NUM_INC];
+  T_T200_DATA                 *t200;
+
+  T_TX_DATA                   tx;
+  T_RX_DATA                   rx;
+
+  T_FBS_DATA                  fbs;
+
+#ifdef _SIMULATION_
+  /*
+   * Structure to contain XID parameters that are configured in ffs.
+   */
+  T_FFS_XID_PARAMETERS        ffs_xid;
+#endif
+
+  /*Number of milliseconds to delay after sending reset_ind to SNDCP*/
+  USHORT millis;
+#ifdef REL99 
+  U16                         cur_pfi;    /* current packet flow identifier   */
+#endif
+  T_ll_qos                    cur_qos;        /* quality of service R97           */
+  U8                          cur_radio_prio; /* T_PS_radio_prio,  Radio priority */
+} T_LLC_DATA;
+
+
+/*==== EXPORT =====================================================*/
+
+/*
+ * Entity data base
+ */
+#ifdef LLC_PEI_C
+       T_LLC_DATA llc_data_base, *llc_data;
+#else
+EXTERN T_LLC_DATA llc_data_base, *llc_data;
+#endif
+
+#define ENTITY_DATA           llc_data
+
+/*
+ * Communication handles (see also LLC_PEI.C)
+ */
+#define hCommGMM              llc_hCommGMM
+#define hCommSNDCP            llc_hCommSNDCP
+#ifdef LL_2to1
+#define hCommMM               llc_hCommMM
+#else
+#define hCommGSMS             llc_hCommGSMS
+#endif
+#define hCommGRLC             llc_hCommGRLC
+
+#ifdef LLC_PEI_C
+       T_HANDLE hCommGMM        = VSI_ERROR;
+       T_HANDLE hCommSNDCP      = VSI_ERROR;
+#ifdef LL_2to1
+       T_HANDLE hCommMM         = VSI_ERROR;
+#else
+       T_HANDLE hCommGSMS       = VSI_ERROR;
+#endif
+       T_HANDLE hCommGRLC       = VSI_ERROR;
+
+       T_HANDLE LLC_handle;
+/*
+ * make the pei_create function unique
+ */
+#define pei_create              llc_pei_create
+
+#else
+EXTERN T_HANDLE hCommGMM;
+EXTERN T_HANDLE hCommSNDCP;
+#ifdef LL_2to1
+EXTERN T_HANDLE hCommMM;
+#else
+EXTERN T_HANDLE hCommGSMS;
+#endif
+EXTERN T_HANDLE hCommGRLC;
+
+EXTERN T_HANDLE LLC_handle;
+
+#endif /* LLC_PEI_C */
+
+
+#endif /* LLC_H */