view src/g23m-gprs/grr/grr.h @ 174:097e25b925a2

doc/Compiling: gtm900 target added
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 19 Jun 2019 06:15:56 +0000
parents d393cd9bb723
children
line wrap: on
line source

/* 
+----------------------------------------------------------------------------- 
|  Project :  GPRS (8441)
|  Modul   :  GRR
+----------------------------------------------------------------------------- 
|  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 GRR.
+----------------------------------------------------------------------------- 
*/   
#ifndef GRR_H
#define GRR_H

/*
 * Start defintions from entity RR
 */

/*
 ****************************************************************************
 * The following declarations shall be identical with the corresponding 
 * declarations located in RR. 
 ****************************************************************************
 */

EXTERN UBYTE     std;
EXTERN UBYTE     rr_csf_get_radio_access_capability( T_ra_cap *ra_cap );
EXTERN T_rf_cap* rr_csf_get_rf_capability          ( void             );
#ifdef TI_PS_FF_QUAD_BAND_SUPPORT
#ifdef _SIMULATION_ 
EXTERN void rr_csf_check_rfcap (UBYTE init);
#endif
#endif
#if defined (REL99) AND defined (TI_PS_FF_EMR)
EXTERN BOOL      rr_get_support_for_emr            ( void             );
#endif

#define MAX_CLASSES 5

EXTERN const SHORT p_dcs [MAX_CLASSES];
EXTERN const SHORT p_pcs [MAX_CLASSES];
EXTERN const SHORT p_gsm [MAX_CLASSES];

#define MAX_PCL     32

EXTERN const UBYTE p_control_gsm [MAX_PCL];
EXTERN const UBYTE p_control_dcs [MAX_PCL];
EXTERN const UBYTE p_control_pcs [MAX_PCL];

typedef struct
{
  USHORT l_f;
  USHORT o_f;
  UBYTE  b_f[32];
} T_f_range;

typedef struct
{
  UBYTE b_f[128];
} T_LIST;

EXTERN void for_create_channel_list ( T_f_range *f_range,
                                      T_LIST    *cha_list         );

EXTERN void srv_merge_list          ( T_LIST    *target_list, 
                                      T_LIST    *list             );

EXTERN int  srv_create_list         ( T_LIST    *list,
                                      USHORT    *channel_array,
                                      USHORT     size,
                                      UBYTE      start_with_zero,
                                      USHORT     start_index      );


#ifdef _TARGET_

EXTERN void srv_get_cell_alloc_list ( T_LIST    *target_list      );

#endif

#define RX_QUAL_UNAVAILABLE           0xFF

#ifdef FF_PS_RSSI
#define RX_ACCE_UNAVAILABLE           0xFF
EXTERN void RX_SetValue             ( UBYTE new_value, UBYTE new_qual, UBYTE new_access);
#else
EXTERN void RX_SetValue             ( UBYTE      new_value        );
#endif

/*
 ****************************************************************************
 * The above declarations shall be identical with the corresponding 
 * declarations located in RR. 
 ****************************************************************************
 */

/*
 * End defintions from entity RR
 */

typedef struct /* T_MS_PWR_CAP */
{
  const SHORT *p;          /* power class -> output power              */
  const UBYTE *p_control;  /* power control level -> output power      */
        UBYTE  ms_power;   /* MS power class                           */
        SHORT  pwr_offset; /* POWER_OFFSET                             */
        SHORT  pwr_max;    /* maximum nominal output power in the cell */
        SHORT  pwr_min;    /* minimum nominal output power in the cell */
        SHORT  gamma_0;    /* GAMMA 0                                  */
        UBYTE  band_ind;   /* indicates the used frequency band        */
} T_MS_PWR_CAP;

/*
 * defines the user of the vsi interface
 */
#define VSI_CALLER            GRR_handle,
#define VSI_CALLER_SINGLE     GRR_handle 

/*
 * Macros
 */
#ifdef REL99 
#define MAX_PSI                             9 /* Maximum number of PSIs: PSI1,2,3,3bis,3ter,4,5,8,13 */
#else
#define MAX_PSI                             7 /* Maximum number of PSIs: PSI1,2,3,3bis,4,5,13*/
#endif

#define ENCODE_OFFSET                       0

/*
 * 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)

/*
 * Constants
 */

/* 
 * Disable Get State traces only for target enviroment
 */
#ifdef _TARGET_
#undef GET_STATE
#define GET_STATE(P)        (ENTITY_DATA->P state)
#endif

#define MA_NUMBER_4_PSI13_OR_CELL_ALLOC     14 /* MA_NUMBER used to reference a Mobile Allocation
                                                  (MA) received in PSI13, which may referenced from
                                                  an assignment message or which referes to the cell
                                                  allocation defined for the cell in SI1 or PSI2*/

#define MA_NUMBER_4_ASSIGNMENT               15 /* MA_NUMBER used to reference a MA received in a previous assignent*/

#if 1 //#ifdef REL99	/* FreeCalypso change to pass !REL99 compilation */
#define GRR_FREQ_PARAM_RECEIVED_IN_ASSIGNMENT 0
/* 
 * This refers to freq param that is received in non assignment
 * messages like PSI 8 and PSI 14 
 */
#define GRR_FREQ_PARAM_RECEIVED_IN_NON_ASSIGNMENT 1 
#endif

/*
 * Define the size of the GRR queue in frame
 */
#define PEI_PRIM_QUEUE_SIZE 20



#define FN_MAX           0x297000
#define GRR_INVALID_FN   0xFFFFFFFF


/*
 * Macros for handling of individual bits within a value used as flags
 */
#define SET_FLAG(val,mask,flag,type)  (val=(((val)&(~(type)(mask)))|(flag)))
#define IS_FLAGGED(val,mask,flag)     ((val & mask ) EQ flag)
#define IS_NOT_FLAGGED(val,mask,flag) ((val & mask ) NEQ flag)

/*
 * Defines for the gprs_database
 */

/*
 * Service states 
 */
#define GPRS_SERVICE_NONE        0 /* no service      */
#define GPRS_SERVICE_LIMITED     1 /* limited service */
#define GPRS_SERVICE_FULL        2 /* full service    */

typedef UBYTE T_GPRS_SERVICE;

/*
 * Access states 
 */
#define GPRS_ACCESS_BARRED       0 /* access barred   */
#define GPRS_ACCESS_ALLOWED      1 /* access allowed  */

typedef UBYTE T_ACCESS_STATUS;


 /*
  * Maximum number of IMSI digits
  */
#define MAX_IMSI_DIGITS         16

#define SEG_CTRL_BLOCK_SIZE      8

#ifdef REL99
 /*
  * Network Release 
  */
#define  BSS_NW_REL_97 0
#define  BSS_NW_REL_99 1
#define  BSS_NW_REL_04 2

#endif


/*
start constants for CTRL
*/
/* final states */
#define GLBL_PCKT_MODE_NULL                     0
#define GLBL_PCKT_MODE_SUSP                     1
#define GLBL_PCKT_MODE_SYNC                     2
#define GLBL_PCKT_MODE_IDLE                     3 
#define GLBL_PCKT_MODE_ACCESS                   4
#define GLBL_PCKT_MODE_ASSIGNED                 5
#define GLBL_PCKT_MODE_TRANSFER                 6
#define GLBL_PCKT_MODE_RELEASED                 7

/* transitions states from NULL mode to others */
#define GLBL_PCKT_MODE_NULL_IDLE                8

/* transitions states from suspended mode to others */
#define GLBL_PCKT_MODE_SUSP_IDLE                9

/* transitions states from suspended mode to others */
#define GLBL_PCKT_MODE_SYNC_IDLE               10

/* transitions states from packet idle mode to others */
#define GLBL_PCKT_MODE_IDLE_ACCESS             11 
#define GLBL_PCKT_MODE_IDLE_ASSIGNED           12
#define GLBL_PCKT_MODE_IDLE_TRANSFER           13

/* transitions states from packet access mode to others */
#define GLBL_PCKT_MODE_ACCESS_IDLE             14
#define GLBL_PCKT_MODE_ACCESS_ASSIGNED         15
#define GLBL_PCKT_MODE_ACCESS_TRANSFER         16
#define GLBL_PCKT_MODE_ACCESS_TWO_PHASE        17

/* transitions states from packet assigned mode to others */
#define GLBL_PCKT_MODE_ASSIGNED_IDLE           18
#define GLBL_PCKT_MODE_ASSIGNED_TRANSFER       19

/* transitions states from packet transfer mode to others */
#define GLBL_PCKT_MODE_TRANSFER_IDLE           20
#define GLBL_PCKT_MODE_TRANSFER_RELEASED       21
#define GLBL_PCKT_MODE_TRANSFER_ACCESS         22

/* transitions states from packet released mode to others */
#define GLBL_PCKT_MODE_RELEASED_IDLE           23
#define GLBL_PCKT_MODE_RELEASED_ACCESS         24

/* transitions states from measurement report mode to others */
#define GLBL_PCKT_MODE_MEAS_REP_IDLE           25


typedef UBYTE T_GLBL_PCKT_MODE;

#define CTRL_TASK_NONE                          0
#define CTRL_TASK_PBCCH_LEAVE_NULL              1
#define CTRL_TASK_PBCCH_LEAVE_SUSP              2
#define CTRL_TASK_PBCCH_LEAVE_SYNC              3
#define CTRL_TASK_PBCCH_LEAVE_IDLE              4
#define CTRL_TASK_PBCCH_LEAVE_ACCESS            5
#define CTRL_TASK_PBCCH_LEAVE_TRANSFER          6
#define CTRL_TASK_BCCH                          7

typedef UBYTE T_CTRL_TASK;
/*
end constants for CTRL
*/


/*
start constants for TC
*/
#define RADIO_PRIO_4         3

#define RFL_NUMBER_4_DIRECT_ENCODING_2 (RFL_NUMBER_4_DL_CTRL_MSG_MAX + 1)
/*
end constants for TC
*/

/* MAC HEADER TYPE*/
#define CTRL_BLK_NO_OPT     1
#define CTRL_BLK_OPT        2


/*
start constants for MEAS
*/
/* maybe for later use */
/* 
#define M_ROUND_UP(x,meas_acrcy) (((x)>=0)?                                        \
                                  ((((x)%(meas_acrcy))< ((meas_acrcy)/ 2))?        \
                                   ( (x)/(meas_acrcy)   ):(((x)/(meas_acrcy))+1)): \
                                  ((((x)%(meas_acrcy))<=((meas_acrcy)/-2))?        \
                                   (((x)/(meas_acrcy))-1):( (x)/(meas_acrcy)   )))
*/

#define M_ROUND_UP(x,meas_acrcy)  ((((x)%(meas_acrcy))< ((meas_acrcy)/ 2))?        \
                                   ( (x)/(meas_acrcy)   ):(((x)/(meas_acrcy))+1))
#define NORM_POW_MIN            (ULONG)1000 /* normalised math. power        */
                                            /* function maximum value        */
#define NORM_TAVGW_FAC          (ULONG)10   /* normalised Tavg_w factor      */
#define DRX_NORM_FACTOR         (NORM_TAVGW_FAC*NORM_POW_MIN)

#define MEAS_ACRCY 1000 /* accuracy */ 

#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
/*
end constants for MEAS
*/

/*
start constants for CS
*/
#define CS_RLA_P_VALID       0x0  /* RLA_P value is available and valid                   */
#define CS_RLA_P_NOT_VALID   0x1  /* RLA_P value is available but not valid.              */
#define CS_RLA_P_NOT_AVAIL   0x2  /* RLA_P value is not available and therefore not valid */


#define CS_KEEP_MEAS_RSLT    0x0         /* Keep all measurement results.  */
#define CS_DELETE_MEAS_RSLT  0x1         /* Delete all measurement results. */
#define CS_CRMM_BA_GPRS      0x0         /* Cell re-selection measurement on BA(GPRS), forward results to GRR. */
#define CS_CRMM_BA_BCCH      0x1         /* Cell re-selection measurement on BA(BCCH), forward results to ALR. */

#define CS_MIN_RLA_P_SAMPLES 5 /* At least 5 received signal measurement */
                                /* samples are required for a valid RLA_P */
                                /* value.                                 */

#define CS_MIN_RUN_AVG_PRD   1002 
                                /* RLA_P shall be a running average       */
                                /* determined using sample collected over */
                                /* a period of 5 sec. to ... sec.,        */
                                /* CS_MIN_RUN_AVG_PRD defines 5 sec.     */
                                /* minus 7.5 % in units of frames. 7.5 %  */
                                /* are substracted to be more tolerant    */
                                /* in time which allows to validate also  */
                                /* data which are colleted in less than   */
                                /* 5 sec.                                 */

#define CS_RPT_PRD_PTM       104
                                /* The MPHP_TCR_MEAS_IND primitive is     */
                                /* sent every 104 TDMA frames.            */

#define CS_NCSYNC_RPT_PRD_PIM 2080
                                /* CS_NCSYNC_RPT_PRD_PIM =2080 frame eqivalent to
                                   10 second 104 TDMA frames.            */

#define CS_MAX_MEAS_RSLT     10 
                                /* a maximum number of measurement        */
                                /* results are taken into account for     */
                                /* RLA_P calculation, exceeding samples   */
                                /* are ignored.                           */

#define CS_IDX_NOT_USED      0xFF

/* band limitations for multiband reporting */
#define CS_NO_BAND_LIMITATION   0
#define CS_EXCLUDE_SC_BAND      1
#define CS_ONLY_SC_BAND         2

/* maximum number of strongest carrier consider for cell re-selection */
#if defined FF_EOTD
  #define CS_MAX_STRONG_CARRIER    12
  #define CS_MAX_STRONG_CARRIER_CR 6

  #if ( ! ( CS_MAX_STRONG_CARRIER_CR <= CS_MAX_STRONG_CARRIER ) )
    #error CS_MAX_STRONG_CARRIER_CR <= CS_MAX_STRONG_CARRIER required
  #endif

#else  /* #if defined FF_EOTD */
  #define CS_MAX_STRONG_CARRIER    6
#endif /* #if defined FF_EOTD */

#if ( ! ( CS_MAX_STRONG_CARRIER <= RRGRR_MAX_ARFCN_NCELL_SYNC_REQ ) )
  #error CS_MAX_STRONG_CARRIER <= RRGRR_MAX_ARFCN_NCELL_SYNC_REQ required
#endif

#if defined (REL99) AND defined (TI_PS_FF_EMR) AND defined (TI_PS_FF_RTD)
#else
#if ( ! ( ( RRGRR_MEAS_REP_LIST_SIZE - 1 /* subtract serving cell */ ) <= CS_MAX_STRONG_CARRIER ) )
  #error RRGRR_MEAS_REP_LIST_SIZE <= CS_MAX_STRONG_CARRIER required
#endif
#endif

/* extrem values for signed 16 bit values */
#define CS_SMALLEST_SHORT_VALUE (-32768)

#define BSIC_NCC_MASK           0x38

#define NC_GET_TYPE(info_src)          ((info_src&0xF000)>>12)

#define NC_SET_TYPE(info_src,type)     (info_src=(USHORT)((info_src&0x0FFF)|((USHORT)type<<12)))
#define NC_SET_INSTANCE(info_src,inst) (info_src=(USHORT)((info_src&0xF0FF)|((USHORT)inst<< 8)))
#define NC_SET_NUMBER(info_src,num)    (info_src=        ((info_src&0xFF00)|((USHORT)num     )))

#define CS_RESELECT_CAUSE_CTRL_NORMAL   0
#define CS_RESELECT_CAUSE_CTRL_ABNORMAL 1
#define CS_RESELECT_CAUSE_CTRL_SCELL    2
#define CS_RESELECT_CAUSE_CS_NORMAL     3
#define CS_RESELECT_CAUSE_CTRL_DL_SIG_FAIL   4


typedef UBYTE T_CS_RESELECT_CAUSE;
typedef UBYTE T_CS_DC_STATUS;

#define MAX_NR_OF_NC_MVAL               ((2*MAX_NR_OF_NCELL)+1)
/*
end constants for CS
*/

/*
start constants for PSI
*/
#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) )
/*
end constants for PSI
*/

/*
start constants for interference measurements
*/

/* used in packet transfer mode */
#define MAX_IM_TRANSFER_CHANNELS 0x07

/* used in packet idle mode */
#define MAX_IM_CHAN_EMEAS      0x01
#define MAX_IM_CHAN_PCCCH      0x01

#define MAX_IM_IDLE_CHANNELS (MAX_CHAN_IMEAS + MAX_IM_CHAN_PCCCH + MAX_IM_CHAN_EMEAS)
                                    /* maximum number of channels measured in      */
                                    /* packet idle mode                            */

#define CHN_ID_INVALID         0xFF /* invalid identifier index                    */

#define CHN_ID_EM_BASE         0x00 /* EXT_FREQUENCY_LIST identifier index base    */
#define CHN_ID_PCCCH_BASE      ( CHN_ID_EM_BASE + MAX_IM_CHAN_EMEAS )
                                    /* monitored PCCCH identifier index base       */
#define CHN_ID_IM_BASE         ( CHN_ID_PCCCH_BASE + MAX_IM_CHAN_PCCCH )
                                    /* INT_MEAS_CHANNEL_LIST identifier index base */

/* used in packet idle and packet transfer mode */
#define IM_I_MASK_IDL          0x01
#define IM_I_MASK_TRNS         0x02
#define IM_I_NONE              0x00
#define IM_I_IDL               0x01
#define IM_I_TRNS              0x02

#define IM_U_MASK              0x01
#define IM_U_USED              0x01
#define IM_U_UNUSED            0x00

#define MAX_IM_HOP_ARFCN                548
#define MAX_IM_HOP_ARFCN_BIT_FIELD_SIZE ( ( ( MAX_IM_HOP_ARFCN - 1 ) / 8 ) + 1 )

#define MAX_IM_CHANNELS        ( MAX_IM_IDLE_CHANNELS + MAX_IM_TRANSFER_CHANNELS )
                                    /* maxmimum number of channels which are       */
                                    /* taken into account for interference         */
                                    /* measurement resumption                      */

/*
end constants for interference measurements
*/

/*
start constants for extended measurements
*/
#define MAX_NR_OF_INSTANCES_OF_PMO 8
#define EM_MAX_STRONG_CARRIER      6

#define EM_INVLD_BSIC              0xFF

#define EM_VLDTY_ARFCN_MASK        0x8000
#define EM_NON_VLD_ARFCN           0x8000
#define EM_VLD_ARFCN               0x0000

#define PMO_NONE_VLD               0x00
#define PMO_EXT_VLD                0x01
#define PMO_NC_VLD                 0x02
/*
end constants for extended measurements
*/

/*
start constants for NC measurements
*/

/*
end constants for NC measurements
*/

/*
start constants for packet measurement report sending
*/
#define PMR_MSG_TYPE_LEN       6
#define PMR_TLLI_LEN           32
#define PMR_FLAG_LEN           1
#define PMR_PSI5_CHNGE_MRK_LEN 2

#ifdef REL99
#define PMR_BA_IND_USED_LEN    1
#define PMR_PSI3_CHNGE_MRK_LEN 2
#define PMO_IND_USED_LEN       1
#endif

/*
end constants for packet measurement report sending
*/
#if defined  (REL99) AND defined (TI_PS_FF_EMR)
/*
 * start constants for ENH measurements
 */
#define SERVING_BAND_REPORTING_DEFAULT    3
#define NCC_PERMITTED_DEFAULT             0xFF   
#define NOT_APPLICABLE                    0xFF
#define BSIC_VALID                        0x1
#define BSIC_INVALID                      0x0
#define NC_INVBSIC_PEMR                   17
#define MSG_SIZE_PEMR                     184
#define MAND_SIZE_PEMR                    48
#define MAX_NR_OF_GSM_NC                  96    
#define REP_THRESHOLD_DEF                 0xFF                     
/*
 * end constants for ENH measurements
 */
#endif

#if defined (TI_PS_FF_RTD) AND defined (REL99)
/*
 * start constants for RTD
 */
#define RTD_DEFAULT_INDEX                 0
#define RTD_12BIT                         0x8000
#define RTD_NOT_AVAILABLE                 0xFFFF
/*
 * end constants for RTD
 */
#endif /* #if defined (TI_PS_FF_RTD) AND defined (REL99) */


/*
 * Number of instances of PSI
 */
#define MAX_NR_OF_INSTANCES_OF_PSI2       8 /* 1-8  */
#define MAX_NR_OF_INSTANCES_OF_PSI3       1 /* 1    */
#define MAX_NR_OF_INSTANCES_OF_PSI3BIS   16 /* 1-16 */
#if defined (REL99) AND defined (TI_PS_FF_EMR)
#define MAX_NR_OF_INSTANCES_OF_PSI3TER   16 /* 0-16 */
#endif
#define MAX_NR_OF_INSTANCES_OF_PSI4       8 /* 0-8  */
#define MAX_NR_OF_INSTANCES_OF_PSI5       8 /* 0-8  */
#ifdef REL99
#define MAX_NR_OF_INSTANCES_OF_PSI8       8 /* 0-8  */
#endif
#ifdef REL99
#define PBCCH_NOT_PRESENT    0x0           /* PBCCH not present in the cell  */
#define PBCCH_PRESENT        0x1           /* PBCCH present in the cell      */
#endif


#define NOT_SET 255

/*
 * Service definitions. Used to access service data with GET/SET_STATE.
 */


#define CTRL      ctrl.
#define CTRL_GLBL ctrl_glbl. /* global data, managed by CTRL, used by */
                             /* all GRR services                      */
#define TC        tc.
#define CPAP      cpap.
#define PSI       psi_assigned_data.
#define PG        pg.
#define MEAS      meas.
#define MEAS_IM   meas_im. /* service interference measurement */
#define MEAS_EM   meas_em. /* service extended measurement     */
#define CS        cs.
#define CS_MEAS   cs_meas. /* service cell re-selection measurement */
#define GFP       gfp.

#if defined (TI_PS_FF_RTD) AND defined (REL99)
typedef USHORT    T_RTD_VALUE;
#endif /* #if defined (TI_PS_FF_RTD) AND defined (REL99) */


/*
 * Timer definitions (also used by GRR_PEI.C)
 */

typedef enum
{
   T3134 = 0,       /* handled by service CTRL       */
   T3158,           /* handled by service CS         */
   T3162,           /* handled by service TC         */
   T3168,           /* handled by service TC         */
   T3170,           /* handled by service TC         */
   T3172_1,         /* handled by service TC         */

/* T3172_2, */      /* handeld by service TC         */
/* T3172_3, */      /* handeld by service TC         */
/* T3172_4, */      /* handeld by service TC         */
/* T3172_5, */      /* handeld by service TC         */
/* T3172_6, */      /* handeld by service TC         */
/* T3172_7, */      /* handeld by service TC         */

   T3174,           /* handled by service CTRL       */
   T3176,           /* handled by service CS         */
   T3178,           /* handled by service MEAS       */
   T3186,           /* handled by service TC         */
   T_60_SEC,        /* handled by service PSI        */
   T_30_SEC,        /* handled by service PSI        */
   T_10_SEC,        /* handled by service PSI        */
   T_IM_SYNC,       /* handled by service MEAS       */
   T15_SEC_CC,      /* handled by service CS         */
   T_TRANS_NON_DRX, /* handled by service PG         */
   T_NC2_NON_DRX,   /* handled by service PG         */
   T_COMP_PSI,      /* handled by service PSI        */
   T_RESELECT,      /* handled by service CS         */
#ifdef REL99
   T_POLL_TIMER,    /* handled by service CTRL       */
#endif

   TIMER_COUNT      /* !!! always the last entry !!! */    

} T_TIMER_INDEX;

/*      T3142_VALUE - assigned in message */
/*      T3158_VALUE - defined by parameter or random value */
#define T3162_VALUE       5000        /* ms */
/*      T3168_VALUE - assigned in system info (in GPRS Cell Options)
                      range 500,1000,...4000ms */
/*      T3172_VALUE - assigned in message */
#define T3174_VALUE       15000        /* ms */
#define T3176_VALUE       15000        /* ms */
/*      T3178_VALUE - defined by parameter or random value */
#define T3186_VALUE       5000        /* ms */
#define T3134_VALUE       5000        /* ms Timer to detect the lacks of respond
										from the  network or for unvavailable target cell*/

/*      T3200_VALUE - see T3198 */
/*      T_IM_SYNC_VALUE - defined by service MEAS */

#define T_10_SEC_VALUE    10000
#define T_30_SEC_VALUE    30000
#define T_60_SEC_VALUE    60000
#define T_RESELECT_VALUE  10000



/*
 * Service name definitions for trace purposes. The service abbrevation
 * (e.g. CTRL) has to be the same as above for the service definitions.
 */
#ifndef NTRACE

#define SERVICE_NAME_CTRL     "CTRL"
#define SERVICE_NAME_CTRL_GLBL "CTRL_GLBL"
#define SERVICE_NAME_TC       "TC"
#define SERVICE_NAME_CPAP     "CPAP"
#define SERVICE_NAME_PG       "PG"
#define SERVICE_NAME_MEAS     "MEAS"
#define SERVICE_NAME_MEAS_IM  "MEAS_IM"
#define SERVICE_NAME_MEAS_EM  "MEAS_EM"
#define SERVICE_NAME_PSI      "PSI"
#define SERVICE_NAME_CS       "CS"
#define SERVICE_NAME_CS_MEAS  "CS_MEAS"
#define SERVICE_NAME_GFP      "GFP"


#endif /* !NTRACE */


/*
 * Service CTRL
 */
#define CTRL_CELL_RESEL_NONE            0x00 /* no initiated cell re-selection */
#define CTRL_CELL_RESEL_RR              0x40 /* RR initiated cell re-selection */   
#define CTRL_CELL_RESEL_GRR             0x80 /* GRR initiated cell re-selection */
#define CTRL_CELL_RESEL_NW              0xC0 /* network initiated cell re-selection */

#define CTRL_CELL_RESEL_MASK            0xC0 /* bit maks for cell re-selection indication */

#define CTRL_SUSPENSION_NO              0x00 /* no suspension */
#define CTRL_SUSPENSION_YES             0x20 /* suspension */

#define CTRL_SUSPENSION_MASK            0x20 /* bit mask for suspension indication */

/* CTRL is in normal operation */
#define CTRL_NULL                       0x00 /* GPRS functionality is disabled */
#define CTRL_READY                      0x01 /* GPRS functionality is enabled, but service cannot be offered */
#define CTRL_ACCESS_DISABLED            0x02 /* service can be offered but is disabled */
#define CTRL_IN_PROGRESS                0x03 /* service is offered */

/* CTRL is waiting for several confirmations */
#define CTRL_WAIT_CS_PAGE_RES           0x04 /* waiting for response to circuit-switched paging */
#define CTRL_WAIT_FOR_CNF_OF_SUSPENSION 0x05 /* waiting for suspension of GRR sevices */
#define CTRL_WAIT_RSP_4_RR_CR           0x06 /* waiting for stopping of GRR services triggered by a RR indicated cell re-selection request */

/* CTRL is processing several cell change procedures */
#define CTRL_CR                        (0x07|CTRL_CELL_RESEL_GRR)
                                             /* GRR has triggered a MS controlled cell re-selection */
#define CTRL_FAILED_CR                  0x08 /* GRR triggered MS controlled cell re-selection has failed */
#define CTRL_RR_NC_CCO                 (0x09|CTRL_CELL_RESEL_NW)
                                             /* RR  has triggered a network controlled cell re-selection */
#define CTRL_GRR_NC_CCO                (0x0A|CTRL_CELL_RESEL_NW)
                                             /* GRR has triggered a network controlled cell re-selection */
#define CTRL_AUTO_RR_CR                (0x0B|CTRL_CELL_RESEL_RR)
                                             /* RR  has indicated a request for a cell re-selection */

/* GRR is suspended */
#define CTRL_SUSPENDED                 (0x0C|CTRL_SUSPENSION_YES)
                                              /* GRR is suspended */
#define CTRL_NO_CELL_SUSP              (0x0D|CTRL_SUSPENSION_YES)
                                              /* GRR is suspended and no cell is available */

#define CTRL_ACC_ENABLED_SUSP          (0x0E|CTRL_SUSPENSION_YES)
                                             /* GRR is suspended but after resume service is available */
#define CTRL_RR_CR_IN_SUSP             (0x0F|CTRL_CELL_RESEL_RR|CTRL_SUSPENSION_YES)
                                             /* GRR is suspended and RR has indicated a request for a cell re-selection */
#define CTRL_CR_IN_SUSP                (0x10|CTRL_CELL_RESEL_GRR|CTRL_SUSPENSION_YES)
                                             /* GRR is suspended and has triggered a cell re-selection */
#define CTRL_FAILED_CR_IN_SUSP          0x11 /* GRR is suspended and has detected a failed cell re-selection */

#define CTRL_READY_TO_PROGRESS          0x12 /* service can be offered but a cell reselection is in progress */

/*
 * Service TC
 */
#define TC_ACCESS_DISABLED          0
#define TC_CPAP                     1
#define TC_PIM                      2
#define TC_WAIT_ASSIGN              3
#define TC_POLLING                  4
#define TC_WAIT_2P_ASSIGN           5
#define TC_CONTENTION_RESOLUTION    6
#define TC_TBF_ACTIVE               7
#define TC_SINGLE_BLOCK             8
#define TC_WAIT_STOP_TASK_CNF       9



/*
 * Service CPAP
 */
#define CPAP_IDLE                 0
#define CPAP_SB_STARTED           1
#define CPAP_1P_STARTED           2
#define CPAP_WAIT_PDCH_ASSIGN     3
#define CPAP_WAIT_DEDI_SUSPEND    4
#define CPAP_WAIT_STOP_TASK_CNF   5


/*
 * Service PSI
 */
#define PSI_NULL                  0
#define PSI_IDLE                  1
#define PSI_TRANSFER              2
#define PSI_SUSPENDED             3
#define PSI_BCCH_IDLE             4
#define PSI_BCCH_TRANSFER         5

#define READ_COMPLETE                     0x0         /* Read PSI in all PBCCH blocks   */
#define READ_PSI1_IN_PSI1_REPEAT_PERIODS  0x1         /* Read PSI1 in PSI1 repeat periods */
#define PSI_IN_HR                         0x2         /* PSI in high repetition rate    */
#define PSI_IN_LR                         0x3         /* PSI in low repetition rate     */
#define PSI_IN_HR_AND_LR                  0x4         /* PSI in high and low repetition rate */
#define READ_PSI1_AND_IN_HR               0x5         /* PSI in high repetition rate and PSI1 */
#define READ_PSI1_AND_IN_LR               0x6         /* PSI in low repetition rate and PSI1 */
#define READ_PSI2                         0x7         /* Read PSI2                      */
#define READ_PSI3_3BIS                    0x8         /* Read PSI3 and PSI3bis          */
#define READ_PSI4                         0x9         /* Read PSI4                      */
#define READ_PSI5                         0xa         /* Read PSI5                      */
#ifdef REL99
#ifdef TI_PS_FF_EMR
#define READ_PSI3BIS                      0xb         /* Read PSI3bis  */
#define READ_PSI3TER                      0xc         /* Read PSI3ter  */
#define READ_PSI3_3BIS_3TER               0xd         /* Read PSI3, PSI3bis and PSI3ter */
#endif
#define READ_PSI8                         0xe         /* Read PSI8. this value is used while performing partial acquisition */  
#endif                               
                                  
/*
 * Service PG
 */
#define PG_NULL           0
#define PG_IDLE           1
#define PG_TRANSFER       2
#define PG_ACCESS         3


/*
 * Service MEAS
 */
#define MEAS_NULL         0
#define MEAS_IDLE         1
#define MEAS_ACCESS       2
#define MEAS_TRANSFER     3


/*
 * Service MEAS_IM
 */
#define MEAS_IM_NULL      0
#define MEAS_IM_START     1
#define MEAS_IM_STOP_REQ  2


/*
 * Service MEAS_EM
 */
#define MEAS_EM_NULL           0 /* no activity ongoing except that timer   */
                                 /* T3178 is maybe running                  */


#define MEAS_EM_REP_REQ        1 /* waiting for measurement report data     */
#define MEAS_EM_PMR_SENDING    2 /* measurement report is currently sent to */
                                 /* the network                             */
#define MEAS_EM_PENDING        3 /* measurements are paused, e.g. TBF is    */
                                 /* active                                  */
#define MEAS_EM_SUSPEND        4 /* measurements are suspended, e.g. RR     */
                                 /* connection establishment in progress    */

/*
 * Service CS
 */
#define CS_NULL               0 /* no activity ongoing                        */
#define CS_IDLE               1 /* service CS in idle mode, cell re-selection */
                                /* and/or NC measurements are performed       */
#define CS_CR_MOBILE          2 /* MS controlled cell re-selection ongoing    */
#define CS_CR_NETWORK         3 /* network controlled cell re-selection       */
                                /* ongoing                                    */
/*
 * Service CS_MEAS
 */
#define CS_MEAS_NULL          0 /* no activity ongoing                        */
#define CS_MEAS_REP_REQ       1 /* waiting for measurement report data        */
#define CS_MEAS_PMR_SENDING   2 /* measurement report is currently sent to    */
                                /* the network                                */

/*
 * Service CS_DC
 */
#define CS_DC_DEDICATED       0 /* CS is stopped due to dedicated connection  */
#define CS_DC_OTHER           1 /* CS is stopped due to other reasons         */


/*
 * Service GFP
 */

#define GFP_IDLE      0

#ifdef REL99
#define GRR_PCCO_POLL 1
#endif


/*==== TYPES ======================================================*/

/*
 * GRR global typedefs
 */

/* enums */
typedef enum
{
  REL_PERFORMED,
  REL_RUNNING
}T_RELEASE_STATE;

/*
 * mapping of the TC disable cause
 *
 * 7 6 5 4 3 2 1 0 - bit position
 *       | | | | |
 *       | | | +-+-- 00  OTHER
 *       | | | +-+-- 01  SUSPEND
 *       | | | +-+-- 10  CR
 *       | | |
 *       +-+-+------ 000 OTHER
 *       +-+-+------ 001 NORMAL
 *       +-+-+------ 010 IMM_REL
 *       +-+-+------ 011 NETWORK
 *       +-+-+------ 100 ABNORMAL
 */


/* disable cause class */
#define DCC_OTHER              0x00
#define DCC_SUSPEND            0x01
#define DCC_CR                 0x02

typedef UBYTE T_TC_DC_CLASS;

/* disable cause type */
#define DCT_OTHER             (0x00<<2)
#define DCT_NORMAL            (0x01<<2)
#define DCT_IMM_REL           (0x02<<2)
#define DCT_NETWORK           (0x03<<2)
#define DCT_ABNORMAL          (0x04<<2)

typedef UBYTE T_TC_DC_TYPE;

/* disable cause mask */
#define DCM_CLASS              0x03
#define DCM_TYPE              (0x07<<2)

#define TC_DC_OTHER           (DCC_OTHER  |DCT_OTHER   )
#define TC_DC_SUSPEND_NORMAL  (DCC_SUSPEND|DCT_NORMAL  )
#define TC_DC_SUSPEND_IMM_REL (DCC_SUSPEND|DCT_IMM_REL )
#define TC_DC_CR_NETWORK      (DCC_CR     |DCT_NETWORK )
#define TC_DC_CR_NORMAL       (DCC_CR     |DCT_NORMAL  ) /* RRGRR_CR_IND( CR_NORMAL   )                */
#define TC_DC_CR_IMM_REL      (DCC_CR     |DCT_IMM_REL ) /* RRGRR_CR_IND( CR_ABNORMAL )                */
#define TC_DC_CR_ABNORMAL     (DCC_CR     |DCT_ABNORMAL) /* abnormal TBF release with cell reselection */

typedef UBYTE T_TC_DISABLE_CAUSE;

typedef enum
{
  PSI_DC_OTHER,
  PSI_DC_READ_PSI,
  PSI_DC_PBCCH_RELEASED,
  PSI_DC_PBCCH_ESTABLISHED
} T_PSI_DISABLE_CAUSE;



typedef enum
{
  TRANSFER_NDRX,
  GMM_NDRX,
  NC2_NDRX
}T_NON_DRX_TYPE;

typedef enum
{
  PACKET_MODE_NULL,
  PACKET_MODE_PIM,    /* Packet Idle Mode */
  PACKET_MODE_PAM,    /* Packet Access Mode */
  PACKET_MODE_PTM,    /* Packet Transfer Mode */
  PACKET_MODE_2P_PTM  /* Packet Transfer Mode in 2P Access*/
} T_PACKET_MODE;

typedef UBYTE T_TBF_TYPE; /* macros are defined in cgrlc SAP*/


typedef enum
{
  CTRL_PTRC_NONE,
  CTRL_PTRC_PBCCH_ESTABLISHED,
  CTRL_PTRC_COMPLETE_SI_READING,
  CTRL_PTRC_COMPLETE_PSI_READING
} CTRL_PSI_TBF_REL_CAUSE;

typedef enum /* CTRL_FOLLOWING_SUSPENSION*/
{
  ACTIVATE_RR,            /*  activate RR to monitor CCCH and BCCH*/
  SEND_RR_EST_REQ,        /*  RR has to start RR establishment */
  SEND_RR_EST_RSP         /*  RR can accept the RR connection request*/
}CTRL_FOLLOWING_SUSPENSION;

typedef enum /*PG_STATES*/
{
  PG_NORMAL,
  PG_EXTENDED,
  PG_REORG
}PG_STATES;

typedef enum /*PG_CHANNEL for CS call*/
{
  PG_ON_CCCH,
  PG_ON_PCCCH
}PG_CHANNEL;

typedef enum /* ACQ_TYPE*/
{
  NONE,
  PARTIAL,
  COMPLETE,
  PERIODICAL_PSI1_READING,
  PERIODICAL_SI13_READING,
  FULL_PSI_IN_NEW_CELL
}ACQ_TYPE;


typedef enum /* T_FA_TYPE*/
{
  FA_NO_CURRENT,
  FA_NO_NEXT,
  FA_BITMAP,
  FA_REPEAT
}T_FA_TYPE;


/* start enum for TC */

/*
 * 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_TC        1 /* Packet Resource Request (Reallocation)        */

#define BLK_INDEX_MEAS      2 /* Packet Measurement Report (EXT Measurements)  */


#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;
typedef UBYTE T_BLK_OWNER;

/* end um for TC */

/* start enum for CPAP */

/*
 * The following enum will be used for IA and IAEXT
 */
typedef enum
{
  E_IA_NULL,             /* unforeseen mesage  content*/
  E_IA_SB_WITHOUT_TBF,   /* Single Block without TBF Establishment */
  E_IA_SB_2PHASE_ACCESS, /* Allocation for 2 Phase of 2_Phase-Access */
  E_IA_UL,               /* Uplink tbf Allocation */
  E_IA_DCCH,             /* continue on DCCH */
  E_IA_TMA,              /* it is the 1st of a 2 message assignment */
  E_IA_TMA_SECOND,       /* it is the 2nd of a 2 message assignment */
  E_IA_ERROR_RA        
} T_EVAL_IA;                    

typedef enum
{
  E_IA_DL_NOT_OURS,   /* message is not adressed to MS */
  E_IA_DL_IGNORE,     /* no effect on current tbf */
  E_IA_DL_TMA,        /* it is the 1st of a 2 message dl assignment */
  E_IA_DL_TMA_SECOND, /* it is the 2nd of a 2 message dl assignment */
  E_IA_DL_DCCH,       /* continue on DCCH */
  E_IA_DL_SB,         /* single block downlink */
  E_IA_DL_ASSIGN      /* valid message send mphp_assign_req */
} T_EVAL_IA_DL;

#define IA_TYPE_UL 0 /* last immediate assignment was for uplink direction   */
#define IA_TYPE_DL 1 /* last immediate assignment was for downlink direction */

typedef UBYTE T_IA_TYPE;



/* start enum for CTRL */

typedef enum /* T_FAILURE_SIGNAL */
{
  FAIL_SIG_DSF_IND,
  FAIL_SIG_PSI1OR_PSI13_RECEIPTION_FAILURE,
  FAIL_SIG_CTRL_ACCESS_BARRED
} T_FAILURE_SIGNAL;

/* end enum for CTRL */

/* start enum for interference measurements */

#define IM_MODE_NONE          0 /* no interf. meas. at all                     */
#define IM_MODE_IDLE          1 /* interf. meas. only in Packet Idle Mode      */
#define IM_MODE_TRANSFER      2 /* interf. meas. only in Packet Transfer Mode  */
#define IM_MODE_IDLE_TRANSFER 3 /* interf. meas. in Packet Transfer and Packet */
                                /* Idle Mode                                   */
typedef UBYTE T_MEAS_IM_MODE;

#define IM_TRIG_SIGNAL_NULL   0
#define IM_TRIG_SIGNAL_PAM    2
#define IM_TRIG_SIGNAL_PAUSE  3

typedef UBYTE T_MEAS_IM_TRIG_SIGNAL;

#define M_IM_TRACE_INPUT_VALUE  0x01 /* trace mask for the input values        */
#define M_IM_TRACE_OUTPUT_VALUE 0x02 /* trace mask for the output values       */
#define M_IM_TRACE_FREQUENCY    0x04 /* trace mask for the carrier frequencies */

/* end enum for interference measurements */

/* start enum for extended measurements */

typedef enum /* T_XMEAS_ORDER */
{
  EM_EM0,
  EM_EM1,
  EM_RESET,
  EM_EMPTY
} T_XMEAS_ORDER;

/* end enum for extended measurements */

/* start enum for NC measurements */

typedef enum
{
  NC_NC0    = 0,
  NC_NC1,
  NC_NC2,
  NC_RESET,
  NC_EMPTY
} T_NC_ORDER;

/* !!! do not start with value 0, use 1 instead !!!                              */
#define INFO_TYPE_PSI3         1 /* Packet System Information Type 3             */
#define INFO_TYPE_PSI3BIS      2 /* Packet System Information Type 3bis          */
/* !!! value of INFO_TYPE_PSI3 shall be less than value of INFO_TYPE_PSI3BIS !!! */
#define INFO_TYPE_PMO          3 /* Packet Measurement Order                     */
#define INFO_TYPE_PCCO         4 /* Packet Cell Change Order                     */
#define INFO_TYPE_BA_BCCH      5 /* BA(BCCH) passed by RR                        */

typedef UBYTE T_INFO_TYPE;

/* end enum for NC measurements */

/* start enum for cell re-selection */

#define CS_MODE_IDLE                0 /* entry not touched in any way           */
#define CS_MODE_SELECTION_PERFORMED 1 /* entry selected as next cell to be used */
                                      /* for cell re-selection and we have      */
                                      /* performed reading of the new cell      */

typedef UBYTE T_CS_MODE;

#define STAT_SYNC_NONE              0 /* not synchronised                       */
#define STAT_SYNC_OK                1 /* synchronised                           */
#define STAT_SYNC_FAILED            2 /* synchronisation failed                 */

typedef UBYTE T_SYNC_STATUS;

#define NC_MVAL_STAT_ASSIGNED       0 /* on current BA(GPRS) list, no member    */
                                      /* of the six strongest cells             */
#define NC_MVAL_STAT_PENDING        1 /* not on current BA(GPRS) list, update   */
                                      /* from RR required                       */
#define NC_MVAL_STAT_NONE           2 /* not on current BA(GPRS) list, no       */
                                      /* update from RR required                */
typedef UBYTE T_NC_MVAL_STATUS;

/* end enum for cell re-selection */

/*
 * Structure
 */
typedef struct
{
  UBYTE   num; /* Current number -identification- of the rfl*/
  
  UBYTE   list[128];   /* Buffer containing received frequencies: 
                       * This is the same structure as the T_LIST in RR.h
                       */
} T_RFL_LST;

typedef struct /* T_CR_POW_PAR */
{
  UBYTE           gprs_rxlev_access_min; /* GPRS_RXLEV_ACCESS_MIN        */
  UBYTE           gprs_ms_txpwr_max_cch; /* GPRS_MS_TXPWR_MAX_CCH        */
} T_CR_POW_PAR;

typedef struct /* T_CR_PAR_1 */
{
  T_CR_POW_PAR    cr_pow_par;            /* GPRS power parameter         */
  UBYTE           v_hcs_par;             /* valid flag for HCS structure */
  T_hcs_par       hcs_par;               /* HCS structure                */
} T_CR_PAR_1;

typedef struct /* T_SCELL_PAR */
{
  UBYTE                     cell_ba;
  UBYTE                     exc_acc;
  T_CR_PAR_1                cr_par_1;
  UBYTE                     multi_band_rep;
} T_SCELL_PAR;

typedef struct /* T_UL_TBF */
{
  UBYTE             tfi;
  UBYTE             st_tfi;       /* tfi will be used after starting time elapsed */
  UBYTE             mac_mode;
  UBYTE             polling_bit;
  UBYTE             ts_mask;      /* current timeslot mask */
  UBYTE             ts_usage;     /* new assigned timeslot mask, becomes valid after starting time has elapsed */
  UBYTE             nts;          /* number of timeslots allocated for tbf */
  UBYTE             cs_mode;
  UBYTE             tlli_cs_mode;
  UBYTE             ti;
  ULONG             tbf_start_fn;
  USHORT            rlc_db_granted;

  UBYTE             access_type;
  UBYTE             nr_blocks;
  UBYTE             prio;
  UBYTE             prim_type;
  USHORT            peak;
  USHORT            rlc_oct_cnt;
} T_UL_TBF;


typedef struct /* T_DL_TBF */
{
  ULONG             tbf_start_fn;
  UBYTE             tfi;
  UBYTE             st_tfi;       /* tfi will be used after starting time elapsed */
  UBYTE             rlc_mode;
  UBYTE             mac_mode;  
  UBYTE             polling_bit;
  UBYTE             ctrl_ack_bit;
  UBYTE             ts_mask;      /* current timeslot mask */
  UBYTE             ts_usage;     /* new assigned timeslot mask, becomes valid after starting time has elapsed */
  UBYTE             nts;          /*  number of timeslots allocated for tbf */
  BOOL              t3192;        /*  if true t3192 is running, else timer is not running, triggerd by GRLC*/
  UBYTE             trans_id;     /* transaction id */

} T_DL_TBF;
typedef UBYTE T_RXLEV_AVG;

#if defined (REL99) AND defined (TI_PS_FF_EMR)
/* Start Enhanced Measurement Data Structures */

typedef struct /* T_GPRS_REPT_PRIO_DESC */
{
  UBYTE      num_cells;                    /* No. of cells for which report priority is available */
  UBYTE      rept_prio[MAX_NR_OF_GSM_NC];  /* Report priority for cells in BA */
} T_GPRS_REPT_PRIO_DESC;

/*
 * Enhanced data for reporting
 */
typedef struct /* T_ENH_REP_DATA */
{
  UBYTE                        rep_threshold;            /* Reporting threshold */
  UBYTE                        rep_offset;               /* Reporting offset */
} T_ENH_REP_DATA;

typedef struct /* T_GRR_ENH_PARA */
{
  UBYTE                        idx;                      /* to get on which instance of message */
                                                         /* the parameters are received */
  UBYTE                        rept_type;                /* PMR or PEMR */
  UBYTE                        rep_rate;                 /* Reporting rate */
  UBYTE                        inv_bsic_enabled;         /* Is Invalid BSIC reporting enabled? */
  UBYTE                        ncc_permitted;            /* NCC permitted bitmap */
  UBYTE                        multiband_rep;            /* Number of cells, in each non-serving cell band, to be reported */
  UBYTE                        servingband_rep;          /* Number of cells, in serving cell band, to be reported */
  UBYTE                        scale_order;              /* scale order */
  T_ENH_REP_DATA               enh_rep_data[MAX_NUM_BANDS]; /* Enhanced data for reporting */
  T_GPRS_REPT_PRIO_DESC        gprs_rept_prio_desc;      /* Report priority */
} T_GRR_ENH_PARA;

/*
/ * Used to store GSM NC list formed in RR, when PBCCH is absent * /
typedef struct  / * T_BA_BCCH_NCELL_INFO * /
{
  UBYTE             index;             / * index used for measurement reporting * /
  USHORT            arfcn;             / * Radio frequency * /
  UBYTE             bsic;              / * BSIC * /
} T_BA_BCCH_NCELL_INFO;
*/

typedef struct /* T_MEAS */
{
  USHORT arfcn;   
  UBYTE  rxlev; /* Actually, this is RLA_P */
} T_MEAS;

/* To form a ARFCN-RXLEV pair for coming out with list in desc order of RXLEV */
typedef struct /* T_ENH_STRNG_ARFCN_LIST */
{
  T_MEAS meas[MAX_NR_OF_NCELL];   
  UBYTE  num; 
} T_ENH_STRNG_ARFCN_LIST;

typedef struct /* T_BSIC */
{
  UBYTE bsic;   /* Decoded BSIC */
  UBYTE status; /* Valid, if present in BA-GPRS, Else, Invalid. */
} T_BSIC ;

typedef struct /* T_ENH_CELL_LIST */
{
  UBYTE             index;        /* BA-GPRS Index */
  USHORT            arfcn; 
  T_BSIC            bsic;
  UBYTE             rla_p;   /* Actually, this is used for ENH meas criteria */
  T_RXLEV_AVG       rxlev_avg; /* running avg of RXLEV which is reported */
  UBYTE             rept_prio;
} T_ENH_CELL_LIST;

/*
typedef struct / * T_ENH_BIN * /
{
  UBYTE     num_valid;  / * No. of cells that are eligible for ENH measurement
                           reporting * /
  T_ENH_CELL_LIST *enh_cell_list[MAX_NR_OF_NCELL];
} T_ENH_BIN;
*/

typedef struct /* T_ENH_BIN */
{
  UBYTE     num_valid;  /* No. of cells that are eligible for ENH measurement
                           reporting */
  UBYTE     enh_index[MAX_NR_OF_NCELL];
} T_ENH_BIN;

typedef struct /* T_PEMR_PARAMS */
{
  UBYTE     scale_used; /* Scale used for RXLEV before ENH reporting */
} T_PEMR_PARAMS;
  
/* End Enhanced Measurement Data Structures */
#endif

typedef struct /* T_IMSI */
{
  UBYTE               number_of_digits;  /*  number of valid digits in the following digit array */
  UBYTE               digit[MAX_IMSI_DIGITS];/*  here are the valid imsi digits stored: received from GMM */
}T_IMSI;

typedef struct /* T_MS_IDENT */
{
  ULONG                 ul_tlli;          /* uplink tlli used for packet resource request and contention resolution */
  ULONG                 received_tlli;      /*  tlli with which the MS is addressed */
  ULONG                 old_tlli;         /*  old tlli received from GMM*/
  ULONG                 new_tlli;        /*  new tlli received from GMM*/
  ULONG                 old_ptmsi;     /*  current  ptmsi paging */
  ULONG                 new_ptmsi;        /*  candidate ptmsi stored: for paging */
  ULONG                 tmsi;              /*  here is the valid tmsi stored: for paging */
  T_IMSI                imsi;             /*  imsi structure is stored in this parameter*/
  T_rai                 rai;              /*  routing area code received from GMM to be passed to RR */
} T_MS_IDENT;

typedef struct /* T_MS_DATA */
{
  USHORT                access_ctrl_class; /*                      */
  UBYTE                 class_of_mode;     /* A, BC, BG, CC, CG    */
  USHORT                split_pg_cycle;    /* SPLIT_PAGING_CYCLE   */
  UBYTE                 reverts_NMO_III;   /* Class B mobile reverts into Class C mobile in NMO III or not */
  UBYTE                 tbf_mon_ccch;      /* monitoring of CCCH during TBF allowed (TRUE) or not (FALSE)  */
} T_MS_DATA;

typedef struct /* T_SCELL */
{
  USHORT        arfcn;         /* ARFCN of the serving cell          */
  UBYTE         bsic;          /* BSIC of the serving cell           */
  BOOL          pbcch_present; /* this value will be set by the procedure   */
                               /* which handles the SI13 message            */
} T_SCELL;

typedef struct /* T_PBCCH */
{
  T_SCELL       bcch;       /* frequency and BSIC of BCCH carrier        */
  T_pbcch_des   pbcch_des;  /* this value contains the PBCCH description */
} T_PBCCH;

typedef struct /* T_SPGC_CCCH_SUPP */
{
  UBYTE            ms_supp;             /* mobile station support of split  */
                                        /* paging cycle on CCCH             */
  UBYTE            nw_supp;             /* network support of split paging  */
                                        /* cycle on CCCH                    */
}T_SPGC_CCCH_SUPP;

typedef struct /* T_NETWORK_CONTROL */
{
  T_SPGC_CCCH_SUPP spgc_ccch_supp;      /* SPLIT_PG_CYCLE_SUPPORT: whether it is supported or not   */
  UBYTE            priority_access_thr; /* packet access to the network according to priority level */
  UBYTE            bs_pa_mfrms;         /* number of 51 multiframes between */
                                        /* transmission of paging messages  */
} T_NETWORK_CONTROL;

typedef enum /* T_CR_IND_RETURN */
{
  CR_IND_RETURN_NONE,
  CR_IND_RETURN_RESPONSE,
  CR_IND_RETURN_COMPLETE
} T_CR_IND_RETURN;

typedef struct /* T_RR_STATES */
{
  BOOL            monitoring_stopped; /* whether the monitoring on CCCH is released or not */
  T_CR_IND_RETURN cr_ind_return;      /* cell reselection started or not                   */
}T_RR_STATES;

typedef enum /* T_GMM_STATES */
{
  STANDBY_STATE,  /* GMM is in stand by state */
  READY_STATE     /* GMM is in ready state    */
}T_GMM_STATES;

typedef struct /* T_PCCCH: hopping and non hopping*/
{
  BOOL        is_static;  /*  indicates whether the static parameters are valid or not*/
  UBYTE       tsc;        /* common*/
  UBYTE       tn;         /* common*/
  USHORT      arfcn;
  UBYTE       maio;
  UBYTE       ma_num;     /* Mobile Allocation number*/
}T_PCCCH;

typedef struct /* T_PAGING_GROUP */
{
  UBYTE kc; /* number of PCCCHs [1...16]*/
  T_PCCCH     pccch[MAX_PCCCH_DES]; /* this structure contains ARFCN, TSC, TN, MAIO (non) hopping*/
}T_PAGING_GROUP;

typedef struct /* T_EXT_FREQ_LIST */
{
  UBYTE            number;
  USHORT           freq[RRGRR_MAX_ARFCN_EXT_MEAS];
} T_EXT_FREQ_LIST;

typedef struct /* T_XMEAS_EM1_PARAM */
{
  UBYTE            reporting_type;
  UBYTE            ncc_permitted;
  UBYTE            int_frequency; /* is set to NOT_SET, if no data available*/
  UBYTE            reporting_period;
} T_XMEAS_EM1_PARAM;

typedef struct /* T_XMEAS_EM1 */
{
  T_XMEAS_EM1_PARAM param;
  T_EXT_FREQ_LIST   list;
} T_XMEAS_EM1;

typedef struct /* T_XMEAS */
{
  UBYTE           idx;            /* to get on which instance of message */
                                  /* the parameters are received         */
  T_XMEAS_ORDER   em_order_type;
  T_XMEAS_EM1     em1;
} T_XMEAS;

typedef struct /*T_int_meas_chan_lst*/
{
  UBYTE           v_arfcn;        /* valid-flag   for arfcn         */
  USHORT          arfcn;          /* ARFCN                          */

  UBYTE           v_ma_num_maio;  /* valid-flag   for ma and maio   */
  UBYTE           ma_num;         /* MA_NUMBER                      */
  UBYTE           maio;           /* MAIO                           */

  UBYTE           ts_alloc;       /* TIMESLOT_ALLOCATION            */
} T_int_meas_chan_lst;

typedef struct /* T_si13_pbcch_loc*/
{
  UBYTE v_si13_location;            /*  valid flag for si13 location. If set: si13_location is valid.
                                     *  Otherwise pbcch_location and psi1_repeat_period are valid.
                                     */
  UBYTE si13_location;

  UBYTE pbcch_location;
  UBYTE psi1_repeat_period;
} T_si13_pbcch_loc;

typedef struct
{
  U8                        stat;  /* Status of RLA_P value         */
  U8                        lev;   /* Received signal level measurement.     */
} T_rla_p;

typedef struct /* T_CR_CRITERIONS */
{
  SHORT             c1;             /* path loss criterion                   */
  SHORT             c31;            /* signal level threshold criterion      */
  SHORT             c32;            /* cell ranking criterion                */
} T_CR_CRITERIONS;

//typedef UBYTE T_RXLEV_AVG;

typedef struct /* T_scell_info */
{
  T_rla_p           rla_p;        /* running average of receive signal level */
  T_RXLEV_AVG       rxlev_avg;    /* running average of RXLEV value          */
  T_CR_CRITERIONS   cr_crit;      /* cell re-selection criterions            */
  UBYTE             cell_barred;  /* in case CS is requested to re-select    */
                                  /* a new serving cell, this flag avoid     */
                                  /* indentifying the current serving cell   */
                                  /* as the best one and suppress re-        */
                                  /* selection                               */
} T_scell_info;


typedef struct /* T_SYNC */
{
  T_SYNC_STATUS     status;            /* synchronisation status */
  UBYTE             sync_failed_cnt;   /* number of failed synchronisation attempts */
} T_SYNC;


typedef struct /* T_SYNC_INFO */
{
  T_SYNC            sync;              /* synchronisation */
  UBYTE             bsic;              /* BSIC */
} T_SYNC_INFO;

typedef struct /* T_CR_OFFSET */
{
  UBYTE             gprs_temp_offset;  /* GPRS_TEMPORARY_OFFSET */
  UBYTE             gprs_penalty_time; /* GPRS_PENALTY_TIME */
} T_CR_OFFSET;

typedef struct /* T_CR_PAR */
{
  UBYTE             cell_ba;           /* CELL_BAR_ACCESS_2 */

  UBYTE             exc_acc;           /* EXC_ACC */

  UBYTE             same_ra_scell;     /* SAME_RA_AS_SERVING_CELL */

  T_CR_PAR_1        cr_par_1;          /* basic cell re-selection parameter */

  T_CR_OFFSET       cr_offset;         /* parameter for GPRS temporary offset */

  UBYTE             gprs_resel_off;    /* GPRS_RESELECT_OFFSET */

  UBYTE             v_si13_pbcch;      /* whether SI13 PBCCH location is present or not
                                        * If not included, SI3 and SI4 in the neighbour
                                        * cell indicates if the neighbour cell supports GPRS
                                        */
  T_si13_pbcch_loc  si13_pbcch;        /* SI13_PBCCH_LOCATION structure */

} T_CR_PAR;

typedef USHORT T_INFO_SRC;

typedef struct /* T_NC_MVAL, measured values of one neighbour cell */
{
  T_rla_p           rla_p;             /* running average of receive signal level */
  T_RXLEV_AVG       rxlev_avg;         /* running average of RXLEV value */
  T_SYNC_INFO       sync_info;         /* information about synchronisation */
  USHORT            arfcn;             /* radio frequency */
  T_NC_MVAL_STATUS  status;            /* status of the entry */
} T_NC_MVAL;

typedef struct /* T_NC_MVAL_LIST */
{
  T_NC_MVAL         nc_mval[MAX_NR_OF_NC_MVAL];
} T_NC_MVAL_LIST;

typedef struct /* T_ncell_info */
{
  UBYTE             index;             /* index used for measurement reporting */
  T_INFO_SRC        info_src;          /* indicates which air interface message */
                                       /* was used to carry neighbour cell information */
  USHORT            arfcn;             /* Radio frequency */
  UBYTE             bsic;              /* BSIC */
  UBYTE             v_cr_par;          /* indicates whether cell re-selection parameter are valid */
  T_CR_PAR          cr_par;            /* cell re-selection parameter */
#if defined (REL99) AND defined (TI_PS_FF_EMR)
  UBYTE             last_rxlev;        /* RXLEV from the previous rep period */
  UBYTE             rep_count;         /* this is used to get how many times a
                                          cell in enhanced neighbour cell list
                                          is reported. Will be of use when 
                                          reporting low priority cells at 
                                          reduced rate */
#endif
} T_ncell_info;

typedef struct /* T_NC_CHNG_MRK */
{
  UBYTE           prev;           /* old change mark value */
  UBYTE           curr;           /* new change mark value */
} T_NC_CHNG_MRK;

typedef struct /* T_NC_PARAM */
{
  T_NC_CHNG_MRK   chng_mrk;       /* change mark                                 */
  UBYTE           idx;            /* to get on which instance of message         */
                                  /* the parameters are received                 */
  T_NC_ORDER      ctrl_order;     /* NETWORK_CONTROL_ORDER, NC0, NC1, NC2, RESET */
  UBYTE           non_drx_per;    /* NC_NON_DRX_PERIOD                           */
  UBYTE           rep_per_i;      /* NC_REPORTING_PERIOD_I                       */
  UBYTE           rep_per_t;      /* NC_REPORTING_PERIOD_T                       */
} T_NC_PARAM;

typedef struct /* T_NC_LIST */
{
  T_NC_CHNG_MRK   chng_mrk;              /* change mark               */
  UBYTE           number;                /* number of neighbour cells */
  T_ncell_info    info[MAX_NR_OF_NCELL]; /* neighbour cell info       */
} T_NC_LIST;

#if defined (REL99) AND defined (TI_PS_FF_EMR)
typedef struct /* T_BA_BCCH_NC_LIST */
{
  UBYTE           number;                /* number of neighbour cells */
  T_ncell_info    info[MAX_NR_OF_NCELL]; /* neighbour cell info       */
} T_BA_BCCH_NC_LIST;
#endif

typedef struct /* T_NCMEAS */
{
  T_NC_PARAM      param;
  T_NC_LIST       list;
} T_NCMEAS;

typedef struct /* T_NC_RFREQ_LIST */
{
  UBYTE           number;
  UBYTE           idx[MAX_NR_OF_NCELL];
} T_NC_RFREQ_LIST;

typedef struct /* T_NCMEAS_EXTENDED */
{
  T_NCMEAS        ncmeas;
  T_NC_RFREQ_LIST rfreq;
#if defined (REL99) AND defined (TI_PS_FF_EMR)
  UBYTE           psi3_cm; /* PSI3 CM received in PCCO */
  UBYTE           ba_ind;  /* BA_IND received in PCCO */
  UBYTE           pmo_ind; /* PMO sequence number */
#endif
} T_NCMEAS_EXTENDED;

typedef struct /* T_CNT_NC_SIX_STRGST */
{
  UBYTE            strgst;     /* number of carriers which belongs to the   */
                               /* strongest, valid RLA_P is required        */
  UBYTE            candid;     /* number of carriers which belongs to the   */
                               /* strongest plus candidates which may       */
                               /* become member of the strongest, available */
                               /* but not necessarily valid RLA_P is        */
                               /* required                                  */
} T_CNT_NC_SIX_STRGST;

typedef struct /* T_NC_SIX_STRGST */
{
  UBYTE            idx;
  T_CS_MODE        mode;       /* indicates the mode of an individual entry */
                               /* of the list of the six strongest cells    */
  ULONG            avail_time; /* time when inserted in list                */
  T_CR_CRITERIONS  cr_crit;    /* cell re-selection criterions              */
} T_NC_SIX_STRGST;

typedef struct /* T_NC_REF_LIST */
{
  T_NC_PARAM      *param;
#if defined (REL99) AND defined (TI_PS_FF_EMR)
  T_GRR_ENH_PARA  *enh_param;
#endif
  UBYTE            number;
  T_ncell_info    *info[MAX_NR_OF_NCELL+1];
                                /* there are MAX_NR_OF_NCELL carriers for      */
                                /* MS controlled cell re-selection and one for */
                                /* NW controlled in case the selected cell is  */
                                /* not in the neighbour cell list              */
} T_NC_REF_LIST;

#if defined (REL99) AND defined (TI_PS_FF_EMR)
typedef struct /* T_BA_BCCH_NC_REF_LIST */
{
  UBYTE           number;
  T_ncell_info    *info[2*MAX_NR_OF_NCELL];
} T_BA_BCCH_NC_REF_LIST;
#endif


/*start of structs for GFP */



typedef struct
{
  U8                        msg_type;           
  U8                        rrbp;               
  U8                        sp;                 
  U8                        usf;                
  U8                        v_rbsn;             
  U8                        rbsn;               
  U8                        rti;                
  U8                        fs;                 
  U8                        ac;                 
  U8                        pr;                 
  U8                        tfi;                
  U8                        d;                  
} T_D_CTRL;


typedef struct /* T_D_HEADER*/
{
  UBYTE                 payload;      /* deceides if the downlink block is a data or control block*/
  T_D_CTRL              d_ctrl;       /* saves the header of a dl rlc control block*/
  UBYTE *               ptr_block;
  UBYTE                 pctrl_ack;    /* value sent with packet control acknowledgement */
} T_D_HEADER;



typedef struct
{
  USHORT l_buf;
  USHORT o_buf;
  UBYTE  buf [BYTE_UL_CTRL_BLOCK];
} T_CS1BUF;


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_CTRL_BLK */
{
  UBYTE               rbsn;
  UBYTE               rti;
  ULONG               T3200;
  T_CS1BUF            ctrl_blk;
}T_CTRL_BLK;



typedef struct /* T_SEG_CTRL_BLK */   /*saves the first part of segmented control blocks*/
{
  UBYTE               next;
  T_CTRL_BLK          blk[SEG_CTRL_BLOCK_SIZE];
}T_SEG_CTRL_BLK;

typedef struct  /* parameterts of one fixed alloction*/
{
  T_p_fixed_alloc    alloc;
  ULONG              alloc_start_fn;
  ULONG              alloc_end_fn;
  UBYTE              final_alloc;
} T_FIX_ALLOC;


typedef struct  /* fixed alloction control during uplink tbf*/
{
  T_FA_TYPE           fa_type;
  T_FIX_ALLOC         current_alloc;
  BOOL                repeat_alloc;
  UBYTE               ts_overr;
  UBYTE               dl_ctrl_ts;   /* downlink control timeslot */
} T_FA_CONTROL;

typedef struct /* T_COMPLETE_ACQ */
{
  BOOL                needed;       /* complete acquisition needed???*/
  BOOL                psi1_ok;      /* PSI1 complete read?*/
  BOOL                psi2_ok;      /* PSI2 complete read?*/
  BOOL                made_at_least_one_attempt;  /* made at least one attempt? */
}T_COMPLETE_ACQ;

typedef struct /* T_PSI_STATE*/
{
  UBYTE state; /* NEEDED, RECEIPT_OK etc.*/
}T_PSI_STATE;

typedef struct /* T_PSI1_PARAMS */
{
  UBYTE               pbcch_change_mark;    /**/
  UBYTE               psi_change_field;     /**/
  UBYTE               psi_cnt_lr;           /*low repetition rate*/
  UBYTE               psi_cnt_hr;           /*high repetition rate*/
  UBYTE               psi1_repeat_period;   /**/
  BOOL                psi_status_supported; /*Checks whether the network supports PSI STATUS message or not*/
  BOOL                first_psi1;           /*whether the received PSI1 is the first one or not*/
}T_PSI1_PARAMS;

typedef struct /* T_PSI2_PARAMS */
{
  UBYTE               psi2_change_mark;       /**/
  UBYTE               psi2_count;             /**/
  UBYTE               instances[MAX_NR_OF_INSTANCES_OF_PSI2 + 1];           /*used for checking the consistency of PSI2. instances[0]: number of instances*/
}T_PSI2_PARAMS;

typedef struct /* T_PSI3_PARAMS */
{
  UBYTE               psi3_change_mark;       /**/
  UBYTE               psi3_bis_count;             /**/
}T_PSI3_PARAMS;

typedef struct /* T_PSI3bis_PARAMS */
{
  UBYTE               psi3bis_change_mark;       /**/
  UBYTE               psi3bis_count;             /**/
  UBYTE               psi3bis_index;
  UBYTE               instances[MAX_NR_OF_INSTANCES_OF_PSI3BIS + 1];           /*used for checking the consistency of PSI3bis. instances[0]: number of instances*/
}T_PSI3BIS_PARAMS;

#if defined (REL99) AND defined (TI_PS_FF_EMR)
typedef struct /* T_PSI3ter_PARAMS */
{
  UBYTE               psi3ter_change_mark;       /**/
  UBYTE               psi3ter_count;             /**/
  UBYTE               prev_psi3ter_index;
  UBYTE               psi3ter_index;
  UBYTE               instances[MAX_NR_OF_INSTANCES_OF_PSI3TER + 1];           /*used for checking the consistency of PSI3ter. instances[0]: number of instances*/
}T_PSI3TER_PARAMS;
#endif

typedef struct /* T_PSI4_PARAMS */
{
  UBYTE               psi4_change_mark;       /**/
  UBYTE               psi4_count;             /**/
  UBYTE               psi4_index;
  UBYTE               instances[MAX_NR_OF_INSTANCES_OF_PSI4 + 1];           /*used for checking the consistency of PSI4. instances[0]: number of instances*/
}T_PSI4_PARAMS;

typedef struct /* T_EXT_START_STOP */
{
  UBYTE start;
  UBYTE stop;
} T_EXT_START_STOP;

typedef struct /* T_PSI5_PARAMS */
{
  UBYTE               psi5_change_mark;       /**/
  UBYTE               psi5_count;             /**/
  UBYTE               psi5_index;
  UBYTE               instances[MAX_NR_OF_INSTANCES_OF_PSI5 + 1];           /*used for checking the consistency of PSI5. instances[0]: number of instances*/
  T_EXT_START_STOP    idx[MAX_NR_OF_INSTANCES_OF_PSI5]; /* used for sorting the EXT frequency lists */
#if defined (REL99) AND defined (TI_PS_FF_EMR)
  BOOL                v_enh_rep_param_struct; /* Will be set if ENH params
                                                 are present */
#endif
}T_PSI5_PARAMS;

#ifdef REL99
typedef struct /* T_PSI8_PARAMS */
{
  UBYTE               psi8_change_mark;       /**/
  UBYTE               psi8_count;             /**/
  UBYTE               psi8_index;
  UBYTE               instances[MAX_NR_OF_INSTANCES_OF_PSI8 + 1];/*used for checking the consistency of PSI8. instances[0]: number of instances*/
}T_PSI8_PARAMS;
#endif

typedef struct /* T_PSI13_PARAMS */
{
  UBYTE               bcch_change_mark;       /**/
  UBYTE               si13_change_mark;             /**/
}T_PSI13_PARAMS;


typedef struct
{
  UBYTE  Rx;
  UBYTE  Tx;
  UBYTE  Sum;
  UBYTE  Ttb;
  UBYTE  Tra;
} T_MS_CLASS_CAP;

typedef struct
{
  UBYTE  ta_valid;  /* 1: valid ta value present  */
  UBYTE  ta_value;  /* store recent value         */
  UBYTE  ul_ta_i;   /* store uplink ta index	    */
  UBYTE  ul_ta_tn; /* store uplink ta timeslot	  */
  UBYTE  dl_ta_i;    /* store downlink ta index	  */
  UBYTE  dl_ta_tn;  /* store downlink ta timeslot */
  UBYTE  l1_ta_value;     /* ta_value stored in l1      */
  UBYTE  l1_ta_i;         /* ta_index stored in l1      */
  UBYTE  l1_ta_tn;        /* ta_timeslot stored in l1   */
} T_TA_PARAMS;

/* structure for service internal data */

/*
start structs for CS
*/

typedef struct
{
  UBYTE  cnt;                           /* number of measurements          */
  SHORT  acc;                           /* accumulated measurement results */
  USHORT rpt_prd;                       /* reporting period                */
} T_MEAS_RSLT;

typedef struct
{
  BOOL        ovrflw;                   /* indicates whether more than     */
                                        /* CS_MAX_MEAS_RSLT measurement    */
                                        /* results are already collected   */
  UBYTE       loi;                      /* last occupied index             */
  T_MEAS_RSLT meas[CS_MAX_MEAS_RSLT];   /* measurement results             */
} T_RLA_P_DATA;

typedef USHORT T_RXLEV_DATA_NBR;
typedef ULONG  T_RXLEV_DATA_ACC;

typedef struct
{
  T_RXLEV_DATA_NBR nbr;              /* number of accumulated RXLEV values */
  T_RXLEV_DATA_ACC acc;              /* accumulated RXLEV values           */
} T_RXLEV_DATA;

typedef struct 	
{
  USHORT       arfcn;                   /* BCCH carrier of neighbour cell  */
  T_RLA_P_DATA rla_p_data;              /* raw data for deriving the RLA_P */
  T_RXLEV_DATA rxlev_data;              /* raw data for deriving the RXLEV */
                                        /* average for packet measurement  */
                                        /* reporting                       */
} T_CELL;

typedef struct  
{
  UBYTE     c_cell;                     /* number of neigbhour cells       */
  T_CELL    cell[MPHP_NUMC_BA_GPRS_SC]; /* array of neighbour cells        */
} T_NC_DATA;

typedef struct /* T_CTRL_DATA */
{
  UBYTE                       state;
  UBYTE                       last_state; /* last state of CTRL: needed in case of handling circuit switched call*/
  T_RR_STATES                 rr_state;/*the state of the RR part: we may remove this variable and substitude it with another one*/
  PG_CHANNEL                  cs_page_channel; /* on which channel the MS was paged for CS call*/
  CTRL_FOLLOWING_SUSPENSION   after_suspension; /* SZML-GLBL/009 */
  CTRL_PSI_TBF_REL_CAUSE      psi_tbf_rel_cause;
  UBYTE                       imm_rel;
  USHORT                      pcc_arfcn;
  USHORT                      old_arfcn;
  UBYTE                       pcc_bsic;
  UBYTE                       old_bsic;
  UBYTE                       is_susp_needed; /* indicates whether suspension has been needed or not*/
  UBYTE                       new_cell_responded;
  BOOL                        parked_rrgrr_cr_ind;
#ifdef REL99
  UBYTE                       poll_for_msg;   /* Values 0-Invalid, 1-PCCO */
  T_D_CELL_CHAN_ORDER         pcco;
#endif
#ifndef NTRACE
  char                        *name;
  char                        *state_name;
#endif
} T_CTRL_DATA;


typedef struct /* T_CTRL_GLBL_DATA */
{
  T_GLBL_PCKT_MODE            state;
  T_CTRL_TASK                 ctrl_task;
#ifndef NTRACE
  char                        *name;
  char                        *state_name;
#endif
} T_CTRL_GLBL_DATA;


typedef struct /* T_UL_CTRL_BLOCK */
{
  UBYTE               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 /* T_EVAL_ASSIGN_PARAM */
{
  UBYTE               ccch_read;
  T_TBF_TYPE          tbf_type;
  UBYTE               state;
} T_EVAL_ASSIGN_PARAM;

typedef void ( * T_TC_DISABLE_CALLBACK_FUNC )( void );


typedef struct /* T_FREQ_SET */
{
  T_p_frequency_par   freq_par;              /* frequency parameter    */
  UBYTE               tsc;                   /* training sequence code */
} T_FREQ_SET;

typedef struct /* T_TC_DATA */
{
  UBYTE               state;
  T_TC_DISABLE_CALLBACK_FUNC 
                      disable_callback_func;
  UBYTE               disable_class;
  UBYTE               dcch_present;
  UBYTE               ra_once_sent;
  UBYTE               n_acc_req;            /* number of sent packet access request in
                                               current access procedure */
  BOOL                sending_req;          /* sending of packet access requests in process */
  UBYTE               v_sb_without_tbf;
  T_UL_CTRL_BLOCK_ARRAY ul_ctrl_blk;        /* holds all relevant information for */
                                            /* sending uplink control blocks      */
  T_FA_CONTROL        fa_ctrl;              /* handles the fixed allocation parameters during uplink tbf*/
  UBYTE               two_2p_w_4_tbf_con;   /* if true TC waits for TBF_CON after 2 phase access:*/
                                            /* needed to abort single block procedure:default is true */
  UBYTE               num_of_rels_running;  /* number releas confirms that have to be received */
  UBYTE               last_rec_nb_id;       /* assignment id of single block downlink assignment*/
  ULONG               last_rec_nb_fn;       /* fn starting time(receive fn numer) of single block dl assignment*/

  T_EVAL_ASSIGN_PARAM last_eval_assign; 
  T_D_DL_ASSIGN       *p_assign;            /* pointer to dynamically allocated memory */

  T_TBF_TYPE          last_tbf_type;
  BOOL                v_freq_set;           /* frequency params from an assignment are stored   */
  T_FREQ_SET          freq_set;
#if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH
  BOOL                tbf_est_pacch;
#endif
  

#ifdef _SIMULATION_
  UBYTE               res_random;
#endif

#ifndef NTRACE
  char                        *name;
  char                        *state_name;
#endif
} T_TC_DATA;

typedef struct /* T_EVAL_IA_DL_PARAM */
{
  UBYTE     state;
  T_EVAL_IA_DL eval_ia_dl;
} T_EVAL_IA_DL_PARAM;

typedef struct /* T_EVAL_IA_UL_PARAM */
{
  T_EVAL_IA eval_ia;
} T_EVAL_IA_UL_PARAM;

typedef union /* T_EVAL_IA_UNION */
{
  T_EVAL_IA_UL_PARAM param_ul;
  T_EVAL_IA_DL_PARAM param_dl;
} T_EVAL_IA_UNION;

typedef struct /* T_CPAP_DATA */
{
  UBYTE                       state;
  T_TBF_TYPE                  new_tbf_type;
  T_D_PDCH_ASS_CMD            pdch_ass_cmd;
  UBYTE                       v_tma_ia;
  T_D_IMM_ASSIGN              tma_ia;        /* for 2 message assignments */
                                             /* parameters from the first */
                                             /* have to be stored until   */
                                             /* 2nd message has arrived   */

  T_IA_TYPE                    last_ia_type;
  T_EVAL_IA_UNION              last_eval_ia;

  T_D_IMM_ASSIGN              *p_d_imm_assign; /* pointer to dynamically allocated memory */

#ifndef NTRACE
  char                        *name;
  char                        *state_name;
#endif
} T_CPAP_DATA;

/*
 * The service PSI holds its state in a variable assigned to one of
 * the serving cell databases (either sc_db_1 or sc_db_2).
 * This is used to simplify the procedure of returning to the old cell
 * in case it is not possible to access the cell choosen for cell
 * re-selection.
 */
typedef struct /* T_PSI_ASSIGNED_DATA */
{
  UBYTE                       state;

#ifndef NTRACE
  char                        *name;
  char                        *state_name;
#endif
} T_PSI_ASSIGNED_DATA;

/*
 * for more information see comment related to structure T_PSI_ASSIGNED_DATA
 */
typedef struct /* T_PSI_DATA */
{
  UBYTE                       last_psi_state;
  UBYTE                       is_start_of_10_sec_allowed; /* Indicates whether the starting of 10 second timer is allowed or not*/
  BOOL                        is_pbcch_req_needed; /*PBCCH req. waiting for perform*/
  BOOL                        is_pbcch_req_allowed; /*PBCCH req. allowed due to transition rules or not*/
  UBYTE                       reading_type;
  BOOL                        v_nc_param;
  UBYTE                       psi2_pos[MAX_NR_OF_INSTANCES_OF_PSI2];

#if defined (REL99) AND defined (TI_PS_FF_EMR)
  UBYTE                       psi3_set_pos[MAX_NR_OF_INSTANCES_OF_PSI3TER+
                                  MAX_NR_OF_INSTANCES_OF_PSI3BIS+
                                          MAX_NR_OF_INSTANCES_OF_PSI3]; 
                                          /* contains PSI3, 3bis and 3ter */
#else
  UBYTE                       psi3bis_pos[MAX_NR_OF_INSTANCES_OF_PSI3BIS+
                                      MAX_NR_OF_INSTANCES_OF_PSI3]; 
                                          /*contains PSI3 and 3bis*/
#endif

  UBYTE                       psi4_pos[MAX_NR_OF_INSTANCES_OF_PSI4];
  UBYTE                       psi5_pos[MAX_NR_OF_INSTANCES_OF_PSI5];
#ifdef REL99
  UBYTE                       psi8_pos[MAX_NR_OF_INSTANCES_OF_PSI8];
#endif
  T_NC_PARAM                  nc_param;
#if defined (REL99) AND defined (TI_PS_FF_EMR)
  T_GRR_ENH_PARA              enh_param; /* Temporary storage for enhanced
                                            measurement parameters received 
                                            from PSIs */
#endif

#if defined (TI_PS_FF_RTD) AND defined (REL99)
  T_RTD_VALUE                 rtd[MAX_NR_OF_NCELL];/* RTD values for the neighbour cell synchronisation */
#endif /* #if defined (TI_PS_FF_RTD) AND defined (REL99) */

} T_PSI_DATA;

typedef struct /* T_PG_DATA */
{
  UBYTE                       state;

  /* some parameters needed for RR establishment request*/
  UBYTE                       ch_needed;    /* channel needed field*/
  UBYTE                       v_emlpp_prio; /* valid flag for emlpp_priority*/
  UBYTE                       emlpp_prio;   /* value of eMLPP_PRIORITY*/
  UBYTE                       type;         /* type of paging for rr est: IMSI, TMSI*/
  USHORT                      initial_dsc;
  USHORT                      dsc;
  UBYTE                       is_l1_ref_tn_changed;
  UBYTE                       nmo;          /* network mode of operation for paging */
  T_PACKET_MODE               packet_mode;
#ifndef NTRACE
  char                        *name;
  char                        *state_name;
#endif
} T_PG_DATA;

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 /* T_MEAS_DATA */
{
  UBYTE                       state;

  UBYTE                       pwr_offset;       /* POWER OFFSET parameter used */
                                                /* by a DCS 1800 Class 3 MS    */
  T_C_FILTER                  c_filter;         /* filtered C value   */

#ifndef NTRACE
  char                        *name;
  char                        *state_name;
#endif
} T_MEAS_DATA;

typedef USHORT T_IM_GAMMA;

typedef struct /* T_MEAS_IM_GAMMA */
{
  UBYTE      index;          /* iteration index                    */
  UBYTE      m_gamma;        /* multi-flag                         */
  T_IM_GAMMA gamma;          /* filtered interference level values */
  LONG       remain_time;    /* remaining time to run until        */
                             /* timer T_IM_SYNC expires            */
} T_MEAS_IM_GAMMA;

typedef UBYTE T_MEAS_IM_HOP_ARFCN_BIT_FIELD[MAX_IM_HOP_ARFCN_BIT_FIELD_SIZE];  

typedef struct /* T_MEAS_IM_HOP_PARAM */
{
  UBYTE                         hsn;
  UBYTE                         maio;
  T_MEAS_IM_HOP_ARFCN_BIT_FIELD arfcn_bit_field;
} T_MEAS_IM_HOP_PARAM;

typedef union /* T_MEAS_IM_ALLOC */
{
  USHORT              arfcn;
  T_MEAS_IM_HOP_PARAM hop_param;
} T_MEAS_IM_ALLOC;

typedef struct /* T_MEAS_IM_CARRIER */
{
  BOOL            hopping;
  T_MEAS_IM_ALLOC alloc;
} T_MEAS_IM_CARRIER;

typedef struct /* T_MEAS_IM_FILTER */
{
  UBYTE               used;    /* indicates whether the filter is used       */
  T_MEAS_IM_GAMMA     i_level [CGRLC_MAX_TIMESLOTS];
                               /* interference level for each timeslot       */
  T_MEAS_IM_CARRIER   carrier; /* carrier used for measurement               */
} T_MEAS_IM_FILTER;

typedef struct /* T_MEAS_IM_CHANNEL */
{
  UBYTE index;                 /* actual channel that is measured            */
  UBYTE ident[MAX_IM_IDLE_CHANNELS];
                               /* identifies the channel to be measured      */
} T_MEAS_IM_IDLE_CHN;

typedef struct /* T_MEAS_IM_DATA */
{
  UBYTE                       state;       /* sub-state of the interference  */
                                           /* measurement service            */
  T_MEAS_IM_MODE              mode;        /* mode of operation              */
  T_MEAS_IM_IDLE_CHN          idle_chan;   /* channels measured in packet    */
                                           /* idle mode                      */
  T_MEAS_IM_FILTER            filter [MAX_IM_CHANNELS];
                                           /* running average filter         */
  USHORT                      carrier_id;  /* carrier identifier             */
  T_MEAS_IM_CARRIER           carrier;     /* carrier currently measured     */
  T_MEAS_IM_TRIG_SIGNAL       trig_signal; /* trigger signal                 */
  BOOL                        v_cs_meas_active;
                                           /* indicates whether cell re-     */
                                           /* selection measurements are     */
                                           /* active                         */
  BOOL                        v_ilev_abs;  /* indicates whether at least one */
                                           /* CGRLC_INT_LEVEL_REQ primitive  */
                                           /* was sent since last reset      */
  T_ilev_abs                  ilev_abs;    /* stores the content of last     */
                                           /* sent CGRLC_INT_LEVEL_REQ       */
                                           /* primitive                      */

#if !defined (NTRACE)

  UBYTE                       n_im_trace;

#endif /* #if !defined (NTRACE) */

#ifndef NTRACE
  char                        *name;
  char                        *state_name;
#endif
} T_MEAS_IM_DATA;

typedef struct /* T_MEAS_EM_RSLT */
{
  UBYTE           refidx;
  UBYTE           rxlev;
  UBYTE           bsic;
} T_MEAS_EM_RSLT;


typedef struct /* T_MEAS_EM_RSLT_LIST */
{
  UBYTE           number;
  T_MEAS_EM_RSLT  elem[RRGRR_MAX_ARFCN_EXT_MEAS];
} T_MEAS_EM_RSLT_LIST;


typedef struct /* T_MEAS_EM_STRG_LIST */
{
  UBYTE           number;
  UBYTE           refidx[RRGRR_MAX_ARFCN_EXT_MEAS];
} T_MEAS_EM_STRG_LIST;

typedef struct /* T_MEAS_PAR_PMO */
{
  UBYTE              count;
  UBYTE              instances[MAX_NR_OF_INSTANCES_OF_PMO];
  T_EXT_START_STOP   idx[MAX_NR_OF_INSTANCES_OF_PMO];
} T_MEAS_PAR_PMO;

typedef struct /* T_MEAS_MSG_PMO */
{
  T_NCMEAS_EXTENDED  nc;
  T_XMEAS            extd;
#if defined (REL99) AND defined (TI_PS_FF_EMR)
  BOOL               v_enh_meas_param_pmo; /* Set if ENH params are present */
  T_GRR_ENH_PARA     enh; /* Temporary storage for enhanced measurement 
                             parameters received from PMO*/
#endif
  T_MEAS_PAR_PMO     prm;
} T_MEAS_MSG_PMO;

typedef struct /* T_XMEAS_SET */
{
  UBYTE              ident; /* identifier of valid EXT measurement parameter set */
  T_XMEAS           *param; /* pointer to valid EXT measurement parameter set    */
} T_XMEAS_SET;

typedef struct /* T_MEAS_EM_DATA */
{
  UBYTE                       state;
  T_XMEAS_SET                 xmeas_set;
  BOOL                        v_pmo_nc_ncmeas_param;
  BOOL                        v_pmo_nc_ncmeas_list_rfreq;
  T_MEAS_MSG_PMO              pmo;     /* used to store message packet measurement */
                                       /* order temporarily                        */
  T_MEAS_EM_RSLT_LIST         rslt;    /* EXT measurement results for all carriers */
  T_MEAS_EM_STRG_LIST         strg;    /* EXT measurement results for 6 strongest  */
                                       /* carriers ( with/without BSIC decoding )  */
  UBYTE                       pmr_snd_ref;
                                       /* reference to the next EXT measurement    */
                                       /* result which chould be sent to the       */
                                       /* network                                  */
#ifndef NTRACE
  char                        *name;
  char                        *state_name;
#endif
} T_MEAS_EM_DATA;

typedef struct /* T_GRR_CS_DATA */
{
  UBYTE                       state;
  T_GMM_STATES                gmm_state;
  T_TIME                      last_cr;
  T_CS_RESELECT_CAUSE         reselect_cause;
  UBYTE                       is_upd_ncell_stat_needed;
  UBYTE                       is_mval_initialized;
  UBYTE                       list_id;
  UBYTE                       stop_req;
  UBYTE                       cr_meas_mode; /* cell re-selection measurement mode */
  BOOL                        cr_meas_update;
  UBYTE                       last_assignment_id;
  USHORT                      nc_sync_rep_pd;

#if !defined (NTRACE)

  UBYTE                       v_crp_trace;

#endif /* #if !defined (NTRACE) */

#ifndef NTRACE
  char                        *name;
  char                        *state_name;
#endif
} T_GRR_CS_DATA;

typedef struct /* T_CS_MEAS_DATA */
{
  UBYTE          state;
  UBYTE          pmr_snd_ref;  /* reference to the next NC measurement result */
                               /* which chould be sent to the network         */
  UBYTE          nc_meas_cause;/*Indicates NC meas status in ALR when NC=1 or NC=2 */
  T_PACKET_MODE  packet_mode;
#ifndef NTRACE
  char          *name;
  char          *state_name;
#endif
} T_CS_MEAS_DATA;



typedef struct 
{                                 
  U8  nc2_on; /*
               * Indicates whether it is allowed to use NC1 and NC2:
               *
               * TRUE  = Use of NC1 and NC2 is allowed.
               * FALSE = Use of NC1 and NC2 is prohibited.
               */
} T_GRR_FFS;




typedef struct /* T_GFP_DATA */
{
  UBYTE                   state;
  BOOL                    tfi_check_needed; /* if the tfi in optional header is correct, 
                                               the ms shall ignore the tfi within the air message.
                                               This parameter indicates if a check for the tfi is needed(TRUE)
                                               or not(FALSE)*/

#ifndef NTRACE
  char                    *name;
  char                    *state_name;
#endif
} T_GFP_DATA;

typedef struct
{
  BOOL                        v_gamma;
  UBYTE                       gamma;
} T_GAMMA_TN;

typedef struct
{
  BOOL                        v_alpha;
  UBYTE                       alpha;
  T_GAMMA_TN                  gamma_tn[CGRLC_MAX_TIMESLOTS];
} T_PWR_PAR;

typedef struct /* T_CELL_INFO_FOR_GMM */
{
  T_cell_info         cell_info;     /* Cell information */
  T_GPRS_SERVICE      gprs_service;  /* GPRS service     */
  T_ACCESS_STATUS     access_status; /* Access status    */
} T_CELL_INFO_FOR_GMM;

typedef struct /* T_SC_DATABASE */
{
  T_PSI_ASSIGNED_DATA         psi_assigned_data;
  T_PSI1_PARAMS               psi1_params;        /**/
  T_PSI2_PARAMS               psi2_params;        /**/
  T_PSI3_PARAMS               psi3_params;        /**/
  T_PSI3BIS_PARAMS            psi3bis_params;     /**/
#if defined (REL99) AND defined (TI_PS_FF_EMR)
  T_PSI3TER_PARAMS            psi3ter_params;        /**/
#endif
  T_PSI4_PARAMS               psi4_params;        /**/
  T_PSI5_PARAMS               psi5_params;        /**/
#ifdef REL99
  T_PSI8_PARAMS               psi8_params;         /**/
#endif
  T_PSI13_PARAMS              psi13_params;       /**/
  UBYTE                       is_access_enabled;  /* This common parameter is used by services CTRL and PSI*/
  T_COMPLETE_ACQ              complete_acq;       /**/
  ACQ_TYPE                    acq_type;             /*indicates whether the receiving of consistent set of PSI is in progress*/

  BOOL                        measurement_order;  /*FALSE: NC0, EM0 no PSI5; TRUE: PSI5 on PBCCH measurement needed*/
  BOOL                        send_psi_status;    /*Checks whether the PSI service should send PSI STATUS message or not*/

  T_PSI_STATE                 state_of_PSI[MAX_PSI];  /* */

  UBYTE                       si_to_acquire;      /*  UNSPECIFIED_SI,  UPDATE_SI1, UPDATE_SI2_SI2BIS_OR_SI2TER,
                                                      UPDATE_SI3_SI4_SI7_OR_SI8, UPDATE_SI9, UPDATE_SI13*/
  T_MPHP_SCELL_PBCCH_REQ      scell_pbcch; /* stores the primitive, and  pass it after 
                                              transition rules to layer1 */

  T_PBCCH             pbcch;            /*  PBCCH description */

  T_NETWORK_CONTROL   net_ctrl;         /*  Network control parameters*/

  BOOL                v_gprs_cell_opt;  /*  valid flag for GPRS Cell Options*/
  T_gprs_cell_opt     gprs_cell_opt;    /*  GPRS Cell Options  */

  BOOL                v_prach;          /*  valid flag for PRACH Control Parameters*/
  T_prach_ctrl_par    prach;            /*  PRACH Control Parameters  */

  BOOL                v_g_pwr_par;      /*  valid flag for Global Power Control Parameters*/
  T_g_pwr_par         g_pwr_par;        /*  Global Power Control Parameters */

  BOOL                v_pwr_par;        /*  valid flag for Power Control Parameters*/
  T_PWR_PAR           pwr_par;          /*  Power Control Parameters */

  T_pccch_org_par     pccch;            /*  PCCCH Organization Parameters  */

  T_PAGING_GROUP      paging_group;     /*  This structure contains parameters to initialize paging (static)*/

  UBYTE               last_pg_mode;     /*  last page mode*/
  UBYTE               network_pg_mode;
  BOOL                gprs_attach_is_running;     /*  indicates if the gprs procedure is running or not*/
  UBYTE               non_drx_timer;    /* This value contains the values in seconds*/
  BOOL                non_drx_timer_running;
  BOOL                nc2_non_drx_period_running;

  T_RFL_LST           rfl[MAX_RFL+1];     /*  Reference Frequency Lists      */

  BOOL                v_cell_alloc;           /*  valid flag for Cell Allocation */
  T_cell_alloc        cell_alloc[MAX_CELL_ALLOC];   /*  Cell Allocation  */

  T_gprs_ms_alloc     gprs_ms_alloc_in_assignment;    /*  GPRS Mobile Allocations received in an assignment message*/

  T_gprs_ms_alloc     gprs_ms_alloc_in_psi2_psi13[MAX_GPRS_MS_ALLOC];   /*  GPRS Mobile Allocations received in PSI2 and/or PSI13*/

#ifdef REL99
  BOOL                v_add_psi;/* valid-flag */
  T_add_psi           add_psi;  /* additional PSI Messages broad cast information*/
#endif

  BOOL                v_non_gprs_opt;   /*  valid flag for Non GPRS Cell Options */
  T_non_gprs_opt      non_gprs_opt;     /*  Non GPRS Cell Options */

  T_SCELL_PAR         scell_par;        /*  Serving Cell parameters from PSI 3 and PSI3 BIS */

  T_gen_cell_par      gen_cell_par;     /*  General Cell Selection parameter */

  UBYTE               number_of_valid_int_meas_channels;
  T_int_meas_chan_lst int_meas_chan_list[MAX_CHAN_IMEAS];  /* Channel List for Interference measurements (PSI 4) */

  BOOL                is_ext_psi5_valid; /* Is the extended structure in PSI5 is valid*/
  T_XMEAS             ext_psi5;          /* EXT measurement parameters derived from PSI5 */

  T_XMEAS             ext_pmo;           /* EXT measurement parameters derived from packet measurement order */

  T_NCMEAS            nc_cw;             /* NC measurement parameters cell wide */

  T_NCMEAS_EXTENDED   nc_ms;             /* NC measurement parameters MS specific */

  T_CELL_INFO_FOR_GMM cell_info_for_gmm; /* Cell information composed for GMM */
#ifdef REL99
#ifdef TI_PS_FF_QUAD_BAND_SUPPORT
  UBYTE               band_indicator;    /* Band indicator received in PSI 1 */
#endif
  UBYTE               sgsn_rel;          /* SGSN release of the serving cell */
  UBYTE               network_rel;        /*Network release*/
  BOOL                v_cbch_chan_desc;  /* valid fla for CBCH channel description. */
  T_cbch_chan_desc    cbch_chan_desc;    /* Stores CBCH channel description as received in PSI8 */   
  BOOL                send_cbch_info_ind;/* This flag indicates if a CBCH info update has to be sent to RR */
#ifdef TI_PS_FF_EMR
  UBYTE               ba_ind;            /* BA-BCCH sequence number */
  T_BA_BCCH_NC_LIST   nc_ba_bcch_cw;     /* GSM NC list formed in RR from BA-BCCH and BSIC */
  T_GRR_ENH_PARA      enh_cw;            /* ENH measurement parameters cell wide */
  T_GRR_ENH_PARA      enh_ms;            /* ENH measurement param */
  BOOL                si_status_ind;     /* The network supports/does not support
                                            the PACKET SI STATUS message */
#endif
#endif

#if defined (TI_PS_FF_RTD) AND defined (REL99)
  T_RTD_VALUE         rtd[MAX_NR_OF_NCELL];/* RTD values for the neighbour cell synchronisation */
#endif /* #if defined (TI_PS_FF_RTD) AND defined (REL99) */


} T_SC_DATABASE;

typedef struct /* T_NC_NW_SELECTED */
{
  T_NC_SIX_STRGST     strgst;           /* this cell is used for network controlled */
                                        /* cell re-selection but does not belong to */
                                        /* the six strongest cells                  */

} T_NC_NW_SELECTED;

typedef struct /* T_GPRS_DATABASE */
{
  T_MS_IDENT          ms_id;            /* some parameters to identify the MS: IMSI, PTMSI, TMSI */

  T_scell_info        scell_info;       /* contains measurement values for serving cell */

  T_SCELL             old_scell;        /* previous serving cell */

  T_NC_REF_LIST       nc_ref_lst;       /* list of pointers to the neighbour cell lists */

  T_NC_MVAL_LIST      nc_mval_list;     /* measured values of the neighbour cells */


  T_NC_SIX_STRGST    *cr_cell;

  T_CNT_NC_SIX_STRGST cnt_nc_six;
  T_NC_SIX_STRGST     nc_six_strgst[CS_MAX_STRONG_CARRIER];

  T_NC_NW_SELECTED    nc_nw_slctd;

#if defined (REL99) AND defined (TI_PS_FF_EMR)
  UBYTE               cnt_enh_cell_list; /* Number of Cells in the ENH cell 
                                            list */
  
  T_ENH_CELL_LIST     enh_cell_list[MAX_NR_OF_NCELL];/* Enhanced Measurement 
                                                        Cell list */
  
  T_ENH_BIN           sorted_enh_cell_list; /* ENH cell list sorted in 
                                               descending order of rxlev */
  T_PEMR_PARAMS       pemr_params;          /* PEMR parameters used during 
                                               reporting */
  T_BA_BCCH_NC_REF_LIST   ba_bcch_nc_ref_lst;   /* list of pointers to the neighbour cell lists */
#endif

} T_GPRS_DATABASE;

typedef struct /* T_PWR_CTRL_VALID_FLAGS */
{
  BOOL v_pwr_ctrl_param;
  BOOL v_glbl_pwr_ctrl_param;
  BOOL v_freq_param;
  BOOL v_c_value;
} T_PWR_CTRL_VALID_FLAGS;

typedef struct /* T_GRR_DATA */
{
  UBYTE                   sc_db_mode;

  T_SC_DATABASE           sc_db_1;      /* database 1 for serving cell: it contains all cell relevant
                                         * information, needed for to camp on a network, access to
                                         * the network, etc.
                                         */

  T_SC_DATABASE           sc_db_2;      /* database 2 for serving cell: it contains all cell relevant
                                         * information, needed for to camp on a network, access to
                                         * the network, etc.
                                         */

  T_GPRS_DATABASE         db;           /* db is the shortname for gprs_database  */

  T_MS_DATA               ms;           /* ms specific data */

  T_UL_TBF                uplink_tbf;   /*  This structure is used by TC,CPAP
                                            during uplink-tbf */
  T_DL_TBF                downlink_tbf; /*  This structure is used by TC,CPAP
                                            during downlink-tbf */
  T_TBF_TYPE              tbf_type;

  ULONG                   ul_fn;
  ULONG                   dl_fn;

  ULONG                   l1_del_tbf_start_fn; /* When there is poll requested in a re-assignment message
                                                * sending of poll response successfully requires this
                                                * value to be sent to poll_fn+8. This is important when
                                                * the timeslot configuration changes between re-assignment.
                                                */

  T_TA_PARAMS             ta_params;
  UBYTE                   pdch_rel_ts_mask;
  USHORT                  tqi;
  T_req_ref_p             req_ref[3];   /* to save the last 3 packet request_references */
  UBYTE                   r_bit;        /* current r-bit value - set by TC - read by RU/RD*/
  T_SEG_CTRL_BLK          seg_ctrl_blk;
  T_CTRLBUF               ctrl_msg;
  T_MS_CLASS_CAP          ms_cap[12];
  /*
   * Some global parameters to control the whole functionality
   */
  BOOL                     is_pg_started; /* Checks whether paging procedure has been started or not*/
  BOOL                     cc_running;   /* Assert if Cell change Order is running or not? */
  UBYTE                    pcco_failure_cause;
  UBYTE                    test_mode;     /* indicates the testmode status */
  BOOL                     cell_res_status; /* indicates the status of GMMRR_CELL_RES primitive */

  T_NC_DATA               nc_data;  

  T_PWR_CTRL_VALID_FLAGS  pwr_ctrl_valid_flags;

  /*
   * Service data
   */
  T_GFP_DATA               gfp;
  T_CTRL_DATA              ctrl;
  T_CTRL_GLBL_DATA         ctrl_glbl;
  T_TC_DATA                tc;
  T_CPAP_DATA              cpap;
  T_PSI_DATA               psi;
  T_PG_DATA                pg;
  T_MEAS_DATA              meas;
  T_MEAS_IM_DATA           meas_im;
  T_MEAS_EM_DATA           meas_em;
  T_GRR_CS_DATA            cs;
  T_CS_MEAS_DATA           cs_meas;
  UBYTE                    nc2_on;    
 

}T_GRR_DATA;








/*==== EXPORT =====================================================*/

/*
 * data base
 */
#ifdef GRR_PEI_C
       T_GRR_DATA grr_data_base, *grr_data;
#else
EXTERN T_GRR_DATA grr_data_base, *grr_data;
#endif

/*
 * for more information see comment related to structure T_PSI_ASSIGNED_DATA
 */
#if defined GRR_PSIF_C OR defined GRR_PSIP_C OR defined GRR_PSIS_C
  #define ENTITY_DATA psc_db 
#else
  #define ENTITY_DATA grr_data 
#endif


/*
 * Communication handles (see also GRR_PEI.C)
 */
#define hCommL1             ppc_hCommMAC    
#define hCommGMM            grr_hCommGMM
#define hCommGRR            grr_hCommGRR
#define hCommGRLC           grr_hCommGRLC
#define hCommRR             grr_hCommRR
#define hCommPL             grr_hCommPL
#ifdef FF_WAP /*FMM*/
  #define hCommWAP          grr_hCommWap  /*In future an own FMM Entity is planned*/
#endif


#define _decodedMsg   grr__decodedMsg


#ifdef GRR_PEI_C
       T_HANDLE hCommL1         = VSI_ERROR;
       T_HANDLE hCommGRLC       = VSI_ERROR;
       T_HANDLE hCommGMM        = VSI_ERROR;
       T_HANDLE hCommGRR        = VSI_ERROR;
       T_HANDLE hCommRR         = VSI_ERROR;
       T_HANDLE hCommPL         = VSI_ERROR;
#ifdef FF_WAP
       T_HANDLE hCommWAP         = VSI_ERROR;
#endif
       T_HANDLE GRR_handle;



GLOBAL UBYTE          _decodedMsg [MAX_MSTRUCT_LEN_GRR];

/*
 * make the pei_create function unique
 */
#define pei_create              grr_pei_create

/*
 * make the pei_func_primitive function unique
 */
#define pei_func_primitive      grr_pei_func_primitive

#else  /* !GRR_PEI_C */
EXTERN T_HANDLE hCommL1;
EXTERN T_HANDLE hCommGRLC;
EXTERN T_HANDLE hCommGMM;
EXTERN T_HANDLE hCommGRR;
EXTERN T_HANDLE hCommLLC;
EXTERN T_HANDLE hCommRR;
EXTERN T_HANDLE hCommPL;
#ifdef FF_WAP
 EXTERN T_HANDLE hCommWAP;
#endif
EXTERN T_HANDLE GRR_handle;

#endif /* GRR_PEI_C */


EXTERN UBYTE          _decodedMsg [MAX_MSTRUCT_LEN_GRR];

#ifdef GRR_PEI_C
T_SC_DATABASE*          psc_db;       /* points to the current serving cell database  */
T_SC_DATABASE*          posc_db;      /* points to the old serving cell database      */
T_SC_DATABASE*          prsc_db;      /* points to the rejected serving cell database */
T_SC_DATABASE*          pcr_db;       /* points to the cell re-selection database     */
#else
EXTERN T_SC_DATABASE*   psc_db;
EXTERN T_SC_DATABASE*   posc_db;
EXTERN T_SC_DATABASE*   prsc_db;
EXTERN T_SC_DATABASE*   pcr_db;
#endif /* GRR_PEI_C */


#ifdef _TARGET_

#undef TRACE_FUNCTION
#define TRACE_FUNCTION(a)
#undef TRACE_ISIG
#define TRACE_ISIG(a)

#endif /* _TARGET_ */

#endif /* GRR_H */