comparison gsm-fw/g23m-aci/aci/cmh_sims.c @ 775:eedbf248bac0

gsm-fw/g23m-aci subtree: initial import from LoCosto source
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Sun, 12 Oct 2014 01:45:14 +0000
parents
children 28f24c230edd
comparison
equal deleted inserted replaced
774:40a721fd9854 775:eedbf248bac0
1 /*
2 +-----------------------------------------------------------------------------
3 | Project : GSM-PS (6147)
4 | Modul : CMH_SIMS
5 +-----------------------------------------------------------------------------
6 | Copyright 2002 Texas Instruments Berlin, AG
7 | All rights reserved.
8 |
9 | This file is confidential and a trade secret of Texas
10 | Instruments Berlin, AG
11 | The receipt of or possession of this file does not convey
12 | any rights to reproduce or disclose its contents or to
13 | manufacture, use, or sell anything it may describe, in
14 | whole, or in part, without the specific written consent of
15 | Texas Instruments Berlin, AG.
16 +-----------------------------------------------------------------------------
17 | Purpose : This module provides the set functions related to the
18 | protocol stack adapter for the subscriber identity
19 | module.
20 +-----------------------------------------------------------------------------
21 */
22
23 #ifndef CMH_SIMS_C
24 #define CMH_SIMS_C
25 #endif
26
27 #include "aci_all.h"
28 /*==== INCLUDES ===================================================*/
29 #include "aci_cmh.h"
30
31 #ifdef UART
32 #include "dti.h" /* functionality of the dti library */
33 #include "dti.h"
34 #include "dti_conn_mng.h"
35 #endif
36
37 #include "ati_cmd.h"
38
39 #ifdef FF_ATI
40 #include "aci_io.h"
41 #endif /* of #ifdef FF_ATI */
42
43 #ifdef FAX_AND_DATA
44 #include "aci_fd.h"
45 #endif /* of #ifdef FAX_AND_DATA */
46
47 #include "psa.h"
48 #include "psa_sim.h"
49 #include "psa_mm.h"
50 #include "cmh.h"
51 #include "cmh_sim.h"
52 #include "cmh_mm.h"
53
54 #ifdef GPRS
55 #include "dti_cntrl_mng.h"
56 #include "gaci.h"
57 #include "gaci_cmh.h"
58 #include "psa_gmm.h"
59 #include "cmh_gmm.h"
60 #endif
61
62 #include "aci.h"
63
64 /* #include "m_fac.h" */
65 #include "aoc.h"
66 #include "ati_cmd.h"
67 #include "aci_cmd.h"
68 #include "phb.h"
69
70 #include "aci_ext_pers.h"
71 #include "aci_slock.h"
72
73 #include "cl_imei.h"
74
75
76 #ifdef SIM_PERS
77 #include "general.h" // included for compilation error UNIT8 in sec_drv.h
78 #include "sec_drv.h"
79 #include "cmh.h"
80 #include "aci_cmh.h"
81
82 EXTERN T_SIM_MMI_INSERT_IND *last_sim_mmi_insert_ind;
83 EXTERN T_SEC_DRV_CATEGORY *personalisation_nw;
84 EXTERN T_SEC_DRV_CATEGORY *personalisation_ns;
85 EXTERN T_SEC_DRV_CATEGORY *personalisation_sp;
86 EXTERN T_SEC_DRV_CATEGORY *personalisation_cp;
87 EXTERN T_SEC_DRV_CATEGORY *personalisation_sim;
88 EXTERN T_SEC_DRV_CONFIGURATION *cfg_data ;
89 #endif
90
91 /*==== CONSTANTS ==================================================*/
92
93 /*==== EXPORT =====================================================*/
94
95 /*==== VARIABLES ==================================================*/
96
97 /*==== FUNCTIONS ==================================================*/
98 LOCAL T_ACI_RETURN cmhSIM_analyze_SIMLOCK_STATUS( T_SIMLOCK_STATUS status );
99 LOCAL T_ACI_RETURN sAT_Plus_CAMM_CACM ( T_ACI_AT_CMD at_cmd_id,
100 T_ACI_CMD_SRC srcId,
101 UBYTE value_type,
102 void *value,
103 UBYTE *pwd );
104 /*
105 +--------------------------------------------------------------------+
106 | PROJECT : GSM-PS (6147) MODULE : CMH_SIMS |
107 | STATE : code ROUTINE : sAT_PlusCFUN |
108 +--------------------------------------------------------------------+
109
110 PURPOSE : This is the functional counterpart to the +CFUN AT command
111 which is responsible to set the phone functionality.
112
113 <fun>: defines the level of functionality to switch to.
114 <rst>: reset mode
115 */
116
117 GLOBAL T_ACI_RETURN sAT_PlusCFUN ( T_ACI_CMD_SRC srcId,
118 T_ACI_CFUN_FUN fun,
119 T_ACI_CFUN_RST rst )
120 {
121 T_SIM_SET_PRM * pSIMSetPrm; /* points to MM parameter set */
122 T_ACI_RETURN retCd; /* holds return code */
123 UBYTE idx; /* holds index value */
124
125 /* variables for IMEI control mechanism */
126 #ifndef _SIMULATION_
127 BYTE retVal; /* holds return value */
128 UBYTE dummyIMEIBuf[CL_IMEI_SIZE]; /* dummy IMEI buffer */
129 #endif /* if NOT defined windows simulation */
130
131 TRACE_FUNCTION ("sAT_PlusCFUN()");
132
133 #ifndef _SIMULATION_
134 /*
135 *-------------------------------------------------------------------
136 * check IMEI
137 *-------------------------------------------------------------------
138 */
139
140 retVal = cl_get_imeisv(CL_IMEI_SIZE, dummyIMEIBuf, CL_IMEI_CONTROL_IMEI);
141
142 if( retVal NEQ CL_IMEI_OK )
143 {
144 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_IMEICheck );
145 TRACE_EVENT("IMEI not valid");
146 simShrdPrm.imei_blocked = TRUE;
147 /*return( AT_FAIL ); We dont return here to enable the stack to go to the state of "Limited Service' to enable emergency calls. */
148 }
149 #endif /* if NOT defined windows simulation */
150
151 /*
152 *-------------------------------------------------------------------
153 * check command source
154 *-------------------------------------------------------------------
155 */
156 if(!cmh_IsVldCmdSrc (srcId))
157 {
158 return( AT_FAIL );
159 }
160
161 pSIMSetPrm = &simShrdPrm.setPrm[srcId];
162
163 /*
164 *-------------------------------------------------------------------
165 * check entity status
166 *-------------------------------------------------------------------
167 */
168 if( simEntStat.curCmd NEQ AT_CMD_NONE )
169 {
170 TRACE_EVENT("Entity SIM is busy: cannot proceed command...");
171 return( AT_BUSY );
172 }
173
174 /*
175 *-------------------------------------------------------------------
176 * process the <rst> parameter
177 *-------------------------------------------------------------------
178 */
179 switch( rst )
180 {
181 case( CFUN_RST_NotPresent ): /* default value */
182 case( CFUN_RST_NoReset ):
183
184 break;
185
186 default: /* unexpected parameter */
187 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
188 return( AT_FAIL );
189 }
190
191 /*
192 *-------------------------------------------------------------------
193 * process the <fun> parameter
194 *-------------------------------------------------------------------
195 */
196 if( fun EQ CFUN_FUN_NotPresent ) fun = CFUNfun;
197
198 switch( fun )
199 {
200 case( CFUN_FUN_Minimum ): /* set ME to minimum functionality */
201 CFUNfun = fun;
202 simEntStat.curCmd = AT_CMD_CFUN;
203 simShrdPrm.owner = (T_OWN)srcId;
204 simEntStat.entOwn = srcId;
205
206 /* Turn off all possible ringing */
207 #ifdef FF_ATI
208 io_setRngInd ( IO_RING_OFF, CRING_SERV_TYP_NotPresent, CRING_SERV_TYP_NotPresent ); /* V.24 Ring Indicator Line */
209 #endif
210 for( idx = 0; idx < CMD_SRC_MAX; idx++ )
211 {
212 R_AT( RAT_CRING_OFF, (T_ACI_CMD_SRC)idx )( 0 ); /* Turn of all ringing */
213 }
214
215
216 /* We have to wait for both entities to finish in CFUN. So both EntStat are set to AT_CMD_CFUN and
217 when a certain entity finished it also emits AT_OK if the other entity has already finished */
218
219 simEntStat.curCmd = AT_CMD_CFUN;
220 simShrdPrm.owner = (T_OWN)srcId;
221 simEntStat.entOwn = srcId;
222
223 mmEntStat.curCmd = AT_CMD_CFUN;
224 mmShrdPrm.owner = (T_OWN)srcId;
225 mmEntStat.entOwn = srcId;
226
227 pb_exit();
228
229 /* simShrdPrm.synCs = SYNC_DEACTIVATE; */ /* This is moved to pb_exit */
230 /* psaSIM_SyncSIM(); */
231
232 /* Reset ONSDesc */
233 cmhMM_Reset_ONSDesc();
234
235
236 #if defined (GPRS) AND defined (DTI)
237 mmShrdPrm.nrgCs = GMMREG_DT_POWER_OFF;
238 if( psaG_MM_CMD_DEREG ( mmShrdPrm.nrgCs ) < 0 ) /* deregister from network */
239 #else
240 mmShrdPrm.nrgCs = CS_POW_OFF;
241 if( psaMM_DeRegistrate () < 0 ) /* deregister from network */
242 #endif
243 {
244 TRACE_EVENT( "FATAL RETURN psaMM_DeRegistrate in +COPS" );
245 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Internal );
246 return( AT_FAIL );
247 }
248
249 percentCSTAT_indication(STATE_MSG_SMS, ENTITY_STATUS_NotReady);
250
251 retCd = AT_EXCT;
252 break;
253
254 case( CFUN_FUN_Full ): /* set ME to full functionality */
255 if ( (CFUNfun EQ CFUN_FUN_Minimum) OR (simShrdPrm.PINStat NEQ PS_RDY) )
256 {
257 CFUNfun = fun;
258 pSIMSetPrm -> actProc = SIM_INITIALISATION;
259
260 simEntStat.curCmd = AT_CMD_CFUN;
261 simShrdPrm.owner = (T_OWN)srcId;
262 simEntStat.entOwn = srcId;
263
264 if( psaSIM_ActivateSIM() < 0 ) /* activate SIM card */
265 {
266 TRACE_EVENT( "FATAL RETURN psaSIM in +CFUN" );
267 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Internal );
268 return( AT_FAIL );
269 }
270
271 retCd = AT_EXCT;
272 #ifdef GPRS
273 {
274 PALLOC (gmmreg_attach_req, GMMREG_ATTACH_REQ);
275
276 /* This is just a dummy req to trigger lower layer
277 for power scanning. It will be done based on bootup_act.*/
278 gmmreg_attach_req->bootup_act = QUICK_REG;
279
280 PSEND (hCommGMM,gmmreg_attach_req);
281 }
282 #else
283 {
284 PALLOC (mmr_reg_req, MMR_REG_REQ);
285
286 /* This is just a dummy req to trigger lower layer
287 for power scanning. It will be done based on bootup_act.
288 Other parameters is filled for the simulation test cases to pass */
289 mmr_reg_req->bootup_act = QUICK_REG;
290
291 PSENDX (MM, mmr_reg_req);
292 }
293 #endif
294 }
295 #ifdef SIM_PERS
296 else if (CFUNfun EQ CFUN_FUN_Full )
297 {
298 TRACE_EVENT("This is for if MMI calls sAT_PlusCFUN repetedly for verification of LOCKS");
299 CFUNfun = fun;
300 pSIMSetPrm -> actProc = SIM_INITIALISATION;
301
302 simEntStat.curCmd = AT_CMD_CFUN;
303 simShrdPrm.owner = (T_OWN)srcId;
304 simEntStat.entOwn = srcId;
305
306 if( psaSIM_ActivateSIM() < 0 ) /* activate SIM card */
307 {
308 TRACE_EVENT( "FATAL RETURN psaSIM in +CFUN" );
309 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Internal );
310 return( AT_FAIL );
311 }
312
313 retCd = AT_EXCT;
314 }
315 #endif
316 else
317 {
318 TRACE_EVENT("Switch mobile back on after radio low (CFUN=4)");
319 CFUNfun = fun;
320 retCd = AT_CMPL;
321 }
322 break;
323
324 case (CFUN_FUN_Disable_TX_RX_RF):
325 if (CFUNfun EQ CFUN_FUN_Minimum)
326 {
327 /* User directly goes to flight mode from power off. Only initialise
328 the SIM data */
329 CFUNfun = fun;
330 pSIMSetPrm -> actProc = SIM_INITIALISATION;
331
332 simEntStat.curCmd = AT_CMD_CFUN;
333 simShrdPrm.owner = (T_OWN)srcId;
334 simEntStat.entOwn = srcId;
335
336 if( psaSIM_ActivateSIM() < 0 ) /* activate SIM card */
337 {
338 TRACE_EVENT( "FATAL RETURN psaSIM in +CFUN" );
339 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Internal );
340 return( AT_FAIL );
341 }
342
343 retCd = AT_EXCT;
344 break;
345 }
346 CFUNfun = fun;
347
348 /* Turn off all possible ringing */
349 #ifdef FF_ATI
350 io_setRngInd ( IO_RING_OFF, CRING_SERV_TYP_NotPresent, CRING_SERV_TYP_NotPresent ); /* V.24 Ring Indicator Line */
351 #endif
352 for( idx = 0; idx < CMD_SRC_MAX; idx++ )
353 {
354 R_AT( RAT_CRING_OFF, (T_ACI_CMD_SRC)idx )( 0 ); /* Turn of all ringing */
355 }
356
357 if( mmEntStat.curCmd NEQ AT_CMD_BAND )
358 {
359 /* If sAT_PlusCFUN has been called by sAT_PercentBAND !!! */
360 mmEntStat.curCmd = AT_CMD_CFUN;
361 }
362 mmShrdPrm.owner = (T_OWN)srcId;
363 mmEntStat.entOwn = srcId;
364
365 #if defined (GPRS) AND defined (DTI)
366 mmShrdPrm.nrgCs = GMMREG_DT_SOFT_OFF;
367 if( psaG_MM_CMD_DEREG ( mmShrdPrm.nrgCs ) < 0 ) /* deregister from network */
368 #else
369 mmShrdPrm.nrgCs = CS_SOFT_OFF;
370 if( psaMM_DeRegistrate () < 0 ) /* deregister from network */
371 #endif
372 {
373 TRACE_EVENT( "FATAL RETURN psaMM_DeRegistrate in +COPS" );
374 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Internal );
375 return( AT_FAIL );
376 }
377
378 retCd = AT_EXCT;
379 break;
380
381 default: /* unexpected parameter */
382
383 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
384 return( AT_FAIL );
385 }
386
387 /*
388 *-------------------------------------------------------------------
389 * log command execution
390 *-------------------------------------------------------------------
391 */
392 #if defined SMI OR defined MFW OR defined FF_MMI_RIV
393 if( mmEntStat.curCmd NEQ AT_CMD_BAND
394 AND simEntStat.curCmd NEQ AT_CMD_BAND )
395 {
396 T_ACI_CLOG cmdLog; /* holds logging info */
397
398 cmdLog.atCmd = AT_CMD_CFUN;
399 cmdLog.cmdType = CLOG_TYPE_Set;
400 cmdLog.retCode = retCd;
401 cmdLog.cId = ACI_NumParmNotPresent;
402 cmdLog.sId = ACI_NumParmNotPresent;
403 cmdLog.cmdPrm.sCFUN.srcId = srcId;
404 cmdLog.cmdPrm.sCFUN.fun = fun;
405 cmdLog.cmdPrm.sCFUN.rst = rst;
406
407 rAT_PercentCLOG( &cmdLog );
408 }
409 #endif
410
411 return( retCd );
412
413 }
414
415 #ifdef TI_PS_FF_AT_P_CMD_SECP
416 /*
417 +--------------------------------------------------------------------+
418 | PROJECT : GSM-PS (6147) MODULE : CMH_SIMS |
419 | STATE : code ROUTINE : sAT_PercentSECP |
420 +--------------------------------------------------------------------+
421
422 PURPOSE : This is the functional counterpart to the %SEC AT command
423 which is responsible to enter a PIN.
424
425 <pin>: string of PIN chars.
426 <newpin>: string of PIN chars required if requested PIN is
427 SIM PUK
428 */
429
430 GLOBAL T_ACI_RETURN sAT_PercentSECP ( T_ACI_CMD_SRC srcId,
431 CHAR * pin,
432 CHAR * newpin )
433 {
434 T_SIMLOCK_STATUS result;
435
436 TRACE_FUNCTION ("sAT_PercentSECP()");
437
438 /*
439 *-------------------------------------------------------------------
440 * check command source
441 *-------------------------------------------------------------------
442 */
443 if(!cmh_IsVldCmdSrc (srcId))
444 {
445 return( AT_FAIL );
446 }
447
448 /* Check validity of pin str*/
449 if( pin EQ NULL)
450 {
451 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
452 return( AT_FAIL );
453 }
454
455 /* Try to set new pin */
456 result = aci_ext_personalisation_CS_change_password( pin, newpin );
457
458 /* Implements Measure 50 */
459 return ( cmhSIM_analyze_SIMLOCK_STATUS ( result ) );
460
461 }
462 #endif /* TI_PS_FF_AT_P_CMD_SECP */
463
464 #ifdef TI_PS_FF_AT_P_CMD_SECS
465 /*
466 +--------------------------------------------------------------------+
467 | PROJECT : GSM-PS (6147) MODULE : CMH_SIMS |
468 | STATE : code ROUTINE : sAT_PercentSECS |
469 +--------------------------------------------------------------------+
470
471 PURPOSE : This is the functional counterpart to the %SECS? AT command
472 which is responsible to set the status of the Security Code.
473
474 <securityStatus>: Status of the security code.
475 <code>: Security code required to change the status.
476 */
477
478
479 GLOBAL T_ACI_RETURN sAT_PercentSECS ( T_ACI_CMD_SRC srcId,
480 T_ACI_SECS_STA securityState,
481 CHAR * code )
482 {
483
484 T_SIMLOCK_STATUS result;
485
486 TRACE_FUNCTION ("sAT_PercentSECS()");
487
488
489 /*
490 *-------------------------------------------------------------------
491 * check command source
492 *-------------------------------------------------------------------
493 */
494 if(!cmh_IsVldCmdSrc (srcId))
495 {
496 return( AT_FAIL );
497 }
498
499 /*
500 *-------------------------------------------------------------------
501 * check status value
502 *-------------------------------------------------------------------
503 */
504 switch (securityState)
505 {
506 case( SECS_STA_Enable ):
507 result = aci_ext_personalisation_CS_set_status(SIMLOCK_ENABLED, code);
508 break;
509 case( SECS_STA_Disable ):
510 result = aci_ext_personalisation_CS_set_status(SIMLOCK_DISABLED, code);
511 break;
512 default:
513 return( AT_FAIL );
514 }
515
516 /*
517 *-------------------------------------------------------------------
518 * analyze answer
519 *-------------------------------------------------------------------
520 */
521 /* Implements Measure 50 */
522 return ( cmhSIM_analyze_SIMLOCK_STATUS ( result ) );
523 }
524 #endif /* TI_PS_FF_AT_P_CMD_SECS */
525
526
527
528
529
530 /*
531 +--------------------------------------------------------------------+
532 | PROJECT : GSM-PS (6147) MODULE : CMH_SIMS |
533 | STATE : code ROUTINE : sAT_PlusCPIN |
534 +--------------------------------------------------------------------+
535
536 PURPOSE : This is the functional counterpart to the +CPIN AT command
537 which is responsible to enter a PIN.
538
539 <pin>: string of PIN chars.
540 <newpin>: string of PIN chars required if requested PIN is
541 SIM PUK
542 */
543
544 GLOBAL T_ACI_RETURN sAT_PlusCPIN ( T_ACI_CMD_SRC srcId,
545 CHAR * pin,
546 CHAR * newpin )
547 {
548 T_SIM_SET_PRM * pSIMSetPrm; /* points to SIM parameter set */
549 T_ACI_RETURN retCd; /* holds return code */
550 T_SIMLOCK_STATUS retSlStatus; /* holds return code */
551
552 TRACE_FUNCTION ("sAT_PlusCPIN()");
553
554 /*
555 *-------------------------------------------------------------------
556 * check command source
557 *-------------------------------------------------------------------
558 */
559 if(!cmh_IsVldCmdSrc (srcId))
560 {
561 return( AT_FAIL );
562 }
563
564 pSIMSetPrm = &simShrdPrm.setPrm[srcId];
565
566 /*
567 *-------------------------------------------------------------------
568 * check entity status
569 *-------------------------------------------------------------------
570 */
571 if( simEntStat.curCmd NEQ AT_CMD_NONE )
572
573 return( AT_BUSY );
574
575 /*
576 *-------------------------------------------------------------------
577 * check for PIN status
578 *-------------------------------------------------------------------
579 */
580 switch( simShrdPrm.PINStat )
581 {
582 case( PS_RDY ):
583 /*
584 *---------------------------------------------------------------
585 * Not a SIM PIN State, but a ME personalisation PIN
586 *---------------------------------------------------------------
587 */
588 #ifdef SIM_PERS
589 if (AciSLockShrd.blocked)
590 {
591 retSlStatus = aci_slock_authenticate(AciSLockShrd.current_lock, pin);
592 if ( retSlStatus NEQ SIMLOCK_DISABLED)
593 {
594 TRACE_EVENT( "Wrong PIN given for SIM lock." );
595 if (retSlStatus EQ SIMLOCK_BLOCKED)
596 {
597 if(!aci_slock_set_CFG())
598 {
599 ACI_ERR_DESC( ACI_ERR_CLASS_Ext,EXT_ERR_NoMEPD);
600 return( AT_FAIL );
601 }
602 aci_set_cme_error(AciSLockShrd.current_lock);
603 MFREE(cfg_data);
604 }
605 else
606 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_WrongPasswd );
607 return( AT_FAIL );
608 }
609 else
610 {
611 simEntStat.curCmd = AT_CMD_CPIN;
612 if(!aci_slock_set_CFG())
613 {
614 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_NoMEPD);
615 return( AT_FAIL );
616 }
617 aci_slock_init();
618
619 retSlStatus = SIMLOCK_ENABLED;
620 if(AciSLockShrd.current_lock < SIMLOCK_SIM)
621 {
622 AciSLockShrd.current_lock=(T_SIMLOCK_TYPE)(AciSLockShrd.current_lock +SIMLOCK_NETWORK_SUBSET);
623 AciSLockShrd.check_lock = SIMLOCK_CHECK_PERS;
624 retSlStatus = aci_slock_checkpersonalisation(AciSLockShrd.current_lock);
625 }
626 switch(retSlStatus)
627 {
628 case SIMLOCK_ENABLED :
629 return( AT_CMPL);
630 case SIMLOCK_BLOCKED :
631 return( AT_FAIL);
632 case SIMLOCK_WAIT :
633 return (AT_EXCT);
634
635 }
636 }
637
638 }
639
640 #endif
641 /*
642 *---------------------------------------------------------------
643 * no PIN input is required
644 *---------------------------------------------------------------
645 */
646 retCd = AT_FAIL;
647 break;
648
649 case( NO_VLD_PS ):
650 /*
651 *---------------------------------------------------------------
652 * PIN Status is unknown
653 *---------------------------------------------------------------
654 */
655
656 /* invoke SIM activate and enter PIN if needed ???? */
657 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotAllow );
658 return( AT_FAIL );
659
660 case( PS_PIN1 ):
661 /*
662 *---------------------------------------------------------------
663 * PIN 1 input is required
664 *---------------------------------------------------------------
665 */
666 if( pin EQ NULL OR
667 strlen( pin ) < MIN_PIN_LEN OR
668 strlen( pin ) > PIN_LEN )
669 {
670 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
671 return( AT_FAIL );
672 }
673
674 cmhSIM_FillInPIN ( pin, pSIMSetPrm -> curPIN, PIN_LEN );
675 pSIMSetPrm -> PINType = PHASE_2_PIN_1;
676 simEntStat.curCmd = AT_CMD_CPIN;
677 simShrdPrm.owner = (T_OWN)srcId;
678 simEntStat.entOwn = srcId;
679
680 if( psaSIM_VerifyPIN() < 0 ) /* verify PIN */
681 {
682 TRACE_EVENT( "FATAL RETURN psaSIM in +CPIN" );
683 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Internal );
684 return( AT_FAIL );
685 }
686
687 retCd = AT_EXCT;
688 break;
689
690 case( PS_PIN2 ):
691 /*
692 *---------------------------------------------------------------
693 * PIN 2 input is required
694 *---------------------------------------------------------------
695 */
696 if( pin EQ NULL OR
697 strlen( pin ) < MIN_PIN_LEN OR
698 strlen( pin ) > PIN_LEN )
699 {
700 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
701 return( AT_FAIL );
702 }
703
704 cmhSIM_FillInPIN ( pin, pSIMSetPrm -> curPIN, PIN_LEN );
705 pSIMSetPrm -> PINType = PHASE_2_PIN_2;
706 simEntStat.curCmd = AT_CMD_CPIN;
707 simShrdPrm.owner = (T_OWN)srcId;
708 simEntStat.entOwn = srcId;
709
710 if( psaSIM_VerifyPIN() < 0 ) /* verify PIN */
711 {
712 TRACE_EVENT( "FATAL RETURN psaSIM in +CPIN" );
713 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Internal );
714 return( AT_FAIL );
715 }
716
717 retCd = AT_EXCT;
718 break;
719
720 case( PS_PUK1 ):
721 /*
722 *---------------------------------------------------------------
723 * PUK 1 input is required
724 *---------------------------------------------------------------
725 */
726 if( newpin EQ NULL OR
727 strlen( newpin ) EQ 0)
728 {
729 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_SimPukReq ); /* inform about needed PUK */
730 return( AT_FAIL );
731 }
732 if( pin EQ NULL OR
733 newpin EQ NULL OR
734 strlen( pin ) NEQ PUK_LEN OR
735 strlen( newpin ) < MIN_PIN_LEN OR
736 strlen( newpin ) > PIN_LEN )
737 {
738 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
739 return( AT_FAIL );
740 }
741
742 cmhSIM_FillInPIN ( pin, pSIMSetPrm -> unblkKey, PUK_LEN );
743 cmhSIM_FillInPIN ( newpin, pSIMSetPrm -> curPIN, PIN_LEN );
744 pSIMSetPrm -> PINType = PHASE_2_PUK_1;
745 simEntStat.curCmd = AT_CMD_CPIN;
746 simShrdPrm.owner = (T_OWN)srcId;
747 simEntStat.entOwn = srcId;
748
749 if( psaSIM_UnblockCard( ) < 0 ) /* verify PIN */
750 {
751 TRACE_EVENT( "FATAL RETURN psaSIM in +CPIN" );
752 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Internal );
753 return( AT_FAIL );
754 }
755
756 retCd = AT_EXCT;
757 break;
758
759 case( PS_PUK2 ):
760 /*
761 *---------------------------------------------------------------
762 * PUK 2 input is required
763 *---------------------------------------------------------------
764 */
765 if( newpin EQ NULL OR
766 strlen( newpin ) EQ 0)
767 {
768 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_SimPuk2Req ); /* inform about needed PUK2 */
769 return( AT_FAIL );
770 }
771 if( pin EQ NULL OR
772 newpin EQ NULL OR
773 strlen( pin ) NEQ PUK_LEN OR
774 strlen( newpin ) < MIN_PIN_LEN OR
775 strlen( newpin ) > PIN_LEN )
776 {
777 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
778 return( AT_FAIL );
779 }
780
781 cmhSIM_FillInPIN ( pin, pSIMSetPrm -> unblkKey, PUK_LEN );
782 cmhSIM_FillInPIN ( newpin, pSIMSetPrm -> curPIN, PIN_LEN );
783 pSIMSetPrm -> PINType = PHASE_2_PUK_2;
784 simEntStat.curCmd = AT_CMD_CPIN;
785 simShrdPrm.owner = (T_OWN)srcId;
786 simEntStat.entOwn = srcId;
787
788 if( psaSIM_UnblockCard( ) < 0 ) /* verify PIN */
789 {
790 TRACE_EVENT( "FATAL RETURN psaSIM in +CPIN" );
791 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Internal );
792 return( AT_FAIL );
793 }
794
795 retCd = AT_EXCT;
796 break;
797
798 default:
799 /*
800 *---------------------------------------------------------------
801 * unexpected PIN state
802 *---------------------------------------------------------------
803 */
804 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_DataCorrupt );
805 return( AT_FAIL );
806 }
807
808 /*
809 *-------------------------------------------------------------------
810 * log command execution
811 *-------------------------------------------------------------------
812 */
813 #if defined SMI OR defined MFW OR defined FF_MMI_RIV
814 {
815 T_ACI_CLOG cmdLog; /* holds logging info */
816
817 cmdLog.atCmd = AT_CMD_CPIN;
818 cmdLog.cmdType = CLOG_TYPE_Set;
819 cmdLog.retCode = retCd;
820 cmdLog.cId = ACI_NumParmNotPresent;
821 cmdLog.sId = ACI_NumParmNotPresent;
822 cmdLog.cmdPrm.sCPIN.srcId = srcId;
823 cmdLog.cmdPrm.sCPIN.pin = pin;
824 cmdLog.cmdPrm.sCPIN.newpin = newpin;
825
826 rAT_PercentCLOG( &cmdLog );
827 }
828 #endif
829
830 return( retCd );
831 }
832
833 /*
834 +--------------------------------------------------------------------+
835 | PROJECT : GSM-PS (6147) MODULE : CMH_SIMS |
836 | STATE : code ROUTINE : sAT_PlusCAMM |
837 +--------------------------------------------------------------------+
838
839 PURPOSE : This is the functional counterpart to the +CAMM AT command
840 which is responsible to set the ACMMax.
841 */
842
843 GLOBAL T_ACI_RETURN sAT_PlusCAMM ( T_ACI_CMD_SRC srcId,
844 LONG acmmax,
845 CHAR * pwd)
846 {
847 /* Implements Measure 40 */
848 return ( sAT_Plus_CAMM_CACM( AT_CMD_CAMM, srcId, AOC_ACMMAX,
849 (void *) acmmax, (UBYTE *) pwd ));
850 }
851
852 /*
853 +--------------------------------------------------------------------+
854 | PROJECT : GSM-PS (6147) MODULE : CMH_SIMS |
855 | STATE : code ROUTINE : sAT_PlusCPUC |
856 +--------------------------------------------------------------------+
857
858 PURPOSE : This is the functional counterpart to the +CPUC AT command
859 which is responsible to set the PUCT values.
860 */
861
862 GLOBAL T_ACI_RETURN sAT_PlusCPUC ( T_ACI_CMD_SRC srcId,
863 CHAR * currency,
864 CHAR * ppu,
865 CHAR * pwd)
866 {
867 T_puct puct;
868 T_ACI_RETURN ret = AT_FAIL;
869
870 TRACE_FUNCTION ("sAT_PlusCPUC()");
871 /*
872 *-------------------------------------------------------------------
873 * check command source
874 *-------------------------------------------------------------------
875 */
876 if(!cmh_IsVldCmdSrc (srcId))
877 {
878 return( AT_FAIL );
879 }
880
881 /*
882 *-------------------------------------------------------------------
883 * send parameters to advice of charge module.
884 *-------------------------------------------------------------------
885 */
886 strcpy ((char *) puct.currency, currency);
887 strcpy ((char *) puct.value, ppu);
888 simEntStat.curCmd = AT_CMD_CPUC;
889 simShrdPrm.owner = (T_OWN)srcId;
890 simEntStat.entOwn = srcId;
891 ret = aoc_set_values (srcId,
892 AOC_PUCT,
893 (void *)&puct,
894 (UBYTE *) pwd);
895
896 /*
897 *-------------------------------------------------------------------
898 * Check return value of aoc_set_values() equal to AT_FAIL,
899 * resets simEntStat.curcmd and simEntStat.entown.
900 *-------------------------------------------------------------------
901 */
902
903 if( ret EQ AT_FAIL )
904 {
905 simEntStat.curCmd = AT_CMD_NONE;
906 simShrdPrm.owner = (T_OWN)CMD_SRC_NONE;
907 simEntStat.entOwn = CMD_SRC_NONE;
908 }
909
910 return( ret );
911 }
912
913 /*
914 +--------------------------------------------------------------------+
915 | PROJECT : GSM-PS (6147) MODULE : CMH_SIMS |
916 | STATE : code ROUTINE : sAT_PlusCACM |
917 +--------------------------------------------------------------------+
918
919 PURPOSE : This is the functional counterpart to the +CACM AT command
920 which is responsible to reset the ACM value.
921 */
922
923 GLOBAL T_ACI_RETURN sAT_PlusCACM ( T_ACI_CMD_SRC srcId,
924 CHAR * pwd)
925 {
926 /* Implements Measure 40 */
927 return ( sAT_Plus_CAMM_CACM( AT_CMD_CACM, srcId, AOC_ACM,
928 (void *) NULL, (UBYTE *) pwd ));
929 }
930
931 /*
932 +--------------------------------------------------------------------+
933 | PROJECT : GSM-PS (6147) MODULE : CMH_SIMS |
934 | STATE : code ROUTINE : sAT_PlusCPOL |
935 +--------------------------------------------------------------------+
936
937 PURPOSE : This is the functional counterpart to the +CPOL AT command
938 which is responsible to access the preferred PLMN list.
939
940 <index>: PLMN list index
941 <format>: PLMN format
942 <oper>: PLMN name
943 <index2>: second PLMN list index for exchange operation
944 <mode>: supplemental mode information
945 */
946
947 GLOBAL T_ACI_RETURN sAT_PlusCPOL ( T_ACI_CMD_SRC srcId,
948 SHORT index,
949 T_ACI_CPOL_FRMT format,
950 CHAR * oper,
951 SHORT index2,
952 T_ACI_CPOL_MOD mode )
953 {
954 T_SIM_CMD_PRM * pSIMCmdPrm; /* points to SIM command parameters */
955 UBYTE plmn[ACI_LEN_PLMN_SEL_NTRY];/* holds coded plmn id */
956
957 TRACE_FUNCTION ("sAT_PlusCPOL()");
958
959 /*
960 *-------------------------------------------------------------------
961 * check command source
962 *-------------------------------------------------------------------
963 */
964 if(!cmh_IsVldCmdSrc (srcId))
965 {
966 return( AT_FAIL );
967 }
968 pSIMCmdPrm = &cmhPrm[srcId].simCmdPrm;
969
970 /*
971 *-------------------------------------------------------------------
972 * check mode parameter
973 *-------------------------------------------------------------------
974 */
975 switch( mode )
976 {
977 case( CPOL_MOD_CompactList ):
978 case( CPOL_MOD_Insert ):
979 case( CPOL_MOD_NotPresent ):
980 break;
981
982 default:
983 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
984 return( AT_FAIL );
985 }
986
987 /*
988 *-------------------------------------------------------------------
989 * check format parameter
990 *-------------------------------------------------------------------
991 */
992 switch( format )
993 {
994 case( CPOL_FRMT_Long ):
995 case( CPOL_FRMT_Short ):
996 case( CPOL_FRMT_Numeric ):
997
998 if( index EQ ACI_NumParmNotPresent AND !oper )
999 {
1000 pSIMCmdPrm->CPOLfrmt = format;
1001 return( AT_CMPL );
1002 }
1003 break;
1004
1005 case( CPOL_FRMT_NotPresent ):
1006
1007 format = pSIMCmdPrm->CPOLfrmt;
1008 break;
1009
1010 default:
1011 {
1012 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1013 return( AT_FAIL );
1014 }
1015 }
1016
1017 /*
1018 *-------------------------------------------------------------------
1019 * check for write entry
1020 *-------------------------------------------------------------------
1021 */
1022 if( oper )
1023 {
1024 /* code plmn id */
1025 if( ! cmhSIM_GetCodedPLMN( oper, format, plmn ))
1026 {
1027 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1028 return( AT_FAIL );
1029 }
1030
1031 /* if EF is already read */
1032 if( EfPLMNselStat EQ EF_STAT_READ )
1033 {
1034 if( mode EQ CPOL_MOD_CompactList )
1035 {
1036 cmhSIM_CmpctPlmnSel( CPOLSimEfDataLen, CPOLSimEfData );
1037 }
1038
1039 if( index NEQ ACI_NumParmNotPresent )
1040 {
1041 if( index > (CPOLSimEfDataLen / ACI_LEN_PLMN_SEL_NTRY))
1042 {
1043 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_InvIdx );
1044 return( AT_FAIL );
1045 }
1046
1047 return cmhSIM_UpdPlmnSel( srcId, index, plmn, mode );
1048 }
1049 else
1050
1051 return cmhSIM_FndEmptyPlmnSel( srcId, plmn );
1052 }
1053 else
1054 {
1055 if( simEntStat.curCmd NEQ AT_CMD_NONE )
1056
1057 return( AT_BUSY );
1058
1059 pSIMCmdPrm->CPOLidx = (UBYTE)(index EQ ACI_NumParmNotPresent)?
1060 NOT_PRESENT_8BIT:index;
1061 pSIMCmdPrm->CPOLmode = mode;
1062 pSIMCmdPrm->CPOLact = CPOL_ACT_Write;
1063 memcpy( pSIMCmdPrm->CPOLplmn, plmn, ACI_LEN_PLMN_SEL_NTRY );
1064
1065 simEntStat.curCmd = AT_CMD_CPOL;
1066 simEntStat.entOwn = srcId;
1067
1068 /* Implements Measure 150 and 159 */
1069 return cmhSIM_Req_or_Write_PlmnSel( srcId, ACT_RD_DAT );
1070 }
1071 }
1072
1073 /*
1074 *-------------------------------------------------------------------
1075 * check for delete entry
1076 *-------------------------------------------------------------------
1077 */
1078 else
1079 {
1080 /* check presence of index */
1081 if( index EQ ACI_NumParmNotPresent )
1082 {
1083 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_InvIdx );
1084 return( AT_FAIL );
1085 }
1086
1087 /* if EF is already read */
1088 if( EfPLMNselStat EQ EF_STAT_READ )
1089 {
1090 if( mode EQ CPOL_MOD_CompactList )
1091 {
1092 cmhSIM_CmpctPlmnSel( CPOLSimEfDataLen, CPOLSimEfData );
1093 }
1094
1095 if( index > (CPOLSimEfDataLen / ACI_LEN_PLMN_SEL_NTRY) OR
1096 (index2 > (CPOLSimEfDataLen / ACI_LEN_PLMN_SEL_NTRY) AND
1097 index2 NEQ ACI_NumParmNotPresent))
1098 {
1099 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_InvIdx );
1100 return( AT_FAIL );
1101 }
1102
1103 if( index2 EQ ACI_NumParmNotPresent )
1104
1105 return cmhSIM_DelPlmnSel( srcId, index, mode );
1106
1107 else
1108
1109 return cmhSIM_ChgPlmnSel( srcId, index, index2 );
1110 }
1111 else
1112 {
1113 if( simEntStat.curCmd NEQ AT_CMD_NONE )
1114
1115 return( AT_BUSY );
1116
1117 pSIMCmdPrm->CPOLidx = (UBYTE)index;
1118 pSIMCmdPrm->CPOLidx2 = (index2 NEQ ACI_NumParmNotPresent)?
1119 (UBYTE)index2:NOT_PRESENT_8BIT;
1120 pSIMCmdPrm->CPOLmode = mode;
1121 pSIMCmdPrm->CPOLact = CPOL_ACT_Delete;
1122
1123 simEntStat.curCmd = AT_CMD_CPOL;
1124 simEntStat.entOwn = srcId;
1125
1126 /* Implements Measure 150 and 159 */
1127 return cmhSIM_Req_or_Write_PlmnSel( srcId, ACT_RD_DAT );
1128 }
1129 }
1130 }
1131
1132 /*
1133 +--------------------------------------------------------------------+
1134 | PROJECT : GSM-PS (6147) MODULE : CMH_SIMS |
1135 | STATE : code ROUTINE : sAT_PlusCRSM |
1136 +--------------------------------------------------------------------+
1137
1138 PURPOSE : This is the functional counterpart to the +CRSM AT command
1139 which is responsible for restricted SIM access.
1140
1141 <cmd>: access command.
1142 <fileId>: file identifier
1143 <p1>: parameter 1
1144 <p2>: parameter 2
1145 <p3>: parameter 3
1146 <dataLen>: length of data
1147 <data>: pointer to data
1148 */
1149
1150 T_ACI_RETURN sAT_PlusCRSM ( T_ACI_CMD_SRC srcId,
1151 T_ACI_CRSM_CMD cmd,
1152 SHORT fileId,
1153 SHORT p1,
1154 SHORT p2,
1155 SHORT p3,
1156 SHORT dataLen,
1157 UBYTE *data )
1158 {
1159 T_SIM_TRNS_ACC_PRM prm; /* holds access parameter */
1160
1161 TRACE_FUNCTION ("sAT_PlusCRSM()");
1162
1163 /*
1164 *-------------------------------------------------------------------
1165 * check command source
1166 *-------------------------------------------------------------------
1167 */
1168 if(!cmh_IsVldCmdSrc (srcId))
1169 {
1170 return( AT_FAIL );
1171 }
1172
1173 /*
1174 *-------------------------------------------------------------------
1175 * check entity status
1176 *-------------------------------------------------------------------
1177 */
1178 if( simEntStat.curCmd NEQ AT_CMD_NONE )
1179
1180 return( AT_BUSY );
1181
1182 /*
1183 *-------------------------------------------------------------------
1184 * check command, data, p1, p2 and p3 parameters
1185 *-------------------------------------------------------------------
1186 */
1187 switch( cmd )
1188 {
1189 case( CRSM_CMD_UpdBin ):
1190 case( CRSM_CMD_UpdRec ):
1191
1192 if( !data OR !dataLen )
1193 {
1194 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1195 return( AT_FAIL );
1196 }
1197 /*lint -fallthrough*/
1198
1199 case( CRSM_CMD_ReadBin ):
1200 case( CRSM_CMD_ReadRec ):
1201
1202 if( p1 EQ ACI_NumParmNotPresent OR
1203 p2 EQ ACI_NumParmNotPresent OR
1204 p3 EQ ACI_NumParmNotPresent )
1205 {
1206 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1207 return( AT_FAIL );
1208 }
1209 break;
1210
1211 case( CRSM_CMD_GetResp ):
1212 case( CRSM_CMD_Status ):
1213
1214 if( p3 EQ ACI_NumParmNotPresent )
1215 p3 = 0;
1216 break;
1217
1218 case( CRSM_CMD_NotPresent ):
1219 default:
1220 {
1221 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1222 return( AT_FAIL );
1223 }
1224 }
1225
1226 /*
1227 *-------------------------------------------------------------------
1228 * check fileId parameter
1229 *-------------------------------------------------------------------
1230 */
1231 if( fileId EQ ACI_NumParmNotPresent AND cmd NEQ CRSM_CMD_Status )
1232 {
1233 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1234 return( AT_FAIL );
1235 }
1236
1237 /*
1238 *-------------------------------------------------------------------
1239 * convert command
1240 *-------------------------------------------------------------------
1241 */
1242 switch( cmd )
1243 {
1244 case( CRSM_CMD_UpdBin ): prm.cmd = SIM_UPDATE_BINARY;break;
1245 case( CRSM_CMD_UpdRec ): prm.cmd = SIM_UPDATE_RECORD;break;
1246 case( CRSM_CMD_ReadBin ): prm.cmd = SIM_READ_BINARY;break;
1247 case( CRSM_CMD_ReadRec ): prm.cmd = SIM_READ_RECORD;break;
1248 case( CRSM_CMD_GetResp ): prm.cmd = SIM_GET_RESPONSE;break;
1249 case( CRSM_CMD_Status ): prm.cmd = SIM_STATUS;break;
1250 }
1251
1252 /*
1253 *-------------------------------------------------------------------
1254 * access SIM
1255 *-------------------------------------------------------------------
1256 */
1257 simEntStat.curCmd = AT_CMD_CRSM;
1258 simEntStat.entOwn = srcId;
1259
1260 prm.reqDataFld = (USHORT)fileId;
1261 prm.p1 = (UBYTE)p1;
1262 prm.p2 = (UBYTE)p2;
1263 prm.p3 = (UBYTE)p3;
1264 prm.dataLen = (UBYTE)dataLen;
1265 prm.transData = data;
1266
1267 psaSIM_TrnsSIMAccess( &prm );
1268
1269 return( AT_EXCT );
1270 }
1271
1272 /*
1273 +--------------------------------------------------------------------+
1274 | PROJECT : GSM-PS (6147) MODULE : CMH_SIMS |
1275 | STATE : code ROUTINE : sAT_PlusCSIM |
1276 +--------------------------------------------------------------------+
1277
1278 PURPOSE : This is the functional counterpart to the +CSIM AT command
1279 which is responsible for generic SIM access.
1280
1281 */
1282
1283 T_ACI_RETURN sAT_PlusCSIM ( T_ACI_CMD_SRC srcId,
1284 USHORT dataLen,
1285 UBYTE *data )
1286 {
1287 T_SIM_TRNS_ACC_PRM prm; /* holds access parameter */
1288
1289 TRACE_FUNCTION ("sAT_PlusCSIM()");
1290
1291 /*
1292 *-------------------------------------------------------------------
1293 * check command source
1294 *-------------------------------------------------------------------
1295 */
1296 if(!cmh_IsVldCmdSrc (srcId))
1297 {
1298 return( AT_FAIL );
1299 }
1300
1301 /*
1302 *-------------------------------------------------------------------
1303 * check entity status
1304 *-------------------------------------------------------------------
1305 */
1306 if( simEntStat.curCmd NEQ AT_CMD_NONE )
1307 {
1308 return( AT_BUSY );
1309 }
1310
1311 if (data[0] EQ GSM_CLASS)
1312 {
1313 /* GSM instruction class is not allowed */
1314 TRACE_EVENT("GSM instruction class is not allowed");
1315 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotAllow );
1316 return( AT_FAIL );
1317 }
1318 #if 0 /* do we really need the check for the ATP source ? */
1319 #ifdef _TARGET_
1320 if (ati_is_src_type((UBYTE)srcId, ATI_SRC_TYPE_RIV) EQ FALSE)
1321 {
1322 /* don't allow other source type than RIV */
1323 TRACE_EVENT("other src type than RIV is not allowed");
1324 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotAllow );
1325 return( AT_FAIL );
1326 }
1327 #endif /*_TARGET_*/
1328 #endif /* */
1329 if (dataLen > MAX_SIM_TRANSP)
1330 {
1331 /* wrong length value */
1332 TRACE_EVENT("wrong length value");
1333 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1334 return( AT_FAIL );
1335 }
1336
1337 /*
1338 *-------------------------------------------------------------------
1339 * access SIM
1340 *-------------------------------------------------------------------
1341 */
1342 simEntStat.curCmd = AT_CMD_CSIM;
1343 simEntStat.entOwn = srcId;
1344
1345 prm.cmd = SIM_TRANSP_CMD;
1346 prm.dataLen = dataLen;
1347 prm.transData = data;
1348
1349 psaSIM_TrnsSIMAccess( &prm );
1350
1351 return( AT_EXCT );
1352
1353 }
1354
1355 /*
1356 +--------------------------------------------------------------------+
1357 | PROJECT : GSM-PS (6147) MODULE : CMH_SIMS |
1358 | STATE : code ROUTINE : sAT_PercentPVRF |
1359 +--------------------------------------------------------------------+
1360
1361 PURPOSE : This is the functional counterpart to the %PVRF AT command
1362 which is responsible to verify a specific PIN.
1363
1364 <pin>: string of PIN chars.
1365 <newpin>: string of PIN chars required if requested PIN is
1366 SIM PUK
1367 */
1368
1369 GLOBAL T_ACI_RETURN sAT_PercentPVRF( T_ACI_CMD_SRC srcId,
1370 T_ACI_PVRF_TYPE type,
1371 CHAR * pin,
1372 CHAR * newpin )
1373 {
1374 T_SIM_SET_PRM * pSIMSetPrm; /* points to SIM parameter set */
1375 T_ACI_RETURN retCd; /* holds return code */
1376
1377 TRACE_FUNCTION ("sAT_PercentPVRF()");
1378
1379 /*
1380 *-------------------------------------------------------------------
1381 * check command source
1382 *-------------------------------------------------------------------
1383 */
1384 if(!cmh_IsVldCmdSrc (srcId))
1385 {
1386 return( AT_FAIL );
1387 }
1388
1389 pSIMSetPrm = &simShrdPrm.setPrm[srcId];
1390
1391 /*
1392 *-------------------------------------------------------------------
1393 * check entity status
1394 *-------------------------------------------------------------------
1395 */
1396 if( simEntStat.curCmd NEQ AT_CMD_NONE )
1397
1398 return( AT_BUSY );
1399
1400 /*
1401 *-------------------------------------------------------------------
1402 * check for PIN type
1403 *-------------------------------------------------------------------
1404 */
1405 switch( type )
1406 {
1407 case( PVRF_TYPE_Pin1 ):
1408 case( PVRF_TYPE_Pin2 ):
1409 /*
1410 *---------------------------------------------------------------
1411 * PIN 1/2 verify is required
1412 *---------------------------------------------------------------
1413 */
1414 if( pin EQ NULL OR
1415 strlen( pin ) < MIN_PIN_LEN OR
1416 strlen( pin ) > PIN_LEN )
1417 {
1418 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1419 return( AT_FAIL );
1420 }
1421
1422 cmhSIM_FillInPIN ( pin, pSIMSetPrm -> curPIN, PIN_LEN );
1423 pSIMSetPrm -> PINType = (type EQ PVRF_TYPE_Pin1)?
1424 PHASE_2_PIN_1:PHASE_2_PIN_2;
1425 simEntStat.curCmd = AT_CMD_PVRF;
1426 simShrdPrm.owner = (T_OWN)srcId;
1427 simEntStat.entOwn = srcId;
1428
1429 if( psaSIM_VerifyPIN() < 0 ) /* verify PIN */
1430 {
1431 TRACE_EVENT( "FATAL RETURN psaSIM in %%PVRF" );
1432 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Internal );
1433 return( AT_FAIL );
1434 }
1435
1436 retCd = AT_EXCT;
1437 break;
1438
1439 case( PVRF_TYPE_Puk1 ):
1440 case( PVRF_TYPE_Puk2 ):
1441 /*
1442 *---------------------------------------------------------------
1443 * PUK 1/2 verify is required
1444 *---------------------------------------------------------------
1445 */
1446 if( pin EQ NULL OR
1447 newpin EQ NULL OR
1448 strlen( pin ) NEQ PUK_LEN OR
1449 strlen( newpin ) < MIN_PIN_LEN OR
1450 strlen( newpin ) > PIN_LEN )
1451 {
1452 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1453 return( AT_FAIL );
1454 }
1455
1456 cmhSIM_FillInPIN ( pin, pSIMSetPrm -> unblkKey, PUK_LEN );
1457 cmhSIM_FillInPIN ( newpin, pSIMSetPrm -> curPIN, PIN_LEN );
1458 pSIMSetPrm -> PINType = (type EQ PVRF_TYPE_Puk1)?
1459 PHASE_2_PUK_1:PHASE_2_PUK_2;
1460 simEntStat.curCmd = AT_CMD_PVRF;
1461 simShrdPrm.owner = (T_OWN)srcId;
1462 simEntStat.entOwn = srcId;
1463
1464 if( psaSIM_UnblockCard( ) < 0 ) /* verify PIN */
1465 {
1466 TRACE_EVENT( "FATAL RETURN psaSIM in %%PVRF" );
1467 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Internal );
1468 return( AT_FAIL );
1469 }
1470
1471 retCd = AT_EXCT;
1472 break;
1473
1474 default:
1475 /*
1476 *---------------------------------------------------------------
1477 * unexpected PIN state
1478 *---------------------------------------------------------------
1479 */
1480 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_DataCorrupt );
1481 return( AT_FAIL );
1482 }
1483
1484 /*
1485 *-------------------------------------------------------------------
1486 * log command execution
1487 *-------------------------------------------------------------------
1488 */
1489 #if defined SMI OR defined MFW OR defined FF_MMI_RIV
1490 {
1491 T_ACI_CLOG cmdLog; /* holds logging info */
1492
1493 cmdLog.atCmd = AT_CMD_PVRF;
1494 cmdLog.cmdType = CLOG_TYPE_Set;
1495 cmdLog.retCode = retCd;
1496 cmdLog.cId = ACI_NumParmNotPresent;
1497 cmdLog.sId = ACI_NumParmNotPresent;
1498 cmdLog.cmdPrm.sPVRF.srcId = srcId;
1499 cmdLog.cmdPrm.sPVRF.type = type;
1500 cmdLog.cmdPrm.sPVRF.pin = pin;
1501 cmdLog.cmdPrm.sPVRF.newpin = newpin;
1502
1503 rAT_PercentCLOG( &cmdLog );
1504 }
1505 #endif
1506
1507 return( retCd );
1508 }
1509
1510
1511 /*
1512 +-------------------------------------------------------------------+
1513 | PROJECT : GSM-PS (6147) MODULE : CMH_SIMS |
1514 | ROUTINE : sAT_PercentCPRI |
1515 +-------------------------------------------------------------------+
1516
1517 PURPOSE : set the CPRI mode for displaying/not displaying
1518 ciphering indications
1519 */
1520
1521 GLOBAL T_ACI_RETURN sAT_PercentCPRI( T_ACI_CMD_SRC srcId,
1522 UBYTE mode )
1523 {
1524 TRACE_FUNCTION ("sAT_PercentCPRI()");
1525
1526 if( !cmh_IsVldCmdSrc( srcId ) )
1527 {
1528 return( AT_FAIL );
1529 }
1530
1531 if (simShrdPrm.ciSIMEnabled NEQ FALSE) /* Since this function is used by MMI,it just returns AT_CMPL */
1532 {
1533 return( AT_CMPL ); /* If CPRI is enabled in the SIM,it just returns AT_CMPL */
1534 }
1535
1536 else
1537 {
1538 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotAllow );
1539 return( AT_FAIL );
1540 }
1541 }
1542
1543 #ifdef FF_DUAL_SIM
1544 /*
1545 +-------------------------------------------------------------------+
1546 | PROJECT : GSM-PS (6147) MODULE : CMH_SIMS |
1547 | ROUTINE : sAT_PercentSIM |
1548 +-------------------------------------------------------------------+
1549
1550 PURPOSE : Select the SIM to be powered on
1551 */
1552
1553 GLOBAL T_ACI_RETURN sAT_PercentSIM( T_ACI_CMD_SRC srcId,
1554 UBYTE sim_num )
1555 {
1556 T_SIM_SET_PRM * pSIMSetPrm; /* points to SIM parameter set */
1557
1558 TRACE_FUNCTION ("sAT_PercentSIM()");
1559
1560 if( !cmh_IsVldCmdSrc( srcId ) )
1561 {
1562 return( AT_FAIL );
1563 }
1564
1565 pSIMSetPrm = &simShrdPrm.setPrm[srcId];
1566
1567 if( simEntStat.curCmd NEQ AT_CMD_NONE )
1568 {
1569 TRACE_EVENT("Entity SIM is busy: cannot proceed command...");
1570 return( AT_BUSY );
1571 }
1572
1573 if(CFUNfun EQ CFUN_FUN_Full)
1574 {
1575 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotAllow );
1576 return( AT_FAIL );
1577 }
1578
1579 if(sim_num < SIM_NUM_0 OR sim_num > SIM_NUM_2)
1580 {
1581 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotAllow );
1582 return( AT_FAIL );
1583 }
1584
1585 pSIMSetPrm->SIM_Selected = sim_num;
1586
1587 simEntStat.curCmd = AT_CMD_SIM;
1588 simShrdPrm.owner = (T_OWN)srcId;
1589 simEntStat.entOwn = srcId;
1590
1591 if( psaSIM_SelectSIM() < 0 ) /* select SIM card */
1592 {
1593 TRACE_EVENT( "FATAL RETURN psaSIM in %SIM" );
1594 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Internal );
1595 return( AT_FAIL );
1596 }
1597 return(AT_EXCT);
1598 }
1599 #endif /*FF_DUAL_SIM*/
1600
1601 #ifdef FF_CPHS_REL4
1602 /*
1603 +-------------------------------------------------------------------+
1604 | PROJECT : GSM-PS (6147) MODULE : CMH_SIMS |
1605 | ROUTINE : sAT_PercentCFIS |
1606 +-------------------------------------------------------------------+
1607
1608 PURPOSE : Set/Read the CFU staus in EF-CFIS file present in SIM
1609 */
1610
1611 GLOBAL T_ACI_RETURN sAT_PercentCFIS( T_ACI_CMD_SRC srcId,
1612 T_ACI_CFIS_MOD mode,
1613 UBYTE index,
1614 UBYTE mspId,
1615 UBYTE cfuStat,
1616 CHAR* number,
1617 T_ACI_TOA* type,
1618 UBYTE cc2_id)
1619 {
1620
1621 TRACE_FUNCTION ("sAT_PercentCFIS()");
1622
1623 /*
1624 *-------------------------------------------------------------------
1625 * check command source
1626 *-------------------------------------------------------------------
1627 */
1628 if(!cmh_IsVldCmdSrc (srcId))
1629 {
1630 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1631 return( AT_FAIL );
1632 }
1633
1634 /*
1635 *-------------------------------------------------------------------
1636 * check entity status
1637 *-------------------------------------------------------------------
1638 */
1639 if( simEntStat.curCmd NEQ AT_CMD_NONE )
1640 return( AT_BUSY );
1641
1642 /*
1643 *-------------------------------------------------------------------
1644 * process parameter <mode>
1645 *-------------------------------------------------------------------
1646 */
1647 switch( mode )
1648 {
1649 case ( CFIS_MOD_Write ):
1650 case ( CFIS_MOD_Delete ):
1651 return cmhSIM_WrCfis (srcId,mode,index,mspId,cfuStat,number,
1652 type,cc2_id);
1653 default:
1654 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1655 return( AT_FAIL );
1656 }
1657 }
1658 /*
1659 +-------------------------------------------------------------------+
1660 | PROJECT : GSM-PS (6147) MODULE : CMH_SIMS |
1661 | ROUTINE : sAT_PercentMWIS |
1662 +-------------------------------------------------------------------+
1663
1664 PURPOSE :Set the Message Waiting status in EF-MWIS file in SIM
1665 */
1666
1667 GLOBAL T_ACI_RETURN sAT_PercentMWIS( T_ACI_CMD_SRC srcId,
1668 T_ACI_MWIS_MOD mode,
1669 UBYTE mspId,
1670 T_ACI_MWIS_MWI *mwis)
1671 {
1672
1673 TRACE_FUNCTION ("sAT_PercentMWIS()");
1674
1675 /*
1676 *-------------------------------------------------------------------
1677 * check command source
1678 *-------------------------------------------------------------------
1679 */
1680 if(!cmh_IsVldCmdSrc (srcId))
1681 {
1682 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1683 return( AT_FAIL );
1684 }
1685
1686 /*
1687 *-------------------------------------------------------------------
1688 * check entity status
1689 *-------------------------------------------------------------------
1690 */
1691 if( simEntStat.curCmd NEQ AT_CMD_NONE )
1692 return( AT_BUSY );
1693
1694 /*
1695 *-------------------------------------------------------------------
1696 * process parameter <mode>
1697 *-------------------------------------------------------------------
1698 */
1699 switch( mode )
1700 {
1701 case ( MWIS_MOD_Write ):
1702 case ( MWIS_MOD_Delete ):
1703 return cmhSIM_WrMwis (srcId,mode,mspId,mwis);
1704 break;
1705 default:
1706 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1707 return( AT_FAIL );
1708 }
1709 }
1710 /*
1711 +-------------------------------------------------------------------+
1712 | PROJECT : GSM-PS (6147) MODULE : CMH_SIMS |
1713 | ROUTINE : sAT_PercentMBDN |
1714 +-------------------------------------------------------------------+
1715
1716 PURPOSE : Set/Read the Mailbox Numbers in EF-MBDN file present in SIM
1717 */
1718
1719 GLOBAL T_ACI_RETURN sAT_PercentMBDN( T_ACI_CMD_SRC srcId,
1720 T_ACI_MBN_MODE mode,
1721 UBYTE index,
1722 CHAR* number,
1723 T_ACI_TOA* type,
1724 UBYTE cc2_id,
1725 T_ACI_PB_TEXT *text)
1726 {
1727
1728 TRACE_FUNCTION ("sAT_PercentMBDN()");
1729
1730 #ifndef NO_ASCIIZ
1731 /* convert Text */
1732 if ( text NEQ NULL )
1733 {
1734 UBYTE tmpBuf[MAX_ALPHA_LEN];
1735 USHORT len;
1736 text->cs = CS_Sim;
1737 cmh_cvtToDefGsm ( (CHAR*)text->data, (CHAR*)tmpBuf, &len );
1738 text->len = (UBYTE)len;
1739 memcpy ( text->data, tmpBuf, text->len );
1740 }
1741 #endif /* #ifndef NO_ASCIIZ */
1742 /*
1743 *-------------------------------------------------------------------
1744 * check command source
1745 *-------------------------------------------------------------------
1746 */
1747 if(!cmh_IsVldCmdSrc (srcId))
1748 {
1749 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1750 return( AT_FAIL );
1751 }
1752
1753 /*
1754 *-------------------------------------------------------------------
1755 * check entity status
1756 *-------------------------------------------------------------------
1757 */
1758 if( simEntStat.curCmd NEQ AT_CMD_NONE )
1759 return( AT_BUSY );
1760
1761 /*
1762 *-------------------------------------------------------------------
1763 * process parameter <mode>
1764 *-------------------------------------------------------------------
1765 */
1766 switch( mode )
1767 {
1768 case ( MBN_Mode_Write ):
1769 if (number EQ NULL)
1770 {
1771 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1772 return (AT_FAIL);
1773 }
1774 /* lint-fallthrough */
1775 case ( MBN_Mode_Delete ):
1776 return cmhSIM_WrMbdn (srcId, mode, index, number,
1777 type, cc2_id, text);
1778 default:
1779 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1780 return( AT_FAIL );
1781 }
1782 }
1783 #endif /* FF_CPHS_REL4 */
1784
1785
1786 /* Implements Measure 50 */
1787 /*
1788 +------------------------------------------------------------------------------
1789 | Function : cmhSIM_analyze_SIMLOCK_STATUS
1790 +------------------------------------------------------------------------------
1791 | Description : This Function will analyze the SIMLOCK STATUS, passed as an
1792 | argument to this function and accordingly returns AT_CMPL
1793 | AT_FAIL
1794 |
1795 | Parameters : status - SIMLOCK STATUS that needs to be analyzed
1796 |
1797 | Return : ACI Return Codes (Either AT_CMPL or AT_FAIL)
1798 +------------------------------------------------------------------------------
1799 */
1800
1801 LOCAL T_ACI_RETURN cmhSIM_analyze_SIMLOCK_STATUS( T_SIMLOCK_STATUS status )
1802 {
1803 TRACE_FUNCTION ( "cmhSIM_analyze_SIMLOCK_STATUS()" );
1804
1805 switch ( status )
1806 {
1807 case SIMLOCK_ENABLED:
1808 case SIMLOCK_DISABLED:
1809 /* success */
1810 return AT_CMPL;
1811
1812 case SIMLOCK_BLOCKED: /* password tried too many times, phone blocked */
1813 ACI_ERR_DESC(ACI_ERR_CLASS_Cme, CME_ERR_PhoneFail);
1814 return AT_FAIL;
1815
1816 case SIMLOCK_LOCKED: /* password wrong */
1817 ACI_ERR_DESC(ACI_ERR_CLASS_Cme, CME_ERR_WrongPasswd);
1818 return AT_FAIL;
1819
1820 default: /* other error */
1821 ACI_ERR_DESC(ACI_ERR_CLASS_Cme, CME_ERR_Unknown);
1822 return AT_FAIL;
1823 }
1824 }
1825
1826 /* Implements Measure 40 */
1827 /*
1828 +------------------------------------------------------------------------------
1829 | Function : sAT_Plus_CAMM_CACM
1830 +------------------------------------------------------------------------------
1831 | Description : This is the functional counterpart to the +CACM or +CAMM
1832 | AT commands.
1833 |
1834 | Parameters : at_cmd_id - AT command identifier
1835 | srcId - AT command source identifier
1836 | value_type - AOC_ACM or AOC_ACMMAX
1837 | value - NULL in case of +CACM
1838 | acmmax in case of +CAMM
1839 | pwd - password
1840 |
1841 | Return : ACI functional return codes
1842 +------------------------------------------------------------------------------
1843 */
1844
1845 LOCAL T_ACI_RETURN sAT_Plus_CAMM_CACM ( T_ACI_AT_CMD at_cmd_id,
1846 T_ACI_CMD_SRC srcId,
1847 UBYTE value_type,
1848 void *value,
1849 UBYTE *pwd )
1850 {
1851 T_ACI_RETURN ret = AT_FAIL;
1852
1853 TRACE_FUNCTION ( "sAT_Plus_CAMM_CACM()" );
1854 /*
1855 *-------------------------------------------------------------------
1856 * check command source
1857 *-------------------------------------------------------------------
1858 */
1859 if(!cmh_IsVldCmdSrc (srcId))
1860 {
1861 return( AT_FAIL );
1862 }
1863
1864 /*
1865 *-------------------------------------------------------------------
1866 * send parameters to advice of charge module.
1867 *-------------------------------------------------------------------
1868 */
1869 simEntStat.curCmd = at_cmd_id;
1870 simShrdPrm.owner = (T_OWN)srcId;
1871 simEntStat.entOwn = srcId;
1872 ret = aoc_set_values ( srcId,
1873 value_type,
1874 value,
1875 pwd );
1876
1877 /*
1878 *-------------------------------------------------------------------
1879 * Check return value of aoc_set_values() equal to AT_FAIL,
1880 * resets simEntStat.curcmd and simEntStat.entown.
1881 *-------------------------------------------------------------------
1882 */
1883
1884 if( ret EQ AT_FAIL )
1885 {
1886 simEntStat.curCmd = AT_CMD_NONE;
1887 simShrdPrm.owner = (T_OWN)srcId;
1888 simEntStat.entOwn = srcId;
1889 }
1890
1891 return( ret );
1892
1893 }
1894
1895
1896
1897
1898 /*==== EOF ========================================================*/