2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 | File: route.c
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 | Copyright 2004 Texas Instruments Deutschland, AG
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 | All rights reserved.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 | This file is confidential and a trade secret of Texas
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 | Instruments Berlin, AG
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 | The receipt of or possession of this file does not convey
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 | any rights to reproduce or disclose its contents or to
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 | manufacture, use, or sell anything it may describe, in
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 | whole, or in part, without the specific written consent of
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 | Texas Instruments Deutschland, AG.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 +-----------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 | Purpose : This Modul performs the filtering and routing of
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 | primitives for testing capabilities of the protocol stack.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 +-----------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 #ifndef __ROUTE_C__
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 #define __ROUTE_C__
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 /*==== INCLUDES ===================================================*/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 #include <stdio.h>
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 #include <string.h>
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 #include "typedefs.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 #include "os.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 #include "vsi.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 #include "frame.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 #include "tools.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 #include "frm_defs.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 #include "frm_types.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 #include "frm_glob.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 #include "p_mem.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 #include "route.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 #include "frm_ext.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 /*==== CONSTANTS ==================================================*/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 /*==== TYPES ======================================================*/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 /*==== CONSTANTS ====================================================*/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 /*==== EXTERNALS =====================================================*/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 /* -------------- S H A R E D - BEGIN ---------------- */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 #ifdef _TOOLS_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 #pragma data_seg("FRAME_SHARED")
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 extern OS_HANDLE ext_data_pool_handle;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 extern T_HANDLE TestGroupHandle;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 extern T_FRM_ROUTING_TABLE_ENTRY *Routing[];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 extern char TaskName[];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 #ifndef _TOOLS_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 extern T_lemu_SendToQueue lemu_SendToQueue_func;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 /*==== VARIABLES ==================================================*/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 #ifndef RUN_INT_RAM
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 T_HANDLE rt_tst_handle = VSI_ERROR;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 #else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 extern int rt_tst_handle;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 #ifdef _TOOLS_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 #pragma data_seg()
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 /* -------------- S H A R E D - END ---------------- */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 #ifndef _TOOLS_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 extern const T_MEM_PROPERTIES *mem;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 /*==== FUNCTIONS ==================================================*/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 #ifndef RUN_INT_RAM
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 | PROJECT : GSM-PS (6147) MODULE : PF_ROUTE |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 | STATE : code ROUTINE : rt_Init |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 PURPOSE : initialize the routing table.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 GLOBAL SHORT rt_Init (void)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 USHORT i;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 * Initialize the routingTable
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 for ( i = 0; i <= MaxEntities; i++ )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 Routing[i] = NULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 return OS_OK;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 #ifndef RUN_INT_RAM
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 | PROJECT : GSM-PS (6147) MODULE : PF_ROUTE |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 | STATE : code ROUTINE : rt_CvrtOpcMask |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
111
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
112 PURPOSE : convert "1010101" mask to opcMask and opcStatus
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
114
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
115 LOCAL SHORT rt_CvrtToOpcMask ( char *OpcString, ULONG *opcMask, ULONG *opcStatus )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
116 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
117 unsigned int len;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
118 unsigned int i;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
119 char *p;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
120
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
121 len = strlen ( OpcString );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
122 p = OpcString + len;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
123
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
124 for ( i = 0; i < len; i++ )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
125 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
126 switch (*--p)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
127 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
128 case '1':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
129 *opcMask |= (1<<i);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
130 *opcStatus |= (1<<i);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
131 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
132 case '0':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
133 *opcMask |= (1<<i);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
134 *opcStatus &= ~((unsigned int)1<<i);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
135 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
136 case '*': /* wildcard matches */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
137 *opcMask &= ~((unsigned int)1<<i);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
138 *opcStatus &= ~((unsigned int)1<<i);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
139 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
140 default:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
141 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
142 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
143 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
144 return OS_OK;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
145 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
146 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
147
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
148 #ifndef RUN_INT_RAM
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
149 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
150 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
151 | PROJECT : GSM-PS (6147) MODULE : PF_ROUTE |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
152 | STATE : code ROUTINE : rt_CvrtOpcMask |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
153 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
154
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
155 PURPOSE : convert opcMask and opcStatus to "1010101"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
156 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
157 LOCAL SHORT rt_CvrtFromOpcMask ( char *OpcString, ULONG opcMask, ULONG opcStatus )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
158 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
159 signed char i;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
160 char len;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
161
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
162 if ( opcMask >> 16 )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
163 len = 32;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
164 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
165 len = 16;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
166 for ( i = len-1; i >= 0; i-- )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
167 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
168 if ( opcMask & (1<<i) )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
169 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
170 if ( opcStatus & (1<<i) )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
171 *OpcString = '1';
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
172 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
173 *OpcString = '0';
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
174 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
175 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
176 *OpcString = '*';
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
177 OpcString++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
178 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
179 *(OpcString++) = ' ';
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
180 *(OpcString++) = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
181
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
182 return OS_OK;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
183 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
184 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
185
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
186 #ifndef RUN_INT_RAM
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
187 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
188 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
189 | PROJECT : GSM-PS (6147) MODULE : PF_ROUTE |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
190 | STATE : code ROUTINE : rt_ReadRouting |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
191 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
192
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
193 PURPOSE : reads all routings of the routing table of the task.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
194 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
195
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
196 GLOBAL SHORT rt_RouteRead ( T_HANDLE Handle, char *Buffer )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
197 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
198 T_HANDLE TstComHandle;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
199 static T_FRM_ROUTING_TABLE_ENTRY *pEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
200 char OrgReceiver[ RESOURCE_NAMELEN ];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
201 char NewReceiver[ RESOURCE_NAMELEN ];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
202 char OpcString [18];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
203 char const *pCmd;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
204 static UBYTE FirstRead = 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
205
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
206 if ( FirstRead )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
207 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
208 FirstRead = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
209 pEntry = Routing[Handle];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
210 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
211 if ( pEntry )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
212 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
213 if ( pEntry->OldDestComHandle == ROUTE_ALL )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
214 strcpy ( OrgReceiver, RT_ALL_TOKEN );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
215 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
216 strcpy ( OrgReceiver, pf_TaskTable[pEntry->OldDestComHandle].Name );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
217 TstComHandle = vsi_c_open ( Handle, FRM_TST_NAME );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
218 if ( pEntry->NewDestComHandle == TstComHandle )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
219 strcpy ( NewReceiver, pEntry->ExtDest );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
220 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
221 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
222 if ( pEntry->NewDestComHandle != 0 )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
223 strcpy ( NewReceiver, pf_TaskTable[pEntry->NewDestComHandle].Name );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
224 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
225 if ( pEntry->opcMask )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
226 rt_CvrtFromOpcMask ( OpcString, pEntry->opcMask, pEntry->opcStatus );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
227 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
228 OpcString[0] = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
229
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
230 switch (pEntry->Command & RT_COMMAND_MASK)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
231 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
232 case RT_DUPLICATE: pCmd = SYSPRIM_DUPLICATE_TOKEN;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
233 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
234 case RT_REDIRECT: pCmd = SYSPRIM_REDIRECT_TOKEN;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
235 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
236 case RT_DESTROY: pCmd = SYSPRIM_REDIRECT_TOKEN;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
237 strcpy ( NewReceiver, SYSPRIM_NULL_TOKEN );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
238 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
239 default: pCmd = NULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
240 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
241 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
242 sprintf ( Buffer, "%s %s %s %s%s", pf_TaskTable[Handle].Name, pCmd, OrgReceiver, OpcString, NewReceiver );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
243 pEntry = pEntry->pNextEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
244 return RT_OK;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
245 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
246 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
247 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
248 FirstRead = 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
249 pEntry = Routing[Handle];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
250 return RT_ERROR;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
251 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
252 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
253 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
254
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
255 #ifndef RUN_INT_RAM
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
256 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
257 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
258 | PROJECT : GSM-PS (6147) MODULE : PF_ROUTE |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
259 | STATE : code ROUTINE : rt_RoutingEntry |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
260 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
261
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
262 PURPOSE : adds a new routing to the routing table of the task.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
263 routings with duplicates are stored in the beginning
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
264 of the table because if the primitive is redirected and
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
265 send it can not be duplicated.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
266 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
267
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
268 LOCAL SHORT rt_RoutingEntry ( T_HANDLE SndTaskHandle, T_FRM_ROUTING_TABLE_ENTRY *pNewEntry, RT_ENTRY Status )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
269 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
270 T_FRM_ROUTING_TABLE_ENTRY *pEntry, *pNextEntry, *pPrevEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
271
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
272 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
273 * delete all entries with same OldDestComHandle if a destroy command is stored
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
274 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
275 if ( pNewEntry->Command & RT_DESTROY )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
276 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
277 if ( ( pEntry = Routing[SndTaskHandle] ) != NULL )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
278 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
279 do
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
280 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
281 if ( pEntry->OldDestComHandle == pNewEntry->OldDestComHandle )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
282 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
283 if ( pEntry == Routing[SndTaskHandle] )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
284 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
285 if ( pEntry->pNextEntry )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
286 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
287 ((T_FRM_ROUTING_TABLE_ENTRY*)pEntry->pNextEntry)->pPrevEntry = NULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
288 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
289 Routing[SndTaskHandle] = pEntry->pNextEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
290 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
291 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
292 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
293 ((T_FRM_ROUTING_TABLE_ENTRY*)pEntry->pPrevEntry)->pNextEntry = pEntry->pNextEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
294 if ( pEntry->pNextEntry )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
295 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
296 ((T_FRM_ROUTING_TABLE_ENTRY*)pEntry->pNextEntry)->pPrevEntry = pEntry->pPrevEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
297 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
298 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
299 pNextEntry = pEntry->pNextEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
300 os_DeallocateMemory ( SndTaskHandle, (T_VOID_STRUCT*)pEntry );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
301 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
302 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
303 pNextEntry = pEntry->pNextEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
304
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
305 pEntry = pNextEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
306 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
307 while ( pEntry );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
308 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
309 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
310 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
311 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
312 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
313 * delete destroy command for OldDestComHandle if a new command is stored
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
314 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
315 if ( ( pEntry = Routing[SndTaskHandle] ) != NULL )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
316 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
317 do
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
318 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
319 if ( pEntry->OldDestComHandle == pNewEntry->OldDestComHandle )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
320 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
321 if ( pEntry->Command == RT_DESTROY )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
322 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
323 if ( pEntry == Routing[SndTaskHandle] )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
324 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
325 if ( pEntry->pNextEntry )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
326 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
327 ((T_FRM_ROUTING_TABLE_ENTRY*)pEntry->pNextEntry)->pPrevEntry = NULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
328 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
329 Routing[SndTaskHandle] = pEntry->pNextEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
330 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
331 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
332 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
333 ((T_FRM_ROUTING_TABLE_ENTRY*)pEntry->pPrevEntry)->pNextEntry = pEntry->pNextEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
334 if ( pEntry->pNextEntry )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
335 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
336 ((T_FRM_ROUTING_TABLE_ENTRY*)pEntry->pNextEntry)->pPrevEntry = pEntry->pPrevEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
337 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
338 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
339 pNextEntry = pEntry->pNextEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
340 os_DeallocateMemory ( SndTaskHandle, (T_VOID_STRUCT*)pEntry );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
341 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
342 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
343 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
344 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
345 pNextEntry = pEntry->pNextEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
346
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
347 pEntry = pNextEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
348 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
349 while ( pEntry );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
350 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
351 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
352
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
353
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
354 if ( (pEntry = Routing[SndTaskHandle]) != NULL )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
355 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
356 do
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
357 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
358 if ( pEntry->SndTaskHandle == SndTaskHandle
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
359 && pEntry->NewDestComHandle == pNewEntry->NewDestComHandle
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
360 && pEntry->OldDestComHandle == pNewEntry->OldDestComHandle
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
361 && pEntry->MsgType == pNewEntry->MsgType )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
362 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
363 if ( !strcmp (pEntry->ExtDest, pNewEntry->ExtDest) )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
364 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
365 if ( Status == RT_DELETE )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
366 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
367 if ( pEntry == Routing[SndTaskHandle] )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
368 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
369 Routing[SndTaskHandle] = pEntry->pNextEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
370 if ( pEntry->pNextEntry )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
371 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
372 ((T_FRM_ROUTING_TABLE_ENTRY*)pEntry->pNextEntry)->pPrevEntry = NULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
373 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
374 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
375 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
376 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
377 ((T_FRM_ROUTING_TABLE_ENTRY*)pEntry->pPrevEntry)->pNextEntry = pEntry->pNextEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
378 if ( pEntry->pNextEntry )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
379 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
380 ((T_FRM_ROUTING_TABLE_ENTRY*)pEntry->pNextEntry)->pPrevEntry = pEntry->pPrevEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
381 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
382 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
383 pNextEntry = pEntry->pNextEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
384 os_DeallocateMemory ( SndTaskHandle, (T_VOID_STRUCT*)pEntry );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
385 return RT_OK;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
386 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
387 #ifndef _TOOLS_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
388 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
389 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
390 pEntry->Command = pNewEntry->Command; /* modify command for old routing entry */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
391 pEntry->opcMask = pNewEntry->opcMask; /* set new opcMask in old routing entry */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
392 pEntry->opcStatus = pNewEntry->opcStatus; /* set new opcStatus in old routing entry */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
393 return RT_OK;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
394 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
395 #else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
396 pEntry = pEntry->pNextEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
397 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
398 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
399 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
400 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
401 #ifdef _TOOLS_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
402 if ( ( pEntry->opcMask == pNewEntry->opcMask )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
403 && ( pEntry->opcStatus == pNewEntry->opcStatus ) )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
404 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
405 strcpy ( pEntry->ExtDest, pNewEntry->ExtDest );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
406 return RT_OK;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
407 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
408 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
409 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
410 pEntry = pEntry->pNextEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
411 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
412 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
413 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
414 pEntry = pEntry->pNextEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
415 } while ( pEntry );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
416 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
417
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
418 pPrevEntry = NULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
419 if ( ( pEntry = Routing[SndTaskHandle] ) != NULL )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
420 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
421 do
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
422 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
423 pPrevEntry = pEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
424 if ( pNewEntry->Command & RT_DUPLICATE )/* put Duplications at the end of Duplications */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
425 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
426 if ( pEntry->Command & RT_DUPLICATE )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
427 pEntry = pEntry->pNextEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
428 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
429 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
430 if ( pPrevEntry == Routing[SndTaskHandle] )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
431 pPrevEntry = NULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
432 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
433 pPrevEntry = pEntry->pPrevEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
434 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
435 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
436 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
437 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
438 pEntry = pEntry->pNextEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
439 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
440 while ( pEntry );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
441 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
442 if ( os_AllocateMemory ( SndTaskHandle, (T_VOID_STRUCT**)&pNextEntry, sizeof(T_FRM_ROUTING_TABLE_ENTRY), OS_NO_SUSPEND, ext_data_pool_handle ) == OS_TIMEOUT )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
443 return RT_NO_MEM;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
444 pNextEntry->SndTaskHandle = SndTaskHandle;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
445 pNextEntry->OldDestComHandle = pNewEntry->OldDestComHandle;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
446 pNextEntry->NewDestComHandle = pNewEntry->NewDestComHandle;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
447 pNextEntry->OldDestTaskHandle = pNewEntry->OldDestTaskHandle;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
448 pNextEntry->Command = pNewEntry->Command;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
449 pNextEntry->MsgType = pNewEntry->MsgType;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
450 pNextEntry->opcMask = pNewEntry->opcMask;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
451 pNextEntry->opcStatus = pNewEntry->opcStatus;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
452 strcpy ( pNextEntry->ExtDest, pNewEntry->ExtDest );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
453
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
454 if ( pEntry )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
455 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
456 pEntry->pPrevEntry = pNextEntry; /* store at the beginning/in the list */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
457 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
458 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
459 pNextEntry->pNextEntry = NULL; /* append to the list */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
460
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
461 if ( pPrevEntry )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
462 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
463 pPrevEntry->pNextEntry = pNextEntry; /* store in the list */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
464 pNextEntry->pPrevEntry = pPrevEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
465 pNextEntry->pNextEntry = pEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
466 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
467 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
468 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
469 Routing[SndTaskHandle] = pNextEntry; /* store at the beginning */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
470 pNextEntry->pNextEntry = pEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
471 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
472 return RT_OK;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
473 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
474 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
475
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
476 #if 0
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
477 /* not needed -> temporarily removed */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
478 #ifndef RUN_INT_RAM
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
479 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
480 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
481 | PROJECT : GSM-PS (6147) MODULE : PF_ROUTE |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
482 | STATE : code ROUTINE : rt_ModifyRouting |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
483 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
484
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
485 PURPOSE : handle the contents of the redirection or duplicate
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
486 system primitive
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
487
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
488 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
489 GLOBAL SHORT rt_isolate_entity ( T_HANDLE caller, char *entity )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
490 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
491 T_FRM_ROUTING_TABLE_ENTRY entry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
492 T_HANDLE snd;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
493 T_HANDLE rcv;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
494 int read_entry = FIRST_ENTRY;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
495
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
496 if ( (rcv = vsi_e_handle ( caller, entity )) == VSI_ERROR )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
497 return RT_ERROR;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
498 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
499 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
500 while ( vsi_c_get_entity_com_entry ( read_entry, rcv, &snd ) == VSI_OK )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
501 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
502 read_entry = NEXT_ENTRY;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
503 entry.SndTaskHandle = snd;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
504 entry.OldDestComHandle = rcv;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
505 entry.NewDestComHandle = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
506 entry.opcMask = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
507 entry.MsgType = RT_PRIMITIVE_TYPE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
508 entry.Command = RT_DESTROY;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
509 rt_RoutingEntry ( snd, &entry, RT_STORE );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
510 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
511
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
512 entry.SndTaskHandle = rcv;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
513 entry.OldDestComHandle = ROUTE_ALL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
514 entry.NewDestComHandle = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
515 entry.opcMask = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
516 entry.MsgType = RT_PRIMITIVE_TYPE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
517 entry.Command = RT_DESTROY;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
518 rt_RoutingEntry ( rcv, &entry, RT_STORE );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
519
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
520 return RT_OK;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
521 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
522 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
523 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
524 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
525
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
526 #ifndef RUN_INT_RAM
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
527 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
528 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
529 | PROJECT : GSM-PS (6147) MODULE : PF_ROUTE |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
530 | STATE : code ROUTINE : rt_ModifyRouting |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
531 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
532
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
533 PURPOSE : handle the contents of the redirection or duplicate
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
534 system primitive
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
535
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
536 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
537 GLOBAL SHORT rt_RoutingModify ( T_HANDLE SndTaskHandle, char *Command, char *RoutingString)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
538 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
539 char Token[81];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
540 char *pChar = RoutingString;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
541 T_FRM_ROUTING_TABLE_ENTRY Entry = { 0 };
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
542 unsigned int len;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
543 T_FRM_ROUTING_TABLE_ENTRY *pEntry, *pNextEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
544
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
545 if ( !strcmp (Command, SYSPRIM_DUPLICATE_TOKEN) )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
546 Entry.Command = RT_DUPLICATE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
547
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
548 if ( !strcmp (Command, SYSPRIM_REDIRECT_TOKEN) )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
549 Entry.Command = RT_REDIRECT;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
550
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
551 if ( (len = GetNextToken (pChar, Token, " #")) == 0 )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
552 return RT_ERROR;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
553 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
554 pChar += (len+1);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
555
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
556 if ( !strcmp (Token, RT_CLEAR_TOKEN) )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
557 Entry.Command |= RT_CLEAR_ENTRY;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
558
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
559 if ( !strcmp (Token, RT_ALL_TOKEN) )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
560 Entry.Command |= RT_ALL_DESTINATION;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
561
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
562 if ( Entry.Command & RT_CLEAR_ENTRY )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
563 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
564 if ( (pEntry = Routing[SndTaskHandle]) != NULL )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
565 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
566 do
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
567 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
568 pNextEntry = (T_FRM_ROUTING_TABLE_ENTRY*)pEntry->pNextEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
569 os_DeallocateMemory ( SndTaskHandle, (T_VOID_STRUCT*)pEntry );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
570 pEntry = pNextEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
571 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
572 while ( pEntry );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
573 Routing[SndTaskHandle] = NULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
574 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
575 return RT_OK;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
576 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
577
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
578 if ( Entry.Command & RT_ALL_DESTINATION )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
579 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
580 Entry.OldDestComHandle = ROUTE_ALL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
581 Entry.OldDestTaskHandle = ROUTE_ALL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
582 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
583 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
584 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
585 if ( ( Entry.OldDestComHandle = vsi_c_open (SndTaskHandle, Token ) ) == VSI_ERROR )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
586 return RT_ERROR;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
587 Entry.OldDestTaskHandle = Entry.OldDestComHandle;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
588 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
589
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
590 if ( (len = GetNextToken (pChar, Token, " #")) == 0 )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
591 return RT_ERROR;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
592 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
593 pChar += (len+1);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
594
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
595 if ( !strcmp (Token, RT_TIMEOUT_TOKEN) )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
596 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
597 Entry.MsgType = RT_TIMEOUT_TYPE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
598 if ( (len = GetNextToken (pChar, Token, " #")) == 0 )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
599 return RT_ERROR;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
600 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
601 pChar += (len+1);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
602
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
603 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
604 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
605 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
606 if ( !strcmp (Token, RT_SIGNAL_TOKEN) )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
607 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
608 Entry.MsgType = RT_SIGNAL_TYPE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
609 if ( (len = GetNextToken (pChar, Token, " #")) == 0 )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
610 return RT_ERROR;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
611 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
612 pChar += (len+1);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
613 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
614 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
615 Entry.MsgType = RT_PRIMITIVE_TYPE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
616 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
617
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
618 if ( (Token[0] == '1') || (Token[0] == '0') || (Token[0] == '*') )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
619 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
620 rt_CvrtToOpcMask(Token, &Entry.opcMask, &Entry.opcStatus);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
621 if ( (len = GetNextToken (pChar, Token, " #")) == 0 )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
622 return RT_ERROR;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
623 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
624 pChar += (len+1);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
625 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
626 /* else */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
627 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
628 if (!strcmp (Token, SYSPRIM_NULL_TOKEN))
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
629 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
630 if ( Entry.Command & RT_REDIRECT )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
631 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
632 Entry.Command |= RT_DESTROY; /* destroy the primitive */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
633 Entry.Command &= ~RT_REDIRECT;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
634 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
635 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
636 return RT_ERROR;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
637 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
638 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
639 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
640 if ( ( Entry.NewDestComHandle = vsi_c_open (SndTaskHandle, Token ) ) == VSI_ERROR )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
641 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
642 #ifdef _TOOLS_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
643 if ( !strcmp ( FRM_PCO_NAME, Token ) )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
644 return RT_ERROR;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
645 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
646 if ( ( Entry.NewDestComHandle = vsi_c_open (SndTaskHandle, FRM_TST_NAME ) ) != VSI_ERROR )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
647 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
648 rt_tst_handle = Entry.NewDestComHandle;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
649 if ( len < RESOURCE_NAMELEN )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
650 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
651 strncpy( Entry.ExtDest, Token, RESOURCE_NAMELEN );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
652 Entry.ExtDest[RESOURCE_NAMELEN-1] = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
653 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
654 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
655 return RT_ERROR;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
656 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
657 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
658 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
659
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
660 if ( Entry.Command & RT_ALL_DESTINATION )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
661 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
662 if ( (pEntry = Routing[SndTaskHandle]) != NULL )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
663 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
664 int all_cleared = 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
665 do
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
666 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
667 pNextEntry = (T_FRM_ROUTING_TABLE_ENTRY*)pEntry->pNextEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
668 if ( (pEntry->NewDestComHandle == Entry.NewDestComHandle )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
669 && !strcmp(pEntry->ExtDest, Entry.ExtDest) )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
670 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
671 if ( pEntry == Routing[SndTaskHandle] )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
672 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
673 Routing[SndTaskHandle] = pEntry->pNextEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
674 if ( pEntry->pNextEntry != NULL )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
675 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
676 ((T_FRM_ROUTING_TABLE_ENTRY*)pEntry->pNextEntry)->pPrevEntry = NULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
677 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
678 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
679 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
680 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
681 ((T_FRM_ROUTING_TABLE_ENTRY*)pEntry->pPrevEntry)->pNextEntry = pEntry->pNextEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
682 if ( pEntry->pNextEntry != NULL )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
683 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
684 ((T_FRM_ROUTING_TABLE_ENTRY*)pEntry->pNextEntry)->pPrevEntry = pEntry->pPrevEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
685 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
686 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
687 os_DeallocateMemory ( SndTaskHandle, (T_VOID_STRUCT*)pEntry );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
688 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
689 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
690 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
691 all_cleared = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
692 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
693 pEntry = pNextEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
694 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
695 while ( pEntry );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
696 if ( all_cleared == 1 )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
697 Routing[SndTaskHandle] = NULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
698 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
699 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
700
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
701 if ( (pChar >= RoutingString+ strlen (RoutingString))
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
702 || ((len = GetNextToken (pChar, Token, " #")) == 0) )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
703 return ( rt_RoutingEntry(SndTaskHandle, &Entry, RT_STORE) );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
704 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
705 pChar += (len+1);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
706
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
707 if ( Entry.Command & RT_CLEAR_ENTRY )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
708 return ( rt_RoutingEntry(SndTaskHandle, &Entry, RT_DELETE) );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
709 return RT_ERROR;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
710 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
711
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
712 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
713 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
714
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
715 #ifndef RUN_FLASH
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
716 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
717 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
718 | PROJECT : GSM-PS (6147) MODULE : PF_ROUTE |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
719 | STATE : code ROUTINE : rt_routePrim |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
720 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
721
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
722 PURPOSE : Looks if the task have some routing rules stored and
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
723 perform the redirection or duplication.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
724
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
725 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
726
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
727 GLOBAL SHORT rt_Route ( T_HANDLE SndTaskHandle, T_HANDLE RcvComHandle, USHORT Prio, ULONG Suspend, OS_QDATA *Msg )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
728 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
729 T_FRM_ROUTING_TABLE_ENTRY *pEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
730
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
731 T_PRIM_HEADER *prim;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
732 ULONG opc;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
733
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
734 if ( ( pEntry = Routing[SndTaskHandle] ) != NULL )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
735 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
736 if ( pEntry->MsgType == Msg->data16 )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
737 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
738 prim = (T_PRIM_HEADER*)Msg->ptr;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
739
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
740 #ifndef _TOOLS_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
741 if (prim->opc & MEMHANDLE_OPC)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
742 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
743 P_MEMHANDLE_SDU(prim)=0x00000000;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
744 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
745 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
746
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
747 do
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
748 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
749 if ( SndTaskHandle == pEntry->SndTaskHandle
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
750 && ( (RcvComHandle == pEntry->OldDestComHandle) || (pEntry->OldDestComHandle == ROUTE_ALL) ) )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
751 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
752 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
753 * a route for the receiver is defined. Now
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
754 * check the filter conditions
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
755 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
756 opc = ((T_PRIM_HEADER*)Msg->ptr)->opc;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
757 if ( (opc & pEntry->opcMask) == (pEntry->opcStatus & pEntry->opcMask) )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
758 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
759 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
760 * filter matched -> redirect, duplicate or destroy
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
761 * the primitive.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
762 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
763 switch (pEntry->Command & RT_COMMAND_MASK)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
764 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
765 case RT_DESTROY:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
766 /* add VSI_PPM_FREE(Msg->ptr) just to avoid the PPM warning of freeing a primitive in a queue */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
767 VSI_PPM_RCV(Msg->ptr);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
768 VSI_PPM_FREE(Msg->ptr);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
769 os_DeallocatePartition (SndTaskHandle, Msg->ptr-PPM_OFFSET );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
770 return RT_OK;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
771
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
772 case RT_REDIRECT:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
773 #ifndef _TOOLS_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
774 if (pEntry->NewDestComHandle != rt_tst_handle)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
775 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
776 /* if not on tool side and not sending via TST -> send directly */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
777 Msg->e_id = pEntry->NewDestComHandle;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
778 return ( (SHORT)os_SendToQueue ( SndTaskHandle, pf_TaskTable[pEntry->NewDestComHandle].QueueHandle, OS_NORMAL, OS_SUSPEND, Msg ) );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
779 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
780 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
781 /*lint -fallthrough */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
782 case RT_DUPLICATE:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
783 if (pEntry->NewDestComHandle != OS_ERROR)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
784 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
785 OS_QDATA QData;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
786 #ifdef _TOOLS_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
787 QData.len = (USHORT)(PSIZE(P2D(Msg->ptr))-sizeof(T_PRIM_HEADER));
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
788 #else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
789 /* QData.len = 4; not needed if per reference */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
790 T_DP_HEADER *dp_hdr;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
791 #if 0
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
792 P_ATTACH(P2D(prim)); /* recursivly increase use counters */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
793 #else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
794 prim->use_cnt++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
795 if ( prim->dph_offset != 0 )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
796 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
797 dp_hdr = (T_DP_HEADER*)((ULONG*)prim + prim->dph_offset);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
798 /* only increment use_cnt for dynamic primitives - not for DTI primitives */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
799 if ( dp_hdr->magic_nr == GUARD_PATTERN )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
800 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
801 do
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
802 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
803 dp_hdr->use_cnt++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
804 } while ( (dp_hdr = (T_DP_HEADER*)dp_hdr->next) != NULL );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
805 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
806 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
807 #endif /* 0 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
808
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
809 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
810 QData.data16 = MSG_PRIMITIVE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
811 QData.ptr = Msg->ptr;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
812
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
813 #ifndef _TOOLS_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
814 if (pEntry->NewDestComHandle != rt_tst_handle)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
815 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
816 Msg->e_id = pEntry->NewDestComHandle;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
817 os_SendToQueue ( SndTaskHandle, pf_TaskTable[pEntry->NewDestComHandle].QueueHandle, OS_NORMAL, OS_SUSPEND, Msg );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
818 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
819 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
820 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
821 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
822 /* if on tool side or sending via TST -> send with sys header a.s.o */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
823 rt_ExtPrimitive ( SndTaskHandle, pEntry->NewDestComHandle, RcvComHandle, pEntry->ExtDest, &QData );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
824 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
825 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
826 if ( pEntry->Command & RT_REDIRECT )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
827 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
828 T_VOID_STRUCT *free_ptr = (T_VOID_STRUCT*)P2D(prim);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
829
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
830 #ifndef _TOOLS_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
831 if ((prim->opc & MEMHANDLE_OPC) && (mem!=NULL))
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
832 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
833 if (P_MEMHANDLE(prim)!=0)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
834 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
835 mem->dealloc(P_MEMHANDLE(prim));
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
836 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
837 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
838 #endif /* !_TOOLS_ */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
839
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
840 vsi_free ((T_VOID_STRUCT**)&free_ptr FILE_LINE_MACRO);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
841 return RT_OK;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
842 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
843 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
844 default:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
845 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
846 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
847 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
848 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
849 pEntry = pEntry->pNextEntry;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
850 } while ( pEntry );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
851 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
852 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
853
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
854 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
855 * send original
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
856 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
857
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
858 #ifdef _TOOLS_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
859 return ( (SHORT)os_SendToQueue ( SndTaskHandle, RcvComHandle, Prio, Suspend, Msg ) );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
860 #else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
861 if((pf_TaskTable[RcvComHandle].Flags & USE_LEMU_QUEUE) AND
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
862 (lemu_SendToQueue_func.magic_nr == LEMU_SENDTOQUEUE_INITIALIZED))
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
863 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
864 if(lemu_SendToQueue_func.plemu_SendToQueue( SndTaskHandle, RcvComHandle,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
865 pf_TaskTable[RcvComHandle].QueueHandle, Prio, Suspend, Msg )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
866 != lemu_SendToQueue_func.ret_ok )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
867 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
868 return OS_ERROR;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
869 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
870 return OS_OK;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
871 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
872 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
873 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
874 return ( (SHORT)os_SendToQueue ( SndTaskHandle, pf_TaskTable[RcvComHandle].QueueHandle, Prio, Suspend, Msg ) );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
875 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
876 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
877 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
878 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
879
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
880 #ifndef RUN_INT_RAM
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
881 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
882 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
883 | PROJECT : GSM-PS (6147) MODULE : PF_ROUTE |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
884 | STATE : code ROUTINE : rt_ExtPrimitive |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
885 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
886
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
887 PURPOSE : formats duplicated primitive to be sent to TST
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
888
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
889 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
890 void rt_ExtPrimitive ( T_HANDLE TaskHandle, T_HANDLE DestComHandle, T_HANDLE OrgDestTaskHandle, char *ExtDest, OS_QDATA *Msg )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
891 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
892 T_PRIM_HEADER *prim;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
893 #ifndef _TOOLS_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
894 T_PRIM_HEADER *sdu_prim;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
895 #endif /* not _TOOLS_ */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
896 T_PRIM_HEADER *ptr;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
897 T_S_HEADER *s_hdr;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
898 OS_QDATA DMsg;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
899 ULONG AllocSize;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
900 LONG Status;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
901 ULONG suspend;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
902 #ifdef _TOOLS_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
903 T_S_HEADER *prim_s_hdr;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
904 unsigned int i;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
905 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
906
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
907 prim = (T_PRIM_HEADER*)Msg->ptr;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
908 #ifdef _TOOLS_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
909 AllocSize = S_ALLOC_SIZE(Msg->len + 1); /* +1 To add LF in TIF */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
910 #else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
911 if ( prim->dph_offset != 0 )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
912 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
913 T_DP_HEADER *dp_hdr;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
914
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
915 dp_hdr = (T_DP_HEADER*)((ULONG*)prim + prim->dph_offset);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
916 if ( dp_hdr->magic_nr != GUARD_PATTERN
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
917 #ifdef _TARGET_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
918 && route_desclist[TaskHandle] == TRUE
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
919 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
920 )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
921 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
922 rt_desclist_to_sdu ( TaskHandle, DestComHandle, prim, &sdu_prim );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
923 prim = sdu_prim;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
924 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
925 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
926
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
927 AllocSize = S_ALLOC_SIZE(4 + 1); /* only ptr to primitive */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
928 #endif /* _TOOLS_ */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
929 suspend = get_suspend_state(TaskHandle,CHECK_PRIM_SUSPEND);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
930 Status = os_AllocatePartition ( TaskHandle, (T_VOID_STRUCT**)&ptr, AllocSize, suspend, TestGroupHandle );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
931 if ( Status == OS_OK || Status == OS_WAITED || Status == OS_ALLOCATED_BIGGER )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
932 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
933 DMsg.data16 = MSG_PRIMITIVE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
934 DMsg.data32 = Msg->data32;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
935 #ifdef _TOOLS_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
936 DMsg.len = AllocSize;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
937 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
938 DMsg.ptr = (T_VOID_STRUCT*)ptr;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
939
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
940 ptr->opc = prim->opc;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
941 ptr->len = AllocSize;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
942 ptr->sh_offset = S_HDR_OFFSET(AllocSize - sizeof(T_S_HEADER));
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
943 s_hdr = (T_S_HEADER*)((ULONG*)ptr + ptr->sh_offset);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
944 #ifdef _TOOLS_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
945 if ( prim->sh_offset == 0 )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
946 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
947 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
948 if the primitive is sent via the TAP REDIRECT TAP ... mechanism, then the prim->sh_offset
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
949 is zero and the org_rcv is filled corresponding to the original addressed entity name.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
950 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
951 vsi_e_name ( TaskHandle, OrgDestTaskHandle, TaskName );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
952 strcpy (s_hdr->org_rcv, TaskName);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
953 strcpy (s_hdr->rcv, ExtDest);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
954 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
955 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
956 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
957 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
958 if the primitive is sent via the TAP TPORT mechanism then the original receiver is already
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
959 filled by the TAP and copied to the newly allocated primitive to be routed.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
960 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
961 prim_s_hdr = (T_S_HEADER*)((ULONG*)prim + prim->sh_offset);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
962
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
963 for (i = 0; prim_s_hdr->org_rcv[i] != 0 && i < sizeof (s_hdr->org_rcv)-1; i++)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
964 s_hdr->org_rcv[i] = prim_s_hdr->org_rcv[i];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
965 for (i = 0; prim_s_hdr->rcv[i] != 0 && i < sizeof (s_hdr->rcv)-1; i++)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
966 s_hdr->rcv[i] = prim_s_hdr->rcv[i];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
967 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
968 get_local_time (&s_hdr->time);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
969 os_GetTaskName ( TaskHandle, TaskHandle, TaskName );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
970 strcpy (s_hdr->snd, TaskName);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
971 #else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
972 vsi_e_name ( TaskHandle, OrgDestTaskHandle, TaskName );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
973 strcpy (s_hdr->org_rcv, TaskName);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
974 strcpy (s_hdr->rcv, ExtDest);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
975 os_GetTime(TaskHandle,&s_hdr->time);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
976 s_hdr->snd[0] = (char)(TaskHandle | HANDLE_BIT);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
977 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
978 #ifdef _TOOLS_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
979 memcpy ( (char*)P2D(ptr), P2D(Msg->ptr), Msg->len );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
980 #else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
981 ((T_PRIM_X*)(ptr))->prim_ptr = prim;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
982 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
983 DMsg.e_id = DestComHandle;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
984 #ifdef _TOOLS_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
985 os_SendToQueue ( TaskHandle, DestComHandle, OS_NORMAL, OS_SUSPEND, &DMsg );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
986 #else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
987 if ((prim->opc & MEMHANDLE_OPC) && (mem!=NULL))
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
988 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
989 if (P_MEMHANDLE_SDU(prim)==0x00000000)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
990 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
991 /* copy MEM-handle content into new sdu */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
992 U8 *user_data;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
993 U16 ptr_length;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
994 user_data=mem->get_user_data(P_MEMHANDLE(prim), &ptr_length);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
995
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
996 if (user_data)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
997 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
998 T_sdu *sdu=(T_sdu *)M_ALLOC(ptr_length+2*sizeof(U16));
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
999
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1000 sdu->l_buf=ptr_length*8;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1001 sdu->o_buf=0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1002 memcpy(sdu->buf,user_data,ptr_length);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1003
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1004 P_MEMHANDLE_SDU(prim)=(U32)sdu;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1005 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1006 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1007 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1008 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1009 M_ATTACH((void*)P_MEMHANDLE_SDU(prim));
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1010 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1011 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1012
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1013 if ( PrimAborted[TaskHandle] > 0 )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1014 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1015 if ( vsi_o_ttrace ( 0, TC_SYSTEM, "%d %s primitive routings aborted",PrimAborted[TaskHandle], pf_TaskTable[TaskHandle].Name ) == VSI_OK )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1016 PrimAborted[TaskHandle] = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1017 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1018 if ( os_SendToQueue ( TaskHandle, pf_TaskTable[DestComHandle].QueueHandle, OS_NORMAL, suspend, &DMsg ) == OS_TIMEOUT )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1019 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1020 T_VOID_STRUCT *free_ptr = (T_VOID_STRUCT*)P2D(prim);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1021 vsi_free ((T_VOID_STRUCT**)&free_ptr FILE_LINE_MACRO);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1022 vsi_trc_free (0, (T_VOID_STRUCT**)&ptr);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1023 PrimAborted[TaskHandle]++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1024 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1025 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1026 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1027 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1028 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1029 T_VOID_STRUCT *free_ptr = (T_VOID_STRUCT*)P2D(prim);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1030 vsi_free ((T_VOID_STRUCT**)&free_ptr FILE_LINE_MACRO);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1031 PrimAborted[TaskHandle]++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1032 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1033 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1034 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1035
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1036 #ifndef RUN_INT_RAM
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1037 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1038 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1039 | PROJECT : GSM-PS (6147) MODULE : PF_ROUTE |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1040 | STATE : code ROUTINE : rt_desclist_to_sdu |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1041 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1042
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1043 PURPOSE : formats duplicated primitive with descriptor list into a
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1044 primitive with SDU
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1045
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1046 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1047 int rt_desclist_to_sdu ( T_HANDLE caller, T_HANDLE dst, T_PRIM_HEADER *prim, T_PRIM_HEADER **sdu_prim )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1048 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1049 T_PRIM_HEADER *ptr;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1050 T_DP_HEADER *dp_hdr;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1051 T_M_HEADER *m_hdr;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1052 T_desc3 *desc3;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1053 T_desc2 *desc2;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1054 T_desc *desc;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1055 int len = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1056 int sdu_prim_size = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1057 char *fill_ptr;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1058 USHORT *l_buf_ptr;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1059 USHORT *o_buf_ptr;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1060 char *sdu_data_ptr;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1061 T_sdu *sdu = NULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1062 unsigned int new_opc;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1063 int desc_type = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1064
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1065 dp_hdr = (T_DP_HEADER*)((ULONG*)prim + prim->dph_offset);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1066 /* primitive contains descriptor list */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1067
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1068 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1069 START OF NON GENERIC CODE
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1070 This code is for the phase 1 routing of primitives containing descriptor lists.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1071 It is non-generic and depends on the primitive ids defined in SAP docs.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1072 It should be removed as soon as the generic descriptor list routing is ready
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1073 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1074 switch ( prim->opc )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1075 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1076 case 0x7754: /* DTI2_DATA_IND */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1077 new_opc = 0x7755; /* DTI2_DATA_TEST_IND */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1078 desc_type = VSI_DESC_TYPE2 >> 16;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1079 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1080 case 0x3754: /* DTI2_DATA_REQ */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1081 new_opc = 0x3755; /* DTI2_DATA_TEST_REQ */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1082 desc_type = VSI_DESC_TYPE2 >> 16;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1083 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1084 case 0x6800: /* SN_DATA_IND */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1085 new_opc = 0x6806; /* SN_DATA_TEST_IND */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1086 desc_type = VSI_DESC_TYPE2 >> 16;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1087 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1088 case 0x2800: /* SN_DATA_REQ */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1089 new_opc = 0x2806; /* SN_DATA_TEST_REQ */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1090 desc_type = VSI_DESC_TYPE2 >> 16;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1091 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1092 case 0x6801: /* SN_UNITDATA_IND */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1093 new_opc = 0x6807; /* SN_DATA_TEST_IND */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1094 desc_type = VSI_DESC_TYPE2 >> 16;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1095 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1096 case 0x2801: /* SN_UNITDATA_REQ */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1097 new_opc = 0x2807; /* SN_DATA_TEST_REQ */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1098 desc_type = VSI_DESC_TYPE2 >> 16;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1099 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1100 case 0x7701: /* DTI_DATA_IND */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1101 new_opc = 0x7702; /* DTI_DATA_TEST_IND */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1102 desc_type = VSI_DESC_TYPE1 >> 16;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1103 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1104 case 0x3701: /* DTI_DATA_REQ */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1105 new_opc = 0x3702; /* DTI_DATA_TEST_REQ */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1106 desc_type = VSI_DESC_TYPE1 >> 16;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1107 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1108 case 0x80004097: /* GRLC_DATA_IND */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1109 new_opc = 0x80014097; /* GRLC_DATA_IND_TEST */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1110 desc_type = VSI_DESC_TYPE1 >> 16;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1111 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1112 case 0x80024097: /* GRLC_UNITDATA_IND */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1113 new_opc = 0x80034097; /* GRLC_UNITDATA_IND_TEST */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1114 desc_type = VSI_DESC_TYPE1 >> 16;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1115 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1116 default:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1117 new_opc = prim->opc;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1118 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1119 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1120 /* END OF NON GENERIC CODE */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1121
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1122 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1123 it has to be distinguished between T_desc, T_desc2 and T_desc3 because to length information
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1124 is located at different places inside the structure
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1125 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1126 m_hdr = (T_M_HEADER*)(((T_desc_list*)dp_hdr)->first) - 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1127 if ( m_hdr->desc_type != 0 )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1128 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1129 desc_type = m_hdr->desc_type;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1130 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1131 if ( desc_type == (VSI_DESC_TYPE2 >> 16) )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1132 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1133 desc2 = (T_desc2*)(((T_desc_list2*)dp_hdr)->first);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1134 while (desc2 != NULL)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1135 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1136 len = len + desc2->len;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1137 desc2 = (T_desc2 *)desc2->next;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1138 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1139 /* the size to be allocated for the primitive containing the sdu needs to be
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1140 root prim length + data length + sdu size minus data buffer - desc list2 size */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1141 sdu_prim_size = prim->len + len + sizeof(sdu->l_buf) + sizeof(sdu->o_buf) - sizeof(T_desc_list2);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1142 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1143 else if ( desc_type == (VSI_DESC_TYPE1 >> 16) )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1144 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1145 desc = (T_desc*)(((T_desc_list*)dp_hdr)->first);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1146 while (desc != NULL)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1147 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1148 len = len + desc->len;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1149 desc = (T_desc *)desc->next;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1150 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1151 /* the size to be allocated for the primitive containing the sdu needs to be
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1152 root prim length + data length + sdu size minus data buffer - desc list size */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1153 sdu_prim_size = prim->len + len + sizeof(sdu->l_buf) + sizeof(sdu->o_buf) - sizeof(T_desc_list);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1154 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1155 else if ( desc_type == (VSI_DESC_TYPE3 >> 16) )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1156 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1157 /* it is assumed that type 3 is valid if not 1 or 2 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1158 desc3 = (T_desc3*)(((T_desc_list3*)dp_hdr)->first);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1159 while (desc3 != NULL)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1160 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1161 len = len + desc3->len;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1162 desc3 = (T_desc3 *)desc3->next;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1163 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1164 /* the size to be allocated for the primitive containing the sdu needs to be
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1165 root prim length + data length + sdu size minus data buffer - desc list3 size */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1166 sdu_prim_size = prim->len + len + sizeof(sdu->l_buf) + sizeof(sdu->o_buf) - sizeof(T_desc_list3);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1167 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1168 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1169 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1170 vsi_o_ttrace ( 0, TC_SYSTEM, "unknown desc type in 0x%x, routing aborted", prim->opc );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1171 vsi_c_free ( caller, (T_VOID_STRUCT**)&prim FILE_LINE_MACRO );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1172 return RT_ERROR;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1173 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1174
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1175 if ( sdu_prim_size < (int)MaxPrimPartSize )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1176 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1177 ptr = (T_PRIM_HEADER*)vsi_c_new ( caller, sdu_prim_size, new_opc FILE_LINE_MACRO );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1178 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1179 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1180 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1181 vsi_o_ttrace ( 0, TC_SYSTEM, "desclist in 0x%x too long, routing aborted", prim->opc );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1182 vsi_c_free ( caller, (T_VOID_STRUCT**)&prim FILE_LINE_MACRO );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1183 return RT_ERROR;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1184 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1185 #ifdef MEMORY_SUPERVISION
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1186 vsi_ppm_send ( caller, dst, (T_PRIM_HEADER*)ptr FILE_LINE_MACRO );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1187 #endif /* MEMORY_SUPERVISION */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1188
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1189 fill_ptr = (char*)ptr;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1190 l_buf_ptr = &((T_sdu*)((int*)fill_ptr + prim->dph_offset))->l_buf;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1191 o_buf_ptr = &((T_sdu*)((int*)fill_ptr + prim->dph_offset))->o_buf;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1192 sdu_data_ptr = (char*)&((T_sdu*)((int*)fill_ptr + prim->dph_offset))->buf;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1193
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1194 memcpy ( (char*)P2D(fill_ptr), (char*)P2D(prim), prim->len-sizeof(T_PRIM_HEADER) );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1195
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1196 *l_buf_ptr = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1197 *o_buf_ptr = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1198
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1199 fill_ptr = sdu_data_ptr;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1200
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1201 if ( desc_type == (VSI_DESC_TYPE2 >> 16) )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1202 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1203 desc2 = (T_desc2*)(((T_desc_list2*)dp_hdr)->first);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1204 while (desc2 != NULL)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1205 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1206 *l_buf_ptr += (desc2->len*8);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1207 memcpy ( fill_ptr, (char*)(&desc2->buffer)+desc2->offset, desc2->len );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1208 fill_ptr += desc2->len;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1209 desc2 = (T_desc2 *)desc2->next;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1210 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1211 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1212 else if ( desc_type == (VSI_DESC_TYPE1 >> 16) )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1213 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1214 desc = (T_desc*)(((T_desc_list*)dp_hdr)->first);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1215 while (desc != NULL)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1216 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1217 *l_buf_ptr += (desc->len*8);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1218 memcpy ( fill_ptr, (char*)(&desc->buffer), desc->len );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1219 fill_ptr += desc->len;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1220 desc = (T_desc *)desc->next;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1221 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1222 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1223 else if ( desc_type == (VSI_DESC_TYPE3 >>16) )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1224 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1225 desc3 = (T_desc3*)(((T_desc_list3*)dp_hdr)->first);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1226 while (desc3 != NULL)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1227 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1228 *l_buf_ptr += (desc3->len*8);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1229 memcpy ( fill_ptr, (char*)(desc3->buffer)+desc3->offset, desc3->len );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1230 fill_ptr += desc3->len;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1231 desc3 = (T_desc3 *)desc3->next;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1232 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1233 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1234 vsi_c_free ( caller, (T_VOID_STRUCT**)&prim FILE_LINE_MACRO );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1235 *sdu_prim = ptr;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1236 return RT_OK;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1237 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1238 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1239
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1240
|