diff g23m/condat/ms/src/aci/psa_ccp.c @ 0:509db1a7b7b8

initial import: leo2moko-r1
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 01 Jun 2015 03:24:05 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/g23m/condat/ms/src/aci/psa_ccp.c	Mon Jun 01 03:24:05 2015 +0000
@@ -0,0 +1,2106 @@
+/* 
++----------------------------------------------------------------------------- 
+|  Project :  GSM-PS (6147)
+|  Modul   :  PSA_CCP
++----------------------------------------------------------------------------- 
+|  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 defines the processing functions for the
+|             primitives send to the protocol stack adapter by call
+|             control.
++----------------------------------------------------------------------------- 
+*/ 
+
+#ifndef PSA_CCP_C
+#define PSA_CCP_C
+#endif
+
+#include "aci_all.h"
+
+/*==== INCLUDES ===================================================*/
+#include "ccdapi.h"
+
+#include "aci_cmh.h"
+#include "ati_cmd.h"
+#include "aci_cmd.h"
+#include "aci_mem.h"
+#include "aci_lst.h"
+
+#ifdef FAX_AND_DATA
+#include "aci_fd.h"
+#endif    /* of #ifdef FAX_AND_DATA */
+
+#include "aci.h"
+#include "psa.h"
+#include "psa_cc.h"
+#include "psa_ss.h"
+#include "psa_mmi.h"
+#include "psa_mm.h"
+#include "cmh.h"
+#include "cmh_cc.h"
+
+#ifdef SIM_TOOLKIT
+#include "psa_sat.h"
+#include "cmh_sat.h"
+#endif    /* of #ifdef SIM_TOOLKIT */
+
+#include "aoc.h"
+#include "psa_sim.h"
+
+#if defined (FF_WAP) || defined (FF_SAT_E)
+#include "wap_aci.h"
+#endif /* of FF_WAP */
+
+#include "l4_tim.h"
+
+/*==== CONSTANTS ==================================================*/
+
+
+/*==== TYPES ======================================================*/
+
+
+/*==== EXPORT =====================================================*/
+
+#ifdef FF_EM_MODE
+EXTERN USHORT em_relcs;
+#endif /* FF_EM_MODE
+
+/*==== VARIABLES ==================================================*/
+
+EXTERN T_PCEER causeMod;
+EXTERN SHORT causeCeer;
+
+/*==== FUNCTIONS ==================================================*/
+
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_CCP                 |
+|                                 ROUTINE : psa_mncc_setup_ind      |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the MNCC_SETUP_IND primitive send by CC.
+            this indicates an incoming call.
+
+*/
+// CC test 0319
+extern void CongiureGPIO_Internal(int GpioPin);
+extern void HighGPIO(int GpioPin);
+extern void LowGPIO(int GpioPin);
+// end
+
+GLOBAL const void psa_mncc_setup_ind
+                   ( T_MNCC_SETUP_IND *mncc_setup_ind )
+{
+  SHORT cId;                 /* holds call id */
+  T_CC_CALL_TBL * pCtbNtry;  /* holds pointer to call table entry */
+  int i;
+
+  TRACE_FUNCTION ("psa_mncc_setup_ind()");
+
+  causeMod  = P_CEER_mod;      /* Clear module which was set for ceer */
+  causeCeer = CEER_NotPresent; /* Clear extended error cause */
+
+// CC test 0319
+   CongiureGPIO_Internal(1);
+//   LowGPIO(1);
+// end
+
+  /* stop redialling timer if necessary */
+  if (rdlPrm.rdlcId NEQ NO_ENTRY)
+  {
+    TIMERSTOP(ACI_REPEAT_HND);
+    
+    #ifdef SIM_TOOLKIT
+      if( ( ccShrdPrm.ctb[rdlPrm.rdlcId]->SATinv & SAT_REDIAL ) )
+      { /* This is the call invoked by SAT */
+        T_ACI_SAT_TERM_RESP resp_data;
+
+        psaSAT_InitTrmResp( &resp_data );
+        psaSAT_SendTrmResp( RSLT_USR_CLR_DWN, &resp_data );
+      }
+    #endif /* SIM_TOOLKIT */
+
+    psaCC_FreeCtbNtry (rdlPrm.rdlcId);  
+    for(i = 0; i < CMD_SRC_MAX; i++)
+    {
+      R_AT(RAT_RDL, i)(REDIAL_STOP);
+    }
+    /* reset some redial parameter */
+    rdlPrm.rdlcId =   NO_ENTRY;
+  }
+
+/*
+ *-------------------------------------------------------------------
+ * check for new entry in call table
+ *-------------------------------------------------------------------
+ */
+  cId = psaCC_ctbNewEntry();
+
+  if( cId < 0 )
+  {
+   /*
+    * disconnect call, due to full call table.
+    */
+    {
+      UBYTE ti = mncc_setup_ind -> ti;
+      PREUSE (mncc_setup_ind, mncc_disconnect_req, MNCC_DISCONNECT_REQ);
+      mncc_disconnect_req -> ti    = ti;
+      mncc_disconnect_req -> cause = MNCC_CAUSE_USER_BUSY;
+      mncc_disconnect_req -> fac_inf.l_fac = 0;
+      mncc_disconnect_req -> ss_version = SS_VER_NOT_PRES;
+      PSENDX (CC, mncc_disconnect_req);
+    }
+
+    TRACE_EVENT ("MTC rejected due to full call table");
+
+    return;
+  }
+
+/*
+ *-------------------------------------------------------------------
+ * update shared parameter and notify ACI
+ *-------------------------------------------------------------------
+ */
+  pCtbNtry = ccShrdPrm.ctb[cId];
+  pCtbNtry -> curCs = MNCC_CAUSE_NO_MS_CAUSE;
+
+  pCtbNtry -> ti         = mncc_setup_ind -> ti;
+  pCtbNtry -> rptInd     = mncc_setup_ind -> ri;
+  pCtbNtry -> sigInf     = mncc_setup_ind -> sig;
+  pCtbNtry -> clgPty     = mncc_setup_ind -> calling_party;
+  pCtbNtry -> clgPtySub  = mncc_setup_ind -> calling_party_sub;
+
+  /*
+   * Assign called party 
+   */
+  pCtbNtry -> cldPty.ton = mncc_setup_ind -> called_party.ton;
+  pCtbNtry -> cldPty.npi = mncc_setup_ind -> called_party.npi;
+  pCtbNtry -> cldPty.c_called_num = 
+    mncc_setup_ind -> called_party.c_called_num;
+  if (pCtbNtry -> cldPty.called_num NEQ NULL)
+  {
+    ACI_MFREE (pCtbNtry -> cldPty.called_num);
+    pCtbNtry -> cldPty.called_num = NULL;
+  }
+  if (pCtbNtry -> cldPty.c_called_num NEQ 0)
+  {
+    ACI_MALLOC (pCtbNtry -> cldPty.called_num, 
+                pCtbNtry -> cldPty.c_called_num);
+    memcpy (pCtbNtry -> cldPty.called_num, 
+            mncc_setup_ind -> called_party.called_num,
+            mncc_setup_ind -> called_party.c_called_num);
+  }
+
+  /*
+   * Assign called party subaddress
+   */
+  pCtbNtry -> cldPtySub  = mncc_setup_ind -> called_party_sub;
+
+  /* 
+   * Assign redirecting party
+   */
+  pCtbNtry -> rdrPty.ton     = mncc_setup_ind -> redirecting_party.ton; 
+  pCtbNtry -> rdrPty.npi     = mncc_setup_ind -> redirecting_party.npi;
+  pCtbNtry -> rdrPty.present = mncc_setup_ind -> redirecting_party.present; 
+  pCtbNtry -> rdrPty.screen  = mncc_setup_ind -> redirecting_party.screen;
+  pCtbNtry -> rdrPty.c_redir_num = 
+    mncc_setup_ind -> redirecting_party.c_redir_num;
+  if (pCtbNtry -> rdrPty.redir_num NEQ NULL)
+  {
+    ACI_MFREE (pCtbNtry -> rdrPty.redir_num);
+    pCtbNtry -> rdrPty.redir_num = NULL;
+  }
+  if (pCtbNtry -> rdrPty.c_redir_num NEQ 0)
+  {
+    ACI_MALLOC (pCtbNtry -> rdrPty.redir_num,
+                pCtbNtry -> rdrPty.c_redir_num);
+    memcpy (pCtbNtry -> rdrPty.redir_num, 
+            mncc_setup_ind -> redirecting_party.redir_num,
+            mncc_setup_ind -> redirecting_party.c_redir_num);
+  }
+
+  /* 
+   * Assign redirecting party subaddress
+   */
+  pCtbNtry -> rdrPtySub.tos       = 
+    mncc_setup_ind -> redirecting_party_sub.tos; 
+  pCtbNtry -> rdrPtySub.odd_even  = 
+    mncc_setup_ind -> redirecting_party_sub.odd_even;
+  pCtbNtry -> rdrPtySub.c_subaddr = 
+    mncc_setup_ind -> redirecting_party_sub.c_subaddr;
+  if (pCtbNtry -> rdrPtySub.subaddr NEQ NULL)
+  {
+    ACI_MFREE (pCtbNtry -> rdrPtySub.subaddr);
+    pCtbNtry -> rdrPtySub.subaddr = NULL;
+  }
+  if (pCtbNtry -> rdrPtySub.c_subaddr NEQ 0)
+  {
+    ACI_MALLOC (pCtbNtry -> rdrPtySub.subaddr, 
+                pCtbNtry -> rdrPtySub.c_subaddr);
+    memcpy (pCtbNtry -> rdrPtySub.subaddr, 
+            mncc_setup_ind -> redirecting_party_sub.subaddr,
+            mncc_setup_ind -> redirecting_party_sub.c_subaddr);
+  }
+
+  /* 
+   * Assign bearer caps
+   */  
+  memcpy( &(pCtbNtry->BC[0]),&(mncc_setup_ind->bcpara),
+          sizeof( T_bcpara) );
+  memcpy( &(pCtbNtry->BC[1]),&(mncc_setup_ind->bcpara2),
+          sizeof( T_bcpara) );
+
+  psaCC_phbSrchNum( cId, CT_MTC );
+
+  pCtbNtry -> calStat = CS_ACT_REQ;
+  pCtbNtry -> calType = CT_MTC;
+
+  pCtbNtry -> prio  = PRIO_NORM_CALL;
+  pCtbNtry -> curBC = 0;
+
+  psaCC_send_satevent( EVENT_MT_CALL, cId, FAR_END, FALSE );
+
+/*
+ *-------------------------------------------------------------------
+ * indicate alerting
+ *-------------------------------------------------------------------
+ */
+
+  /* replace invalid/unknown sigInf by SIG_NOT_PRES */
+  switch (pCtbNtry -> sigInf)
+  {
+    case SIG_DIAL_TONE_ON:
+    case SIG_RING_BACK_TONE_ON:
+    case SIG_INT_TONE_ON:
+    case SIG_NET_CONG_TONE_ON:
+    case SIG_BUSY_TONE_ON:
+    case SIG_CONF_TONE_ON:
+    case SIG_ANS_TONE_ON:
+    case SIG_CALL_WAIT_TONE_ON:
+    case SIG_OFF_HOOK_WARN_TONE_ON:
+    case SIG_TONES_OFF:
+    case SIG_ALERT_OFF:
+    case SIG_NOT_PRES:
+      break; /* leave as it is */
+    default: /* replace unknown value by something well known */
+      pCtbNtry -> sigInf = SIG_NOT_PRES;
+  }
+
+  if( pCtbNtry -> sigInf NEQ SIG_NOT_PRES OR
+      ccShrdPrm.TCHasg EQ TRUE )
+  {
+    {
+      /* indicate alerting to network */
+      UBYTE ti = mncc_setup_ind -> ti;
+      PREUSE (mncc_setup_ind, mncc_alert_req, MNCC_ALERT_REQ);
+      mncc_alert_req -> ti    = ti;
+      PSENDX (CC, mncc_alert_req);
+    }
+
+    cmhCC_IncomingCall (cId);    /* indicate an incoming call */
+    return;
+  }
+  else
+  {
+    pCtbNtry -> alrtStat = AS_PND;
+  }
+
+  /*
+   * check for progress descriptions
+   */
+  psaCC_chkPrgDesc ( cId, mncc_setup_ind -> progress_desc, MT_SETUP );
+
+  /*
+   * start call time measurements
+   */
+  aoc_info (cId, AOC_START_TIME);
+/*
+ *-------------------------------------------------------------------
+ * free the primitive buffer
+ *-------------------------------------------------------------------
+ */
+  PFREE (mncc_setup_ind);
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_CCP                 |
+|                                 ROUTINE : psa_mncc_setup_cnf      |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the MNCC_SETUP_CNF primitive send by CC.
+            this terminates the call establishment request.
+
+*/
+
+GLOBAL const void psa_mncc_setup_cnf
+                                 ( T_MNCC_SETUP_CNF *mncc_setup_cnf )
+{
+  SHORT cId;                 /* holds call id */
+  T_CC_CALL_TBL * pCtbNtry;  /* holds pointer to call table entry */
+  int i;
+  BOOL flag_redial = FALSE;
+
+  TRACE_FUNCTION ("psa_mncc_setup_cnf()");
+
+/*
+ *-------------------------------------------------------------------
+ * find call in call table
+ *-------------------------------------------------------------------
+ */
+  cId = psaCC_ctbFindTi( mncc_setup_cnf -> ti );
+
+  if( cId < 0 )
+  {
+   /*
+    * ignore primitive, due to not found transaction identifier.
+    */
+    TRACE_EVENT ("primitive rejected due to unused ti");
+    PFREE(mncc_setup_cnf);
+    return;
+  }
+
+/*
+ *-------------------------------------------------------------------
+ * update shared parameter and notify ACI
+ *-------------------------------------------------------------------
+ */
+  pCtbNtry = ccShrdPrm.ctb[cId];
+  pCtbNtry -> curCs = mncc_setup_cnf -> cause;
+  pCtbNtry -> rslt = mncc_setup_cnf -> cause;
+
+
+  switch( mncc_setup_cnf -> cause )
+  {
+    case( MNCC_CAUSE_SUCCESS ):    /* successful establishment, call connected */
+
+      /* 
+       * MNCC_SETUP_CNF is received in call state other than CS_ACT_REQ
+       * so reject the primitive.
+      */
+      if( pCtbNtry -> calStat NEQ CS_ACT_REQ)
+      {
+        TRACE_EVENT ("MNCC_SETUP_CNF is rejected as it is received in call state other than CS_ACT_REQ");
+        break;
+      }
+      pCtbNtry -> clgPty.ton     = mncc_setup_cnf -> connected_number.ton;
+      pCtbNtry -> clgPty.npi     = mncc_setup_cnf -> connected_number.npi;
+      pCtbNtry -> clgPty.present = mncc_setup_cnf -> connected_number.present;
+      pCtbNtry -> clgPty.screen  = mncc_setup_cnf -> connected_number.screen;
+      pCtbNtry -> clgPty.c_num   = mncc_setup_cnf -> connected_number.c_num;
+
+      memcpy( pCtbNtry -> clgPty.num,
+              mncc_setup_cnf -> connected_number.num, MAX_CC_CALLING_NUMBER );
+
+      pCtbNtry -> clgPtySub.tos = mncc_setup_cnf -> connected_number_sub.tos;
+      pCtbNtry -> clgPtySub.odd_even = mncc_setup_cnf -> connected_number_sub.odd_even;
+      pCtbNtry -> clgPtySub.c_subaddr = mncc_setup_cnf -> connected_number_sub.c_subaddr;
+
+      memcpy( pCtbNtry -> clgPtySub.subaddr,
+              mncc_setup_cnf -> connected_number_sub.subaddr, SUB_LENGTH );
+
+      pCtbNtry -> inBndTns = FALSE;
+      pCtbNtry -> calStat  = CS_ACT;
+
+      /* check for progress descriptions */
+      psaCC_chkPrgDesc ( cId, mncc_setup_cnf -> progress_desc, MT_CONN );
+
+
+      if(pCtbNtry->calType EQ CT_MOC_RDL)
+      {
+        pCtbNtry->calType = CT_MOC;
+        flag_redial = TRUE;
+      }
+      /* if redialling procedure was successful we finish redialling */
+      if((rdlPrm.rdlMod EQ AUTOM_REPEAT_ON) AND flag_redial)
+      {
+        for(i = 0; i < CMD_SRC_MAX; i++)
+        {
+          R_AT(RAT_RDL, i)(CALL_ATTEMPT_SUCCESSFUL); 
+        }
+        pCtbNtry->rdlCnt = 0;
+        rdlPrm.rdlcId = NO_ENTRY;
+        pCtbNtry->rdlTimIndex = RDL_TIM_INDEX_NOT_PRESENT;
+        flag_redial = FALSE;
+      }
+    
+      /* Inform that a call goes to active state */
+      psaCC_chngCalTypCnt( cId, +1 );
+
+      cmhCC_CallConnected( cId );
+
+      psaCC_send_satevent( EVENT_CALL_CONN, cId, FAR_END, FALSE );
+
+      aoc_info (cId,AOC_CALL_CONNECTED);
+
+      /* check for TTY service */
+      cmhCC_TTY_Control ( cId, TTY_START );
+
+      /* check for DTMF tones to send automatically */
+      psaCC_DTMFSent ( cId );
+
+#if defined (FF_WAP) || defined (FF_SAT_E)
+      /* WAP STACK CALL is activ */
+      if (Wap_Call)
+        ccShrdPrm.wapStat = CC_WAP_STACK_UP;
+#endif
+
+      break;
+
+    default:            /* unexpected result, assumed call disconnected */
+      {
+        TRACE_EVENT_P1("[ERR] UNEXP CAUSE IN SETUP CNF=%4x", mncc_setup_cnf -> cause);
+      }
+      /*FALLTHROUGH*/ /*lint -fallthrough*/
+
+    /* unsuccessful establishment, call disconnected */
+    case( MNCC_CAUSE_MS_TIMER ):
+
+      pCtbNtry -> nrmCs = CAUSE_MAKE(DEFBY_CONDAT, ORIGSIDE_MS, CC_ORIGINATING_ENTITY, NOT_PRESENT_8BIT);
+      pCtbNtry -> rejCs = CAUSE_MAKE(DEFBY_CONDAT, ORIGSIDE_MS, CC_ORIGINATING_ENTITY, NOT_PRESENT_8BIT);
+#ifdef FF_EM_MODE
+      em_relcs = MNCC_CAUSE_MS_TIMER;
+#endif /* FF_EM_MODE */
+      ccShrdPrm.cIdFail = cId;
+
+      /* 
+       * At this point the call has not yet gone completely always.
+       * Call Control may not be in state U0, but in state U11, having
+       * sent a DISCONNECT to the network, expecting the RELEASE
+       * from the network or expiry of T308 in CC.
+       * Implementation works, but it is not very nice here, releasing
+       * the ti and decrementing the call count too early.
+       */
+      pCtbNtry -> calStat = CS_IDL;
+
+      psaCC_chngCalTypCnt( cId, -1 );
+      psaCC_retMOCTi( pCtbNtry -> ti );
+      cmhCC_CallDisconnected (cId);
+      psaCC_FreeCtbNtry (cId);
+      break;
+  }
+/*
+ *-------------------------------------------------------------------
+ * free the primitive buffer
+ *-------------------------------------------------------------------
+ */
+  PFREE (mncc_setup_cnf);
+
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_CCP                 |
+|                                 ROUTINE : psa_mncc_setup_compl_ind|
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the MNCC_SETUP_COMPL_IND primitive send by CC.
+            this terminates the call establishment of an incoming call.
+
+*/
+
+GLOBAL const void psa_mncc_setup_compl_ind
+                       ( T_MNCC_SETUP_COMPL_IND *mncc_setup_compl_ind )
+{
+  SHORT cId;                 /* holds call id */
+  T_CC_CALL_TBL * pCtbNtry;  /* holds pointer to call table entry */
+
+  TRACE_FUNCTION ("psa_mncc_setup_compl_ind()");
+
+/*
+ *-------------------------------------------------------------------
+ * find call in call table
+ *-------------------------------------------------------------------
+ */
+  cId = psaCC_ctbFindTi( mncc_setup_compl_ind -> ti );
+
+  if( cId < 0 )
+  {
+   /*
+    * ignore primitive, due to not found transaction identifier.
+    */
+    TRACE_EVENT ("primitive rejected due to unused ti");
+    PFREE(mncc_setup_compl_ind);
+    return;
+  }
+
+/*
+ *-------------------------------------------------------------------
+ * update shared parameter and notify ACI
+ *-------------------------------------------------------------------
+ */
+  pCtbNtry = ccShrdPrm.ctb[cId];
+
+  pCtbNtry -> rslt = mncc_setup_compl_ind -> cause;
+  pCtbNtry -> curCs = mncc_setup_compl_ind -> cause;
+
+  switch( mncc_setup_compl_ind -> cause )
+  {
+    case( MNCC_CAUSE_SUCCESS ):    /* successful establishment, call connected */
+
+      pCtbNtry -> inBndTns = FALSE;
+      pCtbNtry -> calStat  = CS_ACT;
+
+      psaCC_setSpeechMode ();
+
+      /* check for TTY service */
+      cmhCC_TTY_Control ( cId, TTY_START );
+
+      /*
+       * Inform that a call goes to active state
+       */
+      psaCC_chngCalTypCnt( cId, +1 );
+
+      cmhCC_CallConnected( cId );
+
+      aoc_info (cId, AOC_CALL_CONNECTED);
+      break;
+
+    default:            /* unexpected result, assumed call disconnected */
+      {
+        TRACE_EVENT_P1("[ERR] UNEXP CAUSE IN SETUP CMPL IND=%4x", mncc_setup_compl_ind -> cause);
+      }
+      /*FALLTHROUGH*/ /*lint -fallthrough*/
+
+    /* unsuccessful establishment, call disconnected */
+    case( MNCC_CAUSE_MS_TIMER ):
+
+      pCtbNtry -> nrmCs = CAUSE_MAKE(DEFBY_CONDAT, ORIGSIDE_MS, CC_ORIGINATING_ENTITY, NOT_PRESENT_8BIT);
+      pCtbNtry -> rejCs = CAUSE_MAKE(DEFBY_CONDAT, ORIGSIDE_MS, CC_ORIGINATING_ENTITY, NOT_PRESENT_8BIT);
+#ifdef FF_EM_MODE
+      em_relcs = CAUSE_MAKE(DEFBY_CONDAT, ORIGSIDE_MS, CC_ORIGINATING_ENTITY, NOT_PRESENT_8BIT);
+#endif /* FF_EM_MODE */
+      ccShrdPrm.cIdFail = cId;
+      
+      /*
+       * What happens below is somewhat questionable.
+       * ACI sets the call to CS_IDL and free the transaction identifier.
+       * What happened is that on CC level, in state U8 CONNECT REQUEST the
+       * CONNECT message sent by CC has not been answered by the network by a 
+       * CONNECT ACNOWLEDGE message.
+       * In this situation CC sends a DISCONNECT to the network and enters
+       * state U11 DISCONNECT REQUEST. This means, the call state in CC is
+       * still different from U0 NULL.
+       * However, problems in the field are not expected here.
+       */
+      pCtbNtry -> calStat = CS_IDL;
+
+      psaCC_chngCalTypCnt( cId, -1 );
+      psaCC_retMOCTi( pCtbNtry -> ti );
+
+      cmhCC_CallDisconnected (cId);
+      cmhCC_CallReleased (cId);
+
+      break;
+  }
+
+/*
+ *-------------------------------------------------------------------
+ * free the primitive buffer
+ *-------------------------------------------------------------------
+ */
+  PFREE (mncc_setup_compl_ind);
+
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_CCP                 |
+|                                 ROUTINE : psa_mncc_reject_ind     |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the MNCC_REJECT_IND primitive send by CC.
+            this indicates a cause for rejecting a call establishment.
+
+*/
+
+GLOBAL const void psa_mncc_reject_ind
+                               ( T_MNCC_REJECT_IND *mncc_reject_ind )
+{
+  SHORT cId;                 /* holds call id */
+  T_CC_CALL_TBL * pCtbNtry;  /* holds pointer to call table entry */
+
+  TRACE_FUNCTION ("psa_mncc_reject_ind()");
+
+/*
+ *-------------------------------------------------------------------
+ * find call in call table
+ *-------------------------------------------------------------------
+ */
+  cId = psaCC_ctbFindTi( mncc_reject_ind -> ti );
+
+  if( cId < 0 )
+  {
+   /*
+    * ignore primitive, due to not found transaction identifier.
+    */
+    TRACE_EVENT ("primitive rejected due to unused ti");
+    PFREE(mncc_reject_ind);
+    return;
+  }
+  psaCC_StopDTMF (cId); /* HM 27.07.00*/
+
+/*
+ *-------------------------------------------------------------------
+ * update shared parameter and notify ACI
+ *-------------------------------------------------------------------
+ */
+  pCtbNtry = ccShrdPrm.ctb[cId];
+  pCtbNtry -> curCs = mncc_reject_ind -> cause;
+
+  pCtbNtry -> rslt  = CAUSE_MAKE(DEFBY_CONDAT, ORIGSIDE_MS, CC_ORIGINATING_ENTITY, NOT_PRESENT_8BIT);
+  pCtbNtry -> nrmCs = CAUSE_MAKE(DEFBY_CONDAT, ORIGSIDE_MS, CC_ORIGINATING_ENTITY, NOT_PRESENT_8BIT);
+  pCtbNtry -> rejCs = mncc_reject_ind -> cause;
+  /* In this case, the cause values are internal and not sent by network */
+  pCtbNtry -> numRawCauseBytes = 0; 
+
+#ifdef FF_EM_MODE
+  em_relcs = mncc_reject_ind -> cause;
+#endif /* FF_EM_MODE */  
+
+  if( GET_CAUSE_VALUE(pCtbNtry -> rejCs) NEQ NOT_PRESENT_8BIT ) ccShrdPrm.cIdFail = cId;
+
+  pCtbNtry -> calStat = CS_IDL;
+
+  psaCC_chngCalTypCnt( cId, -1 );
+  psaCC_retMOCTi( pCtbNtry -> ti );
+
+  /* monitoring for SAT radio-link failure */
+  psaCC_send_satevent( EVENT_CALL_DISC, cId, NEAR_END, TRUE );
+
+  /* check conditions for redialling */
+  cmhCC_redialCheck(cId);
+
+#ifdef SIM_TOOLKIT
+        if( pCtbNtry->SATinv )
+        {
+          cmhSAT_NtwErr( ADD_NO_CAUSE );
+          pCtbNtry->SATinv = FALSE;
+        }
+#endif
+  /* cmhCC_CallDisconnected(cId);*/
+  cmhCC_CPIrejectMsg(cId);
+  cmhCC_CallReleased(cId);
+
+/* free the primitive buffer */
+  PFREE (mncc_reject_ind);
+
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_CCP                 |
+|                                 ROUTINE : psa_mncc_release_ind    |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the MNCC_RELEASE_IND primitive send by CC.
+  this indicates the release of a call.
+  
+*/
+
+GLOBAL const void psa_mncc_release_ind
+( T_MNCC_RELEASE_IND *mncc_release_ind )
+{
+  SHORT cId;                 /* holds call id */
+  T_CC_CALL_TBL * pCtbNtry;  /* holds pointer to call table entry */
+  
+  TRACE_FUNCTION ("psa_mncc_release_ind()");
+  
+  /*
+  *-------------------------------------------------------------------
+  * find call in call table
+  *-------------------------------------------------------------------
+  */
+  cId = psaCC_ctbFindTi( mncc_release_ind -> ti );
+  
+  if( cId < 0 )
+  {
+    psaCC_retMOCTi( mncc_release_ind -> ti );
+    
+    /*
+    * ignore primitive, due to not found transaction identifier.
+    */
+    TRACE_EVENT ("primitive rejected due to unused ti");
+    PFREE(mncc_release_ind);
+    return;
+  }
+  psaCC_StopDTMF ( cId ); /* HM 27.07.00 */
+  
+ /*
+  *-------------------------------------------------------------------
+  * update shared parameter and notify ACI
+  *-------------------------------------------------------------------
+  */
+  pCtbNtry = ccShrdPrm.ctb[cId];
+  
+  pCtbNtry -> calStat = CS_DSC_REQ; /* Leave active state */
+  pCtbNtry -> curCs = mncc_release_ind -> cause;
+  pCtbNtry -> numRawCauseBytes = mncc_release_ind -> c_raw_cause;
+  pCtbNtry -> rawCauseBytes    = mncc_release_ind -> raw_cause;
+
+  psaCC_setSpeechMode ();
+  
+  /* check for TTY service */
+  /*cmhCC_TTY_Control ( cId );*/
+  
+  if (pCtbNtry -> nrmCs EQ MNCC_CAUSE_NO_MS_CAUSE)    /* no Disconnect Cause available...*/
+  {
+    pCtbNtry -> nrmCs= mncc_release_ind -> cause; /* Check ### */
+    ccShrdPrm.cIdFail = cId; /* Check ### */
+#ifdef FF_EM_MODE
+    em_relcs = mncc_release_ind -> cause; /* Check ### */
+#endif /* FF_EM_MODE */  
+  }
+  
+  pCtbNtry -> rejCs = CAUSE_MAKE(DEFBY_CONDAT, ORIGSIDE_MS, CC_ORIGINATING_ENTITY, NOT_PRESENT_8BIT);
+  pCtbNtry -> rslt  = CAUSE_MAKE(DEFBY_CONDAT, ORIGSIDE_MS, CC_ORIGINATING_ENTITY, NOT_PRESENT_8BIT);
+  
+  psaCC_chngCalTypCnt( cId, -1 );
+  psaCC_retMOCTi( pCtbNtry -> ti );
+  
+  psaCC_send_satevent( EVENT_CALL_DISC, cId, FAR_END, TRUE );
+
+  pCtbNtry -> numRawCauseBytes = 0; /* Reset the cause value after sending the info to SAT */
+
+  cmhCC_redialCheck(cId);
+  
+  /*
+  if( pCtbNtry -> CCBSstat EQ CCBSS_PSSBL OR
+  pCtbNtry -> calType  EQ CT_NI_MOC      )
+  */
+  switch (pCtbNtry->curCmd)
+  {
+  case( AT_CMD_A ):
+  case( AT_CMD_D ):
+  case( AT_CMD_NONE ):
+  case( AT_CMD_ABRT ):
+    {
+      cmhCC_CallDisconnected(cId);
+      cmhCC_CallReleased( cId );
+    }
+    break;
+    
+  case( AT_CMD_H ):
+  case( AT_CMD_Z ):
+  case( AT_CMD_CHUP ):
+  case( AT_CMD_CHLD ):
+    
+#ifdef FF_FAX
+  case( AT_CMD_FKS ):
+  case( AT_CMD_FDT ):
+  case( AT_CMD_FDR ):
+#endif
+    {
+      cmhCC_CallDisconnected(cId);
+      cmhCC_CPIReleaseMsg(cId);
+    }
+    break;
+  }
+
+  if (rdlPrm.rdlcId NEQ cId)
+  {/* if redialling is active no clean cId entry */
+    /*patch BE 30.06.00 to remove every other call drops*/
+    psaCC_FreeCtbNtry (cId);
+    /*end patch BE */
+  }
+  
+  /* free the primitive buffer */
+  PFREE (mncc_release_ind);
+  
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_CCP                 |
+|                                 ROUTINE : psa_mncc_release_cnf    |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the MNCC_RELEASE_CNF primitive send by CC.
+            this confirmates the release request for a call.
+
+*/
+
+GLOBAL const void psa_mncc_release_cnf
+                             ( T_MNCC_RELEASE_CNF *mncc_release_cnf )
+{
+  SHORT cId;                 /* holds call id */
+  T_CC_CALL_TBL * pCtbNtry;  /* holds pointer to call table entry */
+
+  TRACE_FUNCTION ("psa_mncc_release_cnf()");
+
+/*
+ *-------------------------------------------------------------------
+ * find call in call table
+ *-------------------------------------------------------------------
+ */
+  cId = psaCC_ctbFindTi( mncc_release_cnf -> ti );
+
+  if( cId < 0 )
+  {
+    psaCC_retMOCTi( mncc_release_cnf -> ti );
+
+   /*
+    * ignore primitive, due to not found transaction identifier.
+    */
+    TRACE_EVENT ("primitive rejected due to unused ti");
+    PFREE(mncc_release_cnf);
+    return;
+  }
+
+/*
+ *-------------------------------------------------------------------
+ * update shared parameter and notify ACI
+ *-------------------------------------------------------------------
+ */
+  pCtbNtry = ccShrdPrm.ctb[cId];
+
+  /* HM 02-Aug-2002, done while merging SBK code, check again this code*/
+#if 0 /* Old code */
+  if( mncc_release_cnf -> cause NEQ CAUSE_NOT_PRES )
+  {
+    pCtbNtry -> nrmCs = mncc_release_cnf -> cause;
+    ccShrdPrm.cIdFail = cId;
+#ifdef FF_EM_MODE
+    em_relcs = mncc_release_cnf -> cause;
+#endif /* FF_EM_MODE */  
+  }
+#endif /* #if 0 */
+
+  if (pCtbNtry -> nrmCs EQ MNCC_CAUSE_NO_MS_CAUSE)    /* no Disconnect Cause available...*/
+  {
+    pCtbNtry -> nrmCs = mncc_release_cnf -> cause; /* Recheck ###*/
+    ccShrdPrm.cIdFail = cId;  /* This line is considered harmful, only if cause present ### */
+#ifdef FF_EM_MODE
+    em_relcs = mncc_release_cnf -> cause;  /* Recheck ### */
+#endif /* FF_EM_MODE */  
+  }
+  pCtbNtry -> rslt  = CAUSE_MAKE(DEFBY_CONDAT, ORIGSIDE_MS, CC_ORIGINATING_ENTITY, NOT_PRESENT_8BIT);
+  pCtbNtry -> rejCs = CAUSE_MAKE(DEFBY_CONDAT, ORIGSIDE_MS, CC_ORIGINATING_ENTITY, NOT_PRESENT_8BIT);
+  pCtbNtry -> curCs = pCtbNtry -> rejCs;
+  pCtbNtry -> numRawCauseBytes = mncc_release_cnf -> c_raw_cause;
+  pCtbNtry -> rawCauseBytes    = mncc_release_cnf -> raw_cause;
+#ifdef SIM_TOOLKIT
+  if(!(pCtbNtry -> SATinv & SAT_REDIAL))
+#endif
+    pCtbNtry -> calStat = CS_IDL;
+
+  psaCC_chngCalTypCnt( cId, -1 );
+  psaCC_retMOCTi( pCtbNtry -> ti );
+
+  psaCC_send_satevent( EVENT_CALL_DISC, cId , FAR_END, TRUE );
+
+  pCtbNtry -> numRawCauseBytes = 0; /* Reset the cause value after sending the info to SAT */
+
+  cmhCC_redialCheck( cId);
+
+  cmhCC_CallReleased (cId);
+
+  /*patch BE 30.06.00 to remove every other call drops */
+  {
+#ifdef SIM_TOOLKIT
+    if ( (pCtbNtry -> SATinv & SAT_REDIAL) EQ 0 )
+    {
+#endif  /* SIM_TOOLKIT */
+      if (rdlPrm.rdlcId NEQ cId)
+      {
+        psaCC_FreeCtbNtry (cId);
+      }
+#ifdef SIM_TOOLKIT
+    }
+#endif  /* SIM_TOOLKIT */
+  }
+  /*end patch BE */
+
+  switch(CHLDaddInfo)
+  {
+    case (CHLD_ADD_INFO_DIAL_CAL):
+      cId = psaCC_ctbFindCall( NO_VLD_OWN, NO_VLD_CS, CT_MOC );
+      if (cId NEQ NO_ENTRY)
+      {
+        cmhCC_NewCall(cId,psaCC_ctb(cId)->curSrc,AT_CMD_D);
+      } 
+      break;
+    default:
+      break;
+  }
+  /* free the primitive buffer */
+  PFREE (mncc_release_cnf);
+
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_CCP                 |
+|                                 ROUTINE : psa_mncc_disconnect_ind |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the MNCC_DISCONNECT_IND primitive send by CC.
+            this indicates the disconnection of a call.
+
+*/
+
+GLOBAL const void psa_mncc_disconnect_ind
+                       ( T_MNCC_DISCONNECT_IND *mncc_disconnect_ind )
+{
+  SHORT cId;                 /* holds call id */
+  T_CC_CALL_TBL * pCtbNtry;  /* holds pointer to call table entry */
+  BOOL held_call = FALSE;
+
+  TRACE_FUNCTION ("psa_mncc_disconnect_ind()");
+
+/*
+ *-------------------------------------------------------------------
+ * find call in call table
+ *-------------------------------------------------------------------
+ */
+  cId = psaCC_ctbFindTi( mncc_disconnect_ind -> ti );
+
+  if( cId < 0 )
+  {
+   /*
+    * ignore primitive, due to not found transaction identifier.
+    */
+    TRACE_EVENT ("primitive rejected due to unused ti");
+    PFREE(mncc_disconnect_ind);
+    return;
+  }
+  psaCC_StopDTMF ( cId ); /* HM 27.07.00 */
+
+/*
+ *-------------------------------------------------------------------
+ * update shared parameter and notify ACI
+ *-------------------------------------------------------------------
+ */
+  pCtbNtry = ccShrdPrm.ctb[cId];
+
+  pCtbNtry -> curCs = mncc_disconnect_ind -> cause;
+
+  if( mncc_disconnect_ind->diagnostic EQ DIAG_CCBS_POSSIBLE )
+  {
+    pCtbNtry -> CCBSstat = CCBSS_PSSBL;
+  }
+
+  /* CQ 23619: copy ss diagnostic to shared parameters >> */
+  pCtbNtry->ssDiag = mncc_disconnect_ind->ss_diag;
+  /* CQ 23619 << */
+  
+#if 0
+ if( mncc_disconnect_ind -> cause NEQ CAUSE_NOT_PRES )
+  {
+    pCtbNtry -> nrmCs = mncc_disconnect_ind -> cause;
+    ccShrdPrm.cIdFail = cId;
+#ifdef FF_EM_MODE
+    em_relcs = mncc_disconnect_ind -> cause;
+#endif /* FF_EM_MODE */
+  }
+#endif 
+
+  pCtbNtry -> nrmCs = mncc_disconnect_ind -> cause; /* Recheck ### */
+  ccShrdPrm.cIdFail = cId; /* Recheck ### */
+#ifdef FF_EM_MODE
+  em_relcs = mncc_disconnect_ind -> cause; /* Recheck ### */
+#endif /* FF_EM_MODE */
+
+  /* remember if call is currently on hold */
+  if (pCtbNtry -> calStat EQ CS_HLD)
+    held_call = TRUE;
+  
+  /* calStat has to be set before calling psaCC_chkPrgDesc, otherwise
+     no CPI event will be send */
+  pCtbNtry -> calStat = CS_DSC_REQ; 
+
+  /* check for TTY service */
+  /* cmhCC_TTY_Control ( cId ); */
+
+  /* check for progress descriptions */
+  psaCC_chkPrgDesc ( cId, mncc_disconnect_ind -> progress_desc, MT_DISC );
+
+  pCtbNtry -> rslt  = CAUSE_MAKE(DEFBY_CONDAT, ORIGSIDE_MS, CC_ORIGINATING_ENTITY, NOT_PRESENT_8BIT);
+  pCtbNtry -> rejCs = CAUSE_MAKE(DEFBY_CONDAT, ORIGSIDE_MS, CC_ORIGINATING_ENTITY, NOT_PRESENT_8BIT);
+
+  pCtbNtry -> numRawCauseBytes = mncc_disconnect_ind -> c_raw_cause;
+  pCtbNtry -> rawCauseBytes    = mncc_disconnect_ind -> raw_cause;
+
+  psaCC_send_satevent( EVENT_CALL_DISC, cId , FAR_END, TRUE );
+
+  pCtbNtry -> numRawCauseBytes = 0; /* Reset the cause value after sending the info to SAT */
+
+  /* If call was held upon mncc_disconnect_ind it is cleared anyway */
+  if (held_call EQ TRUE)
+  {
+    TRACE_EVENT ("Release a held call");
+    cmhCC_CallDisconnected (cId);
+    psaCC_ClearCall (cId);
+  }
+  else
+  {
+    switch( cmhCC_getcalltype(cId) )
+    {
+      case( VOICE_CALL ):
+      {
+        /*
+         * if in-band tones are available and TCH is assigned, request to disconnect the call
+         * GSM 04.08/5.4.4.1.1.1
+         */
+        /*
+          TRACE_EVENT("psa_mncc_disconnect_ind(): --> VOICE CALL");
+          if ((pCtbNtry -> inBndTns EQ TRUE) 
+          AND (pCtbNtry -> CCBSstat EQ NO_VLD_CCBSS)
+          AND (ccShrdPrm.TCHasg EQ TRUE)) 
+          {
+            cmhCC_DisconnectCall (cId);
+          }
+          else
+          {
+            cmhCC_CallDisconnected (cId);
+          }
+        */
+         /* check conditions for redialling */
+         if((pCtbNtry->curCmd NEQ AT_CMD_H) AND
+            (pCtbNtry->curCmd NEQ AT_CMD_CHUP))
+         {
+           cmhCC_redialCheck(cId);
+         }
+
+
+        /*
+         * for CCBS support the "Prolonged Clearing Procedure"
+         * GSM 04.08/5.4.4.2.1
+         */
+        cmhCC_CallDisconnected (cId);
+
+        if ((pCtbNtry->inBndTns EQ TRUE)                  /* 5.4.4.2.1.1 */
+          AND (pCtbNtry->CCBSstat EQ NO_VLD_CCBSS))
+        {
+          if (ccShrdPrm.TCHasg NEQ TRUE)
+          {
+            TRACE_EVENT ("4.08/5.4.4.2.1.1 i)");
+            psaCC_ClearCall (cId);
+          }
+          else
+          {
+            TRACE_EVENT ("4.08/5.4.4.2.1.1 ii)");
+            psaCC_setSpeechMode();
+          }
+        }
+        else if (pCtbNtry->CCBSstat EQ CCBSS_PSSBL)       /* 5.4.4.2.2.1 */
+        {
+          TRACE_EVENT ("4.08/5.4.4.2.2.1");
+          psaCC_setSpeechMode();
+          cmhCC_SndDiscRsn( cId );                        /* FIXME: to emmit BUSY, but this is not good here
+                                                             since BUSY is final result code and will be
+                                                             emitted on Release again !!!!! */
+        }
+        else if ((pCtbNtry->inBndTns NEQ TRUE)            /* 5.4.4.2.3.1 */
+          AND (pCtbNtry->CCBSstat EQ NO_VLD_CCBSS))
+        {
+          TRACE_EVENT ("4.08/5.4.4.2.3.1");
+          psaCC_ClearCall (cId);
+        }
+        else                                              /* 5.4.4.2.3.2 */
+        {
+          TRACE_EVENT ("4.08/5.4.4.2.3.2");
+          psaCC_ClearCall (cId);
+        }
+        break;
+      }
+      default: /* all non voice calls */
+      {
+        /*
+         * see cmh_cc.h  T_CC_CALL_TYPE for all other call types
+         */
+        TRACE_EVENT("psa_mncc_disconnect_ind(): --> DATA CALL");
+        cmhCC_CallDisconnected (cId);
+        psaCC_ClearCall (cId);
+        break;
+      }
+    }
+  } /* else */
+
+  /* free the primitive buffer */
+  PFREE (mncc_disconnect_ind);
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_CCP                 |
+|                                 ROUTINE : psa_mncc_alert_ind      |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the MNCC_ALERT_IND primitive send by CC.
+            this indicates that the called party is alerted.
+
+*/
+
+GLOBAL const void psa_mncc_alert_ind
+                             ( T_MNCC_ALERT_IND *mncc_alert_ind )
+{
+  SHORT cId;                 /* holds call id */
+
+  TRACE_FUNCTION ("psa_mncc_alert_ind()");
+
+/*
+ *-------------------------------------------------------------------
+ * find call in call table
+ *-------------------------------------------------------------------
+ */
+  cId = psaCC_ctbFindTi( mncc_alert_ind -> ti );
+
+  if( cId < 0 )
+  {
+   /*
+    * ignore primitive, due to not found transaction identifier.
+    */
+    TRACE_EVENT ("primitive rejected due to unused ti");
+    PFREE(mncc_alert_ind);
+    return;
+  }
+
+/*
+ *-------------------------------------------------------------------
+ * update shared parameter and notify ACI
+ *-------------------------------------------------------------------
+ */
+  psaCC_ctb(cId)->alrtStat = AS_SND;
+  psaCC_ctb(cId)->curCs = MNCC_CAUSE_NO_MS_CAUSE;
+
+  /* check for progress descriptions */
+  psaCC_chkPrgDesc ( cId, mncc_alert_ind -> progress_desc, MT_ALRT );
+
+  /* check for TTY service */
+  cmhCC_TTY_Control ( cId, TTY_START );
+/*
+ *-------------------------------------------------------------------
+ * free the primitive buffer
+ *-------------------------------------------------------------------
+ */
+  PFREE (mncc_alert_ind);
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_CCP                 |
+|                                 ROUTINE : psa_mncc_call_proceed_ind|
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the MNCC_CALL_PROCEED_IND primitive send by CC.
+            this indicates a call proceeding information for a call.
+
+*/
+
+GLOBAL const void psa_mncc_call_proceed_ind
+                   ( T_MNCC_CALL_PROCEED_IND *mncc_call_proceed_ind )
+{
+  SHORT cId;                 /* holds call id */
+  T_CC_CALL_TBL * pCtbNtry;  /* holds pointer to call table entry */
+
+  TRACE_FUNCTION ("psa_mncc_call_proceed_ind()");
+
+/*
+ *-------------------------------------------------------------------
+ * find call in call table
+ *-------------------------------------------------------------------
+ */
+  cId = psaCC_ctbFindTi( mncc_call_proceed_ind -> ti );
+
+  if( cId < 0 )
+  {
+   /*
+    * ignore primitive, due to not found transaction identifier.
+    */
+    TRACE_EVENT ("primitive rejected due to unused ti");
+    PFREE(mncc_call_proceed_ind);
+    return;
+  }
+
+/*
+ *-------------------------------------------------------------------
+ * update shared parameter and notify ACI
+ *-------------------------------------------------------------------
+ */
+  pCtbNtry = ccShrdPrm.ctb[cId];
+  pCtbNtry -> curCs = MNCC_CAUSE_NO_MS_CAUSE;
+
+  memcpy( &(pCtbNtry->BC[0]),&(mncc_call_proceed_ind->bcpara),
+          sizeof( T_bcpara) );
+  memcpy( &(pCtbNtry->BC[1]),&(mncc_call_proceed_ind->bcpara2),
+          sizeof( T_bcpara) );
+  pCtbNtry -> rptInd = mncc_call_proceed_ind -> ri;
+
+  /* check for progress descriptions */
+  psaCC_chkPrgDesc ( cId, mncc_call_proceed_ind -> progress_desc, MT_PROC );
+
+  /* check for TTY service */
+  cmhCC_TTY_Control ( cId, TTY_START );
+/*
+ *-------------------------------------------------------------------
+ * free the primitive buffer
+ *-------------------------------------------------------------------
+ */
+  PFREE (mncc_call_proceed_ind);
+
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_CCP                 |
+|                                 ROUTINE : psa_mncc_progress_ind   |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the MNCC_PROGRESS_IND primitive send by CC.
+            this indicates a progress description for a call.
+
+*/
+
+GLOBAL const void psa_mncc_progress_ind
+                          ( T_MNCC_PROGRESS_IND *mncc_progress_ind )
+{
+  SHORT cId;                 /* holds call id */
+
+  TRACE_FUNCTION ("psa_mncc_progress_ind()");
+
+/*
+ *-------------------------------------------------------------------
+ * find call in call table
+ *-------------------------------------------------------------------
+ */
+  cId = psaCC_ctbFindTi( mncc_progress_ind -> ti );
+
+
+  if( cId < 0 )
+  {
+   /*
+    * ignore primitive, due to not found transaction identifier.
+    */
+    TRACE_EVENT ("primitive rejected due to unused ti");
+    PFREE(mncc_progress_ind);
+    return;
+  }
+  psaCC_ctb(cId)->curCs = MNCC_CAUSE_NO_MS_CAUSE;
+
+  /*
+   * check for progress descriptions
+   */
+  psaCC_chkPrgDesc ( cId, mncc_progress_ind -> progress_desc, MT_PROGR );
+
+/*
+ *-------------------------------------------------------------------
+ * free the primitive buffer
+ *-------------------------------------------------------------------
+ */
+  PFREE (mncc_progress_ind);
+
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_CCP                 |
+|                                 ROUTINE : psa_mncc_hold_cnf       |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the MNCC_HOLD_CNF primitive send by CC.
+            this confirmates that a call is being held.
+
+*/
+
+GLOBAL const void psa_mncc_hold_cnf
+                                ( T_MNCC_HOLD_CNF *mncc_hold_cnf )
+{
+  SHORT cId;                 /* holds call id */
+  T_CC_CALL_TBL * pCtbNtry;  /* holds pointer to call table entry */
+
+  TRACE_FUNCTION ("psa_mncc_hold_cnf()");
+
+/*
+ *-------------------------------------------------------------------
+ * find call in call table
+ *-------------------------------------------------------------------
+ */
+  cId = psaCC_ctbFindTi( mncc_hold_cnf -> ti );
+
+  if( cId < 0 )
+  {
+   /*
+    * ignore primitive, due to not found transaction identifier.
+    */
+    TRACE_EVENT ("primitive rejected due to unused ti");
+    PFREE(mncc_hold_cnf);
+    return;
+  }
+
+/*
+ *-------------------------------------------------------------------
+ * update shared parameter and notify ACI
+ *-------------------------------------------------------------------
+ */
+  pCtbNtry = ccShrdPrm.ctb[cId];
+
+  switch( mncc_hold_cnf -> cause )
+  {
+    case( MNCC_CAUSE_HOLD_SUCCESS ):    /* successful, call held */
+    case( MNCC_CAUSE_SUCCESS ):
+    case( MNCC_CAUSE_NO_MS_CAUSE ):
+
+      pCtbNtry -> calStat = CS_HLD;
+
+      psaCC_setSpeechMode ();
+
+      /* check for TTY service */
+      cmhCC_TTY_Control ( cId, TTY_PAUSE );
+      break;
+
+    default:    /* unsuccessful, call state unchanged */
+
+      ccShrdPrm.cIdFail   = cId;
+      pCtbNtry -> calStat = CS_ACT;
+      break;
+  }
+
+  pCtbNtry -> rslt = mncc_hold_cnf -> cause;
+
+  cmhCC_CallHeld(cId);
+
+/*
+ *-------------------------------------------------------------------
+ * free the primitive buffer
+ *-------------------------------------------------------------------
+ */
+  PFREE (mncc_hold_cnf);
+
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_CCP                 |
+|                                 ROUTINE : psa_mncc_retrieve_cnf   |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the MNCC_RETRIEVE_CNF primitive send by CC.
+            this confirmates that a call is retrieved.
+
+*/
+
+GLOBAL const void psa_mncc_retrieve_cnf
+                           ( T_MNCC_RETRIEVE_CNF *mncc_retrieve_cnf )
+{
+  SHORT cId;                 /* holds call id */
+  T_CC_CALL_TBL * pCtbNtry;  /* holds pointer to call table entry */
+
+  TRACE_FUNCTION ("psa_mncc_retrieve_cnf()");
+
+/*
+ *-------------------------------------------------------------------
+ * find call in call table
+ *-------------------------------------------------------------------
+ */
+  cId = psaCC_ctbFindTi( mncc_retrieve_cnf -> ti );
+
+  if( cId < 0 )
+  {
+   /*
+    * ignore primitive, due to not found transaction identifier.
+    */
+    TRACE_EVENT ("primitive rejected due to unused ti");
+    PFREE(mncc_retrieve_cnf);
+    return;
+  }
+
+/*
+ *-------------------------------------------------------------------
+ * update shared parameter and notify ACI
+ *-------------------------------------------------------------------
+ */
+  pCtbNtry = ccShrdPrm.ctb[cId];
+
+  switch( mncc_retrieve_cnf -> cause )
+  {
+    case( MNCC_CAUSE_RETRIEVE_SUCCESS ):    /* successful, call active */
+
+      pCtbNtry -> calStat = CS_ACT;
+
+      /* switch on vocoder */
+      psaCC_setSpeechMode ();
+
+      /* check for TTY service */
+      cmhCC_TTY_Control ( cId, TTY_START );
+      break;
+
+    default:    /* unsuccessful, call state unchanged */
+
+      ccShrdPrm.cIdFail   = cId;
+      pCtbNtry -> calStat = CS_HLD;
+      break;
+  }
+
+  pCtbNtry -> rslt = mncc_retrieve_cnf -> cause;
+
+  cmhCC_CallRetrieved (cId);
+
+/*
+ *-------------------------------------------------------------------
+ * free the primitive buffer
+ *-------------------------------------------------------------------
+ */
+  PFREE (mncc_retrieve_cnf);
+
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_CCP                 |
+|                                 ROUTINE : psa_mncc_sync_ind       |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the MNCC_SYNC_IND primitive send by CC.
+            this indicates the change of the channel mode.
+
+*/
+
+GLOBAL const void psa_mncc_sync_ind( T_MNCC_SYNC_IND *mncc_sync_ind )
+{
+  SHORT cId = 0;                /* holds call id */
+
+  TRACE_FUNCTION ("psa_mncc_sync_ind()");
+
+  /*
+  cause         cause 4.6   UBYTE
+  channel mode  chm     4.14  STRUCT
+
+  ch_type 0 CH_SDCCH  SDCCH channel
+            1 CH_TCH_F  TCH Fullrate
+            2 CH_TCH_H  TCH Halfrate
+
+  ch_mode 0 CHM_SIG_ONLY  signalling only
+            1 CHM_SPEECH      speech full rate or half rate version 1
+            33  CHM_SPEECH_V2 speech full rate or half rate version 2
+            65  CHM_SPEECH_V3 speech full rate or half rate version 3
+            3 CHM_DATA_9_6  data 9.6 kBit/s
+            11  CHM_DATA_4_8  data 4.8 kBit/s
+            19  CHM_DATA_2_4  data 2.4 kBit/s
+            15  CHM_DATA_14_4 data 14.4 kBit/s
+  */
+
+  TRACE_EVENT_P4("MNCC_SYNC_IND ti: %d, cause: %d, ch_type: %d, ch_mode: %d",
+                 mncc_sync_ind -> ti,
+                 mncc_sync_ind -> cause,
+                 mncc_sync_ind -> chm.ch_type,
+                 mncc_sync_ind -> chm.ch_mode);
+
+  /* update shared parameter */
+  ccShrdPrm.syncCs = mncc_sync_ind -> cause;
+#ifdef FF_EM_MODE
+  em_relcs = mncc_sync_ind -> cause;
+#endif /* FF_EM_MODE */
+
+  /* Inform Advice of Charge Module */
+  switch (mncc_sync_ind->cause)
+  {
+    case MNCC_CAUSE_REEST_STARTED:
+      for( cId = 0; cId < MAX_CALL_NR; cId++ )
+        aoc_info (cId, AOC_SUSPEND_AOC);
+      break;
+    case MNCC_CAUSE_REEST_FINISHED:
+      ccShrdPrm.aocRsmpPend = 1;
+      break;
+  }
+
+  /* switch channel mode */
+  if( mncc_sync_ind -> chm.ch_mode NEQ NOT_PRESENT_8BIT )
+  {
+    ccShrdPrm.chMod   = mncc_sync_ind -> chm.ch_mode;
+    ccShrdPrm.chType  = mncc_sync_ind -> chm.ch_type;
+    ccShrdPrm.TCHasg  = TRUE;
+  }
+  
+    if ( ccShrdPrm.aocRsmpPend AND
+          (ccShrdPrm.chMod EQ CHM_SPEECH)    OR
+          (ccShrdPrm.chMod EQ CHM_SPEECH_V2) OR
+          (ccShrdPrm.chMod EQ CHM_SPEECH_V3)    )
+    {
+      ccShrdPrm.aocRsmpPend = 0;
+      for( cId = 0; cId < MAX_CALL_NR; cId++ )
+        aoc_info (cId, AOC_RESUME_AOC);
+    }
+
+if( mncc_sync_ind -> chm.ch_mode NEQ NOT_PRESENT_8BIT )
+  {
+    /* service a pending alert */
+    for( cId = 0; cId < MAX_CALL_NR; cId++ )
+    {
+      if (ccShrdPrm.ctb[cId] NEQ NULL)
+      {
+        psaCC_ctb(cId)->curCs = mncc_sync_ind -> cause;
+
+        if( psaCC_ctb(cId)->alrtStat EQ AS_PND AND
+            psaCC_ctb(cId)->calStat  EQ CS_ACT_REQ )
+        {
+          {
+            /* indicate alerting to network */
+            PALLOC (mncc_alert_req, MNCC_ALERT_REQ);
+            mncc_alert_req -> ti    = psaCC_ctb(cId)->ti;
+            PSENDX (CC, mncc_alert_req);
+            psaCC_ctb(cId)->alrtStat = AS_SND;
+          }
+          cmhCC_IncomingCall (cId); /* indicate an incoming call */
+        }
+        if (psaCC_ctb(cId)->calStat NEQ CS_HLD AND
+            psaCC_ctb(cId)->calStat NEQ CS_IDL)
+        {
+          /* check for TTY service */
+          cmhCC_TTY_Control ( cId, TTY_TCH );
+        }
+      }
+    }
+  }
+psaCC_setSpeechMode ();
+
+  /* Remember cause for Call Reestablishment*/
+
+  if (mncc_sync_ind -> cause EQ MNCC_CAUSE_REEST_FINISHED 
+    OR mncc_sync_ind -> cause EQ MNCC_CAUSE_REEST_STARTED)
+  {
+    for( cId = 0; cId < MAX_CALL_NR; cId++ )
+    {
+      if (ccShrdPrm.ctb[cId] NEQ NULL)
+      {
+        psaCC_ctb(cId)->curCs = mncc_sync_ind -> cause;
+      }
+    }
+   }
+
+  cId = psaCC_ctbFindTi( mncc_sync_ind -> ti );
+
+  /* For channel synchronization events the cId needs not to be valid here */
+  cmhCC_Synchronized( cId );
+
+
+  /* free the primitive buffer */
+  PFREE (mncc_sync_ind);
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_CCP                 |
+|                                 ROUTINE : psa_mncc_user_ind       |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the MNCC_USER_IND primitive send by CC.
+            this indicates the receiving of user data.
+*/
+
+GLOBAL const void psa_mncc_user_ind( T_MNCC_USER_IND *mncc_user_ind )
+{
+  TRACE_FUNCTION ("psa_mncc_user_ind()");
+
+  PFREE (mncc_user_ind);
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_CCP                 |
+|                                 ROUTINE : psa_mncc_start_dtmf_cnf |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the MNCC_START_DTMF_CNF primitive send by CC.
+            this is a confirmation for the sent DTMF tones.
+
+*/
+
+GLOBAL const void psa_mncc_start_dtmf_cnf
+                       ( T_MNCC_START_DTMF_CNF *mncc_start_dtmf_cnf )
+{
+  SHORT cId;                 /* holds call id */
+
+  TRACE_FUNCTION ("psa_mncc_start_dtmf_cnf()");
+
+/*
+ *-------------------------------------------------------------------
+ * find call in call table
+ *-------------------------------------------------------------------
+ */
+  cId = psaCC_ctbFindTi( mncc_start_dtmf_cnf -> ti );
+
+  if( cId < 0 )
+  {
+   /*
+    * ignore primitive, due to not found transaction identifier.
+    */
+    TRACE_EVENT ("primitive rejected due to unused ti");
+    PFREE(mncc_start_dtmf_cnf);
+    return;
+  }
+
+/*
+ *-------------------------------------------------------------------
+ * update shared parameter and notify ACI
+ *-------------------------------------------------------------------
+ */
+  psaCC_ctb(cId)->nrmCs = mncc_start_dtmf_cnf -> cause;
+  if ((mncc_start_dtmf_cnf->cause EQ MNCC_CAUSE_DTMF_STOP_SUCCESS) AND
+        (mncc_start_dtmf_cnf->dtmf_mod EQ DTMF_MOD_MAN_STOP))
+  {
+    /* Reset the current dtmf digit */
+    ccShrdPrm.dtmf.cur = 0;
+  }
+#ifdef FF_EM_MODE
+  em_relcs = mncc_start_dtmf_cnf -> cause;
+#endif /* FF_EM_MODE */
+
+  psaCC_DTMFSent( cId );
+
+/*
+ *-------------------------------------------------------------------
+ * free the primitive buffer
+ *-------------------------------------------------------------------
+ */
+  PFREE (mncc_start_dtmf_cnf);
+
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_CCP                 |
+|                                 ROUTINE : psa_mncc_modify_ind     |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the MNCC_MODIFY_IND primitive send by CC.
+            this indicates a mobile terminated in-call modification.
+
+*/
+
+GLOBAL const void psa_mncc_modify_ind
+                               ( T_MNCC_MODIFY_IND *mncc_modify_ind )
+{
+  SHORT cId;                 /* holds call id */
+  T_CC_CALL_TBL * pCtbNtry;  /* holds pointer to call table entry */
+
+  TRACE_FUNCTION ("psa_mncc_modify_ind()");
+
+/*
+ *-------------------------------------------------------------------
+ * find call in call table
+ *-------------------------------------------------------------------
+ */
+  cId = psaCC_ctbFindTi( mncc_modify_ind -> ti );
+
+  if( cId < 0 )
+  {
+   /*
+    * ignore primitive, due to not found transaction identifier.
+    */
+    TRACE_EVENT ("primitive rejected due to unused ti");
+    PFREE(mncc_modify_ind);
+    return;
+  }
+
+  /* check for TTY service */
+  cmhCC_TTY_Control ( cId, TTY_PAUSE );
+
+/*
+ *-------------------------------------------------------------------
+ * update shared parameter and notify ACI
+ *-------------------------------------------------------------------
+ */
+  pCtbNtry = ccShrdPrm.ctb[cId];
+
+  pCtbNtry -> curBC = (pCtbNtry -> curBC EQ 0)?1:0;
+  pCtbNtry -> rslt  = MNCC_CAUSE_MODIFY_SUCCESS; /* SBK-02-07-30: possibly to be revised as strictly speaking ACI is orignating entity */
+
+  cmhCC_CallModified (cId);
+
+  /* check for TTY service */
+  cmhCC_TTY_Control ( cId, TTY_START );
+
+  psaCC_StopDTMF ( cId );
+/*
+ *-------------------------------------------------------------------
+ * free the primitive buffer
+ *-------------------------------------------------------------------
+ */
+  PFREE (mncc_modify_ind);
+
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_CCP                 |
+|                                 ROUTINE : psa_mncc_modify_cnf     |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the MNCC_MODIFY_CNF primitive send by CC.
+            this indicates the result for a mobile originated in-call
+            modification.
+
+*/
+
+GLOBAL const void psa_mncc_modify_cnf
+                               ( T_MNCC_MODIFY_CNF *mncc_modify_cnf )
+{
+  SHORT cId;                 /* holds call id */
+  T_CC_CALL_TBL * pCtbNtry;  /* holds pointer to call table entry */
+
+  TRACE_FUNCTION ("psa_mncc_modify_cnf()");
+
+/*
+ *-------------------------------------------------------------------
+ * find call in call table
+ *-------------------------------------------------------------------
+ */
+  cId = psaCC_ctbFindTi( mncc_modify_cnf -> ti );
+
+  if( cId < 0 )
+  {
+   /*
+    * ignore primitive, due to not found transaction identifier.
+    */
+    TRACE_EVENT ("primitive rejected due to unused ti");
+    PFREE(mncc_modify_cnf);
+    return;
+  }
+
+/*
+ *-------------------------------------------------------------------
+ * update shared parameter and notify ACI
+ *-------------------------------------------------------------------
+ */
+  pCtbNtry = ccShrdPrm.ctb[cId];
+
+  pCtbNtry -> rslt = mncc_modify_cnf -> cause;
+
+  switch( mncc_modify_cnf -> cause )
+  {
+    case( MNCC_CAUSE_MODIFY_SUCCESS ):    /* successful modification */
+
+      pCtbNtry -> curBC = (pCtbNtry -> curBC EQ 0)?1:0;
+      break;
+
+    default:    /* unsuccessful modification */
+
+      ccShrdPrm.cIdFail = cId;
+      break;
+  }
+  psaCC_ctb(cId)->calStat = CS_ACT;
+
+  cmhCC_CallModified (cId);
+
+  /* check for TTY service */
+  cmhCC_TTY_Control ( cId, TTY_START );
+
+/*
+ *-------------------------------------------------------------------
+ * free the primitive buffer
+ *-------------------------------------------------------------------
+ */
+  PFREE (mncc_modify_cnf);
+
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_CCP                 |
+|                                 ROUTINE : psa_mncc_bearer_cap_cnf |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the MNCC_BEARER_CAP_CNF primitive send by CC.
+            this is the result of the requested bearer coding/decoding.
+
+*/
+
+GLOBAL const void psa_mncc_bearer_cap_cnf
+                         ( T_MNCC_BEARER_CAP_CNF *mncc_bearer_cap_cnf )
+{
+
+  TRACE_FUNCTION ("psa_mncc_bearer_cap_cnf()");
+
+/*
+ *-------------------------------------------------------------------
+ * determine request id
+ *-------------------------------------------------------------------
+ */
+  switch( mncc_bearer_cap_cnf -> req_id )
+  {
+
+#ifdef SIM_TOOLKIT
+
+  case( BCRI_SAT ):
+
+    switch( mncc_bearer_cap_cnf -> bc_mod )
+    {
+      case( BC_MOD_CODE ):
+
+        cmhSAT_ResCapCode ( mncc_bearer_cap_cnf -> cause,
+                            &mncc_bearer_cap_cnf -> bcconf );
+        break;
+
+      case( BC_MOD_DECODE ):
+
+        cmhSAT_ResCapDecode ( mncc_bearer_cap_cnf -> cause,
+                              &mncc_bearer_cap_cnf -> bcpara );
+        break;
+    }
+    break;
+
+#endif
+  }
+
+/*
+ *-------------------------------------------------------------------
+ * free the primitive buffer
+ *-------------------------------------------------------------------
+ */
+  PFREE (mncc_bearer_cap_cnf);
+
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_CCP                 |
+|                                 ROUTINE : psa_mncc_prompt_ind     |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the MNCC_PROMPT_IND primitive send by CC.
+            this requests a transaction identifier for a CCBS recall.
+
+*/
+
+GLOBAL const void psa_mncc_prompt_ind
+                         ( T_MNCC_PROMPT_IND *mncc_prompt_ind )
+{
+  SHORT ti;
+
+  TRACE_FUNCTION ("psa_mncc_prompt_ind()");
+
+/*
+ *-------------------------------------------------------------------
+ * allocate transaction identifier
+ *-------------------------------------------------------------------
+ */
+  ti = psaCC_getMOCTi( -1 );
+
+  if( ti NEQ -1 )
+  {
+    PALLOC (mncc_prompt_rsp, MNCC_PROMPT_RSP);
+    mncc_prompt_rsp -> ti    = (UBYTE)ti;
+    PSENDX (CC, mncc_prompt_rsp);
+  }
+  else
+  {
+    PALLOC (mncc_prompt_rej, MNCC_PROMPT_REJ);
+    PSENDX (CC, mncc_prompt_rej);
+  }
+
+/*
+ *-------------------------------------------------------------------
+ * free the primitive buffer
+ *-------------------------------------------------------------------
+ */
+  PFREE (mncc_prompt_ind);
+
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_CCP                 |
+|                                 ROUTINE : psa_mncc_recall_ind     |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the MNCC_RECALL_IND primitive send by CC.
+            this indicates a recall attempt from the network in case
+            of CCBS.
+
+*/
+
+GLOBAL const void psa_mncc_recall_ind
+                         ( T_MNCC_RECALL_IND *mncc_recall_ind )
+{
+  SHORT cId;                 /* holds call table identifier */
+  T_CC_CALL_TBL * pCtbNtry;  /* holds pointer to call table entry */
+
+  TRACE_FUNCTION ("psa_mncc_recall_ind()");
+
+/*
+ *-------------------------------------------------------------------
+ * check for K.O. criteria
+ *-------------------------------------------------------------------
+ */
+  if( aoc_check_moc() EQ FALSE )
+  {
+    PALLOC (mncc_reject_req, MNCC_REJECT_REQ);
+
+    mncc_reject_req -> ti    = mncc_recall_ind -> ti;
+    mncc_reject_req -> cause = MNCC_CAUSE_ACM_MAX;
+
+    PSENDX (CC, mncc_reject_req);
+  }
+
+  else if((cId = psaCC_ctbNewEntry()) < 0 )
+  {
+    PALLOC (mncc_reject_req, MNCC_REJECT_REQ);
+
+    mncc_reject_req -> ti    = mncc_recall_ind -> ti;
+    mncc_reject_req -> cause = MNCC_CAUSE_USER_BUSY;
+
+    PSENDX (CC, mncc_reject_req);
+  }
+
+/*
+ *-------------------------------------------------------------------
+ * insert recall parameters into call table entry
+ *-------------------------------------------------------------------
+ */
+  else
+  {
+    pCtbNtry = ccShrdPrm.ctb[cId];
+
+    pCtbNtry -> ti         = mncc_recall_ind -> ti;
+    pCtbNtry -> rptInd     = mncc_recall_ind -> ri;
+
+    /* 
+     * Assign called party 
+     */
+    pCtbNtry -> cldPty.ton = mncc_recall_ind -> called_party.ton;
+    pCtbNtry -> cldPty.npi = mncc_recall_ind -> called_party.npi;
+    pCtbNtry -> cldPty.c_called_num = 
+      mncc_recall_ind -> called_party.c_called_num;
+    if (pCtbNtry -> cldPty.called_num NEQ NULL)
+    {
+      ACI_MFREE (pCtbNtry -> cldPty.called_num);
+      pCtbNtry -> cldPty.called_num = NULL;    
+    }
+    if (pCtbNtry -> cldPty.c_called_num NEQ 0)
+    {
+      ACI_MALLOC (pCtbNtry -> cldPty.called_num, 
+                  pCtbNtry -> cldPty.c_called_num);
+      memcpy (pCtbNtry -> cldPty.called_num, 
+              mncc_recall_ind -> called_party.called_num,
+              mncc_recall_ind -> called_party.c_called_num);
+    }
+
+    /* 
+     * Assign called party subaddress
+     */    
+    pCtbNtry -> cldPtySub  = mncc_recall_ind -> called_party_sub;
+
+    /*
+     * Assign bearer caps
+     */    
+    memcpy( &(pCtbNtry->BC[0]),&(mncc_recall_ind->bcpara),
+            sizeof( T_bcpara) );
+    memcpy( &(pCtbNtry->BC[1]),&(mncc_recall_ind->bcpara2),
+            sizeof( T_bcpara) );
+
+    psaCC_phbSrchNum( cId, CT_NI_MOC );
+
+    pCtbNtry -> calStat = CS_ACT_REQ;
+    pCtbNtry -> calType = CT_NI_MOC;
+
+    pCtbNtry -> prio  = PRIO_NORM_CALL;
+    pCtbNtry -> curBC = 0;
+
+  }
+
+/*
+ *-------------------------------------------------------------------
+ * free the primitive buffer
+ *-------------------------------------------------------------------
+ */
+  PFREE (mncc_recall_ind);
+
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_CCP                 |
+|                                 ROUTINE : psa_mncc_status_ind     |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the MNCC_STATUS_IND primitive sent by CC.
+            This indicates that a STATUS ENQUIRY message has been
+            received by CC, the network awaits a CC STATUS message.
+            Used to ensure that the auxiliary states between ACI and
+            CC were synchronized before the STATUS message is sent.
+
+*/
+
+GLOBAL const void psa_mncc_status_ind (T_MNCC_STATUS_IND *mncc_status_ind)
+{
+  UBYTE ti;
+
+  TRACE_FUNCTION ("psa_mncc_status_ind()");
+
+  ti = mncc_status_ind->ti;
+
+  {
+    PREUSE (mncc_status_ind, mncc_status_res, MNCC_STATUS_RES);
+    mncc_status_res->ti = ti;
+    PSENDX (CC, mncc_status_res);
+  }
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_CCP                 |
+|                                 ROUTINE : psa_mncc_facility_ind   |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the MNCC_FACILITY_IND primitive send by CC.
+            this indicates the receiving of a facility information
+            element. Handles multiple components in the facility info.
+
+*/
+
+GLOBAL const void psa_mncc_facility_ind(T_MNCC_FACILITY_IND * mncc_facility_ind)
+{
+  UBYTE  tlen = 0;
+  USHORT offset_comp = 0, total_len = mncc_facility_ind->fac_inf.l_fac/8;
+  UBYTE len_comp = 0;
+  UBYTE *tPtrfac = mncc_facility_ind->fac_inf.fac;
+
+  TRACE_FUNCTION ("psa_mncc_facility_ind()");
+
+  if (tPtrfac[1] > 0x7F)/* For the case, when length is coded in non-standard way (0x80, 0x81, 0x82) we will be able to process only one component */
+  {
+     psaCC_ProcessCmp((T_MNCC_FACILITY_IND *)mncc_facility_ind);
+     return;
+  }
+
+  offset_comp = mncc_facility_ind->fac_inf.o_fac;
+  len_comp = tlen = tPtrfac[1] + 2;
+
+  for ( ; total_len >= len_comp; len_comp+=tlen)
+  {
+    if ((*tPtrfac EQ 0xA1) OR
+        (*tPtrfac EQ 0xA2) OR
+        (*tPtrfac EQ 0xA3) OR
+        (*tPtrfac EQ 0xA4))
+    {
+      PALLOC(new_mncc_facility_ind, MNCC_FACILITY_IND);
+
+      new_mncc_facility_ind->ti = mncc_facility_ind->ti;
+      new_mncc_facility_ind->fac_context = mncc_facility_ind->fac_context;
+      new_mncc_facility_ind->fac_inf.l_fac = tlen * 8;
+      new_mncc_facility_ind->fac_inf.o_fac = offset_comp;
+      memcpy(new_mncc_facility_ind->fac_inf.fac, tPtrfac, tlen);
+
+      psaCC_ProcessCmp((T_MNCC_FACILITY_IND *)new_mncc_facility_ind);
+
+      tPtrfac = tPtrfac + tlen;
+      tlen = tPtrfac[1] + 2;
+      offset_comp = 0;
+    }
+  }
+  
+  PFREE(mncc_facility_ind);
+}
+
+/*==== EOF =========================================================*/