diff src/g23m-gprs/gmm/gmm.h @ 1:d393cd9bb723

src/g23m-*: initial import from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 15 Jul 2018 04:40:46 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/g23m-gprs/gmm/gmm.h	Sun Jul 15 04:40:46 2018 +0000
@@ -0,0 +1,1269 @@
+/* 
++----------------------------------------------------------------------------- 
+|  Project :  GPRS (8441)
+|  Modul   :  gmm.h
++----------------------------------------------------------------------------- 
+|  Copyright 2002 Texas Instruments Berlin, AG 
+|                 All rights reserved. 
+| 
+|                 This file is confidential and a trade secret of Texas 
+|                 Instruments Berlin, AG 
+|                 The receipt of or possession of this file does not convey 
+|                 any rights to reproduce or disclose its contents or to 
+|                 manufacture, use, or sell anything it may describe, in 
+|                 whole, or in part, without the specific written consent of 
+|                 Texas Instruments Berlin, AG. 
++----------------------------------------------------------------------------- 
+|  Purpose :  Definitions for the Protocol Stack Entity
+|             GPRS Mobility Management (GPRS)
++----------------------------------------------------------------------------- 
+*/ 
+
+
+#ifndef GMM_H
+#define GMM_H
+
+#define ENTITY_GMM
+
+#include "message.h"
+/*==== DIAGNOSTICS ==========================================================*/
+/* 
+ * GMM_TCS4 is defined to use MMPM SAP document from TI DK
+ */
+#ifndef GMM_TCS4
+#define GMM_TCS4
+#endif
+
+
+#ifdef TRACE_FUNC
+#ifdef IDENTATION
+  #define GMM_TRACE_FUNCTION(a)        \
+    char trace_string[]=a;\
+    vsi_o_ttrace(VSI_CALLER TC_FUNC,"%*s%s() {",gmm_data->deep,"",trace_string);\
+    gmm_data->deep+=4;
+  #define GMM_RETURN  vsi_o_ttrace(VSI_CALLER TC_FUNC,"%*s} /* %s */",gmm_data->deep-=4,"",trace_string);return;
+  #define GMM_RETURN_(a) \
+    vsi_o_ttrace(VSI_CALLER TC_FUNC,"%*s} /* %s() */",gmm_data->deep-=4,"",\
+      trace_string);\
+    return a;
+#else
+  #define GMM_TRACE_FUNCTION(a) vsi_o_ttrace(VSI_CALLER TC_FUNC,a)
+  #define GMM_RETURN  return
+  #define GMM_RETURN_(a)  return (a)
+
+#endif
+
+#else
+  #define GMM_TRACE_FUNCTION(a)
+  #define GMM_RETURN  return
+  #define GMM_RETURN_(a)  return (a)
+#endif 
+
+#ifdef TRACE_ERR
+#define GMM_TRACE_0_ERROR(s)    vsi_o_error_ttrace(s)
+#define GMM_TRACE_1_ERROR(s,p1) vsi_o_error_ttrace(s,p1)
+#else
+#define GMM_TRACE_1_ERROR(s,p1)
+#endif
+
+#ifdef TRACE_EVE
+  #define TRACE_0_DATA(s)             vsi_o_ttrace(VSI_CALLER TC_USER1, "Data: " s)
+  #define TRACE_1_DATA(s,p1)          vsi_o_ttrace(VSI_CALLER TC_USER1, "Data: " s,p1)
+  #define TRACE_2_DATA(s,p1,p2)       vsi_o_ttrace(VSI_CALLER TC_USER1, "Data: " s,p1,p2)
+  #define TRACE_3_DATA(s,p1,p2,p3)    vsi_o_ttrace(VSI_CALLER TC_USER1, "Data: " s,p1,p2,p3)
+  #define TRACE_4_DATA(s,p1,p2,p3,p4) vsi_o_ttrace(VSI_CALLER TC_USER1, "Data: " s,p1,p2,p3,p4)
+  #define TRACE_5_DATA(s,p1,p2,p3,p4,p5)      vsi_o_ttrace(VSI_CALLER TC_USER1, "Data: " s,p1,p2,p3,p4,p5)
+  #define TRACE_6_DATA(s,p1,p2,p3,p4,p5,p6)   vsi_o_ttrace(VSI_CALLER TC_USER1, "Data: " s,p1,p2,p3,p4,p5,p6)
+  #define TRACE_7_DATA(s,p1,p2,p3,p4,p5,p6,p7)    vsi_o_ttrace(VSI_CALLER TC_USER1, "Data: " s,p1,p2,p3,p4,p5,p6,p7)
+  #define TRACE_8_DATA(s,p1,p2,p3,p4,p5,p6,p7,p8) vsi_o_ttrace(VSI_CALLER TC_USER1, "Data: " s,p1,p2,p3,p4,p5,p6,p7,p8)
+  #define TRACE_9_DATA(s,p1,p2,p3,p4,p5,p6,p7,p8,p9) vsi_o_ttrace(VSI_CALLER TC_USER1, "Data: " s,p1,p2,p3,p4,p5,p6,p7,p8,p9)
+#else
+  #define TRACE_0_DATA(s)             
+  #define TRACE_1_DATA(s,p1)          
+  #define TRACE_2_DATA(s,p1,p2)       
+  #define TRACE_3_DATA(s,p1,p2,p3)    
+  #define TRACE_4_DATA(s,p1,p2,p3,p4) 
+  #define TRACE_5_DATA(s,p1,p2,p3,p4,p5) 
+  #define TRACE_6_DATA(s,p1,p2,p3,p4,p5,p6) 
+  #define TRACE_7_DATA(s,p1,p2,p3,p4,p5,p6,p7) 
+  #define TRACE_8_DATA(s,p1,p2,p3,p4,p5,p6,p7,p8) 
+  #define TRACE_9_DATA(s,p1,p2,p3,p4,p5,p6,p7,p8,p9) 
+#endif
+
+
+#ifdef TRACE_EVE
+  #define TRACE_0_INFO(s)             vsi_o_ttrace(VSI_CALLER TC_EVENT, "Info: " s)
+  #define TRACE_1_INFO(s,p1)          vsi_o_ttrace(VSI_CALLER TC_EVENT, "Info: " s,p1)
+  #define TRACE_2_INFO(s,p1,p2)       vsi_o_ttrace(VSI_CALLER TC_EVENT, "Info: " s,p1,p2)
+  #define TRACE_3_INFO(s,p1,p2,p3)    vsi_o_ttrace(VSI_CALLER TC_EVENT, "Info: " s,p1,p2,p3)
+  #define TRACE_4_INFO(s,p1,p2,p3,p4) vsi_o_ttrace(VSI_CALLER TC_EVENT, "Info: " s,p1,p2,p3,p4)
+#else
+  #define TRACE_0_INFO(s)             
+  #define TRACE_1_INFO(s,p1)          
+  #define TRACE_2_INFO(s,p1,p2)       
+  #define TRACE_3_INFO(s,p1,p2,p3)    
+  #define TRACE_4_INFO(s,p1,p2,p3,p4) 
+#endif
+
+#ifdef TRACE_PRIM
+  #define TRACE_0_PARA(s)             vsi_o_ttrace(VSI_CALLER TC_PRIM, "Para: " s)
+  #define TRACE_1_PARA(s,p1)          vsi_o_ttrace(VSI_CALLER TC_PRIM, "Para: " s,p1)
+  #define TRACE_2_PARA(s,p1,p2)       vsi_o_ttrace(VSI_CALLER TC_PRIM, "Para: " s,p1,p2)
+  #define TRACE_3_PARA(s,p1,p2,p3)    vsi_o_ttrace(VSI_CALLER TC_PRIM, "Para: " s,p1,p2,p3)
+  #define TRACE_4_PARA(s,p1,p2,p3,p4) vsi_o_ttrace(VSI_CALLER TC_PRIM, "Para: " s,p1,p2,p3,p4)
+  #define TRACE_7_PARA(s,p1,p2,p3,p4,p5,p6,p7) vsi_o_ttrace(VSI_CALLER TC_PRIM, "Para: " s,p1,p2,p3,p4,p5,p6,p7)
+  #define TRACE_8_PARA(s,p1,p2,p3,p4,p5,p6,p7,p8) vsi_o_ttrace(VSI_CALLER TC_PRIM, "Para: " s,p1,p2,p3,p4,p5,p6,p7,p8)
+  #define TRACE_9_PARA(s,p1,p2,p3,p4,p5,p6,p7,p8,p9) vsi_o_ttrace(VSI_CALLER TC_PRIM, "Para: " s,p1,p2,p3,p4,p5,p6,p7,p8,p9)
+  #define TRACE_10_PARA(s,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10) vsi_o_ttrace(VSI_CALLER TC_PRIM, "Para: " s,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10)
+  #define TRACE_11_PARA(s,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11) vsi_o_ttrace(VSI_CALLER TC_PRIM, "Para: " s,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11)  
+  #define TRACE_12_PARA(s,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12) vsi_o_ttrace(VSI_CALLER TC_PRIM, "Para: " s,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12)  
+
+  #define TRACE_0_OUT_PARA(s)             vsi_o_ttrace(VSI_CALLER TC_PRIM, "OPar: " s)
+  #define TRACE_1_OUT_PARA(s,p1)          vsi_o_ttrace(VSI_CALLER TC_PRIM, "OPar: " s,p1)
+  #define TRACE_2_OUT_PARA(s,p1,p2)       vsi_o_ttrace(VSI_CALLER TC_PRIM, "OPar: " s,p1,p2)
+  #define TRACE_3_OUT_PARA(s,p1,p2,p3)    vsi_o_ttrace(VSI_CALLER TC_PRIM, "OPar: " s,p1,p2,p3)
+  #define TRACE_4_OUT_PARA(s,p1,p2,p3,p4) vsi_o_ttrace(VSI_CALLER TC_PRIM, "OPar: " s,p1,p2,p3,p4)
+  #define TRACE_8_OUT_PARA(s,p1,p2,p3,p4,p5,p6,p7,p8) vsi_o_ttrace(VSI_CALLER TC_PRIM, "OPar: " s,p1,p2,p3,p4,p5,p6,p7,p8)
+  #define TRACE_9_OUT_PARA(s,p1,p2,p3,p4,p5,p6,p7,p8,p9) vsi_o_ttrace(VSI_CALLER TC_PRIM, "OPar: " s,p1,p2,p3,p4,p5,p6,p7,p8,p9)
+  #define TRACE_PRIM_FROM(s)              vsi_o_ttrace(VSI_CALLER TC_PRIM, "Pdir: " s)
+  #define TRACE_PRIM_TO(s)                vsi_o_ttrace(VSI_CALLER TC_PRIM, "Pdir: " s)
+#else
+  #define TRACE_0_PARA(s)             
+  #define TRACE_1_PARA(s,p1)          
+  #define TRACE_2_PARA(s,p1,p2)       
+  #define TRACE_3_PARA(s,p1,p2,p3)    
+  #define TRACE_4_PARA(s,p1,p2,p3,p4) 
+  #define TRACE_7_PARA(s,p1,p2,p3,p4,p5,p6,p7)
+  #define TRACE_8_PARA(s,p1,p2,p3,p4,p5,p6,p7,p8)
+  #define TRACE_9_PARA(s,p1,p2,p3,p4,p5,p6,p7,p8,p9)
+  #define TRACE_10_PARA(s,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10)
+  #define TRACE_11_PARA(s,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11)
+  #define TRACE_12_PARA(s,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12)
+
+  #define TRACE_0_OUT_PARA(s)             
+  #define TRACE_1_OUT_PARA(s,p1)          
+  #define TRACE_2_OUT_PARA(s,p1,p2)       
+  #define TRACE_3_OUT_PARA(s,p1,p2,p3)    
+  #define TRACE_4_OUT_PARA(s,p1,p2,p3,p4) 
+  #define TRACE_8_OUT_PARA(s,p1,p2,p3,p4,p5,p6,p7,p8)
+  #define TRACE_9_OUT_PARA(s,p1,p2,p3,p4,p5,p6,p7,p8,p9)
+  #define TRACE_PRIM_FROM(s)  
+  #define TRACE_PRIM_TO(s)
+#endif
+
+
+#ifndef TRACE_INFO       /* only used in local environment */
+#  define TRACE_INFO(x)
+#endif
+
+#ifndef TRACE_COMMENT    /* only used in local environment */
+#  define TRACE_COMMENT(x)
+#endif
+
+/*
+ * This is just a TEMPORARY define until the issues with OPTION_MULTITHREAD
+ * are settled. This define SHOULD be contained in GSM.H.
+ */
+#undef _ENTITY_PREFIXED
+#define _ENTITY_PREFIXED(N) gmm_##N
+/*
+ * defines the user of the vsi interface
+ */
+#define VSI_CALLER            GMM_handle,
+#define VSI_CALLER_SINGLE     GMM_handle
+
+/* TCS 2.1 */
+ /* TCS 2.1 */
+ /* TCS 2.1 */
+/*
+ ****************************************************************************
+ * The following declarations shall be identical with the corresponding 
+ * declarations located in RR. 
+ ****************************************************************************
+ */
+#ifdef GPRS
+EXTERN UBYTE rr_csf_get_radio_access_capability( T_ra_cap *ra_cap );
+#endif
+
+/*
+ ****************************************************************************
+ * The above declarations shall be identical with the corresponding 
+ * declarations located in RR. 
+ ****************************************************************************
+ */
+
+/*
+ * This is just a TEMPORARY define until the issues with OPTION_MULTITHREAD
+ * are settled. This define SHOULD be contained in GSM.H.
+ */
+
+#define SEND_ATTACH_COMPLETE 1
+#define SEND_NOT_ATTACH_COMPLETE 0
+/*
+ * max attach attempts
+ */
+#define MAX_AAC               5
+/*
+ * max attempts for timeout of T3310
+ */
+#define MAX_CT3310            5
+/*
+ * If the skip bit in the message is not 0 the message is invalid
+ */
+#define SKIP_VALID            0
+
+/*
+ * Bitoffset for encoding/decoding
+ * LLC header size
+ * and LLC tail size
+ */
+#define ENCODE_OFFSET         (37*8)
+#define ENCODE_LLC_FCS_SIZE   (3*8)
+
+/*
+ * These MASKS are defined in GSM 03.03 and needed for translation
+ * from PTMSI to TLLI
+ */
+/*
+ *  11 ...
+ */
+#define LOCAL_TLLI_SET_MASK       0xC0000000
+#define LOCAL_TLLI_RES_MASK       0xFFFFFFFF
+/*
+ *  10 ...
+ */
+#define FOREIGN_TLLI_SET_MASK     0x80000000
+#define FOREIGN_TLLI_RES_MASK     0xBFFFFFFF
+/*
+ *  01111 ...
+ */
+#define RANDOM_TLLI_SET_MASK      0x78000000
+#define RANDOM_TLLI_RES_MASK      0x7FFFFFFF
+
+#define INVALID_PTMSI_SIGNATURE   0xffffff
+
+#define INVALID_PDP_CONTEXT_STATUS  0xffff
+
+#ifdef FRAME_OFFSET_ZERO
+
+#define GET_PD(s,p)               p=s.buf[3] & 0x0F
+#define GET_TI(s,t)               t=(s.buf[3] & 0xF0)>>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, s.o_buf, 4, &t)
+
+#endif
+
+/*
+ * Protocol Discrimator
+ */
+#define PD_CC                     3
+#define PD_MM                     5
+#define PD_RR                     6
+#define PD_GMM                    8
+#define PD_SMS                    9
+#define PD_SM                     10
+#define PD_SS                     11
+#define PD_TST                    15
+
+/*
+ * one second is defined as 1000 ms 
+ */
+#define SEC   1000
+
+/*
+ * The definition of detach types are different between uplink and downlink
+ * direction. thatswhy i have to translate it.
+ */
+#define  GMM_DT_RE_ATTACH         20
+/*
+ *
+ */
+ #define  GMM_MM_DEREG                     0
+ #define  GMM_MM_REG_NORMAL_SERVICE        1
+ #define  GMM_MM_REG_NO_CELL_AVAILABLE      3
+ #define  GMM_MM_REG_UPDATE_NEEDED          4 
+ #define  GMM_MM_REG_INITATED_VIA_GPRS          5 
+ /*
+  * GRR state machine
+  */
+#define GMM_GRR_STATE_OFF   0
+#define GMM_GRR_STATE_ON   1
+#define GMM_GRR_STATE_SUSPENDING    2
+#define GMM_GRR_STATE_SUSPENDED    3
+#define GMM_GRR_STATE_CR   4
+/*
+  * LLC state machine
+  */
+#define GMM_LLC_STATE_SUSPENED_RAU    0
+#define GMM_LLC_STATE_SUSPENED     1
+#define GMM_LLC_STATE_ASSIGNED    2
+#define GMM_LLC_STATE_UNASSIGNED   3 
+/*
+ * suspension cause
+ */
+#define GMM_SUSP_NONE           0x00
+#define GMM_SUSP_UNKNOWN        0x00
+#define GMM_SUSP_IMSI_DETACH    0x01
+#define GMM_SUSP_LAU            0x02
+#define GMM_SUSP_CALL           0x04
+#define GMM_SUSP_EM_CALL        0x08
+#define GMM_SUSP_LOCAL_DETACH       0x10
+
+/*
+ * bis_size_message_table - This table is need in Service TX to calculate
+ *                          the BIT size from _decodedMsg
+ */
+#ifdef GMM_PEI_C
+const int bit_size_message_table [/*MAX_MESSAGE_ID_GMM*/] =
+{ 
+  0, /* not defined                                                         =0x0*/
+  BSIZE_ATTACH_REQUEST          , /* max bitlength of coded ATTACH_REQUEST  =0x1 */
+  BSIZE_ATTACH_ACCEPT           , /* max bitlength of coded ATTACH_ACCEPT   =0x2 */        
+  BSIZE_ATTACH_COMPLETE         ,/* max bitlength of coded ATTACH_COMPLETE  =0x3 */         
+  BSIZE_ATTACH_REJECT           ,/* max bitlength of coded ATTACH_REJECT    =0x4 */        
+  BSIZE_U_DETACH_REQUEST        ,/* max bitlength of coded U_DETACH_REQUEST =0x5*/         
+  BSIZE_D_DETACH_ACCEPT         , /* max bitlength of coded D_DETACH_ACCEPT=0x6 */         
+  0, /* not defined */
+  BSIZE_ROUTING_AREA_UPDATE_REQUEST   , /* max bitlength of coded ROUTING_AREA_UPDATE_REQUEST   =0x8 */
+  BSIZE_ROUTING_AREA_UPDATE_ACCEPT    , /* max bitlength of coded ROUTING_AREA_UPDATE_ACCEPT    =0x9 */
+  BSIZE_ROUTING_AREA_UPDATE_COMPLETE  , /* max bitlength of coded ROUTING_AREA_UPDATE_COMPLETE  =0xa */
+  BSIZE_ROUTING_AREA_UPDATE_REJECT    , /* max bitlength of coded ROUTING_AREA_UPDATE_REJECT    =0xb */
+  0, /* not defined                                                                             =0xc */
+  0, /* not defined                                                                             =0xd */
+  0, /* not defined                                                                             =0xe */
+  0, /* not defined                                                                             =0xf */
+  BSIZE_P_TMSI_REALLOCATION_COMMAND   , /* max bitlength of coded P_TMSI_REALLOCATION_COMMAND   =0x10 */        
+  BSIZE_P_TMSI_REALLOCATION_COMPLETE  , /* max bitlength of coded P_TMSI_REALLOCATION_COMPLETE  =0x11 */        
+  BSIZE_AUTHENTICATION_AND_CIPHERING_REQUEST  , /* max bitlength of coded AUTHENTICATION_AND_CIPHERING_REQUEST  =0x12 */        
+  BSIZE_AUTHENTICATION_AND_CIPHERING_RESPONSE , /* max bitlength of coded AUTHENTICATION_AND_CIPHERING_RESPONSE =0x13 */        
+  BSIZE_AUTHENTICATION_AND_CIPHERING_REJECT   , /* max bitlength of coded AUTHENTICATION_AND_CIPHERING_REJECT   =0x14 */        
+  BSIZE_IDENTITY_REQUEST         , /* max bitlength of coded IDENTITY_REQUEST =0x15 */
+  BSIZE_IDENTITY_RESPONSE        , /* max bitlength of coded IDENTITY_RESPONSE=0x16 */        
+  0, /* not defined                                                           =0x17 */
+  0, /* not defined                                                           =0x18 */
+  0, /* not defined                                                           =0x19 */
+  0, /* not defined                                                           =0x1a */
+  0, /* not defined                                                           =0x1b */
+  0, /* not defined                                                           =0x1c */
+  0, /* not defined                                                           =0x1d */
+  0, /* not defined                                                           =0x1e */
+  0, /* not defined                                                           =0x1f */
+  BSIZE_GMM_STATUS             , /* max bitlength of coded D_GMM_STATUS       =0x20 */
+  BSIZE_GMM_INFORMATION           /* max bitlength of coded GMM_INFORMATION   =0x21 */
+};
+
+#else
+EXTERN const int bit_size_message_table [];
+#endif
+
+
+
+/*
+ * Service definitions. Used to access service data with GET/SET_STATE.
+ *
+ * Services with multiple incarnation have to be defined as xxx->
+ * Services with only one incarnation have to be defined as xxx.
+ *
+ * NOTE: For S1, LLC does access multiple incarnations with GET/SET_ISTATE.
+ */
+#define KERN                  kern.
+#define CU                    kern.states.cu.
+#define GU                    kern.states.gu.
+#define MM                    kern.states.mm.
+#define TX                    tx.
+#define RX                    rx.
+#define RDY                   rdy.
+#define SYNC                  sync.
+
+/*
+ * Service name definitions for trace purposes. The service abbrevation
+ * (e.g. LLME) has to be the same as above for the service definitions.
+ */
+#ifndef NTRACE
+
+#define SERVICE_NAME_KERN     "KERN"
+#define SERVICE_NAME_CU       "CU"
+#define SERVICE_NAME_GU       "GU"
+#define SERVICE_NAME_LLC      "LLC"
+#define SERVICE_NAME_GRR      "GRR"
+#define SERVICE_NAME_TX       "TX"
+#define SERVICE_NAME_RX       "RX"
+#define SERVICE_NAME_RDY      "RDY"
+#define SERVICE_NAME_SYNC     "SYNC"
+#define SERVICE_NAME_MM       "MM"
+
+#endif /* !NTRACE */
+
+
+/*
+ * Timer definitions.
+ */
+
+#define kern_T3302  0     /* Timeout for Attach or RAU failer*/      
+#define kern_T3310  1     /* Timeout for ATTACH */
+#define kern_T3311  2     /* Timeout for Attach or RAU Reject*/
+#define kern_T3321  3     /* Timeout for DETACH */
+
+#define rdy_T3312   5      /* Standby or RAU timer */
+
+#define kern_TPOWER_OFF    8     /* POWER OFF timer */
+#define sync_TSYNC         9    /* timer for synchronization supervision, 
+                                    between GRR CELL_IND and MM ACTIVATE_IND */
+#define kern_TLOCAL_DETACH     10     /* disable GRR timer */
+
+#define TIMER_MAX   11
+
+/*
+ *  AniteB2 V1.17 TC 44.2.1.2.8 Relese 99 ms
+ */
+#define T3302_VALUE       (12*60000)    /* ms */
+ #define T3312_VALUE       (54*60000)    /* ms */
+
+/* Anite B2 TC 44.2.2.1.4/ 44.2.1.1.7 */
+#define T3310_VALUE       15000        /* ms */
+
+#define T3311_VALUE       15000        /* ms */
+#define T3321_VALUE       15000        /* ms */
+#define T3314_VALUE       44000        /* ms */
+
+#define T3316_VALUE       44000        /* ms */
+#define TPOWER_OFF_VALUE   5000        /* ms */
+#define TSYNC              2000         /* ms */
+#define TLOCAL_DETACH_VALUE    5000        /* ms */
+
+
+#ifdef REL99
+
+/*For sgsnr handling*/
+#define R_98NW 0
+#define R_99NW 1
+
+/*
+ * Cell notification not supported
+ */
+#define NO_CELL_NOTIFY        0 /* TCS 4.0 */
+
+/*
+ * First cell notification in this RA. Don't use LLC NULL frame
+ */
+#define FIRST_CELL_NOTIFY     1 /* TCS 4.0 */
+
+/*
+ * Second or higher cell notification in this RA. Can use LLC NULL frame
+ */
+#define NOT_FIRST_CELL_NOTIFY 2 /* TCS 4.0 */
+#endif
+
+
+/*
+ * State definitions for each service.
+ */
+
+#define KERN_GMM_NULL_NO_IMSI                      0
+#define KERN_GMM_NULL_IMSI                         1
+#define KERN_GMM_DEREG_INITIATED                   2  
+#define KERN_GMM_DEREG_ATTEMPTING_TO_ATTACH        3
+#define KERN_GMM_DEREG_NO_CELL_AVAILABLE           4
+#define KERN_GMM_DEREG_LIMITED_SERVICE             5
+#define KERN_GMM_DEREG_NO_IMSI                     6
+#define KERN_GMM_DEREG_PLMN_SEARCH                 7
+#define KERN_GMM_DEREG_SUSPENDED                   8
+
+#define KERN_GMM_REG_INITIATED                     9
+
+#define KERN_GMM_REG_NO_CELL_AVAILABLE             10
+#define KERN_GMM_REG_LIMITED_SERVICE               11
+#define KERN_GMM_REG_ATTEMPTING_TO_UPDATE_MM       12
+#define KERN_GMM_REG_ATTEMPTING_TO_UPDATE          13
+#define KERN_GMM_REG_RESUMING                      14
+#define KERN_GMM_REG_SUSPENDED                     15
+#define KERN_GMM_REG_NORMAL_SERVICE                16
+
+#define KERN_GMM_RAU_INITIATED                     17
+
+#define KERN_GMM_RAU_WAIT_FOR_NPDU_LIST            18
+
+#define KERN_GMM_REG_IMSI_DETACH_INITIATED         19
+
+#define KERN_GMM_DEREG_SUSPENDING                  20
+#define KERN_GMM_DEREG_RESUMING                    21
+
+#define KERN_GMM_REG_SUSPENDING                    22
+#define KERN_GMM_NULL_NO_IMSI_LIMITED_SERVICE_REQ  23
+#define KERN_GMM_NULL_IMSI_LIMITED_SERVICE_REQ     24
+#define KERN_GMM_REG_TEST_MODE                     25
+#define KERN_GMM_NULL_PLMN_SEARCH                  26
+#define KERN_GMM_REG_TEST_MODE_NO_IMSI             27
+
+#define TX_READY      0
+#define TX_NOT_READY  1 
+
+#define RX_READY      0
+#define RX_NOT_READ   1
+
+#define RDY_READY       0
+#define RDY_STANDBY     1
+#define RDY_DEACTIVATED 2
+#define RDY_STANDBY_TWICE    3
+
+enum
+{
+  SYNC_IDLE          = 0,
+  SYNC_WAIT_FOR_GSM  = 1,
+  SYNC_WAIT_FOR_GPRS = 2
+};
+
+/*==== TYPES ======================================================*/
+
+/*
+ * GMM global typedefs
+ */
+
+
+/*
+ * things to do after receiving of gmmrr_suspend_cnf, whenn local detach has 
+ * been called before.
+ */
+typedef enum
+{
+  GMM_LOCAL_DETACH_PROC_NOT_CHANGED           =0,
+  GMM_LOCAL_DETACH_PROC_NOTHING               =1,
+  GMM_LOCAL_DETACH_PROC_ENTER_NULL_IMSI_LIMITED_SERVICE_REQ=2,
+  GMM_LOCAL_DETACH_PROC_ENTER_NULL_IMSI       =3,
+  GMM_LOCAL_DETACH_PROC_ENTER_NULL_NO_IMSI    =4,
+  GMM_LOCAL_DETACH_PROC_RESUME                =5,
+  GMM_LOCAL_DETACH_PROC_ENTER_DEREG           =6,
+  GMM_LOCAL_DETACH_PROC_UNASSIGN              =7,
+  GMM_LOCAL_DETACH_PROC_ENTER_REG_NORMAL      =8,
+  GMM_LOCAL_DETACH_PROC_SUSP_LAU              =9,
+  GMM_LOCAL_DETACH_PROC_RE_ATTACH             =10,
+  GMM_LOCAL_DETACH_PROC_RAU                   =11,
+  GMM_LOCAL_DETACH_PROC_DISABLE               =12,
+  GMM_LOCAL_DETACH_PROC_COMB_DISABLE          =13,
+  GMM_LOCAL_DETACH_PROC_SIM_REMOVED           =14,
+  GMM_LOCAL_DETACH_PROC_AUTH_FAILED           =15,
+  GMM_LOCAL_DETACH_PROC_POWER_OFF             =16,
+  GMM_LOCAL_DETACH_PROC_SOFT_OFF              =17
+} T_LOCAL_DETACH_PROC;
+/*
+ * TLLI type
+ */
+typedef enum
+{
+  LOCAL_TLLI,
+  FOREIGN_TLLI,
+  RANDOM_TLLI,
+  CURRENT_TLLI,
+  OLD_TLLI,
+  INVALID_TLLI
+} T_TLLI_TYPE;
+
+
+/*
+ * Test environment (simulator) vs. Implementation environment.
+ */
+typedef enum
+{
+  TEST_ENV,
+  IMPL_ENV
+} T_ENVIRONMENT;
+
+
+typedef UBYTE       T_BIT_INT;
+typedef T_BIT_INT   T_BIT;
+
+
+typedef enum
+{
+  SERVICE_KERN,
+  SERVICE_TX,
+  SERVICE_RX,
+  SERVICE_RDY,
+  SERVICE_SYNC,
+  NO_SERVICE
+} T_SERVICE;
+
+typedef enum
+{
+  PRIM_DATA,
+  PRIM_UNITDATA,
+  NO_PRIM
+} T_PRIM_TYPE;
+
+typedef enum
+{
+  GMM_NO_RAU,
+  GMM_RAU,
+  GMM_PERIODIC_RAU
+} T_RAU_TYPE;
+
+typedef enum
+{
+  GU_UPDATE_NEEDED,
+  GU_UPDATE_NOT_NEEDED
+} T_GU_UPDATE_STATE;
+
+/*
+ * T_ATTACH_CAP is sruct, which defines the way to attach
+ */
+/* 
+ * GMMREG_AT_NOT_KNOWN is in addition to the values given in 
+ * gmmreg to indicate that no gmmreg_attach_req is received yet
+ * this case is only after power on 
+ */
+#define GMMREG_AT_NOT_KNOWN    0
+/*
+ * GSIM is no longer available, so the Update defines are done here
+ * These values defined in 11.11
+ */
+#define GU1_UPDATED        0
+#define GU2_NOT_UPDATED      1
+#define GU3_PLMN_NOT_ALLOWED    2
+#define GU3_ROAMING_NOT_ALLOWED  3  /* RA not allowed */
+/*
+ * These values defined in 11.11 (original in RR.SAP in old GSM code
+ */
+#define CKSN_RES                       0x7         /* reserved                       */
+#define CKSN_NOT_PRES                  0xff        /* not present                    */
+
+/*
+ * MAX_LIST_OF_FORBIDDEN_PLMNS_FOR_GPRS_SERVICE defines the max value of PLMNs
+ */
+#define MAX_LIST_OF_FORBIDDEN_PLMNS_FOR_GPRS_SERVICE 1
+
+/*
+ * cu_state stores the status of cell update. if llgmm_trigger_req has been 
+ * sent with cause cell_update cu_state is set to remember the state when 
+ * sending gmmrr_cell_res to GRR
+ */
+#define CU_NOT_REQUESTED  0
+#define CU_REQUESTED      1
+#define CU_CELL_RES_SENT  2
+#define CU_REQUESTED_CELL_RES_SENT  3 /* if periodic rau accept has been received 
+                                          * CU has to be sent although no cell had changed
+                                          */
+
+typedef struct /* T_GMM_STATE */
+{
+  UBYTE                       state;
+  /*
+   * Required for state traces.
+   */
+#ifndef NTRACE
+  char                        *name;
+  char                        *state_name;
+#endif
+} T_GMM_STATE;
+
+typedef struct /* T_GMM_STATES */
+{
+  /*
+   * MM State
+   */
+  T_GMM_STATE                mm;           /* mm state          */
+  /* 
+   * Cell Update State
+   *
+   * This variable remembers whether the MS is searching for a PLMN
+   * TRUE in the timespan MMGMM_NET_REQ to MMGMM_NREG_IND/MMGMM_PLMN_IND. 
+   * This variable may be used to delay e.g. periodic updated until 
+   * the network search has ended. 
+   */
+  T_GMM_STATE                cu;           /* cell update state */
+  /*
+   * Update states
+   */
+  T_GMM_STATE                gu;           /* GMM update state */
+  
+} T_GMM_STATES;
+
+/*
+ *    !!!  ATTENTION  !!!
+ *    This struct will be written in one block to the FFS.
+ *    So the position of the variables can not be changed!
+ */
+typedef struct 
+{                                 /* default values */
+  U8   cipher_on;                  
+} T_GMM_FFS;
+
+typedef struct
+{
+  UBYTE  cipher_on;
+  UBYTE  nmo;
+
+#ifdef REL99
+  UBYTE sgsnr_flag; /* TCS 4.0 */
+  UBYTE cell_notification; /* TCS 4.0 */
+#endif
+
+  BOOL   preuse_off;
+} T_CONFIG;
+
+
+
+typedef struct
+{
+  /*
+   * GMM has to switch on GRR after mmgmm_activate_ind only the first time
+   */
+  UBYTE grr_state;
+  /* 
+   * attach_type as defined in GMMREG_ATTACH_REQ
+   * as attach_type!type_of_attach with additional value 
+   * GMMREG_AT_NOT_KNOWN = 4
+   * MMI given attach type like mobile class.
+   */
+  UBYTE attach_type  ;
+
+  /*
+   * attach_type set in attach procedure only
+   */
+
+  UBYTE attach_proc_type;
+  /*
+   * update_proc__type set in rau procedure only
+   */
+
+  UBYTE update_proc_type;
+
+  /*
+   * This parameter is needed for for SIM to know if GMM attached 
+   * one time succsessful after PO to update the ME 
+   * see GSM 03.60 ch. 13.4 
+   */
+  
+  UBYTE attach_acc_after_po;
+  /* 
+   * result type includes the result attach typeof the
+   * last RAU or ATTACH procedure
+   */
+  UBYTE result_type;
+  /* T_plmn_mt_caps plmn_mt_caps; */
+  UBYTE sms_radio_priority_level;
+  UBYTE old_net_mode;
+
+  UBYTE mobile_class;
+  UBYTE netIII_attach;
+  /*
+   * dependend on the attach direction the appropriate parameter is set
+   */
+  BOOL  gmmreg;
+#ifndef GMM_TCS4
+  BOOL  gmmsm;
+#endif
+  /*
+   * to sent gmmrr_attache_finished only once i store the state
+   */
+  BOOL gmmrr_attach_finished_sent;
+  /*
+   * to sent llgmm_resume only once i store the state
+   */
+  UBYTE llc_state;
+
+  /* BOOL  normal_service; */
+
+  T_RAU_TYPE rau_initiated;
+  BOOL attempting_to_update_mm;
+
+  /*
+   * service mode is given by MMI
+   */
+  UBYTE service_mode;
+  /* 
+   * attach complete is used to remember whether attach_complete has to
+   * be sent again or never HACK: some networks accept only attach complete
+   * with old TLLI
+   */ 
+  BOOL  attach_complete;
+  /*
+   * GSM 04.08: If for the last attempt to update the registration of the location area a MM 
+   * specific procedure was performed, the value of the update type IE in the 
+   * ROUTING AREA UPDATE REQUEST message shall indicate "combined RA/LA updating 
+   * with IMSI attach". 
+   */
+  BOOL mm_lau_attempted;
+  /*
+   * GMM has to remember that state was attempting to UPDATE also if LAU 
+   * has been performed afer aac>5
+   * see R&S test case 44.2.3.2.7
+   */
+  BOOL enter_attempting_to_update_after_lau;
+  /*
+   * network_selection_mode is given by GMMREG_PLMN_MODE_REQ and switches 
+   * between manual and automatic network selection mode (cops=1,2,"... or 
+   * cops=?
+   */
+  UBYTE network_selection_mode;
+
+  /* 
+   * In case the user performed a manual network selection, we remember the 
+   * user requested PLMN in this variable.
+   */
+  T_plmn plmn_requested;
+
+  BOOL grr_via_llc_suspended;
+
+  T_plmn list_of_forbidden_plmns_for_gprs_service[MAX_LIST_OF_FORBIDDEN_PLMNS_FOR_GPRS_SERVICE];
+
+  T_routing_area_identification     rai_accepted;
+
+  /*
+   *in case of switching ms_classes GRR has to be informed after detach/attach proceudres
+   */
+  BOOL mobile_class_changed;
+
+  /*
+   * if RAU or attach procedure is interupted by GMMRR_CR_IND GMM stores the timer value
+   * to be able to restart the timer if rau has not changed.
+   */
+  T_TIME  t3310_value;
+
+#ifdef REL99
+  /*
+   * PDP context status used in R99 RAU request message is stored here. Ref 10.5.7.1 of 24.008
+   */
+  USHORT  pdp_context_status; /* TCS 4.0 */
+#endif
+
+
+} T_ATTACH_CAP;
+
+typedef struct
+{
+  /* detach_type as defined in GMMREG_DETACH_REQ
+   * as attach_type!type_of_attach with additional value 
+   */
+  UBYTE detach_type  ;  
+  /*
+   * dependend on the attach direction the appropriate parameter is set
+   */
+  BOOL  gmmreg;
+  BOOL  network;
+  BOOL  normal_service;
+  /*
+   * GMM has to remember the errr cause if 
+   * ( !(48 <= cause && cause <= 63) )
+   * 'Retry upon entry into a new cell' occures.
+   * GPRS attach shall be
+   * performed when a new cell is entered.
+   */
+  USHORT error_cause;
+  /*
+   * whenn GMM locally detaches the MS it enters substate suspending
+   * to remember what to do next the folloing parameter has been introduced
+   */
+  T_LOCAL_DETACH_PROC  local_detach_open_proc;
+} T_DETACH_CAP;
+
+typedef struct
+{
+  /*
+   * The purpose of the A&C reference number information element is to indicate
+   * to the network in the AUTHENTICATION AND CIPHERING RESPONSE message which 
+   * AUTHENTICATION AND CIPHERING REQUEST message the MS is replying to.
+   * Reference : [1] section 10.5.5.19
+   */
+  UBYTE                        a_c_reference_number;
+
+  /* SIM interface got modified to support identifiers of requests sent to
+   * SIM. This can be used to handle the above mentioned "multiple (two)
+   * authentication req messages" problem. The following variable replaces
+   * the outstanding_count as a slightly different approach is used. This
+   * variable contains the req_id in the last sent SIM_AUTHENTICATION_REQ.
+   * On receiving SIM_AUTHENTICATION_CNF, response is sent to network only
+   * if req_id matches the value in this variable.*/
+  UBYTE                       last_auth_req_id;
+
+  UBYTE                       kc[MAX_KC];          
+  UBYTE                       cksn;
+  UBYTE                       ciphering_algorithm;
+  UBYTE                        imeisv_requested;
+} T_AUTH_CAP;
+
+/*
+ * procedure collision between detach and others
+ */
+typedef struct
+{
+  BOOL  rau;
+} T_WHILST_DETACH;
+
+/*
+ * cell id to have always the current state
+ */
+typedef struct
+{
+  T_plmn  plmn;
+  UBYTE   rac;
+  USHORT   lac;
+  USHORT   cid;
+} T_CELL_ID;
+
+typedef struct
+{
+  BOOL           gmmrr_cell_ind_received; 
+  T_cell_env     env;
+  U8             gmm_status;
+  U8             mm_status;
+  U8             net_mode;
+#ifdef GMM_TCS4
+  U8             rt; /* TCS 4.0 */
+#endif
+
+
+  U32           t3212_val;
+
+#ifdef REL99
+  /*
+   * For R97-R99 compatibility
+   */
+  U8                       sgsnr_flag;  /* TCS 4.0 */
+#endif
+
+} T_SIG_CELL_INFO;
+
+typedef struct
+{
+  T_plmn                    plmn;                     /*<  0:  8> plmn identification                                */
+  U16                       lac;                      /*<  8:  2> location area code                                 */
+  U16                       cid;                      /*< 10:  2> cell id                                            */
+  U32                       t3212_val;                /*< 12:  4> value of T3212                                     */
+  U8                        status;                   /*< 16:  1> Activation status                                  */
+  U8                        gprs_indicator;           /*< 17:  1> GPRS indicator                                     */
+} T_MM_CELL_INFO;
+
+/*
+ * Includes the several TLLIS 
+ */
+  
+typedef struct
+{
+  ULONG old;
+  ULONG current;
+  T_TLLI_TYPE current_type;
+} T_TLLI;
+
+/*
+ * Includes the several PTMSIs 
+ * current PTMSI is the PTMSI given by the network itself or read from SIM
+ * new_grr PTMSI is the GRR-assigned PTMSI. Sometimes this GRR-PTMSI has to be set to
+ * invalid although the PTMSI from the mobile is still available, i.e. in a re-attach situation.
+ * oldold is the second old one, if in concurrent TBF more PTMSIs are exxhanged than 
+ * TLLIs are received.
+ */
+typedef struct
+{
+  ULONG old;
+  ULONG new_grr;
+  ULONG current;
+} T_PTMSI;
+
+
+typedef struct
+{
+  BOOL  available;      
+  ULONG value;
+} T_PTMSI_SIGNATURE;
+
+typedef struct /* T_KERN_DATA */
+{
+  UBYTE                       state;
+  /*
+   * Required for state traces.
+   */
+#ifndef NTRACE
+  char                        *name;
+  char                        *state_name;
+#endif
+  /* 
+   *  GMM KERN STATES
+   */
+  T_GMM_STATES                states;
+  /*
+   * attach attempt counter
+   */
+  UBYTE                       aac;
+  /*
+   *   MM update status
+   */
+  UBYTE                       ustate;
+
+  /*
+   * defines the attach capabitlities
+   */
+  T_ATTACH_CAP                attach_cap;
+
+  T_DETACH_CAP                detach_cap;
+
+  /*
+   * defines the authentication capabitlities
+   */
+  T_AUTH_CAP                  auth_cap;
+  /*
+   * collects all procedures which interupted teh detach procedure
+   */
+  T_WHILST_DETACH             whilst_detach;
+  /*
+   * Cell information
+   */
+  T_SIG_CELL_INFO             sig_cell_info;
+  /*
+   * Cell ID to inform the User
+   */
+  T_CELL_ID                   cell_id;
+  /* 
+   * GPRS inicator 
+   */
+  USHORT                      gprs_indicator;
+  
+  /*
+   * Old Cell information to know when ra ic crossed
+   */
+  T_SIG_CELL_INFO              old_sig_cell_info;
+  T_cell_env                   mm_cell_env;
+
+  /*
+   * counter for timers
+   */
+  UBYTE                        ct3310;
+  UBYTE                        ct3321;
+  /*
+   * timer values
+   */
+  ULONG                        t3310_val;
+  ULONG                        t3311_val;
+  ULONG                        t3321_val;
+  ULONG                        t3302_val;
+
+  BOOL                         timeout_t3312;
+  UBYTE                         sim_op_mode;
+  
+  BOOL                        gmmrr_resume_sent;
+  UBYTE                       suspension_type;
+  BOOL                        local_detached;
+} T_KERN_DATA;
+
+
+typedef struct /* T_TX_DATA */
+{
+  UBYTE                       state;
+  /*
+   * Required for state traces.
+   */
+#ifndef NTRACE
+  char                        *name;
+  char                        *state_name;
+#endif
+} T_TX_DATA;
+
+
+typedef struct /* T_RX_DATA */
+{
+  UBYTE                       state;
+  /*
+   * Required for state traces.
+   */
+#ifndef NTRACE
+  char                        *name;
+  char                        *state_name;
+#endif
+} T_RX_DATA;
+
+typedef struct /* T_RDY_DATA */
+{
+  UBYTE                       state;
+  /*
+   * Required for state traces.
+   */
+#ifndef NTRACE
+  char                        *name;
+  char                        *state_name;
+#endif
+
+  /* 
+   * timer values
+   */
+  ULONG                       t3312_val;
+  ULONG                       t3314_val;
+  BOOL t3312_deactivated;
+  BOOL                        attempting_to_update;
+  ULONG                       timer_value[TIMER_MAX];
+
+} T_RDY_DATA;
+
+typedef struct /* T_SYNC_DATA */
+{
+  UBYTE                       state;
+  /*
+   * Required for state traces.
+   */
+#ifndef NTRACE
+  char                        *name;
+  char                        *state_name;
+#endif
+
+  /* 
+   * timer values
+   */
+  T_cell_info                  grr_cell_info;
+  T_SIG_CELL_INFO              sig_cell_info;
+  T_MM_CELL_INFO               mm_cell_info;
+
+} T_SYNC_DATA;
+
+typedef struct /* T_GMM_DATA */
+{
+  /*
+   * GMM layer parameters
+   */
+  UBYTE                       version;
+  
+#ifdef TRACE_FUNC
+#ifdef IDENTATION
+  UBYTE deep;
+#endif
+#endif
+  BOOL anite;
+  /*
+   * counter for random value generator
+   */
+  UBYTE  rand_counter;
+  /* 
+   *  indicates whether ciphering is on in GMM or not 
+   */
+  BOOL                        cipher;      
+
+  /*
+   *  TLLI
+   */
+  T_TLLI tlli;
+
+  USHORT                            acc_contr_class;
+  BOOL                              sim_gprs_invalid;
+
+  UBYTE                             gu;
+
+  T_PTMSI                           ptmsi;
+
+  ULONG                             tmsi;
+  T_PTMSI_SIGNATURE                 ptmsi_signature;
+  T_imsi                            imsi;
+
+  T_drx_parameter                   drx_parameter;
+  /*
+   * defines cusomer specific options
+   * either given be at%cgmm or CONFIG string
+   */
+  T_CONFIG                    config;
+
+#ifdef REL99
+  /*
+   * For storing cell notification information
+   */
+  UBYTE                       cell_notification; /* TCS 4.0 */
+#endif
+
+ 
+  /*
+   * Service data structures.
+   *
+   * Services with multiple incarnations require an array of structures
+   * named xxx_base[] with xxx = service abbrevation, and additionally a
+   * pointer named *xxx, which will be accessed instead of xxx_base.
+   * 
+   * Services with only one incarnation just have to declare one structure
+   * named xxx (no need for xxx_base[] and *xxx).
+   * 
+   * The differentiation between the two access possibilites is made with
+   * the defines of the service names above (LLC_SERVICE_XXX).
+   */
+  T_KERN_DATA     kern;
+  T_TX_DATA       tx;
+  T_RX_DATA       rx;
+  T_RDY_DATA      rdy;
+  T_SYNC_DATA     sync;
+} T_GMM_DATA;
+
+/*==== EXPORT =====================================================*/
+
+/*
+ * Entity data base
+ */
+#ifdef GMM_PEI_C
+       T_GMM_DATA gmm_data_base, *gmm_data;
+#else
+EXTERN T_GMM_DATA gmm_data_base, *gmm_data;
+#endif
+
+#define ENTITY_DATA           gmm_data
+
+#define pei_create              gmm_pei_create
+/*
+ * Communication handles (see also GMM_PEI.C)
+ */
+#define hCommSMS          gmm_hCommSMS
+#define hCommSM            gmm_hCommSM
+#define hCommGRLC          gmm_hCommGRLC /* TCS 2.1 */
+#define hCommGRR           gmm_hCommGRR
+#define hCommLLC           gmm_hCommLLC
+#define hCommSIM           gmm_hCommSIM
+#define hCommMM            gmm_hCommMM
+#define hCommMMI           gmm_hCommMMI
+#define hCommGMM           gmm_hCommGMM
+#ifdef GMM_TCS4
+#define hCommUPM           gmm_hCommUPM
+#endif
+
+#ifdef GMM_PEI_C
+       T_HANDLE hCommSMS    = VSI_ERROR;
+       T_HANDLE hCommSM      = VSI_ERROR;
+       T_HANDLE hCommGRLC    = VSI_ERROR; /* TCS 2.1 */
+       T_HANDLE hCommGRR     = VSI_ERROR;
+       T_HANDLE hCommLLC     = VSI_ERROR;
+       T_HANDLE hCommSIM     = VSI_ERROR;
+       T_HANDLE hCommMM      = VSI_ERROR;
+       T_HANDLE hCommMMI     = VSI_ERROR;
+       T_HANDLE hCommGMM     = VSI_ERROR;
+       
+       T_HANDLE GMM_handle;
+#ifdef GMM_TCS4
+       T_HANDLE hCommUPM     = VSI_ERROR;
+#endif
+#else
+EXTERN T_HANDLE hCommSMS;
+EXTERN T_HANDLE hCommSM;
+EXTERN T_HANDLE hCommGRLC; /* TCS 2.1 */
+EXTERN T_HANDLE hCommGRR;
+EXTERN T_HANDLE hCommLLC;
+EXTERN T_HANDLE hCommSIM;
+EXTERN T_HANDLE hCommMM;
+EXTERN T_HANDLE hCommMMI;
+EXTERN T_HANDLE hCommGMM;
+
+#ifdef GMM_TCS4
+EXTERN T_HANDLE hCommUPM;
+#endif
+EXTERN T_HANDLE GMM_handle;
+#endif /* GMM_PEI_C */
+
+
+/*
+ * 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
+
+#ifdef GMM_PEI_C
+GLOBAL UBYTE      _decodedMsg [MAX_MSTRUCT_LEN_GMM];
+#else
+EXTERN UBYTE      _decodedMsg [MAX_MSTRUCT_LEN_GMM];
+#endif /* GMM_PEI_C */
+
+#endif /* GMM_H */