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