diff src/g23m-gprs/grlc/grlc.h @ 183:219afcfc6250

src/g23m-gprs: initial import from TCS3.2/LoCosto
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 13 Oct 2016 04:24:13 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/g23m-gprs/grlc/grlc.h	Thu Oct 13 04:24:13 2016 +0000
@@ -0,0 +1,1247 @@
+/* 
++----------------------------------------------------------------------------- 
+|  Project :  GPRS (8441)
+|  Modul   :  GRLC
++----------------------------------------------------------------------------- 
+|  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 entity GRLC.
++----------------------------------------------------------------------------- 
+*/ 
+
+#ifndef GRLC_H
+#define GRLC_H
+
+/*
+ * defines the user of the vsi interface
+ */
+#define VSI_CALLER            GRLC_handle,
+#define VSI_CALLER_SINGLE     GRLC_handle 
+
+/*
+ * Macros
+ */
+
+#define ENCODE_OFFSET   0  /* PALLOC SDU*/ 
+
+/*
+ * Bit and byte length for encoding/decoding
+ */
+
+#define BIT_UL_CTRL_BLOCK_MAC_HEADER  8
+#define BIT_UL_CTRL_BLOCK_CONTENTS    176
+#define BIT_UL_CTRL_BLOCK             (BIT_UL_CTRL_BLOCK_MAC_HEADER+BIT_UL_CTRL_BLOCK_CONTENTS)
+
+#define BYTE_UL_CTRL_BLOCK            (BIT_UL_CTRL_BLOCK/BITS_PER_BYTE)
+
+
+/*
+ * The following definitions are used for the management of single block
+ * sending without TBF establishment.
+ *
+ * TC holds a queue of size MSG_OWNER_MAX_NUM to buffer the single blocks
+ * requested by the services. Only services MEAS and CS can request single
+ * blocks in parallel. In case service CTRL has requested a single block,
+ * services MEAS and CS are not allowed to request any single blocks.
+ *
+ * Service CS uses the same buffer as the service CTRL. Only one single block
+ * can be stored for both services. The service MEAS has an individual buffer.
+ * At this time only one single block can be stored for this service but we are
+ * free to increase the size just by increasing the value of MAX_CTRL_BLK_NUM.
+ */
+#define MAX_CTRL_BLK_NUM    5 /* number of single blocks that can be stored at */
+                              /* the same time                                 */
+
+#define BLK_INDEX_CTRL      0 /* Packet Cell Change Failure                    */
+#define BLK_INDEX_CS        0 /* Packet Measurement Report (NC Measurements)   */
+#define BLK_INDEX_TM        1 /* Packet Resource Request (Reallocation)        */
+#define BLK_INDEX_MEAS      2 /* Packet Measurement Report (EXT Measurements)  */
+
+
+typedef UBYTE T_BLK_OWNER;
+
+#define BLK_STATE_NONE      0 /* no control message associated                 */
+#define BLK_STATE_ALLOCATED 1 /* control message is allocated                  */
+#define BLK_STATE_SENT_REQ  2 /* control message is sent, waiting for response */
+
+typedef UBYTE T_BLK_STATE;
+
+/*
+ * Constants
+ */
+
+/* 
+ * Disable Get State traces only for target enviroment
+ */
+
+#ifdef _TARGET_
+#undef GET_STATE
+#define GET_STATE(P)        (ENTITY_DATA->P state)
+#endif
+
+
+/*
+ * Define the size of the GRLC queue in frame
+ */
+#define PEI_PRIM_QUEUE_SIZE 32
+
+/*
+ * Defines the size of the queue which do a tempory save of llc primitives
+ */
+
+#ifdef _TARGET_
+#define PRIM_QUEUE_SIZE  20
+#else
+#define PRIM_QUEUE_SIZE  10
+#endif/*TARGET*/
+
+
+#define GMM_PRIM_QUEUE_SIZE  2
+#define MAX_WINDOW_SIZE      64
+
+
+#define PRIM_QUEUE_SIZE_TOTAL  (PRIM_QUEUE_SIZE+GMM_PRIM_QUEUE_SIZE)
+
+#define MAX_LLC_PDU_SIZE  1560
+#define MAX_GRLC_USER_DATA (MAX_WINDOW_SIZE * 50) /* window size * user data with CS4 */
+#define FN_MAX           0x297000 
+
+/* MAC HEADER TYPE*/
+#define RLC_DATA_BLOCK      0
+#define CTRL_BLK_NO_OPT     1
+#define CTRL_BLK_OPT        2
+
+/*
+ * Size of Next Poll Array
+ */
+#define NEXT_POLL_ARRAY_SIZE   8
+#define WIN_SIZE              64  /*window size of rlc*/
+/*
+ * Size of Poll Type Array
+ */
+#define POLL_TYPE_ARRAY_SIZE     8
+
+
+
+
+/*
+TBF BSN RANGE
+*/
+#define NR_OF_PDUS_PER_RLCMAC_BLOCK   8 /* max. number of pdus in one rlc mac block */
+#define TLLI_SIZE                     4 /* tlli size in UBYTE */ 
+
+#define WIN_MOD     63
+#define BSN_MAX    127
+
+#define RD_LI_CNT_MAX                 8 /* max. number of pdus in one rlc mac block  in downlink direction*/
+
+
+#define OFFSET_CTRL_BLOCK_IDX  200
+
+/*
+end constants for RU
+*/
+#define MAX_UL_TN      4 /* max. number of timeslots supported in uplink */ 
+
+/*
+start constants for RD
+*/
+
+
+#define RD_NEXT_ARRAY_DATA_SIZE       50 /* valid for all coding schemes */
+
+#define ACK_CNT_MEAS_RPT_FIRST         2
+#define ACK_CNT_NORMAL                 1
+
+/*
+end constants for RD
+*/
+
+/*
+start constants for TM
+*/
+#define RADIO_PRIO_4         3
+
+/*
+end constants for TM
+*/
+
+/*
+start constants for TPC
+*/
+#define MIN_PCL_DCS1800 28 /* minimum power control level DCS 1800 */
+#define MAX_PCL_DCS1800 29 /* maximum power control level DCS 1800 */
+#define MIN_PCL_GSM900  31 /* minimum power control level GSM 900  */
+#define MAX_PCL_GSM900  0  /* maximum power control level GSM 900  */
+#define MIN_PCL_PCS1900 21 /* minimum power control level PCS 1900 */
+#define MAX_PCL_PCS1900 22 /* maximum power control level PCS 1900 */
+
+#define GAMMA_0_DCS1800 36
+#define GAMMA_0_GSM900  39
+#define GAMMA_0_PCS1900 36
+
+#define TPC_SWITCHED_ON        0xFF /* normal TPC process is applied  */
+#define TPC_ALFGAM_NOT_PRESENT 0xFF /* the ALPHA and GAMMA values are */
+                                    /* marked as not present          */
+
+#define CLIP_T_AVG(x)           ( (x) > 25 ? 25 : (x) )
+#define CLIP_ALPHA(x)           ( (x) > 10 ? 10 : (x) )
+#define CLIP_BS_PAG_BLKS_RES(x) ( (x) > 12 ? 0  : (x) )
+#define CLIP_BS_PRACH_BLKS(x)   ( (x) > 12 ? 0  : (x) )
+
+#define M_TPC_TRACE_STATIC      0x01 /* trace TPC parameter everytime tpc_update_pch is called    */
+#define M_TPC_TRACE_CHANGE      0x02 /* trace TPC parameter only in case at least one PCL changes */
+#define M_TPC_TRACE_FUNCTION    0x04 /* trace mask for parameters of maca_power_control           */
+/*
+end constants for TPC
+*/
+
+/*
+start constants for MEAS
+*/
+#define MEAS_ACRCY 1000 /* accuracy */ 
+/*
+end constants for MEAS
+*/
+
+
+#define NOT_SET 255
+
+/*
+ * Service definitions. Used to access service data with GET/SET_STATE.
+ */
+
+
+#define TM        tm.
+#define RD        rd.
+#define RU        ru.
+#define GFF       gff.
+
+
+
+
+/*
+ * Timer definitions (also used by GRLC_PEI.C)
+ */
+
+typedef enum
+{
+  T3164 = 0,  /* handled by service RU         */
+  T3166,      /* handled by service RU         */
+  T3168,      /* handled by service TM         */
+  T3180,      /* handled by service RU         */
+  T3182,      /* handled by service RU         */
+  T3184,      /* handled by service RU         */
+  T3188,      /* handled by service TM         */
+  T3190,      /* handled by service RD         */
+  T3192,      /* handled by service RD         */
+  T3314,      /* handled by service RU         */
+
+  TIMER_COUNT /* !!! always the last entry !!! */    
+
+} T_TIMER_INDEX;
+
+/*#define T3198     no timer   */   /* handled by service RU: used relative to fn, defined in T_RLC_DATA_BLOCK: T3198 = BS_CV_MAX * block periods: not timer is used */
+
+
+#define T3164_VALUE       5000        /* ms */ 
+#define T3166_VALUE       5000        /* ms */
+/*      T3168_VALUE - assigned in system info (in GPRS Cell Options)
+                      range 500,1000,...4000ms */
+#define T3180_VALUE       5000        /* ms */
+#define T3182_VALUE       5000        /* ms */
+#define T3184_VALUE       5000        /* ms */
+#define T3188_VALUE       5000        /* ms */
+#define T3190_VALUE       5000        /* ms */
+
+/*#define T3192_VALUE - assigned in system info (in GPRS Cell Options)
+                      range 500,1000,...4000ms */
+/*      T3198_VALUE - value depends BS_CV_MAX, there may be some inctances of this timer,
+                      how many? the duration is not very long (asumption) - how long?
+                      handling with rlc_uplink/downlink functions and a table?   */
+
+/*
+ * Service name definitions for trace purposes. The service abbrevation
+ * (e.g. RU) has to be the same as above for the service definitions.
+ */
+#ifndef NTRACE
+
+#define SERVICE_NAME_TM       "TM"
+#define SERVICE_NAME_RU       "RU"
+#define SERVICE_NAME_RD       "RD"
+#define SERVICE_NAME_GFF      "GFF"
+
+
+#endif /* !NTRACE */
+
+
+
+/*
+ * Service TM
+ */
+#define TM_ACCESS_DISABLED          0
+#define TM_ACCESS_PREPARED          1
+#define TM_PIM                      2
+#define TM_PAM                      3
+#define TM_PTM                      4
+#define TM_WAIT_4_PIM               5
+
+/*
+ * Service RD
+ */
+
+#define RD_NULL     0
+#define RD_ACK      1
+#define RD_REL_ACK  2
+#define RD_UACK     3
+#define RD_REL_UACK 4
+#define RD_NET_REL  5
+#define RD_WAIT_FOR_STARTING_TIME_ACK  6
+#define RD_WAIT_FOR_STARTING_TIME_UACK 7
+#define RU_NET_REL                     8
+
+/*
+ * Service RU
+ */
+
+#define RU_NULL     0  /* not active state of RU  */
+#define RU_ACK      1  /* acknowledged mode state of RU */
+#define RU_REL_ACK  2  /* release state in acknowledged mode of RU, i.e. cv=0 is transmitted but not acked */
+#define RU_SEND_PCA 3  /* send packet control acknowledgment state of RU in acknowledged and unacknowledged  mode,
+i.e all blocks are transmitted and acked, waiting for of FN for transmiitng the packet control ack message */
+#define RU_UACK     4  /* unacknowledged mode state of RU */
+#define RU_REL_UACK 5  /* release state in unacknowledged mode of RU, i.e. cv=0 is transmitted but not acked
+							         (i.e receiving of packet uplink ack/nack with fbi=1) */
+#define RU_WAIT_FOR_FIRST_CALL_ACK  6
+#define RU_WAIT_FOR_FIRST_CALL_UACK 7
+
+/*
+ * Service GFF
+ */
+
+
+#define GFF_ACTIVE      0
+#define GFF_DEACTIVE    1
+#if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH
+#define GFF_TWO_PHASE   2
+#endif
+
+
+/*
+ * states for grlc_data->tc.send_grlc_ready_ind
+ */
+#define SEND_A_GRLC_READY_IND    0
+#define WAIT_FOR_LLC_DATA_REQ   1
+#define PRIM_QUEUE_FULL         2
+
+/* 
+ * states for Ready Timer
+ */
+#define STANDBY_STATE                   0
+#define READY_STATE                     1
+
+typedef UBYTE T_READY_TIMER_STATE;
+
+#define READY_TIMER_HANDLING_DISABLED   0
+#define READY_TIMER_HANDLING_ENABLED    1
+
+typedef UBYTE T_READY_TIMER_HANDLING;
+
+/*==== TYPES ======================================================*/
+
+/*
+ * GRLC global typedefs
+ */
+
+/* enums */
+
+typedef UBYTE T_PRIM_TYPE;
+
+
+typedef enum
+{
+  CS_ZERO = 255,
+  CS_1    = 0,
+  CS_2    = 1,
+  CS_3    = 2,
+  CS_4    = 3
+} T_CODING_SCHEME;
+
+
+
+typedef enum
+{ 
+  TFI_CHANGE_NULL,    /* no tfi modification needed after starting time is elapsed */
+  TFI_CHANGE_UL,      /* uplink tfi shall modified after starting time is elapsed */
+  TFI_CHANGE_DL,      /* downlink tfi shall modified after starting time is elapsed */
+  TFI_CHANGE_ALL      /* uplink and downlink tfi shall modified after starting time is elapsed */
+} T_TFI_CHANGE;
+
+typedef enum
+{
+  TBF_TYPE_NULL,
+#if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH
+  TBF_TYPE_TP_ACCESS,
+#endif
+  TBF_TYPE_UL,
+  TBF_TYPE_DL,
+  TBF_TYPE_CONC
+} T_TBF_TYPE;
+
+/* 
+ * Please keep the numbering scheme, so that bit operations can be used.
+ */
+#define REL_TYPE_NULL  0 /* no release of TBF requested        */
+#define REL_TYPE_DL    1 /* release of DL TBF requested        */
+#define REL_TYPE_UL    2 /* release of UL TBF requested        */
+#define REL_TYPE_DL_UL 3 /* release of DL and UL TBF requested */
+
+typedef UBYTE T_REL_TYPE;
+
+
+
+
+/*start enum for rd*/
+typedef enum /* T_NEXT_POLL_BLOCK_TYPE*/
+{
+  NEXT_POLL_BLOCK_NONE,
+  NEXT_POLL_BLOCK_DL_DATA,
+  NEXT_POLL_BLOCK_CTRL
+}T_NEXT_POLL_BLOCK_TYPE;
+
+/*
+ * used by rd : vn array (enum is using ulong)
+ */
+#define  VN_RECEIVED  1
+#define  VN_INVALID   255
+
+/*start enum for ru*/
+typedef enum /* T_PAN_CNT*/
+{
+  PAN_INC,
+  PAN_DEC
+}T_PAN_CNT;
+
+#define VB_NACKED           0  /* negative acknowledged */
+#define VB_ACKED            1  /* positive acknowledged */
+#define VB_PENDING_ACK      2  /* not jet acknowledged  */
+#define VB_FIRST_SEG_TXD    3 
+#define VB_INVALID        255  /* outside window        */
+
+
+typedef enum /* T_LAST_BSN*/
+{
+  LAST_BSN_IS_SENT,                   /* final uplink data block(cv=0) is sent(confirmed by l1)*/
+  LAST_BSN_STALL_CONDITION,           /* stall indication in uplink, ack or uack mode */
+  LAST_BSN_RESUME_UACK_MODE_AFTER_SI, /* in rlc uack, data transfer is allowed after SI */
+  LAST_BSN_NOT_BULIT =255             /* final data block is not sent */
+}T_LAST_BSN;
+
+/*end um for ru*/
+
+/*start enum for GFF*/
+
+typedef enum /* RLC_STATUS_TYPE*/
+{
+  RLC_STATUS_NULL = 0,
+  RLC_STATUS_UL   = 1,
+  RLC_STATUS_DL   = 2,
+  RLC_STATUS_BOTH = 3
+}T_RLC_STATUS_TYPE;
+/*end um for GFF*/
+
+
+/*
+ * Structure
+ */
+
+typedef enum /* T_FA_TYPE*/
+{
+  FA_NO_CURRENT,
+  FA_NO_NEXT,
+  FA_BITMAP,
+  FA_REPEAT
+}T_FA_TYPE;
+
+typedef struct  /* parameterts of one fixed alloction*/
+{
+  T_CGRLC_fix_alloc_struct    alloc;
+  USHORT                      ul_res_sum;      /* number of uplink resources during this fixed allocation*/
+  ULONG                       alloc_start_fn;
+  ULONG                       alloc_end_fn;
+} T_FA_ALLOC;
+
+
+typedef struct  /* T_FA_MANAG*/
+{
+  T_FA_TYPE           fa_type;
+  T_FA_ALLOC          current_alloc;
+  T_FA_ALLOC          next_alloc;
+  BOOL                repeat_alloc;
+  USHORT              tbf_oct_cnt;        /* number of octets, to be transmitted during the current tbf*/
+  USHORT              tbf_oct_cap_remain; /* remainig capacity in octetes of current fix allocation*/
+  USHORT              ul_res_used;        /* number of used uplink resources(timeslots) used in fixed allocation*/
+  USHORT              ul_res_remain;      /* number of REMAINING uplink resources(timeslots) in fixed allocation*/
+  USHORT              ul_res_sum;         /* number of total uplink resources in fix alloc mode during one tbf*/
+} T_FA_MANAG;
+
+
+
+
+typedef struct /* T_UL_TBF */
+{
+  ULONG             tlli;         /* tlli that is valid for activ TBF */
+  UBYTE             access_type;  /* access type of the current tbf*/  
+  UBYTE             mac_mode;     
+  UBYTE             rlc_mode;     /* is estimated in tc_start_access */
+  T_CODING_SCHEME   cs_type;
+  UBYTE             ti;           /*  =1 tlli field present in data block, else not present*/
+  BOOL              tlli_cs_type; /*  coding scheme for rlc data blocks including TLLI*/
+  UBYTE             prio;         /*  Radio Prioritity from grlc_data_req or
+                                      grlc_unitdata_req; should be set in tm_start_access */
+  UBYTE             ac_class;     /*  access class and radio priority of the network */
+  UBYTE             nr_blocks;    /*  set in ts_start_access; CS_1 is used */
+                                  /*  4 Access Burst or RLCMAC-Block,
+                                      maybe storing is not necessary*/
+  UBYTE             nts;          /*  number of timeslots allocated for tbf */
+  UBYTE             ts_mask;      /*  timeslot mask */
+  UBYTE             bs_cv_max;
+  USHORT            rlc_db_granted; /* indicates if close ended or open ended tbf is used */
+
+  T_FA_MANAG        fa_manag;     /* contains all fixed alloction parameters*/
+} T_UL_TBF;
+
+
+typedef struct /* T_DL_TBF */
+{
+  ULONG             tlli;         /* tlli that is valid for activ TBF */
+  UBYTE             mac_mode;     
+  UBYTE             rlc_mode;     /* is estimated in tc_start_access */
+  T_CODING_SCHEME   cs_type;
+  UBYTE             nts;          /*  number of timeslots allocated for tbf */
+  UBYTE             ts_mask;      /*  timeslot mask */
+  UBYTE             t3192_val;
+  UBYTE             trans_id;     /* transaction id */
+} T_DL_TBF;
+
+
+typedef struct /* T_TBF_CTRL */
+{
+  T_TBF_TYPE        tbf_type;
+  ULONG             start_fn;
+  ULONG             end_fn;
+  ULONG             rlc_oct_cnt;
+  UBYTE             pdu_cnt;
+  UBYTE             vs_vr;
+  UBYTE             va_vq;
+  USHORT            cnt_ts;
+  UBYTE             tfi;
+  UBYTE             ack_cnt;
+  UBYTE             fbi;
+  UBYTE             ret_bsn;
+} T_TBF_CTRL;
+
+
+
+
+typedef struct /* T_PRIM_QUEUE */
+{
+  UBYTE                 next;         /* index of following entry; 0xff if no primitive follows */
+  UBYTE                 previous;     /* index of previous entry; 0xff first primitive */
+  T_GRLC_DATA_REQ *      prim_ptr;     /* pointer to primitive */
+  T_PRIM_TYPE           prim_type;    /* GRLC_UNITDATAreq or GRLC_DATAreq*/
+  BOOL                  cv_status;    /* is set if pdu is included in the count down procedure */
+  BOOL                  rlc_status;   /* is set if transmission of the pdu has started*/
+  BOOL                  re_allocation;/* in front of this pdu is a reallocation necessary */
+  BOOL                  start_new_tbf;/* marks the first llc of a new tbf*/
+  UBYTE                 last_bsn;     /* indicates the last bsn of th rlc data block, which belongs to the pdu */
+} T_PRIM_QUEUE;
+
+
+
+typedef struct /* T_NEXT_POLL_ARRAY */
+{
+  UBYTE               cnt;
+  UBYTE               next;
+  UBYTE               ctrl_ack;
+  ULONG               fn;
+  UBYTE               poll_type[POLL_TYPE_ARRAY_SIZE];
+}T_NEXT_POLL_ARRAY;
+
+typedef struct /* T_TM_B_DATA : used in Testmode B */
+{
+  USHORT              block_status; /* stores the block_status received on downlink */
+  UBYTE               e_bit;        /* stores the e_bit received on downlink        */
+  UBYTE               payload[50];  /* stores the payload received on downlink      */
+}T_TM_B_DATA;
+
+typedef struct /* T_TESTMODE  "test mode" */
+{
+  UBYTE                 mode;                         /* test mode, where
+                                                       *  0x00 means no test mode
+                                                       *  0x01 means type A
+                                                       *  0x02 means type B
+                                                       */
+  ULONG                 n_pdu;                        /* number of PDUs which are to be transmitted */
+  UBYTE                 dl_ts_offset;                 /* Downlink Timeslot Offset, only for CGRLC_LOOP */
+  USHORT                prbs_shift_reg;               /* pseudo random bit sequence(prbs)
+                                                       * shift register
+                                                       */
+  UBYTE *               ptr_test_data;                /*
+                                                       * reference to data which are callaculated for
+                                                       * the current framenumber. All slots related to the same
+                                                       * frame number have to have the same data.
+                                                       */
+  UBYTE                 no_data_calculation;          /*
+                                                       * Is set when the prbs for the current
+                                                       * frame number is already calculated
+                                                       */
+  T_TM_B_DATA           rec_data[2];                  /* for Testmode B: received data is stored. Only 2 timeslots
+                                                       * are supported. The data will be stored sequentialy depending upon 
+                                                       * Downlink Timeslot Offset value 
+                                                       */
+} T_TESTMODE;
+
+
+
+
+
+
+
+typedef struct  /* saves all downlink data blocks*/    
+{
+  USHORT                rx_no;
+  T_dl_data             dl_data[MAC_MAX_DL_DATA_BLCKS];
+} T_dl_struct;
+
+
+
+typedef struct  /* saves struct of downlink data blocks*/   
+{
+  T_dl_struct           data_ptr;
+  ULONG                 fn;
+} T_FUNC_DL_BLOCKS;
+
+
+typedef struct  /* functional interface: RLC_UPLINK, RLC_DOWNLINK, MACA_POWER_CONTROL */
+{
+  T_FUNC_DL_BLOCKS      dl_blocks; 
+  T_MAC_DATA_IND        mac_data_ind;
+  T_MAC_READY_IND       mac_ready_ind;
+  T_MAC_PWR_CTRL_IND    mac_pwr_ctrl_ind;
+} T_FUNC_INTERFACE;
+
+
+
+
+
+/* structure for service internal data */
+
+
+
+
+
+/*start of structs for RU*/
+
+
+typedef struct
+{
+  U8                        mac;                                /*<  mac header                */
+  U8                        ti;                                 /*<  TLLI Indicator (TI) bit   */
+  U8                        e_bit;                              /*<  Extended bit              */
+  U8                        li_cnt;                             /*<  Number of LIs             */
+  U8                        li_me[NR_OF_PDUS_PER_RLCMAC_BLOCK]; /*<  LI, M and e-Bit           */
+} T_U_DATA;
+
+
+typedef struct /* T_RLC_DATA*/
+{
+  T_sdu *               ptr_data;
+  USHORT                l_buf;
+  USHORT                o_buf;
+} T_RLC_DATA;
+
+typedef struct /* T_RLC_DATA_BLOCK*/
+{
+  USHORT                block_status;
+  T_U_DATA              header;                       /*stores the header of the rlc data block*/
+  UBYTE                 data_cnt;                     /*number of pdus  in the rlc data block*/
+  T_RLC_DATA            data[NR_OF_PDUS_PER_RLCMAC_BLOCK];     /*stores the pointers of the  sdus*/
+  ULONG                 T3198;                        /*timer T3198, value= BS_CV_MAX block periods*/
+  UBYTE                 cnt_pl_trans;                 /* counts the number of transmissions over physical link*/
+} T_RLC_DATA_BLOCK;
+
+typedef struct /* T_PL_RETRANS*/ 
+{
+  UBYTE                 cnt;                     /* number of transmitted rlc/mac blocks */
+  UBYTE                 blk[MAX_UL_TN];  /* stores the bsn(data block) or ctrl block nr */
+} T_PL_RETRANS;
+
+
+
+/*end of structs for RU*/
+
+/*start of structs for RD*/
+
+
+
+
+typedef struct /*T_NEXT_ARRAY*/
+{
+  ULONG *               next;   /*zeig auf next struct vom typ T_NEXT_ARRAY*/
+  USHORT                len;
+  UBYTE                 data[RD_NEXT_ARRAY_DATA_SIZE];
+} T_NEXT_ARRAY;
+
+typedef struct /* T_DATA_ARRAY */       /*for received data blocks*/
+{
+  BOOL                  pdu_complete;   /* indicates if the last part of the data block is a complete pdu*/
+  UBYTE                 pdu_cnt;        /* nr of complete pdus in the current data block*/
+  T_NEXT_ARRAY *        first;          /* indicates the first element(first next_array) of the pdu */
+} T_DATA_ARRAY;
+
+
+/*end of structs for RD*/
+
+
+
+/*start of structs for GFF*/
+
+
+
+
+typedef struct /* T_RLC_VALUES*/
+{
+  USHORT              sdu_len;
+  USHORT              cnt_ts;
+} T_RLC_VALUES;
+
+
+/*end of structs for GFF*/
+
+
+
+/* data base for control messages */
+typedef struct /* T_UL_CTRL_BLOCK */
+{
+  T_BLK_OWNER         owner;
+  T_BLK_STATE         state;
+  UBYTE               data[BYTE_UL_CTRL_BLOCK];
+} T_UL_CTRL_BLOCK;
+
+typedef UBYTE T_BLK_INDEX;
+
+
+
+typedef struct /* T_UL_CTRL_BLOCK_ARRAY */
+{
+  T_UL_CTRL_BLOCK     blk[MAX_CTRL_BLK_NUM];
+  T_BLK_INDEX         seq[MAX_CTRL_BLK_NUM];
+} T_UL_CTRL_BLOCK_ARRAY;
+
+
+typedef struct
+{
+  USHORT l_buf;
+  USHORT o_buf;
+  UBYTE  buf [2 * BYTE_UL_CTRL_BLOCK];
+                       /*              CAN's suggestion never more then 2 blocks */
+                       /* or 8 blocks? ID's suggestion 'B_SIZE_D_PAGING_REQ\8+1' */
+
+} T_CTRLBUF;
+
+
+
+typedef struct /* T_TM_DATA */
+{
+  UBYTE                 state;
+  UBYTE                 disable_class;        /*  tm_grlc_init sets it to CR, updated with cgrlc_disable_req*/
+  UBYTE                 n_res_req;            /* number of sended packet resource request */
+  UBYTE                 n_acc_req_procedures; /* number of started access procedures */
+  T_UL_CTRL_BLOCK_ARRAY ul_ctrl_blk;        /* holds all relevant information for */
+                                            /* sending uplink control blocks      */
+
+  UBYTE                 start_of_new_tbf;     /* index where the new TBF starts
+                                               0xff means not used */
+  BOOL                  send_grlc_ready_ind;   /* GRLC_READY_IND have to be sent if this variable is TRUE
+                                               when a internal signal sig_ru_tm_prim_delete
+                                               was received by TM. */
+  UBYTE                 change_mark;          /* received from GRR, needed for sending in packet resource request*/
+#if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH
+  BOOL                  pacch_prr_pca_sent;   /* Use during release , Prr,pca was sent */
+#endif
+
+  T_CGRLC_freq_param    freq_param; /* frequency parameter of the current TBF */
+
+  USHORT                max_grlc_user_data; /* maximum nr of byte which can be stored in uplink in the LLC data queue*/
+
+#ifndef NTRACE
+  char                  *name;
+  char                  *state_name;
+#endif
+} T_TM_DATA;
+
+typedef struct /* T_ACK_CTRL */
+{
+  UBYTE                       cnt_meas_rpt;
+  UBYTE                       cnt_other;
+} T_ACK_CTRL;
+
+typedef struct /* T_RD_DATA */
+{
+  /*UBYTE*/
+  UBYTE                       state;
+  UBYTE                       vq;
+  UBYTE                       vr;
+  UBYTE                       li_cnt;
+  UBYTE                       rlc_data_len;
+  UBYTE                       f_ack_ind;
+  UBYTE                       ssn;
+  UBYTE                       last_bsn;
+  UBYTE                       bsn_pdu_start;
+  UBYTE                       cnt_sent_f_ack;   /* counts number of sent final downlink ack nacks*/
+
+  /*USHORT*/
+  USHORT                      pdu_len;
+  /*ULONG*/
+  ULONG                       fn_p_tbf_rel;
+  /*POINTER*/
+  /*BOOL*/
+  BOOL                        ch_req_in_ack_prog;    /*indicates weather the channel request is programmed in the last packet downlink ack/nack or not*/
+  BOOL                        channel_req;    /*indicates weather the channel request is sent in packet downlink ack/naok or not*/
+  BOOL                        pdu_complete;
+  BOOL                        inSequence;
+  BOOL                        release_tbf;
+  BOOL                        v_next_tbf_params; /* indicates if next_tbf_params is valid or not*/
+  BOOL                        ignore_pdu; /* if true pdu shall be ignored, max_pdu_size reached and until next pdu bound every thing is discarded */
+
+  /*Type*/
+  UBYTE                       rlc_mode;
+  T_DATA_ARRAY                data_array[WIN_SIZE];
+  T_NEXT_ARRAY                *ptr_grlc;
+  T_GRLC_DATA_IND              grlc_data_ind;
+  T_NEXT_POLL_BLOCK_TYPE      next_poll_block;
+  T_CODING_SCHEME             cs_type;
+  T_DL_TBF                    next_tbf_params;    /* stores downlink parameters in case of tbf starting time*/
+
+  /*array*/
+  UBYTE                       vn[WIN_SIZE];
+  USHORT                      li[RD_LI_CNT_MAX];
+  UBYTE                       m[RD_LI_CNT_MAX];
+  T_ACK_CTRL                  ack_ctrl;
+
+#ifndef NTRACE
+  char                        *name;
+  char                        *state_name;
+#endif
+} T_RD_DATA;
+
+typedef struct /* T_RU_DATA */
+{
+  /*DECLARATIONS*/
+  /*UBYTE*/
+  UBYTE                       state;
+  UBYTE                       nts;
+  UBYTE                       nts_max;
+  UBYTE                       ti;
+  UBYTE                       next_prim;
+  UBYTE                       active_prim;
+  UBYTE                       vs;
+  UBYTE                       va;
+  UBYTE                       bsn_ret;
+  UBYTE                       last_si_block;
+  UBYTE                       cv;
+  UBYTE                       N3104;
+  UBYTE                       N3104_MAX;
+  UBYTE                       count_cv_0;
+  UBYTE                       nr_nacked_blks;  /*number of negative acked blocks*/
+  UBYTE                       pdu_cnt;         /* nr of pdus per tbf*/
+  UBYTE                       pdu_sent;        /* nr of sent pdus per tbf, but stil not acknowlegded*/
+  UBYTE                       pdu_rem;         /* nr of remaining pdus per tbf*/
+  UBYTE                       pdu_boundaries;  /*nr of need boundaries*/
+  /*USHORT*/
+  USHORT                      block_status;
+  USHORT                      poll_tn;
+  USHORT                      rlc_data_size;
+  USHORT                      sdu_len;
+  USHORT                      sdu_off;
+  USHORT                      rlc_octet_cnt;
+  USHORT                      tbc;        /*number of rlc data blocks during the tbf, which is requested to send*/
+  USHORT                      cnt_ts;
+  /*ULONG*/
+  ULONG                       poll_fn;
+  /*BOOL*/
+  BOOL                        tlli_cs_type;
+  BOOL                        cd_active;  /*indicates if the countdown procedure is active*/
+  BOOL                        reorg_l1_needed; /* set to true if data blocks in l1 queue must be recalculated*/
+  BOOL                        v_next_tbf_params; /* indicates if next_tbf_params is valid or not*/
+  BOOL                        first_usf; /* true: wait for the first valid usf. FALSE: first usf was read*/
+  /*Type*/
+  UBYTE                       rlc_mode;
+  T_CODING_SCHEME             cs_type;
+  T_PL_RETRANS                pl_retrans_current;  /*status of current block, requested blocks to be send by PL*/
+  T_LAST_BSN                  last_bsn;           /* needed for starting timer t3182 */
+  /*array*/
+  T_RLC_DATA_BLOCK            rlc_data[WIN_SIZE]; /*contains the rlc data block, including header and pointer to the data*/
+  UBYTE                       vb[WIN_SIZE];
+  T_UL_TBF                    next_tbf_params;    /* stores uplink parameters in case of tbf starting time*/
+
+
+  UBYTE                       write_pos_index;
+  T_ul_data                   ul_data[MAX_UL_TN]; 
+  BOOL                        release_tbf;
+#if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH
+  BOOL                        tbf_re_est;        /*TBF Re-establish on PACCH*/
+#endif
+
+#ifndef NTRACE
+  char                        *name;
+  char                        *state_name;
+#endif
+} T_RU_DATA;
+
+
+
+
+typedef struct /* T_GFF_DATA */
+{
+  UBYTE                       state;
+  T_RLC_STATUS_TYPE           rlc_status;
+
+#ifndef NTRACE
+  char                        *name;
+  char                        *state_name;
+#endif
+} T_GFF_DATA;
+
+typedef ULONG  T_SIGN_VAR_VALUE;
+typedef USHORT T_SIGN_VAR_INDEX;
+
+typedef struct /* T_SIGN_VAR */
+{
+  T_SIGN_VAR_VALUE value;              /* current signal variance */
+  T_SIGN_VAR_INDEX index;              /* mean index              */
+} T_SIGN_VAR;
+
+typedef USHORT T_C_INDEX;
+typedef USHORT T_C_VALUE;
+
+typedef struct /* T_C_FILTER */
+{
+  T_C_VALUE value;                     /* current C value */
+  T_C_INDEX index;                     /* iteration index */
+} T_C_FILTER;
+
+typedef struct
+{
+  USHORT                    total;     /* Total number of bits  */ 
+  USHORT                    fault;     /* Number of faulty bits */
+} T_BE_INFO;
+
+typedef struct
+{
+  UBYTE                     num_dl_blck; /* Number of downlink data blocks */
+  T_BE_INFO                 be_info[MAC_MAX_DL_DATA_BLCKS];
+                                         /* Bit error information          */
+} T_BER_IND;
+
+typedef ULONG  T_BER_VALUE;
+typedef USHORT T_BER_INDEX;
+
+typedef struct /* T_BER_AVG */
+{
+  T_BER_VALUE value;                     /* current BER value in % */
+  T_BER_INDEX index;                     /* iteration index        */
+} T_BER_AVG;
+
+#if ( ! ( MAC_MAX_TIMESLOTS == CGRLC_MAX_TIMESLOTS ) )
+  #error MAC_MAX_TIMESLOTS == CGRLC_MAX_TIMESLOTS required
+#endif
+
+#if ( ! ( MAC_RXLEV_NONE == CGRLC_RXLEV_NONE ) )
+  #error MAC_RXLEV_NONE == CGRLC_RXLEV_NONE required
+#endif
+
+#if ( ! ( MAC_RXLEV_MIN == CGRLC_RXLEV_MIN ) )
+  #error MAC_RXLEV_MIN == CGRLC_RXLEV_MIN required
+#endif
+
+#if ( ! ( MAC_RXLEV_MAX == CGRLC_RXLEV_MAX ) )
+  #error MAC_RXLEV_MAX == CGRLC_RXLEV_MAX required
+#endif
+
+typedef enum /* T_PCH_IDX */
+{
+  PCH_IDX_A   = 0,
+  PCH_IDX_B   = 1,
+
+  PCH_IDX_MAX = 2
+} T_PCH_IDX;
+
+typedef struct /* T_PCH_ARRAY */
+{
+  UBYTE pch[MAC_MAX_TIMESLOTS];
+} T_PCH_ARRAY;
+
+typedef struct /* T_PCH_BUFFER */
+{
+  T_PCH_IDX   pch_idx;
+  T_PCH_ARRAY pch_array[PCH_IDX_MAX];
+} T_PCH_BUFFER;
+
+typedef struct /* T_MS_PWR_CAP */
+{
+  const UBYTE                *p_control;        /* power control level -> output power      */
+        SHORT                 pwr_min;          /* minimum nominal output power in the cell */
+        SHORT                 gamma_0;          /* GAMMA 0                                  */
+} T_MS_PWR_CAP;
+
+typedef struct /* T_TPC_DATA */
+{
+  UBYTE                       fix_pcl;          /* fixed PCL                      */
+
+  BOOL                        v_fix_pwr_par;
+  T_CGRLC_pwr_ctrl_param      fix_pwr_par;      /* fixed power parameter          */
+  
+  T_CGRLC_pwr_ctrl_param      pwr_par;          /* power control parameter        */
+  T_CGRLC_glbl_pwr_ctrl_param glbl_pwr_par;     /* global power control parameter */
+
+  T_PCH_BUFFER                pch_buffer;       /* power control level buffer     */  
+
+#if !defined (NTRACE)
+
+  UBYTE                       n_tpc_trace;
+
+#endif /* #if !defined (NTRACE) */
+
+#ifndef NTRACE
+  char                        *name;
+  char                        *state_name;
+#endif
+} T_TPC_DATA;
+
+typedef struct /* T_GRLC_MEAS_DATA */
+{
+  T_CGRLC_INT_LEVEL_REQ        ilev;
+  T_C_FILTER                   c_filter;
+  T_SIGN_VAR                   sign_var;
+  T_BER_AVG                    ber_avg;
+  BOOL                         sq_restart;
+
+#if !defined (NTRACE)
+
+  UBYTE                        v_im_trace;
+
+#endif /* #if !defined (NTRACE) */
+
+#ifndef NTRACE
+  char                        *name;
+  char                        *state_name;
+#endif
+} T_GRLC_MEAS_DATA;
+
+typedef struct /* T_GRLC_READY_TIMER */
+{
+  T_READY_TIMER_HANDLING  handling;
+  T_READY_TIMER_STATE     state;
+  ULONG                   value;
+} T_GRLC_READY_TIMER;
+
+typedef struct /* T_GRLC_DATA */
+{
+  T_GRLC_READY_TIMER      ready_timer;
+
+  UBYTE                   burst_type;
+  UBYTE                   ab_type;
+  T_CGRLC_pan_struct      pan_struct;
+  UBYTE                   t3168_val;
+
+
+  T_UL_TBF                uplink_tbf;   /*  This structure is used by TM,RU
+                                            during uplink-tbf */
+  T_DL_TBF                downlink_tbf; /*  This structure is used by TM,RD
+                                            during downlink-tbf */
+  T_TBF_TYPE              tbf_type;
+  T_REL_TYPE              rel_type;        /* indicates the type of TBF currently being released */
+  UBYTE                   prim_start_free; /* index of first free prim queue entry */
+  UBYTE                   prim_start_tbf ; /* index of first tbf prim queue entry */
+
+  UBYTE                   save_prim_start_free; /* save value during rau request */
+  UBYTE                   save_prim_start_tbf ; /* save value during rau request */
+  BOOL                    gmm_procedure_is_running;   /* inidcates if gmm procedure is rnnig or not*/
+
+  USHORT                  prim_user_data; /* user data which is current in the prim_queue */
+  T_PRIM_QUEUE            prim_queue[PRIM_QUEUE_SIZE_TOTAL];
+                                        /* queueing of llc-pdu's */
+  UBYTE                   ta_value;
+
+  UBYTE                   ul_tn_mask;    /* current uplink timeslot mask */
+  UBYTE                   dl_tn_mask;    /* current downlink timeslot mask */
+
+  UBYTE                   ul_tfi;
+  UBYTE                   dl_tfi;
+  UBYTE                   r_bit;        /* current r-bit value - set by TC - read by RU/RD*/
+  UBYTE                   poll_start_free;
+  UBYTE                   poll_start_tbf;
+  ULONG                   ul_fn;        /* framenumber for the current radio block, needed for transmission*/
+  ULONG                   dl_fn;        /* framenumber of the last radio block, where a block is received*/
+  T_NEXT_POLL_ARRAY       next_poll_array[NEXT_POLL_ARRAY_SIZE] ;
+  UBYTE                   N3102;
+  T_chan_req_des          chan_req_des; /* this will be included in next Packet Downlink AckNack
+                                           write by TC, read by RD */
+  T_TESTMODE              testmode;     /* this structure contains all GPRS test mode related data */
+
+    /* only for tracing*/
+  ULONG                   grlc_data_req_cnt;
+  ULONG                   dl_tbf_start_time;
+  ULONG                   ul_tbf_start_time;
+  UBYTE                   ul_index;
+  UBYTE                   dl_index;
+  T_TBF_CTRL              tbf_ctrl[2];
+
+  /*handling of gaps*/
+  ULONG                   missed_poll_fn;
+
+  UBYTE                   t3164_to_cnt;   /* conunts the timeouts of timer t3164 in sequence */  
+  UBYTE                   start_fn_ul_tfi; /* stores the uplink tfi, which becomes valid after starting time*/
+  UBYTE                   start_fn_dl_tfi; /* stores the downlink tfi, which becomes valid after starting time*/
+  T_ul_poll_resp          ul_poll_resp[2];//MULTISLOT 
+  UBYTE                   ul_poll_pos_index;  /* index of ul_poll_response, need for polling */
+  ULONG                   next_poll_fn; /*indicates the next poll fn  */
+  T_FUNC_INTERFACE        func;
+
+  ULONG                   nr_of_crc_errors;
+  T_TFI_CHANGE            tfi_change;
+  BOOL                    ul_tfi_changed;
+  UBYTE                   grlc_wo_ccd; /*=0 ccd is used for en/decoding, =1 messages are decoded wo ccd */
+#ifdef REL99
+  BOOL                    pfi_support;
+  U8                      pfi_value;
+  U8                      nw_rel;
+#endif
+
+#if defined (_TARGET_) /*target debugging*/
+  ULONG                   last_ul_fn;
+  ULONG                   last_dl_fn;
+#define CALL_ERROR_NR_OF_ST_FN 9
+  ULONG                   ul_fn_store[CALL_ERROR_NR_OF_ST_FN+1];
+  ULONG                   ul_fn_errors[CALL_ERROR_NR_OF_ST_FN+1];
+  ULONG                   dl_fn_store[CALL_ERROR_NR_OF_ST_FN+1];
+  ULONG                   dl_fn_errors[CALL_ERROR_NR_OF_ST_FN+1];
+  UBYTE                   ul_cnt_syn;     /*for target, count calls in rlc uplink*/
+  UBYTE                   ul_cnt_asyn;    /*for target, count calls in gffp mac_ready_ind*/
+  UBYTE                   dl_cnt_syn;     /*for target, count calls in rlc downlink*/
+  UBYTE                   dl_cnt_asyn;    /*for target, count calls in gffp mac_data_ind*/
+  UBYTE                   ul_call_errors; /*for target, count calls in rlc uplink during grlc is active*/
+  UBYTE                   dl_call_errors; /*for target, count calls in rlc downlink during grlc is active*/
+#endif /*(_TARGET_) */
+
+  /*
+   * Service data
+   */
+  T_GFF_DATA               gff;
+  T_TM_DATA                tm;
+  T_RD_DATA                rd;
+  T_RU_DATA                ru;
+  T_TPC_DATA               tpc;
+  T_GRLC_MEAS_DATA         meas;
+}T_GRLC_DATA;
+
+
+
+
+
+
+
+
+/*==== EXPORT =====================================================*/
+
+/*
+ * data base
+ */
+#ifdef GRLC_PEI_C
+       T_GRLC_DATA grlc_data_base, *grlc_data;
+#else
+EXTERN T_GRLC_DATA grlc_data_base, *grlc_data;
+#endif
+
+#define ENTITY_DATA grlc_data 
+
+
+/*
+ * Communication handles (see also GRLC_PEI.C)
+ */
+#define hCommL1             grlc_hCommMAC    
+#define hCommGRR            grlc_hCommGRR
+#define hCommGRLC           grlc_hCommGRLC
+#define hCommGMM            grlc_hCommGMM
+#define hCommLLC            grlc_hCommLLC
+#define hCommPL             grlc_hCommPL
+#ifdef FF_WAP
+  #define hCommWAP          grlc_hCommWAP    /*In future an own FMM Entity is planned*/
+#endif
+
+#define _decodedMsg   grlc__decodedMsg
+
+
+#ifdef GRLC_PEI_C
+       T_HANDLE hCommL1         = VSI_ERROR;
+       T_HANDLE hCommGRLC       = VSI_ERROR;
+       T_HANDLE hCommGRR        = VSI_ERROR;
+       T_HANDLE hCommGMM        = VSI_ERROR;
+       T_HANDLE hCommLLC        = VSI_ERROR;
+       T_HANDLE hCommPL         = VSI_ERROR;
+#ifdef FF_WAP
+       T_HANDLE hCommWAP         = VSI_ERROR;
+#endif
+       T_HANDLE GRLC_handle;
+
+
+
+GLOBAL UBYTE          _decodedMsg [MAX_MSTRUCT_LEN_GRLC];
+
+/*
+ * make the pei_create function unique
+ */
+#define pei_create              grlc_pei_create
+
+/*
+ * make the pei_func_primitive function unique
+ */
+#define pei_func_primitive      grlc_pei_func_primitive
+
+#else  /* !GRLC_PEI_C */
+EXTERN T_HANDLE hCommL1;
+EXTERN T_HANDLE hCommGRLC;
+EXTERN T_HANDLE hCommGRR;
+EXTERN T_HANDLE hCommGMM;
+EXTERN T_HANDLE hCommLLC;
+EXTERN T_HANDLE hCommPL;
+#ifdef FF_WAP
+ EXTERN T_HANDLE hCommWAP;
+#endif
+EXTERN T_HANDLE GRLC_handle;
+#endif /* GRLC_PEI_C */
+
+
+EXTERN UBYTE          _decodedMsg [MAX_MSTRUCT_LEN_GRLC];
+
+#ifdef _TARGET_
+
+#undef TRACE_FUNCTION
+#define TRACE_FUNCTION(a)
+#undef TRACE_ISIG
+#define TRACE_ISIG(a)
+
+#endif /* _TARGET_ */
+
+#endif /* GRLC_H */