comparison src/aci2/aci/psa_ccp.c @ 3:93999a60b835

src/aci2, src/condat2: import of g23m/condat source pieces from TCS211
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 26 Sep 2016 00:29:36 +0000
parents
children 97b311bae21f
comparison
equal deleted inserted replaced
2:c41a534f33c6 3:93999a60b835
1 /*
2 +-----------------------------------------------------------------------------
3 | Project : GSM-PS (6147)
4 | Modul : PSA_CCP
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 module defines the processing functions for the
18 | primitives send to the protocol stack adapter by call
19 | control.
20 +-----------------------------------------------------------------------------
21 */
22
23 #ifndef PSA_CCP_C
24 #define PSA_CCP_C
25 #endif
26
27 #include "aci_all.h"
28
29 /*==== INCLUDES ===================================================*/
30 #include "ccdapi.h"
31
32 #include "aci_cmh.h"
33 #include "ati_cmd.h"
34 #include "aci_cmd.h"
35 #include "aci_mem.h"
36 #include "aci_lst.h"
37
38 #ifdef FAX_AND_DATA
39 #include "aci_fd.h"
40 #endif /* of #ifdef FAX_AND_DATA */
41
42 #include "aci.h"
43 #include "psa.h"
44 #include "psa_cc.h"
45 #include "psa_ss.h"
46 #include "psa_mmi.h"
47 #include "psa_mm.h"
48 #include "cmh.h"
49 #include "cmh_cc.h"
50
51 #ifdef SIM_TOOLKIT
52 #include "psa_sat.h"
53 #include "cmh_sat.h"
54 #endif /* of #ifdef SIM_TOOLKIT */
55
56 #include "aoc.h"
57 #include "psa_sim.h"
58
59 #if defined (FF_WAP) || defined (FF_SAT_E)
60 #include "wap_aci.h"
61 #endif /* of FF_WAP */
62
63 #include "l4_tim.h"
64
65 /*==== CONSTANTS ==================================================*/
66
67
68 /*==== TYPES ======================================================*/
69
70
71 /*==== EXPORT =====================================================*/
72
73 #ifdef FF_EM_MODE
74 EXTERN USHORT em_relcs;
75 #endif /* FF_EM_MODE
76
77 /*==== VARIABLES ==================================================*/
78
79 EXTERN T_PCEER causeMod;
80 EXTERN SHORT causeCeer;
81
82 /*==== FUNCTIONS ==================================================*/
83
84
85 /*
86 +-------------------------------------------------------------------+
87 | PROJECT : GSM-PS (6147) MODULE : PSA_CCP |
88 | ROUTINE : psa_mncc_setup_ind |
89 +-------------------------------------------------------------------+
90
91 PURPOSE : processes the MNCC_SETUP_IND primitive send by CC.
92 this indicates an incoming call.
93
94 */
95 // CC test 0319
96 extern void CongiureGPIO_Internal(int GpioPin);
97 extern void HighGPIO(int GpioPin);
98 extern void LowGPIO(int GpioPin);
99 // end
100
101 GLOBAL const void psa_mncc_setup_ind
102 ( T_MNCC_SETUP_IND *mncc_setup_ind )
103 {
104 SHORT cId; /* holds call id */
105 T_CC_CALL_TBL * pCtbNtry; /* holds pointer to call table entry */
106 int i;
107
108 TRACE_FUNCTION ("psa_mncc_setup_ind()");
109
110 causeMod = P_CEER_mod; /* Clear module which was set for ceer */
111 causeCeer = CEER_NotPresent; /* Clear extended error cause */
112
113 // CC test 0319
114 CongiureGPIO_Internal(1);
115 // LowGPIO(1);
116 // end
117
118 /* stop redialling timer if necessary */
119 if (rdlPrm.rdlcId NEQ NO_ENTRY)
120 {
121 TIMERSTOP(ACI_REPEAT_HND);
122
123 #ifdef SIM_TOOLKIT
124 if( ( ccShrdPrm.ctb[rdlPrm.rdlcId]->SATinv & SAT_REDIAL ) )
125 { /* This is the call invoked by SAT */
126 T_ACI_SAT_TERM_RESP resp_data;
127
128 psaSAT_InitTrmResp( &resp_data );
129 psaSAT_SendTrmResp( RSLT_USR_CLR_DWN, &resp_data );
130 }
131 #endif /* SIM_TOOLKIT */
132
133 psaCC_FreeCtbNtry (rdlPrm.rdlcId);
134 for(i = 0; i < CMD_SRC_MAX; i++)
135 {
136 R_AT(RAT_RDL, i)(REDIAL_STOP);
137 }
138 /* reset some redial parameter */
139 rdlPrm.rdlcId = NO_ENTRY;
140 }
141
142 /*
143 *-------------------------------------------------------------------
144 * check for new entry in call table
145 *-------------------------------------------------------------------
146 */
147 cId = psaCC_ctbNewEntry();
148
149 if( cId < 0 )
150 {
151 /*
152 * disconnect call, due to full call table.
153 */
154 {
155 UBYTE ti = mncc_setup_ind -> ti;
156 PREUSE (mncc_setup_ind, mncc_disconnect_req, MNCC_DISCONNECT_REQ);
157 mncc_disconnect_req -> ti = ti;
158 mncc_disconnect_req -> cause = MNCC_CAUSE_USER_BUSY;
159 mncc_disconnect_req -> fac_inf.l_fac = 0;
160 mncc_disconnect_req -> ss_version = SS_VER_NOT_PRES;
161 PSENDX (CC, mncc_disconnect_req);
162 }
163
164 TRACE_EVENT ("MTC rejected due to full call table");
165
166 return;
167 }
168
169 /*
170 *-------------------------------------------------------------------
171 * update shared parameter and notify ACI
172 *-------------------------------------------------------------------
173 */
174 pCtbNtry = ccShrdPrm.ctb[cId];
175 pCtbNtry -> curCs = MNCC_CAUSE_NO_MS_CAUSE;
176
177 pCtbNtry -> ti = mncc_setup_ind -> ti;
178 pCtbNtry -> rptInd = mncc_setup_ind -> ri;
179 pCtbNtry -> sigInf = mncc_setup_ind -> sig;
180 pCtbNtry -> clgPty = mncc_setup_ind -> calling_party;
181 pCtbNtry -> clgPtySub = mncc_setup_ind -> calling_party_sub;
182
183 /*
184 * Assign called party
185 */
186 pCtbNtry -> cldPty.ton = mncc_setup_ind -> called_party.ton;
187 pCtbNtry -> cldPty.npi = mncc_setup_ind -> called_party.npi;
188 pCtbNtry -> cldPty.c_called_num =
189 mncc_setup_ind -> called_party.c_called_num;
190 if (pCtbNtry -> cldPty.called_num NEQ NULL)
191 {
192 ACI_MFREE (pCtbNtry -> cldPty.called_num);
193 pCtbNtry -> cldPty.called_num = NULL;
194 }
195 if (pCtbNtry -> cldPty.c_called_num NEQ 0)
196 {
197 ACI_MALLOC (pCtbNtry -> cldPty.called_num,
198 pCtbNtry -> cldPty.c_called_num);
199 memcpy (pCtbNtry -> cldPty.called_num,
200 mncc_setup_ind -> called_party.called_num,
201 mncc_setup_ind -> called_party.c_called_num);
202 }
203
204 /*
205 * Assign called party subaddress
206 */
207 pCtbNtry -> cldPtySub = mncc_setup_ind -> called_party_sub;
208
209 /*
210 * Assign redirecting party
211 */
212 pCtbNtry -> rdrPty.ton = mncc_setup_ind -> redirecting_party.ton;
213 pCtbNtry -> rdrPty.npi = mncc_setup_ind -> redirecting_party.npi;
214 pCtbNtry -> rdrPty.present = mncc_setup_ind -> redirecting_party.present;
215 pCtbNtry -> rdrPty.screen = mncc_setup_ind -> redirecting_party.screen;
216 pCtbNtry -> rdrPty.c_redir_num =
217 mncc_setup_ind -> redirecting_party.c_redir_num;
218 if (pCtbNtry -> rdrPty.redir_num NEQ NULL)
219 {
220 ACI_MFREE (pCtbNtry -> rdrPty.redir_num);
221 pCtbNtry -> rdrPty.redir_num = NULL;
222 }
223 if (pCtbNtry -> rdrPty.c_redir_num NEQ 0)
224 {
225 ACI_MALLOC (pCtbNtry -> rdrPty.redir_num,
226 pCtbNtry -> rdrPty.c_redir_num);
227 memcpy (pCtbNtry -> rdrPty.redir_num,
228 mncc_setup_ind -> redirecting_party.redir_num,
229 mncc_setup_ind -> redirecting_party.c_redir_num);
230 }
231
232 /*
233 * Assign redirecting party subaddress
234 */
235 pCtbNtry -> rdrPtySub.tos =
236 mncc_setup_ind -> redirecting_party_sub.tos;
237 pCtbNtry -> rdrPtySub.odd_even =
238 mncc_setup_ind -> redirecting_party_sub.odd_even;
239 pCtbNtry -> rdrPtySub.c_subaddr =
240 mncc_setup_ind -> redirecting_party_sub.c_subaddr;
241 if (pCtbNtry -> rdrPtySub.subaddr NEQ NULL)
242 {
243 ACI_MFREE (pCtbNtry -> rdrPtySub.subaddr);
244 pCtbNtry -> rdrPtySub.subaddr = NULL;
245 }
246 if (pCtbNtry -> rdrPtySub.c_subaddr NEQ 0)
247 {
248 ACI_MALLOC (pCtbNtry -> rdrPtySub.subaddr,
249 pCtbNtry -> rdrPtySub.c_subaddr);
250 memcpy (pCtbNtry -> rdrPtySub.subaddr,
251 mncc_setup_ind -> redirecting_party_sub.subaddr,
252 mncc_setup_ind -> redirecting_party_sub.c_subaddr);
253 }
254
255 /*
256 * Assign bearer caps
257 */
258 memcpy( &(pCtbNtry->BC[0]),&(mncc_setup_ind->bcpara),
259 sizeof( T_bcpara) );
260 memcpy( &(pCtbNtry->BC[1]),&(mncc_setup_ind->bcpara2),
261 sizeof( T_bcpara) );
262
263 psaCC_phbSrchNum( cId, CT_MTC );
264
265 pCtbNtry -> calStat = CS_ACT_REQ;
266 pCtbNtry -> calType = CT_MTC;
267
268 pCtbNtry -> prio = PRIO_NORM_CALL;
269 pCtbNtry -> curBC = 0;
270
271 psaCC_send_satevent( EVENT_MT_CALL, cId, FAR_END, FALSE );
272
273 /*
274 *-------------------------------------------------------------------
275 * indicate alerting
276 *-------------------------------------------------------------------
277 */
278
279 /* replace invalid/unknown sigInf by SIG_NOT_PRES */
280 switch (pCtbNtry -> sigInf)
281 {
282 case SIG_DIAL_TONE_ON:
283 case SIG_RING_BACK_TONE_ON:
284 case SIG_INT_TONE_ON:
285 case SIG_NET_CONG_TONE_ON:
286 case SIG_BUSY_TONE_ON:
287 case SIG_CONF_TONE_ON:
288 case SIG_ANS_TONE_ON:
289 case SIG_CALL_WAIT_TONE_ON:
290 case SIG_OFF_HOOK_WARN_TONE_ON:
291 case SIG_TONES_OFF:
292 case SIG_ALERT_OFF:
293 case SIG_NOT_PRES:
294 break; /* leave as it is */
295 default: /* replace unknown value by something well known */
296 pCtbNtry -> sigInf = SIG_NOT_PRES;
297 }
298
299 if( pCtbNtry -> sigInf NEQ SIG_NOT_PRES OR
300 ccShrdPrm.TCHasg EQ TRUE )
301 {
302 {
303 /* indicate alerting to network */
304 UBYTE ti = mncc_setup_ind -> ti;
305 PREUSE (mncc_setup_ind, mncc_alert_req, MNCC_ALERT_REQ);
306 mncc_alert_req -> ti = ti;
307 PSENDX (CC, mncc_alert_req);
308 }
309
310 cmhCC_IncomingCall (cId); /* indicate an incoming call */
311 return;
312 }
313 else
314 {
315 pCtbNtry -> alrtStat = AS_PND;
316 }
317
318 /*
319 * check for progress descriptions
320 */
321 psaCC_chkPrgDesc ( cId, mncc_setup_ind -> progress_desc, MT_SETUP );
322
323 /*
324 * start call time measurements
325 */
326 aoc_info (cId, AOC_START_TIME);
327 /*
328 *-------------------------------------------------------------------
329 * free the primitive buffer
330 *-------------------------------------------------------------------
331 */
332 PFREE (mncc_setup_ind);
333 }
334
335 /*
336 +-------------------------------------------------------------------+
337 | PROJECT : GSM-PS (6147) MODULE : PSA_CCP |
338 | ROUTINE : psa_mncc_setup_cnf |
339 +-------------------------------------------------------------------+
340
341 PURPOSE : processes the MNCC_SETUP_CNF primitive send by CC.
342 this terminates the call establishment request.
343
344 */
345
346 GLOBAL const void psa_mncc_setup_cnf
347 ( T_MNCC_SETUP_CNF *mncc_setup_cnf )
348 {
349 SHORT cId; /* holds call id */
350 T_CC_CALL_TBL * pCtbNtry; /* holds pointer to call table entry */
351 int i;
352 BOOL flag_redial = FALSE;
353
354 TRACE_FUNCTION ("psa_mncc_setup_cnf()");
355
356 /*
357 *-------------------------------------------------------------------
358 * find call in call table
359 *-------------------------------------------------------------------
360 */
361 cId = psaCC_ctbFindTi( mncc_setup_cnf -> ti );
362
363 if( cId < 0 )
364 {
365 /*
366 * ignore primitive, due to not found transaction identifier.
367 */
368 TRACE_EVENT ("primitive rejected due to unused ti");
369 PFREE(mncc_setup_cnf);
370 return;
371 }
372
373 /*
374 *-------------------------------------------------------------------
375 * update shared parameter and notify ACI
376 *-------------------------------------------------------------------
377 */
378 pCtbNtry = ccShrdPrm.ctb[cId];
379 pCtbNtry -> curCs = mncc_setup_cnf -> cause;
380 pCtbNtry -> rslt = mncc_setup_cnf -> cause;
381
382
383 switch( mncc_setup_cnf -> cause )
384 {
385 case( MNCC_CAUSE_SUCCESS ): /* successful establishment, call connected */
386
387 /*
388 * MNCC_SETUP_CNF is received in call state other than CS_ACT_REQ
389 * so reject the primitive.
390 */
391 if( pCtbNtry -> calStat NEQ CS_ACT_REQ)
392 {
393 TRACE_EVENT ("MNCC_SETUP_CNF is rejected as it is received in call state other than CS_ACT_REQ");
394 break;
395 }
396 pCtbNtry -> clgPty.ton = mncc_setup_cnf -> connected_number.ton;
397 pCtbNtry -> clgPty.npi = mncc_setup_cnf -> connected_number.npi;
398 pCtbNtry -> clgPty.present = mncc_setup_cnf -> connected_number.present;
399 pCtbNtry -> clgPty.screen = mncc_setup_cnf -> connected_number.screen;
400 pCtbNtry -> clgPty.c_num = mncc_setup_cnf -> connected_number.c_num;
401
402 memcpy( pCtbNtry -> clgPty.num,
403 mncc_setup_cnf -> connected_number.num, MAX_CC_CALLING_NUMBER );
404
405 pCtbNtry -> clgPtySub.tos = mncc_setup_cnf -> connected_number_sub.tos;
406 pCtbNtry -> clgPtySub.odd_even = mncc_setup_cnf -> connected_number_sub.odd_even;
407 pCtbNtry -> clgPtySub.c_subaddr = mncc_setup_cnf -> connected_number_sub.c_subaddr;
408
409 memcpy( pCtbNtry -> clgPtySub.subaddr,
410 mncc_setup_cnf -> connected_number_sub.subaddr, SUB_LENGTH );
411
412 pCtbNtry -> inBndTns = FALSE;
413 pCtbNtry -> calStat = CS_ACT;
414
415 /* check for progress descriptions */
416 psaCC_chkPrgDesc ( cId, mncc_setup_cnf -> progress_desc, MT_CONN );
417
418
419 if(pCtbNtry->calType EQ CT_MOC_RDL)
420 {
421 pCtbNtry->calType = CT_MOC;
422 flag_redial = TRUE;
423 }
424 /* if redialling procedure was successful we finish redialling */
425 if((rdlPrm.rdlMod EQ AUTOM_REPEAT_ON) AND flag_redial)
426 {
427 for(i = 0; i < CMD_SRC_MAX; i++)
428 {
429 R_AT(RAT_RDL, i)(CALL_ATTEMPT_SUCCESSFUL);
430 }
431 pCtbNtry->rdlCnt = 0;
432 rdlPrm.rdlcId = NO_ENTRY;
433 pCtbNtry->rdlTimIndex = RDL_TIM_INDEX_NOT_PRESENT;
434 flag_redial = FALSE;
435 }
436
437 /* Inform that a call goes to active state */
438 psaCC_chngCalTypCnt( cId, +1 );
439
440 cmhCC_CallConnected( cId );
441
442 psaCC_send_satevent( EVENT_CALL_CONN, cId, FAR_END, FALSE );
443
444 aoc_info (cId,AOC_CALL_CONNECTED);
445
446 /* check for TTY service */
447 cmhCC_TTY_Control ( cId, TTY_START );
448
449 /* check for DTMF tones to send automatically */
450 psaCC_DTMFSent ( cId );
451
452 #if defined (FF_WAP) || defined (FF_SAT_E)
453 /* WAP STACK CALL is activ */
454 if (Wap_Call)
455 ccShrdPrm.wapStat = CC_WAP_STACK_UP;
456 #endif
457
458 break;
459
460 default: /* unexpected result, assumed call disconnected */
461 {
462 TRACE_EVENT_P1("[ERR] UNEXP CAUSE IN SETUP CNF=%4x", mncc_setup_cnf -> cause);
463 }
464 /*FALLTHROUGH*/ /*lint -fallthrough*/
465
466 /* unsuccessful establishment, call disconnected */
467 case( MNCC_CAUSE_MS_TIMER ):
468
469 pCtbNtry -> nrmCs = CAUSE_MAKE(DEFBY_CONDAT, ORIGSIDE_MS, CC_ORIGINATING_ENTITY, NOT_PRESENT_8BIT);
470 pCtbNtry -> rejCs = CAUSE_MAKE(DEFBY_CONDAT, ORIGSIDE_MS, CC_ORIGINATING_ENTITY, NOT_PRESENT_8BIT);
471 #ifdef FF_EM_MODE
472 em_relcs = MNCC_CAUSE_MS_TIMER;
473 #endif /* FF_EM_MODE */
474 ccShrdPrm.cIdFail = cId;
475
476 /*
477 * At this point the call has not yet gone completely always.
478 * Call Control may not be in state U0, but in state U11, having
479 * sent a DISCONNECT to the network, expecting the RELEASE
480 * from the network or expiry of T308 in CC.
481 * Implementation works, but it is not very nice here, releasing
482 * the ti and decrementing the call count too early.
483 */
484 pCtbNtry -> calStat = CS_IDL;
485
486 psaCC_chngCalTypCnt( cId, -1 );
487 psaCC_retMOCTi( pCtbNtry -> ti );
488 cmhCC_CallDisconnected (cId);
489 psaCC_FreeCtbNtry (cId);
490 break;
491 }
492 /*
493 *-------------------------------------------------------------------
494 * free the primitive buffer
495 *-------------------------------------------------------------------
496 */
497 PFREE (mncc_setup_cnf);
498
499 }
500
501 /*
502 +-------------------------------------------------------------------+
503 | PROJECT : GSM-PS (6147) MODULE : PSA_CCP |
504 | ROUTINE : psa_mncc_setup_compl_ind|
505 +-------------------------------------------------------------------+
506
507 PURPOSE : processes the MNCC_SETUP_COMPL_IND primitive send by CC.
508 this terminates the call establishment of an incoming call.
509
510 */
511
512 GLOBAL const void psa_mncc_setup_compl_ind
513 ( T_MNCC_SETUP_COMPL_IND *mncc_setup_compl_ind )
514 {
515 SHORT cId; /* holds call id */
516 T_CC_CALL_TBL * pCtbNtry; /* holds pointer to call table entry */
517
518 TRACE_FUNCTION ("psa_mncc_setup_compl_ind()");
519
520 /*
521 *-------------------------------------------------------------------
522 * find call in call table
523 *-------------------------------------------------------------------
524 */
525 cId = psaCC_ctbFindTi( mncc_setup_compl_ind -> ti );
526
527 if( cId < 0 )
528 {
529 /*
530 * ignore primitive, due to not found transaction identifier.
531 */
532 TRACE_EVENT ("primitive rejected due to unused ti");
533 PFREE(mncc_setup_compl_ind);
534 return;
535 }
536
537 /*
538 *-------------------------------------------------------------------
539 * update shared parameter and notify ACI
540 *-------------------------------------------------------------------
541 */
542 pCtbNtry = ccShrdPrm.ctb[cId];
543
544 pCtbNtry -> rslt = mncc_setup_compl_ind -> cause;
545 pCtbNtry -> curCs = mncc_setup_compl_ind -> cause;
546
547 switch( mncc_setup_compl_ind -> cause )
548 {
549 case( MNCC_CAUSE_SUCCESS ): /* successful establishment, call connected */
550
551 pCtbNtry -> inBndTns = FALSE;
552 pCtbNtry -> calStat = CS_ACT;
553
554 psaCC_setSpeechMode ();
555
556 /* check for TTY service */
557 cmhCC_TTY_Control ( cId, TTY_START );
558
559 /*
560 * Inform that a call goes to active state
561 */
562 psaCC_chngCalTypCnt( cId, +1 );
563
564 cmhCC_CallConnected( cId );
565
566 aoc_info (cId, AOC_CALL_CONNECTED);
567 break;
568
569 default: /* unexpected result, assumed call disconnected */
570 {
571 TRACE_EVENT_P1("[ERR] UNEXP CAUSE IN SETUP CMPL IND=%4x", mncc_setup_compl_ind -> cause);
572 }
573 /*FALLTHROUGH*/ /*lint -fallthrough*/
574
575 /* unsuccessful establishment, call disconnected */
576 case( MNCC_CAUSE_MS_TIMER ):
577
578 pCtbNtry -> nrmCs = CAUSE_MAKE(DEFBY_CONDAT, ORIGSIDE_MS, CC_ORIGINATING_ENTITY, NOT_PRESENT_8BIT);
579 pCtbNtry -> rejCs = CAUSE_MAKE(DEFBY_CONDAT, ORIGSIDE_MS, CC_ORIGINATING_ENTITY, NOT_PRESENT_8BIT);
580 #ifdef FF_EM_MODE
581 em_relcs = CAUSE_MAKE(DEFBY_CONDAT, ORIGSIDE_MS, CC_ORIGINATING_ENTITY, NOT_PRESENT_8BIT);
582 #endif /* FF_EM_MODE */
583 ccShrdPrm.cIdFail = cId;
584
585 /*
586 * What happens below is somewhat questionable.
587 * ACI sets the call to CS_IDL and free the transaction identifier.
588 * What happened is that on CC level, in state U8 CONNECT REQUEST the
589 * CONNECT message sent by CC has not been answered by the network by a
590 * CONNECT ACNOWLEDGE message.
591 * In this situation CC sends a DISCONNECT to the network and enters
592 * state U11 DISCONNECT REQUEST. This means, the call state in CC is
593 * still different from U0 NULL.
594 * However, problems in the field are not expected here.
595 */
596 pCtbNtry -> calStat = CS_IDL;
597
598 psaCC_chngCalTypCnt( cId, -1 );
599 psaCC_retMOCTi( pCtbNtry -> ti );
600
601 cmhCC_CallDisconnected (cId);
602 cmhCC_CallReleased (cId);
603
604 break;
605 }
606
607 /*
608 *-------------------------------------------------------------------
609 * free the primitive buffer
610 *-------------------------------------------------------------------
611 */
612 PFREE (mncc_setup_compl_ind);
613
614 }
615
616 /*
617 +-------------------------------------------------------------------+
618 | PROJECT : GSM-PS (6147) MODULE : PSA_CCP |
619 | ROUTINE : psa_mncc_reject_ind |
620 +-------------------------------------------------------------------+
621
622 PURPOSE : processes the MNCC_REJECT_IND primitive send by CC.
623 this indicates a cause for rejecting a call establishment.
624
625 */
626
627 GLOBAL const void psa_mncc_reject_ind
628 ( T_MNCC_REJECT_IND *mncc_reject_ind )
629 {
630 SHORT cId; /* holds call id */
631 T_CC_CALL_TBL * pCtbNtry; /* holds pointer to call table entry */
632
633 TRACE_FUNCTION ("psa_mncc_reject_ind()");
634
635 /*
636 *-------------------------------------------------------------------
637 * find call in call table
638 *-------------------------------------------------------------------
639 */
640 cId = psaCC_ctbFindTi( mncc_reject_ind -> ti );
641
642 if( cId < 0 )
643 {
644 /*
645 * ignore primitive, due to not found transaction identifier.
646 */
647 TRACE_EVENT ("primitive rejected due to unused ti");
648 PFREE(mncc_reject_ind);
649 return;
650 }
651 psaCC_StopDTMF (cId); /* HM 27.07.00*/
652
653 /*
654 *-------------------------------------------------------------------
655 * update shared parameter and notify ACI
656 *-------------------------------------------------------------------
657 */
658 pCtbNtry = ccShrdPrm.ctb[cId];
659 pCtbNtry -> curCs = mncc_reject_ind -> cause;
660
661 pCtbNtry -> rslt = CAUSE_MAKE(DEFBY_CONDAT, ORIGSIDE_MS, CC_ORIGINATING_ENTITY, NOT_PRESENT_8BIT);
662 pCtbNtry -> nrmCs = CAUSE_MAKE(DEFBY_CONDAT, ORIGSIDE_MS, CC_ORIGINATING_ENTITY, NOT_PRESENT_8BIT);
663 pCtbNtry -> rejCs = mncc_reject_ind -> cause;
664 /* In this case, the cause values are internal and not sent by network */
665 pCtbNtry -> numRawCauseBytes = 0;
666
667 #ifdef FF_EM_MODE
668 em_relcs = mncc_reject_ind -> cause;
669 #endif /* FF_EM_MODE */
670
671 if( GET_CAUSE_VALUE(pCtbNtry -> rejCs) NEQ NOT_PRESENT_8BIT ) ccShrdPrm.cIdFail = cId;
672
673 pCtbNtry -> calStat = CS_IDL;
674
675 psaCC_chngCalTypCnt( cId, -1 );
676 psaCC_retMOCTi( pCtbNtry -> ti );
677
678 /* monitoring for SAT radio-link failure */
679 psaCC_send_satevent( EVENT_CALL_DISC, cId, NEAR_END, TRUE );
680
681 /* check conditions for redialling */
682 cmhCC_redialCheck(cId);
683
684 #ifdef SIM_TOOLKIT
685 if( pCtbNtry->SATinv )
686 {
687 cmhSAT_NtwErr( ADD_NO_CAUSE );
688 pCtbNtry->SATinv = FALSE;
689 }
690 #endif
691 /* cmhCC_CallDisconnected(cId);*/
692 cmhCC_CPIrejectMsg(cId);
693 cmhCC_CallReleased(cId);
694
695 /* free the primitive buffer */
696 PFREE (mncc_reject_ind);
697
698 }
699
700 /*
701 +-------------------------------------------------------------------+
702 | PROJECT : GSM-PS (6147) MODULE : PSA_CCP |
703 | ROUTINE : psa_mncc_release_ind |
704 +-------------------------------------------------------------------+
705
706 PURPOSE : processes the MNCC_RELEASE_IND primitive send by CC.
707 this indicates the release of a call.
708
709 */
710
711 GLOBAL const void psa_mncc_release_ind
712 ( T_MNCC_RELEASE_IND *mncc_release_ind )
713 {
714 SHORT cId; /* holds call id */
715 T_CC_CALL_TBL * pCtbNtry; /* holds pointer to call table entry */
716
717 TRACE_FUNCTION ("psa_mncc_release_ind()");
718
719 /*
720 *-------------------------------------------------------------------
721 * find call in call table
722 *-------------------------------------------------------------------
723 */
724 cId = psaCC_ctbFindTi( mncc_release_ind -> ti );
725
726 if( cId < 0 )
727 {
728 psaCC_retMOCTi( mncc_release_ind -> ti );
729
730 /*
731 * ignore primitive, due to not found transaction identifier.
732 */
733 TRACE_EVENT ("primitive rejected due to unused ti");
734 PFREE(mncc_release_ind);
735 return;
736 }
737 psaCC_StopDTMF ( cId ); /* HM 27.07.00 */
738
739 /*
740 *-------------------------------------------------------------------
741 * update shared parameter and notify ACI
742 *-------------------------------------------------------------------
743 */
744 pCtbNtry = ccShrdPrm.ctb[cId];
745
746 pCtbNtry -> calStat = CS_DSC_REQ; /* Leave active state */
747 pCtbNtry -> curCs = mncc_release_ind -> cause;
748 pCtbNtry -> numRawCauseBytes = mncc_release_ind -> c_raw_cause;
749 pCtbNtry -> rawCauseBytes = mncc_release_ind -> raw_cause;
750
751 psaCC_setSpeechMode ();
752
753 /* check for TTY service */
754 /*cmhCC_TTY_Control ( cId );*/
755
756 if (pCtbNtry -> nrmCs EQ MNCC_CAUSE_NO_MS_CAUSE) /* no Disconnect Cause available...*/
757 {
758 pCtbNtry -> nrmCs= mncc_release_ind -> cause; /* Check ### */
759 ccShrdPrm.cIdFail = cId; /* Check ### */
760 #ifdef FF_EM_MODE
761 em_relcs = mncc_release_ind -> cause; /* Check ### */
762 #endif /* FF_EM_MODE */
763 }
764
765 pCtbNtry -> rejCs = CAUSE_MAKE(DEFBY_CONDAT, ORIGSIDE_MS, CC_ORIGINATING_ENTITY, NOT_PRESENT_8BIT);
766 pCtbNtry -> rslt = CAUSE_MAKE(DEFBY_CONDAT, ORIGSIDE_MS, CC_ORIGINATING_ENTITY, NOT_PRESENT_8BIT);
767
768 psaCC_chngCalTypCnt( cId, -1 );
769 psaCC_retMOCTi( pCtbNtry -> ti );
770
771 psaCC_send_satevent( EVENT_CALL_DISC, cId, FAR_END, TRUE );
772
773 pCtbNtry -> numRawCauseBytes = 0; /* Reset the cause value after sending the info to SAT */
774
775 cmhCC_redialCheck(cId);
776
777 /*
778 if( pCtbNtry -> CCBSstat EQ CCBSS_PSSBL OR
779 pCtbNtry -> calType EQ CT_NI_MOC )
780 */
781 switch (pCtbNtry->curCmd)
782 {
783 case( AT_CMD_A ):
784 case( AT_CMD_D ):
785 case( AT_CMD_NONE ):
786 case( AT_CMD_ABRT ):
787 {
788 cmhCC_CallDisconnected(cId);
789 cmhCC_CallReleased( cId );
790 }
791 break;
792
793 case( AT_CMD_H ):
794 case( AT_CMD_Z ):
795 case( AT_CMD_CHUP ):
796 case( AT_CMD_CHLD ):
797
798 #ifdef FF_FAX
799 case( AT_CMD_FKS ):
800 case( AT_CMD_FDT ):
801 case( AT_CMD_FDR ):
802 #endif
803 {
804 cmhCC_CallDisconnected(cId);
805 cmhCC_CPIReleaseMsg(cId);
806 }
807 break;
808 }
809
810 if (rdlPrm.rdlcId NEQ cId)
811 {/* if redialling is active no clean cId entry */
812 /*patch BE 30.06.00 to remove every other call drops*/
813 psaCC_FreeCtbNtry (cId);
814 /*end patch BE */
815 }
816
817 /* free the primitive buffer */
818 PFREE (mncc_release_ind);
819
820 }
821
822 /*
823 +-------------------------------------------------------------------+
824 | PROJECT : GSM-PS (6147) MODULE : PSA_CCP |
825 | ROUTINE : psa_mncc_release_cnf |
826 +-------------------------------------------------------------------+
827
828 PURPOSE : processes the MNCC_RELEASE_CNF primitive send by CC.
829 this confirmates the release request for a call.
830
831 */
832
833 GLOBAL const void psa_mncc_release_cnf
834 ( T_MNCC_RELEASE_CNF *mncc_release_cnf )
835 {
836 SHORT cId; /* holds call id */
837 T_CC_CALL_TBL * pCtbNtry; /* holds pointer to call table entry */
838
839 TRACE_FUNCTION ("psa_mncc_release_cnf()");
840
841 /*
842 *-------------------------------------------------------------------
843 * find call in call table
844 *-------------------------------------------------------------------
845 */
846 cId = psaCC_ctbFindTi( mncc_release_cnf -> ti );
847
848 if( cId < 0 )
849 {
850 psaCC_retMOCTi( mncc_release_cnf -> ti );
851
852 /*
853 * ignore primitive, due to not found transaction identifier.
854 */
855 TRACE_EVENT ("primitive rejected due to unused ti");
856 PFREE(mncc_release_cnf);
857 return;
858 }
859
860 /*
861 *-------------------------------------------------------------------
862 * update shared parameter and notify ACI
863 *-------------------------------------------------------------------
864 */
865 pCtbNtry = ccShrdPrm.ctb[cId];
866
867 /* HM 02-Aug-2002, done while merging SBK code, check again this code*/
868 #if 0 /* Old code */
869 if( mncc_release_cnf -> cause NEQ CAUSE_NOT_PRES )
870 {
871 pCtbNtry -> nrmCs = mncc_release_cnf -> cause;
872 ccShrdPrm.cIdFail = cId;
873 #ifdef FF_EM_MODE
874 em_relcs = mncc_release_cnf -> cause;
875 #endif /* FF_EM_MODE */
876 }
877 #endif /* #if 0 */
878
879 if (pCtbNtry -> nrmCs EQ MNCC_CAUSE_NO_MS_CAUSE) /* no Disconnect Cause available...*/
880 {
881 pCtbNtry -> nrmCs = mncc_release_cnf -> cause; /* Recheck ###*/
882 ccShrdPrm.cIdFail = cId; /* This line is considered harmful, only if cause present ### */
883 #ifdef FF_EM_MODE
884 em_relcs = mncc_release_cnf -> cause; /* Recheck ### */
885 #endif /* FF_EM_MODE */
886 }
887 pCtbNtry -> rslt = CAUSE_MAKE(DEFBY_CONDAT, ORIGSIDE_MS, CC_ORIGINATING_ENTITY, NOT_PRESENT_8BIT);
888 pCtbNtry -> rejCs = CAUSE_MAKE(DEFBY_CONDAT, ORIGSIDE_MS, CC_ORIGINATING_ENTITY, NOT_PRESENT_8BIT);
889 pCtbNtry -> curCs = pCtbNtry -> rejCs;
890 pCtbNtry -> numRawCauseBytes = mncc_release_cnf -> c_raw_cause;
891 pCtbNtry -> rawCauseBytes = mncc_release_cnf -> raw_cause;
892 #ifdef SIM_TOOLKIT
893 if(!(pCtbNtry -> SATinv & SAT_REDIAL))
894 #endif
895 pCtbNtry -> calStat = CS_IDL;
896
897 psaCC_chngCalTypCnt( cId, -1 );
898 psaCC_retMOCTi( pCtbNtry -> ti );
899
900 psaCC_send_satevent( EVENT_CALL_DISC, cId , FAR_END, TRUE );
901
902 pCtbNtry -> numRawCauseBytes = 0; /* Reset the cause value after sending the info to SAT */
903
904 cmhCC_redialCheck( cId);
905
906 cmhCC_CallReleased (cId);
907
908 /*patch BE 30.06.00 to remove every other call drops */
909 {
910 #ifdef SIM_TOOLKIT
911 if ( (pCtbNtry -> SATinv & SAT_REDIAL) EQ 0 )
912 {
913 #endif /* SIM_TOOLKIT */
914 if (rdlPrm.rdlcId NEQ cId)
915 {
916 psaCC_FreeCtbNtry (cId);
917 }
918 #ifdef SIM_TOOLKIT
919 }
920 #endif /* SIM_TOOLKIT */
921 }
922 /*end patch BE */
923
924 switch(CHLDaddInfo)
925 {
926 case (CHLD_ADD_INFO_DIAL_CAL):
927 cId = psaCC_ctbFindCall( NO_VLD_OWN, NO_VLD_CS, CT_MOC );
928 if (cId NEQ NO_ENTRY)
929 {
930 cmhCC_NewCall(cId,psaCC_ctb(cId)->curSrc,AT_CMD_D);
931 }
932 break;
933 default:
934 break;
935 }
936 /* free the primitive buffer */
937 PFREE (mncc_release_cnf);
938
939 }
940
941 /*
942 +-------------------------------------------------------------------+
943 | PROJECT : GSM-PS (6147) MODULE : PSA_CCP |
944 | ROUTINE : psa_mncc_disconnect_ind |
945 +-------------------------------------------------------------------+
946
947 PURPOSE : processes the MNCC_DISCONNECT_IND primitive send by CC.
948 this indicates the disconnection of a call.
949
950 */
951
952 GLOBAL const void psa_mncc_disconnect_ind
953 ( T_MNCC_DISCONNECT_IND *mncc_disconnect_ind )
954 {
955 SHORT cId; /* holds call id */
956 T_CC_CALL_TBL * pCtbNtry; /* holds pointer to call table entry */
957 BOOL held_call = FALSE;
958
959 TRACE_FUNCTION ("psa_mncc_disconnect_ind()");
960
961 /*
962 *-------------------------------------------------------------------
963 * find call in call table
964 *-------------------------------------------------------------------
965 */
966 cId = psaCC_ctbFindTi( mncc_disconnect_ind -> ti );
967
968 if( cId < 0 )
969 {
970 /*
971 * ignore primitive, due to not found transaction identifier.
972 */
973 TRACE_EVENT ("primitive rejected due to unused ti");
974 PFREE(mncc_disconnect_ind);
975 return;
976 }
977 psaCC_StopDTMF ( cId ); /* HM 27.07.00 */
978
979 /*
980 *-------------------------------------------------------------------
981 * update shared parameter and notify ACI
982 *-------------------------------------------------------------------
983 */
984 pCtbNtry = ccShrdPrm.ctb[cId];
985
986 pCtbNtry -> curCs = mncc_disconnect_ind -> cause;
987
988 if( mncc_disconnect_ind->diagnostic EQ DIAG_CCBS_POSSIBLE )
989 {
990 pCtbNtry -> CCBSstat = CCBSS_PSSBL;
991 }
992
993 /* CQ 23619: copy ss diagnostic to shared parameters >> */
994 pCtbNtry->ssDiag = mncc_disconnect_ind->ss_diag;
995 /* CQ 23619 << */
996
997 #if 0
998 if( mncc_disconnect_ind -> cause NEQ CAUSE_NOT_PRES )
999 {
1000 pCtbNtry -> nrmCs = mncc_disconnect_ind -> cause;
1001 ccShrdPrm.cIdFail = cId;
1002 #ifdef FF_EM_MODE
1003 em_relcs = mncc_disconnect_ind -> cause;
1004 #endif /* FF_EM_MODE */
1005 }
1006 #endif
1007
1008 pCtbNtry -> nrmCs = mncc_disconnect_ind -> cause; /* Recheck ### */
1009 ccShrdPrm.cIdFail = cId; /* Recheck ### */
1010 #ifdef FF_EM_MODE
1011 em_relcs = mncc_disconnect_ind -> cause; /* Recheck ### */
1012 #endif /* FF_EM_MODE */
1013
1014 /* remember if call is currently on hold */
1015 if (pCtbNtry -> calStat EQ CS_HLD)
1016 held_call = TRUE;
1017
1018 /* calStat has to be set before calling psaCC_chkPrgDesc, otherwise
1019 no CPI event will be send */
1020 pCtbNtry -> calStat = CS_DSC_REQ;
1021
1022 /* check for TTY service */
1023 /* cmhCC_TTY_Control ( cId ); */
1024
1025 /* check for progress descriptions */
1026 psaCC_chkPrgDesc ( cId, mncc_disconnect_ind -> progress_desc, MT_DISC );
1027
1028 pCtbNtry -> rslt = CAUSE_MAKE(DEFBY_CONDAT, ORIGSIDE_MS, CC_ORIGINATING_ENTITY, NOT_PRESENT_8BIT);
1029 pCtbNtry -> rejCs = CAUSE_MAKE(DEFBY_CONDAT, ORIGSIDE_MS, CC_ORIGINATING_ENTITY, NOT_PRESENT_8BIT);
1030
1031 pCtbNtry -> numRawCauseBytes = mncc_disconnect_ind -> c_raw_cause;
1032 pCtbNtry -> rawCauseBytes = mncc_disconnect_ind -> raw_cause;
1033
1034 psaCC_send_satevent( EVENT_CALL_DISC, cId , FAR_END, TRUE );
1035
1036 pCtbNtry -> numRawCauseBytes = 0; /* Reset the cause value after sending the info to SAT */
1037
1038 /* If call was held upon mncc_disconnect_ind it is cleared anyway */
1039 if (held_call EQ TRUE)
1040 {
1041 TRACE_EVENT ("Release a held call");
1042 cmhCC_CallDisconnected (cId);
1043 psaCC_ClearCall (cId);
1044 }
1045 else
1046 {
1047 switch( cmhCC_getcalltype(cId) )
1048 {
1049 case( VOICE_CALL ):
1050 {
1051 /*
1052 * if in-band tones are available and TCH is assigned, request to disconnect the call
1053 * GSM 04.08/5.4.4.1.1.1
1054 */
1055 /*
1056 TRACE_EVENT("psa_mncc_disconnect_ind(): --> VOICE CALL");
1057 if ((pCtbNtry -> inBndTns EQ TRUE)
1058 AND (pCtbNtry -> CCBSstat EQ NO_VLD_CCBSS)
1059 AND (ccShrdPrm.TCHasg EQ TRUE))
1060 {
1061 cmhCC_DisconnectCall (cId);
1062 }
1063 else
1064 {
1065 cmhCC_CallDisconnected (cId);
1066 }
1067 */
1068 /* check conditions for redialling */
1069 if((pCtbNtry->curCmd NEQ AT_CMD_H) AND
1070 (pCtbNtry->curCmd NEQ AT_CMD_CHUP))
1071 {
1072 cmhCC_redialCheck(cId);
1073 }
1074
1075
1076 /*
1077 * for CCBS support the "Prolonged Clearing Procedure"
1078 * GSM 04.08/5.4.4.2.1
1079 */
1080 cmhCC_CallDisconnected (cId);
1081
1082 if ((pCtbNtry->inBndTns EQ TRUE) /* 5.4.4.2.1.1 */
1083 AND (pCtbNtry->CCBSstat EQ NO_VLD_CCBSS))
1084 {
1085 if (ccShrdPrm.TCHasg NEQ TRUE)
1086 {
1087 TRACE_EVENT ("4.08/5.4.4.2.1.1 i)");
1088 psaCC_ClearCall (cId);
1089 }
1090 else
1091 {
1092 TRACE_EVENT ("4.08/5.4.4.2.1.1 ii)");
1093 psaCC_setSpeechMode();
1094 }
1095 }
1096 else if (pCtbNtry->CCBSstat EQ CCBSS_PSSBL) /* 5.4.4.2.2.1 */
1097 {
1098 TRACE_EVENT ("4.08/5.4.4.2.2.1");
1099 psaCC_setSpeechMode();
1100 cmhCC_SndDiscRsn( cId ); /* FIXME: to emmit BUSY, but this is not good here
1101 since BUSY is final result code and will be
1102 emitted on Release again !!!!! */
1103 }
1104 else if ((pCtbNtry->inBndTns NEQ TRUE) /* 5.4.4.2.3.1 */
1105 AND (pCtbNtry->CCBSstat EQ NO_VLD_CCBSS))
1106 {
1107 TRACE_EVENT ("4.08/5.4.4.2.3.1");
1108 psaCC_ClearCall (cId);
1109 }
1110 else /* 5.4.4.2.3.2 */
1111 {
1112 TRACE_EVENT ("4.08/5.4.4.2.3.2");
1113 psaCC_ClearCall (cId);
1114 }
1115 break;
1116 }
1117 default: /* all non voice calls */
1118 {
1119 /*
1120 * see cmh_cc.h T_CC_CALL_TYPE for all other call types
1121 */
1122 TRACE_EVENT("psa_mncc_disconnect_ind(): --> DATA CALL");
1123 cmhCC_CallDisconnected (cId);
1124 psaCC_ClearCall (cId);
1125 break;
1126 }
1127 }
1128 } /* else */
1129
1130 /* free the primitive buffer */
1131 PFREE (mncc_disconnect_ind);
1132 }
1133
1134 /*
1135 +-------------------------------------------------------------------+
1136 | PROJECT : GSM-PS (6147) MODULE : PSA_CCP |
1137 | ROUTINE : psa_mncc_alert_ind |
1138 +-------------------------------------------------------------------+
1139
1140 PURPOSE : processes the MNCC_ALERT_IND primitive send by CC.
1141 this indicates that the called party is alerted.
1142
1143 */
1144
1145 GLOBAL const void psa_mncc_alert_ind
1146 ( T_MNCC_ALERT_IND *mncc_alert_ind )
1147 {
1148 SHORT cId; /* holds call id */
1149
1150 TRACE_FUNCTION ("psa_mncc_alert_ind()");
1151
1152 /*
1153 *-------------------------------------------------------------------
1154 * find call in call table
1155 *-------------------------------------------------------------------
1156 */
1157 cId = psaCC_ctbFindTi( mncc_alert_ind -> ti );
1158
1159 if( cId < 0 )
1160 {
1161 /*
1162 * ignore primitive, due to not found transaction identifier.
1163 */
1164 TRACE_EVENT ("primitive rejected due to unused ti");
1165 PFREE(mncc_alert_ind);
1166 return;
1167 }
1168
1169 /*
1170 *-------------------------------------------------------------------
1171 * update shared parameter and notify ACI
1172 *-------------------------------------------------------------------
1173 */
1174 psaCC_ctb(cId)->alrtStat = AS_SND;
1175 psaCC_ctb(cId)->curCs = MNCC_CAUSE_NO_MS_CAUSE;
1176
1177 /* check for progress descriptions */
1178 psaCC_chkPrgDesc ( cId, mncc_alert_ind -> progress_desc, MT_ALRT );
1179
1180 /* check for TTY service */
1181 cmhCC_TTY_Control ( cId, TTY_START );
1182 /*
1183 *-------------------------------------------------------------------
1184 * free the primitive buffer
1185 *-------------------------------------------------------------------
1186 */
1187 PFREE (mncc_alert_ind);
1188 }
1189
1190 /*
1191 +-------------------------------------------------------------------+
1192 | PROJECT : GSM-PS (6147) MODULE : PSA_CCP |
1193 | ROUTINE : psa_mncc_call_proceed_ind|
1194 +-------------------------------------------------------------------+
1195
1196 PURPOSE : processes the MNCC_CALL_PROCEED_IND primitive send by CC.
1197 this indicates a call proceeding information for a call.
1198
1199 */
1200
1201 GLOBAL const void psa_mncc_call_proceed_ind
1202 ( T_MNCC_CALL_PROCEED_IND *mncc_call_proceed_ind )
1203 {
1204 SHORT cId; /* holds call id */
1205 T_CC_CALL_TBL * pCtbNtry; /* holds pointer to call table entry */
1206
1207 TRACE_FUNCTION ("psa_mncc_call_proceed_ind()");
1208
1209 /*
1210 *-------------------------------------------------------------------
1211 * find call in call table
1212 *-------------------------------------------------------------------
1213 */
1214 cId = psaCC_ctbFindTi( mncc_call_proceed_ind -> ti );
1215
1216 if( cId < 0 )
1217 {
1218 /*
1219 * ignore primitive, due to not found transaction identifier.
1220 */
1221 TRACE_EVENT ("primitive rejected due to unused ti");
1222 PFREE(mncc_call_proceed_ind);
1223 return;
1224 }
1225
1226 /*
1227 *-------------------------------------------------------------------
1228 * update shared parameter and notify ACI
1229 *-------------------------------------------------------------------
1230 */
1231 pCtbNtry = ccShrdPrm.ctb[cId];
1232 pCtbNtry -> curCs = MNCC_CAUSE_NO_MS_CAUSE;
1233
1234 memcpy( &(pCtbNtry->BC[0]),&(mncc_call_proceed_ind->bcpara),
1235 sizeof( T_bcpara) );
1236 memcpy( &(pCtbNtry->BC[1]),&(mncc_call_proceed_ind->bcpara2),
1237 sizeof( T_bcpara) );
1238 pCtbNtry -> rptInd = mncc_call_proceed_ind -> ri;
1239
1240 /* check for progress descriptions */
1241 psaCC_chkPrgDesc ( cId, mncc_call_proceed_ind -> progress_desc, MT_PROC );
1242
1243 /* check for TTY service */
1244 cmhCC_TTY_Control ( cId, TTY_START );
1245 /*
1246 *-------------------------------------------------------------------
1247 * free the primitive buffer
1248 *-------------------------------------------------------------------
1249 */
1250 PFREE (mncc_call_proceed_ind);
1251
1252 }
1253
1254 /*
1255 +-------------------------------------------------------------------+
1256 | PROJECT : GSM-PS (6147) MODULE : PSA_CCP |
1257 | ROUTINE : psa_mncc_progress_ind |
1258 +-------------------------------------------------------------------+
1259
1260 PURPOSE : processes the MNCC_PROGRESS_IND primitive send by CC.
1261 this indicates a progress description for a call.
1262
1263 */
1264
1265 GLOBAL const void psa_mncc_progress_ind
1266 ( T_MNCC_PROGRESS_IND *mncc_progress_ind )
1267 {
1268 SHORT cId; /* holds call id */
1269
1270 TRACE_FUNCTION ("psa_mncc_progress_ind()");
1271
1272 /*
1273 *-------------------------------------------------------------------
1274 * find call in call table
1275 *-------------------------------------------------------------------
1276 */
1277 cId = psaCC_ctbFindTi( mncc_progress_ind -> ti );
1278
1279
1280 if( cId < 0 )
1281 {
1282 /*
1283 * ignore primitive, due to not found transaction identifier.
1284 */
1285 TRACE_EVENT ("primitive rejected due to unused ti");
1286 PFREE(mncc_progress_ind);
1287 return;
1288 }
1289 psaCC_ctb(cId)->curCs = MNCC_CAUSE_NO_MS_CAUSE;
1290
1291 /*
1292 * check for progress descriptions
1293 */
1294 psaCC_chkPrgDesc ( cId, mncc_progress_ind -> progress_desc, MT_PROGR );
1295
1296 /*
1297 *-------------------------------------------------------------------
1298 * free the primitive buffer
1299 *-------------------------------------------------------------------
1300 */
1301 PFREE (mncc_progress_ind);
1302
1303 }
1304
1305 /*
1306 +-------------------------------------------------------------------+
1307 | PROJECT : GSM-PS (6147) MODULE : PSA_CCP |
1308 | ROUTINE : psa_mncc_hold_cnf |
1309 +-------------------------------------------------------------------+
1310
1311 PURPOSE : processes the MNCC_HOLD_CNF primitive send by CC.
1312 this confirmates that a call is being held.
1313
1314 */
1315
1316 GLOBAL const void psa_mncc_hold_cnf
1317 ( T_MNCC_HOLD_CNF *mncc_hold_cnf )
1318 {
1319 SHORT cId; /* holds call id */
1320 T_CC_CALL_TBL * pCtbNtry; /* holds pointer to call table entry */
1321
1322 TRACE_FUNCTION ("psa_mncc_hold_cnf()");
1323
1324 /*
1325 *-------------------------------------------------------------------
1326 * find call in call table
1327 *-------------------------------------------------------------------
1328 */
1329 cId = psaCC_ctbFindTi( mncc_hold_cnf -> ti );
1330
1331 if( cId < 0 )
1332 {
1333 /*
1334 * ignore primitive, due to not found transaction identifier.
1335 */
1336 TRACE_EVENT ("primitive rejected due to unused ti");
1337 PFREE(mncc_hold_cnf);
1338 return;
1339 }
1340
1341 /*
1342 *-------------------------------------------------------------------
1343 * update shared parameter and notify ACI
1344 *-------------------------------------------------------------------
1345 */
1346 pCtbNtry = ccShrdPrm.ctb[cId];
1347
1348 switch( mncc_hold_cnf -> cause )
1349 {
1350 case( MNCC_CAUSE_HOLD_SUCCESS ): /* successful, call held */
1351 case( MNCC_CAUSE_SUCCESS ):
1352 case( MNCC_CAUSE_NO_MS_CAUSE ):
1353
1354 pCtbNtry -> calStat = CS_HLD;
1355
1356 psaCC_setSpeechMode ();
1357
1358 /* check for TTY service */
1359 cmhCC_TTY_Control ( cId, TTY_PAUSE );
1360 break;
1361
1362 default: /* unsuccessful, call state unchanged */
1363
1364 ccShrdPrm.cIdFail = cId;
1365 pCtbNtry -> calStat = CS_ACT;
1366 break;
1367 }
1368
1369 pCtbNtry -> rslt = mncc_hold_cnf -> cause;
1370
1371 cmhCC_CallHeld(cId);
1372
1373 /*
1374 *-------------------------------------------------------------------
1375 * free the primitive buffer
1376 *-------------------------------------------------------------------
1377 */
1378 PFREE (mncc_hold_cnf);
1379
1380 }
1381
1382 /*
1383 +-------------------------------------------------------------------+
1384 | PROJECT : GSM-PS (6147) MODULE : PSA_CCP |
1385 | ROUTINE : psa_mncc_retrieve_cnf |
1386 +-------------------------------------------------------------------+
1387
1388 PURPOSE : processes the MNCC_RETRIEVE_CNF primitive send by CC.
1389 this confirmates that a call is retrieved.
1390
1391 */
1392
1393 GLOBAL const void psa_mncc_retrieve_cnf
1394 ( T_MNCC_RETRIEVE_CNF *mncc_retrieve_cnf )
1395 {
1396 SHORT cId; /* holds call id */
1397 T_CC_CALL_TBL * pCtbNtry; /* holds pointer to call table entry */
1398
1399 TRACE_FUNCTION ("psa_mncc_retrieve_cnf()");
1400
1401 /*
1402 *-------------------------------------------------------------------
1403 * find call in call table
1404 *-------------------------------------------------------------------
1405 */
1406 cId = psaCC_ctbFindTi( mncc_retrieve_cnf -> ti );
1407
1408 if( cId < 0 )
1409 {
1410 /*
1411 * ignore primitive, due to not found transaction identifier.
1412 */
1413 TRACE_EVENT ("primitive rejected due to unused ti");
1414 PFREE(mncc_retrieve_cnf);
1415 return;
1416 }
1417
1418 /*
1419 *-------------------------------------------------------------------
1420 * update shared parameter and notify ACI
1421 *-------------------------------------------------------------------
1422 */
1423 pCtbNtry = ccShrdPrm.ctb[cId];
1424
1425 switch( mncc_retrieve_cnf -> cause )
1426 {
1427 case( MNCC_CAUSE_RETRIEVE_SUCCESS ): /* successful, call active */
1428
1429 pCtbNtry -> calStat = CS_ACT;
1430
1431 /* switch on vocoder */
1432 psaCC_setSpeechMode ();
1433
1434 /* check for TTY service */
1435 cmhCC_TTY_Control ( cId, TTY_START );
1436 break;
1437
1438 default: /* unsuccessful, call state unchanged */
1439
1440 ccShrdPrm.cIdFail = cId;
1441 pCtbNtry -> calStat = CS_HLD;
1442 break;
1443 }
1444
1445 pCtbNtry -> rslt = mncc_retrieve_cnf -> cause;
1446
1447 cmhCC_CallRetrieved (cId);
1448
1449 /*
1450 *-------------------------------------------------------------------
1451 * free the primitive buffer
1452 *-------------------------------------------------------------------
1453 */
1454 PFREE (mncc_retrieve_cnf);
1455
1456 }
1457
1458 /*
1459 +-------------------------------------------------------------------+
1460 | PROJECT : GSM-PS (6147) MODULE : PSA_CCP |
1461 | ROUTINE : psa_mncc_sync_ind |
1462 +-------------------------------------------------------------------+
1463
1464 PURPOSE : processes the MNCC_SYNC_IND primitive send by CC.
1465 this indicates the change of the channel mode.
1466
1467 */
1468
1469 GLOBAL const void psa_mncc_sync_ind( T_MNCC_SYNC_IND *mncc_sync_ind )
1470 {
1471 SHORT cId = 0; /* holds call id */
1472
1473 TRACE_FUNCTION ("psa_mncc_sync_ind()");
1474
1475 /*
1476 cause cause 4.6 UBYTE
1477 channel mode chm 4.14 STRUCT
1478
1479 ch_type 0 CH_SDCCH SDCCH channel
1480 1 CH_TCH_F TCH Fullrate
1481 2 CH_TCH_H TCH Halfrate
1482
1483 ch_mode 0 CHM_SIG_ONLY signalling only
1484 1 CHM_SPEECH speech full rate or half rate version 1
1485 33 CHM_SPEECH_V2 speech full rate or half rate version 2
1486 65 CHM_SPEECH_V3 speech full rate or half rate version 3
1487 3 CHM_DATA_9_6 data 9.6 kBit/s
1488 11 CHM_DATA_4_8 data 4.8 kBit/s
1489 19 CHM_DATA_2_4 data 2.4 kBit/s
1490 15 CHM_DATA_14_4 data 14.4 kBit/s
1491 */
1492
1493 TRACE_EVENT_P4("MNCC_SYNC_IND ti: %d, cause: %d, ch_type: %d, ch_mode: %d",
1494 mncc_sync_ind -> ti,
1495 mncc_sync_ind -> cause,
1496 mncc_sync_ind -> chm.ch_type,
1497 mncc_sync_ind -> chm.ch_mode);
1498
1499 /* update shared parameter */
1500 ccShrdPrm.syncCs = mncc_sync_ind -> cause;
1501 #ifdef FF_EM_MODE
1502 em_relcs = mncc_sync_ind -> cause;
1503 #endif /* FF_EM_MODE */
1504
1505 /* Inform Advice of Charge Module */
1506 switch (mncc_sync_ind->cause)
1507 {
1508 case MNCC_CAUSE_REEST_STARTED:
1509 for( cId = 0; cId < MAX_CALL_NR; cId++ )
1510 aoc_info (cId, AOC_SUSPEND_AOC);
1511 break;
1512 case MNCC_CAUSE_REEST_FINISHED:
1513 ccShrdPrm.aocRsmpPend = 1;
1514 break;
1515 }
1516
1517 /* switch channel mode */
1518 if( mncc_sync_ind -> chm.ch_mode NEQ NOT_PRESENT_8BIT )
1519 {
1520 ccShrdPrm.chMod = mncc_sync_ind -> chm.ch_mode;
1521 ccShrdPrm.chType = mncc_sync_ind -> chm.ch_type;
1522 ccShrdPrm.TCHasg = TRUE;
1523 }
1524
1525 if ( ccShrdPrm.aocRsmpPend AND
1526 (ccShrdPrm.chMod EQ CHM_SPEECH) OR
1527 (ccShrdPrm.chMod EQ CHM_SPEECH_V2) OR
1528 (ccShrdPrm.chMod EQ CHM_SPEECH_V3) )
1529 {
1530 ccShrdPrm.aocRsmpPend = 0;
1531 for( cId = 0; cId < MAX_CALL_NR; cId++ )
1532 aoc_info (cId, AOC_RESUME_AOC);
1533 }
1534
1535 if( mncc_sync_ind -> chm.ch_mode NEQ NOT_PRESENT_8BIT )
1536 {
1537 /* service a pending alert */
1538 for( cId = 0; cId < MAX_CALL_NR; cId++ )
1539 {
1540 if (ccShrdPrm.ctb[cId] NEQ NULL)
1541 {
1542 psaCC_ctb(cId)->curCs = mncc_sync_ind -> cause;
1543
1544 if( psaCC_ctb(cId)->alrtStat EQ AS_PND AND
1545 psaCC_ctb(cId)->calStat EQ CS_ACT_REQ )
1546 {
1547 {
1548 /* indicate alerting to network */
1549 PALLOC (mncc_alert_req, MNCC_ALERT_REQ);
1550 mncc_alert_req -> ti = psaCC_ctb(cId)->ti;
1551 PSENDX (CC, mncc_alert_req);
1552 psaCC_ctb(cId)->alrtStat = AS_SND;
1553 }
1554 cmhCC_IncomingCall (cId); /* indicate an incoming call */
1555 }
1556 if (psaCC_ctb(cId)->calStat NEQ CS_HLD AND
1557 psaCC_ctb(cId)->calStat NEQ CS_IDL)
1558 {
1559 /* check for TTY service */
1560 cmhCC_TTY_Control ( cId, TTY_TCH );
1561 }
1562 }
1563 }
1564 }
1565 psaCC_setSpeechMode ();
1566
1567 /* Remember cause for Call Reestablishment*/
1568
1569 if (mncc_sync_ind -> cause EQ MNCC_CAUSE_REEST_FINISHED
1570 OR mncc_sync_ind -> cause EQ MNCC_CAUSE_REEST_STARTED)
1571 {
1572 for( cId = 0; cId < MAX_CALL_NR; cId++ )
1573 {
1574 if (ccShrdPrm.ctb[cId] NEQ NULL)
1575 {
1576 psaCC_ctb(cId)->curCs = mncc_sync_ind -> cause;
1577 }
1578 }
1579 }
1580
1581 cId = psaCC_ctbFindTi( mncc_sync_ind -> ti );
1582
1583 /* For channel synchronization events the cId needs not to be valid here */
1584 cmhCC_Synchronized( cId );
1585
1586
1587 /* free the primitive buffer */
1588 PFREE (mncc_sync_ind);
1589 }
1590
1591 /*
1592 +-------------------------------------------------------------------+
1593 | PROJECT : GSM-PS (6147) MODULE : PSA_CCP |
1594 | ROUTINE : psa_mncc_user_ind |
1595 +-------------------------------------------------------------------+
1596
1597 PURPOSE : processes the MNCC_USER_IND primitive send by CC.
1598 this indicates the receiving of user data.
1599 */
1600
1601 GLOBAL const void psa_mncc_user_ind( T_MNCC_USER_IND *mncc_user_ind )
1602 {
1603 TRACE_FUNCTION ("psa_mncc_user_ind()");
1604
1605 PFREE (mncc_user_ind);
1606 }
1607
1608 /*
1609 +-------------------------------------------------------------------+
1610 | PROJECT : GSM-PS (6147) MODULE : PSA_CCP |
1611 | ROUTINE : psa_mncc_start_dtmf_cnf |
1612 +-------------------------------------------------------------------+
1613
1614 PURPOSE : processes the MNCC_START_DTMF_CNF primitive send by CC.
1615 this is a confirmation for the sent DTMF tones.
1616
1617 */
1618
1619 GLOBAL const void psa_mncc_start_dtmf_cnf
1620 ( T_MNCC_START_DTMF_CNF *mncc_start_dtmf_cnf )
1621 {
1622 SHORT cId; /* holds call id */
1623
1624 TRACE_FUNCTION ("psa_mncc_start_dtmf_cnf()");
1625
1626 /*
1627 *-------------------------------------------------------------------
1628 * find call in call table
1629 *-------------------------------------------------------------------
1630 */
1631 cId = psaCC_ctbFindTi( mncc_start_dtmf_cnf -> ti );
1632
1633 if( cId < 0 )
1634 {
1635 /*
1636 * ignore primitive, due to not found transaction identifier.
1637 */
1638 TRACE_EVENT ("primitive rejected due to unused ti");
1639 PFREE(mncc_start_dtmf_cnf);
1640 return;
1641 }
1642
1643 /*
1644 *-------------------------------------------------------------------
1645 * update shared parameter and notify ACI
1646 *-------------------------------------------------------------------
1647 */
1648 psaCC_ctb(cId)->nrmCs = mncc_start_dtmf_cnf -> cause;
1649 if ((mncc_start_dtmf_cnf->cause EQ MNCC_CAUSE_DTMF_STOP_SUCCESS) AND
1650 (mncc_start_dtmf_cnf->dtmf_mod EQ DTMF_MOD_MAN_STOP))
1651 {
1652 /* Reset the current dtmf digit */
1653 ccShrdPrm.dtmf.cur = 0;
1654 }
1655 #ifdef FF_EM_MODE
1656 em_relcs = mncc_start_dtmf_cnf -> cause;
1657 #endif /* FF_EM_MODE */
1658
1659 psaCC_DTMFSent( cId );
1660
1661 /*
1662 *-------------------------------------------------------------------
1663 * free the primitive buffer
1664 *-------------------------------------------------------------------
1665 */
1666 PFREE (mncc_start_dtmf_cnf);
1667
1668 }
1669
1670 /*
1671 +-------------------------------------------------------------------+
1672 | PROJECT : GSM-PS (6147) MODULE : PSA_CCP |
1673 | ROUTINE : psa_mncc_modify_ind |
1674 +-------------------------------------------------------------------+
1675
1676 PURPOSE : processes the MNCC_MODIFY_IND primitive send by CC.
1677 this indicates a mobile terminated in-call modification.
1678
1679 */
1680
1681 GLOBAL const void psa_mncc_modify_ind
1682 ( T_MNCC_MODIFY_IND *mncc_modify_ind )
1683 {
1684 SHORT cId; /* holds call id */
1685 T_CC_CALL_TBL * pCtbNtry; /* holds pointer to call table entry */
1686
1687 TRACE_FUNCTION ("psa_mncc_modify_ind()");
1688
1689 /*
1690 *-------------------------------------------------------------------
1691 * find call in call table
1692 *-------------------------------------------------------------------
1693 */
1694 cId = psaCC_ctbFindTi( mncc_modify_ind -> ti );
1695
1696 if( cId < 0 )
1697 {
1698 /*
1699 * ignore primitive, due to not found transaction identifier.
1700 */
1701 TRACE_EVENT ("primitive rejected due to unused ti");
1702 PFREE(mncc_modify_ind);
1703 return;
1704 }
1705
1706 /* check for TTY service */
1707 cmhCC_TTY_Control ( cId, TTY_PAUSE );
1708
1709 /*
1710 *-------------------------------------------------------------------
1711 * update shared parameter and notify ACI
1712 *-------------------------------------------------------------------
1713 */
1714 pCtbNtry = ccShrdPrm.ctb[cId];
1715
1716 pCtbNtry -> curBC = (pCtbNtry -> curBC EQ 0)?1:0;
1717 pCtbNtry -> rslt = MNCC_CAUSE_MODIFY_SUCCESS; /* SBK-02-07-30: possibly to be revised as strictly speaking ACI is orignating entity */
1718
1719 cmhCC_CallModified (cId);
1720
1721 /* check for TTY service */
1722 cmhCC_TTY_Control ( cId, TTY_START );
1723
1724 psaCC_StopDTMF ( cId );
1725 /*
1726 *-------------------------------------------------------------------
1727 * free the primitive buffer
1728 *-------------------------------------------------------------------
1729 */
1730 PFREE (mncc_modify_ind);
1731
1732 }
1733
1734 /*
1735 +-------------------------------------------------------------------+
1736 | PROJECT : GSM-PS (6147) MODULE : PSA_CCP |
1737 | ROUTINE : psa_mncc_modify_cnf |
1738 +-------------------------------------------------------------------+
1739
1740 PURPOSE : processes the MNCC_MODIFY_CNF primitive send by CC.
1741 this indicates the result for a mobile originated in-call
1742 modification.
1743
1744 */
1745
1746 GLOBAL const void psa_mncc_modify_cnf
1747 ( T_MNCC_MODIFY_CNF *mncc_modify_cnf )
1748 {
1749 SHORT cId; /* holds call id */
1750 T_CC_CALL_TBL * pCtbNtry; /* holds pointer to call table entry */
1751
1752 TRACE_FUNCTION ("psa_mncc_modify_cnf()");
1753
1754 /*
1755 *-------------------------------------------------------------------
1756 * find call in call table
1757 *-------------------------------------------------------------------
1758 */
1759 cId = psaCC_ctbFindTi( mncc_modify_cnf -> ti );
1760
1761 if( cId < 0 )
1762 {
1763 /*
1764 * ignore primitive, due to not found transaction identifier.
1765 */
1766 TRACE_EVENT ("primitive rejected due to unused ti");
1767 PFREE(mncc_modify_cnf);
1768 return;
1769 }
1770
1771 /*
1772 *-------------------------------------------------------------------
1773 * update shared parameter and notify ACI
1774 *-------------------------------------------------------------------
1775 */
1776 pCtbNtry = ccShrdPrm.ctb[cId];
1777
1778 pCtbNtry -> rslt = mncc_modify_cnf -> cause;
1779
1780 switch( mncc_modify_cnf -> cause )
1781 {
1782 case( MNCC_CAUSE_MODIFY_SUCCESS ): /* successful modification */
1783
1784 pCtbNtry -> curBC = (pCtbNtry -> curBC EQ 0)?1:0;
1785 break;
1786
1787 default: /* unsuccessful modification */
1788
1789 ccShrdPrm.cIdFail = cId;
1790 break;
1791 }
1792 psaCC_ctb(cId)->calStat = CS_ACT;
1793
1794 cmhCC_CallModified (cId);
1795
1796 /* check for TTY service */
1797 cmhCC_TTY_Control ( cId, TTY_START );
1798
1799 /*
1800 *-------------------------------------------------------------------
1801 * free the primitive buffer
1802 *-------------------------------------------------------------------
1803 */
1804 PFREE (mncc_modify_cnf);
1805
1806 }
1807
1808 /*
1809 +-------------------------------------------------------------------+
1810 | PROJECT : GSM-PS (6147) MODULE : PSA_CCP |
1811 | ROUTINE : psa_mncc_bearer_cap_cnf |
1812 +-------------------------------------------------------------------+
1813
1814 PURPOSE : processes the MNCC_BEARER_CAP_CNF primitive send by CC.
1815 this is the result of the requested bearer coding/decoding.
1816
1817 */
1818
1819 GLOBAL const void psa_mncc_bearer_cap_cnf
1820 ( T_MNCC_BEARER_CAP_CNF *mncc_bearer_cap_cnf )
1821 {
1822
1823 TRACE_FUNCTION ("psa_mncc_bearer_cap_cnf()");
1824
1825 /*
1826 *-------------------------------------------------------------------
1827 * determine request id
1828 *-------------------------------------------------------------------
1829 */
1830 switch( mncc_bearer_cap_cnf -> req_id )
1831 {
1832
1833 #ifdef SIM_TOOLKIT
1834
1835 case( BCRI_SAT ):
1836
1837 switch( mncc_bearer_cap_cnf -> bc_mod )
1838 {
1839 case( BC_MOD_CODE ):
1840
1841 cmhSAT_ResCapCode ( mncc_bearer_cap_cnf -> cause,
1842 &mncc_bearer_cap_cnf -> bcconf );
1843 break;
1844
1845 case( BC_MOD_DECODE ):
1846
1847 cmhSAT_ResCapDecode ( mncc_bearer_cap_cnf -> cause,
1848 &mncc_bearer_cap_cnf -> bcpara );
1849 break;
1850 }
1851 break;
1852
1853 #endif
1854 }
1855
1856 /*
1857 *-------------------------------------------------------------------
1858 * free the primitive buffer
1859 *-------------------------------------------------------------------
1860 */
1861 PFREE (mncc_bearer_cap_cnf);
1862
1863 }
1864
1865 /*
1866 +-------------------------------------------------------------------+
1867 | PROJECT : GSM-PS (6147) MODULE : PSA_CCP |
1868 | ROUTINE : psa_mncc_prompt_ind |
1869 +-------------------------------------------------------------------+
1870
1871 PURPOSE : processes the MNCC_PROMPT_IND primitive send by CC.
1872 this requests a transaction identifier for a CCBS recall.
1873
1874 */
1875
1876 GLOBAL const void psa_mncc_prompt_ind
1877 ( T_MNCC_PROMPT_IND *mncc_prompt_ind )
1878 {
1879 SHORT ti;
1880
1881 TRACE_FUNCTION ("psa_mncc_prompt_ind()");
1882
1883 /*
1884 *-------------------------------------------------------------------
1885 * allocate transaction identifier
1886 *-------------------------------------------------------------------
1887 */
1888 ti = psaCC_getMOCTi( -1 );
1889
1890 if( ti NEQ -1 )
1891 {
1892 PALLOC (mncc_prompt_rsp, MNCC_PROMPT_RSP);
1893 mncc_prompt_rsp -> ti = (UBYTE)ti;
1894 PSENDX (CC, mncc_prompt_rsp);
1895 }
1896 else
1897 {
1898 PALLOC (mncc_prompt_rej, MNCC_PROMPT_REJ);
1899 PSENDX (CC, mncc_prompt_rej);
1900 }
1901
1902 /*
1903 *-------------------------------------------------------------------
1904 * free the primitive buffer
1905 *-------------------------------------------------------------------
1906 */
1907 PFREE (mncc_prompt_ind);
1908
1909 }
1910
1911 /*
1912 +-------------------------------------------------------------------+
1913 | PROJECT : GSM-PS (6147) MODULE : PSA_CCP |
1914 | ROUTINE : psa_mncc_recall_ind |
1915 +-------------------------------------------------------------------+
1916
1917 PURPOSE : processes the MNCC_RECALL_IND primitive send by CC.
1918 this indicates a recall attempt from the network in case
1919 of CCBS.
1920
1921 */
1922
1923 GLOBAL const void psa_mncc_recall_ind
1924 ( T_MNCC_RECALL_IND *mncc_recall_ind )
1925 {
1926 SHORT cId; /* holds call table identifier */
1927 T_CC_CALL_TBL * pCtbNtry; /* holds pointer to call table entry */
1928
1929 TRACE_FUNCTION ("psa_mncc_recall_ind()");
1930
1931 /*
1932 *-------------------------------------------------------------------
1933 * check for K.O. criteria
1934 *-------------------------------------------------------------------
1935 */
1936 if( aoc_check_moc() EQ FALSE )
1937 {
1938 PALLOC (mncc_reject_req, MNCC_REJECT_REQ);
1939
1940 mncc_reject_req -> ti = mncc_recall_ind -> ti;
1941 mncc_reject_req -> cause = MNCC_CAUSE_ACM_MAX;
1942
1943 PSENDX (CC, mncc_reject_req);
1944 }
1945
1946 else if((cId = psaCC_ctbNewEntry()) < 0 )
1947 {
1948 PALLOC (mncc_reject_req, MNCC_REJECT_REQ);
1949
1950 mncc_reject_req -> ti = mncc_recall_ind -> ti;
1951 mncc_reject_req -> cause = MNCC_CAUSE_USER_BUSY;
1952
1953 PSENDX (CC, mncc_reject_req);
1954 }
1955
1956 /*
1957 *-------------------------------------------------------------------
1958 * insert recall parameters into call table entry
1959 *-------------------------------------------------------------------
1960 */
1961 else
1962 {
1963 pCtbNtry = ccShrdPrm.ctb[cId];
1964
1965 pCtbNtry -> ti = mncc_recall_ind -> ti;
1966 pCtbNtry -> rptInd = mncc_recall_ind -> ri;
1967
1968 /*
1969 * Assign called party
1970 */
1971 pCtbNtry -> cldPty.ton = mncc_recall_ind -> called_party.ton;
1972 pCtbNtry -> cldPty.npi = mncc_recall_ind -> called_party.npi;
1973 pCtbNtry -> cldPty.c_called_num =
1974 mncc_recall_ind -> called_party.c_called_num;
1975 if (pCtbNtry -> cldPty.called_num NEQ NULL)
1976 {
1977 ACI_MFREE (pCtbNtry -> cldPty.called_num);
1978 pCtbNtry -> cldPty.called_num = NULL;
1979 }
1980 if (pCtbNtry -> cldPty.c_called_num NEQ 0)
1981 {
1982 ACI_MALLOC (pCtbNtry -> cldPty.called_num,
1983 pCtbNtry -> cldPty.c_called_num);
1984 memcpy (pCtbNtry -> cldPty.called_num,
1985 mncc_recall_ind -> called_party.called_num,
1986 mncc_recall_ind -> called_party.c_called_num);
1987 }
1988
1989 /*
1990 * Assign called party subaddress
1991 */
1992 pCtbNtry -> cldPtySub = mncc_recall_ind -> called_party_sub;
1993
1994 /*
1995 * Assign bearer caps
1996 */
1997 memcpy( &(pCtbNtry->BC[0]),&(mncc_recall_ind->bcpara),
1998 sizeof( T_bcpara) );
1999 memcpy( &(pCtbNtry->BC[1]),&(mncc_recall_ind->bcpara2),
2000 sizeof( T_bcpara) );
2001
2002 psaCC_phbSrchNum( cId, CT_NI_MOC );
2003
2004 pCtbNtry -> calStat = CS_ACT_REQ;
2005 pCtbNtry -> calType = CT_NI_MOC;
2006
2007 pCtbNtry -> prio = PRIO_NORM_CALL;
2008 pCtbNtry -> curBC = 0;
2009
2010 }
2011
2012 /*
2013 *-------------------------------------------------------------------
2014 * free the primitive buffer
2015 *-------------------------------------------------------------------
2016 */
2017 PFREE (mncc_recall_ind);
2018
2019 }
2020
2021 /*
2022 +-------------------------------------------------------------------+
2023 | PROJECT : GSM-PS (6147) MODULE : PSA_CCP |
2024 | ROUTINE : psa_mncc_status_ind |
2025 +-------------------------------------------------------------------+
2026
2027 PURPOSE : processes the MNCC_STATUS_IND primitive sent by CC.
2028 This indicates that a STATUS ENQUIRY message has been
2029 received by CC, the network awaits a CC STATUS message.
2030 Used to ensure that the auxiliary states between ACI and
2031 CC were synchronized before the STATUS message is sent.
2032
2033 */
2034
2035 GLOBAL const void psa_mncc_status_ind (T_MNCC_STATUS_IND *mncc_status_ind)
2036 {
2037 UBYTE ti;
2038
2039 TRACE_FUNCTION ("psa_mncc_status_ind()");
2040
2041 ti = mncc_status_ind->ti;
2042
2043 {
2044 PREUSE (mncc_status_ind, mncc_status_res, MNCC_STATUS_RES);
2045 mncc_status_res->ti = ti;
2046 PSENDX (CC, mncc_status_res);
2047 }
2048 }
2049
2050 /*
2051 +-------------------------------------------------------------------+
2052 | PROJECT : GSM-PS (6147) MODULE : PSA_CCP |
2053 | ROUTINE : psa_mncc_facility_ind |
2054 +-------------------------------------------------------------------+
2055
2056 PURPOSE : processes the MNCC_FACILITY_IND primitive send by CC.
2057 this indicates the receiving of a facility information
2058 element. Handles multiple components in the facility info.
2059
2060 */
2061
2062 GLOBAL const void psa_mncc_facility_ind(T_MNCC_FACILITY_IND * mncc_facility_ind)
2063 {
2064 UBYTE tlen = 0;
2065 USHORT offset_comp = 0, total_len = mncc_facility_ind->fac_inf.l_fac/8;
2066 UBYTE len_comp = 0;
2067 UBYTE *tPtrfac = mncc_facility_ind->fac_inf.fac;
2068
2069 TRACE_FUNCTION ("psa_mncc_facility_ind()");
2070
2071 if (tPtrfac[1] > 0x7F)/* For the case, when length is coded in non-standard way (0x80, 0x81, 0x82) we will be able to process only one component */
2072 {
2073 psaCC_ProcessCmp((T_MNCC_FACILITY_IND *)mncc_facility_ind);
2074 return;
2075 }
2076
2077 offset_comp = mncc_facility_ind->fac_inf.o_fac;
2078 len_comp = tlen = tPtrfac[1] + 2;
2079
2080 for ( ; total_len >= len_comp; len_comp+=tlen)
2081 {
2082 if ((*tPtrfac EQ 0xA1) OR
2083 (*tPtrfac EQ 0xA2) OR
2084 (*tPtrfac EQ 0xA3) OR
2085 (*tPtrfac EQ 0xA4))
2086 {
2087 PALLOC(new_mncc_facility_ind, MNCC_FACILITY_IND);
2088
2089 new_mncc_facility_ind->ti = mncc_facility_ind->ti;
2090 new_mncc_facility_ind->fac_context = mncc_facility_ind->fac_context;
2091 new_mncc_facility_ind->fac_inf.l_fac = tlen * 8;
2092 new_mncc_facility_ind->fac_inf.o_fac = offset_comp;
2093 memcpy(new_mncc_facility_ind->fac_inf.fac, tPtrfac, tlen);
2094
2095 psaCC_ProcessCmp((T_MNCC_FACILITY_IND *)new_mncc_facility_ind);
2096
2097 tPtrfac = tPtrfac + tlen;
2098 tlen = tPtrfac[1] + 2;
2099 offset_comp = 0;
2100 }
2101 }
2102
2103 PFREE(mncc_facility_ind);
2104 }
2105
2106 /*==== EOF =========================================================*/