view src/g23m-gsm/rr/rr.h @ 303:f76436d19a7a default tip

!GPRS config: fix long-standing AT+COPS chance hanging bug There has been a long-standing bug in FreeCalypso going back years: sometimes in the AT command bring-up sequence of an ACI-only MS, the AT+COPS command would produce only a power scan followed by cessation of protocol stack activity (only L1 ADC traces), instead of the expected network search sequence. This behaviour was seen in different FC firmware versions going back to Citrine, and seemed to follow some law of chance, not reliably repeatable. This bug has been tracked down and found to be specific to !GPRS configuration, stemming from our TCS2/TCS3 hybrid and reconstruction of !GPRS support that was bitrotten in TCS3.2/LoCosto version. ACI module psa_mms.c, needed only for !GPRS, was missing in the TCS3 version and had to be pulled from TCS2 - but as it turns out, there is a new field in the MMR_REG_REQ primitive that needs to be set correctly, and that psa_mms.c module is the place where this initialization needed to be added.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 08 Jun 2023 08:23:37 +0000
parents fa8dc04885d8
children
line wrap: on
line source

/*
+-----------------------------------------------------------------------------
|  Project :
|  Modul   :
+-----------------------------------------------------------------------------
|  Copyright 2002 Texas Instruments Berlin, AG
|                 All rights reserved.
|
|                 This file is confidential and a trade secret of Texas
|                 Instruments Berlin, AG
|                 The receipt of or possession of this file does not convey
|                 any rights to reproduce or disclose its contents or to
|                 manufacture, use, or sell anything it may describe, in
|                 whole, or in part, without the specific written consent of
|                 Texas Instruments Berlin, AG.
+-----------------------------------------------------------------------------
|  Purpose :  Declarations for the Protocol Stack Entity
|             Radio Resource
+-----------------------------------------------------------------------------
*/

#ifndef RR_H
#define RR_H

#ifdef GPRS
#include "rr_gprs.h"
#endif

#include "cl_list.h"
#ifdef TI_PS_HCOMM_CHANGE
#include "cl_hComm_handle.h"
#endif

#ifdef TI_GSP_STR2IND_S2I_STRING
typedef unsigned int T_S2I_STRING;
#else
typedef char * T_S2I_STRING;
#define S2I_STRING(x) (x)
#endif

#ifdef TI_PS_OP_VSI_NO_CALL_ID
#define TIMER_START(C,I,T)         vsi_t_start_nc(I,T)
#define TIMER_PSTART(C,I,T,R)      vsi_t_pstart_nc(I,T,R)
#define TIMER_STOP(C,I)            vsi_t_stop_nc(I)
#define TIMER_STATUS(C,I,T)        vsi_t_status_nc(I,T)
#define SUSPEND_SELF(C,T)          vsi_t_sleep_nc(T)
#define SYSTEM_TIME(C,T)           vsi_t_time_nc(T)               
#else /* TI_PS_OP_VSI_NO_CALL_ID */
#define TIMER_START(C,I,T)         vsi_t_start(C,I,T)
#define TIMER_PSTART(C,I,T,R)      vsi_t_pstart(C,I,T,R)
#define TIMER_STOP(C,I)            vsi_t_stop(C,I)
#define TIMER_STATUS(C,I,T)        vsi_t_status(C,I,T)
#define SUSPEND_SELF(C,T)          vsi_t_sleep(C,T)
#define SYSTEM_TIME(C,T)           vsi_t_time(C,T)               
#endif /* TI_PS_OP_VSI_NO_CALL_ID */

#define _SIMULATION_FFS_

/* Enum values for clearing White List */
enum clr_white_list_e
{
  CLR_WHITE_LIST_RAM = 1,
  CLR_WHITE_LIST_SIM = (CLR_WHITE_LIST_RAM << 1),
  CLR_WHITE_LIST_FFS = (CLR_WHITE_LIST_SIM << 1)
};

/* Enum values for clearing Black List
 * CSI-LLD section:4.1.1.4
 */
enum clr_black_list_e
{
  CLR_BLACK_LIST_RAM = 1,
  CLR_BLACK_LIST_FFS = (CLR_BLACK_LIST_RAM << 1)
};

/* Enum values for identifying scan mode
 * CSI-LLD section:4.4
 */
enum scan_mode_e
{
  CS_NO_SCAN,
  CS_FIRST_SCAN_FIRST_ATTEMPT,
  CS_FIRST_SCAN_SECOND_ATTEMPT,
  CS_SECOND_SCAN
};

/* Enum values for Initial PLMN search state
 * CSI-LLD section:4.1.1.4
 */
enum initial_plmn_search_e
{
  INITIAL_PLMN_SEARCH_NOT_ACTIVE,
  INITIAL_PLMN_SEARCH_ACTIVE,
  INITIAL_PLMN_SEARCH_DONE
};

/*
 * look at explanations at rr_data->mode_after_dedi!
*/
#define ARRAY_TRACE

#if defined(_SIMULATION_)
#undef  SET_STATE
#define SET_STATE(PROCESS,STATE)\
            { vsi_o_ttrace (VSI_CALLER 0x08, "%s:%s->%s (#%u %s)",\
                            PROCESS_NAME[PROCESS],\
                            PROCESS##_NAME [ ENTITY_DATA->state[PROCESS] ],\
                            PROCESS##_NAME [              STATE          ],\
                            __LINE__, __FILE10__);\
            ENTITY_DATA->state[PROCESS] = STATE;}
#endif /* _SIMULATION_ */

#if !defined(NTRACE)
#define TRACE_DATA_IND(a,fn,t)   TRACE_EVENT_P5 ("[%u] %s FN=%lu CR=%d SC=%d",\
                                  (a)&ARFCN_MASK, t, fn,\
                                  (short)(rr_data->nc_data[CR_INDEX].arfcn),\
                                  (short)(rr_data->nc_data[SC_INDEX].arfcn))
#else  /* !NTRACE */
#define TRACE_DATA_IND(a,fn,t)
#endif  /* !NTRACE */



#if !defined(NTRACE)
#define TRACE_DATA_IND(a,fn,t)   TRACE_EVENT_P5 ("[%u] %s FN=%lu CR=%d SC=%d",\
                                  (a)&ARFCN_MASK, t, fn,\
                                  (short)(rr_data->nc_data[CR_INDEX].arfcn),\
                                  (short)(rr_data->nc_data[SC_INDEX].arfcn))
#else  /* !NTRACE */
#define TRACE_DATA_IND(a,fn,t)
#endif  /* !NTRACE */

#define  RR_ALLOCATE_NEW_BA(v)  ((((v)+1) % (RR_BA_HIGH-RR_BA_LOW+1)) + RR_BA_LOW)

/*lint -esym(526,std) : not defined | defined in PCM */
EXTERN UBYTE std;

#ifdef TI_PS_FF_QUAD_BAND_SUPPORT
EXTERN const UBYTE std_bands[12];
#else
EXTERN const UBYTE std_bands[8];
#endif


/*
 * CS priorities
 */
#define CS_LOW_PRIORITY             0x00
#define CS_MID_PRIORITY             0x01
#define CS_HIGH_PRIORITY            0x02
#define CS_PRIORITY                 0x03
#define CS_NON_CHECKED_BITS         0xF7
#define CS_CHECK_FLAG               0x08
#define CS_BCCH_READ                0x10
#define CS_SET_TO_LOW_PRIORITY      0xFC
#define CS_BLACK_LIST_FLAG          0x04 /* CSI-LLD section:4.1.1.3 */

#define SC_INDEX 6
#define CR_INDEX 7
#define NCELL_SIZE 8


#define LOW_PRIORITY_CELL           0x40
#define EMERGENCY_CELL              0x20
#define CHECKED_FLAG                0x08

#define MAX_MCC_SHIELD              4

/* CSI-LLD section:4.1.1.3  */
#define MAX_SYNC_FAILURES           5
#define MAX_SFC_PER_REGION          512

#define STD_NOT_PRESENT             0x00

/*
 * Macros
 */
#ifdef FRAME_OFFSET_ZERO

#define GET_PD(s,p)               p=(UBYTE)(s.buf[3] & 0x0F)
#define GET_TI(s,t)               t=(UBYTE)(s.buf[3] >> 4  )

#define GET_UI_PD(s,p)            p=(UBYTE)(s.buf[1] & 0x0F)
#define GET_UI_TI(s,t)            t=(UBYTE)(s.buf[1] >> 4  )

#else

#define GET_PD(s,p)               ccd_decodeByte(s.buf, (USHORT)(s.o_buf+4), 4, &p)
#define GET_TI(s,t)               ccd_decodeByte(s.buf, (USHORT)(s.o_buf  ), 4, &t)

#define GET_UI_PD(s,p)            ccd_decodeByte(s.buf, (USHORT)(s.o_buf+4), 4, &p)
#define GET_UI_TI(s,t)            ccd_decodeByte(s.buf, (USHORT)(s.o_buf  ), 4, &t)

#endif

#define USE_STORED_ENTRIES()      { ENTITY_DATA->use_stored_entries = TRUE; }

/* add resp. get the std value to resp. from arfcn */
/*#define STD_ADD_TO_ARFCN(a,std)  (((a)&~STD_BIT_MASK) | ((std)<<STD_BIT_SHIFT))*/
#define STD_GET_FROM_ARFCN(a)    ((((a)&STD_BIT_MASK)>>STD_BIT_SHIFT))


/* Returns the region(european or american)the requested carrier belongs to
 * CSI-LLD section:4.1.1.2.1
 */
#define CS_GET_REGION_FROM_FREQ(arfcn) ((arfcn&US_BIT)?AMERICAN_REGION:EUROPEAN_REGION)

/* Sets the current search mode
 * CSI-LLD section:4.1.3.1.1
 */
#define CS_SET_CURRENT_SEARCH_MODE(mode) (rr_data->cs_data.current_search_mode=mode)

/* Returns the current search mode
 * CSI-LLD section:4.1.3.1.1
 */
#define CS_GET_CURRENT_SEARCH_MODE (rr_data->cs_data.current_search_mode)

/* Sets the previous search mode
 * CSI-LLD section:4.1.3.1.1
 */
#define CS_SET_PREVIOUS_SEARCH_MODE(mode) (rr_data->cs_data.previous_search_mode=mode)

/* Returns the previous search mode
 * CSI-LLD section:4.1.3.1.1
 */
#define CS_GET_PREVIOUS_SEARCH_MODE (rr_data->cs_data.previous_search_mode)

/* This macro sets Bit : 2 of attributes[  ] field n T_CS_DATA structure for the
 * carrier identified by the index. This bit indicates whether a carrier is a
 * candidate for "Black List" or not. The BLACK_LIST_FLAG in the attribute filed
 * shall be set during initial PLMN search( as indicated by the flag
 * ini-tial_plmn_search_active) whenever MS fails to synchronize to a carrier.
 * After the completion of initial PLMN search, Black list flag shall be used to
 * update the Black List database based on the outcome of initial PLMN search.
 * CSI-LLD section:4.1.1.2.2
 */
#define CS_SET_BLACK_LIST_FLAG(index) (rr_data->cs_data.attributes[index]|=CS_BLACK_LIST_FLAG)

/* Returns the value of bit:2 of attributes[]field in T_CS_DATA structure for the
 * the carrier identified by index. This bit indicates whether a carrier is a
 * candidate for "Black List" or not. This macro will be called while updating Black
 * list database following the completion of initial PLMN search.
 * CSI-LLD section:4.1.1.2.3
 */
#define CS_GET_BLACK_LIST_FLAG(index) (rr_data->cs_data.attributes[index]&CS_BLACK_LIST_FLAG)

/*
 * Protocol Discriminator and
 * Transaction Identifier of RR
 */
#define PD_RR_TI_0                      0x06
/*
 * Ignore Value
 */
#define IG                NOT_PRESENT_8BIT

/*
 * Paging Indication
 */
#define ANYCH                            0
#define SDCCHCH                          1
#define TCHFCH                           2
#define TCHHFCH                          3
#define TCHHCH                           4

/*
 * MS Capability
 */
#define FULL                             0
#define DUAL                             1
#define SIGN                             2

/*
 * Maximum value for cell ranking
 */
#define MAX_C2                         255

/*
 * Power Classes
 */
#define MAX_CLASSES                      5
#define P_CLASS_2_900                   39
#define P_CLASS_3_900                   37
#define P_CLASS_4_900                   33
#define P_CLASS_5_900                   29
#define P_CLASS_1_1800                  30
#define P_CLASS_2_1800                  24
#define P_CLASS_3_1800                  36
#define P_CLASS_1_1900                  30
#define P_CLASS_2_1900                  24
#define P_CLASS_3_1900                  33

/*
 * Values for BSIC status
 */
#define EMPTY                            0
#define NON_DECODED                      1
#define DECODED                          2

#define CELL_IS_INSERTED                 0
#define BSIC_HAS_CHANGED                 1
#define CELL_IS_NOT_INSERTED             2

#ifdef GPRS
#define CR_PAR_INVALID                   0
#define CR_PAR_VALID                     1
#endif
/*
 * Times defined by multiplies of TDMA frames
 */
#define PERIOD_1_SEC            217L
#define PERIOD_700_SEC       151680L

/*
 * Hierarchy defined by multiplies of TDMA frames
 */
#define HYPERFRAME              2715648
#define STARTING_TIME_INTERVAL    42432
#define STARTING_TIME_INTERVAL0   10808
#define STARTING_TIME_INTERVAL1   31623
/* The Starting Time IE can encode only an interval of time of 42 432 frames,
 * that is to say around 195.8 s. To remove any ambiguity, the specification
 * for a reception at time T is that the encoded interval is
 * (FN-10808, FN+31623). In rigorous terms, if we note ST the starting time:
 *
 * - if 0 <= (ST-FN) mod 42432 <= 31623, the indicated time is the next time
 *                                       when FN mod 42432 is equal to ST
 * - if 32024 <= (ST-FN) mod 42432 <= 42431, the indicated time has already
 *                                           elapsed.
 * The reception time FN is not specified here precisely. To allow room for
 * various MS implementations, the limit between the two behaviours above may
 * be anywhere within the interval defined by
 *
 * - 31624 <= (ST-FN) mod 42432 <= 32023.
 *
 * 3GPP TS 04.18, section 10.5.2.38 Starting Time
 */


/*
 * Flags for sending rr status message
 */
#define SEND_RR_STATUS            1
#define SEND_NO_RR_STATUS         0

/*
 * Bitoffset for encoding/decoding
 */
#define ENCODE_OFFSET             24

/*
 * Protocol Discrimator
 */
#define PD_CC                     3
#define PD_MM                     5
#define PD_RR                     6
#define PD_SMS                    9
#define PD_SS                     11
#define PD_TST                    15

/*
 * Test Messages
 */
#define CLOSE_TCH_LOOP_CMD        0
#define OPEN_LOOP_CMD             6
#define TEST_INTERFACE         0x14

/*
 * Delay for the CLOSE_TCH_LOOP_ACK to allow L1 switching
 */
#define DELAY_CLOSE_TCH_LOOP_ACK  35

/*
 * Release Causes
 */
#define OPTIONAL_INFO_ERROR       0x66

/*
 * System Information Type Flags
 */
#define CELL_SELECTION            0
#define CELL_RESELECTION          1
#define BACK_FROM_DEDICATED       2
#define CELL_RESELECTION_NC       3
#define BACK_FROM_DEDICATED_RLF   4
#define CELL_RESELECTION_RACH     5
#define CELL_RESELECTION_CR       6
#ifdef GPRS
#define CELL_RESELECTION_ON_GPRS_ACT 7
#endif
#define MM_ORIGINATED             TRUE
#define RR_ORIGINATED             FALSE

#define CS_PARALLEL              1
#define CS_NOT_PARALLEL          0

#define NO_SYS_INFO_READ          0

#ifdef GPRS
#define ALL_SYS_INFO_READ         0x007f
#else
#define ALL_SYS_INFO_READ         0x003f
#endif

#define SYS_INFO_1_READ           0x0001
#define SYS_INFO_2_READ           0x0002
#define SYS_INFO_2BIS_READ        0x0004
#define SYS_INFO_2TER_READ        0x0008
#define SYS_INFO_3_READ           0x0010
#define SYS_INFO_4_READ           0x0020
#if defined (REL99) && defined (TI_PS_FF_EMR)
#define SYS_INFO_2QUATER_READ     0x2000
#endif
#define SYS_INFO_EXCEPT_2TER      (ALL_SYS_INFO_READ & (~SYS_INFO_2TER_READ))

#ifdef GPRS
#define SYS_INFO_13_READ          0x0040
#define SYS_INFO_EXCEPT_SI13      (ALL_SYS_INFO_READ & (~SYS_INFO_13_READ))
#endif

#define SYS_INFO_5_READ             0x0100
#define SYS_INFO_5BIS_READ          0x0200
#define SYS_INFO_5TER_READ          0x0400
#define ALL_DEDI_SYS_INFOS          0x0700

#define NO_AVAILABLE              255

#define SYS_INFO_2_MSG            0x1a
#define SYS_INFO_2bis_MSG         0x02
#define SYS_INFO_2ter_MSG         0x03

#if defined (REL99) && defined (TI_PS_FF_EMR)
#define MAX_MULTI_INST             16  /* max.number of instances in multi-instance msg (SI-2quater or MI)*/
#define MSG_SIZE_EMR              168 /* 21 * 8 */
#define MAND_SIZE_EMR              15  /*Max mandatory bits in EMR*/
#define SC_INFO_SIZE_EMR           23  /*size for serving cell, if included*/
#define NC_INVBSIC_EMR             18  /* size for each neighbour cell, if included in Invalid BSIC structure of EMR*/
#define NC_BMP_EMR                  7  /* size for each neighbour cell, if included in BSIC BMP structure of EMR*/
#endif

/*
 * Values for the V(SD) bit
 */
#define SET_ONLY                  0
#define SET_AND_RESET             1
#define RESET_ONLY                2

/*
 * Content Flags
 */
#define NO_CONTENT                0
#define WITH_CHANGED_CONTENT      1
#define WITH_CONTENT              2

/*
 * Establishment Causes
 */
#define ESTCS_LOCATION_UPDATING       0x0400
#define ESTCS_PAGING                  0x0480
#define ESTCS_EMERGENCY_CALL          0x04A0
#define ESTCS_REESTABLISHMENT         0x04C0
#define ESTCS_MOC_SPEECH              0x04E0
#define ESTCS_MOC_DATA                0x04E1
#define ESTCS_MOC_DATA_HR_SUFF        0x04E2
#define ESTCS_MOC_SS_SMS              0x04F0

#define MAX_RACH_RETRANS_VAL 4
#define MAX_TX_INTEGER 16

#define RX_QUAL_UNAVAILABLE 0xFF
#ifdef FF_PS_RSSI
#define RX_ACCE_UNAVAILABLE 0xFF
#endif

/*
 * Application Information: constant name synomyms
 */

#define      LAST_SEG ( L_SEG   )   /* 0x00 */
#define  NOT_LAST_SEG (NL_SEG   )   /* 0x01 */
#define     FIRST_SEG ( F_SEG   )   /* 0x00 */
#define NOT_FIRST_SEG (NF_SEG<<1)   /* 0x02 */

#define   APDU_FULL_L2_FRAME  247
#define   MAX_PRIMPART_SIZE   1600                       /* actually defined in "frm_types.h" */
#if defined FF_EOTD
#define   MAX_APDU_SIZE       (MAX_PRIMPART_SIZE-sizeof(T_PRIM_HEADER)-sizeof(T_RRRRLP_DATA_IND))
#endif /* FF_EOTD */

#define NULLSTRING ""
#define ARFCN_NOT_PRESENT       0xFFFF
#define FRAME_NUM_NOT_PRESENT   0xFFFFFFFFL

/*
 * Timer
 */
enum timer_index_e
{
    T3110,           /* Channel Release Timer                             */
    T3122,           /* Wait Indication Timer                             */
    T3126,           /* Imm Assignment Timer                              */
    T_RESELECT,      /* Reselection Timer                                 */
    TREG,            /* Registration Timer                                */
    TABORT,          /* RR_ABORT_IND Timer                                */
    T_NO_RESELECT,   /* exception of path loss criteria after reselection */
    TIM_EXT_MEAS,    /* Extended Measurement                              */
#if defined FF_EOTD
    TAPDU,           /* Application PDU Timer                             */
#endif /* FF_EOTD */
    TNNN,
    TCSVALID,        /* CS measurements are valid or not                  */
    T_DEDICATED_MODE,/* cell re-selection after leaving dedicated mode    */
    T_PLMN_SEARCH,   /* Manual cell selection timer                       */
    T_FAST_CS,       /* controls FAST search                              */
    T_NORMAL_CS,     /* controls NORMAL search                            */
    NUM_OF_RR_TIMERS
};

#define     TIMER_TRACE

#if defined(TIMER_TRACE)
  #define TRACE_TIMER(FMT)              TRACE_EVENT((FMT))
  #define TRACE_TIMER_P1(FMT,P1)        TRACE_EVENT_P1((FMT),(P1))
  #define TRACE_TIMER_P2(FMT,P1,P2)     TRACE_EVENT_P2((FMT),(P1),(P2))
  #define TRACE_TIMER_P3(FMT,P1,P2,P3)  TRACE_EVENT_P3((FMT),(P1),(P2),(P3))
#else
  #define TRACE_TIMER(FMT)
  #define TRACE_TIMER_P1(FMT,P1)
  #define TRACE_TIMER_P2(FMT,P1,P2)
  #define TRACE_TIMER_P3(FMT,P1,P2,P2)
#endif

/*
 * Dynamic Configuration Numbers
 */
#define TIMER_SET                 1
#define TIMER_RESET               2
#define TIMER_SPEED_UP            3
#define TIMER_SLOW_DOWN           4
#define TIMER_SUPPRESS            5
#define TIM_FAST                  6
#define TIM_NORMAL                7

#define NO_SYS_TIME               20
#define FCR                       21
#define SCR                       22
#define DLE                       23
#define FCA                       24
#define FRL                       25
#define FHO                       26
#define GSM_OFFSET                27
#define DCS_OFFSET                28
#define CTO                       29
#define NKC                       30
#define INIT_FFS                  31
#define WRITE_FFS                 32
#define SET_LAST_USED_SC          33
#define IHO                       34   /* lock the DUT to the cell it is already camping */
#define FBLS                      35

#define ID_RESTRICTED_BAND        50
#define ID_MULTISLOT_CLASS        51
#if defined(_TARGET_)
#define ID_FFS_CHECK              52
#endif /* _TARGET_ */
#define ID_CMSP                   54
#define SCS                       55
#define SHIELD                    56

#define RR_MT_CALL                37
#define RR_MT_SMS_0               38
#define RR_MT_SMS_2               39
#define RR_SERVICE_FULL           40
#define RR_SERVICE_LIMITED        41
#define RR_SERVICE_NO             42
#define RR_MO_CONNECT             43
#define ID_PSEUDO_SYNC_HO         44
#define ID_PCM                    45
#define DCS_PCLASS_3              46
#define BL_CS                     60
#define U_RXT                     61
#define M_RXT                     62
#define L_RXT                     63
#define SHOW_BL                   64
#define SHOW_WL                   65
#define SET_NPS_DELAY             66
#if defined (_SIMULATION_FFS_)
#define ERASE_WL                  70
#define ERASE_BL                  71
#endif
#define SET_WL                    72
#define SET_BL                    73
#define SET_WL_REGION             74
#define SET_WL_PLMN               75

#ifdef TI_PS_FF_AT_P_CMD_CTREG
/*
 * %CTREG tab_id value
 */
#define RR_MOD_NOSERVICE_TIME   1
#define RR_MOD_LIMSERVICE_TIME  2
#endif /* TI_PS_FF_AT_P_CMD_CTREG */
typedef enum{
   SI_TYPE_NONE,
   SI_TYPE_2,
   SI_TYPE_2BIS,
   SI_TYPE_2TER,
   SI_TYPE_3,
   SI_TYPE_4,
   SI_TYPE_5,
   SI_TYPE_5BIS
}T_SI_TYPE;

typedef  enum  {
   CR_STATUS_OFF = 0,
   CR_STATUS_ON
 }  T_CR;
 
typedef  enum  {
   MOB_ALLOC_BEFORE = 0,
   MOB_ALLOC_AFTER
 }  T_MOB_ALLOC_TYPE;


/*
 * Parameter of dynamic configuration commands
 */
#if !defined(NTRACE)
#if defined(RR_PEI_C)
/* Implements Measure#32: Row 36, 39 and 40 */
GLOBAL T_S2I_STRING const _rr_str_FUNC[] = {
  S2I_STRING("LIM"),   /* FUNC_LIM_SERV_ST_SRCH (0x0) limited service state search   */
  S2I_STRING("PLMN"),  /* FUNC_PLMN_SRCH (1) PLMN search                             */
  S2I_STRING("NET")    /* FUNC_NET_SRCH_BY_MMI (0x2) Net search by MMI               */
};
GLOBAL const char* const _rr_str_PARFUNC[] = {
  "",        /* (0) cleared                                              */
  "",        /* (1) invalid value                                        */
  "parallel PLMN " /* FUNC_NET_SRCH_BY_MMI (0x2) Net search by MMI       */
};
/* Implements Measure#32: Row 36, 39 and 40 */
GLOBAL T_S2I_STRING const _rr_str_SERVICE[] = {
  S2I_STRING("NO"),    /* NO_SERVICE (0x0) no service available                      */
  S2I_STRING("LIM"),   /* LIMITED_SERVICE (0x1) Limited service available            */
  S2I_STRING("FULL")   /* FULL_SERVICE (0x2) Full service available                  */
};
GLOBAL const char* const _rr_str_stored_bcch_info[]=
{
  "SI2", "SI2bis", "SI2ter", "SI2"
};
#else   /* RR_PEI_C */
EXTERN const char* const _rr_str_FUNC[];
EXTERN const char* const _rr_str_PARFUNC[];
EXTERN const char* const _rr_str_SERVICE[];
EXTERN const char* const _rr_str_stored_bcch_info[];
#endif  /* RR_PEI_C */
#endif  /* !NTRACE */

/*
 * States of the Attachment
 */
#define ATT_NULL                  0
#define ATT_CS1                   1 /* Power measurement, Sync (MPH_BSIC_REQ/CNF) */
#define ATT_CS2                   2 /* BCCH reading (Cell selection) */
#define ATT_CS3                   3 /* Cell reselection */
#define ATT_DEDICATED             4
#define ATT_IDLE                  5
#define ATT_NO_SERVICE            6
#define ATT_CON_EST               7
#define ATT_CS_INIT               8 /* Initial RR_ACTIVATE_REQ got and Power measurements started */

/* N950 Memory Optimization - Implements Measure #39*/
EXTERN  T_S2I_STRING  const
        STATE_ATT_NAME[];

/*
 * States of the Process Data Transfer
 */
#define DAT_NULL                  0
#define DAT_CELL_RESELECT         1
#define DAT_CHAN_ASS              2
#define DAT_CHAN_ASS_1            3
#define DAT_CHAN_ASS_2            4
#define DAT_PDCH_ASS              5
#define DAT_PDCH_ASS_1            6
#define DAT_PDCH_ASS_2            7
#define DAT_PDCH_ASS_3            8
#define DAT_PDCH_ASS_4            9
#define DAT_CCO_3                 10
#define DAT_CCO_4                 11
#define DAT_CHAN_REL              12
#define DAT_DEDICATED             13
#define DAT_HANDOVER              14
#define DAT_HANDOVER_4            15
#define DAT_HANDOVER_5            16
#define DAT_IDLE                  17
#define DAT_IMM_ASS               18
#define DAT_IMM_ASS_1             19

/* N950 Memory Optimization - Implements Measure #39*/
EXTERN  T_S2I_STRING  const
        STATE_DAT_NAME[];
/*
 * States for short message service (Sapi 3)
 */
#define SMS_IDLE                  0
#define SMS_PENDING               1
#define SMS_ESTABLISHED           2

/* N950 Memory Optimization - Implements Measure #39*/
EXTERN  T_S2I_STRING  const
        STATE_SAPI_3_NAME[];
/*
 * States for cell selection
 */
#define CS_NULL                  0    /* after system start or before 'cs_start_scan'                      */
#define CS_NULL_ACTIVE           1    /* after MPH_POWER_REQ sent in CS_NULL                               */
#define CS_CCO                   2
#define CS_XMEAS                 3
#define CS_IDLE                  4    /* all ARFCNs provided by MPH_POWER_CNF are used by MPH_BSIC_REQ/CNF */
#define CS_IDLE_ACTIVE           5    /* after MPH_POWER_REQ sent in CS_IDLE or MPH_BSIC_REQ sent          */

/* N950 Memory Optimization - Implements Measure #39*/
EXTERN  T_S2I_STRING  const
        STATE_CELL_SEL_NAME[];
/*
 * RR manages 5 (MAX_STATE) states: ATT, DAT, SAPI_3, GPRS, CS
 */
#ifdef OPTION_MULTITHREAD
  #define PROCESS_NAME    _ENTITY_PREFIXED(PROCESS_NAME)
#endif

#define STATE_ATT                 0
#define STATE_DAT                 1
#define STATE_SAPI_3              2
#define STATE_CELL_SEL            3
#ifdef GPRS
#define STATE_GPRS                4
#define MAX_STATE                 5
#else
#define MAX_STATE                 4
#endif

/* N950 Memory Optimization - Implements Measure #39*/
EXTERN  T_S2I_STRING const
        PROCESS_NAME[];


#define MAX_STK_LENGTH      80
#define NOT_INITIALISED     NOT_PRESENT_8BIT /*Used for initialising element 'c_ncell_bcch'*/

/*
 * A definition is provided in RR_PEI.C
 */
#ifdef RR_PEI_C
/* N950 Memory Optimization - Implements Measure #39*/
GLOBAL T_S2I_STRING const  STATE_ATT_NAME[] =
{
  S2I_STRING("ATT_NULL")     ,      
  S2I_STRING("ATT_CS1")      ,     
  S2I_STRING("ATT_CS2")      ,       
  S2I_STRING("ATT_CS3")      ,      
  S2I_STRING("ATT_DEDICATED"),      
  S2I_STRING("ATT_IDLE")     ,     
  S2I_STRING("ATT_NO_SERVICE"),     
  S2I_STRING("ATT_CON_EST") 
};
GLOBAL T_S2I_STRING const       STATE_DAT_NAME[] =
{
  S2I_STRING("DAT_NULL")         ,
  S2I_STRING("DAT_CELL_RESELECT"),
  S2I_STRING("DAT_CHAN_ASS")     ,
  S2I_STRING("DAT_CHAN_ASS_1")   ,
  S2I_STRING("DAT_CHAN_ASS_2")   ,
  S2I_STRING("DAT_PDCH_ASS")     ,
  S2I_STRING("DAT_PDCH_ASS_1")   ,
  S2I_STRING("DAT_PDCH_ASS_2")   ,
  S2I_STRING("DAT_PDCH_ASS_3")   ,
  S2I_STRING("DAT_PDCH_ASS_4")   ,
  S2I_STRING("DAT_CCO_3")        ,
  S2I_STRING("DAT_CCO_4")        ,
  S2I_STRING("DAT_CHAN_REL")     ,
  S2I_STRING("DAT_HANDOVER")     ,
  S2I_STRING("DAT_HANDOVER_4")   ,
  S2I_STRING("DAT_HANDOVER_5")   ,
  S2I_STRING("DAT_IDLE")         ,
  S2I_STRING("DAT_IMM_ASS")      ,
  S2I_STRING("DAT_IMM_ASS_1")
};

GLOBAL T_S2I_STRING const    STATE_SAPI_3_NAME[] = 
{
  S2I_STRING("SMS_IDLE")       ,
  S2I_STRING("SMS_PENDING")    ,
  S2I_STRING("SMS_ESTABLISHED")
};

GLOBAL T_S2I_STRING const  STATE_CELL_SEL_NAME[] = 
{ 

  S2I_STRING("CS_NULL")             ,
  S2I_STRING("CS_NULL_ACTIVE")      ,
  S2I_STRING("CS_CCO")              ,
  S2I_STRING("CS_XMEAS")            ,
  S2I_STRING("CS_IDLE")             ,
  S2I_STRING("CS_IDLE_ACTIVE")
};
#ifdef GPRS
GLOBAL T_S2I_STRING const        PROCESS_NAME[] = 
{
  S2I_STRING("ATT")   ,
  S2I_STRING("DAT")   ,
  S2I_STRING("SAPI_3"),
  S2I_STRING("CELL_SEL"),
  S2I_STRING("GPRS") 
};
#else
GLOBAL T_S2I_STRING const        PROCESS_NAME[] = 
{
  S2I_STRING("ATT")   ,
  S2I_STRING("DAT")   ,
  S2I_STRING("SAPI_3"),
  S2I_STRING("CELL_SEL") 
};
#endif

#endif

/*
 * Shifts for 'operation_mode'
 */
#define SHIFT_FOR_SIM_TYPE          7
#define SHIFT_FOR_SEARCH_OFFSET     6
#define SHIFT_FOR_SIM_INSERTED      5

/*
 * To check multiband restrictions
 */
#define UNKNOWN_BAND_USED 0
#define INVALID_BAND_USED 1
#define LOW_BAND_USED     2
#define HIGH_BAND_USED    4
#define EXT_BAND_USED     8

/*
 * Defines for Equivalent PLMNs
 */
#define UBYTES_PER_PLMN    3
#define RR_EPLMNLIST_SIZE   (SIZE_EPLMN/UBYTES_PER_PLMN)

/*
 * Maximum lenght of the string that can be passed to sprintf
 */
#define MAX_SPRINTF_STRING_LEN 80

/*==== TYPES ======================================================*/
typedef struct
{
  UBYTE length;
  UBYTE count;
} T_W_PARAM;

typedef struct
{
  UBYTE                 cs;
  UBYTE                 val;
} T_ERROR;


/* range check with the fastest way for ARM */
/* corresponds with ((min <= x) AND (x <= max)) */
#define INRANGE(min, x, max)  ((unsigned) ( (x)-(min) ) <= (unsigned)( (max)-(min) ) )

/*
 * This data structure stores a list of frequencies.
 * The frequencies are stored in bitmap format.
 * In GSM the frequencies have a range of 0 - 1023
 * where some of the frequencies are not yet used.
 * For the calculation of the needs of bytes and the bit representations of
 * the channels within the T_LIST please have a look at rr_srv.c
 * (comment with 'List processing Functions')
 */

#define            L3_SDU_BUF_SIZE     30
typedef struct
{
  /*lint -esym(768,length) : not referenced */
  USHORT  length;
  USHORT  offset;
  UBYTE   buffer  [L3_SDU_BUF_SIZE];
} T_L3_SDU;

typedef enum
{
  SAI_NULL,     /* no APDU transfer is ongoing */
  SAI_SEGM      /* segmentation or re-segmentation is ongoing */
} T_APPLIC_STATE;

#if defined FF_EOTD
typedef struct
{
  T_APPLIC_STATE        state;              /* state of application procedure */
  T_RRRRLP_DATA_IND    *rrrrlp_data_ind;    /* APDU Data during re-segmentation */
} T_APPLIC_RX;
#endif /* FF_EOTD */

typedef struct
{
  UBYTE           param_ind;
  UBYTE           cbq;
  UBYTE           cell_reselect_offset;
  UBYTE           temp_offset;
  UBYTE           penalty_time;
  UBYTE           power_off_ind;
  UBYTE           power_off;
  UBYTE           two_ter;
  UBYTE           ecsc;
} T_C2_PARAMETER;

typedef struct
{
  UBYTE           ia_p;
  UBYTE           ia_maio;
  UBYTE           c_ia_mac;
  UBYTE           ia_mac[9];
} T_IA_REST;

#if defined(_SIMULATION_FFS_)
typedef struct
{
   UBYTE           mcc[MAX_MCC_SHIELD][SIZE_MCC];
   UBYTE           enabled;
   UBYTE           index;
}T_shield_mcc;
#endif

/* CSI-LLD section:3.2.1
 * Black list contains the carriers that cannot be synchronized
 * Carriers belonging to either european or american bands can
 * be part of black list
 */
typedef struct
{
  T_LIST list[MAX_REGIONS];                    /* Seperate lists for European & American regions              */
  U8     sfc[MAX_REGIONS][MAX_SFC_PER_REGION]; /* Seperate sync fail counters for European & American regions */
}T_CS_BLACK_LIST;

/* CSI-LLD 3.2.2
 * White List Data of RR.White List contains carriers that are good candidates
 * for full service.
 */
typedef struct
{
  T_LIST           list;
  T_loc_area_ident last_sc_lac;       /* stores the LAC of the last serving cell */
  U16              last_sc_arfcn;     /* stores the last serving cell ARFCN      */
  U8               region;            /* stores the region information           */
} T_CS_WHITE_LIST;

typedef struct
{
  U8               si2[BA_BITMAP_SIZE];    /* stores the BA list received in SI2      */
  U8               si2bis[BA_BITMAP_SIZE]; /* stores the BA list received in SI2BIS   */
  U8               si2ter[BA_BITMAP_SIZE]; /* stores the BA list received in SI2TER   */
} T_CR_WHITE_LIST;

/*
 * ms data of RR
 */
typedef struct
{
  UBYTE                 rr_service;        /* actual rr service mode      */
  UBYTE                 req_mm_service;    /* by mm requested service mode*/
  BOOL                  multislot_class_configured;
  BOOL                  cmsp_configured;
  T_rf_cap              rf_cap;            /* MS RF Capability            */
  T_mob_class_1         classmark1;        /* mobile station classmark 1  */
  T_mob_class_2         classmark2;        /* mobile station classmark 2  */
  T_mob_class_3         classmark3;        /* mobile station classmark 3  */
#ifdef GPRS
  T_ra_cap              ra_cap;            /* MS Radio Access Capability  */
#endif
  T_mob_ident           imei;              /* IMEI                        */
  UBYTE                 operation_mode;    /* Operation Parameters from MM*/

 /*
  * The purpose of 'parallel_net_plmn_search_type?and ‘current_plmn_search_type?  * is to record the request for a parallel search (i.e. to action a network
  * search whilst an existing search (for a limited/plmn) is already underway)
  *
  * The original request is stored in ‘current_plmn_search_type?and the parallel
  * net search request is stored in ‘parallel_net_plmn_search_type?
  *
  * When the NET search is completed, ‘parallel_net_plmn_search_type?is cleared
  * and ‘mm_req_service?is set the stored search value in ‘current_plmn_search_type?
  */
  UBYTE                 parallel_net_plmn_search_type;
  UBYTE                 current_plmn_search_type;


  T_plmn                plmn;              /* requested network by MM     */
  BOOL                  v_eq_plmn;         /* EPLMN List is valid or not  */
  T_plmn                eq_plmn_list[RR_EPLMNLIST_SIZE];      /* eq PLMN list from MM        */
  UBYTE                 cksn;              /* cipher key sequence number  */
  UBYTE                 kc [KC_STRING_SIZE]; /* authentication parameter Kc */
  UBYTE                 new_kc [KC_STRING_SIZE]; /* new auth parameter from SIM */
  USHORT                access_classes;    /* access classes from SIM     */
  T_mob_ident           imsi;              /* IMSI from SIM card          */
  UBYTE                 imsi_available;    /* IMSI available flag         */
  ULONG                 tmsi_binary;       /* binary representation TMSI  */
  UBYTE                 tmsi_available;    /* TMSI available flag         */
  T_loc_area_ident      forb_lac_list[MAX_LAI];
                                           /* forbidden lai list          */
  T_loc_area_ident      roam_forb_lac_list[MAX_LAI];
                                           /* roaming forbidden lai list  */
  UBYTE                 c2_tab [NCELL_SIZE]; /* ranked list for C2          */
  UBYTE                 access_counter;    /* counts random bursts        */
  UBYTE                 all_conf_received; /* flag all randoms confirmed  */
  UBYTE                 channel_needed;    /* for mobile terminated call  */
  T_ERROR               error;             /* in incoming messages        */
  USHORT                establish_cause;   /* for outgoing call           */
  ULONG                 fn_offset;         /* time between measurements   */
  T_synch_ind           ho_type;           /* handover type information   */
  USHORT                index;             /* for random number generation*/
  T_L3_SDU              l3msg;             /* layer 3 message for establ. */
  UBYTE                 last_used_channel; /* for building random ref     */
  UBYTE                 max_attempt;       /* number of random bursts     */
  T_MPH_MEASUREMENT_IND measurement_report;/* last measurement report     */
  T_TIME                reg_time_gap;      /* Time gap between Non parallel search in Lim Ser */
  UBYTE                 reg_counter;       /* registration counter        */
  UBYTE                 old_cell_tried;    /* flag during cell reselection*/
  T_plmn                ahplmn;            /* Acting HPLMN ID */
#if defined (REL99) AND defined (TI_PS_FF_EMR) AND (GPRS)
  BOOL                  enable_ps_emr;
#endif
} T_MS_DATA;

#if defined (REL99) && defined (TI_PS_FF_EMR)
/* indicates from where the enhanced para are taken - SI2quater or MI*/
#define  ENH_PARA_IDLE                0
#define  ENH_PARA_DEDICATED           1
#define  ENH_PARA_INVALID_STATE       2
#endif

#if defined (TI_PS_FF_RTD) AND defined (REL99)
/* start of constants related to RTD */
#define  RTD_DEFAULT_INDEX             0
#define  RTD_NOT_AVAILABLE             0xFFFF
#define  RTD_12BIT                     0x8000
#define  MAX_NR_OF_NCELL               0x20
/* end of constants related to RTD */
#endif /* #if defined (TI_PS_FF_RTD) AND defined (REL99) */


/*
 * data area for cell selection / reselection
 */
typedef struct
{
  UBYTE             v_cell_chan_desc;    /* cell chan desc flag         */
  T_LIST            cell_chan_desc;      /* cell channel description    */
  T_chan_desc       cbch_chan_desc;      /* cbch channel description    */
  UBYTE             cbch_chan_desc_avail;/* cbch available flag         */
  UBYTE             cbch_mob_alloc [65]; /* cbch mobile allocation      */
  UBYTE             ncc_permitted;       /* NCC permitted bitmap        */
  T_cell_opt_sacch  cell_options;        /* cell options                */
  UBYTE             ncell_ext;           /* neighbourcell extension flag*/
  UBYTE             dtx;                 /* dtx flag                    */
  UBYTE             dtx_half;
  UBYTE             dtx_full;
  USHORT            sys_info_read;       /* bitmap of read sys infos    */
  T_LIST            ncell_list;          /* neighbour cell list         */
#if defined (REL99) && defined (TI_PS_FF_EMR)
  UBYTE             si2quater_status;    /*Indicates the SI-2quater status on cell that can be used
                                           once the cell is selected */
  BOOL              si2quater_pos;       /* 0 - NBCCH, 1 - EBCCH*/
#endif
#ifdef TI_PS_FF_QUAD_BAND_SUPPORT
  UBYTE             band_indicator;      /* 0 - 1800,  1 - 1900 */
#endif
} T_CELL_DATA;

typedef struct
{
  T_plmn            plmn;               /* Idetification of Network     */
  USHORT            lac;                /* Location Area Code           */
  USHORT            arfcn;              /* Frequency Number             */
  UBYTE             rxlev;              /* The received signal level    */
  UBYTE             cell_ok;            /* cell allows network access   */
  UBYTE             region;             /* Identification of region     */
} T_FOUND_ELEMENT;

typedef struct
{
  T_FOUND_ELEMENT   element [MAX_PLMN];
} T_FOUND_LIST;

#if defined (REL99) && defined (TI_PS_FF_EMR)
typedef struct {
  BOOL              is_data_valid; /*Indicates whether the maintained Enhanced parameters 
                                      is valid or not.*/
  UBYTE             mp_change_mark; /*Current change mark value of the measurement parameters
                                      received in Air message*/
  UBYTE             msg_count; /*Number of instances to be received*/   
  UBYTE             rep_type; /* 'Normal' or 'Enhanced': Report type to be used in dedicated mode*/
  UBYTE             grr_rep_type; /* 'Normal' or 'Enhanced': Report type to be used in PIM/PTM*/
  T_enh_para_struct enh_para;/* Actual parameters */
#ifdef GPRS
  T_nc_para_struct  nc_para; /*Network control parameters*/
#endif
  ULONG             ba2bsic_map_pending;/*1 in a bit pos indicates BA-BSIC mapping is pending for that index
                                          may be due to incomplete BA (SI-5ter awaited)*/
  UBYTE             scale_used_last;
} T_rr_enh_para;

/*In a multi instance message where this BSIC info is received,
  not all instances carry BSIC list. The instance that carries
  this info will have is_valid set to TRUE*/
typedef struct  {
  BOOL            is_valid;
  T_gprs_bsic     bsic_info;  
} T_bsic_list;
#endif

/*
 * serving cell data of RR
 */
typedef struct
{
  UBYTE             ciph_on;             /* ciphering status            */
  UBYTE             algo;                /* cipher algorithm            */
  UBYTE             ciph_received;       /* flag ciphering received     */
  UBYTE             selection_type;      /* type of cell selection      */
  BOOL              mm_started;          /* originated of cell selection*/
  UBYTE             found_entries;       /* number of found PLMNs       */
  T_FOUND_ELEMENT   found[MAX_PLMN];     /* list of found PLMNs         */
  UBYTE             first_attempt;       /* high priority attempt       */

  T_chan_desc       chan_desc;           /* actual channel description  */
  UBYTE             new_ta;              /* timing advance              */
  UBYTE             ch_mode;             /* actual channel mode         */
  UBYTE             ba_index;            /* band allocation index       */
  ULONG             observed_ta;         /* observed timing advance     */
  T_LIST            five_ter_list;       /* contains sys info 5ter list */
  T_LIST            ncell_list_idle;     /* neighbour cell list build in idle mode */
  /*
   * data area for cell selection / reselection
   */
  T_CELL_DATA       cd;                  /* cell data                   */
  T_multirate_conf  amr_conf;            /* MultiRate configuration     */
#if defined(STORE_FN)
  ULONG             fn;                  /* last indicated framenumber  */
#endif  /* STORE_FN */
#if defined (REL99) && defined (TI_PS_FF_EMR)
  /* 
   * Data area for EMR
   */
  /* 
   *  Parameters that are permanent
   */
  UBYTE             enh_para_status; /* Indicates Whether the existing enh_para are from SI-2quater or MI*/
  T_rr_enh_para     emr_data_current;    /*Parameters for EMR - for RR in dedicated
                                          mode and for GRR in PIM/PTM mode. Not required in Idle*/
  BOOL              ba_list_ded; /*Indicates whether BA list is already received in dedicated mode*/  
  BOOL              ba_list_idle;/*Indicates whether BA list is already received in Idle mode*/    
  /* 
   *  Parameters that are required only during message processing
   */
  T_rr_enh_para     emr_data_temp;    /* Temporary storage till we get all the instances of Air message*/
  UBYTE             prev_highest_index; /*To keep track of highest index*/
  ULONG             rep_bmp;          /*temporary storage of report priority in bit map form*/
  USHORT            instance_bmp; /*A bit set indicates that the instance is received. Bit 0- instance '0'
                                    bit 15 - instance '15'*/
  T_bsic_list       bsic_list[MAX_MULTI_INST];  /* To store the received BSIC lists before performing
                                                  BA-BSIC mapping*/
  UBYTE       rep_count[MAX_NEIGHBOURCELLS]; /* 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*/  
  UBYTE       emr_count; /*Keeps track (MOD4) of number of EMR messages sent*/    
  UBYTE              ba_index_idle; /*To store BA_INDEX used in Idle before going to Dedicated*/
  UBYTE              new_ba_index;
#endif
} T_SC_DATA;

/*
 * cell reselection data of RR (during handover or hplmn search)
 */
typedef struct
{
  UBYTE             ciph_on;             /* ciphering status            */
  UBYTE             algo;                /* cipher algorithm            */
  UBYTE             ch_mode;             /* actual channel mode         */
  T_chan_desc       chan_desc;           /* actual channel description  */
  T_CR_WHITE_LIST   cr_white_list;       /* stores si2x temporarily during BCCH reading */
  T_CELL_DATA       cd;                  /* cell data                   */
  T_multirate_conf  amr_conf;            /* MultiRate configuration     */
#if defined (REL99) && defined (TI_PS_FF_EMR)
  UBYTE             ba_index;            /* BA-IND received in BA(list) of SI-2*/  
#endif

} T_CR_DATA;
#ifdef GPRS
typedef enum
{
  NORMAL_BCCH,
  EXTENDED_BCCH,
  SI13_NOT_PRESENT
} T_SI13_LOC_IND;
#endif
/*
 * Neighbour cell data of RR
 */

/* DRAM Optimization: This structure is re-allign with 4 bytes 
 * sothat will have minimum wastage */
typedef struct
{
  T_ctrl_chan_desc  control_descr;       /* Control Channel Description */
  T_cell_select     select_para;         /* Cell Selection Parameter    */
  T_rach_ctrl       rach;                /* random control parameter    */
  T_loc_area_ident  lai;                 /* location area identification*/

  ULONG             avail_time;          /* time ncell is available     */
  ULONG             c1_counter;          /* measurement report counter  */
  ULONG             bcch_counter;

  USHORT            arfcn;               /* channel number         */
  SHORT             c1;                  /* C1 Path Loss Criterion      */
  SHORT             c2;                  /* C2 Reselection Criterion    */
  USHORT            cell_id;             /* cell identifier             */

  T_C2_PARAMETER    c2_par;              /* C2 Parameter for Calculation*/  
  UBYTE             rxlev;               /* fieldstrength               */
  UBYTE             v_acs;               /* read of sys info 7 & 8      */
  UBYTE             c2_used;             /* calculated c2 values        */

  UBYTE             bcch_error;          /* couter BCCH errors          */
  UBYTE             bcch_status;         /* status of neighbour cell    */
  UBYTE             bsic;                /* BSIC                        */
  UBYTE             tnnn;                /* 5 sec counter reselection   */

  SHORT             c2_corr;
#ifdef GPRS
  SHORT             c31;
  SHORT             c32;
  UBYTE              c32_used;
  UBYTE              v_cr_par;
  T_cr_par           cr_par;
#endif

#ifdef GPRS
  T_SI13_LOC_IND si13_loc_ind;
#endif
  
#ifdef GPRS
  UBYTE             rac;                 /* routing area color          */
#endif

#ifdef REL99
  UBYTE             mscr_flag;
#endif   

} T_NC_DATA;

/*
 * Cell Selection Process Data
 */
typedef struct
{
  UBYTE      max_arfcn;                    /* number of valid channels    */
  UBYTE      act_index;                    /* actual index                */
  BOOL       check_hplmn;                  /* check HPLMN */
  USHORT     arfcn     [MAX_CHANNELS];               /* channel number              */
  UBYTE      rxlev     [MAX_CHANNELS];               /* fieldstrength               */
  UBYTE      attributes[MAX_CHANNELS];               /* attributes of channel       */
             /* Bit 7 Bcch Info List Flag
                      0 : not member of the BCCH info List
                      1 : member of the BCCH info List
                Bit 6 Low Priority Flag
                      0 : high priority flag
                      1 : low  priority flag
                Bit 5 Emergency Cell Flag
                      0 : emergency services possible
                      1 : emergency services not possible
                Bit 4 BCCH Detected Flag
                      0 : BCCH not decoded
                      1 : BCCH decoded
                Bit 3 BCCH Checked Flag
                      0 : BCCH not checked
                      1 : BCCH checked
                Bit 2 reserved
                Bit 1/0   Priority
                      0 : low priority
                      1 : middle priority
                      2 : high priority
             */
  USHORT     arfcn_sc;
  USHORT     arfcn_cr;
  T_CS_BLACK_LIST black_list;         /* Stores the black_list information */
  T_CS_WHITE_LIST white_list;         /* Stores the white list information */
  U8         previous_search_mode;    /* stores the previous search mode   */
  U8         current_search_mode;     /* stores the current search mode    */
  U8         scan_mode;               /* Identifies the scan mode          */
  U8         initial_plmn_search;     /* Identifies first FUNC_PLMN search */
  U8         black_list_search_pending;
  U8         region;                  /* This stores the region            */
  BOOL       all_freq_area;           /* Identifies presence of both Euro and American coverage */
  T_plmn     last_reg_plmn;           /* Stores the last registered PLMN */                                 
} T_CS_DATA;

/* CSI-LLD Section 3.8
 * Dynamic configuration commands data
 */
typedef struct
{
  U32    tfast_cs_val;     /* TFAST_CS timer value in minutes   */
  U32    tnormal_cs_val;   /* TNORMAL_CS timer value in minutes */
  U8     upper_rxlev_thr[MAX_NUM_BANDS];  /* Upper RxLev threshold             */
  U8     medium_rxlev_thr[MAX_NUM_BANDS]; /* Medium RxLev threshold            */
  U8     lower_rxlev_thr[MAX_NUM_BANDS];  /* Lower RxLev threshold             */
  U8     bl_cs_en;         /* Controls Black List search        */
  U8     fcr;              /* dynamic configuration, Fast Cell Recelection */
  U8     scr;              /* dynamic configuration, Slow Cell Recelection */
  U8     fca;              /* dynamic configuration, Failed Channel Assignment */
  U8     fho;              /* dynamic configuration, Force Handover */
  U8     iho;              /* dynamic configuration, lock the DUT to the cell it is already camping */
  U8     set_band;         /* dynamic configuration, Frequency Band control */
  U8     no_sys_time;      /* dynamic configuration, control time dependent random generation */
  S16    gsm_offset;       /* dynamic configuration, offset to path loss criterium C1 */
  S16    dcs_offset;       /* dynamic configuration, offset to path loss criterium C1 */
  U8     nkc;              /* dynamic configuration, user specific, ciphering when no ciphering key available */
  T_TIME lim_ser_nps_delay;/* dynamic configuration, delay between Non parallel search in Lim ser in all freq area */
#if defined(_SIMULATION_FFS_)
  T_shield_mcc mcc_shield;    /* This structure contains the shielded MCC values*/
#endif
} T_DYNAMIC_CONFIG;

typedef struct
{
  UBYTE                 state[MAX_STATE];
  T_MS_DATA             ms_data;
  T_SC_DATA             sc_data;
  T_CR_DATA             cr_data;
  T_NC_DATA             nc_data [NCELL_SIZE];  /* 0-5 = ncell, 6 = serving cell
                                                * 7   = cell reselection
                                                */
  T_CS_DATA             cs_data;
#ifdef GPRS
  T_GPRS_DATA           gprs_data;
  T_LIST                ba_ncell_list;  /* Used to store Original BA list, when BA list is midified by PMO */
#endif
  UBYTE                 lup_rxlev;
  UBYTE                 c1_offset;
  /*
   * primitive storing variables
   */
  T_PRIM                *stored_prim [MAX_RR_STORED_PRIM];
  UBYTE                stored_prim_in;
  UBYTE                stored_prim_out;
  UBYTE                stored_prim_read;
  UBYTE                stored_prim_write;
  /*
   * must be checked ...
   */
  UBYTE                 old_serving_cell;
  USHORT                old_cell_id;
  T_loc_area_ident      old_lai;
  UBYTE                 page_identity_type;
  USHORT                power_on_low;
  USHORT                power_on_high;
  USHORT                rel_cause;
  USHORT                dcch_stop_cause;
  UBYTE                 reselect_index;
  UBYTE                 repeat_est;
  UBYTE                 t_running[NUM_OF_RR_TIMERS];
  void                  (*t_expire[NUM_OF_RR_TIMERS])(void);
  UBYTE                 treg_pending;
  UBYTE                 tch_loop_subch;
  UBYTE                 used_channel_ref[MAX_RACH_REQ];
  T_frame_no            used_frame_no[MAX_RACH_REQ];
  UBYTE                 bcch_error;

  UBYTE                 pag_rec;
  UBYTE                 imm_ass_rej_rec;
  EF_MSCAP              mscap;
  USHORT                act_ncell_list [MAX_NEIGHBOURCELLS];
  UBYTE                 ncell_mb;
  UBYTE                 start_cell_reselection;
  UBYTE                 first_meas_received;
  UBYTE                 mode_after_dedi;        /* MODE_CELL_RESELECTION or MODE_CELL_SELECTION or MODE_CELL_CHANGE_ORDER*/
  BOOL                  net_lost;               /* a RLF Radio Link Failure or DSF Downlink Signalling Failure has occured */
  USHORT                found_channel;          /* ARFCN of requested PLMN (obtained from 'previous' Cell Selection data) */
  UBYTE                 ba_id;               /* BA identifier used with Neighbour Cell Measurement       */

#if defined FF_EOTD
  USHORT                eotd_req_id;         /* indicate explicit position measurement requests          */
  T_APPLIC_RX           applic_rx;           /* Application Information transfer                         */
#endif /* FF_EOTD */

  UBYTE                 emo_seq;             /* EMO sequence number                                      */
  UBYTE                 c_emo_arfcn;         /* number of elements in emo_arfcn                          */
  USHORT                *emo_arfcn;          /* request list of EMO ARFCNs                               */

  UBYTE                 resel_pending;       /* cell reselection was deferred */
  UBYTE                 c_ncell_bcch;        /* # of outstanding ncell BCCH info. Default=NOT_INITIALISED     */
  UBYTE                 cell_test_operation; /* dynamic configuration, as defined in TS 11.11, section 10.3.18 EFAD (Administrative data) */
  T_DYNAMIC_CONFIG      dyn_config;          /* Holds dynamic configuration data */
#ifdef GPRS
  U8                    old_rac;             /* Holds old Routing area code */
#endif
  BOOL                  cr_treselect_exp;    /* Flag to indicate whether cell reselection after TRESELECT
                                              * expiry waiting for SI2TER is suceesfull or not */
  BOOL                  use_stored_entries;  /* Use stored entries after end of transition */
} T_RR_DATA;

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


/*
 * Used for requesting location information from RR for proactive polling in sim
 */
typedef struct
{
  /*lint -esym(768,stk_class) : not referenced */
  /*lint -esym(768,stk_subclass) */
  /*lint -esym(768,stk_type) */
  UBYTE stk_class;
  UBYTE stk_subclass;
  UBYTE stk_type;
  UBYTE stk_length;
  UBYTE stk_parameter [MAX_STK_LENGTH];
} stk_data_type;

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

/*
 * Prototypes Timer
 */
/*
 * If all entities are linked into one module this definitions
 * prefixes all this functions with the enity name
 */

#ifdef OPTION_MULTITHREAD
  #define tim_exec_timeout   _ENTITY_PREFIXED(tim_exec_timeout)
  #define tim_start_timer    _ENTITY_PREFIXED(tim_start_timer)
  #define tim_stop_timer     _ENTITY_PREFIXED(tim_stop_timer)
#if defined(TIMER_TRACE)
  #define tim_check_timer    _ENTITY_PREFIXED(tim_check_timer)
#endif  /* TIMER_TRACE */
#endif  /*  OPTION_MULTITHREAD*/
EXTERN void tim_exec_timeout (USHORT index);
EXTERN void tim_start_timer  (USHORT index, T_TIME value);
EXTERN void tim_stop_timer   (USHORT index);
#if defined(TIMER_TRACE)
EXTERN BOOL tim_check_timer(USHORT index);
#endif  /* TIMER_TRACE */

EXTERN void tim_t3110                   (void);
EXTERN void tim_t3122                   (void);
EXTERN void tim_t3126                   (void);
EXTERN void tim_treselect               (void);
EXTERN void tim_treg                    (void);
EXTERN void tim_ext_meas                (void);
#if defined FF_EOTD
EXTERN void tim_apdu                    (void);
#endif /* FF_EOTD */
EXTERN void tim_tnnn                    (void);
EXTERN void set_tnnn                    (int                 index,
                                         USHORT              value);
EXTERN void reset_tnnn                  (int                 index);
EXTERN int is_tnnn                      (int                 index);
EXTERN void tim_tabort                  (void);
EXTERN void tstart_tabort               (USHORT              val);
EXTERN void tim_reset_registration_timer(void);
EXTERN void tim_plmn_search_expiry      (void);
EXTERN void tim_tnormal_cs              (void);
EXTERN void tim_tfast_cs                (void);

/*
 * Prototypes Customer Specific Functions
 */

/*
 *  Cell Selection
 */
EXTERN void       cs_init_process     (void);
EXTERN void       cs_set_all          (void);
EXTERN void       cs_start_scan       (void);
EXTERN void       cs_start_sync       (void);
EXTERN void       cs_del_list         (T_LIST      * list);
EXTERN void       cs_set_list         (T_LIST      * list);
EXTERN UBYTE      cs_def_list         (UBYTE         attribute);
EXTERN BOOL       cs_sync_next        (void);
EXTERN void       cs_set_null         (void);
EXTERN void       cs_set_attributes   (UBYTE             attribute,
                                       USHORT            arfcn);
EXTERN void       cs_set_rxlev        (UBYTE rxlev, USHORT arfcn);
EXTERN void       cs_clear_attributes (UBYTE attribute, USHORT arfcn);
EXTERN void       cs_mph_power_cnf    (T_MPH_POWER_CNF * mph_power_cnf);
EXTERN void       cs_mph_bsic_cnf     (T_MPH_BSIC_CNF  * mph_bsic_cnf);
EXTERN void       cs_set_stop_active  (void);
EXTERN void       cs_set_bcch_info    (T_bcch_info * sim_bcch_info);
EXTERN void       cs_get_channel_from_found_list (void);
EXTERN void       cs_clear_channel_from_found_list (void);
EXTERN UBYTE      cs_get_freq_band (UBYTE pch_interrupt);
EXTERN void       cs_clear_white_list(U8 clr_bcch_info);

/* CSI-LLD section:4.1.1.5  */
GLOBAL void  cs_store_black_list(void);
GLOBAL void  cs_add_to_black_list(U8 region,U16 arfcn,U8 rxlev);
GLOBAL void  cs_del_from_black_list(U8 region,U16 arfcn);
GLOBAL void  cs_clear_black_list(U8 erase_type);
GLOBAL void  cs_remove_BA_MA_from_black_list(U8 region,T_LIST *source_list);
GLOBAL void  cs_update_black_list(void);
EXTERN U8    cs_get_new_search_mode(void);
EXTERN void  cs_handle_search_mode_timer(U8 search_mode);
GLOBAL void  cs_rem_inactive_carriers_from_bl(T_MPH_POWER_CNF * mph_power_cnf);
GLOBAL BOOL  cs_check_region(U8 region);
GLOBAL BOOL  cs_check_arfcn_range(U16 arfcn);
#ifdef TI_PS_FF_QUAD_BAND_SUPPORT
GLOBAL UBYTE cs_get_band_index(USHORT arfcn);
#endif

/*
 *  RR Attachment
 */

/*
 *  attachment primitives
 */
EXTERN void att_mph_error_ind           (T_MPH_ERROR_IND       * mph_error_ind);
EXTERN void att_mph_measurement_ind     (T_MPH_MEASUREMENT_IND * mph_measurement_ind);
EXTERN void dat_mph_emo_meas_ind        (T_MPH_EMO_MEAS_IND    * mph_emo_meas_ind);
EXTERN void att_rr_activate_req         (T_RR_ACTIVATE_REQ     * rr_activate_req);
EXTERN void att_rr_deactivate_req       (T_RR_DEACTIVATE_REQ   * rr_deactivate_req);
EXTERN void att_rr_sync_req             (T_RR_SYNC_REQ         * rr_sync_req);
EXTERN void att_mph_sync_ind            (T_MPH_SYNC_IND        * mph_sync_ind);
EXTERN void att_mph_meas_order_cnf      (T_MPH_MEAS_ORDER_CNF  * mph_meas_order_cnf);
EXTERN void att_rr_sync_hplmn_req       (T_RR_SYNC_HPLMN_REQ   * rr_sync_hplmn_req);
EXTERN void att_mph_stop_dedicated_cnf  (T_MPH_STOP_DEDICATED_CNF * mph_stop_dedi_cnf);
#ifdef GPRS
EXTERN void att_mph_meas_rep_cnf        (T_MPH_MEAS_REP_CNF    * mph_meas_rep_cnf);
EXTERN void att_mph_ext_meas_cnf        (T_MPH_EXT_MEAS_CNF    * mph_ext_meas_cnf);
EXTERN void att_ext_meas_end            (BOOL                    destory_rrgrr_ext_meas_cnf);
EXTERN void att_ext_meas_next_bsic      (void);
#endif
#if defined FF_EOTD
EXTERN void att_mph_ncell_pos_ind       (T_MPH_NCELL_POS_IND   * mph_ncell_pos_ind);
#endif /* FF_EOTD */
#ifdef TI_PS_FF_QUAD_BAND_SUPPORT
EXTERN void att_mph_init_rr_ind         (T_MPH_INIT_RR_IND     * mph_init_rr_ind);
#endif


/*
 *  attachment signalling
 */
EXTERN void att_dat_dedicated           (void);
EXTERN void att_dat_con_est             (void);
EXTERN void att_for_sysinfo_type1       (USHORT               arfcn,
                                         T_D_SYS_INFO_1      *sys_info_1,
                                         T_LIST              *cell_chan_desc);



EXTERN void att_for_sysinfo_type2_2bis  (USHORT               arfcn,
                                         T_VOID_STRUCT       *sys_info_2_2bis,
                                         T_LIST              *new_2_2bis_list,
                                         UBYTE                ncell_ext,
                                         T_SI_TYPE            si_type);


EXTERN void att_for_sysinfo_type2ter    (USHORT               arfcn,
                                         T_D_SYS_INFO_2TER   *sys_info_2ter,
                                         T_LIST              *new_2ter_list);
EXTERN void att_for_sysinfo_type3       (USHORT               arfcn,
                                         T_D_SYS_INFO_3      *sys_info_3);
EXTERN void att_for_sysinfo_type4       (USHORT               arfcn,
                                         T_D_SYS_INFO_4      *sys_info_4);



EXTERN void att_for_sysinfo_type5_5bis  (USHORT               arfcn,
                                         T_LIST              *new_5_5bis_list,
                                         UBYTE                old_index,
                                         UBYTE                ncell_ext,
                                         T_SI_TYPE            si_type);



EXTERN void att_for_sysinfo_type5ter    (USHORT               arfcn,
                                         T_LIST              *new_5ter_list);
EXTERN void att_for_sysinfo_type6       (USHORT               arfcn,
                                         T_D_SYS_INFO_6      *sys_info_6);
EXTERN void att_for_sysinfo_type7_8     (USHORT               arfcn,
                                         T_D_SYS_INFO_8      *sys_info_8);
EXTERN void att_bsic_ind                (USHORT               arfcn,
                                         UBYTE                rxlev,
                                         UBYTE                bsic);
EXTERN void att_no_bsic_ind             (void);
/*
 *  attachment procedures
 */
EXTERN UBYTE att_get_index              (USHORT              arfcn);

enum forbidden_list_type_e
{
  FORBIDDEN_LIST_NORMAL,
  FORBIDDEN_LIST_ROAMING
};
EXTERN void att_add_to_forb_list        (int list_type,
                                         const T_plmn       *plmn,
                                         USHORT              lac);
EXTERN void att_analyze_measure_report  (T_MPH_MEASUREMENT_IND *report);
EXTERN void att_bcch_status_to_decoded  (UBYTE               index);
EXTERN void att_bits_to_byte            (UBYTE               *num,
                                         UBYTE               size,
                                         UBYTE               *bits);
#ifdef REL99
EXTERN void att_config_cbch             (void);
#else
EXTERN void att_build_cbch              (void);
#endif
EXTERN void att_build_classmark_req     (void);
EXTERN void att_build_idle_req          (UBYTE               index,
                                         UBYTE               mode);
EXTERN void att_calculate_c1            (UBYTE               index);

GLOBAL BOOL att_cell_barred_status_cr_no_cr (UBYTE index);

EXTERN void att_check_bcch_carrier      (void);
EXTERN void att_check_bcch_carrier_si   (void);
EXTERN void att_check_neighbourcell     (void);
EXTERN void att_check_neighbourcell_si_reestab (void);
EXTERN void att_check_fplmn_cell        (void);
EXTERN void att_check_reselect_decision (UBYTE               start_now);
EXTERN void att_check_barred_status_in_idle (void);
EXTERN UBYTE att_check_network          (T_loc_area_ident    *lai);
EXTERN void att_clear_registration_data (void);
EXTERN void att_clear_reg_without_imsi  (void);
EXTERN void att_code_mph_ncell_req      (UBYTE               index);
EXTERN void att_code_mph_ncell_req_dedicated (void);

EXTERN void att_code_rr_abort_ind_original (T_RR_DATA *rr_data, USHORT    cause);
EXTERN void att_code_net_lost           (void);
EXTERN void att_code_rr_act_cnf         (void);
EXTERN void att_code_rr_act_ind         (void);
EXTERN void att_continue_cell_reselect  (void);

EXTERN void att_copy_sys_info_1_par     (UBYTE               index,
                                         T_D_SYS_INFO_1      *sys_info_1,
                                         T_LIST              *cell_chan_desc);
EXTERN void att_copy_sys_info_2_par     (UBYTE               index,
                                         T_D_SYS_INFO_2      *sys_info_2,
                                         T_LIST              *new_2_list,
                                         UBYTE               ncell_ext,
                                         UBYTE               indicate_changes);
EXTERN void att_copy_sys_info_2bis_par  (UBYTE               index,
                                         T_D_SYS_INFO_2BIS   *sys_info_2bis,
                                         T_LIST              *new_2bis_list,
                                         UBYTE               ncell_ext,
                                         UBYTE               indicate_changes);
EXTERN void att_copy_sys_info_2ter_par  (UBYTE              index,
                                         T_D_SYS_INFO_2TER *sys_info_2ter,
                                         T_LIST            *new_2ter_list,
                                         UBYTE              indicate_changes);
EXTERN void att_copy_sys_info_3_par     (UBYTE               index,
                                         T_D_SYS_INFO_3      *sys_info_3,
                                         UBYTE               indicate_changes);
EXTERN void att_copy_sys_info_4_par     (UBYTE               index,
                                         T_D_SYS_INFO_4      *sys_info_4,
                                         UBYTE               indicate_changes);
EXTERN void att_copy_sys_info_7_8_par   (UBYTE               index,
                                         T_D_SYS_INFO_8      *sys_info_8);
EXTERN void att_copy_c2_parameter_si4   (UBYTE               index,
                                         T_si4_rest_oct     *rest_oct);


EXTERN void att_handle_rr_act_req       (UBYTE                initial_act,
                                         T_RR_ACTIVATE_REQ   *rr_activate_req);
EXTERN void att_increase_power_on_time  (USHORT              inc);
EXTERN void att_init_cell_selection     (UBYTE               selection,
                                         BOOL                initiator);
EXTERN void att_init_gsm_data           (void);
EXTERN void att_init_pl_status          (void);
EXTERN SHORT att_max                    (SHORT               a,
                                         SHORT               b);
EXTERN T_FOUND_ELEMENT *att_plmn_in_found_list (UBYTE        *mcc,
                                         UBYTE               *mnc);
EXTERN void att_save_found_plmn         (T_FOUND_ELEMENT     *element,
                                         UBYTE               mcc[],
                                         UBYTE               mnc[],
                                         USHORT              arfcn,
                                         UBYTE               rxlev,
                                         USHORT              lac,
                                         UBYTE               cell_ok);

EXTERN void att_remove_bad_ncell        (T_MPH_MEASUREMENT_IND *report);
EXTERN void att_reset_old_lai_rac();
EXTERN void att_copy_old_lai_rac (U8 index);
#if defined(_SIMULATION_FFS_)
GLOBAL UBYTE rr_csf_mcc_present         (UBYTE* mcc_value);
#endif
EXTERN void att_clean_buf               (USHORT si_to_clean);
EXTERN void att_remove_bad_rr_data_ncells(void);
EXTERN void att_rem_lai_from_forb_list  (const T_plmn        *plmn,
                                         USHORT              lac);
EXTERN void att_set_pl_in_idle_mode     (void);
EXTERN void att_set_sys_info_read       (USHORT              mess_bit,
                                         UBYTE               index);
EXTERN void att_start_cell_reselection  (UBYTE               mode);
EXTERN void att_start_cr_in_pl          (UBYTE               index);
EXTERN void att_start_cell_selection    (BOOL    originator, BOOL parallel, U8 search_mode);


EXTERN void att_remove_multiple_channels(void);
EXTERN void att_mph_identity_req        (void);
EXTERN void att_start_registration_timer(void);
EXTERN void att_set_func                (UBYTE               func);


EXTERN void att_copy_cr_data            (void);
EXTERN void att_init_cr_data            (void);




EXTERN void att_check_reestablishment   (void);
EXTERN UBYTE att_get_power              (void);
EXTERN void att_return_to_idle          (void);
EXTERN void att_notify_stop_plmn_search (UBYTE deactivate_pl);
EXTERN void att_leave_dat_imm_ass       (void);
EXTERN void att_leave_dedicated         (void);
EXTERN void att_stop_dedicated          (void);
EXTERN void att_copy_eplmn_list (T_eq_plmn_list *eq_plmn_list);
EXTERN void att_store_plmn_in_found_list (T_loc_area_ident *lai);
#if defined (REL99) && defined (TI_PS_FF_EMR)
EXTERN void attf_send_enh_para_to_alr   (UBYTE rep_type,T_enh_para_struct *p_src);
#ifdef GPRS
EXTERN void att_send_enh_para_to_grr(T_rr_enh_para *p_src);
#endif
#endif

#if !defined(NTRACE)
/* Implements Measure#32: Row 52, 53, 124 & 125 */
EXTERN void att_print_mcc_mnc           (USHORT               arfcn,
                                         UBYTE               *mcc,
                                         UBYTE               *mnc,
                                         T_S2I_STRING        titel); /* a valid string is expected */
#else
#define att_print_mcc_mnc(arfcn,mcc,mnc,titel)
#endif  /* !NTRACE */
EXTERN void att_check_dynamic_search_mode_config(void);
EXTERN void att_full_service_found(void);
EXTERN void att_set_rr_service_info(void);
EXTERN void att_set_tim_advance_info (void);
#ifdef TI_PS_FF_QUAD_BAND_SUPPORT
EXTERN void att_update_std_band_indicator (UBYTE band_indicator);
#endif


/*
 *  Data-Transfer
 */

/*
 *  data-transfer primitives
 */
EXTERN       void dat_init_rr_data            (void);
EXTERN       void dat_dl_establish_cnf        (T_DL_ESTABLISH_CNF  *dl_establish_cnf);
EXTERN       void dat_dl_establish_ind        (T_DL_ESTABLISH_IND  *dl_establish_ind);
EXTERN       void dat_mph_random_access_cnf   (T_MPH_RANDOM_ACCESS_CNF *mph_random_access_cnf);
EXTERN       void dat_dl_release_cnf          (T_DL_RELEASE_CNF    *dl_release_cnf);
EXTERN       void dat_dl_release_ind          (T_DL_RELEASE_IND    *dl_release_ind);
EXTERN       void dat_mph_dedicated_cnf       (T_MPH_DEDICATED_CNF *mph_dedicated_cnf);
EXTERN       void dat_mph_dedicated_fail_cnf  (T_MPH_DEDICATED_FAIL_CNF *mph_dedicated_fail_cnf);
EXTERN       void dat_rr_abort_req            (T_RR_ABORT_REQ      *rr_abort_req);
EXTERN       void dat_rr_data_req             (T_RR_DATA_REQ       *rr_data_req);
EXTERN       void dat_rr_establish_req        (T_RR_ESTABLISH_REQ  *rr_establish_req);
EXTERN       void dat_mph_paging_ind          (T_MPH_PAGING_IND    *mph_paging_ind);
EXTERN       void dat_begin_start_immediate_assign (UBYTE id_type, UBYTE chan_need);
#if defined FF_EOTD
EXTERN       void dat_rrlc_meas_req           (T_RRLC_MEAS_REQ     *rrlc_meas_req);
EXTERN       void dat_rrrrlp_data_req         (T_RRRRLP_DATA_REQ   *rrrrlp_data_req);
#endif /* FF_EOTD */
#if defined (REL99) && defined (TI_PS_FF_EMR)
EXTERN void dat_update_emr_rep_para           (T_emp *p_em, T_enh_para_struct *p_enh);
#endif

/*
 *  data-transfer signalling
 */
EXTERN void dat_att_cell_selected       (void);
EXTERN void dat_att_null                (void);
EXTERN void dat_for_assign_cmd          (T_DL_DATA_IND       *dl_data_ind,
                                         T_D_ASSIGN_CMD      *assign_cmd,
                                         T_LIST              *hop_list_after,
                                         T_LIST              *hop_list_before,
                                         T_LIST              *cell_chan_desc);
EXTERN void dat_for_chan_mod            (T_DL_DATA_IND       *dl_data_ind,
                                         T_D_CHAN_MOD        *chan_mod);
EXTERN void dat_for_chan_rel            (T_DL_DATA_IND       *dl_data_ind,
                                         T_D_CHAN_REL        *chan_rel);
#ifdef REL99
EXTERN void dat_for_class_enq           (T_DL_DATA_IND       *dl_data_ind,
                                         T_D_CLASS_ENQ       *class_enq);
#else
EXTERN void dat_for_class_enq           (T_DL_DATA_IND       *dl_data_ind);
#endif
EXTERN void dat_for_close_loop_cmd      (T_DL_DATA_IND       *dl_data_ind,
                                         UBYTE                subchannel);
EXTERN void dat_for_ciph_cmd            (T_DL_DATA_IND       *dl_data_ind,
                                         T_D_CIPH_CMD        *ciph_cmd);
EXTERN void dat_for_freq_redef          (T_DL_DATA_IND       *dl_data_ind,
                                         T_D_FREQ_REDEF      *freq_redef,
                                         T_LIST              *cell_chan_desc);
EXTERN void dat_for_handov_cmd          (T_DL_DATA_IND       *dl_data_ind,
                                         T_D_HANDOV_CMD      *handov_cmd,
                                         T_LIST              *cell_chan_desc,
                                         T_LIST              *hop_list_after,
                                         T_LIST              *hop_list_before);
EXTERN void dat_for_l3_data_ind         (T_DL_DATA_IND       *dl_data_ind);
EXTERN void dat_for_open_loop_cmd       (T_DL_DATA_IND       *dl_data_ind);
EXTERN void dat_for_test_interface      (T_DL_DATA_IND       *dl_data_ind,
                                         UBYTE                device);
EXTERN void dat_for_imm_assign          (T_MPH_UNITDATA_IND  *mph_unitdata_ind,
                                         T_D_IMM_ASSIGN      *imm_assign);
EXTERN void dat_for_imm_assign_ext      (T_MPH_UNITDATA_IND  *mph_unitdata_ind,
                                         T_D_IMM_ASSIGN_EXT  *imm_assign_ext);
EXTERN void dat_for_imm_assign_rej      (T_D_IMM_ASSIGN_REJ  *imm_assign_rej);

EXTERN void dat_for_ext_meas_order      (T_D_EXT_MEAS_ORDER  *ext_meas_order);
#if defined FF_EOTD
EXTERN void rr_applic_rx_init           (T_APPLIC_RX         *applic_rx);
EXTERN void dat_for_applic_info         (T_B_APPLIC_INFO     *b_applic_info);
#endif /* FF_EOTD */
GLOBAL void dat_class_chng_data_req (void);
GLOBAL BOOL dat_hplmn (const UBYTE *mcc, const UBYTE *mnc);
#if defined (REL99) && defined (TI_PS_FF_EMR)
EXTERN BOOL dat_for_meas_inf            (T_D_MEAS_INF        *p_mi);
#endif

/*
 *  data-transfer procedures
 */
EXTERN BOOL dat_access_allowed          (USHORT              estcs);
EXTERN UBYTE dat_calc_downlink_timeout  (UBYTE               index);
EXTERN UBYTE dat_calc_paging_group      (UBYTE               index);
EXTERN UBYTE dat_calc_tn                (UBYTE               index);
EXTERN BOOL dat_check_error_flag        (BOOL                send_rr_status);
EXTERN void dat_code_channel_mode_to_mm (void);
EXTERN void dat_code_reestablishment_fail (void);
EXTERN void dat_code_ciphering_to_mm    (UBYTE               ciph_on);
EXTERN void dat_code_measure_report     (T_MPH_MEASUREMENT_IND *report);
EXTERN void dat_code_ext_meas_report    (T_MPH_EMO_MEAS_IND  *mph_emo_meas_ind);
EXTERN void dat_emo_stop                (BOOL send_ncell_req);


EXTERN void dat_code_mph_chan_mode_req  (T_D_CHAN_MOD        *chan_mod);
EXTERN void dat_code_mph_ciphering_req  (UBYTE               ciph_on,
                                         UBYTE               algo,
                                         UBYTE               *kc);
EXTERN void dat_code_mph_imm_assign_req (T_start             *start,
                                         UBYTE               power,
                                         UBYTE               maio,
                                         T_LIST              *hop_list_after,
                                         T_LIST              *hop_list_bef);
EXTERN void dat_code_sys_info_change    (UBYTE               dtx,
                                         UBYTE               pwrc,
                                         UBYTE               rlt);
EXTERN void dat_code_mph_freq_redef_req (T_start             *start,
                                         T_LIST              *hop_list);
EXTERN void dat_code_mph_old_chan_req   (void);
EXTERN void dat_code_prr_channel        (UBYTE               *ch_type,
                                         UBYTE               *sapi,
                                         UBYTE               chan_type);
EXTERN void dat_code_prr_channel_sms    (T_DL_DATA_REQ       *dl_data_req,
                                         UBYTE               chan_type);
EXTERN void dat_code_prr_bcch_info      (UBYTE                v_ba_range,
                                         T_ba_range          *ba_range);
EXTERN BOOL dat_compare_request_ref     (T_req_ref           *req_ref,
                                         UBYTE               *index);
EXTERN void dat_disconnect_link         (USHORT              cause);
EXTERN BOOL dat_forb_lai_check          (UBYTE               index);
EXTERN BOOL dat_roam_forb_lai_check     (UBYTE               index);

EXTERN BOOL dat_plmn_equal_req          (const UBYTE         *bcch_mcc,
                                         const UBYTE         *bcch_mnc,
                                         const UBYTE         *sim_mcc,
                                         const UBYTE         *sim_mnc);

EXTERN USHORT dat_random                (USHORT              n);
EXTERN void dat_release_connection      (void);
EXTERN void dat_set_last_used_channel   (T_chan_desc         *chan_desc);
EXTERN void dat_start_immediate_assign  (USHORT              cause);
EXTERN void dat_start_sabm              (void);
EXTERN BOOL dat_test_sim_available      (void);
EXTERN BOOL dat_check_sim_available     (void);
EXTERN void dat_vsd_bit_set             (T_L3_SDU            *m_buf,
                                         UBYTE               action);
EXTERN void dat_send_bcchinfo_mm        (U8 *p);
EXTERN void dat_convert_white_list      (void);
EXTERN void dat_store_neigh_cell_desc   (U8 si, U8 index, BUF_neigh_cell_desc *cd,
                                          T_LIST *new_neigh_list);

EXTERN void dat_begin_start_immediate_assign (UBYTE id_type, UBYTE chan_need);
EXTERN void dat_rr_release_ind               (USHORT relcs, UBYTE sapi);
EXTERN void dat_send_release_ind             (USHORT relcs);
EXTERN void dat_send_assign_fail_msg         (UBYTE cause);
EXTERN void dat_send_rr_status_msg           (UBYTE cause);
EXTERN void dat_send_handov_fail_msg         (UBYTE cause);
#if defined (REL99) && defined (TI_PS_FF_EMR)
EXTERN void dat_code_enh_measure_report      (T_MPH_MEASUREMENT_IND *report);
#endif

#if defined (TI_PS_FF_RTD) AND defined (REL99)
EXTERN void dat_update_rtd_data              (T_D_MEAS_INF *p_mi,T_rr_enh_para *p_temp);
EXTERN void dat_update_common_rtd_struct              (T_rtdd *rtdd_struct,T_rr_enh_para *p_temp);
#endif /* #if defined (TI_PS_FF_RTD) AND defined (REL99) */
/*
 *  Formatter
 */

/*
 *  formatter primitives
 */
EXTERN       void for_mph_unitdata_ind        (T_MPH_UNITDATA_IND  *mph_unitdata_ind);
EXTERN       void for_dl_data_ind             (T_DL_DATA_IND       *dl_data_ind);
#if defined (REL99) && defined (TI_PS_FF_EMR)
EXTERN       void for_dl_short_unitdata_ind   (T_DL_SHORT_UNITDATA_IND *dl_short_unitdata_ind);
#endif
EXTERN       void for_rr_trace_message        (UBYTE         *payload,
                                               USHORT        length,
                                               USHORT        arfcn,
                                               ULONG         fn,
                                               UBYTE         direction);
/*
 *  formatter signalling
 */
EXTERN void for_dat_data_req            (T_DL_DATA_REQ       *data_req);
EXTERN void for_dat_est_req             (T_DL_ESTABLISH_REQ  *est_req);
EXTERN void for_dat_est_req_not_coding  (T_DL_ESTABLISH_REQ  *est_req);
EXTERN void for_dat_est_req_content     (T_DL_ESTABLISH_REQ  *est_req_content);
EXTERN void for_dat_l3_data_req         (T_DL_DATA_REQ       *dl_data_req);
EXTERN void for_dat_reconnect_req       (T_DL_RECONNECT_REQ  *reconnect_req);
EXTERN void for_dat_resume_req          (T_DL_RESUME_REQ     *resume_req);
EXTERN void for_dat_unitdata_req        (T_DL_UNITDATA_REQ   *unitdata_req);
#if defined (REL99) && defined (TI_PS_FF_EMR)
EXTERN void for_update_ba_ind                 (UBYTE index, UBYTE ba_ind);
EXTERN void for_check_and_configure_si2quater (UBYTE index);
EXTERN void for_att_update_ba2bsic_mapping    (T_rr_enh_para *p_enh);
EXTERN BOOL for_dat_process_common_emr_data (T_gprs_rep_prio *p_rep,
                                             T_gprs_bsic *p_bl,                                             
                                             UBYTE  msg_index,
                                             BOOL ba_available);
EXTERN void for_dat_spd_unitdata_req    (T_DL_SHORT_UNITDATA_REQ *p_msg);
#endif

/*
 *  formatter procedures
 */
EXTERN void for_check_assign_cmd        (T_DL_DATA_IND       *dl_data_ind,
                                         T_D_ASSIGN_CMD      *ass_cmd);
EXTERN BOOL for_check_ba_range          (T_ba_range          *ba_range);
EXTERN void for_check_cell_descr        (T_cell_desc         *cell_desc);
EXTERN void for_check_channel_descr     (T_chan_desc         *chan_desc);
EXTERN void for_check_channel_mode      (UBYTE               ch_mod);
EXTERN void for_check_multirate_conf    (T_multirate_conf    * multirate_conf, UBYTE chan_type);
EXTERN void for_check_cipher_mode_set   (T_ciph_mode_set     *ciph);
EXTERN void for_check_handov_cmd        (T_DL_DATA_IND       *dl_data_ind,
                                         T_D_HANDOV_CMD      *handov_cmd);
EXTERN void for_create_channel_list     (T_f_range           *f_range,
                                         T_LIST              *cha_list);

EXTERN void   for_suspend_layer_2       (void);
#if defined (REL99) && defined (TI_PS_FF_EMR)
EXTERN BOOL for_process_si2quater(T_si_2qua_octets *p_si2q);
EXTERN void for_update_emr_rep_para(T_si_2qua_octets *p_si2q,T_rr_enh_para *p_em);
EXTERN void for_set_default_emr_data(T_rr_enh_para  *p_em);
EXTERN void for_send_enh_para(T_rr_enh_para *p_src);
EXTERN BOOL for_update_enh_cell_list (USHORT *p_list);
EXTERN BOOL for_process_common_emr_data (T_gprs_rep_prio *p_rep,
                                             T_gprs_bsic *p_bsic,
                                             UBYTE  msg_index,
                                             BOOL ba_available);
EXTERN void for_mon_si2quater_req(UBYTE action);
#endif

#if defined (TI_PS_FF_RTD) AND defined (REL99)
EXTERN void for_store_rtd_data (T_si_2qua_octets *p_si2q,T_rr_enh_para *p_temp);
#endif /* #if defined (TI_PS_FF_RTD) AND defined (REL99) */


/*
 * If all entities are linked into one module this definitions
 * prefixes all this functions with the enity name
 */
#ifdef OPTION_MULTITHREAD
  #define for_set_content_error      _ENTITY_PREFIXED(for_set_content_error)
#endif

EXTERN UBYTE for_check_frequency (USHORT channel);
EXTERN void for_set_content_error       (UBYTE               value);

EXTERN void rr_csf_read_imei            (T_mob_ident         *imei);

/*----------------------------------------------------------------------
 * functions called from other entities
 *---------------------------------------------------------------------*/
/*lint -esym(759,rr_csf_get_radio_access_capability)*/
/*lint -esym(759,rr_csf_get_classmark1)*/
/*lint -esym(759,rr_csf_get_classmark2)*/
/*lint -esym(759,rr_csf_get_rf_capability)*/
#ifdef GPRS
EXTERN UBYTE rr_csf_get_radio_access_capability
                                        (T_ra_cap            *ra_cap);
#endif
EXTERN UBYTE rr_csf_get_classmark1      (T_mob_class_1       *mob_class_1);
EXTERN UBYTE rr_csf_get_classmark2      (T_mob_class_2       *mob_class_2);
EXTERN T_rf_cap* rr_csf_get_rf_capability (void);


EXTERN UBYTE rr_csf_fit_capability      (void);
EXTERN void rr_csf_ms_cap               (void);
EXTERN void rr_csf_read_rfcap           (void);
EXTERN void rr_csf_check_rfcap           (UBYTE init);
EXTERN void rr_csf_get_freq_bands       (UBYTE               *pfreq_bands);
GLOBAL void rr_csf_trace_power          (void);

#ifdef REL99
/*
 * Function added to get MSCR flag informaion that used in send sequence number
 */
EXTERN void get_msc_release_version(UBYTE* mscr);
#endif

#if defined(_SIMULATION_FFS_)
GLOBAL void rr_csf_ffs_init                (void);
GLOBAL void cs_store_white_list            (void);
GLOBAL void rr_csf_write_black_list        (T_LIST *black_list);
GLOBAL void rr_csf_read_black_list         (void);
GLOBAL void rr_csf_write_white_list        (T_CS_WHITE_LIST *white_list);
GLOBAL void rr_csf_read_white_list         (void);
GLOBAL void rr_csf_write_rxlev_thr         (UBYTE rxt, SHORT valno, char* val[MAX_NUM_BANDS]);
GLOBAL void rr_csf_read_rxlev_thr          (void);
GLOBAL void rr_csf_write_mcc_shield_to_ffs (void);
#endif /* _SIMULATION_FFS_ */

/*
 *  timer
 */
#define TIMERSTART(i,v)                 tim_start_timer (i, v)
#define TIMERSTOP(i)                    tim_stop_timer (i)
#if defined(TIMER_TRACE)
#define IS_TIMER_ACTIVE(i)              tim_check_timer(i)
#else  /* TIMER_TRACE */
#define IS_TIMER_ACTIVE(i)              (rr_data->t_running[i])
#endif  /* TIMER_TRACE */
/*
 * RR services
 */
/*
 * If all entities are linked into one module this definitions
 * prefixes all this functions with the enity name
 */
#ifdef OPTION_MULTITHREAD 
  #define srv_store_prim         _ENTITY_PREFIXED(srv_store_prim)
  #define srv_use_stored_prim    _ENTITY_PREFIXED(srv_use_stored_prim)
  #define srv_clear_stored_prim  _ENTITY_PREFIXED(srv_clear_stored_prim)
  #define srv_check_stored_prim  _ENTITY_PREFIXED(srv_check_stored_prim)
/* obsolete
  #define srv_find_stored_prim   _ENTITY_PREFIXED(srv_find_stored_prim)
  #define srv_flush_stored_prim  _ENTITY_PREFIXED(srv_flush_stored_prim)
*/
#endif
EXTERN BOOL   srv_store_prim            (T_PRIM              *prim);
EXTERN void   srv_use_stored_prim       (void);
EXTERN void   srv_clear_stored_prim     (ULONG opc);
EXTERN UBYTE  srv_check_stored_prim     (ULONG opc);
/* obsolete
EXTERN UBYTE  srv_find_stored_prim      (ULONG opc);
*/

#if defined (REL99) && defined (TI_PS_FF_EMR)
#define DEFAULT_SERV_BAND_REP 3 /*Number of cells to be reported in EMR for serving band*/
#endif

EXTERN void   srv_remove_frequencies_in_array (USHORT* arfcn_list);
EXTERN UBYTE  srv_remove_frequencies_in_array_gen (USHORT* arfcn_list, UBYTE c_arfcn_list);

EXTERN int    srv_create_chan_mob_alloc      (T_LIST              *clist,
                                              T_LIST              *list,
                                              UBYTE               *mobile_alloc);
EXTERN int    srv_check_frequencies_in_list  (T_LIST             *clist);
EXTERN void   srv_trace_black_list           (void);
EXTERN void   srv_trace_white_list           (void);

/* Access function in RR to get cell alloc list. Called from GRR*/
/*lint -esym(759,srv_get_cell_alloc_list)*/
/*lint -esym(759,srv_get_cell_alloc_list)*/
EXTERN void   srv_get_cell_alloc_list     (T_LIST              *target_list);

EXTERN void   rr_pei_primitive            (T_PRIM              *prim);
/*
 * RX
 *
 */

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

/*
 *  Radio resource primitives Engineering Mode
 *  Bitmask for the event tracing
 */
EXTERN  T_RR_DATA              rr_data_base;
#define GET_INSTANCE_DATA    register T_RR_DATA *rr_data= &rr_data_base

#define ENTITY_DATA                rr_data

/*
*  These Functions are only temporary valid and should replaced as soon as possible
*/
/*lint -esym(759,get_network_meas)*/
/*lint -esym(759,get_bcch_chan_list)*/
EXTERN UBYTE get_network_meas   (UBYTE * chan_list);
EXTERN UBYTE get_bcch_chan_list (stk_data_type * out_stk_data);

#if !defined (_SIMULATION_)
EXTERN UBYTE * dl_get_sacch_buffer (void);
#endif


/*
 * If all entities are linked into one module this definitions
 * prefixes the global data with the enity name
 */
#ifdef TI_PS_HCOMM_CHANGE
EXTERN T_HANDLE  rr_handle;
#else /* for hCommHandles backward compatibility */
#ifdef OPTION_MULTITHREAD
  #define hCommMM        _ENTITY_PREFIXED(hCommMM)
#if defined FF_EOTD
  #define hCommLC        _ENTITY_PREFIXED(hCommLC)
  #define hCommRRLP      _ENTITY_PREFIXED(hCommRRLP)
#endif /* FF_EOTD */
  #define hCommDL        _ENTITY_PREFIXED(hCommDL)
  #define hCommPL        _ENTITY_PREFIXED(hCommPL)
  #define hCommMMI       _ENTITY_PREFIXED(hCommMMI)
#ifdef FF_WAP
  #define hCommWAP       _ENTITY_PREFIXED(hCommWAP) /*FMM */
#endif
#endif

EXTERN T_HANDLE  hCommMM;                /* MM  Communication        */
#if defined FF_EOTD
EXTERN T_HANDLE  hCommLC;                /* LC  Communication        */
EXTERN T_HANDLE  hCommRRLP;              /* RRLP Communication       */
#endif /* FF_EOTD */
EXTERN T_HANDLE  hCommDL;                /* DL  Communication        */
EXTERN T_HANDLE  hCommPL;                /* PL  Communication        */
EXTERN T_HANDLE  rr_handle;
EXTERN T_HANDLE  hCommMMI;               /* EM  Communication       */
#ifdef FF_WAP
  EXTERN T_HANDLE  hCommWAP;               /* FMM  Communication       */
#endif
#endif /* TI_PS_HCOMM_CHANGE */

/*
 * If all entities are linked into one module this definitions
 * prefixes the global data with the enity name
 */
#ifdef OPTION_MULTITHREAD
  #define _decodedMsg   _ENTITY_PREFIXED(_decodedMsg)
#endif

#if defined (REL99) && defined (TI_PS_FF_EMR)
#define MAX_MSTRUCT_CCD_RR MAXIMUM(MAX_MSTRUCT_LEN_RR_SHORT, MAX_MSTRUCT_LEN_RR)
EXTERN UBYTE          _decodedMsg [MAX_MSTRUCT_CCD_RR];
#else
EXTERN UBYTE          _decodedMsg [MAX_MSTRUCT_LEN_RR];
#endif

#ifdef OPTION_TIMER
  /*
   * If all entities are linked into one module this definitions
   * prefixes the global data with the entity name
   */
  #ifdef OPTION_MULTITHREAD
    #define partab    _ENTITY_PREFIXED(partab)
  #endif

/*  EXTERN const KW_DATA partab[];*/
#endif

/*
 * backward compatibility for some channel modes
 */
#if !defined CM_DATA_14_4
#define CM_DATA_14_4 0x0F
#define CM_EFR       0x21
#endif

/*
*  Definitions for AMR
*/
#define CM_AMR             0x41
#define MAX_NO_ACS         0x04
/*#define MAX_CODEC_MODES    0x03*/

#if !defined(_FILE10_)
#define __FILE10__    (__FILE__+sizeof(__FILE__)-11)
#endif  /* !_FILE10_ */

#if defined(SYST_TRACE)
#undef  SYST_TRACE
#undef  SYST
#undef  SYST_TRACE_P
#endif  /* !SYST_TRACE */
#if defined(NEW_FRAME)
#define SYST_TRACE(a) vsi_o_ttrace((T_HANDLE)0, (ULONG)-1,a)
#define SYST           (T_HANDLE)0, (ULONG)-1
#define SYST_TRACE_P(a) vsi_o_ttrace a
#else
#define SYST_TRACE(a) vsi_o_trace("", 0xFFFF,a)
#define SYST           "", 0xffff
#define SYST_TRACE_P(a) vsi_o_trace a
#endif  /* NEW_FRAME */
/*
 * use it as showed next line...
 * SYST_TRACE_P((SYST, "e.g. two parameter: %d %d", p1, p2));
 */

#if defined(DL_TRACE_ENABLED)
  EXTERN void dl_trace                   (UCHAR                    trace_type,
                                          UCHAR                    channel,
                                          UCHAR                    ch_type,
                                          UCHAR                  * data);
  #ifdef OPTION_MULTITHREAD
    #define dl_trace_buf    _ENTITY_PREFIXED(dl_trace_buf)
  #endif
  #if defined(RR_PEI_C)
    GLOBAL char dl_trace_buf[100];
  #else  /* RR_PEI_C */
    EXTERN char dl_trace_buf[100];
  #endif  /* RR_PEI_C */
    #define TRACE_RR_EVENT   5
    #define DOES_NOT_MATTER  0
    #define DL_OFFLINE_TRACE(s) \
      dl_trace (TRACE_RR_EVENT, DOES_NOT_MATTER, DOES_NOT_MATTER, (UCHAR*)s)
#endif  /* DL_TRACE_ENABLED */

#if defined(ARRAY_TRACE)
  #ifdef OPTION_MULTITHREAD
    #define array_trace    _ENTITY_PREFIXED(array_trace)
  #endif
EXTERN void  array_trace (UBYTE*array, int size, char *titel);
#define TRACE_ARRAY(array, size, titel) array_trace(array, size, titel)
#else  /* ARRAY_TRACE */
#define TRACE_ARRAY(array, size, titel)
#endif  /* ARRAY_TRACE */

#if defined(_SIMULATION_)
#define TRACE_EVENT_WIN(s)                                TRACE_EVENT(s)
#define TRACE_EVENT_WIN_P1(s,a1)                          TRACE_EVENT_P1(s,a1)
#define TRACE_EVENT_WIN_P2(s,a1,a2)                       TRACE_EVENT_P2(s,a1,a2)
#define TRACE_EVENT_WIN_P3(s,a1,a2,a3)                    TRACE_EVENT_P3(s,a1,a2,a3)
#define TRACE_EVENT_WIN_P4(s,a1,a2,a3,a4)                 TRACE_EVENT_P4(s,a1,a2,a3,a4)
#define TRACE_EVENT_WIN_P5(s,a1,a2,a3,a4,a5)              TRACE_EVENT_P5(s,a1,a2,a3,a4,a5)
#define TRACE_EVENT_WIN_P6(s,a1,a2,a3,a4,a5,a6)           TRACE_EVENT_P6(s,a1,a2,a3,a4,a5,a6)
#define TRACE_EVENT_WIN_P7(s,a1,a2,a3,a4,a5,a6,a7)        TRACE_EVENT_P7(s,a1,a2,a3,a4,a5,a6,a7)
/*#define TRACE_EVENT_WIN_P8(s,a1,a2,a3,a4,a5,a6,a7,a8)     TRACE_EVENT_P8(s,a1,a2,a3,a4,a5,a6,a7,a8)
  #define TRACE_EVENT_WIN_P9(s,a1,a2,a3,a4,a5,a6,a7,a8,a9)  TRACE_EVENT_P9(s,a1,a2,a3,a4,a5,a6,a7,a8,a9)*/

/* trace for call of att_code_rr_abort_ind() */
/* Implements Measure#32: Row 18, 43, 90, 101, 111, 201, 211, and 324
 *                        Row 17, 41, 89, 100, 110, 200, 210, and 321 */
#define att_code_rr_abort_ind_trace(c) \
{ TRACE_EVENT_WIN_P2 ("att_code_rr_abort_ind(%x=%s)", c, S2I_STRING(#c));\
  att_code_rr_abort_ind_original(rr_data, c);}


#else  /* _SIMULATION_ */
#define TRACE_EVENT_WIN(s)
#define TRACE_EVENT_WIN_P1(s,a1)
#define TRACE_EVENT_WIN_P2(s,a1,a2)
#define TRACE_EVENT_WIN_P3(s,a1,a2,a3)
#define TRACE_EVENT_WIN_P4(s,a1,a2,a3,a4)
#define TRACE_EVENT_WIN_P5(s,a1,a2,a3,a4,a5)
#define TRACE_EVENT_WIN_P6(s,a1,a2,a3,a4,a5,a6)
#define TRACE_EVENT_WIN_P7(s,a1,a2,a3,a4,a5,a6,a7)
#define TRACE_EVENT_WIN_P8(s,a1,a2,a3,a4,a5,a6,a7,a8)
#define TRACE_EVENT_WIN_P9(s,a1,a2,a3,a4,a5,a6,a7,a8,a9)

#define att_code_rr_abort_ind_trace(c) \
{ TRACE_EVENT_P4 ("att_code_rr_abort_ind(%x=%s) #%u %s", c, #c, __LINE__, __FILE10__);\
  att_code_rr_abort_ind_original(rr_data, c);}


#endif  /* _SIMULATION_ */

#define att_code_rr_abort_ind att_code_rr_abort_ind_trace

/*
 * Tracing of Layer 3 RR Messages.
 */

#define RR_BINDUMP(payload,length,arfcn,fn,dir) for_rr_trace_message(payload,length,arfcn,fn,dir)

#endif