FreeCalypso > hg > fc-tourmaline
view src/g23m-gsm/mm/mm.h @ 281:a75eefbf8be4
Phone boot with PWON: weed out short button presses
Every standard end user phone has a design provision, most naturally
implemented in firmware, whereby the PWON button effects a boot only
if it is held down long enough - short presses of this PWON button
are detected, assumed to be spurious and cause the fw to power back off
instead of proceeding with boot. The present change introduces this
standard function in FreeCalypso.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 24 Sep 2021 02:03:08 +0000 |
parents | fa8dc04885d8 |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | Project : GSM-PS (8410) | Modul : MM +----------------------------------------------------------------------------- | 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 | Radio Resource +----------------------------------------------------------------------------- */ #ifndef MM_H #define MM_H #ifdef GPRS #include "mm_gprs.h" #endif /* GPRS */ #if defined (TI_PS_HCOMM_CHANGE) #include "cl_hComm_handle.h" #endif #ifdef TI_GSP_STR2IND_S2I_STRING typedef unsigned int T_S2I_STRING; #else typedef char * T_S2I_STRING; #define S2I_STRING(x) (x) #endif #ifdef TI_PS_OP_VSI_NO_CALL_ID #define TIMER_START(C,I,T) vsi_t_start_nc(I,T) #define TIMER_PSTART(C,I,T,R) vsi_t_pstart_nc(I,T,R) #define TIMER_STOP(C,I) vsi_t_stop_nc(I) #define TIMER_STATUS(C,I,T) vsi_t_status_nc(I,T) #define SUSPEND_SELF(C,T) vsi_t_sleep_nc(T) #define SYSTEM_TIME(C,T) vsi_t_time_nc(T) #else /* TI_PS_OP_VSI_NO_CALL_ID */ #define TIMER_START(C,I,T) vsi_t_start(C,I,T) #define TIMER_PSTART(C,I,T,R) vsi_t_pstart(C,I,T,R) #define TIMER_STOP(C,I) vsi_t_stop(C,I) #define TIMER_STATUS(C,I,T) vsi_t_status(C,I,T) #define SUSPEND_SELF(C,T) vsi_t_sleep(C,T) #define SYSTEM_TIME(C,T) vsi_t_time(C,T) #endif /* TI_PS_OP_VSI_NO_CALL_ID */ #if !defined(_SIMULATION_) && defined(WIN32) #define _SIMULATION_ #endif /* !_SIMULATION_ && WIN32 */ /*==== TEST =====================================================*/ /* * Dynamic Configuration Numbers */ #define TIMER_SET 1 #define TIMER_RESET 2 #define TIMER_SPEED_UP 3 #define TIMER_SLOW_DOWN 4 #define TIMER_SUPPRESS 5 #define T3212_CNT 6 #define USE_STORED_BCCH 7 #define FFS_READ_EPLMN 8 #define FFS_WRITE_EPLMN 9 #define FFS_RESET_EPLMN 10 #define FFS_READ_EPLMN_INIT 11 #define ENTITY_DATA mm_data /* * PLMN constants */ #define MAX_FORB_PLMN_ID 8 /* Arbitrary, >= MAX_SIM_FORB_PLMN_ID */ #define MAX_SIM_FORB_PLMN_ID 4 #define UBYTES_PER_PLMN 3 /* Number of UBYTEs for packed PLMN */ #ifdef REL99 #define UBYTES_PER_PLMN_WITH_ACC_TECH 5 /* Number of UBYTEs for packed PLMN with access technology*/ #endif #ifdef GPRS #define MAX_GPRS_FORB_PLMN_ID 4 #endif /* #ifdef GPRS */ #define MAX_PREF_PLMN_ID (MAX_PREF_PLMN/UBYTES_PER_PLMN) #define SIZE_LOC_INFO 11 #define PD_MM_TI_0 PD_MM #ifdef REL99 #define MAX_DEFINED_CAUSES 23 #else #define MAX_DEFINED_CAUSES 22 #endif #define TMSI_INVALID_VALUE 0xFFFFFFFFL #define LAC_INVALID_VALUE 0xFFFE /* * initial HPLMN search after switch on delayed for ms */ #define HPLMN_INITIAL_DELAY 120000 /* 2 minutes */ /* * HPLMN search constants in steps of 6 minutes */ #define HPLMN_REARM_DELAY 1 /* 6 minutes */ #define HPLMN_DEF_SEARCH_PERIOD 10 /* 1 hour */ #define HPLMN_MAX_SEARCH_PERIOD 80 /* 8 hours */ /* * Flags for creating a plmn list */ #define WITH_OTHER_PLMNS 0 /* Non-forbidden, RPLMN no or low prio */ #define WITH_ALL_PLMNS 1 /* All available PLMNs */ #define WITH_RPLMN 2 /* Non-forbidden */ /* * Timer Identifier */ #define T_REGISTRATION 0 #define T3210 1 #define T3211 2 #define T3212 3 #define T3213 4 #define T3220 5 #define T3230 6 #define T3240 7 #define T_HPLMN 8 #ifdef REL99 #define T3241 9 #define NUM_OF_MM_TIMERS 10 #else #define NUM_OF_MM_TIMERS 9 #endif #define MAX_REST_T3213 2 /* * CM_SERVICE_TYPES */ #define NO_CM_SERVICE 0 #define CALL_SERVICE ST_MOC #define EMERGENCY_SERVICE ST_EMERGENCY #define SMS_SERVICE ST_SMS #define SS_SERVICE ST_SS /* * MM Cause */ #define MM_CAUSE MMCM_MM_CAUSE /* * COMPONENTS */ #define CC_COMP MMCM_ORG_ENTITY_CC #define SS_COMP MMCM_ORG_ENTITY_SS #define SMS_COMP MMCM_ORG_ENTITY_SMS #define REG_COMP 3 #define TIMEOUT 4 /* * FAILURES */ #define OPTIONAL_INFO_ERROR 102 /* * LOC-UPD-TYPES */ #define NORMAL_LUP 0 #define PERIODIC_LUP 1 #define IMSI_ATTACH_LUP 2 #define NOT_RUNNING 3 /* * MISC.CONSTANTS FOR QEUEING */ #define ENTRY_FREE 0 #define USE 1 #define STORED 2 /* * Constants describing the stored information type */ #define NO_ENTRY 0 #define PRIMITIVE_ENTRY 1 #define EVENT_ENTRY 2 /* * UPDATE-STATUS */ #define MS_UPDATED 0 #define MS_NOT_UPDATED 1 #define MS_LA_NOT_ALLOWED 3 typedef enum { MSG_RR_ACT, MSG_MM_REE, MSG_MM_CIPH, MSG_MM_MODE }T_MSG_TYPE; typedef enum { PRIM_EST_IND, PRIM_DATA_IND }T_PRIM_TYPE; /* * Macros */ #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 #define MSG(TYPE) ((T_##TYPE *)(_decodedMsg)) #define USE_STORED_ENTRIES() { ENTITY_DATA->use_stored_entries = TRUE; } /* * The assert() macro as defined by the frame stops the task, * not only in simulation but also on the target. For the * simulation this is a desired behaviour, for the target it is not. */ #ifndef WIN32 #undef assert #define assert(x) if (!(x)) { TRACE_ERROR ("Assertion failed"); } #endif /* * Bitoffset for encoding/decoding */ #define ENCODE_OFFSET 24 /* * a modified version of the S/GET_STATE macros for tracing CM_INST states */ #define CMSTATE(PROCESS,N) ENTITY_DATA->conn_state[(PROCESS)][(N)] #ifdef NTRACE #define CM_SET_STATE(PROCESS,N,STATE) CMSTATE((PROCESS),(N)) = (STATE) #define CM_GET_STATE(PROCESS,N) CMSTATE((PROCESS),(N)) #else #if defined (NEW_FRAME) #define CM_SET_STATE(PROCESS,N,STATE)\ {\ vsi_o_strace (VSI_CALLER\ PROCESS_NAME_CM[(PROCESS)],\ STATE_CM_NAME [(PROCESS)] [ CMSTATE(PROCESS,N) ],\ STATE_CM_NAME [(PROCESS)] [ (STATE) ]);\ CMSTATE((PROCESS),(N)) = (STATE);\ } #define CM_GET_STATE(PROCESS,N)\ (vsi_o_strace (VSI_CALLER\ PROCESS_NAME_CM[(PROCESS)],\ STATE_CM_NAME [(PROCESS)] [ CMSTATE((PROCESS),(N)) ],\ NULL), CMSTATE((PROCESS),(N))) #else #define CM_SET_STATE(PROCESS,N,STATE)\ CMSTATE((PROCESS),(N)) =\ vsi_o_strace (VSI_CALLER\ PROCESS_NAME_CM[(PROCESS)],\ STATE_CM_NAME [(PROCESS)] [ CMSTATE(PROCESS,N) ],\ STATE_CM_NAME [(PROCESS)] [ (STATE) ],\ (STATE) ) #define CM_GET_STATE(PROCESS,N)\ vsi_o_strace (VSI_CALLER\ PROCESS_NAME_CM[(PROCESS)],\ STATE_CM_NAME [(PROCESS)] [ CMSTATE((PROCESS),(N)) ],\ NULL ,\ CMSTATE((PROCESS),(N)) ) #endif /* NEW_FRAME */ #endif /* NTRACE */ /* * buffer sizes */ #define SIZE_BCCH 16 #define NUM_OF_CM_ENT 3 #define NUM_OF_CONN_PER_CM_ENT 16 /* * CONNECTION STATES */ #define CM_IDLE 0 #define CM_PENDING 1 #define CM_ACTIVE 2 #define CM_REEST_PENDING 3 #define CM_STORE 4 #define CM_NOT_IDLE 0xff EXTERN const char * const * const STATE_CM_NAME[]; #define STATE_CM_CC_NAME_INIT \ "CM_CC_IDLE", \ "CM_CC_PENDING", \ "CM_CC_ACTIVE", \ "CM_CC_REEST_PENDING", \ "CM_CC_STORE" #define STATE_CM_SS_NAME_INIT \ "CM_SS_IDLE", \ "CM_SS_PENDING", \ "CM_SS_ACTIVE", \ "CM_SS_REEST_PENDING", \ "CM_SS_STORE" #define STATE_CM_SMS_NAME_INIT \ "CM_SMS_IDLE", \ "CM_SMS_PENDING", \ "CM_SMS_ACTIVE", \ "CM_SMS_REEST_PENDING", \ "CM_SMS_STORE" /* * CM manages 3 (NUM_OF_CM_ENT) states: CC, SS, SMS */ #define STATE_CC CC_COMP #define STATE_SS SS_COMP #define STATE_SMS SMS_COMP #define UNSPEC 0 #define CM_LUP_TRIGGER 1 EXTERN const char * const PROCESS_NAME_CM[]; #define PROCESS_NAME_CM_INIT \ "STATE_CC" , \ "STATE_SS" , \ "STATE_SMS" /* * A definition of the states of CMSTATE is provided in MM_PEI.C */ #if defined(MM_PEI_C) && ! defined(NTRACE) LOCAL const char * const STATE_CC_NAME [] = { STATE_CM_CC_NAME_INIT }; LOCAL const char * const STATE_SS_NAME [] = { STATE_CM_SS_NAME_INIT }; LOCAL const char * const STATE_SMS_NAME[] = { STATE_CM_SMS_NAME_INIT }; GLOBAL const char * const * const STATE_CM_NAME [] = { STATE_CC_NAME, STATE_SS_NAME, STATE_SMS_NAME }; GLOBAL const char * const PROCESS_NAME_CM[] = { PROCESS_NAME_CM_INIT }; #endif /* * States of the Mobility Management */ #define MM_NULL 0 #define MM_LUP_INITIATED 3 #define MM_WAIT_FOR_OUTG_MM_CONN 5 #define MM_CONN_ACTIVE 6 #define MM_IMSI_DETACH_INIT 7 #define MM_PROCESS_PROMPT 8 #define MM_WAIT_FOR_NW_CMD 9 #define MM_LUP_REJECTED 10 #define MM_WAIT_FOR_RR_CONN_LUP 13 #define MM_WAIT_FOR_RR_CONN_MM 14 #define MM_WAIT_FOR_RR_CONN_DETACH 15 #define MM_WAIT_FOR_REESTABLISH 17 #define MM_WAIT_FOR_RR_ACTIVE 18 #define MM_IDLE_NORMAL_SERVICE 19 /* 19.1 */ #define MM_LOCATION_UPDATING_PENDING 23 /* Not defined for GSM only stack */ #define MM_IMSI_DETACH_PENDING 24 /* Not defined for GSM only stack */ #ifdef REL99 #define MM_RR_CONN_RELEASE_NOT_ALLOWED 25 #define MM_IDLE_ATTEMPT_TO_UPDATE 26 // 19.2 #define MM_IDLE_LIMITED_SERVICE 27 // 19.3 #define MM_IDLE_NO_IMSI 28 // 19.4 #define MM_IDLE_NO_CELL_AVAILABLE 29 // 19.5 #define MM_IDLE_LUP_NEEDED 30 // 19.6, not used by GSM only stack #define MM_IDLE_PLMN_SEARCH 31 // 19.7 #define MM_PLMN_SEARCH_NORMAL_SERVICE 32 // 19.8 #else #define MM_IDLE_ATTEMPT_TO_UPDATE 25 // 19.2 #define MM_IDLE_LIMITED_SERVICE 26 // 19.3 #define MM_IDLE_NO_IMSI 27 // 19.4 #define MM_IDLE_NO_CELL_AVAILABLE 28 // 19.5 #define MM_IDLE_LUP_NEEDED 29 // 19.6, not used by GSM only stack #define MM_IDLE_PLMN_SEARCH 30 // 19.7 #define MM_PLMN_SEARCH_NORMAL_SERVICE 31 // 19.8 #endif /* N950 Memory Optimization - Implements Measure #39*/ EXTERN T_S2I_STRING const STATE_MM_NAME[]; #ifdef GPRS /* * States of CM establishment if GPRS is present */ #define CM_GPRS_EST_IDLE 0 /* No outstanding MMGMM_CM_ESTABLISH_RES */ #define CM_GPRS_EST_PEND 1 /* MMGMM_CM_ESTABLISH_RES outstanding */ #define CM_GPRS_EMERGE_PEND 2 /* MMGMM_CM_EMERGENCY_RES outstanding */ #define CM_GPRS_EST_OK 3 /* MM is allowed to establish RR connection */ /* * States for connection management. You may think of a process * in terms of SDL here, but this is not obvious by looking into the C code, * as the separation of state machines is not elaborated at all. */ EXTERN const char * const STATE_GPRS_CM_EST_NAME[]; #define STATE_GPRS_CM_EST_INIT \ "CM_GPRS_EST_IDLE", \ "CM_GPRS_EST_PEND", \ "CM_GPRS_EMERGE_PEND", \ "CM_GPRS_EST_OK" /* * States for registration control. * Don't think of a state and a process in term of SDL here. * The only reason why this is a state and not only a ordinary variable * is because it eases debugging a lot for now. */ EXTERN const char * const STATE_REG_TYPE_NAME[]; #endif /* GPRS */ /* * MM manages 1 (NUM_OF_MM_STATES) state (GSM only) : MM * MM manages 3 (NUM_OF_MM_STATES) states (GPRS present): MM, GPRS_CM_EST, REG_TYPE */ #ifdef OPTION_MULTITHREAD #define PROCESS_NAME _ENTITY_PREFIXED(PROCESS_NAME) #endif EXTERN const char * const PROCESS_NAME[]; #ifdef GPRS #define STATE_MM 0 #define STATE_GPRS_CM_EST 1 #define STATE_REG_TYPE 2 #define NUM_OF_MM_STATES 3 #define PROCESS_NAME_INIT \ "MM", \ "GPRS_CM_EST", \ "REG_TYPE" #else #define STATE_MM 0 #define NUM_OF_MM_STATES 1 #define PROCESS_NAME_INIT \ "MM" #endif /* GPRS */ /* * A definition of the states is provided in MM_PEI.C */ #if defined(MM_PEI_C) && ! defined(NTRACE) /* N950 Memory Optimization - Implements Measure #39*/ GLOBAL T_S2I_STRING const STATE_MM_NAME[] = { S2I_STRING("MM_NULL"), S2I_STRING("MM_1_INVALID"), S2I_STRING("MM_2_INVALID"), S2I_STRING("MM_LUP_INITIATED"), S2I_STRING("MM_4_INVALID"), S2I_STRING("MM_WAIT_FOR_OUTG_MM_CONN"), S2I_STRING("MM_CONN_ACTIVE"), S2I_STRING("MM_IMSI_DETACH_INIT"), S2I_STRING("MM_PROCESS_PROMPT"), S2I_STRING("MM_WAIT_FOR_NW_CMD"), S2I_STRING("MM_LUP_REJECTED"), S2I_STRING("MM_11_INVALID"), S2I_STRING("MM_12_INVALID"), S2I_STRING("MM_WAIT_FOR_RR_CONN_LUP"), S2I_STRING("MM_WAIT_FOR_RR_CONN_MM"), S2I_STRING("MM_WAIT_FOR_RR_CONN_DETACH"), S2I_STRING("MM_16_INVALID"), S2I_STRING("MM_WAIT_FOR_REESTABLISH"), S2I_STRING("MM_WAIT_FOR_RR_ACTIVE"), S2I_STRING("MM_IDLE_NORMAL_SERVICE"), S2I_STRING("MM_20_INVALID"), S2I_STRING("MM_21_INVALID"), S2I_STRING("MM_22_INVALID"), S2I_STRING("MM_LOCATION_UPDATING_PENDING"), S2I_STRING("MM_IMSI_DETACH_PENDING"), #ifdef REL99 S2I_STRING("MM_RR_CONN_RELEASE_NOT_ALLOWED"), #endif S2I_STRING("MM_IDLE_ATTEMPT_TO_UPDATE"), S2I_STRING("MM_IDLE_LIMITED_SERVICE"), S2I_STRING("MM_IDLE_NO_IMSI"), S2I_STRING("MM_IDLE_NO_CELL_AVAILABLE"), S2I_STRING("MM_IDLE_LUP_NEEDED"), S2I_STRING("MM_IDLE_PLMN_SEARCH"), S2I_STRING("MM_PLMN_SEARCH_NORMAL_SERVICE") }; #ifdef GPRS GLOBAL const char * const STATE_GPRS_CM_EST_NAME[] = { STATE_GPRS_CM_EST_INIT }; GLOBAL const char * const STATE_REG_TYPE_NAME[] = { "REG_GPRS_INACTIVE", "REG_REMOTE_CONTROLLED", "REG_CELL_SEARCH_ONLY" }; #endif /* GPRS */ GLOBAL const char * const PROCESS_NAME[] = { PROCESS_NAME_INIT }; #endif /* defined(MM_PEI_C) && ! defined(NTRACE) */ #ifndef NTRACE #define UNEXPECTED_IN_STATE "Unexpected in state" #define UNEXPECTED_DEFAULT "Unexpected default" #define UNEXPECTED_PARAMETER "Unexpected parameter" #define PRIMITIVE_IGNORED "Primitive ignored" #endif /* * State of elementary file after SIM_FILE_CHANGE_IND */ #define SAT_UNCHANGED 0 /* SAT didn't change the file */ #define SAT_READ_FILE 1 /* SAT changed file, still to read */ #define SAT_PEND_CNF 2 /* SIM_READ_REQ underway for elementary file */ #define SAT_PEND_ACT 3 /* File read, but not yet activated */ /* * Get registration type. Use this macro to make it easy for the optimizer * to optimize some expressions away if compiling a GSM only protocol stack. * These macros help to avoid making an #ifdef grave from MM. */ #ifdef GPRS #define mm_gsm_alone() (GET_STATE (STATE_REG_TYPE) EQ REG_GPRS_INACTIVE) #define mm_cm_est_allowed() (GET_STATE (STATE_GPRS_CM_EST) EQ CM_GPRS_EST_OK) #define mm_lup_allowed_by_gmm() (GET_STATE (STATE_REG_TYPE) NEQ REG_CELL_SEARCH_ONLY) #else #define mm_gsm_alone() TRUE #define mm_cm_est_allowed() TRUE #define mm_lup_allowed_by_gmm() TRUE #endif /* GPRS */ #define EPLMNLIST_SIZE 6 /******************Specially for Cingular********************/ #define MAX_CINGULAR_PLMN 14 /*==== TYPES ======================================================*/ typedef struct { /* IMSI EPLMNList was received with */ T_imsi_struct eqv_plmn_imsi; /* Contains a list of Equivalent PLMNs provided by the network. The list is * replaced or deleted at the end of each location update procedure, routing * area update procedure and GPRS attach procedure. */ UBYTE eqv_plmn_list[EPLMNLIST_SIZE*UBYTES_PER_PLMN]; } T_ffs_eplmn_imsi; typedef struct { /* Access class for RR from the SIM */ USHORT acc_class; /* PLMN on which MM actually tries to register */ T_plmn actual_plmn; /* Room for BCCH information from the SIM/RR. * The better way would be to define this as T_bcch_info */ UBYTE bcch[SIZE_BCCH]; /* TRUE if the BCCH information shall be used. The sense of this variable * is questionable */ BOOL bcch_encode; /* Cell test mode, possible values are * CELL_TEST_ENABLE and CELL_TEST_DISABLE */ UBYTE cell_test; /* The ciphering key sequence number */ UBYTE cksn; /* The list of forbidden PLMNs, copy of SIM data */ UBYTE forb_plmn[MAX_FORB_PLMN_ID * UBYTES_PER_PLMN]; #ifdef GPRS /* The list of forbidden PLMNs for GPRS services */ UBYTE gprs_forb_plmn[MAX_GPRS_FORB_PLMN_ID * UBYTES_PER_PLMN]; #endif /* #ifdef GPRS */ /* The PLMN which sent recently a LUP reject with cause #13 */ T_plmn low_prio_plmn; /* The IMSI, copy of SIM data */ T_imsi_struct imsi_struct; /* The ciphering key */ UBYTE kc[MAX_KC]; /* The location area where the mobile currently is registered */ T_loc_area_ident lai; /* Operation mode. Valid flag v_op set to valid after first reg. attempt * Also contains information whether a sim and a test sim is inserted. */ T_op op; /* Length of MNC in IMSI.SIM should send the length of mnc and MM should use * this value to see if third digit of MNC is valid or not */ U8 length_mnc; /* The found PLMNs during network search */ UBYTE plmn[MAX_PLMN_ID * UBYTES_PER_PLMN]; /* The LACs of the found PLMNs */ USHORT plmn_lac [MAX_PLMN_ID]; /* The reception levels of the found PLMNs */ UBYTE plmn_rx [MAX_PLMN_ID]; #ifdef GPRS /* The GPRS capabilities of the found PLMNs */ UBYTE gprs_status[MAX_PLMN_ID]; /* The indicated value of the TMSI */ ULONG indicated_tmsi; #endif /* #ifdef GPRS */ /* Number of found PLMN */ UBYTE plmn_cnt; /* Index of currently checked PLMN in automatic mode */ UBYTE plmn_index; /* Preferred PLMN list */ UBYTE pref_plmn[MAX_PREF_PLMN_ID * UBYTES_PER_PLMN]; #ifdef REL99 /* * Actual length of User controlled PLMN Selector with Access Technology (EFPLMNwAcT) * as indicated in sim_mm_insert_ind */ USHORT sim_ucps_at_len; /* * Actual length of Operator controlled PLMN Selector with Access Technology (EFOPLMNwAcT) * as indicated in sim_mm_insert_ind */ USHORT sim_ocps_at_len; /* * Flag indicates which SIM EFs are being used for pref_plmn * TRUE: Indicated SIM EFs EFPLMNwAcT and EFOPLMNwAcT are being used. * FALSE: Indicated SIM EF EFPLMNsel is being used. */ BOOL sim_uocps_at_used; #endif /*Actual length of PLMN Selector (EFPLMNsel) as indicated in sim_mm_insert_ind*/ USHORT sim_plmnsel_len; /* * Flag indicates if the SIM INSERT INDICATION is in progress i.e. after SIM_MM_INSERT_IND, * MM is reading SIM files. * TRUE: SIM MM insert indication and Reading of files is in progress */ BOOL sim_read_in_progress; /* This variable will be used to decide if SIM_SYNC_REQ should be sent or not. * After receiving SIM_MM_INSERT_IND, MM should respond with a SIM_SYNC_REQ. * This SIM_SYNC_REQ will be sent after reading either EFPLMNSel or EFPLMNwAct * and EFOPLMNwAct */ BOOL sim_sync_req_pending; /*SET true is sim file update indication is received*/ BOOL sim_file_upd_ind_rec; /* HPLMN search period, this is forwarded to RR and not evaluated by MM */ UBYTE thplmn; /* TMSI, copy of the SIM data */ ULONG tmsi; /* The update state as it is on the SIM. Possible values are * MS_UPDATED, MS_NOT_UPDATED and MS_LA_NOT_ALLOWED */ UBYTE update_stat; /* MMXXX_REG_CNF sent to MMI only if this has not already been done * after last registration attempt / last loss of service or * the cell has changed. */ BOOL full_service_indicated; /* New cell from RR after last MMXXX_REG_CNF */ BOOL new_cell_ind; /* Access class updated by SAT, update state */ UBYTE upd_sim_acc; /* Preferred PLMN list updated by SAT, update state */ UBYTE upd_sim_plmnsel; /* HPLMN search period updated by SAT, update state */ UBYTE upd_sim_hplmn; /* Forbidden PLMN list updated by SAT, update state */ UBYTE upd_sim_fplmn; #ifdef REL99 /* User controlled PLMN Selector with Access Technology update state */ UBYTE upd_sim_ucps_at; /* User controlled PLMN Selector with Access Technology update state */ UBYTE upd_sim_ocps_at; #endif /* Acting HPLMN value updated by SAT, update state */ UBYTE upd_sim_act_hplmn; /* If NEQ NULL, MM is performing the MM Restart procedure */ T_SIM_MM_INSERT_IND *sim_insert_info; /* Contains a list of Equivalent PLMNs provided by the network. The list is * replaced or deleted at the end of each location update procedure, routing * area update procedure and GPRS attach procedure. */ //UBYTE eqv_plmn_list[EPLMNLIST_SIZE*UBYTES_PER_PLMN]; /* * EPLMN List and IMSI store in Non-volatile memory */ T_ffs_eplmn_imsi eqv_plmns; /* If sim supports AHPLMN and the file has valid value acting_hplmn.v_plmn is TRUE and the * actual value of AHPLMN will be contained in acting_hplmn. If sim doesnt support this * feature or the value for AHPLMN is invalid acting_hplmn.v_plmn is FALSE and acting_hplmn * contains 0xff 0xff 0xff */ T_plmn acting_hplmn; /* If the value read for AHPLMN is FFFFFF then acting_hplmn_invalid will be * true.This will only be used if AHPLMN is modified via OTA */ BOOL acting_hplmn_invalid; /* If the PLMN is registered to AHPLMN at the time of REFRESH command by SMS, * then this flag should be set to true. */ BOOL reg_plmn_equal_ahplmn; /* This flag shall be used to indicate Cingular Network */ BOOL is_cingular_sim; /* This flag enables a quick search when coming back from VPLMN to HPLMN and RR_ABORT_IND gives HPLMN as a part of its List*/ BOOL quick_hplmn_search; } T_REG; /* This struct is used to store timer events and establishment requests */ typedef struct { UBYTE comp; UBYTE ti; USHORT estcs; } T_STORE_1; typedef union { T_STORE_1 event; T_PRIM_HEADER* primitive; } T_STORE_MM; typedef struct { UBYTE use; U8 content_type; U8 info; T_STORE_MM content; } T_STORE; typedef struct { UBYTE comp; UBYTE ti; USHORT cause; UBYTE service; } T_PEND; typedef struct { UBYTE state; } T_CONN; typedef struct { /* The BCCH information as delivered by the cell * The better way would be to define this as T_bcch_info */ UBYTE bcch[SIZE_BCCH]; /* Location Area Identity of last/current selected cell, * information will not be invalidated if coverage lost * until new cell is selected. */ T_loc_area_ident lai; /* Cell ID of last/current selected cell, * information will not be invalidated if coverage lost * until new cell is selected. */ USHORT cid; /* Information broadcast by cell on BCCH */ T_mm_info mm_info; #ifdef GPRS /* Information braodcast on the BCCH whether the cell supports GPRS */ UBYTE gprs_indication; #endif /* GPRS */ } T_MM; #if defined (OPTION_TIMER) typedef struct { UBYTE t_mode; ULONG t_val; } T_TIMER_CONFIG; #endif /* #if defined (OPTION_TIMER) */ #ifdef GPRS /* * MM data solely used if GPRS is also delivered */ typedef struct { /* TRUE if MM has to send MMGMM_REG_CNF after IDLE mode entry */ BOOL reg_cnf_on_idle_entry; /* TRUE if SIM currently physically removed and SIM data not yet deleted. * This variable is only used if GSM is not alone, otherwise MM can perform * the necessary actions (e.g. IMSI detach) alone. */ BOOL sim_physically_removed; /* TRUE if the MS is in a location area where combined attach is * required (network mode I) and therefore MM shall not start T3212. */ BOOL combined_procedures; /* The currently selected mobile class. Needed for reject cause #14. */ UBYTE mobile_class; /* The current GPRS resumption state. Defaults to MMGMM_RESUMPTION_FAILURE * excepts if processing RR_RELEASE_IND, in this case it is set according * to the resumption state delivered by RR_RELEASE_IND. */ UBYTE resumption; } T_GPRS_DATA; #endif /* GPRS */ typedef struct { /* The variable ciphering_on is a write-only variable, not to be eliminated. * It contains the state of ciphering on the air interface (on or off). */ BOOL ciphering_on; /* The connection table. NUM_OF_CM_ENT equals to the number of CM entities, * while NUM_OF_CONN_PER_CM_ENT equals to the number of parallel * transactions each entitity can have */ UBYTE conn_state[NUM_OF_CM_ENT][NUM_OF_CONN_PER_CM_ENT]; /* May be zero, OPTIONAL_INFO_ERROR or RC_INVALID_MAND_MESSAGE. * Related to the decoding of messages */ UBYTE error; /* This variable is TRUE until either the first location updating * procedure has ended either with an invalidation of the registration * state or the first successful location updating. This variable should * go into the registration data, but this is really only cosmetic. * first_attach_mem holds the state of first attach before it is set to FALSE. * It is used to determine if the HPLMN timer has to be started with 3 min for * first search of HPLMN or if the normal hplmn timer value from registration * data is to be used. After this check it is reset unconditional. */ BOOL first_attach; BOOL first_attach_mem; /* RR release cause which leaded to idle entry after failed LUP. In case * this is RELCS_ACCESS_BARRED or RELCS_RND_ACC_DELAY, MM is someway in * state MM_IDLE_LUP_NEEDED, but this state is not used for this purpose * in MM. A location updating attempt will be performed if RR informs MM * by using RR_SYNC_IND with an appropriate cause. */ USHORT idle_entry; /* Contains the type of the location update in progress and the state of * the follow on request flag of this location update. */ T_loc_upd_type loc_upd_type; /* Contains relevant data delivered by RR about the selected cell. * A better name for this type instead T_MM may be T_CELL_DATA, * for the variable itself cell_data */ T_MM mm; /* The state of the MM state machines, the MM main state machine and * the registration state machine. */ UBYTE state[NUM_OF_MM_STATES]; // TO_BE_DONE - write a good comment UBYTE nreg_cause; /* The variable nreg_request is TRUE if the deregistration was requested by * MMR_NREG_REQ, otherwise FAISE. This is needed to decide whether MM * will send an MMR_NREG_IND or MMR_NREG_CNF primitive at the end of the * deregistration process. */ BOOL nreg_request; /* All necessary information which is required for a pending connection * is stored here. Note: There can be not more than one pending connection * at a given time. */ T_PEND pend_conn; /* The base for the internal random number generator, used to set the value * for T3212 under certain cicumstances. */ ULONG rand_base; /* All the data related to registration and SIM. */ T_REG reg; /* In this location timer expiries and CM connection requests can be stored * for later usage after a state change of one of the MM state machines */ T_STORE store[MAX_STORE_ENTRIES]; /* Use stored entries after end of transition */ BOOL use_stored_entries; #if defined (NEW_FRAME) /* TRUE if the appropriate timer is active */ BOOL t_running[NUM_OF_MM_TIMERS]; #else /* The handles for all the MM timers. */ T_VSI_THANDLE t_handle[NUM_OF_MM_TIMERS]; #endif /* This variable is a perfectly good substitute for missing MM state * WAIT_FOR_ADDITIONAL_OUTGOING MM connection (#20). If in state * MM_CONNECTION_ACTIVE (#6) and this flag is set, * MM is really in state #20. */ // Identical with (TIMERACTIVE (T3230)) // Identical with (mm_count_connections (CM_PENDING) NEQ 0) // => flag could be eliminated! BOOL wait_for_accept; /* Copy of the power field of the last RR_ACTIVATE_CNF/RR_ACTIVATE_IND */ UBYTE rf_power; /* The counter for RR_ESTABLISH_REQ retransmissions for one CM connection * attempt if a random access failure occured. */ UBYTE act_retrans; /* The LOCATION UPDATE attempt counter */ UBYTE attempt_cnt; /* The variables reject_cause and last_reject_cause store the * current and the previous reject cause during location updating. */ USHORT rej_cause; USHORT last_rej_cause; /* Remember at RR establishment for emergency call and at start of the * location update procedure the type of service state MM had. */ UBYTE idle_substate; /* Variable solely used for debugging purposes */ USHORT debug_last_rej_cause; /* Variable solely used for debugging purposes */ UBYTE mm_idle_no_imsi_marker; /* Faked T3212 value for test only, will be used if not equal zero */ USHORT t3212_cfg_counter; /* This variable stores whether a timeout of T3212 has occurred and * a periodic location updating procedure has to be performed ASAP. */ BOOL t3212_timeout; /* counts, how many times T3213 was started. Referres to the Note in 24.008 ch. 4.4.4.9 * "the mobile station may as an option delay the repeated attempt for up to 8 seconds * to allow cell re-selection to take place" ---> 2 times T3213 as delay implemented. * 0 -> first run ... */ U8 t3213_restart; UBYTE reest_ti; BOOL reest_cell_avail; /* LOCATION UPDATING REJECT cause from the network or internal * cause for limited service (e.g. AUTHENTICATION REJECT received). * This is for MMR_NREG_IND to inform the MMI and is not intended to * be used by MM to control its own operation. */ USHORT limited_cause; /* A search for available networks was requested by the MMI */ BOOL plmn_scan_mmi; /* A search for available networks was requested by MM for own operation */ BOOL plmn_scan_mm; /* This boolean variable is used only together with available test SIM. * Is it set to a value of TRUE, the MS uses stored BCCH lists also * with test SIM. */ BOOL config_use_stored_bcch; /* This variable is used to prevent an RR_ABORT_IND caused by a RR TABORT timer * timeout from interfering with FTA test 26.7.4.3.4 */ BOOL rr_abort_prior_to_tabort; /* Used to store the datafield used in the last sent SIM_READ_REQ. Default value will be NOT_PRESENT_16BIT, if no read request has been sent to SIM*/ USHORT sim_read_req_data_field; /* Sometimes the network sends multiple (two) authentication req messages * without waiting for an answer. SIM interface got modified to support * identifiers for requests sent to SIM. The following 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. SIM_AUTHENTICATION_CNF with other * req_ids are ignored*/ UBYTE last_auth_req_id; #if defined (FF_EOTD) AND defined (REL99) /* This flag is used to indicate if rrlp/lcs procedure is running. This flag is set * to true upon reception of RR_RRLP_START_IND. Flag will be set to false upon * reception of RR_RRLP_STOP_IND. */ BOOL rrlp_lcs_started; #endif /* (FF_EOTD) AND defined (REL99) */ /* This variable is used to keep count of repetitions for the network search if MM receives RR_ABORT_IND with cause RRCS_ABORT_PTM. Depending on its value MM behaviour will be decided. */ UBYTE net_search_count; /* All the data needed for GPRS support */ #ifdef GPRS T_GPRS_DATA gprs; #endif /* This is a bitwise mapping to indicate SIM which EFs are to be updated in SIM_MM_UPDATE_REQ */ U8 ef_indicator; } T_MM_DATA; /*==== EXPORT =====================================================*/ #define GET_BITS(value, shift, width) ((value >> shift) & ((1 << width) - 1)) /* * Prototypes Timer Modul */ /* * If all entities are linked into one module this definitions * prefixes all this functions with the enity name */ #ifdef OPTION_MULTITHREAD #define tim_t_reg _ENTITY_PREFIXED(tim_t_reg) #define tim_t3210 _ENTITY_PREFIXED(tim_t3210) #define tim_t3211 _ENTITY_PREFIXED(tim_t3211) #define tim_t3212 _ENTITY_PREFIXED(tim_t3212) #define tim_t3213 _ENTITY_PREFIXED(tim_t3213) #define tim_t3220 _ENTITY_PREFIXED(tim_t3220) #define tim_t3230 _ENTITY_PREFIXED(tim_t3230) #define tim_t3240 _ENTITY_PREFIXED(tim_t3240) #ifdef REL99 #define tim_t3241 _ENTITY_PREFIXED(tim_t3241) #endif #define tim_t_hplmn _ENTITY_PREFIXED(tim_t_hplmn) #endif /* #ifdef OPTION_MULTITHREAD */ #if defined (NEW_FRAME) #ifdef OPTION_MULTITHREAD #define tim_exec_timeout _ENTITY_PREFIXED(tim_exec_timeout) #define tim_start_timer _ENTITY_PREFIXED(tim_start_timer) #define tim_stop_timer _ENTITY_PREFIXED(tim_stop_timer) #endif EXTERN void tim_exec_timeout (USHORT index); EXTERN void tim_start_timer (USHORT index, T_TIME value); EXTERN void tim_stop_timer (USHORT index); #else #ifdef OPTION_MULTITHREAD #define tim_set_timeout_flag _ENTITY_PREFIXED(tim_set_timeout_flag) #define tim_handle_timeout _ENTITY_PREFIXED(tim_handle_timeout) #define tim_get_config_timer _ENTITY_PREFIXED(tim_get_config_timer) #define tim_start_timer _ENTITY_PREFIXED(tim_start_timer) #define tim_flush_fifo _ENTITY_PREFIXED(tim_flush_fifo) #endif EXTERN void tim_set_timeout_flag (T_VSI_THANDLE handle, USHORT *t_flag); EXTERN void tim_handle_timeout (USHORT *t_flag); EXTERN void tim_get_config_timer (char *outString, UBYTE t_num, KW_DATA *t_name); EXTERN void tim_start_timer (UBYTE id, T_VSI_THANDLE handle, T_VSI_TVALUE value); EXTERN void tim_flush_fifo (T_VSI_THANDLE handle); #endif /* else, #if defined (NEW_FRAME) */ #ifdef OPTION_MULTITHREAD #define tim_init_timer _ENTITY_PREFIXED(tim_init_timer) #define tim_config_timer _ENTITY_PREFIXED(tim_config_timer) #endif EXTERN BOOL tim_init_timer (void); EXTERN void tim_config_timer (UBYTE t_num, UBYTE t_mod, ULONG t_val); /* * Prototypes MM */ /* * MM Mobility Management */ /* * mobility management primitives */ EXTERN void mm_init_mm_data (void); EXTERN void mm_mdl_error_ind (T_MDL_ERROR_IND *mdl_error_ind); EXTERN void mm_mmcm_data_req (T_MMCM_DATA_REQ *mmcm_data_req); EXTERN void mm_mmcm_establish_req (T_MMCM_ESTABLISH_REQ *mmcm_establish_req); EXTERN void mm_mmcm_reestablish_req (T_MMCM_REESTABLISH_REQ *mmcm_reestablish_req); EXTERN void mm_mmcm_release_req (T_MMCM_RELEASE_REQ *mmcm_release_req); EXTERN void mm_mmcm_prompt_rej (T_MMCM_PROMPT_REJ *prompt_rej); EXTERN void mm_mmcm_prompt_res (T_MMCM_PROMPT_RES *prompt_rsp); EXTERN void mm_mmss_data_req (T_MMSS_DATA_REQ *mmss_data_req); EXTERN void mm_mmss_establish_req (T_MMSS_ESTABLISH_REQ *mmss_establish_req); EXTERN void mm_mmss_release_req (T_MMSS_RELEASE_REQ *mmss_release_req); EXTERN void mm_mmsms_data_req (T_MMSMS_DATA_REQ *mmsms_data_req); EXTERN void mm_mmsms_establish_req (T_MMSMS_ESTABLISH_REQ *mmsms_establish_req); EXTERN void mm_mmsms_release_req (T_MMSMS_RELEASE_REQ *mmsms_release_req); EXTERN void mm_mmxx_establish_req (UBYTE comp, UBYTE ti, USHORT estcs, U8 info); EXTERN void mm_rr_abort_ind (T_RR_ABORT_IND *rr_abort_ind); EXTERN void mm_rr_activate_cnf (T_RR_ACTIVATE_CNF *rr_activate_cnf); EXTERN void mm_rr_activate_ind (T_RR_ACTIVATE_IND *rr_activate_ind); EXTERN void mm_rr_establish_cnf (T_RR_ESTABLISH_CNF *rr_establish_cnf); EXTERN void mm_rr_establish_ind (T_RR_ESTABLISH_IND *rr_establish_ind); EXTERN void mm_rr_release_ind (T_RR_RELEASE_IND *rr_release_ind); EXTERN void mm_rr_sync_ind (T_RR_SYNC_IND *rr_sync_ind); #if defined (FF_EOTD) AND defined (REL99) EXTERN void mm_rr_rrlp_start_ind (T_RR_RRLP_START_IND *rr_rrlp_start_ind); EXTERN void mm_rr_rrlp_stop_ind (T_RR_RRLP_STOP_IND *rr_rrlp_stop_ind); #endif /* (FF_EOTD) AND defined (REL99) */ EXTERN void mm_sim_set_imsi_marker (T_MSG_TYPE imsi_marker); /* * mobility management signalling */ EXTERN void mm_abort (T_D_ABORT *d_abort); EXTERN void mm_auth_rej (void); EXTERN void mm_auth_req (T_D_AUTH_REQ *auth_req); EXTERN void mm_cm_message (UBYTE pd, UBYTE ti, T_RR_DATA_IND *rr_data_ind); EXTERN void mm_cm_serv_accept (void); EXTERN void mm_cm_serv_rej (T_D_CM_SERV_REJ *cm_serv_rej); EXTERN void mm_ident_req (T_D_IDENT_REQ *ident_req); EXTERN void mm_loc_upd_acc (T_D_LOC_UPD_ACCEPT *loc_upd_accept); EXTERN void mm_lup_rej (T_D_LOC_UPD_REJ *loc_upd_rej); EXTERN void mm_mm_status (void); EXTERN void mm_mmr_auth_cnf (T_SIM_AUTHENTICATION_CNF *sim_auth_cnf); EXTERN void mm_mmr_nreg_req (UBYTE nreg_cause, UBYTE detach_done); EXTERN void mm_mmr_reg_req (UBYTE func); EXTERN void mm_tmsi_realloc_cmd (T_D_TMSI_REALLOC_CMD *tmsi_realloc_cmd); EXTERN void mm_cm_service_prompt (T_D_CM_SERVICE_PROMPT *cm_service_prompt); EXTERN void mm_mm_information (T_D_MM_INFORMATION *mm_information); /* * mobility management procedures */ EXTERN void mm_auto_net_reg (void); EXTERN void mm_abort_connection (UBYTE abcs); EXTERN void mm_attach_loc_upd (void); EXTERN void mm_build_auth_res (T_SIM_AUTHENTICATION_CNF *sim_auth_cnf, T_U_AUTH_RES *auth_res); EXTERN void mm_build_ident_res (UBYTE id_type, T_U_IDENT_RES *ident_res); EXTERN void mm_build_mm_status (UBYTE cause, T_B_MM_STATUS *mm_status); EXTERN void mm_build_rr_sync_req_mode (void); EXTERN void mm_build_rr_sync_req_cause (USHORT cause); EXTERN void mm_build_rr_sync_req_ciph (void); EXTERN void mm_build_rr_sync_req (T_MSG_TYPE ciph); EXTERN void mm_build_rr_sync_req_tmsi (void); EXTERN void mm_build_rr_sync_hplmn_req (void); EXTERN void mm_check_error_flag (void); EXTERN BOOL mm_check_critical_error (void); EXTERN BOOL mm_send_status_on_error (void); EXTERN void mm_clear_mob_ident (T_imsi_struct *mob_ident); EXTERN void mm_clear_reg_data (void); EXTERN void mm_copy_rr_act_cnf_data (T_RR_ACTIVATE_CNF *rr_activate_cnf); EXTERN SHORT mm_count_connections (UBYTE conn_type); EXTERN void mm_create_est_message (USHORT est_cause, UBYTE service, UBYTE ti, USHORT *bit_size_message); EXTERN void mm_create_imsi_detach_message (void); EXTERN void mm_delete_entry (UBYTE comp, UBYTE ti); EXTERN void mm_init (void); EXTERN UBYTE mm_calculate_digits (const UBYTE *digits); EXTERN void mm_loc_upd_rej (void); EXTERN void mm_lup_restart (void); EXTERN void mm_mdl_rel_req (void); EXTERN void mm_mdl_rel_req_sapi_3 (void); EXTERN void mm_mmsms_rel_ind (USHORT cause, UBYTE conn_typ); EXTERN SHORT mm_mmxx_err_ind (USHORT cause); EXTERN void mm_mmxx_est_cnf (void); EXTERN void mm_mmxx_release_ind (UBYTE comp, UBYTE ti, USHORT relcs); EXTERN void mm_mmxx_rel_ind (USHORT cause, UBYTE conn_typ); EXTERN void mm_normal_loc_upd (void); EXTERN void mm_periodic_loc_upd (void); EXTERN void mm_power_off (void); EXTERN USHORT mm_random (USHORT n); EXTERN void mm_read_entry (void); EXTERN void mm_reest (UBYTE ti); EXTERN void mm_release_rr_connection (UBYTE resumption); EXTERN void mm_rr_act_req (void); EXTERN void mm_rr_data_req (USHORT est_cause, UBYTE service, UBYTE ti); EXTERN void mm_rr_est_req (USHORT est_cause, UBYTE service, UBYTE ti); EXTERN void mm_start_loc_upd (UBYTE lup_type); EXTERN void mm_continue_running_update (void); EXTERN void mm_start_net_req (void); EXTERN void mm_start_t3212_bcch (void); EXTERN void mm_change_t3212 (void); EXTERN void mm_use_entry (void); EXTERN void mm_write_entry (UBYTE comp, UBYTE ti, USHORT est_cs, U8 content_type, void* primitive, U8 info); EXTERN BOOL mm_check_lai (const T_loc_area_ident * lai1, const T_loc_area_ident * lai2); EXTERN BOOL mm_check_lai_from_RR (const T_loc_area_ident * lai1, const T_plmn * plmn2, USHORT lac2); EXTERN BOOL mm_normal_upd_needed (void); EXTERN BOOL mm_attach_upd_needed (void); EXTERN BOOL mm_periodic_upd_needed (void); EXTERN BOOL mm_set_follow_on_request (void); EXTERN void mm_end_of_detach (void); EXTERN UBYTE mm_get_service_state (void); EXTERN BOOL mm_full_service_pplmn_scan (void); /* Implements Measure 29 and streamline encoding */ EXTERN void mm_send_status (UBYTE cause); /* * Registration */ /* * registration primitives and functions */ #ifndef GPRS EXTERN void reg_mmr_net_req (T_MMR_NET_REQ *mmr_net_req); EXTERN void reg_mmr_nreg_req (T_MMR_NREG_REQ *mmr_nreg_req); EXTERN void reg_mmr_plmn_mode_req (T_MMR_PLMN_MODE_REQ *plmn_mode_req); EXTERN void reg_mmr_plmn_res (T_MMR_PLMN_RES *mmr_plmn_res); EXTERN void reg_mmr_reg_req (T_MMR_REG_REQ *mmr_reg_req); #endif /* GPRS */ EXTERN void mm_func_mmgmm_net_req (void); EXTERN void mm_func_mmgmm_nreg_req (UBYTE detach_cause, UBYTE detach_done, USHORT cs); EXTERN void mm_func_mmgmm_plmn_mode_req (UBYTE mode); EXTERN void mm_func_mmgmm_plmn_res (const T_plmn *plmn, UBYTE reg_type, UBYTE mobile_class); EXTERN void mm_func_mmgmm_reg_req (UBYTE service_mode, UBYTE reg_type, UBYTE mobile_class, UBYTE bootup_act); EXTERN void reg_sim_auth_cnf (T_SIM_AUTHENTICATION_CNF *sim_auth_cnf); EXTERN void reg_sim_mm_insert_ind (T_SIM_MM_INSERT_IND *sim_mm_insert_ind); EXTERN void reg_sim_remove_ind (T_SIM_REMOVE_IND *sim_remove_ind); EXTERN void reg_sim_mm_info_ind (T_SIM_MM_INFO_IND *sim_mm_info_ind); EXTERN void reg_sim_file_upd_ind (T_SIM_FILE_UPDATE_IND *file_upd); EXTERN void reg_sim_read_cnf (T_SIM_READ_CNF *sim_read_cnf); EXTERN void reg_sim_sync_cnf (T_SIM_SYNC_CNF *sim_sync_cnf); EXTERN void reg_send_sim_sync_req (void); /* * registration signalling */ EXTERN void reg_mmr_auth_ind (T_SIM_AUTHENTICATION_REQ *sim_auth_req); EXTERN void reg_mm_success (UBYTE service); EXTERN void reg_mm_failure (UBYTE forb_ind); EXTERN void reg_net_list (const T_RR_ABORT_IND *rr_abort_ind); EXTERN void reg_mm_cell_selected (void); /* * registration procedures */ EXTERN BOOL reg_best_plmn_in_country (const T_plmn *bcch_plmn); EXTERN void reg_check_hplmn_tim (UBYTE decihours); EXTERN void reg_build_sim_update (void); EXTERN void reg_copy_sim_data (const T_SIM_MM_INSERT_IND *sim_mm_insert_ind); EXTERN void reg_create_plmn_list (const T_RR_ABORT_IND *rr_abort_ind, UBYTE include_flag); EXTERN void reg_extract_hplmn (T_plmn *plmn); EXTERN void reg_init (void); EXTERN void reg_plmn_add_bad (UBYTE *forb_plmn_list, USHORT list_size, const T_plmn *plmn); EXTERN void reg_plmn_bad_del (UBYTE *forb_plmn_list, USHORT list_size, const T_plmn *plmn); EXTERN BOOL reg_plmn_empty (const T_plmn *plmn); EXTERN BOOL reg_sim_ef_plmn_field_empty (UBYTE *plmn); EXTERN BOOL reg_plmn_equal_sim (const T_plmn *bcch_plmn, const T_plmn *sim_plmn); #ifdef REL99 EXTERN BOOL reg_read_plmn_present (UBYTE* plmn_bytes); EXTERN BOOL reg_read_plmn_support_acctec(UBYTE* plmn_bytes); #endif EXTERN BOOL reg_plmn_equal_eqv (const T_plmn *bcch_plmn, const T_plmn *req_plmn); EXTERN BOOL reg_plmn_is_NA_plmn (const T_plmn *bcch_plmn); EXTERN BOOL reg_plmn_equal_hplmn (const T_plmn *bcch_plmn); EXTERN BOOL reg_plmn_equal_rplmn (T_plmn *plmn); EXTERN BOOL reg_imsi_equal (const T_imsi_struct *imsi1, const T_imsi_struct *imsi2); EXTERN void reg_plmn_select (UBYTE forb_ind); EXTERN void reg_read_bcch_info (const T_SIM_MM_INSERT_IND *sim_mm_insert_ind); EXTERN BOOL reg_sim_files_to_be_read (const T_SIM_MM_INSERT_IND *sim_mm_insert_ind); EXTERN void reg_read_forb_plmn (const T_forb_plmn *forb_plmn); EXTERN void reg_read_imsi (T_imsi_struct *imsi_struct, const T_imsi_field *imsi_field); EXTERN void reg_read_kc_cksn (const T_SIM_MM_INSERT_IND *sim_mm_insert_ind); EXTERN void reg_read_loc_info (const T_loc_info *loc_info); EXTERN void reg_read_pref_plmn (UBYTE* data, USHORT length); #ifdef REL99 EXTERN void reg_read_ucps_acctec (UBYTE* data, USHORT length); EXTERN void reg_read_ocps_acctec (UBYTE* data, USHORT length); #endif EXTERN void reg_copy_sim_ahplmn (const T_SIM_MM_INSERT_IND *sim_mm_insert_ind); EXTERN void reg_set_bcch_info (T_SIM_MM_UPDATE_REQ *sim_mm_update_req); EXTERN void reg_set_forb_plmns (T_SIM_MM_UPDATE_REQ *sim_mm_update_req); EXTERN void reg_set_kc (T_SIM_MM_UPDATE_REQ *sim_mm_update_req); EXTERN void reg_set_loc_info (T_SIM_MM_UPDATE_REQ *sim_mm_update_req); EXTERN void reg_set_pref_plmns (T_SIM_MM_UPDATE_REQ *sim_mm_update_req); // ##### EXTERN void reg_clear_plmn (T_plmn *plmn); EXTERN BOOL reg_clear_plmn_list (UBYTE *plmn_list, USHORT list_size); EXTERN void reg_unpack_plmn (T_plmn *plmn, const UBYTE *packed, USHORT index); EXTERN void reg_pack_plmn (UBYTE *packed, USHORT index, const T_plmn *plmn); EXTERN BOOL reg_plmn_in_list (const UBYTE *forb_plmn_list, USHORT list_size, const T_plmn *plmn); EXTERN void reg_rr_failure (T_RR_ABORT_IND *rr_abort_ind); EXTERN BOOL reg_read_next_sim_file (void); EXTERN void reg_end_of_deregistration (UBYTE nreg_cause, UBYTE service); #ifdef REL99 EXTERN void reg_invalidate_upd_state (UBYTE new_update_state, BOOL tmsi_cksn_kc_not_deleted); #else EXTERN void reg_invalidate_upd_state (UBYTE new_update_state); #endif GLOBAL void reg_select_network (const T_plmn *plmn); EXTERN BOOL reg_plmn_in_pref_list (const T_plmn *plmn); EXTERN BOOL reg_same_country_plmn (const T_plmn *plmn1, const T_plmn *plmn2); EXTERN void reg_check_plmn_search (USHORT cause, const T_RR_ABORT_IND *rr_abort_ind); EXTERN void reg_check_hplmn_tim (UBYTE decihours); EXTERN void reg_stop_hplmn_tim (void); /* * Equivalent plmn procedures */ EXTERN BOOL reg_store_eqv_plmns (T_eqv_plmn_list *eqv_plmn_list, T_plmn *plmn); EXTERN void reg_read_acting_hplmn (const U8 acting_hplmn[]); EXTERN BOOL valid_acting_hplmn (T_plmn *acting_hplmn); GLOBAL void mm_read_ffs_init (void); GLOBAL void mm_write_eplmn_to_ffs (void); GLOBAL void mm_display_eplmn (void); GLOBAL void mm_reset_ffs (void); GLOBAL BOOL mm_read_ffs (void); GLOBAL void check_if_cingular_sim (void); /* * Formatter */ /* * formatter primitives */ #if 0 /* Not referenced */ EXTERN void for_init_mm_data (void); #endif /* #if 0 */ EXTERN void for_rr_data_ind (T_RR_DATA_IND *rr_data_ind); /* * formatter signalling */ /* * If all entities are linked into one module this definitions * prefixes the global data with the enity name */ #ifdef OPTION_MULTITHREAD #define for_est_req _ENTITY_PREFIXED(for_est_req) #endif /*OPTION_MULTITHREAD*/ EXTERN void for_cm_message (T_RR_DATA_REQ *rr_data_req); EXTERN void for_data_req (USHORT bit_size_message); EXTERN void for_est_req (USHORT est_cause, USHORT bit_size_message); /* * formatter procedures */ /* * If all entities are linked into one module this definitions * prefixes the global data with the enity name */ #ifdef OPTION_MULTITHREAD #define for_check_mobile_identity _ENTITY_PREFIXED(for_check_mobile_identity) #endif /*OPTION_MULTITHREAD*/ EXTERN BOOL for_check_identity_type (UBYTE id); EXTERN BOOL for_check_mobile_identity (T_mob_id *mob_ident); EXTERN UBYTE for_check_reject_cause (UBYTE cause); EXTERN void mm_for_set_error (U8 cause); #if 0 /* Not referenced; body bag; 02.10.2003 */ EXTERN void for_set_mandatory_error (void); EXTERN void for_set_content_error (void); EXTERN void for_set_optional_error (UBYTE iei); #endif /* #if 0 */ /* * csf procedures */ EXTERN void csf_read_mobile_class_1 (T_mob_class_1 *mob_class_1); EXTERN void csf_read_mobile_class_2 (T_mob_class_2 *mob_class_2); EXTERN void csf_read_imei (T_imsi_struct *imei_struct); /* * timer procedures */ EXTERN void tim_t3210 (void); EXTERN void tim_t3211 (void); EXTERN void tim_t3212 (void); EXTERN void tim_t3213 (void); EXTERN void tim_t3220 (void); EXTERN void tim_t3230 (void); EXTERN void tim_t3240 (void); #ifdef REL99 EXTERN void tim_t3241 (void); #endif EXTERN void tim_t_reg (void); EXTERN void tim_t_hplmn (void); /* * timer */ #if defined (NEW_FRAME) #define TIMERSTART(i,v) tim_start_timer (i, v) #define TIMERSTOP(i) tim_stop_timer (i) #define TIMERACTIVE(i) (mm_data->t_running[i]) #else #define TIMERSTART(t, v) csf_alloc_timer (t, v, &mm_data->t_handle[t]) #define TIMERSTOP(t) \ { csf_free_timer (mm_data->t_handle[t]); mm_data->t_handle[t] = VSI_ERROR; } #define TIMERACTIVE(t) (mm_data->t_handle[t] NEQ VSI_ERROR) #define T_TIME T_VSI_TVALUE #endif /*(NEW_FRAME)*/ #ifdef GPRS /* * Prototypes for the primitive interface MMGMM (MM to GMM) */ EXTERN void mm_send_mmgmm_reg_cnf (UBYTE bootup_cause); EXTERN void mm_mmgmm_reg_cnf (void); EXTERN void mm_mmgmm_nreg_ind (UBYTE service, UBYTE search_running, UBYTE forb_ind); EXTERN void mm_mmgmm_nreg_cnf (UBYTE detach_cause); EXTERN void mm_mmgmm_plmn_ind (USHORT cause, const T_RR_ABORT_IND *rr_abort_ind); EXTERN void mm_mmgmm_ahplmn_ind (T_plmn *acting_hplmn); #else /* * Prototypes for the primitive interface MMR (MM to ACI) */ EXTERN void reg_send_mmr_reg_cnf (UBYTE bootup_cause); EXTERN void reg_build_mmr_reg_cnf (void); EXTERN void reg_build_mmr_nreg_ind (UBYTE service, UBYTE search_running, UBYTE forb_ind); EXTERN void reg_build_mmr_nreg_cnf (UBYTE detach_cause); EXTERN void reg_build_mmr_plmn_ind (USHORT cause, const T_RR_ABORT_IND *rr_abort_ind); EXTERN void reg_build_mmr_ahplmn_ind (T_plmn *acting_hplmn); /* * By using this definitions, we avoid having a lot of ifdefs * in the code itself. */ #define mm_send_mmgmm_reg_cnf(b) reg_send_mmr_reg_cnf(b) #define mm_mmgmm_reg_cnf() reg_build_mmr_reg_cnf() #define mm_mmgmm_nreg_ind(a,b,c) reg_build_mmr_nreg_ind(a,b,c) #define mm_mmgmm_nreg_cnf(detach_cause) reg_build_mmr_nreg_cnf(detach_cause) #define mm_mmgmm_plmn_ind(cause,ab) reg_build_mmr_plmn_ind(cause,ab) #define mm_mmgmm_ahplmn_ind(ahplmn) reg_build_mmr_ahplmn_ind(ahplmn) #endif /* GPRS */ #ifdef GPRS /* * These functions are only used in the GPRS protocol stack. */ EXTERN void mm_mmgmm_auth_rej_ind (void); EXTERN void mm_mmgmm_cm_establish_ind (void); EXTERN void mm_mmgmm_cm_emergency_ind (void); EXTERN void mm_mmgmm_cm_release_ind (UBYTE resumption); EXTERN void mm_mmgmm_activate_ind (UBYTE status); EXTERN void mm_mmgmm_t3212_val_ind (void); EXTERN void mm_mmgmm_lup_accept_ind (void); EXTERN void mm_mmgmm_lup_needed_ind (UBYTE reason); EXTERN void mm_mmgmm_tmsi_ind (ULONG tmsi); #else /* * Define the functions only needed in GPRS to nothing. * This will help the compiler's optimizer to generate * efficient code for a GSM only protocol stack. */ #define mm_mmgmm_auth_rej_ind() #define mm_mmgmm_cm_establish_ind() #define mm_mmgmm_cm_emergency_ind() #define mm_mmgmm_cm_release_ind(resumption) #define mm_mmgmm_activate_ind(status) #define mm_mmgmm_t3212_val_ind() #define mm_mmgmm_lup_accept_ind(plmn, lac) #define mm_mmgmm_lup_needed_ind(reason) #define mm_mmgmm_tmsi_ind(tmsi) /* * There are some additional parameters in some function calls which * are only used by GPRS. This have no meaning for GSM, but it is undesirable * to #ifdef out all places where they are used, so they will be defined here. */ #define MMGMM_RESUMPTION_FAILURE 1 #define MMGMM_PERFORM_DETACH 0 #define REG_GPRS_INACTIVE 0 #define MMGMM_NO_ERROR 0xff #define MMGMM_CLASS_CC 5 #endif /* else, #ifdef GPRS */ EXTERN T_MM_DATA mm_data_base; #define GET_INSTANCE_DATA register T_MM_DATA *mm_data= &mm_data_base /* * If all entities are linked into one module this definitions * prefixes the global data with the enity name */ #ifdef OPTION_MULTITHREAD #if defined (TI_PS_HCOMM_CHANGE) #else #define hCommMMI _ENTITY_PREFIXED(hCommMMI) #define hCommCC _ENTITY_PREFIXED(hCommCC) #define hCommSS _ENTITY_PREFIXED(hCommSS) #define hCommSMS _ENTITY_PREFIXED(hCommSMS) #define hCommRR _ENTITY_PREFIXED(hCommRR) #define hCommDL _ENTITY_PREFIXED(hCommDL) #define hCommSIM _ENTITY_PREFIXED(hCommSIM) #endif #endif /* OPTION_MULTITHREAD */ #if defined (NEW_FRAME) #if defined (TI_PS_HCOMM_CHANGE) #else EXTERN T_HANDLE hCommMMI; /* MMI Communication */ EXTERN T_HANDLE hCommCC; /* CC Communication */ EXTERN T_HANDLE hCommSS; /* SS Communication */ EXTERN T_HANDLE hCommSMS; /* SMS Communication */ EXTERN T_HANDLE hCommRR; /* RR Communication */ EXTERN T_HANDLE hCommDL; /* DL Communication */ EXTERN T_HANDLE hCommSIM; /* SIM Communication */ #endif /* (TI_PS_HCOMM_CHANGE) */ EXTERN T_HANDLE mm_handle; #else #if defined (TI_PS_HCOMM_CHANGE) #else EXTERN T_VSI_CHANDLE hCommMMI; /* MMI Communication */ EXTERN T_VSI_CHANDLE hCommCC; /* CC Communication */ EXTERN T_VSI_CHANDLE hCommSS; /* SS Communication */ EXTERN T_VSI_CHANDLE hCommSMS; /* SMS Communication */ EXTERN T_VSI_CHANDLE hCommRR; /* RR Communication */ EXTERN T_VSI_CHANDLE hCommDL; /* DL Communication */ EXTERN T_VSI_CHANDLE hCommSIM; /* SIM Communication */ #endif /* (TI_PS_HCOMM_CHANGE) */ EXTERN T_VSI_THANDLE mm_act_handle; #endif /*NEW FRAME*/ /* * 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 /*OPTION_MULTITHREAD*/ EXTERN UBYTE _decodedMsg []; #ifdef OPTION_TIMER /* * If all entities are linked into one module this definitions * prefixes the global data with the entity name */ #ifdef OPTION_MULTITHREAD #define partab _ENTITY_PREFIXED(partab) #endif /*OPTION_MULTITHREAD*/ EXTERN const KW_DATA partab[]; #endif /*OPTION_TIMER*/ #ifndef _TMS470 int sprintf( char *buffer, const char *format, ... ); #define Sprintf sprintf #endif /*_TMS470*/ #endif