FreeCalypso > hg > fc-magnetite
diff src/g23m-gprs/gmm/gmm.h @ 183:219afcfc6250
src/g23m-gprs: initial import from TCS3.2/LoCosto
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 13 Oct 2016 04:24:13 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-gprs/gmm/gmm.h Thu Oct 13 04:24:13 2016 +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 */