view src/g23m-aci/aci/cmh_gmmr.c @ 303:f76436d19a7a default tip

!GPRS config: fix long-standing AT+COPS chance hanging bug There has been a long-standing bug in FreeCalypso going back years: sometimes in the AT command bring-up sequence of an ACI-only MS, the AT+COPS command would produce only a power scan followed by cessation of protocol stack activity (only L1 ADC traces), instead of the expected network search sequence. This behaviour was seen in different FC firmware versions going back to Citrine, and seemed to follow some law of chance, not reliably repeatable. This bug has been tracked down and found to be specific to !GPRS configuration, stemming from our TCS2/TCS3 hybrid and reconstruction of !GPRS support that was bitrotten in TCS3.2/LoCosto version. ACI module psa_mms.c, needed only for !GPRS, was missing in the TCS3 version and had to be pulled from TCS2 - but as it turns out, there is a new field in the MMR_REG_REQ primitive that needs to be set correctly, and that psa_mms.c module is the place where this initialization needed to be added.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 08 Jun 2023 08:23:37 +0000
parents fa8dc04885d8
children
line wrap: on
line source

/* 
+----------------------------------------------------------------------------- 
|  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 defines the functions which are responsible
|             for the responses of the protocol stack adapter for 
|             GPRS mobility management ( GMM ).
+----------------------------------------------------------------------------- 
*/ 

#if defined (GPRS) && defined (DTI) 

#ifndef CMH_GMMR_C
#define CMH_GMMR_C
#endif

#include "aci_all.h"
/*==== INCLUDES ===================================================*/
#include "dti.h"      /* functionality of the dti library */
#include "aci_cmh.h"
#include "ati_cmd.h"
#include "aci_cmd.h"

#include "dti_conn_mng.h"

#include "aci.h"
#include "gaci.h"
#include "gaci_cmh.h"
#include "psa.h"
#include "psa_mm.h"
#include "psa_gmm.h"
#include "psa_sim.h"

#include "cmh.h"
#include "cmh_mm.h"
#include "cmh_gmm.h"
#include "cmh_sim.h"

#if defined (FF_WAP) OR defined (FF_SAT_E)
#include "wap_aci.h"
#include "psa_sm.h"
#endif /* WAP */

#if defined (SIM_TOOLKIT) AND defined (FF_SAT_E)
#include "psa_cc.h"
#include "psa_sat.h"
#include "cmh_sat.h"
#endif  /* SIM_TOOLKIT AND FF_SAT_E */

#ifdef FF_GPF_TCPIP
#include "dcm_utils.h"
#include "dcm_state.h"
#include "dcm_env.h"
#endif

#include "dcm_f.h"
#include "cmh_sm.h"
/*==== CONSTANTS ==================================================*/


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


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

/*==== VARIABLES ==================================================*/


/*==== FUNCTIONS ==================================================*/

/*
+-------------------------------------------------------------------+
| PROJECT : GPRS (8441)      MODULE  : CMH_GMMR                     |
|                            ROUTINE : cmhGMM_Attached              |
+-------------------------------------------------------------------+

  PURPOSE : ME is attached

*/
GLOBAL void cmhGMM_Attached ( UBYTE attach_type, T_plmn *plmn, UBYTE search_running )
{
  T_CGEREP_EVENT_REP_PARAM  event;
  SHORT i;
  
  TRACE_FUNCTION ("cmhGMM_Attached()");

 /*
  *   set GPRS attach state
  */
  gmmShrdPrm.current_attach_type = attach_type;  
  
  switch ( attach_type )
  {
    case GMMREG_AT_GPRS:
    case GMMREG_AT_COMB:
      cmhGMM_Set_state(AS_ATTACHED);
      break;
    case GMMREG_AT_IMSI:
      cmhGMM_Set_state(AS_DETACHED);
      break;
  }

  if (search_running EQ GMMREG_SEARCH_NOT_RUNNING)
  {
    gmmShrdPrm.mobile_class = gmmShrdPrm.requested_mobile_class;
    gaciMobileClass.current = gaciMobileClass.requested;

    if(AT_CMD_CGCLASS EQ gmmEntStat.curCmd)
    {
    /*
     *  brz: 22.10.02
     *  special behaviour for NMO III
     *
     *  In the case of NMO III a COMB reject can not be succesful.
     *
     *  case BG requested: attach type GPRS is also OK
     *  case BC requested: attach type IMSI is also OK
     */
      if( GMMREG_CLASS_BG EQ gmmShrdPrm.mobile_class AND GMMREG_AT_GPRS EQ attach_type  OR
          GMMREG_CLASS_BC EQ gmmShrdPrm.mobile_class AND GMMREG_AT_IMSI EQ attach_type     )
      {
       /*
        *   GPRS event reporting>
        */
        event.mobile_class = (T_CGCLASS_CLASS)gmmShrdPrm.mobile_class;
        for( i = 0 ; i < CMD_SRC_MAX; i++ )
        {
          R_AT( RAT_CGEREP, (T_ACI_CMD_SRC)i ) ( CGEREP_EVENT_ME_CLASS, &event ); 
          R_AT( RAT_P_CGEV, (T_ACI_CMD_SRC)i ) ( CGEREP_EVENT_ME_CLASS, &event );
        }
        R_AT( RAT_OK, gmmEntStat.entOwn ) ( gmmEntStat.curCmd );

        /* log result */
        cmh_logRslt ( gmmEntStat.entOwn, RAT_OK, gmmEntStat.curCmd, 
                               -1, BS_SPEED_NotPresent,CME_ERR_NotPresent );

        gmmEntStat.curCmd = AT_CMD_NONE;
        return;
      }
    }
  }
    
  if ( attach_type EQ GMMREG_AT_IMSI AND 
       gmmShrdPrm.requested_mobile_class NEQ GMMREG_CLASS_CC)
  {
  /*
   *  brz: 03.05.02
   *  patch for wrong behaviour of GMM: sending attach_cnf->IMSI instead of attach_rej->GPRS
   */
    if (search_running EQ GMMREG_SEARCH_NOT_RUNNING)
    {
      cmhGMM_NoAttach(GMMREG_DT_GPRS ,GMMCS_NO_SERVICE , GMMREG_SEARCH_NOT_RUNNING);
    }

    return;
  }
  else  /* end of +CGATT or +CGCLASS */
  {
   /*
   *  Inform CMH SM about new attach state.
    */

    cmhSM_GprsAttached( GPRS_ATTACH );
    
    
    switch ( gmmEntStat.curCmd )
    {
      case AT_CMD_CGCLASS:
       /*
        *   GPRS event reporting
        */
        event.mobile_class = (T_CGCLASS_CLASS)gmmShrdPrm.requested_mobile_class;
        for( i = 0 ; i < CMD_SRC_MAX; i++ )
        {
          R_AT( RAT_CGEREP, (T_ACI_CMD_SRC)i ) ( CGEREP_EVENT_ME_CLASS, &event ); 
          R_AT( RAT_P_CGEV, (T_ACI_CMD_SRC)i ) ( CGEREP_EVENT_ME_CLASS, &event );
        }
        /*lint -fallthrough */
      case AT_CMD_CGATT:
        R_AT( RAT_OK, gmmEntStat.entOwn ) ( gmmEntStat.curCmd );

        /* log result */
        cmh_logRslt ( gmmEntStat.entOwn, RAT_OK, gmmEntStat.curCmd, -1,
                               BS_SPEED_NotPresent,CME_ERR_NotPresent );

#ifdef FF_GPF_TCPIP
        if(is_gpf_tcpip_call())
        {
          T_DCM_STATUS_IND_MSG msg;
          msg.hdr.msg_id = DCM_NEXT_CMD_READY_MSG;
          dcm_send_message(msg, DCM_SUB_WAIT_CGATT_CNF);
        }
#endif /* FF_GPF_TCPIP */
        break;
    }

    gmmEntStat.curCmd = AT_CMD_NONE;
  }
}


/*
+-------------------------------------------------------------------+
| PROJECT : GPRS (8441)      MODULE  : CMH_GMMR                     |
|                            ROUTINE : cmhGMM_NoAttach              |
+-------------------------------------------------------------------+

  PURPOSE : the attach fail

*/
GLOBAL void cmhGMM_NoAttach ( UBYTE detach_type, USHORT cause, UBYTE search_running )
{
  T_ACI_CME_ERR cme_err;          /* error number */
  
  TRACE_FUNCTION ("cmhGMM_NoAttach()");

 /*
  *   map error cause
  */
  switch(cause)
  {
    case GMMCS_ILLEGAL_MS:
    case MMCS_ILLEGAL_MS:
      cme_err = CME_ERR_GPRSBadMs;
      break;
    case GMMCS_ILLEGAL_ME:
    case MMCS_ILLEGAL_ME:
      cme_err = CME_ERR_GPRSBadMe;
      break;
    case GMMCS_GPRS_NOT_ALLOWED:
    /* No corrosponding MM cause */
      cme_err = CME_ERR_GPRSNoService;
      break;
    case GMMCS_PLMN_NOT_ALLOWED:
    case MMCS_PLMN_NOT_ALLOWED:
      cme_err = CME_ERR_GPRSBadPlmn;
      break;
    case GMMCS_LA_NOT_ALLOWED:
    case MMCS_LA_NOT_ALLOWED:
      cme_err = CME_ERR_GPRSBadLoc;
      break;
    case GMMCS_ROAMING_NOT_ALLOWED:
    case MMCS_ROAMING_NOT_ALLOWED:
      cme_err = CME_ERR_GPRSNoRoam;
      break;
    case GMMCS_IMPLICIT_DETACHED:
    /* No corrosponding MM cause */
      cme_err = CME_ERR_GPRSUnspec;
      break;
    case GMMCS_IMSI_UNKNOWN:
    case MMCS_IMSI_IN_HLR:
    case MMCS_IMEI_NOT_ACCEPTED:
    /* No corrosponding GMM cause */
    case GMMCS_NO_MS_ID:
    /* No corrosponding MM cause */
      cme_err = CME_ERR_SimFail;
      break;
    case GMMCS_GSM_GPRS_NOT_ALLOWED:
    /* No corrosponding MM cause */
    case GMMCS_NET_FAIL:
    case MMCS_NETWORK_FAILURE:
    case GMMCS_MSC_TEMP_NOT_REACHABLE:
    /* No corrosponding MM cause */
    case GMMCS_CONGESTION:
    case MMCS_CONGESTION:
      cme_err = CME_ERR_NoServ;
      break;
    /* case GMMCS_CELL_SELECTION_FAILED: */
    /* No corrosponding MM cause */
    /* case GMMCS_NO_SERVICE: */
    /* No corrosponding MM cause */
    /* case GMMCS_LIMITED_SERVICE: */
    /* No corrosponding MM cause */
/*  case GMMCS_SEMANTIC_INCORRECT:
    case MMCS_INCORRECT_MESSAGE:
    case GMMCS_INVALID_M_INFO:
    case MMCS_INVALID_MAND_MESSAGE:
    case GMMCS_TYPE_INVALID:
    case MMCS_MESSAGE_TYPE_NOT_IMPLEM:
    case GMMCS_TYPE_INCOMPATIBLE:
    case MMCS_MESSAGE_TYPE_INCOMPAT:
    case GMMCS_IE_INVALID:
    case MMCS_IE_NOT_IMPLEM:
    case GMMCS_COND_IE_ERROR:
    case MMCS_CONDITIONAL_IE:
    case GMMCS_MESSAGE_INVALID:
    case MMCS_MESSAGE_INCOMPAT:
    case GMMCS_INT_PROTOCOL_ERROR: */
    /* No corrosponding MM cause */
    default:
      cme_err = CME_ERR_Unknown;
  }
        
  if ( search_running EQ GMMREG_SEARCH_NOT_RUNNING ) 
  {
   /*
    *  Inform CMH SM about new attach state 
    */
    cmhSM_GprsAttached( GPRS_DETACH );

    switch ( gmmEntStat.curCmd )
    {
      case AT_CMD_CGCLASS:
      case AT_CMD_CGATT:
          R_AT( RAT_CME, gmmEntStat.entOwn ) ( gmmEntStat.curCmd, cme_err );

          /* log result */
          cmh_logRslt ( gmmEntStat.entOwn, RAT_CME, gmmEntStat.curCmd, -1, 
                                 BS_SPEED_NotPresent, cme_err );
          break;
    }

    gmmEntStat.curCmd = AT_CMD_NONE;
  }

 /*
  *   set GPRS attach state
  */
  switch ( detach_type )
  {
    case GMMREG_DT_LIMITED_SERVICE:
    case GMMREG_DT_SIM_REMOVED:
      cmhGMM_Set_state(AS_DETACHED);
      break;
    case GMMREG_DT_DISABLE_GPRS:
      cmhGMM_Set_state(AS_SUSPENTED);
      break;
    case GMMREG_DT_POWER_OFF:
      break;
    case GMMREG_DT_GPRS:
    case GMMREG_DT_COMB:
      cmhGMM_Set_state(AS_DETACHED);
      break;
    case GMMREG_DT_IMSI:
      break;
  }

  switch ( detach_type )
  {
    case GMMREG_DT_GPRS:
      gmmShrdPrm.current_attach_type = GMMREG_AT_IMSI;
      break;
    case GMMREG_DT_IMSI:
      gmmShrdPrm.current_attach_type = GMMREG_AT_GPRS;
      break;
    case GMMREG_DT_COMB:
    case GMMREG_DT_POWER_OFF:
    case GMMREG_DT_LIMITED_SERVICE:
    case GMMREG_DT_SIM_REMOVED:
      gmmShrdPrm.current_attach_type = ATTACH_TYPE_DETACHED;
      break;
  }
}

/*
+-------------------------------------------------------------------+
| PROJECT : GPRS (8441)      MODULE  : CMH_GMMR                     |
|                            ROUTINE : cmhGMM_Detached              |
+-------------------------------------------------------------------+

  PURPOSE : ME is detached

*/
GLOBAL void cmhGMM_Detached ( UBYTE detach_type )
{
  SHORT i;

  TRACE_FUNCTION ("cmhGMM_Detached()");

/*
 *-------------------------------------------------------------------
 * check for command context
 *-------------------------------------------------------------------
 */
  switch ( detach_type )
  {
    case GMMREG_DT_GPRS:
    case GMMREG_DT_COMB:
      for( i = 0 ; i < CMD_SRC_MAX; i++ )
      {
        R_AT( RAT_CGEREP, (T_ACI_CMD_SRC)i ) ( CGEREP_EVENT_ME_DETACH, NULL ); 
        R_AT( RAT_P_CGEV, (T_ACI_CMD_SRC)i ) ( CGEREP_EVENT_ME_DETACH, NULL );
      }
      
      cmhGMM_Set_state(AS_DETACHED);
      break;
    case GMMREG_DT_POWER_OFF:
      for( i = 0 ; i < CMD_SRC_MAX; i++ )
      {
        R_AT( RAT_CGEREP, (T_ACI_CMD_SRC)i ) ( CGEREP_EVENT_ME_DETACH, NULL ); 
        R_AT( RAT_P_CGEV, (T_ACI_CMD_SRC)i ) ( CGEREP_EVENT_ME_DETACH, NULL );
      }
      
      cmhGMM_Set_state(AS_MOBILE_OFF);
      break;
    case GMMREG_DT_LIMITED_SERVICE:
      cmhGMM_Set_state(AS_DETACHED);
      break;
    case GMMREG_DT_SIM_REMOVED:
      cmhGMM_Set_state(AS_DETACHED);
      break;
    case GMMREG_DT_IMSI:
      cmhGMM_Set_state(AS_ATTACHED);
      break;
    case GMMREG_DT_DISABLE_GPRS:
      cmhGMM_Set_state(AS_SUSPENTED);
      break;
    default:
      break;
  }

  switch ( detach_type )
  {
    case GMMREG_DT_IMSI:
      gmmShrdPrm.current_attach_type = GMMREG_AT_GPRS;
      break;
    case GMMREG_DT_GPRS:
      gmmShrdPrm.current_attach_type = GMMREG_AT_IMSI;
      break;
    case GMMREG_DT_COMB:
    case GMMREG_DT_LIMITED_SERVICE:
    case GMMREG_DT_SIM_REMOVED:
    case GMMREG_DT_POWER_OFF:
      gmmShrdPrm.current_attach_type = ATTACH_TYPE_DETACHED;
      break;
  }

 /*
  *  Inform CMH SM about new attach state 
  */
  cmhSM_GprsAttached( GPRS_DETACH );


  switch( gmmEntStat.curCmd )
  {
    case( AT_CMD_CGCLASS ):
    case( AT_CMD_CGATT ):
      
      R_AT( RAT_OK, gmmEntStat.entOwn ) ( gmmEntStat.curCmd );

      /* log result */
      cmh_logRslt ( gmmEntStat.entOwn, RAT_OK, gmmEntStat.curCmd, 
                             -1, BS_SPEED_NotPresent,CME_ERR_NotPresent );
      break;
  }
  gmmEntStat.curCmd = AT_CMD_NONE;

}

/*
+-------------------------------------------------------------------+
| PROJECT : GPRS (8441)      MODULE  : CMH_GMMR                     |
|                            ROUTINE : cmhGMM_NetDetach             |
+-------------------------------------------------------------------+

  PURPOSE : ME is detached by the network

*/
GLOBAL void cmhGMM_NetDetach ( UBYTE detach_type, USHORT cause, UBYTE search_running )
{
  UBYTE cme_err;          /* error number */
  SHORT i;


  TRACE_FUNCTION ("cmhGMM_NetDetach()");

  switch (detach_type)
  {
    case GMMREG_DT_GPRS:
    case GMMREG_DT_COMB:
      for( i = 0 ; i < CMD_SRC_MAX; i++ )
      {
        R_AT( RAT_CGEREP, (T_ACI_CMD_SRC)i ) ( CGEREP_EVENT_NW_DETACH, NULL ); 
        R_AT( RAT_P_CGEV, (T_ACI_CMD_SRC)i ) ( CGEREP_EVENT_NW_DETACH, NULL );
      }
    /*lint -fallthrough */
    case GMMREG_DT_SIM_REMOVED:
    case GMMREG_DT_LIMITED_SERVICE:
      cmhGMM_Set_state(AS_DETACHED);
      break;
    case GMMREG_DT_IMSI:
      cmhGMM_Set_state(AS_ATTACHED);
      break;
    case GMMREG_DT_DISABLE_GPRS:
      cmhGMM_Set_state(AS_SUSPENTED);
      break;
    case GMMREG_DT_POWER_OFF:
    default:
      break;
  }

  switch (detach_type)
  {
    case GMMREG_DT_GPRS:
      gmmShrdPrm.current_attach_type = GMMREG_AT_IMSI;
      break;
    case GMMREG_DT_IMSI:
      gmmShrdPrm.current_attach_type = GMMREG_AT_GPRS;
      break;
    case GMMREG_DT_COMB:
    case GMMREG_DT_SIM_REMOVED:
    case GMMREG_DT_LIMITED_SERVICE:
    case GMMREG_DT_POWER_OFF:
      gmmShrdPrm.current_attach_type = ATTACH_TYPE_DETACHED;
      break;
  }

  if( search_running EQ GMMREG_SEARCH_NOT_RUNNING)
  {
    if (work_cids[cid_pointer] NEQ PDP_CONTEXT_CID_INVALID)
    {
      /*
       * Inform CMH SM about the new attach state.
       */
      cmhSM_GprsAttached( GPRS_DETACH );
    }
    else
    {
      /*
       * map error cause
       */
      switch(cause)
      {
        case GMMCS_ILLEGAL_MS:
        case MMCS_ILLEGAL_MS:
          cme_err = CME_ERR_GPRSBadMs;
          break;
        case GMMCS_ILLEGAL_ME:
        case MMCS_ILLEGAL_ME:
          cme_err = CME_ERR_GPRSBadMe;
          break;
        case GMMCS_GPRS_NOT_ALLOWED:
        /* No corrosponding MM cause */
          cme_err = CME_ERR_GPRSNoService;
          break;
        case GMMCS_PLMN_NOT_ALLOWED:
        case MMCS_PLMN_NOT_ALLOWED:
          cme_err = CME_ERR_GPRSBadPlmn;
          break;
        case GMMCS_LA_NOT_ALLOWED:
        case MMCS_LA_NOT_ALLOWED:
          cme_err = CME_ERR_GPRSBadLoc;
          break;
        case GMMCS_ROAMING_NOT_ALLOWED:
        case MMCS_ROAMING_NOT_ALLOWED:
          cme_err = CME_ERR_GPRSNoRoam;
          break;
        case GMMCS_IMPLICIT_DETACHED:
        /* No corrosponding MM cause */
          cme_err = CME_ERR_GPRSUnspec;
          break;
        case GMMCS_IMSI_UNKNOWN:
        case MMCS_IMSI_IN_HLR:
        case MMCS_IMEI_NOT_ACCEPTED:
        /* No corrosponding GMM cause */
        case GMMCS_NO_MS_ID:
        /* No corrosponding MM cause */
          cme_err = CME_ERR_SimFail;
          break;
        case GMMCS_GSM_GPRS_NOT_ALLOWED:
        /* No corrosponding MM cause */
        case GMMCS_NET_FAIL:
        case MMCS_NETWORK_FAILURE:
        case GMMCS_MSC_TEMP_NOT_REACHABLE:
        /* No corrosponding MM cause */
        case GMMCS_CONGESTION:
        case MMCS_CONGESTION:
          cme_err = CME_ERR_NoServ;
          break;
        default:
          cme_err = CME_ERR_Unknown;
      }

      /* If we get detach indication with search_running as false, then we should 
         send error response to user. This is in the normal attach / cgclass case
       */

      switch ( gmmEntStat.curCmd )
      {
        case AT_CMD_CGCLASS:
        case AT_CMD_CGATT:
          R_AT( RAT_CME, gmmEntStat.entOwn ) ( gmmEntStat.curCmd, cme_err );

          /* log result */
          cmh_logRslt (gmmEntStat.entOwn, RAT_CME, gmmEntStat.curCmd,(SHORT)-1, (T_ACI_BS_SPEED)-1, (T_ACI_CME_ERR)cme_err );
          break;
      }
      gmmEntStat.curCmd = AT_CMD_NONE;
    }
  }

}
/*
+-------------------------------------------------------------------+
| PROJECT : GPRS (8441)      MODULE  : CMH_GMMR                     |
|                            ROUTINE : cmhGMM_Plmn                  |
+-------------------------------------------------------------------+

  PURPOSE : reseive a PLMN list

*/
GLOBAL SHORT cmhGMM_Plmn ( void )
{
  TRACE_FUNCTION ("cmhGMM_Plmn()");


  return GMMH_CMD_OK;
}

/*
+-------------------------------------------------------------------+
| PROJECT : GPRS (8441)      MODULE  : CMH_GMMR                     |
|                            ROUTINE : cmhGMM_Suspend               |
+-------------------------------------------------------------------+

  PURPOSE : full service or limited service is available

*/
GLOBAL SHORT cmhGMM_Suspend ( UBYTE cell_state )
{

  TRACE_FUNCTION ("cmhGMM_Suspend()");

  cmhGMM_Set_state( AS_SUSPENTED );

#if defined (SIM_TOOLKIT) AND defined (FF_SAT_E)

  cmhSAT_OpChnGPRSStat(SAT_GPRS_SUSPEND, SAT_GPRS_INV_CAUSE);

#endif  /* SIM_TOOLKIT AND FF_SAT_E */

  return GMMH_CMD_OK;
}

/*
+-------------------------------------------------------------------+
| PROJECT : GPRS (8441)      MODULE  : CMH_GMMR                     |
|                            ROUTINE : cmhGMM_Resume                |
+-------------------------------------------------------------------+

  PURPOSE : GPRS full service is now available

*/
GLOBAL SHORT cmhGMM_Resume ( void )
{

  TRACE_FUNCTION ("cmhGMM_Resume()");

  cmhGMM_Set_state( AS_ATTACHED );

#if defined (SIM_TOOLKIT) AND defined (FF_SAT_E)

  cmhSAT_OpChnGPRSStat(SAT_GPRS_RESUME, SAT_GPRS_INV_CAUSE);

#endif  /* SIM_TOOLKIT AND FF_SAT_E */

  return GMMH_CMD_OK;
}

/*
+-------------------------------------------------------------------+
| PROJECT : GPRS (8441)      MODULE  : CMH_GMMR                     |
|                            ROUTINE : cmhGMM_Info                  |
+-------------------------------------------------------------------+

  PURPOSE : reseive the information provided by the GMM INFORMATION message.

*/
GLOBAL SHORT cmhGMM_Info ( void )
{
  TRACE_FUNCTION ("cmhGMM_Info()");


  return GMMH_CMD_OK;
}



/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147)    MODULE  : CMH_GMMR                      |
|                            ROUTINE : cmhGMM_CipheringInd           |
+-------------------------------------------------------------------+

  PURPOSE : ciphering indication received

*/

GLOBAL SHORT cmhGMM_CipheringInd ( UBYTE gsm_ciph, UBYTE gprs_ciph )
{
  SHORT idx;                  /* holds index counter */

  TRACE_FUNCTION ("cmhGMM_CipheringInd()");

  if (simShrdPrm.ciSIMEnabled NEQ TRUE)
  {
    return 1;
  }

  for (idx = 0; idx < CMD_SRC_MAX; idx++)
  {
     /*
     *-----------------------------------------------------------------
     * new message indication
     *-----------------------------------------------------------------
     */
     R_AT(RAT_P_CPRI,(T_ACI_CMD_SRC)idx)(gsm_ciph, gprs_ciph);
  }
  return 0;
}


#endif /* GPRS */
/*==== EOF ========================================================*/