diff gsm-fw/g23m-gsm/sms/sms_pei.c @ 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 55a84763c417
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gsm-fw/g23m-gsm/sms/sms_pei.c	Sun Sep 28 23:20:04 2014 +0000
@@ -0,0 +1,663 @@
+/* 
++----------------------------------------------------------------------------- 
+|  Project :  
+|  Modul   :  
++----------------------------------------------------------------------------- 
+|  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 :  This module implements the process body interface
+|             for the entity SMS of the mobile station.
++----------------------------------------------------------------------------- 
+*/ 
+
+#ifndef SMS_PEI_C
+#define SMS_PEI_C
+
+#define ENTITY_SMS
+
+/*==== INCLUDES ===================================================*/
+
+#include <string.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include "typedefs.h"
+#include "pcm.h"
+#include "vsi.h"
+#include "custom.h"
+#include "gsm.h"
+#include "message.h"
+#include "ccdapi.h"
+#include "prim.h"
+#include "cus_sms.h"
+#include "cnf_sms.h"
+#include "mon_sms.h"
+#include "pei.h"
+#include "tok.h"
+#include "sms.h"
+#include "sms_em.h"
+
+#ifdef GPRS
+#include "gprs.h"
+#endif /* #ifdef GPRS */
+
+/*==== EXPORT =====================================================*/
+#ifdef TI_PS_HCOMM_CHANGE
+#else
+GLOBAL T_HANDLE hCommSIM   = VSI_ERROR;    /* SIM Communication */
+GLOBAL T_HANDLE hCommMMI   = VSI_ERROR;    /* MMI Communication */
+GLOBAL T_HANDLE hCommMM    = VSI_ERROR;    /* MM  Communication */
+#endif /* TI_PS_HCOMM_CHANGE */
+#ifdef GPRS
+  GLOBAL T_HANDLE hCommLLC = VSI_ERROR;    /* LL  Communication */
+  GLOBAL T_HANDLE hCommGMM = VSI_ERROR;    /* GMM Communication */
+#endif /* #ifdef GPRS */
+GLOBAL T_HANDLE sms_handle;
+
+GLOBAL T_SMS_DATA sms_data_base;
+
+/*==== PRIVATE ====================================================*/
+
+static void pei_not_supported (void *data);
+
+/*==== VARIABLES ==================================================*/
+#ifdef _SIMULATION_
+static BOOL              first_access = TRUE;
+#endif /* _SIMULATION_ */
+static T_MONITOR         sms_mon;
+
+/*==== FUNCTIONS ==================================================*/
+
+LOCAL const T_FUNC mnsms_table[] = {
+  MAK_FUNC_0( tl_mnsms_delete_req,      MNSMS_DELETE_REQ      ),
+  MAK_FUNC_0( tl_mnsms_read_req,        MNSMS_READ_REQ        ),
+  MAK_FUNC_0( tl_mnsms_store_req,       MNSMS_STORE_REQ       ),
+  MAK_FUNC_0( tl_mnsms_submit_req,      MNSMS_SUBMIT_REQ      ),
+  MAK_FUNC_0( tl_mnsms_command_req,     MNSMS_COMMAND_REQ     ),
+  MAK_FUNC_0( tl_mnsms_configure_req,   MNSMS_CONFIGURE_REQ   ),
+  MAK_FUNC_0( tl_mnsms_pause_req,       MNSMS_PAUSE_REQ       ),
+  MAK_FUNC_0( tl_mnsms_resume_req,      MNSMS_RESUME_REQ      ),
+  MAK_FUNC_0( tl_mnsms_ack_res,         MNSMS_ACK_RES         ),
+#ifdef REL99
+  MAK_FUNC_0( tl_mnsms_retrans_req,     MNSMS_RETRANS_REQ     ),
+#else
+  MAK_FUNC_N( pei_not_supported,        0                     ),
+#endif
+  MAK_FUNC_N( pei_not_supported,        0                     ),
+  MAK_FUNC_0( tl_mnsms_query_req,       MNSMS_QUERY_REQ       )
+ 
+#ifdef GPRS
+ ,
+  MAK_FUNC_0( tl_mnsms_mo_serv_req,     MNSMS_MO_SERV_REQ     )
+#endif /* #ifdef GPRS */
+#ifdef SIM_PERS_OTA
+,
+  MAK_FUNC_0( tl_mnsms_OTA_message_res,  MNSMS_OTA_MESSAGE_RES  )
+#endif
+};
+
+LOCAL const T_FUNC mmsms_table[] = {
+  MAK_FUNC_S( for_mmsms_data_ind,       MMSMS_DATA_IND        ),
+  MAK_FUNC_0( cp_mmsms_error_ind,       MMSMS_ERROR_IND       ),
+  MAK_FUNC_0( cp_mmsms_establish_cnf,   MMSMS_ESTABLISH_CNF   ),
+  MAK_FUNC_S( for_mmsms_establish_ind,  MMSMS_ESTABLISH_IND   ),
+  MAK_FUNC_0( cp_mmsms_release_ind,     MMSMS_RELEASE_IND     ),
+  MAK_FUNC_N( pei_not_supported,        MMSMS_UNITDATA_IND    )
+};
+
+LOCAL const T_FUNC   sim_table[] = {
+#if defined(SIM_TOOLKIT) OR defined(FF_CPHS)
+  MAK_FUNC_0( tl_sim_read_cnf,          SIM_READ_CNF          ),
+#else
+  MAK_FUNC_N( pei_not_supported,        SIM_READ_CNF          ),
+#endif /* else, #if defined(SIM_TOOLKIT) OR defined(FF_CPHS) */
+  MAK_FUNC_0( tl_sim_update_cnf,        SIM_UPDATE_CNF        ),
+  MAK_FUNC_0( tl_sim_read_record_cnf,   SIM_READ_RECORD_CNF   ),
+  MAK_FUNC_N( pei_not_supported,        0                     ),
+  MAK_FUNC_0( tl_sim_update_record_cnf, SIM_UPDATE_RECORD_CNF ),
+  MAK_FUNC_N( pei_not_supported,        0                     ),
+  MAK_FUNC_N( pei_not_supported,        0                     ),
+  MAK_FUNC_N( pei_not_supported,        0                     ),
+  MAK_FUNC_N( pei_not_supported,        SIM_INCREMENT_CNF     ),
+  MAK_FUNC_N( pei_not_supported,        SIM_VERIFY_PIN_CNF    ),
+  MAK_FUNC_N( pei_not_supported,        SIM_CHANGE_PIN_CNF    ),
+  MAK_FUNC_N( pei_not_supported,        SIM_DISABLE_PIN_CNF   ),
+  MAK_FUNC_N( pei_not_supported,        SIM_ENABLE_PIN_CNF    ),
+  MAK_FUNC_N( pei_not_supported,        SIM_UNBLOCK_CNF       ),
+  MAK_FUNC_N( pei_not_supported,        SIM_AUTHENTICATION_CNF),
+  MAK_FUNC_N( pei_not_supported,        SIM_MMI_INSERT_IND    ),
+  MAK_FUNC_N( pei_not_supported,        SIM_MM_INSERT_IND     ),
+  MAK_FUNC_0( tl_sim_remove_ind,        SIM_REMOVE_IND        ),
+  MAK_FUNC_N( pei_not_supported,        SIM_SYNC_CNF          ),
+  MAK_FUNC_N( pei_not_supported,        SIM_ACTIVATE_CNF      ),
+  MAK_FUNC_0( tl_sim_sms_insert_ind,    SIM_SMS_INSERT_IND    ),
+#if defined(SIM_TOOLKIT) AND defined(SAT_SMS_DNL_SUPPORT)
+  MAK_FUNC_N( pei_not_supported,        SIM_TOOLKIT_IND       ),
+  MAK_FUNC_0( tl_sim_toolkit_cnf,       SIM_TOOLKIT_CNF       ),
+#else
+  MAK_FUNC_N( pei_not_supported,        SIM_TOOLKIT_IND       ),
+  MAK_FUNC_N( pei_not_supported,        SIM_TOOLKIT_CNF       ),
+#endif /* else, #if defined(SIM_TOOLKIT) AND defined(SAT_SMS_DNL_SUPPORT) */
+  MAK_FUNC_N( pei_not_supported,        0                     ),
+  MAK_FUNC_N( pei_not_supported,        0                     ),
+  MAK_FUNC_N( pei_not_supported,        0                     ),
+#ifdef SIM_TOOLKIT
+  MAK_FUNC_0( tl_sim_file_update_ind,   SIM_FILE_UPDATE_IND   )
+#else
+  MAK_FUNC_N( pei_not_supported,        SIM_FILE_UPDATE_IND   )
+#endif /* else, #ifdef SIM_TOOLKIT */
+};
+
+#ifdef GPRS
+LOCAL const T_FUNC ll_table[] = {
+  MAK_FUNC_N( pei_not_supported,        0                     ),
+  MAK_FUNC_N( pei_not_supported,        0                     ),
+  MAK_FUNC_N( pei_not_supported,        0                     ),
+  MAK_FUNC_N( pei_not_supported,        0                     ),
+  MAK_FUNC_N( pei_not_supported,        0                     ),
+  MAK_FUNC_N( pei_not_supported,        0                     ),
+  MAK_FUNC_N( pei_not_supported,        0                     ),
+  MAK_FUNC_N( pei_not_supported,        0                     ),
+  MAK_FUNC_0( for_ll_unitready_ind,     LL_UNITREADY_IND      ),
+  MAK_FUNC_N( pei_not_supported,        0                     ),
+  MAK_FUNC_N( pei_not_supported,        0                     ),
+  MAK_FUNC_0( for_ll_unitdata_ind,      LL_UNITDATA_IND       )
+};
+
+LOCAL const T_FUNC gmmsms_table[] = {
+  MAK_FUNC_0( cp_gmmsms_reg_state_cnf,  GMMSMS_REG_STATE_CNF )
+};
+#endif /* #ifdef GPRS */
+
+#ifdef FF_EM_MODE
+LOCAL const T_FUNC em_table[] = {
+ MAK_FUNC_N (pei_not_supported   , 0               ), /* 0x00 */
+ MAK_FUNC_N (pei_not_supported   , 0               ), /* 0x01 */
+ MAK_FUNC_N (pei_not_supported   , 0               ), /* 0x02 */
+ MAK_FUNC_N (pei_not_supported   , 0               ), /* 0x03 */
+ MAK_FUNC_N (pei_not_supported   , 0               ), /* 0x04 */
+ MAK_FUNC_N (pei_not_supported   , 0               ), /* 0x05 */
+ MAK_FUNC_N (pei_not_supported   , 0               ), /* 0x06 */
+ MAK_FUNC_N (pei_not_supported   , 0               ), /* 0x07 */
+ MAK_FUNC_N (pei_not_supported   , 0               ), /* 0x08 */
+ MAK_FUNC_N (pei_not_supported   , 0               ), /* 0x09 */
+ MAK_FUNC_N (pei_not_supported   , 0               ), /* 0x0A */
+ MAK_FUNC_N (pei_not_supported   , 0               ), /* 0x0B */
+ MAK_FUNC_N (pei_not_supported   , 0               ), /* 0x0C */
+ MAK_FUNC_N (pei_not_supported   , 0               ), /* 0x0D */
+ MAK_FUNC_N (pei_not_supported   , 0               ), /* 0x0E */
+ MAK_FUNC_0 (sms_em_sms_event_req, EM_SMS_EVENT_REQ)  /* 0x0F */
+};
+#endif /* #ifdef FF_EM_MODE */
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (8410)              MODULE  : SMS_PEI             |
+| STATE   : code                       ROUTINE : pei_primitive       |
++--------------------------------------------------------------------+
+
+  PURPOSE : Process protocol specific primitive.
+
+*/
+
+LOCAL SHORT pei_primitive (void * ptr)
+{
+  T_PRIM *prim = ptr;
+
+  /*
+   *            |          |     |
+   *          MNSMS       SIM    EM         UPLINK
+   *            |          |     |
+   *      +-----v----------v-----v----+
+   *      |                           |
+   *      |            SMS            |
+   *      |                           |
+   *      +-------------^-------------+
+   *                    |
+   *                MMSMS/LLC               DOWNLINK
+   *                    |
+   *
+   */
+
+  TRACE_FUNCTION ("pei_primitive()");
+
+  if (prim NEQ NULL)
+  {
+    ULONG            opc = prim->custom.opc;
+    USHORT           n;
+    const T_FUNC    *table;
+
+    VSI_PPM_REC ((T_PRIM_HEADER*)prim, __FILE__, __LINE__);
+
+    PTRACE_IN (opc);
+
+    switch (SAP_NR(opc))
+    {
+      case SAP_NR(MNSMS_UL): table =  mnsms_table; n = TAB_SIZE ( mnsms_table); break;
+      case SAP_NR(MMSMS_DL): table =  mmsms_table; n = TAB_SIZE ( mmsms_table); break;
+      case SAP_NR(SIM_UL):   table =    sim_table; n = TAB_SIZE (   sim_table); break;
+#ifdef GPRS
+      case LL_DL:            table =     ll_table; n = TAB_SIZE (    ll_table); break;
+      case GMMSMS_DL:        table = gmmsms_table; n = TAB_SIZE (gmmsms_table); break;
+#endif /* #ifdef GPRS */
+#ifdef FF_EM_MODE
+      case EM_Ul:            table =     em_table; n = TAB_SIZE (em_table)    ; break;
+#endif /* #ifdef FF_EM_MODE */
+      default :              table =         NULL; n = 0;                       break;
+    }
+
+    if (table != NULL )
+    {
+      if (PRIM_NR(opc) < n)
+      {
+        table += PRIM_NR(opc);
+#ifdef PALLOC_TRANSITION
+        P_SDU(prim) = table->soff ? (T_sdu*) (((char*)&prim->data) + table->soff) : 0;
+#ifndef NO_COPY_ROUTING
+        P_LEN(prim) = table->size + sizeof (T_PRIM_HEADER);
+#endif /* NO_COPY_ROUTING */
+#endif /* PALLOC_TRANSITION */
+        JUMP (table->func) (P2D(prim));
+      }
+      else
+      {
+        pei_not_supported (P2D(prim));
+      }
+      return PEI_OK;
+    }
+
+    /*
+     * Primitive is no GSM Primitive
+     * then forward to the environment
+     */
+
+#ifdef GSM_ONLY
+    PFREE (P2D(prim))
+
+    return PEI_ERROR;
+#else
+    if (opc & SYS_MASK)
+      vsi_c_primitive (VSI_CALLER prim);
+    else
+    {
+      PFREE (P2D(prim));
+      return PEI_ERROR;
+    }
+#endif /* else, #ifdef GSM_ONLY */
+  }
+  return PEI_OK;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (8410)              MODULE  : SMS_PEI             |
+| STATE   : code                       ROUTINE : pei_not_supported   |
++--------------------------------------------------------------------+
+
+  PURPOSE : An unsupported primitive is received.
+
+*/
+
+static void pei_not_supported (void *data)
+{
+  TRACE_FUNCTION ("pei_not_supported()");
+
+  PFREE (data);
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (8410)              MODULE  : SMS_PEI             |
+| STATE   : code                       ROUTINE : pei_init            |
++--------------------------------------------------------------------+
+
+  PURPOSE : Initialize Protocol Stack Entity
+
+*/
+
+LOCAL SHORT pei_init (T_HANDLE handle)
+{
+  sms_handle = handle;
+
+  TRACE_FUNCTION ("pei_init()");
+
+#ifdef TI_PS_HCOMM_CHANGE
+  if (!cl_hcom_all_handles_open())
+  {
+    return PEI_ERROR;
+  }
+#else /* for hCommHandles backward compatibility */
+  if (hCommMMI < VSI_OK)
+  {
+    /*
+     * Open MMI (Layer 4)
+     */
+
+    if ((hCommMMI = vsi_c_open (VSI_CALLER ACI_NAME)) < VSI_OK)
+      return PEI_ERROR;
+  }
+
+  if (hCommMM < VSI_OK)
+  {
+    if ((hCommMM = vsi_c_open (VSI_CALLER MM_NAME)) < VSI_OK)
+      return PEI_ERROR;
+  }
+
+  if (hCommSIM < VSI_OK)
+  {
+    if ((hCommSIM = vsi_c_open (VSI_CALLER SIM_NAME)) < VSI_OK)
+      return PEI_ERROR;
+  }
+#endif /* TI_PS_HCOMM_CHANGE */
+  #if defined (GPRS)
+  /*
+   * Open LLC for GPRS GSMS handling
+   */
+  if (hCommLLC < VSI_OK)
+  {
+    if ((hCommLLC = vsi_c_open (VSI_CALLER LLC_NAME)) < VSI_OK)
+      return PEI_ERROR;
+  }
+  /*
+   * Open GMM for GPRS registration inquiry
+   */
+  if (hCommGMM < VSI_OK)
+  {
+    if ((hCommGMM = vsi_c_open (VSI_CALLER GMM_NAME)) < VSI_OK)
+      return PEI_ERROR;
+  }
+  #endif /* GPRS */
+
+  /*
+   * Initialize data base
+   */
+  cp_init ();
+  rl_init ();
+  tl_init ();
+  for_init_sms ();
+  pcm_Init ();
+
+  ccd_init ();
+
+#ifdef FF_EM_MODE
+  em_init_sms_event_trace();
+#endif /* #ifdef FF_EM_MODE */
+
+  return PEI_OK;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (8410)              MODULE  : SMS_PEI             |
+| STATE   : code                       ROUTINE : pei_timeout         |
++--------------------------------------------------------------------+
+
+  PURPOSE : Process timeout
+
+*/
+
+LOCAL SHORT pei_timeout (USHORT index)
+{
+  tim_exec_timeout (index);
+  return PEI_OK;
+}
+
+#ifdef _SIMULATION_
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (8410)              MODULE  : SMS_PEI             |
+| STATE   : code                       ROUTINE : pei_exit            |
++--------------------------------------------------------------------+
+
+  PURPOSE : Close Resources and terminate
+
+*/
+
+LOCAL SHORT pei_exit (void)
+{
+  TRACE_FUNCTION ("pei_exit()");
+
+  /*
+   * clean up communication
+   */
+#ifdef TI_PS_HCOMM_CHANGE
+#else /* for hCommHandles backward compatibility */
+  vsi_c_close (VSI_CALLER hCommMMI);
+  hCommMMI = VSI_ERROR;
+
+  vsi_c_close (VSI_CALLER hCommMM);
+  hCommMM = VSI_ERROR;
+
+  vsi_c_close (VSI_CALLER hCommSIM);
+  hCommSIM = VSI_ERROR;
+#endif /* TI_PS_HCOMM_CHANGE */
+#ifdef GPRS
+  vsi_c_close (VSI_CALLER hCommLLC);
+  hCommLLC = VSI_ERROR;
+
+  vsi_c_close (VSI_CALLER hCommGMM);
+  hCommGMM = VSI_ERROR;
+#endif /* #ifdef GPRS */
+
+  return PEI_OK;
+}
+#endif /* _SIMULATION_ */
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (8410)              MODULE  : SMS_PEI             |
+| STATE   : code                       ROUTINE : pei_config          |
++--------------------------------------------------------------------+
+
+  PURPOSE : Dynamic Configuration
+
+*/
+
+#ifndef NCONFIG
+LOCAL const KW_DATA kwtab[] = {
+   SMS_CONF_STRING_PAUSE,            SMS_CONF_EVENT_PAUSE,
+   SMS_CONF_STRING_RESUME,           SMS_CONF_EVENT_RESUME,
+                   "",                   0
+                  };
+#endif /* #ifndef NCONFIG */
+
+#if !defined(NTRACE) && !defined(NCONFIG)
+GLOBAL const KW_DATA partab[] = {
+                   TC1M_NAME,  TC1M,
+                   TR1M_NAME,  TR1M,
+                   TR2M_NAME,  TR2M,
+                   TRAM_NAME,  TRAM,
+                   TLCT_NAME,  TLCT,
+                   TMMS_NAME,  TMMS,
+                   "",         0
+                  };
+#endif /* #if !defined(NTRACE) && !defined(NCONFIG) */
+
+/* Implements Measure#36 */
+#ifndef NCONFIG
+LOCAL SHORT pei_config (T_PEI_CONFIG inString)
+{
+#ifndef NCONFIG
+  char    * s = inString;
+  char    * keyw;
+  char    * val [10];
+
+ GET_INSTANCE_DATA;
+
+  TRACE_FUNCTION ("pei_config()");
+
+  TRACE_FUNCTION (s);
+
+  tok_init(s);
+
+  /*
+   * Parse next keyword and number of variables
+   */
+  while ((tok_next(&keyw,val)) NEQ TOK_EOCS)
+  {
+    switch ((tok_key((KW_DATA *)kwtab,keyw)))
+    {
+      case TOK_NOT_FOUND:
+        TRACE_ERROR ("[PEI_CONFIG]: Illegal Keyword");
+        break;
+
+      case SMS_CONF_EVENT_PAUSE:
+         TRACE_EVENT("SMS_CONF_EVENT_PAUSE");
+         tl_pause();
+         break;
+      case SMS_CONF_EVENT_RESUME:
+         TRACE_EVENT("SMS_CONF_EVENT_RESUME");
+         /* tl_resume(sms_data); */
+
+         GET_MO_INSTANCE(sms_data);
+        /*
+         * TL  state transition TL_ESTABLISH
+         * EST state transition EST_SMMA
+         * MMI state transition MMI_RESUME
+         * 
+         */
+         SET_STATE (STATE_MMI, MMI_RESUME);
+         SET_STATE (STATE_EST, EST_SMMA);
+         SMS_INST_SET_STATE (STATE_TL, TL_ESTABLISH);
+        /*
+         * 1st shot
+         */
+         SMS_INST.retrans  = FALSE;
+        /*
+         * establish connection
+         */
+         tl_establish_connection(FALSE);
+         break;
+      default:
+        break;
+    }
+  }
+#endif /* #ifndef NCONFIG */
+
+  return PEI_OK;
+}
+#endif /*  NCONFIG */
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)              MODULE  : SMS_PEI             |
+| STATE   : code                       ROUTINE : sms_pei_config      |
++--------------------------------------------------------------------+
+
+  PURPOSE : Dynamic Configuration
+
+*/
+/* Implements Measure#36 */
+#ifndef NCONFIG
+GLOBAL SHORT sms_pei_config ( char * inString, char * dummy )
+{
+  pei_config ( inString );
+
+  return PEI_OK;
+}
+#endif /* NCONFIG */
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (8410)              MODULE  : SMS_PEI             |
+| STATE   : code                       ROUTINE : pei_monitor         |
++--------------------------------------------------------------------+
+
+  PURPOSE : Monitoring of physical Parameters
+
+*/
+
+LOCAL SHORT pei_monitor (void ** monitor)
+{
+  TRACE_FUNCTION ("pei_monitor()");
+
+/* Implements Measure#32: Row 20 */
+
+  * monitor = &sms_mon;
+
+  return PEI_OK;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (8410)              MODULE  : SMS_PEI             |
+| STATE   : code                       ROUTINE : pei_create          |
++--------------------------------------------------------------------+
+
+  PURPOSE : Create the Protocol Stack Entity
+
+*/
+
+GLOBAL SHORT sms_pei_create (T_PEI_INFO **info)
+{
+  static const T_PEI_INFO pei_info =
+  {
+    "SMS",
+    {
+      pei_init,
+#ifdef _SIMULATION_
+      pei_exit,
+#else
+      NULL,
+#endif
+      pei_primitive,
+      pei_timeout,
+      NULL,             /* no signal function  */
+      NULL,             /* no run function     */
+/* Implements Measure#36 */
+#ifdef NCONFIG
+      NULL,             /* no pei_config function     */
+#else /* not NCONFIG */
+      pei_config,
+#endif /* NCONFIG */
+      pei_monitor,
+    },
+    #if defined (GPRS)
+    1792,                         /* Stack Size      */
+    #else
+    #if defined (FAX_AND_DATA)
+    1792,                         /* Stack Size      */
+    #else
+    1500,                         /* Stacksize       */
+    #endif
+    #endif
+    10,                           /* Queue Entries   */
+    135,                          /* Priority        */
+    MAX_SMS_TIMER*MAX_SMS_CALLS,  /* number of timer */
+    0x03|PRIM_NO_SUSPEND          /* flags           */
+  };
+
+  TRACE_FUNCTION ("pei_create()");
+
+  /*
+   *  Close Resources if open
+   */
+
+#ifdef _SIMULATION_
+  if (first_access)
+    first_access = FALSE;
+  else
+    pei_exit ();
+#endif
+
+  /*
+   *  Export startup configuration data
+   */
+
+  *info = (T_PEI_INFO *)&pei_info;
+
+  return PEI_OK;
+}
+
+#endif /* #ifndef SMS_PEI_C */