comparison src/g23m-gsm/cc/cc_time.c @ 104:27a4235405c6

src/g23m-gsm: import from LoCosto source
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 04 Oct 2016 18:24:05 +0000
parents
children
comparison
equal deleted inserted replaced
103:76d139c7a25e 104:27a4235405c6
1 /*
2 +-----------------------------------------------------------------------------
3 | Project : GSM-PS (6147)
4 | Modul : CC_TIME
5 +-----------------------------------------------------------------------------
6 | Copyright 2002 Texas Instruments Berlin, AG
7 | All rights reserved.
8 |
9 | This file is confidential and a trade secret of Texas
10 | Instruments Berlin, AG
11 | The receipt of or possession of this file does not convey
12 | any rights to reproduce or disclose its contents or to
13 | manufacture, use, or sell anything it may describe, in
14 | whole, or in part, without the specific written consent of
15 | Texas Instruments Berlin, AG.
16 +-----------------------------------------------------------------------------
17 | Purpose : This Modul defines the timer handling functions
18 | for the component CC of the mobile station
19 +-----------------------------------------------------------------------------
20 */
21
22 #ifndef CC_TIM_C
23 #define CC_TIM_C
24
25 #define ENTITY_CC
26 /*==== INCLUDES ===================================================*/
27
28 #include <string.h>
29 #include "typedefs.h"
30 #include "pcm.h"
31 #include "vsi.h"
32 #include "custom.h"
33 #include "gsm.h"
34 #include "message.h"
35 #include "ccdapi.h"
36 #include "prim.h"
37 #include "cnf_cc.h"
38 #include "mon_cc.h"
39 #include "pei.h"
40 #include "tok.h"
41 #include "cc.h"
42 #include "cc_em.h"
43
44 /*==== EXPORT =====================================================*/
45 /*==== PRIVAT =====================================================*/
46 /*==== PROTOTYPES =====================================================*/
47 /* Implements Measure# 30, 31 */
48 LOCAL void tim_mncc_rel_ind (void);
49 /*==== VARIABLES ==================================================*/
50
51 /*==== FUNCTIONS ==================================================*/
52
53 /*
54 +--------------------------------------------------------------------+
55 | PROJECT : GSM-PS (6147) MODULE : CC_TIM |
56 | STATE : code ROUTINE : tim_exec_timeout |
57 +--------------------------------------------------------------------+
58
59 PURPOSE : execute timeout
60
61 */
62
63 GLOBAL void tim_exec_timeout (USHORT index)
64 {
65 GET_INSTANCE_DATA;
66
67 TRACE_FUNCTION ("tim_exec_timeout()");
68
69 /*
70 * Processing of Timeout Function
71 */
72 if (index < MAX_CC_CALLS)
73 {
74 /*
75 * Not DTMF (T336, T337), any other CC timer
76 */
77 cc_data->ti = cc_data->stored_ti_values[index];
78 cc_data->index_ti = (UBYTE)index;
79
80 switch (cc_data->state[cc_data->index_ti])
81 {
82 case M_CC_CS_01:
83 tim_t303_u0_1 ();
84 break;
85 case M_CC_CS_03:
86 tim_t332_u0_3 ();
87 break;
88 case M_CC_CS_05:
89 tim_t335_u0_5 ();
90 break;
91 case M_CC_CS_1:
92 tim_t303_u1 ();
93 break;
94 case M_CC_CS_3:
95 tim_t310_u3 ();
96 break;
97 case M_CC_CS_8:
98 tim_t313_u8 ();
99 break;
100 case M_CC_CS_11:
101 tim_t305_u11 ();
102 break;
103 case M_CC_CS_19:
104 tim_t308_u19 ();
105 break;
106 case M_CC_CS_26:
107 tim_t323_u26 ();
108 break;
109 }
110 }
111 else
112 {
113 /*
114 * DTMF timer, either T336 or T337
115 */
116 T_DTMF * p_dtmf;
117
118 cc_data->index_ti = (UBYTE)(index - MAX_CC_CALLS);
119 cc_data->ti = cc_data->stored_ti_values[cc_data->index_ti];
120 p_dtmf = &cc_data->dtmf[cc_data->index_ti];
121
122 switch (p_dtmf->state)
123 {
124 case DTMF_SEND_REQUEST:
125 tim_t336 ();
126 break;
127 case DTMF_STOP_REQUEST:
128 tim_t337 ();
129 break;
130 default: /* Not expected */
131 break;
132 }
133 }
134 }
135 /*
136 +--------------------------------------------------------------------+
137 | PROJECT : GSM-PS (6147) MODULE : CC_TIM |
138 | STATE : code ROUTINE : tim_t303_u0_1 |
139 +--------------------------------------------------------------------+
140
141 PURPOSE : Timeout of timer T303 in state U0.1
142
143 */
144
145 GLOBAL void tim_t303_u0_1 ()
146 {
147 PALLOC (rej_ind, MNCC_REJECT_IND);
148
149 GET_INSTANCE_DATA;
150
151 TRACE_FUNCTION ("tim_t303_u0_1()");
152
153 EM_CC_TIMEOUT_T303;
154
155 rej_ind->ti = cc_data->ti;
156 rej_ind->cause = CAUSE_MAKE(DEFBY_STD, ORIGSIDE_MS, MNCC_CC_ORIGINATING_ENTITY, M_CC_CAUSE_TIMER);
157 PSENDX (MMI, rej_ind);
158 for_rel_req ();
159 cc_set_state (M_CC_CS_0);
160 }
161
162 /*
163 +--------------------------------------------------------------------+
164 | PROJECT : GSM-PS (6147) MODULE : CC_TIM |
165 | STATE : code ROUTINE : tim_t303_u1 |
166 +--------------------------------------------------------------------+
167
168 PURPOSE : Timeout of timer T303 in state U1
169
170 */
171
172 GLOBAL void tim_t303_u1 ()
173 {
174 GET_INSTANCE_DATA;
175
176 TRACE_FUNCTION ("tim_t303_u1()");
177
178 EM_CC_TIMEOUT_T303;
179
180 cc_data->timer [cc_data->index_ti] = T303;
181 cc_disconnect_after_timeout ();
182 cc_set_state (M_CC_CS_11);
183 }
184
185 /*
186 +--------------------------------------------------------------------+
187 | PROJECT : GSM-PS (6147) MODULE : CC_TIM |
188 | STATE : code ROUTINE : tim_t305_u11 |
189 +--------------------------------------------------------------------+
190
191 PURPOSE : Timeout of timer T305 in state U11
192
193 */
194
195 GLOBAL void tim_t305_u11 ()
196 {
197 PALLOC (disc_ind, MNCC_DISCONNECT_IND);
198
199 GET_INSTANCE_DATA;
200
201 TRACE_FUNCTION ("tim_t305_u11()");
202
203 cc_data->timer [cc_data->index_ti] = T305;
204 CCD_START;
205 {
206 MCAST (release, U_RELEASE);
207
208 cc_build_release (release,
209 cc_data->cc_cause[cc_data->index_ti],
210 NULL, MNCC_SS_VER_NOT_PRES);
211 for_release (release);
212 }
213 CCD_END;
214
215 disc_ind->ti = cc_data->ti;
216 disc_ind->cause = cc_data->cc_cause [cc_data->index_ti];
217 /* Setting raw_cause to empty as this is a local release
218 * of MM connection,CC is not receiving any cause value
219 * from Network
220 */
221 disc_ind->c_raw_cause = 0;
222 disc_ind->diagnostic = NOT_PRESENT_8BIT;
223 disc_ind->progress_desc = MNCC_PROG_NOT_PRES;
224 PSENDX (MMI, disc_ind);
225
226 TIMERSTART (T308, T308_VALUE);
227 cc_set_state (M_CC_CS_19);
228 }
229
230 /*
231 +--------------------------------------------------------------------+
232 | PROJECT : GSM-PS (6147) MODULE : CC_TIM |
233 | STATE : code ROUTINE : tim_t308_u19 |
234 +--------------------------------------------------------------------+
235
236 PURPOSE : Timeout of timer T308 in state U19
237
238 */
239
240 GLOBAL void tim_t308_u19 ()
241 {
242 GET_INSTANCE_DATA;
243
244 TRACE_FUNCTION ("tim_t308_u19()");
245
246 cc_data->timer [cc_data->index_ti] = T308;
247
248 if (cc_data->t308_counter [cc_data->index_ti] EQ 0)
249 {
250 CCD_START;
251 {
252 MCAST (release, U_RELEASE);
253
254 cc_data->t308_counter[cc_data->index_ti]++;
255 cc_build_release (release,
256 cc_data->cc_cause [cc_data->index_ti],
257 NULL, MNCC_SS_VER_NOT_PRES);
258 for_release (release);
259 }
260 CCD_END;
261 TIMERSTART (T308, T308_VALUE);
262 }
263 else
264 {
265 cc_reset_dtmf ();
266
267 {
268 PALLOC (rel_cnf, MNCC_RELEASE_CNF);
269 rel_cnf->ti = cc_data->ti;
270 rel_cnf->cause = CAUSE_MAKE(DEFBY_STD, ORIGSIDE_MS, MNCC_CC_ORIGINATING_ENTITY, M_CC_CAUSE_TIMER);
271 rel_cnf->c_raw_cause = 0;
272 PSENDX (MMI, rel_cnf);
273 }
274
275 for_rel_req ();
276 cc_set_state (M_CC_CS_0);
277 }
278 }
279
280 /*
281 +--------------------------------------------------------------------+
282 | PROJECT : GSM-PS (6147) MODULE : CC_TIM |
283 | STATE : code ROUTINE : tim_t310_u3 |
284 +--------------------------------------------------------------------+
285
286 PURPOSE : Timeout of timer T310 in state U3
287
288 */
289
290 GLOBAL void tim_t310_u3 ()
291 {
292 GET_INSTANCE_DATA;
293
294 TRACE_FUNCTION ("tim_t310_u3()");
295
296 cc_data->timer [cc_data->index_ti] = T310;
297 cc_disconnect_after_timeout ();
298 cc_set_state (M_CC_CS_11);
299 }
300
301 /*
302 +--------------------------------------------------------------------+
303 | PROJECT : GSM-PS (6147) MODULE : CC_TIM |
304 | STATE : code ROUTINE : tim_t313_u8 |
305 +--------------------------------------------------------------------+
306
307 PURPOSE : Timeout of timer T313 in state U8
308
309 */
310
311 GLOBAL void tim_t313_u8 ()
312 {
313 GET_INSTANCE_DATA;
314
315 PALLOC (setup_comp, MNCC_SETUP_COMPL_IND);
316
317 TRACE_FUNCTION ("tim_t313_u8()");
318
319
320 EM_CC_DISCONNECT_SENT;
321
322 cc_data->timer [cc_data->index_ti] = T313;
323 CCD_START;
324 {
325 MCAST (disconnect, U_DISCONNECT);
326
327 cc_build_disconnect (disconnect,
328 CAUSE_MAKE(DEFBY_STD,
329 ORIGSIDE_MS,
330 MNCC_CC_ORIGINATING_ENTITY,
331 M_CC_CAUSE_TIMER),
332 NULL, MNCC_SS_VER_NOT_PRES);
333 for_disconnect (disconnect);
334 }
335 CCD_END;
336
337 setup_comp->ti = cc_data->ti;
338 setup_comp->cause = CAUSE_MAKE(DEFBY_STD,
339 ORIGSIDE_MS,
340 MNCC_CC_ORIGINATING_ENTITY,
341 M_CC_CAUSE_TIMER);
342 PSENDX (MMI, setup_comp);
343 TIMERSTART (T305, T305_VALUE);
344 cc_set_state (M_CC_CS_11);
345 }
346
347 /*
348 +--------------------------------------------------------------------+
349 | PROJECT : GSM-PS (6147) MODULE : CC_TIM |
350 | STATE : code ROUTINE : tim_t323_u26 |
351 +--------------------------------------------------------------------+
352
353 PURPOSE : Timeout of timer T323 in state U26
354
355 */
356
357 GLOBAL void tim_t323_u26 ()
358 {
359 GET_INSTANCE_DATA;
360
361 PALLOC (modify_cnf, MNCC_MODIFY_CNF);
362
363 TRACE_FUNCTION ("tim_t323_u26()");
364
365
366
367 cc_data->timer [cc_data->index_ti] = T323;
368
369 CCD_START;
370 {
371 MCAST (disconnect, U_DISCONNECT);
372
373 cc_build_disconnect (disconnect,
374 CAUSE_MAKE(DEFBY_STD,
375 ORIGSIDE_MS,
376 MNCC_CC_ORIGINATING_ENTITY,
377 M_CC_CAUSE_TIMER),
378 NULL, MNCC_SS_VER_NOT_PRES);
379 for_disconnect (disconnect);
380 }
381 CCD_END;
382
383 modify_cnf->ti = cc_data->ti;
384 modify_cnf->cause = CAUSE_MAKE(DEFBY_STD, ORIGSIDE_MS, MNCC_CC_ORIGINATING_ENTITY, M_CC_CAUSE_TIMER);
385 /* Setting raw_cause to empty as we are not sending any cause from network*/
386 modify_cnf->c_raw_cause = 0;
387
388 PSENDX (MMI, modify_cnf);
389
390 TIMERSTART (T305, T305_VALUE);
391 cc_set_state (M_CC_CS_11);
392 }
393
394 /*
395 +--------------------------------------------------------------------+
396 | PROJECT : GSM-PS (6147) MODULE : CC_TIM |
397 | STATE : code ROUTINE : tim_t332_u0_3 |
398 +--------------------------------------------------------------------+
399
400 PURPOSE : Timeout of timer T332 in state U0.3
401
402 */
403
404 GLOBAL void tim_t332_u0_3 ()
405 {
406 GET_INSTANCE_DATA;
407
408 TRACE_FUNCTION ("tim_t332_u0_3()");
409
410
411 cc_data->timer [cc_data->index_ti] = T332;
412
413 /* Inform MMI */
414 /* Implements Measure# 30, 31 */
415 tim_mncc_rel_ind ();
416
417 /* Send RELEASE COMPLETE to network */
418 CCD_START;
419 {
420 MCAST (rel_com, U_RELEASE_COMP);
421 cc_build_release_complete (rel_com, CAUSE_MAKE(DEFBY_STD,
422 ORIGSIDE_MS,
423 MNCC_CC_ORIGINATING_ENTITY,
424 M_CC_CAUSE_TIMER));
425 for_release_complete (rel_com);
426 }
427 CCD_END;
428
429 /* Release MM connection */
430 for_rel_req ();
431
432 /* Next state is NULL */
433 cc_set_state (M_CC_CS_0);
434 }
435
436 /*
437 +--------------------------------------------------------------------+
438 | PROJECT : GSM-PS (6147) MODULE : CC_TIM |
439 | STATE : code ROUTINE : tim_t335_u0_5 |
440 +--------------------------------------------------------------------+
441
442 PURPOSE : Timeout of timer T335 in state U0.5
443
444 */
445
446 GLOBAL void tim_t335_u0_5 ()
447 {
448 GET_INSTANCE_DATA;
449 TRACE_FUNCTION ("tim_t335_u0_5()");
450
451 cc_data->timer [cc_data->index_ti] = T335;
452
453 /* Forget stored setup container */
454 PFREE (cc_data->stored_ccbs_setup);
455 cc_data->stored_ccbs_setup = NULL;
456
457 /* Inform MMI */
458 /* Implements Measure# 30, 31 */
459 tim_mncc_rel_ind ();
460
461 /* Send RELEASE COMPLETE to network */
462 CCD_START;
463 {
464 MCAST (rel_com, U_RELEASE_COMP);
465 cc_build_release_complete (rel_com, CAUSE_MAKE(DEFBY_STD,
466 ORIGSIDE_MS,
467 MNCC_CC_ORIGINATING_ENTITY,
468 M_CC_CAUSE_TIMER));
469 for_release_complete (rel_com);
470 }
471 CCD_END;
472
473 /* Release MM connection */
474 for_rel_req ();
475
476 /* Next state is NULL */
477 cc_set_state (M_CC_CS_0);
478 }
479
480 /*
481 +--------------------------------------------------------------------+
482 | PROJECT : GSM-PS (6147) MODULE : CC_TIM |
483 | STATE : code ROUTINE : tim_t336 |
484 +--------------------------------------------------------------------+
485
486 PURPOSE : Timeout of timer T336
487
488 */
489
490 GLOBAL void tim_t336 ()
491 {
492 GET_INSTANCE_DATA;
493
494 T_DTMF * p_dtmf;
495
496 TRACE_FUNCTION ("tim_t336()");
497
498 cc_data->timer [cc_data->index_ti] = T336;
499 p_dtmf = &cc_data->dtmf[cc_data->index_ti];
500
501 /*
502 * Send error indication to MMI. DTMF transmission maybe has failed.
503 * This point may be discussed, but TS 24.008 doesn't say that a
504 * positive indication as a feedback for a successful transmission
505 * should be generated.
506 */
507 {
508 PALLOC (dtmf_cnf, MNCC_START_DTMF_CNF);
509 dtmf_cnf->ti = cc_data->ti;
510 dtmf_cnf->key = p_dtmf->key;
511 dtmf_cnf->cause = CAUSE_MAKE(DEFBY_STD, ORIGSIDE_MS, MNCC_CC_ORIGINATING_ENTITY, M_CC_CAUSE_TIMER);
512 dtmf_cnf->dtmf_mod = p_dtmf->mode;
513 PSENDX (MMI, dtmf_cnf);
514 }
515
516 cc_stop_dtmf ();
517 }
518
519 /*
520 +--------------------------------------------------------------------+
521 | PROJECT : GSM-PS (6147) MODULE : CC_TIM |
522 | STATE : code ROUTINE : tim_t337 |
523 +--------------------------------------------------------------------+
524
525 PURPOSE : Timeout of timer T337
526
527 */
528
529 GLOBAL void tim_t337 ()
530 {
531 GET_INSTANCE_DATA;
532
533 TRACE_FUNCTION ("tim_t337()");
534
535 cc_data->timer [cc_data->index_ti] = T337;
536
537 cc_stop_dtmf ();
538 }
539
540
541
542 /* Implements Measure# 30, 31 */
543 /*
544 +--------------------------------------------------------------------+
545 | PROJECT : GSM-PS (6147) MODULE : CC_TIM |
546 | STATE : code ROUTINE : tim_mncc_rel_ind |
547 +--------------------------------------------------------------------+
548
549 PURPOSE : Build and send MNCC_RELEASE_IND
550
551 */
552
553 LOCAL void tim_mncc_rel_ind (void)
554 {
555 GET_INSTANCE_DATA;
556
557 TRACE_FUNCTION ("tim_mncc_rel_ind");
558 {
559 PALLOC (release, MNCC_RELEASE_IND);
560 release->ti = cc_data->ti;
561 release->cause = CAUSE_MAKE(DEFBY_STD, ORIGSIDE_MS, MNCC_CC_ORIGINATING_ENTITY, M_CC_CAUSE_TIMER);
562 release->c_raw_cause = 0;
563 PSENDX (MMI, release);
564 }
565 }
566
567 #endif /* #ifndef CC_TIM_C */