FreeCalypso > hg > fc-magnetite
view src/g23m-aci/aci/cmh_simq.c @ 516:1ed9de6c90bd
src/g23m-gsm/sms/sms_for.c: bogus malloc removed
The new error handling code that was not present in TCS211 blob version
contains a malloc call that is bogus for 3 reasons:
1) The memory allocation in question is not needed in the first place;
2) libc malloc is used instead of one of the firmware's proper ways;
3) The memory allocation is made inside a function and then never freed,
i.e., a memory leak.
This bug was caught in gcc-built FreeCalypso fw projects (Citrine
and Selenite) because our gcc environment does not allow any use of
libc malloc (any reference to malloc produces a link failure),
but this code from TCS3.2 is wrong even for Magnetite: if this code
path is executed repeatedly over a long time, the many small allocations
made by this malloc call without a subsequent free will eventually
exhaust the malloc heap provided by the TMS470 environment, malloc will
start returning NULL, and the bogus code will treat it as an error.
Because the memory allocation in question is not needed at all,
the fix entails simply removing it.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 22 Jul 2018 06:04:49 +0000 |
parents | 53929b40109c |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | Project : GSM-PS (6147) | Modul : CMH_SIMQ +----------------------------------------------------------------------------- | 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 provides the query functions related to the | protocol stack adapter for subscriber identity module. +----------------------------------------------------------------------------- */ #ifndef CMH_SIMQ_C #define CMH_SIMQ_C #endif #include "aci_all.h" #include "aci_cmh.h" #ifdef FAX_AND_DATA #include "aci_fd.h" #endif /* of #ifdef FAX_AND_DATA */ #ifdef UART #include "dti.h" #include "dti_conn_mng.h" #endif #include "psa.h" #include "psa_sim.h" #include "cmh.h" #include "cmh_sim.h" #include "cmh_sms.h" /* To include AciSLockShrd */ #include "aci_ext_pers.h" #include "aci_slock.h" #include "aoc.h" /*==== CONSTANTS ==================================================*/ /*==== EXPORT =====================================================*/ /*==== VARIABLES ==================================================*/ #ifdef SIM_PERS #include "general.h" // inluded for UINT8 compilation error in sec_drv.h #include "sec_drv.h" EXTERN T_SEC_DRV_CONFIGURATION *cfg_data; #endif /*==== FUNCTIONS ==================================================*/ #ifdef TI_PS_FF_AT_P_CMD_SECS /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_SIMS | | STATE : code ROUTINE : qAT_PercentSECS | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the %SECS? AT command which is responsible to query the status of the Security Code. */ GLOBAL T_ACI_RETURN qAT_PercentSECS ( T_ACI_CMD_SRC srcId,T_ACI_SECS_STA *status) { T_SIMLOCK_STATUS result = SIMLOCK_FAIL; TRACE_FUNCTION ("qAT_PercentSECS()"); result = aci_ext_personalisation_CS_get_status(); switch (result) { case SIMLOCK_ENABLED: *status = SECS_STA_Enable; return AT_CMPL; case SIMLOCK_DISABLED: *status = SECS_STA_Disable; return AT_CMPL; default: *status = SECS_STA_NotPresent; return AT_FAIL; } } #endif /* TI_PS_FF_AT_P_CMD_SECS */ /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_CCQ | | STATE : code ROUTINE : qAT_PlusCFUN | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the +CFUN? AT command which returns the current setting for phone functionality. <fun>: phone functionality. */ GLOBAL T_ACI_RETURN qAT_PlusCFUN ( T_ACI_CMD_SRC srcId, T_ACI_CFUN_FUN *fun ) { TRACE_FUNCTION ("qAT_PlusCFUN()"); /* *------------------------------------------------------------------- * check command source *------------------------------------------------------------------- */ if(!cmh_IsVldCmdSrc (srcId)) { return( AT_FAIL ); } /* *------------------------------------------------------------------- * fill in parameters *------------------------------------------------------------------- */ *fun = CFUNfun; return( AT_CMPL ); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_CCQ | | STATE : code ROUTINE : qAT_PlusCPIN | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the +CPIN? AT command which returns the current PIN status. <code>: PIN status. */ GLOBAL T_ACI_RETURN qAT_PlusCPIN (T_ACI_CMD_SRC srcId, T_ACI_CPIN_RSLT *code) { T_SIM_SET_PRM * pSIMSetPrm; /* points to SIM parameter set */ #ifdef SIM_PERS T_SIMLOCK_STATUS retSlStatus; /* holds return code */ #endif TRACE_FUNCTION ("qAT_PlusCPIN()"); /* *------------------------------------------------------------------- * check command source *------------------------------------------------------------------- */ if(!cmh_IsVldCmdSrc (srcId)) { return( AT_FAIL ); } pSIMSetPrm = &simShrdPrm.setPrm[srcId]; /* *------------------------------------------------------------------- * check SIM status *------------------------------------------------------------------- */ if( simShrdPrm.SIMStat NEQ SS_OK AND simShrdPrm.SIMStat NEQ SS_BLKD ) { pSIMSetPrm -> actProc = SIM_INITIALISATION; simEntStat.curCmd = AT_CMD_CPIN; simShrdPrm.owner = (T_OWN)srcId; simEntStat.entOwn = srcId; simShrdPrm.PINQuery = 1; if( psaSIM_ActivateSIM() < 0 ) /* activate SIM card */ { TRACE_EVENT( "FATAL RETURN psaSIM in +CPIN" ); ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Internal ); simShrdPrm.PINQuery = 0; return( AT_FAIL ); } return( AT_EXCT ); } #ifdef SIM_PERS /* *------------------------------------------------------------------- * check PIN status *------------------------------------------------------------------- */ if ( simShrdPrm.PINStat EQ PS_RDY) { simEntStat.curCmd = AT_CMD_CPIN; if(!aci_slock_set_CFG()) { ACI_ERR_DESC( ACI_ERR_CLASS_Ext,EXT_ERR_NoMEPD); return( AT_FAIL ); } aci_slock_init(); retSlStatus = SIMLOCK_ENABLED; AciSLockShrd.check_lock = SIMLOCK_CHECK_PERS; AciSLockShrd.cpin_query = SEND_CPIN_REQ_CODE; retSlStatus = aci_slock_checkpersonalisation(AciSLockShrd.current_lock); switch(retSlStatus) { case SIMLOCK_ENABLED : *code = CPIN_RSLT_SimReady; break; case SIMLOCK_BLOCKED : aci_set_cpin_code(AciSLockShrd.current_lock,code); break; case SIMLOCK_WAIT : AciSLockShrd.cpin_query = SEND_CPIN_REQ_CODE_RAT; return (AT_EXCT); } /* OVK Check first if any Personalisations are active */ TRACE_EVENT_P3("qAT_PlusCPIN: Curr Lock = %d, Status = %d %s", AciSLockShrd.current_lock, AciSLockShrd.status[AciSLockShrd.current_lock],"" ); return (AT_CMPL); } else #endif { switch( simShrdPrm.PINStat ) { case( PS_RDY ): *code = CPIN_RSLT_SimReady; break; case( PS_PIN1 ): *code = CPIN_RSLT_SimPinReq; break; case( PS_PUK1 ): *code = CPIN_RSLT_SimPukReq; break; case( PS_PIN2 ): *code = CPIN_RSLT_SimPin2Req; break; case( PS_PUK2 ): *code = CPIN_RSLT_SimPuk2Req; break; default: TRACE_EVENT("UNEXPECTED PIN STATUS"); *code = CPIN_RSLT_NotPresent; ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_DataCorrupt ); return( AT_FAIL ); } } return( AT_CMPL ); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_SSQ | | STATE : code ROUTINE : qAT_PlusCAOC | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the +CAOC AT command which is responsible to query the current call meter value. <ccm> : CCM value. */ GLOBAL T_ACI_RETURN qAT_PlusCAOC ( T_ACI_CMD_SRC srcId, LONG * ccm) { TRACE_FUNCTION ("qAT_PlusCAOC ()"); /* *------------------------------------------------------------------- * request value from advice of charge module. *------------------------------------------------------------------- */ aoc_get_values (AOC_CCM, (void *)ccm); return( AT_CMPL ); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_SSQ | | STATE : code ROUTINE : qAT_PlusCACM | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the +CACM AT command which is responsible to query the accumulated call meter value. <acm> : ACM value. */ GLOBAL T_ACI_RETURN qAT_PlusCACM ( T_ACI_CMD_SRC srcId, LONG * acm) { TRACE_FUNCTION ("qAT_PlusCACM ()"); /* *------------------------------------------------------------------- * request value from advice of charge module. *------------------------------------------------------------------- */ aoc_get_values (AOC_ACM, (ULONG *)acm); return( AT_CMPL ); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_SSQ | | STATE : code ROUTINE : qAT_PlusCAMM | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the +CAMM AT command which is responsible to query the maximum of the accumulated call meter value. <acmmax> : ACMMax value. */ GLOBAL T_ACI_RETURN qAT_PlusCAMM ( T_ACI_CMD_SRC srcId, LONG * acmmax) { TRACE_FUNCTION ("qAT_PlusCAMM ()"); /* *------------------------------------------------------------------- * request value from advice of charge module. *------------------------------------------------------------------- */ aoc_get_values (AOC_ACMMAX, (ULONG *)acmmax); return( AT_CMPL ); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_SSQ | | STATE : code ROUTINE : qAT_PlusCPUC | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the +CPUC AT command which is responsible to query the price per unit and currency. <cuurency> : Currency <ppu> : Price per Unit */ GLOBAL T_ACI_RETURN qAT_PlusCPUC ( T_ACI_CMD_SRC srcId, CHAR *currency, CHAR *ppu) { T_puct puct; TRACE_FUNCTION ("qAT_PlusCPUC ()"); /* *------------------------------------------------------------------- * request value from advice of charge module. *------------------------------------------------------------------- */ aoc_get_values (AOC_PUCT, (void *)&puct); strcpy ((char *) currency, (char *) puct.currency); strcpy ((char *) ppu, (char *) puct.value); return( AT_CMPL ); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_SIMS | | STATE : code ROUTINE : sAT_PlusCIMI | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the +CIMI AT command which is responsible to request the IMSI. */ GLOBAL T_ACI_RETURN qAT_PlusCIMI ( T_ACI_CMD_SRC srcId, CHAR * imsi ) { T_SIM_SET_PRM * pSIMSetPrm; /* points to SIM parameter set */ TRACE_FUNCTION ("qAT_PlusCIMI()"); /* *------------------------------------------------------------------- * check command source *------------------------------------------------------------------- */ if(!cmh_IsVldCmdSrc (srcId)) { return( AT_FAIL ); } pSIMSetPrm = &simShrdPrm.setPrm[srcId]; /* *------------------------------------------------------------------- * check entity status *------------------------------------------------------------------- */ switch( simShrdPrm.SIMStat ) { case( SS_OK ): /* *----------------------------------------------------------------- * check if command executable *----------------------------------------------------------------- */ if((simShrdPrm.PINStat NEQ PS_RDY) AND (!cmhSMS_checkSIM ())) { return AT_FAIL; } /* * Check required for CIMI after SIM_REMOVE_IND and SIM_ACTIVATE_IND * with SIMStat as SS_OK and PINStat as PS_RDY * but before receiving SIM_MMI_INSERT_IND */ else if(simShrdPrm.imsi.c_field EQ 0) { ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_Unknown); return AT_FAIL; } else { psaSIM_cnvrtIMSI2ASCII( imsi ); return( AT_CMPL ); } case( NO_VLD_SS ): if( simEntStat.curCmd NEQ AT_CMD_NONE ) return( AT_BUSY ); pSIMSetPrm -> actProc = SIM_INITIALISATION; simEntStat.curCmd = AT_CMD_CIMI; simShrdPrm.owner = (T_OWN)srcId; simEntStat.entOwn = srcId; if( psaSIM_ActivateSIM() < 0 ) /* activate SIM card */ { simEntStat.curCmd = AT_CMD_NONE; TRACE_EVENT( "FATAL RETURN psaSIM in +CIMI" ); ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_Unknown); return( AT_FAIL ); } return( AT_EXCT ); default: /* SIM failure */ ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_SimFail ); return( AT_FAIL ); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_SSQ | | STATE : code ROUTINE : qAT_PercentCACM | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the %CACM AT command which is responsible to query the accumulated call meter value using PUCT. <cur> : currency. <val> : ACM value. */ GLOBAL T_ACI_RETURN qAT_PercentCACM( T_ACI_CMD_SRC srcId, CHAR *cur, CHAR *val) { T_puct puct; TRACE_FUNCTION ("qAT_PercentCACM ()"); /* *------------------------------------------------------------------- * request value from advice of charge module. *------------------------------------------------------------------- */ aoc_get_values (AOC_ACM_PUCT, (T_puct *)&puct); strcpy (cur, (char *) puct.currency); strcpy (val, (char *) puct.value); return( AT_CMPL ); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_SSQ | | STATE : code ROUTINE : qAT_PercentCAOC | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the %CAOC AT command which is responsible to query the current call meter value using PUCT. <cur> : currency. <val> : CCM value. */ GLOBAL T_ACI_RETURN qAT_PercentCAOC( T_ACI_CMD_SRC srcId, CHAR *cur, CHAR *val) { T_puct puct; TRACE_FUNCTION ("qAT_PercentCAOC ()"); /* *------------------------------------------------------------------- * request value from advice of charge module. *------------------------------------------------------------------- */ aoc_get_values (AOC_CCM_PUCT, (T_puct *)&puct); strcpy (cur, (char *) puct.currency); strcpy (val, (char *) puct.value); return( AT_CMPL ); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_SSQ | | STATE : code ROUTINE : qAT_PercentCTV | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the %CTV AT command which is responsible to query the current call timer value. <ctv> : CTV value. */ GLOBAL T_ACI_RETURN qAT_PercentCTV ( T_ACI_CMD_SRC srcId, LONG * ctv) { TRACE_FUNCTION ("qAT_PercentCTV ()"); /* *------------------------------------------------------------------- * request value from advice of charge module. *------------------------------------------------------------------- */ aoc_get_values (AOC_CTV, (void *)ctv); return( AT_CMPL ); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_SSQ | | STATE : code ROUTINE : qAT_PercentRPCT | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the %RPCT AT command which is responsible to query the raw SIM data for PUCT. <rpuct> : PUCT values. */ GLOBAL T_ACI_RETURN qAT_PercentRPCT( T_ACI_CMD_SRC srcId, T_ACI_RPCT_VAL *rpuct) { T_puct_raw raw_puct; TRACE_FUNCTION ("qAT_PercentRPCT ()"); /* *------------------------------------------------------------------- * request value from advice of charge module. *------------------------------------------------------------------- */ aoc_get_values (AOC_PUCT_RAW, (T_puct_raw *)&raw_puct); memcpy(rpuct->currency, raw_puct.currency, MAX_CUR_LEN); rpuct->eppu = raw_puct.eppu; rpuct->exp = raw_puct.exp; rpuct->sexp = raw_puct.sexp; return( AT_CMPL ); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_SSQ | | STATE : code ROUTINE : qAT_PercentPVRF | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the %PVRF AT command which is responsible to query the current counter for PIN and PUK. <pn1Cnt> : PIN 1 counter. <pn2Cnt> : PIN 2 counter. <pk1Cnt> : PUK 1 counter. <pk2Cnt> : PUK 2 counter. <ps1> : PIN 1 status. <ps2> : PIN 2 status. */ GLOBAL T_ACI_RETURN qAT_PercentPVRF( T_ACI_CMD_SRC srcId, SHORT *pn1Cnt, SHORT *pn2Cnt, SHORT *pk1Cnt, SHORT *pk2Cnt, T_ACI_PVRF_STAT *ps1, T_ACI_PVRF_STAT *ps2 ) { TRACE_FUNCTION ("qAT_PercentPVRF ()"); /* *------------------------------------------------------------------- * read PIN/PUK counter values *------------------------------------------------------------------- */ if( simShrdPrm.SIMStat NEQ SS_OK AND simShrdPrm.SIMStat NEQ SS_BLKD ) { *pn1Cnt = ACI_NumParmNotPresent; *pn2Cnt = ACI_NumParmNotPresent; *pk1Cnt = ACI_NumParmNotPresent; *pk2Cnt = ACI_NumParmNotPresent; *ps1 = PVRF_STAT_NotPresent; *ps2 = PVRF_STAT_NotPresent; } else { *pn1Cnt = simShrdPrm.pn1Cnt; *pn2Cnt = simShrdPrm.pn2Cnt; *pk1Cnt = simShrdPrm.pk1Cnt; *pk2Cnt = simShrdPrm.pk2Cnt; switch( simShrdPrm.pn1Stat ) { case( PS_RDY ): *ps1 = PVRF_STAT_NotRequired; break; case( PS_PIN1 ): *ps1 = PVRF_STAT_Required; break; default: *ps1 = PVRF_STAT_NotPresent; } switch( simShrdPrm.pn2Stat ) { case( PS_RDY ): *ps2 = PVRF_STAT_NotRequired; break; case( PS_PIN2 ): *ps2 = PVRF_STAT_Required; break; default: *ps2 = PVRF_STAT_NotPresent; } } return( AT_CMPL ); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_SIMS | | STATE : code ROUTINE : qAT_PlusCNUM | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the +CNUM AT command which is responsible for reading the subscriber number. <mode>: indicates whether reading starts or continues */ GLOBAL T_ACI_RETURN qAT_PlusCNUM ( T_ACI_CMD_SRC srcId, T_ACI_CNUM_MOD mode ) { T_SIM_CMD_PRM * pSIMCmdPrm; /* points to SIM command parameters */ UBYTE i; /* used for counting */ TRACE_FUNCTION ("qAT_PlusCNUM()"); /* *------------------------------------------------------------------- * check command source *------------------------------------------------------------------- */ if(!cmh_IsVldCmdSrc (srcId)) { return( AT_FAIL ); } pSIMCmdPrm = &cmhPrm[srcId].simCmdPrm; /* *------------------------------------------------------------------- * check entity status *------------------------------------------------------------------- */ if( simEntStat.curCmd NEQ AT_CMD_NONE ) return( AT_BUSY ); /* *------------------------------------------------------------------- * check whether there are more EF to read *------------------------------------------------------------------- */ if ( mode EQ CNUM_MOD_NextRead AND pSIMCmdPrm -> CNUMActRec EQ CNUMMaxRec ) { return ( AT_CMPL ); } /* *------------------------------------------------------------------- * process parameter <mode> *------------------------------------------------------------------- */ switch ( mode ) { case ( CNUM_MOD_NewRead ): pSIMCmdPrm -> CNUMActRec = 1; pSIMCmdPrm -> CNUMOutput = 0; break; case ( CNUM_MOD_NextRead ): pSIMCmdPrm -> CNUMActRec++; break; default: ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } /* *------------------------------------------------------------------- * reset to start of MSISDN list *------------------------------------------------------------------- */ CNUMMsisdnIdx = 0; /* *------------------------------------------------------------------- * invalidate contents of MSISDN list *------------------------------------------------------------------- */ for ( i = 0; i < MAX_MSISDN; i++ ) CNUMMsisdn[i].vldFlag = FALSE; /* *------------------------------------------------------------------- * request EF MSISDN from SIM *------------------------------------------------------------------- */ return cmhSIM_ReqMsisdn ( srcId, pSIMCmdPrm -> CNUMActRec ); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : CMH_SIMS | | STATE : code ROUTINE : cmhSIM_ReqMsisdn | +--------------------------------------------------------------------+ PURPOSE : This function starts reading of EF MSISDN from SIM. */ GLOBAL T_ACI_RETURN cmhSIM_ReqMsisdn ( T_ACI_CMD_SRC srcId, UBYTE record ) { UBYTE length; TRACE_FUNCTION ("cmhSIM_ReqMsisdn()"); if (record EQ 1) length = NOT_PRESENT_8BIT; else length = CNUMLenEfMsisdn; return cmhSIM_ReadRecordEF (srcId, AT_CMD_CNUM, FALSE, NULL, SIM_MSISDN, record, length, NULL, cmhSIM_CnfMsisdn); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : CMH_SIMS | | STATE : code ROUTINE : cmhSIM_ReqCcp | +--------------------------------------------------------------------+ PURPOSE : This function starts reading of EF CCP from SIM. */ GLOBAL T_ACI_RETURN cmhSIM_ReqCcp ( T_ACI_CMD_SRC srcId, UBYTE record ) { TRACE_FUNCTION ("cmhSIM_ReqCcp()"); return cmhSIM_ReadRecordEF (srcId, AT_CMD_CNUM, FALSE, NULL, SIM_CCP, record, ACI_SIZE_EF_CCP, NULL, cmhSIM_CnfCcp); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_SSQ | | STATE : code ROUTINE : qAT_PlusCPOL | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the +CPOL AT command which is responsible for reading the preferred operator list. <startIdx>: start index to read from <lastIdx>: buffer for last index read <operLst>: buffer for operator list <mode>: supplemental read mode */ GLOBAL T_ACI_RETURN qAT_PlusCPOL ( T_ACI_CMD_SRC srcId, SHORT startIdx, SHORT *lastIdx, T_ACI_CPOL_OPDESC *operLst, T_ACI_CPOL_MOD mode ) { T_SIM_CMD_PRM * pSIMCmdPrm; /* points to SIM command parameters */ TRACE_FUNCTION ("qAT_PlusCPOL()"); /* *------------------------------------------------------------------- * check command source *------------------------------------------------------------------- */ if(!cmh_IsVldCmdSrc (srcId)) { return( AT_FAIL ); } pSIMCmdPrm = &cmhPrm[srcId].simCmdPrm; /* *------------------------------------------------------------------- * check <mode> parameter *------------------------------------------------------------------- */ switch( mode ) { case( CPOL_MOD_NotPresent ): case( CPOL_MOD_CompactList ): break; case( CPOL_MOD_Insert ): default: ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } /* *------------------------------------------------------------------- * check if PLMNsel EF has to be read *------------------------------------------------------------------- */ if( startIdx EQ 0 OR EfPLMNselStat EQ EF_STAT_UNKNWN ) { /* *------------------------------------------------------------- * check entity status *------------------------------------------------------------- */ if( simEntStat.curCmd NEQ AT_CMD_NONE ) return( AT_BUSY ); pSIMCmdPrm -> CPOLidx = (startIdx EQ 0)?1:startIdx; pSIMCmdPrm -> CPOLmode = mode; pSIMCmdPrm -> CPOLact = CPOL_ACT_Read; /* *------------------------------------------------------------- * request EF PLMN SEL from SIM *------------------------------------------------------------- */ /* Implements Measure 150 and 159 */ return cmhSIM_Req_or_Write_PlmnSel( srcId, ACT_RD_DAT ); } /* *------------------------------------------------------------- * fill PLMN SEL list *------------------------------------------------------------- */ if( startIdx * ACI_LEN_PLMN_SEL_NTRY > CPOLSimEfDataLen ) { ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_InvIdx ); return( AT_FAIL ); } if( mode EQ CPOL_MOD_CompactList ) { cmhSIM_CmpctPlmnSel( CPOLSimEfDataLen, CPOLSimEfData ); } *lastIdx = cmhSIM_FillPlmnSelList((UBYTE)startIdx, pSIMCmdPrm->CPOLfrmt, operLst, CPOLSimEfDataLen, CPOLSimEfData); return ( AT_CMPL ); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_SSQ | | STATE : code ROUTINE : tAT_PlusCPOL | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the +CPOL AT command which is responsible for testing the supported preferred operator list length. <lastIdx>: maximum number of entries <usdNtry>: number of used entries */ GLOBAL T_ACI_RETURN tAT_PlusCPOL ( T_ACI_CMD_SRC srcId, SHORT * lastIdx, SHORT * usdNtry ) { T_SIM_CMD_PRM * pSIMCmdPrm; /* points to SIM command parameters */ TRACE_FUNCTION ("tAT_PlusCPOL()"); /* *------------------------------------------------------------------- * check command source *------------------------------------------------------------------- */ if(!cmh_IsVldCmdSrc (srcId)) { return( AT_FAIL ); } pSIMCmdPrm = &cmhPrm[srcId].simCmdPrm; /* *------------------------------------------------------------------- * check if PLMNsel EF has to be read *------------------------------------------------------------------- */ if( EfPLMNselStat EQ EF_STAT_UNKNWN ) { /* *------------------------------------------------------------- * check entity status *------------------------------------------------------------- */ if( simEntStat.curCmd NEQ AT_CMD_NONE ) return( AT_BUSY ); pSIMCmdPrm -> CPOLact = CPOL_ACT_Test; /* *------------------------------------------------------------- * request EF PLMN SEL from SIM *------------------------------------------------------------- */ /* Implements Measure 150 and 159 */ return cmhSIM_Req_or_Write_PlmnSel( srcId, ACT_RD_DAT ); } /* *------------------------------------------------------------- * return number of supported entries *------------------------------------------------------------- */ *lastIdx = CPOLSimEfDataLen / ACI_LEN_PLMN_SEL_NTRY; *usdNtry = cmhSIM_UsdPlmnSelNtry( CPOLSimEfDataLen, CPOLSimEfData ); return ( AT_CMPL ); } /* +-------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_SIMQ | | ROUTINE : qAT_PercentCPRI | +-------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the %CPRI AT command which is responsible for reading the ciphering indicator mode. */ GLOBAL T_ACI_RETURN qAT_PercentCPRI( T_ACI_CMD_SRC srcId, UBYTE *mode ) { TRACE_FUNCTION ("qAT_PercentCPRI()"); if( !cmh_IsVldCmdSrc( srcId ) ) { return( AT_FAIL ); } *mode = simShrdPrm.ciSIMEnabled; return( AT_CMPL ); } #ifdef TI_PS_FF_AT_P_CMD_ATR /* +-------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_SIMQ | | ROUTINE : qAT_PercentATR | +-------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the %ATR AT command which is responsible for reading the SIM phase and ATR (answer to reset information). */ GLOBAL T_ACI_RETURN qAT_PercentATR( T_ACI_CMD_SRC srcId, UBYTE *phase, UBYTE *atr_len, UBYTE *atr_info) { TRACE_FUNCTION ("qAT_PercentATR()"); if( !cmh_IsVldCmdSrc( srcId ) ) { return( AT_FAIL ); } *phase = simShrdPrm.crdPhs; /* SIM Phase... value is 0xFF if no phase is available*/ *atr_len = simShrdPrm.atr.len; /* ATR length... 0 if no ATR data is available*/ if (simShrdPrm.atr.len) { memcpy(atr_info, simShrdPrm.atr.data, simShrdPrm.atr.len); } return( AT_CMPL ); } #endif /* TI_PS_FF_AT_P_CMD_ATR */ #ifdef FF_DUAL_SIM /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_SIMQ | | STATE : code ROUTINE : qAT_PercentSIM | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the %SIM? AT command which returns the currently powered on SIM Number. <sim_num>: sim_number. */ GLOBAL T_ACI_RETURN qAT_PercentSIM ( T_ACI_CMD_SRC srcId, UBYTE *sim_num ) { TRACE_FUNCTION ("qAT_PercentSIM()"); /* *------------------------------------------------------------------- * check command source *------------------------------------------------------------------- */ if(!cmh_IsVldCmdSrc (srcId)) { return( AT_FAIL ); } /* *------------------------------------------------------------------- * fill in parameters *------------------------------------------------------------------- */ *sim_num = simShrdPrm.SIM_Powered_on; return( AT_CMPL ); } #endif /*FF_DUAL_SIM*/ #ifdef FF_CPHS_REL4 /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_SIMS | | STATE : code ROUTINE : qAT_PercentCFIS | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the +CNUM AT command which is responsible for reading the subscriber number. <mode>: indicates whether reading starts or continues */ GLOBAL T_ACI_RETURN qAT_PercentCFIS ( T_ACI_CMD_SRC srcId, UBYTE index ) { TRACE_FUNCTION ("qAT_PercntCFIS()"); /* *------------------------------------------------------------------- * check command source *------------------------------------------------------------------- */ if(!cmh_IsVldCmdSrc (srcId)) { ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } /* Make sure everytime query is called ,CFISIndex must be initialised to ZERO */ CFISIndex = 0; if(index EQ NOT_PRESENT_8BIT) { CFISIndex = 1; index =1; } return cmhSIM_ReadRecordEF (srcId, AT_CMD_P_CFIS, SIM_CFIS, index, NOT_PRESENT_8BIT, NULL, cmhSIM_RdCnfCfis); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_SIMS | | STATE : code ROUTINE : qAT_PercentMWIS | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the %MWIS AT command which is responsible for reading the MWIS records. */ GLOBAL T_ACI_RETURN qAT_PercentMWIS ( T_ACI_CMD_SRC srcId, UBYTE mspId ) { TRACE_FUNCTION ("qAT_PercntMWIS()"); /* *------------------------------------------------------------------- * check command source *------------------------------------------------------------------- */ if(!cmh_IsVldCmdSrc (srcId)) { ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } /* Make sure everytime query is called ,MWISIndex must be initialised to ZERO */ MWISIndex = 0; if(mspId EQ NOT_PRESENT_8BIT) { MWISIndex = 1; mspId =1; } return cmhSIM_ReadRecordEF (srcId, AT_CMD_P_MWIS, SIM_MWIS, mspId, NOT_PRESENT_8BIT, NULL, cmhSIM_RdCnfMwis); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_SIMQ | | STATE : code ROUTINE : qAT_PercentMBI | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the %MBI AT command which is responsible for reading the Mailbox Identifier. */ GLOBAL T_ACI_RETURN qAT_PercentMBI ( T_ACI_CMD_SRC srcId, UBYTE index ) { MBI_Index = 0; /* Intialise the index value */ TRACE_FUNCTION ("qAT_PercntMBI()"); /* *------------------------------------------------------------------- * check command source *------------------------------------------------------------------- */ if(!cmh_IsVldCmdSrc (srcId)) { ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } /* If index not present then start reading from the first record till the maximum record */ if (index EQ NOT_PRESENT_8BIT) { MBI_Index = 1; index = 1; } return cmhSIM_ReadRecordEF (srcId, AT_CMD_P_MBI, SIM_MBI, index, NOT_PRESENT_8BIT, NULL, cmhSIM_RdCnfMbi); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_SIMQ | | STATE : code ROUTINE : qAT_PercentMBDN | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the %MBDN AT command which is responsible for reading the Mailbox number. */ GLOBAL T_ACI_RETURN qAT_PercentMBDN ( T_ACI_CMD_SRC srcId, UBYTE index ) { TRACE_FUNCTION ("qAT_PercntMBDN()"); /* *------------------------------------------------------------------- * check command source *------------------------------------------------------------------- */ if(!cmh_IsVldCmdSrc (srcId)) { ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } return cmhSIM_ReadRecordEF (srcId, AT_CMD_P_MBDN, SIM_MBDN, index, NOT_PRESENT_8BIT, NULL, cmhSIM_RdCnfMbdn); } #endif/* FF_CPHS_REL4 */ /*==== EOF ========================================================*/