comparison src/g23m-gprs/sm/sm_pei.c @ 1:fa8dc04885d8

src/g23m-*: import from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 16 Oct 2020 06:25:50 +0000
parents
children
comparison
equal deleted inserted replaced
0:4e78acac3d88 1:fa8dc04885d8
1 /*----------------------------------------------------------------------------
2 | Project : 3G PS
3 | Module : SM
4 +-----------------------------------------------------------------------------
5 | Copyright 2003 Texas Instruments.
6 | All rights reserved.
7 |
8 | This file is confidential and a trade secret of Texas
9 | Instruments .
10 | The receipt of or possession of this file does not convey
11 | any rights to reproduce or disclose its contents or to
12 | manufacture, use, or sell anything it may describe, in
13 | whole, or in part, without the specific written consent of
14 | Texas Instruments.
15 +-----------------------------------------------------------------------------
16 | Purpose: This module implements the process body interface
17 | for the User Plane Manager (SM) entity.
18 | For design details, see:
19 | 8010.939 SM Detailed Specification
20 +---------------------------------------------------------------------------*/
21
22 /*==== DECLARATION CONTROL =================================================*/
23
24 #ifndef SM_PEI_C
25 #define SM_PEI_C
26 #endif
27
28 /*==== INCLUDES =============================================================*/
29
30 #include "sm.h"
31
32 #include "ccdapi.h"
33
34 #include "sm_sequencer.h"
35 #include "sm_dispatcher.h"
36
37 #include "mon_sm.h"
38
39 /*==== CONSTS ===============================================================*/
40
41 /*==== TYPES ================================================================*/
42
43 /*==== LOCALS ===============================================================*/
44
45 /* Communication handles */
46 T_HANDLE hCommACI = VSI_ERROR;
47 T_HANDLE hCommMM = VSI_ERROR;
48 T_HANDLE hCommUPM = VSI_ERROR;
49 T_HANDLE sm_handle;
50
51 static T_MONITOR sm_mon;
52 static BOOL first_access = TRUE;
53
54 /* Global entity data structure */
55 T_SM_DATA sm_data;
56
57 /* Air interface message coding/decoding buffer */
58 U8 _decodedMsg [MAX_MSTRUCT_LEN_SM];
59
60 /*==== PRIVATE FUNCTIONS ====================================================*/
61
62 /*
63 +------------------------------------------------------------------------------
64 | Function : pei_primitive
65 +------------------------------------------------------------------------------
66 | Description : This function is called by the frame when a primitive is
67 | received and needs to be processed.
68 |
69 | | |
70 | | | UPPER LAYER
71 | v v
72 | +--------------(SMREG SAP)--------------(SM SAP)---------------+
73 | | |
74 | | SM |
75 | | |
76 | +-------------------------------^------------------------------+
77 | |
78 | | LOWER LAYER
79 | (MMPM SAP)
80 |
81 | Parameters : prim - Pointer to the received primitive
82 |
83 | Return : PEI_OK - function succeeded
84 | PEI_ERROR - function failed
85 +------------------------------------------------------------------------------
86 */
87 static short pei_primitive (void *primitive)
88 {
89 (void)TRACE_FUNCTION("SM pei_primitive");
90
91 if (primitive != NULL)
92 {
93 T_PRIM_HEADER *prim;
94 U32 opc;
95
96 opc = P_OPC(primitive);
97
98 /*@i1@*/ (void)PTRACE_IN (opc);
99
100 prim = (T_PRIM_HEADER *)&((T_PRIM *)primitive)->data;
101
102 /* Memory supervision ? */
103 VSI_PPM_RCV (primitive);
104
105 switch (opc)
106 {
107 /* SMREG SAP */
108 case SMREG_PDP_ACTIVATE_REQ:
109 sm_disp_smreg_pdp_activate_req((T_SMREG_PDP_ACTIVATE_REQ *)(prim));
110 PFREE(prim);
111 break;
112
113 case SMREG_PDP_ACTIVATE_SEC_REQ:
114 sm_disp_smreg_pdp_activate_sec_req((T_SMREG_PDP_ACTIVATE_SEC_REQ *)(prim));
115 PFREE(prim);
116 break;
117
118 case SMREG_PDP_ACTIVATE_REJ_RES:
119 sm_disp_smreg_pdp_activate_rej_res((T_SMREG_PDP_ACTIVATE_REJ_RES *)(prim));
120 PFREE(prim);
121 break;
122
123 case SMREG_PDP_DEACTIVATE_REQ:
124 sm_disp_smreg_pdp_deactivate_req((T_SMREG_PDP_DEACTIVATE_REQ *)(prim));
125 PFREE(prim);
126 break;
127
128 case SMREG_PDP_MODIFY_REQ:
129 sm_disp_smreg_pdp_modify_req((T_SMREG_PDP_MODIFY_REQ *)(prim));
130 PFREE(prim);
131 break;
132
133
134 /* SM SAP */
135 case SM_ACTIVATE_RES:
136 sm_disp_sm_activate_res((T_SM_ACTIVATE_RES *)(prim));
137 PFREE(prim);
138 break;
139
140 case SM_DEACTIVATE_RES:
141 sm_disp_sm_deactivate_res((T_SM_DEACTIVATE_RES *)(prim));
142 PFREE(prim);
143 break;
144
145 case SM_MODIFY_RES:
146 sm_disp_sm_modify_res((T_SM_MODIFY_RES *)(prim));
147 PFREE(prim);
148 break;
149
150 case SM_STATUS_REQ:
151 sm_disp_sm_status_req((T_SM_STATUS_REQ *)(prim));
152 PFREE(prim);
153 break;
154
155 /* MMPM SAP */
156 case MMPM_ATTACH_IND:
157 sm_disp_mmpm_attach_ind((T_MMPM_ATTACH_IND *)(prim));
158 PFREE(prim);
159 break;
160
161 case MMPM_DETACH_IND:
162 sm_disp_mmpm_detach_ind((T_MMPM_DETACH_IND *)(prim));
163 PFREE(prim);
164 break;
165
166 case MMPM_UNITDATA_IND:
167 sm_disp_mmpm_unitdata_ind((T_MMPM_UNITDATA_IND *)(prim));
168 PFREE(prim);
169 break;
170
171 case MMPM_SUSPEND_IND:
172 sm_disp_mmpm_suspend_ind((T_MMPM_SUSPEND_IND *)(prim));
173 PFREE(prim);
174 break;
175
176 case MMPM_RESUME_IND:
177 sm_disp_mmpm_resume_ind((T_MMPM_RESUME_IND *)(prim));
178 PFREE(prim);
179 break;
180
181 default:
182 /* forward sys primitives to the environment */
183 if ( (opc & SYS_MASK) != 0) {
184 (void)vsi_c_primitive(VSI_CALLER primitive);
185 return (short)PEI_OK;
186 } else {
187 PFREE(prim);
188 return (short)PEI_ERROR;
189 }
190 } /* switch */
191 } /* if (prim != NULL) */
192
193 return PEI_OK;
194 }
195
196 /*
197 +------------------------------------------------------------------------------
198 | Function : pei_init
199 +------------------------------------------------------------------------------
200 | Description : This function is called by the frame. It is used
201 | to initialise the entity.
202 |
203 | Parameters : handle - task handle
204 |
205 | Return : PEI_OK - entity initialised
206 | PEI_ERROR - entity not (yet) initialised
207 +------------------------------------------------------------------------------
208 */
209 static short pei_init (T_HANDLE handle)
210 {
211 (void)TRACE_FUNCTION ("SM pei_init");
212
213 /*
214 * Initialize task handle
215 */
216 sm_handle = handle;
217 /*
218 * Open communication channels
219 */
220 if (hCommACI < VSI_OK)
221 {
222 if ((hCommACI = vsi_c_open(VSI_CALLER ACI_NAME)) < VSI_OK)
223 {
224 return (short)PEI_ERROR;
225 }
226 }
227
228 if (hCommMM < VSI_OK)
229 {
230 /*#ifdef SM_EDGE */
231 if ((hCommMM = vsi_c_open(VSI_CALLER GMM_NAME)) < VSI_OK)
232 /*#else */ /* #ifdef SM_EDGE */
233 /* if ((hCommMM = vsi_c_open(VSI_CALLER MM_NAME)) < VSI_OK)
234 #endif */ /*#ifdef SM_EDGE*/
235 {
236 return (short)PEI_ERROR;
237 }
238 }
239
240 if (hCommUPM < VSI_OK)
241 {
242 if ((hCommUPM = vsi_c_open (VSI_CALLER UPM_NAME)) < VSI_OK)
243 {
244 return (short)PEI_ERROR;
245 }
246 }
247
248 /* Clear static entity data store */
249 memset(&sm_data, 0, sizeof(sm_data));
250
251 /* Initialize multi-entity state machine */
252 sm_sequencer_init();
253
254 /*
255 * Initialize entity data (call init functions)
256 */
257 (void)ccd_init();
258
259 return (short)PEI_OK;
260 }
261
262 /*
263 +------------------------------------------------------------------------------
264 | Function : pei_timeout
265 +------------------------------------------------------------------------------
266 | Description : This function is called by the frame when a timer has expired.
267 |
268 | Parameters : index - timer index
269 |
270 | Return : PEI_OK - timeout processed
271 | PEI_ERROR - timeout not processed
272 |
273 +------------------------------------------------------------------------------
274 */
275
276 static short pei_timeout (U16 index)
277 {
278 (void)TRACE_FUNCTION("pei_timeout");
279
280 /*
281 * Process timeout
282 */
283 sm_disp_pei_timeout(index);
284
285 return PEI_OK;
286 }
287
288 /*
289 +------------------------------------------------------------------------------
290 | Function : pei_exit
291 +------------------------------------------------------------------------------
292 | Description : This function is called by the frame when the entity
293 | is terminated. All open resources are freed.
294 |
295 | Parameters : -
296 |
297 | Return : PEI_OK - exit sucessful
298 | PEI_ERROR - exit not successful
299 +------------------------------------------------------------------------------
300 */
301 static short pei_exit (void)
302 {
303 int nsapi;
304 (void)TRACE_FUNCTION ("SM pei_exit");
305
306 /*
307 * Clean up entity data
308 */
309
310 for (nsapi = (int)NAS_NSAPI_5; nsapi < NAS_SIZE_NSAPI; nsapi++) {
311 int index = sm_nsapi_to_index((U16)nsapi);
312
313 if (sm_data.sm_context_array[index] != NULL) {
314 /* sm_free_context_data_by_nsapi also sets pointer to NULL */
315 sm_free_context_data_by_nsapi(nsapi);
316 }
317
318 if (sm_data.sm_pending_mt_array[index] != NULL) {
319 /* sm_free_pending_mt_context_by_index also sets pointer to NULL */
320 sm_free_pending_mt_context_by_index((U16)index);
321 }
322 }
323
324 sm_sequencer_exit();
325
326 /* Exit CCD to clean up data stores */
327 (void)ccd_exit();
328
329 /*
330 * Close communication channels
331 */
332 (void)vsi_c_close(VSI_CALLER hCommACI);
333 hCommACI = VSI_ERROR;
334
335 (void)vsi_c_close(VSI_CALLER hCommMM);
336 hCommMM = VSI_ERROR;
337
338 (void)vsi_c_close(VSI_CALLER hCommUPM);
339 hCommUPM = VSI_ERROR;
340
341 return (short)PEI_OK;
342 }
343
344 /*
345 +------------------------------------------------------------------------------
346 | Function : pei_config
347 +------------------------------------------------------------------------------
348 | Description : This function is called by the frame when a primitive is
349 | received indicating dynamic configuration.
350 |
351 | This function is not used in this entity.
352 |
353 | Parameters : handle - Communication handle
354 |
355 | Return : PEI_OK - sucessful
356 | PEI_ERROR - not successful
357 +------------------------------------------------------------------------------
358 */
359 static short pei_config (char *inString)
360 {
361 (void)TRACE_FUNCTION ("SM pei_config");
362 (void)TRACE_FUNCTION (inString);
363
364 #ifdef DEBUG
365 if ( strcmp(inString, "DUMP_STATE") == 0) {
366 sm_dump_state();
367 }
368 #endif
369
370 return (short)PEI_OK;
371 }
372
373 /*
374 +------------------------------------------------------------------------------
375 | Function : pei_monitor
376 +------------------------------------------------------------------------------
377 | Description : This function is called by the frame in case sudden entity
378 | specific data is requested (e.g. entity Version).
379 |
380 | Parameters : out_monitor - return the address of the data to be
381 | monitoredCommunication handle
382 |
383 | Return : PEI_OK - sucessful (address in out_monitor is valid)
384 | PEI_ERROR - not successful
385 +------------------------------------------------------------------------------
386 */
387 /*@-compdef@*/ /*@-mods@*/
388 static short pei_monitor (void **out_monitor) /*@globals undef sm_mon@*/
389 {
390 (void)TRACE_FUNCTION ("SM pei_monitor");
391
392 /*
393 * Version = "0.S" (S = Step).
394 */
395 sm_mon.version = "SM 0.1";
396 *out_monitor = &sm_mon;
397
398 return PEI_OK;
399 }
400 /*@=compdef@*/ /*@=mods@*/
401
402 /*==== PUBLIC FUNCTIONS =====================================================*/
403
404 /*
405 +------------------------------------------------------------------------------
406 | Function : pei_create
407 +------------------------------------------------------------------------------
408 | Description : This function is called by the frame when the process is
409 | created.
410 |
411 | Parameters : out_name - Pointer to the buffer in which to locate
412 | the name of this entity
413 |
414 | Return : PEI_OK - entity created successfuly
415 | PEI_ERROR - entity could not be created
416 |
417 +------------------------------------------------------------------------------
418 */
419 short pei_create (T_PEI_INFO **info)
420 {
421 /*@-nullassign@*/
422 static T_PEI_INFO pei_info =
423 {
424 /*@i1@*/ SM_NAME, /* name */
425 { /* pei-table */
426 pei_init,
427 pei_exit,
428 pei_primitive,
429 pei_timeout,
430 NULL, /* no pei_signal function */
431 NULL, /* no pei_run function */
432 pei_config,
433 pei_monitor
434 },
435 (U32)2048, /* stack size */
436 (U16)10, /* queue entries */
437 (U16)165, /* priority (1->low, 255->high) */
438 (U16)SM_TIMER_MAX, /* number of timers */
439 (U8)0x03 /* flags: bit 0 active(0) body/passive(1) */
440 }; /* bit 1 com by copy(0)/reference(1) */
441 /*@=nullassign@*/
442
443 (void)TRACE_FUNCTION ("SM pei_create");
444
445 /*
446 * Close Resources if open
447 */
448 if (first_access)
449 {
450 first_access = FALSE;
451 } else {
452 (void)pei_exit();
453 }
454
455 /*
456 * Export startup configuration data
457 */
458 *info = &pei_info;
459
460 return PEI_OK;
461 }
462
463 /*==== END OF FILE ==========================================================*/