comparison gsm-fw/g23m-aci/aci/psa_tcpipf.c @ 775:eedbf248bac0

gsm-fw/g23m-aci subtree: initial import from LoCosto source
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Sun, 12 Oct 2014 01:45:14 +0000
parents
children
comparison
equal deleted inserted replaced
774:40a721fd9854 775:eedbf248bac0
1 /*
2 +-----------------------------------------------------------------------------
3 | Project : WAPoverGPRS
4 | Modul : PSA_TCPIPF
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 : Functions for interfacing to TCP/IP-related entities. At
18 | the moment, these are IP(v4) and UDP. In the future, TCP and IPv6
19 | and perhaps others will follow, so we try to be as general as
20 | possible.
21 |
22 | Main exports:
23 | psaTCPIP_Activate()
24 | psaTCPIP_Configure()
25 | psaTCPIP_Deactivate()
26 |
27 | Declarations and definitions are in psa_tcpip.h.
28 +-----------------------------------------------------------------------------
29 */
30 #if defined (CO_UDP_IP) || defined (FF_GPF_TCPIP)
31
32 #ifndef PSA_TCPIPF_C
33 #define PSA_TCPIPF_C
34 #endif /* !PSA_TCPIPF_C */
35
36 #include "aci_all.h"
37 /*==== INCLUDES ===================================================*/
38 #include "dti.h" /* functionality of the dti library */
39 #include "dti_conn_mng.h"
40 #include "aci_cmh.h"
41 #include "ati_cmd.h"
42 #include "aci_cmd.h"
43 #include "aci_fd.h"
44 #include "psa.h"
45 #include "psa_tcpip.h"
46 #include "psa_cc.h"
47 #include "cmh.h"
48 #include "psa_ra.h"
49 #include "cmh_ra.h"
50 #include "cmh_l2r.h"
51
52 #include "ksd_utl.h"
53
54 #if defined (FF_SAT_E)
55 #include "cmh_cc.h"
56 #include "psa_sat.h"
57 #endif /* SAT E */
58
59 #ifdef FF_GPF_TCPIP
60 #include "dcm_utils.h"
61 #include "dcm_state.h"
62 #include "dcm_env.h"
63 #endif
64 #include "dcm_f.h"
65
66
67
68 /*==== CONSTANTS ==================================================*/
69
70 /*==== TYPES ======================================================*/
71
72
73 /*==== EXPORT =====================================================*/
74 GLOBAL void psaTCPIP_Initialize_Req(void);
75 GLOBAL void psaTCPIP_Shutdown_Req(void);
76 GLOBAL void psaTCPIP_Config (ULONG ipaddr, ULONG dns1, ULONG dns2, UBYTE dirc);
77 GLOBAL ULONG bytes2ipv4addr(UBYTE *host);
78
79 /*==== VARIABLES ==================================================*/
80
81 /*==== FUNCTIONS ==================================================*/
82
83 /* Convert an IP address in an array of 4 bytes (network order
84 * assumed) into an unsigned long value representing the same IP
85 * address, also in network order. This is purely a matter of
86 * alignment, so a simple copy will do.
87 */
88 ULONG psaTCPIP_bytes2ipv4addr(UBYTE *ip_address)
89 {
90 ULONG result;
91 UBYTE i;
92 BYTE buf[4];
93
94 for (i=0; i<4; i++)
95 {
96 utl_string2Byte ((CHAR*)(ip_address+(i*4)), 3, &buf[3-i]);
97 }
98 memcpy(&result, buf, 4);
99 return result;
100 }
101
102 GLOBAL char* wap_state_to_string(T_ACI_WAP_STATES wap_state)
103 {
104 switch(wap_state)
105 {
106 case Wap_Not_Init: return "wap-not_init";
107 #ifdef FF_GPF_TCPIP
108 case TCPIP_Initialization: return "TCPIP_Initialization";
109 case TCPIP_Initialized: return "TCPIP_Initialized";
110 case TCPIP_Activation: return "TCPIP_Activation";
111 case TCPIP_Activated: return "TCPIP_Activated";
112 #endif /*FF_GPF_TCPIP*/
113 case UDPA_Activation: return "UDPA_Activation";
114 case UDPA_Activated: return "UDPA_Activated";
115 case IPA_Activation: return "IPA_Activation";
116 case IPA_Activated: return "IPA_Activated";
117 case IPA_Configuration: return "IPA_Configuration";
118 case IPA_Configurated: return "IPA_Configurated";
119 case UDPA_Configuration: return "UDPA_Configuration";
120 case UDPA_Configurated: return "UDPA_Configurated";
121 #ifdef FF_GPF_TCPIP
122 case TCPIP_Configuration: return "TCPIP_Configuration";
123 case TCPIP_Configurated: return "TCPIP_Configurated";
124 #endif /*FF_GPF_TCPIP*/
125 case IPA_Deconfiguration: return "IPA_Deconfiguration";
126 case IPA_Deconfigurated: return "IPA_Deconfigurated";
127 case UDPA_Deconfiguration: return "UDPA_Deconfiguration";
128 case UPDA_Deconfigurated: return "UPDA_Deconfigurated";
129 #ifdef FF_GPF_TCPIP
130 case TCPIP_Deconfiguration: return "TCPIP_Deconfiguration";
131 case TCPIP_Deconfigurated: return "TCPIP_Deconfigurated";
132 case TCPIP_Deactivation: return "TCPIP_Deactivation";
133 case TCPIP_Deactivated: return "TCPIP_Deactivated";
134 #endif /*FF_GPF_TCPIP*/
135 case UDPA_Deactivation: return "UDPA_Deactivation";
136 case UDPA_Deactivated: return "UDPA_Deactivated";
137 case IPA_Deactivation: return "IPA_Deactivation";
138 case IPA_Deactivated: return "IPA_Deactivated";
139 default: return "<Unknown wap_state>";
140 }
141 }
142
143
144 /*
145 +-------------------------------------------------------------------+
146 | PROJECT : WAPoverGPRS MODULE : PSA_TCPIP |
147 | ROUTINE : psaTCPIP_Init |
148 +-------------------------------------------------------------------+
149
150 PURPOSE : Initialize the protocol stack adapter for TCP/IP.
151
152 */
153 GLOBAL void psaTCPIP_Init(void)
154 {
155 memset (&tcpipShrdPrm, 0, sizeof (T_TCPIP_SHRD_PRM));
156 wap_state = Wap_Not_Init ; /* This is redundant at the moment,
157 * but will be set only here
158 * eventually. */
159 tcpipShrdPrm.connection_type = TCPIP_CONNECTION_TYPE_UNKNOWN;
160 tcpipShrdPrm.connection_buildup = TCPIP_CONNECTION_BUILDUP_UNKNOWN;
161 }
162
163
164 /* Activate TCP/IP-related entities. See psa_tcpip.h for a detailed
165 * description.
166 */
167 void psaTCPIP_Activate(UBYTE src_id,
168 UBYTE dti_id,
169 SHORT wap_call_id,
170 UBYTE options,
171 UBYTE connection_type,
172 void (*callback_function)(T_ACI_RETURN result))
173 {
174 /* The `options' parameter is not yet used, since we have only UDP
175 * and IPv4. This will change in the future, including related
176 * changes to other parts of the ACI. (At the moment the completion
177 * of UDP activation calls IP activation directly, but this will
178 * have to be torn apart. [ni 2001-10-02]
179 */
180
181 TRACE_FUNCTION ("psaTCPIP_Activate()") ;
182
183 tcpipShrdPrm.src_id = src_id ;
184 tcpipShrdPrm.connection_type = connection_type;
185 tcpipShrdPrm.connection_buildup = TCPIP_CONNECTION_BUILDUP_UP;
186 tcpipShrdPrm.wap_call_id = wap_call_id ;
187 tcpipShrdPrm.options = options ;
188 tcpipShrdPrm.callback_function = callback_function ;
189
190 if(is_gpf_tcpip_call()) {
191 GPF_TCPIP_STATEMENT(wap_state = TCPIP_Initialization);
192 psaTCPIP_config_dispatch();
193 }
194 else {
195 wap_state = Wap_Not_Init ;
196 psaUDPIP_config_dispatch();
197 }
198 }
199
200
201 /* Configure TCP/IP-related entities.
202 */
203 void psaTCPIP_Configure(UBYTE *ip_address,
204 void *pdp_addrp,
205 UBYTE *peer_address,
206 UBYTE *dns1,
207 UBYTE *dns2,
208 short mtu,
209 void (*callback_function)(T_ACI_RETURN result))
210 {
211 TRACE_FUNCTION("psaTCPIP_Configure()") ;
212
213 if (ip_address AND pdp_addrp) {
214 TRACE_ERROR("psaTCPIP_Configure(): both ip_address and pdp_addrp non-null!") ;
215 return ;
216 }
217
218 if (!ip_address AND !pdp_addrp) {
219 TRACE_ERROR("psaTCPIP_Configure(): both ip_address and pdp_addrp null!") ;
220 return ;
221 }
222
223 if (ip_address) /* From PPP, IP over CSD. */
224 {
225 memcpy(tcpipShrdPrm.ipaddr, ip_address, 16) ;
226 }
227 #ifdef GPRS
228 else if (pdp_addrp) /* From SNDCP, IP over GPRS. */
229 {
230 memcpy(tcpipShrdPrm.ipaddr, pdp_addrp, 16/*sizeof(tcpipShrdPrm.ipaddr)*/);
231 }
232 #endif
233
234 if (peer_address) {
235 memcpy(tcpipShrdPrm.peer_addr, peer_address, 16) ;
236 }
237 if(dns1) {
238 memcpy(tcpipShrdPrm.dns1,dns1,16);
239 }
240
241 if(dns2) {
242 memcpy(tcpipShrdPrm.dns2,dns2,16);
243 }
244 tcpipShrdPrm.mtu = mtu ;
245 tcpipShrdPrm.callback_function = callback_function ;
246
247 if(is_gpf_tcpip_call()) {
248 GPF_TCPIP_STATEMENT(wap_state = TCPIP_Configuration);
249 psaTCPIP_config_dispatch();
250 }
251 else {
252 wap_state = IPA_Configuration ;
253 psaUDPIP_config_dispatch();
254 }
255 }
256
257
258 /* Deactivate TCP/IP-related entities.
259 */
260 void psaTCPIP_Deactivate(void (*callback_function)(T_ACI_RETURN result))
261 {
262 TRACE_FUNCTION("psaTCPIP_Deactivate()") ;
263 TRACE_EVENT_P1("wap_state: %d", wap_state) ;
264
265 tcpipShrdPrm.connection_buildup = TCPIP_CONNECTION_BUILDUP_DOWN;
266 tcpipShrdPrm.callback_function = callback_function ;
267
268 if(is_gpf_tcpip_call()) {
269 #ifdef FF_GPF_TCPIP
270 if ( wap_state EQ TCPIP_Configurated ) {
271 wap_state = TCPIP_Deconfiguration ;
272 }
273 #endif
274 psaTCPIP_config_dispatch() ;
275 }
276 else {
277 if ( wap_state EQ UDPA_Configurated ) {
278 wap_state = IPA_Deconfiguration ;
279 }
280 psaUDPIP_config_dispatch();
281 }
282 }
283
284
285 /********************** Dispatcher functions **********************/
286
287 /* State machine for UDP/TCP/IP activation, configuration, and
288 * deactivation. At the moment some of this is still handled elsewhere
289 * in the ACI (see comments to psaTCPIP_Configure() and
290 * psaTCPIP_Activate() above), but I plan to tear this apart and keep
291 * all control over these activities in this place, including status
292 * checks and transitions. [ni 2001-10-02]
293 */
294
295 void psaUDPIP_config_dispatch(void)
296 {
297 #ifdef CO_UDP_IP // to avoid linker errors in simulation
298
299 TRACE_FUNCTION("psaUDPIP_config_dispatch()") ;
300 TRACE_EVENT_P1("wap_state: %s", wap_state_to_string(wap_state)) ;
301 switch (wap_state)
302 {
303 /* Entry point for activation. */
304 case Wap_Not_Init:
305 cmhUDPA_Activate((T_ACI_CMD_SRC)tcpipShrdPrm.src_id, tcpipShrdPrm.wap_call_id) ;
306 break ;
307 case UDPA_Activation: /* Unused at the moment; handled elsewhere. */
308 break ;
309 case UDPA_Activated: /* Unused at the moment; handled elsewhere. */
310 break ;
311 case IPA_Activation: /* Unused at the moment; handled elsewhere. */
312 break ;
313 case IPA_Activated:
314 switch (tcpipShrdPrm.connection_buildup)
315 {
316 case TCPIP_CONNECTION_BUILDUP_UP:
317 if (tcpipShrdPrm.callback_function)
318 {
319 tcpipShrdPrm.callback_function(AT_CMPL) ;
320 }
321 break ;
322 case TCPIP_CONNECTION_BUILDUP_DOWN:
323 cmhUDPA_Deactivate(tcpipShrdPrm.src_id);
324 break;
325 default:
326 TRACE_ERROR("Unknown build up state in psaTCPIP_config_dispatch()");
327 return;
328 }
329 break;
330 /* Entry point for configuration. */
331 case IPA_Configuration:
332 switch (tcpipShrdPrm.connection_buildup)
333 {
334 case TCPIP_CONNECTION_BUILDUP_UP:
335 psaIPA_Config(psaTCPIP_bytes2ipv4addr(tcpipShrdPrm.ipaddr),
336 tcpipShrdPrm.mtu, IPA_CONN) ;
337 break;
338 case TCPIP_CONNECTION_BUILDUP_DOWN:
339 psaIPA_Config(psaTCPIP_bytes2ipv4addr(tcpipShrdPrm.ipaddr),
340 tcpipShrdPrm.mtu, IPA_DSC) ;
341 break;
342 default:
343 TRACE_ERROR("Unknown build up state in psaTCPIP_config_dispatch()");
344 return;
345 }
346 break;
347 case IPA_Configurated: /* Unused at the moment; handled elsewhere. */
348 break ;
349 case UDPA_Configuration: /* Unused at the moment; handled elsewhere. */
350 break ;
351 case UDPA_Configurated:
352 if (tcpipShrdPrm.callback_function)
353 {
354 tcpipShrdPrm.callback_function(AT_CMPL) ;
355 }
356 break ;
357
358 /* Entry point for deactivation. */
359 case IPA_Deconfiguration:
360 psaIPA_Config(0, 0, IPA_DSC) ;
361 break ;
362 case IPA_Deconfigurated: /* Unused at the moment; handled elsewhere. */
363 break ;
364 case UDPA_Deactivation: /* Unused at the moment; handled elsewhere. */
365 #if defined (FF_SAT_E)
366 /* If transport layer is UDP, reset wap_call flag
367 UDP is not busy anymore */
368 if( satShrdPrm.chnTb.chnTPL EQ UDP )
369 {
370 sAT_PercentWAP ( CMD_SRC_NONE, 0 );
371 }
372 #endif /* SAT E */
373 break ;
374 case UDPA_Deactivated: /* Unused at the moment; handled elsewhere. */
375 break ;
376 case IPA_Deactivation:
377 wap_state = IPA_Deactivated ;
378 tcpipShrdPrm.connection_type = TCPIP_CONNECTION_TYPE_UNKNOWN;
379
380 if (tcpipShrdPrm.callback_function)
381 {
382 tcpipShrdPrm.callback_function(AT_CMPL) ;
383 }
384 /*lint -fallthrough*/
385 case IPA_Deactivated:
386 wap_state = Wap_Not_Init ;
387
388 if(ccShrdPrm.wapStat EQ CC_WAP_STACK_DOWN)
389 {
390 /* WAP-dedicated variables shall be reinitialized */
391 wapId = NO_ENTRY;
392 Wap_Call = FALSE;
393
394 TRACE_EVENT ("WAP parameter reseted");
395 }
396 break ;
397
398 default:
399 TRACE_ERROR("Unknown wap state in psaTCPIP_config_dispatch()") ;
400 }
401 #else
402 ACI_ASSERT(FALSE);
403 #endif
404 }
405
406
407 /******************************************************************************/
408 void psaTCPIP_config_dispatch(void)
409 {
410 #ifdef FF_GPF_TCPIP // to avoid linker errors in simulation
411
412 TRACE_FUNCTION("psaTCPIP_config_dispatch()") ;
413 TRACE_EVENT_P1("wap_state: %s", wap_state_to_string(wap_state)) ;
414 switch (wap_state)
415 {
416 case TCPIP_Initialization :
417 switch(tcpipShrdPrm.connection_buildup)
418 {
419 case TCPIP_CONNECTION_BUILDUP_UP:
420 psaTCPIP_Initialize_Req();
421 break;
422
423 case TCPIP_CONNECTION_BUILDUP_DOWN:
424 psaTCPIP_Shutdown_Req();
425 break;
426
427 default:
428 TRACE_ERROR("Error: Unknown build_up state in psaTCPIP_config_dispatch()");
429 return;
430 }
431
432 case TCPIP_Initialized :
433 break;
434
435 case TCPIP_Activation :
436 switch(tcpipShrdPrm.connection_buildup)
437 {
438 case TCPIP_CONNECTION_BUILDUP_UP:
439 if(tcpipShrdPrm.callback_function)
440 {
441 tcpipShrdPrm.callback_function(AT_CMPL);
442 }
443 break ;
444
445 case TCPIP_CONNECTION_BUILDUP_DOWN:
446 wap_state = TCPIP_Deactivation;
447 psaTCPIP_Shutdown_Req();
448 break;
449
450 default:
451 TRACE_ERROR("Error: Unknown build up state in psaTCPIP_config_dispatch()");
452 return;
453 }
454 break;
455
456 case TCPIP_Configuration:
457 switch(tcpipShrdPrm.connection_buildup)
458 {
459 case TCPIP_CONNECTION_BUILDUP_UP:
460 psaTCPIP_Config(bytes2ipv4addr(tcpipShrdPrm.ipaddr),
461 bytes2ipv4addr(tcpipShrdPrm.dns1),
462 bytes2ipv4addr(tcpipShrdPrm.dns2),
463 TCPIP_IFCONFIG_UP);
464 break;
465 case TCPIP_CONNECTION_BUILDUP_DOWN:
466 psaTCPIP_Config(0,0,0,TCPIP_IFCONFIG_DOWN);
467 break;
468
469 default:
470 TRACE_ERROR("Error: Unknown build up state in psaTCPIP_config_dispatch()");
471 return;
472 }
473 break;
474
475 case TCPIP_Configurated:
476 if(tcpipShrdPrm.callback_function)
477 {
478 tcpipShrdPrm.callback_function(AT_CMPL) ;
479 }
480 break;
481
482 case TCPIP_Deconfiguration :
483 psaTCPIP_Config(0,0,0,TCPIP_IFCONFIG_DOWN);
484 break;
485
486 case TCPIP_Deconfigurated :
487 break;
488
489 case TCPIP_Deactivation :
490 psaTCPIP_Shutdown_Req();
491 break;
492
493 case TCPIP_Deactivated:
494 tcpipShrdPrm.connection_type = TCPIP_CONNECTION_TYPE_UNKNOWN;
495 if(tcpipShrdPrm.callback_function)
496 {
497 tcpipShrdPrm.callback_function(AT_CMPL) ;
498 }
499 wap_state = Wap_Not_Init ;
500 break ;
501
502 default:
503 TRACE_ERROR("Error: Unknown wap_state in psaTCPIP_config_dispatch()") ;
504 }
505 #else
506 ACI_ASSERT(FALSE);
507 #endif
508 }
509
510
511 /********************** Callbacks, several ***********************/
512
513 /* TCP/IP activation callback for circuit-switched data, to be called
514 * when activation is completed.
515 */
516 void psaTCPIP_act_csd_callback(T_ACI_RETURN result)
517 {
518 TRACE_FUNCTION("psaTCPIP_act_csd_callback()");
519
520 if (!psaCC_ctbIsValid (tcpipShrdPrm.wap_call_id))
521 {
522 /* Avoid to dereference NULL */
523 TRACE_ERROR ("Call table entry disappeared");
524 return;
525 }
526
527 /*
528 * activate RA connection: in case of failure clear call !
529 */
530 ccShrdPrm.datStat = DS_ACT_REQ;
531
532 if(cmhRA_Activate((T_ACI_CMD_SRC)psaCC_ctb(tcpipShrdPrm.wap_call_id)->curSrc,
533 (T_ACI_AT_CMD)psaCC_ctb(tcpipShrdPrm.wap_call_id)->curCmd,
534 tcpipShrdPrm.wap_call_id)
535 NEQ AT_EXCT)
536 {
537 TRACE_EVENT("RA ACTIVATION FAILURE -> DISC CALL");
538 ccShrdPrm.datStat = DS_IDL ;
539 psaCC_ctb(tcpipShrdPrm.wap_call_id)->nrmCs = MNCC_CAUSE_CALL_CLEAR ;
540 psaCC_ClearCall (tcpipShrdPrm.wap_call_id);
541 }
542 }
543
544
545 /* TCP/IP configuration callback for circuit-switched data, to be called
546 * when configuration is completed.
547 */
548 void psaTCPIP_conf_csd_callback(T_ACI_RETURN result)
549 {
550 TRACE_FUNCTION("psaTCPIP_conf_csd_callback()") ;
551
552 R_AT ( RAT_CONNECT, (T_ACI_CMD_SRC)tcpipShrdPrm.src_id )
553 ( AT_CMD_NONE, -1, tcpipShrdPrm.wap_call_id, FALSE );
554 if(is_gpf_tcpip_call()) {
555 #ifdef FF_GPF_TCPIP
556 T_DCM_STATUS_IND_MSG msg;
557 msg.hdr.msg_id = DCM_NEXT_CMD_READY_MSG;
558 dcm_send_message(msg, DCM_SUB_WAIT_SATDN_CNF);
559 #endif // #ifdef FF_GPF_TCPIP
560 }
561 }
562
563
564 /* TCP/IP deactivation callback for circuit-switched data, to be called
565 * when deactivation is completed.
566 */
567 void psaTCPIP_deact_csd_callback(T_ACI_RETURN result)
568 {
569 TRACE_FUNCTION("psaTCPIP_deact_csd_callback()") ;
570
571 /*
572 * deactivate L2R connection:
573 */
574 if (cmhL2R_Deactivate() NEQ AT_EXCT)
575 {
576 TRACE_EVENT("L2R DEACTIVATION FAILURE ");
577 if (psaCC_ctbIsValid (tcpipShrdPrm.wap_call_id)) /* To be sure */
578 psaCC_ctb(tcpipShrdPrm.wap_call_id)->nrmCs = MNCC_CAUSE_CALL_CLEAR;
579 psaCC_ClearCall (tcpipShrdPrm.wap_call_id); /* Changed in OMAPS00049111 */
580 }
581
582 if(is_gpf_tcpip_call())
583 {
584 #ifdef FF_GPF_TCPIP
585 {
586 T_DCM_STATUS_IND_MSG msg;
587 msg.hdr.msg_id = DCM_NEXT_CMD_READY_MSG;
588 dcm_send_message(msg, DCM_SUB_WAIT_SATH_CNF);
589 }
590 #endif /* #ifdef FF_GPF_TCPIP */
591 }
592 }
593
594 #endif /*defined(FF_WAP) OR defined(FF_GPF_TCPIP) */
595
596 /* EOF */
597