comparison g23m-aci/aci/cmh_gmms.c @ 0:75a11d740a02

initial import of gsm-fw from freecalypso-sw rev 1033:5ab737ac3ad7
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 09 Jun 2016 00:02:41 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:75a11d740a02
1 /*
2 +-----------------------------------------------------------------------------
3 | Project :
4 | Modul :
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 implements the set fuinctions related to the
18 | protocol stack adapter for GPRS mobility management ( GMM ).
19 +-----------------------------------------------------------------------------
20 */
21
22 #if defined (GPRS) && defined (DTI)
23
24 #ifndef CMH_GMMS_C
25 #define CMH_GMMS_C
26 #endif
27
28 #include "aci_all.h"
29
30 /*==== INCLUDES ===================================================*/
31 #include "dti.h" /* functionality of the dti library */
32 #include "aci_cmh.h"
33
34 #include "dti_conn_mng.h"
35
36 #include "gaci.h"
37 #include "gaci_cmh.h"
38 #include "psa.h"
39 #include "psa_gmm.h"
40 #include "psa_sm.h"
41 #ifdef FAX_AND_DATA
42 /* #include "aci_fd.h" */
43 #endif
44 #include "phb.h"
45 #include "cmh.h"
46 #include "cmh_gmm.h"
47 #include "cmh_sm.h"
48 #include "psa_sim.h"
49 #include "cmh_sim.h"
50
51 /*==== CONSTANTS ==================================================*/
52
53 /*==== EXPORT =====================================================*/
54
55 /*==== VARIABLES ==================================================*/
56
57 /*==== FUNCTIONS ==================================================*/
58 GLOBAL T_ACI_RETURN sAT_PlusCGATT ( T_ACI_CMD_SRC srcId, T_CGATT_STATE state );
59 GLOBAL T_ACI_RETURN sAT_PlusCGCLASS ( T_ACI_CMD_SRC srcId, T_CGCLASS_CLASS m_class );
60
61 GLOBAL T_ACI_RETURN sAT_PercentCGAATT ( T_ACI_CMD_SRC srcId, T_CGAATT_ATTACH_MODE att_m, T_CGAATT_DETACH_MODE det_m);
62 GLOBAL T_ACI_RETURN sAT_PercentCGCLASS ( T_ACI_CMD_SRC srcId, T_PERCENT_CGCLASS m_class );
63
64 /*
65 +--------------------------------------------------------------------+
66 | PROJECT : GPRS (8441) MODULE : CMH_GMMQ |
67 | STATE : finished ROUTINE : sAT_PlusCGATT |
68 +--------------------------------------------------------------------+
69
70 PURPOSE : This is the functional counterpart to the +CGATT= GPRS AT
71 command which sets current GACI service state.
72
73 Fails if illegal new state requested. Returns complete if
74 already in existing state, otherwise signals GACI SEM to
75 attach or detach GACI as appropriate.
76
77 (Un)succesful completion of attach/detach is signalled by
78 means of a GACI callback.
79 */
80
81 GLOBAL T_ACI_RETURN sAT_PlusCGATT ( T_ACI_CMD_SRC srcId, T_CGATT_STATE state )
82 {
83 T_ACI_RETURN retCd; /* holds return code */
84
85 TRACE_FUNCTION ("sAT_PlusCGATT()");
86
87 /*
88 *-------------------------------------------------------------------
89 * check command source
90 *-------------------------------------------------------------------
91 */
92 if(!cmh_IsVldCmdSrc (srcId))
93 {
94 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
95 return( AT_FAIL );
96 }
97
98 /*
99 *-------------------------------------------------------------------
100 * check entity status
101 *-------------------------------------------------------------------
102 */
103 if( gmmEntStat.curCmd NEQ AT_CMD_NONE )
104
105 return( AT_BUSY );
106
107 /*
108 *-------------------------------------------------------------------
109 * check cfun status - avoid activating radio in case of flight mode (+CFUN=4)
110 *-------------------------------------------------------------------
111 */
112 if (CFUNfun EQ CFUN_FUN_Disable_TX_RX_RF)
113 {
114 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotAllow);
115 return( AT_FAIL );
116 }
117
118
119 /*
120 *-------------------------------------------------------------------
121 * check first command argument
122 *-------------------------------------------------------------------
123 */
124 if ( state < CGATT_STATE_OMITTED OR state >= CGATT_STATE_INVALID )
125 {
126 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
127 return( AT_FAIL );
128 }
129 if (pb_get_fdn_mode () EQ FDN_ENABLE AND state EQ CGATT_STATE_ATTACHED)
130 {
131 if (pb_check_fdn (0, (const UBYTE *)"*99#") NEQ PHB_OK)
132 {
133 TRACE_EVENT("sAT_PlusCGATT: Entry not found in FDN, GPRS not allowed.");
134 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotAllow);
135 return (AT_FAIL);
136 }
137 TRACE_EVENT("sAT_PlusCGATT: Entry found in FDN, GPRS allowed.");
138 }
139
140 /*
141 *-------------------------------------------------------------------
142 * process parameter
143 *-------------------------------------------------------------------
144 */
145 switch ( state )
146 {
147 case CGATT_STATE_OMITTED:
148 switch ( cmhGMM_Get_state() )
149 {
150 case AS_ATTACHED:
151 case AS_SUSPENTED:
152 state = CGATT_STATE_DETACHED;
153 break;
154 case AS_DETACHED:
155 state = CGATT_STATE_ATTACHED;
156 break;
157 case AS_ATTACHING:
158 case AS_DETACHING:
159 return AT_BUSY;
160 case AS_INVALID_STATE:
161 case AS_MOBILE_OFF:
162 default:
163 return AT_FAIL;
164 }
165
166 retCd = sAT_PlusCGATT(srcId, state);
167 break;
168 case CGATT_STATE_ATTACHED:
169 /*
170 * A class CC mobile can not attach GPRS
171 */
172 if ( gmmShrdPrm.mobile_class EQ GMMREG_CLASS_CC )
173 {
174 return AT_FAIL;
175 }
176
177 switch(gmmShrdPrm.current_attach_type)
178 {
179 case GMMREG_AT_GPRS:
180 case GMMREG_AT_COMB:
181 TRACE_EVENT("Already attached, attach not necessary.");
182 retCd = AT_CMPL;
183 break;
184 case GMMREG_AT_IMSI:
185 TRACE_EVENT("GSM already attached, initiating combined attach.");
186 gmmEntStat.curCmd = AT_CMD_CGATT;
187 gmmEntStat.entOwn = srcId;
188 gmmShrdPrm.last_attach_type = gmmShrdPrm.current_attach_type;
189 gmmShrdPrm.requested_attach_type = GMMREG_AT_COMB;
190 gmmShrdPrm.requested_mobile_class = gmmShrdPrm.mobile_class;
191
192 psaGMM_Attach( gmmShrdPrm.requested_mobile_class,
193 gmmShrdPrm.requested_attach_type,
194 gmmShrdPrm.service_mode);
195
196 retCd = AT_EXCT;
197 break;
198 case ATTACH_TYPE_DETACHED:
199 TRACE_EVENT("Mobile is detached, initiating GPRS attach.");
200 gmmEntStat.curCmd = AT_CMD_CGATT;
201 gmmEntStat.entOwn = srcId;
202 gmmShrdPrm.last_attach_type = gmmShrdPrm.current_attach_type;
203 gmmShrdPrm.requested_attach_type = GMMREG_AT_GPRS;
204 gmmShrdPrm.requested_mobile_class = gmmShrdPrm.mobile_class;
205
206 psaGMM_Attach( gmmShrdPrm.requested_mobile_class,
207 gmmShrdPrm.requested_attach_type,
208 gmmShrdPrm.service_mode);
209
210 retCd = AT_EXCT;
211 break;
212 default:
213 retCd = AT_FAIL;
214 break;
215 }
216 break;
217 case CGATT_STATE_DETACHED:
218 switch ( cmhGMM_Get_state() )
219 {
220 case AS_DETACHED:
221 retCd = AT_CMPL;
222 break;
223 case AS_ATTACHING:
224 case AS_DETACHING:
225 retCd = AT_BUSY;
226 break;
227 default:
228 gmmEntStat.curCmd = AT_CMD_CGATT;
229 gmmEntStat.entOwn = srcId;
230
231 psaGMM_Detach( GMMREG_DT_GPRS );
232
233 retCd = AT_EXCT;
234 break;
235 }
236 break;
237 case CGATT_STATE_INVALID:
238 default:
239 retCd = AT_FAIL;
240 break;
241 }
242
243 return retCd;
244 }
245
246 /*
247 +--------------------------------------------------------------------+
248 | PROJECT : GPRS (8441) MODULE : CMH_GMMQ |
249 | STATE : finished ROUTINE : sAT_PlusCGCLASS |
250 +--------------------------------------------------------------------+
251
252 PURPOSE : This is the functional counterpart to the +CGCLASS= GPRS AT
253 command which sets the specified GPRS mobile class.
254 */
255
256 GLOBAL T_ACI_RETURN sAT_PlusCGCLASS ( T_ACI_CMD_SRC srcId, T_CGCLASS_CLASS m_class )
257 {
258 USHORT mobile_class;
259
260 TRACE_FUNCTION ("sAT_PlusCGCLASS()");
261
262 /*
263 *-------------------------------------------------------------------
264 * check command source
265 *-------------------------------------------------------------------
266 */
267 if(!cmh_IsVldCmdSrc (srcId))
268 {
269 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
270 return( AT_FAIL );
271 }
272
273 /*
274 *-------------------------------------------------------------------
275 * check entity status
276 *-------------------------------------------------------------------
277 */
278 if( gmmEntStat.curCmd NEQ AT_CMD_NONE )
279
280 return( AT_BUSY );
281
282 if (pb_get_fdn_mode () EQ FDN_ENABLE AND m_class NEQ CGCLASS_CLASS_CC)
283 {
284 if (pb_check_fdn (0, (const UBYTE *)"*99#") NEQ PHB_OK)
285 {
286 TRACE_EVENT("sAT_PlusCGCLASS: Entry not found in FDN, GPRS not allowed.");
287 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotAllow);
288 return (AT_FAIL);
289 }
290 TRACE_EVENT("sAT_PlusCGCLASS: Entry found in FDN, GPRS allowed.");
291 }
292
293
294 /*
295 *-------------------------------------------------------------------
296 * process parameter
297 *-------------------------------------------------------------------
298 */
299 switch ( m_class )
300 {
301 case CGCLASS_CLASS_A: /* mobile class A (highest) */
302 mobile_class = GMMREG_CLASS_A;
303 break;
304 case CGCLASS_CLASS_B: /* mobile class B (if necessary consider NET III) */
305 mobile_class = GMMREG_CLASS_BG;
306 break;
307 case CGCLASS_CLASS_CG: /* mobile class CG (GPRS only mode) */
308 mobile_class = GMMREG_CLASS_CG;
309 break;
310 case CGCLASS_CLASS_CC: /* mobile class CC (circuit switched only mode - lowest) */
311 mobile_class = GMMREG_CLASS_CC;
312 break;
313 case CGCLASS_CLASS_OMITTED:
314 mobile_class = gmmShrdPrm.mobile_class;
315 break;
316 case CGCLASS_CLASS_MAX:
317 default: /*bad user command */
318 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
319 return AT_FAIL;
320 }
321
322 gmmEntStat.entOwn = srcId;
323 gmmEntStat.curCmd = AT_CMD_CGCLASS;
324
325 return cmhGMM_attach((UBYTE) mobile_class );
326 }
327
328
329 /*
330 +--------------------------------------------------------------------+
331 | PROJECT : GPRS (8441) MODULE : CMH_GMMQ |
332 | STATE : finished ROUTINE : sAT_PercentCGAATT |
333 +--------------------------------------------------------------------+
334
335 PURPOSE : This command set the mode of automatic attach / detach.
336 */
337
338 GLOBAL T_ACI_RETURN sAT_PercentCGAATT ( T_ACI_CMD_SRC srcId, T_CGAATT_ATTACH_MODE att_m, T_CGAATT_DETACH_MODE det_m )
339 {
340
341 TRACE_FUNCTION ("sAT_PercentCGAATT()");
342
343 /*
344 *-------------------------------------------------------------------
345 * check entity status
346 *-------------------------------------------------------------------
347 */
348 if( gmmEntStat.curCmd NEQ AT_CMD_NONE )
349
350 return( AT_BUSY );
351
352 /*
353 *-------------------------------------------------------------------
354 * check first command argument
355 *-------------------------------------------------------------------
356 */
357 if ( att_m < CGAATT_ATTACH_MODE_OMITTED OR att_m >= CGAATT_ATTACH_MODE_INVALID )
358 {
359 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
360 return( AT_FAIL );
361 }
362
363 if ( det_m < CGAATT_DETACH_MODE_OMITTED OR det_m >= CGAATT_DETACH_MODE_INVALID )
364 {
365 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
366 return( AT_FAIL );
367 }
368
369 if ( att_m EQ CGAATT_ATTACH_MODE_OMITTED )
370 att_m = automatic_attach_mode;
371
372 if ( det_m EQ CGAATT_DETACH_MODE_OMITTED )
373 det_m = automatic_detach_mode;
374
375 /*
376 *-------------------------------------------------------------------
377 * set parameter
378 *-------------------------------------------------------------------
379 */
380
381 automatic_attach_mode = att_m;
382 automatic_detach_mode = det_m;
383
384 return AT_CMPL;
385 }
386
387 /*
388 +--------------------------------------------------------------------+
389 | PROJECT : GPRS (8441) MODULE : CMH_GMMQ |
390 | STATE : finished ROUTINE : sAT_PercentCGMM |
391 +--------------------------------------------------------------------+
392
393 PURPOSE : This command configurates GMM.
394 CIPHER_ON = 1 / OFF = 0
395 TLLI_TWICE = 1 / STANDARD = 0
396 */
397
398 GLOBAL T_ACI_RETURN sAT_PercentCGMM ( T_ACI_CMD_SRC srcId, UBYTE cipher_on,
399 UBYTE tlli_handling )
400 {
401 TRACE_FUNCTION ("sAT_PercentCGMM()");
402
403 /*
404 *-------------------------------------------------------------------
405 * check entity status
406 *-------------------------------------------------------------------
407 */
408 if( gmmEntStat.curCmd NEQ AT_CMD_NONE )
409
410 return( AT_BUSY );
411
412 /*
413 *-------------------------------------------------------------------
414 * check command arguments
415 *-------------------------------------------------------------------
416 */
417 if ( cipher_on NEQ 1 /*GMMREG_CIPHER_ON*/
418 AND cipher_on NEQ 0 /*GMMREG_CIPHER_OFF*/ )
419 {
420 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
421 return( AT_FAIL );
422 }
423
424 if ( tlli_handling NEQ GMMREG_TLLI_STANDARD
425 AND tlli_handling NEQ GMMREG_TLLI_TWICE )
426 {
427 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
428 return( AT_FAIL );
429 }
430
431 /* default value for tlli_handling */
432 if ( tlli_handling EQ NOT_PRESENT_8BIT )
433 tlli_handling = GMMREG_TLLI_STANDARD;
434
435 psaGMM_Config_req( cipher_on, tlli_handling );
436 return AT_CMPL;
437 }
438
439 /*
440 +--------------------------------------------------------------------+
441 | PROJECT : GPRS (8441) MODULE : CMH_GMMQ |
442 | STATE : finished ROUTINE : sAT_PlusCGCLASS |
443 +--------------------------------------------------------------------+
444
445 PURPOSE : This is the functional counterpart to the %CGCLASS= GPRS AT
446 command which sets the specified GPRS mobile class.
447 */
448
449 GLOBAL T_ACI_RETURN sAT_PercentCGCLASS ( T_ACI_CMD_SRC srcId, T_PERCENT_CGCLASS m_class )
450 {
451 USHORT mobile_class;
452
453 TRACE_FUNCTION ("sAT_PercentCGCLASS()");
454
455 /*
456 *-------------------------------------------------------------------
457 * check command source
458 *-------------------------------------------------------------------
459 */
460 if(!cmh_IsVldCmdSrc (srcId))
461 {
462 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
463 return( AT_FAIL );
464 }
465
466 /*
467 *-------------------------------------------------------------------
468 * check entity status
469 *-------------------------------------------------------------------
470 */
471 if( gmmEntStat.curCmd NEQ AT_CMD_NONE )
472
473 return( AT_BUSY );
474
475 if (pb_get_fdn_mode () EQ FDN_ENABLE AND m_class NEQ PERCENT_CGCLASS_CC)
476 {
477 if (pb_check_fdn (0, (const UBYTE *)"*99#") NEQ PHB_OK)
478 {
479 TRACE_EVENT("sAT_PercentCGCLASS: Entry not found in FDN, GPRS not allowed.");
480 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotAllow);
481 return (AT_FAIL);
482 }
483 TRACE_EVENT("sAT_PercentCGCLASS: Entry found in FDN, GPRS allowed.");
484 }
485
486 /*
487 *-------------------------------------------------------------------
488 * process parameter
489 *-------------------------------------------------------------------
490 */
491 switch ( m_class )
492 {
493 case PERCENT_CGCLASS_A: /* mobile class A (highest) */
494 mobile_class = GMMREG_CLASS_A;
495 break;
496 case PERCENT_CGCLASS_B: /* mobile class B */
497 mobile_class = GMMREG_CLASS_B;
498 break;
499 case PERCENT_CGCLASS_BG: /* mobile class BG */
500 mobile_class = GMMREG_CLASS_BG;
501 break;
502 case PERCENT_CGCLASS_BC: /* mobile class BC */
503 mobile_class = GMMREG_CLASS_BC;
504 break;
505 case PERCENT_CGCLASS_BX: /* mobile class BX */
506 mobile_class = cmhSM_isContextActive() ? GMMREG_CLASS_BG : GMMREG_CLASS_BC;
507 break;
508 case PERCENT_CGCLASS_CG: /* mobile class CG (GPRS only mode) */
509 mobile_class = GMMREG_CLASS_CG;
510 break;
511 case PERCENT_CGCLASS_CC: /* mobile class CC (circuit switched only mode - lowest) */
512 mobile_class = GMMREG_CLASS_CC;
513 break;
514 case PERCENT_CGCLASS_OMITTED:
515 mobile_class = gmmShrdPrm.mobile_class;
516 break;
517 case PERCENT_CGCLASS_MAX:
518 default: /*bad user command */
519 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
520 return AT_FAIL;
521 }
522
523 gmmEntStat.entOwn = srcId;
524 gmmEntStat.curCmd = AT_CMD_CGCLASS;
525
526 gaciMobileClass.requested = m_class;
527
528 return cmhGMM_attach((UBYTE) mobile_class );
529 }
530
531 #endif /* GPRS */
532 /*==== EOF ========================================================*/