view gsm-fw/g23m-gsm/sms/sms.h @ 673:2f7df7a314f8

gsm-fw/g23m-gsm subtree: initial import from LoCosto source
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Sun, 28 Sep 2014 23:20:04 +0000
parents
children
line wrap: on
line source

/* 
+----------------------------------------------------------------------------- 
|  Project :  GSM-PS (8410)
|  Modul   :  SMS
+----------------------------------------------------------------------------- 
|  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
|             Short Message Service
+----------------------------------------------------------------------------- 
*/ 

#ifndef SMS_H
#define SMS_H

#include <stdio.h>
#ifdef TI_PS_HCOMM_CHANGE
#include "cl_hComm_handle.h"
#endif

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

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

/*
 * Definition whether a shared CCD buffer shall be used
 */
/* #undef SHARED_CCD_BUF  */

#ifndef _TARGET_

#define FF_CPHS   /* This flag is only required for SIMULATION defined in .xml file,
                     to remove the redefinition warning put under comment */
#endif /* _TARGET_ */

#define FF_SMS_23430

#if defined(FF_SMS_23430)
#define FF_SMS_NW_RCG_SIM
#endif

/*==== MACROS =====================================================*/

#if FALSE
#define SMS_SDU_COPY(_d_,_s_,_t_) memcpy(_d_,_s_,\
                     (offsetof(T_##_t_,sdu)+offsetof(T_sdu,buf)+\
                      BYTELEN(D_SDU_OFF(_s_)+D_SDU_LEN(_s_))))
#else
#define SMS_SDU_COPY(_d_,_s_,_t_) memcpy(&(_d_)->sdu,&(_s_)->sdu,\
                     offsetof(T_sdu,buf)+\
                     BYTELEN(D_SDU_OFF(_s_)+D_SDU_LEN(_s_)))
#endif

#define GET_SMS_INSTANCE(ti)     csf_get_sms_instance(ti)
#define GET_NEW_SMS_INSTANCE(ti) csf_get_new_sms_instance(ti)
#define FREE_SMS_INSTANCE(ti)    csf_free_sms_instance(ti)
#define GET_MO_INSTANCE(_sd_)    ((_sd_)->inst = INST_MO)
#define GET_MT_INSTANCE(_sd_)    ((_sd_)->inst = INST_MT)

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

#define CMMS_ACTIVE ((sms_data->cmms_mode EQ CMMS_MODE_ONE) \
                       OR (sms_data->cmms_mode EQ CMMS_MODE_TWO))

/*==== CONSTANTS ==================================================*/

#define DISPLAY 0
#define IGNORE  0xFE      // return RP-ACK if handled unsuccessfully
#define NOTHING 0xFF      // return RP-ERROR if handled unsuccessfully

#define MAX_SMS_CALLS    2

#define INST_MO 0
#define INST_MT 1

#define SMS_INST         sms_data->data[sms_data->inst]

#define ENTITY_DATA      sms_data

/*
 * Recognition of certain networks (SIM opearators)
 */

#define NW_SIM_NONE      0       /* no special network given */
#define NW_SIM_23430     1       /* SIM provided by operator 234-30 */

/*
 * Dynamic Configuration Numbers
 */
enum
{
   SMS_CONF_EVENT_TIMER_SET        = 1,
   SMS_CONF_EVENT_TIMER_RESET      = 2,
   SMS_CONF_EVENT_TIMER_SPEED_UP   = 3,
   SMS_CONF_EVENT_TIMER_SLOW_DOWN  = 4,
   SMS_CONF_EVENT_TIMER_SUPPRESS   = 5,
   SMS_CONF_EVENT_PAUSE            = 6,
   SMS_CONF_EVENT_RESUME           = 7,

   SMS_CONF_EVENT_END,
   SMS_CONF_EVENT_MAX = (SMS_CONF_EVENT_END - 1)
};
typedef UBYTE SMS_CONF_EVENT_ENUM_TYPE;

/*
 * Timer definitions, MAX_SMS_TIMER
 *
 * Description :  The constants defines the timers and the number of timers
 *                available in the timer pool.
 * Note        :  One CP and one RL timer per instance.
 */
#define TC1M             0
#define TR1M             1
#define TR2M             2
#define TRAM             3
#define TLCT             4   /* concatenation timer */
#define TMMS             5   /* CMMS Timer */
#define MAX_SMS_TIMER    6

/*
 * Protocoldiscriminator SMS
 */
#define ENCODE_OFFSET    32
#define BSIZE_TI_PD      8

/*
 * Protocoldiscriminator SMS
 */
#define PD_SMS           9

/*
 * Max size of SMS-message
 */
#define MAX_SMS_MESSAGE_SIZE           (MAX_BITSTREAM_LEN_SMS>>3)

/*
 * Max size of TP user data
 */
#define MAX_CHARACTERS_TPUD            141

/*
 * Max size of sim-sms-record
 */
#define SIM_LENGTH_SMS_RECORD          176

/*
 * access values
 */
#define ACCESS_EMPTY                   0

/*
 * length of U_CP_DATA
 */
#define LEN_U_CP_DATA  (252*8)

/*
 * Max length of D_CP_USER_DATA
 */
#define MAX_LEN_CP_USER_DATA  249
#define MIN_CP_LEN 3
#define MIN_CP_ACK_LEN 2

/*
 * constants for GSMS: active downlink
 */
#if defined (GPRS)
#define SMS_DOWNLINK_NONE              0  /* no downlink assigned yet             */
#define SMS_DOWNLINK_MMSMS             1  /* downlink is MM using SAP MMSMS       */
#define SMS_DOWNLINK_LL_CHECK          2  /* downlink LL is being checked         */
#define SMS_DOWNLINK_LL                3  /* downlink is LL, registered           */

/*
 * constants for GSMS: LLC flow control
 */
#define SMS_LLC_UNKNOWN             0x00
#define SMS_LLC_AVAILABLE           0x01
#define SMS_LLC_BUSY                0x02   /* LLC is busy, no instance waiting    */
#define SMS_LLC_BUSY_WAITING        0x03   /* LLC is busy and instance is waiting */

/* constants for GSMS: SMS entity flow control status towards LLC */
#define SMS_FLOW_UNKNOWN            0x00
#define SMS_FLOW_AVAILABLE          0x01  /* availability of SMS signalled to LLC */
#define SMS_FLOW_BUSY               0x02  /* SMS entity is busy */

/* cp type of acknowledgement to be sent */
#define SMS_CP_NONE                 0x00
#define SMS_CP_ACK                  0x01
#define SMS_CP_ERROR                0x02
#endif /* GPRS */

/*
 * a modified version of the S/GET_STATE macros for tracing SMS_INST states
 */
#ifdef NTRACE
  #define SMS_INST_SET_STATE(PROCESS,STATE)    SMS_INST.state[PROCESS] = STATE
  #define SMS_INST_GET_STATE(PROCESS)          SMS_INST.state[PROCESS]
#else
  #define SMS_INST_SET_STATE(PROCESS,STATE)\
              { vsi_o_strace (VSI_CALLER\
                              PROCESS_NAME_SMS_INST[PROCESS],\
                              PROCESS##_NAME [ SMS_INST.state[PROCESS] ],\
                              PROCESS##_NAME [          STATE          ]);\
                SMS_INST.state[PROCESS] = (STATE); }
  #define SMS_INST_GET_STATE(PROCESS)\
                vsi_o_strace (VSI_CALLER\
                              PROCESS_NAME_SMS_INST[PROCESS],\
                              PROCESS##_NAME [ SMS_INST.state[PROCESS] ],\
                                                        NULL           ),\
                                               SMS_INST.state[PROCESS]
#endif /* else, #ifdef NTRACE */

/*
 * CP States
 */
#define CP_IDLE                        0  /* 3gpp, MO+MT */
#define CP_MM_CONNECTION_PENDING       1  /* 3gpp, MO    */
#define CP_WAIT_FOR_ACK                2  /* 3gpp, MO+MT */
#define CP_MM_CONNECTION_ESTABLISHED   3  /* 3gpp, MO+MT */

#if defined (GPRS)
/*
 * CP States for GSMS
 */
#define CP_GSMS_IDLE                   4  /* 3gpp */
#define CP_GSMS_MO_WAIT_FOR_CP_ACK     5  /* 3gpp */
#define CP_GSMS_MT_WAIT_FOR_CP_ACK     6  /* 3gpp */
#define CP_GSMS_MO_WAIT_FOR_CP_DATA    7  /* 3gpp */
#define CP_GSMS_MT_WAIT_FOR_RP_ACK     8  /* 3gpp */
#endif /* GPRS */

#if defined (GPRS)
EXTERN  const char * const
        STATE_CP_NAME[];
#define STATE_CP_NAME_INIT             \
       "CP_IDLE",                      \
       "CP_MM_CONNECTION_PENDING",     \
       "CP_WAIT_FOR_ACK",              \
       "CP_MM_CONNECTION_ESTABLISHED", \
       "CP_GSMS_IDLE",                 \
       "CP_GSMS_MO_WAIT_FOR_CP_ACK",   \
       "CP_GSMS_MT_WAIT_FOR_CP_ACK",   \
       "CP_GSMS_MO_WAIT_FOR_CP_DATA",  \
       "CP_GSMS_MT_WAIT_FOR_RP_ACK"
#else
EXTERN  const char * const
        STATE_CP_NAME[];
#define STATE_CP_NAME_INIT             \
       "CP_IDLE",                      \
       "CP_MM_CONNECTION_PENDING",     \
       "CP_WAIT_FOR_ACK",              \
       "CP_MM_CONNECTION_ESTABLISHED"
#endif

/*
 * RL States
 */
#define RL_IDLE                        0  /* 3gpp */
#define RL_WAIT_FOR_ACK                1  /* 3gpp */
#define RL_WAIT_FOR_SMMA_ACK           2  /* TI */
#define RL_WAIT_FOR_SEND_ACK           3  /* 3gpp */
#define RL_WAIT_FOR_RETRANS_TIMER      4  /* 3gpp */
#define RL_ESTABLISH                   5  /* TI */
#define RL_ESTABLISHED                 6  /* TI */
#define RL_WAIT_FOR_SEND_ERROR         7  /* TI */

EXTERN  const char * const
        STATE_RL_NAME[];
#define STATE_RL_NAME_INIT             \
       "RL_IDLE",                      \
       "RL_WAIT_FOR_ACK",              \
       "RL_WAIT_FOR_SMMA_ACK",         \
       "RL_WAIT_FOR_SEND_ACK",         \
       "RL_WAIT_FOR_RETRANS_TIMER",    \
       "RL_ESTABLISH",                 \
       "RL_ESTABLISHED",               \
       "RL_WAIT_FOR_SEND_ERROR"

/*
 * TL States
 */
#define TL_IDLE                        0
#define TL_SEND                        1
#define TL_COMMAND                     2
#define TL_RECEIVE                     3
#define TL_OTHER                       4
#define TL_ESTABLISH                   5
#define TL_SEND_CONTD                  6

EXTERN  const char * const
        STATE_TL_NAME[];
#define STATE_TL_NAME_INIT             \
       "TL_IDLE",                      \
       "TL_SEND",                      \
       "TL_COMMAND",                   \
       "TL_RECEIVE",                   \
       "TL_OTHER",                     \
       "TL_ESTABLISH",                 \
       "TL_SEND_CONTD"                 

/*
 * SMS manages 3 (MAX_STATE_SMS_INST) states per SMS_INST: CP, RL, TL
 */
#define STATE_CP                       0
#define STATE_RL                       1
#define STATE_TL                       2
#define MAX_STATE_SMS_INST             3

EXTERN  const char * const
        PROCESS_NAME_SMS_INST[];
#define PROCESS_NAME_SMS_INST_INIT     \
       "STATE_CP"   ,                  \
       "STATE_RL"   ,                  \
       "STATE_TL"

/*
 * A definition of the states of SMS_INST is provided in SMS_PEI.C
 */
#if defined(SMS_PEI_C) && ! defined(NTRACE)
  GLOBAL const char * const          STATE_CP_NAME[] = {          STATE_CP_NAME_INIT };
  GLOBAL const char * const          STATE_RL_NAME[] = {          STATE_RL_NAME_INIT };
  GLOBAL const char * const          STATE_TL_NAME[] = {          STATE_TL_NAME_INIT };
  GLOBAL const char * const  PROCESS_NAME_SMS_INST[] = {  PROCESS_NAME_SMS_INST_INIT };
#endif

/*
 * MMI States
 */
#define MMI_IDLE                       0
#define MMI_READ                       1
#define MMI_WRITE                      2
#define MMI_DELETE                     3
#define MMI_FIND_FIRST                 4
#define MMI_FIND_NEXT                  5
#define MMI_REPLACE                    6
#define MMI_STATE_UPDATE               7
#define MMI_READ_STATE_UPDATE          8 
#define MMI_RESUME                     9

/* N950 Memory Optimization - Implements Measure #39*/
EXTERN  T_S2I_STRING const
        STATE_MMI_NAME[];
/*
 * NET States
 */
#define NET_IDLE                       0
#define NET_WRITE                      1
#define NET_READ                       2
#define NET_23430_WRITE                3
#define NET_23430_DELETE               4

/* N950 Memory Optimization - Implements Measure #39*/
EXTERN  T_S2I_STRING const
        STATE_NET_NAME[];
/*
 * EST States - substates for connection establishment
 */
enum
{
        EST_IDLE                     = 0, /* no connection establishment */
        EST_SEND                     = 1, /* conn establishment for send */
        EST_RTX                      = 2, /* conn est for retransmission */
        EST_CMD                      = 3, /* conn est for command        */
        EST_SMMA                     = 4  /* conn est for smma message   */
};

/* N950 Memory Optimization - Implements Measure #39*/
EXTERN  T_S2I_STRING const
        STATE_EST_NAME[];
/*
 * SMS manages 3 (MAX_STATE) states: MMI, NET, EST
 */
#ifdef OPTION_MULTITHREAD
  #define PROCESS_NAME    _ENTITY_PREFIXED(PROCESS_NAME)
#endif

#define STATE_MMI                      0
#define STATE_NET                      1
#define STATE_EST                      2
#define MAX_STATE                      3

/* N950 Memory Optimization - Implements Measure #39*/
EXTERN  T_S2I_STRING const
        PROCESS_NAME[];
/*
 * A definition of the states is provided in SMS_PEI.C
 */
#if defined(SMS_PEI_C) && ! defined(NTRACE)
/* N950 Memory Optimization - Implements Measure #39*/
GLOBAL T_S2I_STRING const STATE_MMI_NAME[] = 
{

  S2I_STRING("MMI_IDLE"),             
  S2I_STRING("MMI_READ"),             
  S2I_STRING("MMI_WRITE"),            
  S2I_STRING("MMI_DELETE"),           
  S2I_STRING("MMI_FIND_FIRST"),       
  S2I_STRING("MMI_FIND_NEXT"),        
  S2I_STRING("MMI_REPLACE"),          
  S2I_STRING("MMI_STATE_UPDATE"),     
  S2I_STRING("MMI_READ_STATE_UPDATE"),
  S2I_STRING("MMI_RESUME")
};
#ifndef FF_SMS_23430
GLOBAL T_S2I_STRING const STATE_NET_NAME[] = 
{
  S2I_STRING("NET_IDLE"), 
  S2I_STRING("NET_WRITE"),
  S2I_STRING("NET_READ")
};
#else
GLOBAL T_S2I_STRING const STATE_NET_NAME[] = 
{
  S2I_STRING("NET_IDLE"),       
  S2I_STRING("NET_WRITE"),      
  S2I_STRING("NET_READ"),       
  S2I_STRING("NET_23430_WRITE"),
  S2I_STRING("NET_23430_DELETE")
};
#endif /* else, #ifndef FF_SMS_23430 */

GLOBAL T_S2I_STRING const STATE_EST_NAME[] = 
{

  S2I_STRING("EST_IDLE"),
  S2I_STRING("EST_SEND"),
  S2I_STRING("EST_RTX"), 
  S2I_STRING("EST_CMD"), 
  S2I_STRING("EST_SMMA")
};

GLOBAL T_S2I_STRING const   PROCESS_NAME[] = 
{

  S2I_STRING("MMI"),
  S2I_STRING("NET"),
  S2I_STRING("EST")
};
#endif

#define ACCESS_BY_MMI                  0x01
#define ACCESS_BY_NET                  0x02
#define ACCESS_BY_EST                  0x03

#define SIM_SMS_FREE                   (SMS_RECORD_FREE)
#define SIM_SMS_MT_READ                (SMS_RECORD_REC_READ)
#define SIM_SMS_MT_TO_BE_READ          (SMS_RECORD_REC_UNREAD)
#define SIM_SMS_MO_SENT                (SMS_RECORD_STO_SENT)
#define SIM_SMS_MO_TO_BE_SEND          (SMS_RECORD_STO_UNSENT)
#define SIM_SMS_PENDING                0xFF  /* new entry, not yet confirmed */

#define SMS_MAX_SIM_ACCESS     2

/*==== TYPES ======================================================*/

/*
 * IE Header Structure
 */
typedef struct
{
   UBYTE     iei;                   /* Information Element Identifier     */
   UBYTE     ie_length;             /* Length of Information Element      */
} T_SMS_PDU_IE_HDR;

/*
 * Conactenation header structure for 8 bit reference number
 */
typedef struct
{
   UBYTE     ref_nr;                /* Reference Number                   */
   UBYTE     max_nr;                /* Maximum number of short messages
                                       in the concatenated short message  */
   UBYTE     seq_nr;                /* Sequence number of the current 
                                                            short message */
} T_SMS_PDU_CONCAT_8BIT_HDR;

/*
 * Conactenation header structure for 16 bit reference number
 */
typedef struct
{
   USHORT    ref_nr;                /* Reference Number                   */
   UBYTE     max_nr;                /* Maximum Sequence Number            */
   UBYTE     seq_nr;                /* Sequence Number                    */
} T_SMS_PDU_CONCAT_16BIT_HDR;

/*
 * Conactenation header common structure
 */
typedef struct
{
   USHORT    ref_nr;                /* Reference Number                   */
   UBYTE     max_nr;                /* Maximum Sequence Number            */
   UBYTE     seq_nr;                /* Sequence Number                    */
} T_SMS_CONCAT_HDR;

typedef struct
{
  UBYTE      t_mode;
  ULONG      t_val;
} T_TIMER_CONFIG;


typedef struct
{
  T_MMSMS_DATA_REQ *mo_msg;
  T_sms_sdu      *sms_sdu;
  T_SIM_READ_RECORD_CNF *sim_read;
  UBYTE          state[MAX_STATE_SMS_INST];
  UBYTE          tl_retx;           /* Number of retransmissions on TL level */
#ifdef REL99
  UBYTE          failed_msg_retx;   /* stores whether MO msg is sent thru retransmission request */ 
  UBYTE          failed_msg_rec_num;/* stores record number of last failed msg */ 
  UBYTE          failed_msg_mem;    /* stores memory location of last failed msg */ 
#endif
  UBYTE          retx;
  UBYTE          retrans;
  UBYTE          msg_ref;
  UBYTE          ti;
  UBYTE          tp_mr;
  UBYTE          tp_mr_ret;         /* TP-MR to be returned to higher layer */

  /* cp_release_req() in state XXX_CP_WAIT_FOR_ACK received,
   * delay the release until the next CP state is entered. */
  BOOL           r_flag;
  /* CP_ACK pending: outstanding CP_ACK in outbound direction */
  BOOL           cp_ack_pending;
  UBYTE          act_mem;
  UBYTE          act_record;
  UBYTE          act_status;
  UBYTE          act_rdmode;
  UBYTE          act_condx;
  UBYTE          act_modifier;
  UBYTE          pid;
  UBYTE          dcs;
#if defined (GPRS)
  UBYTE          downlink;          /* downlink of this instance: LLC or MMSMS */
  UBYTE          ack_type;          /* type of message to be sent */
  UBYTE          cp_cause;          /* cause value of CP-ERROR to be sent */
  T_cp_user_data_dl *cp_user_data_dl;
#endif
  BOOL           t_running[MAX_SMS_TIMER];
} T_SMS_INST;

typedef struct
{
  UBYTE          *status_field;     /* status each record */
  UBYTE          *pid_field;        /* PID flag of each record */
  UBYTE           mem_type;         /* Type of used memory */
  UBYTE           max_record;       /* number of available records */
  UBYTE           any_valid;        /* at least one used record exists */
} T_BACKUP;

typedef struct
{
  /* SIM EF file identifier. path_info need not be stored as SMS is using 
   * only non-conflicting files 
   * Data-field identification
   */
  USHORT         datafield;
  /* record number, used only for linear fixed EFs */
  UBYTE          rec_num;
  /* flag indicating whether this entry is used */
  UBYTE          entry_used;  
} T_SMS_SIM_ACCESS_INFO;

/*
 * CONCATENATION CONTROL
 */
typedef struct
{
  BOOL           concatenation;    /* whether concatenated submits are
                                      currently processed                    */
  BOOL           release_pending;  /* release outstanding                    */
  BOOL           end;              /* end of concatenated stream             */
  BOOL           pad;              /*                                        */
  T_SMS_CONCAT_HDR nr;             /* current number                         */
} T_SMS_CONCAT_CNTRL;

/*
 * PAUSE RESUME CONTROL
 */
typedef struct
{
  U8             delivery_state;  /* pause or resume, SMS_DELIVER_STATUS_xxx */
  BOOL           mem_full_sent;   /* whether mem capacity exceeded
                                     message was sent to HLR due to
                                     user pause request                      */
  U16            save_cause;      /* safed cause value while sim updating    */
} T_SMS_PR_CNTRL;

typedef struct
{
  T_SMS_INST     data[MAX_SMS_CALLS];
  T_rp_data_dl  *rp_data_dl;        /* points to income RL data */
 /*
  * following is a hack: since we cannot pass values to timer we safe it here:
  */
  UBYTE          timer_ti;          /* TI for running timer */
  UBYTE          mhc;               /* message Handling compatibility */
  UBYTE          mt;
  UBYTE          ds;
  UBYTE          mem3;
  UBYTE          inst;
  UBYTE          ent_state;
  UBYTE          state[MAX_STATE];
  BOOL           mem_cap_avail;     /* as stated on SIM */
  UBYTE          access_fifo[2];
  UBYTE          sim_phase;         /* value of EF(Phase) */
  UBYTE          use_mem_a;
  UBYTE          use_mem_b;
  T_BACKUP       me_backup;
  T_BACKUP       sim_backup;
  
  /* In the ME status field a backup of the SMS status is stored, 
   * the ME PID field is a bitarray which stores whether a given 
   * SMS is of the replacement type or not.
   * For asynchronous memory those fields are mandatory, for 
   * synchronous memory the backup is optional.
   */
  /* UBYTE          me_status_field [MAX_RECORD_ME]; */
  /* UBYTE          me_pid_field [(MAX_RECORD_ME+7)/8]; */
  UBYTE          sim_status_field [MAX_RECORD_SIM];
  UBYTE          sim_pid_field[(MAX_RECORD_SIM+7)/8];

  /* SMS entity has finished reading SMS entries from the SIM. */
  BOOL           init_done;

  /* SMS entries changed by SAT, not begun reading records from the SIM. */
  BOOL           sim_mem_update;

  /* concatenation control field  */
  T_SMS_CONCAT_CNTRL concat_cntrl;
  /* pause resume control field   */
  T_SMS_PR_CNTRL pr_cntrl;

  UBYTE          nw_spec;
#ifdef FF_CPHS
  UBYTE          cphs_sim;          /* CPHS SIM recognized */
#endif
#ifdef SIM_TOOLKIT
  UBYTE          download_sms;
  T_SIM_FILE_UPDATE_IND *file_update_ind;
  /* MMI state backup */
  UBYTE stored_mmi_state;
  /* Backup the read_cnf primitive */
  T_SIM_READ_RECORD_CNF *stored_read_cnf;
#endif /* #ifdef SIM_TOOLKIT */
#if defined (GPRS)
  UBYTE          mo_dst_pref;       /* preferred dest. (GPRS/CCT) for MO SM */
  UBYTE          llc_flow;          /* LLC flow control */
  UBYTE          sms_flow;          /* SMS entity flow control */
#endif
  /* To indicate that release is pending for the previous connection */
  BOOL           cmms_release_pending;
  UBYTE          cmms_mode;
  T_TIME timer_values[MAX_SMS_TIMER];
  /* Used to store information on the SIM Accesses that are currently happening. 
   * The array is indexed by the req_id that was sent in SIM_XXX_REQ */
  T_SMS_SIM_ACCESS_INFO    sms_sim_access_info[SMS_MAX_SIM_ACCESS];
} T_SMS_DATA;

/*==== MACROS =====================================================*/

#define DATA_INST(_sd_)         ((_sd_)->data[(_sd_)->inst])

#define SMS_STATE(_sd_)         (DATA_INST(_sd_).state)
#define SMS_RETX(_sd_)          (DATA_INST(_sd_).retx)
#define SMS_RETRANS(_sd_)       (DATA_INST(_sd_).retrans)
#define SMS_CP_REF(_sd_)        (DATA_INST(_sd_).ti)
#define SMS_RP_REF(_sd_)        (DATA_INST(_sd_).msg_ref)
#define SMS_TP_REF(_sd_)        (DATA_INST(_sd_).tp_mr)
#define SMS_TP_REF_RET(_sd_)    (DATA_INST(_sd_).tp_mr_ret)
/* #define SMS_RP_FLAG(_sd_)       (DATA_INST(_sd_).r_flag) */ /* Not used */
#define SMS_SEL_MEM(_sd_)       (DATA_INST(_sd_).act_mem)
#define SMS_SEL_REC(_sd_)       (DATA_INST(_sd_).act_record)
#define SMS_REC_STATUS(_sd_)    (DATA_INST(_sd_).act_status)
#define SMS_READ_MODE(_sd_)     (DATA_INST(_sd_).act_rdmode)
#define SMS_CONDX(_sd_)         (DATA_INST(_sd_).act_condx)
#define SMS_MODIFY(_sd_)        (DATA_INST(_sd_).act_modifier)
#define SMS_DATA_REQ(_sd_)      (DATA_INST(_sd_).mo_msg)
#define SMS_SDU(_sd_)           (DATA_INST(_sd_).sms_sdu)
#define SMS_SIM_READ(_sd_)      (DATA_INST(_sd_).sim_read)
#define SMS_RP_RCVD(_sd_)       ((*_sd_).rp_data_dl)
#define SMS_PID(_sd_)           (DATA_INST(_sd_).pid)
#define SMS_DCS(_sd_)           (DATA_INST(_sd_).dcs)

#define SMS_ENT_STATE(_sd_)     ((_sd_)->ent_state)
#define SMS_SIM_PHASE(_sd_)     ((_sd_)->sim_phase)
#define SMS_SIM_STATE(_sd_)     ((_sd_)->state)
#define SMS_SIM_MEM_AVAIL(_sd_) ((_sd_)->mem_cap_avail)
#define SMS_SIM_ACCESS(_sd_)    ((_sd_)->access_fifo)
#define SMS_SAT_DWNLD(_sd_)     ((_sd_)->download_sms)
#define SMS_MT_ACK_MODE(_sd_)   ((_sd_)->mhc)
#define SMS_MT_HANDLING(_sd_)   ((_sd_)->mt)
#define SMS_ST_REPORT(_sd_)     ((_sd_)->ds)
#define SMS_MEM_CFG(_sd_)       ((_sd_)->mem3)
#define SMS_USE_MEMA(_sd_)      ((_sd_)->use_mem_a)
#define SMS_USE_MEMB(_sd_)      ((_sd_)->use_mem_b)
#define SMS_SIM_PROP(_sd_)      ((_sd_)->sim_backup)
#define SMS_ME_PROP(_sd_)       ((_sd_)->me_backup)
#define SMS_NETWORK(_sd_)       ((_sd_)->nw_spec)

#ifdef FF_CPHS
#define SMS_CPHS(_sd_)          ((_sd_)->cphs_sim)
#endif /* #ifdef FF_CPHS */

#if defined (GPRS)
#define SMS_ROUTE(_sd_)         (DATA_INST(_sd_).downlink)
#define SMS_CP_ACK_TYPE(_sd_)   (DATA_INST(_sd_).ack_type)
#define SMS_CP_CAUSE(_sd_)      (DATA_INST(_sd_).cp_cause)
#define SMS_CP_UDL(_sd_)        (DATA_INST(_sd_).cp_user_data_dl)
#define SMS_ROUTE_PREF(_sd_)    ((_sd_)->mo_dst_pref)
#define SMS_LLC_FLOW(_sd_)      ((_sd_)->llc_flow)
#define SMS_SMS_FLOW(_sd_)      ((_sd_)->sms_flow)
#endif


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

/*
 * Prototypes Formatter
 */
EXTERN void for_init_sms             (void);

/*
 * Prototypes Transfer-Layer Primitives
 */

EXTERN void tl_init                  (void);
EXTERN void tl_init_complete         (void);
EXTERN void tl_mnsms_configure_req   (T_MNSMS_CONFIGURE_REQ   *configure_req);
#ifdef GPRS
EXTERN void tl_mnsms_mo_serv_req     (T_MNSMS_MO_SERV_REQ     *mo_serv_req);
#endif
#ifdef SIM_PERS_OTA
EXTERN void tl_mnsms_OTA_message_res  (T_MNSMS_OTA_MESSAGE_RES *mnsms_OTA_message_res);
#endif
EXTERN void tl_mnsms_command_req     (T_MNSMS_COMMAND_REQ     *command_req);
EXTERN void tl_mnsms_delete_req      (T_MNSMS_DELETE_REQ      *delete_req);
EXTERN void tl_mnsms_read_req        (T_MNSMS_READ_REQ        *read_req);
EXTERN void tl_mnsms_store_req       (T_MNSMS_STORE_REQ       *store_req);
EXTERN void tl_mnsms_submit_req      (T_MNSMS_SUBMIT_REQ      *submit_req);
EXTERN void tl_mnsms_pause_req       (T_MNSMS_PAUSE_REQ       *pause_req);
EXTERN void tl_mnsms_resume_req      (T_MNSMS_RESUME_REQ      *resume_req);
EXTERN void tl_mnsms_query_req       (T_MNSMS_QUERY_REQ       *query_req);
EXTERN void tl_sim_sms_insert_ind    (T_SIM_SMS_INSERT_IND    *insert_ind);
#if defined(SIM_TOOLKIT) OR defined(FF_CPHS)
EXTERN void tl_sim_read_cnf          (T_SIM_READ_CNF          *read_cnf);
#endif /* #if defined(SIM_TOOLKIT) OR defined(FF_CPHS) */
#ifdef SIM_TOOLKIT
EXTERN void tl_sim_file_update_ind   (T_SIM_FILE_UPDATE_IND   *file_update_ind);
#endif /* #ifdef SIM_TOOLKIT */
EXTERN void tl_sim_update_cnf        (T_SIM_UPDATE_CNF        *update_cnf);
EXTERN void tl_sim_update_record_cnf (T_SIM_UPDATE_RECORD_CNF *update_cnf);
EXTERN void tl_sim_read_record_cnf   (T_SIM_READ_RECORD_CNF   *read_cnf);
EXTERN void tl_sim_remove_ind        (T_SIM_REMOVE_IND        *remove_ind);
#if defined(SIM_TOOLKIT) AND defined(SAT_SMS_DNL_SUPPORT)
EXTERN void tl_sim_toolkit_cnf       (T_SIM_TOOLKIT_CNF       *toolkit_cnf);
#endif /* #if defined(SIM_TOOLKIT) AND defined(SAT_SMS_DNL_SUPPORT) */
EXTERN void tl_mnsms_error_ind       (USHORT                  error);
EXTERN void tl_mnsms_ack_res         (T_MNSMS_ACK_RES         *ack_res);
EXTERN UBYTE tl_check_class_2        (UBYTE                    dcs);
EXTERN BOOL  tl_build_envelope_sms_download (T_rp_data_dl     *rp_data_dl);
EXTERN void tl_mnsms_read_cnf        (UBYTE                   mem_type,
                                      UBYTE                   record,
                                      UBYTE                   *data,
                                      USHORT                  error);



EXTERN void tl_mnsms_store_cnf       (UBYTE                   mem_type,
                                      UBYTE                   record,
                                      USHORT                  error);
EXTERN void tl_mnsms_submit_cnf      (UBYTE                   mem_type,
                                      UBYTE                   record,
                                      UBYTE                   tp_mr,
                                      USHORT                  cause,
                                      T_sms_sdu               *sms_sdu);
EXTERN void tl_mnsms_command_cnf     (UBYTE                   tp_mr,
                                      USHORT                  cause,
                                      T_sms_sdu               *sms_sdu);
EXTERN void tl_mnsms_delete_cnf      (UBYTE                   mem_type,
                                      UBYTE                   record,
                                      UBYTE                   next_rec,
                                      USHORT                  error);
EXTERN void tl_mnsms_resume_cnf      (USHORT                  cause);
EXTERN void tl_mnsms_query_cnf       (U8                      query_type,
                                      U8                      status);

/*
 * Prototypes Transfer-Layer Signals
 */
EXTERN void tl_establish_cnf         (BOOL            success);
EXTERN void tl_establish_cnf_send    (void);
EXTERN void tl_establish_cnf_rtx     (void);
EXTERN void tl_establish_cnf_cmd     (void);
EXTERN void tl_data_ind              (T_rp_data_dl   *rp_data_dl);
EXTERN void tl_report_ind            (T_rp_user_data *rp_user_data,
                                      USHORT         cause);
EXTERN void tl_timeout_ind           (USHORT         timer_id);


/*
 * Prototypes Transfer-Layer Functions
 */
EXTERN void tl_establish_connection  (BOOL                incr);
EXTERN void tl_build_status_rep      (T_rp_data_dl       *rp_data_dl,
                                      T_MNSMS_STATUS_IND *status_ind);
EXTERN BOOL tl_modify_submit (T_SIM_PDU *sim_pdu,
                              UBYTE     modify,
                              T_sms_sdu *sms_sdu,
                              UBYTE     *rec_data);
EXTERN BOOL tl_prepare_submit (T_SIM_PDU   *sim_pdu,
                               T_U_CP_DATA *cp_data);
EXTERN void tl_build_deliver_rep     (T_MNSMS_ACK_RES     *ack_res,
                                      UBYTE               msg_ref,
                                      T_MMSMS_DATA_REQ    *data_req,
                                      T_U_CP_DATA         *cp_data);
EXTERN USHORT tl_convert_sim_error   (USHORT sim_error);
EXTERN BOOL tl_convert_mo_to_mem     (T_MMSMS_DATA_REQ   *data_req,
                                      UBYTE              *data);
EXTERN void tl_convert_mt_to_mem     (T_rp_data_dl       *rp_data_dl,
                                      UBYTE              *data);
EXTERN UBYTE tl_convert_sim_to_mmi   (UBYTE        mem_type,
                                      UBYTE        record,
                                      UBYTE        *data,
                                      UBYTE        length);
EXTERN void tl_message_ind_from_sim  (UBYTE        mem_type,
                                      UBYTE        record,
                                      UBYTE        max_record,
                                      UBYTE        *data);
EXTERN void tl_message_ind_from_net  (UBYTE        mem_type,
                                      UBYTE        record,
                                      UBYTE        max_record,
                                      T_rp_data_dl *rp_data_dl);
EXTERN void tl_read_me_memory        (USHORT       index,
                                      UBYTE        status);
EXTERN void tl_read_sim_memory       (USHORT       index,
                                      UBYTE        status);
EXTERN void tl_sim_read_req          (USHORT       datafield,
                                      UBYTE        length);
EXTERN void tl_sim_read_record_req   (UBYTE        record);
EXTERN void tl_sim_update_req        (UBYTE        record,
                                      UBYTE        status,
                                      UBYTE        *data);
EXTERN void tl_sim_conv_update_req   (UBYTE        record,
                                      T_rp_data_dl *rp_data_dl);
EXTERN void tl_handle_message        (T_TP_DELIVER *sms_deliver);
#ifdef FF_SMS_23430
EXTERN BOOL tl_handle_23430          (T_TP_DELIVER *sms_deliver);
#endif /* #ifdef FF_SMS_23430 */
EXTERN void tl_build_sim_update_req  (void);
EXTERN UBYTE tl_read_access_fifo     (void);
EXTERN void tl_set_access_fifo       (UBYTE        access);
EXTERN BOOL tl_sms_memo_exceeded     (BOOL         avail);
EXTERN void tl_sms_memo_pause        (void);
EXTERN void tl_sms_memo_resume       (void);
EXTERN void tl_mnsms_report_ind      (UBYTE        ent_state);
EXTERN void tl_read_sim_message      (USHORT       index);
EXTERN void tl_find_first            (UBYTE        mem_type);
EXTERN void tl_find_next             (UBYTE        mem_type,
                                      UBYTE        index);
EXTERN void tl_adjust_message_len    (UBYTE        tp_vt_mti,
                                      BUF_tpdu     *tpdu);
EXTERN void tl_get_pid_dcs           (UBYTE        status,
                                      T_sms_sdu    *sms_sdu,
                                      UBYTE        *pid,
                                      UBYTE        *dcs);
EXTERN BOOL tl_find_status_pid       (UBYTE        mem_type,
                                      UBYTE        index,
                                      UBYTE        *data,
                                      T_BACKUP     *backup);
EXTERN UBYTE tl_get_free_space       (UBYTE        mem_type);
EXTERN void  tl_store_pid            (T_BACKUP     *backup,
                                      unsigned     index,
                                      UBYTE        pid);
EXTERN void  tl_store_status         (T_BACKUP     *backup,
                                      unsigned     index,
                                      UBYTE        status);
EXTERN UBYTE tl_get_status           (T_BACKUP     *backup,
                                      unsigned     index);
EXTERN int   tl_check_mt_pid         (T_BACKUP     *backup,
                                      unsigned     index,
                                      UBYTE        pid);
EXTERN UBYTE tl_check_status_value   (UBYTE        status);
EXTERN int   tl_search_record        (T_BACKUP     *backup,
                                      USHORT       index,
                                      UBYTE        status);
EXTERN UBYTE tl_search_record_for_delete (T_BACKUP *backup,
                                          UBYTE   index,
                                          UBYTE    status);
EXTERN BOOL  tl_check_replace_entry  (UBYTE        *new_data,
                                      UBYTE        *old_data);
EXTERN void  tl_replace_message      (T_TP_DELIVER *sms_deliver);
EXTERN void  tl_sim_toolkit_confirm  (T_SIM_TOOLKIT_CNF *toolkit_cnf);
EXTERN void  tl_cmms_start           (void);
EXTERN void  tl_cmms_end             (void);
EXTERN void  tl_mnsms_cmms_end_ind   (void);
#ifdef FF_SMS_NW_RCG_SIM
EXTERN void  tl_check_network_on_sim (UBYTE        *data);
#endif /* #ifdef FF_SMS_NW_RCG_SIM */
EXTERN void  tl_pause                (void);
EXTERN void  tl_resume               (void);
EXTERN void  tl_query_deliver_status (void);
EXTERN BOOL  tl_concat_check         (T_sms_sdu    *sms_sdu);
EXTERN void  tl_concat_cntrl         (T_SMS_CONCAT_HDR *concat_hdr);

#ifdef REL99
EXTERN void tl_mnsms_retrans_req     (T_MNSMS_RETRANS_REQ     *mnsms_retrans_req);
EXTERN void tl_mnsms_retrans_cnf     (UBYTE mem_type,
                                      UBYTE record,
                                      UBYTE tp_mr,
                                      USHORT cause,
                                      T_sms_sdu *sms_sdu );
EXTERN void tl_mnsms_send_prog_ind   ();
#endif


EXTERN BOOL tl_sms_reserve_req_id (UBYTE *acc_ix_ptr);

/*
 * Prototypes Relay-Layer Primitives
 */

EXTERN void rl_init                  (void);

/*
 * Prototypes Relay-Layer Signals
 */
EXTERN void rl_establish_req    (UBYTE              ti);
EXTERN void rl_establish_cnf    (BOOL               success);
EXTERN void rl_release_req      (UBYTE              ti);
EXTERN void rl_data_ind         (T_cp_user_data_dl *cp_user_data_dl);
EXTERN BOOL rl_data_req         (UBYTE             msg_ref,
                                 T_U_CP_DATA       *cp_data);
EXTERN void rl_error_ind        (USHORT            cause);
EXTERN void rl_report_req_ack   (T_rp_user_data    *rp_user_data);
EXTERN void rl_report_req_error (USHORT            cause,
                                 T_rp_user_data    *rp_user_data);
EXTERN BOOL rl_mem_avail_req    (void);
EXTERN void rl_start_tram_req   (void);

/*
 * Prototypes Relay-Layer Functions
 */

EXTERN void rl_build_rp_error        (UBYTE        msg_ref,
                                      USHORT       error,
                                      T_U_CP_DATA  *cp_data,
                                      T_rp_user_data *rp_user_data);
EXTERN void rl_build_rp_smma         (UBYTE        msg_ref,
                                      T_U_CP_DATA  *cp_data);
EXTERN UBYTE rl_temp_failure         (UBYTE        cause);
#ifdef GPRS

EXTERN void rl_proceed               (void);

EXTERN void rl_build_rp_error_gprs   (UBYTE             ti,
                                      T_LL_UNITDATA_REQ *data_req,
                                      USHORT            error,
                                      UBYTE             msg_ref,
                                      T_U_CP_DATA       *cp_data,
                                      T_stk_cmd         *stk_cmd);
#endif /* #ifdef GPRS */

/*
 * Prototypes Control-Protocol Primitives
 */

EXTERN void cp_init                  (void);
EXTERN void cp_mmsms_error_ind       (T_MMSMS_ERROR_IND       *error_ind);
EXTERN void cp_mmsms_establish_cnf   (T_MMSMS_ESTABLISH_CNF   *establish_cnf);
EXTERN void cp_mmsms_release_ind     (T_MMSMS_RELEASE_IND     *release_ind);
EXTERN void for_mmsms_establish_ind  (T_MMSMS_ESTABLISH_IND   *establish_ind);
EXTERN void for_mmsms_data_ind       (T_MMSMS_DATA_IND        *data_ind);
#if defined (GPRS)
EXTERN void for_ll_unitdata_ind      (T_LL_UNITDATA_IND       *unitdata_ind);
EXTERN void for_ll_unitready_ind     (T_LL_UNITREADY_IND      *unitready_ind);
EXTERN void cp_gmmsms_reg_state_cnf  (T_GMMSMS_REG_STATE_CNF  *reg_state_res);
#endif

/*
 * Prototypes Control-Protocol Signals
 */
EXTERN void cp_establish_req         (UBYTE         ti);
EXTERN void cp_abort_req             (void);
EXTERN void cp_data_ind_cp_ack       (void);
EXTERN void cp_data_ind_cp_data      (T_D_CP_DATA  *cp_data);
EXTERN void cp_data_ind_cp_error     (UBYTE        errcs);
EXTERN void cp_data_ind_cp_unknown   (void);
EXTERN void cp_data_req              (T_U_CP_DATA  *cp_data);
EXTERN void cp_est_ind_cp_ack        (void);
EXTERN void cp_est_ind_cp_data       (T_D_CP_DATA  *cp_data);
EXTERN void cp_est_ind_cp_error      (UBYTE        cp_error);
EXTERN void cp_est_ind_cp_unknown    (void);
EXTERN void cp_release_req           (UBYTE         ti);
#if defined (GPRS)
EXTERN void cp_send_data_gsms        (void);
EXTERN void cp_data_req_gsms         (T_MMSMS_DATA_REQ *rp_data);
EXTERN void cp_error_req_gsms        (UBYTE        cause,
                                      BOOL         free_ti);
EXTERN void cp_send_getunitdata_req  (void);
#endif


/*
 * Prototypes Control-Protocol Functions
 */

EXTERN void cp_add_pd_ti             (UBYTE            ti,
                                      T_sdu            *sdu);
EXTERN void cp_build_cp_ack          (void);
EXTERN void cp_build_cp_error        (UBYTE            error);
EXTERN void cp_send_release_req      (UBYTE            ti);

#if defined (GPRS)
EXTERN void cp_init_ll_unitdata_req (T_LL_UNITDATA_REQ *unitdata_req);
#endif
/*
 * If all entities are linked into one module this definitions
 * prefixes all this functions with the enity name
 */

/*
 * Prototypes Timer
 */
EXTERN void sms_timer_start          (USHORT      id);
EXTERN void sms_timer_stop           (USHORT      id);
EXTERN BOOL sms_timer_check          (USHORT      id);
/*
 * If all entities are linked into one module this definitions
 * prefixes all this functions with the enity name
 */
#ifdef OPTION_MULTITHREAD
  #define tim_exec_timeout   _ENTITY_PREFIXED(tim_exec_timeout)
  #define tim_start_timer    _ENTITY_PREFIXED(tim_start_timer)
  #define tim_stop_timer     _ENTITY_PREFIXED(tim_stop_timer)
#endif /* #ifdef OPTION_MULTITHREAD */
EXTERN void tim_exec_timeout (USHORT index);
EXTERN void tim_start_timer  (USHORT index, T_TIME value);
EXTERN void tim_stop_timer   (USHORT index);

EXTERN void tim_tc1m                 (void);
EXTERN void tim_tr1m                 (void);
EXTERN void tim_tr2m                 (void);
EXTERN void tim_tram                 (void);
EXTERN void tim_tlct                 (void);
EXTERN void tim_tmms                 (void);

/*
 *  SMS primitives Engineering Mode
 *  Bitmask for the event tracing
 */

/*
 * Prototypes Customer Specific Functions
 */

EXTERN UBYTE       csf_get_new_mo_ti();
EXTERN T_SMS_DATA *csf_get_sms_instance (UBYTE ti);
EXTERN T_SMS_DATA *csf_get_new_sms_instance (UBYTE ti);
EXTERN void        csf_free_sms_instance (UBYTE ti);

#define TIMERSTART(i,v)                 tim_start_timer (i, v);
#define TIMERSTOP(i)                    tim_stop_timer (i);

/*
 * If all entities are linked into one module this definitions
 * prefixes the global data with the enity name
 */
#ifdef OPTION_MULTITHREAD
#ifdef TI_PS_HCOMM_CHANGE
#else
  #define hCommMMI       _ENTITY_PREFIXED(hCommMMI)
  #define hCommMM        _ENTITY_PREFIXED(hCommMM)
  #define hCommSIM       _ENTITY_PREFIXED(hCommSIM)
#endif /* TI_PS_HCOMM_CHANGE */ 
  #ifdef GPRS
    #define hCommLLC     _ENTITY_PREFIXED(hCommLLC)
    #define hCommGMM     _ENTITY_PREFIXED(hCommGMM)
  #endif /* GPRS */

  #define _decodedMsg   _ENTITY_PREFIXED(_decodedMsg)
  #define _CCDbuf       _ENTITY_PREFIXED(_CCDBuf)
  #define data_base     _ENTITY_PREFIXED(data_base)
#endif /* #ifdef OPTION_MULTITHREAD */
#ifdef TI_PS_HCOMM_CHANGE
#else
EXTERN T_HANDLE         hCommMMI;        /* MMI Communication        */
EXTERN T_HANDLE         hCommSIM;        /* SIM Communication        */
EXTERN T_HANDLE         hCommMM;         /* MM  Communication        */
#endif /* TI_PS_HCOMM_CHANGE */ 
#ifdef GPRS
EXTERN T_HANDLE         hCommLLC;        /* LLC Communication        */
EXTERN T_HANDLE         hCommGMM;        /* GMM Communication        */
#endif /* GPRS */
EXTERN T_HANDLE         sms_handle;

#ifndef SHARED_CCD_BUF
#define CCD_START
#define CCD_END
EXTERN UBYTE          _decodedMsg [];
#else
EXTERN UBYTE *        _decodedMsg;
EXTERN UBYTE          _CCDbuf;
#define CCD_START if(!_CCDbuf){_decodedMsg = ccd_begin();_CCDbuf=TRUE;}
#define CCD_END   if(_CCDbuf){ccd_end();_CCDbuf=FALSE;}
#endif /* else, #ifndef SHARED_CCD_BUF */

EXTERN T_SMS_DATA data_base;

#define GET_INSTANCE(p) &data_base

#define GET_INSTANCE_DATA    register T_SMS_DATA *sms_data= &data_base

#if !defined(NTRACE) && !defined(NCONFIG)
/*
 * 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 /* #ifdef OPTION_MULTITHREAD */

EXTERN const KW_DATA    partab[];
#endif /* #if !defined(NTRACE) && !defined(NCONFIG) */

/* Implements Measure#32: Row 84, 96, 87, 89, 95, 97, 104, 109 & 113 */
EXTERN const char * const ef_sms_id;

#define SMS_INST_TC1M  ((USHORT)(TC1M*MAX_SMS_CALLS+sms_data->inst))
#define SMS_INST_TR1M  ((USHORT)(TR1M*MAX_SMS_CALLS+sms_data->inst))
#define SMS_INST_TR2M  ((USHORT)(TR2M*MAX_SMS_CALLS+sms_data->inst))
#define SMS_INST_TRAM  ((USHORT)(TRAM*MAX_SMS_CALLS+sms_data->inst))
#define SMS_INST_TLCT  ((USHORT)(TLCT*MAX_SMS_CALLS+sms_data->inst))

#endif /* #ifndef SMS_H */