comparison src/aci2/aci/cmh_sms.c @ 3:93999a60b835

src/aci2, src/condat2: import of g23m/condat source pieces from TCS211
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 26 Sep 2016 00:29:36 +0000
parents
children
comparison
equal deleted inserted replaced
2:c41a534f33c6 3:93999a60b835
1 /*
2 +-----------------------------------------------------------------------------
3 | Project :
4 | Modul :
5 +-----------------------------------------------------------------------------
6 | Copyright 2002 Texas Instruments Berlin, AG
7 | All rights reserved.
8 |
9 | This file is confidential and a trade secret of Texas
10 | Instruments Berlin, AG
11 | The receipt of or possession of this file does not convey
12 | any rights to reproduce or disclose its contents or to
13 | manufacture, use, or sell anything it may describe, in
14 | whole, or in part, without the specific written consent of
15 | Texas Instruments Berlin, AG.
16 +-----------------------------------------------------------------------------
17 | Purpose : This module implements the set fuinctions related to the
18 | protocol stack adapter for GPRS session management ( SM ).
19 +-----------------------------------------------------------------------------
20 */
21
22 #if defined (GPRS) && defined (DTI)
23
24 #ifndef CMH_SMS_C
25 #define CMH_SMS_C
26 #endif
27
28 #include "aci_all.h"
29
30 /*==== INCLUDES ===================================================*/
31 #include "dti.h" /* functionality of the dti library */
32 #include "aci_cmh.h"
33 #include "ati_cmd.h"
34 #include "aci_cmd.h"
35 #include "aci_io.h"
36
37 #include "dti_conn_mng.h"
38 #include "dti_cntrl_mng.h"
39
40 #include "gaci.h"
41 #include "gaci_cmh.h"
42 #include "psa.h"
43 #include "psa_sm.h"
44 #include "psa_gppp.h"
45 #include "psa_gmm.h"
46 #include "psa_tcpip.h"
47
48 #include "cmh.h"
49 #include "cmh_sm.h"
50 #include "cmh_gppp.h"
51 #include "cmh_gmm.h"
52 #include "gaci_srcc.h"
53 #include "aci_mem.h"
54 #include "phb.h"
55 #include "wap_aci.h"
56
57 /*==== CONSTANTS ==================================================*/
58
59 /*==== EXPORT =====================================================*/
60
61 /*==== VARIABLES ==================================================*/
62
63 /*==== FUNCTIONS ==================================================*/
64 LOCAL void string_to_dns(CHAR* dns, ULONG *dns_long);
65 /*
66 +--------------------------------------------------------------------+
67 | PROJECT : GSM-PS (8441) MODULE : CMH_SMS |
68 | STATE : finnished ROUTINE : sAT_PlusCGQREQ |
69 +--------------------------------------------------------------------+
70
71 PURPOSE : This is the functional counterpart to the +CGQREQ= AT
72 command which sets the requested QOS.
73 */
74 GLOBAL T_ACI_RETURN sAT_PlusCGQREQ
75 ( T_ACI_CMD_SRC srcId, SHORT cid ,T_QOS *qos)
76 {
77 T_CONTEXT_STATE c_state; /* state of context */
78
79
80 TRACE_FUNCTION ("sAT_PlusCGQREQ()");
81
82 /*
83 *-------------------------------------------------------------------
84 * check entity status
85 *-------------------------------------------------------------------
86 */
87 if( smEntStat.curCmd NEQ AT_CMD_NONE )
88
89 return( AT_BUSY );
90
91 /*
92 *-------------------------------------------------------------------
93 * check parameter
94 *-------------------------------------------------------------------
95 */
96 if ( (cid < GPRS_CID_OMITTED) || (cid >= GPRS_CID_INVALID) )
97 {
98 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
99 return AT_FAIL;
100 }
101
102 if ( qos )
103 {
104 if ( /* qos->preced < GPRS_QOS_OMITTED || */ qos->preced > 3 )
105 {
106 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
107 return( AT_FAIL );
108 }
109
110 if ( /* qos->delay < GPRS_QOS_OMITTED || */ qos->delay > 4 )
111 {
112 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
113 return( AT_FAIL );
114 }
115 if ( /* qos->relclass < GPRS_QOS_OMITTED || */ qos->relclass > 5 )
116 {
117 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
118 return( AT_FAIL );
119 }
120 if ( /* qos->peak < GPRS_QOS_OMITTED || */ qos->peak > 9 )
121 {
122 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
123 return( AT_FAIL );
124 }
125 if ( (/* qos->mean < GPRS_QOS_OMITTED || */ qos->mean > 18) && qos->mean NEQ 31 )
126 {
127 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
128 return( AT_FAIL );
129 }
130 }
131
132 /*
133 *-------------------------------------------------------------------
134 * process parameter
135 *-------------------------------------------------------------------
136 */
137 if (cid EQ GPRS_CID_OMITTED )
138 /*
139 * cid omitted: A special form of the set command that is not defined in the Spec.
140 * This set the default value of QoS.
141 */
142 {
143 cmhSM_change_def_QOS(qos);
144
145 }
146 else
147 {
148 c_state = get_state_over_cid( cid );
149
150 if ( !qos || (qos->preced EQ GPRS_QOS_OMITTED &&
151 qos->delay EQ GPRS_QOS_OMITTED &&
152 qos->relclass EQ GPRS_QOS_OMITTED &&
153 qos->peak EQ GPRS_QOS_OMITTED &&
154 qos->mean EQ GPRS_QOS_OMITTED ) )
155 { /* QoS omitted -> undefine the requested QOS */
156 if ( c_state NEQ CS_DEFINED )
157 {
158 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
159 return( AT_FAIL );
160 }
161
162 cmhSM_Set_default_QOS(cid);
163
164 }
165 else
166 { /* define the requested QOS */
167 if ( c_state NEQ CS_DEFINED )
168 {
169 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
170 return( AT_FAIL );
171 }
172
173 memcpy( &pdp_context[cid - 1].con.qos, qos, sizeof(T_QOS));
174 }
175 }
176
177 return AT_CMPL;
178 }
179
180 /*
181 +--------------------------------------------------------------------+
182 | PROJECT : GSM-PS (8441) MODULE : CMH_SMS |
183 | STATE : finnished ROUTINE : sAT_PlusCGQMIN |
184 +--------------------------------------------------------------------+
185
186 PURPOSE : This is the functional counterpart to the +CGQMIN= AT
187 command which sets the minimum acceptable QOS.
188 */
189 GLOBAL T_ACI_RETURN sAT_PlusCGQMIN
190 ( T_ACI_CMD_SRC srcId, SHORT cid ,T_QOS *qos)
191 {
192 T_CONTEXT_STATE c_state; /* state of context */
193
194 TRACE_FUNCTION ("sAT_PlusCGQMIN()");
195
196 /*
197 *-------------------------------------------------------------------
198 * check entity status
199 *-------------------------------------------------------------------
200 */
201 if( smEntStat.curCmd NEQ AT_CMD_NONE )
202
203 return( AT_BUSY );
204
205 /*
206 *-------------------------------------------------------------------
207 * check parameter
208 *-------------------------------------------------------------------
209 */
210 if ( (cid < GPRS_CID_OMITTED) || (cid >= GPRS_CID_INVALID) )
211 {
212 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
213 return AT_FAIL;
214 }
215
216 if ( qos )
217 {
218 if ( /* qos->preced < GPRS_QOS_OMITTED || */ qos->preced > 3 )
219 {
220 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
221 return( AT_FAIL );
222 }
223
224 if ( /* qos->delay < GPRS_QOS_OMITTED || */ qos->delay > 4 )
225 {
226 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
227 return( AT_FAIL );
228 }
229 if ( /* qos->relclass < GPRS_QOS_OMITTED || */ qos->relclass > 5 )
230 {
231 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
232 return( AT_FAIL );
233 }
234 if ( /* qos->peak < GPRS_QOS_OMITTED || */ qos->peak > 9 )
235 {
236 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
237 return( AT_FAIL );
238 }
239 if ( (/* qos->mean < GPRS_QOS_OMITTED || */ qos->mean > 18) && qos->mean NEQ 31 )
240 {
241 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
242 return( AT_FAIL );
243 }
244 }
245
246 /*
247 *-------------------------------------------------------------------
248 * process parameter
249 *-------------------------------------------------------------------
250 */
251 if (cid EQ GPRS_CID_OMITTED )
252 /*
253 * cid omitted: A special form of the set command that is not defined in the Spec.
254 * This set the default value of QoS.
255 */
256 {
257 cmhSM_change_def_QOS_min(qos);
258 }
259 else
260 {
261 c_state = get_state_over_cid( cid );
262
263 if ( !qos || (qos->preced EQ GPRS_QOS_OMITTED &&
264 qos->delay EQ GPRS_QOS_OMITTED &&
265 qos->relclass EQ GPRS_QOS_OMITTED &&
266 qos->peak EQ GPRS_QOS_OMITTED &&
267 qos->mean EQ GPRS_QOS_OMITTED ) )
268 { /* QoS omitted -> undefine the requested QOS */
269 if ( c_state NEQ CS_DEFINED )
270 {
271 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
272 return( AT_FAIL );
273 }
274
275 cmhSM_Set_default_QOS_min(cid);
276 }
277 else
278 { /* define the requested QOS */
279 if ( c_state NEQ CS_DEFINED )
280 {
281 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
282 return( AT_FAIL );
283 }
284
285 memcpy( &pdp_context[cid - 1].con.min_qos, qos, sizeof(T_QOS));
286 }
287
288 }
289
290 return AT_CMPL;
291 }
292
293 /*
294 +--------------------------------------------------------------------+
295 | PROJECT : GSM-PS (8441) MODULE : CMH_SMS |
296 | STATE : finnished ROUTINE : sAT_PlusCGDCONT |
297 +--------------------------------------------------------------------+
298
299 PURPOSE : This is the functional counterpart to the +CGDCONT= AT
300 command which sets the current setting for each context.
301
302 GACI Context Definition GSM - 7.60 10.2.1
303
304 Special case +CGDCONT=<n> undefines context n
305 is handled as separate function call
306
307 otherwise:
308
309 +CGDCONT=[<cid> [,<PDP_TYPE> [,<APN> [,<PDP_addr> [,<h_comp> [,<d_comp>]]]]]]
310
311 Issue of what happens if user changes data of an active context.
312
313 Take simple approach, do not renegotiate current context.
314 Undefinition is more complex, reject attempt if context is active?
315
316 Current pdp address is left alone and only reset when context is
317 explicitly undefined.
318 See GSM 7.60 10.2.7.
319
320 */
321 GLOBAL T_ACI_RETURN sAT_PlusCGDCONT ( T_ACI_CMD_SRC srcId, SHORT cid, T_GPRS_CONT_REC *inputCtxt)
322 {
323 T_CONTEXT_STATE c_state; /* state of context */
324 SHORT state = 0;
325
326 TRACE_FUNCTION ("sAT_PlusCGDCONT()");
327
328 /*
329 *-------------------------------------------------------------------
330 * check parameter
331 *-------------------------------------------------------------------
332 */
333 /* Daniel : to convert the lower-case "ip"
334 to the upper-case "IP" as a pdp type */
335 if (!strcmp(inputCtxt->pdp_type, "ip"))
336 strcpy(inputCtxt->pdp_type, "IP");
337 if ( (cid < GPRS_CID_OMITTED) || (cid >= GPRS_CID_INVALID) )
338 {
339 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
340 return AT_FAIL;
341 }
342
343 if ( inputCtxt->d_comp < CGDCONT_D_COMP_OMITTED || inputCtxt->d_comp >= CGDCONT_D_COMP_INVALID )
344 {
345 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
346 return( AT_FAIL );
347 }
348
349 /* right now data compression is not supported, remove this block if enabled in the future */
350 if ( inputCtxt->d_comp EQ CGDCONT_D_COMP_ON )
351 {
352 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
353 return( AT_FAIL );
354 }
355
356 if ( inputCtxt->h_comp < CGDCONT_H_COMP_OMITTED || inputCtxt->h_comp >= CGDCONT_H_COMP_INVALID )
357 {
358 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
359 return( AT_FAIL );
360 }
361
362 /*
363 *-------------------------------------------------------------------
364 * A special form of set command
365 *-------------------------------------------------------------------
366 */
367 if ( !(cid NEQ GPRS_CID_OMITTED &&
368 !*(inputCtxt->pdp_type) && !*(inputCtxt->apn) && !*(inputCtxt->pdp_addr) &&
369 inputCtxt->d_comp EQ CGDCONT_D_COMP_OMITTED && inputCtxt->h_comp EQ CGDCONT_H_COMP_OMITTED) )
370 {
371 /*
372 *-------------------------------------------------------------------
373 * check parameter
374 *-------------------------------------------------------------------
375 */
376 if ( !*(inputCtxt->pdp_type) && *(inputCtxt->pdp_addr) )
377 {
378 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
379 return AT_FAIL;
380 }
381
382 if ( *(inputCtxt->pdp_addr) && *(inputCtxt->pdp_type) )
383 if ( !cmhSM_pdp_addr_well_formed( cmhSM_transform_pdp_type( inputCtxt->pdp_type ), inputCtxt->pdp_addr ) )
384 {
385 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
386 return AT_FAIL;
387 }
388
389 if ( *(inputCtxt->apn) )
390 if ( !cmhSM_apn_well_formed( inputCtxt->apn ) )
391 {
392 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
393 return AT_FAIL;
394 }
395
396 /*
397 *-------------------------------------------------------------------
398 * default parameter
399 *-------------------------------------------------------------------
400 */
401 if ( inputCtxt->d_comp EQ CGDCONT_D_COMP_OMITTED )
402 inputCtxt->d_comp = CGDCONT_D_COMP_OFF;
403
404 if ( inputCtxt->h_comp EQ CGDCONT_H_COMP_OMITTED )
405 inputCtxt->h_comp = CGDCONT_H_COMP_OFF;
406
407 if ( cid EQ GPRS_CID_OMITTED )
408 {
409 do
410 {
411 c_state = get_state_over_cid( ++ cid );
412 }
413 while ( cid < GPRS_CID_INVALID && c_state NEQ CS_UNDEFINED );
414
415 if( c_state NEQ CS_UNDEFINED )
416 {
417 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
418 return( AT_FAIL );
419 }
420 }
421
422 if ( !*(inputCtxt->pdp_type) )
423 strcpy(inputCtxt->pdp_type, "IP");
424
425 state = 1;
426 }
427
428 /*
429 *-------------------------------------------------------------------
430 * process parameter
431 *-------------------------------------------------------------------
432 */
433 c_state = get_state_over_cid( cid );
434
435 switch ( state )
436 {
437
438 case 0: /* undefine a PDP context */
439 if ( c_state NEQ CS_DEFINED )
440 {
441 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotAllow );
442 return( AT_FAIL );
443 }
444
445 set_state_over_cid( cid, CS_UNDEFINED );
446
447 break;
448 case 1: /* define a PDP context */
449 switch(c_state)
450 {
451 /* every time allowed */
452 case CS_INVALID_STATE:
453 case CS_UNDEFINED:
454 case CS_DEFINED:
455 c_state = CS_DEFINED;
456 break;
457 /* allowed during context deactivation, but
458 WITHOUT state change */
459 case CS_ABORT_ESTABLISH:
460 case CS_DEACTIVATE_NORMAL:
461 case CS_BREAKDOWN_LINK_NORMAL:
462 case CS_BREAKDOWN_LINK_ERROR:
463 case CS_CONTEXT_REACTIVATION_1:
464 case CS_CONTEXT_REACTIVATION_2:
465 break;
466 /* Not allowed during context activation or
467 for activated context */
468 case CS_ATTACHING_AFTER_UNDEF:
469 case CS_ATTACHING_AFTER_DEF:
470 case CS_ESTABLISH_1:
471 case CS_ESTABLISH_2:
472 case CS_ESTABLISH_3:
473 case CS_WAITS_FOR_ACTIVATING:
474 case CS_ACTIVATING:
475 case CS_ACTIVATED:
476 case CS_DATA_LINK:
477 default:
478 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotAllow );
479 return( AT_FAIL );
480 }
481
482 sAT_PlusCGDCONT_exec(srcId, cid, inputCtxt);
483 set_state_over_cid( cid, c_state );
484
485 break;
486 }
487
488 return AT_CMPL;
489 }
490
491 GLOBAL void sAT_PlusCGDCONT_exec ( T_ACI_CMD_SRC srcId, SHORT cid, T_GPRS_CONT_REC *inputCtxt)
492 {
493 T_GPRS_CONT_REC *con = &pdp_context[cid - 1].con;
494
495 TRACE_FUNCTION("sAT_PlusCGDCONT_exec");
496
497 memcpy(&con->apn, &inputCtxt->apn, sizeof( T_APN ));
498 memcpy(&con->pdp_type, &inputCtxt->pdp_type, sizeof( T_PDP_TYPE ));
499 memcpy(&con->pdp_addr, &inputCtxt->pdp_addr, sizeof( T_PDP_ADDRESS ));
500 con->d_comp = inputCtxt->d_comp;
501 con->h_comp = inputCtxt->h_comp;
502
503 if ( CS_DEFINED NEQ get_state_over_cid( cid ) )
504 {
505 cmhSM_Set_default_QOS ( cid );
506 cmhSM_Set_default_QOS_min ( cid );
507 }
508
509 set_state_over_cid( cid, CS_DEFINED );
510
511 }
512
513 /*
514 +--------------------------------------------------------------------+
515 | PROJECT : GSM-PS (8441) MODULE : CMH_SMS |
516 | STATE : finnished ROUTINE : sAT_PlusCGACT |
517 +--------------------------------------------------------------------+
518
519 PURPOSE : This is the functional counterpart to the +CGACT= AT
520 command which causes the cids specified in the cids list to
521 be activated or deactivated according to state.
522
523 An empty list will cause all defined contexts to be
524 activated or deactivated. If taken literally, this means that
525 if more contexts are defined than supported, each will be
526 activated, resulting in 'no resource' errors for the late ones
527 as the GACI SEM will reject requests for more activations
528 than it can cope with.
529
530 Note that the context is/are activated, but no CONNECT is sent
531 to the TE. This is the difference between ACT and DATA commands.
532
533 SMREG activate req does not need l2p to be sent, but in this case
534 the PDP config options are undefined (see below).
535
536 How does a DATA call bind these 'orphan' connections to a TE given
537 that a cid definition is a 'template' due to its ambiguity.
538
539 Practically, the activate form of this command has little meaning in the
540 case of PPP and loopback protocols (only ones supported at present).
541
542 Simplest option at the moment is not to support the activate form until
543 a protocol type is supported can make real use of it. The deactivate form
544 is of use in switching off a Loopback connection.
545
546 If activation before protocol establishment is supported, a NULL protocol service
547 will have to be provided which supplies a default (empty?) PCO list to SMREG for
548 activation and stores the network PCO response until a CGDATA is issued, must then
549 convert the protocol into that requested by the CGDATA command.
550 For future implementation
551
552
553 Other issues for multiple context activation :
554
555 - need to add a para onto GACI activate to tell it whether
556 to do a CONNECT or an OK callback on activation.
557
558 */
559 GLOBAL T_ACI_RETURN sAT_PlusCGACT
560 ( T_ACI_CMD_SRC srcId, T_CGACT_STATE state, SHORT *cids )
561 {
562 T_CONTEXT_STATE ctx_state;
563 SHORT i = 0, j = 0;
564 int ret_val;
565 TRACE_FUNCTION ("sAT_PlusCGACT()");
566
567 /*
568 *-------------------------------------------------------------------
569 * check command source
570 *-------------------------------------------------------------------
571 */
572 if(!cmh_IsVldCmdSrc (srcId))
573 {
574 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
575 return( AT_FAIL );
576 }
577
578 /*
579 *-------------------------------------------------------------------
580 * check parameter
581 *-------------------------------------------------------------------
582 */
583 if ( (state < CGACT_STATE_OMITTED) || (state >= CGACT_STATE_INVALID) )
584 {
585 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
586 return AT_FAIL;
587 }
588
589 for (i = 0; cids[i] NEQ INVALID_CID; i++)
590 {
591 if ( (cids[i] < GPRS_CID_1 || cids[i] >= GPRS_CID_INVALID) || i >= MAX_CID_PLUS_EINS )
592 {
593 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
594 return( AT_FAIL );
595 }
596 }
597
598 /*
599 *-------------------------------------------------------------------
600 * default parameter
601 *-------------------------------------------------------------------
602 */
603 if ( state EQ CGACT_STATE_OMITTED )
604 { /* state is not optional */
605 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
606 return AT_FAIL;
607 }
608
609 /*
610 *-------------------------------------------------------------------
611 * enable +CGACT to deactivate a context during activation
612 *-------------------------------------------------------------------
613 */
614 if( CGACT_STATE_DEACTIVATED EQ state )
615 {
616 ret_val = cmhSM_deactivateContexts(srcId, cids);
617 switch(ret_val)
618 {
619 case AT_EXCT:
620 smEntStat.curCmd = AT_CMD_CGACT;
621 smEntStat.entOwn = srcId;
622 smShrdPrm.owner = (UBYTE) srcId;
623 return AT_EXCT;
624 default:
625 return ret_val;
626 }
627 }
628
629 /*
630 *-------------------------------------------------------------------
631 * check entity status
632 *-------------------------------------------------------------------
633 */
634 if( smEntStat.curCmd NEQ AT_CMD_NONE )
635 return( AT_BUSY );
636
637 if( gpppEntStat.curCmd EQ AT_CMD_CGDATA )
638 return( AT_BUSY );
639
640
641 /*
642 *-------------------------------------------------------------------
643 * process parameter
644 *-------------------------------------------------------------------
645 */
646
647 cid_pointer = 0;
648
649 if ( *cids EQ INVALID_CID ) /* all defined or activated contexts (dependent by state) */
650 {
651 for (i = 0; i < MAX_CID; i++)
652 {
653 if ( CS_DEFINED EQ get_state_over_cid((SHORT) (i + 1)) )
654 {
655 work_cids[j] = i + 1;
656 j++;
657 }
658 }
659 work_cids[j] = INVALID_CID;
660
661 if (!*work_cids)
662 return AT_CMPL;
663 }
664 else /* all declarated contexts */
665 {
666 /* copy cid list */
667 for (i = 0; cids[i] NEQ INVALID_CID; i++)
668 {
669 work_cids[i] = cids[i];
670 }
671 work_cids[i] = INVALID_CID;
672
673 for (j = 0; work_cids[j] NEQ INVALID_CID; j++)
674 {
675 ctx_state = get_state_over_cid( work_cids[j] );
676
677 if ( CS_UNDEFINED EQ ctx_state )
678 { /* context not defined */
679 sAT_PlusCGDCONT_exec (srcId, work_cids[j], &defaultCtx);
680 set_state_over_cid(work_cids[j], CS_UNDEFINED);
681 }
682 else if ( CS_DEFINED NEQ ctx_state )
683 {
684 cid_pointer = 0;
685 work_cids[0] = INVALID_CID;
686 return ( AT_FAIL );
687 }
688 }
689 }
690
691 /*
692 *-------------------------------------------------------------------
693 * check number of context
694 *-------------------------------------------------------------------
695 */
696 TRACE_EVENT("activating context!");
697 if ( TRUE NEQ srcc_reserve_sources( SRCC_NULL_SNDCP_LINK, j ) )
698 {
699 cid_pointer = 0;
700 *work_cids = 0;
701 return AT_FAIL;
702 }
703
704 smEntStat.curCmd = AT_CMD_CGACT;
705 smEntStat.entOwn = srcId;
706 smShrdPrm.owner = (UBYTE) srcId;
707
708 set_conn_param_on_all_working_cids( (UBYTE)srcId, DTI_ENTITY_NULL );
709 if (AT_FAIL EQ cmhSM_activate_context())
710 {
711 set_conn_param_on_all_working_cids( (UBYTE)srcId, DTI_ENTITY_INVALID );
712 smEntStat.curCmd = AT_CMD_NONE;
713 gpppEntStat.curCmd = AT_CMD_NONE;
714 cid_pointer = 0;
715 *work_cids = 0;
716 return AT_FAIL;
717 }
718
719 return AT_EXCT;
720 }
721
722 /*
723 +--------------------------------------------------------------------+
724 | PROJECT : GSM-PS (8441) MODULE : CMH_SMS |
725 | STATE : finnished ROUTINE : sAT_PlusCGDATA |
726 +--------------------------------------------------------------------+
727
728 PURPOSE : This is the functional counterpart to the +CGDATA= AT
729 command which establish the communication.
730 */
731 GLOBAL T_ACI_RETURN sAT_PlusCGDATA ( T_ACI_CMD_SRC srcId, char *L2P, SHORT *cids )
732 {
733 SHORT j = 0;
734 T_ACI_RETURN retCd = AT_CMPL; /* holds return code */
735 T_DTI_ENTITY_ID connectToEntity = DTI_ENTITY_INVALID;
736
737 TRACE_FUNCTION ("sAT_PlusCGDATA()");
738
739 /*
740 *-------------------------------------------------------------------
741 * check command source
742 *-------------------------------------------------------------------
743 */
744 if(!cmh_IsVldCmdSrc (srcId))
745 {
746 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
747 return( AT_FAIL );
748 }
749
750
751 /*
752 *-------------------------------------------------------------------
753 * check entity status
754 *-------------------------------------------------------------------
755 */
756 if( smEntStat.curCmd NEQ AT_CMD_NONE )
757 return( AT_BUSY );
758
759 if( gpppEntStat.curCmd NEQ AT_CMD_NONE )
760 return( AT_BUSY );
761
762 if (pb_get_fdn_mode () EQ FDN_ENABLE)
763 {
764 if (pb_check_fdn (0, (const UBYTE *)"*99#") NEQ PHB_OK)
765 {
766 TRACE_EVENT("sAT_PlusCGDATA: Entry not found in FDN, GPRS not allowed.");
767 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotAllow);
768 return (AT_FAIL);
769 }
770 TRACE_EVENT("sAT_PlusCGDATA: Entry found in FDN, GPRS allowed.");
771 }
772
773 /*
774 *-------------------------------------------------------------------
775 * check parameter
776 *-------------------------------------------------------------------
777 */
778 /*
779 * in maximum 1 cid allowed
780 */
781 if ( GPRS_CID_OMITTED NEQ cids[0] &&
782 GPRS_CID_OMITTED NEQ cids[1] )
783 {
784 return AT_FAIL;
785 }
786
787
788 if ( L2P[0] EQ 0 )
789 strcpy (L2P, "PPP"); /* default value */
790
791 if ( !strcmp(L2P, "PPP"))
792 {
793 if ( TRUE NEQ srcc_reserve_sources( SRCC_PPPS_SNDCP_LINK, 1 ) )
794 return ( AT_FAIL );
795
796 connectToEntity = DTI_ENTITY_PPPS;
797 }
798 #if defined(FF_PKTIO) OR defined(FF_TCP_IP) OR defined(FF_PSI)
799 else if( !strcmp(L2P, "M-PKT") OR !strcmp(L2P, "M-IP"))
800 {
801 if ( TRUE NEQ srcc_reserve_sources( SRCC_PKTIO_SNDCP_LINK, 1 ) )
802 return ( AT_FAIL );
803 }
804 #endif /* FF_PKTIO OR FF_TCP_IP OR FF_PSI */
805 else
806 {
807 return ( AT_FAIL );
808 }
809
810 /*
811 *-------------------------------------------------------------------
812 * process parameter
813 *-------------------------------------------------------------------
814 */
815 j = cmhSM_define_cid_list( srcId, cids );
816
817 if ( !j )
818 return( AT_FAIL );
819
820 /*
821 *-------------------------------------------------------------------
822 * process function
823 *-------------------------------------------------------------------
824 */
825 smShrdPrm.direc = DIREC_MO;
826
827 set_conn_param_on_working_cid( (UBYTE)srcId, connectToEntity );
828
829 if( DTI_ENTITY_PPPS EQ connectToEntity )
830 {
831 retCd = cmhGMM_attach_if_necessary( srcId, AT_CMD_CGDATA );
832 gpppEntStat.curCmd = AT_CMD_CGDATA;
833 gpppEntStat.entOwn = srcId;
834 gpppShrdPrm.owner = (UBYTE) srcId;
835 }
836 else if( DTI_ENTITY_INVALID EQ connectToEntity )
837 {
838 smEntStat.curCmd = AT_CMD_CGDATA;
839 smEntStat.entOwn = srcId;
840 smShrdPrm.owner = (UBYTE) srcId;
841 }
842
843 if ( retCd EQ AT_CMPL )
844 cmhSM_data_link_context();
845 else
846 {
847 if ( retCd EQ AT_EXCT )
848 switch ( get_state_working_cid() )
849 {
850 case CS_DEFINED:
851 set_state_working_cid( CS_ATTACHING_AFTER_DEF );
852 break;
853 case CS_UNDEFINED:
854 set_state_working_cid( CS_ATTACHING_AFTER_UNDEF );
855 break;
856 }
857 else
858 {
859 smEntStat.curCmd = AT_CMD_NONE;
860 gpppEntStat.curCmd = AT_CMD_NONE;
861 return AT_FAIL;
862 }
863 }
864
865 return AT_EXCT;
866 }
867
868 /*
869 +--------------------------------------------------------------------+
870 | PROJECT : GSM-PS (8441) MODULE : CMH_SMS |
871 | STATE : finnished ROUTINE : sAT_PlusCGPADDR |
872 +--------------------------------------------------------------------+
873
874 PURPOSE : This is the functional counterpart to the +CGPADDR= AT
875 command which give the PDP address back.
876 */
877 GLOBAL T_ACI_RETURN sAT_PlusCGPADDR ( T_ACI_CMD_SRC srcId, SHORT *cids, T_PDP_ADDRESS *pdp_adress )
878 {
879 SHORT cid = 1, index = 0;
880
881 TRACE_FUNCTION ("sAT_PlusCGPADDR()");
882
883 /*
884 *-------------------------------------------------------------------
885 * check entity status
886 *-------------------------------------------------------------------
887 */
888 if( smEntStat.curCmd NEQ AT_CMD_NONE )
889 return( AT_BUSY );
890
891 /*
892 *-------------------------------------------------------------------
893 * process parameter
894 *-------------------------------------------------------------------
895 */
896 if ( *cids EQ GPRS_CID_OMITTED )
897 {
898 /*
899 * the PDP addresse for all defined contexts are returned
900 */
901 for (cid = 1; cid <= MAX_CID; cid++)
902 {
903 cids[index] = cmhSM_get_pdp_addr_for_CGPADDR( cid, pdp_adress[index] );
904 if ( cids[index] NEQ INVALID_CID )
905 index ++;
906 }
907
908 cids[index] = INVALID_CID;
909 }
910 else
911 {
912 /*
913 * the PDP addresse for all specified contexts are returned
914 */
915 while ( cids[index] NEQ GPRS_CID_OMITTED )
916 {
917 if ( cids[index] < GPRS_CID_1 || cids[index] >= GPRS_CID_INVALID )
918 return AT_FAIL;
919
920 cmhSM_get_pdp_addr_for_CGPADDR( cids[index], pdp_adress[index] );
921 index ++;
922 }
923 cids[index] = INVALID_CID;
924 }
925
926 return AT_CMPL;
927 }
928
929 /*
930 +--------------------------------------------------------------------+
931 | PROJECT : GSM-PS (8441) MODULE : CMH_SMS |
932 | STATE : finnished ROUTINE : sAT_PlusCGAUTO |
933 +--------------------------------------------------------------------+
934
935 PURPOSE : This is the functional counterpart to the +CGAUTO= AT
936 command which set the mode of automatic response to
937 network request for PDP context activation.
938 */
939 GLOBAL T_ACI_RETURN sAT_PlusCGAUTO ( T_ACI_CMD_SRC srcId, T_CGAUTO_N n )
940 {
941 TRACE_FUNCTION ("sAT_PlusCGAUTO()");
942
943 /*
944 *-------------------------------------------------------------------
945 * check entity status
946 *-------------------------------------------------------------------
947 */
948 if( smEntStat.curCmd NEQ AT_CMD_NONE )
949
950 return( AT_BUSY );
951
952 /*
953 *-------------------------------------------------------------------
954 * check parameter
955 *-------------------------------------------------------------------
956 */
957 if ( (n < CGAUTO_N_OMITTED) || (n >= CGAUTO_N_INVALID) )
958 {
959 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
960 return AT_FAIL;
961 }
962
963 /*
964 *-------------------------------------------------------------------
965 * default parameter
966 *-------------------------------------------------------------------
967 */
968 if ( n EQ CGAUTO_N_OMITTED )
969 n = CGAUTO_N_MCM_GPRS_CSC;
970
971 /*
972 *-------------------------------------------------------------------
973 * process parameter
974 *-------------------------------------------------------------------
975 */
976 automatic_response_mode = (SHORT) n;
977
978 /* the MT shall attempt to perform a GPRS attach if it is not already attached */
979 if ( n EQ 1 )
980 {
981 return sAT_PlusCGATT ( srcId, CGATT_STATE_ATTACHED );
982 }
983 return AT_CMPL;
984 }
985
986 /*
987 +--------------------------------------------------------------------+
988 | PROJECT : GSM-PS (8441) MODULE : CMH_SMS |
989 | STATE : finnished ROUTINE : sAT_PlusCGANS |
990 +--------------------------------------------------------------------+
991
992 PURPOSE : This is the functional counterpart to the +CGANS= AT
993 command to respond manual to a network request for
994 PDP context activation.
995 */
996 GLOBAL T_ACI_RETURN sAT_PlusCGANS ( T_ACI_CMD_SRC srcId, SHORT response,
997 char *l2p, SHORT cid )
998 {
999 char L2P[MAX_L2P_LENGTH];
1000 T_GPRS_CONT_REC ctx = defaultCtx;
1001 SHORT i = 0, cid_list[2] = { INVALID_CID };
1002
1003 TRACE_FUNCTION ("sAT_PlusCGANS()");
1004
1005 /*
1006 *-------------------------------------------------------------------
1007 * check entity status
1008 *-------------------------------------------------------------------
1009 */
1010 if( smEntStat.curCmd NEQ AT_CMD_NONE )
1011
1012 return( AT_BUSY );
1013
1014 /*
1015 *-------------------------------------------------------------------
1016 * check command source
1017 *-------------------------------------------------------------------
1018 */
1019 if(!cmh_IsVldCmdSrc (srcId))
1020 {
1021 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1022 return( AT_FAIL );
1023 }
1024
1025 /*
1026 *-------------------------------------------------------------------
1027 * check parameter
1028 *-------------------------------------------------------------------
1029 */
1030 if ( (response <= CGANS_RESPONSE_OMITTED) || (response >= CGANS_RESPONSE_INVALID) )
1031 {
1032 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1033 return( AT_FAIL );
1034 }
1035
1036 /*
1037 *-------------------------------------------------------------------
1038 * default parameter
1039 *-------------------------------------------------------------------
1040 */
1041 if ( response EQ CGANS_RESPONSE_OMITTED )
1042 response = CGANS_RESPONSE_REJECT;
1043
1044 /*
1045 *-------------------------------------------------------------------
1046 * check call table
1047 *-------------------------------------------------------------------
1048 */
1049 if ( gprs_ct_index EQ current_gprs_ct_index )
1050 return ( AT_FAIL );
1051
1052 /*
1053 *-------------------------------------------------------------------
1054 * process parameter
1055 *-------------------------------------------------------------------
1056 */
1057 switch ( response )
1058 {
1059 case CGANS_RESPONSE_REJECT:
1060 psaSM_PDP_No_activate(gprs_call_table[current_gprs_ct_index].sm_ind.smreg_ti, SMREG_RC_ACT_REJ_UNSPEC);
1061
1062 cmhSM_next_call_table_entry();
1063
1064 #ifdef FF_ATI
1065 io_setRngInd ( IO_RING_OFF, CRING_TYP_NotPresent, CRING_TYP_NotPresent ); /* V.24 Ring Indicator Line */
1066 #endif
1067
1068 for( i = 0; i < CMD_SRC_MAX; i++ )
1069 {
1070 R_AT( RAT_CRING_OFF, i )( 0 );
1071 }
1072 return AT_CMPL;
1073 case CGANS_RESPONSE_ACCEPT:
1074 /*
1075 *-------------------------------------------------------------------
1076 * check number of context
1077 *-------------------------------------------------------------------
1078 */
1079 if ( TRUE NEQ srcc_reserve_sources( SRCC_PPPS_SNDCP_LINK, 1 ) )
1080 return ( AT_FAIL );
1081 /*
1082 *-------------------------------------------------------------------
1083 * check the last two command arguments
1084 *-------------------------------------------------------------------
1085 */
1086 if ( !gprs_call_table[current_gprs_ct_index].L2P[0] )
1087 {
1088 if ( l2p NEQ NULL )
1089 {
1090 if ( !*l2p )
1091 strcpy(L2P, "PPP");
1092 else
1093 {
1094 strncpy(L2P, l2p, MAX_L2P_LENGTH - 1);
1095 L2P[MAX_L2P_LENGTH - 1] = 0;
1096 }
1097 }
1098 else
1099 strcpy(L2P, "PPP");
1100
1101 if ( strcmp(L2P, "PPP") )
1102 {
1103 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1104 return( AT_FAIL );
1105 }
1106
1107 cid_list[0] = cid;
1108 }
1109 else
1110 {
1111 cid_list[0] = gprs_call_table[current_gprs_ct_index].cid;
1112 }
1113
1114 if ( 1 NEQ cmhSM_define_cid_list( srcId, cid_list ))
1115 return( AT_FAIL );
1116
1117 /*
1118 *-------------------------------------------------------------------
1119 * set the actually context data
1120 *-------------------------------------------------------------------
1121 */
1122 /* ctx.qos.preced = gprs_call_table[current_gprs_ct_index].sm_ind.smreg_qos.preced;
1123 ctx.qos.delay = gprs_call_table[current_gprs_ct_index].sm_ind.smreg_qos.delay;
1124 ctx.qos.relclass = gprs_call_table[current_gprs_ct_index].sm_ind.smreg_qos.relclass;
1125 ctx.qos.peak = gprs_call_table[current_gprs_ct_index].sm_ind.smreg_qos.peak;
1126 ctx.qos.mean = gprs_call_table[current_gprs_ct_index].sm_ind.smreg_qos.mean;*/
1127
1128 strncpy(ctx.apn,
1129 (const char *) gprs_call_table[current_gprs_ct_index].sm_ind.smreg_apn.buffer,
1130 gprs_call_table[current_gprs_ct_index].sm_ind.smreg_apn.c_buffer);
1131 if ( 4 EQ gprs_call_table[current_gprs_ct_index].sm_ind.pdp_address.c_buff )
1132 sprintf(ctx.pdp_addr, "%03hd.%03hd.%03hd.%03hd",
1133 gprs_call_table[current_gprs_ct_index].sm_ind.pdp_address.buff[0],
1134 gprs_call_table[current_gprs_ct_index].sm_ind.pdp_address.buff[1],
1135 gprs_call_table[current_gprs_ct_index].sm_ind.pdp_address.buff[2],
1136 gprs_call_table[current_gprs_ct_index].sm_ind.pdp_address.buff[3]);
1137 else
1138 return( AT_FAIL );
1139
1140 switch ( gprs_call_table[current_gprs_ct_index].sm_ind.pdp_type )
1141 {
1142 case X_121:
1143 return( AT_FAIL );
1144 case IP_V_4:
1145 strcpy(ctx.pdp_type, "IP");
1146 break;
1147 case IP_V_6:
1148 return( AT_FAIL );
1149 default:
1150 return( AT_FAIL );
1151 }
1152
1153 /*
1154 *-------------------------------------------------------------------
1155 * set some parameter of the call table
1156 *-------------------------------------------------------------------
1157 */
1158 if ( !gprs_call_table[current_gprs_ct_index].L2P[0])
1159 {
1160 /*lint -e{645} */ /* L2P is initialized within the same if-construct some lines above */
1161 strcpy (gprs_call_table[current_gprs_ct_index].L2P, L2P);
1162 gprs_call_table[current_gprs_ct_index].cid = *cid_list;
1163 }
1164
1165 sAT_PlusCGDCONT_exec (srcId, *cid_list, &ctx);
1166
1167 pdp_context[*cid_list - 1].smreg_ti = gprs_call_table[current_gprs_ct_index].sm_ind.smreg_ti;
1168
1169 /*
1170 *-------------------------------------------------------------------
1171 * process function
1172 *-------------------------------------------------------------------
1173 */
1174 gpppEntStat.curCmd = AT_CMD_CGDATA;
1175 gpppEntStat.entOwn = srcId;
1176 gpppShrdPrm.owner = (UBYTE) srcId;
1177
1178 smShrdPrm.direc = DIREC_MT;
1179
1180 set_conn_param_on_working_cid( (UBYTE)srcId, DTI_ENTITY_PPPS );
1181
1182 cmhSM_data_link_context();
1183 return AT_EXCT;
1184 }
1185
1186 return AT_FAIL;
1187 }
1188
1189 GLOBAL T_ACI_RETURN sAT_PlusCGEREP ( T_ACI_CMD_SRC srcId, T_CGEREP_MODE mode, T_CGEREP_BFR bfr )
1190 {
1191
1192 TRACE_FUNCTION ("sAT_PlusCGEREP()");
1193
1194 /*
1195 *-------------------------------------------------------------------
1196 * check entity status
1197 *-------------------------------------------------------------------
1198 */
1199 if( smEntStat.curCmd NEQ AT_CMD_NONE )
1200 return( AT_BUSY );
1201
1202 /*
1203 *-------------------------------------------------------------------
1204 * check first command argument
1205 *-------------------------------------------------------------------
1206 */
1207 if ( mode < CGEREP_MODE_OMITTED || mode >= CGEREP_MODE_INVALID )
1208 {
1209 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1210 return( AT_FAIL );
1211 }
1212
1213 if ( bfr < CGEREP_BFR_OMITTED || bfr >= CGEREP_BFR_INVALID )
1214 {
1215 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1216 return( AT_FAIL );
1217 }
1218
1219 /*
1220 *-------------------------------------------------------------------
1221 * process parameter
1222 *-------------------------------------------------------------------
1223 */
1224
1225 if ( mode NEQ CGEREP_MODE_OMITTED )
1226 ati_user_output_cfg[srcId].CGEREP_mode = mode;
1227
1228 if ( bfr NEQ CGEREP_BFR_OMITTED )
1229 ati_user_output_cfg[srcId].CGEREP_bfr = bfr;
1230
1231 switch ( mode )
1232 {
1233 case CGEREP_MODE_BUFFER:
1234 case CGEREP_MODE_DICARD_RESERVED:
1235 srcId_cb = srcId;
1236 cmhSM_cgerep_buffer ( );
1237 break;
1238 case CGEREP_MODE_BUFFER_RESERVED:
1239 break;
1240 case CGEREP_MODE_INVALID:
1241 case CGEREP_MODE_OMITTED:
1242 default:
1243 break;
1244 }
1245
1246 return AT_CMPL;
1247 }
1248
1249 #ifdef DTI
1250 GLOBAL T_ACI_RETURN sAT_PlusCGSMS ( T_ACI_CMD_SRC srcId, T_CGSMS_SERVICE service )
1251 {
1252 T_ACI_RETURN retCd = AT_CMPL; /* holds return code */
1253
1254 TRACE_FUNCTION ("sAT_PlusCGSMS()");
1255
1256 /*
1257 *-------------------------------------------------------------------
1258 * check entity status
1259 *-------------------------------------------------------------------
1260 */
1261 if( smEntStat.curCmd NEQ AT_CMD_NONE )
1262
1263 return( AT_BUSY );
1264
1265 /*
1266 *-------------------------------------------------------------------
1267 * check first command argument
1268 *-------------------------------------------------------------------
1269 */
1270 if ( service < CGSMS_SERVICE_OMITTED || service >= CGSMS_SERVICE_INVALID )
1271 {
1272 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1273 return( AT_FAIL );
1274 }
1275
1276 /*
1277 *-------------------------------------------------------------------
1278 * process parameter
1279 *-------------------------------------------------------------------
1280 */
1281 if ( service EQ CGSMS_SERVICE_OMITTED )
1282 service = sm_cgsms_service;
1283
1284 if ( service NEQ sm_cgsms_service )
1285 {
1286 smEntStat.curCmd = AT_CMD_CGSMS;
1287 smEntStat.entOwn = srcId;
1288 smShrdPrm.owner = (UBYTE) srcId;
1289
1290 cmhSM_set_sms_service ( service );
1291
1292 retCd = AT_EXCT;
1293 }
1294
1295 return retCd;
1296 }
1297 #endif
1298 /*
1299 +--------------------------------------------------------------------+
1300 | PROJECT : GSM-PS (8441) MODULE : CMH_SMS |
1301 | STATE : finished ROUTINE : string_to_dns |
1302 +--------------------------------------------------------------------+
1303
1304 PURPOSE :
1305 */
1306 LOCAL void string_to_dns(CHAR* dns, ULONG *dns_long)
1307 {
1308 UBYTE dns_len = 4;
1309 CHAR dns_adrtest[3];
1310 UBYTE dns_adr [4];
1311 UBYTE i = 0;
1312
1313 memset(&dns_adrtest,0,dns_len-1);
1314 memset(&dns_adr,0,dns_len);
1315
1316 if(strlen(dns) NEQ 0)
1317 {
1318 for(i=0;i<dns_len;i++)
1319 {
1320 strncpy(dns_adrtest,dns,dns_len-1);
1321 dns_adr[i] = (UBYTE)atoi(dns_adrtest);
1322 dns = dns+dns_len;
1323 }
1324 for(i=0;i<dns_len;i++)
1325 {
1326 *dns_long= *dns_long + dns_adr[i];
1327 if (i<(dns_len-1))
1328 *dns_long = *dns_long<<8;
1329 }
1330 }
1331 }
1332
1333 /*
1334 +--------------------------------------------------------------------+
1335 | PROJECT : GSM-PS (8441) MODULE : CMH_SMS |
1336 | STATE : finished ROUTINE : sAT_PercentCGPCO |
1337 +--------------------------------------------------------------------+
1338
1339 PURPOSE : This is the functional counterpart to the ?CGPCO= AT
1340 command to set protocol configuration options for the
1341 PDP context activation.
1342 */
1343
1344 GLOBAL T_ACI_RETURN sAT_PercentCGPCO (T_ACI_CMD_SRC srcId,
1345 SHORT cid, USHORT protocol,
1346 CHAR *user, CHAR *pwd, CHAR *dns1, CHAR *dns2)
1347 {
1348 USHORT pco_len = ACI_PCO_MAX_LEN;
1349 UBYTE *pco_array;
1350 int i, ret;
1351 ULONG dns_adr1 = 0x00000000;
1352 ULONG dns_adr2 = 0x00000000;
1353
1354
1355 TRACE_FUNCTION("sAT_PercentCGPCO");
1356
1357 ACI_MALLOC (pco_array, ACI_PCO_MAX_LEN);
1358
1359 string_to_dns(dns1,&dns_adr1);
1360 string_to_dns(dns2,&dns_adr2);
1361
1362 ret = utl_create_pco (pco_array, &pco_len,
1363 ACI_PCO_CONTENTMASK_AUTH |
1364 ACI_PCO_CONTENTMASK_DNS1 |
1365 ACI_PCO_CONTENTMASK_DNS2,
1366 ACI_PCO_CONFIG_PROT_PPP,
1367 protocol, (UBYTE*)user, (UBYTE*)pwd, dns_adr1, dns_adr2);
1368 if (ret < 0)
1369 {
1370 TRACE_EVENT_P1 ("sAT_PercentCGPCO(): invalid protocol=%d", protocol);
1371 ACI_MFREE (pco_array);
1372
1373 return (AT_FAIL);
1374 }
1375 if (cid EQ 0)
1376 {
1377 for (i = 0; i < MAX_CID; i++)
1378 {
1379 pdp_context[i].user_pco.len = (UBYTE)pco_len;
1380 memcpy (pdp_context[i].user_pco.pco, pco_array, pco_len);
1381 }
1382 }
1383 else
1384 {
1385 pdp_context[cid - 1].user_pco.len = (UBYTE)pco_len;
1386 memcpy (pdp_context[cid - 1].user_pco.pco, pco_array, pco_len);
1387 }
1388
1389 ACI_MFREE (pco_array);
1390
1391 return (AT_CMPL);
1392 }
1393
1394 /*
1395 +--------------------------------------------------------------------+
1396 | PROJECT : GPRS MODULE : CMH_SMS |
1397 | STATE : finished ROUTINE : qAT_PercentCGPCO |
1398 +--------------------------------------------------------------------+
1399
1400 PURPOSE : %CGPCO command
1401 * analyze network PCO a cid
1402 */
1403
1404 GLOBAL T_ACI_RETURN qAT_PercentCGPCO ( UBYTE srcId, ULONG * gateway,
1405 ULONG * dns1,ULONG * dns2, USHORT cid)
1406 {
1407
1408 TRACE_FUNCTION("qAT_PercentCGPCO");
1409
1410 switch(pdp_context[cid - 1].state)
1411 {
1412 case CS_ACTIVATED:
1413 case CS_ESTABLISH_3:
1414 case CS_DATA_LINK:
1415 utl_analyze_pco((UBYTE*)pdp_context[cid - 1].network_pco.pco, (USHORT)pdp_context[cid - 1].network_pco.len, dns1, dns2, gateway);
1416 break;
1417 default:
1418 break;
1419 }
1420 return (AT_CMPL);
1421 }
1422
1423
1424 #endif /* GPRS */
1425 /*==== EOF ========================================================*/