view src/g23m-gprs/gmm/gmm.h @ 694:005151e56328

Tango modem RI output implemented
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 20 Oct 2020 00:58:52 +0000
parents 219afcfc6250
children
line wrap: on
line source

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