FreeCalypso > hg > fc-magnetite
diff src/g23m-aci/aci/cmh_gmmr.c @ 162:53929b40109c
src/g23m-aci: initial import from TCS3.2/LoCosto
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 11 Oct 2016 02:02:43 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-aci/aci/cmh_gmmr.c Tue Oct 11 02:02:43 2016 +0000 @@ -0,0 +1,727 @@ +/* ++----------------------------------------------------------------------------- +| 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 ========================================================*/ +