comparison src/g23m-aci/aci/cmh_satf.c @ 1:d393cd9bb723

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