FreeCalypso > hg > fc-magnetite
diff src/aci2/aci/cmh_simr.c @ 3:93999a60b835
src/aci2, src/condat2: import of g23m/condat source pieces from TCS211
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 26 Sep 2016 00:29:36 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/aci2/aci/cmh_simr.c Mon Sep 26 00:29:36 2016 +0000 @@ -0,0 +1,2736 @@ +/* ++----------------------------------------------------------------------------- +| Project : GSM-PS (6147) +| Modul : CMH_SIMR ++----------------------------------------------------------------------------- +| 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 +| the subscriber identity module. ++----------------------------------------------------------------------------- +*/ + +#ifndef CMH_SIMR_C +#define CMH_SIMR_C +#endif + +#include "aci_all.h" +/*==== INCLUDES ===================================================*/ +#include "aci_mem.h" + +#include "aci_cmh.h" +#include "ati_cmd.h" +#include "aci_cmd.h" +#include "pcm.h" + +#ifdef FAX_AND_DATA +#include "aci_fd.h" +#endif /* of #ifdef FAX_AND_DATA */ + +#ifndef _SIMULATION_ +#include "ffs/ffs.h" +#include "ffs_coat.h" +#endif + +#ifdef DTI +#include "dti.h" /* functionality of the dti library */ +#include "dti_conn_mng.h" +#include "dti_cntrl_mng.h" +#endif /* DTI */ + +#include "phb.h" +#include "ksd.h" +#include "aci.h" +#include "psa.h" +#include "psa_sim.h" +#include "psa_cc.h" +#include "psa_sat.h" +#include "psa_mm.h" +#include "cmh.h" +#include "cmh_sim.h" +#include "cmh_mm.h" +#include "cmh_phb.h" + +#include "aci_ext_pers.h" +#include "aci_slock.h" + +#ifdef SIM_PERS +#include "general.h" // included for compilation error UNIT8 in sec_drv.h +#include "sec_drv.h" +#endif + +#ifdef GPRS + #include "gaci.h" + #include "gaci_cmh.h" + #include "psa_gmm.h" + #include "cmh_gmm.h" +#endif + +#include "p_mmcc.h" +#include "m_cc.h" + +#include "aoc.h" + +#ifdef DTI +#include "wap_aci.h" +#include "psa_tcpip.h" +#include "psa_l2r.h" +#endif + +#ifdef SIM_PERS +EXTERN T_ACI_SIM_CONFIG aci_slock_sim_config; /* SIM configuration, initialised by a T_SIM_MMI_INSERT_IND */ +EXTERN T_SEC_DRV_CONFIGURATION *cfg_data ; +#endif + +/*==== CONSTANTS ==================================================*/ + + +/*==== TYPES ======================================================*/ + + +/*==== EXPORT =====================================================*/ + + +/*==== VARIABLES ==================================================*/ + +/*==== FUNCTIONS ==================================================*/ + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_SIMR | +| ROUTINE : cmhSIM_SIMSync | ++-------------------------------------------------------------------+ + + PURPOSE : SIM data synchronized + +*/ + +GLOBAL void cmhSIM_SIMSync ( void ) +{ + TRACE_FUNCTION ("cmhSIM_SIMSync()"); + + /* process event */ + switch( simEntStat.curCmd ) + { + case( AT_CMD_CFUN ): + if (mmEntStat.curCmd NEQ AT_CMD_CFUN) /* Has MM already deregistered? */ + { + R_AT( RAT_OK, simEntStat.entOwn ) + ( AT_CMD_CFUN ); + + /* log result */ + cmh_logRslt ( simEntStat.entOwn, RAT_OK, AT_CMD_CFUN, -1, -1, -1 ); + } + /*lint -fallthrough*/ + case( AT_CMD_COPS ): + case( AT_CMD_P_COPS ): + + simEntStat.curCmd = AT_CMD_NONE; + break; + } +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_SIMR | +| ROUTINE : clck_fdn_accepted() | ++-------------------------------------------------------------------+ + + PURPOSE : PIN2 status allows CLCK changing the status concerning FDN. + +*/ + +LOCAL void clck_fdn_accepted ( void ) +{ + switch( simShrdPrm.setPrm[simEntStat.entOwn].actProc ) + { + case( SIM_FDN_ENABLE ): + if( simShrdPrm.crdFun EQ SIM_ADN_ENABLED ) + { + simShrdPrm.crdFun = SIM_FDN_ENABLED; + } + if( simShrdPrm.crdFun EQ SIM_ADN_BDN_ENABLED ) + { + simShrdPrm.crdFun = SIM_FDN_BDN_ENABLED; + } + + pb_switch_adn_fdn( FDN_ENABLE, simShrdPrm.classFDN ); /* inform PHB */ + break; + + case( SIM_FDN_DISABLE ): + if( simShrdPrm.crdFun EQ SIM_FDN_ENABLED ) + { + simShrdPrm.crdFun = SIM_ADN_ENABLED; + } + if( simShrdPrm.crdFun EQ SIM_FDN_BDN_ENABLED ) + { + simShrdPrm.crdFun = SIM_ADN_BDN_ENABLED; + } + pb_switch_adn_fdn( FDN_DISABLE, simShrdPrm.classFDN ); /* inform PHB */ + break; + } +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_SIMR | +| ROUTINE : cmhsim_simactivated_clck | ++-------------------------------------------------------------------+ + PURPOSE : SIM activated after AT+CLCK +*/ + +LOCAL void cmhsim_simactivated_clck( void ) +{ + T_ACI_CME_ERR err = CME_ERR_Unknown; + T_SIM_SET_PRM *sim_set_prm; + + TRACE_FUNCTION ("cmhsim_simactivated_clck()"); + + simEntStat.curCmd = AT_CMD_NONE; + sim_set_prm = &simShrdPrm.setPrm[simEntStat.entOwn]; + + switch( simShrdPrm.rslt ) + { + case( SIM_NO_ERROR ): + clck_fdn_accepted(); + + R_AT( RAT_OK, simEntStat.entOwn ) + ( AT_CMD_CLCK ); + cmh_logRslt ( simEntStat.entOwn, RAT_OK, AT_CMD_CLCK, -1, -1, -1 ); + return; + + case( SIM_CAUSE_PIN2_EXPECT ): + TRACE_EVENT_P1("simShrdPrm.pn2Stat: %d", simShrdPrm.pn2Stat); + + if ( simShrdPrm.pn2Stat EQ PS_PIN2 ) + { + if ( ( simShrdPrm.setPrm[simEntStat.entOwn].curPIN[0] NEQ 0x00 ) AND + ( simShrdPrm.setPrm[simEntStat.entOwn].curPIN[0] NEQ NOT_PRESENT_CHAR ) ) + { + /* if PIN2 is required and a pin is given, then check pin with PIN2 */ + simEntStat.curCmd = AT_CMD_CLCK; /* further processing */ + + simShrdPrm.setPrm[simEntStat.entOwn].PINType = PHASE_2_PIN_2; + psaSIM_VerifyPIN(); /* verify PIN */ + return; + } + else + { + /* if PIN2 is required and no pin is given, then send cme_err with PIN2 + required message code */ + if ( simShrdPrm.PINStat EQ PS_RDY ) + { + simShrdPrm.PINStat = PS_PIN2; + } + err = CME_ERR_SimPin2Req; + } + } + else + { + err = CME_ERR_WrongPasswd; + } + break; + + /*case( SIM_CAUSE_PIN1_EXPECT ): + case( SIM_CAUSE_PUK1_EXPECT ):*/ + +/* Should be CME_ERR_SimPuk2Req, and it is done + in the default case + case( SIM_CAUSE_PIN2_BLOCKED): + case( SIM_CAUSE_PUK2_EXPECT ): + err = CME_ERR_WrongPasswd; + break;*/ + + default: + err = cmhSIM_GetCmeFromSim( simShrdPrm.rslt ); + break; + } + + R_AT( RAT_CME, simEntStat.entOwn ) + ( AT_CMD_CLCK, err ); + cmh_logRslt ( simEntStat.entOwn, RAT_CME, AT_CMD_CLCK, + -1, -1, err ); + +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_SIMR | +| ROUTINE : cmhsim_simactivated_start | ++-------------------------------------------------------------------+ + PURPOSE : SIM activated after AT+CFUN, +CPIN, +CIMI and %NRG +*/ +LOCAL void simactivated_cpinresult( T_ACI_CPIN_RSLT cpin_result ) +{ + R_AT( RAT_CPIN, simEntStat.entOwn ) + ( cpin_result ); + R_AT( RAT_OK, simEntStat.entOwn ) + ( AT_CMD_CPIN ); + cmh_logRslt ( simEntStat.entOwn, RAT_OK, AT_CMD_CPIN, + -1, -1, -1 ); +} + +LOCAL void simactivated_errorresult( T_ACI_CME_ERR error_result, UBYTE cmdBuf ) +{ + R_AT( RAT_CME, simEntStat.entOwn ) + ( cmdBuf, error_result ); + + if( cmdBuf NEQ AT_CMD_CIMI ) + { + cmh_logRslt ( simEntStat.entOwn, RAT_CME, cmdBuf, + -1, -1, error_result ); + } +} + +LOCAL void cmhsim_simactivated_start( void ) +{ + UBYTE cmdBuf = simEntStat.curCmd; /* buffers current command */ + + TRACE_FUNCTION ("cmhsim_simactivated_start()"); + + simEntStat.curCmd = AT_CMD_NONE; + + switch( simShrdPrm.SIMStat ) + { + case( SS_INV ): + simactivated_errorresult( CME_ERR_SimWrong, cmdBuf ); + return; + + case( SS_URCHB ): + simactivated_errorresult( CME_ERR_SimNotIns, cmdBuf ); + return; + + case( NO_VLD_SS ): + simactivated_errorresult( CME_ERR_NotPresent, cmdBuf ); + return; + + case( SS_OK ): + switch( simShrdPrm.PINStat ) + { + case( PS_PIN1 ): + if( cmdBuf EQ AT_CMD_CPIN ) + { + simactivated_cpinresult( CPIN_RSLT_SimPinReq ); + } + else + { + simactivated_errorresult( CME_ERR_SimPinReq, cmdBuf ); + } + break; + + case( PS_PIN2 ): + if( cmdBuf EQ AT_CMD_CPIN ) + { + simactivated_cpinresult( CPIN_RSLT_SimPin2Req ); + } + else + { + simactivated_errorresult( CME_ERR_SimPin2Req, cmdBuf ); + } + break; + + case( PS_RDY ): + /* wait for SIM insert indication to complete command */ + simEntStat.curCmd = cmdBuf; + break; + } + break; + + case( SS_BLKD ): + + switch( simShrdPrm.PINStat ) + { + case( PS_PUK1 ): + if( cmdBuf EQ AT_CMD_CPIN ) + { + simactivated_cpinresult( CPIN_RSLT_SimPukReq ); + } + else + { + simactivated_errorresult( CME_ERR_SimPukReq, cmdBuf ); + } + break; + + case( PS_PUK2 ): + if( cmdBuf EQ AT_CMD_CPIN ) + { + simactivated_cpinresult( CPIN_RSLT_SimPuk2Req ); + } + else + { + simactivated_errorresult( CME_ERR_SimPuk2Req, cmdBuf ); + } + break; + } + break; + + } +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_SIMR | +| ROUTINE : cmhSIM_SIMActivated | ++-------------------------------------------------------------------+ + + PURPOSE : SIM activated + +*/ + +GLOBAL void cmhSIM_SIMActivated ( void ) +{ + T_ACI_CMD_SRC idx; + + TRACE_FUNCTION ("cmhSIM_SIMActivated()"); + + /* check for command context */ + switch( simEntStat.curCmd ) + { + case( AT_CMD_CFUN ): + case( AT_CMD_CPIN ): + case( AT_CMD_CIMI ): + case( AT_CMD_NRG ): + case( AT_CMD_SIMRST): + /* process event for +CFUN, +CPIN, +CIMI and for %NRG command */ + cmhsim_simactivated_start( ); + break; + + case( AT_CMD_CLCK ): + /* process event for +CLCK command */ + cmhsim_simactivated_clck( ); + break; + + case( AT_CMD_NONE ): + /* process event spontaneous insertion */ + if (simShrdPrm.rslt EQ SIM_NO_ERROR) + { + ; /* do nothing right now since the %SIMINS: -1 must be + syncronized with SIM_MMI_INSERT_IND which will come later! */ + } + else + { + for( idx = 0; idx < CMD_SRC_MAX; idx++ ) + { + R_AT( RAT_SIMINS, idx )(cmhSIM_GetCmeFromSim (simShrdPrm.rslt)); + } + } + break; + } +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_SIMR | +| ROUTINE : cmhSIM_SIMInserted | ++-------------------------------------------------------------------+ + + PURPOSE : SIM inserted + +*/ + +GLOBAL void cmhSIM_SIMInserted ( void ) +{ + UBYTE cmdBuf; /* buffers current command */ + CHAR imsiBuf[MAX_IMSI_LEN+1]; /* buffer IMSI representation +1 for '\0'*/ + T_ACI_CME_ERR err_code = CME_ERR_NotPresent; /* code holding the correct error code calculated */ + BOOL return_rat_ok = 1; /* return ok? */ + + TRACE_FUNCTION ("cmhSIM_SIMInserted()"); + + /* Check if the SIM is functional and the IMSI value is valid*/ + if ( simShrdPrm.crdFun EQ SIM_NO_OPERATION OR + simShrdPrm.imsi.c_field EQ 0 ) + { + simShrdPrm.SIMStat = SS_INV; + err_code = CME_ERR_SimWrong; + } + + switch( simEntStat.curCmd ) + { + case( AT_CMD_CFUN ): + case( AT_CMD_CPIN ): + case( AT_CMD_PVRF ): + case( AT_CMD_SIMRST): + case( KSD_CMD_UBLK): + /* + *---------------------------------------------------------------- + * process event for +CFUN, +CPIN, %PVRF commands and for the + SIM reset condition + *---------------------------------------------------------------- + */ + + cmdBuf = simEntStat.curCmd; + simEntStat.curCmd = AT_CMD_NONE; +#ifdef SIM_PERS + if((aci_slock_sim_config.sim_type EQ SIM_TYPEAPPROVAL) AND AciSLockShrd.blocked) + { + simShrdPrm.SIMStat = SS_INV; + err_code = CME_ERR_SimWrong; + } + if(cfg_data EQ NULL) + { + simShrdPrm.SIMStat = SS_INV; + err_code = CME_ERR_Unknown; + R_AT( RAT_CME, simEntStat.entOwn ) ( cmdBuf, err_code ); + cmh_logRslt ( simEntStat.entOwn, RAT_CME, cmdBuf, -1, -1, err_code ); + simShrdPrm.PINQuery = 0; + return; + } +#endif + + if( err_code EQ CME_ERR_SimWrong ) + { + R_AT( RAT_CME, simEntStat.entOwn ) ( cmdBuf, err_code ); + cmh_logRslt ( simEntStat.entOwn, RAT_CME, cmdBuf, -1, -1, err_code ); + simShrdPrm.PINQuery = 0; + return; + } + +#ifdef SIM_PERS + /* check for personalisation locking. If SIM was detected as not correct, do signal AT_CPIN */ + + if ( AciSLockShrd.blocked) + { + /* @GBR: Alternativly CME_ERR_SimWrong might be returned, but this way is telling the MMI mor specific, what went wrong. */ + aci_set_cme_error_code(AciSLockShrd.current_lock,&err_code); + + return_rat_ok = 0; + R_AT( RAT_CME, simEntStat.entOwn ) + ( cmdBuf, err_code ); + cmh_logRslt ( simEntStat.entOwn, RAT_CME, cmdBuf, -1, -1, err_code ); + } + +#endif + if ( (cmdBuf EQ AT_CMD_CPIN) AND (simShrdPrm.PINQuery EQ 1) ) /* Case when PIN is disabled and CFUN=0 */ + { + R_AT( RAT_CPIN, simEntStat.entOwn ) + ( CPIN_RSLT_SimReady ); + simShrdPrm.PINQuery = 0; + } + +#if defined (GPRS) AND defined (DTI) + gprs_sim_inserted(); +#endif /* GPRS */ + + if (return_rat_ok EQ 1) /* @gbr: only send ok, if everhing went okay. The +CFUN might not be ready here, so don't send something! */ + { + + R_AT( RAT_OK, simEntStat.entOwn ) ( cmdBuf ); + cmh_logRslt ( simEntStat.entOwn, RAT_OK, cmdBuf, -1, -1, -1 ); + } + break; + + case( AT_CMD_CIMI ): + /* + *---------------------------------------------------------------- + * process event for +CIMI command + *---------------------------------------------------------------- + */ + + + if( err_code EQ CME_ERR_SimWrong ) + { + R_AT( RAT_CME, simEntStat.entOwn ) ( AT_CMD_CIMI, err_code ); + cmh_logRslt ( simEntStat.entOwn, RAT_CME, AT_CMD_CIMI, -1, -1, err_code ); + return; + } + + R_AT( RAT_CIMI, simEntStat.entOwn ) + ( psaSIM_cnvrtIMSI2ASCII( imsiBuf )); + + simEntStat.curCmd = AT_CMD_NONE; + + R_AT( RAT_OK, simEntStat.entOwn ) + ( AT_CMD_CIMI ); + break; + + case( AT_CMD_NRG ): + /* + *---------------------------------------------------------------- + * process event for %NRG + *---------------------------------------------------------------- + */ + cmdBuf = simEntStat.curCmd; + if( err_code EQ CME_ERR_SimWrong ) + { + simEntStat.curCmd = AT_CMD_NONE; + mmEntStat.curCmd = AT_CMD_NONE; + R_AT( RAT_CME, simEntStat.entOwn ) ( cmdBuf, err_code ); + cmh_logRslt ( simEntStat.entOwn, RAT_CME, cmdBuf, -1, -1, err_code ); + return; + } + + switch( cmhPrm[simShrdPrm.owner].mmCmdPrm.NRGregMode ) + { + case( NRG_RGMD_Auto ): + + mmShrdPrm.regMode = MODE_AUTO; + + simEntStat.curCmd = AT_CMD_NONE; + mmEntStat.curCmd = AT_CMD_NRG; + mmEntStat.entOwn = mmShrdPrm.owner = simShrdPrm.owner; + +#if defined (GPRS) AND defined (DTI) + (void)psaG_MM_CMD_REG (); /* register to network */ +#else + (void)psaMM_Registrate (); /* register to network */ +#endif + + cmhMM_Ntfy_NtwRegistrationStatus(CREG_STAT_Search); + break; + + case( NRG_RGMD_Manual ): + + mmShrdPrm.regMode = MODE_MAN; + + simEntStat.curCmd = AT_CMD_NONE; + mmEntStat.curCmd = AT_CMD_NRG; + mmEntStat.entOwn = mmShrdPrm.owner = simShrdPrm.owner; + +#if defined (GPRS) && defined (DTI) + psaG_MM_CMD_NET_SEL ( ); /* register to network */ +#else + psaMM_NetSel (); /* register to network */ +#endif + + cmhMM_Ntfy_NtwRegistrationStatus(CREG_STAT_Search); + break; + } + break; + + case( AT_CMD_NONE ): + { + T_ACI_CMD_SRC idx; + /* process event spontaneous insertion */ + for( idx = 0; idx < CMD_SRC_MAX; idx++ ) + { + R_AT( RAT_SIMINS, idx )( err_code ); + } + } + break; + + } +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_SIMR | +| ROUTINE : cmhSIM_SIMRemoved | ++-------------------------------------------------------------------+ + + PURPOSE : SIM removed + +*/ + +GLOBAL void cmhSIM_SIMRemoved ( void ) +{ + UBYTE cmdBuf; /* buffers command */ + T_ACI_CMD_SRC idx; + T_ACI_CME_ERR cme_error; /* CME error code */ + T_ACI_SIMREM_TYPE srt; /* type of SIM remove */ + + TRACE_FUNCTION ("cmhSIM_SIMRemoved()"); + + if (simEntStat.curCmd NEQ AT_CMD_NONE) + { + cmdBuf = simEntStat.curCmd; + simEntStat.curCmd = AT_CMD_NONE; + + if (simShrdPrm.rslt EQ SIM_NO_ERROR) + cme_error = CME_ERR_SimBusy; + else + cme_error = cmhSIM_GetCmeFromSim (simShrdPrm.rslt); + + R_AT( RAT_CME, simEntStat.entOwn ) + ( cmdBuf, cme_error ); + cmh_logRslt ( simEntStat.entOwn, RAT_CME, cmdBuf, + -1, -1, cme_error ); + } + EfPLMNselStat = EF_STAT_UNKNWN; + /* + *---------------------------------------------------------------- + * send unsolicited result + *---------------------------------------------------------------- + */ + TRACE_EVENT_P1("Result of SIM remove indication: %x", simShrdPrm.rslt); + switch (simShrdPrm.rslt) + { + case SIM_NO_ERROR: + /* In this case the AT command state is set to SIM RESET */ + /* NO, don't do this! + This line would prevent a %SIMIND: 11 and instead leads to + "+CME ERROR: SIM PIN required" without any command context which is wrong */ + /* simEntStat.curCmd = AT_CMD_SIMRST; */ + srt = SIMREM_RESET; + break; + case SIM_CAUSE_DRV_TEMPFAIL: + srt = SIMREM_RETRY; + break; + default: + srt = SIMREM_FAILURE; + break; + } + + for( idx = 0; idx < CMD_SRC_MAX; idx++ ) + { + R_AT( RAT_SIMREM, idx )(srt); + } +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_SIMR | +| ROUTINE : cmhSIM_PINVerified | ++-------------------------------------------------------------------+ + + PURPOSE : SIM verified + +*/ +LOCAL void pin_verified_clck (USHORT sim_result) +{ + TRACE_FUNCTION ("pin_verified_clck()"); + + switch(sim_result) + { + case( SIM_NO_ERROR ): + /* now do it ! */ + + /* Check if we want to do FDN Lock or ALS Lock */ + switch (simShrdPrm.setPrm[simShrdPrm.owner].actProc) + { + case SIM_FDN_ENABLE: + case SIM_FDN_DISABLE: + /* FDN Lock */ + if( psaSIM_ActivateSIM() < 0 ) /* activate SIM card */ + { + simEntStat.curCmd = AT_CMD_NONE; + + R_AT( RAT_CME, simEntStat.entOwn ) + ( AT_CMD_CLCK, CME_ERR_Unknown ); + cmh_logRslt ( simEntStat.entOwn, RAT_CME, AT_CMD_CLCK, + -1, -1, CME_ERR_Unknown ); + } + break; + + case SIM_ALS_LOCK: + case SIM_ALS_UNLOCK: + /* ALS Lock to PIN2 */ + if (simShrdPrm.setPrm[simShrdPrm.owner].actProc EQ SIM_ALS_LOCK) + { + ALSlock = cmhPrm[simShrdPrm.owner].ccCmdPrm.ALSmode; + /* pull all sources to the current ALSmode, otherwise a lock won't make sense */ + { + int i; + for (i=0; i<OWN_MAX; i++) + cmhPrm[i].ccCmdPrm.ALSmode = ALSlock; + /* and lock them all */ + } + #ifndef _SIMULATION_ + /* write Lock to FFS */ + FFS_fwrite("/gsm/com/ALSlock", &ALSlock, sizeof(ALSlock)); + #endif + } + else + /* unlock ALS */ + { + ALSlock = ALS_MOD_NOTPRESENT; + #ifndef _SIMULATION_ + /* remove lock from FFS */ + FFS_remove("/gsm/com/ALSlock"); + #endif + } + + simEntStat.curCmd = AT_CMD_NONE; + + R_AT( RAT_OK, simEntStat.entOwn ) + ( AT_CMD_CLCK ); + cmh_logRslt ( simEntStat.entOwn, RAT_OK, AT_CMD_CLCK, -1, -1, -1 ); + break; + + } + break; /* SIM_NO_ERROR */ + + case( SIM_CAUSE_PIN1_EXPECT ): + case( SIM_CAUSE_PIN2_EXPECT ): + case( SIM_CAUSE_PIN1_BLOCKED ): + case( SIM_CAUSE_PUK1_EXPECT ): + case( SIM_CAUSE_PIN2_BLOCKED ): + case( SIM_CAUSE_PUK2_EXPECT ): + simEntStat.curCmd = AT_CMD_NONE; + + R_AT( RAT_CME, simEntStat.entOwn ) + ( AT_CMD_CLCK, cmhSIM_GetCmeFromSim ( sim_result ) /*CME_ERR_WrongPasswd*/ ); + cmh_logRslt ( simEntStat.entOwn, RAT_CME, AT_CMD_CLCK, + -1, -1, CME_ERR_WrongPasswd ); + break; + + default: + simEntStat.curCmd = AT_CMD_NONE; + R_AT( RAT_CME, simEntStat.entOwn ) + ( AT_CMD_CLCK, CME_ERR_SimFail ); + cmh_logRslt ( simEntStat.entOwn, RAT_CME, AT_CMD_CLCK, + -1, -1, CME_ERR_SimFail ); + break; + } +} + +GLOBAL void cmhSIM_PINVerified ( void ) +{ + UBYTE cmdBuf; /* buffers command */ + T_PHB_CMD_PRM * pPHBCmdPrm; /* points to PHB command parameters */ + + TRACE_FUNCTION ("cmhSIM_PINVerified()"); + + pPHBCmdPrm = &cmhPrm[simShrdPrm.owner].phbCmdPrm; + +/* + *------------------------------------------------------------------- + * check for command context + *------------------------------------------------------------------- + */ + switch( simEntStat.curCmd ) + { + case( AT_CMD_CLCK ): + /* process event for +CLCK command */ + pin_verified_clck( simShrdPrm.rslt ); + return; + + case( AT_CMD_CPIN ): + case( AT_CMD_PVRF ): + /* + *---------------------------------------------------------------- + * process event for +CPIN and %PVRF command + *---------------------------------------------------------------- + */ + switch( simShrdPrm.rslt ) + { + case( SIM_NO_ERROR ): + + /* if verified PIN was PIN 2 or PIN 1 was already entered */ + if( simShrdPrm.setPrm[simEntStat.entOwn].PINType EQ + PHASE_2_PIN_2 OR + simShrdPrm.crdPhs NEQ 0xFF ) + { + cmdBuf = simEntStat.curCmd; + simEntStat.curCmd = AT_CMD_NONE; + + R_AT( RAT_OK, simEntStat.entOwn ) + ( cmdBuf ); + cmh_logRslt ( simEntStat.entOwn, RAT_OK, cmdBuf, -1, -1, -1 ); + } + /* otherwise wait for SIM insert indication to complete command */ + break; + + case( SIM_CAUSE_PIN1_EXPECT ): + case( SIM_CAUSE_PIN2_EXPECT ): + case( SIM_CAUSE_PUK1_EXPECT ): + case( SIM_CAUSE_PUK2_EXPECT ): + cmdBuf = simEntStat.curCmd; + simEntStat.curCmd = AT_CMD_NONE; + + R_AT( RAT_CME, simEntStat.entOwn ) + ( cmdBuf, CME_ERR_WrongPasswd ); + cmh_logRslt ( simEntStat.entOwn, RAT_CME, cmdBuf, + -1, -1, CME_ERR_WrongPasswd ); + break; + case( SIM_CAUSE_PIN1_BLOCKED): + cmdBuf = simEntStat.curCmd; + simEntStat.curCmd = AT_CMD_NONE; + + R_AT( RAT_CME, simEntStat.entOwn ) + ( cmdBuf, CME_ERR_SimPukReq ); + cmh_logRslt ( simEntStat.entOwn, RAT_CME, cmdBuf, + -1, -1, CME_ERR_SimPukReq ); + break; + case( SIM_CAUSE_PIN2_BLOCKED): + cmdBuf = simEntStat.curCmd; + simEntStat.curCmd = AT_CMD_NONE; + + R_AT( RAT_CME, simEntStat.entOwn ) + ( cmdBuf, CME_ERR_SimPuk2Req ); + cmh_logRslt ( simEntStat.entOwn, RAT_CME, cmdBuf, + -1, -1, CME_ERR_SimPuk2Req ); + break; + default: + cmdBuf = simEntStat.curCmd; + simEntStat.curCmd = AT_CMD_NONE; + R_AT( RAT_CME, simEntStat.entOwn ) + ( cmdBuf, CME_ERR_SimFail ); + break; + } + break; + + case( AT_CMD_CAMM ): + /* + *---------------------------------------------------------------- + * process event for +CAMM command + *---------------------------------------------------------------- + */ + switch( simShrdPrm.rslt ) + { + case( SIM_NO_ERROR ): + /* + * Try it again + */ + simEntStat.curCmd = AT_CMD_NONE; + aoc_update_acmmax (SECOND_UPDATE, 0L); + break; + + default: + simEntStat.curCmd = AT_CMD_NONE; + R_AT( RAT_CME, simEntStat.entOwn ) + ( AT_CMD_CAMM, CME_ERR_WrongPasswd ); + break; + } + break; + + case( AT_CMD_CPUC ): + /* + *---------------------------------------------------------------- + * process event for +CPUC command + *---------------------------------------------------------------- + */ + switch( simShrdPrm.rslt ) + { + case( SIM_NO_ERROR ): + /* + * Try it again + */ + simEntStat.curCmd = AT_CMD_NONE; + aoc_update_puct (SECOND_UPDATE, 0L); + break; + + default: + simEntStat.curCmd = AT_CMD_NONE; + R_AT( RAT_CME, simEntStat.entOwn ) + ( AT_CMD_CPUC, CME_ERR_WrongPasswd ); + break; + } + break; + + case( AT_CMD_CACM ): + /* + *---------------------------------------------------------------- + * process event for +CACM command + *---------------------------------------------------------------- + */ + switch( simShrdPrm.rslt ) + { + case( SIM_NO_ERROR ): + /* + * Try it again + */ + simEntStat.curCmd = AT_CMD_NONE; + aoc_update_acm (SECOND_UPDATE, 0L); + break; + + default: + simEntStat.curCmd = AT_CMD_NONE; + R_AT( RAT_CME, simEntStat.entOwn ) + ( AT_CMD_CACM, CME_ERR_WrongPasswd ); + break; + } + break; + + /*----------------------------------------------------------* + * The below code is for CPBW SIM verification response * + *----------------------------------------------------------*/ + + case( AT_CMD_CPBS ): + /* + *---------------------------------------------------------------- + * process event for +CPBW command + *---------------------------------------------------------------- + */ + switch( simShrdPrm.rslt ) + { + case( SIM_NO_ERROR ): + + /*-----------------------------------------------* + * if verified PIN was PIN 2 was already entered * + *-----------------------------------------------*/ + + cmdBuf = simEntStat.curCmd; + simEntStat.curCmd = AT_CMD_NONE; + + pPHBCmdPrm->cmhStor = pPHBCmdPrm->temp_cmhStor; + pPHBCmdPrm->phbStor = pPHBCmdPrm->temp_phbStor; + + R_AT( RAT_OK, simEntStat.entOwn ) + ( cmdBuf ); + + cmh_logRslt ( simEntStat.entOwn, RAT_OK, cmdBuf, -1, -1, -1 ); + + /*---------------------------------------------------------------* + * otherwise wait for SIM insert indication to complete command * + *---------------------------------------------------------------*/ + + break; + + case( SIM_CAUSE_PUK2_EXPECT ): + case( SIM_CAUSE_PIN2_BLOCKED): + case( SIM_CAUSE_PIN2_EXPECT ): + + cmdBuf = simEntStat.curCmd; + simEntStat.curCmd = AT_CMD_NONE; + + R_AT( RAT_CME, simEntStat.entOwn ) + ( cmdBuf, CME_ERR_WrongPasswd ); + cmh_logRslt ( simEntStat.entOwn, RAT_CME, cmdBuf, + -1, -1, CME_ERR_WrongPasswd ); + break; + + default: + cmdBuf = simEntStat.curCmd; + simEntStat.curCmd = AT_CMD_NONE; + R_AT( RAT_CME, simEntStat.entOwn ) + ( cmdBuf, CME_ERR_SimFail ); + break; + } + break; + + default: + + simEntStat.curCmd = AT_CMD_NONE; + R_AT( RAT_CME, simEntStat.entOwn ) + ( AT_CMD_CPIN, CME_ERR_Unknown ); + cmh_logRslt ( simEntStat.entOwn, RAT_CME, AT_CMD_CPIN, + -1, -1, CME_ERR_Unknown ); + break; + } +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_SIMR | +| ROUTINE : cmhSIM_PINChanged | ++-------------------------------------------------------------------+ + + PURPOSE : SIM changed + +*/ + +GLOBAL void cmhSIM_PINChanged ( void ) +{ + T_ACI_CME_ERR err; + UBYTE cmdBuf; + + TRACE_FUNCTION ("cmhSIM_PINChanged()"); + +/* + *------------------------------------------------------------------- + * check for command context + *------------------------------------------------------------------- + */ + switch( simEntStat.curCmd ) + { + case( AT_CMD_CPWD ): + /*lint -e{408} */ + case( KSD_CMD_PWD ): /* KSD_CMD_* extends AT_CMD_* */ + /* + *---------------------------------------------------------------- + * process event for +CPWD and KSD PWD command + *---------------------------------------------------------------- + */ + switch( simShrdPrm.rslt ) + { + case( SIM_NO_ERROR ): + + cmdBuf = simEntStat.curCmd; + simEntStat.curCmd = AT_CMD_NONE; + + R_AT( RAT_OK, simEntStat.entOwn ) + ( cmdBuf ); + cmh_logRslt ( simEntStat.entOwn, RAT_OK, cmdBuf, -1, -1, -1 ); + return; + +/* why not use a meaningful CME error code? + case( SIM_CAUSE_PUK1_EXPECT ): + case( SIM_CAUSE_PUK2_EXPECT ): */ + case( SIM_CAUSE_PIN1_EXPECT ): + case( SIM_CAUSE_PIN2_EXPECT ): + err = CME_ERR_WrongPasswd; + break; + + default: + err = cmhSIM_GetCmeFromSim ( simShrdPrm.rslt ); + break; + } + + cmdBuf = simEntStat.curCmd; + simEntStat.curCmd = AT_CMD_NONE; + + R_AT( RAT_CME, simEntStat.entOwn ) + ( cmdBuf, err ); + cmh_logRslt ( simEntStat.entOwn, RAT_CME, cmdBuf, + -1, -1, err ); + break; + } +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_SIMR | +| ROUTINE : cmhSIM_PINEnabled | ++-------------------------------------------------------------------+ + + PURPOSE : SIM enabled + +*/ + +GLOBAL void cmhSIM_PINEnabled ( void ) +{ + T_ACI_CME_ERR err; + + TRACE_FUNCTION ("cmhSIM_PINEnabled()"); + +/* + *------------------------------------------------------------------- + * check for command context + *------------------------------------------------------------------- + */ + switch( simEntStat.curCmd ) + { + case( AT_CMD_CLCK ): + /* + *---------------------------------------------------------------- + * process event for +CLCK command + *---------------------------------------------------------------- + */ + switch( simShrdPrm.rslt ) + { + case( SIM_NO_ERROR ): + + simEntStat.curCmd = AT_CMD_NONE; + + R_AT( RAT_OK, simEntStat.entOwn ) + ( AT_CMD_CLCK ); + cmh_logRslt ( simEntStat.entOwn, RAT_OK, AT_CMD_CLCK, -1, -1, -1 ); + return; + + case( SIM_CAUSE_PIN1_EXPECT ): + case( SIM_CAUSE_PIN1_BLOCKED ): + err = CME_ERR_WrongPasswd; + break; + + default: + err = cmhSIM_GetCmeFromSim ( simShrdPrm.rslt ); + break; + } + + simEntStat.curCmd = AT_CMD_NONE; + + R_AT( RAT_CME, simEntStat.entOwn ) + ( AT_CMD_CLCK, err ); + cmh_logRslt ( simEntStat.entOwn, RAT_CME, AT_CMD_CLCK, + -1, -1, err ); + break; + } +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_SIMR | +| ROUTINE : cmhSIM_PINDisabled | ++-------------------------------------------------------------------+ + + PURPOSE : SIM disabled + +*/ + +GLOBAL void cmhSIM_PINDisabled ( void ) +{ + T_ACI_CME_ERR err; + + TRACE_FUNCTION ("cmhSIM_PINDisabled()"); + +/* + *------------------------------------------------------------------- + * check for command context + *------------------------------------------------------------------- + */ + switch( simEntStat.curCmd ) + { + case( AT_CMD_CLCK ): + /* + *---------------------------------------------------------------- + * process event for +CLCK command + *---------------------------------------------------------------- + */ + switch( simShrdPrm.rslt ) + { + case( SIM_NO_ERROR ): + + simEntStat.curCmd = AT_CMD_NONE; + + R_AT( RAT_OK, simEntStat.entOwn ) + ( AT_CMD_CLCK ); + cmh_logRslt ( simEntStat.entOwn, RAT_OK, AT_CMD_CLCK, -1, -1, -1 ); + return; + + case( SIM_CAUSE_PIN1_EXPECT ): + case( SIM_CAUSE_PIN1_BLOCKED ): + err = CME_ERR_WrongPasswd; + break; + + default: + err = cmhSIM_GetCmeFromSim ( simShrdPrm.rslt ); + break; + } + + simEntStat.curCmd = AT_CMD_NONE; + + R_AT( RAT_CME, simEntStat.entOwn ) + ( AT_CMD_CLCK, err ); + cmh_logRslt ( simEntStat.entOwn, RAT_CME, AT_CMD_CLCK, + -1, -1, err ); + break; + } +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_SIMR | +| ROUTINE : cmhSIM_CardUnblocked | ++-------------------------------------------------------------------+ + + PURPOSE : Card unblocked + +*/ + +GLOBAL void cmhSIM_CardUnblocked ( void ) +{ + UBYTE cmdBuf; + T_ACI_CME_ERR err; + + TRACE_FUNCTION ("cmhSIM_CardUnblocked()"); + +/* + *------------------------------------------------------------------- + * check for command context + *------------------------------------------------------------------- + */ + switch( simEntStat.curCmd ) + { + case( AT_CMD_CPIN ): + case( AT_CMD_PVRF ): + /*lint -e{408} */ + case( KSD_CMD_UBLK ): + /* + *---------------------------------------------------------------- + * process event for +CPIN, %PVRF and KSD UBLK command + *---------------------------------------------------------------- + */ + switch( simShrdPrm.rslt ) + { + case( SIM_NO_ERROR ): + + if(simShrdPrm.crdPhs NEQ 0xFF)/* If SIM insert indication is already received*/ + { + cmdBuf = simEntStat.curCmd; + simEntStat.curCmd = AT_CMD_NONE; + + R_AT( RAT_OK, simEntStat.entOwn ) + ( cmdBuf ); + cmh_logRslt ( simEntStat.entOwn, RAT_OK, cmdBuf, -1, -1, -1 ); + }/* else wait till SIM insert indication is received*/ + return; + +/* why not use a meaningful CME error code? + case( SIM_CAUSE_PUK1_EXPECT ): + case( SIM_CAUSE_PUK2_EXPECT ): */ + case( SIM_CAUSE_PIN1_EXPECT ): + case( SIM_CAUSE_PIN2_EXPECT ): + err = CME_ERR_WrongPasswd; + break; + + default: + err = cmhSIM_GetCmeFromSim ( simShrdPrm.rslt ); + break; + } + + cmdBuf = simEntStat.curCmd; + simEntStat.curCmd = AT_CMD_NONE; + + R_AT( RAT_CME, simEntStat.entOwn ) + ( cmdBuf, err ); + cmh_logRslt ( simEntStat.entOwn, RAT_CME, cmdBuf, + -1, -1, err ); + break; + } +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_SIMR | +| ROUTINE : cmhSIM_SIMResponseData | ++-------------------------------------------------------------------+ + + PURPOSE : SIM response data + +*/ + +GLOBAL void cmhSIM_SIMResponseData( T_SIM_TRNS_RSP_PRM* rsp ) +{ + UBYTE cmdBuf; /* buffers command */ + T_ACI_CMD_SRC ownBuf; /* buffers current owner */ + UBYTE *rspData; + + TRACE_FUNCTION ("cmhSIM_SIMResponseData()"); + + cmdBuf = simEntStat.curCmd; + simEntStat.curCmd = AT_CMD_NONE; + + ownBuf = simEntStat.entOwn; + simEntStat.entOwn = simShrdPrm.owner = OWN_NONE; + + /* + *------------------------------------------------------------------- + * check for command context + *------------------------------------------------------------------- + */ + switch( cmdBuf ) + { + case( AT_CMD_CRSM ): + if (simShrdPrm.rslt NEQ SIM_NO_ERROR AND + GET_CAUSE_DEFBY(simShrdPrm.rslt) EQ DEFBY_CONDAT ) + { + /* + *---------------------------------------------------------------- + * error event for +CRSM + *---------------------------------------------------------------- + */ + R_AT( RAT_CME, ownBuf ) + ( + cmdBuf, + cmhSIM_GetCmeFromSim ( simShrdPrm.rslt ) + ); + } + else + { + /* + *---------------------------------------------------------------- + * process event for +CRSM + *---------------------------------------------------------------- + */ + R_AT( RAT_CRSM, ownBuf ) + ( rsp->sw1, rsp->sw2, rsp->rspLen, ((rsp->rspLen)?rsp->rsp:NULL)); + + R_AT( RAT_OK, ownBuf ) + ( cmdBuf ); + } + break; + + case( AT_CMD_CSIM ): + /* + *---------------------------------------------------------------- + * error event for +CSIM + *---------------------------------------------------------------- + */ + if (simShrdPrm.rslt NEQ SIM_NO_ERROR) + { + R_AT( RAT_CME, ownBuf ) + ( + cmdBuf, + cmhSIM_GetCmeFromSim ( simShrdPrm.rslt ) + ); + + return; + } + /* + *---------------------------------------------------------------- + * process event for +CSIM + *---------------------------------------------------------------- + */ + ACI_MALLOC(rspData, MAX_SIM_CMD+2); /* alloc 2 byte more for sw1 and sw2 */ + memcpy (rspData, rsp->rsp, rsp->rspLen); + rspData[rsp->rspLen++] = rsp->sw1; + rspData[rsp->rspLen++] = rsp->sw2; + + R_AT( RAT_CSIM, ownBuf ) + ( rsp->rspLen, rspData); + + ACI_MFREE(rspData); + + R_AT( RAT_OK, ownBuf ) + ( cmdBuf ); + break; + + default: + TRACE_EVENT("wrong command context (+CRSM or +CSIM expected)"); + break; + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_SIMR | +| ROUTINE : cmhSIM_CnfMsisdn | ++--------------------------------------------------------------------+ + + PURPOSE : This function handles the confirmation of reading + EF MSISDN from SIM. +*/ +GLOBAL void cmhSIM_CnfMsisdn ( SHORT table_id ) +{ + T_SIM_CMD_PRM* pSIMCmdPrm; /* points to SIM command parameters */ + T_ACI_AT_CMD cmdBuf; /* buffers current command */ + T_ACI_CMD_SRC ownBuf; /* buffers current owner */ + + UBYTE* ptr; /* pointer to decoded data */ + UBYTE alphaLen; /* max. length of alpha identifier */ + UBYTE tmpActRec; /* actual record number */ + UBYTE* pExchData; /* points to exchange data buffer */ + UBYTE dataLen; /* holds length of data */ + + TRACE_FUNCTION ("cmhSIM_CnfMsisdn()"); + + pSIMCmdPrm = &cmhPrm[simEntStat.entOwn].simCmdPrm; + cmdBuf = simEntStat.curCmd; + ownBuf = simEntStat.entOwn; + pExchData = simShrdPrm.atb[table_id].exchData; + dataLen = simShrdPrm.atb[table_id].dataLen; + + + switch ( simShrdPrm.atb[table_id].errCode ) + { + case ( SIM_NO_ERROR ): + { + /* + *------------------------------------------------------------- + * check basic consistency of read data + *------------------------------------------------------------- + */ + if ( pExchData EQ NULL OR + dataLen < ACI_MIN_SIZE_EF_MSISDN ) + { + simEntStat.curCmd = AT_CMD_NONE; + simEntStat.entOwn = simShrdPrm.owner = OWN_NONE; + + R_AT( RAT_CME, ownBuf ) ( cmdBuf, CME_ERR_Unknown ); + } + else + { + ptr = pExchData; + alphaLen = dataLen - ACI_MIN_SIZE_EF_MSISDN; + + /* + *----------------------------------------------------------- + * process parameter <lenEfMsisdn> + *----------------------------------------------------------- + */ + CNUMLenEfMsisdn = dataLen; + + /* + *----------------------------------------------------------- + * process parameter <cnumMaxRec> + *----------------------------------------------------------- + */ + if ( pSIMCmdPrm -> CNUMActRec EQ 1 ) + CNUMMaxRec = simShrdPrm.atb[table_id].recMax; + + /* + *----------------------------------------------------------- + * process parameter <alpha> + *----------------------------------------------------------- + */ + cmhPHB_getTagNt ( ptr, + alphaLen, + CNUMMsisdn[CNUMMsisdnIdx].alpha, + MAX_ALPHA_LEN ); + + ptr += alphaLen; + + /* + *----------------------------------------------------------- + * process parameter <number> + *----------------------------------------------------------- + */ + cmhPHB_getAdrStr ( CNUMMsisdn[CNUMMsisdnIdx].number, + MAX_PHB_NUM_LEN - 1, + ptr + 2, + *ptr ); + + /* + *----------------------------------------------------------- + * validate entry of MSISDN list + *----------------------------------------------------------- + */ + /* VO patch 14.03.01 + * move validate entry to after decoding alpha and number + * and set the vldFlag only when the alpha or the number exists. */ + if ( strlen(CNUMMsisdn[CNUMMsisdnIdx].number) OR + strlen(CNUMMsisdn[CNUMMsisdnIdx].alpha) ) + { + CNUMMsisdn[CNUMMsisdnIdx].vldFlag = TRUE; + pSIMCmdPrm -> CNUMOutput++; + } + + /* + *----------------------------------------------------------- + * process parameter <type> + *----------------------------------------------------------- + */ + cmhPHB_toaDmrg ( *( ptr + 1 ), + &CNUMMsisdn[CNUMMsisdnIdx].type ); + + ptr += 12; + + /* + *----------------------------------------------------------- + * invalidate parameter <speed>, <service>, <itc> + *----------------------------------------------------------- + */ + CNUMMsisdn[CNUMMsisdnIdx].speed = BS_SPEED_NotPresent; + CNUMMsisdn[CNUMMsisdnIdx].service = CNUM_SERV_NotPresent; + CNUMMsisdn[CNUMMsisdnIdx].itc = CNUM_ITC_NotPresent; + + if ( *ptr NEQ 0xFF ) + { + /* + *--------------------------------------------------------- + * bearer capability EF present + *--------------------------------------------------------- + */ + if ( cmhSIM_ReqCcp ( ownBuf, *ptr++ ) NEQ AT_EXCT ) + { + simEntStat.curCmd = AT_CMD_NONE; + simEntStat.entOwn = simShrdPrm.owner = OWN_NONE; + + R_AT( RAT_CME, ownBuf ) ( cmdBuf, CME_ERR_Unknown ); + } + } + else + { + /* + *--------------------------------------------------------- + * tmpActRec is used to prevent conflicts with global + * variable pSIMCmdPrm -> CNUMActRec + *--------------------------------------------------------- + */ + tmpActRec = pSIMCmdPrm -> CNUMActRec; + + /* + *--------------------------------------------------------- + * bearer capability EF abscent + *--------------------------------------------------------- + */ + /* VO patch 14.03.01 - check vldFlag when it isn't TRUE decrease CNUMMsisdnIdx. + * read the next entry and write the entry in the CNUMMsisdnIdx again */ + if ( CNUMMsisdn[CNUMMsisdnIdx].vldFlag EQ FALSE ) + CNUMMsisdnIdx--; + + if ( CNUMMsisdnIdx EQ MAX_MSISDN - 1 OR + tmpActRec EQ CNUMMaxRec ) + { + simEntStat.curCmd = AT_CMD_NONE; + simEntStat.entOwn = simShrdPrm.owner = OWN_NONE; + + R_AT( RAT_CNUM, ownBuf ) ( &CNUMMsisdn[0], CNUMMaxRec ); + + if ( tmpActRec EQ CNUMMaxRec ) + { + if (pSIMCmdPrm -> CNUMOutput) + { + R_AT( RAT_OK, ownBuf ) ( cmdBuf ); + } + else + { + R_AT( RAT_CME, ownBuf ) ( cmdBuf, CME_ERR_NotFound ); + } + } + } + else + { + CNUMMsisdnIdx++; + pSIMCmdPrm -> CNUMActRec++; + + if ( cmhSIM_ReqMsisdn + ( ownBuf, pSIMCmdPrm -> CNUMActRec ) NEQ AT_EXCT ) + { + simEntStat.curCmd = AT_CMD_NONE; + simEntStat.entOwn = simShrdPrm.owner = OWN_NONE; + + R_AT( RAT_CME, ownBuf ) ( cmdBuf, CME_ERR_Unknown ); + } + } + } + } + + break; + } + + default: + { + simEntStat.curCmd = AT_CMD_NONE; + simEntStat.entOwn = simShrdPrm.owner = OWN_NONE; + + R_AT( RAT_CME, ownBuf ) + ( + cmdBuf, + cmhSIM_GetCmeFromSim ( simShrdPrm.atb[table_id].errCode ) + ); + break; + } + + } + + simShrdPrm.atb[table_id].ntryUsdFlg = FALSE; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : CMH_SIMR | +| STATE : code ROUTINE : cmhSIM_CnfCcp | ++--------------------------------------------------------------------+ + + PURPOSE : This function handles the confirmation of reading + EF CCP from SIM. +*/ +GLOBAL void cmhSIM_CnfCcp ( SHORT table_id ) +{ + T_SIM_CMD_PRM* pSIMCmdPrm; /* points to SIM command parameters */ + T_ACI_AT_CMD cmdBuf; /* buffers current command */ + T_ACI_CMD_SRC ownBuf; /* buffers current owner */ + + T_U_CALL_CONF* callCnf; /* call confirm message */ + T_bearer_cap* bearCap; /* bearer capability */ + UBYTE tmpActRec; /* actual record number */ + UBYTE* pExchData; /* points to exchange data buffer */ + UBYTE dataLen; /* holds length of data */ + + TRACE_FUNCTION ("cmhSIM_CnfCcp()"); + + pSIMCmdPrm = &cmhPrm[simEntStat.entOwn].simCmdPrm; + cmdBuf = simEntStat.curCmd; + ownBuf = simEntStat.entOwn; + dataLen = simShrdPrm.atb[table_id].dataLen; + pExchData = simShrdPrm.atb[table_id].exchData; + + switch ( simShrdPrm.atb[table_id].errCode ) + { + case ( SIM_NO_ERROR ): + { + /* + *------------------------------------------------------------- + * check basic consistency of read data + *------------------------------------------------------------- + */ + if ( pExchData EQ NULL OR + dataLen NEQ ACI_SIZE_EF_CCP ) + { + simEntStat.curCmd = AT_CMD_NONE; + simEntStat.entOwn = simShrdPrm.owner = OWN_NONE; + + R_AT( RAT_CME, ownBuf ) ( cmdBuf, CME_ERR_Unknown ); + } + else + { + /* + *----------------------------------------------------------- + * extracting the relevant data from bearer capability IE + *----------------------------------------------------------- + */ + UBYTE bearCapLen = pExchData[0]; + + if (bearCapLen <= 13 ) /* do not decode empty or invalid entries, + see 11.11/10.5.4.1 max 14 bytes */ + { + PALLOC_MSG ( msg, MMCC_DATA_REQ, U_CALL_CONF); + + msg -> sdu.l_buf = bearCapLen * 0x08; + msg -> sdu.o_buf = 0x08; + msg -> sdu.buf[0] = 0x83; + msg -> sdu.buf[1] = U_CALL_CONF; + + memcpy ( &msg -> sdu.buf[2], + pExchData, + bearCapLen + 1 ); + + /* + *----------------------------------------------------------- + * use of CCD for decoding of bearer capability + *----------------------------------------------------------- + */ + CCD_START; + + memset (_decodedMsg, 0, sizeof (_decodedMsg)); + + if ( ccd_decodeMsg ( CCDENT_CC, + UPLINK, + (T_MSGBUF *) &msg->sdu, + (UBYTE *) _decodedMsg, + NOT_PRESENT_8BIT) EQ ccdOK + AND + + _decodedMsg[0] EQ U_CALL_CONF ) + { + callCnf = ( T_U_CALL_CONF * )&_decodedMsg[0]; + + if ( callCnf -> v_bearer_cap ) + { + bearCap = &callCnf -> bearer_cap; + + /* + *------------------------------------------------------- + * process parameter <speed> of MSISDN + *------------------------------------------------------- + */ + if ( bearCap -> v_user_rate ) + { + CNUMMsisdn[CNUMMsisdnIdx].speed = + cmhSIM_GetUserRate ( bearCap -> user_rate ); + } + + /* + *------------------------------------------------------- + * process parameter <itc> and <service> of MSISDN + *------------------------------------------------------- + */ + if ( bearCap -> v_trans_cap ) + { + CNUMMsisdn[CNUMMsisdnIdx].itc = + cmhSIM_GetItc ( bearCap -> trans_cap ); + } + + if ( bearCap -> v_user_inf_l2_prot AND + bearCap -> user_inf_l2_prot EQ L2_X25 AND + bearCap -> v_sync_async AND + bearCap -> sync_async EQ SYNCHRONOUS ) + { + CNUMMsisdn[CNUMMsisdnIdx].service = + CNUM_SERV_PacketSynch; + } + else if + ( bearCap -> v_sig_access_prot + AND + ( bearCap -> sig_access_prot EQ SIAP_X28_INDIV_NUI OR + bearCap -> sig_access_prot EQ SIAP_X28_UNIV_NUI OR + bearCap -> sig_access_prot EQ SIAP_X28_NON_DEDIC + ) + AND + bearCap -> v_sync_async + AND + bearCap -> sync_async EQ ASYNCHRONOUS + ) + { + CNUMMsisdn[CNUMMsisdnIdx].service = + CNUM_SERV_PadAsynch; + } + else if ( bearCap -> v_sync_async ) + { + CNUMMsisdn[CNUMMsisdnIdx].service = + cmhSIM_GetSrvFromSync ( bearCap -> sync_async ); + + } + else if ( bearCap -> v_trans_cap ) + { + CNUMMsisdn[CNUMMsisdnIdx].service = + cmhSIM_GetSrvFromItc ( bearCap -> trans_cap ); + } + } + } + CCD_END; + + PFREE ( msg ); + } + + /* + *----------------------------------------------------------- + * tmpActRec is used to prevent conflicts with global + * variable pSIMCmdPrm -> CNUMActRec + *----------------------------------------------------------- + */ + tmpActRec = pSIMCmdPrm -> CNUMActRec; + + if ( CNUMMsisdnIdx EQ MAX_MSISDN - 1 OR + tmpActRec EQ CNUMMaxRec ) + { + simEntStat.curCmd = AT_CMD_NONE; + simEntStat.entOwn = simShrdPrm.owner = OWN_NONE; + + R_AT( RAT_CNUM, ownBuf ) ( &CNUMMsisdn[0], CNUMMaxRec ); + + if ( tmpActRec EQ CNUMMaxRec ) + { + if (pSIMCmdPrm -> CNUMOutput) + { + R_AT( RAT_OK, ownBuf ) ( cmdBuf ); + } + else + { + R_AT( RAT_CME, ownBuf ) ( cmdBuf, CME_ERR_NotFound ); + } + } + } + else + { + CNUMMsisdnIdx++; + pSIMCmdPrm -> CNUMActRec++; + + if ( cmhSIM_ReqMsisdn + ( ownBuf, pSIMCmdPrm -> CNUMActRec ) NEQ AT_EXCT ) + { + simEntStat.curCmd = AT_CMD_NONE; + simEntStat.entOwn = simShrdPrm.owner = OWN_NONE; + + R_AT( RAT_CME, ownBuf ) ( cmdBuf, CME_ERR_Unknown ); + } + } + } + + break; + } + + default: + { + simEntStat.curCmd = AT_CMD_NONE; + simEntStat.entOwn = simShrdPrm.owner = OWN_NONE; + + R_AT( RAT_CME, ownBuf ) + ( + cmdBuf, + cmhSIM_GetCmeFromSim ( simShrdPrm.atb[table_id].errCode ) + ); + break; + } + + } + + simShrdPrm.atb[table_id].ntryUsdFlg = FALSE; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : CMH_SIMR | +| STATE : code ROUTINE : cmhSIM_RdCnfPlmnSel| ++--------------------------------------------------------------------+ + + PURPOSE : This function handles the confirmation of reading + EF PLMN SEL from SIM. +*/ +GLOBAL void cmhSIM_RdCnfPlmnSel ( SHORT table_id ) +{ + T_SIM_CMD_PRM * pSIMCmdPrm; /* points to SIM command parameters */ + T_ACI_AT_CMD cmdBuf; /* buffers current command */ + T_ACI_CMD_SRC ownBuf; /* buffers current owner */ + T_ACI_CPOL_LST CPOLPlmnSelLst; /* PLMN SEL list */ + T_ACI_RETURN ret; + SHORT lastIdx; /* holds last index */ + SHORT usdNtry; /* holds number of used entries */ + + TRACE_FUNCTION ("cmhSIM_RdCnfPlmnSel()"); + + pSIMCmdPrm = &cmhPrm[simEntStat.entOwn].simCmdPrm; + cmdBuf = simEntStat.curCmd; + ownBuf = simEntStat.entOwn; + + + switch ( simShrdPrm.atb[table_id].errCode ) + { + case ( SIM_NO_ERROR ): + { + /* + *------------------------------------------------------------- + * check basic consistency of read data + *------------------------------------------------------------- + */ + if ( simShrdPrm.atb[table_id].exchData EQ NULL OR + simShrdPrm.atb[table_id].dataLen < ACI_MIN_SIZE_EF_PLMN_SEL) + { + pSIMCmdPrm->CPOLact = CPOL_ACT_None; + simEntStat.curCmd = AT_CMD_NONE; + simEntStat.entOwn = simShrdPrm.owner = OWN_NONE; + + R_AT( RAT_CME, ownBuf ) ( cmdBuf, CME_ERR_Unknown ); + break; + } + + EfPLMNselStat = EF_STAT_READ; + CPOLSimEfDataLen = simShrdPrm.atb[table_id].dataLen; + + if( pSIMCmdPrm->CPOLmode EQ CPOL_MOD_CompactList ) + { + cmhSIM_CmpctPlmnSel( simShrdPrm.atb[table_id].dataLen, + simShrdPrm.atb[table_id].exchData ); + } + + /* + *----------------------------------------------------------- + * what is to do ? + *----------------------------------------------------------- + */ + switch( pSIMCmdPrm->CPOLact ) + { + /* + *----------------------------------------------------------- + * read out PLMN SEL list + *----------------------------------------------------------- + */ + case( CPOL_ACT_Read ): + + /* fill in buffer */ + lastIdx = cmhSIM_FillPlmnSelList(pSIMCmdPrm->CPOLidx, + pSIMCmdPrm->CPOLfrmt, + &CPOLPlmnSelLst[0], + simShrdPrm.atb[table_id].dataLen, + (UBYTE *)simShrdPrm.atb[table_id].exchData); + /* notify about PLMN SEL list */ + simEntStat.curCmd = AT_CMD_NONE; + simEntStat.entOwn = simShrdPrm.owner = OWN_NONE; + + R_AT( RAT_CPOL, ownBuf ) ( ACI_NumParmNotPresent, + lastIdx, + &CPOLPlmnSelLst[0], + ACI_NumParmNotPresent ); + + R_AT( RAT_OK, ownBuf )( AT_CMD_CPOL ); + break; + + /* + *----------------------------------------------------------- + * write PLMN SEL list + *----------------------------------------------------------- + */ + case( CPOL_ACT_Write ): + + if( pSIMCmdPrm->CPOLidx EQ NOT_PRESENT_8BIT ) + + ret = cmhSIM_FndEmptyPlmnSel( simEntStat.entOwn, + pSIMCmdPrm->CPOLplmn ); + else + + ret = cmhSIM_UpdPlmnSel( simEntStat.entOwn, + pSIMCmdPrm->CPOLidx, + pSIMCmdPrm->CPOLplmn, + pSIMCmdPrm->CPOLmode); + if( ret EQ AT_FAIL ) + { + pSIMCmdPrm->CPOLact = CPOL_ACT_None; + simEntStat.curCmd = AT_CMD_NONE; + simEntStat.entOwn = simShrdPrm.owner = OWN_NONE; + + R_AT( RAT_CME, simEntStat.entOwn ) + ( + AT_CMD_CPOL, + ACI_ERR_DESC_NR( aciErrDesc ) + ); + } + break; + + /* + *----------------------------------------------------------- + * delete PLMN SEL entry + *----------------------------------------------------------- + */ + case( CPOL_ACT_Delete ): + + if( pSIMCmdPrm->CPOLidx2 EQ NOT_PRESENT_8BIT ) + + ret = cmhSIM_DelPlmnSel( simEntStat.entOwn, + pSIMCmdPrm->CPOLidx, + pSIMCmdPrm->CPOLmode ); + else + + ret = cmhSIM_ChgPlmnSel( simEntStat.entOwn, + pSIMCmdPrm->CPOLidx, + pSIMCmdPrm->CPOLidx2 ); + + if( ret EQ AT_FAIL ) + { + pSIMCmdPrm->CPOLact = CPOL_ACT_None; + simEntStat.curCmd = AT_CMD_NONE; + simEntStat.entOwn = simShrdPrm.owner = OWN_NONE; + + R_AT( RAT_CME, simEntStat.entOwn ) + ( + AT_CMD_CPOL, + ACI_ERR_DESC_NR( aciErrDesc ) + ); + } + break; + + /* + *----------------------------------------------------------- + * test PLMN SEL entry number + *----------------------------------------------------------- + */ + case( CPOL_ACT_Test ): + + /* notify about PLMN SEL entry number */ + simEntStat.curCmd = AT_CMD_NONE; + simEntStat.entOwn = simShrdPrm.owner = OWN_NONE; + + lastIdx = CPOLSimEfDataLen / ACI_LEN_PLMN_SEL_NTRY; + usdNtry = cmhSIM_UsdPlmnSelNtry( CPOLSimEfDataLen, + (UBYTE *)simShrdPrm.atb[table_id].exchData ); + + R_AT( RAT_CPOL, ownBuf ) ( ACI_NumParmNotPresent, + lastIdx, + NULL, + usdNtry ); + + R_AT( RAT_OK, ownBuf )( AT_CMD_CPOL ); + break; + } + break; + } + + case ( SIM_CAUSE_UNKN_FILE_ID ): + EfPLMNselStat = EF_STAT_NOT_AVAIL; + /*lint -fallthrough*/ + /*lint -fallthrough*/ + default: + { + pSIMCmdPrm->CPOLact = CPOL_ACT_None; + simEntStat.curCmd = AT_CMD_NONE; + simEntStat.entOwn = simShrdPrm.owner = OWN_NONE; + + R_AT( RAT_CME, ownBuf ) + ( + cmdBuf, + cmhSIM_GetCmeFromSim ( simShrdPrm.atb[table_id].errCode ) + ); + break; + } + + } + + simShrdPrm.atb[table_id].ntryUsdFlg = FALSE; + +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : CMH_SIMR | +| STATE : code ROUTINE : cmhSIM_WrCnfPlmnSel| ++--------------------------------------------------------------------+ + + PURPOSE : This function handles the confirmation of writing + EF PLMN SEL to SIM. +*/ +GLOBAL void cmhSIM_WrCnfPlmnSel ( SHORT table_id ) +{ + T_SIM_CMD_PRM * pSIMCmdPrm; /* points to SIM command parameters */ + UBYTE ownBuf; + + TRACE_FUNCTION ("cmhSIM_WrCnfPlmnSel()"); + + pSIMCmdPrm = &cmhPrm[simEntStat.entOwn].simCmdPrm; + ownBuf = simEntStat.entOwn; + + switch ( simShrdPrm.atb[table_id].errCode ) + { + /* successful PLMN SEL list update */ + case ( SIM_NO_ERROR ): + { + pSIMCmdPrm->CPOLact = CPOL_ACT_None; + simEntStat.curCmd = AT_CMD_NONE; + simEntStat.entOwn = simShrdPrm.owner = OWN_NONE; + + R_AT( RAT_OK, ownBuf )( AT_CMD_CPOL ); + break; + } + case SIM_CAUSE_ACCESS_PROHIBIT: + { + pSIMCmdPrm->CPOLact = CPOL_ACT_None; + simEntStat.curCmd = AT_CMD_NONE; + simEntStat.entOwn = simShrdPrm.owner = OWN_NONE; + + R_AT( RAT_CME, ownBuf /*simEntStat.entOwn*/ ) + ( + AT_CMD_CPOL, + CME_ERR_OpNotAllow + ); + break; + } + + /* unsuccessful PLMN SEL list update */ + default: + { + pSIMCmdPrm->CPOLact = CPOL_ACT_None; + simEntStat.curCmd = AT_CMD_NONE; + simEntStat.entOwn = simShrdPrm.owner = OWN_NONE; + + R_AT( RAT_CME, ownBuf /*simEntStat.entOwn*/ ) + ( + AT_CMD_CPOL, + cmhSIM_GetCmeFromSim ( simShrdPrm.atb[table_id].errCode ) + ); + break; + } + } + + simShrdPrm.atb[table_id].ntryUsdFlg = FALSE; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : CMH_SIMR | +| STATE : code ROUTINE : cmhSIM_RdCnfLangELP| ++--------------------------------------------------------------------+ + + PURPOSE : This function handles the confirmation of reading + from the SIM (EF ELP). +*/ +GLOBAL void cmhSIM_RdCnfLangELP ( SHORT table_id ) +{ + T_SIM_CMD_PRM *pSIMCmdPrm; /* points to SIM command parameters */ + T_PHB_CMD_PRM *pPHBCmdPrm; /* points to PHB command parameter */ + + T_ACI_AT_CMD cmdBuf; /* buffers current command */ + T_ACI_CMD_SRC ownBuf; /* buffers current owner */ + CHAR Clang_buffer[3]={0};/* Current language */ + T_ACI_LAN_SUP clng; + CHAR *ef = EF_CLNG_ID; + EF_CLNG lng; + BOOL Suplng = FALSE; + T_ACI_LAN_SUP LngPCMsupLst[MAX_LAN]; + SHORT lastIdx; + T_ACI_RETURN ret ; + + TRACE_FUNCTION ("cmhSIM_RdCnfLangELP()"); + + pSIMCmdPrm = &cmhPrm[simEntStat.entOwn].simCmdPrm; + cmdBuf = simEntStat.curCmd; + ownBuf = simEntStat.entOwn; + pPHBCmdPrm = &cmhPrm[ownBuf].phbCmdPrm; + simShrdPrm.atb[table_id].ntryUsdFlg = FALSE; + simEntStat.curCmd = AT_CMD_NONE; + + clng.str = Clang_buffer; + + switch ( simShrdPrm.atb[table_id].errCode ) + { + case ( SIM_NO_ERROR ): + /* + *------------------------------------------------------------- + * check basic consistency of read data + *------------------------------------------------------------- + */ + if ( simShrdPrm.atb[table_id].exchData EQ NULL OR + simShrdPrm.atb[table_id].dataLen < ACI_MIN_SIZE_EF_LAN) + + { + pSIMCmdPrm->CLANact = CLAN_ACT_None; + simEntStat.entOwn = simShrdPrm.owner = OWN_NONE; + + R_AT( RAT_CME, ownBuf ) ( cmdBuf, CME_ERR_Unknown ); + return; + } + + memcpy(clng.str, (UBYTE *)simShrdPrm.atb[table_id].exchData, CLAN_CODE_LEN); + ret=getSupLangFromPCM(&LngPCMsupLst[0], &lastIdx); + if (ret EQ AT_FAIL) + { + return; + } + Suplng=checkSuppLang(&LngPCMsupLst[0],lastIdx, &clng); + + simEntStat.entOwn = simShrdPrm.owner = OWN_NONE; + + /* + *--------------------------------------------------------------------- + * check if the language,which was read from EF ELP is supported in PCM + *--------------------------------------------------------------------- + */ + if(Suplng) + { + switch( pSIMCmdPrm->CLANact ) + { + case( CLAN_ACT_Read ): + R_AT( RAT_CLAN, ownBuf ) (&clng); + R_AT( RAT_OK, ownBuf )( AT_CMD_CLAN ); + break; + case( CLAN_ACT_Write ): + memcpy(lng.data,clng.str ,CLAN_CODE_LEN); + pcm_WriteFile (( UBYTE* )ef,SIZE_EF_CLNG,( UBYTE*) &lng); + + if (pPHBCmdPrm->CLAEmode EQ CLAE_MOD_Enable) + R_AT( RAT_CLAE, ownBuf ) (&clng); + + R_AT( RAT_OK, ownBuf )( AT_CMD_CLAN ); + break; + } + } + else + /* + *------------------------------------------------------------- + * read the EF LP if the language is not supported in PCM + *------------------------------------------------------------- + */ + cmhSIM_ReqLanguageLP (ownBuf ); + break; + + /* + *------------------------------------------------------------- + * read the EF LP if the EF ELP not available + *------------------------------------------------------------- + */ + case ( SIM_CAUSE_UNKN_FILE_ID ): + cmhSIM_ReqLanguageLP (ownBuf ); + break; + + default: + pSIMCmdPrm->CLANact = CLAN_ACT_None; + simEntStat.entOwn = simShrdPrm.owner = OWN_NONE; + + R_AT( RAT_CME, ownBuf) ( AT_CMD_CLAN, CME_ERR_Unknown ); + break; + + } + +} + + +/* ++------------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : CMH_SIMR | +| STATE : code ROUTINE : cmhSIM_RdCnfLangPrfELP | ++------------------------------------------------------------------------+ + + PURPOSE : This function handles the confirmation of reading + from the SIM (EF ELP) for SAT feature LS. +*/ +GLOBAL void cmhSIM_RdCnfLangPrfELP ( SHORT table_id ) +{ + + T_ACI_SAT_TERM_RESP resp_data; + CHAR Clang_buffer[3]={0};/* Current language */ + T_ACI_LAN_SUP clng; + BOOL Suplng = FALSE; + T_ACI_LAN_SUP LngPCMsupLst[MAX_LAN]; + SHORT lastIdx; + T_ACI_RETURN ret ; + + + TRACE_FUNCTION ("cmhSIM_RdCnfLangPrfELP()"); + + psaSAT_InitTrmResp( &resp_data ); + + simShrdPrm.atb[table_id].ntryUsdFlg = FALSE; + + clng.str = Clang_buffer; + + switch ( simShrdPrm.atb[table_id].errCode ) + { + case ( SIM_NO_ERROR ): + /* + *------------------------------------------------------------- + * check basic consistency of read data + *------------------------------------------------------------- + */ + if ( simShrdPrm.atb[table_id].exchData EQ NULL OR + simShrdPrm.atb[table_id].dataLen < ACI_MIN_SIZE_EF_LAN) + + { + psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data ); + return; + } + + memcpy(clng.str, (UBYTE *)simShrdPrm.atb[table_id].exchData, CLAN_CODE_LEN); + ret=getSupLangFromPCM(&LngPCMsupLst[0], &lastIdx); + if (ret EQ AT_FAIL) + { + psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data ); + return; + } + + Suplng=checkSuppLang(&LngPCMsupLst[0],lastIdx, &clng); + + + /* + *--------------------------------------------------------------------- + * check if the language,which was read from EF ELP is supported in PCM + *--------------------------------------------------------------------- + */ + if(Suplng) + { + /* Send Terminal resp*/ + memcpy(&resp_data.lang, (UBYTE *)simShrdPrm.atb[table_id].exchData, CLAN_CODE_LEN); + +#ifdef _SIMULATION_ + memset(resp_data.lang, 0xA0, 2); +#endif + + psaSAT_SendTrmResp( RSLT_PERF_SUCCESS, &resp_data ); + + } + else + { + /* + *------------------------------------------------------------- + * read the EF LP if the language is not supported in PCM + *------------------------------------------------------------- + */ + if (cmhSIM_ReqLanguagePrfLP () EQ FALSE) + { + psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data ); + } + } + break; + + /* + *------------------------------------------------------------- + * read the EF LP if the EF ELP not available + *------------------------------------------------------------- + */ + case ( SIM_CAUSE_UNKN_FILE_ID ): + if (cmhSIM_ReqLanguagePrfLP () EQ FALSE) + { + psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data ); + } + break; + + default: + psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data ); + break; + + } +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : CMH_SIMR | +| STATE : code ROUTINE : cmhSIM_RdCnfLangLP | ++--------------------------------------------------------------------+ + + PURPOSE : This function handles the confirmation of reading + EF LP from SIM. +*/ +GLOBAL void cmhSIM_RdCnfLangLP ( SHORT table_id ) +{ + T_SIM_CMD_PRM * pSIMCmdPrm; /* points to SIM command parameters */ + T_PHB_CMD_PRM * pPHBCmdPrm; /* points to PHB command parameter */ + T_ACI_AT_CMD cmdBuf; /* buffers current command */ + T_ACI_CMD_SRC ownBuf; /* buffers current owner */ + T_ACI_LAN_SUP clng; + CHAR* ef = EF_CLNG_ID; + EF_CLNG lng; + BOOL Suplng= FALSE; + SHORT lastIdx; + T_ACI_LAN_SUP LngPCMsupLst[MAX_LAN]; + + + TRACE_FUNCTION ("cmhSIM_RdCnfLangLP()"); + + pSIMCmdPrm = &cmhPrm[simEntStat.entOwn].simCmdPrm; + cmdBuf = simEntStat.curCmd; + ownBuf = simEntStat.entOwn; + pPHBCmdPrm = &cmhPrm[ownBuf].phbCmdPrm; + simShrdPrm.atb[table_id].ntryUsdFlg = FALSE; + simEntStat.curCmd = AT_CMD_NONE; + + clng.lng=(UBYTE )simShrdPrm.atb[table_id].exchData[0]; + + getSupLangFromPCM(&LngPCMsupLst[0], &lastIdx); + Suplng=checkSuppLangInLP(&LngPCMsupLst[0],lastIdx, &clng); + + if ( simShrdPrm.atb[table_id].errCode EQ SIM_NO_ERROR AND + Suplng ) + { + + simEntStat.entOwn = simShrdPrm.owner = OWN_NONE; + /* + *------------------------------------------------------------- + * check basic consistency of read data + *------------------------------------------------------------- + */ + if ( simShrdPrm.atb[table_id].exchData EQ NULL OR + simShrdPrm.atb[table_id].dataLen < ACI_LEN_LAN_LP_NTRY) + + { + simEntStat.entOwn = simShrdPrm.owner = OWN_NONE; + pSIMCmdPrm->CLANact = CLAN_ACT_None; + R_AT( RAT_CME, ownBuf ) ( cmdBuf, CME_ERR_Unknown ); + return; + } + +#ifdef SIM_TOOLKIT + if (simShrdPrm.fuRef >= 0) + { + psaSAT_FUConfirm (simShrdPrm.fuRef, SIM_FU_SUCCESS); + } +#endif + + /* + *----------------------------------------------------- + * read the supported laguage or write it PCM + *----------------------------------------------------- + */ + switch( pSIMCmdPrm->CLANact ) + { + case( CLAN_ACT_Read ): + R_AT( RAT_CLAN, ownBuf ) (&clng); + R_AT( RAT_OK, ownBuf )( AT_CMD_CLAN ); + break; + case( CLAN_ACT_Write ): + memcpy(lng.data,(UBYTE *) clng.str,CLAN_CODE_LEN); + pcm_WriteFile (( UBYTE* )ef,SIZE_EF_CLNG,( UBYTE*) &lng); + if (pPHBCmdPrm->CLAEmode EQ CLAE_MOD_Enable) + { R_AT( RAT_CLAE, ownBuf ) (&clng);} + + R_AT( RAT_OK, ownBuf )( AT_CMD_CLAN ); + break; + + } + } + else + { + +#ifdef SIM_TOOLKIT + if (simShrdPrm.fuRef >= 0) + { + psaSAT_FUConfirm (simShrdPrm.fuRef, SIM_FU_ERROR); + } +#endif + /* + *--------------------------------------------------------------- + * Preferred language is not supported in MS + *--------------------------------------------------------------- + */ + if ( simShrdPrm.atb[table_id].errCode EQ SIM_CAUSE_UNKN_FILE_ID OR + !Suplng ) + { + TRACE_FUNCTION ("preferred language not supported"); + + switch( pSIMCmdPrm->CLANact ) + { + case( CLAN_ACT_Read ): + R_AT( RAT_CLAN, ownBuf ) (&LngPCMsupLst[0]); + R_AT( RAT_OK, ownBuf )( AT_CMD_CLAN ); + break; + case( CLAN_ACT_Write ): /* Preferred Language not supported,so not change CLAN */ + R_AT( RAT_OK, ownBuf )( AT_CMD_CLAN ); + break; + } + } + else + { + pSIMCmdPrm->CLANact = CLAN_ACT_None; + simEntStat.entOwn = simShrdPrm.owner = OWN_NONE; + R_AT( RAT_CME, ownBuf) ( AT_CMD_CLAN, CME_ERR_Unknown ); + } + } +} + + +/* ++-----------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : CMH_SIMR | +| STATE : code ROUTINE : cmhSIM_RdCnfLangPrfLP | ++-----------------------------------------------------------------------+ + + PURPOSE : This function handles the confirmation of reading + EF LP from SIM for SAT feature LS. +*/ +GLOBAL void cmhSIM_RdCnfLangPrfLP ( SHORT table_id ) +{ + + T_ACI_SAT_TERM_RESP resp_data; + T_ACI_LAN_SUP clng; + BOOL Suplng= FALSE; + SHORT lastIdx; + T_ACI_LAN_SUP lngPCMsupLst[MAX_LAN]; + T_ACI_RETURN ret; + + TRACE_FUNCTION ("cmhSIM_RdCnfLangPrfLP()"); + + psaSAT_InitTrmResp( &resp_data ); + + simShrdPrm.atb[table_id].ntryUsdFlg = FALSE; + + clng.lng=(UBYTE )simShrdPrm.atb[table_id].exchData[0]; + ret = getSupLangFromPCM(&lngPCMsupLst[0], &lastIdx); + if(ret EQ AT_FAIL) + { + psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data ); + return; + } + + Suplng=checkSuppLangInLP(&lngPCMsupLst[0],lastIdx, &clng); + + if ( simShrdPrm.atb[table_id].errCode EQ SIM_NO_ERROR AND + Suplng ) + { + + + /* + *------------------------------------------------------------- + * check basic consistency of read data + *------------------------------------------------------------- + */ + if ( simShrdPrm.atb[table_id].exchData EQ NULL OR + simShrdPrm.atb[table_id].dataLen < ACI_LEN_LAN_LP_NTRY) + + { + psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data ); + return; + } + + +#ifdef SIM_TOOLKIT + if (simShrdPrm.fuRef >= 0) + { + psaSAT_FUConfirm (simShrdPrm.fuRef, SIM_FU_SUCCESS); + } +#endif + + /* + *----------------------------------------------------- + * Send the Terminal Response + *----------------------------------------------------- + */ + memcpy(&resp_data.lang, (UBYTE* )simShrdPrm.atb[table_id].exchData, CLAN_CODE_LEN); +#ifdef _SIMULATION_ + memset(resp_data.lang, 0xA0, 2); +#endif + psaSAT_SendTrmResp( RSLT_PERF_SUCCESS, &resp_data ); + } + else + { + +#ifdef SIM_TOOLKIT + if (simShrdPrm.fuRef >= 0) + { + psaSAT_FUConfirm (simShrdPrm.fuRef, SIM_FU_ERROR); + } +#endif + /* + *--------------------------------------------------------------- + * read default language from ME + *--------------------------------------------------------------- + */ + + if ( simShrdPrm.atb[table_id].errCode EQ SIM_CAUSE_UNKN_FILE_ID OR + !Suplng ) + { + TRACE_FUNCTION ("default language is selected"); + memcpy(&resp_data.lang, &lngPCMsupLst[0].str, CLAN_CODE_LEN); +#ifdef _SIMULATION_ + memset(resp_data.lang, 0xA0, 2); +#endif + psaSAT_SendTrmResp( RSLT_PERF_SUCCESS, &resp_data ); + + } + else + { + psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data ); + } + + } + +} + + +/* ++--------------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : CMH_SIMR | +| STATE : code ROUTINE : SIM_ENT_CSDconnect_dti_cb | ++--------------------------------------------------------------------------+ + + PURPOSE : Callback for connection between SIM and TRA/L2R for CSD. + +*/ +#ifdef FF_SAT_E +#ifdef DTI +GLOBAL BOOL SIM_ENT_CSDconnect_dti_cb(UBYTE dti_id, T_DTI_CONN_STATE result_type) +{ + TRACE_FUNCTION("SIM_ENT_CSDconnect_dti_cb"); + + switch( result_type) + { + case DTI_CONN_STATE_DISCONNECTING: + break; + case DTI_CONN_STATE_DISCONNECTED: + /* wap_state is set to IPA_Deactivated in psaTCPIP_config_dispatch() */ + if (wap_state EQ UDPA_Deactivation) + { + wap_state = IPA_Deactivation; + psaUDPIP_config_dispatch(); + } + dti_cntrl_erase_entry(dti_id); + dti_cntrl_clear_conn_parms(dti_id); + if (simShrdPrm.sat_class_e_dti_id EQ dti_id) + { + simShrdPrm.sat_class_e_dti_id = DTI_DTI_ID_NOTPRESENT; + TRACE_EVENT("sat_class_e_dti_id reset"); + } + break; + case DTI_CONN_STATE_CONNECTING: + break; + case DTI_CONN_STATE_CONNECTED: + /* the SIM-SNDCP connection has been established, now send SIM_BIP_CONFIG + * request to SIM */ + psaSIM_Bip_Config_Req(); + + break; + case DTI_CONN_STATE_ERROR: + /* connection not possible: disconnect UDP, L2R or TRA */ + TRACE_EVENT("SIM_ENT_CSDconnect_dti_cb connection not possible: disconnect UDP,L2R or TRA"); + dti_cntrl_close_dpath_from_dti_id( dti_id ); + break; + case DTI_CONN_STATE_UNKNOWN: + default: + TRACE_EVENT("SIM_ENT_CSDconnect_dti_cb call with not awaited value"); + break; + } + return TRUE; +} +#endif /* DTI */ + +#if defined (GPRS) AND defined (DTI) +/* ++---------------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : CMH_SIMR | +| STATE : code ROUTINE : SIM_SNDCP_connect_dti_cb | ++---------------------------------------------------------------------------+ + + PURPOSE : Callback for connection between SIM and SNDCP. + +*/ +GLOBAL BOOL SIM_SNDCP_connect_dti_cb(UBYTE dti_id, T_DTI_CONN_STATE result_type) +{ + TRACE_FUNCTION("SIM_SNDCP_connect_dti_cb"); + + switch( result_type) + { + case DTI_CONN_STATE_DISCONNECTING: + break; + case DTI_CONN_STATE_DISCONNECTED: + dti_cntrl_erase_entry(dti_id); + if (simShrdPrm.sat_class_e_dti_id EQ dti_id) + { + simShrdPrm.sat_class_e_dti_id = DTI_DTI_ID_NOTPRESENT; + TRACE_EVENT("sat_class_e_dti_id reset"); + } + break; + case DTI_CONN_STATE_CONNECTING: + break; + case DTI_CONN_STATE_CONNECTED: + /* the SIM-SNDCP connection has been established, now send SIM_BIP_CONFIG + * request to SIM */ + psaSIM_Bip_Config_Req(); + break; + case DTI_CONN_STATE_ERROR: + /* connection not possible: disconnect SNDCP */ + dti_cntrl_close_dpath_from_dti_id( dti_id ); + break; + case DTI_CONN_STATE_UNKNOWN: + default: + TRACE_EVENT("SIM_SNDCP_connect_dti_cb call with not awaited value"); + break; + } + return TRUE; +} + + +/* ++--------------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : CMH_SIMR | +| STATE : code ROUTINE : SIM_ENT_GPRSconnect_dti_cb| ++--------------------------------------------------------------------------+ + + PURPOSE : Callback for connection between SIM and UDP/SNDCP for GPRS. + +*/ + +GLOBAL BOOL SIM_ENT_GPRSconnect_dti_cb(UBYTE dti_id, T_DTI_CONN_STATE result_type) +{ + TRACE_FUNCTION("SIM_ENT_GPRSconnect_dti_cb"); + + switch( result_type) + { + case DTI_CONN_STATE_DISCONNECTING: + break; + case DTI_CONN_STATE_DISCONNECTED: + dti_cntrl_erase_entry(dti_id); + if (simShrdPrm.sat_class_e_dti_id EQ dti_id) + { + simShrdPrm.sat_class_e_dti_id = DTI_DTI_ID_NOTPRESENT; + TRACE_EVENT("sat_class_e_dti_id reset"); + } + break; + case DTI_CONN_STATE_CONNECTING: + case DTI_CONN_STATE_CONNECTED: + break; + case DTI_CONN_STATE_ERROR: + /* connection not possible: disconnect UDP or SNDCP */ + TRACE_EVENT("SIM_ENT_GPRSconnect_dti_cb connection not possible: disconnect UDP or SNDCP"); + dti_cntrl_close_dpath_from_dti_id( dti_id ); + break; + case DTI_CONN_STATE_UNKNOWN: + default: + TRACE_EVENT("SIM_ENT_GPRSconnect_dti_cb call with not awaited value"); + break; + } + return TRUE; +} + +#endif /* GPRS */ + +#endif /* FF_SAT_E */ + +#ifdef FF_DUAL_SIM + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_SIMR | +| ROUTINE : cmhSIM_SIMSelected | ++-------------------------------------------------------------------+ + + PURPOSE : Informs the upper layer the result of the SIM Selection process. + +*/ +GLOBAL void cmhSIM_SIMSelected ( void ) +{ + UBYTE cmdBuf; + T_ACI_CME_ERR err; + + TRACE_FUNCTION("cmhSIM_SIMSelected()"); + + switch(simEntStat.curCmd) + { + case(AT_CMD_SIM): + + switch( simShrdPrm.rslt ) + { + case( SIM_NO_ERROR ): + + simEntStat.curCmd = AT_CMD_NONE; + + R_AT( RAT_OK, simEntStat.entOwn ) + ( AT_CMD_SIM ); + cmh_logRslt ( simEntStat.entOwn, RAT_OK, AT_CMD_SIM, -1, -1, -1 ); + return; + + default: + err = cmhSIM_GetCmeFromSim ( simShrdPrm.rslt ); + break; + } + + cmdBuf = simEntStat.curCmd; + simEntStat.curCmd = AT_CMD_NONE; + + R_AT( RAT_CME, simEntStat.entOwn ) + ( cmdBuf, err ); + cmh_logRslt ( simEntStat.entOwn, RAT_CME, cmdBuf, + -1, -1, err ); + break; + } +} +#endif /*FF_DUAL_SIM*/ + +/*==== EOF ========================================================*/ +