comparison g23m/condat/ms/src/aci/cmh_smf.c @ 0:509db1a7b7b8

initial import: leo2moko-r1
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 01 Jun 2015 03:24:05 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:509db1a7b7b8
1 /*
2 +-----------------------------------------------------------------------------
3 | Project :
4 | Modul :
5 +-----------------------------------------------------------------------------
6 | Copyright 2002 Texas Instruments Berlin, AG
7 | All rights reserved.
8 |
9 | This file is confidential and a trade secret of Texas
10 | Instruments Berlin, AG
11 | The receipt of or possession of this file does not convey
12 | any rights to reproduce or disclose its contents or to
13 | manufacture, use, or sell anything it may describe, in
14 | whole, or in part, without the specific written consent of
15 | Texas Instruments Berlin, AG.
16 +-----------------------------------------------------------------------------
17 | Purpose : This module defines the functions used by the command
18 | handler for GPRS session management ( SM ).
19 +-----------------------------------------------------------------------------
20 */
21
22 #if defined (GPRS) && defined (DTI)
23
24 #ifndef CMH_SMF_C
25 #define CMH_SMF_C
26 #endif
27
28 #include "aci_all.h"
29 /*==== INCLUDES ===================================================*/
30 #include "gprs.h"
31
32 #include "dti.h" /* functionality of the dti library */
33 #include "aci_cmh.h"
34 #include "ati_cmd.h"
35 #include "aci_cmd.h"
36 #include "aci_lst.h"
37 #include "aci.h"
38
39 #include "dti_conn_mng.h"
40 #include "dti_cntrl_mng.h"
41
42 #include "gaci.h"
43 #include "gaci_cmh.h"
44 #include "psa.h"
45 #include "psa_gmm.h"
46 #include "psa_sm.h"
47 #include "psa_gppp.h"
48
49 #include "phb.h"
50 #include "cmh.h"
51 #include "cmh_gmm.h"
52
53 #include "cmh_sm.h"
54 #include "cmh_gppp.h"
55 #include "gaci_srcc.h"
56 #include "psa_cc.h"
57
58 #if defined (CO_UDP_IP) || defined (FF_GPF_TCPIP)
59 #include "wap_aci.h"
60 #include "psa_tcpip.h"
61 #include "cmh_ipa.h"
62 #endif /* WAP || FF_GPF_TCPIP OR SAT E */
63
64 #ifdef SIM_TOOLKIT
65 #include "psa_sat.h"
66 #include "cmh_sat.h"
67 #endif
68
69 #include "psa_sim.h"
70 #include "cmh_sim.h"
71
72 #include "cmh_snd.h"
73
74 /* temp needed because of use of ATI functions here: should eventually disappear */
75 #include "ati_int.h"
76
77 #ifdef FF_GPF_TCPIP
78 #include "dcm_utils.h"
79 #include "dcm_state.h"
80 #include "dcm_env.h"
81 #endif
82 #include "dcm_f.h"
83 #include "psa_uart.h"
84
85
86 /*==== CONSTANTS ==================================================*/
87
88 /*==== TYPES ======================================================*/
89 typedef struct
90 {
91 T_CGEREP_EVENT event;
92 T_CGEREP_EVENT_REP_PARAM parm;
93
94 } T_CGERP_EVENT_BUFFER;
95
96 typedef enum
97 {
98 T_CDS_IDLE,
99 T_CDS_RUNNING
100
101 } T_CONTEXTS_DEACTIVATION_STATUS;
102
103 typedef struct
104 {
105 T_CONTEXTS_DEACTIVATION_STATUS state;
106 USHORT nsapi_set;
107 T_ACI_CMD_SRC srcId;
108 USHORT cid_set;
109
110 } T_CONTEXTS_DEACTIVATION_INFORMATION;
111
112
113 /*==== EXPORT =====================================================*/
114
115 /*==== VARIABLES ==================================================*/
116 GLOBAL SHORT nsapi_to_cid[SMH_NSAPI_MAX];
117 static T_CGSMS_SERVICE m_service;
118 static T_CGERP_EVENT_BUFFER gprs_event_buffer[GPRS_EVENT_REPORTING_BUFFER_SIZE];
119 static SHORT gprs_eb_current_p, gprs_eb_oldest_p;
120 static BOOL m_mt_te_link;
121 static BOOL call_waits_in_table;
122 static T_CONTEXTS_DEACTIVATION_INFORMATION working_cgact_actions;
123 /*==== FUNCTIONS ==================================================*/
124
125 /*
126 * functions for ATA and ATH
127 */
128 /* GLOBAL BOOL cmhSM_sAT_H ( T_ACI_CMD_SRC srcId, T_ACI_RETURN *aci_ret ); */
129 /* GLOBAL BOOL cmhSM_sAT_A ( T_ACI_CMD_SRC srcId, T_ACI_RETURN *aci_ret ); */
130 static BOOL cmhSM_sAT_A_H_intern ( T_ACI_CMD_SRC srcId, T_ACI_RETURN *aci_ret, SHORT mode);
131
132 /*
133 * functions for DTI
134 */
135 /* GLOBAL ULONG cmhSM_get_link_id_SNDCP_peer ( SHORT cid, T_SNDCP_PEER which ); */
136 /* GLOBAL BOOL cmhSM_context_deactivated ( USHORT nsapi_set ); */
137
138 /* GLOBAL T_ACI_RETURN cmhSNDCP_Disable( UBYTE dti_id ); */
139
140
141
142 /*
143 +--------------------------------------------------------------------+
144 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
145 | STATE : finished ROUTINE : cmhSM_Init |
146 +--------------------------------------------------------------------+
147
148 PURPOSE : Fill variables for the own use with default values.
149 */
150 GLOBAL void cmhSM_Init (void)
151 {
152 SHORT i = 0;
153
154 /* SM CMH global parameter */
155 smEntStat.curCmd = AT_CMD_NONE;
156 smEntStat.entOwn = OWN_NONE;
157
158 /* GPRS event reporting */
159 memset(gprs_event_buffer, 0, sizeof(T_CGERP_EVENT_BUFFER) * GPRS_EVENT_REPORTING_BUFFER_SIZE);
160 gprs_eb_current_p = 0;
161 gprs_eb_oldest_p = 0;
162
163
164 cmhSM_empty_call_table();
165
166 /* used for network requested context reactivation */
167 call_waits_in_table = FALSE;
168
169 working_cgact_actions.state = T_CDS_IDLE;
170 working_cgact_actions.nsapi_set = 0;
171 working_cgact_actions.srcId = CMD_SRC_NONE;
172 working_cgact_actions.cid_set = 0;
173
174
175 /*
176 * The following command has to be in the init and the reset function!!!
177 *
178 * Set all to zero in init. In the reset function is a contion action to
179 * not equeal zero.
180 */
181 memset(pdp_context,0 , sizeof(T_GPRS_CONT_CLASS) * MAX_CID);
182
183 for (i = 0; i < MAX_CID; i++)
184 {
185 pdp_context[i].link_id_uart = DTI_LINK_ID_NOTPRESENT;
186 pdp_context[i].link_id_new = DTI_LINK_ID_NOTPRESENT;
187 pdp_context[i].link_id_sn = DTI_LINK_ID_NOTPRESENT;
188 }
189
190 m_mt_te_link = FALSE;
191 }
192
193 GLOBAL void cmhSM_ResetNonWorkingContexts( void )
194 {
195 SHORT i = 0, j = 0;
196 UBYTE srcId = srcId_cb;
197 UBYTE gprs_default_pco[] = {
198 0x80,0x80,0x21,0x10,0x01,0x01,0x00,0x10,0x81,0x06,
199 0x00,0x00,0x00,0x00,0x83,0x06,0x00,0x00,0x00,0x00
200 };
201 for (i = 0; i < MAX_CID; i++)
202 {
203 if ( (pdp_context[i].state EQ CS_UNDEFINED) OR (pdp_context[i].state EQ CS_DEFINED) )
204 {
205
206 for (j = 0; j < SMH_NSAPI_MAX; j++)
207 {
208 if ( nsapi_to_cid[j] EQ i + 1 )
209 {
210 nsapi_to_cid[j] = INVALID_CID;
211 }
212 }
213
214 memset(&pdp_context[i], 0, sizeof(T_GPRS_CONT_CLASS));
215
216 pdp_context[i].state = CS_UNDEFINED;
217 pdp_context[i].smreg_ti = UNDEFINED_TI;
218 pdp_context[i].link_id_uart = DTI_LINK_ID_NOTPRESENT;
219 pdp_context[i].link_id_new = DTI_LINK_ID_NOTPRESENT;
220 pdp_context[i].link_id_sn = DTI_LINK_ID_NOTPRESENT;
221
222 pdp_context[i].user_pco.len = sizeof (gprs_default_pco);
223 memcpy (pdp_context[i].user_pco.pco, gprs_default_pco, sizeof (gprs_default_pco));
224 }
225 }
226
227 memset(work_cids, 0, sizeof(SHORT) * MAX_CID_PLUS_EINS);
228 cid_pointer = 0;
229
230 /* set default context parameter */
231 memset(&defaultCtx, 0, sizeof(T_GPRS_CONT_REC));
232 strcpy(defaultCtx.pdp_type,"IP" );
233
234 /* mode of CGAUTO*/
235 automatic_response_mode = 3;
236
237 m_service = CGSMS_SERVICE_CS_PREFERRED;
238
239 /* GPRS event reporting */
240 ati_user_output_cfg[srcId].CGEREP_mode = CGEREP_MODE_BUFFER;
241 ati_user_output_cfg[srcId].CGEREP_bfr = CGEREP_BFR_CLEAR;
242 sm_cgsms_service = CGSMS_SERVICE_CS_PREFERRED;
243 }
244
245 GLOBAL void cmhSM_Reset( void )
246 {
247 SHORT i = 0;
248 UBYTE gprs_default_pco[] = {
249 0x80,0x80,0x21,0x10,0x01,0x01,0x00,0x10,0x81,0x06,
250 0x00,0x00,0x00,0x00,0x83,0x06,0x00,0x00,0x00,0x00
251 };
252
253 /* SMF CMH local parameter */
254
255 memset(pdp_context, 0, sizeof(T_GPRS_CONT_CLASS) * MAX_CID);
256
257 for (i = 0; i < MAX_CID; i++)
258 {
259 pdp_context[i].state = CS_UNDEFINED;
260 pdp_context[i].smreg_ti = UNDEFINED_TI;
261 pdp_context[i].link_id_uart = DTI_LINK_ID_NOTPRESENT;
262 pdp_context[i].link_id_new = DTI_LINK_ID_NOTPRESENT;
263 pdp_context[i].link_id_sn = DTI_LINK_ID_NOTPRESENT;
264
265 pdp_context[i].user_pco.len = sizeof (gprs_default_pco);
266 memcpy (pdp_context[i].user_pco.pco, gprs_default_pco, sizeof (gprs_default_pco));
267 }
268
269 memset(work_cids, 0, sizeof(SHORT) * MAX_CID_PLUS_EINS);
270
271 for (i = 0; i < SMH_NSAPI_MAX; i++)
272 nsapi_to_cid[i] = INVALID_CID;
273
274 cid_pointer = 0;
275
276 /* set default context parameter */
277 memset(&defaultCtx, 0, sizeof(T_GPRS_CONT_REC));
278 strcpy(defaultCtx.pdp_type,"IP" );
279
280 /* mode of CGAUTO*/
281 automatic_response_mode = 3;
282
283 m_service = CGSMS_SERVICE_CS_PREFERRED;
284
285 /* GPRS event reporting */
286 ati_user_output_cfg[CMD_SRC_ATI].CGEREP_mode = CGEREP_MODE_BUFFER;
287 ati_user_output_cfg[CMD_SRC_ATI].CGEREP_bfr = CGEREP_BFR_CLEAR;
288 sm_cgsms_service = CGSMS_SERVICE_CS_PREFERRED;
289 }
290
291 /*
292 +--------------------------------------------------------------------+
293 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
294 | STATE : finished ROUTINE : cmhSM_empty_call_table |
295 +--------------------------------------------------------------------+
296
297 PURPOSE : Fill variables for the own use with default values.
298 */
299 GLOBAL void cmhSM_empty_call_table (void)
300 {
301 memset (gprs_call_table, 0, sizeof(T_GPRS_CALL_TABLE) *MAX_GPRS_CALL_TABLE_ENTRIES);
302 current_gprs_ct_index = 0;
303 gprs_ct_index = 0;
304 gprs_call_table[0].sm_ind.smreg_ti = UNDEFINED_TI;
305 }
306
307 /*
308 +-------------------------------------------------------------------------------+
309 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
310 | STATE : code ROUTINE : cmhSM_getSrcIdOfRunningCGACTDeactivation |
311 +-------------------------------------------------------------------------------+
312
313 PURPOSE : Returns a source ID if the given cid is requested to deactivate
314 by +CGACT. The source ID indicates where the +CGACT was started.
315 */
316 GLOBAL T_ACI_CMD_SRC cmhSM_getSrcIdOfRunningCGACTDeactivation(SHORT cid)
317 {
318 switch( working_cgact_actions.state )
319 {
320 case T_CDS_RUNNING:
321 if( (1 << (cid - 1) & working_cgact_actions.cid_set) OR
322 INVALID_NSAPI NEQ pdp_context[cid - 1].nsapi AND
323 (pdp_context[cid - 1].nsapi & working_cgact_actions.nsapi_set) )
324 {
325 return working_cgact_actions.srcId;
326 }
327 break;
328 case T_CDS_IDLE:
329 break;
330 }
331 return CMD_SRC_NONE;
332 }
333
334
335 /*
336 +-------------------------------------------------------------------------------+
337 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
338 | STATE : code ROUTINE : cmhSM_getSrcIdOfRunningCGACTDeactivation |
339 +-------------------------------------------------------------------------------+
340
341 PURPOSE : Returns TRUE if +CGACT is running on the given cid -> NO_CARRIER
342 FASE if no CGACT was running on this cid -> CME_ERROR
343 */
344 GLOBAL BOOL isContextDeactivationRequestedByCGACT(SHORT cid)
345 {
346 TRACE_FUNCTION("***isContextDeactivationRequestedByCGACT");
347
348 switch( working_cgact_actions.state )
349 {
350 case T_CDS_RUNNING:
351 if ( (1 << (cid - 1)) & working_cgact_actions.cid_set )
352 {
353 return TRUE;
354 }
355 }
356 return FALSE;
357 }
358
359
360
361 /*
362 +----------------------------------------------------------------------+
363 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
364 | STATE : code ROUTINE : cmhSM_connection_down |
365 +----------------------------------------------------------------------+
366
367 PURPOSE : Control the answer of context deactivations
368 started by an AT command.
369 */
370 GLOBAL void cmhSM_connection_down( UBYTE dti_id )
371 {
372 SHORT cid = gaci_get_cid_over_dti_id( dti_id );
373
374 TRACE_FUNCTION("cmhSM_connection_down");
375
376 switch( working_cgact_actions.state )
377 {
378 case T_CDS_RUNNING:
379 TRACE_EVENT_P1("T_CDS_RUNNING, cid:%d", cid);
380 if ( (1 << (cid - 1)) & working_cgact_actions.cid_set )
381 { /* nsapi deactivation is requested */
382 working_cgact_actions.cid_set &= (USHORT) ~(1U << (cid - 1));
383 TRACE_EVENT_P1("new set: %d",working_cgact_actions.cid_set);
384
385 if ( ! (working_cgact_actions.cid_set OR
386 working_cgact_actions.nsapi_set ) )
387 {
388 R_AT( RAT_OK, working_cgact_actions.srcId ) ( AT_CMD_CGACT );
389 working_cgact_actions.state = T_CDS_IDLE;
390 }
391 else
392 {
393 TRACE_EVENT_P2("NO OK: cid_set:%d, nsapi_set:%d",working_cgact_actions.cid_set,working_cgact_actions.nsapi_set);
394 }
395 }
396 else
397 {
398 TRACE_EVENT_P1("meets not the set: %d",working_cgact_actions.cid_set);
399 }
400 break;
401 case T_CDS_IDLE:
402 TRACE_EVENT("T_CDS_IDLE");
403 break;
404 }
405 }
406
407 /*
408 +--------------------------------------------------------------------+
409 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
410 | STATE : finished ROUTINE : cmhSM_GetNewNSapi |
411 +--------------------------------------------------------------------+
412
413 PURPOSE : Give a free NSapi no. or invalid if all NSapi's are in use.
414 */
415 LOCAL UBYTE cmhSM_GetNewNSapi ( void )
416 {
417 BYTE i = SMH_FIRST_FREE_NSAPIS;
418
419 TRACE_FUNCTION("cmhSM_GetNewNSapi");
420
421 while ( i <= SMH_LAST_FREE_NSAPIS AND nsapi_to_cid[i] NEQ INVALID_CID )
422 i++;
423
424 if ( i <= SMH_LAST_FREE_NSAPIS)
425 {
426 pdp_context[work_cids[cid_pointer] - 1].nsapi = i;
427 nsapi_to_cid[i] = work_cids[cid_pointer];
428
429 TRACE_EVENT_P1("new NSAPI: %d", i);
430
431 return i;
432 }
433
434 return INVALID_NSAPI;
435 }
436
437 /*
438 +--------------------------------------------------------------------+
439 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
440 | STATE : finished ROUTINE : cmhSM_GiveNSapiFree |
441 +--------------------------------------------------------------------+
442
443 PURPOSE : Give a NSapi free after use.
444 */
445 GLOBAL void cmhSM_GiveNSapiFree ( USHORT cid )
446 {
447 UBYTE *nsapi = &pdp_context[cid - 1].nsapi;
448
449 if ( *nsapi <= SMH_LAST_FREE_NSAPIS )
450 {
451 nsapi_to_cid[*nsapi] = INVALID_CID;
452 }
453 }
454
455 /*
456 +--------------------------------------------------------------------+
457 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
458 | STATE : finished ROUTINE : cmhSM_contextDeactivated |
459 +--------------------------------------------------------------------+
460
461 PURPOSE : Detach mobile if necessary?
462 */
463 GLOBAL void cmhSM_contextDeactivated ( void )
464 {
465
466 if ( ! cmhSM_isContextActive() )
467 {
468 cmhGMM_allContextsDeactivated();
469 }
470 }
471
472
473 /*
474 +--------------------------------------------------------------------+
475 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
476 | STATE : finished ROUTINE : cmhSM_Get_pdp_type |
477 +--------------------------------------------------------------------+
478
479 PURPOSE : Give the PDP type of the current PDP context that will build.
480 */
481 GLOBAL UBYTE cmhSM_Get_pdp_type ( void )
482 {
483 if (!strcmp(pdp_context[work_cids[cid_pointer] - 1].con.pdp_type, "IP"))
484 return IP_V_4;
485
486 return 0;
487 }
488
489 /*
490 +--------------------------------------------------------------------+
491 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
492 | STATE : finished ROUTINE : cmhSM_Get_pdp_address |
493 +--------------------------------------------------------------------+
494
495 PURPOSE : Give the PDP address of the current PDP context that will build.
496 */
497 GLOBAL void cmhSM_Get_pdp_address ( T_pdp_address *pdp_address )
498 {
499
500 pdp_address->c_buff =
501 (UBYTE) cmhSM_pdp_address_to_ip(&pdp_context[work_cids[cid_pointer] - 1].con.pdp_addr, (UBYTE*) pdp_address->buff);
502
503 #ifdef _SIMULATION_
504 memset (pdp_address->buff + pdp_address->c_buff, 0, sizeof(pdp_address->buff) - pdp_address->c_buff);
505 #endif
506 }
507
508 /*
509 +--------------------------------------------------------------------+
510 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
511 | STATE : finished ROUTINE : cmhSM_pdp_address_to_ip |
512 +--------------------------------------------------------------------+
513
514 PURPOSE : Transform a PDP address to 4 BYTE IP form.
515 */
516 GLOBAL SHORT cmhSM_pdp_address_to_ip ( T_PDP_ADDRESS *pdp_address, UBYTE *ip )
517 {
518 SHORT i = 0;
519 BOOL isDynamicIP = TRUE;
520 char *start = *pdp_address,
521 *end;
522
523 if ( **pdp_address )
524 {
525 for (i = 0; i < 4; i++)
526 {
527 ip[i] = (UBYTE) strtol(start, &end, 10);
528 start = end + 1;
529 /*
530 * dynamic ip patch
531 * 12.02.02 brz
532 *
533 * if it is a dynamic IP Address than the SM entity need the length set to zero
534 */
535 if ( ip[i] )
536 {
537 isDynamicIP = FALSE;
538 }
539 }
540
541 if ( isDynamicIP EQ TRUE )
542 {
543 return 0;
544 }
545 else
546 {
547 return 4;
548 }
549 }
550 else
551 {
552 *ip = 0;
553 }
554
555 return 0;
556 }
557
558 /*
559 +--------------------------------------------------------------------+
560 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
561 | STATE : finished ROUTINE : cmhSM_ip_to_pdp_address |
562 +--------------------------------------------------------------------+
563
564 PURPOSE : Transform a 4 BYTE IP form to the PDP address.
565 */
566 GLOBAL void cmhSM_ip_to_pdp_address ( UBYTE *ip, T_PDP_ADDRESS pdp_address )
567 {
568
569 sprintf(pdp_address, "%03hd.%03hd.%03hd.%03hd", ip[0], ip[1], ip[2], ip[3] );
570
571 }
572
573 /*
574 +-------------------------------------------------------------------+
575 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
576 | STATE : finished ROUTINE : convert_netaddr_to_apn |
577 +-------------------------------------------------------------------+
578
579 PURPOSE : converts a domain name into an APN
580
581 Technical Information:
582
583 The APN contains out of labels separated by dots.
584 (e.g. xxx.yyy.zzz)
585
586 This string representation must be translated to a network
587 representation.
588
589 The APN network representation contains out of a sequence of
590 a length field (not ASCII) followed by a ASCII string.
591
592 xxx.yyy.zzz => 3xxx3yyy3zzz
593 */
594 LOCAL void convert_netaddr_to_apn ( T_smreg_apn *apn )
595 {
596 UBYTE counter = 0,
597 buffer = apn->buffer[0],
598 *pdest = apn->buffer + apn->c_buffer,
599 *psource = pdest - 1;
600
601 if(apn->c_buffer EQ 0)
602 {
603 return;
604 }
605
606 if(apn->c_buffer >= sizeof apn->buffer)
607 {
608 apn->c_buffer = 0;
609 TRACE_EVENT_P2 ("convert_netaddr_to_apn: array out of bounds exeption (%d >= %d)", apn->c_buffer, sizeof apn->buffer);
610 return;
611 }
612
613 /* The network representation is 1 byte longer. */
614 apn->c_buffer++;
615
616 /* A sentinel */
617 apn->buffer[0] = '.';
618
619 /* Algorithm: copy from back to front! */
620 while(pdest > apn->buffer )
621 {
622 counter = 0;
623 while(*psource NEQ '.')
624 {
625 *(pdest--) = *(psource--);
626 counter++;
627 }
628 *(pdest--) = counter;
629 psource--;
630 }
631
632 /* Correction according to the sentinel */
633 apn->buffer[1] = buffer;
634 apn->buffer[0] = ++counter;
635
636 /* Modify special empty APN to the need of SMREG_SAP */
637 if ((apn->c_buffer EQ 2) AND (apn->buffer[0] EQ 1) AND (apn->buffer[1] EQ 255))
638 {
639 apn->c_buffer = 1; /* Special SMREG_SAP indicating that there is an APN present but empty */
640 apn->buffer[0]= 0;
641 }
642 }
643 /*
644 +--------------------------------------------------------------------+
645 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
646 | STATE : finished ROUTINE : cmhSM_Get_smreg_apn |
647 +--------------------------------------------------------------------+
648
649 PURPOSE : Give the APN of the current PDP context that will build.
650 */
651 GLOBAL void cmhSM_Get_smreg_apn ( T_smreg_apn *smreg_apn )
652 {
653
654 smreg_apn->c_buffer = strlen(pdp_context[work_cids[cid_pointer] - 1].con.apn);
655 strncpy((char *)smreg_apn->buffer, (const char *)pdp_context[work_cids[cid_pointer] - 1].con.apn, smreg_apn->c_buffer);
656 convert_netaddr_to_apn(smreg_apn);
657
658 #ifdef _SIMULATION_
659 memset (smreg_apn->buffer + smreg_apn->c_buffer, 0, sizeof(smreg_apn->buffer) - smreg_apn->c_buffer);
660 #endif
661 }
662
663 /*
664 +--------------------------------------------------------------------+
665 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
666 | STATE : finished ROUTINE : cmhSM_Get_h_comp |
667 +--------------------------------------------------------------------+
668
669 PURPOSE : Give the h_comp of the current PDP context that will build.
670 */
671 GLOBAL UBYTE cmhSM_Get_h_comp ( void )
672 {
673
674 return (UBYTE) pdp_context[work_cids[cid_pointer] - 1].con.h_comp;
675
676 }
677
678 /*
679 +--------------------------------------------------------------------+
680 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
681 | STATE : finished ROUTINE : cmhSM_Get_d_comp |
682 +--------------------------------------------------------------------+
683
684 PURPOSE : Give the d_comp of the current PDP context that will build.
685 */
686 GLOBAL UBYTE cmhSM_Get_d_comp ( void )
687 {
688
689 return (UBYTE) pdp_context[work_cids[cid_pointer] - 1].con.d_comp;
690
691 }
692
693 /*
694 +--------------------------------------------------------------------+
695 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
696 | STATE : finished ROUTINE : cmhSM_change_def_QOS |
697 +--------------------------------------------------------------------+
698
699 PURPOSE : Set the quality of service (requested) of default context.
700
701 */
702 GLOBAL void cmhSM_change_def_QOS ( T_QOS *qos )
703 {
704
705 memcpy(&defaultCtx.qos, qos, sizeof(T_QOS));
706
707 }
708
709 /*
710 +--------------------------------------------------------------------+
711 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
712 | STATE : finished ROUTINE : cmhSM_change_def_QOS_min |
713 +--------------------------------------------------------------------+
714
715 PURPOSE : Set the quality of service (min.) of default context.
716
717 */
718 GLOBAL void cmhSM_change_def_QOS_min ( T_QOS *qos )
719 {
720
721 memcpy(&defaultCtx.min_qos, qos, sizeof(T_QOS));
722
723 }
724
725 /*
726 +--------------------------------------------------------------------+
727 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
728 | STATE : finished ROUTINE : cmhSM_Set_default_QOS |
729 +--------------------------------------------------------------------+
730
731 PURPOSE : Set the quality of service of the spezified PDP context
732 to default.
733 */
734 GLOBAL void cmhSM_Set_default_QOS ( SHORT cid )
735 {
736
737 memcpy(&pdp_context[cid - 1].con.qos, &defaultCtx.qos, sizeof(T_QOS));
738
739 }
740
741 /*
742 +--------------------------------------------------------------------+
743 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
744 | STATE : finished ROUTINE : cmhSM_Set_default_QOS |
745 +--------------------------------------------------------------------+
746
747 PURPOSE : Set the quality of service of the spezified PDP context
748 to default.
749 */
750 GLOBAL void cmhSM_Set_default_QOS_min ( SHORT cid )
751 {
752
753 memcpy(&pdp_context[cid - 1].con.min_qos, &defaultCtx.min_qos, sizeof(T_QOS));
754
755 }
756
757 /*
758 +--------------------------------------------------------------------+
759 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
760 | STATE : finished ROUTINE : cmhSM_Get_QOS |
761 +--------------------------------------------------------------------+
762
763 PURPOSE : Give the requested quality of service of the current
764 PDP context that will build.
765 */
766 GLOBAL void cmhSM_Get_QOS ( T_smreg_qos *dest_qos )
767 {
768 T_QOS *source_qos = &pdp_context[work_cids[cid_pointer] - 1].con.qos;
769
770 dest_qos->preced = source_qos->preced;
771 dest_qos->delay = source_qos->delay;
772 dest_qos->relclass = source_qos->relclass;
773 dest_qos->peak = source_qos->peak;
774 dest_qos->mean = source_qos->mean;
775
776 }
777
778 /*
779 +--------------------------------------------------------------------+
780 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
781 | STATE : finished ROUTINE : cmhSM_Get_QOS_min |
782 +--------------------------------------------------------------------+
783
784 PURPOSE : Give the minimum acceptable quality of service of the
785 current PDP context that will build.
786 */
787 GLOBAL void cmhSM_Get_QOS_min ( T_smreg_min_qos *dest_qos_min )
788 {
789 T_QOS *source_qos = &pdp_context[work_cids[cid_pointer] - 1].con.min_qos;
790
791 dest_qos_min->preced = source_qos->preced;
792 dest_qos_min->delay = source_qos->delay;
793 dest_qos_min->relclass = source_qos->relclass;
794 dest_qos_min->peak = source_qos->peak;
795 dest_qos_min->mean = source_qos->mean;
796
797 }
798
799 GLOBAL USHORT cmhSM_pdp_typ_to_string ( UBYTE pdp_typ_no, char* string )
800 {
801 switch ( pdp_typ_no )
802 {
803 case 0:
804 strcpy (string, "X_121");
805 return 5;
806 case 33:
807 strcpy (string, "IP_V_4");
808 return 6;
809 case 87:
810 strcpy (string, "IP_V_6");
811 return 6;
812 default:
813 strcpy (string, "");
814 return 0;
815 }
816 }
817
818 /*
819 +--------------------------------------------------------------------+
820 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
821 | STATE : finished ROUTINE : cmhSM_ring_gprs_par |
822 +--------------------------------------------------------------------+
823
824 PURPOSE : Return the information for CRING.
825 */
826 GLOBAL char* cmhSM_ring_gprs_par ( void )
827 {
828 static char string[MAX_CRING_INFORMATION_LENGTH] = "\"";
829 unsigned int i = 1;
830
831 i += cmhSM_pdp_typ_to_string(gprs_call_table[current_gprs_ct_index].sm_ind.pdp_type, string + i);
832 string[i++] = '\"';
833
834 string[i++] = ',';
835
836 string[i++] = '\"';
837 memcpy (string + i, gprs_call_table[current_gprs_ct_index].sm_ind.pdp_address.buff,
838 gprs_call_table[current_gprs_ct_index].sm_ind.pdp_address.c_buff);
839
840 i += gprs_call_table[current_gprs_ct_index].sm_ind.pdp_address.c_buff + 1;
841 string[i++] = '\"';
842
843 if ( *gprs_call_table[current_gprs_ct_index].L2P )
844 {
845 string[i++] = ',';
846
847 string[i++] = '\"';
848 strcpy (string + i, gprs_call_table[current_gprs_ct_index].L2P);
849 i += strlen (gprs_call_table[current_gprs_ct_index].L2P);
850 string[i++] = '\"';
851 }
852
853 string[i] = 0;
854
855 return string;
856 }
857
858 /*
859 +--------------------------------------------------------------------+
860 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
861 | STATE : finished ROUTINE : cmhSM_call_answer |
862 +--------------------------------------------------------------------+
863
864 PURPOSE : Return TRUE in this case, if an auto answer is needed.
865 */
866 GLOBAL BOOL cmhSM_call_answer ( UBYTE ring_counter, T_ACI_CRING_MOD mode )
867 {
868
869 switch(automatic_response_mode)
870 {
871 case 0: /* GPRS off, GSM controlled by S0 */
872 if ( mode NEQ CRING_MOD_Gprs AND
873 at.S[0] AND at.S[0] <= ring_counter )
874 return TRUE;
875 break;
876 case 1: /* GPRS on, GSM controlled by S0 */
877 if ( mode EQ CRING_MOD_Gprs )
878 return TRUE;
879 if (at.S[0] AND at.S[0] <= ring_counter)
880 return TRUE;
881 break;
882 case 2: /* modem copatibility mode, GPRS on, GSM off */
883 if ( mode NEQ CRING_MOD_Gprs )
884 break;
885 /*lint -fallthrough*/
886 case 3: /* modem copatibility mode, GPRS on, GSM on */
887 if (at.S[0] AND ring_counter >= at.S[0])
888 return TRUE;
889 }
890
891 return FALSE;
892 }
893
894
895 /*
896 +--------------------------------------------------------------------+
897 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
898 | STATE : finished ROUTINE : cmhSM_call_reject |
899 +--------------------------------------------------------------------+
900
901 PURPOSE : Return TRUE in this case, if an auto reject is needed.
902 */
903 GLOBAL BOOL cmhSM_call_reject ( UBYTE ring_counter, T_ACI_CRING_MOD mode )
904 {
905 switch(automatic_response_mode)
906 {
907 case 0: /* GPRS off, GSM controlled by S0 */
908 return FALSE;
909 case 1: /* GPRS on, GSM controlled by S0 */
910 if (at.S99 AND mode EQ CRING_MOD_Gprs )
911 return TRUE;
912 break;
913 case 2: /* modem copatibility mode, GPRS on, GSM off */
914 case 3: /* modem copatibility mode, GPRS on, GSM on */
915 if ( mode NEQ CRING_MOD_Gprs )
916 break;
917 if (at.S99 AND ring_counter >= at.S99)
918 return TRUE;
919 }
920
921 return FALSE;
922 }
923
924
925
926
927 LOCAL BOOL is_GSM_call_active (void)
928 {
929 SHORT ctbIdx; /* holds call table index */
930
931 for( ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ )
932 {
933 if (ccShrdPrm.ctb[ctbIdx] NEQ NULL)
934 {
935 return (TRUE);
936 }
937 }
938
939 return (FALSE);
940 }
941
942 /*
943 +--------------------------------------------------------------------+
944 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
945 | STATE : finished ROUTINE : cmhSM_sAT_H |
946 +--------------------------------------------------------------------+
947
948 PURPOSE : handle GPRS calls and return FALSE if a circuit switched
949 call need a handle.
950 */
951 GLOBAL BOOL cmhSM_sAT_H ( T_ACI_CMD_SRC srcId, T_ACI_RETURN *aci_ret )
952 {
953
954 SHORT cid_array[1] = { INVALID_CID };
955 T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, (UBYTE)srcId, search_ati_src_id);
956
957 if ( ( at.rngPrms.isRng EQ TRUE ) AND ( at.rngPrms.mode EQ CRING_MOD_Gprs) )
958 {
959 /*
960 * brz patch: In the case of context reactivation over SMREG_PDP_ACTIVATE_IND with an used ti
961 * the GPRS ATH command doesn't do anything!
962 *
963 * Why? Because the Windows Dial-Up Networking client send every time an ATH after termination
964 * of the connection and with this a context reactivation was impossible.
965 */
966 if ( gprs_call_table[current_gprs_ct_index].reactivation EQ GCTT_NORMAL )
967 {
968 return cmhSM_sAT_A_H_intern(srcId, aci_ret, 0);
969 }
970 return TRUE;
971 }
972 else
973 {
974 if (is_GSM_call_active())
975 {
976 return (FALSE);
977 }
978 /* if AT_H has been called and no RING is active, then disconnect the active
979 context */
980 #ifdef FF_GPF_TCPIP
981 if(is_gpf_tcpip_call())
982 {
983 T_DCM_STATUS_IND_MSG err_ind_msg;
984 err_ind_msg.hdr.msg_id = DCM_ERROR_IND_MSG;
985 err_ind_msg.result = DCM_PS_CONN_BROKEN;
986 dcm_send_message(err_ind_msg, DCM_SUB_NO_ACTION);
987 }
988 #endif
989 *aci_ret = sAT_PlusCGACT ( srcId, CGACT_STATE_DEACTIVATED, cid_array );
990
991 switch (*aci_ret)
992 {
993 case (AT_CMPL): /*operation completed*/
994 return FALSE; /* return false, so that GSM calls will be canceled */
995 case (AT_EXCT):
996 src_params->curAtCmd = AT_CMD_CGACT;
997 return TRUE;
998 default:
999 cmdCmeError(CME_ERR_Unknown); /*Command failed*/
1000 return FALSE;
1001 }
1002 }
1003 }
1004
1005 /*
1006 +--------------------------------------------------------------------+
1007 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
1008 | STATE : finished ROUTINE : cmhSM_sAT_A |
1009 +--------------------------------------------------------------------+
1010
1011 PURPOSE : handle GPRS calls and return FALSE if a circuit switched
1012 call need a handle.
1013 */
1014 GLOBAL BOOL cmhSM_sAT_A ( T_ACI_CMD_SRC srcId, T_ACI_RETURN *aci_ret )
1015 {
1016 BOOL b;
1017
1018 b = cmhSM_sAT_A_H_intern(srcId, aci_ret, 1);
1019
1020 if ( *aci_ret EQ AT_EXCT )
1021 cmdErrStr = NULL;
1022
1023 return b;
1024 }
1025
1026 /*
1027 +--------------------------------------------------------------------+
1028 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
1029 | STATE : finished ROUTINE : cmhSM_sAT_A_H_intern |
1030 +--------------------------------------------------------------------+
1031
1032 PURPOSE : handle sAT_A and cAT_H for GPRS
1033 */
1034 static BOOL cmhSM_sAT_A_H_intern ( T_ACI_CMD_SRC srcId, T_ACI_RETURN *aci_ret, SHORT mode)
1035 {
1036 if ( at.rngPrms.isRng EQ TRUE )
1037 {
1038 if ( at.rngPrms.mode EQ CRING_MOD_Gprs)
1039 {
1040 *aci_ret = automatic_response_mode > 1 ? /* modem copatibility mode possible */
1041 sAT_PlusCGANS(srcId, mode, NULL, GPRS_CID_OMITTED): AT_FAIL;
1042 }
1043 else /* circuit switched call */
1044 {
1045 return FALSE;
1046 }
1047 }
1048 else
1049 {
1050 return FALSE;
1051 }
1052 return TRUE;
1053 }
1054
1055 /*
1056 +----------------------------------------------------------------------+
1057 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
1058 | STATE : finished ROUTINE : cmhSM_pdp_addr_well_formed |
1059 +----------------------------------------------------------------------+
1060
1061 PURPOSE : check pdp address of well formed
1062 */
1063 GLOBAL BOOL cmhSM_pdp_addr_well_formed( USHORT type, T_PDP_ADDRESS pdp_addr )
1064 {
1065 SHORT i = 0, state = 1;
1066 char *start = pdp_addr, *end;
1067 long temp;
1068
1069 switch ( type )
1070 {
1071 case PDP_T_IP: /* 255.255.255.255 */
1072 if ( *pdp_addr )
1073 {
1074 while ( state AND i < 3)
1075 {
1076 temp = strtol(start, &end, 10);
1077 if ( temp < 0 OR temp > 255 )
1078 state = 0;
1079 if ( *end NEQ '.' )
1080 state = 0;
1081
1082 start = end + 1;
1083 i++;
1084 }
1085 temp = strtol(start, &end, 10);
1086 if ( temp < 0 OR temp > 255 )
1087 state = 0;
1088 }
1089
1090 if(state)
1091 return TRUE;
1092 break;
1093 case PDP_T_X25:
1094 return FALSE;
1095 default:
1096 break;
1097 }
1098 return FALSE;
1099 }
1100
1101 /*
1102 +----------------------------------------------------------------------+
1103 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
1104 | STATE : finished ROUTINE : cmhSM_apn_well_formed |
1105 +----------------------------------------------------------------------+
1106
1107 PURPOSE : check APN of well formed
1108 */
1109 GLOBAL BOOL cmhSM_apn_well_formed( T_APN APN )
1110 {
1111 SHORT i = 0, state = 1, length = strlen (APN);
1112 char *no_start_labels[] = {"rac","lac","sgsn"}, *start, *end, *mark;
1113 T_APN apn;
1114
1115 strcpy(apn, APN);
1116 start = apn;
1117
1118 /* change charcter of string to lower cases */
1119 for (i = 0; i < length; i++)
1120 apn[i] = tolower(apn[i]);
1121
1122 /* The Network Identifier shall not start with this labels */
1123 for (i = 0; i < 3; i++)
1124 {
1125 if ( apn EQ strstr(apn, no_start_labels[i]) )
1126 return FALSE;
1127 }
1128
1129 /* the Wild Card APN */
1130 if ( length EQ 1 AND *start EQ '*' )
1131 return TRUE;
1132
1133 /* the APN with no name */
1134 if ( length EQ 1 AND *start EQ /*lint -e(743)*/ '\x0ff' )
1135 return TRUE;
1136
1137 /* Oporater Identifer is optional and the Network Identifer */
1138 mark = strrchr(apn, '.');
1139 if ( mark )
1140 if ( strstr(mark + 1, "gprs") )
1141 {
1142 /* APN Operator Identifier contained (optional) */
1143 if ( length < 18 )
1144 return FALSE;
1145 mark = start + length - 18; /* start of the APN Operator Identifier */
1146 /* check APN Operator Identifier: "mncXXX.mccXXX.gprs" */
1147 if ( mark NEQ strstr(mark, "mnc") )
1148 return FALSE;
1149 if ( mark + 6 NEQ strstr(mark, ".mcc") )
1150 return FALSE;
1151 strtol(mark + 3, &end, 10);
1152 if ( end NEQ mark + 6 )
1153 return FALSE;
1154 strtol(mark + 10, &end, 10);
1155 if ( end NEQ mark + 13 )
1156 return FALSE;
1157 /* check character between APN Network Identifier and the Operator Identifer */
1158 mark--;
1159 if ( *mark NEQ '.' )
1160 return FALSE;
1161 /* set stop mark */
1162 *mark = 0;
1163 }
1164 else
1165 mark = 0;
1166
1167 /* check APN Network Identifier */
1168
1169 /* shall not end in ".gprs" */
1170 end = strrchr(apn, '.');
1171 if ( end )
1172 if ( strstr(end + 1, "gprs") )
1173 return FALSE;
1174
1175 /* parse all labels */
1176 while ( *start )
1177 {
1178 /* in first at least one Label */
1179 while ( (*start >= 'a' AND *start <= 'z') OR (*start >= '0' AND *start <= '9') OR *start EQ '-' )
1180 start ++;
1181
1182 /* next Label or nothing */
1183 if ( *start EQ '.' )
1184 start ++;
1185 else
1186 if ( *start NEQ 0)
1187 return FALSE;
1188 }
1189
1190 /* The APN Network Identifier shall have a maximum length of 63 octets. */
1191 if ( start - apn > 63 )
1192 return FALSE;
1193
1194 /* clear stop mark */
1195 if ( mark )
1196 *mark = '.';
1197
1198 return TRUE;
1199 }
1200
1201 /*
1202 +--------------------------------------------------------------------+
1203 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
1204 | STATE : finished ROUTINE : cmhSM_transform_pdp_type |
1205 +--------------------------------------------------------------------+
1206
1207 PURPOSE : transform pdp_type
1208 */
1209 GLOBAL USHORT cmhSM_transform_pdp_type ( char *pdp_type )
1210 {
1211
1212 if ( !strcmp(pdp_type, "IP") )
1213 return PDP_T_IP;
1214
1215 if ( !strcmp(pdp_type, "X25") )
1216 return PDP_T_X25;
1217
1218 return PDP_T_NONE;
1219 }
1220
1221
1222 GLOBAL T_CONTEXT_STATE get_state_over_cid ( SHORT cid )
1223 {
1224 TRACE_FUNCTION("get_state_over_cid()");
1225 if ( (cid < 1) OR (cid > MAX_CID) )
1226 {
1227 TRACE_EVENT("invalid cid detected!");
1228 return CS_INVALID_STATE;
1229 }
1230 return pdp_context[cid - 1].state;
1231
1232 }
1233
1234 GLOBAL void set_state_over_cid ( SHORT cid, T_CONTEXT_STATE c_state )
1235 {
1236 TRACE_EVENT_P3("set_state_over_cid: %d -> %d for cid %d", pdp_context[cid - 1].state, c_state, cid) ;
1237 if (cid > 0 AND cid <= MAX_CID)
1238 pdp_context[cid - 1].state = c_state;
1239 }
1240
1241 GLOBAL T_CONTEXT_STATE get_state_working_cid ( void )
1242 {
1243
1244 if ( work_cids[cid_pointer] EQ INVALID_CID )
1245 {
1246 TRACE_EVENT("working_cid is invalid!");
1247 return CS_INVALID_STATE;
1248 }
1249
1250 return pdp_context[work_cids[cid_pointer] - 1].state;
1251
1252 }
1253
1254 GLOBAL void set_conn_param_on_all_working_cids ( UBYTE owner, T_DTI_ENTITY_ID entity_id )
1255 {
1256 SHORT *pcid = &(work_cids[cid_pointer]);
1257
1258 TRACE_FUNCTION("set_conn_param_on_all_working_cids()");
1259
1260 while(INVALID_CID NEQ *pcid) {
1261 pdp_context[*pcid - 1].owner = owner;
1262 pdp_context[*pcid - 1].entity_id = entity_id;
1263 pcid ++;
1264 }
1265 }
1266
1267 GLOBAL void set_conn_param_on_working_cid ( UBYTE owner, T_DTI_ENTITY_ID entity_id )
1268 {
1269 TRACE_FUNCTION("set_conn_param_on_working_cid()");
1270
1271 pdp_context[work_cids[cid_pointer] - 1].owner = owner;
1272 pdp_context[work_cids[cid_pointer] - 1].entity_id = entity_id;
1273 }
1274
1275 GLOBAL void set_state_working_cid ( T_CONTEXT_STATE c_state )
1276 {
1277 TRACE_FUNCTION("set_state_working_cid()");
1278
1279 if ( work_cids[cid_pointer] NEQ INVALID_CID )
1280 {
1281 pdp_context[work_cids[cid_pointer] - 1].state = c_state;
1282 }
1283 else
1284 {
1285 TRACE_EVENT("working cid is invalid!");
1286 }
1287
1288 }
1289
1290 GLOBAL T_CONTEXT_STATE get_state_over_nsapi_set ( USHORT *nsapi_set, SHORT *cid )
1291 {
1292 USHORT nsapi = 0;
1293
1294 TRACE_FUNCTION("get_state_over_nsapi_set()");
1295 while( nsapi < SMH_LAST_FREE_NSAPIS AND !((*nsapi_set >> nsapi) & 1) )
1296 nsapi++;
1297
1298 if ( !(*nsapi_set & ( 1 << nsapi )) )
1299 {
1300 return CS_INVALID_STATE;
1301 }
1302
1303 TRACE_EVENT_P1("NSAPI: %4d", nsapi);
1304
1305 *nsapi_set &= ~( 1U << nsapi );
1306
1307 return get_state_over_cid( *cid = nsapi_to_cid[nsapi] );
1308
1309 }
1310
1311 GLOBAL T_CONTEXT_STATE get_state_over_nsapi ( USHORT nsapi )
1312 {
1313
1314 return get_state_over_cid( nsapi_to_cid[nsapi] );
1315
1316 }
1317
1318 GLOBAL USHORT cmhSM_Give_nsapi_set ( SHORT cid )
1319 {
1320
1321 if ( (cid < 1) OR (cid > MAX_CID) )
1322 return 0;
1323
1324 return 1 << pdp_context[cid - 1].nsapi;
1325
1326 }
1327
1328 GLOBAL T_ACI_CAL_OWN get_owner_over_cid ( SHORT cid )
1329 {
1330
1331 if ( (cid < 1) OR (cid > MAX_CID) )
1332 return CAL_OWN_NONE;
1333
1334 return pdp_context[cid - 1].owner;
1335
1336 }
1337
1338 GLOBAL void cmhGPPP_send_establish_request ( UBYTE peer )
1339 {
1340 T_PPP_ESTABLISH_REQ est_req;
1341
1342 memset(&est_req, 0, sizeof( T_PPP_ESTABLISH_REQ ));
1343
1344 est_req.mode = PPP_SERVER;
1345 est_req.mru = PPP_MRU_DEFAULT;
1346 est_req.ap = gpppShrdPrm.ppp_authentication_protocol;
1347 est_req.accm = gpppShrdPrm.accm;
1348 est_req.rt = gpppShrdPrm.restart_timer;
1349 est_req.mc = gpppShrdPrm.max_configure;
1350 est_req.mt = gpppShrdPrm.max_terminate;
1351 est_req.mf = gpppShrdPrm.max_failure;
1352
1353 est_req.peer_direction = DTI_CHANNEL_TO_LOWER_LAYER;
1354 est_req.prot_direction = DTI_CHANNEL_TO_HIGHER_LAYER;
1355
1356 est_req.peer_link_id = pdp_context[work_cids[0] - 1].link_id_uart;
1357 est_req.prot_link_id = pdp_context[work_cids[0] - 1].link_id_new;
1358
1359 #ifdef _SIMULATION_
1360 memset (est_req.peer_channel.peer_entity, 0, CHANNEL_NAME_LENGTH);
1361 memset (est_req.protocol_channel.protocol_entity, 0, CHANNEL_NAME_LENGTH);
1362 #endif /* _SIMULATION_ */
1363
1364 strcpy ( (char *) est_req.protocol_channel.protocol_entity, SNDCP_NAME);
1365
1366 switch (peer)
1367 {
1368 #ifdef BT_ADAPTER
1369 case DTI_ENTITY_BLUETOOTH:
1370 strcpy ( (char *) est_req.peer_channel.peer_entity, BTI_NAME);
1371 break;
1372 #endif
1373 case DTI_ENTITY_UART:
1374 strcpy ( (char *) est_req.peer_channel.peer_entity, UART_NAME);
1375 break;
1376 #ifdef FF_PSI
1377 case DTI_ENTITY_PSI:
1378 strcpy ( (char *) est_req.peer_channel.peer_entity, PSI_NAME);
1379 break;
1380 #endif /*FF_PSI*/
1381 case DTI_ENTITY_AAA:
1382 strcpy ( (char *) est_req.peer_channel.peer_entity, RIV_NAME);
1383 break;
1384
1385 default:
1386 TRACE_ERROR ("[cmhGPPP_send_establish_request()] Unexpected peer!");
1387 return;
1388 }
1389
1390 psaGPPP_Establish ( &est_req );
1391
1392 set_state_working_cid( CS_ESTABLISH_1 );
1393 }
1394
1395 GLOBAL void cmhSM_cgerep_buffer ( void )
1396 {
1397 UBYTE srcId = srcId_cb;
1398
1399 switch (ati_user_output_cfg[srcId].CGEREP_bfr)
1400 {
1401 case CGEREP_BFR_CLEAR:
1402 memset(gprs_event_buffer, 0, sizeof(T_CGERP_EVENT_BUFFER) * GPRS_EVENT_REPORTING_BUFFER_SIZE);
1403 break;
1404 case CGEREP_BFR_FLUSH:
1405 if ( uart_is_mt_te_link EQ FALSE)
1406 {
1407 while ( gprs_eb_oldest_p NEQ gprs_eb_current_p )
1408 {
1409 R_AT( RAT_CGEREP, srcId )
1410 ( gprs_event_buffer[gprs_eb_oldest_p].event, gprs_event_buffer[gprs_eb_oldest_p].parm );
1411
1412 gprs_eb_oldest_p++;
1413 }
1414 }
1415 break;
1416 case CGEREP_BFR_OMITTED:
1417 case CGEREP_BFR_INVALID:
1418 default:
1419 break;
1420 }
1421 }
1422
1423 GLOBAL void cmhSM_save_event( T_CGEREP_EVENT event, T_CGEREP_EVENT_REP_PARAM *param )
1424 {
1425
1426 /* save event */
1427 gprs_event_buffer[gprs_eb_current_p].event = event;
1428 if (param)
1429 memcpy (&gprs_event_buffer[gprs_eb_current_p].parm, param, sizeof(T_CGEREP_EVENT_REP_PARAM));
1430
1431 /* is buffer full */
1432 if ( gprs_eb_oldest_p EQ gprs_eb_current_p )
1433 gprs_eb_oldest_p = -1;
1434
1435 /* new current pointer */
1436 gprs_eb_current_p++;
1437 if ( gprs_eb_current_p EQ GPRS_EVENT_REPORTING_BUFFER_SIZE )
1438 gprs_eb_current_p = 0;
1439
1440 /* if buffer full correct pointer to oldest event */
1441 if ( gprs_eb_oldest_p EQ -1 )
1442 gprs_eb_oldest_p = gprs_eb_current_p;
1443
1444 }
1445
1446 GLOBAL void cmhSM_set_sms_service ( T_CGSMS_SERVICE service )
1447 {
1448
1449 {
1450 PALLOC (mnsms_mo_serv_req, MNSMS_MO_SERV_REQ);
1451
1452 /* fill in primitive parameter: command request */
1453 mnsms_mo_serv_req -> mo_sms_serv = (UBYTE) service;
1454
1455 PSENDX (SMS, mnsms_mo_serv_req);
1456 }
1457
1458 m_service = service;
1459 }
1460
1461 /*
1462 +-------------------------------------------------------------------+
1463 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
1464 | STATE : finnished ROUTINE : cmhSM_sms_service_changed |
1465 +-------------------------------------------------------------------+
1466
1467 PURPOSE : indicates a network initiated PDP context modification
1468
1469 */
1470 GLOBAL void cmhSM_sms_service_changed ( UBYTE service )
1471 {
1472
1473 TRACE_FUNCTION ("cmhSM_sms_service_changed()");
1474
1475 /*
1476 *-------------------------------------------------------------------
1477 * check for command context
1478 *-------------------------------------------------------------------
1479 */
1480 if ( smEntStat.curCmd EQ AT_CMD_CGSMS )
1481 {
1482 if ( m_service EQ service )
1483 {
1484 sm_cgsms_service = m_service;
1485 R_AT( RAT_OK, smEntStat.entOwn ) ( smEntStat.curCmd );
1486 }
1487 else
1488 {
1489 R_AT( RAT_CME, smEntStat.entOwn ) ( smEntStat.curCmd, CME_ERR_Unknown );
1490 /* log result */
1491 cmh_logRslt ( smEntStat.entOwn, RAT_CME, smEntStat.curCmd, -1, -1, CME_ERR_Unknown );
1492 }
1493
1494 smEntStat.curCmd = AT_CMD_NONE;
1495 }
1496 }
1497
1498 GLOBAL T_ACI_RETURN cmhSM_GprsAttached( SHORT state )
1499 {
1500 SHORT i = 1;
1501
1502 TRACE_FUNCTION ("cmhSM_GprsAttached()");
1503
1504 if ( state )
1505 { /* mobile is attached */
1506 switch ( get_state_working_cid( ) )
1507 {
1508 case CS_ATTACHING_AFTER_DEF:
1509 case CS_ATTACHING_AFTER_UNDEF:
1510 cmhSM_data_link_context();
1511 return AT_EXCT;
1512 case CS_WAITS_FOR_ACTIVATING:
1513 if (cmhSM_activate_context() NEQ AT_FAIL)
1514 {
1515 return AT_EXCT;
1516 }
1517 else /*GPRS is not allowed by FDN */
1518 {
1519 return AT_FAIL;
1520 }
1521 default:
1522 return AT_FAIL;
1523 }
1524 }
1525 else
1526 { /* attach failed */
1527 if ( smEntStat.curCmd EQ AT_CMD_NONE AND
1528 gpppEntStat.curCmd EQ AT_CMD_NONE )
1529 return AT_FAIL;
1530
1531 /*
1532 * it is enough to check only the working cid,
1533 * because only one context can be in work
1534 */
1535 switch ( get_state_working_cid( ) )
1536 {
1537 case CS_ATTACHING_AFTER_DEF:
1538 case CS_ATTACHING_AFTER_UNDEF:
1539 pdp_context[work_cids[cid_pointer] - 1].owner = gpppEntStat.entOwn;
1540 gaci_RAT_caller ( RAT_NO_CARRIER, work_cids[cid_pointer], AT_CMD_CGDATA, 0 );
1541 break;
1542 case CS_WAITS_FOR_ACTIVATING:
1543 pdp_context[work_cids[cid_pointer] - 1].owner = smEntStat.entOwn;
1544 gaci_RAT_caller ( RAT_CME, work_cids[cid_pointer], AT_CMD_CGACT, CME_ERR_GPRSUnspec );
1545 break;
1546 default:
1547 /*
1548 * do nothing, because SM informs ACI over context deactivation
1549 */
1550 return AT_FAIL;
1551 }
1552 return cmhSM_deactivateAContext( smEntStat.entOwn, work_cids[cid_pointer] );
1553 }
1554 }
1555
1556 GLOBAL T_ACI_RETURN cmhSM_activate_context(void)
1557 {
1558 TRACE_FUNCTION ("cmhSM_activate_context()");
1559
1560 if (pb_get_fdn_mode () EQ FDN_ENABLE)
1561 {
1562 if (pb_check_fdn (0, (const UBYTE *)"*99#") NEQ PHB_OK)
1563 {
1564 TRACE_EVENT("Activate Context: Entry not found in FDN, GPRS not allowed.");
1565 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotAllow);
1566 return (AT_FAIL);
1567 }
1568 TRACE_EVENT("Activate Context: Entry found in FDN, GPRS allowed.");
1569 }
1570
1571 if( AT_CMPL EQ cmhGMM_contextActivation(smEntStat.entOwn, AT_CMD_CGACT) )
1572 {
1573 cmhSM_connect_working_cid();
1574 set_state_working_cid( CS_ACTIVATING );
1575 }
1576 else /* AT_EXCT -> class BX class change requested (NOMIII) */
1577 {
1578 set_state_working_cid( CS_WAITS_FOR_ACTIVATING );
1579 }
1580 return (AT_EXCT);
1581 }
1582
1583
1584 #if defined (CO_UDP_IP) || defined (FF_GPF_TCPIP)
1585 /*
1586 +----------------------------------------------------------------------+
1587 | PROJECT : GPRS (8441) MODULE : cmh_smf |
1588 | STATE : initial ROUTINE : cmhSM_IP_activate_cb |
1589 +----------------------------------------------------------------------+
1590
1591 PURPOSE : callback function for WAP over GPRS.
1592 While handling the command ATD*98# in function atGD()
1593 the function psaTCPIP_Activate() is called for WAP handling.
1594 psaTCPIP_Activate() has this function as parameter for
1595 call backs.
1596 */
1597 void cmhSM_IP_activate_cb(T_ACI_RETURN result)
1598 {
1599 SHORT cid = gaci_get_cid_over_dti_id(wap_dti_id);
1600
1601 TRACE_FUNCTION("cmhSM_IP_activate_cb");
1602 TRACE_EVENT_P1("wap_state: %s",wap_state_to_string(wap_state));
1603 #ifndef FF_SAT_E
1604 ACI_ASSERT(DTI_DTI_ID_NOTPRESENT NEQ wap_dti_id);
1605 ACI_ASSERT(cid >= GPRS_CID_1 AND cid < GPRS_CID_INVALID);
1606 ACI_ASSERT(result NEQ AT_FAIL);
1607 #endif /* not FF_SAT_E */
1608
1609 if ( result EQ AT_FAIL )
1610 {
1611 /* IP activation failed. */
1612 TRACE_EVENT("UDP/TCP/IP activation/configuration returned AT_FAIL");
1613
1614 if (DTI_LINK_ID_NOTPRESENT NEQ wap_dti_id)
1615 {
1616 dti_cntrl_close_dpath_from_dti_id (wap_dti_id);
1617 cmhSM_disconnect_cid(cid, GC_TYPE_WAP );
1618 }
1619
1620 /* reset work_cids */
1621 set_state_over_cid(cid, CS_DEFINED);
1622 sAT_PercentWAP(smShrdPrm.owner, 0);
1623 smEntStat.curCmd = AT_CMD_NONE;
1624 dti_cntrl_erase_entry(wap_dti_id);
1625 cmdCmeError(CME_ERR_Unknown);
1626
1627 #if defined (SIM_TOOLKIT) AND defined (FF_SAT_E)
1628 if( cmhSAT_OpChnGPRSPend( INVALID_CID, OPCH_EST_REQ ))
1629 {
1630 cmhSAT_OpChnUDPDeactGprs();
1631 }
1632 #endif /* SIM_TOOLKIT */
1633 return;
1634 }
1635
1636 switch(wap_state)
1637 {
1638 /* in case CO_UDP_IP and FF_GPF_TCPIP is defined this is a fall through case */
1639 UDPIP_STATEMENT(case IPA_Activated:)
1640 GPF_TCPIP_STATEMENT(case TCPIP_Activation:)
1641
1642 if(is_gpf_tcpip_call()) {
1643 GPF_TCPIP_STATEMENT(set_conn_param_on_working_cid(
1644 (UBYTE)smEntStat.entOwn, DTI_ENTITY_TCPIP));
1645 }
1646 else {
1647 UDPIP_STATEMENT(set_conn_param_on_working_cid(
1648 (UBYTE)smEntStat.entOwn, DTI_ENTITY_IP));
1649 }
1650 cmhSM_activate_context();
1651 return;
1652
1653 UDPIP_STATEMENT(case UDPA_Configurated:)
1654 GPF_TCPIP_STATEMENT(case TCPIP_Configurated:)
1655
1656 /* smEntStat.curCmd = AT_CMD_NONE; */
1657 #if defined (SIM_TOOLKIT) AND defined (FF_SAT_E)
1658 if( cmhSAT_OpChnGPRSPend( INVALID_CID, OPCH_EST_REQ ))
1659 {
1660 cmhSAT_OpChnUDPConfGprs();
1661 }
1662 else
1663 #endif /* SIM_TOOLKIT */
1664 {
1665 R_AT ( RAT_CONNECT, smEntStat.entOwn )( AT_CMD_CGACT, -1, wapId, FALSE );
1666 }
1667 smEntStat.curCmd = AT_CMD_NONE;
1668 smEntStat.entOwn = OWN_NONE;
1669 #ifdef FF_GPF_TCPIP
1670 if(is_gpf_tcpip_call())
1671 {
1672 T_DCM_STATUS_IND_MSG msg;
1673 msg.hdr.msg_id = DCM_NEXT_CMD_READY_MSG;
1674 dcm_send_message(msg, DCM_SUB_WAIT_CGACT_CNF);
1675 }
1676 #endif
1677 break;
1678
1679 UDPIP_STATEMENT(case IPA_Deactivated:)
1680 GPF_TCPIP_STATEMENT(case TCPIP_Deactivated:)
1681
1682 TRACE_EVENT_P1("cmhSM_IP_activate_cb, no connection, dti_id = %d", wap_dti_id);
1683 #if defined (SIM_TOOLKIT) AND defined (FF_SAT_E)
1684 if( cmhSAT_OpChnGPRSPend( INVALID_CID, OPCH_NONE ))
1685 {
1686 cmhSAT_OpChnUDPDeactGprs();
1687 }
1688 else
1689 #endif /* SIM_TOOLKIT */
1690 {
1691 R_AT( RAT_NO_CARRIER, pdp_context[cid - 1].owner) ( AT_CMD_CGDATA, 0 );
1692 }
1693 dti_cntrl_close_dpath_from_dti_id (wap_dti_id);
1694 cmhSM_connection_down(wap_dti_id);
1695 cmhSM_disconnect_cid(cid, GC_TYPE_WAP );
1696 sAT_PercentWAP(smShrdPrm.owner, 0);
1697 if(work_cids[cid_pointer] EQ cid)
1698 {
1699 smEntStat.curCmd = AT_CMD_NONE;
1700 *work_cids = 0;
1701 cid_pointer = 0;
1702 }
1703 #ifdef FF_GPF_TCPIP
1704 if(is_gpf_tcpip_call())
1705 {
1706 T_DCM_STATUS_IND_MSG msg;
1707 msg.hdr.msg_id = DCM_NEXT_CMD_READY_MSG;
1708 dcm_send_message(msg, DCM_SUB_WAIT_CGDEACT_CNF);
1709 }
1710 #endif
1711 break;
1712
1713 default:
1714 TRACE_EVENT("Unexpected wap state in cmhSM_IP_activate_cb()");
1715 if(is_gpf_tcpip_call()) {
1716 GPF_TCPIP_STATEMENT(srcc_delete_count(SRCC_TCPIP_SNDCP_LINK ));
1717 }
1718 else {
1719 UDPIP_STATEMENT(srcc_delete_count(SRCC_IP_SNDCP_LINK ));
1720 }
1721 dti_cntrl_erase_entry(wap_dti_id);
1722 sAT_PercentWAP(smShrdPrm.owner, 0);
1723 smEntStat.curCmd = AT_CMD_NONE;
1724
1725 #if defined (SIM_TOOLKIT) AND defined (FF_SAT_E)
1726 if( cmhSAT_OpChnGPRSPend( INVALID_CID, OPCH_NONE ))
1727 {
1728 cmhSAT_OpChnUDPDeactGprs();
1729 }
1730 else
1731 #endif /* SIM_TOOLKIT */
1732 {
1733 cmdCmeError(CME_ERR_Unknown);
1734 }
1735 break;
1736 }
1737 return;
1738 }
1739
1740
1741 /*
1742 +----------------------------------------------------------------------+
1743 | PROJECT : GPRS (8441) MODULE : cmh_smf |
1744 | STATE : initial ROUTINE : cmhSM_IP_Enable |
1745 +----------------------------------------------------------------------+
1746
1747 PURPOSE : enables IP dti connection.
1748 */
1749 GLOBAL void cmhSM_IP_Enable ( T_DTI_CONN_LINK_ID link_id)
1750 {
1751 TRACE_FUNCTION("cmhSM_IP_Enable");
1752
1753 #ifdef _SIMULATION_
1754 cmhSM_connect_context ( gaci_get_cid_over_link_id( link_id ),
1755 DTI_ENTITY_IP, 0, 100 );
1756 #else /* _SIMULATION_ */
1757 cmhSM_connect_context ( gaci_get_cid_over_link_id( link_id ),
1758 DTI_ENTITY_IP, 0, 0 );
1759 #endif /* _SIMULATION_ */
1760 }
1761
1762
1763 /*
1764 +----------------------------------------------------------------------+
1765 | PROJECT : GPRS (8441) MODULE : cmh_smf |
1766 | STATE : initial ROUTINE : cmhSM_IP_Disable |
1767 +----------------------------------------------------------------------+
1768
1769 PURPOSE : disables IP dti connection.
1770 */
1771 GLOBAL void cmhSM_IP_Disable ()
1772 {
1773 TRACE_FUNCTION("cmhSM_IP_Disable");
1774 }
1775
1776 #endif /* WAP || FF_GPF_TCPIP || SAT E */
1777
1778 /*
1779 +-------------------------------------------------------------------+
1780 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
1781 | STATE : finnished ROUTINE : cmhSM_data_link_context |
1782 +-------------------------------------------------------------------+
1783 */
1784
1785 GLOBAL void cmhSM_data_link_context(void)
1786 {
1787
1788 TRACE_FUNCTION ("cmhSM_data_link_context()");
1789
1790 R_AT( RAT_CONNECT, pdp_context[work_cids[cid_pointer] - 1].owner )
1791 ( AT_CMD_CGDATA, 0, 0, FALSE );
1792
1793 /* log result */
1794 cmh_logRslt ( pdp_context[work_cids[cid_pointer] - 1].owner,
1795 RAT_CONNECT, AT_CMD_CGDATA, -1, -1, -1 );
1796
1797 cmhSM_connect_working_cid();
1798
1799 }
1800 /*
1801 +-------------------------------------------------------------------+
1802 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
1803 | STATE : finnished ROUTINE : cmhSM_get_cid |
1804 +-------------------------------------------------------------------+
1805
1806 */
1807
1808 GLOBAL SHORT cmhSM_get_cid ( USHORT nsapi )
1809 {
1810
1811 return nsapi_to_cid[nsapi];
1812 }
1813
1814 /*
1815 +-------------------------------------------------------------------+
1816 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
1817 | STATE : finnished ROUTINE : cmhSM_next_work_cid |
1818 +-------------------------------------------------------------------+
1819
1820 PURPOSE : start the next context activation if requested
1821
1822 */
1823 GLOBAL BOOL cmhSM_next_work_cid ( T_ACI_AT_CMD curCmd )
1824 {
1825
1826 TRACE_EVENT_P1("cmhSM_next_work_cid, cid_pointer: %d", cid_pointer);
1827
1828 cid_pointer ++;
1829
1830 if ( work_cids[cid_pointer] EQ INVALID_CID )
1831 {
1832 smEntStat.curCmd = AT_CMD_NONE;
1833 gpppEntStat.curCmd = AT_CMD_NONE;
1834
1835 cid_pointer = 0;
1836 *work_cids = 0;
1837 return FALSE;
1838 }
1839
1840 switch ( curCmd )
1841 {
1842 case AT_CMD_CGDATA:
1843 cmhSM_data_link_context();
1844 break;
1845 case AT_CMD_CGACT:
1846 if(AT_FAIL EQ cmhSM_activate_context())
1847 {
1848 smEntStat.curCmd = AT_CMD_NONE;
1849 gpppEntStat.curCmd = AT_CMD_NONE;
1850 cid_pointer = 0;
1851 *work_cids = 0;
1852 /*R_AT (RAT_CME, smEntStat.entOwn)( AT_CMD_CGACT, CME_ERR_Unknown );*/
1853 return FALSE;
1854 }
1855 break;
1856 default:
1857 cid_pointer = 0;
1858 *work_cids = 0;
1859 return FALSE;
1860 }
1861 return TRUE;
1862 }
1863
1864 /*
1865 +-------------------------------------------------------------------+
1866 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
1867 | STATE : finnished ROUTINE : cmhSM_define_cid_list |
1868 +-------------------------------------------------------------------+
1869
1870 PURPOSE : define all cid's in the list, if necessary
1871
1872 */
1873 GLOBAL SHORT cmhSM_define_cid_list( T_ACI_CMD_SRC srcId, SHORT *cids )
1874 {
1875 int i = 1;
1876
1877 TRACE_FUNCTION("cmhSM_define_cid_list");
1878
1879 if(INVALID_CID != *work_cids)
1880 {
1881 return 0;
1882 }
1883
1884 if ( *cids EQ GPRS_CID_OMITTED) /* if no cid given */
1885 {
1886 while ( i <= MAX_CID AND get_state_over_cid( (SHORT)i ) NEQ CS_DEFINED )
1887 i++;
1888
1889 if ( i > MAX_CID )
1890 {
1891 i = 1;
1892 while ( i <= MAX_CID AND get_state_over_cid( (SHORT)i ) NEQ CS_UNDEFINED )
1893 i++;
1894
1895 if ( i <= MAX_CID )
1896 {
1897 /*
1898 * reset of context parameter if cid undefined
1899 */
1900 sAT_PlusCGDCONT_exec (srcId, (SHORT)i, &defaultCtx);
1901 set_state_over_cid((SHORT)i, CS_UNDEFINED);
1902 }
1903 else
1904 return 0;
1905 }
1906
1907 *cids = work_cids[0] = i;
1908 work_cids[1] = INVALID_CID;
1909 i = 1; /* no. of cids */
1910 }
1911 else /* if cid(s) is/are given */
1912 {
1913 SHORT j = 0;
1914 i = 0;
1915
1916 /*
1917 * checks given cid parameter
1918 */
1919 while ( i < MAX_CID AND cids[i] NEQ INVALID_CID )
1920 {
1921 /* check cid */
1922 if ( cids[i] < GPRS_CID_1 OR cids[i] >= GPRS_CID_INVALID )
1923 return 0;
1924 /* count cids */
1925 i++;
1926 }
1927
1928 if ( MAX_CID < i )
1929 return 0;
1930
1931 memcpy (work_cids, cids, sizeof( *work_cids ) * (i + 1) );
1932
1933 /*
1934 * reset of context parameter if cid undefined
1935 */
1936 for (j = 0; work_cids[j] NEQ INVALID_CID; j++)
1937 {
1938 switch(get_state_over_cid(work_cids[j]))
1939 {
1940 case CS_UNDEFINED:
1941 sAT_PlusCGDCONT_exec (srcId, work_cids[j], &defaultCtx);
1942 set_state_over_cid(work_cids[j], CS_UNDEFINED);
1943 /*lint -fallthrough*/
1944 case CS_DEFINED:
1945 case CS_ACTIVATED:
1946 break;
1947 default:
1948 memset (work_cids, 0, sizeof( *work_cids ) * (i + 1) );
1949 return 0;
1950 }
1951 }
1952 }
1953
1954 return i;
1955 }
1956
1957 /*
1958 +----------------------------------------------------------------------+
1959 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
1960 | STATE : finnished ROUTINE : cmhSM_get_pdp_addr_for_CGPADDR |
1961 +----------------------------------------------------------------------+
1962
1963 PURPOSE : return the PDP_address to one cid for the GPRS CGPADDR AT command
1964
1965 */
1966 GLOBAL SHORT cmhSM_get_pdp_addr_for_CGPADDR ( SHORT cid, T_PDP_ADDRESS pdp_adress )
1967 {
1968 T_CONTEXT_STATE c_state; /* state of context */
1969
1970 c_state = get_state_over_cid( cid );
1971
1972 if ( c_state EQ CS_UNDEFINED OR c_state EQ CS_INVALID_STATE )
1973 {
1974 *pdp_adress = 0;
1975 return INVALID_CID;
1976 }
1977
1978 if ( c_state EQ CS_ACTIVATED OR c_state EQ CS_DATA_LINK )
1979 strcpy( pdp_adress, pdp_context[cid - 1].allocated_pdp_addr );
1980 else
1981 strcpy( pdp_adress, pdp_context[cid - 1].con.pdp_addr );
1982
1983 return cid;
1984 }
1985
1986 /*
1987 +----------------------------------------------------------------------+
1988 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
1989 | STATE : finnished ROUTINE : cmhSM_is_smreg_ti_used |
1990 +----------------------------------------------------------------------+
1991
1992 PURPOSE : handle for used smreg_ti
1993
1994 */
1995 GLOBAL BOOL cmhSM_is_smreg_ti_used ( UBYTE smreg_ti, SHORT *cid )
1996 {
1997 SHORT i = 0;
1998
1999 while ( i < MAX_CID )
2000 {
2001 if ( pdp_context[i].smreg_ti EQ smreg_ti)
2002 {
2003 psaSM_PDP_Deactivate ( (USHORT) (1 << pdp_context[i].nsapi), SMREG_LOCAL);
2004 psaGPPP_Terminate( PPP_LOWER_LAYER_UP );
2005
2006 call_waits_in_table = TRUE;
2007 *cid = i + 1;
2008 set_state_over_cid(*cid, CS_CONTEXT_REACTIVATION_1);
2009 return TRUE;
2010 }
2011
2012 i++;
2013 }
2014
2015 return FALSE;
2016 }
2017
2018 /*
2019 +----------------------------------------------------------------------+
2020 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
2021 | STATE : finnished ROUTINE : cmhSM_context_reactivation |
2022 +----------------------------------------------------------------------+
2023
2024 PURPOSE :
2025
2026 */
2027 GLOBAL void cmhSM_context_reactivation ( void )
2028 {
2029 T_CGEREP_EVENT_REP_PARAM event;
2030 T_SMREG_PDP_ACTIVATE_IND *sm_ind;
2031 SHORT i = 0;
2032
2033 if ( call_waits_in_table EQ TRUE )
2034 {
2035 call_waits_in_table = FALSE;
2036 /*
2037 * GPRS event reporting
2038 */
2039 sm_ind = &gprs_call_table[current_gprs_ct_index].sm_ind;
2040
2041 cmhSM_pdp_typ_to_string(sm_ind->pdp_type, (char*) &event.act.pdp_type);
2042 memcpy(&event.act.pdp_addr, &sm_ind->pdp_address.buff, sm_ind->pdp_address.c_buff);
2043 event.act.cid = gprs_call_table[current_gprs_ct_index].cid;
2044 for( i = 0 ; i < CMD_SRC_MAX; i++ )
2045 {
2046 R_AT( RAT_CRING, i ) ( CRING_MOD_Gprs, CRING_TYP_GPRS, CRING_TYP_NotPresent );
2047 R_AT( RAT_CGEREP, i ) ( CGEREP_EVENT_NW_REACT, &event );
2048 R_AT( RAT_P_CGEV, i ) ( CGEREP_EVENT_NW_REACT, &event );
2049 }
2050 }
2051 else
2052 {
2053 cmhSM_next_call_table_entry();
2054 }
2055 }
2056
2057 /*
2058 +----------------------------------------------------------------------+
2059 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
2060 | STATE : finnished ROUTINE : cmhSM_stop_context_reactivation |
2061 +----------------------------------------------------------------------+
2062
2063 PURPOSE :
2064
2065 */
2066 GLOBAL void cmhSM_stop_context_reactivation ( void )
2067 {
2068
2069 call_waits_in_table = FALSE;
2070 }
2071
2072 GLOBAL void cmhSM_next_call_table_entry( void )
2073 {
2074 current_gprs_ct_index++;
2075
2076 if ( current_gprs_ct_index >= gprs_ct_index )
2077 {
2078 cmhSM_empty_call_table();
2079 }
2080 else
2081 {
2082 cmhSM_context_reactivation();
2083 }
2084 }
2085
2086 /*
2087 +----------------------------------------------------------------------+
2088 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
2089 | STATE : finnished ROUTINE : cmhSM_init_GPRS_DTI_list |
2090 +----------------------------------------------------------------------+
2091
2092 PURPOSE : Init all DTI identifier for GPRS.
2093 */
2094 GLOBAL SHORT cmhSM_connect_working_cid ( void )
2095 {
2096 T_GPRS_CONT_CLASS *context_info = &pdp_context[work_cids[cid_pointer] - 1];
2097
2098 switch ( context_info->entity_id )
2099 {
2100 case DTI_ENTITY_PPPS:
2101 srcc_new_count(SRCC_PPPS_SNDCP_LINK);
2102
2103 if (IS_SRC_BT(context_info->owner))
2104 {
2105 T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_BLUETOOTH, DTI_ENTITY_PPPS, DTI_ENTITY_SNDCP};
2106 UBYTE dti_id = dti_cntrl_new_dti(DTI_DTI_ID_NOTPRESENT);
2107 dti_cntrl_est_dpath ( dti_id,
2108 entity_list,
2109 3,
2110 SPLIT,
2111 PPP_UART_connect_dti_cb);
2112 }
2113 else
2114 {
2115 T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_PPPS, DTI_ENTITY_SNDCP};
2116 dti_cntrl_est_dpath_indirect ((UBYTE)context_info->owner,
2117 entity_list,
2118 2,
2119 SPLIT,
2120 PPP_UART_connect_dti_cb,
2121 DTI_CPBLTY_SER,
2122 (UBYTE)work_cids[cid_pointer]);
2123 }
2124
2125 m_mt_te_link = TRUE;
2126 break;
2127
2128 case DTI_ENTITY_IP:
2129 #ifdef CO_UDP_IP
2130 {
2131 T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_IP, DTI_ENTITY_SNDCP};
2132 UBYTE dti_id;
2133 #ifdef FF_SAT_E
2134 if ( satShrdPrm.opchStat EQ OPCH_EST_REQ )
2135 dti_id = simShrdPrm.sat_class_e_dti_id;
2136 else
2137 #endif /* FF_SAT_E */
2138 dti_id = wap_dti_id;
2139
2140 /* link_id should be created in atGD already, so just connect: */
2141 if (!dti_cntrl_est_dpath( dti_id,
2142 entity_list,
2143 2,
2144 APPEND,
2145 IP_UDP_connect_dti_cb))
2146 {
2147 TRACE_EVENT("cmhSM_connect_working_cid: dti_cntrl_est_dpath returned FALSE");
2148 return 0;
2149 }
2150 }
2151 #endif /* CO_UDP_IP */
2152 break;
2153
2154 #ifdef FF_SAT_E
2155 case DTI_ENTITY_SIM:
2156 {
2157 T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_SIM, DTI_ENTITY_SNDCP};
2158 /* create a SAT class E DTI ID if not present */
2159 if ( simShrdPrm.sat_class_e_dti_id EQ DTI_DTI_ID_NOTPRESENT )
2160 {
2161 simShrdPrm.sat_class_e_dti_id = dti_cntrl_new_dti(DTI_DTI_ID_NOTPRESENT);
2162 TRACE_EVENT_P1("sat_class_e_dti_id = %d", simShrdPrm.sat_class_e_dti_id);
2163 }
2164 srcc_new_count(SRCC_SIM_SNDCP_LINK);
2165 TRACE_FUNCTION("cmhSM_connect_working_cid:GC_TYPE_SIM");
2166 context_info->link_id_new =
2167 dti_conn_compose_link_id (0, 0, simShrdPrm.sat_class_e_dti_id, DTI_TUPLE_NO_NOTPRESENT);
2168 dti_cntrl_est_dpath( simShrdPrm.sat_class_e_dti_id,
2169 entity_list,
2170 2,
2171 SPLIT,
2172 SIM_SNDCP_connect_dti_cb);
2173 break;
2174 }
2175 #endif /* FF_SAT_E */
2176
2177 case DTI_ENTITY_NULL:
2178 {
2179 T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_NULL, DTI_ENTITY_SNDCP};
2180 UBYTE dti_id = dti_cntrl_new_dti(DTI_DTI_ID_NOTPRESENT);
2181 srcc_new_count(SRCC_NULL_SNDCP_LINK);
2182 context_info->link_id_new = dti_conn_compose_link_id (0, 0, dti_id, DTI_TUPLE_NO_NOTPRESENT );
2183
2184 dti_cntrl_est_dpath( dti_id,
2185 entity_list,
2186 2,
2187 SPLIT,
2188 NULL_SNDCP_connect_dti_cb);
2189 break;
2190 }
2191 #if defined (FF_GPF_TCPIP)
2192 case DTI_ENTITY_TCPIP:
2193 {
2194 T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_TCPIP, DTI_ENTITY_SNDCP};
2195 UBYTE dti_id;
2196 dti_id = wap_dti_id;
2197 /* link_id should be created in atGD already, so just connect: */
2198 if (!dti_cntrl_est_dpath( dti_id,
2199 entity_list,
2200 2,
2201 SPLIT,
2202 TCPIP_connect_dti_cb))
2203 {
2204 TRACE_EVENT("cmhSM_connect_working_cid: dti_cntrl_est_dpath returned FALSE");
2205 return 0;
2206 }
2207 }
2208 break;
2209 #endif /* FF_GPF_TCPIP */
2210
2211 #if defined(FF_PKTIO) OR defined(FF_TCP_IP) OR defined (FF_PSI)
2212 case DTI_ENTITY_INVALID:
2213 {
2214 T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_SNDCP};
2215 srcc_new_count(SRCC_PKTIO_SNDCP_LINK);
2216
2217 dti_cntrl_est_dpath_indirect((UBYTE)context_info->owner,
2218 entity_list,
2219 1, SPLIT,
2220 PKTIO_SNDCP_connect_dti_cb,
2221 DTI_CPBLTY_PKT,
2222 (UBYTE)work_cids[cid_pointer]);
2223 set_state_working_cid( CS_ACTIVATING );
2224 break;
2225 }
2226 #endif /* FF_PKTIO OR FF_TCP_IP OR FF_PSI */
2227 default:
2228 return 0;
2229
2230 }
2231
2232 return 1;
2233 }
2234
2235
2236 GLOBAL void cmhSM_disconnect_cid ( SHORT cid, T_GPRS_CONNECT_TYPE type )
2237 {
2238 T_DTI_CONN_LINK_ID link_id = cmhSM_get_link_id_SNDCP_peer( cid, SNDCP_PEER_NORMAL );
2239
2240 TRACE_FUNCTION("cmhSM_disconnect_cid");
2241 TRACE_EVENT_P1("link_id %d",link_id);
2242 if ( DTI_LINK_ID_NOTPRESENT NEQ link_id)
2243 {
2244 switch ( type )
2245 {
2246 case GC_TYPE_DATA_LINK:
2247 srcc_delete_count( SRCC_PPPS_SNDCP_LINK );
2248 pdp_context[cid - 1].link_id_sn = DTI_LINK_ID_NOTPRESENT;
2249 pdp_context[cid - 1].link_id_new = DTI_LINK_ID_NOTPRESENT;
2250 pdp_context[cid - 1].link_id_uart = DTI_LINK_ID_NOTPRESENT;
2251 pdp_context[cid - 1].entity_id = DTI_ENTITY_INVALID;
2252 m_mt_te_link = FALSE;
2253 break;
2254
2255 case GC_TYPE_WAP:
2256 if(is_gpf_tcpip_call())
2257 {
2258 GPF_TCPIP_STATEMENT(srcc_delete_count( SRCC_TCPIP_SNDCP_LINK ));
2259 }
2260 else
2261 {
2262 srcc_delete_count( SRCC_IP_SNDCP_LINK );
2263 }
2264 pdp_context[cid - 1].link_id_sn = DTI_LINK_ID_NOTPRESENT;
2265 pdp_context[cid - 1].link_id_new = DTI_LINK_ID_NOTPRESENT;
2266 pdp_context[cid - 1].link_id_uart = DTI_LINK_ID_NOTPRESENT;
2267 pdp_context[cid - 1].entity_id = DTI_ENTITY_INVALID;
2268 break;
2269
2270 case GC_TYPE_NULL:
2271 case GC_TYPE_EMAIL:
2272 switch ( pdp_context[cid - 1].entity_id )
2273 {
2274 case DTI_ENTITY_IP:
2275 GPF_TCPIP_STATEMENT(case DTI_ENTITY_TCPIP:)
2276 if(is_gpf_tcpip_call())
2277 {
2278 GPF_TCPIP_STATEMENT(srcc_delete_count( SRCC_TCPIP_SNDCP_LINK ));
2279 }
2280 else
2281 {
2282 srcc_delete_count( SRCC_IP_SNDCP_LINK );
2283 }
2284 dti_cntrl_erase_entry(EXTRACT_DTI_ID(link_id));
2285 break;
2286
2287 case DTI_ENTITY_NULL:
2288 dti_cntrl_entity_disconnected( link_id, DTI_ENTITY_NULL );
2289 srcc_delete_count( SRCC_NULL_SNDCP_LINK );
2290 dti_cntrl_erase_entry(EXTRACT_DTI_ID(link_id));
2291 break;
2292
2293 #if defined(FF_PKTIO) OR defined(FF_TCP_IP) || defined(FF_GPF_TCPIP) OR defined (FF_PSI)
2294 case DTI_ENTITY_PKTIO:
2295 case DTI_ENTITY_PSI:
2296 case DTI_ENTITY_AAA:
2297 srcc_delete_count( SRCC_PKTIO_SNDCP_LINK );
2298 break;
2299 #endif /* FF_PKTIO OR FF_TCP_IP || FF_GPF_TCPIP OR FF_PSI */
2300 }
2301 pdp_context[cid - 1].link_id_sn = DTI_LINK_ID_NOTPRESENT;
2302 pdp_context[cid - 1].link_id_new = DTI_LINK_ID_NOTPRESENT;
2303 pdp_context[cid - 1].link_id_uart = DTI_LINK_ID_NOTPRESENT;
2304 pdp_context[cid - 1].entity_id = DTI_ENTITY_INVALID;
2305 break;
2306
2307 }
2308 }
2309 }
2310
2311 GLOBAL BOOL uart_is_mt_te_link( void )
2312 {
2313
2314 return m_mt_te_link;
2315 }
2316
2317 GLOBAL void cmhSNDCP_Disable( T_DTI_CONN_LINK_ID link_id )
2318 {
2319 SHORT cid = gaci_get_cid_over_link_id( link_id );
2320
2321 /*
2322 * disconnects the context if the link_id is the current link_id of this context
2323 *
2324 * the other case:
2325 * the context is switching to an other peer and the old link_id is requested
2326 * to be disconnected, NOT the context itself
2327 */
2328 if (cmhSM_get_link_id_SNDCP_peer(cid, SNDCP_PEER_NORMAL) EQ link_id)
2329 {
2330 cmhSM_deactivateAContext(CMD_SRC_NONE, cid);
2331 }
2332 }
2333
2334 /*
2335 +----------------------------------------------------------------------+
2336 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
2337 | STATE : finnished ROUTINE : cmhSM_connect_context |
2338 +----------------------------------------------------------------------+
2339
2340 PURPOSE : Connect an activated or deactivated PDP context with an entity.
2341 */
2342 GLOBAL SHORT cmhSM_connect_context ( SHORT cid, T_DTI_ENTITY_ID peer, UBYTE ppp_hc, UBYTE msid )
2343 {
2344 ULONG dti_neighbor;
2345 UBYTE dti_direction, hcomp = cmhSM_Get_h_comp() ? SMREG_COMP_BOTH_DIRECT: SMREG_COMP_NEITHER_DIRECT;
2346
2347 TRACE_FUNCTION("cmhSM_connect_context()");
2348
2349 switch ( peer )
2350 {
2351 case DTI_ENTITY_PPPS:
2352 dti_neighbor = (ULONG) PPP_NAME;
2353 dti_direction = SMREG_HOME;
2354 break;
2355 case DTI_ENTITY_NULL:
2356 dti_neighbor = (ULONG) NULL_NAME;
2357 dti_direction = SMREG_NEIGHBOR;
2358 smShrdPrm.direc = DIREC_MO;
2359 break;
2360 case DTI_ENTITY_IP:
2361 dti_neighbor = (ULONG) IP_NAME;
2362 dti_direction = SMREG_NEIGHBOR;
2363 smShrdPrm.direc = DIREC_MO;
2364 #ifdef FF_WAP
2365 if (Wap_Call)
2366 rAT_WAP_start_gprs_login();
2367 #endif /* FF_WAP */
2368 break;
2369 #ifdef FF_SAT_E
2370 case DTI_ENTITY_SIM:
2371 dti_neighbor = (ULONG) SIM_NAME;
2372 dti_direction = SMREG_NEIGHBOR;
2373 smShrdPrm.direc = DIREC_MO;
2374 break;
2375 #endif /* FF_SAT_E */
2376 #if defined(FF_PKTIO) OR defined(FF_TCP_IP) OR defined(FF_PSI)
2377 case DTI_ENTITY_PKTIO:
2378 dti_neighbor = (ULONG) PKTIO_NAME;
2379 dti_direction = SMREG_HOME;
2380 smShrdPrm.direc = DIREC_MO;
2381 break;
2382 case DTI_ENTITY_PSI:
2383 dti_neighbor = (ULONG) PSI_NAME;
2384 dti_direction = SMREG_HOME;
2385 smShrdPrm.direc = DIREC_MO;
2386 break;
2387 case DTI_ENTITY_AAA:
2388 dti_neighbor = (ULONG) RIV_NAME;
2389 dti_direction = SMREG_NEIGHBOR;
2390 smShrdPrm.direc = DIREC_MO;
2391 break;
2392 #endif /* FF_PKTIO OR FF_TCP_IP OR FF_PSI */
2393 #ifdef FF_GPF_TCPIP
2394 case DTI_ENTITY_TCPIP:
2395 dti_neighbor = (ULONG) TCPIP_NAME;
2396 dti_direction = SMREG_NEIGHBOR;
2397 smShrdPrm.direc = DIREC_MO;
2398 break;
2399 #endif /* FF_GPF_TCPIP */
2400 default:
2401 return 0;
2402 }
2403
2404 pdp_context[cid - 1].entity_id = peer;
2405
2406 #ifdef _SIMULATION_
2407 dti_neighbor = 0xfe1234ef;
2408 #endif
2409
2410 if ( DTI_LINK_ID_NOTPRESENT EQ pdp_context[cid - 1].link_id_sn )
2411 { /* context is deactivated */
2412 cmhSM_GetNewNSapi();
2413
2414 psaSM_ActivateReq ( cid,
2415 (UBYTE) (hcomp? ppp_hc: 0),
2416 msid,
2417 hcomp,
2418 pdp_context[cid - 1].link_id_new,
2419 dti_neighbor,
2420 dti_direction );
2421
2422 }
2423 else
2424 { /* context is activated */
2425 EXTERN void psaSN_SwitchReq ( UBYTE nsapi,
2426 ULONG dti_linkid,
2427 ULONG dti_neighbor,
2428 UBYTE dti_direction );
2429
2430 psaSN_SwitchReq ( pdp_context[cid - 1].nsapi,
2431 pdp_context[cid - 1].link_id_new,
2432 dti_neighbor, dti_direction);
2433
2434 dti_cntrl_close_dpath_from_dti_id (EXTRACT_DTI_ID(pdp_context[cid - 1].link_id_sn));
2435 dti_cntrl_entity_disconnected( pdp_context[cid - 1].link_id_sn, DTI_ENTITY_SNDCP );
2436 dti_cntrl_erase_entry( EXTRACT_DTI_ID(pdp_context[cid - 1].link_id_sn) );
2437 }
2438
2439 return 1;
2440 }
2441
2442 GLOBAL void cp_pdp_primitive(T_SMREG_PDP_ACTIVATE_CNF * pdp_activate_cnf,
2443 T_PPP_PDP_ACTIVATE_RES *activate_result)
2444 {
2445
2446 activate_result->ppp_hc = pdp_activate_cnf->ppp_hc;
2447 activate_result->msid = pdp_activate_cnf->msid;
2448
2449 /*
2450 * copy IP address
2451 */
2452 activate_result->ip = pdp_activate_cnf->pdp_address.buff[0];
2453 activate_result->ip = activate_result->ip << 8;
2454 activate_result->ip+= pdp_activate_cnf->pdp_address.buff[1];
2455 activate_result->ip = activate_result->ip << 8;
2456 activate_result->ip+= pdp_activate_cnf->pdp_address.buff[2];
2457 activate_result->ip = activate_result->ip << 8;
2458 activate_result->ip+= pdp_activate_cnf->pdp_address.buff[3];
2459
2460
2461 activate_result->sdu.l_buf = pdp_activate_cnf->sdu.l_buf;
2462 activate_result->sdu.o_buf = 0;
2463
2464 if (pdp_activate_cnf->sdu.l_buf > 0) {
2465 memcpy(activate_result->sdu.buf,
2466 &pdp_activate_cnf->sdu.buf[pdp_activate_cnf->sdu.o_buf >> 3],
2467 pdp_activate_cnf->sdu.l_buf >> 3);
2468 }
2469 }
2470
2471
2472 GLOBAL SHORT cmhSM_context_connected( USHORT nsapi )
2473 {
2474 T_GPRS_CONT_CLASS *context_info = &pdp_context[nsapi_to_cid[nsapi] - 1];
2475 UBYTE ip[4];
2476
2477 TRACE_FUNCTION("cmhSM_context_connected");
2478
2479 context_info->link_id_sn = context_info->link_id_new;
2480 context_info->link_id_new = DTI_LINK_ID_NOTPRESENT;
2481
2482 switch (context_info->entity_id)
2483 {
2484 case DTI_ENTITY_PPPS:
2485 cmhSM_pdp_address_to_ip(&context_info->allocated_pdp_addr, ip);
2486 psaGPPP_PDP_Activate(0, 0, ip,
2487 context_info->network_pco.pco, context_info->network_pco.len);
2488 set_state_working_cid( CS_ESTABLISH_3 );
2489 break;
2490
2491 #ifdef FF_PKTIO
2492 case DTI_ENTITY_PKTIO:
2493 #endif /* FF_PKTIO */
2494 #ifdef FF_PSI
2495 case DTI_ENTITY_PSI:
2496 #endif /* FF_PSI */
2497 #ifdef FF_SAT_E
2498 case DTI_ENTITY_SIM:
2499 #endif /* FF_SAT_E */
2500 #ifdef FF_TCP_IP
2501 case DTI_ENTITY_AAA:
2502 #endif /* FF_TCP_IP */
2503 #if defined (FF_SAT_E) OR defined (FF_TCP_IP) OR defined (FF_PKTIO) OR defined (FF_PSI)
2504 dti_cntrl_entity_connected( context_info->link_id_sn, DTI_ENTITY_SNDCP, DTI_OK);
2505 set_state_working_cid( CS_ACTIVATED );
2506 #if defined(FF_PKTIO) OR defined (FF_PSI)
2507 cmhSM_next_work_cid(smEntStat.curCmd);
2508 #endif /* FF_PKTIO OR FF_PSI */
2509 break;
2510 #endif /* #if defined (FF_SAT_E) OR defined (FF_TCP_IP) OR defined (FF_PKTIO) OR FF_PSI */
2511 } /* switch (context_info->entity_id) */
2512 return 1;
2513 } /* GLOBAL SHORT cmhSM_context_connected( USHORT nsapi ) */
2514
2515
2516 /*
2517 +----------------------------------------------------------------------+
2518 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
2519 | STATE : finnished ROUTINE : cmhSM_set_PCO |
2520 +----------------------------------------------------------------------+
2521
2522 PURPOSE : Set a PCO in the context of the cid.
2523 */
2524 GLOBAL void cmhSM_set_PCO( SHORT cid, T_PCO_TYPE pco_type, UBYTE* buf_addr, UBYTE length)
2525 {
2526 T_GPRS_CONT_PCO* dest;
2527
2528 switch ( pco_type )
2529 {
2530 case PCO_USER:
2531 dest = &pdp_context[cid - 1].user_pco;
2532 break;
2533 case PCO_NETWORK:
2534 dest = &pdp_context[cid - 1].network_pco;
2535 break;
2536 }
2537 /*lint -e(644) */ /* all possible types defined */
2538 memcpy(dest->pco, buf_addr, length);
2539 dest->len = length;
2540 }
2541
2542 /*
2543 +----------------------------------------------------------------------+
2544 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
2545 | STATE : finnished ROUTINE : cmhSM_get_dti_SNDCP_pper |
2546 +----------------------------------------------------------------------+
2547
2548 PURPOSE : Give back the right DTI-ID for the SNDCP - peer connection.
2549 */
2550 GLOBAL ULONG cmhSM_get_link_id_SNDCP_peer( SHORT cid, T_SNDCP_PEER which )
2551 {
2552
2553 switch ( which )
2554 {
2555 case SNDCP_PEER_NORMAL:
2556 return pdp_context[cid - 1].link_id_new NEQ DTI_LINK_ID_NOTPRESENT ?
2557 pdp_context[cid - 1].link_id_new: pdp_context[cid - 1].link_id_sn;
2558 case SNDCP_PEER_SWITCHED:
2559 return pdp_context[cid - 1].link_id_sn;
2560 }
2561
2562 return DTI_LINK_ID_NOTPRESENT;
2563 }
2564
2565 /*
2566 +----------------------------------------------------------------------+
2567 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
2568 | STATE : code ROUTINE : cmhSM_context_deactivated |
2569 +----------------------------------------------------------------------+
2570
2571 PURPOSE : Control the answer of context deactivations
2572 started by an AT command.
2573 */
2574 GLOBAL void cmhSM_context_deactivated( USHORT nsapi_set )
2575 {
2576
2577 switch( working_cgact_actions.state )
2578 {
2579 case T_CDS_RUNNING:
2580 if ( nsapi_set & working_cgact_actions.nsapi_set )
2581 { /* nsapi deactivation is requested */
2582 working_cgact_actions.nsapi_set &= ~nsapi_set;
2583 if ( ! (working_cgact_actions.cid_set OR
2584 working_cgact_actions.nsapi_set ) )
2585 {
2586 R_AT( RAT_OK, working_cgact_actions.srcId ) ( AT_CMD_CGACT );
2587 working_cgact_actions.state = T_CDS_IDLE;
2588 }
2589 }
2590 break;
2591 case T_CDS_IDLE:
2592 break;
2593 }
2594 }
2595
2596 /*
2597 +----------------------------------------------------------------------+
2598 | PROJECT : GSM-PS (8441) MODULE : CMH_SMF |
2599 | STATE : finnished ROUTINE : deactivateAContextForCGACT |
2600 +----------------------------------------------------------------------+
2601
2602 PURPOSE : deactivate a context for CGACT
2603
2604 RETURN VALUE : TRUE - AT_EXCT have to be returned for this context
2605 FALSE - AT_CMPL have to be reported for this context
2606
2607 */
2608 static T_ACI_RETURN deactivateAContextForCGACT(SHORT cid)
2609 {
2610 T_CONTEXT_STATE ctx_state = get_state_over_cid( cid );
2611
2612 SRCC_LINK_NO srcc_link_no= SRCC_INVALID_LINK;
2613 T_DTI_ENTITY_ID dti_entity_id= DTI_ENTITY_INVALID;
2614
2615
2616
2617 TRACE_FUNCTION("deactivateAContextForCGACT()");
2618
2619 #if defined (CO_UDP_IP) || defined (FF_GPF_TCPIP)
2620
2621
2622
2623 /*
2624 * additinal behaviour for WAP
2625 * abort ATD*98# before context activation requested
2626 * 2003.05.06 brz
2627 */
2628 if(is_gpf_tcpip_call()) {
2629 GPF_TCPIP_STATEMENT(srcc_link_no = SRCC_TCPIP_SNDCP_LINK);
2630 GPF_TCPIP_STATEMENT(dti_entity_id = DTI_ENTITY_TCPIP);
2631 }
2632 else {
2633 srcc_link_no = SRCC_IP_SNDCP_LINK;
2634 dti_entity_id = DTI_ENTITY_IP;
2635 }
2636
2637 if( TRUE NEQ srcc_reserve_sources( srcc_link_no, 1 ) AND
2638 DTI_LINK_ID_NOTPRESENT NEQ pdp_context[cid - 1].link_id_new AND
2639 cid EQ work_cids[cid_pointer] OR
2640 pdp_context[cid - 1].entity_id EQ dti_entity_id)
2641 {
2642 psaTCPIP_Deactivate(cmhSM_IP_activate_cb);
2643
2644 if(CS_UNDEFINED EQ ctx_state OR
2645 CS_DEFINED EQ ctx_state )
2646 {
2647 if(is_gpf_tcpip_call()) {
2648 GPF_TCPIP_STATEMENT(wap_state = TCPIP_Deactivation);
2649 }
2650 else {
2651 wap_state = UDPA_Deactivation;
2652 }
2653 dti_cntrl_close_dpath_from_dti_id(
2654 EXTRACT_DTI_ID(cmhSM_get_link_id_SNDCP_peer(cid , SNDCP_PEER_NORMAL)));
2655 }
2656
2657 if( CS_ATTACHING_AFTER_UNDEF EQ ctx_state OR
2658 CS_ATTACHING_AFTER_DEF EQ ctx_state OR
2659 CS_WAITS_FOR_ACTIVATING EQ ctx_state )
2660 {
2661 srcc_delete_count(srcc_link_no);
2662 return cmhSM_deactivateAContext(CMD_SRC_NONE, cid);
2663 }
2664
2665 return AT_EXCT;
2666 }
2667 else
2668 #endif /* CO_UDP_IP || FF_GPF_TCPIP */
2669 {
2670 if( CS_DEFINED NEQ ctx_state AND CS_UNDEFINED NEQ ctx_state )
2671 {
2672 if( CS_ATTACHING_AFTER_UNDEF EQ ctx_state OR
2673 CS_ATTACHING_AFTER_DEF EQ ctx_state OR
2674 CS_WAITS_FOR_ACTIVATING EQ ctx_state )
2675 {
2676 return cmhSM_deactivateAContext(CMD_SRC_NONE, cid);
2677 }
2678 else
2679 {
2680 dti_cntrl_close_dpath_from_dti_id(
2681 EXTRACT_DTI_ID(cmhSM_get_link_id_SNDCP_peer(cid , SNDCP_PEER_NORMAL)));
2682 return AT_EXCT;
2683 }
2684 }
2685 }
2686 return AT_CMPL;
2687 }
2688
2689 /*
2690 +----------------------------------------------------------------------+
2691 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
2692 | STATE : finnished ROUTINE : cmhSM_deactivateAContext |
2693 +----------------------------------------------------------------------+
2694
2695 PURPOSE : deactivate some contexts (able for serial multiplexer mode).
2696 */
2697 GLOBAL T_ACI_RETURN cmhSM_deactivateContexts( T_ACI_CMD_SRC srcId, SHORT *cids)
2698 {
2699 T_ACI_RETURN ret_value = AT_CMPL;
2700 T_CONTEXT_STATE state;
2701 USHORT nsapi_set = 0,
2702 cid_set = 0;
2703 SHORT i,
2704 all_cids[MAX_CID + 1] = {1, 2, INVALID_CID};
2705
2706 TRACE_FUNCTION("cmhSM_deactivateContexts");
2707
2708 if( T_CDS_RUNNING EQ working_cgact_actions.state) {
2709 TRACE_EVENT("cgact_ation is running: bussy returned");
2710 return AT_FAIL; /* AT_BUSY */
2711 }
2712
2713 if(INVALID_CID EQ *cids)
2714 {
2715 cids = all_cids;
2716 }
2717
2718 for(i = 0; cids[i] NEQ INVALID_CID; i++)
2719 {
2720 state = pdp_context[cids[i] - 1].state;
2721 #if defined (CO_UDP_IP) || defined (FF_GPF_TCPIP)
2722 #ifndef _SIMULATION_
2723 pdp_context[cids[i] - 1].owner = srcId;
2724 #endif
2725 #else
2726 pdp_context[cids[i] - 1].owner = srcId;
2727 #endif
2728 if(AT_EXCT EQ deactivateAContextForCGACT( cids[i] ))
2729 {
2730 ret_value = AT_EXCT;
2731 if(0 NEQ pdp_context[cids[i] - 1].nsapi)
2732 {
2733 nsapi_set |= (1 << pdp_context[cids[i] - 1].nsapi);
2734
2735 if(state EQ CS_DATA_LINK OR
2736 state EQ CS_ACTIVATED OR
2737 state EQ CS_CONTEXT_REACTIVATION_1)
2738 {
2739 cid_set = 1 << (cids[i] - 1);
2740 }
2741 }
2742 else
2743 {
2744 cid_set = 1 << (cids[i] - 1);
2745 }
2746 }
2747 }
2748
2749 if(cid_set OR nsapi_set) {
2750 working_cgact_actions.state = T_CDS_RUNNING;
2751 working_cgact_actions.nsapi_set = nsapi_set;
2752 working_cgact_actions.cid_set = cid_set;
2753 working_cgact_actions.srcId = srcId;
2754 }
2755
2756 cmhSM_stop_context_reactivation();
2757
2758 return ret_value;
2759 }
2760
2761
2762 /*
2763 +----------------------------------------------------------------------+
2764 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
2765 | STATE : finnished ROUTINE : cmhSM_getCurQOS |
2766 +----------------------------------------------------------------------+
2767
2768 PURPOSE : This function returns the current QOS settings.
2769 */
2770 #ifdef FF_SAT_E
2771 GLOBAL T_QOS* cmhSM_getCurQOS( SHORT cid )
2772 {
2773
2774 return &pdp_context[cid - 1].qos;
2775
2776 }
2777 #endif /* FF_SAT_E */
2778
2779 /*
2780 +----------------------------------------------------------------------+
2781 | PROJECT : GPRS (8441) MODULE : CMH_SMF |
2782 | STATE : finnished ROUTINE : cmhSM_deactivateAContext |
2783 +----------------------------------------------------------------------+
2784
2785 PURPOSE : deactivate all contexts (able for serial multiplexer mode).
2786 */
2787 GLOBAL T_ACI_RETURN cmhSM_deactivateAContext( T_ACI_CMD_SRC srcId, SHORT cid )
2788 {
2789 TRACE_FUNCTION("cmhSM_deactivateAContext()") ;
2790
2791 switch( get_state_over_cid( cid ) )
2792 {
2793 case CS_UNDEFINED:
2794 case CS_DEFINED:
2795 /*
2796 * context ís deactivated -> not action necessary
2797 */
2798 break;
2799 case CS_ATTACHING_AFTER_UNDEF:
2800 /*
2801 * CGDATA has started the attach procedure
2802 * before establish data link
2803 * CGDATA has to be stoped
2804 */
2805 set_state_over_cid( cid, CS_UNDEFINED );
2806 psaGMM_Detach( GMMREG_DT_GPRS );
2807 gpppEntStat.curCmd = AT_CMD_NONE;
2808 cid_pointer = 0;
2809 *work_cids = 0;
2810 if(CMD_SRC_NONE EQ srcId)
2811 {
2812 pdp_context[cid - 1].owner = gpppEntStat.entOwn;
2813 gaci_RAT_caller ( RAT_NO_CARRIER, cid, AT_CMD_CGDATA, 0 );
2814 }
2815 return AT_CMPL;
2816
2817 case CS_ATTACHING_AFTER_DEF:
2818 /*
2819 * CGDATA has started the attach procedure
2820 * before establish data link
2821 * CGDATA has to be stoped
2822 */
2823 set_state_over_cid( cid, CS_DEFINED );
2824 psaGMM_Detach( GMMREG_DT_GPRS );
2825 gpppEntStat.curCmd = AT_CMD_NONE;
2826 cid_pointer = 0;
2827 *work_cids = 0;
2828 if(CMD_SRC_NONE EQ srcId)
2829 {
2830 pdp_context[cid - 1].owner = gpppEntStat.entOwn;
2831 gaci_RAT_caller ( RAT_NO_CARRIER, cid, AT_CMD_CGDATA, 0 );
2832 }
2833 return AT_CMPL;
2834
2835 case CS_ESTABLISH_1:
2836 /*
2837 * context not activated, but PPP has to be terminated
2838 */
2839 set_state_over_cid( cid, CS_ABORT_ESTABLISH );
2840 dti_cntrl_entity_disconnected( pdp_context[cid - 1].link_id_new, DTI_ENTITY_SNDCP );
2841 if (uartShrdPrm.escape_seq EQ UART_DETECT_ESC)
2842 {
2843 psaGPPP_Terminate( PPP_LOWER_LAYER_DOWN );
2844 }
2845 else
2846 {
2847 psaGPPP_Terminate( PPP_LOWER_LAYER_UP );
2848 }
2849 uartShrdPrm.escape_seq = UART_DETECT_DTR;
2850
2851 return AT_EXCT;
2852
2853 case CS_DATA_LINK:
2854 /*lint -fallthrough*/
2855 case CS_ESTABLISH_2:
2856 case CS_ESTABLISH_3:
2857 /*
2858 * context has to be deactivated and PPP has to be terminated
2859 */
2860 set_state_over_cid( cid, CS_CONTEXT_REACTIVATION_1 );
2861 psaSM_PDP_Deactivate( (USHORT) (1 << pdp_context[cid - 1].nsapi), SMREG_NONLOCAL);
2862 psaGPPP_Terminate( PPP_LOWER_LAYER_UP );
2863 return AT_EXCT;
2864
2865 case CS_ACTIVATED:
2866 /*
2867 * special handling for context switching
2868 */
2869 if(DTI_LINK_ID_NOTPRESENT NEQ pdp_context[cid - 1].link_id_sn AND
2870 DTI_LINK_ID_NOTPRESENT NEQ pdp_context[cid - 1].link_id_new )
2871 {
2872 return AT_CMPL;
2873 }
2874 /*lint -fallthrough*/
2875 case CS_ACTIVATING:
2876 /*
2877 * +CGACT aborted
2878 */
2879 set_state_over_cid( cid, CS_DEACTIVATE_NORMAL );
2880 psaSM_PDP_Deactivate( (USHORT) (1 << pdp_context[cid - 1].nsapi), SMREG_NONLOCAL);
2881 return AT_EXCT;
2882 case CS_WAITS_FOR_ACTIVATING:
2883 /*
2884 * reset command state it is enough
2885 */
2886 set_state_working_cid( CS_DEFINED );
2887 gpppEntStat.curCmd = AT_CMD_NONE;
2888 smEntStat.curCmd = AT_CMD_NONE;
2889 *work_cids = 0;
2890 cid_pointer = 0;
2891 return AT_CMPL;
2892
2893 case CS_ABORT_ESTABLISH:
2894 case CS_DEACTIVATE_NORMAL:
2895 case CS_BREAKDOWN_LINK_ERROR:
2896 case CS_BREAKDOWN_LINK_NORMAL:
2897 /*
2898 * context is during deactivation procedure -> not action necessary
2899 */
2900 return AT_EXCT;
2901 case CS_CONTEXT_REACTIVATION_1:
2902 case CS_CONTEXT_REACTIVATION_2:
2903 /*
2904 * context is during deactivation procedure
2905 * -> not action for context deactivation or PPP termination necessary
2906 */
2907 return AT_EXCT;
2908 }
2909
2910 return AT_FAIL;
2911 }
2912
2913 GLOBAL BOOL cmhSM_isContextActive( void )
2914 {
2915 int i = SMH_FIRST_FREE_NSAPIS;
2916
2917 while ( i <= SMH_LAST_FREE_NSAPIS AND ( nsapi_to_cid[i] EQ INVALID_CID))
2918 i++;
2919
2920 if ( i > SMH_LAST_FREE_NSAPIS)
2921 return FALSE;
2922
2923 return TRUE;
2924 }
2925
2926 #endif /* GPRS */
2927 /*==== EOF ========================================================*/