diff src/g23m-gsm/ss/ss_ss.c @ 1:d393cd9bb723

src/g23m-*: initial import from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 15 Jul 2018 04:40:46 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/g23m-gsm/ss/ss_ss.c	Sun Jul 15 04:40:46 2018 +0000
@@ -0,0 +1,762 @@
+/* 
++----------------------------------------------------------------------------- 
+|  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 modul defines the functions for the supplementary
+|             services.
++----------------------------------------------------------------------------- 
+*/ 
+
+#ifndef SS_SS_C
+#define SS_SS_C
+
+#define ENTITY_SS
+
+/*==== INCLUDES ===================================================*/
+#if defined (NEW_FRAME)
+
+#include <string.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include "typedefs.h"
+#include "pcm.h"
+#include "pconst.cdg"
+#include "mconst.cdg"
+#include "message.h"
+#include "ccdapi.h"
+#include "vsi.h"
+#include "custom.h"
+#include "gsm.h"
+#include "prim.h"
+#include "cnf_ss.h"
+#include "mon_ss.h"
+#include "pei.h"
+#include "tok.h"
+#include "ss.h"
+#include "ss_em.h"
+
+#else
+
+#include <string.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include "stddefs.h"
+#include "pcm.h"
+#include "pconst.cdg"
+#include "mconst.cdg"
+#include "message.h"
+#include "ccdapi.h"
+#include "custom.h"
+#include "gsm.h"
+#include "prim.h"
+#include "cnf_ss.h"
+#include "mon_ss.h"
+#include "vsi.h"
+#include "pei.h"
+#include "tok.h"
+#include "ss.h"
+#include "ss_em.h"
+
+#endif
+
+/*==== EXPORT =====================================================*/
+
+/*==== PRIVAT =====================================================*/
+
+/*==== VARIABLES ==================================================*/
+#ifdef TI_PS_HCOMM_CHANGE
+#else
+#if defined (NEW_FRAME)
+EXTERN T_HANDLE         hCommMM;         /* MM   Communication       */
+EXTERN T_HANDLE         hCommMMI;        /* MMI  Communication       */
+#else
+EXTERN T_VSI_CHANDLE  hCommMM;         /* MM   Communication       */
+EXTERN T_VSI_CHANDLE  hCommMMI;        /* MMI  Communication       */
+#endif
+#endif
+
+#ifdef SS_TEST
+UBYTE  trc[100];
+#endif
+
+/*==== FUNCTIONS ==================================================*/
+
+/*
+ * -------------------------------------------------------------------
+ * PRIMITIVE Processing functions
+ * -------------------------------------------------------------------
+ */
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : SS_SS                      |
+| STATE   : code                ROUTINE : ss_init_ss_data            |
++--------------------------------------------------------------------+
+
+  PURPOSE : Initialize the SS data for the module supplem. services.
+
+*/
+
+GLOBAL void ss_init_ss_data (void)
+{
+  GET_INSTANCE_DATA;
+  UBYTE i;
+  TRACE_FUNCTION ("ss_init_ss_data()");
+
+  ss_init ();
+  for (i = 0; i < MAX_INST; i++)
+    SET_SS_STATE(ss_data->ss_state,i,SS_IDLE); /*lint !e502 (Warning -- Warning 502: Expected unsigned type ) */
+
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : SS_SS                      |
+| STATE   : code                ROUTINE : ss_mmss_error_ind          |
++--------------------------------------------------------------------+
+
+  PURPOSE : Process the primitive MMSS_ERROR_IND.
+
+*/
+
+GLOBAL void ss_mmss_error_ind (T_MMSS_ERROR_IND  *mmss_error_ind)
+{
+  GET_INSTANCE_DATA;	
+  TRACE_FUNCTION ("ss_mmss_error_ind()");
+
+  ss_data->ti = mmss_error_ind->ti;
+  switch (GET_SS_STATE(ss_data->ss_state,ss_data->ti))
+  {
+    case SS_CONNECTION_PENDING:
+    	PFREE (P2D(ss_data->prim[ss_data->ti]));
+      ss_data->prim[ss_data->ti] = NULL;
+      /*FALLTHROUGH*/
+    case SS_CONNECTED:
+    {
+      PALLOC (mnss_end_ind, MNSS_END_IND);
+
+      ss_data->ti = mmss_error_ind->ti;
+
+      mnss_end_ind->cause = mmss_error_ind->cause;
+      mnss_end_ind->ti    = ss_data->ti;
+      memset (&mnss_end_ind->fac_inf, 0, sizeof (T_fac_inf)) ;
+
+      SET_SS_STATE(ss_data->ss_state,ss_data->ti,SS_IDLE); /*lint !e502 (Warning -- Warning 502: Expected unsigned type ) */
+
+      PSENDX (MMI, mnss_end_ind);
+      {
+        PALLOC (mmss_release_req, MMSS_RELEASE_REQ);
+        mmss_release_req->ti = ss_data->ti;
+        PSENDX (MM, mmss_release_req);
+      }
+
+
+      MM_EM_MM_CONNECTION_ABORTED;
+
+      break;
+    }
+
+    default:
+      break;
+  }
+  PFREE (mmss_error_ind);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : SS_SS                      |
+| STATE   : code                ROUTINE : ss_mmss_establish_cnf      |
++--------------------------------------------------------------------+
+
+  PURPOSE : Process the primitive MMSS_ESTABLISH_CNF.
+
+*/
+GLOBAL void ss_mmss_establish_cnf (T_MMSS_ESTABLISH_CNF *mmss_establish_cnf)
+{
+  GET_INSTANCE_DATA;
+  TRACE_FUNCTION ("ss_mmss_establish_cnf()");
+
+  ss_data->ti = mmss_establish_cnf->ti;
+
+  switch (GET_SS_STATE(ss_data->ss_state,ss_data->ti))
+  {
+    case SS_CONNECTION_PENDING:
+      CCD_START;
+      {
+        T_MNSS_BEGIN_REQ * mnss_begin_req;
+        MCAST (ss_register, U_SS_REGISTER);
+
+        ss_register->msg_type    = U_SS_REGISTER;
+        mnss_begin_req = (T_MNSS_BEGIN_REQ *)P2D(ss_data->prim[ss_data->ti]);
+
+        
+        ss_register->ss_version.c_ver = mnss_begin_req->ss_ver.len;
+        if(ss_register->ss_version.c_ver)
+        {
+          ss_register->v_ss_version = TRUE; 
+          memcpy (ss_register->ss_version.ver, 
+                  mnss_begin_req->ss_ver.ver,
+                  ss_register->ss_version.c_ver);
+        }
+        else
+        {
+          ss_register->v_ss_version = FALSE; 
+        }
+       
+        ss_register->ss_facility.c_fac_info = mnss_begin_req->fac_inf.l_fac >> 3;
+        if(ss_register->ss_facility.c_fac_info)
+        {
+          ss_register->v_ss_facility = TRUE;
+          memcpy (ss_register->ss_facility.fac_info,
+                  &mnss_begin_req->fac_inf.fac[mnss_begin_req->fac_inf.o_fac >>3],
+                  ss_register->ss_facility.c_fac_info);
+        }
+        else
+        {
+          ss_register->v_ss_facility = FALSE;
+        }
+
+        SET_SS_STATE(ss_data->ss_state,ss_data->ti,SS_CONNECTED); /*lint !e502 (Warning -- Warning 502: Expected unsigned type ) */
+
+        PFREE (P2D(ss_data->prim[ss_data->ti]));
+        ss_data->prim[ss_data->ti] = NULL;
+        ss_for_data_req ((USHORT)(LEN_U_SS_REGISTER + ss_register->ss_facility.c_fac_info * 8));
+
+        MM_EM_MM_CONNECTION_ESTABLISHED;  
+      
+      }
+      CCD_END;
+      break;
+
+    default:
+      break;
+  }
+  PFREE (mmss_establish_cnf);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : SS_SS                      |
+| STATE   : code                ROUTINE : ss_mmss_release_ind        |
++--------------------------------------------------------------------+
+
+  PURPOSE : Process the primitive MMSS_RELEASE_IND.
+
+*/
+GLOBAL void ss_mmss_release_ind (T_MMSS_RELEASE_IND *mmss_release_ind)
+{
+  GET_INSTANCE_DATA;
+  TRACE_FUNCTION ("ss_mmss_release_ind()");
+
+  ss_data->ti = mmss_release_ind->ti;
+
+  switch (GET_SS_STATE(ss_data->ss_state,ss_data->ti))
+  {
+    case SS_CONNECTION_PENDING:
+    	PFREE (P2D(ss_data->prim[ss_data->ti]));
+      ss_data->prim[ss_data->ti] = NULL;
+
+      MM_EM_MM_CONNECTION_FAILED;
+      
+      /*FALLTHROUGH*/
+    case SS_CONNECTED:
+    {
+      PALLOC (mnss_end_ind, MNSS_END_IND);
+
+      mnss_end_ind->ti = ss_data->ti;
+      mnss_end_ind->cause = mmss_release_ind->cause;
+      memset (&mnss_end_ind->fac_inf, 0, sizeof (T_fac_inf));
+      SET_SS_STATE(ss_data->ss_state,ss_data->ti,SS_IDLE); /*lint !e502 (Warning -- Warning 502: Expected unsigned type ) */
+
+      MM_EM_MM_CONNECTION_RELEASED;
+
+      PSENDX (MMI, mnss_end_ind);
+      break;
+    }
+    default:
+      break;
+  }
+  PFREE (mmss_release_ind);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : SS_SS                      |
+| STATE   : code                ROUTINE : ss_mnss_begin_req          |
++--------------------------------------------------------------------+
+
+  PURPOSE : Process the primitive MNSS_BEGIN_REQ.
+
+*/
+GLOBAL void ss_mnss_begin_req (T_MNSS_BEGIN_REQ *mnss_begin_req)
+{
+  GET_INSTANCE_DATA;
+  TRACE_FUNCTION ("ss_mnss_begin_req()");
+
+  ss_data->ti = mnss_begin_req->ti;
+
+  switch (GET_SS_STATE(ss_data->ss_state,ss_data->ti))
+  {
+    case SS_IDLE:
+    {
+      if (ss_data->ti < 7)
+      {
+#if defined (NEW_FRAME)
+        ss_data->prim[ss_data->ti] = (T_PRIM *)D2P(mnss_begin_req);
+#else
+        ss_data->prim[ss_data->ti] = D2P(mnss_begin_req);
+#endif
+        {
+          PALLOC (mmss_establish_req, MMSS_ESTABLISH_REQ);
+
+          mmss_establish_req->ti = ss_data->ti;
+          SET_SS_STATE(ss_data->ss_state,ss_data->ti,SS_CONNECTION_PENDING); /*lint !e502 (Warning -- Warning 502: Expected unsigned type ) */
+
+          PSENDX (MM, mmss_establish_req);
+
+          MM_EM_MM_CONNECTION_STARTED;
+         
+        }
+        return; /* Don't free primitive */
+      }
+      break;
+    }
+    default:
+      break;
+  }
+  PFREE (mnss_begin_req);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : SS_SS                      |
+| STATE   : code                ROUTINE : ss_mnss_end_req            |
++--------------------------------------------------------------------+
+
+  PURPOSE : Process the primitive MNSS_END_REQ.
+
+*/
+GLOBAL void ss_mnss_end_req (T_MNSS_END_REQ *mnss_end_req)
+{
+  GET_INSTANCE_DATA;	
+  TRACE_FUNCTION ("ss_mnss_end_req()");
+
+  ss_data->ti                = mnss_end_req->ti;
+
+  switch (GET_SS_STATE(ss_data->ss_state,ss_data->ti))
+  {
+    case SS_CONNECTION_PENDING:
+      if (ss_data->prim[ss_data->ti] NEQ NULL)
+      {
+        /* Free stored primitive */
+        PFREE (P2D(ss_data->prim[ss_data->ti]));
+        ss_data->prim[ss_data->ti] = NULL;
+      }
+
+      /* Send MMSS_RELEASE_REQ */
+      {
+        PALLOC (mmss_release_req, MMSS_RELEASE_REQ); /* T_MMSS_RELEASE_REQ */
+        mmss_release_req->ti = ss_data->ti;
+        PSENDX (MM, mmss_release_req);
+      }
+
+      /* Next state is SS_IDLE */
+      SET_SS_STATE(ss_data->ss_state,ss_data->ti,SS_IDLE); /*lint !e502 (Warning -- Warning 502: Expected unsigned type ) */
+      break;
+
+    case SS_CONNECTED:
+      CCD_START;
+      {
+        MCAST (ss_rel_comp, B_SS_REL_COMP);
+
+        ss_rel_comp->msg_type      = B_SS_REL_COMP;
+        ss_rel_comp->v_ss_cause    = FALSE;
+        ss_rel_comp->v_ss_facility = (mnss_end_req->fac_inf.l_fac) ?
+                                                       TRUE : FALSE;
+        ss_rel_comp->ss_facility.c_fac_info = mnss_end_req->fac_inf.l_fac >> 3;
+        memcpy (ss_rel_comp->ss_facility.fac_info,
+                &mnss_end_req->fac_inf.fac[mnss_end_req->fac_inf.o_fac >>3],
+                ss_rel_comp->ss_facility.c_fac_info);
+        if (ss_rel_comp->v_ss_facility)
+        {
+          ss_for_data_req ((USHORT)(LEN_U_SS_RELEASE_COMPLETE + 
+                                    ss_rel_comp->ss_facility.c_fac_info * 8));
+        }
+        else
+        {
+          ss_for_data_req (LEN_U_SS_RELEASE_COMPLETE);
+        }
+
+        {
+          PALLOC (mmss_release_req, MMSS_RELEASE_REQ);
+
+          mmss_release_req->ti = ss_data->ti;
+          ss_data->ss_state = SET_SS_STATE(ss_data->ss_state,ss_data->ti,SS_IDLE); /*lint !e502 (Warning -- Warning 502: Expected unsigned type ) */
+
+          PSENDX (MM, mmss_release_req);
+        }
+      }
+      CCD_END;
+
+      MM_EM_MM_RELEASE_COMPLETE_SENT;  
+
+      break;
+  }
+  PFREE (mnss_end_req);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : SS_SS                      |
+| STATE   : code                ROUTINE : ss_mnss_facility_req       |
++--------------------------------------------------------------------+
+
+  PURPOSE : Process the primitive MNSS_FACILITY_REQ.
+
+*/
+
+GLOBAL void ss_mnss_facility_req (T_MNSS_FACILITY_REQ *mnss_facility_req)
+{
+  GET_INSTANCE_DATA;
+  CCD_START;
+  {
+    MCAST (ss_facility, U_SS_FACILITY);
+
+    TRACE_FUNCTION ("ss_mnss_facility_req()");
+
+    switch (GET_SS_STATE(ss_data->ss_state,ss_data->ti))
+    {
+      case SS_CONNECTED:
+        ss_data->ti = mnss_facility_req->ti;
+        ss_facility->msg_type = U_SS_FACILITY;
+        ss_facility->ss_facility.c_fac_info = mnss_facility_req->fac_inf.l_fac >> 3;
+        memcpy (ss_facility->ss_facility.fac_info,
+                &mnss_facility_req->fac_inf.fac[mnss_facility_req->fac_inf.o_fac >>3],
+                ss_facility->ss_facility.c_fac_info);
+        ss_for_data_req ((USHORT)(LEN_U_SS_FACILITY + 
+                                  ss_facility->ss_facility.c_fac_info * 8));
+
+        MM_EM_FACILITY_MESSAGE_SENT;
+
+        break;
+      default:
+        break;
+    }
+  }
+  CCD_END;
+  PFREE (mnss_facility_req);
+}
+
+/*
+ * -------------------------------------------------------------------
+ * SIGNAL Processing functions
+ * -------------------------------------------------------------------
+ */
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : SS_SS                      |
+| STATE   : code                ROUTINE : ss_b_ss_rel_comp           |
++--------------------------------------------------------------------+
+
+  PURPOSE : Process the signal B_SS_REL_COMP.
+
+*/
+
+GLOBAL void ss_b_ss_rel_comp (void)
+{
+  GET_INSTANCE_DATA;
+  TRACE_FUNCTION ("ss_b_ss_rel_comp()");
+
+  switch (GET_SS_STATE(ss_data->ss_state,ss_data->ti))
+  {
+    case SS_IDLE:
+      /* Unrecognised TI : Ignore Message TS 24.010 Section 3.7.3 a)*/
+      {
+        PALLOC (mmss_release_req, MMSS_RELEASE_REQ); /* T_MMSS_RELEASE_REQ */
+        mmss_release_req->ti = ss_data->ti;
+        PSENDX (MM, mmss_release_req);
+      }
+      break;
+
+    case SS_CONNECTED:
+      if (! ss_data->est_flag)
+      {
+        MCAST (ss_rel_comp, B_SS_REL_COMP);
+        PALLOC (mnss_end_ind, MNSS_END_IND);
+
+        mnss_end_ind->ti = ss_data->ti;
+        if (ss_rel_comp->v_ss_cause)
+          mnss_end_ind->cause = CAUSE_MAKE(DEFBY_STD, 
+                                           ORIGSIDE_NET, 
+                                           SS_ORIGINATING_ENTITY, 
+                                           ss_rel_comp->ss_cause.cs);
+        else
+          mnss_end_ind->cause = CAUSE_MAKE(DEFBY_CONDAT, 
+                                           ORIGSIDE_NET, 
+                                           SS_ORIGINATING_ENTITY, 
+                                           NOT_PRESENT_8BIT);
+        memcpy (mnss_end_ind->fac_inf.fac, ss_rel_comp->ss_facility.fac_info,
+                ss_rel_comp->ss_facility.c_fac_info);
+        mnss_end_ind->fac_inf.l_fac = ss_rel_comp->ss_facility.c_fac_info << 3;
+        mnss_end_ind->fac_inf.o_fac = 0;
+
+        SET_SS_STATE(ss_data->ss_state,ss_data->ti,SS_IDLE); /*lint !e502 (Warning -- Warning 502: Expected unsigned type ) */
+
+        PSENDX (MMI, mnss_end_ind);
+        {
+          PALLOC (mmss_release_req, MMSS_RELEASE_REQ);
+          mmss_release_req->ti = ss_data->ti;
+          PSENDX (MM, mmss_release_req);
+        }
+
+        MM_EM_MM_RELEASE_COMPLETE_RECEIVED;
+
+      }
+      break;
+
+    default:
+      /* Should never reach here */
+      TRACE_FUNCTION("**BAD SS State**");
+      break;
+  }
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : SS_SS                      |
+| STATE   : code                ROUTINE : ss_d_ss_facility           |
++--------------------------------------------------------------------+
+
+  PURPOSE : Process the signal D_SS_FACILITY.
+
+*/
+
+GLOBAL void ss_d_ss_facility (void)
+{
+  GET_INSTANCE_DATA;
+  TRACE_FUNCTION ("ss_d_ss_facility()");
+
+  switch( ss_data->error )
+  {
+    case CAUSE_INVALID_MAND_INFO:
+      /* Send RELEASE COMPLETE with this cause TS 24.010 Section 3.7.4*/
+      send_rel_comp(CAUSE_INVALID_MAND_INFO);
+      return;
+
+    default:
+      break;
+  }
+
+  switch (GET_SS_STATE(ss_data->ss_state,ss_data->ti))
+  {
+    case SS_IDLE:
+      /* Unrecognised TI : TS 24.010 Section 3.7.3 b)*/
+      send_rel_comp(CAUSE_INVALID_TI);
+      break;
+
+    case SS_CONNECTED:
+    {
+      MCAST (ss_facility, U_SS_FACILITY);
+
+      if (! ss_data->est_flag)
+      {
+        PALLOC (mnss_facility_ind, MNSS_FACILITY_IND);
+
+        mnss_facility_ind->ti = ss_data->ti;
+
+        memcpy (mnss_facility_ind->fac_inf.fac, ss_facility->ss_facility.fac_info,
+                ss_facility->ss_facility.c_fac_info);
+        mnss_facility_ind->fac_inf.l_fac = ss_facility->ss_facility.c_fac_info << 3;
+        mnss_facility_ind->fac_inf.o_fac = 0;
+
+        MM_EM_FACILITY_MESSAGE_RECEIVED;
+       
+        PSENDX (MMI, mnss_facility_ind);
+      }
+      break;
+    }
+    default:
+      /* Should never reach here */
+      TRACE_FUNCTION("**BAD SS State**");
+      break;
+  }
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : SS_SS                      |
+| STATE   : code                ROUTINE : ss_d_ss_register           |
++--------------------------------------------------------------------+
+
+  PURPOSE : Process the signal D_SS_REGISTER.
+
+*/
+
+GLOBAL void ss_d_ss_register (void)
+{
+  GET_INSTANCE_DATA;
+  MCAST (ss_register, U_SS_REGISTER);
+
+  TRACE_FUNCTION ("ss_d_ss_register()");
+
+  switch( ss_data->error )
+  {
+    case CAUSE_INVALID_MAND_INFO:
+      /* Send RELEASE COMPLETE with this cause TS 24.010 Section 3.7.4*/
+      send_rel_comp(CAUSE_INVALID_MAND_INFO);
+      return;
+
+    default:
+      break;
+  }
+
+  switch (GET_SS_STATE(ss_data->ss_state,ss_data->ti))
+  {
+    case SS_CONNECTED:
+      /* This TI is already being used therefore ignore Message */
+      /* TS 24.010 Section 3.7.3 c) */
+      break;
+
+    case SS_IDLE:
+      if (ss_data->est_flag AND 
+          (ss_data->ti >= 8 AND ss_data->ti < 15))
+      {
+        PALLOC (mnss_begin_ind, MNSS_BEGIN_IND);
+
+        mnss_begin_ind->ti = ss_data->ti;
+        memcpy (mnss_begin_ind->fac_inf.fac, ss_register->ss_facility.fac_info,
+                ss_register->ss_facility.c_fac_info);
+        mnss_begin_ind->fac_inf.l_fac = ss_register->ss_facility.c_fac_info << 3;
+        mnss_begin_ind->fac_inf.o_fac = 0;
+        
+        SET_SS_STATE(ss_data->ss_state,ss_data->ti,SS_CONNECTED); /*lint !e502 (Warning -- Warning 502: Expected unsigned type ) */
+
+        MM_EM_REGISTER_MESSAGE_RECEIVED;
+
+        PSENDX (MMI, mnss_begin_ind);
+      }
+      else
+      {
+        /* REGISTER with set TI flag received. Release the connection */ 
+        PALLOC (mmss_release_req, MMSS_RELEASE_REQ); /* T_MMSS_RELEASE_REQ */
+        mmss_release_req->ti = ss_data->ti;
+        PSENDX (MM, mmss_release_req);
+      }
+      break;
+
+    default:
+      /* Should never reach here */
+      TRACE_FUNCTION("**BAD SS State**");
+      break;
+  }
+}
+
+/*
+ * -------------------------------------------------------------------
+ * Procedures
+ * -------------------------------------------------------------------
+ */
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : SS_SS                      |
+| STATE   : code                ROUTINE : ss_init                    |
++--------------------------------------------------------------------+
+
+  PURPOSE :
+
+*/
+
+GLOBAL void ss_init (void)
+{
+  GET_INSTANCE_DATA;
+  memset (ss_data, 0, sizeof (T_SS_DATA));
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : SS_SS                      |
+| STATE   : code                ROUTINE : send_rel_comp              |
++--------------------------------------------------------------------+
+
+  PURPOSE : This functions sends a RELEASE COMPLETE message with a 
+            specified 'cause' value
+
+*/
+
+GLOBAL void send_rel_comp(U8 cause)
+{
+  GET_INSTANCE_DATA;
+  TRACE_FUNCTION ("send_rel_comp()");
+
+  {
+    MCAST (ss_rel_comp, B_SS_REL_COMP);
+
+    ss_rel_comp->msg_type        = B_SS_REL_COMP;
+    ss_rel_comp->v_ss_facility   = FALSE;
+    ss_rel_comp->v_ss_cause      = TRUE;
+
+    ss_rel_comp->ss_cause.v_cs2  = TRUE;
+    ss_rel_comp->ss_cause.cs2    = CS_GSM_PLMN;
+ 
+    ss_rel_comp->ss_cause.v_loc  = TRUE;
+    ss_rel_comp->ss_cause.loc    = LOC_PUB_NET_REMOTE_USER;
+
+    ss_rel_comp->ss_cause.v_rec  = TRUE;
+    ss_rel_comp->ss_cause.rec    = 0x00;
+
+    ss_rel_comp->ss_cause.v_cs   = TRUE;
+    ss_rel_comp->ss_cause.cs     = cause;
+
+    ss_rel_comp->ss_cause.c_diag = 0x00;
+
+    ss_for_data_req(LEN_U_SS_RELEASE_COMPLETE);
+  }
+
+  {
+    PALLOC (mmss_release_req, MMSS_RELEASE_REQ);
+    mmss_release_req->ti = ss_data->ti;
+    PSENDX (MM, mmss_release_req);
+  }
+
+  SET_SS_STATE(ss_data->ss_state,ss_data->ti,SS_IDLE); /*lint !e502 (Warning -- Warning 502: Expected unsigned type ) */
+}
+
+/*
++--------------------------------------------------------------------+
+| | STATE   : code                ROUTINE : ss_check_critical_error    |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function checks wheter a critical error has been 
+            detected in the air message. Critical errors which prevent 
+            the treatment of an air message are 
+            - invalid Message ID
+            - mandatory IE missing
+            - IE coded as comprehension required missing
+*/
+
+GLOBAL BOOL ss_check_critical_error (UINT ss_err)
+{
+  TRACE_FUNCTION ("cc_check_critical_error ()");
+  if (ss_err  EQ CAUSE_INVALID_MAND_INFO       OR 
+      ss_err  EQ CAUSE_MESSAGE_TYPE_NOT_IMPLEM OR
+      ss_err  EQ ERR_INVALID_MID               OR
+      ss_err  EQ CAUSE_SERVICE_NOT_IMPLEM        )
+  return (TRUE);
+  else
+  return (FALSE);
+}
+#endif /* #ifndef SS_SS_C */