comparison g23m-aci/aci/dti_cntrl_mng.c @ 0:75a11d740a02

initial import of gsm-fw from freecalypso-sw rev 1033:5ab737ac3ad7
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 09 Jun 2016 00:02:41 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:75a11d740a02
1 /*
2 +-----------------------------------------------------------------------------
3 | Project : ...
4 | Modul : dti_cntrl_mng.c
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 modul ...
18 +-----------------------------------------------------------------------------
19 */
20
21 #include "config.h"
22 #include "fixedconf.h"
23 #include "condat-features.h"
24 #include "aci_conf.h"
25
26 #ifdef DTI
27
28 #ifndef DTI_CNTRL_MNG_C
29 #define DTI_CNTRL_MNG_C
30 #endif
31
32 #ifdef MFW
33 #define ENTITY_MFW
34 #else
35 #ifdef SMI
36 #define ENTITY_SMI
37 #else
38 #define ENTITY_ACI
39 #endif
40 #endif
41
42 #define ACI_MEMBER
43
44 #include "aci_all.h"
45
46 #include "dti.h" /* functionality of the dti library */
47 #include "aci.h"
48 #include "aci_cmh.h"
49 #include "ati_cmd.h"
50 #include "aci_io.h"
51
52 #include "aci_cmh.h"
53 #include "aci_mem.h"
54 #include "aci_lst.h"
55
56 #include "dti_conn_mng.h"
57 #include "cmh_dti.h"
58
59 #ifdef FAX_AND_DATA
60 #include "aci_fd.h"
61 #include "psa.h"
62 #include "psa_l2r.h"
63 #include "cmh.h"
64 #include "cmh_ra.h"
65 #include "cmh_l2r.h"
66
67 #ifdef FF_FAX
68 #include "psa_t30.h"
69 #include "psa_tra.h"
70 #endif
71
72 #else
73
74 #include "psa.h"
75 #include "cmh.h"
76
77 #endif /* #ifdef FAX_AND_DATA */
78
79 #include "psa_aaa.h"
80
81 #if defined (GPRS) AND defined (UART)
82 #include "gaci.h"
83 #include "gaci_cmh.h"
84 #include "pcm.h"
85 #include "psa_gmm.h"
86 #include "cmh_gmm.h"
87 #include "psa_sm.h"
88 #include "cmh_sm.h"
89 #include "psa_gppp.h"
90 #include "cmh_gppp.h"
91 #ifdef FF_PKTIO
92 #include "psa_pktio.h"
93 #endif
94 #include "psa_upm.h"
95 #include "psa_snd.h"
96 #endif /* GPRS */
97
98 #if defined (FF_WAP) AND defined (GPRS) || defined (FF_SAT_E)
99 #include "gaci.h"
100 #include "gaci_cmh.h"
101 #include "psa_sm.h"
102 #include "cmh_sm.h"
103 #endif
104
105 #if defined (FF_WAP) || defined (FF_PPP) || defined (FF_GPF_TCPIP) || defined (FF_SAT_E)
106 #include "psa_ppp_w.h"
107 #include "wap_aci.h"
108 #endif /* WAP or FF_PPP */
109
110 #ifdef UART
111 #include "dti_cntrl_mng.h"
112 #include "psa_uart.h"
113 #include "ati_src_uart.h"
114 #endif
115 #ifdef FF_PSI
116 #include "psa_psi.h"
117 #endif
118 #include "sap_dti.h"
119
120 #ifdef SIM_TOOLKIT
121 #include "psa.h"
122 #include "psa_sim.h"
123 #endif
124
125 extern void psaTCPIP_Dti_Req(T_DTI_CONN_LINK_ID dti_id,
126 UBYTE peer_to_connect_to, UBYTE dti_conn);
127 /*
128 * list for devices maintained by DTI Control Manager
129 */
130 LOCAL T_ACI_LIST *dti_cntrl_list = NULL;
131 /* static pointer to manage output of dti_cntrl_list elements */
132 static const T_ACI_LIST *dti_cntrl_dev_ptr = NULL;
133 /*
134 * a customer can install up to 3 own entities involved in data transmission
135 * every customer entity has its own call back function, noted in this array
136 */
137 LOCAL T_DTI_CNTRL_REGISTERED_EXT_CB reg_ext_cb[DTI_MAX_EXT_CB] =
138 {
139 {DTI_ENTITY_INVALID, NULL},
140 {DTI_ENTITY_INVALID, NULL},
141 {DTI_ENTITY_INVALID, NULL}
142 };
143
144
145 /*
146 * reuse of the global variable g_cur_cap due to the fact that the
147 * function dti_cntrl_est_dpath_indirect() is (always) called with the
148 * SPLIT mode, which means that there is the calling of
149 * dti_cntrl_entity_disconnected() which causes to reset the current
150 * capability and then there is the calling of dti_cntrl_entity_connected()
151 * and here we need the capability given in dti_cntrl_est_dpath_indirect()
152 */
153 UBYTE g_cur_cap;
154
155 /* bit set for DTI ID which should be reconnected to ACI */
156 ULONG dti_cntrl_reconnect_to_aci;
157
158 /*********************** LOCAL FUNCTIONS *****************************/
159
160 /*
161 +--------------------------------------------------------------------+
162 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
163 | STATE : code ROUTINE : dti_cntrl_search_dev_id |
164 +--------------------------------------------------------------------+
165
166 PURPOSE : help function for
167 find_element_by_tupel (dti_cntrl_list, dev_id, dev_no, sub_no, dti_cntrl_search_dev_id);
168 */
169 LOCAL BOOL dti_cntrl_search_dev_id (T_DTI_ENTITY_ID dev_id, UBYTE dev_no, UBYTE sub_no, void *elem)
170 {
171 T_DTI_CNTRL *compared = (T_DTI_CNTRL *)elem;
172
173 if (compared NEQ NULL)
174 if (compared->dev_id EQ dev_id)
175 if (compared->dev_no EQ dev_no)
176 if (compared->sub_no EQ sub_no
177 #ifdef _SIMULATION_
178
179 OR 0 EQ sub_no AND 255 EQ compared->sub_no
180
181 #endif
182 )
183 return (TRUE);
184 return (FALSE);
185 }
186
187 /*
188 +--------------------------------------------------------------------+
189 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
190 | STATE : code ROUTINE : find_element_by_tupel |
191 +--------------------------------------------------------------------+
192
193 PURPOSE : find element in dti_cntrl_list
194 */
195 typedef BOOL T_LIST_HELP_FCT (T_DTI_ENTITY_ID criterium1, UBYTE criterium2, UBYTE criterium3, void *elem);
196
197 LOCAL void *find_element_by_tupel (T_ACI_LIST *search_list,
198 T_DTI_ENTITY_ID criterium1,
199 UBYTE criterium2,
200 UBYTE criterium3,
201 T_LIST_HELP_FCT test_criterium)
202 {
203 T_ACI_LIST *current = NULL;
204
205 if ((search_list EQ NULL) OR (search_list->msg EQ NULL))
206 {
207 return (NULL);
208 }
209
210 current = search_list;
211
212 do
213 {
214 if (current->msg NEQ NULL)
215 {
216 if (test_criterium (criterium1, criterium2, criterium3, current->msg))
217 {
218 return (current->msg);
219 }
220 else
221 {
222 current = current->next;
223 }
224 }
225 }while (current NEQ NULL);
226
227 return (NULL);
228 }
229
230 /*
231 +--------------------------------------------------------------------+
232 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
233 | STATE : code ROUTINE : dti_cntrl_call_reg_fct |
234 +--------------------------------------------------------------------+
235
236 PURPOSE : this function is called by dti_cntrl_maintain_entity(),
237 which is a call back function used by the DTI Connection
238 Manager, in such a case, where a customer installed its
239 own entity involved during data transmission
240 */
241 LOCAL BOOL dti_cntrl_call_reg_fct( T_DTI_ENTITY_ID entity_id,
242 T_DTI_CONN_LINK_ID link_id,
243 T_DTI_ENTITY_ID peer_entity_id,
244 UBYTE dti_conn )
245 {
246 UBYTE i = 0;
247
248 TRACE_FUNCTION("dti_cntrl_call_reg_fct()");
249
250 for (i=0; i<DTI_MAX_EXT_CB; ++i)
251 {
252 if (reg_ext_cb[i].ent_id EQ entity_id)
253 {
254 if (reg_ext_cb[i].fct)
255 {
256 return (reg_ext_cb[i].fct(link_id, peer_entity_id, dti_conn));
257 }
258 }
259 }
260 return (FALSE);
261 }
262
263 /*
264 +------------------------------------------------------------------------------+
265 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
266 | STATE : code ROUTINE : dti_cntrl_set_redirection |
267 +------------------------------------------------------------------------------+
268
269 PURPOSE : sub function of dti_cntrl_set_redirect_from_src and
270 dti_cntrl_set_redirect_from_device
271 */
272 LOCAL BOOL dti_cntrl_set_redirection (T_DTI_CNTRL *dti_cntrl_dev,
273 T_DTI_CNTRL *indirect_dev,
274 UBYTE mode,
275 UBYTE capability,
276 UBYTE cid)
277 {
278 TRACE_FUNCTION("dti_cntrl_set_redirection()");
279
280 switch (capability)
281 {
282 case (DTI_CPBLTY_PKT):
283 {
284 if (mode EQ DTI_MODE_DELETE)
285 {
286 dti_cntrl_dev->redirect_info.tbl->pkt_redirect[cid].mode = DTI_MODE_NIL;
287 dti_cntrl_dev->redirect_info.tbl->pkt_redirect[cid].redirection = NULL;
288 }
289 else
290 {
291 dti_cntrl_dev->redirect_info.tbl->pkt_redirect[cid].mode = mode;
292 dti_cntrl_dev->redirect_info.tbl->pkt_redirect[cid].redirection = indirect_dev;
293 }
294 break;
295 }
296 case (DTI_CPBLTY_SER):
297 {
298 if (mode EQ DTI_MODE_DELETE)
299 {
300 dti_cntrl_dev->redirect_info.tbl->ser_redirect[cid].mode = DTI_MODE_NIL;
301 dti_cntrl_dev->redirect_info.tbl->ser_redirect[cid].redirection = NULL;
302 }
303 else
304 {
305 dti_cntrl_dev->redirect_info.tbl->ser_redirect[cid].mode = mode;
306 dti_cntrl_dev->redirect_info.tbl->ser_redirect[cid].redirection = indirect_dev;
307 }
308 break;
309 }
310 default:
311 {
312 TRACE_EVENT("given capability is not SER or PKT");
313 return (FALSE);
314 }
315 }
316 return (TRUE);
317 }
318
319 /*
320 +------------------------------------------------------------------------------+
321 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
322 | STATE : code ROUTINE : dti_cntrl_get_redirection |
323 +------------------------------------------------------------------------------+
324
325 PURPOSE : sub function of dti_cntrl_get_first_redirection and
326 dti_cntrl_get_next_redirection
327 */
328 LOCAL BOOL dti_cntrl_get_redirection (T_DTI_CNTRL *dti_cntrl_dev,
329 T_DTI_CNTRL *indirection, /* out parameter */
330 UBYTE cid,
331 UBYTE capability)
332 {
333 UBYTE mode = DTI_MODE_NIL; /* remember temporary */
334
335 TRACE_FUNCTION("dti_cntrl_get_redirection()");
336
337 switch (capability)
338 {
339 case (DTI_CPBLTY_PKT):
340 {
341 for (cid += 1; cid<DTI_MAX_REDIRECTIONS; cid++) /* watch the start value */
342 {
343 if (dti_cntrl_dev->redirect_info.tbl->pkt_redirect[cid].redirection)
344 {
345 mode = dti_cntrl_dev->redirect_info.tbl->pkt_redirect[cid].mode;
346 /*
347 * set the pointer to the redirected device for packet data transmission
348 */
349 dti_cntrl_dev = dti_cntrl_dev->redirect_info.tbl->pkt_redirect[cid].redirection;
350 break;
351 }
352 }
353 break;
354 }
355 case (DTI_CPBLTY_SER):
356 {
357 for (cid += 1; cid<DTI_MAX_REDIRECTIONS; cid++) /* watch the start value */
358 {
359 if (dti_cntrl_dev->redirect_info.tbl->ser_redirect[cid].redirection)
360 {
361 mode = dti_cntrl_dev->redirect_info.tbl->ser_redirect[cid].mode;
362 /*
363 * set the pointer to the redirected device for serial data transmission
364 */
365 dti_cntrl_dev = dti_cntrl_dev->redirect_info.tbl->ser_redirect[cid].redirection;
366 break;
367 }
368 }
369 break;
370 }
371 default:
372 {
373 TRACE_EVENT("given capability is not SER or PKT");
374 indirection = NULL; /* make it invalid */
375 return (FALSE);
376 }
377 }
378
379 if (cid >= DTI_MAX_REDIRECTIONS)
380 {
381 indirection = NULL; /* there is no further redirection */
382 }
383 else
384 {
385 /*
386 * fill the out parameter
387 */
388 indirection->dev_id = dti_cntrl_dev->dev_id;
389 indirection->dev_no = dti_cntrl_dev->dev_no;
390 indirection->sub_no = dti_cntrl_dev->sub_no;
391 indirection->capability = dti_cntrl_dev->capability;
392 indirection->src_id = dti_cntrl_dev->src_id;
393 indirection->dti_id = dti_cntrl_dev->dti_id;
394 indirection->port_number = dti_cntrl_dev->port_number;
395 indirection->cur_cap = dti_cntrl_dev->cur_cap;
396 indirection->driver_id = dti_cntrl_dev->driver_id;
397 indirection->dio_ctrl_id = dti_cntrl_dev->dio_ctrl_id;
398 /*
399 * ! important ! with >>DTI_DEV_I_AM_THE_ONE<< we indicate that the
400 * redirect_info is now _actually_ the info about this device
401 */
402 indirection->redirect_info.info.cid = cid;
403 indirection->redirect_info.info.mode = mode;
404 indirection->redirect_info.info.capability = capability;
405 indirection->redirect_info.info.direction = DTI_DEV_I_AM_THE_ONE;
406 }
407 return (TRUE);
408 }
409
410 /*
411 +------------------------------------------------------------------------------+
412 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
413 | STATE : code ROUTINE : dti_cntrl_get_info |
414 +------------------------------------------------------------------------------+
415
416 PURPOSE : sub function of the three functions
417 dti_cntrl_get_info_from_src_id
418 dti_cntrl_get_info_from_dti_id
419 dti_cntrl_get_info_from_dev_id
420 */
421 LOCAL BOOL dti_cntrl_get_info (T_DTI_CNTRL *info, /* out parameter */
422 T_DTI_CNTRL *dti_cntrl_dev)
423 {
424 UBYTE i = 0;
425
426 TRACE_FUNCTION("dti_cntrl_get_info()");
427
428 info->dev_id = dti_cntrl_dev->dev_id;
429 info->dev_no = dti_cntrl_dev->dev_no;
430 info->sub_no = dti_cntrl_dev->sub_no;
431 info->capability = dti_cntrl_dev->capability;
432 info->src_id = dti_cntrl_dev->src_id;
433 info->dti_id = dti_cntrl_dev->dti_id;
434 info->port_number = dti_cntrl_dev->port_number;
435 info->cur_cap = dti_cntrl_dev->cur_cap;
436 info->driver_id = dti_cntrl_dev->driver_id;
437 info->dio_ctrl_id = dti_cntrl_dev->dio_ctrl_id;
438 /*
439 * init a possible indirection info with default values ( all 0xFF )
440 */
441 info->redirect_info.info.cid = DTI_CID_NOTPRESENT;
442 info->redirect_info.info.mode = DTI_MODE_NIL;
443 info->redirect_info.info.capability = DTI_CPBLTY_NO;
444 info->redirect_info.info.direction = DTI_DIRECTION_NOTPRESENT;
445 /*
446 * search, whether there is a redirection, start with packet device
447 */
448 for (i=0; i<DTI_MAX_REDIRECTIONS; i++)
449 {
450 if (dti_cntrl_dev->redirect_info.tbl->pkt_redirect[i].redirection)
451 {
452 break;
453 }
454 }
455 if (i < DTI_MAX_REDIRECTIONS)
456 {
457 info->redirect_info.info.cid = i;
458 info->redirect_info.info.mode = dti_cntrl_dev->redirect_info.tbl->pkt_redirect[i].mode;
459 info->redirect_info.info.capability = DTI_CPBLTY_PKT;
460 info->redirect_info.info.direction = DTI_DEV_IS_REDIRECTED;
461 }
462 /*
463 * there is no redirection to a packet device, so search for redirection to a serial device
464 */
465 for (i=0; i<DTI_MAX_REDIRECTIONS; i++)
466 {
467 if (dti_cntrl_dev->redirect_info.tbl->ser_redirect[i].redirection)
468 {
469 break;
470 }
471 }
472 if (i < DTI_MAX_REDIRECTIONS)
473 {
474 info->redirect_info.info.cid = i;
475 info->redirect_info.info.mode = dti_cntrl_dev->redirect_info.tbl->ser_redirect[i].mode;
476 info->redirect_info.info.capability = DTI_CPBLTY_SER;
477 info->redirect_info.info.direction = DTI_DEV_IS_REDIRECTED;
478 }
479 return (TRUE);
480 }
481
482
483 /*
484 +------------------------------------------------------------------------------+
485 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
486 | STATE : code ROUTINE : dti_cntrl_maintain_entity_connect |
487 +------------------------------------------------------------------------------+
488
489 PURPOSE : sub function of dti_cntrl_maintain_entity, called when the DTI
490 Connection Manager wants to connect entites for data transmission
491
492 */
493 LOCAL BOOL dti_cntrl_maintain_entity_connect ( T_DTI_CONN_LINK_ID link_id,
494 T_DTI_ENTITY_ID cur_ent_id,
495 T_DTI_ENTITY_ID peer_ent_id,
496 UBYTE dti_conn)
497 {
498 TRACE_FUNCTION("dti_cntrl_maintain_entity_connect()");
499
500 #ifdef FF_TCP_IP
501 /* If the peer entity is AAA, delay the connect request until AAA has
502 * responded to the AAA_DTI_IND. ati_src_riv_dti_rsp() calls
503 * dti_cntrl_connect_after_aaa_dti_rsp(), which in turn calls this function,
504 * on receiving the response. */
505 {
506 if (peer_ent_id EQ DTI_ENTITY_AAA)
507 {
508 T_DTI_CNTRL *dti_cntrl_dev; /* Information about DTI link. */
509 UBYTE dti_id ; /* DTI id of this connection. */
510
511 dti_id = EXTRACT_DTI_ID(link_id) ;
512 dti_cntrl_dev = (T_DTI_CNTRL *) find_element (dti_cntrl_list, dti_id,
513 dti_cntrl_search_dti_id) ;
514 if (!dti_cntrl_dev->had_aaa_dti_rsp)
515 {
516 dti_cntrl_dev->save_link_id = link_id ;
517 dti_cntrl_dev->save_cur_ent_id = cur_ent_id ;
518 dti_cntrl_dev->save_dti_conn = dti_conn ;
519 return TRUE ;
520 }
521 dti_cntrl_dev->had_aaa_dti_rsp = FALSE;
522
523 }
524 }
525 #endif /* FF_TCP_IP */
526
527 switch ( cur_ent_id )
528 {
529 case DTI_ENTITY_ACI: /* entity ACI */
530 /* handle ACI as independent entity */
531 psaACI_Dti_Req(link_id, peer_ent_id, ACI_CONNECT_DTI);
532 break;
533
534 case DTI_ENTITY_UART: /* entity UART */
535 psaUART_SetDTIReq (link_id, peer_ent_id);
536 break;
537
538 #ifdef FF_TRACE_OVER_MTST
539 case DTI_ENTITY_MTST: /* for traces */
540 psaMTST_Switch_Trace (link_id, peer_ent_id, TRUE);
541 break;
542 #endif
543
544 #ifdef FAX_AND_DATA
545 case DTI_ENTITY_TRA:
546 psaTRA_Dti_Req( link_id, TRA_CONNECT_DTI, (UBYTE)peer_ent_id );
547 break;
548
549 case DTI_ENTITY_L2R:
550 psaL2R_Enable (link_id, (UBYTE)peer_ent_id);
551 break;
552
553 #ifdef FF_FAX
554 case DTI_ENTITY_T30:
555 psaT30_Dti_Req( link_id, T30_CONNECT_DTI );
556 break;
557 #endif
558
559 #ifdef BT_ADAPTER
560 case DTI_ENTITY_BLUETOOTH:
561 psaBTI_Dti_Req( link_id, peer_ent_id, BTI_CONNECT_DTI );
562 break;
563 #endif /* BT_ADAPTER */
564
565 #endif /* FAX_AND_DATA */
566
567 #ifdef GPRS
568 case DTI_ENTITY_PPPS:
569 psaGPPPS_Dti_Req(link_id, (UBYTE) peer_ent_id); /* rather use dti_id instead of link_id ???? */
570 break;
571 #ifdef FF_PKTIO
572 case DTI_ENTITY_PKTIO:
573 psaPKT_Dti_Req((ULONG)link_id, (UBYTE)peer_ent_id, PKT_CONNECT_DTI);
574 break;
575 #endif /* FF_PKTIO */
576 case DTI_ENTITY_SNDCP:
577 psa_sn_dti_req( link_id, peer_ent_id, NAS_CONNECT_DTI );
578 break;
579 #endif /* GPRS */
580 #ifdef FF_PSI
581 case DTI_ENTITY_PSI:
582 psaPSI_Dti_Req((ULONG)link_id, (UBYTE)peer_ent_id, PSI_CONNECT_DTI);
583 break;
584 #endif /*FF_PSI*/
585 case DTI_ENTITY_NULL:
586 dti_cntrl_entity_connected (link_id, DTI_ENTITY_NULL, DTI_OK);
587 break;
588
589 #if defined (FF_WAP) || defined (FF_PPP) || defined (FF_GPF_TCPIP) || defined (FF_SAT_E)
590 case DTI_ENTITY_PPPC:
591 psaPPP_Establish(link_id, (UBYTE) peer_ent_id);
592 break;
593 #endif /* WAP or FF_PPP or SAT E */
594 #ifdef CO_UDP_IP
595 case DTI_ENTITY_IP:
596 psaIPA_Dti_Req(link_id, (UBYTE) peer_ent_id, IPA_CONNECT_DTI);
597 break;
598
599 case DTI_ENTITY_UDP:
600 psaUDPA_Dti_Req(link_id, (UBYTE) peer_ent_id, UDPA_CONNECT_DTI);
601 break;
602
603 #ifdef FF_WAP
604 case DTI_ENTITY_WAP:
605 psaWAP_Dti_Req(link_id, (UBYTE) peer_ent_id, WAP_CONNECT_DTI);
606 break;
607 #endif /* WAP */
608
609 #endif /* WAP || SAT E */
610
611 #ifdef FF_GPF_TCPIP
612 case DTI_ENTITY_TCPIP:
613 psaTCPIP_Dti_Req(link_id, (UBYTE) peer_ent_id, TCPIP_CONNECT_DTI);
614 break;
615 #endif
616
617 #ifdef FF_TCP_IP
618 case DTI_ENTITY_AAA: /* entity AAA */
619 psaAAA_dti_ind (link_id, peer_ent_id);
620 break;
621 #endif
622
623 #ifdef FF_SAT_E
624 /* SAT class e */
625 case DTI_ENTITY_SIM:
626 /* init connection SIM--PEER */
627 /* open DTI connection */
628 psaSIM_Dti_Req(link_id);
629 break;
630 #endif
631
632 default:
633 /* search for registered connect function */
634 return dti_cntrl_call_reg_fct(cur_ent_id, link_id, peer_ent_id, dti_conn);
635 }
636 return (TRUE);
637 }
638
639 #ifdef FF_TCP_IP
640 EXTERN void dti_cntrl_connect_after_aaa_dti_rsp(UBYTE dti_id)
641 {
642 /* If the peer entity is AAA, the connect request has been delayed, until
643 * AAA has responded to the AAA_DTI_IND. ati_src_riv_dti_rsp() calls this
644 * function on receiving this response. */
645
646 T_DTI_CNTRL *dti_cntrl_dev ; /* Information about DTI link. */
647
648 TRACE_FUNCTION("dti_cntrl_connect_after_aaa_dti_rsp()");
649 dti_cntrl_dev = (T_DTI_CNTRL *) find_element (dti_cntrl_list, dti_id,
650 dti_cntrl_search_dti_id) ;
651 dti_cntrl_dev->had_aaa_dti_rsp = TRUE ;
652 dti_cntrl_maintain_entity_connect(dti_cntrl_dev->save_link_id,
653 dti_cntrl_dev->save_cur_ent_id,
654 DTI_ENTITY_AAA,
655 dti_cntrl_dev->save_dti_conn) ;
656 }
657 #endif /* FF_TCP_IP */
658
659 /*
660 +---------------------------------------------------------------------------------+
661 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
662 | STATE : code ROUTINE : dti_cntrl_maintain_entity_disconnect |
663 +---------------------------------------------------------------------------------+
664
665 PURPOSE : sub function of dti_cntrl_maintain_entity, called when the DTI
666 Connection Manager wants to disconnect entites after data transmission
667 */
668 LOCAL BOOL dti_cntrl_maintain_entity_disconnect ( T_DTI_CONN_LINK_ID link_id,
669 T_DTI_ENTITY_ID cur_ent_id,
670 T_DTI_ENTITY_ID peer_ent_id,
671 UBYTE dti_conn)
672 {
673 TRACE_FUNCTION("dti_cntrl_maintain_entity_disconnect()");
674 switch( cur_ent_id )
675 {
676 case DTI_ENTITY_ACI:
677 psaACI_Dti_Req (link_id, peer_ent_id, ACI_DISCONNECT_DTI);
678 break;
679
680 case DTI_ENTITY_UART:
681 /* for UART, we have to wait for UART_DTI_IND
682 * sent when UART recognizes it's dti connection has been
683 * closed down.
684 * It would be nice to just send UART_DTI_REQ
685 * here in order to make handling of the UART entity
686 * more similar to the other entities..
687 */
688 break;
689
690 #ifdef FF_TRACE_OVER_MTST
691 case DTI_ENTITY_MTST: /* for traces */
692 if (psaMTST_Switch_Trace (link_id, peer_ent_id, FALSE) EQ PEI_ERROR)
693 {
694 return (FALSE);
695 }
696 break;
697 #endif
698
699 #ifdef FAX_AND_DATA
700 case DTI_ENTITY_TRA:
701 psaTRA_Dti_Req (link_id, TRA_DISCONNECT_DTI, (UBYTE)peer_ent_id);
702 break;
703
704 #ifdef FF_FAX
705 case DTI_ENTITY_T30:
706 psaT30_Dti_Req (link_id, T30_DISCONNECT_DTI);
707 break;
708 #endif
709
710 case DTI_ENTITY_L2R:
711 /* in the case of disconnecting L2R,
712 it has to be DEACTIVATED */
713 psaL2R_Deactivate();
714 break;
715
716 #ifdef BT_ADAPTER
717 case DTI_ENTITY_BLUETOOTH:
718 psaBTI_Dti_Req(link_id, peer_ent_id, BTI_DISCONNECT_DTI);
719 break;
720 #endif /* BT_ADAPTER */
721
722 #endif /* FAX_AND_DATA */
723
724 #ifdef GPRS
725 case DTI_ENTITY_PPPS:
726 /* Do nothing. Termination of PPP is done by the CMH_SM or CMH_GPPP */
727 break;
728
729 case DTI_ENTITY_SNDCP:
730 psa_sn_dti_req( link_id, peer_ent_id, NAS_DISCONNECT_DTI );
731 break;
732 #ifdef FF_PKTIO
733 case DTI_ENTITY_PKTIO:
734 psaPKT_Dti_Req((ULONG)link_id, (UBYTE)peer_ent_id, PKT_DISCONNECT_DTI);
735 break;
736 #endif /* FF_PKTIO */
737 #endif /* GPRS */
738
739 #ifdef FF_PSI
740 case DTI_ENTITY_PSI:
741 psaPSI_Dti_Req((ULONG)link_id, (UBYTE)peer_ent_id, PSI_DISCONNECT_DTI);
742 break;
743 #endif /*FF_PSI*/
744
745 #ifdef CO_UDP_IP
746 case DTI_ENTITY_IP:
747 psaIPA_Dti_Req(link_id, (UBYTE)peer_ent_id, IPA_DISCONNECT_DTI);
748 break;
749
750 case DTI_ENTITY_UDP:
751 /* for UDP, we have to wait for UDPA_DTI_IND(DISCONNECT) which is
752 * sent when UDP recognizes it's dti connection has been
753 * closed down
754 */
755 break;
756 #endif /* CO_UDP_IP */
757
758 #ifdef FF_WAP
759 case DTI_ENTITY_WAP:
760 psaWAP_Dti_Req(link_id, (UBYTE) peer_ent_id, WAP_DISCONNECT_DTI);
761 break;
762 #endif /* WAP */
763
764 #ifdef FF_GPF_TCPIP
765 case DTI_ENTITY_TCPIP:
766 /* for TCP/IP, we have to wait for TCPIP_DTI_IND(DISCONNECT) which is
767 * sent when TCP/IP recognizes its DTI connection has been closed down */
768 psaTCPIP_Dti_Req(link_id, (UBYTE) peer_ent_id, TCPIP_DISCONNECT_DTI);
769 break;
770 #endif /* FF_GPF_TCPIP */
771
772 #ifdef FF_TCP_IP
773 case DTI_ENTITY_AAA: /* entity AAA */
774 psaAAA_disconnect_ind (link_id);
775 break;
776 #endif
777 #ifdef FF_PPP
778 case DTI_ENTITY_PPPC:
779 psaPPP_Terminate(UP);
780 break;
781 #endif
782
783 #ifdef FF_SAT_E
784 /* SAT class e */
785 case DTI_ENTITY_SIM:
786 psaSIM_Dti_Req(link_id);
787 break;
788 #endif
789
790 default:
791 /* search for registered connect function */
792 return dti_cntrl_call_reg_fct(cur_ent_id, link_id, peer_ent_id, dti_conn);
793 }
794
795 return (TRUE);
796 }
797
798 /*
799 +----------------------------------------------------------------------+
800 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
801 | STATE : code ROUTINE : dti_cntrl_maintain_entity |
802 +----------------------------------------------------------------------+
803
804 PURPOSE : this function is used by the DTI Connection Manager as a
805 call back function for connecting/disconnecting.
806 The registeration of dti_cntrl_maintain_entity in the
807 DTI Connection Manager takes place with:
808 dti_conn_init (dti_cntrl_maintain_entity);
809 */
810 LOCAL BOOL dti_cntrl_maintain_entity ( T_DTI_CONN_LINK_ID link_id,
811 T_DTI_ENTITY_ID cur_ent_id,
812 T_DTI_ENTITY_ID peer_ent_id,
813 UBYTE dti_conn)
814 {
815 TRACE_FUNCTION("dti_cntrl_maintain_entity()");
816
817 if (dti_conn EQ DTI_CONNECT)
818 {
819 return (dti_cntrl_maintain_entity_connect (link_id, cur_ent_id, peer_ent_id, dti_conn));
820 }
821 else /* DTI_DISCONNECT */
822 {
823 return (dti_cntrl_maintain_entity_disconnect (link_id, cur_ent_id, peer_ent_id, dti_conn));
824 }
825 }
826 /********************** GLOBAL FUNCTIONS *****************************/
827
828 /*
829 +--------------------------------------------------------------------+
830 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
831 | STATE : code ROUTINE : dti_cntrl_search_src_id |
832 +--------------------------------------------------------------------+
833
834 PURPOSE : help function for
835 find_element (dti_cntrl_list, dti_id, dti_cntrl_search_src_id);
836 */
837 GLOBAL BOOL dti_cntrl_search_src_id (UBYTE src_id, void *elem)
838 {
839 T_DTI_CNTRL *compared = (T_DTI_CNTRL *)elem;
840
841 if (compared NEQ NULL)
842 if (compared->src_id EQ src_id)
843 return (TRUE);
844 return (FALSE);
845 }
846
847 /*
848 +--------------------------------------------------------------------+
849 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
850 | STATE : code ROUTINE : dti_cntrl_search_dti_id |
851 +--------------------------------------------------------------------+
852
853 PURPOSE : help function for
854 find_element (dti_cntrl_list, dti_id, dti_cntrl_search_dti_id);
855 */
856 GLOBAL BOOL dti_cntrl_search_dti_id (UBYTE dti_id, void *elem)
857 {
858 T_DTI_CNTRL *compared = (T_DTI_CNTRL *)elem;
859
860 if (compared NEQ NULL)
861 if (compared->dti_id EQ dti_id)
862 return (TRUE);
863 return (FALSE);
864 }
865
866 /*
867 +--------------------------------------------------------------------+
868 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
869 | STATE : code ROUTINE : dti_cntrl_init |
870 +--------------------------------------------------------------------+
871
872 PURPOSE : create the global defined dti_cntrl_list and
873 register dti_cntrl_maintain_entity as call back
874 */
875 GLOBAL void dti_cntrl_init (void)
876 {
877 UBYTE i;
878
879 TRACE_FUNCTION("dti_cntrl_init()");
880
881 for (i=0; i<MAX_DTI_CONN_LINK_IDS; i++)
882 {
883 dti_aci_data_base[i].link_id = DTI_LINK_ID_NOTPRESENT;
884 dti_aci_data_base[i].dev_no1 = DTI_DEV_NO_NOTPRESENT;
885 dti_aci_data_base[i].dev_no2 = DTI_DEV_NO_NOTPRESENT;
886 dti_aci_data_base[i].ent_id1 = DTI_ENTITY_INVALID;
887 dti_aci_data_base[i].ent_id2 = DTI_ENTITY_INVALID;
888 dti_aci_data_base[i].sub_no1 = DTI_SUB_NO_NOTPRESENT;
889 dti_aci_data_base[i].sub_no2 = DTI_SUB_NO_NOTPRESENT;
890 }
891
892 dti_cntrl_reconnect_to_aci = 0;
893
894 dti_cntrl_list = new_list ();
895
896 dti_conn_init (dti_cntrl_maintain_entity);
897 }
898
899 /*
900 +--------------------------------------------------------------------+
901 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
902 | STATE : code ROUTINE : dti_cntrl_new_dti |
903 +--------------------------------------------------------------------+
904
905 PURPOSE :
906
907 */
908 GLOBAL UBYTE dti_cntrl_new_dti (UBYTE dti_id)
909 {
910
911 TRACE_FUNCTION("dti_cntrl_new_dti()");
912
913 /* call DTI connection manager function to get a DTI ID */
914 if ((dti_id = dti_conn_new(dti_id)) EQ DTI_DTI_ID_NOTPRESENT)
915 {
916 TRACE_EVENT("couldn't create new dti_id");
917 return (FALSE);
918 }
919
920 return (dti_id);
921 }
922
923 /*
924 +--------------------------------------------------------------------+
925 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
926 | STATE : code ROUTINE : dti_cntrl_new_device |
927 +--------------------------------------------------------------------+
928
929 PURPOSE : a PSA wants to set up a device.
930 in case of ATI_RIV called this function, then port_num
931 is meaningful number, else port_num = NO_PORT_NUMBER.
932 we keep the port number here to frees ATI-RIV from
933 maintaining its own redundant list.
934 */
935 GLOBAL BOOL dti_cntrl_new_device (UBYTE src_id,
936 UBYTE dev_id,
937 UBYTE dev_no,
938 UBYTE sub_no,
939 UBYTE port_num,
940 UBYTE capability,
941 UBYTE driver_id,
942 UBYTE dio_ctrl_id)
943 {
944 UBYTE dti_id = DTI_DTI_ID_NOTPRESENT;
945 T_DTI_CNTRL *dti_cntrl_dev = NULL;
946 USHORT i = 0;
947
948 TRACE_FUNCTION("dti_cntrl_new_device()");
949
950 /* call DTI connection manager function to get a DTI ID */
951 if ((dti_id = dti_conn_new(DTI_DTI_ID_NOTPRESENT)) EQ DTI_DTI_ID_NOTPRESENT)
952 {
953 TRACE_EVENT("couldn't create new dti_id");
954 return (FALSE);
955 }
956
957 ACI_MALLOC (dti_cntrl_dev, sizeof (T_DTI_CNTRL));
958 ACI_MALLOC (dti_cntrl_dev->redirect_info.tbl, sizeof (T_DTI_CNTRL_REDIRECT_INTERN));
959
960 dti_cntrl_dev->dev_id = (T_DTI_ENTITY_ID)dev_id;
961 dti_cntrl_dev->dev_no = dev_no;
962 dti_cntrl_dev->sub_no = sub_no; /* multiplexed sub channels */
963 dti_cntrl_dev->capability = capability; /* what the device is capable to */
964 dti_cntrl_dev->src_id = src_id;
965 dti_cntrl_dev->dti_id = dti_id;
966 dti_cntrl_dev->port_number = port_num;
967 dti_cntrl_dev->driver_id = driver_id;
968 dti_cntrl_dev->dio_ctrl_id = dio_ctrl_id;
969
970 #ifdef FF_TCP_IP
971 dti_cntrl_dev->had_aaa_dti_rsp = FALSE ;
972 dti_cntrl_dev->save_link_id = 0 ;
973 dti_cntrl_dev->save_cur_ent_id = 0 ;
974 dti_cntrl_dev->save_dti_conn = 0 ;
975 #endif /* FF_TCP_IP */
976
977 if ((src_id NEQ DTI_SRC_ID_NOTPRESENT) AND (src_id <= CMD_SRC_MAX))
978 {
979 dti_cntrl_dev->cur_cap = DTI_CPBLTY_CMD; /* has been called by an AT src, so at least CMD capability */
980 }
981 else
982 {
983 dti_cntrl_dev->cur_cap = DTI_CPBLTY_NO; /* has not been called by an AT src and there is no connection yet */
984 }
985
986 for (i=0; i<DTI_MAX_REDIRECTIONS; ++i)
987 {
988 dti_cntrl_dev->redirect_info.tbl->ser_redirect[i].mode = DTI_MODE_PERM;
989 dti_cntrl_dev->redirect_info.tbl->ser_redirect[i].redirection = NULL;
990 dti_cntrl_dev->redirect_info.tbl->pkt_redirect[i].mode = DTI_MODE_PERM;
991 dti_cntrl_dev->redirect_info.tbl->pkt_redirect[i].redirection = NULL;
992 }
993
994 return (insert_list (dti_cntrl_list, dti_cntrl_dev));
995 }
996
997 /*
998 +--------------------------------------------------------------------+
999 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
1000 | STATE : code ROUTINE : dti_cntrl_new_device |
1001 +--------------------------------------------------------------------+
1002
1003 PURPOSE : change the sub channel number (for multiplexer)
1004 */
1005 GLOBAL void dti_cntrl_change_sub_no (UBYTE src_id,
1006 UBYTE sub_no)
1007 {
1008 T_DTI_CNTRL *dti_cntrl_dev = (T_DTI_CNTRL *)find_element (dti_cntrl_list, src_id, dti_cntrl_search_src_id);
1009
1010 TRACE_FUNCTION("dti_cntrl_change_sub_no()");
1011
1012 if (dti_cntrl_dev NEQ NULL)
1013 {
1014 dti_cntrl_dev->sub_no = sub_no; /* multiplexed sub channels */
1015 }
1016 else
1017 {
1018 TRACE_EVENT_P1("no registered device found for src_id=%u", src_id);
1019 }
1020 }
1021
1022 /*
1023 +--------------------------------------------------------------------+
1024 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
1025 | STATE : code ROUTINE : dti_cntrl_est_dpath |
1026 +--------------------------------------------------------------------+
1027
1028 PURPOSE : establish a data connection path directly
1029
1030 */
1031 GLOBAL BOOL dti_cntrl_est_dpath ( UBYTE dti_id,
1032 T_DTI_ENTITY_ID *entity_list,
1033 UBYTE num_entities,
1034 T_DTI_CONN_MODE mode, /* split/append */
1035 T_DTI_CONN_CB *cb)
1036 {
1037 TRACE_FUNCTION("dti_cntrl_est_dpath()");
1038
1039 return (dti_conn_est_dpath (dti_id, entity_list, num_entities, mode, cb));
1040 }
1041
1042 /*
1043 +-------------------------------------------------------------------------+
1044 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
1045 | STATE : code ROUTINE : dti_cntrl_est_dpath_indirect |
1046 +-------------------------------------------------------------------------+
1047
1048 PURPOSE : establish a data connection path, for which a redirection has been set up.
1049 a redirection relates to a serial or packet device indicated by capability.
1050 with the cid we find in ser_redirect[cid] respectively pkt_redirect[cid]
1051 the pointer to the redirected device maintenance in dti_cntrl_list, from
1052 which we get the dti_id to pass it to the DTI Connection Manager.
1053 */
1054 GLOBAL BOOL dti_cntrl_est_dpath_indirect (UBYTE src_id,
1055 T_DTI_ENTITY_ID *entity_list,
1056 UBYTE num_entities,
1057 T_DTI_CONN_MODE mode, /* split/append */
1058 T_DTI_CONN_CB *cb,
1059 UBYTE capability,
1060 UBYTE cid)
1061 {
1062 T_DTI_CNTRL *dti_cntrl_dev = (T_DTI_CNTRL *)find_element (dti_cntrl_list, src_id, dti_cntrl_search_src_id);
1063 T_DTI_CNTRL *indirect_dev = NULL; /* the pointer to the redirected device maintenance */
1064 UBYTE dti_id = DTI_DTI_ID_NOTPRESENT;
1065 UBYTE mode_once_perm = DTI_MODE_NIL;
1066 T_DTI_ENTITY_ID *new_entity_list;
1067 BOOL ret_value;
1068
1069 /* for tracing of establishing of CMD channels for dual port version */
1070 #ifdef RMV_15_04_03
1071 extern CHAR gob_tst_buf[];
1072 #endif
1073
1074 TRACE_FUNCTION("dti_cntrl_est_dpath_indirect()");
1075
1076 if (dti_cntrl_dev EQ NULL)
1077 {
1078 TRACE_EVENT_P1("[ERR]Device with src_id=%d was not registered", src_id);
1079 return FALSE;
1080 }
1081
1082 ACI_MALLOC(new_entity_list, sizeof(T_DTI_ENTITY_ID)*(num_entities+1) );
1083 memcpy(&new_entity_list[1], entity_list, sizeof(T_DTI_ENTITY_ID)*num_entities);
1084
1085 if (cid EQ DTI_CID_NOTPRESENT)
1086 {
1087 cid = 0;
1088 }
1089
1090 /*
1091 * requested capability for data transmission can be SER ,PKT or CMD
1092 */
1093 switch (capability)
1094 {
1095 case (DTI_CPBLTY_PKT):
1096 {
1097 mode_once_perm = dti_cntrl_dev->redirect_info.tbl->pkt_redirect[cid].mode;
1098 indirect_dev = dti_cntrl_dev->redirect_info.tbl->pkt_redirect[cid].redirection;
1099
1100 /*
1101 * if there is no redirection for the given cid (so it is a GPRS call)
1102 * then look in the "redirection for all cids" entry
1103 */
1104 if ((indirect_dev EQ NULL) AND (cid NEQ 0))
1105 {
1106 mode_once_perm = dti_cntrl_dev->redirect_info.tbl->pkt_redirect[0].mode;
1107 indirect_dev = dti_cntrl_dev->redirect_info.tbl->pkt_redirect[0].redirection;
1108 }
1109
1110 if(indirect_dev NEQ NULL)
1111 {
1112 indirect_dev->cur_cap = DTI_CPBLTY_PKT;
1113 }
1114 break;
1115 }
1116 case (DTI_CPBLTY_SER):
1117 {
1118 mode_once_perm = dti_cntrl_dev->redirect_info.tbl->ser_redirect[cid].mode;
1119 indirect_dev = dti_cntrl_dev->redirect_info.tbl->ser_redirect[cid].redirection;
1120
1121 /*
1122 * if there is no redirection for the given cid (so it is a GPRS call)
1123 * then look in the "redirection for all cids" entry
1124 */
1125 if ((indirect_dev EQ NULL) AND (cid NEQ 0))
1126 {
1127 mode_once_perm = dti_cntrl_dev->redirect_info.tbl->ser_redirect[0].mode;
1128 indirect_dev = dti_cntrl_dev->redirect_info.tbl->ser_redirect[0].redirection;
1129 #ifdef RMV_15_04_03
1130 TRACE_EVENT("redirection used");
1131 TRACE_EVENT_P1("cid: %d", cid);
1132 #endif
1133 }
1134
1135 if(indirect_dev NEQ NULL)
1136 {
1137 indirect_dev->cur_cap = DTI_CPBLTY_SER;
1138 }
1139 break;
1140 }
1141 case (DTI_CPBLTY_CMD):
1142 dti_cntrl_dev->cur_cap = DTI_CPBLTY_CMD;
1143 break;
1144 default:
1145 {
1146 return (FALSE);
1147 }
1148 }
1149
1150 if (indirect_dev EQ NULL)
1151 {
1152 /* verify that the device is able to work in the requested capability */
1153 if ((BITFIELD_CHECK (capability, dti_cntrl_dev->capability)) EQ FALSE)
1154 {
1155 return (FALSE);
1156 }
1157
1158 dti_id = dti_cntrl_dev->dti_id;
1159 new_entity_list[0] = dti_cntrl_dev->dev_id;
1160 }
1161 else
1162 {
1163 /* verify that the device is able to work in the requested capability */
1164 if ((BITFIELD_CHECK (capability, indirect_dev->capability)) EQ FALSE)
1165 {
1166 return (FALSE);
1167 }
1168
1169 dti_id = indirect_dev->dti_id;
1170 new_entity_list[0] = indirect_dev->dev_id;
1171 if (mode_once_perm EQ DTI_MODE_ONCE)
1172 {
1173 /* the redirected data transmission connection is not permanent,
1174 * so remove the pointer to the redirected device maintenance */
1175 indirect_dev = NULL;
1176 }
1177 }
1178
1179 num_entities++;
1180 /*
1181 * remember capability, we need it again in dti_cntrl_entity_connected()
1182 */
1183 g_cur_cap = capability;
1184
1185 /* for tracing of establishing of CMD channels for dual port version */
1186 #ifdef RMV_15_04_03
1187 TRACE_EVENT_P1("num_entities: %d", num_entities);
1188 TRACE_EVENT_P1("g_cur_cap: %d", g_cur_cap);
1189 TRACE_EVENT_P1("new_entity_list[0]: %d", new_entity_list[0]);
1190 TRACE_EVENT_P1("new_entity_list[1]: %d", new_entity_list[1]);
1191 TRACE_EVENT_P1("new_entity_list[2]: %d", new_entity_list[2]);
1192 TRACE_EVENT_P1("dti_cntrl_dev->dti_id: %d", dti_cntrl_dev->dti_id);
1193 if (indirect_dev)
1194 {
1195 TRACE_EVENT_P1("indirect_dev->dti_id: %d", indirect_dev->dti_id);
1196 }
1197
1198 TRACE_EVENT(gob_tst_buf);
1199 #endif
1200
1201 /* clear reconnect flag for the new connction */
1202 dti_cntrl_clear_dti_id_to_reconnect(dti_id);
1203
1204 ret_value = dti_conn_est_dpath (dti_id, new_entity_list, num_entities, mode, cb);
1205
1206 ACI_MFREE(new_entity_list);
1207 return ret_value;
1208 }
1209
1210 /*
1211 +------------------------------------------------------------------------+
1212 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
1213 | STATE : code ROUTINE : dti_cntrl_is_dti_channel_connected |
1214 +------------------------------------------------------------------------+
1215
1216 PURPOSE :
1217
1218 */
1219 GLOBAL BOOL dti_cntrl_is_dti_channel_connected (T_DTI_ENTITY_ID ent_id, UBYTE dti_id)
1220 {
1221 TRACE_FUNCTION("dti_cntrl_is_dti_channel_connected()");
1222
1223 return (dti_conn_is_dti_channel_connected (ent_id, dti_id));
1224 }
1225
1226 /*
1227 +--------------------------------------------------------------------------+
1228 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
1229 | STATE : code ROUTINE : dti_cntrl_is_dti_channel_disconnected |
1230 +--------------------------------------------------------------------------+
1231
1232 PURPOSE :
1233
1234 */
1235 GLOBAL BOOL dti_cntrl_is_dti_channel_disconnected (UBYTE dti_id)
1236 {
1237 TRACE_FUNCTION("dti_cntrl_is_dti_channel_disconnected()");
1238
1239 return (dti_conn_is_dti_channel_disconnected (dti_id));
1240 }
1241 /*
1242 +------------------------------------------------------------------------+
1243 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
1244 | STATE : code ROUTINE : dti_cntrl_close_dpath_from_src_id |
1245 +------------------------------------------------------------------------+
1246
1247 PURPOSE :
1248
1249 */
1250 GLOBAL BOOL dti_cntrl_close_dpath_from_src_id (UBYTE src_id)
1251 {
1252 T_DTI_CNTRL *dti_cntrl_dev = (T_DTI_CNTRL *)find_element (dti_cntrl_list, src_id, dti_cntrl_search_src_id);
1253
1254 TRACE_FUNCTION("dti_cntrl_close_dpath_from_src_id()");
1255
1256 return (dti_conn_close_dpath (dti_cntrl_dev->dti_id));
1257 }
1258
1259 /*
1260 +------------------------------------------------------------------------+
1261 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
1262 | STATE : code ROUTINE : dti_cntrl_close_dpath_from_dti_id |
1263 +------------------------------------------------------------------------+
1264
1265 PURPOSE :
1266
1267 */
1268 GLOBAL BOOL dti_cntrl_close_dpath_from_dti_id (UBYTE dti_id)
1269 {
1270 TRACE_FUNCTION("dti_cntrl_close_dpath_from_dti_id()");
1271
1272 return (dti_conn_close_dpath (dti_id));
1273 }
1274
1275 /*
1276 +----------------------------------------------------------------------------+
1277 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
1278 | STATE : code ROUTINE : dti_cntrl_get_info_from_src_id |
1279 +----------------------------------------------------------------------------+
1280
1281 PURPOSE :
1282
1283 */
1284 GLOBAL BOOL dti_cntrl_get_info_from_src_id (UBYTE src_id,
1285 T_DTI_CNTRL *info) /* out parameter */
1286 {
1287 T_DTI_CNTRL *dti_cntrl_dev = (T_DTI_CNTRL *)find_element (dti_cntrl_list, src_id, dti_cntrl_search_src_id);
1288
1289 TRACE_FUNCTION("dti_cntrl_get_info_from_src_id()");
1290
1291 if (dti_cntrl_dev)
1292 {
1293 return (dti_cntrl_get_info (info, dti_cntrl_dev));
1294 }
1295 return (FALSE);
1296 }
1297 /*
1298 +----------------------------------------------------------------------------+
1299 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
1300 | STATE : code ROUTINE : dti_cntrl_get_info_from_dti_id |
1301 +----------------------------------------------------------------------------+
1302
1303 PURPOSE :
1304
1305 */
1306 GLOBAL BOOL dti_cntrl_get_info_from_dti_id (UBYTE dti_id,
1307 T_DTI_CNTRL *info) /* out parameter */
1308 {
1309 T_DTI_CNTRL *dti_cntrl_dev = (T_DTI_CNTRL *)find_element (dti_cntrl_list, dti_id, dti_cntrl_search_dti_id);
1310
1311 TRACE_FUNCTION("dti_cntrl_get_info_from_dti_id()");
1312
1313 if (dti_cntrl_dev)
1314 {
1315 return (dti_cntrl_get_info (info, dti_cntrl_dev));
1316 }
1317 return (FALSE);
1318 }
1319
1320 /*
1321 +----------------------------------------------------------------------------+
1322 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
1323 | STATE : code ROUTINE : dti_cntrl_get_info_from_dev_id |
1324 +----------------------------------------------------------------------------+
1325
1326 PURPOSE :
1327
1328 */
1329 GLOBAL BOOL dti_cntrl_get_info_from_dev_id (T_DTI_ENTITY_ID dev_id,
1330 UBYTE dev_no,
1331 UBYTE sub_no,
1332 T_DTI_CNTRL *info) /* out parameter */
1333 {
1334 T_DTI_CNTRL *dti_cntrl_dev = (T_DTI_CNTRL *)find_element_by_tupel (dti_cntrl_list,
1335 dev_id,
1336 dev_no,
1337 sub_no,
1338 dti_cntrl_search_dev_id);
1339 TRACE_FUNCTION("dti_cntrl_info_from_dev_id()");
1340
1341 if (dti_cntrl_dev)
1342 {
1343 return (dti_cntrl_get_info (info, dti_cntrl_dev));
1344 }
1345 return (FALSE);
1346 }
1347
1348 /*
1349 +-----------------------------------------------------------------------------+
1350 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
1351 | STATE : code ROUTINE : dti_cntrl_set_redirect_from_src |
1352 +-----------------------------------------------------------------------------+
1353
1354 PURPOSE :
1355
1356 */
1357 GLOBAL BOOL dti_cntrl_set_redirect_from_src (UBYTE src_id,
1358 UBYTE mode,
1359 T_DTI_ENTITY_ID dst_dev_id,
1360 UBYTE dst_dev_no,
1361 UBYTE dst_sub_no,
1362 UBYTE capability,
1363 UBYTE cid)
1364 {
1365 T_DTI_CNTRL *dti_cntrl_dev = (T_DTI_CNTRL *)find_element (dti_cntrl_list, src_id, dti_cntrl_search_src_id);
1366 T_DTI_CNTRL *indirect_dev = (T_DTI_CNTRL *)find_element_by_tupel (dti_cntrl_list,
1367 dst_dev_id,
1368 dst_dev_no,
1369 dst_sub_no,
1370 dti_cntrl_search_dev_id);
1371
1372 TRACE_FUNCTION("dti_cntrl_set_redirect_from_src()");
1373
1374 if (dti_cntrl_dev AND indirect_dev)
1375 {
1376 return (dti_cntrl_set_redirection (dti_cntrl_dev, indirect_dev, mode, capability, cid));
1377 }
1378
1379 if (dti_cntrl_dev EQ 0)
1380 {
1381 TRACE_EVENT_P1("dti_cntrl_set_redirect_from_src():[ERR] no list element for src_id=%d", src_id);
1382 }
1383 if (indirect_dev EQ 0)
1384 {
1385 TRACE_EVENT_P3("dti_cntrl_set_redirect_from_src():[ERR] no list element for dev_id=%d, dev_no=%d, sub_no=%d", dst_dev_id,
1386 dst_dev_no,
1387 dst_sub_no);
1388 }
1389 return (FALSE);
1390 }
1391
1392 /*
1393 +--------------------------------------------------------------------------------+
1394 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
1395 | STATE : code ROUTINE : dti_cntrl_set_redirect_from_device |
1396 +--------------------------------------------------------------------------------+
1397
1398 PURPOSE :
1399
1400 */
1401 GLOBAL BOOL dti_cntrl_set_redirect_from_device (UBYTE mode,
1402 T_DTI_ENTITY_ID dst_dev_id,
1403 UBYTE dst_dev_no,
1404 UBYTE dst_sub_no,
1405 T_DTI_ENTITY_ID src_dev_id,
1406 UBYTE src_dev_no,
1407 UBYTE src_sub_no,
1408 UBYTE capability,
1409 UBYTE cid)
1410 {
1411 T_DTI_CNTRL *source_dev = (T_DTI_CNTRL *)find_element_by_tupel (dti_cntrl_list,
1412 src_dev_id,
1413 src_dev_no,
1414 src_sub_no,
1415 dti_cntrl_search_dev_id);
1416 T_DTI_CNTRL *destination_dev = (T_DTI_CNTRL *)find_element_by_tupel (dti_cntrl_list,
1417 dst_dev_id,
1418 dst_dev_no,
1419 dst_sub_no,
1420 dti_cntrl_search_dev_id);
1421
1422 TRACE_FUNCTION("dti_cntrl_set_redirect_from_device()");
1423
1424 if (source_dev AND destination_dev)
1425 {
1426 if ((BITFIELD_CHECK (source_dev->capability, DTI_CPBLTY_CMD)) EQ FALSE)
1427 {
1428 TRACE_EVENT("source device has no command capability !");
1429 return (FALSE);
1430 }
1431
1432 return (dti_cntrl_set_redirection (source_dev, destination_dev, mode, capability, cid));
1433 }
1434 return (FALSE);
1435 }
1436
1437 /*
1438 +-----------------------------------------------------------------------------+
1439 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
1440 | STATE : code ROUTINE : dti_cntrl_get_first_device |
1441 +-----------------------------------------------------------------------------+
1442
1443 PURPOSE : this function is used in conjunction with
1444 1:AT%DATA where all devices
1445 and their possible redirections for data transmission have to
1446 be listed. so start with the first element of dti_cntrl_list
1447 2.AT%DINF where all devices have to be listed, start with first element
1448 */
1449 GLOBAL BOOL dti_cntrl_get_first_device (T_DTI_CNTRL *info) /* out parameter */
1450 {
1451 T_DTI_CNTRL *dti_cntrl_dev;
1452
1453 TRACE_FUNCTION("dti_cntrl_get_first_device()");
1454
1455 dti_cntrl_dev_ptr = dti_cntrl_list;
1456 dti_cntrl_dev = (T_DTI_CNTRL *)(dti_cntrl_dev_ptr->msg);
1457
1458 if (dti_cntrl_dev)
1459 {
1460 return (dti_cntrl_get_info (info, dti_cntrl_dev));
1461 }
1462 return (FALSE);
1463 }
1464
1465 /*
1466 +-----------------------------------------------------------------------------+
1467 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
1468 | STATE : code ROUTINE : dti_cntrl_get_next_device |
1469 +-----------------------------------------------------------------------------+
1470
1471 PURPOSE : this function is used in conjunction with AT%DINF where all devices have
1472 to be listed, give next element
1473 */
1474 GLOBAL BOOL dti_cntrl_get_next_device (T_DTI_CNTRL *info) /* out parameter */
1475 {
1476 T_DTI_CNTRL *dti_cntrl_dev;
1477
1478 TRACE_FUNCTION("dti_cntrl_get_next_device()");
1479
1480 if(dti_cntrl_dev_ptr->next NEQ NULL)
1481 {
1482 dti_cntrl_dev_ptr = dti_cntrl_dev_ptr->next;
1483 dti_cntrl_dev = (T_DTI_CNTRL *)(dti_cntrl_dev_ptr->msg);
1484
1485 if (dti_cntrl_dev)
1486 {
1487 return (dti_cntrl_get_info (info, dti_cntrl_dev));
1488 }
1489 }
1490 else
1491 dti_cntrl_dev_ptr = NULL;
1492 return (FALSE);
1493 }
1494
1495 /*
1496 +-----------------------------------------------------------------------------+
1497 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
1498 | STATE : code ROUTINE : dti_cntrl_get_first_redirection |
1499 +-----------------------------------------------------------------------------+
1500
1501 PURPOSE : to the given src_id and capability (SER/PKT) find the first
1502 redirection.
1503 */
1504 GLOBAL BOOL dti_cntrl_get_first_redirection (UBYTE src_id,
1505 UBYTE capability,
1506 T_DTI_CNTRL *redirection) /* out parameter */
1507 {
1508 T_DTI_CNTRL *dti_cntrl_dev = (T_DTI_CNTRL *)find_element (dti_cntrl_list, src_id, dti_cntrl_search_src_id);
1509
1510 TRACE_FUNCTION("dti_cntrl_get_first_redirection()");
1511
1512 /*
1513 * for the cid we set here -1, because the sub function will first increase it by one
1514 * so we access ser_redirect[0] respectively pkt_redirect[0]
1515 */
1516 return (dti_cntrl_get_redirection (dti_cntrl_dev, redirection, 0xFF, capability));
1517 }
1518
1519 /*
1520 +----------------------------------------------------------------------------+
1521 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
1522 | STATE : code ROUTINE : dti_cntrl_get_next_redirection |
1523 +----------------------------------------------------------------------------+
1524
1525 PURPOSE : to the given src_id and capability (SER/PKT) find the next
1526 redirection >>after<< the given cid.
1527 */
1528 GLOBAL BOOL dti_cntrl_get_next_redirection (UBYTE src_id,
1529 UBYTE cid,
1530 UBYTE capability,
1531 T_DTI_CNTRL *redirection) /* out parameter */
1532 {
1533 T_DTI_CNTRL *dti_cntrl_dev = (T_DTI_CNTRL *)find_element (dti_cntrl_list, src_id, dti_cntrl_search_src_id);
1534
1535 TRACE_FUNCTION("dti_cntrl_get_next_redirection()");
1536
1537 return (dti_cntrl_get_redirection (dti_cntrl_dev, redirection, cid, capability));
1538 }
1539
1540 /*
1541 +-------------------------------------------------------------------------+
1542 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
1543 | STATE : code ROUTINE : dti_cntrl_entity_connected |
1544 +-------------------------------------------------------------------------+
1545
1546 PURPOSE :
1547
1548 */
1549 GLOBAL void dti_cntrl_entity_connected (ULONG link_id,
1550 T_DTI_ENTITY_ID entity_id,
1551 T_DTI_CONN_RESULT result)
1552 {
1553 UBYTE dti_id = EXTRACT_DTI_ID(link_id);
1554 T_DTI_CNTRL *dti_cntrl_dev = (T_DTI_CNTRL *)find_element (dti_cntrl_list, dti_id, dti_cntrl_search_dti_id);
1555
1556 TRACE_FUNCTION("dti_cntrl_entity_connected()");
1557
1558 if (dti_cntrl_dev AND (result EQ DTI_ERROR))
1559 {
1560 dti_cntrl_dev->cur_cap = DTI_CPBLTY_NO; /* reset current capability */
1561 }
1562
1563 /* call DTI Connection Mng function */
1564 dti_conn_entity_connected (link_id, entity_id, result);
1565
1566 /* set current capability if DTI channel is connected */
1567 if (dti_cntrl_dev AND (dti_conn_is_dti_channel_connected(entity_id, dti_id) EQ TRUE))
1568 {
1569 dti_cntrl_dev->cur_cap = g_cur_cap;
1570 }
1571 }
1572 /*
1573 +----------------------------------------------------------------------------+
1574 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
1575 | STATE : code ROUTINE : dti_cntrl_entity_disconnected |
1576 +----------------------------------------------------------------------------+
1577
1578 PURPOSE :
1579
1580 */
1581 GLOBAL void dti_cntrl_entity_disconnected (ULONG link_id,
1582 T_DTI_ENTITY_ID entity_id)
1583 {
1584 UBYTE dti_id = EXTRACT_DTI_ID(link_id);
1585 T_DTI_CNTRL *dti_cntrl_dev = (T_DTI_CNTRL *)find_element (dti_cntrl_list, dti_id, dti_cntrl_search_dti_id);
1586
1587 TRACE_FUNCTION("dti_cntrl_entity_disconnected()");
1588
1589 if (dti_cntrl_dev)
1590 {
1591 dti_cntrl_dev->cur_cap = DTI_CPBLTY_NO; /* reset current capability */
1592 }
1593
1594 /* call DTI Connection Mng function */
1595 dti_conn_entity_disconnected( link_id, entity_id );
1596 }
1597
1598 /*
1599 +--------------------------------------------------------------------+
1600 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
1601 | STATE : code ROUTINE : dti_cntrl_erase_entry |
1602 +--------------------------------------------------------------------+
1603
1604 PURPOSE : This function removes a registered device from
1605 DTI Cntrl Mng list and removes its DTI ID from the list of
1606 DTI Conn Mng.
1607
1608 */
1609 GLOBAL void dti_cntrl_erase_entry (UBYTE dti_id)
1610 {
1611 T_DTI_CNTRL *dti_cntrl_dev = NULL;
1612
1613 TRACE_FUNCTION("dti_cntrl_erase_entry()");
1614
1615 dti_cntrl_dev = remove_element (dti_cntrl_list, dti_id, dti_cntrl_search_dti_id);
1616
1617 if (dti_cntrl_dev EQ NULL)
1618 {
1619 TRACE_EVENT_P1("Device with DTI ID %d was not registered", dti_id);
1620 }
1621 else
1622 {
1623 /*
1624 * redirect_info is a union, where we use the union element tbl,
1625 * which is a pointer to an allocated structure
1626 * of type T_DTI_CNTRL_REDIRECT_INTERN
1627 */
1628 if (dti_cntrl_dev->redirect_info.tbl NEQ NULL)
1629 {
1630 ACI_MFREE (dti_cntrl_dev->redirect_info.tbl);
1631 dti_cntrl_dev->redirect_info.tbl = NULL;
1632 }
1633 ACI_MFREE (dti_cntrl_dev);
1634 }
1635
1636 /* call DTI connection manager function */
1637 dti_conn_erase_entry(dti_id);
1638
1639 }
1640
1641 /*
1642 +--------------------------------------------------------------------+
1643 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
1644 | STATE : code ROUTINE : dti_cntrl_reg_new_fct |
1645 +--------------------------------------------------------------------+
1646
1647 PURPOSE : register an call back function, which is used when a
1648 customer/external has its own entity involved during
1649 a data transmission.
1650 The registered function is called by dti_cntrl_maintain_entity()
1651 only, where dti_cntrl_maintain_entity() itself is a
1652 call back function used by the DTI Connection Manager
1653 */
1654 GLOBAL BOOL dti_cntrl_reg_new_fct (T_DTI_ENTITY_ID entity_id,
1655 T_DTI_EXT_CB *fct)
1656 {
1657 UBYTE i = 0;
1658
1659 TRACE_FUNCTION("dti_cntrl_reg_new_fct()");
1660
1661 if (entity_id <= DTI_ENTITY_MAX)
1662 {
1663 TRACE_EVENT("ENTITY ID already in use");
1664 return (FALSE);
1665 }
1666
1667 for (i=0; i<DTI_MAX_EXT_CB; i++)
1668 {
1669 if (reg_ext_cb[i].ent_id EQ DTI_ENTITY_INVALID)
1670 {
1671 reg_ext_cb[i].ent_id = entity_id;
1672 reg_ext_cb[i].fct = fct;
1673 return (TRUE);
1674 }
1675 }
1676 return (FALSE);
1677 }
1678
1679 /*
1680 * special temporary stuff
1681 */
1682
1683 /*
1684 +--------------------------------------------------------------------+
1685 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
1686 | STATE : code ROUTINE : dti_cntrl_get_link_id() |
1687 +--------------------------------------------------------------------+
1688
1689 PURPOSE :
1690
1691 */
1692 GLOBAL T_DTI_CONN_LINK_ID dti_cntrl_get_link_id( T_DTI_ENTITY_ID ent_id,
1693 UBYTE dev_no,
1694 UBYTE sub_no)
1695 {
1696 UBYTE i;
1697
1698 TRACE_FUNCTION("dti_cntrl_get_link_id()");
1699
1700 for (i=0; i<MAX_DTI_CONN_LINK_IDS; i++)
1701 {
1702 if ( ((dti_aci_data_base[i].ent_id1 EQ ent_id)
1703 AND (dti_aci_data_base[i].dev_no1 EQ dev_no)
1704 AND (dti_aci_data_base[i].sub_no1 EQ sub_no))
1705 OR
1706 ((dti_aci_data_base[i].ent_id2 EQ ent_id)
1707 AND (dti_aci_data_base[i].dev_no2 EQ dev_no)
1708 AND (dti_aci_data_base[i].sub_no2 EQ sub_no)) )
1709 return (dti_aci_data_base[i].link_id);
1710 }
1711
1712 TRACE_EVENT("link_id not found");
1713 return DTI_LINK_ID_NOTPRESENT;
1714 }
1715
1716
1717 /*
1718 +--------------------------------------------------------------------+
1719 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
1720 | STATE : code ROUTINE : dti_cntrl_get_peer_() |
1721 +--------------------------------------------------------------------+
1722
1723 PURPOSE :
1724
1725 */
1726 GLOBAL T_DTI_ENTITY_ID dti_cntrl_get_peer( T_DTI_ENTITY_ID ent_id,
1727 UBYTE dev_no,
1728 UBYTE sub_no)
1729 {
1730 UBYTE i;
1731
1732 TRACE_FUNCTION("dti_cntrl_get_peer()");
1733
1734 for (i=0; i<MAX_DTI_CONN_LINK_IDS; i++)
1735 {
1736 if ((dti_aci_data_base[i].ent_id1 EQ ent_id)
1737 AND (dti_aci_data_base[i].dev_no1 EQ dev_no)
1738 AND (dti_aci_data_base[i].sub_no1 EQ sub_no))
1739 {
1740 return dti_aci_data_base[i].ent_id2;
1741 }
1742 if ((dti_aci_data_base[i].ent_id2 EQ ent_id)
1743 AND (dti_aci_data_base[i].dev_no2 EQ dev_no)
1744 AND (dti_aci_data_base[i].sub_no2 EQ sub_no))
1745 {
1746 return dti_aci_data_base[i].ent_id1;
1747 }
1748 }
1749
1750 TRACE_EVENT("peer entity not found");
1751 return DTI_ENTITY_INVALID;
1752 }
1753
1754 /*
1755 +--------------------------------------------------------------------+
1756 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
1757 | STATE : code ROUTINE : dti_cntrl_set_conn_parms() |
1758 +--------------------------------------------------------------------+
1759
1760 PURPOSE :
1761
1762 */
1763 GLOBAL BOOL dti_cntrl_set_conn_parms( T_DTI_CONN_LINK_ID link_id,
1764 T_DTI_ENTITY_ID ent_id,
1765 UBYTE dev_no,
1766 UBYTE sub_no )
1767 {
1768 UBYTE i;
1769
1770 TRACE_FUNCTION("dti_cntrl_set_conn_parms()");
1771
1772 for (i=0; i<MAX_DTI_CONN_LINK_IDS; i++)
1773 {
1774 if (dti_aci_data_base[i].link_id EQ DTI_LINK_ID_NOTPRESENT)
1775 {
1776 dti_aci_data_base[i].link_id = link_id;
1777
1778 dti_aci_data_base[i].ent_id1 = ent_id;
1779 dti_aci_data_base[i].dev_no1 = dev_no;
1780 dti_aci_data_base[i].sub_no1 = sub_no;
1781
1782 return TRUE;
1783 }
1784 else if (dti_aci_data_base[i].link_id EQ link_id)
1785 {
1786 dti_aci_data_base[i].ent_id2 = ent_id;
1787 dti_aci_data_base[i].dev_no2 = dev_no;
1788 dti_aci_data_base[i].sub_no2 = sub_no;
1789
1790 return TRUE;
1791 }
1792 }
1793
1794 return FALSE;
1795 }
1796
1797 /*
1798 +--------------------------------------------------------------------+
1799 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
1800 | STATE : code ROUTINE : dti_cntrl_clear_conn_parms |
1801 +--------------------------------------------------------------------+
1802
1803 PURPOSE :
1804
1805 */
1806 GLOBAL void dti_cntrl_clear_conn_parms( UBYTE dti_id )
1807 {
1808 UBYTE i;
1809
1810 TRACE_FUNCTION("dti_cntrl_clear_conn_parms()");
1811
1812 for (i=0; i<MAX_DTI_CONN_LINK_IDS; i++)
1813 {
1814 if (EXTRACT_DTI_ID(dti_aci_data_base[i].link_id) EQ dti_id)
1815 {
1816 dti_aci_data_base[i].link_id = DTI_LINK_ID_NOTPRESENT;
1817 dti_aci_data_base[i].dev_no1 = DTI_DEV_NO_NOTPRESENT;
1818 dti_aci_data_base[i].dev_no2 = DTI_DEV_NO_NOTPRESENT;
1819 dti_aci_data_base[i].ent_id1 = DTI_ENTITY_INVALID;
1820 dti_aci_data_base[i].ent_id2 = DTI_ENTITY_INVALID;
1821 dti_aci_data_base[i].sub_no1 = DTI_SUB_NO_NOTPRESENT;
1822 dti_aci_data_base[i].sub_no2 = DTI_SUB_NO_NOTPRESENT;
1823 }
1824 }
1825 }
1826
1827 /*
1828 +---------------------------------------------------------------------+
1829 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
1830 | STATE : code ROUTINE : dti_cntrl_close_all_connections |
1831 +---------------------------------------------------------------------+
1832
1833 PURPOSE :
1834
1835 */
1836 GLOBAL void dti_cntrl_close_all_connections()
1837 {
1838 T_DTI_CNTRL *dti_cntrl_dev;
1839 USHORT dti_cntrl_list_num = 0;
1840 USHORT i = 0;
1841 USHORT k = 0;
1842
1843 TRACE_FUNCTION("dti_cntrl_close_all_connections()");
1844
1845 dti_cntrl_list_num = get_list_count (dti_cntrl_list);
1846 /*
1847 * we clear the list from head to tail
1848 */
1849 while (i <= dti_cntrl_list_num)
1850 {
1851 dti_cntrl_dev = (T_DTI_CNTRL *)remove_first_element (dti_cntrl_list);
1852
1853 if (dti_cntrl_dev)
1854 {
1855 for (k=0; k<DTI_MAX_REDIRECTIONS; ++k)
1856 {
1857 dti_cntrl_dev->redirect_info.tbl->ser_redirect[k].redirection = NULL;
1858 dti_cntrl_dev->redirect_info.tbl->pkt_redirect[k].redirection = NULL;
1859 }
1860
1861 ACI_MFREE (dti_cntrl_dev->redirect_info.tbl);
1862 ACI_MFREE (dti_cntrl_dev);
1863 }
1864 ++i;
1865 }
1866
1867 dti_conn_close_all_connections();
1868 }
1869
1870 /*
1871 +----------------------------------------------------------------------+
1872 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
1873 | STATE : code ROUTINE : dti_cntrl_set_dti_id_to_reconnect|
1874 +----------------------------------------------------------------------+
1875
1876 PURPOSE : This function sets a flag that means that if this DTI
1877 connection is completely disconnected then reconnect the
1878 registered device to ACI.
1879 */
1880 GLOBAL void dti_cntrl_set_dti_id_to_reconnect(UBYTE dti_id)
1881 {
1882 ULONG tmp_bit_field = 0x01 << (dti_id);
1883
1884 TRACE_FUNCTION("dti_cntrl_set_dti_id_to_reconnect()");
1885
1886 BITFIELD_SET(dti_cntrl_reconnect_to_aci, tmp_bit_field);
1887 }
1888
1889 /*
1890 +------------------------------------------------------------------------+
1891 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
1892 | STATE : code ROUTINE : dti_cntrl_clear_dti_id_to_reconnect|
1893 +------------------------------------------------------------------------+
1894
1895 PURPOSE : Clears the 'Reconnect-to-ACI' flag.
1896
1897 */
1898 GLOBAL void dti_cntrl_clear_dti_id_to_reconnect(UBYTE dti_id)
1899 {
1900 ULONG tmp_bit_field = 0x01 << (dti_id);
1901
1902 TRACE_FUNCTION("dti_cntrl_clear_dti_id_to_reconnect()");
1903
1904 BITFIELD_CLEAR(dti_cntrl_reconnect_to_aci, tmp_bit_field);
1905 }
1906
1907 /*
1908 +------------------------------------------------------------------------+
1909 | PROJECT : GSM-F&D (8411) MODULE : DTI_CNTRL |
1910 | STATE : code ROUTINE : dti_cntrl_is_dti_id_to_reconnect |
1911 +------------------------------------------------------------------------+
1912
1913 PURPOSE : Queries the 'Reconnect-to-ACI' flag.
1914
1915 */
1916 GLOBAL BOOL dti_cntrl_is_dti_id_to_reconnect(UBYTE dti_id)
1917 {
1918 ULONG tmp_bit_field = 0x01 << (dti_id);
1919
1920 TRACE_FUNCTION("dti_cntrl_is_dti_id_to_reconnect()");
1921
1922 if (BITFIELD_CHECK(dti_cntrl_reconnect_to_aci, tmp_bit_field))
1923 {
1924 TRACE_EVENT_P1("dti_id=%d must be reconnected", dti_id);
1925 return TRUE;
1926 }
1927 else
1928 {
1929 return FALSE;
1930 }
1931 }
1932
1933 #endif /* DTI */