0
|
1 /*
|
|
2 +-----------------------------------------------------------------------------
|
|
3 | Project : GSM-PS (6147)
|
|
4 | Modul : CMH_SATF
|
|
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 defines global functions of the command
|
|
18 | handler.
|
|
19 +-----------------------------------------------------------------------------
|
|
20 */
|
|
21
|
|
22 #ifdef SIM_TOOLKIT
|
|
23
|
|
24 #ifndef CMH_SATF_C
|
|
25 #define CMH_SATF_C
|
|
26 #endif
|
|
27
|
|
28 #define _PACK_DEF_ALPHA /* apply packing for GSM Default Alphabet */
|
|
29
|
|
30 #include "aci_all.h"
|
|
31 /*==== INCLUDES ===================================================*/
|
|
32 #ifdef DTI
|
|
33 #include "dti.h"
|
|
34 #endif /* DTI */
|
|
35
|
|
36 #include "pcm.h"
|
|
37
|
|
38 #include "aci.h"
|
|
39 #include "aci_cmh.h"
|
|
40 #include "ati_cmd.h"
|
|
41 #include "aci_mem.h"
|
|
42
|
|
43 #include "ati_src_sat.h"
|
|
44
|
|
45 #ifdef FAX_AND_DATA
|
|
46 #include "aci_fd.h"
|
|
47 #endif /* FAX_AND_DATA */
|
|
48
|
|
49 #include "phb.h"
|
|
50 #include "ksd.h"
|
|
51 #include "aoc.h"
|
|
52
|
|
53 #include "psa.h"
|
|
54 #include "psa_cc.h"
|
|
55 #include "psa_sat.h"
|
|
56 #include "psa_sim.h"
|
|
57 #include "psa_sms.h"
|
|
58 #include "psa_ss.h"
|
|
59 #include "psa_util.h"
|
|
60 #include "psa_mm.h"
|
|
61
|
|
62 #include "cmh.h"
|
|
63 #include "cmh_ss.h"
|
|
64 #include "cmh_cc.h"
|
|
65 #include "cmh_phb.h"
|
|
66
|
|
67 #ifdef DTI
|
|
68 #include "dti_conn_mng.h"
|
|
69 #include "dti_cntrl_mng.h"
|
|
70 #endif /* DTI */
|
|
71
|
|
72 #include "cmh_sim.h"
|
|
73 #include "cmh_sat.h"
|
|
74 #include "cmh_sms.h"
|
|
75
|
|
76 /* #include "cmh_sat.h" */
|
|
77
|
|
78 #if defined (GPRS) AND defined (DTI)
|
|
79 #include "gaci.h"
|
|
80 #include "gaci_cmh.h"
|
|
81 #include "gaci_srcc.h"
|
|
82 #include "psa_gmm.h"
|
|
83 #include "psa_sm.h"
|
|
84 #include "cmh_sm.h"
|
|
85 #endif
|
|
86
|
|
87
|
|
88 #if defined (FAX_AND_DATA) AND defined (DTI)
|
|
89 #include "psa_ra.h"
|
|
90 #include "cmh_ra.h"
|
|
91 #include "psa_l2r.h"
|
|
92 #include "cmh_l2r.h"
|
|
93 #endif /* FAX_AND_DATA */
|
|
94
|
|
95 #ifdef CO_UDP_IP
|
|
96 #include "wap_aci.h"
|
|
97 #include "psa_tcpip.h"
|
|
98 #endif /* CO_UDP_IP */
|
|
99 #include "rtcdrv.h"
|
|
100
|
|
101 /*==== CONSTANTS ==================================================*/
|
|
102 #define MAX_CBM_REMEMBERED 9
|
|
103
|
|
104 /*==== TYPES ======================================================*/
|
|
105 typedef struct
|
|
106 {
|
|
107 U16 msgIdent;
|
|
108 U16 msgCode;
|
|
109 U8 updtNum;
|
|
110 U8 pageNum;
|
|
111 } T_SAT_CBM_SEND;
|
|
112
|
|
113
|
|
114 /*==== EXPORT =====================================================*/
|
|
115 LOCAL void cmhSAT_CBMInitList();
|
|
116
|
|
117 /*==== VARIABLES ==================================================*/
|
|
118 T_SAT_CBM_SEND *CBMsend = NULL;
|
|
119
|
|
120 EXTERN T_ACI_CUSCFG_PARAMS cuscfgParams;
|
|
121
|
|
122
|
|
123 /*==== FUNCTIONS ==================================================*/
|
|
124
|
|
125 /*
|
|
126 +-------------------------------------------------------------------+
|
|
127 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
128 | ROUTINE : cmhSAT_GetCmdPrfLocation |
|
|
129 +-------------------------------------------------------------------+
|
|
130
|
|
131 PURPOSE : This function will return TRUE if the Command has been found and
|
|
132 FALSE if the Command or the Qualifier is unknown.
|
|
133 The byte location and Mask for the given Stk Cmd are returned in the passed paramters,
|
|
134 a return value of TRUE with Byte Number of 0xFF and Mask of 0xFF indicates an
|
|
135 END_OF_SESSION, which isn't in the Profile
|
|
136 */
|
|
137
|
|
138 LOCAL BOOL cmhSAT_GetCmdPrfLocation (U8 cmd_typ, U8 cmd_qual, U8 *prf_byte_no, U8 *byte_mask)
|
|
139 {
|
|
140 /*
|
|
141 ** Initialise the byte and Mask settings to 0xFF
|
|
142 */
|
|
143 *prf_byte_no = 0xFF;
|
|
144 *byte_mask = 0xFF;
|
|
145
|
|
146 switch (cmd_typ)
|
|
147 {
|
|
148 case SAT_CMD_REFRESH:
|
|
149 *prf_byte_no = 2;
|
|
150 *byte_mask = SAT_TP3_REFRESH;
|
|
151 break;
|
|
152
|
|
153 case SAT_CMD_MORE_TIME:
|
|
154 *prf_byte_no = 2;
|
|
155 *byte_mask = SAT_TP3_MORE_TIME;
|
|
156 break;
|
|
157
|
|
158 case SAT_CMD_POLL_INTERVAL:
|
|
159 *prf_byte_no = 2;
|
|
160 *byte_mask = SAT_TP3_POLL_ITV;
|
|
161 break;
|
|
162
|
|
163 case SAT_CMD_POLL_OFF:
|
|
164 *prf_byte_no = 2;
|
|
165 *byte_mask = SAT_TP3_POLL_OFF;
|
|
166 break;
|
|
167
|
|
168 case SAT_CMD_EVENT_LIST:
|
|
169 *prf_byte_no = 4;
|
|
170 *byte_mask = SAT_TP5_EVENT_LIST;
|
|
171 break;
|
|
172
|
|
173 case SAT_CMD_SETUP_CALL:
|
|
174 *prf_byte_no = 3;
|
|
175 *byte_mask = SAT_TP4_SETUP_CALL;
|
|
176 break;
|
|
177
|
|
178 case SAT_CMD_SEND_SS:
|
|
179 *prf_byte_no = 3;
|
|
180 *byte_mask = SAT_TP4_SEND_SS;
|
|
181 break;
|
|
182
|
|
183 case SAT_CMD_SEND_USSD:
|
|
184 *prf_byte_no = 3;
|
|
185 *byte_mask = SAT_TP4_SEND_USSD;
|
|
186 break;
|
|
187
|
|
188 case SAT_CMD_SEND_SMS:
|
|
189 *prf_byte_no = 3;
|
|
190 *byte_mask = SAT_TP4_SEND_SMS;
|
|
191 break;
|
|
192
|
|
193 case SAT_CMD_SEND_DTMF:
|
|
194 *prf_byte_no = 8;
|
|
195 *byte_mask = SAT_TP9_DTMF_CMD;
|
|
196 break;
|
|
197
|
|
198 case SAT_CMD_LAUNCH_BROWSER:
|
|
199 *prf_byte_no = 8;
|
|
200 *byte_mask = SAT_TP9_LAUNCH_BROWSER;
|
|
201 break;
|
|
202
|
|
203 case SAT_CMD_PLAY_TONE:
|
|
204 *prf_byte_no = 2;
|
|
205 *byte_mask = SAT_TP3_PLAY_TONE;
|
|
206 break;
|
|
207
|
|
208 case SAT_CMD_DISPLAY_TEXT:
|
|
209 *prf_byte_no = 2;
|
|
210 *byte_mask = SAT_TP3_DSPL_TXT;
|
|
211 break;
|
|
212
|
|
213 case SAT_CMD_GET_INKEY:
|
|
214 *prf_byte_no = 2;
|
|
215 *byte_mask = SAT_TP3_GET_INKEY;
|
|
216 break;
|
|
217
|
|
218 case SAT_CMD_GET_INPUT:
|
|
219 *prf_byte_no = 2;
|
|
220 *byte_mask = SAT_TP3_GET_INPUT;
|
|
221 break;
|
|
222
|
|
223 case SAT_CMD_SEL_ITEM:
|
|
224 *prf_byte_no = 3;
|
|
225 *byte_mask = SAT_TP4_SEL_ITEM;
|
|
226 break;
|
|
227
|
|
228 case SAT_CMD_SETUP_MENU:
|
|
229 *prf_byte_no = 3;
|
|
230 *byte_mask = SAT_TP4_SETUP_MENU;
|
|
231 break;
|
|
232
|
|
233 case SAT_CMD_PROV_LOC_INFO:
|
|
234 /*
|
|
235 ** Depends on which type of Local Info is requested
|
|
236 */
|
|
237 switch (cmd_qual)
|
|
238 {
|
|
239 case 0:
|
|
240 case 1:
|
|
241 *prf_byte_no = 3;
|
|
242 *byte_mask = SAT_TP4_PLI_PLMN_IMEI;
|
|
243 break;
|
|
244
|
|
245 case 2:
|
|
246 *prf_byte_no = 3;
|
|
247 *byte_mask = SAT_TP4_PLI_NMR;
|
|
248 break;
|
|
249
|
|
250 case 3:
|
|
251 *prf_byte_no = 7;
|
|
252 *byte_mask = SAT_TP8_PLI_DTT;
|
|
253 break;
|
|
254
|
|
255 case 4:
|
|
256 *prf_byte_no = 8;
|
|
257 *byte_mask = SAT_TP9_PLI_LANG;
|
|
258 break;
|
|
259
|
|
260 case 5:
|
|
261 *prf_byte_no = 8;
|
|
262 *byte_mask = SAT_TP9_PLI_TIMING_ADV;
|
|
263 break;
|
|
264
|
|
265 default:
|
|
266 return (FALSE); /* Command Not recognised */
|
|
267 }
|
|
268 break;
|
|
269
|
|
270 case SAT_CMD_TIMER_MNG:
|
|
271 *prf_byte_no = 7;
|
|
272 *byte_mask = SAT_TP8_TMNG_ST | SAT_TP8_TMNG_VAL;
|
|
273 break;
|
|
274
|
|
275 case SAT_CMD_IDLE_TEXT:
|
|
276 *prf_byte_no = 7;
|
|
277 *byte_mask = SAT_TP8_IDLE_TXT;
|
|
278 break;
|
|
279
|
|
280 case SAT_CMD_RUN_AT:
|
|
281 *prf_byte_no = 7;
|
|
282 *byte_mask = SAT_TP8_AT_CMD;
|
|
283 break;
|
|
284
|
|
285 case SAT_CMD_OPEN_CHANNEL:
|
|
286 *prf_byte_no = 11;
|
|
287 *byte_mask = SAT_TP12_OPEN_CHANNEL;
|
|
288 break;
|
|
289
|
|
290 case SAT_CMD_CLOSE_CHANNEL:
|
|
291 *prf_byte_no = 11;
|
|
292 *byte_mask = SAT_TP12_CLOSE_CHANNEL;
|
|
293 break;
|
|
294
|
|
295 case SAT_CMD_RECEIVE_DATA:
|
|
296 *prf_byte_no = 11;
|
|
297 *byte_mask = SAT_TP12_RECEIVE_DATA;
|
|
298 break;
|
|
299
|
|
300 case SAT_CMD_SEND_DATA:
|
|
301 *prf_byte_no = 11;
|
|
302 *byte_mask = SAT_TP12_SEND_DATA;
|
|
303 break;
|
|
304
|
|
305 case SAT_CMD_GET_CHANNEL_STATUS:
|
|
306 *prf_byte_no = 11;
|
|
307 *byte_mask = SAT_TP12_GET_CHANNEL_STAT;
|
|
308 break;
|
|
309
|
|
310 case SAT_CMD_END_SESSION:
|
|
311 /*
|
|
312 ** Do nothing - The command should be handled by the MMI,
|
|
313 ** but there is no entry in the terminal profile
|
|
314 */
|
|
315 break;
|
|
316
|
|
317 default:
|
|
318 return (FALSE); /* Command Not recognised */
|
|
319 }
|
|
320
|
|
321 return (TRUE);
|
|
322 }
|
|
323
|
|
324 /*
|
|
325 +-------------------------------------------------------------------+
|
|
326 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
327 | ROUTINE : cmhSAT_IsStkCmdForMmi |
|
|
328 +-------------------------------------------------------------------+
|
|
329
|
|
330 PURPOSE : This function will check whether the command should be set to the MMI
|
|
331 and if so will trigger a SATI indication
|
|
332
|
|
333 */
|
|
334
|
|
335 GLOBAL BOOL cmhSAT_IsStkCmdForMmi (U8 cmd_typ, U8 cmd_qual)
|
|
336 {
|
|
337 BOOL is_handled = FALSE;
|
|
338 U8 prf_byte_no;
|
|
339 U8 byte_mask;
|
|
340 int idx;
|
|
341
|
|
342 /*
|
|
343 ** End of Session is handled by the
|
|
344 */
|
|
345 if (cmd_typ EQ SAT_CMD_END_SESSION)
|
|
346 {
|
|
347 is_handled = TRUE;
|
|
348 }
|
|
349 else
|
|
350 {
|
|
351 /*
|
|
352 ** Convert the command type into a Stk Profile Byte Number and Offset
|
|
353 */
|
|
354 if (cmhSAT_GetCmdPrfLocation(cmd_typ, cmd_qual, &prf_byte_no, &byte_mask))
|
|
355 {
|
|
356 /*
|
|
357 ** For each Attached Service
|
|
358 */
|
|
359 for (idx = 0; idx < CMD_SRC_MAX AND (is_handled EQ FALSE); idx++)
|
|
360 {
|
|
361 /*
|
|
362 ** if the Command is handled
|
|
363 */
|
|
364 if (simShrdPrm.setPrm[idx].STKprof[prf_byte_no] & byte_mask)
|
|
365 {
|
|
366 /*
|
|
367 ** Set a handled flag to TRUE
|
|
368 */
|
|
369 is_handled = TRUE;
|
|
370 }
|
|
371 }
|
|
372 }
|
|
373 }
|
|
374
|
|
375 /*
|
|
376 ** if the Command is handled
|
|
377 */
|
|
378 if (is_handled)
|
|
379 {
|
|
380 /*
|
|
381 ** Send the SATI indication
|
|
382 */
|
|
383 cmhSAT_STKCmdInd();
|
|
384 }
|
|
385
|
|
386 /*
|
|
387 ** return the value of the handled flag
|
|
388 */
|
|
389 return (is_handled);
|
|
390 }
|
|
391
|
|
392 /*
|
|
393 +-------------------------------------------------------------------+
|
|
394 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
395 | ROUTINE : cmhSAT_CalCntrlBySIM |
|
|
396 +-------------------------------------------------------------------+
|
|
397
|
|
398 PURPOSE : If call control by SIM is activated and allocated, the
|
|
399 parameters for the call found in the call table are
|
|
400 packed into a SIM envelope command and send to the SIM
|
|
401 for checking.
|
|
402
|
|
403 */
|
|
404
|
|
405 GLOBAL T_ACI_RETURN cmhSAT_CalCntrlBySIM ( SHORT cId )
|
|
406 {
|
|
407 T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
|
|
408
|
|
409 TRACE_FUNCTION("cmhSAT_CalCntrlBySIM()");
|
|
410
|
|
411 /*
|
|
412 *-------------------------------------------------------------------
|
|
413 * check if Call Control is disabled (Cust1 Customisation)
|
|
414 *-------------------------------------------------------------------
|
|
415 */
|
|
416 if(simShrdPrm.setPrm[ctb->calOwn].sat_cc_mode EQ SATCC_CONTROL_BY_SIM_INACTIVE)
|
|
417 {
|
|
418 simShrdPrm.setPrm[ctb->calOwn].sat_cc_mode = SATCC_CONTROL_BY_SIM_ACTIVE;
|
|
419 return( AT_CMPL );
|
|
420 }
|
|
421
|
|
422 /*
|
|
423 *-------------------------------------------------------------------
|
|
424 * check if service is activated and allocated
|
|
425 *-------------------------------------------------------------------
|
|
426 */
|
|
427 if( ! psaSIM_ChkSIMSrvSup( SRV_CalCntrl )) return( AT_CMPL );
|
|
428
|
|
429 /*
|
|
430 *-------------------------------------------------------------------
|
|
431 * check if Call Control customization is enabled... if yes return AT_CMPL
|
|
432 *-------------------------------------------------------------------
|
|
433 */
|
|
434
|
|
435 if(cuscfgParams.MO_Call_Control_SIM EQ CUSCFG_STAT_Enabled)
|
|
436 {
|
|
437 return( AT_CMPL );
|
|
438 }
|
|
439
|
|
440 /*
|
|
441 *-------------------------------------------------------------------
|
|
442 * check if a call control request is in progress
|
|
443 *-------------------------------------------------------------------
|
|
444 */
|
|
445 if( satShrdPrm.SIMCCParm.busy EQ TRUE ) return( AT_BUSY );
|
|
446
|
|
447 /*
|
|
448 *-------------------------------------------------------------------
|
|
449 * get bearer capability parameter for data calls
|
|
450 *-------------------------------------------------------------------
|
|
451 */
|
|
452 /* capability configuration parameters */
|
|
453 if( ctb->BC[0].bearer_serv NEQ BEARER_SERV_NOT_PRES AND
|
|
454 ctb->BC[0].bearer_serv NEQ BEARER_SERV_SPEECH AND
|
|
455 ctb->BC[0].bearer_serv NEQ BEARER_SERV_AUX_SPEECH )
|
|
456 {
|
|
457 /* CCP not supported yet */
|
|
458 /* satShrdPrm.capParm.cId = cId; */
|
|
459 /* psaCC_BCapCode( BCRI_SAT, cId, 0 ); */
|
|
460 }
|
|
461
|
|
462 if( ctb->BC[1].bearer_serv NEQ BEARER_SERV_NOT_PRES AND
|
|
463 ctb->BC[1].bearer_serv NEQ BEARER_SERV_SPEECH AND
|
|
464 ctb->BC[1].bearer_serv NEQ BEARER_SERV_AUX_SPEECH )
|
|
465 {
|
|
466 /* CCP not supported yet */
|
|
467 /* satShrdPrm.capParm.cId = cId; */
|
|
468 /* psaCC_BCapCode( BCRI_SAT, cId, 1 ); */
|
|
469 }
|
|
470
|
|
471 /*
|
|
472 *-------------------------------------------------------------------
|
|
473 * build envelope call control command
|
|
474 *-------------------------------------------------------------------
|
|
475 */
|
|
476 CCD_START;
|
|
477 psaSAT_BuildEnvCC ( cId, NULL, NULL, NULL );
|
|
478
|
|
479 satShrdPrm.SIMCCParm.cId = cId;
|
|
480 satShrdPrm.SIMCCParm.ccAct = CC_ACT_CAL;
|
|
481 satShrdPrm.SIMCCParm.owner = ctb->calOwn;
|
|
482 satShrdPrm.SIMCCParm.busy = TRUE;
|
|
483
|
|
484 satShrdPrm.owner = /*ctb->calOwn;*/ NO_VLD_OWN;
|
|
485
|
|
486 if( psaSAT_STKEnvelope (NULL) < 0 ) /* envelope STK command */
|
|
487 {
|
|
488 TRACE_EVENT( "FATAL RETURN SAT in send env" );
|
|
489 CCD_END;
|
|
490 return( AT_FAIL );
|
|
491 }
|
|
492
|
|
493 CCD_END;
|
|
494 return (AT_EXCT);
|
|
495
|
|
496 }
|
|
497
|
|
498 /*
|
|
499 +-------------------------------------------------------------------+
|
|
500 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
501 | ROUTINE : cmhSAT_SSCntrlBySIM |
|
|
502 +-------------------------------------------------------------------+
|
|
503
|
|
504 PURPOSE : If call control by SIM is activated and allocated, the
|
|
505 the passed supplementary service control string is
|
|
506 packed into a SIM envelope command and send to the SIM
|
|
507 for checking.
|
|
508
|
|
509 */
|
|
510
|
|
511 GLOBAL T_ACI_RETURN cmhSAT_SSCntrlBySIM ( T_CLPTY_PRM *cldPty, UBYTE own )
|
|
512 {
|
|
513 TRACE_FUNCTION("cmhSAT_SSCntrlBySIM()");
|
|
514
|
|
515 /*
|
|
516 *-------------------------------------------------------------------
|
|
517 * check if Call Control is disabled (Cust1 Customisation)
|
|
518 *-------------------------------------------------------------------
|
|
519 */
|
|
520 if(simShrdPrm.setPrm[own].sat_cc_mode EQ SATCC_CONTROL_BY_SIM_INACTIVE)
|
|
521 {
|
|
522 simShrdPrm.setPrm[own].sat_cc_mode = SATCC_CONTROL_BY_SIM_ACTIVE;
|
|
523 return( AT_CMPL );
|
|
524 }
|
|
525
|
|
526 /*
|
|
527 *-------------------------------------------------------------------
|
|
528 * check if service is activated and allocated
|
|
529 *-------------------------------------------------------------------
|
|
530 */
|
|
531 if( ! psaSIM_ChkSIMSrvSup( SRV_CalCntrl )) return( AT_CMPL );
|
|
532
|
|
533 /*
|
|
534 *-------------------------------------------------------------------
|
|
535 * check if Call Control customization is enabled... if yes return AT_CMPL
|
|
536 *-------------------------------------------------------------------
|
|
537 */
|
|
538
|
|
539 if(cuscfgParams.MO_SS_Control_SIM EQ CUSCFG_STAT_Enabled)
|
|
540 {
|
|
541 return( AT_CMPL );
|
|
542 }
|
|
543
|
|
544 /*
|
|
545 *-------------------------------------------------------------------
|
|
546 * check if a call control request is in progress
|
|
547 *-------------------------------------------------------------------
|
|
548 */
|
|
549 if( satShrdPrm.SIMCCParm.busy EQ TRUE ) return( AT_BUSY );
|
|
550
|
|
551 /*
|
|
552 *-------------------------------------------------------------------
|
|
553 * build envelope call control command
|
|
554 *-------------------------------------------------------------------
|
|
555 */
|
|
556 CCD_START;
|
|
557 psaSAT_BuildEnvCC ( NO_ENTRY, cldPty, NULL, NULL );
|
|
558
|
|
559 if( cldPty NEQ NULL )
|
|
560 satShrdPrm.SIMCCParm.ccAct = CC_ACT_SS;
|
|
561
|
|
562 satShrdPrm.SIMCCParm.owner = own;
|
|
563 satShrdPrm.SIMCCParm.busy = TRUE;
|
|
564
|
|
565 satShrdPrm.owner = NO_VLD_OWN;
|
|
566
|
|
567 if( psaSAT_STKEnvelope (NULL) < 0 ) /* envelope STK command */
|
|
568 {
|
|
569 TRACE_EVENT( "FATAL RETURN SAT in send env" );
|
|
570 CCD_END;
|
|
571 return( AT_FAIL );
|
|
572 }
|
|
573
|
|
574 CCD_END;
|
|
575
|
|
576 /*
|
|
577 *-------------------------------------------------------------------
|
|
578 * save SS string
|
|
579 *-------------------------------------------------------------------
|
|
580 */
|
|
581
|
|
582 if( cldPty NEQ NULL )
|
|
583 memcpy(&satPndSetup.clpty, cldPty, sizeof(T_CLPTY_PRM));
|
|
584
|
|
585 return (AT_EXCT);
|
|
586
|
|
587 }
|
|
588
|
|
589 /*
|
|
590 +-------------------------------------------------------------------+
|
|
591 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
592 | ROUTINE : cmhSAT_USSDCntrlBySIM |
|
|
593 +-------------------------------------------------------------------+
|
|
594
|
|
595 PURPOSE : If call control by SIM is activated and allocated, the
|
|
596 the passed supplementary service control string is
|
|
597 packed into a SIM envelope command and send to the SIM
|
|
598 for checking.
|
|
599
|
|
600 */
|
|
601
|
|
602 GLOBAL T_ACI_RETURN cmhSAT_USSDCntrlBySIM ( T_sat_ussd *ussd, UBYTE own )
|
|
603 {
|
|
604 TRACE_FUNCTION("cmhSAT_USSDCntrlBySIM()");
|
|
605
|
|
606 /*
|
|
607 *-------------------------------------------------------------------
|
|
608 * check if Call Control is disabled (Cust1 Customisation)
|
|
609 *-------------------------------------------------------------------
|
|
610 */
|
|
611 if(simShrdPrm.setPrm[own].sat_cc_mode EQ SATCC_CONTROL_BY_SIM_INACTIVE)
|
|
612 {
|
|
613 simShrdPrm.setPrm[own].sat_cc_mode = SATCC_CONTROL_BY_SIM_ACTIVE;
|
|
614 return( AT_CMPL );
|
|
615 }
|
|
616
|
|
617 /*
|
|
618 *-------------------------------------------------------------------
|
|
619 * check if service is activated and allocated
|
|
620 *-------------------------------------------------------------------
|
|
621 */
|
|
622 if( ! psaSIM_ChkSIMSrvSup( SRV_CalCntrl )) return( AT_CMPL );
|
|
623
|
|
624 /*
|
|
625 *-------------------------------------------------------------------
|
|
626 * check if Call Control customization is enabled... if yes return AT_CMPL
|
|
627 *-------------------------------------------------------------------
|
|
628 */
|
|
629
|
|
630 if(cuscfgParams.MO_USSD_Control_SIM EQ CUSCFG_STAT_Enabled)
|
|
631 {
|
|
632 return( AT_CMPL );
|
|
633 }
|
|
634
|
|
635 /*
|
|
636 *-------------------------------------------------------------------
|
|
637 * check if a call control request is in progress
|
|
638 *-------------------------------------------------------------------
|
|
639 */
|
|
640 if( satShrdPrm.SIMCCParm.busy EQ TRUE ) return( AT_BUSY );
|
|
641
|
|
642 /*
|
|
643 *-------------------------------------------------------------------
|
|
644 * save SS string
|
|
645 *-------------------------------------------------------------------
|
|
646 */
|
|
647 if( ussd )
|
|
648 {
|
|
649 satPndSetup.ussd_str.dcs = ussd->dcs;
|
|
650 satPndSetup.ussd_str.c_ussd_str = ussd->c_ussd_str;
|
|
651 memcpy( satPndSetup.ussd_str.ussd_str, ussd->ussd_str, satPndSetup.ussd_str.c_ussd_str);
|
|
652 /* we have to move the ussd_str pointer since it still points to _decodedMsg
|
|
653 and would be overwritten by the first memset in psaSAT_BuildEnvCC */
|
|
654 ussd->ussd_str = satPndSetup.ussd_str.ussd_str;
|
|
655 }
|
|
656
|
|
657 /*
|
|
658 *-------------------------------------------------------------------
|
|
659 * build envelope call control command
|
|
660 *-------------------------------------------------------------------
|
|
661 */
|
|
662 CCD_START;
|
|
663 psaSAT_BuildEnvCC ( NO_ENTRY, NULL, ussd, NULL );
|
|
664
|
|
665 if( ussd )
|
|
666 satShrdPrm.SIMCCParm.ccAct = CC_ACT_USSD;
|
|
667
|
|
668 satShrdPrm.SIMCCParm.owner = own;
|
|
669 satShrdPrm.SIMCCParm.busy = TRUE;
|
|
670
|
|
671 satShrdPrm.owner = NO_VLD_OWN;
|
|
672
|
|
673 if( psaSAT_STKEnvelope (NULL) < 0 ) /* envelope STK command */
|
|
674 {
|
|
675 TRACE_EVENT( "FATAL RETURN SAT in send env" );
|
|
676 CCD_END;
|
|
677 return( AT_FAIL );
|
|
678 }
|
|
679
|
|
680 CCD_END;
|
|
681
|
|
682
|
|
683 return (AT_EXCT);
|
|
684
|
|
685 }
|
|
686
|
|
687
|
|
688 /*
|
|
689 +-------------------------------------------------------------------+
|
|
690 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
691 | ROUTINE : cmhSAT_CBMInitList |
|
|
692 +-------------------------------------------------------------------+
|
|
693
|
|
694 PURPOSE : Allocates and initializes CBM list.
|
|
695 */
|
|
696
|
|
697 LOCAL void cmhSAT_CBMInitList()
|
|
698 {
|
|
699 TRACE_FUNCTION("cmhSAT_CBMInitList()");
|
|
700
|
|
701 if ( CBMsend EQ NULL )
|
|
702 {
|
|
703 ACI_MALLOC(CBMsend, sizeof(T_SAT_CBM_SEND) * MAX_CBM_REMEMBERED);
|
|
704 }
|
|
705 memset( CBMsend, NOT_PRESENT_8BIT,
|
|
706 sizeof(T_SAT_CBM_SEND) * MAX_CBM_REMEMBERED );
|
|
707 }
|
|
708
|
|
709
|
|
710 /*
|
|
711 +-------------------------------------------------------------------+
|
|
712 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
713 | ROUTINE : cmhSAT_CBMDestroyList |
|
|
714 +-------------------------------------------------------------------+
|
|
715
|
|
716 PURPOSE : Frees memory of CBM list and sets list pointer to NULL.
|
|
717 */
|
|
718
|
|
719 GLOBAL void cmhSAT_CBMDestroyList()
|
|
720 {
|
|
721 TRACE_FUNCTION("cmhSAT_CBMDestroyList()");
|
|
722
|
|
723 if ( CBMsend NEQ NULL )
|
|
724 {
|
|
725 ACI_MFREE( CBMsend );
|
|
726 CBMsend = NULL;
|
|
727 }
|
|
728 }
|
|
729
|
|
730
|
|
731 /*
|
|
732 +-------------------------------------------------------------------+
|
|
733 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
734 | ROUTINE : cmhSAT_CBMAddToList |
|
|
735 +-------------------------------------------------------------------+
|
|
736
|
|
737 PURPOSE : Adds new CBM Identifiers to end of CBM list
|
|
738 */
|
|
739
|
|
740 LOCAL void cmhSAT_CBMAddToList( UBYTE pos,
|
|
741 U16 msgIdent,
|
|
742 U16 msgCode,
|
|
743 UBYTE updtNum,
|
|
744 UBYTE pageNum )
|
|
745 {
|
|
746 TRACE_FUNCTION("cmhSAT_CBMAddToList()");
|
|
747
|
|
748 if ( pos >= MAX_CBM_REMEMBERED )
|
|
749 {
|
|
750 /* remove oldest:
|
|
751 move all entries one entry to the beginning of the list */
|
|
752 memcpy( CBMsend, CBMsend + 1,
|
|
753 (MAX_CBM_REMEMBERED - 1) * sizeof(T_SAT_CBM_SEND));
|
|
754 pos = MAX_CBM_REMEMBERED - 1;
|
|
755 }
|
|
756
|
|
757 CBMsend[pos].msgIdent = msgIdent;
|
|
758 CBMsend[pos].msgCode = msgCode;
|
|
759 CBMsend[pos].updtNum = updtNum;
|
|
760 CBMsend[pos].pageNum = pageNum;
|
|
761 }
|
|
762
|
|
763
|
|
764 /*
|
|
765 +-------------------------------------------------------------------+
|
|
766 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
767 | ROUTINE : cmhSAT_CBMUpdateList |
|
|
768 +-------------------------------------------------------------------+
|
|
769
|
|
770 PURPOSE : Moves last updated CBM to end of the CBM list
|
|
771 */
|
|
772
|
|
773 LOCAL void cmhSAT_CBMUpdateList( UBYTE pos )
|
|
774 {
|
|
775 T_SAT_CBM_SEND curCBM;
|
|
776
|
|
777 TRACE_FUNCTION("cmhSAT_CBMUpdateList()");
|
|
778
|
|
779 /* save data of current CBM */
|
|
780 memcpy( &curCBM, CBMsend + pos, sizeof(T_SAT_CBM_SEND) );
|
|
781
|
|
782 /* move all entries, starting after the current entry, one entry to
|
|
783 the beginning of the list */
|
|
784 memcpy( CBMsend + pos, CBMsend + pos+1,
|
|
785 ( MAX_CBM_REMEMBERED - (pos+1)) * sizeof(T_SAT_CBM_SEND) );
|
|
786
|
|
787 /* copy current CBM at last used position */
|
|
788 while ( (pos < MAX_CBM_REMEMBERED-1) AND
|
|
789 (CBMsend[pos].msgIdent NEQ NOT_PRESENT_16BIT) )
|
|
790 {
|
|
791 pos++;
|
|
792 }
|
|
793 memcpy( CBMsend + pos, &curCBM, sizeof(T_SAT_CBM_SEND) );
|
|
794
|
|
795 }
|
|
796
|
|
797
|
|
798 /*
|
|
799 +-------------------------------------------------------------------+
|
|
800 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
801 | ROUTINE : cmhSAT_CBMExtractData |
|
|
802 +-------------------------------------------------------------------+
|
|
803
|
|
804 PURPOSE : Extracts MessageCode, Messag Identifier, Update number,
|
|
805 Page number and total numbers of pages from the CBM.
|
|
806 */
|
|
807
|
|
808 LOCAL void cmhSAT_CBMExtractData( UBYTE* cbMsg,
|
|
809 U16* msgIdent,
|
|
810 U16* msgCode,
|
|
811 UBYTE* updtNum,
|
|
812 UBYTE* pageNum,
|
|
813 UBYTE* pageTotal )
|
|
814 {
|
|
815 UBYTE cnvrt[2];
|
|
816
|
|
817 TRACE_FUNCTION("cmhSAT_CBMExtractData()");
|
|
818
|
|
819 /* extract message identifiers:
|
|
820 cbMsg is not yet enveloped for SAT, so that Bytes 3 - 4 includes
|
|
821 the message identifiers.
|
|
822 */
|
|
823 memcpy(cnvrt+1, &cbMsg[2], 1);
|
|
824 memcpy(cnvrt, &cbMsg[3], 1);
|
|
825 memcpy(msgIdent, cnvrt, 2);
|
|
826
|
|
827 /* decode serial number:
|
|
828 cbMsg is not yet enveloped for SAT, so that cbMsg starts
|
|
829 with the serial number.
|
|
830 update number:
|
|
831 The serial number includes the message code in bits 0 - 5 of the
|
|
832 first Byte and in bits 4 -7 in the second Byte.
|
|
833 */
|
|
834 memcpy(cnvrt+1, &cbMsg[0], 1);
|
|
835 memcpy(cnvrt, &cbMsg[1], 1);
|
|
836 memcpy(msgCode, cnvrt, 2);
|
|
837 *msgCode = ( *msgCode >> 4 ) & 1023;
|
|
838
|
|
839 /*
|
|
840 update number:
|
|
841 The second Byte of the serial number includes the
|
|
842 update number in bits 0 - 3.
|
|
843 the bitwise AND operation with 15 will set bits 4 - 7 to zero.
|
|
844 */
|
|
845 *updtNum = cbMsg[1] & 15;
|
|
846
|
|
847 /* extract page parameter:
|
|
848 cbMsg is not yet enveloped for SAT, so that the sixth Byte is
|
|
849 the page parameter.
|
|
850 It includes the total number of pages in bits 0 - 3.
|
|
851 The bitwise AND operation with 15 will set bits 4 - 7 to zero.
|
|
852 The current page number is in bits 4 - 7.
|
|
853 To get the current page number the bits have to be shifted
|
|
854 4 positions to the right.
|
|
855 */
|
|
856 *pageTotal = cbMsg[5] & 15;
|
|
857 *pageNum = cbMsg[5] >> 4;
|
|
858 }
|
|
859
|
|
860
|
|
861 /*
|
|
862 +-------------------------------------------------------------------+
|
|
863 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
864 | ROUTINE : cmhSAT_CBMIsNewMsg |
|
|
865 +-------------------------------------------------------------------+
|
|
866
|
|
867 PURPOSE : Checks if CBM is a new CBM or if it already has been
|
|
868 send to SIM. The Identifiers of already received CBMs
|
|
869 are stored in a list.
|
|
870 RETURNS: TRUE, if it is new and shall be send to SIM now.
|
|
871 FALSE, if it already has been send to SIM.
|
|
872 */
|
|
873
|
|
874 LOCAL BOOL cmhSAT_CBMIsNewMsg( UBYTE* cbMsg )
|
|
875 {
|
|
876
|
|
877 U16 msgIdent;
|
|
878 U16 msgCode;
|
|
879 U8 updtNum;
|
|
880 U8 pageTotal;
|
|
881 U8 pageNum;
|
|
882 UBYTE i;
|
|
883
|
|
884
|
|
885 TRACE_FUNCTION("cmhSAT_CBMIsNewMsg()");
|
|
886
|
|
887 if ( CBMsend EQ NULL )
|
|
888 {
|
|
889 cmhSAT_CBMInitList();
|
|
890 }
|
|
891
|
|
892 /*----------------------------------------------------------------
|
|
893 * extract CBM identifiers
|
|
894 *----------------------------------------------------------------*/
|
|
895
|
|
896 cmhSAT_CBMExtractData( cbMsg, &msgIdent, &msgCode, &updtNum,
|
|
897 &pageNum, &pageTotal );
|
|
898
|
|
899 /*----------------------------------------------------------------
|
|
900 * check if message has already been send to SIM
|
|
901 *----------------------------------------------------------------*/
|
|
902
|
|
903 /* search for message identifiers in CB Messages already send to SIM */
|
|
904 for ( i = 0;
|
|
905 (i < MAX_CBM_REMEMBERED) AND (CBMsend[i].msgCode NEQ NOT_PRESENT_16BIT);
|
|
906 i++ )
|
|
907 {
|
|
908 if ( (msgIdent EQ CBMsend[i].msgIdent) AND
|
|
909 (msgCode EQ CBMsend[i].msgCode) )
|
|
910 {
|
|
911
|
|
912 /* if update number has changed, CBM shall be send to SIM */
|
|
913 /* 23.041 9.4.1.2.1:
|
|
914 Any Update Number eight or less higher (modulo 16)
|
|
915 than the last received Update Number will be considered more recent,
|
|
916 and shall be treated as a new CBS message,
|
|
917 provided the mobile has not been switched off. */
|
|
918
|
|
919 U8 delta;
|
|
920
|
|
921 delta = (updtNum - CBMsend[i].updtNum) % 16; /* force explicit negative carry! */
|
|
922 if (delta > 0 AND delta <= 8)
|
|
923 {
|
|
924 /* for the next check: set update number to new update number
|
|
925 and reset page number for new update */
|
|
926 CBMsend[i].updtNum = updtNum;
|
|
927 CBMsend[i].pageNum = 0;
|
|
928 cmhSAT_CBMUpdateList( i );
|
|
929
|
|
930 return TRUE;
|
|
931 }
|
|
932
|
|
933
|
|
934 /* check if message contains more than one page */
|
|
935 if ( pageTotal > 1 )
|
|
936 {
|
|
937 /* check if page is send to SIM */
|
|
938 if ( pageNum > CBMsend[i].pageNum )
|
|
939 {
|
|
940 /* mark page now as send for next CBM */
|
|
941 CBMsend[i].pageNum = pageNum;
|
|
942 cmhSAT_CBMUpdateList( i );
|
|
943
|
|
944 /* page is not yet send to SIM */
|
|
945 return TRUE;
|
|
946 }
|
|
947 }
|
|
948
|
|
949 /* CBM is not new */
|
|
950 return FALSE;
|
|
951 }
|
|
952 }
|
|
953
|
|
954 /*----------------------------------------------------------------
|
|
955 * mark CBM as send to SIM: insert into list
|
|
956 *---------------------------------------------------------------*/
|
|
957
|
|
958 cmhSAT_CBMAddToList( i, msgIdent, msgCode, updtNum, pageNum );
|
|
959
|
|
960 return TRUE;
|
|
961 }
|
|
962
|
|
963 /*
|
|
964 +-------------------------------------------------------------------+
|
|
965 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
966 | ROUTINE : cmhSAT_verifyNewLocInfo |
|
|
967 +-------------------------------------------------------------------+
|
|
968
|
|
969 PURPOSE : This function verifies the current MM PLMN information
|
|
970 with the one already stored by SAT and indicates TRUE if
|
|
971 the information has changed
|
|
972
|
|
973 */
|
|
974 LOCAL BOOL cmhSAT_verifyNewLocInfo ()
|
|
975 {
|
|
976 if (satShrdPrm.locInfo.regStatus EQ mmShrdPrm.regStat)
|
|
977 {
|
|
978 /* If registration status is full service, check to proceed
|
|
979 if the location information has changed*/
|
|
980 if (satShrdPrm.locInfo.regStatus EQ RS_FULL_SRV)
|
|
981 {
|
|
982 if( memcmp (mmShrdPrm.usedPLMN.mcc, satShrdPrm.locInfo.currPLMN.mcc, SIZE_MCC) EQ 0
|
|
983 AND memcmp (mmShrdPrm.usedPLMN.mnc, satShrdPrm.locInfo.currPLMN.mnc, SIZE_MNC) EQ 0
|
|
984 AND mmShrdPrm.lac EQ satShrdPrm.locInfo.lac AND mmShrdPrm.cid EQ satShrdPrm.locInfo.cid)
|
|
985 {
|
|
986 return FALSE;
|
|
987 }
|
|
988 }
|
|
989 }
|
|
990
|
|
991 satShrdPrm.locInfo.regStatus = mmShrdPrm.regStat;
|
|
992
|
|
993 /* The other information is updated only if ME is in full service mode */
|
|
994 if (satShrdPrm.locInfo.regStatus EQ RS_FULL_SRV)
|
|
995 {
|
|
996 satShrdPrm.locInfo.cid = mmShrdPrm.cid;
|
|
997 satShrdPrm.locInfo.lac = mmShrdPrm.lac;
|
|
998 satShrdPrm.locInfo.currPLMN.v_plmn = mmShrdPrm.usedPLMN.v_plmn;
|
|
999 memcpy(satShrdPrm.locInfo.currPLMN.mcc, mmShrdPrm.usedPLMN.mcc, SIZE_MCC);
|
|
1000 memcpy(satShrdPrm.locInfo.currPLMN.mnc, mmShrdPrm.usedPLMN.mnc, SIZE_MNC);
|
|
1001 }
|
|
1002
|
|
1003 return TRUE;
|
|
1004 }
|
|
1005
|
|
1006
|
|
1007 /*
|
|
1008 +-------------------------------------------------------------------+
|
|
1009 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
1010 | ROUTINE : cmhSAT_DatDwnLdCB |
|
|
1011 +-------------------------------------------------------------------+
|
|
1012
|
|
1013 PURPOSE : This function supports the data download to SIM via cell
|
|
1014 broadcast messages.
|
|
1015
|
|
1016 */
|
|
1017
|
|
1018 GLOBAL T_ACI_RETURN cmhSAT_DatDwnLdCB ( UBYTE* cbMsg, SHORT cbLen )
|
|
1019 {
|
|
1020
|
|
1021 TRACE_FUNCTION("cmhSAT_DatDwnLdCB()");
|
|
1022
|
|
1023 /*
|
|
1024 *-------------------------------------------------------------------
|
|
1025 * build envelope
|
|
1026 *-------------------------------------------------------------------
|
|
1027 */
|
|
1028 CCD_START;
|
|
1029 psaSAT_BuildEnvCB ( cbMsg, cbLen );
|
|
1030
|
|
1031 satShrdPrm.owner = NO_VLD_OWN;
|
|
1032
|
|
1033 /* only if CBM is not yet send to SIM, CBM shall be send to SIM */
|
|
1034 if ( cmhSAT_CBMIsNewMsg( cbMsg ) )
|
|
1035 {
|
|
1036 if( psaSAT_STKEnvelope (NULL) < 0 ) /* envelope STK command */
|
|
1037 {
|
|
1038 TRACE_EVENT( "FATAL RETURN SAT in send env" );
|
|
1039 CCD_END;
|
|
1040 return( AT_FAIL );
|
|
1041 }
|
|
1042 }
|
|
1043
|
|
1044 CCD_END;
|
|
1045
|
|
1046 return( AT_CMPL );
|
|
1047
|
|
1048 }
|
|
1049
|
|
1050 /*
|
|
1051 +-------------------------------------------------------------------+
|
|
1052 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
1053 | ROUTINE : cmhSAT_MoSmCntr |
|
|
1054 +-------------------------------------------------------------------+
|
|
1055
|
|
1056 PURPOSE : This function supports the MO SM control.
|
|
1057
|
|
1058 */
|
|
1059
|
|
1060 GLOBAL T_ACI_RETURN cmhSAT_MoSmCntr ( T_rp_addr sc_addr,
|
|
1061 T_tp_da dest_addr,
|
|
1062 UBYTE own)
|
|
1063 {
|
|
1064
|
|
1065 TRACE_FUNCTION("cmhSAT_MoSmCntr()");
|
|
1066
|
|
1067 /*
|
|
1068 *-------------------------------------------------------------------
|
|
1069 * check if Call Control customization is enabled... if yes return AT_CMPL
|
|
1070 *-------------------------------------------------------------------
|
|
1071 */
|
|
1072
|
|
1073 if(cuscfgParams.MO_SM_Control_SIM EQ CUSCFG_STAT_Enabled)
|
|
1074 {
|
|
1075 return( AT_CMPL );
|
|
1076 }
|
|
1077
|
|
1078
|
|
1079 /*
|
|
1080 *-------------------------------------------------------------------
|
|
1081 * check if a call control request is in progress
|
|
1082 *-------------------------------------------------------------------
|
|
1083 */
|
|
1084 if( satShrdPrm.SIMCCParm.busy EQ TRUE ) return( AT_BUSY );
|
|
1085
|
|
1086
|
|
1087 /*
|
|
1088 *-------------------------------------------------------------------
|
|
1089 * build envelope
|
|
1090 *-------------------------------------------------------------------
|
|
1091 */
|
|
1092 CCD_START;
|
|
1093 psaSAT_BuildEnvMoSmCntr ( sc_addr, dest_addr );
|
|
1094
|
|
1095 satShrdPrm.SIMCCParm.ccAct = SMC_ACT_MO;
|
|
1096 satShrdPrm.SIMCCParm.owner = own;
|
|
1097 satShrdPrm.SIMCCParm.busy = TRUE;
|
|
1098
|
|
1099 satShrdPrm.owner = NO_VLD_OWN;
|
|
1100
|
|
1101 if( psaSAT_STKEnvelope (NULL) < 0 ) /* envelope STK command */
|
|
1102 {
|
|
1103 TRACE_EVENT( "FATAL RETURN SAT in send env" );
|
|
1104 CCD_END;
|
|
1105 return( AT_FAIL );
|
|
1106 }
|
|
1107
|
|
1108 CCD_END;
|
|
1109 return( AT_EXCT );
|
|
1110
|
|
1111 }
|
|
1112
|
|
1113 /*
|
|
1114 +-------------------------------------------------------------------+
|
|
1115 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
1116 | ROUTINE : cmhSAT_EventDwn |
|
|
1117 +-------------------------------------------------------------------+
|
|
1118
|
|
1119 PURPOSE : This function supports Event download.
|
|
1120
|
|
1121 */
|
|
1122
|
|
1123 GLOBAL T_ACI_RETURN cmhSAT_EventDwn ( UBYTE event, SHORT callId , T_CC_INITIATER actionSrc )
|
|
1124 {
|
|
1125
|
|
1126 TRACE_FUNCTION("cmhSAT_EventDwn()");
|
|
1127
|
|
1128 /* If the event is Location info download, event download is sent only
|
|
1129 if the location information has changed or has been updated */
|
|
1130 if (event EQ EVENT_LOC_STATUS AND !cmhSAT_verifyNewLocInfo ())
|
|
1131 {
|
|
1132 TRACE_EVENT("No update for SIM app");
|
|
1133 return AT_CMPL;
|
|
1134 }
|
|
1135
|
|
1136
|
|
1137 /*
|
|
1138 *-------------------------------------------------------------------
|
|
1139 * build envelope
|
|
1140 *-------------------------------------------------------------------
|
|
1141 */
|
|
1142 CCD_START;
|
|
1143
|
|
1144 /* if events were queued, send them */
|
|
1145 if (satShrdPrm.event.c_queued)
|
|
1146 {
|
|
1147 do
|
|
1148 {
|
|
1149 T_SAT_QUEUE *p_queue;
|
|
1150
|
|
1151 satShrdPrm.event.c_queued--;
|
|
1152 p_queue = &satShrdPrm.event.queued[satShrdPrm.event.c_queued];
|
|
1153
|
|
1154 satShrdPrm.owner = p_queue->owner;
|
|
1155 if (psaSAT_STKEnvelope(p_queue->stk_cmd) < 0) /* envelope STK command */
|
|
1156 {
|
|
1157 /* ignore event if error */
|
|
1158 TRACE_EVENT( "FATAL RETURN SAT in send env" );
|
|
1159 }
|
|
1160 p_queue->stk_cmd = NULL;
|
|
1161 }
|
|
1162 while (satShrdPrm.event.c_queued);
|
|
1163 }
|
|
1164 else
|
|
1165 {
|
|
1166 if (!psaSAT_BuildEnvEventDwn ( event , callId, actionSrc ))
|
|
1167 {
|
|
1168 CCD_END;
|
|
1169 return AT_BUSY;
|
|
1170 }
|
|
1171
|
|
1172 /*satShrdPrm.SIMCCParm.busy = TRUE;*/
|
|
1173
|
|
1174 satShrdPrm.owner = NO_VLD_OWN;
|
|
1175
|
|
1176 if( psaSAT_STKEnvelope (NULL) < 0 ) /* envelope STK command */
|
|
1177 {
|
|
1178 TRACE_EVENT( "FATAL RETURN SAT in send env" );
|
|
1179 CCD_END;
|
|
1180 return( AT_FAIL );
|
|
1181 }
|
|
1182 }
|
|
1183
|
|
1184 CCD_END;
|
|
1185 return( AT_CMPL );
|
|
1186
|
|
1187 }
|
|
1188
|
|
1189 /*
|
|
1190 +-------------------------------------------------------------------+
|
|
1191 | PROJECT : MODULE : SAT |
|
|
1192 | ROUTINE : cmhSAT_LaunchBrowser |
|
|
1193 +-------------------------------------------------------------------+
|
|
1194
|
|
1195 PURPOSE :
|
|
1196
|
|
1197 */
|
|
1198 GLOBAL BOOL cmhSAT_launchBrowser (T_LAUNCH_BROWSER* launchBrowser)
|
|
1199 {
|
|
1200 T_ACI_SAT_TERM_RESP resp_data;
|
|
1201
|
|
1202 /* check for busy SS condition */
|
|
1203 if (psaSS_stbFindActSrv (NO_ENTRY) NEQ NO_ENTRY)
|
|
1204 {
|
|
1205 /* respond with "error, ME currently unable to process command" */
|
|
1206 resp_data.add_content = ADD_ME_SS_BUSY;
|
|
1207 psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data );
|
|
1208 return( FALSE ); /* unused */
|
|
1209 }
|
|
1210
|
|
1211 #if defined(MFW) AND defined(FF_WAP)
|
|
1212 rAT_PercentSATBROW (launchBrowser); /* Info 718: Symbol undeclared, assumed to return int */
|
|
1213 return( TRUE ); /* unused */
|
|
1214 #else
|
|
1215 cmhSAT_STKCmdInd();
|
|
1216 return( FALSE ); /* unused */
|
|
1217 #endif
|
|
1218
|
|
1219 }
|
|
1220
|
|
1221
|
|
1222 /*
|
|
1223 +-------------------------------------------------------------------+
|
|
1224 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
1225 | ROUTINE : cmhSAT_provLocalInfo |
|
|
1226 +-------------------------------------------------------------------+
|
|
1227
|
|
1228 PURPOSE : This function supports Provide Local Information for
|
|
1229 Date, time and time zone.
|
|
1230
|
|
1231 */
|
|
1232 GLOBAL BOOL cmhSAT_provLocalInfo ()
|
|
1233 {
|
|
1234 T_ACI_SAT_TERM_RESP resp_data;
|
|
1235 rtc_time_type rtc_time;
|
|
1236
|
|
1237 CHAR* ef = EF_CLNG_ID;
|
|
1238 pcm_FileInfo_Type fileInfo;
|
|
1239 EF_CLNG lng;
|
|
1240
|
|
1241 char *auptr="au";
|
|
1242
|
|
1243 TRACE_FUNCTION("cmhSAT_provLocalInfo()");
|
|
1244
|
|
1245 psaSAT_InitTrmResp( &resp_data );
|
|
1246
|
|
1247 #ifndef _SIMULATION_
|
|
1248 /* if no service is currently available */
|
|
1249 if ((mmShrdPrm.regStat EQ RS_NO_SRV) OR (mmShrdPrm.regStat EQ NO_VLD_RS))
|
|
1250 {
|
|
1251 psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data );
|
|
1252 return(FALSE);
|
|
1253 }
|
|
1254 #endif
|
|
1255
|
|
1256 if (satShrdPrm.cmdDet.cmdQlf NEQ QLF_PLOI_DTT AND (satShrdPrm.cmdDet.cmdQlf NEQ QLF_PLOI_LANG_SET))
|
|
1257 {
|
|
1258 return (FALSE);
|
|
1259 }
|
|
1260
|
|
1261 if (satShrdPrm.cmdDet.cmdQlf EQ QLF_PLOI_DTT)
|
|
1262 {
|
|
1263 if ( rtc_read_time ( &rtc_time ) EQ TRUE )
|
|
1264 {
|
|
1265 int i = 0;
|
|
1266 UBYTE hex2bcd;
|
|
1267
|
|
1268 resp_data.dtt_buf[0] = rtc_time.year;
|
|
1269 resp_data.dtt_buf[1] = rtc_time.month;
|
|
1270 resp_data.dtt_buf[2] = rtc_time.day;
|
|
1271 resp_data.dtt_buf[3] = rtc_time.hour;
|
|
1272 resp_data.dtt_buf[4] = rtc_time.minute;
|
|
1273 resp_data.dtt_buf[5] = rtc_time.second;
|
|
1274 while(i<TIME_STAMP_LENGTH)
|
|
1275 {
|
|
1276 hex2bcd = 0;
|
|
1277 hex2bcd = hex2bcd + resp_data.dtt_buf[i] / 0x0A;
|
|
1278 hex2bcd = hex2bcd << 4;
|
|
1279 hex2bcd = hex2bcd + resp_data.dtt_buf[i] % 0x0A;
|
|
1280 resp_data.dtt_buf[i] = ((hex2bcd & 0x0F) << 4) + ((hex2bcd & 0xF0) >> 4);
|
|
1281 i++;
|
|
1282 }
|
|
1283 #ifdef _SIMULATION_
|
|
1284 memset(resp_data.dtt_buf, 0xA0, 6);
|
|
1285 #endif /* _SIMULATION_ */
|
|
1286
|
|
1287 resp_data.dtt_buf[6] = mmShrdPrm.tz;
|
|
1288
|
|
1289 if (mmShrdPrm.regStat EQ RS_LMTD_SRV)
|
|
1290 {
|
|
1291 psaSAT_SendTrmResp( RSLT_PERF_LIM_SRV, &resp_data );
|
|
1292 }
|
|
1293 else
|
|
1294 {
|
|
1295 psaSAT_SendTrmResp( RSLT_PERF_SUCCESS, &resp_data );
|
|
1296 }
|
|
1297 }
|
|
1298 else
|
|
1299 {
|
|
1300 psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data );
|
|
1301 return (FALSE);
|
|
1302 }
|
|
1303 }
|
|
1304 else /* Expecting LS Qualifier */
|
|
1305 {
|
|
1306 if (pcm_GetFileInfo ( ( UBYTE* ) ef, &fileInfo) NEQ PCM_OK)
|
|
1307 {
|
|
1308 psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data );
|
|
1309 return (FALSE);
|
|
1310 }
|
|
1311 else
|
|
1312 {
|
|
1313 if (pcm_ReadFile( (UBYTE*)ef,
|
|
1314 fileInfo.FileSize,
|
|
1315 (UBYTE*) &lng,
|
|
1316 &fileInfo.Version) EQ PCM_OK )
|
|
1317 {
|
|
1318
|
|
1319 /*-------------------------------------------------------------------
|
|
1320 * Read EF ELP or LP from the sim if Automatic language is selected
|
|
1321 *-------------------------------------------------------------------
|
|
1322 */
|
|
1323
|
|
1324 if (!memcmp(lng.data, auptr, CLAN_CODE_LEN))
|
|
1325 {
|
|
1326 if (cmhSIM_ReqLanguagePrf() EQ FALSE)
|
|
1327 {
|
|
1328 psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data );
|
|
1329 return (FALSE);
|
|
1330 }
|
|
1331 }
|
|
1332 else
|
|
1333 {
|
|
1334 memcpy(&resp_data.lang, &lng.data[0], CLAN_CODE_LEN);
|
|
1335
|
|
1336 #ifdef _SIMULATION_
|
|
1337 memset(resp_data.lang, 0xA0, 2);
|
|
1338 #endif
|
|
1339 psaSAT_SendTrmResp( RSLT_PERF_SUCCESS, &resp_data );
|
|
1340 }
|
|
1341
|
|
1342 }
|
|
1343 else
|
|
1344 {
|
|
1345 psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data );
|
|
1346 return (FALSE);
|
|
1347 }
|
|
1348 }
|
|
1349 }
|
|
1350 return(TRUE);
|
|
1351 }
|
|
1352
|
|
1353
|
|
1354 /*
|
|
1355 +-------------------------------------------------------------------+
|
|
1356 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
1357 | ROUTINE : cmhSAT_setupCall |
|
|
1358 +-------------------------------------------------------------------+
|
|
1359
|
|
1360 PURPOSE :
|
|
1361
|
|
1362 */
|
|
1363
|
|
1364 GLOBAL BOOL cmhSAT_setupCall ( T_SETUP_CALL * cal )
|
|
1365 {
|
|
1366 T_CC_CALL_TBL *ctb; /* pointer to call table associated with cId */
|
|
1367 T_ACI_RETURN retVal; /* holds return value */
|
|
1368 SHORT cId; /* holds call id */
|
|
1369 UBYTE idx; /* holds index */
|
|
1370 T_ACI_SAT_TERM_RESP resp_data;
|
|
1371 #ifdef FF_SAT_E
|
|
1372 T_ACI_SATA_ADD addPrm;
|
|
1373 #endif /* FF_SAT_E */
|
|
1374
|
|
1375 psaSAT_InitTrmResp( &resp_data );
|
|
1376
|
|
1377 TRACE_FUNCTION("cmhSAT_setupCall()");
|
|
1378
|
|
1379 /*
|
|
1380 *-------------------------------------------------------------------
|
|
1381 * get call table entry
|
|
1382 *-------------------------------------------------------------------
|
|
1383 */
|
|
1384 cId = psaCC_ctbNewEntry();
|
|
1385
|
|
1386 if( cId EQ NO_ENTRY )
|
|
1387 {
|
|
1388 /* send SAT response */
|
|
1389 resp_data.add_content = ADD_NO_CAUSE;
|
|
1390 psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data );
|
|
1391 return( FALSE ); /* primitive not needed anymore */
|
|
1392 }
|
|
1393
|
|
1394 ctb = ccShrdPrm.ctb[cId];
|
|
1395
|
|
1396 /*
|
|
1397 *-------------------------------------------------------------------
|
|
1398 * build setup parameters
|
|
1399 *-------------------------------------------------------------------
|
|
1400 */
|
|
1401 /* check dial number */
|
|
1402 if( !cal->v_addr )
|
|
1403 {
|
|
1404 /* respond with "error, required values are missing" */
|
|
1405 psaSAT_SendTrmResp( RSLT_ERR_REQ_VAL, &resp_data );
|
|
1406 psaCC_FreeCtbNtry (cId);
|
|
1407 return( FALSE );
|
|
1408 }
|
|
1409
|
|
1410 cmhSAT_fillSetupPrm ( cId, /* cId is valid */
|
|
1411 ((cal->v_addr)?&cal->addr:NULL),
|
|
1412 ((cal->v_subaddr)?&cal->subaddr:NULL));
|
|
1413
|
|
1414 /* check aoc condition */
|
|
1415 if ((ctb->prio EQ PRIO_NORM_CALL) AND
|
|
1416 (aoc_check_moc() EQ FALSE))
|
|
1417 /*
|
|
1418 * check ACM exceeds ACMmax
|
|
1419 * for non-emergency calls
|
|
1420 */
|
|
1421 {
|
|
1422 resp_data.add_content = ADD_NO_CAUSE;
|
|
1423 psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data );
|
|
1424 psaCC_FreeCtbNtry (cId);
|
|
1425 return( FALSE );
|
|
1426 }
|
|
1427
|
|
1428 /* declare the owner and status of the call */
|
|
1429 ctb->calOwn = OWN_SAT;
|
|
1430 ctb->calStat = CS_SAT_REQ;
|
|
1431 ctb->curCmd = AT_CMD_D;
|
|
1432 ctb->SATinv = TRUE;
|
|
1433
|
|
1434 /* bearer capabilities */
|
|
1435 if ( cal->v_cap_cnf_parms EQ 0 )
|
|
1436 {
|
|
1437 /*
|
|
1438 * no bearer capabilities => set to speech
|
|
1439 * this function was called for a SIM_TOOLKIT_IND
|
|
1440 */
|
|
1441 cmhSAT_fillSetupBC ( cId, BEARER_SERV_SPEECH, BEARER_SERV_NOT_PRES );
|
|
1442 }
|
|
1443 else
|
|
1444 {
|
|
1445 /* future to consider the bearer capabilities */
|
|
1446 cmhSAT_fillSetupBC ( cId, BEARER_SERV_SPEECH, BEARER_SERV_NOT_PRES );
|
|
1447
|
|
1448 /* CCP not supported yet */
|
|
1449 /*
|
|
1450 cmhSAT_ChckRedial(cId, cal->v_dur, &cal->dur);
|
|
1451
|
|
1452 satShrdPrm.ntfy = USR_NTF_SETUP_CAL;
|
|
1453 satShrdPrm.capParm.cId = cId;
|
|
1454 satShrdPrm.capParm.cntxt = CTX_SAT_SETUP;
|
|
1455
|
|
1456 if( psaCC_BCapDecode( BCRI_SAT, cal->cap_cnf_parms.l_cap_cnf_parms>>3,
|
|
1457 cal->cap_cnf_parms.b_cap_cnf_parms ) < 0 )
|
|
1458 {
|
|
1459 psaSAT_SendTrmResp( RSLT_ME_CAP, 0, NULL, NULL, NULL );
|
|
1460 psaCC_FreeCtbNtry (cId);
|
|
1461 return( FALSE );
|
|
1462 }
|
|
1463 else
|
|
1464 {
|
|
1465 return( TRUE );
|
|
1466 }
|
|
1467 */
|
|
1468 }
|
|
1469
|
|
1470 /*
|
|
1471 *-------------------------------------------------------------------
|
|
1472 * check for emergency call
|
|
1473 *-------------------------------------------------------------------
|
|
1474 */
|
|
1475 if( ctb->prio EQ PRIO_EMERG_CALL )
|
|
1476 {
|
|
1477 if (simShrdPrm.overall_cust_mode EQ (UBYTE)CUST_MODE_BEHAVIOUR_1)
|
|
1478 {
|
|
1479 /*
|
|
1480 * Clear the call table entry as it will be re-created when the MMI
|
|
1481 * requests the emergency call setup
|
|
1482 */
|
|
1483 psaCC_FreeCtbNtry (cId);
|
|
1484
|
|
1485 /*
|
|
1486 ** Send the original Setup Call Request to the MMI in a %SATI indication
|
|
1487 */
|
|
1488 cmhSAT_Cust1StkCmdInd();
|
|
1489 }
|
|
1490 else
|
|
1491 {
|
|
1492 /* alert user */
|
|
1493 for( idx = 0; idx < CMD_SRC_MAX; idx++ )
|
|
1494 {
|
|
1495
|
|
1496 #ifdef FF_SAT_E
|
|
1497 addPrm.chnType = SATA_CT_VOICE;
|
|
1498 addPrm.chnEst = SATA_EST_IM;
|
|
1499
|
|
1500 R_AT( RAT_SATA, idx )( cId+1,
|
|
1501 cmhSAT_ChckRedial(cId, cal->v_dur, &cal->dur),
|
|
1502 &addPrm);
|
|
1503 #else /* FF_SAT_E */
|
|
1504 R_AT( RAT_SATA, idx )( cId+1,
|
|
1505 cmhSAT_ChckRedial(cId, cal->v_dur, &cal->dur));
|
|
1506 #endif /* FF_SAT_E */
|
|
1507 }
|
|
1508 }
|
|
1509
|
|
1510 satShrdPrm.ntfy = USR_NTF_SETUP_CAL;
|
|
1511 return( TRUE );
|
|
1512 }
|
|
1513
|
|
1514 /*
|
|
1515 *-------------------------------------------------------------------
|
|
1516 * check for call control by SIM
|
|
1517 *-------------------------------------------------------------------
|
|
1518 */
|
|
1519
|
|
1520 retVal = cmhSAT_CalCntrlBySIM( cId );
|
|
1521
|
|
1522
|
|
1523 switch( retVal )
|
|
1524 {
|
|
1525 case( AT_EXCT ):
|
|
1526 satShrdPrm.ntfy = USR_NTF_SETUP_CAL;
|
|
1527 return( TRUE );
|
|
1528
|
|
1529 case( AT_BUSY ):
|
|
1530 /* respond with "Interaction with call control by SIM, temporary" */
|
|
1531 psaSAT_SendTrmResp( RSLT_CC_SIM_TMP, &resp_data );
|
|
1532 psaCC_FreeCtbNtry (cId);
|
|
1533 return( FALSE );
|
|
1534
|
|
1535 case( AT_FAIL ):
|
|
1536 /* respond with "Interaction with call control by SIM, permanent" */
|
|
1537 resp_data.add_content = ADD_NO_CAUSE;
|
|
1538 psaSAT_SendTrmResp( RSLT_CC_SIM_PRM, &resp_data );
|
|
1539 psaCC_FreeCtbNtry (cId);
|
|
1540 return( FALSE );
|
|
1541
|
|
1542 case( AT_CMPL):
|
|
1543 TRACE_EVENT_P1("Restoring the Cid = %d",cId);
|
|
1544 satShrdPrm.SIMCCParm.cId = cId;
|
|
1545 break;
|
|
1546 }
|
|
1547
|
|
1548 /*
|
|
1549 *-------------------------------------------------------------------
|
|
1550 * alert user if command details are supported
|
|
1551 *-------------------------------------------------------------------
|
|
1552 */
|
|
1553 if (simShrdPrm.overall_cust_mode EQ (UBYTE)CUST_MODE_BEHAVIOUR_1)
|
|
1554 {
|
|
1555 /*
|
|
1556 * Clear the call table entry as it will be re-created when the MMI
|
|
1557 * requests the emergency call setup
|
|
1558 */
|
|
1559 psaCC_FreeCtbNtry (cId);
|
|
1560
|
|
1561 /*
|
|
1562 ** Send the original Setup Call Request to the MMI in a %SATI indication
|
|
1563 */
|
|
1564 cmhSAT_Cust1StkCmdInd();
|
|
1565
|
|
1566 satShrdPrm.ntfy = USR_NTF_SETUP_CAL;
|
|
1567 return( TRUE );
|
|
1568 }
|
|
1569 else if( cmhSAT_ChckCmdDet() )
|
|
1570 {
|
|
1571 for( idx = 0; idx < CMD_SRC_MAX; idx++ )
|
|
1572 {
|
|
1573
|
|
1574 /*
|
|
1575 ** If cust_mode is not NORMAL_BEHAVIOUR, then don't do anything yet, because the
|
|
1576 ** %SATI indication will be sent later in the process
|
|
1577 */
|
|
1578 if (simShrdPrm.overall_cust_mode EQ (UBYTE)CUST_NORMAL_BEHAVIOUR)
|
|
1579 {
|
|
1580 #ifdef FF_SAT_E
|
|
1581 addPrm.chnType = SATA_CT_VOICE;
|
|
1582 addPrm.chnEst = SATA_EST_IM;
|
|
1583
|
|
1584 R_AT( RAT_SATA, idx )( cId+1,
|
|
1585 cmhSAT_ChckRedial(cId, cal->v_dur, &cal->dur),
|
|
1586 &addPrm);
|
|
1587 #else /* FF_SAT_E */
|
|
1588 R_AT( RAT_SATA, idx )( cId+1,
|
|
1589 cmhSAT_ChckRedial(cId, cal->v_dur, &cal->dur));
|
|
1590 #endif /* FF_SAT_E */
|
|
1591
|
|
1592 }
|
|
1593 }
|
|
1594
|
|
1595 satShrdPrm.ntfy = USR_NTF_SETUP_CAL;
|
|
1596 return( TRUE );
|
|
1597 }
|
|
1598
|
|
1599 psaCC_FreeCtbNtry (cId);
|
|
1600 return( FALSE );
|
|
1601 }
|
|
1602
|
|
1603 /*
|
|
1604 +-------------------------------------------------------------------+
|
|
1605 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
1606 | ROUTINE : cmhSAT_sendSS |
|
|
1607 +-------------------------------------------------------------------+
|
|
1608
|
|
1609 PURPOSE : This function starts a SS transaction initiated by SAT.
|
|
1610 If the request is going to be processed, the function
|
|
1611 returns TRUE.
|
|
1612
|
|
1613 */
|
|
1614
|
|
1615 GLOBAL BOOL cmhSAT_sendSS ( T_SEND_SS * ss )
|
|
1616 {
|
|
1617 T_ACI_RETURN retVal; /* holds return value */
|
|
1618 T_ACI_D_CLIR_OVRD dummy2; /* dummy value */
|
|
1619 T_ACI_D_TOC dummy1; /* dummy value */
|
|
1620 T_ACI_SAT_TERM_RESP resp_data;
|
|
1621
|
|
1622 psaSAT_InitTrmResp( &resp_data );
|
|
1623
|
|
1624 TRACE_FUNCTION("cmhSAT_sendSS()");
|
|
1625
|
|
1626 /*
|
|
1627 *-------------------------------------------------------------------
|
|
1628 * build SS string
|
|
1629 *-------------------------------------------------------------------
|
|
1630 */
|
|
1631 if( !ss->v_ss_string )
|
|
1632 {
|
|
1633 /* respond with "error, required values are missing" */
|
|
1634 psaSAT_SendTrmResp( RSLT_UNKN_DATA, &resp_data );
|
|
1635 return( FALSE );
|
|
1636 }
|
|
1637
|
|
1638 if ( !ss->ss_string.c_ss_ctrl_string )
|
|
1639 {
|
|
1640 psaSAT_SendTrmResp(RSLT_ERR_REQ_VAL, &resp_data );
|
|
1641 return( FALSE );
|
|
1642 }
|
|
1643
|
|
1644
|
|
1645 cmhCC_init_cldPty( &satPndSetup.clpty );
|
|
1646
|
|
1647 utl_BCD2DialStr( ss->ss_string.ss_ctrl_string, satPndSetup.clpty.num,
|
|
1648 (UBYTE)MINIMUM(ss->ss_string.c_ss_ctrl_string,
|
|
1649 MAX_DIAL_LEN-1));
|
|
1650
|
|
1651 satPndSetup.clpty.ton = ss->ss_string.noa;
|
|
1652 satPndSetup.clpty.npi = ss->ss_string.npi;
|
|
1653
|
|
1654 /*
|
|
1655 *-------------------------------------------------------------------
|
|
1656 * check for call control by SIM
|
|
1657 *-------------------------------------------------------------------
|
|
1658 */
|
|
1659 retVal = cmhSAT_SSCntrlBySIM( &satPndSetup.clpty, OWN_SAT );
|
|
1660
|
|
1661 switch( retVal )
|
|
1662 {
|
|
1663 case( AT_EXCT ):
|
|
1664 satShrdPrm.ntfy = USR_NTF_SEND_SS;
|
|
1665 return( TRUE );
|
|
1666
|
|
1667 case( AT_BUSY ):
|
|
1668 /* respond with "Interaction with call control by SIM, temporary" */
|
|
1669 psaSAT_SendTrmResp( RSLT_CC_SIM_TMP, &resp_data );
|
|
1670 return( FALSE );
|
|
1671
|
|
1672 case( AT_FAIL ):
|
|
1673 /* respond with "Interaction with call control by SIM, permanent" */
|
|
1674 resp_data.add_content = ADD_NO_CAUSE;
|
|
1675 psaSAT_SendTrmResp( RSLT_CC_SIM_PRM, &resp_data );
|
|
1676 return( FALSE );
|
|
1677 }
|
|
1678
|
|
1679 /*
|
|
1680 *-------------------------------------------------------------------
|
|
1681 * check for busy SS condition
|
|
1682 *-------------------------------------------------------------------
|
|
1683 */
|
|
1684 if( psaSS_stbFindActSrv( NO_ENTRY ) NEQ NO_ENTRY )
|
|
1685 {
|
|
1686 /* respond with "error, ME currently unable to process command" */
|
|
1687 resp_data.add_content = ADD_ME_SS_BUSY;
|
|
1688 psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data );
|
|
1689 return( FALSE );
|
|
1690 }
|
|
1691
|
|
1692 if (simShrdPrm.overall_cust_mode EQ (UBYTE)CUST_MODE_BEHAVIOUR_1)
|
|
1693 {
|
|
1694 /*
|
|
1695 ** Send the original SendSS Request to the MMI in a %SATI indication
|
|
1696 */
|
|
1697 cmhSAT_Cust1StkCmdInd();
|
|
1698
|
|
1699 satShrdPrm.ntfy = USR_NTF_SEND_SS;
|
|
1700 return( TRUE );
|
|
1701 }
|
|
1702
|
|
1703 /*
|
|
1704 *-------------------------------------------------------------------
|
|
1705 * decode and send SS string
|
|
1706 *-------------------------------------------------------------------
|
|
1707 */
|
|
1708 retVal = cmhCC_chkKeySeq ( OWN_SAT,
|
|
1709 &satPndSetup.clpty,
|
|
1710 &dummy1,
|
|
1711 &dummy2,
|
|
1712 CC_SIM_NO );
|
|
1713 if( retVal NEQ AT_EXCT )
|
|
1714 {
|
|
1715 /* respond with "error, beyond ME capabilities" */
|
|
1716 psaSAT_SendTrmResp( RSLT_ME_CAP, &resp_data );
|
|
1717 return( FALSE );
|
|
1718 }
|
|
1719
|
|
1720 satShrdPrm.ntfy = USR_NTF_SEND_SS;
|
|
1721 return( TRUE );
|
|
1722
|
|
1723 }
|
|
1724
|
|
1725 /*
|
|
1726 +-------------------------------------------------------------------+
|
|
1727 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
1728 | ROUTINE : cmhSAT_sendUSSD |
|
|
1729 +-------------------------------------------------------------------+
|
|
1730
|
|
1731 PURPOSE : This function starts a USSD transaction initiated by SAT.
|
|
1732 If the request is going to be processed, the function
|
|
1733 returns TRUE.
|
|
1734
|
|
1735 */
|
|
1736
|
|
1737 GLOBAL BOOL cmhSAT_sendUSSD ( T_SEND_USSD * ussd )
|
|
1738 {
|
|
1739 T_ACI_RETURN retVal; /* holds return value */
|
|
1740 SHORT sId; /* holds service id */
|
|
1741 T_ACI_SAT_TERM_RESP resp_data;
|
|
1742 T_sat_ussd SATCC_ussd; /* to hold USSD string in case of SAT Control */
|
|
1743
|
|
1744 psaSAT_InitTrmResp( &resp_data );
|
|
1745
|
|
1746 TRACE_FUNCTION("cmhSAT_sendUSSD()");
|
|
1747
|
|
1748 /*
|
|
1749 *-------------------------------------------------------------------
|
|
1750 * build SS string
|
|
1751 *-------------------------------------------------------------------
|
|
1752 */
|
|
1753 if( !ussd->v_ussd_string )
|
|
1754 {
|
|
1755 /* respond with "error, required values are missing" */
|
|
1756 psaSAT_SendTrmResp( RSLT_ERR_REQ_VAL, &resp_data );
|
|
1757 return( FALSE );
|
|
1758 }
|
|
1759
|
|
1760 /*
|
|
1761 *-------------------------------------------------------------------
|
|
1762 * check for call control by SIM
|
|
1763 *-------------------------------------------------------------------
|
|
1764 */
|
|
1765 if ( psaSIM_ChkSIMSrvSup(SRV_USSDsupportInCC) )
|
|
1766 {
|
|
1767 SATCC_ussd.dcs = ussd->ussd_string.dcs;
|
|
1768 SATCC_ussd.c_ussd_str = ussd->ussd_string.c_ussd_str;
|
|
1769 SATCC_ussd.ussd_str = ussd->ussd_string.ussd_str;
|
|
1770
|
|
1771 retVal = cmhSAT_USSDCntrlBySIM( &SATCC_ussd, OWN_SAT );
|
|
1772
|
|
1773 switch( retVal )
|
|
1774 {
|
|
1775 case( AT_EXCT ):
|
|
1776 satShrdPrm.ntfy = USR_NTF_SEND_USSD;
|
|
1777 return( TRUE );
|
|
1778
|
|
1779 case( AT_BUSY ):
|
|
1780 /* respond with "Interaction with call control by SIM, temporary" */
|
|
1781 psaSAT_SendTrmResp( RSLT_CC_SIM_TMP, &resp_data );
|
|
1782 return( FALSE );
|
|
1783
|
|
1784 case( AT_FAIL ):
|
|
1785 /* respond with "Interaction with call control by SIM, permanent" */
|
|
1786 resp_data.add_content = ADD_NO_CAUSE;
|
|
1787 psaSAT_SendTrmResp( RSLT_CC_SIM_PRM, &resp_data );
|
|
1788 return( FALSE );
|
|
1789 }
|
|
1790 }
|
|
1791
|
|
1792 /***********************************************************
|
|
1793 check if a SS or a USSD transaction is already in process
|
|
1794 ***********************************************************/
|
|
1795
|
|
1796 sId = psaSS_stbFindActSrv( NO_ENTRY );
|
|
1797
|
|
1798 if( sId NEQ NO_ENTRY )
|
|
1799 {
|
|
1800 if (ssShrdPrm.stb[sId].curCmd EQ KSD_CMD_USSD
|
|
1801 OR ssShrdPrm.stb[sId].curCmd EQ AT_CMD_CUSD)
|
|
1802 resp_data.add_content = ADD_ME_USSD_BUSY;
|
|
1803 else
|
|
1804 resp_data.add_content = ADD_ME_SS_BUSY;
|
|
1805
|
|
1806 resp_data.addLen = 1;
|
|
1807
|
|
1808 psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data );
|
|
1809 return( FALSE );
|
|
1810 }
|
|
1811
|
|
1812 if (simShrdPrm.overall_cust_mode EQ (UBYTE)CUST_MODE_BEHAVIOUR_1)
|
|
1813 {
|
|
1814 /*
|
|
1815 ** Send the original SendSS Request to the MMI in a %SATI indication
|
|
1816 */
|
|
1817 cmhSAT_Cust1StkCmdInd();
|
|
1818
|
|
1819 satShrdPrm.ntfy = USR_NTF_SEND_USSD;
|
|
1820 return( TRUE );
|
|
1821 }
|
|
1822
|
|
1823
|
|
1824 /* get new service table entry */
|
|
1825 sId = psaSS_stbNewEntry();
|
|
1826 if( sId EQ NO_ENTRY )
|
|
1827 {
|
|
1828 resp_data.add_content = ADD_ME_USSD_BUSY;
|
|
1829 resp_data.addLen = 1;
|
|
1830 psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data );
|
|
1831 return( FALSE );
|
|
1832 }
|
|
1833
|
|
1834 CCD_START;
|
|
1835
|
|
1836 /* TLU: save DCS for USSD v1 */
|
|
1837 ssShrdPrm.ussdDcs = ussd->ussd_string.dcs;
|
|
1838
|
|
1839 /* set data coding scheme */
|
|
1840 /* patch !!!!! CLB 11/12/01 */
|
|
1841 if( (UBYTE)ussd->ussd_string.dcs EQ 0x40 )
|
|
1842 {
|
|
1843 /* 0x40 means basically default alphabet...
|
|
1844 yet some asian networks dont seem to accept it (although using it
|
|
1845 in their own STK !!!) */
|
|
1846 ussd->ussd_string.dcs = 0x0F;
|
|
1847 }
|
|
1848 /*********************************/
|
|
1849
|
|
1850 psaSS_asmProcUSSDReq( (UBYTE)ussd->ussd_string.dcs,
|
|
1851 ussd->ussd_string.ussd_str,
|
|
1852 ussd->ussd_string.c_ussd_str );
|
|
1853
|
|
1854 /* start new transaction */
|
|
1855 ssShrdPrm.stb[sId].ntryUsdFlg = TRUE;
|
|
1856 ssShrdPrm.stb[sId].curCmd = AT_CMD_NONE;
|
|
1857 ssShrdPrm.stb[sId].srvOwn = OWN_SAT;
|
|
1858
|
|
1859 /* save ussd string for possible version 1 retry */
|
|
1860 /* if( cmhSMS_getAlphabetCb( (UBYTE)dcs ) EQ 0 ) NOT SURE ABOUT THAT !!!! clb */
|
|
1861 {
|
|
1862 if( ussd->ussd_string.c_ussd_str <= MAX_USSD_STRING )
|
|
1863 {
|
|
1864 ssShrdPrm.ussdLen = ussd->ussd_string.c_ussd_str;
|
|
1865 memcpy( ssShrdPrm.ussdBuf,
|
|
1866 ussd->ussd_string.ussd_str,
|
|
1867 ussd->ussd_string.c_ussd_str );
|
|
1868 }
|
|
1869 }
|
|
1870
|
|
1871 satShrdPrm.SentUSSDid = sId; /* save for response message */
|
|
1872
|
|
1873 psaSS_NewTrns(sId);
|
|
1874
|
|
1875 CCD_END;
|
|
1876
|
|
1877 return( TRUE );
|
|
1878
|
|
1879 }
|
|
1880
|
|
1881 /*
|
|
1882 +-------------------------------------------------------------------+
|
|
1883 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
1884 | ROUTINE : cmhSAT_sendDTMF |
|
|
1885 +-------------------------------------------------------------------+
|
|
1886
|
|
1887 PURPOSE : This function sends a DTMF sequence to the network.
|
|
1888
|
|
1889 */
|
|
1890
|
|
1891 LOCAL BOOL cmhSAT_initDTMF ( T_SEND_DTMF *dtmf )
|
|
1892 {
|
|
1893 SHORT cId; /* holds call id */
|
|
1894 T_ACI_SAT_TERM_RESP resp_data;
|
|
1895 CHAR num[MAX_CC_CALLED_NUMBER];
|
|
1896 UBYTE i;
|
|
1897 USHORT length;
|
|
1898
|
|
1899
|
|
1900 TRACE_FUNCTION("cmhSAT_initDTMF()");
|
|
1901
|
|
1902 psaSAT_InitTrmResp( &resp_data );
|
|
1903
|
|
1904 cId = cmhCC_find_call_for_DTMF( );
|
|
1905 if (cId EQ NO_ENTRY)
|
|
1906 {
|
|
1907 /* respond with "error, no speech call in process" */
|
|
1908 resp_data.add_content = ADD_ME_NO_SPCH_CALL;
|
|
1909 psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data );
|
|
1910 return( FALSE );
|
|
1911 }
|
|
1912
|
|
1913 /* check arguments */
|
|
1914 if( dtmf AND !dtmf->v_dtmf_string )
|
|
1915 {
|
|
1916 /* respond with "error, required values are missing" */
|
|
1917 psaSAT_SendTrmResp( RSLT_ERR_REQ_VAL, &resp_data );
|
|
1918 return( FALSE );
|
|
1919 }
|
|
1920 else
|
|
1921 {
|
|
1922 length = MINIMUM((dtmf ? dtmf->dtmf_string.c_bcdDigit : 0), MAX_CC_CALLED_NUMBER);
|
|
1923 if (dtmf NEQ NULL)
|
|
1924 {
|
|
1925 for(i=0; i<length; i++)
|
|
1926 {
|
|
1927 num[i] = cmhPHB_convertBCD2char(dtmf->dtmf_string.bcdDigit[i]);
|
|
1928 }
|
|
1929 }
|
|
1930 else
|
|
1931 num[0] = '\0';
|
|
1932
|
|
1933 cmhCC_chkDTMFDig( num,
|
|
1934 cId,
|
|
1935 length,
|
|
1936 FALSE );
|
|
1937
|
|
1938 ccShrdPrm.dtmf.cId = cId; /* Update the global parameter with cId */
|
|
1939 psaCC_ctb(cId)->dtmfCmd = AT_CMD_NONE ;
|
|
1940 psaCC_ctb(cId)->dtmfSrc = OWN_SAT; /* wait for confirmation */
|
|
1941 return TRUE;
|
|
1942 }
|
|
1943 }
|
|
1944
|
|
1945
|
|
1946 GLOBAL BOOL cmhSAT_sendDTMF ( T_SEND_DTMF *dtmf )
|
|
1947 {
|
|
1948 SHORT cId; /* holds call id */
|
|
1949 T_ACI_SAT_TERM_RESP resp_data;
|
|
1950 BOOL param_ok;
|
|
1951
|
|
1952 TRACE_FUNCTION("cmhSAT_sendDTMF()");
|
|
1953
|
|
1954 psaSAT_InitTrmResp( &resp_data );
|
|
1955
|
|
1956 /* if no proceeding yet, check for a voice call */
|
|
1957 if( ccShrdPrm.dtmf.cId NEQ NO_ENTRY )
|
|
1958 {
|
|
1959 cId = ccShrdPrm.dtmf.cId;
|
|
1960 if (ccShrdPrm.ctb[cId] EQ NULL OR
|
|
1961 psaCC_ctb(cId)->dtmfSrc NEQ OWN_SAT )
|
|
1962 {
|
|
1963 /* respond with "error, busy on DTMF" */
|
|
1964 /* resp_data.add_content = ADD_ME_DTMF_BUSY; */
|
|
1965 psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data );
|
|
1966 return( FALSE );
|
|
1967 }
|
|
1968 }
|
|
1969 else
|
|
1970 {
|
|
1971 /* initialize DTMF related parameters */
|
|
1972 if (!cmhSAT_initDTMF( dtmf ))
|
|
1973 return (FALSE);
|
|
1974 cId = ccShrdPrm.dtmf.cId;
|
|
1975 }
|
|
1976
|
|
1977 /* send DTMF */
|
|
1978 param_ok = cmhCC_SendDTMFdig ( AT_CMD_NONE, cId,
|
|
1979 ccShrdPrm.dtmf.dig[ccShrdPrm.dtmf.cur],
|
|
1980 DTMF_MOD_AUTO);
|
|
1981 ccShrdPrm.dtmf.cur++;
|
|
1982
|
|
1983 if( !param_ok )
|
|
1984 {
|
|
1985 /* respond with "value not recognized" */
|
|
1986 psaSAT_SendTrmResp( RSLT_ERR_REQ_VAL, &resp_data );
|
|
1987 return( FALSE );
|
|
1988 }
|
|
1989 return( TRUE );
|
|
1990 }
|
|
1991
|
|
1992 /*
|
|
1993 +-------------------------------------------------------------------+
|
|
1994 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
1995 | ROUTINE : cmhSAT_runAt |
|
|
1996 +-------------------------------------------------------------------+
|
|
1997
|
|
1998 PURPOSE : This function performs run at command for SAT.
|
|
1999 */
|
|
2000
|
|
2001 GLOBAL BOOL cmhSAT_runAt ( T_RUN_AT *run_at)
|
|
2002 {
|
|
2003 T_ACI_SAT_TERM_RESP resp_data;
|
|
2004
|
|
2005 psaSAT_InitTrmResp( &resp_data );
|
|
2006
|
|
2007 TRACE_FUNCTION("cmhSAT_runAt()");
|
|
2008
|
|
2009 if(!run_at->v_at_string)
|
|
2010 {
|
|
2011 /* respond with "error, required values are missing" */
|
|
2012 psaSAT_SendTrmResp( RSLT_ERR_REQ_VAL, &resp_data );
|
|
2013 return(FALSE);
|
|
2014 }
|
|
2015
|
|
2016 #ifdef FF_ATI
|
|
2017 if( sat_src_proc_chars (run_at->at_string) EQ FALSE )
|
|
2018 {
|
|
2019 return(FALSE);
|
|
2020 }
|
|
2021 #endif /* FF_ATI */
|
|
2022
|
|
2023 return(TRUE);
|
|
2024 }
|
|
2025
|
|
2026 /*
|
|
2027 +-------------------------------------------------------------------+
|
|
2028 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
2029 | ROUTINE : cmhSAT_setupEvent_Test |
|
|
2030 +-------------------------------------------------------------------+
|
|
2031
|
|
2032 PURPOSE : This function updates the event list to be whatched for SAT.
|
|
2033 */
|
|
2034
|
|
2035 GLOBAL BOOL cmhSAT_setupEvent_Test ( T_SETUP_EVENT *set_event,
|
|
2036 BOOL *aci_events_only )
|
|
2037 {
|
|
2038 SHORT i;
|
|
2039 BOOL mt_done = FALSE;
|
|
2040 BOOL conn_done = FALSE;
|
|
2041 BOOL disc_done = FALSE;
|
|
2042 BOOL loc_done = FALSE;
|
|
2043 #ifdef FF_SAT_E
|
|
2044 BOOL dat_avail = FALSE;
|
|
2045 BOOL chn_stat = FALSE;
|
|
2046 #endif /* FF_SAT_E */
|
|
2047 BOOL list_in_process;
|
|
2048
|
|
2049 /* ACI-SPR-18200: temporary event list, not processed by ACI */
|
|
2050 UBYTE tmpEventList[MAX_EVENT_LIST_LEN];
|
|
2051 UBYTE tmpEventListLen = 0;
|
|
2052
|
|
2053 TRACE_FUNCTION("cmhSAT_setupEvent_Test()");
|
|
2054
|
|
2055 if (set_event -> v_ev_list EQ TRUE)
|
|
2056 {
|
|
2057
|
|
2058
|
|
2059 /* erase previous list if received list is empty */
|
|
2060 if (set_event -> ev_list.c_event EQ 0L)
|
|
2061 {
|
|
2062 satShrdPrm.event.list = 0L;
|
|
2063 return TRUE;
|
|
2064 }
|
|
2065
|
|
2066 /* test events whether they are supported by ACI or not...
|
|
2067 Moreover, every event shall take place only once in the list */
|
|
2068 /* supported by ACI:
|
|
2069 EVENT_MT_CALL
|
|
2070 EVENT_CALL_CONN
|
|
2071 EVENT_CALL_DISC
|
|
2072 EVENT_LOC_STATUS
|
|
2073 EVENT_DATA_AVAIL (SAT E)
|
|
2074 EVENT_CHAN_STAT (SAT E) */
|
|
2075
|
|
2076 list_in_process = ( satShrdPrm.event.temp_list & 0x8000 ) > 0;
|
|
2077
|
|
2078 if ( list_in_process )
|
|
2079 {
|
|
2080 /*means a setup_event_list is already currently in process */
|
|
2081 return FALSE; /* TR(30) is sent by calling function */
|
|
2082 }
|
|
2083
|
|
2084 for (i=0;i<set_event -> ev_list.c_event;i++)
|
|
2085 {
|
|
2086 switch( set_event -> ev_list.event[i] )
|
|
2087 {
|
|
2088 case( EVENT_MT_CALL ):
|
|
2089 if (! mt_done )
|
|
2090 {
|
|
2091 mt_done = TRUE;
|
|
2092 }
|
|
2093 else
|
|
2094 {
|
|
2095 satShrdPrm.event.temp_list = 0L;
|
|
2096 return FALSE;
|
|
2097 }
|
|
2098 break;
|
|
2099
|
|
2100 case( EVENT_CALL_CONN ):
|
|
2101 if (! conn_done )
|
|
2102 {
|
|
2103 conn_done = TRUE;
|
|
2104 }
|
|
2105 else
|
|
2106 {
|
|
2107 satShrdPrm.event.temp_list = 0L;
|
|
2108 return FALSE;
|
|
2109 }
|
|
2110 break;
|
|
2111
|
|
2112 case( EVENT_CALL_DISC ):
|
|
2113 if (! disc_done )
|
|
2114 {
|
|
2115 disc_done = TRUE;
|
|
2116 }
|
|
2117 else
|
|
2118 {
|
|
2119 satShrdPrm.event.temp_list = 0L;
|
|
2120 return FALSE;
|
|
2121 }
|
|
2122 break;
|
|
2123
|
|
2124 case( EVENT_LOC_STATUS ):
|
|
2125 if (! loc_done )
|
|
2126 {
|
|
2127 loc_done = TRUE;
|
|
2128 }
|
|
2129 else
|
|
2130 {
|
|
2131 satShrdPrm.event.temp_list = 0L;
|
|
2132 return FALSE;
|
|
2133 }
|
|
2134 break;
|
|
2135
|
|
2136 #ifdef FF_SAT_E
|
|
2137 case( EVENT_DATA_AVAIL ):
|
|
2138 if (! dat_avail )
|
|
2139 {
|
|
2140 dat_avail = TRUE;
|
|
2141 }
|
|
2142 else
|
|
2143 {
|
|
2144 satShrdPrm.event.temp_list = 0L;
|
|
2145 return FALSE;
|
|
2146 }
|
|
2147 break;
|
|
2148
|
|
2149 case( EVENT_CHAN_STAT ):
|
|
2150 if (! chn_stat )
|
|
2151 {
|
|
2152 chn_stat = TRUE;
|
|
2153 }
|
|
2154 else
|
|
2155 {
|
|
2156 satShrdPrm.event.temp_list = 0L;
|
|
2157 return FALSE;
|
|
2158 }
|
|
2159 break;
|
|
2160 #endif /* FF_SAT_E */
|
|
2161
|
|
2162 default:
|
|
2163 satShrdPrm.event.temp_list |= (0x01 << set_event->ev_list.event[i]);
|
|
2164 /* so that the corresponding bit won't actually be set in temp_list */
|
|
2165 /* ACI-SPR-18200: add to local temp event list */
|
|
2166 tmpEventList[tmpEventListLen] = set_event->ev_list.event[i];
|
|
2167 tmpEventListLen++;
|
|
2168 break;
|
|
2169 }
|
|
2170 satShrdPrm.event.temp_list |= (0x01 << set_event->ev_list.event[i]);
|
|
2171 }
|
|
2172 }
|
|
2173 else
|
|
2174 {
|
|
2175 satShrdPrm.event.temp_list = 0L;
|
|
2176 return FALSE;
|
|
2177 }
|
|
2178
|
|
2179 satShrdPrm.event.temp_list |= 0x8000; /* to flag that a list is in process */
|
|
2180
|
|
2181 /* ACI-SPR-18200: Modify the SAT cmd send to MMI */
|
|
2182 if ( cmhSAT_copyUnprocEvents ( tmpEventList,
|
|
2183 tmpEventListLen,
|
|
2184 set_event->ev_list.c_event ) )
|
|
2185 {
|
|
2186 *aci_events_only = FALSE;
|
|
2187 }
|
|
2188 else
|
|
2189 {
|
|
2190 *aci_events_only = TRUE;
|
|
2191 }
|
|
2192
|
|
2193 return TRUE;
|
|
2194 }
|
|
2195
|
|
2196 /*
|
|
2197 +-------------------------------------------------------------------+
|
|
2198 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
2199 | ROUTINE : cmhSAT_copyUnprocEvents |
|
|
2200 +-------------------------------------------------------------------+
|
|
2201
|
|
2202 PURPOSE : Modify the event list that will be send to MMI.
|
|
2203 Insert the events that could not be processed by ACI.
|
|
2204 Returning TRUE means: Forward the current SAT command
|
|
2205 to MMI for further analysis.
|
|
2206 */
|
|
2207
|
|
2208 GLOBAL BOOL cmhSAT_copyUnprocEvents ( UBYTE* eventList,
|
|
2209 UBYTE eventListLen,
|
|
2210 UBYTE oldEventListLen)
|
|
2211 {
|
|
2212 USHORT totalLen;
|
|
2213 UBYTE lenDiff;
|
|
2214 UBYTE i;
|
|
2215 UBYTE j;
|
|
2216 UBYTE shift = 0; /* Holds the shift value */
|
|
2217
|
|
2218 TRACE_FUNCTION("cmhSAT_copyUnprocEvents()");
|
|
2219
|
|
2220 /* No modification needed, all events processed in ACI */
|
|
2221 if ( (eventListLen EQ 0) AND (oldEventListLen NEQ 0) )
|
|
2222 {
|
|
2223 return FALSE;
|
|
2224 }
|
|
2225 /* No modifiction necessary, all events are forwarded */
|
|
2226 else if ( eventListLen EQ oldEventListLen )
|
|
2227 {
|
|
2228 return TRUE;
|
|
2229 }
|
|
2230 else
|
|
2231 {
|
|
2232 /* modify SAT event list string */
|
|
2233 /* calculate difference between new and old length of event list */
|
|
2234 lenDiff = oldEventListLen - eventListLen;
|
|
2235
|
|
2236 /* modify the total length, always second (and third) byte
|
|
2237 Note: This is the only length that is critical, if the length
|
|
2238 decrement changes the total len from 2 to 1 byte representation
|
|
2239 the whole array has to be shifted one position at the end of
|
|
2240 modification. */
|
|
2241 if ( satShrdPrm.stkCmd[1] EQ 0x81 )
|
|
2242 {
|
|
2243 if ( (satShrdPrm.stkCmd[2] > 0x7F) AND
|
|
2244 ((satShrdPrm.stkCmd[2] - lenDiff) <= 0x7F )) /* mod changes repres.*/
|
|
2245 {
|
|
2246 /* forces a shift at the end of modification */
|
|
2247 shift = 1;
|
|
2248 }
|
|
2249 satShrdPrm.stkCmd[2] = satShrdPrm.stkCmd[2] - lenDiff;
|
|
2250 i = 3;
|
|
2251 }
|
|
2252 else
|
|
2253 {
|
|
2254 satShrdPrm.stkCmd[1] = satShrdPrm.stkCmd[1] - lenDiff;
|
|
2255 i = 2;
|
|
2256 }
|
|
2257
|
|
2258 /* go to index of SET UP EVENT LIST TAG */
|
|
2259 while( i < satShrdPrm.stkCmdLen )
|
|
2260 {
|
|
2261 /* Is tag set up event list TAG */
|
|
2262 if ( satShrdPrm.stkCmd[i] NEQ 0x99 )
|
|
2263 {
|
|
2264 /* go LENGTH steps ahead */
|
|
2265 /* jump over the VALUE field to the next TAG */
|
|
2266 if ( satShrdPrm.stkCmd[i+1] EQ 0x81 ) /* 2 byte length representation */
|
|
2267 {
|
|
2268 i = i + ( satShrdPrm.stkCmd[i+2] + 3 );
|
|
2269 }
|
|
2270 else
|
|
2271 {
|
|
2272 i = i + ( satShrdPrm.stkCmd[i+1] + 2 );
|
|
2273 }
|
|
2274 }
|
|
2275 else
|
|
2276 {
|
|
2277 /* found index */
|
|
2278 break;
|
|
2279 }
|
|
2280 }
|
|
2281
|
|
2282 /* insert new events and decrease length */
|
|
2283 if ( (i < satShrdPrm.stkCmdLen) AND
|
|
2284 (satShrdPrm.stkCmd[i] EQ 0x99) )
|
|
2285 {
|
|
2286 /* set index to LENGTH */
|
|
2287 i++;
|
|
2288 /* decrease length */
|
|
2289 if ( satShrdPrm.stkCmd[i] EQ 0x81 ) /* 2 byte length representation */
|
|
2290 {
|
|
2291 if ( satShrdPrm.stkCmd[i+1] - lenDiff <= 0x7F ) /*repres. changes to 1*/
|
|
2292 {
|
|
2293 satShrdPrm.stkCmd[i] = satShrdPrm.stkCmd[i+1] - lenDiff;
|
|
2294 /* set index just one byte ahead to overwrite second length byte */
|
|
2295 i++;
|
|
2296 }
|
|
2297 else
|
|
2298 {
|
|
2299 satShrdPrm.stkCmd[i+1] = satShrdPrm.stkCmd[i+1] - lenDiff;
|
|
2300 /* set index to value */
|
|
2301 i+=2;
|
|
2302 }
|
|
2303 }
|
|
2304 else /* just change the length */
|
|
2305 {
|
|
2306 satShrdPrm.stkCmd[i] = satShrdPrm.stkCmd[i] - lenDiff;
|
|
2307 /* set index to VALUE */
|
|
2308 i++;
|
|
2309 }
|
|
2310 /* write out events that have to be forwarded to MMI */
|
|
2311 for( j = 0; j < eventListLen; j++)
|
|
2312 {
|
|
2313 satShrdPrm.stkCmd[i+j] = eventList[j];
|
|
2314 }
|
|
2315
|
|
2316 /* set index to end */
|
|
2317 i = i + j;
|
|
2318 /* clear rest of array */
|
|
2319 if ( i < satShrdPrm.stkCmdLen )
|
|
2320 {
|
|
2321 while ( i < satShrdPrm.stkCmdLen )
|
|
2322 {
|
|
2323 satShrdPrm.stkCmd[i] = 0xFF;
|
|
2324 i++;
|
|
2325 }
|
|
2326 }
|
|
2327
|
|
2328 }
|
|
2329 else
|
|
2330 {
|
|
2331 TRACE_EVENT("ERROR: Could not find SET UP EVENT LIST TAG");
|
|
2332 /* reset temp list to force error response */
|
|
2333 satShrdPrm.event.temp_list = 0L;
|
|
2334 return FALSE;
|
|
2335 }
|
|
2336
|
|
2337 /* if shift is needed */
|
|
2338 /* set index to first byte of total length */
|
|
2339 i = 2;
|
|
2340 if ( shift )
|
|
2341 {
|
|
2342 for ( i = 2; i < (satShrdPrm.stkCmdLen - 1); i++ )
|
|
2343 {
|
|
2344 satShrdPrm.stkCmd[i] = satShrdPrm.stkCmd[i+1];
|
|
2345 }
|
|
2346 }
|
|
2347
|
|
2348 /* decrease the total length */
|
|
2349 totalLen = satShrdPrm.stkCmdLen - (lenDiff*8);
|
|
2350 satShrdPrm.stkCmdLen = totalLen;
|
|
2351
|
|
2352 return TRUE;
|
|
2353 }
|
|
2354 }
|
|
2355
|
|
2356 /*
|
|
2357 +-------------------------------------------------------------------+
|
|
2358 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
2359 | ROUTINE : cmhSAT_setupEvent_Perform|
|
|
2360 +-------------------------------------------------------------------+
|
|
2361
|
|
2362 PURPOSE : This function updates the event list to be whatched for SAT.
|
|
2363 */
|
|
2364
|
|
2365 GLOBAL void cmhSAT_setupEvent_Perform ( void )
|
|
2366 {
|
|
2367 TRACE_FUNCTION("cmhSAT_setupEvent_Perform()");
|
|
2368
|
|
2369 /* update list */
|
|
2370 satShrdPrm.event.list = satShrdPrm.event.temp_list;
|
|
2371
|
|
2372 satShrdPrm.event.temp_list = 0L; /* reinitialize for next setup list */
|
|
2373
|
|
2374 #if defined (FF_SAT_E) AND defined (DTI)
|
|
2375 /* inform SIM about a possible DATA AVAIL event */
|
|
2376 psaSIM_EvDatAvail(psaSAT_ChkEventList( EVENT_DATA_AVAIL ));
|
|
2377 #endif /* FF_SAT_E */
|
|
2378
|
|
2379 /*psaSAT_SendTrmResp( RSLT_PERF_SUCCESS, 0, NULL, NULL );
|
|
2380 not needed... what comes from MMI is sent to SAT */
|
|
2381 }
|
|
2382 /*
|
|
2383 +-------------------------------------------------------------------+
|
|
2384 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
2385 | ROUTINE : cmhSAT_UserRejCall |
|
|
2386 +-------------------------------------------------------------------+
|
|
2387
|
|
2388 PURPOSE : This function sends a terminal response, indicating that
|
|
2389 the user has not accept the SAT call.
|
|
2390
|
|
2391 */
|
|
2392
|
|
2393 GLOBAL void cmhSAT_UserRejCall ( UBYTE calStat )
|
|
2394 {
|
|
2395 T_ACI_SAT_TERM_RESP resp_data;
|
|
2396
|
|
2397 TRACE_FUNCTION("cmhSAT_UserRejCall()");
|
|
2398
|
|
2399 psaSAT_InitTrmResp( &resp_data );
|
|
2400
|
|
2401 #ifdef FF_SAT_E
|
|
2402 if( calStat EQ CS_SAT_CSD_REQ )
|
|
2403
|
|
2404 resp_data.chnStat = TRUE;
|
|
2405 #endif /* FF_SAT_E */
|
|
2406
|
|
2407 psaSAT_SendTrmResp( RSLT_USR_REJ, &resp_data );
|
|
2408
|
|
2409 #ifdef FF_SAT_E
|
|
2410 if( calStat EQ CS_SAT_CSD_REQ )
|
|
2411 {
|
|
2412 cmhSAT_cleanupOpChnPrms();
|
|
2413 }
|
|
2414 #endif /* FF_SAT_E */
|
|
2415 }
|
|
2416
|
|
2417 /*
|
|
2418 +-------------------------------------------------------------------+
|
|
2419 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
2420 | ROUTINE : cmhSAT_UserRejCntxt |
|
|
2421 +-------------------------------------------------------------------+
|
|
2422
|
|
2423 PURPOSE : This function sends a terminal response, indicating that
|
|
2424 the user has not accepted the SAT GPRS context.
|
|
2425
|
|
2426 */
|
|
2427
|
|
2428 #if defined (GPRS) && defined (FF_SAT_E)
|
|
2429 GLOBAL void cmhSAT_UserRejCntxt( void )
|
|
2430 {
|
|
2431 T_ACI_SAT_TERM_RESP resp_data;
|
|
2432
|
|
2433 TRACE_FUNCTION("cmhSAT_UserRejCntxt()");
|
|
2434
|
|
2435 psaSAT_InitTrmResp( &resp_data );
|
|
2436 resp_data.chnStat = TRUE;
|
|
2437
|
|
2438 psaSAT_SendTrmResp( RSLT_USR_REJ, &resp_data );
|
|
2439
|
|
2440 cmhSAT_cleanupOpChnPrms();
|
|
2441
|
|
2442 }
|
|
2443 #endif /* GPRS && SAT E */
|
|
2444
|
|
2445 /*
|
|
2446 +-------------------------------------------------------------------+
|
|
2447 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
2448 | ROUTINE : cmhSAT_CallCncted |
|
|
2449 +-------------------------------------------------------------------+
|
|
2450
|
|
2451 PURPOSE : This function sends a terminal response, indicating that
|
|
2452 the SAT call was connected.
|
|
2453
|
|
2454 */
|
|
2455
|
|
2456 GLOBAL void cmhSAT_CallCncted ( void )
|
|
2457 {
|
|
2458 T_ACI_SAT_TERM_RESP resp_data;
|
|
2459
|
|
2460 TRACE_FUNCTION("cmhSAT_CallCncted()");
|
|
2461
|
|
2462 psaSAT_InitTrmResp( &resp_data );
|
|
2463 psaSAT_SendTrmResp( RSLT_PERF_SUCCESS, &resp_data );
|
|
2464 }
|
|
2465
|
|
2466 /*
|
|
2467 +-------------------------------------------------------------------+
|
|
2468 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
2469 | ROUTINE : cmhSAT_NtwErr |
|
|
2470 +-------------------------------------------------------------------+
|
|
2471
|
|
2472 PURPOSE : This function sends a terminal response, indicating that
|
|
2473 the SAT call was not connected due to a network problem.
|
|
2474 The function will return TRUE if it is OK to send a AT
|
|
2475 result code. If a result code should be suppressed, the
|
|
2476 function will return FALSE.
|
|
2477
|
|
2478 */
|
|
2479
|
|
2480 GLOBAL UBYTE cmhSAT_NtwErr ( UBYTE cs )
|
|
2481 {
|
|
2482
|
|
2483 T_ACI_SAT_TERM_RESP resp_data;
|
|
2484 #if defined (FF_SAT_E) AND defined (DTI)
|
|
2485 T_SIM_SAT_CHN chnInf;
|
|
2486 #endif
|
|
2487 UBYTE ret = TRUE;
|
|
2488
|
|
2489 TRACE_FUNCTION("cmhSAT_NtwErr()");
|
|
2490
|
|
2491 psaSAT_InitTrmResp( &resp_data );
|
|
2492
|
|
2493 resp_data.add_content = cs;
|
|
2494
|
|
2495 #if defined (FF_SAT_E) AND defined (DTI)
|
|
2496 /* in case of a SEND DATA command, close the channel. Terminal response
|
|
2497 will be sent by SIM entity */
|
|
2498 if( satShrdPrm.chnTb.chnUsdFlg AND
|
|
2499 satShrdPrm.cmdDet.cmdType EQ SAT_CMD_SEND_DATA)
|
|
2500 {
|
|
2501 chnInf.dtiConn = SIM_DTI_UNKNOWN;
|
|
2502 chnInf.bipConn = SIM_BIP_CLOSE_CHANNEL;
|
|
2503 chnInf.chnId = CHANNEL_ID_1;
|
|
2504 chnInf.genRes = RSLT_NTW_UNAB_PROC;
|
|
2505 chnInf.addRes = cs;
|
|
2506
|
|
2507 psaSIM_SATBIPChn( chnInf, cmhSAT_OpChnClose );
|
|
2508 ret = FALSE;
|
|
2509 }
|
|
2510 /* otherwise send a terminal response */
|
|
2511 else
|
|
2512 {
|
|
2513 if( satShrdPrm.opchStat EQ OPCH_EST_REQ AND
|
|
2514 satShrdPrm.opchType EQ B_CSD )
|
|
2515 {
|
|
2516 resp_data.chnStat = TRUE;
|
|
2517 }
|
|
2518 #endif /* FF_SAT_E */
|
|
2519
|
|
2520 psaSAT_SendTrmResp( RSLT_NTW_UNAB_PROC, &resp_data );
|
|
2521
|
|
2522 #if defined (FF_SAT_E) AND defined (DTI)
|
|
2523 }
|
|
2524
|
|
2525 if( satShrdPrm.opchStat EQ OPCH_EST_REQ AND
|
|
2526 satShrdPrm.opchType EQ B_CSD )
|
|
2527 {
|
|
2528 satShrdPrm.chnTb.chnUsdFlg = FALSE;
|
|
2529 cmhSAT_cleanupOpChnPrms();
|
|
2530 }
|
|
2531 #endif /* FF_SAT_E */
|
|
2532
|
|
2533 return ret;
|
|
2534 }
|
|
2535
|
|
2536 /*
|
|
2537 +-------------------------------------------------------------------+
|
|
2538 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
2539 | ROUTINE : cmhSAT_UserClear |
|
|
2540 +-------------------------------------------------------------------+
|
|
2541
|
|
2542 PURPOSE : This function sends a terminal response, indicating that
|
|
2543 the SAT call was not connected due to a user clearance.
|
|
2544
|
|
2545 */
|
|
2546
|
|
2547 GLOBAL void cmhSAT_UserClear ( void )
|
|
2548 {
|
|
2549 T_ACI_SAT_TERM_RESP resp_data;
|
|
2550 #if defined (FF_SAT_E) AND defined (DTI)
|
|
2551 T_SIM_SAT_CHN chnInf;
|
|
2552 #endif /* FF_SAT_E */
|
|
2553
|
|
2554 TRACE_FUNCTION("cmhSAT_UserClear()");
|
|
2555
|
|
2556 psaSAT_InitTrmResp( &resp_data );
|
|
2557
|
|
2558 #if defined (FF_SAT_E) AND defined (DTI)
|
|
2559 /* in case of a SEND DATA command, close the channel. Terminal response
|
|
2560 will be sent by SIM entity */
|
|
2561 if( satShrdPrm.chnTb.chnUsdFlg AND
|
|
2562 satShrdPrm.cmdDet.cmdType EQ SAT_CMD_SEND_DATA)
|
|
2563 {
|
|
2564 chnInf.bipConn = SIM_BIP_CLOSE_CHANNEL;
|
|
2565 chnInf.dtiConn = SIM_DTI_UNKNOWN;
|
|
2566 chnInf.chnId = CHANNEL_ID_1;
|
|
2567 chnInf.genRes = RSLT_USR_CLR_DWN;
|
|
2568 chnInf.addRes = ADD_NO_CAUSE;
|
|
2569
|
|
2570 psaSIM_SATBIPChn( chnInf, cmhSAT_OpChnClose );
|
|
2571 }
|
|
2572 /* otherwise send a terminal response */
|
|
2573 else
|
|
2574 {
|
|
2575 if( satShrdPrm.opchStat EQ OPCH_EST_REQ AND
|
|
2576 satShrdPrm.opchType EQ B_CSD )
|
|
2577 {
|
|
2578 resp_data.chnStat = TRUE;
|
|
2579 }
|
|
2580 #endif /* FF_SAT_E */
|
|
2581 psaSAT_SendTrmResp( RSLT_USR_CLR_DWN, &resp_data );
|
|
2582
|
|
2583 #if defined (FF_SAT_E) AND defined (DTI)
|
|
2584 }
|
|
2585
|
|
2586 if( satShrdPrm.opchStat EQ OPCH_EST_REQ AND
|
|
2587 satShrdPrm.opchType EQ B_CSD )
|
|
2588 {
|
|
2589 satShrdPrm.chnTb.chnUsdFlg = FALSE;
|
|
2590 cmhSAT_cleanupOpChnPrms();
|
|
2591 }
|
|
2592 #endif /* FF_SAT_E */
|
|
2593 }
|
|
2594
|
|
2595 /*
|
|
2596 +-------------------------------------------------------------------+
|
|
2597 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
2598 | ROUTINE : cmhSAT_UserAcptCall |
|
|
2599 +-------------------------------------------------------------------+
|
|
2600
|
|
2601 PURPOSE : This function performs the user acceptance of the pending
|
|
2602 SAT call. If command details do not allow the operation,
|
|
2603 the function returns FALSE.
|
|
2604
|
|
2605 */
|
|
2606
|
|
2607 GLOBAL BOOL cmhSAT_UserAcptCall ( SHORT acptId, UBYTE srcId )
|
|
2608 {
|
|
2609 T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */
|
|
2610 SHORT actId; /* holds id of active call */
|
|
2611 UBYTE ctbIdx; /* holds call table index */
|
|
2612 BOOL found_call=FALSE;
|
|
2613
|
|
2614 #if defined (FAX_AND_DATA) AND defined (FF_SAT_E)
|
|
2615 T_SIM_SAT_CHN chnInf;
|
|
2616 #endif
|
|
2617
|
|
2618 TRACE_FUNCTION("cmhSAT_UserAcptCall()");
|
|
2619
|
|
2620 pCCCmdPrm = &cmhPrm[srcId].ccCmdPrm;
|
|
2621
|
|
2622 pCCCmdPrm -> mltyCncFlg = 0;
|
|
2623 pCCCmdPrm -> mltyDscFlg = 0;
|
|
2624
|
|
2625 psaCC_ctb(acptId)->curCmd = AT_CMD_A;
|
|
2626 psaCC_ctb(acptId)->curSrc = srcId;
|
|
2627
|
|
2628 /*
|
|
2629 *-------------------------------------------------------------------
|
|
2630 * perform according to command details for SETUP CALL command
|
|
2631 *-------------------------------------------------------------------
|
|
2632 */
|
|
2633 if (psaCC_ctb(acptId)->calStat EQ CS_SAT_REQ)
|
|
2634 {
|
|
2635 if( !cmhSAT_ChckCmdDet() )
|
|
2636 {
|
|
2637 psaCC_FreeCtbNtry (acptId);
|
|
2638 return( FALSE );
|
|
2639 }
|
|
2640
|
|
2641 switch( satShrdPrm.cmdDet.cmdQlf )
|
|
2642 {
|
|
2643 case( QLF_CALL_HOLD ):
|
|
2644 case( QLF_CALL_HOLD_RDL ):
|
|
2645
|
|
2646 actId = psaCC_ctbFindCall( NO_VLD_OWN, CS_ACT, NO_VLD_CT );
|
|
2647
|
|
2648 if( actId NEQ NO_ENTRY )
|
|
2649 {
|
|
2650 psaCC_ctb(actId)->SATinv = TRUE;
|
|
2651
|
|
2652 cmhCC_HoldCall(actId, psaCC_ctb(acptId)->curSrc, AT_CMD_A);
|
|
2653
|
|
2654 if( psaCC_ctb(actId)->mptyStat NEQ CS_ACT )
|
|
2655 {
|
|
2656 /* do not start building sat call, has to wait for answer for holding */
|
|
2657 return( TRUE );
|
|
2658 }
|
|
2659 }
|
|
2660 break;
|
|
2661
|
|
2662 case( QLF_CALL_DISC ):
|
|
2663 case( QLF_CALL_DISC_RDL ):
|
|
2664
|
|
2665 for( ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ )
|
|
2666 {
|
|
2667 T_CC_CALL_TBL *ctbx = ccShrdPrm.ctb[ctbIdx];
|
|
2668
|
|
2669 if (ctbx NEQ NULL AND
|
|
2670 ctbIdx NEQ acptId )
|
|
2671 {
|
|
2672 cmhCC_flagCall( ctbIdx, &(pCCCmdPrm -> mltyDscFlg));
|
|
2673 ctbx->nrmCs = MNCC_CAUSE_CALL_CLEAR;
|
|
2674 ctbx->curCmd = AT_CMD_H;
|
|
2675 ctbx->curSrc = psaCC_ctb(acptId)->curSrc;
|
|
2676 ctbx->SATinv = TRUE;
|
|
2677 psaCC_ClearCall (ctbIdx);
|
|
2678 found_call = TRUE;
|
|
2679 }
|
|
2680 }
|
|
2681
|
|
2682 if (found_call)
|
|
2683 {
|
|
2684 /* do not start building sat call, has to wait for answer for clearing */
|
|
2685 return( TRUE );
|
|
2686 }
|
|
2687 break;
|
|
2688 }
|
|
2689 }
|
|
2690
|
|
2691 /*
|
|
2692 *-------------------------------------------------------------------
|
|
2693 * perform according to command details for OPEN CHANNEL command
|
|
2694 *-------------------------------------------------------------------
|
|
2695 */
|
|
2696 #if defined (FAX_AND_DATA) AND defined (FF_SAT_E) AND defined (DTI)
|
|
2697
|
|
2698 if( psaCC_ctb(acptId)->calStat EQ CS_SAT_CSD_REQ )
|
|
2699 {
|
|
2700
|
|
2701 /* reset own to SAT */
|
|
2702 psaCC_ctb(acptId)->calOwn = OWN_SAT;
|
|
2703
|
|
2704 /* store current command source */
|
|
2705 satShrdPrm.opchAcptSrc = srcId;
|
|
2706
|
|
2707 if( satShrdPrm.opchPrm AND
|
|
2708 ((T_SAT_CSD_PRM*)satShrdPrm.opchPrm)->v_itl AND
|
|
2709 ((T_SAT_CSD_PRM*)satShrdPrm.opchPrm)->itl.trans_prot_type EQ UDP )
|
|
2710 {
|
|
2711 satShrdPrm.chnTb.chnTPL = ((T_SAT_CSD_PRM*)satShrdPrm.opchPrm)->itl.trans_prot_type;
|
|
2712 }
|
|
2713 else
|
|
2714 {
|
|
2715 satShrdPrm.chnTb.chnTPL = TPL_NONE;
|
|
2716 }
|
|
2717
|
|
2718 /* check for on-demand channel establishment */
|
|
2719 if(!(satShrdPrm.cmdDet.cmdQlf & QLF_OPCH_IMMDT_LINK_EST))
|
|
2720 {
|
|
2721 /* CASE: ON DEMAND */
|
|
2722 /* set open channel status */
|
|
2723 satShrdPrm.opchStat = OPCH_ON_DMND;
|
|
2724 }
|
|
2725 else /* immediately channel establishment */
|
|
2726 {
|
|
2727 /* CASE: IMMEDIATELY */
|
|
2728 /* check temporary problems */
|
|
2729 if( cmhSAT_OpChnChkTmpProblem() )
|
|
2730 {
|
|
2731 psaCC_FreeCtbNtry (acptId);
|
|
2732 satShrdPrm.chnTb.chnUsdFlg = FALSE;
|
|
2733
|
|
2734 return( FALSE );
|
|
2735 }
|
|
2736
|
|
2737 /* set open channel status */
|
|
2738 satShrdPrm.opchStat = OPCH_EST_REQ;
|
|
2739
|
|
2740 #ifdef DTI
|
|
2741 #ifdef CO_UDP_IP
|
|
2742 if( satShrdPrm.chnTb.chnTPL EQ UDP )
|
|
2743 {
|
|
2744 /* enable establishment of UDP data chain */
|
|
2745 sAT_PercentWAP ( psaCC_ctb(acptId)->curSrc , 1 );
|
|
2746
|
|
2747 /* setup PPP parameters */
|
|
2748 cmhSAT_OpChnSetPPP( B_CSD );
|
|
2749 }
|
|
2750 #endif /* CO_UDP_IP */
|
|
2751 #endif /* DTI */
|
|
2752 }
|
|
2753
|
|
2754 /* Establish BIP channel for immediate and on demand */
|
|
2755 chnInf.bipConn = SIM_BIP_OPEN_CHANNEL;
|
|
2756 chnInf.dtiConn = SIM_DTI_UNKNOWN;
|
|
2757 chnInf.chnId = CHANNEL_ID_1;
|
|
2758 chnInf.genRes = RSLT_PERF_SUCCESS;
|
|
2759 chnInf.addRes = ADD_NO_CAUSE;
|
|
2760
|
|
2761 /* SAT_E_PATCH: send SIM_BIP_REQ to open BIP channel */
|
|
2762 psaSIM_SATBIPChn( chnInf, cmhSAT_OpBIPChnOpen);
|
|
2763
|
|
2764 return (TRUE);
|
|
2765 }
|
|
2766 #endif /* FAX_AND_DATA AND FF_SAT_E */
|
|
2767
|
|
2768 /* finally set up call */
|
|
2769 cmhCC_flagCall( acptId, &(pCCCmdPrm->mltyCncFlg));
|
|
2770 cmhCC_NewCall(acptId, srcId, AT_CMD_A);
|
|
2771 return( TRUE );
|
|
2772 }
|
|
2773
|
|
2774 /*
|
|
2775 +-------------------------------------------------------------------+
|
|
2776 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
2777 | ROUTINE : cmhSAT_UserAcptCntxt |
|
|
2778 +-------------------------------------------------------------------+
|
|
2779
|
|
2780 PURPOSE : This function performs the user acceptance of the pending
|
|
2781 SAT GPRS context. If conditions occur, which prevent the
|
|
2782 establishment of the context, the function returns FALSE.
|
|
2783
|
|
2784 */
|
|
2785
|
|
2786 #if defined (GPRS) AND defined (FF_SAT_E) AND defined (DTI)
|
|
2787 GLOBAL BOOL cmhSAT_UserAcptCntxt( UBYTE srcId )
|
|
2788 {
|
|
2789 T_SIM_SAT_CHN chnInf; /* holds channel information */
|
|
2790 SHORT cid_array[2] = { 0,INVALID_CID };
|
|
2791
|
|
2792 TRACE_FUNCTION("cmhSAT_UserAcptCntxt()");
|
|
2793
|
|
2794 /* store current command source */
|
|
2795 satShrdPrm.opchAcptSrc = srcId;
|
|
2796 cid_array[0] = satShrdPrm.chnTb.chnRefId;
|
|
2797
|
|
2798 if( satShrdPrm.opchPrm AND
|
|
2799 ((T_SAT_GPRS_PRM*)satShrdPrm.opchPrm)->v_itl AND
|
|
2800 ((T_SAT_GPRS_PRM*)satShrdPrm.opchPrm)->itl.trans_prot_type EQ UDP )
|
|
2801 {
|
|
2802 satShrdPrm.chnTb.chnTPL = ((T_SAT_GPRS_PRM*)satShrdPrm.opchPrm)->itl.trans_prot_type;
|
|
2803 }
|
|
2804 else
|
|
2805 {
|
|
2806 satShrdPrm.chnTb.chnTPL = TPL_NONE;
|
|
2807 }
|
|
2808
|
|
2809
|
|
2810 /* check for on-demand channel establishment */
|
|
2811 if(!(satShrdPrm.cmdDet.cmdQlf & QLF_OPCH_IMMDT_LINK_EST))
|
|
2812 {
|
|
2813 /* CASE: ON DEMAND */
|
|
2814
|
|
2815 /* set open channel status */
|
|
2816 satShrdPrm.opchStat = OPCH_ON_DMND;
|
|
2817 }
|
|
2818 else
|
|
2819 {
|
|
2820 /* CASE: IMMEDIATELY */
|
|
2821
|
|
2822 /* check temporary problems */
|
|
2823 if( cmhSAT_OpChnChkTmpProblem() )
|
|
2824 {
|
|
2825 /* any reset of cid parameters should be placed here, if necessary */
|
|
2826 return( FALSE );
|
|
2827 }
|
|
2828
|
|
2829 /* set open channel status */
|
|
2830 satShrdPrm.opchStat = OPCH_EST_REQ;
|
|
2831 }
|
|
2832 /*
|
|
2833 * The activation of the GPRS context is triggered by cmhSAT_OpBIPChnOpen(),
|
|
2834 * a function processing the SIM_BIP_CNF. In the new design the BIP channel
|
|
2835 * has to be established before the bearer is started (see also
|
|
2836 * cmhSAT_UserAcptCall() for CSD case)
|
|
2837 */
|
|
2838
|
|
2839 /* Establish BIP channel for immediate and on demand */
|
|
2840 chnInf.bipConn = SIM_BIP_OPEN_CHANNEL;
|
|
2841 chnInf.dtiConn = SIM_DTI_UNKNOWN;
|
|
2842 chnInf.chnId = CHANNEL_ID_1;
|
|
2843 chnInf.genRes = RSLT_PERF_SUCCESS;
|
|
2844 chnInf.addRes = ADD_NO_CAUSE;
|
|
2845
|
|
2846 /* SAT_E_PATCH: send SIM_BIP_REQ to open BIP channel */
|
|
2847 psaSIM_SATBIPChn( chnInf, cmhSAT_OpBIPChnOpen);
|
|
2848
|
|
2849 return ( TRUE );
|
|
2850 }
|
|
2851 #endif /* GPRS AND FF_SAT_E */
|
|
2852 /*
|
|
2853 +-------------------------------------------------------------------+
|
|
2854 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
2855 | ROUTINE : cmhSAT_ChckRedial |
|
|
2856 +-------------------------------------------------------------------+
|
|
2857
|
|
2858 PURPOSE : This function checks the redialling conditions and setup
|
|
2859 the appropriate parameters.
|
|
2860
|
|
2861 */
|
|
2862
|
|
2863 GLOBAL LONG cmhSAT_ChckRedial ( SHORT cId, UBYTE v_dur, T_dur * dur )
|
|
2864 {
|
|
2865 TRACE_FUNCTION("cmhSAT_ChckRedial()");
|
|
2866
|
|
2867 satShrdPrm.dur = -1;
|
|
2868
|
|
2869 /*
|
|
2870 *-------------------------------------------------------------------
|
|
2871 * check command qualifier for redialling
|
|
2872 *-------------------------------------------------------------------
|
|
2873 */
|
|
2874 #ifdef FF_SAT_E
|
|
2875 /* in case of SETUP CALL command */
|
|
2876 if( satShrdPrm.cmdDet.cmdType EQ SAT_CMD_SETUP_CALL )
|
|
2877 #endif /* FF_SAT_E */
|
|
2878 {
|
|
2879 switch( satShrdPrm.cmdDet.cmdQlf )
|
|
2880 {
|
|
2881 case( QLF_CALL_IDLE_RDL ):
|
|
2882 case( QLF_CALL_HOLD_RDL ):
|
|
2883 case( QLF_CALL_DISC_RDL ):
|
|
2884
|
|
2885 break;
|
|
2886
|
|
2887 default:
|
|
2888
|
|
2889 return( ACI_NumParmNotPresent );
|
|
2890 }
|
|
2891 }
|
|
2892
|
|
2893 #ifdef FF_SAT_E
|
|
2894 /* in case of OPEN CHANNEL command */
|
|
2895 if( satShrdPrm.cmdDet.cmdType EQ SAT_CMD_OPEN_CHANNEL )
|
|
2896 {
|
|
2897 if(!(satShrdPrm.cmdDet.cmdQlf & QLF_OPCH_AUTO_RECONNECT))
|
|
2898
|
|
2899 return( ACI_NumParmNotPresent );
|
|
2900 }
|
|
2901 #endif /* FF_SAT_E */
|
|
2902
|
|
2903 /* calculate redial timeout */
|
|
2904 psaCC_ctb(cId)->SATinv |= SAT_REDIAL;
|
|
2905
|
|
2906 if( v_dur )
|
|
2907 {
|
|
2908 switch( dur->time_unit )
|
|
2909 {
|
|
2910 /* scale to ms */
|
|
2911 case( TU_MIN ):
|
|
2912 satShrdPrm.dur = dur->time_ivl*60000;
|
|
2913 break;
|
|
2914 case( TU_SEC ):
|
|
2915 satShrdPrm.dur = dur->time_ivl*1000;
|
|
2916 break;
|
|
2917 case( TU_100_MSEC ):
|
|
2918 satShrdPrm.dur = dur->time_ivl*100;
|
|
2919 break;
|
|
2920 default:
|
|
2921 satShrdPrm.dur = -1;
|
|
2922 }
|
|
2923 }
|
|
2924
|
|
2925
|
|
2926 return((satShrdPrm.dur EQ -1)?ACI_NumParmNotPresent:satShrdPrm.dur);
|
|
2927 }
|
|
2928
|
|
2929 /*
|
|
2930 +-------------------------------------------------------------------+
|
|
2931 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
2932 | ROUTINE : cmhSAT_StartPendingCall |
|
|
2933 +-------------------------------------------------------------------+
|
|
2934
|
|
2935 PURPOSE : This function performs the actual start of the pending
|
|
2936 SAT call.
|
|
2937 */
|
|
2938
|
|
2939 GLOBAL BOOL cmhSAT_StartPendingCall ( void )
|
|
2940 {
|
|
2941 T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */
|
|
2942 SHORT satId; /* id of sat pending call */
|
|
2943 #if defined SMI OR defined MFW OR defined FF_MMI_RIV
|
|
2944 T_ACI_CLOG cmdLog; /* holds logging info */
|
|
2945 #endif
|
|
2946
|
|
2947 TRACE_FUNCTION("cmhSAT_StartPendingCall()");
|
|
2948
|
|
2949 satId = psaCC_ctbFindCall( NO_VLD_OWN, CS_SAT_REQ, NO_VLD_CT );
|
|
2950
|
|
2951 if (satId EQ NO_ENTRY)
|
|
2952 return FALSE;
|
|
2953
|
|
2954 pCCCmdPrm = &cmhPrm[psaCC_ctb(satId)->curSrc].ccCmdPrm;
|
|
2955 TRACE_EVENT_P1("psaCC_ctb(cId)->curCmd: %d", psaCC_ctb(satId)->curCmd);
|
|
2956
|
|
2957 cmhCC_flagCall( satId, &(pCCCmdPrm -> mltyCncFlg));
|
|
2958 psaCC_NewCall(satId);
|
|
2959
|
|
2960 #if defined SMI OR defined MFW OR defined FF_MMI_RIV
|
|
2961 cmdLog.atCmd = AT_CMD_A;
|
|
2962 cmdLog.cmdType = CLOG_TYPE_Set;
|
|
2963 cmdLog.retCode = AT_EXCT;
|
|
2964 cmdLog.sId = ACI_NumParmNotPresent;
|
|
2965 cmdLog.cmdPrm.sA.srcId = psaCC_ctb(satId)->curSrc;
|
|
2966 cmdLog.cId = satId+1;
|
|
2967 rAT_PercentCLOG( &cmdLog );
|
|
2968 #endif
|
|
2969
|
|
2970 return TRUE;
|
|
2971 }
|
|
2972
|
|
2973 /*
|
|
2974 +-------------------------------------------------------------------+
|
|
2975 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
2976 | ROUTINE : cmhSAT_ChckCmdDet |
|
|
2977 +-------------------------------------------------------------------+
|
|
2978
|
|
2979 PURPOSE : This function checks the command details against the
|
|
2980 current ME status. If the mobile status does not interfere
|
|
2981 with the command details, the function returns TRUE.
|
|
2982
|
|
2983 */
|
|
2984
|
|
2985 GLOBAL BOOL cmhSAT_ChckCmdDet ( void )
|
|
2986 {
|
|
2987 SHORT ctbIdx; /* holds call table index */
|
|
2988 SHORT actId = NO_ENTRY; /* identifier for active call */
|
|
2989 SHORT hldId = NO_ENTRY; /* identifier for held call */
|
|
2990 SHORT cId = satShrdPrm.SIMCCParm.cId; /* holds setup call id */
|
|
2991 T_ACI_SAT_TERM_RESP resp_data;
|
|
2992
|
|
2993 TRACE_FUNCTION("cmhSAT_ChckCmdDet()");
|
|
2994
|
|
2995 if (!psaCC_ctbIsValid (cId))
|
|
2996 {
|
|
2997 TRACE_ERROR ("Call table entry disappeared");
|
|
2998 return FALSE;
|
|
2999 }
|
|
3000
|
|
3001 /*
|
|
3002 * From here it is guaranteed that cId describes an existing (non-NULL)
|
|
3003 * call table entry.
|
|
3004 */
|
|
3005
|
|
3006 psaSAT_InitTrmResp( &resp_data );
|
|
3007 /*
|
|
3008 *-------------------------------------------------------------------
|
|
3009 * scan call table
|
|
3010 *-------------------------------------------------------------------
|
|
3011 */
|
|
3012 for( ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ )
|
|
3013 {
|
|
3014 if (ccShrdPrm.ctb[ctbIdx] NEQ NULL)
|
|
3015 {
|
|
3016 switch( psaCC_ctb(ctbIdx)->calStat )
|
|
3017 {
|
|
3018 case( CS_ACT ):
|
|
3019 case( CS_ACT_REQ ):
|
|
3020 case( CS_MDF_REQ ):
|
|
3021
|
|
3022 actId = ctbIdx;
|
|
3023 break;
|
|
3024
|
|
3025 case( CS_HLD ):
|
|
3026 case( CS_HLD_REQ ):
|
|
3027
|
|
3028 hldId = ctbIdx;
|
|
3029 break;
|
|
3030 }
|
|
3031 }
|
|
3032 }
|
|
3033
|
|
3034 /*
|
|
3035 *-------------------------------------------------------------------
|
|
3036 * check command qualifier against ME status
|
|
3037 *-------------------------------------------------------------------
|
|
3038 */
|
|
3039 switch( satShrdPrm.cmdDet.cmdQlf )
|
|
3040 {
|
|
3041 case( QLF_CALL_IDLE ):
|
|
3042 case( QLF_CALL_IDLE_RDL ):
|
|
3043
|
|
3044 if( actId NEQ NO_ENTRY OR hldId NEQ NO_ENTRY )
|
|
3045 {
|
|
3046 resp_data.add_content = ADD_ME_CALL_BUSY;
|
|
3047 psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data );
|
|
3048 /* clear call ID */
|
|
3049 psaCC_retMOCTi(psaCC_ctb(cId)->ti);
|
|
3050 psaCC_chngCalTypCnt(cId, -1);
|
|
3051 psaCC_FreeCtbNtry (cId);
|
|
3052
|
|
3053 TRACE_EVENT("cmhSAT_ChckCmdDet(): CALL_BUSY, RSLT_ME_UNAB_PROC");
|
|
3054 return( FALSE );
|
|
3055 }
|
|
3056 break;
|
|
3057
|
|
3058 case( QLF_CALL_HOLD ):
|
|
3059 case( QLF_CALL_HOLD_RDL ):
|
|
3060
|
|
3061 if( ( hldId NEQ NO_ENTRY AND actId NEQ NO_ENTRY ) OR
|
|
3062 ( actId NEQ NO_ENTRY AND
|
|
3063 psaCC_ctb(actId)->prio EQ PRIO_NORM_CALL AND
|
|
3064 cmhCC_getcalltype(actId) NEQ VOICE_CALL ) )
|
|
3065 {
|
|
3066 psaSAT_SendTrmResp( RSLT_ME_CAP, &resp_data );
|
|
3067 TRACE_EVENT("cmhSAT_ChckCmdDet(): RSLT_ME_CAP");
|
|
3068 return( FALSE );
|
|
3069 }
|
|
3070 break;
|
|
3071
|
|
3072 case( QLF_CALL_DISC ):
|
|
3073 case( QLF_CALL_DISC_RDL ):
|
|
3074
|
|
3075 break;
|
|
3076 }
|
|
3077
|
|
3078 return( TRUE );
|
|
3079 }
|
|
3080
|
|
3081 /*
|
|
3082 +-------------------------------------------------------------------+
|
|
3083 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
3084 | ROUTINE : cmhSAT_fillSetupBC |
|
|
3085 +-------------------------------------------------------------------+
|
|
3086
|
|
3087 PURPOSE : This function fills the call table bentry with the
|
|
3088 necessary bearer service setup parameters.
|
|
3089
|
|
3090 */
|
|
3091
|
|
3092 GLOBAL void cmhSAT_fillSetupBC ( SHORT cId,
|
|
3093 UBYTE bearer_serv_1,
|
|
3094 UBYTE bearer_serv_2 )
|
|
3095 {
|
|
3096 T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
|
|
3097
|
|
3098 TRACE_FUNCTION ("cmhSAT_fillSetupBC()");
|
|
3099
|
|
3100 /*
|
|
3101 *-----------------------------------------------------------------
|
|
3102 * bearer service
|
|
3103 *-----------------------------------------------------------------
|
|
3104 */
|
|
3105 if ( bearer_serv_1 EQ BEARER_SERV_NOT_PRES )
|
|
3106 {
|
|
3107 ctb->BC[0].rate = UR_NOT_PRES;
|
|
3108 ctb->BC[0].bearer_serv = BEARER_SERV_SPEECH;
|
|
3109 ctb->BC[0].conn_elem = CONN_ELEM_NOT_PRES;
|
|
3110 }
|
|
3111 else
|
|
3112 {
|
|
3113 ctb->BC[0].rate = UR_NOT_PRES;
|
|
3114 ctb->BC[0].bearer_serv = (bearer_serv_1 EQ BEARER_SERV_SPEECH) ?
|
|
3115 cmhCC_set_speech_serv (&cmhPrm[CMD_SRC_LCL].ccCmdPrm) : bearer_serv_1;
|
|
3116 ctb->BC[0].conn_elem = CONN_ELEM_NOT_PRES;
|
|
3117 }
|
|
3118 if ( bearer_serv_2 EQ BEARER_SERV_NOT_PRES )
|
|
3119 {
|
|
3120 ctb->BC[1].rate = UR_NOT_PRES;
|
|
3121 ctb->BC[1].bearer_serv = BEARER_SERV_NOT_PRES;
|
|
3122 ctb->BC[1].conn_elem = CONN_ELEM_NOT_PRES;
|
|
3123 }
|
|
3124 else
|
|
3125 {
|
|
3126 ctb->BC[1].rate = UR_NOT_PRES;
|
|
3127 ctb->BC[1].bearer_serv = (bearer_serv_2 EQ BEARER_SERV_SPEECH) ?
|
|
3128 cmhCC_set_speech_serv (&cmhPrm[CMD_SRC_LCL].ccCmdPrm) : bearer_serv_2;
|
|
3129 ctb->BC[1].conn_elem = CONN_ELEM_NOT_PRES;
|
|
3130 }
|
|
3131 }
|
|
3132
|
|
3133
|
|
3134 /*
|
|
3135 +-------------------------------------------------------------------+
|
|
3136 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
3137 | ROUTINE : cmhSAT_convertBCDNum |
|
|
3138 +-------------------------------------------------------------------+
|
|
3139
|
|
3140 PURPOSE : This function converts the BCD number to an ascii char
|
|
3141 string
|
|
3142
|
|
3143 */
|
|
3144 LOCAL void cmhSAT_convertBCDNum(U8 *bcdNum, U16 len, CHAR *bcdChar)
|
|
3145 {
|
|
3146 int i;
|
|
3147
|
|
3148 TRACE_FUNCTION("cmhSAT_convertBCDNum");
|
|
3149
|
|
3150 memset(bcdChar, 0, MAX_PARTY_NUM_SAT);
|
|
3151
|
|
3152 for ( i=0; i < len; i++)
|
|
3153 {
|
|
3154 bcdChar[i] = bcdNum[i] + '0';
|
|
3155 }
|
|
3156
|
|
3157 }
|
|
3158
|
|
3159 /*
|
|
3160 +-------------------------------------------------------------------+
|
|
3161 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
3162 | ROUTINE : cmhSAT_fillSetupPrm |
|
|
3163 +-------------------------------------------------------------------+
|
|
3164
|
|
3165 PURPOSE : This function fills the call table entry with the
|
|
3166 necessary SAT setup parameters.
|
|
3167
|
|
3168 */
|
|
3169
|
|
3170 GLOBAL void cmhSAT_fillSetupPrm ( SHORT cId,
|
|
3171 T_addr *adr,
|
|
3172 T_subaddr *sub )
|
|
3173 {
|
|
3174 T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
|
|
3175 UBYTE i;
|
|
3176 USHORT dummy=0, length;
|
|
3177 CHAR *buf_4_dtmf;
|
|
3178 BOOL end_of_dial_string = FALSE;
|
|
3179 CHAR *number_buffer;
|
|
3180
|
|
3181 TRACE_FUNCTION ("cmhSAT_fillSetupPrm()");
|
|
3182
|
|
3183 ACI_MALLOC(number_buffer, MAX_PARTY_NUM_SAT);
|
|
3184 ACI_MALLOC(buf_4_dtmf, MAX_CC_CALLED_NUMBER+1);
|
|
3185
|
|
3186 /* called address */
|
|
3187 if( adr NEQ NULL )
|
|
3188 {
|
|
3189 /* check for emergency call code 112 */
|
|
3190 if( adr -> c_bcdDigit > 0 AND
|
|
3191 adr -> bcdDigit[adr -> c_bcdDigit-1] EQ 0x0f )
|
|
3192 {
|
|
3193 adr -> c_bcdDigit -= 1;
|
|
3194 }
|
|
3195
|
|
3196 cmhSAT_convertBCDNum(adr->bcdDigit, adr->c_bcdDigit, number_buffer);
|
|
3197
|
|
3198 /* Only use 112 as an Emmergency Call on STK */
|
|
3199 if (!strcmp(number_buffer,"112"))
|
|
3200 {
|
|
3201 ctb->prio = PRIO_EMERG_CALL;
|
|
3202 TRACE_EVENT("EMERGENCY CALL");
|
|
3203 }
|
|
3204 else
|
|
3205 ctb->prio = PRIO_NORM_CALL;
|
|
3206
|
|
3207 /* Check for DTMF tones within dial string */
|
|
3208 length = MINIMUM(adr->c_bcdDigit, MAX_CC_CALLED_NUMBER);
|
|
3209 for(i=0; i<length; i++)
|
|
3210 {
|
|
3211 /* convert address: PHB compliant */
|
|
3212 buf_4_dtmf[i] = cmhPHB_convertBCD2char( adr->bcdDigit[i] );
|
|
3213 if(buf_4_dtmf[i] EQ PHB_DTMF_SEP)
|
|
3214 {
|
|
3215 /* DTMF separator */
|
|
3216 if(!end_of_dial_string)
|
|
3217 {
|
|
3218 adr-> c_bcdDigit = i; /* split number from DTMF tones */
|
|
3219 end_of_dial_string = TRUE;
|
|
3220 }
|
|
3221 }
|
|
3222 }
|
|
3223
|
|
3224 buf_4_dtmf[length] = '\0';
|
|
3225 cmhCC_chkDTMFDig ( buf_4_dtmf, cId, dummy, TRUE );
|
|
3226
|
|
3227 /* set address */
|
|
3228 ctb->cldPty.ton = adr -> noa;
|
|
3229 ctb->cldPty.npi = adr -> npi;
|
|
3230
|
|
3231 ctb->cldPty.c_called_num = MINIMUM( MAX_SMS_ADDR_DIG, adr -> c_bcdDigit ); /* why MAX_SMS_ADDR_DIG ??? */
|
|
3232 if (ctb->cldPty.called_num NEQ NULL)
|
|
3233 {
|
|
3234 ACI_MFREE (ctb->cldPty.called_num);
|
|
3235 ctb->cldPty.called_num = NULL;
|
|
3236 }
|
|
3237 if (ctb->cldPty.c_called_num NEQ 0)
|
|
3238 {
|
|
3239 ACI_MALLOC (ctb->cldPty.called_num, ctb->cldPty.c_called_num);
|
|
3240 memcpy( ctb->cldPty.called_num,
|
|
3241 adr -> bcdDigit,
|
|
3242 ctb->cldPty.c_called_num );
|
|
3243 }
|
|
3244
|
|
3245 psaCC_phbSrchNum( cId, CT_MOC ); /* get alpha identifier */
|
|
3246
|
|
3247 }
|
|
3248
|
|
3249 /*
|
|
3250 *-----------------------------------------------------------------
|
|
3251 * called subaddress
|
|
3252 *-----------------------------------------------------------------
|
|
3253 */
|
|
3254 if( sub NEQ NULL )
|
|
3255 {
|
|
3256 if( sub -> c_bcdDigit > 0 AND
|
|
3257 sub -> bcdDigit[sub -> c_bcdDigit-1] EQ 0x0f )
|
|
3258
|
|
3259 sub -> c_bcdDigit -= 1;
|
|
3260
|
|
3261 ctb->cldPtySub.c_subaddr =
|
|
3262 MINIMUM( SUB_LENGTH, sub -> c_bcdDigit );
|
|
3263
|
|
3264 memcpy( ctb->cldPtySub.subaddr, sub -> bcdDigit,
|
|
3265 ctb->cldPtySub.c_subaddr );
|
|
3266
|
|
3267 ctb->cldPtySub.tos = sub -> tos;
|
|
3268
|
|
3269 ctb->cldPtySub.odd_even = sub -> oei;
|
|
3270 }
|
|
3271 else /* subaddress not found */
|
|
3272 {
|
|
3273 ctb->cldPtySub.tos = TOS_NOT_PRES;
|
|
3274 ctb->cldPtySub.odd_even = OE_EVEN;
|
|
3275 ctb->cldPtySub.c_subaddr = 0;
|
|
3276 }
|
|
3277
|
|
3278 /*
|
|
3279 *-----------------------------------------------------------------
|
|
3280 * clir
|
|
3281 *-----------------------------------------------------------------
|
|
3282 */
|
|
3283 ctb->CLIRsup = NOT_PRESENT_8BIT;
|
|
3284 ctb->rptInd = RI_NOT_PRES;
|
|
3285
|
|
3286 ACI_MFREE(number_buffer);
|
|
3287 ACI_MFREE(buf_4_dtmf);
|
|
3288 }
|
|
3289
|
|
3290 /*
|
|
3291 +-------------------------------------------------------------------+
|
|
3292 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
3293 | ROUTINE : cmhSAT_chkDTMF |
|
|
3294 +-------------------------------------------------------------------+
|
|
3295
|
|
3296 PURPOSE : This function extracs DTMF digit from the dial string and
|
|
3297 store them in a buffer.
|
|
3298 */
|
|
3299 #if 0
|
|
3300 GLOBAL void cmhSAT_chkDTMF ( SHORT cId, T_addr* adr )
|
|
3301 {
|
|
3302 UBYTE cnt = 0;
|
|
3303 UBYTE dtmf = 0;
|
|
3304 USHORT len = adr->c_bcdDigit;
|
|
3305
|
|
3306 /* reset dtmf parameters */
|
|
3307 satDtmfBuf.cId = -1;
|
|
3308 satDtmfBuf.cnt = 0;
|
|
3309 satDtmfBuf.cur = 0;
|
|
3310
|
|
3311 /* search first occurrence of dtmf digit */
|
|
3312 while( adr->bcdDigit[cnt] NEQ 0x0C AND cnt < len ) cnt++;
|
|
3313
|
|
3314 /* if none return */
|
|
3315 if( cnt EQ adr->c_bcdDigit ) return;
|
|
3316
|
|
3317 /* adjust num digit count */
|
|
3318 adr->c_bcdDigit = cnt;
|
|
3319
|
|
3320 /* convert to IA5 */
|
|
3321 while( cnt < len AND dtmf < MAX_DTMF_DIG )
|
|
3322 {
|
|
3323 satDtmfBuf.dig[dtmf] = cmhPHB_convertBCD2char( adr->bcdDigit[cnt] );
|
|
3324
|
|
3325 cnt++;
|
|
3326 if( satDtmfBuf.dig[dtmf] NEQ '\0' )
|
|
3327 {
|
|
3328 dtmf++; /* else erase it: that was an invalid parameter */
|
|
3329 }
|
|
3330 }
|
|
3331
|
|
3332 /* update dtmf parameter */
|
|
3333 satDtmfBuf.cnt = dtmf+1;
|
|
3334 satDtmfBuf.cur = 0;
|
|
3335 satDtmfBuf.cId = cId;
|
|
3336 }
|
|
3337 #endif /* 0 */
|
|
3338 /*
|
|
3339 +-------------------------------------------------------------------+
|
|
3340 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
3341 | ROUTINE : cmhSAT_ResCapCode |
|
|
3342 +-------------------------------------------------------------------+
|
|
3343
|
|
3344 PURPOSE : This function proceeds after the reception of a capability
|
|
3345 configuration parameter coding.
|
|
3346 */
|
|
3347
|
|
3348 GLOBAL void cmhSAT_ResCapCode ( USHORT cause, T_bcconf* bc )
|
|
3349 {
|
|
3350 SHORT cId; /* holds call id */
|
|
3351 UBYTE cmdBuf; /* buffers command */
|
|
3352 UBYTE srcBuf; /* buffers command source */
|
|
3353
|
|
3354 cId = satShrdPrm.capParm.cId;
|
|
3355
|
|
3356 if (!psaCC_ctbIsValid (cId))
|
|
3357 {
|
|
3358 TRACE_ERROR ("Call table entry disappeared");
|
|
3359 return;
|
|
3360 }
|
|
3361
|
|
3362 switch( cause )
|
|
3363 {
|
|
3364 case( MNCC_CAUSE_SUCCESS ):
|
|
3365
|
|
3366 /*
|
|
3367 *-------------------------------------------------------------------
|
|
3368 * build envelope call control command
|
|
3369 *-------------------------------------------------------------------
|
|
3370 */
|
|
3371 CCD_START;
|
|
3372 psaSAT_BuildEnvCC ( cId, NULL, NULL, bc );
|
|
3373
|
|
3374 satShrdPrm.SIMCCParm.cId = cId;
|
|
3375 satShrdPrm.SIMCCParm.ccAct = CC_ACT_CAL;
|
|
3376 satShrdPrm.SIMCCParm.owner = psaCC_ctb(cId)->calOwn;
|
|
3377 satShrdPrm.SIMCCParm.busy = TRUE;
|
|
3378
|
|
3379 satShrdPrm.owner = NO_VLD_OWN;
|
|
3380
|
|
3381 psaSAT_STKEnvelope (NULL);
|
|
3382
|
|
3383 CCD_END;
|
|
3384 break;
|
|
3385
|
|
3386 case( MNCC_CAUSE_MS_INCOMPAT_DEST ):
|
|
3387 default:
|
|
3388
|
|
3389 /*
|
|
3390 *-------------------------------------------------------------------
|
|
3391 * inform MMI about unsuccessful call setup
|
|
3392 *-------------------------------------------------------------------
|
|
3393 */
|
|
3394 /* at the moment only user caps need to be coded */
|
|
3395 cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf);
|
|
3396 psaCC_FreeCtbNtry (cId);
|
|
3397
|
|
3398 R_AT( RAT_CME, srcBuf ) ( cmdBuf, CME_ERR_NotPresent );
|
|
3399
|
|
3400 /* log result */
|
|
3401 cmh_logRslt ( srcBuf, RAT_CME, cmdBuf,
|
|
3402 -1, -1, CME_ERR_NotPresent );
|
|
3403 break;
|
|
3404 }
|
|
3405 }
|
|
3406
|
|
3407 /*
|
|
3408 +-------------------------------------------------------------------+
|
|
3409 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
3410 | ROUTINE : cmhSAT_ResCapDecode |
|
|
3411 +-------------------------------------------------------------------+
|
|
3412
|
|
3413 PURPOSE : This function proceeds after the reception of a capability
|
|
3414 configuration parameter decoding.
|
|
3415 */
|
|
3416
|
|
3417 GLOBAL void cmhSAT_ResCapDecode ( USHORT cause, T_bcpara* bc )
|
|
3418 {
|
|
3419 T_CC_CALL_TBL *ctb; /* Pointer to call table */
|
|
3420 unsigned bci; /* Bearer capability index */
|
|
3421 SHORT cId; /* holds call id */
|
|
3422 UBYTE ownNotSAT; /* flags that the owner is not SAT */
|
|
3423 UBYTE cmdBuf; /* buffers command */
|
|
3424 UBYTE srcBuf; /* buffers command */
|
|
3425 UBYTE idx; /* holds index */
|
|
3426 T_ACI_RETURN retVal; /* holds return value */
|
|
3427 T_ACI_SAT_TERM_RESP resp_data;
|
|
3428 #ifdef FF_SAT_E
|
|
3429 T_ACI_SATA_ADD addPrm;
|
|
3430 #endif /* FF_SAT_E */
|
|
3431
|
|
3432 cId = satShrdPrm.capParm.cId;
|
|
3433
|
|
3434 if (!psaCC_ctbIsValid (cId))
|
|
3435 {
|
|
3436 TRACE_ERROR ("Call table entry disappeared");
|
|
3437 return;
|
|
3438 }
|
|
3439
|
|
3440 ctb = ccShrdPrm.ctb[cId];
|
|
3441
|
|
3442 psaSAT_InitTrmResp( &resp_data );
|
|
3443
|
|
3444 ownNotSAT = ctb->calOwn NEQ OWN_SAT;
|
|
3445
|
|
3446 switch( cause )
|
|
3447 {
|
|
3448 case( MNCC_CAUSE_SUCCESS ):
|
|
3449
|
|
3450 if( ownNotSAT )
|
|
3451 {
|
|
3452 for (bci = 0; bci < 2; bci++)
|
|
3453 {
|
|
3454 if (ctb->BC[bci].bearer_serv NEQ BEARER_SERV_NOT_PRES AND
|
|
3455 ctb->BC[bci].bearer_serv NEQ BEARER_SERV_SPEECH AND
|
|
3456 ctb->BC[bci].bearer_serv NEQ BEARER_SERV_AUX_SPEECH )
|
|
3457 {
|
|
3458 ctb->BC[bci] = *bc;
|
|
3459 }
|
|
3460 }
|
|
3461 }
|
|
3462 else
|
|
3463 {
|
|
3464 ctb->BC[0] = *bc;
|
|
3465 }
|
|
3466
|
|
3467 /* check capability context */
|
|
3468 switch( satShrdPrm.capParm.cntxt )
|
|
3469 {
|
|
3470 case( CTX_SAT_SETUP ):
|
|
3471
|
|
3472 /* check for call control by SIM */
|
|
3473 retVal = cmhSAT_CalCntrlBySIM( cId );
|
|
3474
|
|
3475 switch( retVal )
|
|
3476 {
|
|
3477 case( AT_EXCT ):
|
|
3478 break;
|
|
3479
|
|
3480 case( AT_BUSY ):
|
|
3481 /* respond with "Interaction with call control by SIM, temporary" */
|
|
3482 psaSAT_SendTrmResp( RSLT_CC_SIM_TMP, &resp_data );
|
|
3483 psaCC_FreeCtbNtry (cId);
|
|
3484 break;
|
|
3485
|
|
3486 case( AT_FAIL ):
|
|
3487 /* respond with "Interaction with call control by SIM, permanent" */
|
|
3488 resp_data.add_content = ADD_NO_CAUSE;
|
|
3489 psaSAT_SendTrmResp( RSLT_CC_SIM_PRM, &resp_data );
|
|
3490 psaCC_FreeCtbNtry (cId);
|
|
3491 break;
|
|
3492 }
|
|
3493
|
|
3494 /* alert user if command details are supported */
|
|
3495 if( cmhSAT_ChckCmdDet() )
|
|
3496 {
|
|
3497 for( idx = 0; idx < CMD_SRC_MAX; idx++ )
|
|
3498 {
|
|
3499 #ifdef FF_SAT_E
|
|
3500 addPrm.chnType = SATA_CT_VOICE;
|
|
3501 addPrm.chnEst = SATA_EST_IM;
|
|
3502
|
|
3503 R_AT( RAT_SATA, idx )( cId+1, satShrdPrm.dur, &addPrm );
|
|
3504 #else /* FF_SAT_E */
|
|
3505 R_AT( RAT_SATA, idx )( cId+1, satShrdPrm.dur);
|
|
3506 #endif /* FF_SAT_E */
|
|
3507 }
|
|
3508 }
|
|
3509 else
|
|
3510
|
|
3511 psaCC_FreeCtbNtry (cId);
|
|
3512
|
|
3513 break;
|
|
3514
|
|
3515 case( CTX_CC_RESULT ):
|
|
3516
|
|
3517 cmhSAT_SetupCalAfterCCRes ( ownNotSAT, cId, satShrdPrm.capParm.CCres );
|
|
3518 break;
|
|
3519 }
|
|
3520 break;
|
|
3521
|
|
3522 case( MNCC_CAUSE_MS_INCOMPAT_DEST ):
|
|
3523 default:
|
|
3524
|
|
3525 /*
|
|
3526 *-------------------------------------------------------------------
|
|
3527 * inform about unsuccessful call setup
|
|
3528 *-------------------------------------------------------------------
|
|
3529 */
|
|
3530 /* setup initiated by user */
|
|
3531 if( ownNotSAT )
|
|
3532 {
|
|
3533 cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf);
|
|
3534 psaCC_FreeCtbNtry (cId);
|
|
3535
|
|
3536 R_AT( RAT_CME, srcBuf ) ( cmdBuf, CME_ERR_NotPresent );
|
|
3537
|
|
3538 /* log result */
|
|
3539 cmh_logRslt ( srcBuf, RAT_CME, cmdBuf,
|
|
3540 -1, -1, CME_ERR_NotPresent );
|
|
3541 }
|
|
3542 /* setup initiated by SAT */
|
|
3543 else
|
|
3544 {
|
|
3545 /* send SAT response */
|
|
3546 resp_data.resCC = (satShrdPrm.capParm.cntxt EQ CTX_CC_RESULT)?
|
|
3547 &satShrdPrm.capParm.CCres: NULL;
|
|
3548
|
|
3549 psaSAT_SendTrmResp( RSLT_ME_CAP, &resp_data );
|
|
3550 }
|
|
3551 break;
|
|
3552 }
|
|
3553 }
|
|
3554
|
|
3555 /*
|
|
3556 +-------------------------------------------------------------------+
|
|
3557 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
3558 | ROUTINE : cmhSAT_SetupCalAfterCCRes|
|
|
3559 +-------------------------------------------------------------------+
|
|
3560
|
|
3561 PURPOSE : This function proceeds with call setup after call control
|
|
3562 by SIM result.
|
|
3563 */
|
|
3564
|
|
3565 GLOBAL BOOL cmhSAT_SetupCalAfterCCRes ( UBYTE ownNotSAT, SHORT cId,
|
|
3566 UBYTE CCres)
|
|
3567 {
|
|
3568 SHORT actId; /* holds active call id */
|
|
3569 UBYTE cmdBuf; /* buffers command */
|
|
3570 UBYTE srcBuf; /* buffers command source */
|
|
3571 UBYTE idx; /* holds list index */
|
|
3572 T_ACI_SAT_TERM_RESP resp_data;
|
|
3573 #ifdef FF_SAT_E
|
|
3574 T_ACI_SATA_ADD addPrm;
|
|
3575 #endif /* FF_SAT_E */
|
|
3576
|
|
3577 psaSAT_InitTrmResp( &resp_data );
|
|
3578
|
|
3579 /*
|
|
3580 *------------------------------------------------------------
|
|
3581 * perform call setup initiated by user
|
|
3582 *------------------------------------------------------------
|
|
3583 */
|
|
3584 if( ownNotSAT )
|
|
3585 {
|
|
3586 /* check for an active call */
|
|
3587 actId = psaCC_ctbFindCall( NO_VLD_OWN, CS_ACT, NO_VLD_CT );
|
|
3588
|
|
3589 if( actId NEQ NO_ENTRY )
|
|
3590 {
|
|
3591 /* put active on hold if possible */
|
|
3592 if( psaCC_ctb(actId)->prio EQ PRIO_NORM_CALL AND
|
|
3593 cmhCC_getcalltype(cId) EQ VOICE_CALL )
|
|
3594 {
|
|
3595 cmhCC_HoldCall(actId, psaCC_ctb(cId)->curSrc, AT_CMD_D);
|
|
3596 }
|
|
3597 /* reject call setup */
|
|
3598 else
|
|
3599 {
|
|
3600 cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf);;
|
|
3601 psaCC_FreeCtbNtry (cId);
|
|
3602
|
|
3603 R_AT( RAT_CME, srcBuf ) ( cmdBuf, CME_ERR_NotPresent );
|
|
3604
|
|
3605 /* log result */
|
|
3606 cmh_logRslt ( srcBuf, RAT_CME, cmdBuf,
|
|
3607 -1, -1, CME_ERR_NotPresent );
|
|
3608 return( FALSE );
|
|
3609 }
|
|
3610 }
|
|
3611
|
|
3612 /* finally set up call */
|
|
3613 cmhCC_flagCall( cId,
|
|
3614 &(cmhPrm[psaCC_ctb(cId)->calOwn].ccCmdPrm.mltyCncFlg));
|
|
3615
|
|
3616 psaCC_NewCall(cId);
|
|
3617
|
|
3618 return( FALSE );
|
|
3619 }
|
|
3620
|
|
3621 /*
|
|
3622 *------------------------------------------------------------
|
|
3623 * perform call setup initiated by SAT
|
|
3624 *------------------------------------------------------------
|
|
3625 */
|
|
3626 else
|
|
3627 {
|
|
3628 /* alert user if command details are supported */
|
|
3629 if( cmhSAT_ChckCmdDet() )
|
|
3630 {
|
|
3631 /* check aoc condition */
|
|
3632 if ((psaCC_ctb(cId)->prio EQ PRIO_NORM_CALL) AND
|
|
3633 (aoc_check_moc() EQ FALSE))
|
|
3634 /*
|
|
3635 * check ACM exceeds ACMmax
|
|
3636 * for non-emergency calls
|
|
3637 */
|
|
3638 {
|
|
3639 resp_data.add_content = ADD_NO_CAUSE;
|
|
3640 resp_data.resCC = (CCres EQ CCR_ALLW_WITH_MDFY)? &CCres: NULL;
|
|
3641
|
|
3642 psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data);
|
|
3643 psaCC_FreeCtbNtry (cId);
|
|
3644 return( FALSE );
|
|
3645 }
|
|
3646
|
|
3647 for( idx = 0; idx < CMD_SRC_MAX; idx++ )
|
|
3648 {
|
|
3649 #ifdef FF_SAT_E
|
|
3650 addPrm.chnType = SATA_CT_VOICE;
|
|
3651 addPrm.chnEst = SATA_EST_IM;
|
|
3652
|
|
3653 R_AT( RAT_SATA, idx )( cId+1, satShrdPrm.dur, &addPrm );
|
|
3654 #else /* FF_SAT_E */
|
|
3655 R_AT( RAT_SATA, idx )( cId+1, satShrdPrm.dur );
|
|
3656 #endif /* FF_SAT_E */
|
|
3657 }
|
|
3658
|
|
3659 satShrdPrm.ntfy = USR_NTF_SETUP_CAL;
|
|
3660
|
|
3661 return( TRUE );
|
|
3662 }
|
|
3663 return( FALSE);
|
|
3664 }
|
|
3665 }
|
|
3666
|
|
3667 /*
|
|
3668 +-------------------------------------------------------------------+
|
|
3669 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
3670 | ROUTINE : cmhSAT_sendSM |
|
|
3671 +-------------------------------------------------------------------+
|
|
3672
|
|
3673 PURPOSE : This function sends a Short Message requested by SAT.
|
|
3674 If the request is going to be processed, the function
|
|
3675 returns TRUE.
|
|
3676
|
|
3677 */
|
|
3678
|
|
3679 GLOBAL BOOL cmhSAT_sendSM ( T_SEND_SM * sm )
|
|
3680 {
|
|
3681 T_ACI_RETURN retVal; /* holds return value */
|
|
3682 UBYTE fo, mn;
|
|
3683 USHORT oct_nr;
|
|
3684
|
|
3685 USHORT sca_addr_len; /* length of service center address */
|
|
3686 T_SMS_SET_PRM * pSMSSetPrm; /* points to SMS parameter set */
|
|
3687 T_ACI_SM_DATA pdu;
|
|
3688
|
|
3689 UBYTE packed_data[MAX_SM_LEN];
|
|
3690 UBYTE header_len;
|
|
3691 UBYTE dcs, *p_dcs;
|
|
3692 UBYTE udl, *p_udl;
|
|
3693 UBYTE oct_udl;
|
|
3694
|
|
3695 UBYTE *sm_cont; /* pointer to the current position in the pdu */
|
|
3696 T_ACI_SAT_TERM_RESP resp_data;
|
|
3697
|
|
3698 TRACE_FUNCTION("cmhSAT_sendSM()");
|
|
3699
|
|
3700 psaSAT_InitTrmResp( &resp_data );
|
|
3701 pdu.len = 0;
|
|
3702
|
|
3703 pSMSSetPrm = smsShrdPrm.pSetPrm[OWN_SAT];
|
|
3704
|
|
3705 /*
|
|
3706 *-------------------------------------------------------------------
|
|
3707 * check presence of SMS TPDU
|
|
3708 *-------------------------------------------------------------------
|
|
3709 */
|
|
3710 if (!sm->v_smpdu)
|
|
3711 {
|
|
3712 /* respond with "error, required values are missing" */
|
|
3713 psaSAT_SendTrmResp( RSLT_ERR_REQ_VAL, &resp_data );
|
|
3714 return( FALSE );
|
|
3715 }
|
|
3716 /*
|
|
3717 *-------------------------------------------------------------------
|
|
3718 * get SCA
|
|
3719 *-------------------------------------------------------------------
|
|
3720 */
|
|
3721 if (sm->v_addr AND sm->addr.c_bcdDigit > 0)
|
|
3722 {
|
|
3723 if (sm->addr.c_bcdDigit >= MAX_SMS_NUM_LEN)
|
|
3724 {
|
|
3725 TRACE_EVENT("cmhSAT_sendSM: ERROR SMSC address to long");
|
|
3726 /* SCA number too long */
|
|
3727 psaSAT_SendTrmResp( RSLT_ERR_REQ_VAL, &resp_data );
|
|
3728 return( FALSE );
|
|
3729 }
|
|
3730
|
|
3731 /* copy the sca into the pdu */
|
|
3732 sca_addr_len = CodeRPAddress(pdu.data,
|
|
3733 (UBYTE)sm->addr.c_bcdDigit,
|
|
3734 sm->addr.noa,
|
|
3735 sm->addr.npi,
|
|
3736 sm->addr.bcdDigit);
|
|
3737
|
|
3738 }
|
|
3739 else
|
|
3740 {
|
|
3741 /* ACI-SPR-16431: changes */
|
|
3742 if ( psaSIM_ChkSIMSrvSup( SRV_SMS_Parms ) ) /* verify that SMSP is provided */
|
|
3743 {
|
|
3744 if ( pSMSSetPrm -> sca.c_num > 0 ) /* verify that SMSP contains address */
|
|
3745 {
|
|
3746 /* ready to copy the sca into the pdu */
|
|
3747 sca_addr_len = CodeRPAddress(pdu.data,
|
|
3748 pSMSSetPrm -> sca.c_num,
|
|
3749 pSMSSetPrm -> sca.ton,
|
|
3750 pSMSSetPrm -> sca.npi,
|
|
3751 pSMSSetPrm -> sca.num);
|
|
3752 }
|
|
3753 else
|
|
3754 {
|
|
3755 /* ERROR: SMSP address EMPTY */
|
|
3756 TRACE_EVENT("cmhSAT_sendSM: ERROR: SMSP address EMPTY");
|
|
3757 psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data ); /* TR(20) */
|
|
3758 return( FALSE );
|
|
3759 }
|
|
3760 }
|
|
3761 else
|
|
3762 {
|
|
3763 /* ERROR: SMSP NOT available */
|
|
3764 TRACE_EVENT("cmhSAT_sendSM: ERROR: SMSP NOT available");
|
|
3765 psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data ); /* TR(20) */
|
|
3766 return( FALSE );
|
|
3767 }
|
|
3768 }
|
|
3769
|
|
3770 /*
|
|
3771 *-------------------------------------------------------------------
|
|
3772 * check and evaluate SMS TPDU
|
|
3773 *-------------------------------------------------------------------
|
|
3774 */
|
|
3775 if (sm->smpdu.c_tpdu_data > 0)
|
|
3776 {
|
|
3777 fo = sm->smpdu.tpdu_data[0]; /* first octet with Message Type */
|
|
3778 switch (fo & TP_MTI_MASK)
|
|
3779 {
|
|
3780 case TP_MTI_SMS_SUBMIT:
|
|
3781 if (sm->smpdu.c_tpdu_data < 7)
|
|
3782 {
|
|
3783 /* not the minimum length for TP-SUBMIT */
|
|
3784 psaSAT_SendTrmResp( RSLT_ERR_REQ_VAL, &resp_data );
|
|
3785 return( FALSE );
|
|
3786 }
|
|
3787 if (sm->smpdu.tpdu_data[2] >= MAX_SMS_NUM_LEN)
|
|
3788 {
|
|
3789 /* destination number too long */
|
|
3790 psaSAT_SendTrmResp( RSLT_ERR_REQ_VAL, &resp_data );
|
|
3791 return( FALSE );
|
|
3792 }
|
|
3793
|
|
3794 /* oct_nr is the number of bytes in address value */
|
|
3795 oct_nr = (USHORT)((sm->smpdu.tpdu_data[2] + 1) / 2);
|
|
3796 if ((oct_nr + 7) > (USHORT)sm->smpdu.c_tpdu_data)
|
|
3797 {
|
|
3798 /* number length inconsistent with overall length for TP-SUBMIT */
|
|
3799 psaSAT_SendTrmResp( RSLT_ERR_REQ_VAL, &resp_data );
|
|
3800 return( FALSE );
|
|
3801 }
|
|
3802
|
|
3803 /* sm_cont points now to TP-DCS */
|
|
3804 sm_cont = &sm->smpdu.tpdu_data[4 + oct_nr + 1];
|
|
3805 p_dcs = &pdu.data[sca_addr_len+4 + oct_nr + 1];
|
|
3806
|
|
3807 /* sm_cont points now to TP-VP */
|
|
3808 dcs = *sm_cont++;
|
|
3809
|
|
3810
|
|
3811 switch (fo & TP_VPF_MASK)
|
|
3812 {
|
|
3813 case TP_VPF_NOT_PRESENT:
|
|
3814 default:
|
|
3815 /* oct_nr is length of TP-UD */
|
|
3816 oct_nr = (USHORT)sm->smpdu.c_tpdu_data - oct_nr - 7;
|
|
3817 break;
|
|
3818
|
|
3819 case TP_VPF_RELATIVE:
|
|
3820 if ((oct_nr + 8) > (USHORT)sm->smpdu.c_tpdu_data)
|
|
3821 {
|
|
3822 /* not the required length for TP-SUBMIT with VP-RELATIVE */
|
|
3823 psaSAT_SendTrmResp( RSLT_ERR_REQ_VAL, &resp_data );
|
|
3824 return( FALSE );
|
|
3825 }
|
|
3826 /* sm_cont points now to TP-UDL */
|
|
3827 sm_cont++;
|
|
3828
|
|
3829 /* oct_nr is length of TP-UD */
|
|
3830 oct_nr = (USHORT)sm->smpdu.c_tpdu_data - oct_nr - 8;
|
|
3831 break;
|
|
3832
|
|
3833 case TP_VPF_ABSOLUTE:
|
|
3834 case TP_VPF_ENHANCED: /* treat as VP-ABSOLUTE */
|
|
3835 if ((oct_nr + 14) > (USHORT)sm->smpdu.c_tpdu_data)
|
|
3836 {
|
|
3837 /* not the required length for TP-SUBMIT with VP-ABSOLUTE */
|
|
3838 psaSAT_SendTrmResp( RSLT_ERR_REQ_VAL, &resp_data );
|
|
3839 return( FALSE );
|
|
3840 }
|
|
3841
|
|
3842 /* sm_cont points now to TP-UDL */
|
|
3843 sm_cont += 7;
|
|
3844
|
|
3845 /* oct_nr is length of TP-UD */
|
|
3846 oct_nr = (USHORT)sm->smpdu.c_tpdu_data - oct_nr - 14;
|
|
3847 break;
|
|
3848 }
|
|
3849
|
|
3850
|
|
3851 header_len = sm->smpdu.c_tpdu_data - oct_nr;
|
|
3852 p_udl = &pdu.data[sca_addr_len + header_len - 1];
|
|
3853
|
|
3854
|
|
3855 switch (cmhSMS_getAlphabetPp (dcs))
|
|
3856 {
|
|
3857 default: /* 7 bit default aphabet */
|
|
3858 if (*sm_cont > 160)
|
|
3859 {
|
|
3860 /* SM length inconsistent */
|
|
3861 psaSAT_SendTrmResp( RSLT_ERR_REQ_VAL, &resp_data );
|
|
3862 return( FALSE );
|
|
3863 }
|
|
3864 #ifdef _PACK_DEF_ALPHA
|
|
3865 /* packing required */
|
|
3866 if (satShrdPrm.cmdDet.cmdQlf EQ QLF_SMS_PACK AND
|
|
3867 (USHORT)*sm_cont EQ oct_nr) /* check if packing is valid at all
|
|
3868 (so *sm_cont must be equal of remaining bytes)
|
|
3869 otherwise do not repack the data since it seems that
|
|
3870 data has already been packed.
|
|
3871 This is CQ18268/MOBil57469 */
|
|
3872 {
|
|
3873 /* length in septets, sm_cont points now to TP-UD */
|
|
3874 udl = *sm_cont++;
|
|
3875
|
|
3876 /* oct_udl is the length of packed data in octets */
|
|
3877 oct_udl = utl_cvt8To7 (sm_cont, udl, packed_data, 0);
|
|
3878
|
|
3879 /* copy the header into the pdu */
|
|
3880 memcpy(&pdu.data[sca_addr_len], sm->smpdu.tpdu_data,
|
|
3881 header_len);
|
|
3882
|
|
3883 /* copy the packed user data into the pdu */
|
|
3884 memcpy (&pdu.data[sca_addr_len+header_len], packed_data, oct_udl);
|
|
3885
|
|
3886 pdu.len = sca_addr_len+header_len+oct_udl;
|
|
3887
|
|
3888 retVal = sAT_PlusCMGSPdu (OWN_SAT, &pdu);
|
|
3889 switch (retVal)
|
|
3890 {
|
|
3891 case AT_CMPL:
|
|
3892 psaSAT_SendTrmResp( RSLT_PERF_SUCCESS, &resp_data );
|
|
3893 return TRUE;
|
|
3894
|
|
3895 case AT_BUSY:
|
|
3896 mn = ADD_NO_CAUSE;
|
|
3897 psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data );
|
|
3898 return( FALSE );
|
|
3899
|
|
3900 case AT_FAIL:
|
|
3901 psaSAT_SendTrmResp( RSLT_ERR_REQ_VAL, &resp_data );
|
|
3902 return( FALSE );
|
|
3903 }
|
|
3904 return TRUE;
|
|
3905 } /* if (satShrdPrm.cmdDet.cmdQlf EQ QLF_SMS_PACK) */
|
|
3906 else
|
|
3907 #endif /* _PACK_DEF_ALPHA: ignore PACKING REQUIRED for GSM default
|
|
3908 alphabet, when not set */
|
|
3909 {
|
|
3910 /* packing not required */
|
|
3911 udl = *sm_cont;
|
|
3912 oct_udl = ((*sm_cont + 1)*7)/8;
|
|
3913 }
|
|
3914 break;
|
|
3915
|
|
3916
|
|
3917 case 1: /* 8 bit data */
|
|
3918 if (satShrdPrm.cmdDet.cmdQlf EQ QLF_SMS_PACK
|
|
3919 AND ((dcs & 0xE0) NEQ 0x20))
|
|
3920 { /* packing only, when text is uncompressed */
|
|
3921 if ((USHORT)*sm_cont > oct_nr OR *sm_cont > 160)
|
|
3922 {
|
|
3923 /* SM length inconsistent */
|
|
3924 psaSAT_SendTrmResp( RSLT_ERR_REQ_VAL, &resp_data );
|
|
3925 return( FALSE );
|
|
3926 }
|
|
3927 if ((dcs & 0xC0) EQ 0)
|
|
3928 dcs &= 0xF3; /* adjust coding group 00xx */
|
|
3929 else if ((dcs & 0xF0) EQ 0xF0)
|
|
3930 dcs &= 0xFB; /* adjust coding group 1111 */
|
|
3931
|
|
3932 /* length in septets, sm_cont points now to TP-UD */
|
|
3933 udl = *sm_cont++;
|
|
3934
|
|
3935 /* oct_udl is the length of packed data in octets */
|
|
3936 oct_udl = utl_cvt8To7 (sm_cont, udl, packed_data, 0);
|
|
3937
|
|
3938 /* copy the header into the pdu */
|
|
3939 memcpy(&pdu.data[sca_addr_len], sm->smpdu.tpdu_data,
|
|
3940 header_len);
|
|
3941
|
|
3942 /* copy the dcs into the pdu */
|
|
3943 *p_dcs = dcs;
|
|
3944
|
|
3945 /* copy the packed user data into the pdu */
|
|
3946 memcpy (&pdu.data[sca_addr_len+header_len], packed_data, oct_udl);
|
|
3947
|
|
3948 pdu.len = sca_addr_len+header_len+oct_udl;
|
|
3949
|
|
3950 retVal = sAT_PlusCMGSPdu (OWN_SAT, &pdu);
|
|
3951 switch (retVal)
|
|
3952 {
|
|
3953 case AT_CMPL:
|
|
3954 psaSAT_SendTrmResp( RSLT_PERF_SUCCESS, &resp_data );
|
|
3955 return TRUE;
|
|
3956
|
|
3957 case AT_BUSY:
|
|
3958 mn = ADD_NO_CAUSE;
|
|
3959 psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data );
|
|
3960 return( FALSE );
|
|
3961
|
|
3962 case AT_FAIL:
|
|
3963 psaSAT_SendTrmResp( RSLT_ERR_REQ_VAL, &resp_data );
|
|
3964 return( FALSE );
|
|
3965 }
|
|
3966 return TRUE;
|
|
3967 }
|
|
3968 /* sandip CQ - 18269
|
|
3969 * To take care of a case where Command qualifier == 0x00( packing not required )
|
|
3970 * DCS == 0x04( 8 -bit packing )
|
|
3971 * TPDU length >140
|
|
3972 */
|
|
3973
|
|
3974 /*
|
|
3975 else if((satShrdPrm.cmdDet.cmdQlf EQ QLF_SMS_NO_PACK) && (oct_nr > 140))
|
|
3976 {
|
|
3977 psaSAT_SendTrmResp(RSLT_UNKN_DATA,&resp_data);
|
|
3978 return(FALSE);
|
|
3979 }*/
|
|
3980 else
|
|
3981 {
|
|
3982 if(oct_nr > 140)
|
|
3983 {
|
|
3984 psaSAT_SendTrmResp(RSLT_UNKN_DATA,&resp_data);
|
|
3985 return(FALSE);
|
|
3986 }
|
|
3987 /* packing not required */
|
|
3988 udl = *sm_cont;
|
|
3989 oct_udl = *sm_cont;
|
|
3990 }
|
|
3991 break;
|
|
3992
|
|
3993 case 2: /* UCS2 */
|
|
3994 /*
|
|
3995 * Special consideration: are octets (incorrect) or UCS2
|
|
3996 * characters (correct) counted by SAT?
|
|
3997 */
|
|
3998 if ((USHORT)*sm_cont EQ oct_nr)
|
|
3999 oct_udl = *sm_cont++; /* assume octet count */
|
|
4000 else
|
|
4001 oct_udl= *sm_cont++ * 2; /* assume character count */
|
|
4002 udl = oct_udl;
|
|
4003 break;
|
|
4004 } /* switch (cmhSMS_getAlphabetPp (dcs)) */
|
|
4005
|
|
4006
|
|
4007 if ((USHORT)oct_udl > oct_nr OR oct_udl > MAX_SM_LEN)
|
|
4008 {
|
|
4009 /* SM length inconsistent */
|
|
4010 psaSAT_SendTrmResp( RSLT_ERR_REQ_VAL, &resp_data );
|
|
4011 return( FALSE );
|
|
4012 }
|
|
4013
|
|
4014 /* copy the tpdu data into the pdu */
|
|
4015 memcpy(&pdu.data[sca_addr_len], sm->smpdu.tpdu_data, sm->smpdu.c_tpdu_data);
|
|
4016
|
|
4017 /* copy the udl into the pdu */
|
|
4018 *p_udl = udl;
|
|
4019
|
|
4020 pdu.len = sca_addr_len + sm->smpdu.c_tpdu_data;
|
|
4021
|
|
4022 retVal = sAT_PlusCMGSPdu (OWN_SAT, &pdu);
|
|
4023 switch (retVal)
|
|
4024 {
|
|
4025 case AT_CMPL:
|
|
4026 psaSAT_SendTrmResp( RSLT_PERF_SUCCESS, &resp_data );
|
|
4027 return TRUE;
|
|
4028
|
|
4029 case AT_BUSY:
|
|
4030 mn = ADD_NO_CAUSE;
|
|
4031 psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data );
|
|
4032 return( FALSE );
|
|
4033
|
|
4034 case AT_FAIL:
|
|
4035 psaSAT_SendTrmResp( RSLT_ERR_REQ_VAL, &resp_data );
|
|
4036 return( FALSE );
|
|
4037 } /* end switch (retVal) */
|
|
4038 return TRUE;
|
|
4039
|
|
4040
|
|
4041 case TP_MTI_SMS_COMMAND:
|
|
4042 if (sm->smpdu.c_tpdu_data < 8)
|
|
4043 {
|
|
4044 /* not the minimum length for TP-COMMAND */
|
|
4045 psaSAT_SendTrmResp( RSLT_ERR_REQ_VAL, &resp_data );
|
|
4046 return( FALSE );
|
|
4047 }
|
|
4048 if (sm->smpdu.tpdu_data[5] >= MAX_SMS_NUM_LEN)
|
|
4049 {
|
|
4050 /* destination number too long */
|
|
4051 psaSAT_SendTrmResp( RSLT_ERR_REQ_VAL, &resp_data );
|
|
4052 return( FALSE );
|
|
4053 }
|
|
4054 oct_nr = (USHORT)((sm->smpdu.tpdu_data[5] + 1) / 2);
|
|
4055 if ((oct_nr + 8) > (USHORT)sm->smpdu.c_tpdu_data)
|
|
4056 {
|
|
4057 /* number length inconsistent with overall length for TP-SUBMIT */
|
|
4058 psaSAT_SendTrmResp( RSLT_ERR_REQ_VAL, &resp_data );
|
|
4059 return( FALSE );
|
|
4060 }
|
|
4061
|
|
4062 /*
|
|
4063 ** If the MMI is a Cust1 Application
|
|
4064 */
|
|
4065 if (simShrdPrm.overall_cust_mode EQ (UBYTE)CUST_MODE_BEHAVIOUR_1)
|
|
4066 {
|
|
4067 /*
|
|
4068 ** Having performed some checks,
|
|
4069 ** don't send the primitve, but pass the entire command to the MMI for processing.
|
|
4070 ** NOTE: An SMS Command is not passed to the SIM for MO SMS Control By SIM
|
|
4071 **
|
|
4072 ** Ensure that the SMS parameters are reset, so that the SMS Entity is freed to
|
|
4073 ** process the command later.
|
|
4074 */
|
|
4075 smsShrdPrm.smsEntStat.curCmd = AT_CMD_NONE;
|
|
4076 smsShrdPrm.smsEntStat.entOwn = smsShrdPrm.owner = CMD_SRC_NONE;
|
|
4077
|
|
4078 cmhSAT_Cust1StkCmdInd();
|
|
4079 return TRUE;
|
|
4080 }
|
|
4081
|
|
4082 memcpy(&pdu.data[sca_addr_len], sm->smpdu.tpdu_data, sm->smpdu.c_tpdu_data);
|
|
4083 retVal = sAT_PlusCMGCPdu (OWN_SAT, &pdu);
|
|
4084 switch (retVal)
|
|
4085 {
|
|
4086 case AT_CMPL:
|
|
4087 psaSAT_SendTrmResp( RSLT_PERF_SUCCESS, &resp_data );
|
|
4088 return TRUE;
|
|
4089
|
|
4090 case AT_BUSY:
|
|
4091 mn = ADD_NO_CAUSE;
|
|
4092 psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data );
|
|
4093 return( FALSE );
|
|
4094
|
|
4095 case AT_FAIL:
|
|
4096 psaSAT_SendTrmResp( RSLT_ERR_REQ_VAL, &resp_data );
|
|
4097 return( FALSE );
|
|
4098 }
|
|
4099 return TRUE;
|
|
4100
|
|
4101 default:
|
|
4102 /* invalid message type */
|
|
4103 psaSAT_SendTrmResp( RSLT_UNKN_DATA, &resp_data );
|
|
4104 return( FALSE );
|
|
4105 } /* end switch (fo & TP_MTI_MASK) */
|
|
4106 }
|
|
4107 else /* if (sm->smpdu.c_tpdu_data > 0) */
|
|
4108 {
|
|
4109 /* respond with "error, required values are missing" */
|
|
4110 psaSAT_SendTrmResp( RSLT_ERR_REQ_VAL, &resp_data );
|
|
4111 return( FALSE );
|
|
4112 }
|
|
4113 }
|
|
4114
|
|
4115 /*
|
|
4116 +-------------------------------------------------------------------+
|
|
4117 | PROJECT : GSM-PS (6147) MODULE : CMH |
|
|
4118 | ROUTINE : cmhSAT_CheckSetEventResp|
|
|
4119 +-------------------------------------------------------------------+
|
|
4120
|
|
4121 PURPOSE : check for an answer to a setup event list. function
|
|
4122 returns TRUE if caller has to forward the checked
|
|
4123 SAT response
|
|
4124 */
|
|
4125
|
|
4126 GLOBAL BOOL cmhSAT_CheckSetEventResp ( void )
|
|
4127 {
|
|
4128 BOOL list_in_process;
|
|
4129 const UBYTE TermRespSetEventOk [12] =
|
|
4130 {
|
|
4131 0x81, /* command details tag */
|
|
4132 0x03, /* command details length */
|
|
4133 0x13, /* command number */
|
|
4134 0x05, /* command SETUP EVENT LIST */
|
|
4135 0x00, /* not used */
|
|
4136 0x82, /* device details tag */
|
|
4137 0x02, /* device details length */
|
|
4138 0x82, /* source ME */
|
|
4139 0x81, /* destination SIM */
|
|
4140 0x83, /* result tag */
|
|
4141 0x01, /* result length */
|
|
4142 0x00 /* result OK */
|
|
4143 };
|
|
4144 const UBYTE TermRespSetEvent [4] =
|
|
4145 {
|
|
4146 0x81, /* command details tag */
|
|
4147 0x03, /* command details length */
|
|
4148 0x13, /* command number */
|
|
4149 0x05, /* command SETUP EVENT LIST */
|
|
4150 };
|
|
4151 UBYTE *p;
|
|
4152
|
|
4153 T_ACI_SAT_TERM_RESP resp_data;
|
|
4154
|
|
4155 TRACE_FUNCTION("cmhSAT_CheckSetEventResp");
|
|
4156
|
|
4157 psaSAT_InitTrmResp( &resp_data );
|
|
4158
|
|
4159 list_in_process = ( satShrdPrm.event.temp_list & 0x8000 ) > 0L;
|
|
4160
|
|
4161 if ( list_in_process )
|
|
4162 {
|
|
4163
|
|
4164 p = (satShrdPrm.setPrm[satShrdPrm.owner].stkCmd);
|
|
4165
|
|
4166 if ((!memcmp((const UBYTE*) p, TermRespSetEvent,2)) AND (p[3] EQ TermRespSetEvent[3])) /* TRUE means: answer to a SETUP EVENT Command */
|
|
4167 {
|
|
4168 if (!memcmp((const UBYTE*) p+3, TermRespSetEventOk+3, 9)) /* TRUE means: answer ok */
|
|
4169 {
|
|
4170 cmhSAT_setupEvent_Perform(); /* accept list */
|
|
4171 TRACE_EVENT("New Download Event List accepted ");
|
|
4172 return TRUE; /* caller has to send/forward TR */
|
|
4173 }
|
|
4174 else
|
|
4175 {
|
|
4176 /* MMI couldn't perform the list: ACI doesn't perform it and returns
|
|
4177 Beyond Mobile Capabilities */
|
|
4178 psaSAT_SendTrmResp( RSLT_ME_CAP, &resp_data );
|
|
4179 TRACE_EVENT("New Download Event List refused by MMI");
|
|
4180 satShrdPrm.event.temp_list = 0L; /* reinitialize for next setup list */
|
|
4181 return FALSE; /* caller hasn't to send TR, already sent! */
|
|
4182 }
|
|
4183 }
|
|
4184 else
|
|
4185 {
|
|
4186 return TRUE; /* caller has to send/forward TR */
|
|
4187 }
|
|
4188 }
|
|
4189 return TRUE; /* caller has to send/forward TR */
|
|
4190 }
|
|
4191
|
|
4192 /* SAT CLASS E FUNCTIONS START */
|
|
4193 #ifdef FF_SAT_E
|
|
4194
|
|
4195 /*
|
|
4196 +-------------------------------------------------------------------+
|
|
4197 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
4198 | ROUTINE : cmhSAT_CloseChannel |
|
|
4199 +-------------------------------------------------------------------+
|
|
4200
|
|
4201 PURPOSE : This function handles the request by SAT to close a
|
|
4202 desired channel. If the request is going to be processed,
|
|
4203 the function returns TRUE.
|
|
4204
|
|
4205 */
|
|
4206
|
|
4207 GLOBAL BOOL cmhSAT_CloseChannel ( void )
|
|
4208 {
|
|
4209 T_SIM_SAT_CHN chnInf;
|
|
4210
|
|
4211 TRACE_FUNCTION("cmhSAT_CloseChannel()");
|
|
4212
|
|
4213 /*
|
|
4214 *-------------------------------------------------------------------
|
|
4215 * notify about SAT command
|
|
4216 *-------------------------------------------------------------------
|
|
4217 */
|
|
4218 cmhSAT_STKUsrNtfy();
|
|
4219
|
|
4220 /*
|
|
4221 *-------------------------------------------------------------------
|
|
4222 * check channel status
|
|
4223 *-------------------------------------------------------------------
|
|
4224 */
|
|
4225 if( satShrdPrm.chnTb.chnUsdFlg )
|
|
4226 {
|
|
4227 chnInf.bipConn = SIM_BIP_UNKNOWN;
|
|
4228 chnInf.dtiConn = SIM_DTI_UNKNOWN;
|
|
4229
|
|
4230 if( satShrdPrm.chnTb.lnkStat EQ SIM_LINK_OPEN )
|
|
4231 {
|
|
4232 chnInf.bipConn = SIM_BIP_CLOSE_CHANNEL;
|
|
4233
|
|
4234 }
|
|
4235 if( satShrdPrm.chnTb.lnkStat EQ SIM_LINK_CNCT )
|
|
4236 {
|
|
4237 chnInf.bipConn = SIM_BIP_CLOSE_CHANNEL;
|
|
4238 chnInf.dtiConn = SIM_DTI_DISCONNECT;
|
|
4239 }
|
|
4240
|
|
4241 satShrdPrm.opchStat = OPCH_CLS_REQ;
|
|
4242
|
|
4243 if( chnInf.bipConn )
|
|
4244 {
|
|
4245 #ifdef DTI
|
|
4246
|
|
4247 chnInf.chnId = CHANNEL_ID_1;
|
|
4248 chnInf.genRes = RSLT_PERF_SUCCESS;
|
|
4249 chnInf.addRes = ADD_NO_CAUSE;
|
|
4250
|
|
4251 psaSIM_SATBIPChn( chnInf, NULL /*cmhSAT_OpChnClose*/);
|
|
4252 #endif /* DTI */
|
|
4253 }
|
|
4254 else
|
|
4255 {
|
|
4256 cmhSAT_OpChnClose( SIM_BIP_CLOSE_CHANNEL, 1 );
|
|
4257 }
|
|
4258 }
|
|
4259
|
|
4260 return TRUE;
|
|
4261 }
|
|
4262
|
|
4263 /*
|
|
4264 +-------------------------------------------------------------------+
|
|
4265 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
4266 | ROUTINE : cmhSAT_SendData |
|
|
4267 +-------------------------------------------------------------------+
|
|
4268
|
|
4269 PURPOSE : This function handles the request by SAT to open a
|
|
4270 desired channel immediately. If the request is going to
|
|
4271 be processed, the function returns TRUE.
|
|
4272
|
|
4273 */
|
|
4274
|
|
4275 GLOBAL BOOL cmhSAT_SendData ( void )
|
|
4276 {
|
|
4277 TRACE_FUNCTION("cmhSAT_SendData()");
|
|
4278
|
|
4279 /*
|
|
4280 *-------------------------------------------------------------------
|
|
4281 * notify about SAT command
|
|
4282 *-------------------------------------------------------------------
|
|
4283 */
|
|
4284 cmhSAT_STKUsrNtfy();
|
|
4285
|
|
4286 /*
|
|
4287 *-------------------------------------------------------------------
|
|
4288 * check if on demand channel activation has to be performed
|
|
4289 *-------------------------------------------------------------------
|
|
4290 */
|
|
4291 if( satShrdPrm.opchStat EQ OPCH_ON_DMND AND
|
|
4292 satShrdPrm.chnTb.lnkStat EQ SIM_LINK_OPEN AND
|
|
4293 satShrdPrm.cmdDet.cmdQlf & QLF_OPCH_IMMDT_LINK_EST )
|
|
4294 {
|
|
4295 satShrdPrm.opchStat = OPCH_EST_REQ;
|
|
4296
|
|
4297 /*
|
|
4298 *-------------------------------------------------------------------
|
|
4299 * for a CSD channel
|
|
4300 *-------------------------------------------------------------------
|
|
4301 */
|
|
4302 if( satShrdPrm.opchType EQ B_CSD )
|
|
4303 {
|
|
4304 if (!psaCC_ctbIsValid (satShrdPrm.chnTb.chnRefId))
|
|
4305 {
|
|
4306 TRACE_ERROR ("Call table entry disappeared");
|
|
4307 satShrdPrm.chnTb.chnUsdFlg = FALSE;
|
|
4308
|
|
4309 return ( FALSE );
|
|
4310 }
|
|
4311
|
|
4312 /* check temporary problems */
|
|
4313 if( cmhSAT_OpChnChkTmpProblem() )
|
|
4314 {
|
|
4315 /* remove call table entry */
|
|
4316 psaCC_FreeCtbNtry (satShrdPrm.chnTb.chnRefId);
|
|
4317 satShrdPrm.chnTb.chnUsdFlg = FALSE;
|
|
4318
|
|
4319 return( FALSE );
|
|
4320 }
|
|
4321 #ifdef DTI
|
|
4322 #ifdef CO_UDP_IP
|
|
4323 if( satShrdPrm.chnTb.chnTPL EQ UDP )
|
|
4324 {
|
|
4325 /* enable establishment of UDP data chain */
|
|
4326 sAT_PercentWAP ( psaCC_ctb(satShrdPrm.chnTb.chnRefId)->curSrc , 1 );
|
|
4327
|
|
4328 /* setup PPP parameters */
|
|
4329 cmhSAT_OpChnSetPPP( satShrdPrm.opchType );
|
|
4330 }
|
|
4331 #endif /* CO_UDP_IP */
|
|
4332 #endif /* DTI */
|
|
4333
|
|
4334 /* set up call */
|
|
4335 cmhPrm[satShrdPrm.opchAcptSrc].ccCmdPrm.mltyCncFlg = 0;
|
|
4336
|
|
4337 cmhCC_flagCall( satShrdPrm.chnTb.chnRefId, &cmhPrm[satShrdPrm.opchAcptSrc].
|
|
4338 ccCmdPrm.mltyCncFlg);
|
|
4339 /* ccShrdPrm.ctb[satShrdPrm.chnTb.chnRefId].curCmd = AT_CMD_A; */
|
|
4340 /* ccShrdPrm.ctb[satShrdPrm.chnTb.chnRefId].curSrc = satShrdPrm.opchAcptSrc; */
|
|
4341 /* psaCC_NewCall ( satShrdPrm.chnTb.chnRefId ); */
|
|
4342 cmhCC_NewCall( satShrdPrm.chnTb.chnRefId,
|
|
4343 satShrdPrm.opchAcptSrc,
|
|
4344 AT_CMD_A);
|
|
4345 return( TRUE );
|
|
4346 }
|
|
4347 /*
|
|
4348 *-------------------------------------------------------------------
|
|
4349 * for a GPRS channel
|
|
4350 *-------------------------------------------------------------------
|
|
4351 */
|
|
4352 #if defined (GPRS) AND defined (DTI)
|
|
4353 else if( satShrdPrm.opchType EQ B_GPRS )
|
|
4354 {
|
|
4355 SHORT cid_array[2] = { 0,INVALID_CID };
|
|
4356 cid_array[0] = satShrdPrm.chnTb.chnRefId;
|
|
4357
|
|
4358 /* check temporary problems */
|
|
4359 if( cmhSAT_OpChnChkTmpProblem() )
|
|
4360 {
|
|
4361 /* any reset of cid parameters should be placed here,
|
|
4362 * if necessary
|
|
4363 */
|
|
4364 return( FALSE );
|
|
4365 }
|
|
4366
|
|
4367 #ifdef DTI
|
|
4368 #ifdef CO_UDP_IP
|
|
4369 /* activate the context with UDP */
|
|
4370 if( satShrdPrm.chnTb.chnTPL EQ UDP )
|
|
4371 {
|
|
4372 /* enable establishment of UDP data chain */
|
|
4373 sAT_PercentWAP ( satShrdPrm.opchAcptSrc , 1 );
|
|
4374
|
|
4375 /* setup PPP parameters */
|
|
4376 cmhSAT_OpChnSetPPP( B_GPRS );
|
|
4377
|
|
4378 /* activate context with UDP */
|
|
4379 cmhSAT_OpChnUDPActivateGprs();
|
|
4380 }
|
|
4381 else
|
|
4382 #endif /* CO_UDP_IP */
|
|
4383 #endif /* DTI */
|
|
4384
|
|
4385 /* activate context with no transport layer */
|
|
4386 if( sAT_PlusCGACT( satShrdPrm.opchAcptSrc, CGACT_STATE_ACTIVATED, cid_array )
|
|
4387 NEQ AT_EXCT )
|
|
4388
|
|
4389 return( FALSE );
|
|
4390
|
|
4391 satShrdPrm.opchStat = OPCH_EST_REQ;
|
|
4392
|
|
4393 return( TRUE );
|
|
4394 }
|
|
4395 #endif /* GPRS */
|
|
4396 /*
|
|
4397 *-------------------------------------------------------------------
|
|
4398 * invalid channel
|
|
4399 *-------------------------------------------------------------------
|
|
4400 */
|
|
4401 else
|
|
4402 {
|
|
4403 T_ACI_SAT_TERM_RESP resp_data;
|
|
4404
|
|
4405 TRACE_ERROR("invalid channel found, on demand est. failed");
|
|
4406
|
|
4407 psaSAT_InitTrmResp( &resp_data );
|
|
4408 resp_data.add_content = ADD_NO_CAUSE;
|
|
4409
|
|
4410 cmhSAT_OpChnFailed( RSLT_ME_UNAB_PROC, &resp_data );
|
|
4411
|
|
4412 cmhSAT_cleanupOpChnPrms();
|
|
4413
|
|
4414 }
|
|
4415 }
|
|
4416
|
|
4417 return FALSE;
|
|
4418 }
|
|
4419
|
|
4420 /*
|
|
4421 +-------------------------------------------------------------------+
|
|
4422 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
4423 | ROUTINE : cmhSAT_GetChannelStatus |
|
|
4424 +-------------------------------------------------------------------+
|
|
4425
|
|
4426 PURPOSE : This function handles the request by SAT to return the
|
|
4427 current status of all channels. If the request is going
|
|
4428 to be processed, the function returns TRUE.
|
|
4429
|
|
4430 */
|
|
4431
|
|
4432 GLOBAL BOOL cmhSAT_GetChannelStatus ( void )
|
|
4433 {
|
|
4434 T_ACI_SAT_TERM_RESP resp_data;
|
|
4435
|
|
4436 psaSAT_InitTrmResp( &resp_data );
|
|
4437
|
|
4438
|
|
4439 TRACE_FUNCTION("cmhSAT_GetChannelStatus()");
|
|
4440
|
|
4441 /*
|
|
4442 *-------------------------------------------------------------------
|
|
4443 * notify about SAT command
|
|
4444 *-------------------------------------------------------------------
|
|
4445 */
|
|
4446 cmhSAT_STKUsrNtfy();
|
|
4447
|
|
4448 /*
|
|
4449 *-------------------------------------------------------------------
|
|
4450 * return channel status
|
|
4451 *-------------------------------------------------------------------
|
|
4452 */
|
|
4453 resp_data.chnStat = TRUE;
|
|
4454
|
|
4455 psaSAT_SendTrmResp( RSLT_PERF_SUCCESS, &resp_data );
|
|
4456
|
|
4457 return FALSE;
|
|
4458 }
|
|
4459
|
|
4460 /*
|
|
4461 +-------------------------------------------------------------------+
|
|
4462 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
4463 | ROUTINE : cmhSAT_OpenChannelReq |
|
|
4464 +-------------------------------------------------------------------+
|
|
4465
|
|
4466 PURPOSE : This function handles the request by SAT to open a channel.
|
|
4467 If the request is going to be processed, the function
|
|
4468 returns TRUE.
|
|
4469
|
|
4470 */
|
|
4471
|
|
4472 GLOBAL BOOL cmhSAT_OpenChannelReq ( T_OPEN_CHANNEL *opchCmd )
|
|
4473 {
|
|
4474 #ifdef FAX_AND_DATA
|
|
4475 T_ACI_RETURN retVal; /* holds return value */
|
|
4476 #endif /* FAX_AND_DATA */
|
|
4477 SHORT cId; /* holds call id / context id */
|
|
4478 T_ACI_SAT_TERM_RESP resp_data; /* holds terminal response parms */
|
|
4479
|
|
4480 psaSAT_InitTrmResp( &resp_data );
|
|
4481
|
|
4482
|
|
4483 TRACE_FUNCTION("cmhSAT_OpenChannelReq()");
|
|
4484
|
|
4485 /*
|
|
4486 *-------------------------------------------------------------------
|
|
4487 * check for basic reasons to reject the command
|
|
4488 *-------------------------------------------------------------------
|
|
4489 */
|
|
4490 resp_data.chnStat = TRUE;
|
|
4491
|
|
4492 /* ME is busy with another open channel command */
|
|
4493 if( satShrdPrm.opchStat NEQ OPCH_IDLE )
|
|
4494 {
|
|
4495 TRACE_EVENT("SAT OPCH FAIL, busy with other command");
|
|
4496 resp_data.add_content = ADD_NO_CAUSE;
|
|
4497 psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data );
|
|
4498 return( FALSE );
|
|
4499 }
|
|
4500
|
|
4501 /* is there a IPv6 address given ?*/
|
|
4502 if((opchCmd->v_other_addr AND opchCmd->other_addr.v_ipv6_addr) OR
|
|
4503 (opchCmd->v_data_dest_addr AND opchCmd->data_dest_addr.v_ipv6_addr))
|
|
4504 {
|
|
4505 TRACE_EVENT("SAT OPCH FAIL, IPv6 not supported");
|
|
4506 psaSAT_SendTrmResp( RSLT_ME_CAP, &resp_data );
|
|
4507 return( FALSE );
|
|
4508 }
|
|
4509
|
|
4510 /* is TCP requested */
|
|
4511 if( opchCmd->v_if_transp_lev AND
|
|
4512 opchCmd->if_transp_lev.trans_prot_type EQ TCP )
|
|
4513 {
|
|
4514 TRACE_EVENT("SAT OPCH FAIL, TCP not supported");
|
|
4515 psaSAT_SendTrmResp( RSLT_ME_CAP, &resp_data );
|
|
4516 return( FALSE );
|
|
4517 }
|
|
4518
|
|
4519 /* check UDP restrictions, WAP is a synonym for UDP */
|
|
4520 if( opchCmd->v_if_transp_lev AND
|
|
4521 opchCmd->if_transp_lev.trans_prot_type EQ UDP )
|
|
4522 {
|
|
4523 #if !defined (CO_UDP_IP)
|
|
4524 /* is UDP requested, but WAP not set ?*/
|
|
4525 TRACE_EVENT("SAT OPCH FAIL, UDP not supported");
|
|
4526 resp_data.add_content = ADD_BIP_SIME_ITL_NAVAIL;
|
|
4527 psaSAT_SendTrmResp( RSLT_BEARIND_PERR, &resp_data );
|
|
4528 return( FALSE );
|
|
4529 #endif /* WAP */
|
|
4530
|
|
4531 /* no destination address given */
|
|
4532 if( !opchCmd->v_data_dest_addr )
|
|
4533 {
|
|
4534 TRACE_EVENT("SAT OPCH FAIL, no destination address given");
|
|
4535 psaSAT_SendTrmResp( RSLT_ERR_REQ_VAL, &resp_data );
|
|
4536 return( FALSE );
|
|
4537 }
|
|
4538 }
|
|
4539
|
|
4540 /* requested buffer size not available */
|
|
4541 if( opchCmd->v_buffer_size AND
|
|
4542 opchCmd->buffer_size > SIM_CLASS_E_BUFFER_SIZE )
|
|
4543 {
|
|
4544 TRACE_EVENT("SAT OPCH FAIL, buffer size not available");
|
|
4545 resp_data.add_content = ADD_BIP_BUF_SIZ_NAVAIL;
|
|
4546 psaSAT_SendTrmResp( RSLT_BEARIND_PERR, &resp_data );
|
|
4547 return( FALSE );
|
|
4548 }
|
|
4549
|
|
4550 /**** is CSD channel requested, but not supported ? ****/
|
|
4551 #ifndef FAX_AND_DATA
|
|
4552 if( opchCmd->v_addr )
|
|
4553 {
|
|
4554 /* CSD call not supported by ME */
|
|
4555 TRACE_EVENT("SAT OPCH FAIL, CSD not supported");
|
|
4556 psaSAT_SendTrmResp( RSLT_ME_CAP, &resp_data );
|
|
4557 return( FALSE );
|
|
4558 }
|
|
4559 #endif /* FAX_AND_DATA */
|
|
4560
|
|
4561 /**** is GPRS channel requested, but not supported ? ****/
|
|
4562 #ifndef GPRS
|
|
4563 if( !opchCmd->v_addr AND opchCmd->v_bear_desc )
|
|
4564 {
|
|
4565 /* GPRS call not supported by ME */
|
|
4566 TRACE_EVENT("SAT OPCH FAIL, GPRS not supported");
|
|
4567 psaSAT_SendTrmResp( RSLT_ME_CAP, &resp_data );
|
|
4568 return( FALSE );
|
|
4569 }
|
|
4570 #endif /* GPRS */
|
|
4571
|
|
4572
|
|
4573 /*
|
|
4574 *-------------------------------------------------------------------
|
|
4575 * store channel parameters
|
|
4576 *-------------------------------------------------------------------
|
|
4577 */
|
|
4578
|
|
4579 /*
|
|
4580 *-------------------------------------------------------------------
|
|
4581 * for a CSD channel use the call table
|
|
4582 *-------------------------------------------------------------------
|
|
4583 */
|
|
4584 #ifdef FAX_AND_DATA
|
|
4585
|
|
4586 if( opchCmd->v_addr )
|
|
4587 {
|
|
4588 T_CC_CALL_TBL *ctb;
|
|
4589
|
|
4590 /* get call table entry */
|
|
4591 cId = psaCC_ctbNewEntry();
|
|
4592
|
|
4593 if( cId EQ NO_ENTRY )
|
|
4594 {
|
|
4595 /* send SAT response */
|
|
4596 TRACE_EVENT("SAT OPCH FAIL, call table full");
|
|
4597 resp_data.add_content = ADD_NO_CAUSE;
|
|
4598 psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data );
|
|
4599 return( FALSE ); /* primitive not needed anymore */
|
|
4600 }
|
|
4601
|
|
4602 ctb = ccShrdPrm.ctb[cId];
|
|
4603
|
|
4604 /* build setup parameters */
|
|
4605 cmhSAT_fillSetupPrm ( cId,
|
|
4606 &opchCmd->addr,
|
|
4607 ((opchCmd->v_subaddr)?&opchCmd->subaddr:NULL));
|
|
4608
|
|
4609 /* check aoc condition */
|
|
4610 if ((ctb->prio EQ PRIO_NORM_CALL) AND
|
|
4611 (aoc_check_moc() EQ FALSE))
|
|
4612 /*
|
|
4613 * check ACM exceeds ACMmax
|
|
4614 * for non-emergency calls
|
|
4615 */
|
|
4616 {
|
|
4617 TRACE_EVENT("SAT OPCH FAIL, ACM exceeds");
|
|
4618 resp_data.add_content = ADD_NO_CAUSE;
|
|
4619 psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data );
|
|
4620 psaCC_FreeCtbNtry (cId);
|
|
4621 return( FALSE );
|
|
4622 }
|
|
4623
|
|
4624 /* bearer capabilities */
|
|
4625 ctb->rptInd = RI_NOT_PRES;
|
|
4626
|
|
4627 if( opchCmd->bear_desc.v_csd_bear_prm )
|
|
4628 {
|
|
4629 UBYTE selVal;
|
|
4630
|
|
4631 /* check and set speed parameter */
|
|
4632 selVal = cmhCC_SelRate(opchCmd->bear_desc.csd_bear_prm.csd_speed);
|
|
4633
|
|
4634 if( selVal EQ UR_NOT_PRES )
|
|
4635 {
|
|
4636 TRACE_EVENT("SAT OPCH FAIL, user rate not supported");
|
|
4637 psaSAT_SendTrmResp( RSLT_ME_CAP, &resp_data );
|
|
4638 psaCC_FreeCtbNtry (cId);
|
|
4639 return( FALSE );
|
|
4640 }
|
|
4641
|
|
4642 ctb->BC[0].rate = selVal;
|
|
4643
|
|
4644 /* check and set name parameter */
|
|
4645 selVal = cmhCC_SelServ(opchCmd->bear_desc.csd_bear_prm.csd_name);
|
|
4646
|
|
4647 if( selVal EQ BEARER_SERV_NOT_PRES )
|
|
4648 {
|
|
4649 TRACE_EVENT("SAT OPCH FAIL, user service not supported");
|
|
4650 psaSAT_SendTrmResp( RSLT_ME_CAP, &resp_data );
|
|
4651 psaCC_FreeCtbNtry (cId);
|
|
4652 return( FALSE );
|
|
4653 }
|
|
4654
|
|
4655 ctb->BC[0].bearer_serv = selVal;
|
|
4656
|
|
4657 /* check and set ce parameter */
|
|
4658 selVal = cmhCC_SelCE(opchCmd->bear_desc.csd_bear_prm.csd_ce);
|
|
4659
|
|
4660 if( selVal EQ CONN_ELEM_NOT_PRES )
|
|
4661 {
|
|
4662 TRACE_EVENT("SAT OPCH FAIL, ce not supported");
|
|
4663 psaSAT_SendTrmResp( RSLT_ME_CAP, &resp_data );
|
|
4664 psaCC_FreeCtbNtry (cId);
|
|
4665 return( FALSE );
|
|
4666 }
|
|
4667
|
|
4668 ctb->BC[0].conn_elem = selVal;
|
|
4669
|
|
4670 ctb->BC[0].modem_type = cmhCC_SelMT(opchCmd->bear_desc.
|
|
4671 csd_bear_prm.csd_speed);
|
|
4672 }
|
|
4673
|
|
4674 else if ( opchCmd->bear_desc.bear_type EQ BT_DEFAULT )
|
|
4675 {
|
|
4676 /* default settings for CSD channel */
|
|
4677 ctb->BC[0].rate = UR_9_6_KBIT;
|
|
4678 ctb->BC[0].bearer_serv = BEARER_SERV_ASYNC;
|
|
4679 ctb->BC[0].conn_elem = CONN_ELEM_NON_TRANS;
|
|
4680 ctb->BC[0].modem_type = MT_V32;
|
|
4681
|
|
4682 /* store default settings in opchCmd, will be used for term response later on */
|
|
4683 opchCmd->bear_desc.csd_bear_prm.csd_speed = BS_SPEED_9600_V32;
|
|
4684 opchCmd->bear_desc.csd_bear_prm.csd_name = CBST_NAM_Asynch;
|
|
4685 opchCmd->bear_desc.csd_bear_prm.csd_ce = CBST_CE_NonTransparent;
|
|
4686 }
|
|
4687
|
|
4688 else /* invalid bearer setting for CSD */
|
|
4689 {
|
|
4690 psaSAT_SendTrmResp( RSLT_ERR_REQ_VAL, &resp_data );
|
|
4691 psaCC_FreeCtbNtry (cId);
|
|
4692 return( FALSE );
|
|
4693 }
|
|
4694
|
|
4695 ctb->BC[0].stop_bits = STOP_1_BIT;
|
|
4696 ctb->BC[0].data_bits = DATA_8_BIT;
|
|
4697 ctb->BC[0].parity = PARITY_NONE;
|
|
4698
|
|
4699 ctb->BC[1].rate = UR_NOT_PRES;
|
|
4700 ctb->BC[1].bearer_serv = BEARER_SERV_NOT_PRES;
|
|
4701 ctb->BC[1].conn_elem = CONN_ELEM_NOT_PRES;
|
|
4702
|
|
4703 /* declare the owner and status of the call */
|
|
4704 ctb->calOwn = OWN_SAT;
|
|
4705 ctb->calStat = CS_SAT_CSD_REQ;
|
|
4706 ctb->curCmd = AT_CMD_D;
|
|
4707 ctb->SATinv = TRUE;
|
|
4708
|
|
4709 /* fill in channel table */
|
|
4710 satShrdPrm.chnTb.chnUsdFlg = TRUE;
|
|
4711 satShrdPrm.chnTb.chnRefId = cId;
|
|
4712 satShrdPrm.chnTb.chnType = B_CSD;
|
|
4713 satShrdPrm.chnTb.lnkStat = SIM_NO_LINK;
|
|
4714
|
|
4715 /* store bearer parameters for later use */
|
|
4716 cmhSAT_storeCSDPrms (opchCmd);
|
|
4717
|
|
4718 /* check for call control by SIM */
|
|
4719 retVal = cmhSAT_CalCntrlBySIM( cId );
|
|
4720
|
|
4721 switch( retVal )
|
|
4722 {
|
|
4723 case( AT_BUSY ):
|
|
4724 /* respond with "Interaction with call control by SIM, temporary" */
|
|
4725 TRACE_EVENT("SAT OPCH FAIL, CC by SIM busy");
|
|
4726 psaSAT_SendTrmResp( RSLT_CC_SIM_TMP, &resp_data );
|
|
4727 cmhSAT_cleanupOpChnPrms();
|
|
4728 psaCC_FreeCtbNtry (cId);
|
|
4729 return( FALSE );
|
|
4730
|
|
4731 case( AT_FAIL ):
|
|
4732 /* respond with "Interaction with call control by SIM, permanent" */
|
|
4733 TRACE_EVENT("SAT OPCH FAIL, CC by SIM failure");
|
|
4734 resp_data.add_content = ADD_NO_CAUSE;
|
|
4735 psaSAT_SendTrmResp( RSLT_CC_SIM_PRM, &resp_data );
|
|
4736 cmhSAT_cleanupOpChnPrms();
|
|
4737 psaCC_FreeCtbNtry (cId);
|
|
4738 return( FALSE );
|
|
4739
|
|
4740 case( AT_EXCT ):
|
|
4741 /* wait for SIM result */
|
|
4742 satShrdPrm.ntfy = USR_NTF_SETUP_CAL;
|
|
4743 satShrdPrm.opchStat = OPCH_CCSIM_REQ;
|
|
4744 break;
|
|
4745 }
|
|
4746
|
|
4747
|
|
4748 /* if call control check is performed, return here */
|
|
4749 if( satShrdPrm.opchStat EQ OPCH_CCSIM_REQ ) return( TRUE );
|
|
4750 }
|
|
4751 else
|
|
4752 #endif /* FAX_AND_DATA */
|
|
4753
|
|
4754 /*
|
|
4755 *-------------------------------------------------------------------
|
|
4756 * for a GPRS channel use a context id in GACI
|
|
4757 *-------------------------------------------------------------------
|
|
4758 */
|
|
4759 #if defined (GPRS) AND defined (DTI)
|
|
4760
|
|
4761 if( opchCmd->v_bear_desc )
|
|
4762 {
|
|
4763 T_GPRS_CONT_REC cntxt;
|
|
4764
|
|
4765 /* get context id */
|
|
4766 cId = psaSAT_gprsFindFreeCntxt();
|
|
4767
|
|
4768 if( cId EQ NO_ENTRY )
|
|
4769 {
|
|
4770 /* send SAT response */
|
|
4771 TRACE_EVENT("SAT OPCH FAIL, no free context");
|
|
4772 resp_data.add_content = ADD_NO_CAUSE;
|
|
4773 psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data );
|
|
4774 return( FALSE ); /* primitive not needed anymore */
|
|
4775 }
|
|
4776
|
|
4777 /* bearer capabilities */
|
|
4778 if( opchCmd->bear_desc.v_gprs_bear_prm )
|
|
4779 {
|
|
4780 /* only PDP type IP is supported */
|
|
4781 if( opchCmd->bear_desc.gprs_bear_prm.gprs_pdp_type NEQ PDP_TYPE_IP )
|
|
4782 {
|
|
4783 TRACE_EVENT("SAT OPCH FAIL, PDP type diff from IP");
|
|
4784 psaSAT_SendTrmResp( RSLT_ME_CAP, &resp_data );
|
|
4785 return( FALSE );
|
|
4786 }
|
|
4787
|
|
4788 cntxt.qos.preced = opchCmd->bear_desc.gprs_bear_prm.gprs_prec;
|
|
4789 cntxt.qos.delay = opchCmd->bear_desc.gprs_bear_prm.gprs_delay;
|
|
4790 cntxt.qos.relclass = opchCmd->bear_desc.gprs_bear_prm.gprs_rely;
|
|
4791 cntxt.qos.peak = opchCmd->bear_desc.gprs_bear_prm.gprs_peak;
|
|
4792 cntxt.qos.mean = opchCmd->bear_desc.gprs_bear_prm.gprs_mean;
|
|
4793 }
|
|
4794
|
|
4795 else if ( opchCmd->bear_desc.bear_type EQ BT_DEFAULT )
|
|
4796 {
|
|
4797 /* default settings for GPRS channel = as subscribed */
|
|
4798 cntxt.qos.preced = 0;
|
|
4799 cntxt.qos.delay = 0;
|
|
4800 cntxt.qos.relclass = 0;
|
|
4801 cntxt.qos.peak = 0;
|
|
4802 cntxt.qos.mean = 0;
|
|
4803
|
|
4804 /* store default settings in opchCmd, will be used for term response later on */
|
|
4805 opchCmd->bear_desc.gprs_bear_prm.gprs_prec = 0;
|
|
4806 opchCmd->bear_desc.gprs_bear_prm.gprs_delay = 0;
|
|
4807 opchCmd->bear_desc.gprs_bear_prm.gprs_rely = 0;
|
|
4808 opchCmd->bear_desc.gprs_bear_prm.gprs_peak = 0;
|
|
4809 opchCmd->bear_desc.gprs_bear_prm.gprs_mean = 0;
|
|
4810 opchCmd->bear_desc.gprs_bear_prm.gprs_pdp_type = PDP_TYPE_IP;
|
|
4811 }
|
|
4812 else /* invalid bearer setting for GPRS */
|
|
4813 {
|
|
4814 TRACE_EVENT("SAT OPCH FAIL, invalid GPRS bearer settings");
|
|
4815 psaSAT_SendTrmResp( RSLT_ERR_REQ_VAL, &resp_data );
|
|
4816 return( FALSE );
|
|
4817 }
|
|
4818
|
|
4819 /* if an APN is given */
|
|
4820 if( opchCmd->v_nan_buf AND opchCmd->nan_buf.c_n_acc_name )
|
|
4821 {
|
|
4822 cmhSAT_cnvrtAPN2NetworkAdr((UBYTE *)opchCmd->nan_buf.n_acc_name,
|
|
4823 (UBYTE) opchCmd->nan_buf.c_n_acc_name,
|
|
4824 (UBYTE *)cntxt.apn );
|
|
4825 }
|
|
4826 else /* use default */
|
|
4827 {
|
|
4828 cntxt.apn[0] = 0;
|
|
4829 }
|
|
4830
|
|
4831 /* if a local address is given */
|
|
4832 if( opchCmd->v_other_addr AND opchCmd->other_addr.v_ipv4_addr )
|
|
4833 {
|
|
4834 cmhSM_ip_to_pdp_address( opchCmd->other_addr.ipv4_addr,
|
|
4835 cntxt.pdp_addr );
|
|
4836 }
|
|
4837 else /* use default, dynamic address */
|
|
4838 {
|
|
4839 cntxt.pdp_addr[0] = 0;
|
|
4840 }
|
|
4841
|
|
4842 cntxt.d_comp = CGDCONT_D_COMP_OMITTED;
|
|
4843 cntxt.h_comp = CGDCONT_H_COMP_OMITTED;
|
|
4844 strncpy( cntxt.pdp_type, "IP", sizeof( T_PDP_TYPE ));
|
|
4845
|
|
4846
|
|
4847 if( sAT_PlusCGDCONT ( CMD_SRC_NONE, cId, &cntxt) NEQ AT_CMPL )
|
|
4848 {
|
|
4849 TRACE_EVENT("SAT OPCH FAIL, invalid CGDCONT parms");
|
|
4850 psaSAT_SendTrmResp( RSLT_ME_CAP, &resp_data );
|
|
4851 return( FALSE ); /* primitive not needed anymore */
|
|
4852 }
|
|
4853
|
|
4854 if( sAT_PlusCGQREQ( CMD_SRC_NONE, cId, &cntxt.qos) NEQ AT_CMPL )
|
|
4855 {
|
|
4856 TRACE_EVENT("SAT OPCH FAIL, invalid CGQREQ parms");
|
|
4857 psaSAT_SendTrmResp( RSLT_ME_CAP, &resp_data );
|
|
4858 return( FALSE ); /* primitive not needed anymore */
|
|
4859 }
|
|
4860
|
|
4861 /* fill in channel table */
|
|
4862 satShrdPrm.chnTb.chnUsdFlg = TRUE;
|
|
4863 satShrdPrm.chnTb.chnRefId = cId;
|
|
4864 satShrdPrm.chnTb.chnType = B_GPRS;
|
|
4865 satShrdPrm.chnTb.lnkStat = SIM_NO_LINK;
|
|
4866
|
|
4867 /* store bearer parameters for later use */
|
|
4868 cmhSAT_storeGPRSPrms (opchCmd);
|
|
4869 }
|
|
4870 else
|
|
4871
|
|
4872 #endif /* GPRS */
|
|
4873
|
|
4874 /*
|
|
4875 *-------------------------------------------------------------------
|
|
4876 * undefined channel
|
|
4877 *-------------------------------------------------------------------
|
|
4878 */
|
|
4879 {
|
|
4880 /* respond with "error, required values are missing" */
|
|
4881 TRACE_EVENT("SAT OPCH FAIL, requires values missing");
|
|
4882 psaSAT_SendTrmResp( RSLT_ERR_REQ_VAL, &resp_data );
|
|
4883 return( FALSE );
|
|
4884 }
|
|
4885
|
|
4886
|
|
4887 /*
|
|
4888 *-------------------------------------------------------------------
|
|
4889 * request for user confirmation
|
|
4890 *-------------------------------------------------------------------
|
|
4891 */
|
|
4892 cmhSAT_OpChnAlert( cId );
|
|
4893
|
|
4894 return( TRUE );
|
|
4895
|
|
4896 }
|
|
4897
|
|
4898 /*
|
|
4899 +-------------------------------------------------------------------+
|
|
4900 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
4901 | ROUTINE : cmhSAT_storeCSDPrms |
|
|
4902 +-------------------------------------------------------------------+
|
|
4903
|
|
4904 PURPOSE : This function stores the CSD open channel parameters for
|
|
4905 later use.
|
|
4906
|
|
4907 */
|
|
4908
|
|
4909 GLOBAL void cmhSAT_storeCSDPrms ( T_OPEN_CHANNEL * opchCmd )
|
|
4910 {
|
|
4911 T_SAT_CSD_PRM *p;
|
|
4912
|
|
4913 TRACE_FUNCTION("cmhSAT_storeCSDPrms()");
|
|
4914
|
|
4915 ACI_MALLOC(satShrdPrm.opchPrm, sizeof(T_SAT_CSD_PRM));
|
|
4916 TRACE_EVENT("ALLOC opchPrm");
|
|
4917 memset(satShrdPrm.opchPrm, 0, sizeof(T_SAT_CSD_PRM));
|
|
4918
|
|
4919 p = (T_SAT_CSD_PRM*)satShrdPrm.opchPrm;
|
|
4920
|
|
4921 if(opchCmd->bear_desc.bear_type EQ BT_DEFAULT)
|
|
4922 p->def_bear_prm = TRUE;
|
|
4923
|
|
4924 p->csd_bear_prm = opchCmd->bear_desc.csd_bear_prm;
|
|
4925
|
|
4926 if(opchCmd->v_dur)
|
|
4927 {
|
|
4928 p->v_dur = TRUE;
|
|
4929 p->dur = opchCmd->dur;
|
|
4930 }
|
|
4931
|
|
4932 if(opchCmd->v_dur2)
|
|
4933 {
|
|
4934 p->v_dur2 = TRUE;
|
|
4935 p->dur2 = opchCmd->dur2;
|
|
4936 }
|
|
4937
|
|
4938 if(opchCmd->v_other_addr)
|
|
4939 {
|
|
4940 p->v_other_addr = TRUE;
|
|
4941 p->other_addr = opchCmd->other_addr;
|
|
4942 }
|
|
4943
|
|
4944 if(opchCmd->v_text)
|
|
4945 {
|
|
4946 p->v_log = TRUE;
|
|
4947 p->log = opchCmd->text;
|
|
4948 }
|
|
4949
|
|
4950 if(opchCmd->v_text2)
|
|
4951 {
|
|
4952 p->v_pwd = TRUE;
|
|
4953 p->pwd = opchCmd->text2;
|
|
4954 }
|
|
4955
|
|
4956 if(opchCmd->v_if_transp_lev)
|
|
4957 {
|
|
4958 p->v_itl = TRUE;
|
|
4959 p->itl = opchCmd->if_transp_lev;
|
|
4960 }
|
|
4961
|
|
4962 if(opchCmd->v_data_dest_addr)
|
|
4963 {
|
|
4964 p->v_dda = TRUE;
|
|
4965 p->dda = opchCmd->data_dest_addr;
|
|
4966 }
|
|
4967
|
|
4968 satShrdPrm.opchType = B_CSD;
|
|
4969 }
|
|
4970
|
|
4971 /*
|
|
4972 +-------------------------------------------------------------------+
|
|
4973 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
4974 | ROUTINE : cmhSAT_storeGPRSPrms |
|
|
4975 +-------------------------------------------------------------------+
|
|
4976
|
|
4977 PURPOSE : This function stores the CSD open channel parameters for
|
|
4978 later use.
|
|
4979
|
|
4980 */
|
|
4981
|
|
4982 GLOBAL void cmhSAT_storeGPRSPrms ( T_OPEN_CHANNEL * opchCmd )
|
|
4983 {
|
|
4984 T_SAT_GPRS_PRM *p;
|
|
4985
|
|
4986 TRACE_FUNCTION("cmhSAT_storeGPRSPrms()");
|
|
4987
|
|
4988 ACI_MALLOC(satShrdPrm.opchPrm, sizeof(T_SAT_GPRS_PRM));
|
|
4989 TRACE_EVENT("ALLOC opchPrm");
|
|
4990 memset(satShrdPrm.opchPrm, 0, sizeof(T_SAT_GPRS_PRM));
|
|
4991
|
|
4992 p = (T_SAT_GPRS_PRM*)satShrdPrm.opchPrm;
|
|
4993
|
|
4994 if(opchCmd->bear_desc.bear_type EQ BT_DEFAULT)
|
|
4995 p->def_bear_prm = TRUE;
|
|
4996
|
|
4997 p->gprs_bear_prm = opchCmd->bear_desc.gprs_bear_prm;
|
|
4998
|
|
4999 if(opchCmd->v_nan_buf)
|
|
5000 {
|
|
5001 p->v_apn = TRUE;
|
|
5002 p->c_apn = opchCmd->nan_buf.c_n_acc_name;
|
|
5003 memcpy(p->apn, opchCmd->nan_buf.n_acc_name, opchCmd->nan_buf.c_n_acc_name);
|
|
5004 }
|
|
5005
|
|
5006 if(opchCmd->v_other_addr)
|
|
5007 {
|
|
5008 p->v_other_addr = TRUE;
|
|
5009 p->other_addr = opchCmd->other_addr;
|
|
5010 }
|
|
5011
|
|
5012 if(opchCmd->v_if_transp_lev)
|
|
5013 {
|
|
5014 p->v_itl = TRUE;
|
|
5015 p->itl = opchCmd->if_transp_lev;
|
|
5016 }
|
|
5017
|
|
5018 if(opchCmd->v_data_dest_addr)
|
|
5019 {
|
|
5020 p->v_dda = TRUE;
|
|
5021 p->dda = opchCmd->data_dest_addr;
|
|
5022 }
|
|
5023
|
|
5024 satShrdPrm.opchType = B_GPRS;
|
|
5025 }
|
|
5026
|
|
5027 /*
|
|
5028 +-------------------------------------------------------------------+
|
|
5029 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
5030 | ROUTINE : cmhSAT_cleanupOpChnPrms |
|
|
5031 +-------------------------------------------------------------------+
|
|
5032
|
|
5033 PURPOSE : This function cleans the Op channel parameters
|
|
5034
|
|
5035 */
|
|
5036
|
|
5037 GLOBAL void cmhSAT_cleanupOpChnPrms ( void )
|
|
5038 {
|
|
5039 TRACE_FUNCTION("cmhSAT_cleanupOpChnPrms()");
|
|
5040
|
|
5041 if( satShrdPrm.opchPrm )
|
|
5042 {
|
|
5043 ACI_MFREE(satShrdPrm.opchPrm);
|
|
5044 satShrdPrm.opchPrm = NULL;
|
|
5045 TRACE_EVENT("FREE opchPrm");
|
|
5046 }
|
|
5047
|
|
5048 satShrdPrm.opchPrmMdf = FALSE;
|
|
5049 satShrdPrm.opchCCMdfy = FALSE;
|
|
5050 satShrdPrm.opchStat = OPCH_IDLE;
|
|
5051 satShrdPrm.opchType = 0;
|
|
5052 satShrdPrm.gprsNtwCs = 0;
|
|
5053
|
|
5054 }
|
|
5055
|
|
5056 /*
|
|
5057 +--------------------------------------------------------------------+
|
|
5058 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
5059 | ROUTINE : cmhSAT_OpChnResetCnctFalg|
|
|
5060 +--------------------------------------------------------------------+
|
|
5061
|
|
5062 PURPOSE : This function cleans the Op channel parameters
|
|
5063
|
|
5064 */
|
|
5065
|
|
5066 GLOBAL void cmhSAT_OpChnResetCnctFlag ( void )
|
|
5067 {
|
|
5068 TRACE_FUNCTION("cmhSAT_cleanupOpChnWAP()");
|
|
5069 #ifdef CO_UDP_IP
|
|
5070 /* If transport layer is UDP, reset wap_call flag */
|
|
5071 if( satShrdPrm.chnTb.chnTPL EQ UDP )
|
|
5072 {
|
|
5073 sAT_PercentWAP ( CMD_SRC_NONE, 0 );
|
|
5074 }
|
|
5075 #endif /* CO_UDP_IP */
|
|
5076 }
|
|
5077
|
|
5078 /*
|
|
5079 +-------------------------------------------------------------------+
|
|
5080 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
5081 | ROUTINE : cmhSAT_OpChnFailed |
|
|
5082 +-------------------------------------------------------------------+
|
|
5083
|
|
5084 PURPOSE : Indication that an open channel command has failed due to
|
|
5085 a reason indicated by cause and add_cause. If the failure
|
|
5086 occured in context with the OPEN CHANNEL command, a terminal
|
|
5087 response will be sent and parameters will be cleaned up.
|
|
5088 If the failure was in context with a SEND DATA command, the
|
|
5089 SIM BIP channel will be closed and parameters will be cleared
|
|
5090 up. If the failure was unexpected, a channel status event
|
|
5091 message will be sent, if enabled.
|
|
5092
|
|
5093 */
|
|
5094
|
|
5095 GLOBAL void cmhSAT_OpChnFailed( UBYTE cause, T_ACI_SAT_TERM_RESP *resp_data )
|
|
5096 {
|
|
5097 T_SIM_SAT_CHN chnInf;
|
|
5098
|
|
5099 TRACE_FUNCTION("cmhSAT_OpChnFailed()");
|
|
5100
|
|
5101 /* command context is OPEN CHANNEL */
|
|
5102 if((satShrdPrm.opchStat EQ OPCH_EST_REQ OR
|
|
5103 satShrdPrm.opchStat EQ OPCH_CCSIM_REQ OR
|
|
5104 satShrdPrm.opchStat EQ OPCH_WAIT_CNF) AND
|
|
5105 satShrdPrm.cmdDet.cmdType EQ SAT_CMD_OPEN_CHANNEL )
|
|
5106 {
|
|
5107 resp_data->chnStat = TRUE;
|
|
5108 psaSAT_SendTrmResp( cause, resp_data );
|
|
5109
|
|
5110 if(!(satShrdPrm.opchStat EQ OPCH_WAIT_CNF))
|
|
5111 {
|
|
5112 R_AT( RAT_CME, satShrdPrm.opchAcptSrc ) ( AT_CMD_A, CME_ERR_NotPresent );
|
|
5113
|
|
5114 /* log result */
|
|
5115 cmh_logRslt ( satShrdPrm.opchAcptSrc, RAT_CME, AT_CMD_A,
|
|
5116 -1, -1, CME_ERR_NotPresent );
|
|
5117 }
|
|
5118 cmhSAT_cleanupOpChnPrms();
|
|
5119 }
|
|
5120
|
|
5121 /* command context is SEND DATA */
|
|
5122 else if( satShrdPrm.opchStat EQ OPCH_EST_REQ AND
|
|
5123 satShrdPrm.cmdDet.cmdType EQ SAT_CMD_SEND_DATA )
|
|
5124 {
|
|
5125 if( satShrdPrm.chnTb.lnkStat EQ SIM_LINK_OPEN )
|
|
5126 {
|
|
5127 /* check if user has cleared down the call */
|
|
5128 if( satShrdPrm.chnTb.chnType EQ B_CSD AND
|
|
5129 (!psaCC_ctbIsValid (satShrdPrm.chnTb.chnRefId) OR
|
|
5130 psaCC_ctb(satShrdPrm.chnTb.chnRefId)->curCmd EQ AT_CMD_H OR
|
|
5131 psaCC_ctb(satShrdPrm.chnTb.chnRefId)->curCmd EQ AT_CMD_CHUP))
|
|
5132 {
|
|
5133 cause = RSLT_USR_CLR_DWN;
|
|
5134 }
|
|
5135 #ifdef DTI
|
|
5136 chnInf.bipConn = SIM_BIP_CLOSE_CHANNEL;
|
|
5137 chnInf.dtiConn = SIM_DTI_UNKNOWN;
|
|
5138 chnInf.chnId = CHANNEL_ID_1;
|
|
5139 chnInf.genRes = cause;
|
|
5140 chnInf.addRes = resp_data->add_content;
|
|
5141
|
|
5142 psaSIM_SATBIPChn( chnInf, cmhSAT_OpChnClose );
|
|
5143 #endif /* DTI */
|
|
5144 }
|
|
5145 }
|
|
5146 /* unsolicited problem */
|
|
5147 else if( satShrdPrm.opchStat EQ OPCH_IDLE )
|
|
5148 {
|
|
5149 chnInf.bipConn = SIM_BIP_UNKNOWN;
|
|
5150 chnInf.dtiConn = SIM_DTI_UNKNOWN;
|
|
5151
|
|
5152 if( satShrdPrm.chnTb.lnkStat EQ SIM_LINK_OPEN )
|
|
5153 {
|
|
5154 chnInf.bipConn = SIM_BIP_CLOSE_CHANNEL;
|
|
5155 }
|
|
5156 if( satShrdPrm.chnTb.lnkStat EQ SIM_LINK_CNCT )
|
|
5157 {
|
|
5158 chnInf.bipConn = SIM_BIP_CLOSE_CHANNEL;
|
|
5159 chnInf.dtiConn = SIM_DTI_DISCONNECT;
|
|
5160 }
|
|
5161 #ifdef DTI
|
|
5162 if( chnInf.bipConn )
|
|
5163 {
|
|
5164 chnInf.chnId = CHANNEL_ID_1;
|
|
5165 chnInf.genRes = RSLT_BEARIND_PERR;
|
|
5166 chnInf.addRes = ADD_BIP_CHAN_CLOSD;
|
|
5167
|
|
5168 psaSIM_SATBIPChn( chnInf, cmhSAT_OpChnClose );
|
|
5169
|
|
5170 cmhSAT_OpChnStatEvnt();
|
|
5171 }
|
|
5172 #endif /* DTI */
|
|
5173 }
|
|
5174 }
|
|
5175
|
|
5176 /*
|
|
5177 +-------------------------------------------------------------------+
|
|
5178 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
5179 | ROUTINE : cmhSAT_OpChnAlert |
|
|
5180 +-------------------------------------------------------------------+
|
|
5181
|
|
5182 PURPOSE : This function alerts the user about a pending SAT open
|
|
5183 channel command, which is ready for execution.
|
|
5184
|
|
5185 */
|
|
5186
|
|
5187 GLOBAL void cmhSAT_OpChnAlert( SHORT cId )
|
|
5188
|
|
5189 {
|
|
5190 UBYTE idx;
|
|
5191 ULONG rdl = ACI_NumParmNotPresent;
|
|
5192 T_ACI_SATA_ADD addPrm;
|
|
5193
|
|
5194 if( satShrdPrm.opchType EQ B_CSD )
|
|
5195 {
|
|
5196 rdl = cmhSAT_ChckRedial(cId, ((T_SAT_CSD_PRM*)satShrdPrm.opchPrm)->v_dur,
|
|
5197 &(((T_SAT_CSD_PRM*)satShrdPrm.opchPrm)->dur));
|
|
5198
|
|
5199 addPrm.chnType = SATA_CT_CSD;
|
|
5200 cId += 1;
|
|
5201 }
|
|
5202 else if ( satShrdPrm.opchType EQ B_GPRS )
|
|
5203
|
|
5204 addPrm.chnType = SATA_CT_GPRS;
|
|
5205
|
|
5206 addPrm.chnEst = ( satShrdPrm.cmdDet.cmdQlf & QLF_OPCH_IMMDT_LINK_EST )?
|
|
5207 SATA_EST_IM:SATA_EST_OD;
|
|
5208
|
|
5209 for( idx = 0; idx < CMD_SRC_MAX; idx++ )
|
|
5210 {
|
|
5211 R_AT( RAT_SATA, idx )( cId, rdl, &addPrm );
|
|
5212 }
|
|
5213
|
|
5214 satShrdPrm.ntfy = USR_NTF_SETUP_CAL;
|
|
5215 satShrdPrm.opchStat = OPCH_WAIT_CNF;
|
|
5216 }
|
|
5217
|
|
5218 /*
|
|
5219 +-------------------------------------------------------------------+
|
|
5220 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
5221 | ROUTINE : cmhSAT_OpChnChkTmpProblem|
|
|
5222 +-------------------------------------------------------------------+
|
|
5223
|
|
5224 PURPOSE : This function checks for a temporary situation, which
|
|
5225 prevents the open channel command to be completed. If such
|
|
5226 a condition exists, the open channel command will be aborted
|
|
5227 with a suitable terminal response and the function returns
|
|
5228 TRUE
|
|
5229
|
|
5230 */
|
|
5231
|
|
5232 GLOBAL BOOL cmhSAT_OpChnChkTmpProblem( void )
|
|
5233
|
|
5234 {
|
|
5235 T_ACI_SAT_TERM_RESP resp_data; /* holds terminal response parms */
|
|
5236 SHORT actId = NO_ENTRY;
|
|
5237 BOOL cleanup = FALSE;
|
|
5238
|
|
5239 psaSAT_InitTrmResp( &resp_data );
|
|
5240
|
|
5241
|
|
5242 TRACE_FUNCTION("cmhSAT_OpChnChkTmpProblem()");
|
|
5243
|
|
5244 /*
|
|
5245 *-------------------------------------------------------------------
|
|
5246 * check channel type independent conditions
|
|
5247 *-------------------------------------------------------------------
|
|
5248 */
|
|
5249 #ifdef CO_UDP_IP
|
|
5250 /* check for a busy UDP situation, WAP is a synonym for UDP */
|
|
5251 if( satShrdPrm.chnTb.chnTPL EQ UDP AND
|
|
5252 Wap_Call )
|
|
5253 {
|
|
5254 TRACE_EVENT("SAT OPCH FAIL, UDP is busy");
|
|
5255 resp_data.add_content = ADD_NO_CAUSE;
|
|
5256 cmhSAT_OpChnFailed( RSLT_ME_UNAB_PROC, &resp_data );
|
|
5257 cleanup = TRUE;
|
|
5258 }
|
|
5259 /*
|
|
5260 *-------------------------------------------------------------------
|
|
5261 * check CSD channel conditions
|
|
5262 *-------------------------------------------------------------------
|
|
5263 */
|
|
5264 else
|
|
5265 #endif /* CO_UDP_IP */
|
|
5266
|
|
5267 if( satShrdPrm.opchType EQ B_CSD )
|
|
5268 {
|
|
5269 /* check for busy SS condition */
|
|
5270 if( psaSS_stbFindActSrv( NO_ENTRY ) NEQ NO_ENTRY )
|
|
5271 {
|
|
5272 /* send SAT response */
|
|
5273 TRACE_EVENT("SAT OPCH FAIL, SS busy");
|
|
5274 resp_data.add_content = ADD_ME_SS_BUSY;
|
|
5275 cmhSAT_OpChnFailed( RSLT_ME_UNAB_PROC, &resp_data );
|
|
5276
|
|
5277 cleanup = TRUE;
|
|
5278 }
|
|
5279
|
|
5280 /* check for busy call condition */
|
|
5281 else if( psaSAT_ctbFindActCall() NEQ NO_ENTRY )
|
|
5282 {
|
|
5283 /* send SAT response */
|
|
5284 TRACE_EVENT("SAT OPCH FAIL, busy on call");
|
|
5285 resp_data.add_content = ADD_ME_CALL_BUSY;
|
|
5286 cmhSAT_OpChnFailed( RSLT_ME_UNAB_PROC, &resp_data );
|
|
5287
|
|
5288 cleanup = TRUE;
|
|
5289 }
|
|
5290 #if defined (GPRS) AND defined (DTI)
|
|
5291 /* CSD channel, but class CG */
|
|
5292 else if( gmmShrdPrm.mobile_class EQ GMMREG_CLASS_CG )
|
|
5293 {
|
|
5294 /* send SAT response */
|
|
5295 TRACE_EVENT("SAT OPCH FAIL, no channel avail");
|
|
5296 resp_data.add_content = ADD_BIP_NO_CHAN_AVAIL;
|
|
5297 cmhSAT_OpChnFailed( RSLT_BEARIND_PERR, &resp_data );
|
|
5298
|
|
5299 cleanup = TRUE;
|
|
5300 }
|
|
5301 #endif /* GPRS */
|
|
5302
|
|
5303 }
|
|
5304
|
|
5305 /*
|
|
5306 *-------------------------------------------------------------------
|
|
5307 * check GPRS channel conditions
|
|
5308 *-------------------------------------------------------------------
|
|
5309 */
|
|
5310 #if defined (GPRS) AND defined (DTI)
|
|
5311 else if( satShrdPrm.opchType EQ B_GPRS )
|
|
5312 {
|
|
5313 /* GPRS channel, class B */
|
|
5314 if( gmmShrdPrm.mobile_class EQ GMMREG_CLASS_BC OR
|
|
5315 gmmShrdPrm.mobile_class EQ GMMREG_CLASS_BG )
|
|
5316 {
|
|
5317 if( psaSS_stbFindActSrv( NO_ENTRY ) NEQ NO_ENTRY )
|
|
5318 {
|
|
5319 /* send SAT response */
|
|
5320 TRACE_EVENT("SAT OPCH FAIL, SS busy");
|
|
5321 resp_data.add_content = ADD_ME_SS_BUSY;
|
|
5322 cmhSAT_OpChnFailed( RSLT_ME_UNAB_PROC, &resp_data );
|
|
5323
|
|
5324 cleanup = TRUE;
|
|
5325 }
|
|
5326
|
|
5327 /* check for busy call condition */
|
|
5328 else if( psaSAT_ctbFindActCall() NEQ NO_ENTRY )
|
|
5329 {
|
|
5330 /* send SAT response */
|
|
5331 TRACE_EVENT("SAT OPCH FAIL, busy on call");
|
|
5332 resp_data.add_content = ADD_ME_CALL_BUSY;
|
|
5333 cmhSAT_OpChnFailed( RSLT_ME_UNAB_PROC, &resp_data );
|
|
5334
|
|
5335 cleanup = TRUE;
|
|
5336 }
|
|
5337 }
|
|
5338
|
|
5339 /* GPRS channel, but class CC */
|
|
5340 else if( gmmShrdPrm.mobile_class EQ GMMREG_CLASS_CC )
|
|
5341 {
|
|
5342 /* send SAT response */
|
|
5343 TRACE_EVENT("SAT OPCH FAIL, no channel avail");
|
|
5344 resp_data.add_content = ADD_BIP_NO_CHAN_AVAIL;
|
|
5345 cmhSAT_OpChnFailed( RSLT_BEARIND_PERR, &resp_data );
|
|
5346
|
|
5347 cleanup = TRUE;
|
|
5348 }
|
|
5349
|
|
5350 /* no channel left for GPRS */
|
|
5351 else if( psaSAT_gprsFindFreeCntxt() EQ NO_ENTRY )
|
|
5352 {
|
|
5353 /* send SAT response */
|
|
5354 TRACE_EVENT("SAT OPCH FAIL, no channel avail");
|
|
5355 resp_data.add_content = ADD_BIP_NO_CHAN_AVAIL;
|
|
5356 cmhSAT_OpChnFailed( RSLT_BEARIND_PERR, &resp_data );
|
|
5357
|
|
5358 cleanup = TRUE;
|
|
5359 }
|
|
5360
|
|
5361 /* check SM entity status */
|
|
5362 else if( smEntStat.entOwn NEQ OWN_NONE OR
|
|
5363 smEntStat.curCmd NEQ AT_CMD_NONE )
|
|
5364 {
|
|
5365 /* send SAT response */
|
|
5366 TRACE_EVENT("SAT OPCH FAIL, SM entity busy");
|
|
5367 resp_data.add_content = ADD_NO_CAUSE;
|
|
5368 cmhSAT_OpChnFailed( RSLT_ME_UNAB_PROC, &resp_data );
|
|
5369
|
|
5370 cleanup = TRUE;
|
|
5371 }
|
|
5372 }
|
|
5373 #endif /* GPRS */
|
|
5374
|
|
5375 /*
|
|
5376 *-------------------------------------------------------------------
|
|
5377 * cleanup if necessary
|
|
5378 *-------------------------------------------------------------------
|
|
5379 */
|
|
5380 if( cleanup )
|
|
5381 {
|
|
5382 if( satShrdPrm.opchType EQ B_CSD )
|
|
5383 {
|
|
5384 /* free ctb entry */
|
|
5385 psaCC_FreeCtbNtry (satShrdPrm.chnTb.chnRefId);
|
|
5386 }
|
|
5387
|
|
5388 cmhSAT_cleanupOpChnPrms();
|
|
5389
|
|
5390 return ( TRUE );
|
|
5391 }
|
|
5392
|
|
5393 return( FALSE );
|
|
5394 }
|
|
5395
|
|
5396
|
|
5397 /*
|
|
5398 +-------------------------------------------------------------------+
|
|
5399 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
5400 | ROUTINE : cmhSAT_OpChnUDPActiveCsd|
|
|
5401 +-------------------------------------------------------------------+
|
|
5402
|
|
5403 PURPOSE : This callback function will be called when the UDP stack
|
|
5404 is active
|
|
5405
|
|
5406 */
|
|
5407
|
|
5408 GLOBAL void cmhSAT_OpChnUDPActiveCsd(T_ACI_RETURN result)
|
|
5409 {
|
|
5410 T_ACI_SAT_TERM_RESP resp_data; /* holds terminal response parms */
|
|
5411
|
|
5412 TRACE_FUNCTION("cmhSAT_OpChnUDPActiveCsd()");
|
|
5413
|
|
5414 /* Ensure we never dereference NULL in the CC call table */
|
|
5415 if (!psaCC_ctbIsValid (tcpipShrdPrm.wap_call_id))
|
|
5416 {
|
|
5417 TRACE_ERROR ("Call table entry disappeared");
|
|
5418 ccShrdPrm.datStat = DS_IDL ;
|
|
5419 psaSAT_InitTrmResp( &resp_data );
|
|
5420 resp_data.add_content = ADD_NO_CAUSE;
|
|
5421
|
|
5422 cmhSAT_OpChnFailed( RSLT_ME_UNAB_PROC, &resp_data );
|
|
5423 return;
|
|
5424 }
|
|
5425
|
|
5426 /*
|
|
5427 * activate RA connection: in case of failure clear call !
|
|
5428 */
|
|
5429 ccShrdPrm.datStat = DS_ACT_REQ;
|
|
5430
|
|
5431 if(cmhRA_Activate(psaCC_ctb(tcpipShrdPrm.wap_call_id)->curSrc,
|
|
5432 psaCC_ctb(tcpipShrdPrm.wap_call_id)->curCmd,
|
|
5433 tcpipShrdPrm.wap_call_id)
|
|
5434 NEQ AT_EXCT)
|
|
5435 {
|
|
5436 TRACE_EVENT("RA ACTIVATION FAILURE -> DISC CALL");
|
|
5437 ccShrdPrm.datStat = DS_IDL ;
|
|
5438 psaCC_ctb(tcpipShrdPrm.wap_call_id)->nrmCs = MNCC_CAUSE_CALL_CLEAR;
|
|
5439 psaCC_ClearCall (tcpipShrdPrm.wap_call_id);
|
|
5440
|
|
5441
|
|
5442 psaSAT_InitTrmResp( &resp_data );
|
|
5443 resp_data.add_content = ADD_NO_CAUSE;
|
|
5444
|
|
5445 cmhSAT_OpChnFailed( RSLT_ME_UNAB_PROC, &resp_data );
|
|
5446 }
|
|
5447 }
|
|
5448
|
|
5449
|
|
5450 /*
|
|
5451 +-------------------------------------------------------------------+
|
|
5452 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
5453 | ROUTINE : cmhSAT_OpChnUDPConfCsd |
|
|
5454 +-------------------------------------------------------------------+
|
|
5455
|
|
5456 PURPOSE : This callback function will be called when the UDP stack
|
|
5457 is configured
|
|
5458
|
|
5459 */
|
|
5460 GLOBAL void cmhSAT_OpChnUDPConfCsd(T_ACI_RETURN result)
|
|
5461 {
|
|
5462
|
|
5463 TRACE_FUNCTION("cmhSAT_OpChnUDPConfCsd()");
|
|
5464 /*
|
|
5465 * send the SIM_BIP_CONFIG_REQ primitive providing details of the connection
|
|
5466 * to SIM
|
|
5467 */
|
|
5468 psaSIM_Bip_Config_Req();
|
|
5469 }
|
|
5470
|
|
5471 /*
|
|
5472 +-------------------------------------------------------------------+
|
|
5473 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
5474 | ROUTINE : cmhSAT_OpChnUDPDeactCsd |
|
|
5475 +-------------------------------------------------------------------+
|
|
5476
|
|
5477 PURPOSE : This callback function will be called when the UDP stack
|
|
5478 is deactive
|
|
5479
|
|
5480 */
|
|
5481
|
|
5482 GLOBAL void cmhSAT_OpChnUDPDeactCsd(T_ACI_RETURN result)
|
|
5483 {
|
|
5484 T_ACI_SAT_TERM_RESP resp_data; /* holds terminal response parms */
|
|
5485
|
|
5486 TRACE_FUNCTION("cmhSAT_OpChnUDPDeactCsd()");
|
|
5487
|
|
5488 psaSAT_InitTrmResp( &resp_data );
|
|
5489
|
|
5490 /*
|
|
5491 *-------------------------------------------------------------------
|
|
5492 * check if deactivation was intended
|
|
5493 *-------------------------------------------------------------------
|
|
5494 */
|
|
5495 if( satShrdPrm.opchStat EQ OPCH_CLS_REQ )
|
|
5496 {
|
|
5497 /* nothing to do here anymore */
|
|
5498 }
|
|
5499
|
|
5500 /*
|
|
5501 *-------------------------------------------------------------------
|
|
5502 * deactivation during an establish request
|
|
5503 *-------------------------------------------------------------------
|
|
5504 */
|
|
5505 else if( satShrdPrm.opchStat EQ OPCH_EST_REQ )
|
|
5506 {
|
|
5507 if (cmhL2R_Deactivate() NEQ AT_EXCT)
|
|
5508 {
|
|
5509 TRACE_EVENT("L2R DEACTIVATION FAILURE ");
|
|
5510 if (psaCC_ctbIsValid (tcpipShrdPrm.wap_call_id))
|
|
5511 {
|
|
5512 psaCC_ctb(tcpipShrdPrm.wap_call_id)->nrmCs = MNCC_CAUSE_CALL_CLEAR;
|
|
5513 psaCC_ClearCall(tcpipShrdPrm.wap_call_id);
|
|
5514 }
|
|
5515 }
|
|
5516
|
|
5517 resp_data.add_content = ADD_NO_CAUSE;
|
|
5518
|
|
5519 cmhSAT_OpChnFailed( RSLT_ME_UNAB_PROC, &resp_data );
|
|
5520
|
|
5521 }
|
|
5522 }
|
|
5523 /*
|
|
5524 +-------------------------------------------------------------------+
|
|
5525 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
5526 | ROUTINE : cmhSAT_OpBIPChnOpen |
|
|
5527 +-------------------------------------------------------------------+
|
|
5528
|
|
5529 PURPOSE : This callback function will be called when the SIM entity
|
|
5530 has tried to open a BIP channel
|
|
5531
|
|
5532 */
|
|
5533
|
|
5534 GLOBAL void cmhSAT_OpBIPChnOpen( UBYTE bipConn, UBYTE chnId )
|
|
5535 {
|
|
5536 T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */
|
|
5537 T_ACI_SAT_TERM_RESP resp_data; /* holds terminal response parms */
|
|
5538 UBYTE srcId; /* holds source ID */
|
|
5539 UBYTE cause;
|
|
5540 SHORT cId; /* holds caller ID for pending CSD call (case immediately) */
|
|
5541 #ifdef GPRS
|
|
5542 SHORT cid_array[2] = { 0,INVALID_CID }; /* holds cids for GPRS context */
|
|
5543 #endif /* GPRS */
|
|
5544
|
|
5545 TRACE_FUNCTION("cmhSAT_OpBIPChnOpen()");
|
|
5546
|
|
5547 /* get source id */
|
|
5548 srcId = satShrdPrm.opchAcptSrc;
|
|
5549
|
|
5550 psaSAT_InitTrmResp( &resp_data );
|
|
5551
|
|
5552 /* send TR in the case of on demand establishment */
|
|
5553 if( satShrdPrm.opchStat EQ OPCH_ON_DMND )
|
|
5554 {
|
|
5555 /* CASE: ON DEMAND */
|
|
5556
|
|
5557 /* check if opening has been successful */
|
|
5558 if( bipConn & SIM_BIP_OPEN_CHANNEL )
|
|
5559 {
|
|
5560 /* BEARER: GPRS OR CSD */
|
|
5561
|
|
5562 /* set link state to OPEN */
|
|
5563 satShrdPrm.chnTb.lnkStat = SIM_LINK_OPEN;
|
|
5564
|
|
5565 resp_data.chnStat = TRUE;
|
|
5566 resp_data.bearDesc = TRUE;
|
|
5567 resp_data.bufSize = TRUE;
|
|
5568 cause = (satShrdPrm.opchCCMdfy)?RSLT_PERF_MDFY_SIM:RSLT_PERF_SUCCESS;
|
|
5569
|
|
5570 psaSAT_SendTrmResp( cause, &resp_data );
|
|
5571
|
|
5572 R_AT( RAT_OK, satShrdPrm.opchAcptSrc ) ( AT_CMD_A );
|
|
5573
|
|
5574 /* log result */
|
|
5575 cmh_logRslt ( satShrdPrm.opchAcptSrc, RAT_OK, AT_CMD_A, -1, -1, -1 );
|
|
5576 }
|
|
5577 /* unsuccessful channel opening */
|
|
5578 else
|
|
5579 {
|
|
5580 /* BEARER: GPRS OR CSD */
|
|
5581
|
|
5582 TRACE_ERROR("cmhSAT_OpChnOpen: ERROR: OPEN BIP CHANNEL unsuccessful");
|
|
5583
|
|
5584 resp_data.add_content = ADD_BIP_NO_CHAN_AVAIL;
|
|
5585 cause = RSLT_BEARIND_PERR;
|
|
5586
|
|
5587 cmhSAT_cleanupOpChnPrms();
|
|
5588
|
|
5589 psaSAT_SendTrmResp( cause, &resp_data );
|
|
5590
|
|
5591 R_AT( RAT_CME, satShrdPrm.opchAcptSrc ) ( AT_CMD_A, CME_ERR_NotPresent );
|
|
5592
|
|
5593 /* log result */
|
|
5594 cmh_logRslt ( satShrdPrm.opchAcptSrc, RAT_CME, AT_CMD_A,
|
|
5595 -1, -1, CME_ERR_NotPresent );
|
|
5596 }
|
|
5597
|
|
5598 }
|
|
5599 else if ( satShrdPrm.opchStat EQ OPCH_EST_REQ )
|
|
5600 {
|
|
5601 /* CASE: IMMEDIATELY */
|
|
5602 /* Check whether OPEN BIP CHANNEL successful */
|
|
5603 if( bipConn & SIM_BIP_OPEN_CHANNEL )
|
|
5604 {
|
|
5605
|
|
5606 /* set link state to OPEN, since the BIP and DTI establishment has split
|
|
5607 * this state is alse used for "immediately" OPEN CHANNEL command */
|
|
5608 satShrdPrm.chnTb.lnkStat = SIM_LINK_OPEN;
|
|
5609
|
|
5610 /* check for BEARER */
|
|
5611 if (satShrdPrm.opchType EQ B_CSD)
|
|
5612 {
|
|
5613 /* BEARER: CSD */
|
|
5614 /* proceed to set up bearer for CSD */
|
|
5615
|
|
5616 /* get SAT call cId */
|
|
5617 cId = psaCC_ctbFindCall( OWN_SAT, CS_SAT_CSD_REQ, NO_VLD_CT );
|
|
5618
|
|
5619 /* check if a call has been found */
|
|
5620 if ( cId NEQ (-1))
|
|
5621 {
|
|
5622 pCCCmdPrm = &cmhPrm[srcId].ccCmdPrm;
|
|
5623
|
|
5624 if( satShrdPrm.chnTb.chnTPL EQ UDP )
|
|
5625 {
|
|
5626 /* TRANSPORT LAYER: UDP */
|
|
5627
|
|
5628 /* enable establishment of UDP data chain */
|
|
5629 sAT_PercentWAP ( psaCC_ctb(cId)->curSrc , 1 );
|
|
5630
|
|
5631 /* setup PPP parameters */
|
|
5632 cmhSAT_OpChnSetPPP( B_CSD );
|
|
5633 }
|
|
5634 /* finally set up call */
|
|
5635 cmhCC_flagCall( cId, &(pCCCmdPrm->mltyCncFlg));
|
|
5636 cmhCC_NewCall(cId, srcId, AT_CMD_A);
|
|
5637 }
|
|
5638 else
|
|
5639 {
|
|
5640 TRACE_FUNCTION("cmhSAT_OpChnOpen: No CSD call pending");
|
|
5641 }
|
|
5642 }
|
|
5643 #if defined (GPRS) AND defined (DTI)
|
|
5644 else if (satShrdPrm.opchType EQ B_GPRS)
|
|
5645 {
|
|
5646 /* BEARER: GPRS */
|
|
5647
|
|
5648 /* copy channel reference ID */
|
|
5649 cid_array[0] = satShrdPrm.chnTb.chnRefId;
|
|
5650
|
|
5651 if( satShrdPrm.chnTb.chnTPL EQ UDP )
|
|
5652 {
|
|
5653 /* TRANSPORT LAYER: UDP */
|
|
5654
|
|
5655 /* enable establishment of UDP data chain */
|
|
5656 sAT_PercentWAP ( srcId , 1 );
|
|
5657
|
|
5658 /* setup PPP parameters */
|
|
5659 cmhSAT_OpChnSetPPP( B_GPRS );
|
|
5660
|
|
5661 /* activate context with UDP */
|
|
5662 cmhSAT_OpChnUDPActivateGprs();
|
|
5663 }
|
|
5664 else
|
|
5665 {
|
|
5666 /* NO TRANSPORT LAYER: SNDCP only */
|
|
5667
|
|
5668 /* activate context with no transport layer */
|
|
5669 if( sAT_PlusCGACT( srcId, CGACT_STATE_ACTIVATED, cid_array ) NEQ AT_EXCT )
|
|
5670 {
|
|
5671 /* activate context command could not proccessed */
|
|
5672 /* throw error */
|
|
5673 TRACE_ERROR("cmhSAT_OpChnOpen: ERROR: activate context with no TRL failed");
|
|
5674 R_AT( RAT_CME, satShrdPrm.opchAcptSrc ) ( AT_CMD_A, CME_ERR_NoConnect );
|
|
5675 }
|
|
5676 }
|
|
5677 } /* end bearer B_GPRS */
|
|
5678 #endif /* GPRS AND DTI */
|
|
5679 }
|
|
5680 else /* OPEN BIP CHANNEL unsuccessful */
|
|
5681 {
|
|
5682 /* CASE: ON DEMAND and IMMEDIATELY */
|
|
5683 /* BEARER: CSD and GPRS */
|
|
5684
|
|
5685 TRACE_ERROR("cmhSAT_OpChnOpen: ERROR: OPEN BIP CHANNEL unsuccessful");
|
|
5686
|
|
5687 resp_data.add_content = ADD_BIP_NO_CHAN_AVAIL;
|
|
5688 cause = RSLT_BEARIND_PERR;
|
|
5689
|
|
5690 /* store current status of BIP channel */
|
|
5691 simShrdPrm.sim_dti_chPrm->sat_chn_prm.bipConn = SIM_BIP_CLOSE_CHANNEL;
|
|
5692
|
|
5693 cmhSAT_cleanupOpChnPrms();
|
|
5694
|
|
5695 psaSAT_SendTrmResp( cause, &resp_data );
|
|
5696
|
|
5697 R_AT( RAT_CME, satShrdPrm.opchAcptSrc ) ( AT_CMD_A, CME_ERR_NotPresent );
|
|
5698
|
|
5699 /* log result */
|
|
5700 cmh_logRslt ( satShrdPrm.opchAcptSrc, RAT_CME, AT_CMD_A,
|
|
5701 -1, -1, CME_ERR_NotPresent );
|
|
5702 }
|
|
5703 } /* end if ( satShrdPrm.opchStat EQ OPCH_EST_REQ ) */
|
|
5704 }
|
|
5705
|
|
5706
|
|
5707 /*
|
|
5708 +-------------------------------------------------------------------+
|
|
5709 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
5710 | ROUTINE : cmhSAT_OpChnCnct |
|
|
5711 +-------------------------------------------------------------------+
|
|
5712
|
|
5713 PURPOSE : This callback function will be called when the SIM entity
|
|
5714 has tried to connect a DTI channel
|
|
5715
|
|
5716 */
|
|
5717
|
|
5718 GLOBAL void cmhSAT_OpChnCnct( UBYTE dtiConn, UBYTE chnId )
|
|
5719 {
|
|
5720 #ifdef DTI
|
|
5721 T_SIM_SAT_CHN chnInf;
|
|
5722
|
|
5723 TRACE_FUNCTION("cmhSAT_OpChnCnct()");
|
|
5724
|
|
5725 /* connection was successful */
|
|
5726 if( dtiConn & SIM_DTI_CONNECT )
|
|
5727 {
|
|
5728 satShrdPrm.chnTb.lnkStat = SIM_LINK_CNCT;
|
|
5729 TRACE_EVENT("cmhSAT_OpChnCnct: SIM-DTI connection successful");
|
|
5730 }
|
|
5731 else
|
|
5732 {
|
|
5733 /* unsuccessful connection */
|
|
5734 TRACE_EVENT("cmhSAT_OpChnCnct: ERROR: SIM-DTI connection unsuccessful!");
|
|
5735
|
|
5736 /* if the channel is still open */
|
|
5737
|
|
5738 /* SAT E patch: Since this information isn't available from incoming
|
|
5739 * SIM_DTI_CNF look into the shrd parameters whether there has been a
|
|
5740 * already BIP channel established within this channel connection */
|
|
5741 /* former checked: dtiConn & SIM_BIP_OPEN_CHANNEL*/
|
|
5742 if( (satShrdPrm.chnTb.lnkStat EQ SIM_LINK_OPEN) )
|
|
5743 {
|
|
5744 /* check for SEND DATA/OPEN CHANNEL command context */
|
|
5745 if( satShrdPrm.opchStat EQ OPCH_EST_REQ AND
|
|
5746 (satShrdPrm.cmdDet.cmdType EQ SAT_CMD_OPEN_CHANNEL OR
|
|
5747 satShrdPrm.cmdDet.cmdType EQ SAT_CMD_SEND_DATA))
|
|
5748 {
|
|
5749 chnInf.bipConn = SIM_BIP_CLOSE_CHANNEL;
|
|
5750 chnInf.dtiConn = SIM_DTI_UNKNOWN;
|
|
5751 chnInf.chnId = CHANNEL_ID_1;
|
|
5752 chnInf.genRes = RSLT_BEARIND_PERR;
|
|
5753 chnInf.addRes = ADD_BIP_NO_CHAN_AVAIL;
|
|
5754
|
|
5755 psaSIM_SATBIPChn( chnInf, cmhSAT_OpChnClose );
|
|
5756 }
|
|
5757
|
|
5758 satShrdPrm.chnTb.lnkStat = SIM_LINK_OPEN;
|
|
5759 }
|
|
5760 /* if bearer is still in use */
|
|
5761 else if ( satShrdPrm.chnTb.chnUsdFlg )
|
|
5762 {
|
|
5763 /* if a CSD is still in progress */
|
|
5764 if( satShrdPrm.chnTb.chnType EQ B_CSD )
|
|
5765 {
|
|
5766 SHORT dummy;
|
|
5767
|
|
5768 cmhCC_ClearCall( satShrdPrm.chnTb.chnRefId,
|
|
5769 MNCC_CAUSE_CALL_CLEAR,
|
|
5770 satShrdPrm.opchAcptSrc,
|
|
5771 AT_CMD_NONE,
|
|
5772 &dummy);
|
|
5773 }
|
|
5774
|
|
5775 #ifdef GPRS
|
|
5776 /* if a GPRS context is still in progress */
|
|
5777 if( satShrdPrm.chnTb.chnType EQ B_GPRS )
|
|
5778 {
|
|
5779 SHORT cid_array[2] = { 0,INVALID_CID };
|
|
5780 cid_array[0] = satShrdPrm.chnTb.chnRefId;
|
|
5781
|
|
5782 sAT_PlusCGACT( satShrdPrm.opchAcptSrc,
|
|
5783 CGACT_STATE_DEACTIVATED, cid_array );
|
|
5784 }
|
|
5785 #endif /* GPRS */
|
|
5786 }
|
|
5787 }
|
|
5788 #endif /* DTI */
|
|
5789 }
|
|
5790
|
|
5791 /*
|
|
5792 +-------------------------------------------------------------------+
|
|
5793 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
5794 | ROUTINE : cmhSAT_OpChnClose |
|
|
5795 +-------------------------------------------------------------------+
|
|
5796
|
|
5797 PURPOSE : This callback function will be called when the SIM entity
|
|
5798 has tried to close a channel
|
|
5799
|
|
5800 */
|
|
5801
|
|
5802 GLOBAL void cmhSAT_OpChnClose( UBYTE bipConn, UBYTE chnId )
|
|
5803 {
|
|
5804 T_ACI_SAT_TERM_RESP resp_data; /* holds terminal response parms */
|
|
5805
|
|
5806 TRACE_FUNCTION("cmhSAT_OpChnClose()");
|
|
5807
|
|
5808
|
|
5809 /* channel closed */
|
|
5810 if( bipConn & SIM_BIP_CLOSE_CHANNEL )
|
|
5811 {
|
|
5812 satShrdPrm.chnTb.lnkStat = SIM_NO_LINK;
|
|
5813
|
|
5814 psaSAT_InitTrmResp( &resp_data );
|
|
5815
|
|
5816 /* check for OPEN CHANNEL command context, immediate channel */
|
|
5817 if( satShrdPrm.opchStat EQ OPCH_EST_REQ AND
|
|
5818 satShrdPrm.cmdDet.cmdType EQ SAT_CMD_OPEN_CHANNEL )
|
|
5819 {
|
|
5820 resp_data.add_content = ADD_BIP_NO_CHAN_AVAIL;
|
|
5821 resp_data.chnStat = TRUE;
|
|
5822
|
|
5823 cmhSAT_OpChnFailed(RSLT_BEARIND_PERR, &resp_data);
|
|
5824 cmhSAT_cleanupOpChnPrms();
|
|
5825
|
|
5826 }
|
|
5827
|
|
5828 /* check for SEND DATA command context, on-demand channel */
|
|
5829 else if( satShrdPrm.opchStat EQ OPCH_EST_REQ AND
|
|
5830 satShrdPrm.cmdDet.cmdType EQ SAT_CMD_SEND_DATA )
|
|
5831 {
|
|
5832 cmhSAT_cleanupOpChnPrms();
|
|
5833 }
|
|
5834
|
|
5835 /* check for intented channel closing */
|
|
5836 else if( satShrdPrm.opchStat EQ OPCH_CLS_REQ AND
|
|
5837 satShrdPrm.cmdDet.cmdType EQ SAT_CMD_CLOSE_CHANNEL)
|
|
5838 {
|
|
5839 resp_data.chnStat = TRUE;
|
|
5840 psaSAT_SendTrmResp( RSLT_PERF_SUCCESS, &resp_data );
|
|
5841 if ( dti_cntrl_is_dti_channel_connected (DTI_ENTITY_UDP, simShrdPrm.sat_class_e_dti_id)
|
|
5842 #ifdef GPRS
|
|
5843 OR dti_cntrl_is_dti_channel_connected (DTI_ENTITY_SNDCP, simShrdPrm.sat_class_e_dti_id)
|
|
5844 #endif /* GPRS */
|
|
5845 )
|
|
5846 {
|
|
5847 cmhSAT_cleanupOpChnPrms();
|
|
5848 }
|
|
5849 else /* L2R or TRA - dti channel has to be closed explicitly */
|
|
5850 {
|
|
5851 /* close existing DTI channel first */
|
|
5852 dti_cntrl_close_dpath_from_dti_id(simShrdPrm.sat_class_e_dti_id);
|
|
5853 cmhSAT_cleanupOpChnPrms();
|
|
5854 }
|
|
5855 }
|
|
5856
|
|
5857
|
|
5858 /* if bearer is still in use */
|
|
5859 if( satShrdPrm.chnTb.chnUsdFlg )
|
|
5860 {
|
|
5861 /* if a CSD is still in progress */
|
|
5862 if( satShrdPrm.chnTb.chnType EQ B_CSD )
|
|
5863 {
|
|
5864 SHORT dummy;
|
|
5865
|
|
5866 cmhCC_ClearCall( satShrdPrm.chnTb.chnRefId,
|
|
5867 MNCC_CAUSE_CALL_CLEAR,
|
|
5868 satShrdPrm.opchAcptSrc,
|
|
5869 AT_CMD_NONE,
|
|
5870 &dummy);
|
|
5871 }
|
|
5872 #if defined (GPRS) AND defined (DTI)
|
|
5873 /* if a GPRS context is still in progress */
|
|
5874 if( satShrdPrm.chnTb.chnType EQ B_GPRS )
|
|
5875 {
|
|
5876 SHORT cid_array[2] = { 0,INVALID_CID };
|
|
5877 cid_array[0] = satShrdPrm.chnTb.chnRefId;
|
|
5878
|
|
5879 sAT_PlusCGACT( satShrdPrm.opchAcptSrc,
|
|
5880 CGACT_STATE_DEACTIVATED, cid_array );
|
|
5881 }
|
|
5882 #endif /* GPRS */
|
|
5883 }
|
|
5884 }
|
|
5885 }
|
|
5886
|
|
5887 /*
|
|
5888 +-------------------------------------------------------------------+
|
|
5889 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
5890 | ROUTINE : cmhSAT_OpChnCSDDown |
|
|
5891 +-------------------------------------------------------------------+
|
|
5892
|
|
5893 PURPOSE : This function is used to indictate that the CSD data
|
|
5894 connection is down.
|
|
5895
|
|
5896 */
|
|
5897
|
|
5898 GLOBAL void cmhSAT_OpChnCSDDown( SHORT cId, UBYTE tpl )
|
|
5899 {
|
|
5900 T_ACI_SAT_TERM_RESP resp_data; /* holds terminal response parms */
|
|
5901
|
|
5902 TRACE_FUNCTION("cmhSAT_OpChnCSDDown()");
|
|
5903
|
|
5904 psaSAT_InitTrmResp( &resp_data );
|
|
5905 resp_data.add_content = ADD_NO_CAUSE;
|
|
5906
|
|
5907 if( satShrdPrm.chnTb.chnUsdFlg AND
|
|
5908 satShrdPrm.chnTb.chnType EQ B_CSD AND
|
|
5909 (satShrdPrm.chnTb.chnTPL EQ tpl OR tpl EQ TPL_DONT_CARE) AND
|
|
5910 satShrdPrm.chnTb.chnRefId EQ cId )
|
|
5911 {
|
|
5912
|
|
5913 /* If transport layer is UDP, reset wap_call flag */
|
|
5914 if( satShrdPrm.chnTb.chnTPL EQ UDP )
|
|
5915 {
|
|
5916 sAT_PercentWAP ( CMD_SRC_NONE, 0 );
|
|
5917
|
|
5918 /* clear parameters of dti connection */
|
|
5919 }
|
|
5920
|
|
5921 if(simShrdPrm.sat_class_e_dti_id NEQ DTI_DTI_ID_NOTPRESENT)
|
|
5922 {
|
|
5923 dti_cntrl_erase_entry(simShrdPrm.sat_class_e_dti_id);
|
|
5924 dti_cntrl_clear_conn_parms(simShrdPrm.sat_class_e_dti_id);
|
|
5925 simShrdPrm.sat_class_e_dti_id = DTI_DTI_ID_NOTPRESENT;
|
|
5926 TRACE_EVENT("sat_class_e_dti_id reset");
|
|
5927 }
|
|
5928
|
|
5929 cmhSAT_OpChnFailed( RSLT_ME_UNAB_PROC, &resp_data );
|
|
5930 }
|
|
5931 }
|
|
5932
|
|
5933 /*
|
|
5934 +-------------------------------------------------------------------+
|
|
5935 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
5936 | ROUTINE : cmhSAT_OpChnGPRSDeact |
|
|
5937 +-------------------------------------------------------------------+
|
|
5938
|
|
5939 PURPOSE : This function is used to indictate that the CSD data
|
|
5940 connection is down.
|
|
5941
|
|
5942 */
|
|
5943 #ifdef GPRS
|
|
5944 GLOBAL void cmhSAT_OpChnGPRSDeact( void )
|
|
5945 {
|
|
5946
|
|
5947 SHORT cid;
|
|
5948 TRACE_FUNCTION("cmhSAT_OpChnGPRSDeact()");
|
|
5949
|
|
5950 cid = gaci_get_cid_over_dti_id(wap_dti_id);
|
|
5951
|
|
5952 /* If transport layer is UDP, reset wap_call flag */
|
|
5953 if( satShrdPrm.chnTb.chnTPL EQ UDP )
|
|
5954 {
|
|
5955 cmhSM_disconnect_cid(cid, GC_TYPE_WAP );
|
|
5956 sAT_PercentWAP ( CMD_SRC_NONE, 0 );
|
|
5957 if(work_cids[cid_pointer] EQ cid)
|
|
5958 {
|
|
5959 smEntStat.curCmd = AT_CMD_NONE;
|
|
5960 *work_cids = 0;
|
|
5961 cid_pointer = 0;
|
|
5962 }
|
|
5963 }
|
|
5964
|
|
5965 /* clear parameters of dti connection */
|
|
5966 if(simShrdPrm.sat_class_e_dti_id NEQ DTI_DTI_ID_NOTPRESENT)
|
|
5967 {
|
|
5968 dti_cntrl_erase_entry(simShrdPrm.sat_class_e_dti_id);
|
|
5969 dti_cntrl_clear_conn_parms(simShrdPrm.sat_class_e_dti_id);
|
|
5970 simShrdPrm.sat_class_e_dti_id = DTI_DTI_ID_NOTPRESENT;
|
|
5971 TRACE_EVENT("sat_class_e_dti_id reset");
|
|
5972 }
|
|
5973
|
|
5974 }
|
|
5975 #endif /* GPRS */
|
|
5976 /*
|
|
5977 +-------------------------------------------------------------------+
|
|
5978 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
5979 | ROUTINE : cmhSAT_OpChnSIMFail |
|
|
5980 +-------------------------------------------------------------------+
|
|
5981
|
|
5982 PURPOSE : This callback function will be called when the SIM entity
|
|
5983 has reported a failure
|
|
5984
|
|
5985 */
|
|
5986
|
|
5987 GLOBAL void cmhSAT_OpChnSIMFail( UBYTE dtiConn, UBYTE bipConn, UBYTE chnId )
|
|
5988 {
|
|
5989 #ifdef DTI
|
|
5990 T_SIM_SAT_CHN chnInf;
|
|
5991
|
|
5992 TRACE_FUNCTION("cmhSAT_OpChnSIMFail()");
|
|
5993
|
|
5994 /* if the channel is still open */
|
|
5995 if( bipConn & SIM_BIP_OPEN_CHANNEL )
|
|
5996 {
|
|
5997 chnInf.bipConn = SIM_BIP_CLOSE_CHANNEL;
|
|
5998 chnInf.dtiConn = SIM_DTI_UNKNOWN;
|
|
5999 chnInf.chnId = CHANNEL_ID_1;
|
|
6000 chnInf.genRes = RSLT_BEARIND_PERR;
|
|
6001 chnInf.addRes = ADD_BIP_NO_CHAN_AVAIL;
|
|
6002
|
|
6003 psaSIM_SATBIPChn( chnInf, cmhSAT_OpChnClose );
|
|
6004
|
|
6005 satShrdPrm.chnTb.lnkStat = SIM_LINK_OPEN;
|
|
6006 }
|
|
6007 /* if bearer is still in use */
|
|
6008 else if ( satShrdPrm.chnTb.chnUsdFlg )
|
|
6009 {
|
|
6010 /* if a CSD is still in progress */
|
|
6011 if( satShrdPrm.chnTb.chnType EQ B_CSD )
|
|
6012 {
|
|
6013 SHORT dummy;
|
|
6014
|
|
6015 cmhCC_ClearCall( satShrdPrm.chnTb.chnRefId,
|
|
6016 MNCC_CAUSE_CALL_CLEAR,
|
|
6017 satShrdPrm.opchAcptSrc,
|
|
6018 AT_CMD_NONE,
|
|
6019 &dummy);
|
|
6020 }
|
|
6021
|
|
6022 #ifdef GPRS
|
|
6023 /* if a GPRS context is still in progress */
|
|
6024 if( satShrdPrm.chnTb.chnType EQ B_GPRS )
|
|
6025 {
|
|
6026 SHORT cid_array[2] = { 0,INVALID_CID };
|
|
6027 cid_array[0] = satShrdPrm.chnTb.chnRefId;
|
|
6028
|
|
6029 sAT_PlusCGACT( satShrdPrm.opchAcptSrc,
|
|
6030 CGACT_STATE_DEACTIVATED, cid_array );
|
|
6031 }
|
|
6032 #endif /* GPRS */
|
|
6033 }
|
|
6034 #endif /* DTI */
|
|
6035 }
|
|
6036
|
|
6037 /*
|
|
6038 +-------------------------------------------------------------------+
|
|
6039 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
6040 | ROUTINE : cmhSAT_OpChnChckCSD |
|
|
6041 +-------------------------------------------------------------------+
|
|
6042
|
|
6043 PURPOSE : This function is used to check if an open channel command
|
|
6044 for CSD with the given TPL is pending
|
|
6045
|
|
6046 */
|
|
6047
|
|
6048 GLOBAL BOOL cmhSAT_OpChnChckCSD( UBYTE tpl )
|
|
6049 {
|
|
6050
|
|
6051 /* in case of a SAT channel establishment */
|
|
6052 if( satShrdPrm.opchStat EQ OPCH_EST_REQ AND
|
|
6053 satShrdPrm.chnTb.chnTPL EQ tpl AND
|
|
6054 satShrdPrm.opchType EQ B_CSD )
|
|
6055 {
|
|
6056 return( TRUE );
|
|
6057 }
|
|
6058
|
|
6059 return( FALSE );
|
|
6060 }
|
|
6061
|
|
6062 /*
|
|
6063 +-------------------------------------------------------------------+
|
|
6064 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
6065 | ROUTINE : cmhSAT_OpChnSIMCnctReq |
|
|
6066 +-------------------------------------------------------------------+
|
|
6067
|
|
6068 PURPOSE : This function is used to request a connection between SIM
|
|
6069 and the specified unit
|
|
6070 */
|
|
6071
|
|
6072 GLOBAL void cmhSAT_OpChnSIMCnctReq(UBYTE unit)
|
|
6073 {
|
|
6074 #ifdef DTI
|
|
6075 T_SIM_SAT_CHN chnInf;
|
|
6076
|
|
6077 TRACE_FUNCTION("cmhSAT_OpChnSIMCnctReq()");
|
|
6078
|
|
6079 if( satShrdPrm.opchStat EQ OPCH_EST_REQ )
|
|
6080 {
|
|
6081 /* DTI CHANNEL ESTABLISHMENT requested */
|
|
6082
|
|
6083 /* check for modification of bearer parameters */
|
|
6084 cmhSAT_OpChnChckBear();
|
|
6085
|
|
6086 /* setup channel info for PSA */
|
|
6087 chnInf.dtiUnit = unit;
|
|
6088 chnInf.chnId = CHANNEL_ID_1;
|
|
6089 chnInf.dtiConn = 0;
|
|
6090 chnInf.dtiConn = SIM_DTI_CONNECT;
|
|
6091
|
|
6092 if ( unit NEQ DTI_ENTITY_UDP )
|
|
6093 {
|
|
6094 /* init DTI channel for SIM -> SNDCP, L2R and TRA */
|
|
6095 psaSIM_SATChn( chnInf, cmhSAT_OpChnCnct );
|
|
6096 }
|
|
6097 else
|
|
6098 {
|
|
6099 /* prepare parameters for SIM -> UDP connection */
|
|
6100 /* copy settings into shrd prms */
|
|
6101 memcpy(&simShrdPrm.sim_dti_chPrm->sat_chn_prm,&chnInf,sizeof(T_SIM_SAT_CHN));
|
|
6102 /* callback for results of DTI connection has to be cmhSAT_OpChnCnct */
|
|
6103 simShrdPrm.sim_dti_chPrm->dti_cb = cmhSAT_OpChnCnct;
|
|
6104 }
|
|
6105 }
|
|
6106 #endif /* DTI */
|
|
6107 }
|
|
6108
|
|
6109 /*
|
|
6110 +-------------------------------------------------------------------+
|
|
6111 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
6112 | ROUTINE : cmhSAT_OpChnChckBear |
|
|
6113 +-------------------------------------------------------------------+
|
|
6114
|
|
6115 PURPOSE : This function is used to check whether the bearer parameters
|
|
6116 differ from the orignal settings by the SAT command.
|
|
6117 If so, the new parameters will overwrite the settings in
|
|
6118 opchPrm and the opchPrmMdf will be set to TRUE.
|
|
6119
|
|
6120 */
|
|
6121
|
|
6122 GLOBAL void cmhSAT_OpChnChckBear(void)
|
|
6123 {
|
|
6124 UBYTE mt;
|
|
6125
|
|
6126 TRACE_FUNCTION("cmhSAT_OpChnChckBear()");
|
|
6127
|
|
6128 satShrdPrm.opchPrmMdf = FALSE;
|
|
6129
|
|
6130 /*
|
|
6131 *-------------------------------------------------------------------
|
|
6132 * for CSD bearer parameters
|
|
6133 *-------------------------------------------------------------------
|
|
6134 */
|
|
6135 if( satShrdPrm.chnTb.chnType EQ B_CSD )
|
|
6136 {
|
|
6137 T_CC_CALL_TBL * pCtbNtry;
|
|
6138 UBYTE cmdSpeed;
|
|
6139 UBYTE cmdName;
|
|
6140 UBYTE cmdCE;
|
|
6141 T_SAT_CSD_PRM *p = (T_SAT_CSD_PRM*)satShrdPrm.opchPrm;
|
|
6142
|
|
6143 if (!psaCC_ctbIsValid (satShrdPrm.chnTb.chnRefId))
|
|
6144 {
|
|
6145 /* Avoid to dereference NULL */
|
|
6146 TRACE_ERROR ("Call table entry disappeared");
|
|
6147 return;
|
|
6148 }
|
|
6149
|
|
6150 pCtbNtry = ccShrdPrm.ctb[satShrdPrm.chnTb.chnRefId];
|
|
6151
|
|
6152 if( !p->def_bear_prm )
|
|
6153 {
|
|
6154 cmdSpeed = cmhCC_SelRate(p->csd_bear_prm.csd_speed);
|
|
6155 cmdName = cmhCC_SelServ(p->csd_bear_prm.csd_name);
|
|
6156 cmdCE = cmhCC_SelCE (p->csd_bear_prm.csd_ce);
|
|
6157
|
|
6158 if((cmdSpeed NEQ pCtbNtry->BC[0].rate) OR
|
|
6159 (cmdName NEQ pCtbNtry->BC[0].bearer_serv) OR
|
|
6160 (cmdCE NEQ pCtbNtry->BC[0].conn_elem ))
|
|
6161 {
|
|
6162 satShrdPrm.opchPrmMdf = TRUE;
|
|
6163 }
|
|
6164 }
|
|
6165
|
|
6166 /* update bearer parms with current values */
|
|
6167 p->csd_bear_prm.csd_speed = (UBYTE)cmhCC_GetDataRate(&pCtbNtry->BC[0]);
|
|
6168 mt = pCtbNtry->BC[0].modem_type;
|
|
6169
|
|
6170 switch( pCtbNtry->BC[0].rate )
|
|
6171 {
|
|
6172 case( UR_0_3_KBIT ):
|
|
6173 if( mt EQ MT_V21 ) p->csd_bear_prm.csd_speed = BS_SPEED_300_V21;
|
|
6174 break;
|
|
6175 case( UR_1_2_KBIT ):
|
|
6176 if ( mt EQ MT_V22 ) p->csd_bear_prm.csd_speed = BS_SPEED_1200_V22;
|
|
6177 else if ( mt EQ MT_V23 ) p->csd_bear_prm.csd_speed = BS_SPEED_1200_75_V23;
|
|
6178 else if ( mt EQ MT_NONE ) p->csd_bear_prm.csd_speed = BS_SPEED_1200_V110;
|
|
6179 break;
|
|
6180 case( UR_2_4_KBIT ):
|
|
6181 if ( mt EQ MT_V22_BIS ) p->csd_bear_prm.csd_speed = BS_SPEED_2400_V22bis;
|
|
6182 else if ( mt EQ MT_V26_TER ) p->csd_bear_prm.csd_speed = BS_SPEED_2400_V26ter;
|
|
6183 else if ( mt EQ MT_NONE ) p->csd_bear_prm.csd_speed = BS_SPEED_2400_V110;
|
|
6184 break;
|
|
6185 case( UR_4_8_KBIT ):
|
|
6186 if ( mt EQ MT_V32 ) p->csd_bear_prm.csd_speed = BS_SPEED_4800_V32;
|
|
6187 else if ( mt EQ MT_NONE ) p->csd_bear_prm.csd_speed = BS_SPEED_4800_V110;
|
|
6188 break;
|
|
6189 case( UR_9_6_KBIT ):
|
|
6190 if ( mt EQ MT_V32 ) p->csd_bear_prm.csd_speed = BS_SPEED_9600_V32;
|
|
6191 else if ( mt EQ MT_V34 ) p->csd_bear_prm.csd_speed = BS_SPEED_9600_V34;
|
|
6192 else if ( mt EQ MT_NONE ) p->csd_bear_prm.csd_speed = BS_SPEED_9600_V110;
|
|
6193 break;
|
|
6194 case( UR_14_4_KBIT ):
|
|
6195 if ( mt EQ MT_V34 ) p->csd_bear_prm.csd_speed = BS_SPEED_14400_V34;
|
|
6196 else if ( mt EQ MT_NONE ) p->csd_bear_prm.csd_speed = BS_SPEED_14400_V110;
|
|
6197 break;
|
|
6198 default:
|
|
6199 break; /* leave it the way it is */
|
|
6200 }
|
|
6201
|
|
6202 switch( pCtbNtry->BC[0].bearer_serv )
|
|
6203 {
|
|
6204 case( BEARER_SERV_ASYNC ):
|
|
6205 p->csd_bear_prm.csd_name = CBST_NAM_Asynch; break;
|
|
6206
|
|
6207 case( BEARER_SERV_SYNC ):
|
|
6208 p->csd_bear_prm.csd_name = CBST_NAM_Synch; break;
|
|
6209
|
|
6210 default: break; /* leave it the way it is */
|
|
6211 }
|
|
6212
|
|
6213 switch( pCtbNtry->BC[0].conn_elem )
|
|
6214 {
|
|
6215 case( CONN_ELEM_TRANS ):
|
|
6216 p->csd_bear_prm.csd_ce = CBST_CE_Transparent; break;
|
|
6217
|
|
6218 case( CONN_ELEM_NON_TRANS ):
|
|
6219 p->csd_bear_prm.csd_ce = CBST_CE_NonTransparent; break;
|
|
6220
|
|
6221 default: break; /* leave it the way it is */
|
|
6222 }
|
|
6223 }
|
|
6224 /*
|
|
6225 *-------------------------------------------------------------------
|
|
6226 * for GPRS bearer parameters
|
|
6227 *-------------------------------------------------------------------
|
|
6228 */
|
|
6229 #ifdef GPRS
|
|
6230 if( satShrdPrm.chnTb.chnType EQ B_GPRS )
|
|
6231 {
|
|
6232 T_QOS* curQOS;
|
|
6233 T_SAT_GPRS_PRM *p = (T_SAT_GPRS_PRM*)satShrdPrm.opchPrm;
|
|
6234
|
|
6235 curQOS = cmhSM_getCurQOS( satShrdPrm.chnTb.chnRefId );
|
|
6236
|
|
6237 if( !p->def_bear_prm )
|
|
6238 {
|
|
6239 if((curQOS->preced NEQ p->gprs_bear_prm.gprs_prec) OR
|
|
6240 (curQOS->delay NEQ p->gprs_bear_prm.gprs_delay) OR
|
|
6241 (curQOS->relclass NEQ p->gprs_bear_prm.gprs_rely ) OR
|
|
6242 (curQOS->peak NEQ p->gprs_bear_prm.gprs_peak ) OR
|
|
6243 (curQOS->mean NEQ p->gprs_bear_prm.gprs_mean ) )
|
|
6244 {
|
|
6245 satShrdPrm.opchPrmMdf = TRUE;
|
|
6246 }
|
|
6247 }
|
|
6248 /* update bearer parms with current values */
|
|
6249 p->gprs_bear_prm.gprs_prec = curQOS->preced;
|
|
6250 p->gprs_bear_prm.gprs_delay = curQOS->delay;
|
|
6251 p->gprs_bear_prm.gprs_rely = curQOS->relclass;
|
|
6252 p->gprs_bear_prm.gprs_peak = curQOS->peak;
|
|
6253 p->gprs_bear_prm.gprs_mean = curQOS->mean;
|
|
6254 }
|
|
6255 #endif /* GPRS */
|
|
6256 }
|
|
6257 #ifdef DTI
|
|
6258 /*
|
|
6259 +-------------------------------------------------------------------+
|
|
6260 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
6261 | ROUTINE : cmhSAT_OpChnSetPPP |
|
|
6262 +-------------------------------------------------------------------+
|
|
6263
|
|
6264 PURPOSE : This function is used to set up PPP parameters.
|
|
6265
|
|
6266 */
|
|
6267
|
|
6268 GLOBAL void cmhSAT_OpChnSetPPP(UBYTE chnType)
|
|
6269 {
|
|
6270
|
|
6271 CHAR log[PPP_LOGIN_NAME_LENGTH+1]; /* holds login name */
|
|
6272 CHAR pwd[PPP_LOGIN_NAME_LENGTH+1]; /* holds password */
|
|
6273
|
|
6274 T_SAT_CSD_PRM *p = (T_SAT_CSD_PRM*)satShrdPrm.opchPrm;
|
|
6275
|
|
6276 TRACE_FUNCTION("cmhSAT_OpChnSetPPP()");
|
|
6277
|
|
6278 log[0] = 0; /* empty login name */
|
|
6279 pwd[0] = 0; /* empty user name */
|
|
6280
|
|
6281 if( chnType EQ B_CSD )
|
|
6282 {
|
|
6283 /* set login name and password, if available */
|
|
6284 if(p->v_log AND p->log.c_text_str)
|
|
6285 {
|
|
6286 strncpy(pwd,(const CHAR *)p->log.text_str,MINIMUM(p->log.c_text_str, PPP_LOGIN_NAME_LENGTH));
|
|
6287 log[MINIMUM(p->log.c_text_str, PPP_LOGIN_NAME_LENGTH)] ='\0';
|
|
6288 }
|
|
6289
|
|
6290 if(p->v_pwd AND p->pwd.c_text_str)
|
|
6291 {
|
|
6292 strncpy(pwd,(const CHAR *)p->pwd.text_str,MINIMUM(p->pwd.c_text_str, PPP_LOGIN_NAME_LENGTH));
|
|
6293 pwd[MINIMUM(p->pwd.c_text_str, PPP_LOGIN_NAME_LENGTH)] ='\0';
|
|
6294 }
|
|
6295 }
|
|
6296
|
|
6297 sAT_PercentPPP( satShrdPrm.opchAcptSrc, A_PAP, log, pwd, USE_NO_PPP_FOR_AAA );
|
|
6298 }
|
|
6299 #endif /* DTI */
|
|
6300
|
|
6301 /*
|
|
6302 +-------------------------------------------------------------------+
|
|
6303 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
6304 | ROUTINE : cmhSAT_OpChnStatEvnt |
|
|
6305 +-------------------------------------------------------------------+
|
|
6306
|
|
6307 PURPOSE : This function is used to send a channel status event if
|
|
6308 enabled by SAT
|
|
6309
|
|
6310 */
|
|
6311
|
|
6312 GLOBAL void cmhSAT_OpChnStatEvnt( void )
|
|
6313 {
|
|
6314
|
|
6315 TRACE_FUNCTION("cmhSAT_OpChnStatEvnt()");
|
|
6316
|
|
6317 if( psaSAT_ChkEventList( EVENT_CHAN_STAT ) )
|
|
6318 {
|
|
6319 cmhSAT_EventDwn( EVENT_CHAN_STAT, -1, NEAR_END );
|
|
6320 }
|
|
6321
|
|
6322 }
|
|
6323
|
|
6324 /*
|
|
6325 +-------------------------------------------------------------------+
|
|
6326 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
6327 | ROUTINE : cmhSAT_OpChnGPRSPend |
|
|
6328 +-------------------------------------------------------------------+
|
|
6329
|
|
6330 PURPOSE : This function is used to check for a pending GPRS open
|
|
6331 channel command.
|
|
6332
|
|
6333 */
|
|
6334 #ifdef GPRS
|
|
6335 GLOBAL BOOL cmhSAT_OpChnGPRSPend( SHORT cid, UBYTE opchStat )
|
|
6336 {
|
|
6337 if( satShrdPrm.chnTb.chnUsdFlg AND
|
|
6338 satShrdPrm.chnTb.chnType EQ B_GPRS AND
|
|
6339 (opchStat EQ OPCH_NONE OR opchStat EQ satShrdPrm.opchStat)AND
|
|
6340 (cid EQ INVALID_CID OR cid EQ satShrdPrm.chnTb.chnRefId))
|
|
6341
|
|
6342 return( TRUE );
|
|
6343
|
|
6344 else
|
|
6345
|
|
6346 return( FALSE );
|
|
6347 }
|
|
6348 #endif /* GPRS */
|
|
6349
|
|
6350 /*
|
|
6351 +-------------------------------------------------------------------+
|
|
6352 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
6353 | ROUTINE : cmhSAT_OpChnUDPActivateGprs |
|
|
6354 +-------------------------------------------------------------------+
|
|
6355
|
|
6356 PURPOSE : This function is used to activate the UDP data chain and
|
|
6357 GPRS context.
|
|
6358
|
|
6359 */
|
|
6360 #if defined (GPRS) AND defined (DTI)
|
|
6361 GLOBAL void cmhSAT_OpChnUDPActivateGprs( void )
|
|
6362 {
|
|
6363 SHORT cid_array[2] = { 0,INVALID_CID };
|
|
6364 T_ACI_SAT_TERM_RESP resp_data;
|
|
6365
|
|
6366 TRACE_FUNCTION("cmhSAT_OpChnUDPActivateGprs()");
|
|
6367
|
|
6368 cid_array[0] = satShrdPrm.chnTb.chnRefId;
|
|
6369
|
|
6370 /* final check of context id and link status */
|
|
6371 if(!cmhSM_define_cid_list((T_ACI_CMD_SRC)satShrdPrm.opchAcptSrc, cid_array ) OR
|
|
6372 !srcc_reserve_sources( SRCC_IP_SNDCP_LINK, satShrdPrm.chnTb.chnRefId))
|
|
6373 {
|
|
6374 psaSAT_InitTrmResp( &resp_data );
|
|
6375 resp_data.add_content = ADD_BIP_NO_CHAN_AVAIL;
|
|
6376 cmhSAT_OpChnFailed( RSLT_BEARIND_PERR, &resp_data );
|
|
6377 }
|
|
6378
|
|
6379 srcc_new_count(SRCC_IP_SNDCP_LINK);
|
|
6380
|
|
6381 /* create a SAT class E DTI ID if not present */
|
|
6382 if ( simShrdPrm.sat_class_e_dti_id EQ DTI_DTI_ID_NOTPRESENT )
|
|
6383 {
|
|
6384 simShrdPrm.sat_class_e_dti_id = dti_cntrl_new_dti(DTI_DTI_ID_NOTPRESENT);
|
|
6385 TRACE_EVENT_P1("sat_class_e_dti_id = %d", simShrdPrm.sat_class_e_dti_id);
|
|
6386 }
|
|
6387
|
|
6388 /* get dti id for SNDCP/IP link */
|
|
6389 pdp_context[satShrdPrm.chnTb.chnRefId-1].link_id_new =
|
|
6390 dti_conn_compose_link_id (0,0, simShrdPrm.sat_class_e_dti_id, DTI_TUPLE_NO_NOTPRESENT);
|
|
6391
|
|
6392 /* send request to ACI WAP to activate WAP */
|
|
6393 smEntStat.entOwn = smShrdPrm.owner = satShrdPrm.opchAcptSrc;
|
|
6394 smEntStat.curCmd = AT_CMD_CGACT;
|
|
6395
|
|
6396 psaTCPIP_Activate( satShrdPrm.opchAcptSrc,
|
|
6397 simShrdPrm.sat_class_e_dti_id,
|
|
6398 0, TCPIP_ACT_OPTION_V4 | TCPIP_ACT_OPTION_UDP,
|
|
6399 TCPIP_CONNECTION_TYPE_GPRS_WAP,
|
|
6400 cmhSM_IP_activate_cb);
|
|
6401
|
|
6402 }
|
|
6403 #endif /* GPRS */
|
|
6404
|
|
6405 /*
|
|
6406 +-------------------------------------------------------------------+
|
|
6407 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
6408 | ROUTINE : cmhSAT_OpChnUDPConfGprs |
|
|
6409 +-------------------------------------------------------------------+
|
|
6410
|
|
6411 PURPOSE : This callback function will be called when the UDP stack
|
|
6412 is configured
|
|
6413
|
|
6414 */
|
|
6415
|
|
6416 #if defined(GPRS)
|
|
6417 GLOBAL void cmhSAT_OpChnUDPConfGprs(void)
|
|
6418 {
|
|
6419
|
|
6420 TRACE_FUNCTION("cmhSAT_OpChnUDPConfGprs()");
|
|
6421 /*
|
|
6422 * send the SIM_BIP_CONFIG_REQ primitive providing details of the connection
|
|
6423 * to SIM
|
|
6424 */
|
|
6425 psaSIM_Bip_Config_Req();
|
|
6426
|
|
6427 }
|
|
6428 #endif /* GPRS */
|
|
6429
|
|
6430 /*
|
|
6431 +-------------------------------------------------------------------+
|
|
6432 | PROJECT : GSM-PS (6147) MODULE : SAT |
|
|
6433 | ROUTINE : cmhSAT_OpChnUDPDeactGprs|
|
|
6434 +-------------------------------------------------------------------+
|
|
6435
|
|
6436 PURPOSE : This callback function will be called when the UDP stack
|
|
6437 is deactive
|
|
6438
|
|
6439 */
|
|
6440
|
|
6441 #if defined(GPRS)
|
|
6442 GLOBAL void cmhSAT_OpChnUDPDeactGprs(void)
|
|
6443 {
|
|
6444 T_ACI_SAT_TERM_RESP resp_data; /* holds terminal response parms */
|
|
6445 UBYTE cause;
|
|
6446
|
|
6447 TRACE_FUNCTION("cmhSAT_OpChnUDPDeactGprs()");
|
|
6448
|
|
6449 psaSAT_InitTrmResp( &resp_data );
|
|
6450
|
|
6451 /*
|
|
6452 *-------------------------------------------------------------------
|
|
6453 * check if deactivation was intended
|
|
6454 *-------------------------------------------------------------------
|
|
6455 */
|
|
6456 if( satShrdPrm.opchStat EQ OPCH_CLS_REQ )
|
|
6457 {
|
|
6458 /* nothing to do here anymore */
|
|
6459 }
|
|
6460
|
|
6461 /*
|
|
6462 *-------------------------------------------------------------------
|
|
6463 * deactivation during an establish request
|
|
6464 *-------------------------------------------------------------------
|
|
6465 */
|
|
6466 else if( satShrdPrm.opchStat EQ OPCH_EST_REQ )
|
|
6467 {
|
|
6468 if( satShrdPrm.gprsNtwCs )
|
|
6469 {
|
|
6470 resp_data.add_content = satShrdPrm.gprsNtwCs | 0x80;
|
|
6471
|
|
6472 cause = RSLT_NTW_UNAB_PROC;
|
|
6473 }
|
|
6474 else
|
|
6475 {
|
|
6476 resp_data.add_content = ADD_NO_CAUSE;
|
|
6477 cause = RSLT_ME_UNAB_PROC;
|
|
6478 }
|
|
6479
|
|
6480 cmhSAT_OpChnFailed( cause, &resp_data );
|
|
6481 }
|
|
6482 }
|
|
6483 #endif /* GPRS */
|
|
6484
|
|
6485 /*
|
|
6486 +-------------------------------------------------------------------+
|
|
6487 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
|
|
6488 | STATE : finished ROUTINE : cmhSAT_OpChnGPRSStat |
|
|
6489 +-------------------------------------------------------------------+
|
|
6490
|
|
6491 PURPOSE : This function will be called if the status of the requested
|
|
6492 GPRS context has changed.
|
|
6493
|
|
6494 */
|
|
6495 #if defined (GPRS) AND defined (DTI)
|
|
6496 GLOBAL void cmhSAT_OpChnGPRSStat(T_SAT_GPRS_CB_STAT stat, UBYTE cause)
|
|
6497 {
|
|
6498 T_ACI_SAT_TERM_RESP resp_data; /* holds terminal response parms */
|
|
6499 T_SIM_SAT_CHN chnInf;
|
|
6500
|
|
6501 TRACE_FUNCTION ("cmhSAT_OpChnGPRSStat()");
|
|
6502
|
|
6503 if( cause ) satShrdPrm.gprsNtwCs = cause;
|
|
6504
|
|
6505 /* in case of UDP, we will wait for the UDP status */
|
|
6506 if( satShrdPrm.chnTb.chnTPL EQ UDP AND
|
|
6507 stat NEQ SAT_GPRS_SUSPEND AND
|
|
6508 stat NEQ SAT_GPRS_RESUME)
|
|
6509
|
|
6510 return;
|
|
6511
|
|
6512 psaSAT_InitTrmResp( &resp_data );
|
|
6513
|
|
6514 /*
|
|
6515 *-------------------------------------------------------------------
|
|
6516 * during a close channel request
|
|
6517 *-------------------------------------------------------------------
|
|
6518 */
|
|
6519 if( satShrdPrm.opchStat EQ OPCH_CLS_REQ )
|
|
6520 {
|
|
6521 /* nothing to do here anymore */
|
|
6522 }
|
|
6523
|
|
6524 /*
|
|
6525 *-------------------------------------------------------------------
|
|
6526 * during an open channel establish request
|
|
6527 *-------------------------------------------------------------------
|
|
6528 */
|
|
6529 else if( satShrdPrm.opchStat EQ OPCH_EST_REQ )
|
|
6530 {
|
|
6531 switch ( stat )
|
|
6532 {
|
|
6533 case( SAT_GPRS_DEACT ):
|
|
6534 case( SAT_GPRS_ATT_FAILED ):
|
|
6535 case( SAT_GPRS_ACT_FAILED ):
|
|
6536
|
|
6537 if( satShrdPrm.gprsNtwCs )
|
|
6538 {
|
|
6539 resp_data.add_content = satShrdPrm.gprsNtwCs | 0x80;
|
|
6540
|
|
6541 cause = RSLT_NTW_UNAB_PROC;
|
|
6542 }
|
|
6543 else
|
|
6544 {
|
|
6545 resp_data.add_content = ADD_NO_CAUSE;
|
|
6546 cause = RSLT_ME_UNAB_PROC;
|
|
6547 }
|
|
6548
|
|
6549 cmhSAT_OpChnFailed( cause, &resp_data );
|
|
6550 break;
|
|
6551
|
|
6552 case( SAT_GPRS_SUSPEND ):
|
|
6553
|
|
6554 if( psaSS_stbFindActSrv( NO_ENTRY ) NEQ NO_ENTRY )
|
|
6555 {
|
|
6556 TRACE_EVENT("SAT GPRS channel suspend, SS busy");
|
|
6557 resp_data.add_content = ADD_ME_SS_BUSY;
|
|
6558 }
|
|
6559
|
|
6560 /* check for busy call condition */
|
|
6561 else if( psaSAT_ctbFindActCall() NEQ NO_ENTRY )
|
|
6562 {
|
|
6563 TRACE_EVENT("SAT GPRS channel suspend, busy on call");
|
|
6564 resp_data.add_content = ADD_ME_CALL_BUSY;
|
|
6565 }
|
|
6566
|
|
6567 cmhSAT_OpChnFailed( RSLT_ME_UNAB_PROC, &resp_data );
|
|
6568 break;
|
|
6569
|
|
6570 case( SAT_GPRS_ACT ):
|
|
6571
|
|
6572 cmhSAT_OpChnSIMCnctReq( DTI_ENTITY_SNDCP );
|
|
6573 break;
|
|
6574
|
|
6575 default:
|
|
6576
|
|
6577 break;
|
|
6578 }
|
|
6579 }
|
|
6580 /*
|
|
6581 *-------------------------------------------------------------------
|
|
6582 * expected status change
|
|
6583 *-------------------------------------------------------------------
|
|
6584 */
|
|
6585 else
|
|
6586 {
|
|
6587 switch ( stat )
|
|
6588 {
|
|
6589 case( SAT_GPRS_DEACT ):
|
|
6590 case( SAT_GPRS_ATT_FAILED ):
|
|
6591 case( SAT_GPRS_ACT_FAILED ):
|
|
6592
|
|
6593 resp_data.add_content = ADD_BIP_CHAN_CLOSD;
|
|
6594 cmhSAT_OpChnFailed( RSLT_BEARIND_PERR, &resp_data );
|
|
6595 break;
|
|
6596
|
|
6597 case( SAT_GPRS_SUSPEND ):
|
|
6598
|
|
6599 chnInf.addRes = ADD_NO_CAUSE;
|
|
6600
|
|
6601 if( satShrdPrm.chnTb.lnkStat EQ SIM_LINK_OPEN OR
|
|
6602 satShrdPrm.chnTb.lnkStat EQ SIM_LINK_CNCT )
|
|
6603 {
|
|
6604 if( psaSS_stbFindActSrv( NO_ENTRY ) NEQ NO_ENTRY )
|
|
6605 {
|
|
6606 TRACE_EVENT("SAT GPRS channel suspend, SS busy");
|
|
6607 chnInf.addRes = ADD_ME_SS_BUSY;
|
|
6608 }
|
|
6609
|
|
6610 /* check for busy call condition */
|
|
6611 else if( psaSAT_ctbFindActCall() NEQ NO_ENTRY )
|
|
6612 {
|
|
6613 TRACE_EVENT("SAT GPRS channel suspend, busy on call");
|
|
6614 chnInf.addRes = ADD_ME_CALL_BUSY;
|
|
6615 }
|
|
6616
|
|
6617 /* setup channel info for PSA */
|
|
6618 chnInf.chnId = CHANNEL_ID_1;
|
|
6619 chnInf.genRes = RSLT_ME_UNAB_PROC;
|
|
6620 chnInf.bipConn = SIM_BIP_CHANNEL_SUSPENDED;
|
|
6621 chnInf.dtiConn = SIM_DTI_UNKNOWN;
|
|
6622
|
|
6623 psaSIM_SATBIPChn( chnInf, NULL );
|
|
6624 }
|
|
6625 break;
|
|
6626
|
|
6627 case( SAT_GPRS_RESUME ):
|
|
6628
|
|
6629 if( satShrdPrm.chnTb.lnkStat EQ SIM_LINK_OPEN OR
|
|
6630 satShrdPrm.chnTb.lnkStat EQ SIM_LINK_CNCT )
|
|
6631 {
|
|
6632 /* setup channel info for PSA */
|
|
6633 chnInf.chnId = CHANNEL_ID_1;
|
|
6634 chnInf.genRes = RSLT_PERF_SUCCESS;
|
|
6635 chnInf.addRes = ADD_NO_CAUSE;
|
|
6636 chnInf.bipConn = SIM_BIP_CHANNEL_RESUMED;
|
|
6637 chnInf.dtiConn = SIM_DTI_UNKNOWN;
|
|
6638
|
|
6639 psaSIM_SATBIPChn( chnInf, NULL );
|
|
6640 }
|
|
6641 break;
|
|
6642
|
|
6643 case( SAT_GPRS_ACT ):
|
|
6644 default:
|
|
6645
|
|
6646 break;
|
|
6647 }
|
|
6648 }
|
|
6649
|
|
6650 }
|
|
6651 #endif /* GPRS */
|
|
6652 /*
|
|
6653 +-------------------------------------------------------------------+
|
|
6654 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
|
|
6655 | STATE : finished ROUTINE : cmhSAT_cnvrtAPN2NetworkAdr|
|
|
6656 +-------------------------------------------------------------------+
|
|
6657
|
|
6658 PURPOSE : converts a APN with a given length into a null terminated
|
|
6659 domain name
|
|
6660
|
|
6661 */
|
|
6662
|
|
6663 #ifdef GPRS
|
|
6664 GLOBAL void cmhSAT_cnvrtAPN2NetworkAdr( UBYTE *apn, UBYTE c_apn, UBYTE *dom_name )
|
|
6665 {
|
|
6666 UBYTE lblLen;
|
|
6667 UBYTE apnIdx = 0;
|
|
6668 UBYTE dnIdx = 0;
|
|
6669
|
|
6670 TRACE_FUNCTION ("cmhSAT_cnvrtAPN2NetworkAdr()");
|
|
6671
|
|
6672 while( apnIdx < c_apn )
|
|
6673 {
|
|
6674 lblLen = apn[apnIdx++];
|
|
6675
|
|
6676 memcpy( &dom_name[dnIdx], &apn[apnIdx], lblLen );
|
|
6677
|
|
6678 dnIdx += lblLen;
|
|
6679 apnIdx += lblLen;
|
|
6680
|
|
6681 dom_name[dnIdx++] = '.';
|
|
6682 }
|
|
6683
|
|
6684 dom_name[dnIdx-1] = 0;
|
|
6685 }
|
|
6686 #endif /* GPRS */
|
|
6687
|
|
6688 #endif /* FF_SAT_E */
|
|
6689
|
|
6690 #endif /* SIM_TOOLKIT */
|
|
6691 /*==== EOF ========================================================*/
|