comparison src/g23m-gprs/gmm/gmm_kernp.c @ 1:d393cd9bb723

src/g23m-*: initial import from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 15 Jul 2018 04:40:46 +0000
parents
children
comparison
equal deleted inserted replaced
0:b6a5e36de839 1:d393cd9bb723
1 /*
2 +-----------------------------------------------------------------------------
3 | Project : GPRS (8441)
4 | Modul : gmm_kernp.c
5 +-----------------------------------------------------------------------------
6 | Copyright 2002 Texas Instruments Berlin, AG
7 | All rights reserved.
8 |
9 | This file is confidential and a trade secret of Texas
10 | Instruments Berlin, AG
11 | The receipt of or possession of this file does not convey
12 | any rights to reproduce or disclose its contents or to
13 | manufacture, use, or sell anything it may describe, in
14 | whole, or in part, without the specific written consent of
15 | Texas Instruments Berlin, AG.
16 +-----------------------------------------------------------------------------
17 | Purpose : This modul is part of the entity GMM and implements all
18 | functions to handles the incoming primitives as described in
19 | the SDL-documentation (KERN-statemachine)
20 +-----------------------------------------------------------------------------
21 */
22
23
24
25 #ifndef GMM_KERNP_C
26 #define GMM_KERNP_C
27 #endif
28
29 #define ENTITY_GMM
30
31 /*==== INCLUDES =============================================================*/
32
33 #include "typedefs.h" /* to get Condat data types */
34 #include "vsi.h" /* to get a lot of macros */
35 #include "macdef.h"
36 #include "gprs.h"
37 #include "gsm.h" /* to get a lot of macros */
38 #include "ccdapi.h" /* to get CCD API */
39 #include "cnf_gmm.h" /* to get cnf-definitions */
40 #include "mon_gmm.h" /* to get mon-definitions */
41 #include "prim.h" /* to get the definitions of used SAP and directions */
42 #include "gmm.h" /* to get the global entity definitions */
43
44 #include "gmm_f.h" /* to ger the gobal functions */
45 #include "gmm_kernl.h" /* to ger the local functions */
46 #include "gmm_kernf.h" /* to ger the local functions */
47 #include "gmm_rdys.h" /* to get some signals */
48 #include <string.h> /* to get memcpy */
49 #include "gmm_txs.h" /* to get some signals */
50 #include "gmm_syncs.h"
51 #include "gmm_em.h" /* To get Engineering Mode functions */
52
53 /*==== CONST ================================================================*/
54
55 /*==== LOCAL VARS ===========================================================*/
56
57 /*==== PRIVATE FUNCTIONS ====================================================*/
58
59 /*==== PUBLIC FUNCTIONS =====================================================*/
60
61 /*
62 +------------------------------------------------------------------------------
63 | Function : kern_t3302
64 +------------------------------------------------------------------------------
65 | Description : Handles expiry of timer T3302. This function is called from
66 | pei_primitive().
67 | Timeout for Attach or RAU failure
68 | Parameters : none
69 |
70 +------------------------------------------------------------------------------
71 */
72 GLOBAL void kern_t3302(void)
73 {
74 GMM_TRACE_FUNCTION( "kern_t3302" );
75 TRACE_0_INFO("TIMEOUT T3302");
76 sig_kern_rdy_stop_t3302_req();
77 /*
78 * reset attach attempt counter
79 * <R.GMM.ATTACH.M.010>
80 */
81 /*
82 * reset rau attempt counter
83 * <R.GMM.ATTACH.M.010>
84 */
85
86
87 switch( GET_STATE( KERN ) )
88 {
89 case KERN_GMM_DEREG_RESUMING:
90 case KERN_GMM_DEREG_SUSPENDING:
91 case KERN_GMM_DEREG_SUSPENDED:
92 gmm_data->kern.attach_cap.enter_attempting_to_update_after_lau=FALSE;
93 break;
94 case KERN_GMM_REG_SUSPENDING:
95 gmm_data->kern.attach_cap.enter_attempting_to_update_after_lau=FALSE;
96 SET_STATE(GU,GU_UPDATE_NEEDED);
97 break;
98 case KERN_GMM_REG_RESUMING:
99 case KERN_GMM_REG_SUSPENDED:
100 gmm_data->kern.attach_cap.enter_attempting_to_update_after_lau=FALSE;
101 SET_STATE(GU,GU_UPDATE_NEEDED);
102 break;
103 case KERN_GMM_DEREG_ATTEMPTING_TO_ATTACH:
104 kern_attach_reset();
105 kern_attach ();
106 break;
107 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE:
108 kern_attach_reset();
109
110 if (PERIODIC_RAU == gmm_data->kern.attach_cap.update_proc_type)
111 {
112 /* 44.2.3.3.2 */
113 kern_periodic_rau();
114 }
115 else
116 {
117 kern_rau_limited();
118 }
119
120 break;
121 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE_MM:
122 /*
123 * GPRS is still attached (normal service)
124 * so we need to resume LLC again
125 */
126 kern_attach_reset();
127 kern_rau();
128 break;
129 default:
130 TRACE_ERROR( "kern_t3302 unexpected" );
131 break;
132 }
133 GMM_RETURN;
134
135 } /* kern_t3302 */
136
137 /*
138 +------------------------------------------------------------------------------
139 | Function : kern_t3310
140 +------------------------------------------------------------------------------
141 | Description : Handles expiry of timer T3310. This function is called from
142 | pei_primitive().
143 | Timeout for ATTACH
144 | Parameters : none
145 |
146 +------------------------------------------------------------------------------
147 */
148 GLOBAL void kern_t3310 (void)
149 {
150 GMM_TRACE_FUNCTION( "kern_t3310" );
151 TRACE_0_INFO("TIMEOUT T3310");
152
153 gmm_data->kern.attach_cap.t3310_value=0;
154
155 switch( GET_STATE( KERN ) )
156 {
157 case KERN_GMM_REG_INITIATED:
158 /************************************************************************
159 * MSC: 3.8 Attach
160 *
161 * MSC: 3.8.1 Normal Attach
162 * MSC: 3.8.1.4 Abnormal cases
163 * MSC: 3.8.1.4.3 c) T3310 time-out
164 ************************************************************************/
165 if ( gmm_data->kern.ct3310 < MAX_CT3310 )
166 {
167 /*
168 * ATTACH
169 * <R.GMM.AGABNORM.M.007>
170 */
171 kern_gmmreg_detach ( GMMREG_DT_GPRS,
172 GMMCS_NET_FAIL, /* TCS 2.1 */
173 GMMREG_SEARCH_RUNNING,
174 GMMCS_NET_FAIL);
175
176 kern_attach();
177 }
178 else
179 {
180 /*
181 * AAC
182 *<R.GMM.AGABNORM.M.008>
183 */
184 kern_aac(GMMCS_NO_SERVICE); /* TCS 2.1 */
185 }
186
187 break;
188 case KERN_GMM_RAU_INITIATED:
189 /************************************************************************
190 * MSC: 3.10 RAU
191 *
192 * MSC: 3.10.1 Normal and periodic RAU initiation
193 * MSC: 3.10.1.4 Abnormal cases
194 * MSC: 3.10.1.4.3 c) T3310 time-out
195 *
196 ************************************************************************/
197 /*
198 * I reused the timer T3310 instead of T3330
199 */
200 if ( gmm_data->kern.ct3310 < MAX_CT3310 )
201 {
202 if (PERIODIC_RAU == gmm_data->kern.attach_cap.update_proc_type)
203 {
204 /* 44.2.3.3.2 */
205 kern_periodic_rau();
206 }
207 else
208 {
209 kern_rau_limited();
210 }
211 }
212 else
213 {
214 /*
215 * AAC
216 */
217 kern_aac(GMMCS_NO_SERVICE); /* TCS 2.1 */
218 }
219 break;
220 /* START PATCH UBUOB ISSUE 8274 */
221 case KERN_GMM_REG_RESUMING:
222 case KERN_GMM_REG_SUSPENDING:
223 case KERN_GMM_REG_SUSPENDED:
224 gmm_data->kern.attach_cap.enter_attempting_to_update_after_lau = FALSE;
225 SET_STATE(GU,GU_UPDATE_NEEDED);
226 break;
227 /* END PATCH UBUOB ISSUE 8274 */
228 case KERN_GMM_REG_LIMITED_SERVICE:
229 TRACE_EVENT("T3310 ignored in limited mode");
230 break;
231 default:
232 TRACE_ERROR( "kern_t3310 unexpected" );
233 break;
234 }
235 GMM_RETURN;
236 } /* kern_t3310 */
237 /*
238 +------------------------------------------------------------------------------
239 | Function : kern_t3311
240 +------------------------------------------------------------------------------
241 | Description : Handles expiry of timer T3310. This function is called from
242 | pei_primitive().
243 | Timeout for ATTACH or RAU Reject
244 | Parameters : none
245 |
246 +------------------------------------------------------------------------------
247 */
248 GLOBAL void kern_t3311 (void)
249 {
250 GMM_TRACE_FUNCTION( "kern_t3311" );
251 TRACE_0_INFO("TIMEOUT T3311");
252 switch( GET_STATE( KERN ) )
253 {
254 case KERN_GMM_DEREG_ATTEMPTING_TO_ATTACH:
255 kern_attach ();
256 break;
257 case KERN_GMM_REG_NORMAL_SERVICE:
258 /*
259 * <R.GMM.RNABNORM.M.022>
260 */
261 kern_periodic_rau();
262 break;
263 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE_MM:
264 kern_llgmm_suspend(LLGMM_RAU);
265 /*FALLTHROUGH*/
266 //lint -fallthrough
267 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE:
268 kern_rau_limited ();
269 break;
270 /* START PATCH UBUOB ISSUE 8893 */
271 case KERN_GMM_DEREG_SUSPENDING:
272 case KERN_GMM_DEREG_SUSPENDED:
273 case KERN_GMM_DEREG_RESUMING:
274 /* END PATCH UBUOB ISSUE 8893 */
275 case KERN_GMM_REG_RESUMING:
276 /* START PATCH UBUOB ISSUE 8273 */
277 case KERN_GMM_REG_SUSPENDING:
278 case KERN_GMM_REG_SUSPENDED:
279 gmm_data->kern.attach_cap.enter_attempting_to_update_after_lau = FALSE;
280 SET_STATE(GU,GU_UPDATE_NEEDED);
281 break;
282 /* END PATCH UBUOB ISSUE 8273 */
283 default:
284 TRACE_ERROR( "kern_t3311 unexpected" );
285 break;
286 }
287
288 GMM_RETURN;
289 } /* kern_t3311 */
290 /*
291 +------------------------------------------------------------------------------
292 | Function : kern_t3312
293 +------------------------------------------------------------------------------
294 | Description : Handles expiry of timer T3312. This function is called from
295 | pei_primitive().
296
297 | Periodic RAU timer
298 | Parameters : none
299 |
300 +------------------------------------------------------------------------------
301 */
302 GLOBAL void kern_t3312 (void)
303 {
304 GMM_TRACE_FUNCTION( "kern_t3312" );
305 TRACE_0_INFO("TIMEOUT T3312");
306 switch( GET_STATE( KERN ) )
307 {
308
309 case KERN_GMM_REG_NORMAL_SERVICE:
310 if (GMM_GRR_STATE_CR==gmm_data->kern.attach_cap.grr_state)
311 {
312 gmm_data->kern.timeout_t3312 = TRUE;
313 SET_STATE(GU,GU_UPDATE_NEEDED);
314 }
315 else
316 {
317 kern_periodic_rau();
318 }
319 break;
320 case KERN_GMM_REG_NO_CELL_AVAILABLE:
321 /*
322 * 24.008 ch 4.7.2.2. at the end:
323 *
324 * If the MS is both IMSI attached for GPRS and non-GPRS services in a network that
325 * operates in network operation mode I, and if the MS has camped on a cell that does
326 * not support GPRS, and timer T3312 expires, then the MS shall start an MM location
327 * updating procedure. In addition, the MS shall perform a combined routing area update
328 * procedure indicating "combined RA/LA updating with IMSI attach" when the MS enters
329 * a cell that supports GPRS and indicates that the network is in operation mode I.
330 */
331 gmm_data->kern.timeout_t3312 = TRUE;
332 SET_STATE(GU,GU_UPDATE_NEEDED);
333
334 if (GMM_MM_DEREG != GET_STATE(MM)
335 && GMMRR_LA_INVALID!=gmm_data->kern.sig_cell_info.env.rai.lac)
336 {
337 SET_STATE ( KERN, KERN_GMM_REG_SUSPENDING);
338 #ifdef FF_EM_MODE
339 EM_GMM_SET_STATE(KERN_GMM_REG_SUSPENDING);
340 #endif
341 kern_llgmm_suspend(LLGMM_CALL); /* in no cell availble LLC is alread susended */
342 kern_gmmrr_suspend(GMMRR_NOT_SUSP_GPRS, GMMRR_NORMAL_RELEASE, GMM_SUSP_LAU);
343 }
344 break;
345
346
347 case KERN_GMM_REG_LIMITED_SERVICE:
348 case KERN_GMM_REG_IMSI_DETACH_INITIATED:
349 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE_MM:
350 case KERN_GMM_REG_RESUMING:
351 case KERN_GMM_REG_SUSPENDING:
352 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE:
353 case KERN_GMM_REG_SUSPENDED:
354 /* no break; */
355 /*
356 * <R.GMM.RAUTIMER.M.009>
357 */
358 gmm_data->kern.timeout_t3312 = TRUE;
359 SET_STATE(GU,GU_UPDATE_NEEDED);
360 break;
361 default:
362 break;
363 }
364
365 GMM_RETURN;
366 } /* kern_t3312 */
367 /*
368 +------------------------------------------------------------------------------
369 | Function : kern_t3321
370 +------------------------------------------------------------------------------
371 | Description : Handles expiry of timer T3321. This function is called from
372 | pei_primitive().
373 | Timeout for DETACH
374 |
375 | MSC: 3.9 GPRS detach procedure
376 |
377 | MCS: 3.9.3 Abnormal cases
378 | MSC: 3.9.3.1 a) Timeout of timer T3321
379 |
380 | Parameters : none
381 |
382 +------------------------------------------------------------------------------
383 */
384 GLOBAL void kern_t3321 (void)
385 {
386
387 #ifdef REL99
388 T_gmobile_identity gmobile_identity; /* TCS 4.0 */
389 #endif
390
391 GMM_TRACE_FUNCTION( "kern_t3321" );
392 TRACE_0_INFO("TIMEOUT T3321");
393 /*
394 * MSC: 3.9 GPRS detach procedure
395 *
396 * MCS: 3.9.3 Abnormal cases
397 * MSC: 3.9.3.1 a) Timeout of timer T3321
398 */
399 if ( ++gmm_data->kern.ct3321 < 5 )
400 {
401 MCAST (u_detach_request, U_DETACH_REQUEST);
402
403 TRACE_EVENT (" START T3321" );
404 sig_kern_rdy_start_timer_req ( kern_T3321, gmm_data->kern.t3321_val );
405
406 u_detach_request->u_detach_type.u_type_of_detach
407 = gmm_data->kern.detach_cap.detach_type,
408 u_detach_request->u_detach_type.power_off = PO_NORMAL_DETACH;
409
410
411 #ifdef REL99
412 /* Detach request sent to a Release 99 network has two addional
413 * parameters. PTMSI and PTMSI signature
414 */
415 switch (gmm_data->kern.sig_cell_info.sgsnr_flag)/*!gmm_data->release99 =>old code*/ /* TCS 4.0 */
416 {
417 default:
418 case PS_SGSN_UNKNOWN:
419 case PS_SGSN_98_OLDER:
420 u_detach_request->v_gmobile_identity = FALSE; /* TCS 4.0 */
421 u_detach_request->v_p_tmsi_signature_2 = FALSE; /* TCS 4.0 */
422 break;
423 case PS_SGSN_99_ONWARDS:
424 /*
425 * PTMSI
426 */
427 kern_ulong2mobile_identity( gmm_data->ptmsi.current, &gmobile_identity ); /* TCS 4.0 */
428 u_detach_request->v_gmobile_identity = TRUE; /* TCS 4.0 */
429 u_detach_request->gmobile_identity = gmobile_identity; /* TCS 4.0 */
430
431 /*
432 * PTMSI Signature
433 */
434 if(gmm_data->ptmsi_signature.available) /* TCS 4.0 */
435 { /* TCS 4.0 */
436 u_detach_request->v_p_tmsi_signature_2 =TRUE; /* TCS 4.0 */
437 u_detach_request->p_tmsi_signature_2.p_tmsi_signature_value /* TCS 4.0 */
438 = gmm_data->ptmsi_signature.value; /* TCS 4.0 */
439 } /* TCS 4.0 */
440 else /* TCS 4.0 */
441 { /* TCS 4.0 */
442 u_detach_request->v_p_tmsi_signature_2=FALSE; /* TCS 4.0 */
443 } /* TCS 4.0 */
444 break;
445 }
446 #endif
447
448
449 switch ( gmm_data->kern.detach_cap.detach_type )
450 {
451 case GMMREG_DT_GPRS:
452 u_detach_request->u_detach_type.u_type_of_detach
453 = DT_GPRS;
454 break;
455 case GMMREG_DT_IMSI:
456 u_detach_request->u_detach_type.u_type_of_detach
457 = DT_IMSI;
458 break;
459 case GMMREG_DT_COMB:
460 u_detach_request->u_detach_type.u_type_of_detach
461 = DT_COMB;
462 break;
463 case GMMREG_DT_SIM_REMOVED:
464 if ( GMM_MM_DEREG != GET_STATE(MM) )
465 {
466 u_detach_request->u_detach_type.u_type_of_detach
467 = DT_COMB;
468 }
469 else
470 {
471 u_detach_request->u_detach_type.u_type_of_detach
472 = DT_GPRS;
473 }
474 break;
475 default:
476 TRACE_ERROR ("unexpexted GMMREG_DT_TYPE");
477 break;
478 }
479 kern_mm_detach_started ();
480 sig_kern_tx_data_req ( CURRENT_TLLI, U_DETACH_REQUEST);
481 }
482 else
483 {
484 switch( GET_STATE( KERN ) )
485 {
486 case KERN_GMM_DEREG_INITIATED:
487 kern_local_detach( GMMCS_INT_NOT_PRESENT, FALSE, GMM_LOCAL_DETACH_PROC_ENTER_DEREG); /* TCS 2.1 */
488 break;
489 case KERN_GMM_REG_IMSI_DETACH_INITIATED:
490 /*
491 * <R.GMM.DMABNORM.M.020>
492 */
493 kern_local_detach( GMMCS_INT_NOT_PRESENT, FALSE, GMM_LOCAL_DETACH_PROC_ENTER_REG_NORMAL); /* TCS 2.1 */
494 break;
495 default:
496 TRACE_ERROR( "kern_t3321 unexpected" );
497 break;
498 }
499 }
500 GMM_RETURN;
501 } /* kern_t3321 */
502 /*
503 +------------------------------------------------------------------------------
504 | Function : kern_tpower_off
505 +------------------------------------------------------------------------------
506 | Description : Handles expiry of timer Tpower_off. This function is called from
507 | pei_primitive().
508 | Timeout for power_off after sending DETACH message
509 | Parameters : none
510 |
511 +------------------------------------------------------------------------------
512 */
513 GLOBAL void kern_tpower_off (void)
514 {
515 GMM_TRACE_FUNCTION( "kern_tpower_off" );
516 TRACE_0_INFO("TIMEOUT TPOWER_OFF");
517 kern_local_detach( GMMCS_POWER_OFF, FALSE, /* TCS 2.1 */
518 GMMREG_DT_SOFT_OFF==gmm_data->kern.detach_cap.detach_type?
519 GMM_LOCAL_DETACH_PROC_SOFT_OFF:
520 GMM_LOCAL_DETACH_PROC_POWER_OFF);
521
522 GMM_RETURN;
523
524 } /* kern_tpower_off */
525
526 /*
527 +------------------------------------------------------------------------------
528 | Function : kern_tlocal_detach
529 +------------------------------------------------------------------------------
530 | Description : Handles expiry of timer Tlocal_detach. This function is called from
531 | pei_primitive().
532 | function local_detach is called to locally detach the MS.
533 | GRR and LLC can not unassigned immediately. So GMM waits untill
534 | the tlocal_detach timer has been expired or either CGRLC_TRIGGER_IND
535 | has been received or GMMRR_SUSPEND_CNF has been received.
536 | Parameters : none
537 |
538 +------------------------------------------------------------------------------
539 */
540 GLOBAL void kern_tlocal_detach (void)
541 {
542 GMM_TRACE_FUNCTION( "kern_tlocal_detach" );
543
544
545 switch( GET_STATE( KERN ) )
546 {
547 default:
548 TRACE_ERROR("tlocal_detach not in state DEREG_SUSPENDING");
549 /* NO break; */
550 case KERN_GMM_DEREG_SUSPENDING:
551 kern_gmmrr_suspend (GMMRR_NOT_SUSP_GPRS, GMMRR_NORMAL_RELEASE,
552 GMM_SUSP_UNKNOWN);
553
554 break;
555 }
556
557 GMM_RETURN ;
558 } /* kern_tlocal_detach */
559
560
561
562
563 /*
564 +------------------------------------------------------------------------------
565 | Function : kern_gmmreg_net_req
566 +------------------------------------------------------------------------------
567 | Description : Handles the primitive GMMREG_NET_REQ
568 |
569 | MSC: 3.20 MM Interface
570 | MSC: 3.20.2 Network selection
571 |
572 | Parameters : *gmmreg_net_req - Ptr to primitive payload
573 |
574 +------------------------------------------------------------------------------
575 */
576 GLOBAL void kern_gmmreg_net_req ( T_GMMREG_NET_REQ *gmmreg_net_req )
577 {
578 GMM_TRACE_FUNCTION( "kern_gmmreg_net_req" );
579
580 PFREE (gmmreg_net_req);
581 kern_mm_net_req();
582 GMM_RETURN;
583 } /* kern_gmmreg_net_req() */
584
585 /*
586 +------------------------------------------------------------------------------
587 | Function : kern_gmmreg_plmn_res
588 +------------------------------------------------------------------------------
589 | Description : Handles the primitive GMMREG_PLMN_RES
590 |
591 | MSC: 3.20 MM Interface
592 | MSC: 3.20.2 Network selection
593 |
594 | Parameters : *gmmreg_plmn_res - Ptr to primitive payload
595 |
596 +------------------------------------------------------------------------------
597 */
598 GLOBAL void kern_gmmreg_plmn_res ( T_GMMREG_PLMN_RES *gmmreg_plmn_res )
599 {
600 GMM_TRACE_FUNCTION( "kern_gmmreg_plmn_res" );
601
602 gmm_data->kern.attach_cap.network_selection_mode=MODE_MAN;
603 kern_remove_plmn_from_forbidden_list(gmmreg_plmn_res->plmn);
604
605 /* START PATCH UBUOB ISSUE 8276 */
606 /* T3302 should not be stopped here, because this is dangerous if the */
607 /* user selection does not lead to a different PLMN */
608 /*vsi_t_stop ( GMM_handle, kern_T3302);*/
609 /*sig_kern_rdy_start_t3302_req();*/
610 /* END PATCH UBUOB ISSUE 8276 */
611
612 /* When we receive manual mode network selection stop TSYNC timer */
613 vsi_t_stop ( GMM_handle, sync_TSYNC);
614
615 gmm_data->kern.attach_cap.enter_attempting_to_update_after_lau = FALSE;
616 /*
617 * attach_cap.gmmreg sets the caller of the attach procedure to MMI
618 */
619 gmm_data->kern.attach_cap.gmmreg = TRUE;
620 /*
621 * if the moble has been rejected with cause #11,#12, or #13 it has to igored
622 * when user wanted the moile explicitly to try to attach
623 * TC 44.2.1.1.4.3.2
624 */
625 gmm_data->kern.detach_cap.error_cause=GMMCS_INT_NOT_PRESENT; /* TCS 2.1 */
626
627 /* Setting mm_status to FULL Service immediately on receiving PLMN Response creates a false display
628 * on MMI if selecting forbidden PLMN second time in a row. However, it is necessary in case of Normal PLMN selection
629 * for an early indication to ACI. Hence setting mm_status to Full Service only if the selected PLMN was not rejected by
630 * the N/W in the same power cycle.
631 */
632 if((memcmp(gmm_data->kern.attach_cap.list_of_forbidden_plmns_for_gprs_service[0].mcc,gmmreg_plmn_res->plmn.mcc, SIZE_MCC) NEQ 0) AND
633 (memcmp(gmm_data->kern.attach_cap.list_of_forbidden_plmns_for_gprs_service[0].mnc,gmmreg_plmn_res->plmn.mnc, SIZE_MNC)NEQ 0))
634 {
635 gmm_data->kern.sig_cell_info.mm_status = MMGMM_FULL_SERVICE;
636 sig_kern_sync_set_mm_state(MMGMM_FULL_SERVICE);
637 }
638
639 #ifndef NTRACE
640 /*
641 * My assumption is, that I have to know the class if plmn_res comes as power
642 * on primitive with AT+COPS=1,2,"001001". There are no possabilities to
643 * change the classes. a class change is handeled with attach_req
644 */
645 if(gmm_data->kern.attach_cap.mobile_class!=gmmreg_plmn_res->mobile_class)
646 {
647 TRACE_ERROR("class change not expected: NO DETACH_REQ will be send!");
648 }
649 #endif
650 gmm_data->kern.attach_cap.plmn_requested = gmmreg_plmn_res->plmn;
651 gmm_data->kern.attach_cap.mobile_class = gmmreg_plmn_res->mobile_class;
652 gmm_data->kern.attach_cap.attach_type = gmmreg_plmn_res->attach_type;
653 #ifndef NTRACE
654 switch ( gmm_data->kern.attach_cap.mobile_class )
655 {
656 case GMMREG_CLASS_CC:
657 TRACE_0_PARA ("MS class CC");
658 break;
659 case GMMREG_CLASS_CG:
660 TRACE_0_PARA ("MS class CG");
661 break;
662 case GMMREG_CLASS_B:
663 TRACE_0_PARA ("MS class B");
664 break;
665 case GMMREG_CLASS_BG:
666 TRACE_0_PARA ("MS class BG");
667 break;
668 case GMMREG_CLASS_BC:
669 TRACE_0_PARA ("MS class BC");
670 break;
671 case GMMREG_CLASS_A:
672 TRACE_0_PARA ("MS class A");
673 break;
674 default:
675 TRACE_ERROR ("unknown mobile class");
676 break;
677 }
678 switch (gmm_data->kern.attach_cap.attach_type)
679 {
680 case GMMREG_AT_IMSI:
681 TRACE_EVENT ("----- GSM only attach -----");
682 break;
683 case GMMREG_AT_GPRS:
684 TRACE_EVENT ("----- GPRS attach -----");
685 break;
686 case GMMREG_AT_COMB:
687 TRACE_EVENT ("----- GSM and GPRS attach -----");
688 break;
689 default:
690 TRACE_ERROR ("unknown attach type");
691 break;
692 }
693
694 #endif
695 {
696 PALLOC ( mmgmm_plmn_res, MMGMM_PLMN_RES);
697 mmgmm_plmn_res->plmn = gmmreg_plmn_res->plmn;
698 mmgmm_plmn_res->reg_type = REG_CELL_SEARCH_ONLY;
699 PFREE (gmmreg_plmn_res);
700
701 switch( GET_STATE( KERN ) )
702 {
703 case KERN_GMM_NULL_NO_IMSI_LIMITED_SERVICE_REQ:
704 case KERN_GMM_NULL_IMSI_LIMITED_SERVICE_REQ:
705 mmgmm_plmn_res->reg_type = REG_GPRS_INACTIVE;
706 break;
707 case KERN_GMM_NULL_NO_IMSI:
708 if (GMMREG_CLASS_CC==gmm_data->kern.attach_cap.mobile_class
709 || GMMREG_AT_IMSI== gmm_data->kern.attach_cap.attach_type)
710 {
711 /* NO state change */
712 }
713 else
714 {
715 SET_STATE ( KERN, KERN_GMM_DEREG_NO_IMSI);
716 #ifdef FF_EM_MODE
717 EM_GMM_SET_STATE(KERN_GMM_DEREG_NO_IMSI);
718 #endif
719 }
720 mmgmm_plmn_res->reg_type = REG_GPRS_INACTIVE;
721
722 break;
723
724 case KERN_GMM_DEREG_RESUMING:
725 case KERN_GMM_REG_RESUMING:
726 case KERN_GMM_DEREG_NO_IMSI:
727 break;
728 /*
729 * GMM-DEREGISTERED
730 */
731 case KERN_GMM_DEREG_SUSPENDING:
732 /*
733 * not reachable beause of save in pei
734 */
735 case KERN_GMM_DEREG_SUSPENDED:
736 kern_resume_grr_der();
737 /* NO break;*/
738 case KERN_GMM_DEREG_PLMN_SEARCH:
739 case KERN_GMM_DEREG_LIMITED_SERVICE:
740 case KERN_GMM_DEREG_NO_CELL_AVAILABLE:
741 case KERN_GMM_DEREG_ATTEMPTING_TO_ATTACH:
742 if (GMMREG_CLASS_CC==gmm_data->kern.attach_cap.mobile_class
743 || GMMREG_AT_IMSI== gmm_data->kern.attach_cap.attach_type)
744 {
745 SET_STATE ( KERN, KERN_GMM_NULL_PLMN_SEARCH);
746 #ifdef FF_EM_MODE
747 EM_GMM_SET_STATE(KERN_GMM_NULL_PLMN_SEARCH);
748 #endif
749 mmgmm_plmn_res->reg_type = REG_GPRS_INACTIVE;
750 }
751 else
752 {
753 SET_STATE ( KERN, KERN_GMM_DEREG_PLMN_SEARCH);
754 #ifdef FF_EM_MODE
755 EM_GMM_SET_STATE(KERN_GMM_DEREG_PLMN_SEARCH);
756 #endif
757 }
758
759 break;
760
761 case KERN_GMM_NULL_PLMN_SEARCH:
762 case KERN_GMM_NULL_IMSI:
763
764 if (GMMREG_CLASS_CC==gmm_data->kern.attach_cap.mobile_class
765 || GMMREG_AT_IMSI== gmm_data->kern.attach_cap.attach_type)
766 {
767 SET_STATE ( KERN, KERN_GMM_NULL_PLMN_SEARCH);
768 #ifdef FF_EM_MODE
769 EM_GMM_SET_STATE(KERN_GMM_NULL_PLMN_SEARCH);
770 #endif
771 mmgmm_plmn_res->reg_type = REG_GPRS_INACTIVE;
772 }
773 else
774 {
775 SET_STATE ( KERN, KERN_GMM_DEREG_PLMN_SEARCH);
776 #ifdef FF_EM_MODE
777 EM_GMM_SET_STATE(KERN_GMM_DEREG_PLMN_SEARCH);
778 #endif
779 kern_gmmrr_enable();
780 }
781
782 break;
783
784 case KERN_GMM_REG_NORMAL_SERVICE:
785
786 case KERN_GMM_REG_NO_CELL_AVAILABLE:
787 case KERN_GMM_REG_LIMITED_SERVICE:
788 case KERN_GMM_RAU_INITIATED:
789 case KERN_GMM_REG_INITIATED:
790 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE_MM:
791 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE:
792 break;
793 case KERN_GMM_REG_SUSPENDING:
794 /*
795 * not reachablebeause of save in pei
796 */
797 case KERN_GMM_REG_SUSPENDED:
798 /*
799 * Attach requests in suspended mode will be handled after resumption
800 * by triggering form GRR with GMMRR_CELL_IND
801 */
802
803 /*
804 * The user is not allowed to change the mobile class or establish a
805 * voice call the same time manuall network search is started. it would
806 * not be nice
807 */
808 kern_resume_grr_reg();
809
810 TRACE_ERROR("I hoped, that this never is happened, ...");
811 break;
812 default:
813 TRACE_ERROR( "GMMREG_PLMN_RES unexpected" );
814 break;
815
816 }
817 mmgmm_plmn_res->mobile_class=gmm_data->kern.attach_cap.mobile_class;
818 PSEND ( hCommMM, mmgmm_plmn_res );
819 }
820 GMM_RETURN;
821 } /* kern_gmmreg_plmn_res() */
822
823 /*
824 +------------------------------------------------------------------------------
825 | Function : kern_gmmreg_plmn_mode_req
826 +------------------------------------------------------------------------------
827 | Description : Handles the primitive GMMREG_PLMN_MODE_REQ
828 |
829 | MSC: 3.20 MM Interface
830 | MSC: 3.20.1 Change of PLMN Mode
831 |
832 | Parameters : *gmmreg_plmn_mode_req - Ptr to primitive payload
833 |
834 +------------------------------------------------------------------------------
835 */
836 GLOBAL void kern_gmmreg_plmn_mode_req ( T_GMMREG_PLMN_MODE_REQ *gmmreg_plmn_mode_req )
837 {
838 GMM_TRACE_FUNCTION( "kern_gmmreg_plmn_mode_req" );
839 {
840 PPASS ( gmmreg_plmn_mode_req, mmgmm_plmn_mode_req, MMGMM_PLMN_MODE_REQ );
841 /*
842 * PATCH UBUOB 11.3.02: if we change from MANUAL to AUTOMATC or vice versa,
843 * then we need to clear the limited_service flag
844 * Problem was: Bouyg SIM, manual registration on SFR upon return to
845 * auto mode, first GPRS ATTACH
846
847 if (gmm_data->kern.attach_cap.network_selection_mode
848 != gmmreg_plmn_mode_req->net_selection_mode)
849 {
850 gmm_data->kern.sig_cell_info.mm_status = MMGMM_FULL_SERVICE;
851 sig_kern_sync_set_mm_state(MMGMM_FULL_SERVICE);
852 }
853 */
854 /*
855 * PLMN mode set to manual mode with PLMN_RES only
856 gmm_data->kern.attach_cap.network_selection_mode =
857 gmmreg_plmn_mode_req->net_selection_mode;
858 */
859 if (GMMREG_NET_SEL_MODE_AUTO == gmmreg_plmn_mode_req->net_selection_mode)
860 {
861 gmm_data->kern.attach_cap.network_selection_mode =
862 gmmreg_plmn_mode_req->net_selection_mode;
863 }
864 else
865 {
866 TRACE_0_INFO ("manual mode ignored. will be set with PLMN_RES");
867 }
868
869 PSEND ( hCommMM, mmgmm_plmn_mode_req );
870 }
871 GMM_RETURN;
872 } /* kern_gmmreg_plmn_mode_req () */
873
874 /*
875 +------------------------------------------------------------------------------
876 | Function : kern_gmmreg_config_req
877 +------------------------------------------------------------------------------
878 | Description : Handles the primitive GMMREG_CONFIG_REQ
879 |
880 | Parameters : *gmmreg_config_req - Ptr to primitive payload
881 |
882 +------------------------------------------------------------------------------
883 */
884 GLOBAL void kern_gmmreg_config_req ( T_GMMREG_CONFIG_REQ *gmmreg_config_req )
885 {
886 GMM_TRACE_FUNCTION( "kern_gmmreg_config_req" );
887 gmm_data->config.cipher_on
888 = gmmreg_config_req->cipher_on;
889 PFREE (gmmreg_config_req);
890 GMM_RETURN;
891 } /* kern_gmmreg_plmn_mode_req () */
892 /*
893 +------------------------------------------------------------------------------
894 | Function : kern_gmmreg_detach_req
895 +------------------------------------------------------------------------------
896 | Description : Handles the primitive GMMREG_DETACH_REQ
897 |
898 | Parameters : *gmmreg_detach_req - Ptr to primitive payload
899 |
900 +------------------------------------------------------------------------------
901 */
902 GLOBAL void kern_gmmreg_detach_req ( T_GMMREG_DETACH_REQ *gmmreg_detach_req )
903 {
904 GMM_TRACE_FUNCTION( "kern_gmmreg_detach_req" );
905
906 /*
907 * RAU may interrupt detach procedure, so we have to store the detach type
908 */
909 gmm_data->kern.detach_cap.detach_type=gmmreg_detach_req->detach_type;
910 gmm_data->kern.detach_cap.gmmreg=TRUE;
911
912 switch (gmmreg_detach_req->detach_type)
913 {
914 case GMMREG_DT_GPRS:
915 switch(gmm_data->kern.attach_cap.attach_type)
916 {
917 case GMMREG_AT_GPRS:
918 case GMMREG_AT_NOT_KNOWN:
919 gmm_data->kern.attach_cap.attach_type=GMMREG_AT_NOT_KNOWN;
920 break;
921 default:
922 case GMMREG_AT_IMSI:
923 case GMMREG_AT_COMB:
924 gmm_data->kern.attach_cap.attach_type=GMMREG_AT_IMSI;
925 break;
926 }
927 TRACE_EVENT ("Para: GPRS detach");
928 break;
929 case GMMREG_DT_IMSI:
930 gmm_data->kern.attach_cap.attach_type=
931 (GMMREG_CLASS_CC == gmm_data->kern.attach_cap.mobile_class?
932 GMMREG_AT_NOT_KNOWN:
933 GMMREG_AT_GPRS);
934 TRACE_EVENT ("Para: IMSI detach");
935 break;
936 case GMMREG_DT_POWER_OFF:
937 /*
938 * TMSI reset to remove TMSI in GRR when gmmrr_assign_req will
939 * be sent
940 */
941 gmm_data->tmsi = GMMRR_TMSI_INVALID;
942 gmm_data->kern.attach_cap.attach_type=GMMREG_AT_NOT_KNOWN;
943 gmm_data->kern.attach_cap.network_selection_mode=MODE_AUTO;
944 TRACE_EVENT ("Para: Power OFF");
945 break;
946 case GMMREG_DT_SOFT_OFF:
947 /*
948 * TMSI reset to remove TMSI in GRR when gmmrr_assign_req will
949 * be sent
950 */
951 gmm_data->tmsi = GMMRR_TMSI_INVALID;
952 gmm_data->kern.attach_cap.attach_type=GMMREG_AT_NOT_KNOWN;
953 TRACE_EVENT ("Para: Soft OFF");
954 break;
955 case GMMREG_DT_COMB:
956 gmm_data->kern.attach_cap.service_mode=SERVICE_MODE_LIMITED;
957 gmm_data->kern.attach_cap.attach_type=GMMREG_AT_NOT_KNOWN;
958 TRACE_EVENT ("Para: GMMREG_DT_COMB");
959 break;
960 case GMMREG_DT_SIM_REMOVED:
961 gmm_data->kern.attach_cap.attach_type=GMMREG_AT_NOT_KNOWN;
962 TRACE_EVENT ("Para: GMMREG_DT_SIM_REMOVED");
963 break;
964 case GMMREG_DT_DISABLE_GPRS:
965 TRACE_EVENT ("Para: GMMREG_DT_DISABLE_GPRS");
966 break;
967 case GMMREG_DT_LIMITED_SERVICE:
968 gmm_data->kern.attach_cap.service_mode=SERVICE_MODE_LIMITED;
969 TRACE_EVENT ("Para: GMMREG_DT_LIMITED_SERVICE");
970 break;
971 default:
972 gmm_data->kern.attach_cap.attach_type=
973 (GMMREG_CLASS_CG == gmm_data->kern.attach_cap.mobile_class?
974 GMMREG_AT_NOT_KNOWN:
975 GMMREG_AT_IMSI);
976 vsi_o_ttrace(VSI_CALLER TC_ERROR,"Error: Unknown detach_type = %x", gmmreg_detach_req->detach_type);
977 break;
978
979
980 }
981
982 gmm_data->kern.detach_cap.detach_type = gmmreg_detach_req->detach_type;
983
984 gmm_data->kern.detach_cap.gmmreg = TRUE;
985 gmm_data->kern.attach_cap.gmmreg = FALSE;
986 #ifndef GMM_TCS4
987 gmm_data->kern.attach_cap.gmmsm = FALSE;
988 #endif
989
990 PFREE ( gmmreg_detach_req );
991
992 switch( GET_STATE( KERN ) )
993 {
994 case KERN_GMM_REG_LIMITED_SERVICE:
995 case KERN_GMM_REG_NO_CELL_AVAILABLE:
996 case KERN_GMM_REG_TEST_MODE:
997 case KERN_GMM_REG_TEST_MODE_NO_IMSI:
998 switch ( gmm_data->kern.detach_cap.detach_type )
999 {
1000 case GMMREG_DT_IMSI:
1001 case GMMREG_DT_COMB:
1002 case GMMREG_DT_SIM_REMOVED:
1003 SET_STATE ( KERN, KERN_GMM_REG_SUSPENDED);
1004 #ifdef FF_EM_MODE
1005 EM_GMM_SET_STATE(KERN_GMM_REG_SUSPENDED);
1006 #endif
1007 kern_mm_imsi_detach();
1008 break;
1009 case GMMREG_DT_DISABLE_GPRS:
1010 kern_local_detach( GMMCS_INT_NOT_PRESENT, FALSE,
1011 GMM_LOCAL_DETACH_PROC_ENTER_NULL_IMSI); /* TCS 2.1 */
1012 break;
1013 case GMMREG_DT_GPRS:
1014 kern_local_detach( GMMCS_INT_NOT_PRESENT, FALSE,
1015 GMM_LOCAL_DETACH_PROC_ENTER_NULL_IMSI); /* TCS 2.1 */
1016 break;
1017 case GMMREG_DT_POWER_OFF:
1018 kern_local_detach( GMMCS_POWER_OFF, FALSE, /* TCS 2.1 */
1019 GMM_LOCAL_DETACH_PROC_POWER_OFF);
1020 break;
1021 case GMMREG_DT_SOFT_OFF:
1022 kern_local_detach( GMMCS_POWER_OFF, FALSE, /* TCS 2.1 */
1023 GMM_LOCAL_DETACH_PROC_SOFT_OFF);
1024
1025 break;
1026 default:
1027 TRACE_ERROR ("Unexpected detach type in primitive GMMREG_DETACH_REQ");
1028 break;
1029 }
1030 break;
1031 case KERN_GMM_REG_INITIATED:
1032 /*
1033 * This cause is abnormal, because the normal and not the local detach
1034 * procedure is started on power off
1035 *
1036 * MSC: 3.8.1.4.7 g) Power off
1037 * <R.GMM.AGABNORM.M.015>,
1038 * <R.GMM.AGABNORM.M.031>
1039 */
1040 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE:
1041 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE_MM:
1042 kern_gmmrr_attach_finished();
1043 /* NO break;*/
1044
1045 case KERN_GMM_REG_NORMAL_SERVICE:
1046 switch ( gmm_data->kern.detach_cap.detach_type )
1047 {
1048 case GMMREG_DT_IMSI:
1049 case GMMREG_DT_COMB:
1050 case GMMREG_DT_SIM_REMOVED:
1051 switch (gmm_data->kern.sig_cell_info.net_mode)
1052 {
1053 case GMMRR_NET_MODE_I:
1054 kern_detach( );
1055 break;
1056 case GMMRR_NET_MODE_II:
1057 SET_STATE ( KERN, KERN_GMM_REG_SUSPENDING);
1058 #ifdef FF_EM_MODE
1059 EM_GMM_SET_STATE(KERN_GMM_REG_SUSPENDING);
1060 #endif
1061 kern_llgmm_suspend(LLGMM_CALL);
1062 kern_gmmrr_suspend(GMMRR_SUSP_GPRS, GMMRR_NORMAL_RELEASE, GMM_SUSP_IMSI_DETACH);
1063 break;
1064 case GMMRR_NET_MODE_III:
1065 kern_detach( );
1066 break;
1067 default:
1068 TRACE_ERROR ("unknown net mode");
1069 break;
1070 }
1071 break;
1072 case GMMREG_DT_DISABLE_GPRS:
1073 case GMMREG_DT_GPRS:
1074 case GMMREG_DT_POWER_OFF:
1075 case GMMREG_DT_SOFT_OFF:
1076 kern_detach( );
1077 break;
1078
1079 default:
1080 TRACE_ERROR ("Unexpected detach type in primitive GMMREG_DETACH_REQ");
1081 break;
1082 }
1083 break;
1084
1085 case KERN_GMM_REG_IMSI_DETACH_INITIATED:
1086 switch ( gmm_data->kern.detach_cap.detach_type )
1087 {
1088 case GMMREG_DT_DISABLE_GPRS:
1089 gmm_data->kern.attach_cap.mobile_class = GMMREG_CLASS_CC;
1090 /* NO break */
1091 default:
1092 kern_detach( );
1093 break;
1094 }
1095 break;
1096
1097 case KERN_GMM_REG_SUSPENDED:
1098 switch ( gmm_data->kern.detach_cap.detach_type )
1099 {
1100 case GMMREG_DT_IMSI:
1101 case GMMREG_DT_COMB:
1102 case GMMREG_DT_SIM_REMOVED:
1103 kern_mm_imsi_detach();
1104 break;
1105 case GMMREG_DT_DISABLE_GPRS:
1106 gmm_data->kern.attach_cap.mobile_class = GMMREG_CLASS_CC;
1107 /* NO break; */
1108 case GMMREG_DT_GPRS:
1109 /*
1110 * Wait untill GSM is finished
1111 */
1112 break;
1113 case GMMREG_DT_POWER_OFF:
1114 kern_local_detach( GMMCS_POWER_OFF, FALSE, /* TCS 2.1 */
1115 GMM_LOCAL_DETACH_PROC_POWER_OFF);
1116 break;
1117 case GMMREG_DT_SOFT_OFF:
1118 kern_local_detach( GMMCS_POWER_OFF, FALSE, /* TCS 2.1 */
1119 GMM_LOCAL_DETACH_PROC_SOFT_OFF);
1120 break;
1121 default:
1122 TRACE_ERROR ("Unexpected detach type in primitive GMMREG_DETACH_REQ");
1123 break;
1124 }
1125 break;
1126 case KERN_GMM_DEREG_RESUMING:
1127 case KERN_GMM_REG_RESUMING:
1128 TRACE_ERROR ("prim should be saved by pei");
1129 /* NO break */
1130 case KERN_GMM_REG_SUSPENDING:
1131 switch ( gmm_data->kern.detach_cap.detach_type )
1132 {
1133 case GMMREG_DT_IMSI:
1134 case GMMREG_DT_COMB:
1135 case GMMREG_DT_SIM_REMOVED:
1136 gmm_data->kern.suspension_type |= GMM_SUSP_IMSI_DETACH;
1137 break;
1138 case GMMREG_DT_DISABLE_GPRS:
1139 gmm_data->kern.attach_cap.mobile_class = GMMREG_CLASS_CC;
1140 /* NO break; */
1141 case GMMREG_DT_GPRS:
1142 /*
1143 * Wait untill GSM is finished
1144 */
1145 break;
1146 case GMMREG_DT_POWER_OFF:
1147 case GMMREG_DT_SOFT_OFF:
1148 SET_STATE ( KERN, KERN_GMM_REG_SUSPENDED);
1149 #ifdef FF_EM_MODE
1150 EM_GMM_SET_STATE(KERN_GMM_REG_SUSPENDED);
1151 #endif
1152 kern_resume_grr_reg();
1153 break;
1154 default:
1155 TRACE_ERROR ("Unexpected detach type in primitive GMMREG_DETACH_REQ");
1156 break;
1157 }
1158 break;
1159
1160 case KERN_GMM_NULL_NO_IMSI:
1161 case KERN_GMM_NULL_NO_IMSI_LIMITED_SERVICE_REQ:
1162 switch ( gmm_data->kern.detach_cap.detach_type )
1163 {
1164 case GMMREG_DT_IMSI:
1165 case GMMREG_DT_COMB:
1166 if ( GMM_MM_DEREG != GET_STATE(MM) )
1167 {
1168 kern_mm_imsi_detach();
1169 break;
1170 }
1171 /* else NO break;*/
1172 case GMMREG_DT_SIM_REMOVED:
1173 case GMMREG_DT_GPRS:
1174 {
1175 PALLOC (gmmreg_detach_cnf, GMMREG_DETACH_CNF);
1176 gmmreg_detach_cnf->detach_type = gmm_data->kern.detach_cap.detach_type;
1177 PSEND ( hCommMMI, gmmreg_detach_cnf );
1178 break;
1179 }
1180 case GMMREG_DT_POWER_OFF:
1181 SET_STATE ( KERN, KERN_GMM_NULL_NO_IMSI );
1182 #ifdef FF_EM_MODE
1183 EM_GMM_SET_STATE(KERN_GMM_NULL_NO_IMSI );
1184 #endif
1185 /* NO break*/
1186 case GMMREG_DT_SOFT_OFF:
1187 kern_mm_imsi_detach_ind (GMMCS_INT_NOT_PRESENT, /* TCS 2.1 */
1188 GET_STATE(MM)==GMM_MM_DEREG?
1189 MMGMM_DETACH_DONE:
1190 MMGMM_PERFORM_DETACH,
1191 gmm_data->kern.detach_cap.detach_type);
1192
1193 break;
1194 case GMMREG_DT_DISABLE_GPRS:
1195 gmm_data->kern.attach_cap.mobile_class = GMMREG_CLASS_CC;
1196 {
1197 PALLOC (gmmreg_detach_cnf, GMMREG_DETACH_CNF);
1198 gmmreg_detach_cnf->detach_type = gmm_data->kern.detach_cap.detach_type;
1199 PSEND ( hCommMMI, gmmreg_detach_cnf );
1200 }
1201 break;
1202
1203 default:
1204 TRACE_ERROR ("Unexpected detach type in primitive GMMREG_DETACH_REQ");
1205 break;
1206 }
1207 break;
1208
1209
1210 case KERN_GMM_NULL_IMSI:
1211 case KERN_GMM_NULL_PLMN_SEARCH:
1212 case KERN_GMM_NULL_IMSI_LIMITED_SERVICE_REQ:
1213 switch ( gmm_data->kern.detach_cap.detach_type )
1214 {
1215 case GMMREG_DT_IMSI:
1216 case GMMREG_DT_COMB:
1217 if ( GMM_MM_DEREG != GET_STATE(MM) )
1218 {
1219 kern_mm_imsi_detach_ind (GMMCS_INT_NOT_PRESENT, MMGMM_PERFORM_DETACH,
1220 GMMREG_DT_SIM_REMOVED);
1221
1222 break;
1223 }
1224 /* else NO break;*/
1225 case GMMREG_DT_GPRS:
1226 {
1227 PALLOC (gmmreg_detach_cnf, GMMREG_DETACH_CNF);
1228 gmmreg_detach_cnf->detach_type = gmm_data->kern.detach_cap.detach_type;
1229 PSEND ( hCommMMI, gmmreg_detach_cnf );
1230 break;
1231 }
1232 case GMMREG_DT_SOFT_OFF:
1233 SET_STATE ( KERN, KERN_GMM_NULL_IMSI );
1234 #ifdef FF_EM_MODE
1235 EM_GMM_SET_STATE(KERN_GMM_NULL_IMSI );
1236 #endif
1237 kern_mm_imsi_detach_ind (GMMCS_INT_NOT_PRESENT, /* TCS 2.1 */
1238 GET_STATE(MM)==GMM_MM_DEREG?
1239 MMGMM_DETACH_DONE:
1240 MMGMM_PERFORM_DETACH,gmm_data->kern.detach_cap.detach_type);
1241
1242 break;
1243 case GMMREG_DT_SIM_REMOVED:
1244 case GMMREG_DT_POWER_OFF:
1245 SET_STATE ( KERN, KERN_GMM_NULL_NO_IMSI );
1246 #ifdef FF_EM_MODE
1247 EM_GMM_SET_STATE(KERN_GMM_NULL_NO_IMSI );
1248 #endif
1249 kern_mm_imsi_detach_ind (GMMCS_INT_NOT_PRESENT, /* TCS 2.1 */
1250 GET_STATE(MM)==GMM_MM_DEREG?
1251 MMGMM_DETACH_DONE:
1252 MMGMM_PERFORM_DETACH,
1253 gmm_data->kern.detach_cap.detach_type);
1254
1255 break;
1256 case GMMREG_DT_DISABLE_GPRS:
1257 gmm_data->kern.attach_cap.mobile_class = GMMREG_CLASS_CC;
1258 {
1259 PALLOC (gmmreg_detach_cnf, GMMREG_DETACH_CNF);
1260 gmmreg_detach_cnf->detach_type = gmm_data->kern.detach_cap.detach_type;
1261 PSEND ( hCommMMI, gmmreg_detach_cnf );
1262 }
1263 break;
1264 default:
1265 TRACE_ERROR ("Unexpected detach type in primitive GMMREG_DETACH_REQ");
1266 break;
1267 }
1268 break;
1269
1270 case KERN_GMM_DEREG_ATTEMPTING_TO_ATTACH:
1271 kern_gmmrr_attach_finished();
1272
1273 /* NO break; */
1274
1275 case KERN_GMM_DEREG_NO_IMSI:
1276 case KERN_GMM_DEREG_PLMN_SEARCH:
1277 case KERN_GMM_DEREG_LIMITED_SERVICE:
1278 case KERN_GMM_DEREG_NO_CELL_AVAILABLE:
1279 case KERN_GMM_DEREG_INITIATED:
1280
1281 case KERN_GMM_DEREG_SUSPENDED:
1282 case KERN_GMM_DEREG_SUSPENDING:
1283
1284 switch ( gmm_data->kern.detach_cap.detach_type )
1285 {
1286 case GMMREG_DT_IMSI:
1287 case GMMREG_DT_COMB:
1288 if ( GMM_MM_DEREG != GET_STATE(MM) )
1289 {
1290 switch ( GET_STATE( KERN ) )
1291 {
1292 case KERN_GMM_DEREG_SUSPENDING:
1293 gmm_data->kern.suspension_type |= GMM_SUSP_IMSI_DETACH;
1294 break;
1295 default:
1296 kern_imsi_detach_der_susp ();
1297 break;
1298 }
1299 }
1300 /* NO break;*/
1301 case GMMREG_DT_GPRS:
1302 {
1303 PALLOC (gmmreg_detach_cnf, GMMREG_DETACH_CNF);
1304 gmmreg_detach_cnf->detach_type = gmm_data->kern.detach_cap.detach_type;
1305 PSEND ( hCommMMI, gmmreg_detach_cnf );
1306 break;
1307 }
1308 case GMMREG_DT_SOFT_OFF:
1309 kern_local_detach( GMMCS_POWER_OFF, FALSE, GMM_LOCAL_DETACH_PROC_SOFT_OFF); /* TCS 2.1 */
1310 break;
1311 case GMMREG_DT_POWER_OFF:
1312 kern_local_detach( GMMCS_POWER_OFF, FALSE, GMM_LOCAL_DETACH_PROC_POWER_OFF); /* TCS 2.1 */
1313 break;
1314 case GMMREG_DT_DISABLE_GPRS:
1315 case GMMREG_DT_SIM_REMOVED:
1316 kern_local_detach( GMMCS_INT_PROTOCOL_ERROR, FALSE, /* TCS 2.1 */
1317 GMM_LOCAL_DETACH_PROC_ENTER_DEREG );
1318 break;
1319 default:
1320 TRACE_ERROR ("Unexpected detach type in primitive GMMREG_DETACH_REQ");
1321 break;
1322 }
1323 break;
1324
1325 case KERN_GMM_RAU_INITIATED:
1326 case KERN_GMM_RAU_WAIT_FOR_NPDU_LIST:
1327 /*
1328 * DETACH whilst RAU
1329 */
1330 break;
1331
1332 default:
1333 TRACE_ERROR( "GMMREG_DETACH_REQ unexpected" );
1334 break;
1335 }
1336 GMM_RETURN;
1337 } /* kern_gmmreg_detach_req() */
1338
1339
1340 /*
1341 +------------------------------------------------------------------------------
1342 | Function : kern_gmmsms_reg_state_req
1343 +------------------------------------------------------------------------------
1344 | Description : Handles the primitive GMMSMS_REG_STATE_REQ
1345 |
1346 | MSC: 3.21 Interaction with SMS
1347 |
1348 | Parameters : *gmmsms_reg_state_req - Ptr to primitive payload
1349 |
1350 +------------------------------------------------------------------------------
1351 */
1352 GLOBAL void kern_gmmsms_reg_state_req ( T_GMMSMS_REG_STATE_REQ *gmmsms_reg_state_req )
1353 {
1354 GMM_TRACE_FUNCTION( "kern_gmmsms_reg_state_req" );
1355
1356 PFREE (gmmsms_reg_state_req);
1357 {
1358 PALLOC ( gmmsms_reg_state_cnf, GMMSMS_REG_STATE_CNF );
1359 gmmsms_reg_state_cnf->radio_priority_level =
1360 gmm_data->kern.attach_cap.sms_radio_priority_level;
1361 switch( GET_STATE( KERN ) )
1362 {
1363 case KERN_GMM_NULL_NO_IMSI:
1364 case KERN_GMM_NULL_IMSI:
1365 case KERN_GMM_DEREG_NO_IMSI:
1366 case KERN_GMM_REG_SUSPENDED:
1367 case KERN_GMM_REG_RESUMING:
1368 case KERN_GMM_DEREG_SUSPENDED:
1369 case KERN_GMM_DEREG_RESUMING:
1370 case KERN_GMM_DEREG_PLMN_SEARCH:
1371 case KERN_GMM_DEREG_LIMITED_SERVICE:
1372 case KERN_GMM_DEREG_NO_CELL_AVAILABLE:
1373 case KERN_GMM_DEREG_ATTEMPTING_TO_ATTACH:
1374 case KERN_GMM_DEREG_INITIATED:
1375 case KERN_GMM_REG_INITIATED:
1376 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE:
1377 case KERN_GMM_REG_NO_CELL_AVAILABLE:
1378 case KERN_GMM_REG_LIMITED_SERVICE:
1379 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE_MM:
1380 case KERN_GMM_RAU_INITIATED:
1381
1382 gmmsms_reg_state_cnf->reg_state = SMS_RS_DEREGISTERED;
1383 break;
1384
1385 case KERN_GMM_REG_NORMAL_SERVICE:
1386
1387 gmmsms_reg_state_cnf->reg_state = SMS_RS_REGISTERED;
1388 break;
1389 default:
1390 TRACE_ERROR( "GMMSMS_REG_STATE_REQ unexpected" );
1391 break;
1392 }
1393 PSEND(hCommSMS,gmmsms_reg_state_cnf);
1394 }/* PALLOC*/
1395 GMM_RETURN;
1396 } /* kern_gmmsms_reg_state_req() */
1397
1398
1399
1400 /*
1401 +------------------------------------------------------------------------------
1402 | Function : kern_gmmrr_page_ind
1403 +------------------------------------------------------------------------------
1404 | Description : Handles the primitive GMMRR_PAGE_IND
1405 |
1406 | Parameters : *gmmrr_page_ind - Ptr to primitive payload
1407 |
1408 +------------------------------------------------------------------------------
1409 */
1410 GLOBAL void kern_gmmrr_page_ind ( T_GMMRR_PAGE_IND *gmmrr_page_ind )
1411 {
1412 GMM_TRACE_FUNCTION( "kern_gmmrr_page_ind" );
1413
1414
1415 switch( GET_STATE( KERN ) )
1416 {
1417 /*
1418 * case GMM-DEREG
1419 * If the MS is not GPRS attached when it receives a paging for
1420 * GPRS services, the MS shall ignore the paging.
1421 * <R.GMM.PAGNGPRS.M.17>
1422 */
1423 case KERN_GMM_REG_NORMAL_SERVICE:
1424 switch ( gmmrr_page_ind->page_id )
1425 {
1426 case GMMRR_IMSI:
1427 TRACE_EVENT("paged with IMSI");
1428 PFREE ( gmmrr_page_ind );
1429 gmm_data->gu = GU2_NOT_UPDATED;
1430 kern_sim_del_locigprs ();
1431 kern_sim_gmm_update ();
1432 /*
1433 * <R.GMM.PGPIMSI.M.004>, <R.GMM.PGPIMSI.M.005>,
1434 * <R.GMM.PGPIMSI.M.008>
1435 */
1436 gmm_data->kern.detach_cap.detach_type = GMM_DT_RE_ATTACH;
1437 kern_local_detach( GMMCS_INT_PROTOCOL_ERROR, /* TCS 2.1 */
1438 FALSE, GMM_LOCAL_DETACH_PROC_RE_ATTACH);
1439 /*
1440 * goto LABEL ATTACH
1441 *
1442 * <R.GMM.PGPIMSI.M.009>
1443 * GMM-DEREG.NORMAL-SERVICE
1444 *
1445 kern_attach_reset();
1446 kern_attach();
1447 */
1448 break;
1449 case GMMRR_PTMSI:
1450 TRACE_EVENT("paged with P-TMSI");
1451 PFREE ( gmmrr_page_ind );
1452 {
1453 /*
1454 * <R.GMM.PGPPTMS.M.007>
1455 */
1456 PALLOC (llgmm_trigger_req, LLGMM_TRIGGER_REQ);
1457 llgmm_trigger_req->trigger_cause = LLGMM_TRICS_PAGE_RESPONSE;
1458 PSEND ( hCommLLC, llgmm_trigger_req );
1459 break;
1460 }
1461 default:
1462 PFREE ( gmmrr_page_ind );
1463 TRACE_ERROR( "IMSI or PTMSI page ID expected" );
1464 break;
1465 }
1466 break;
1467 default:
1468 PFREE ( gmmrr_page_ind );
1469 TRACE_ERROR( "GMMRR_PAGE_IND unexpected" );
1470 break;
1471 }
1472 GMM_RETURN;
1473 } /* kern_gmmrr_page_ind() */
1474
1475 /*
1476 +------------------------------------------------------------------------------
1477 | Function : kern_gmmrr_cs_page_ind
1478 +------------------------------------------------------------------------------
1479 | Description : Handles the primitive GMMRR_CS_PAGE_IND
1480 |
1481 | Parameters : *gmmrr_cs_page_ind - Ptr to primitive payload
1482 |
1483 +------------------------------------------------------------------------------
1484 */
1485 GLOBAL void kern_gmmrr_cs_page_ind ( T_GMMRR_CS_PAGE_IND *gmmrr_cs_page_ind )
1486 {
1487 GMM_TRACE_FUNCTION( "kern_gmmrr_cs_page_ind" );
1488
1489 PFREE ( gmmrr_cs_page_ind );
1490
1491
1492 {
1493 PALLOC ( gmmrr_cs_page_res, GMMRR_CS_PAGE_RES );
1494
1495 switch (gmm_data->kern.attach_cap.mobile_class)
1496 {
1497 case GMMRR_CLASS_CG:
1498 gmmrr_cs_page_res->response = GMMRR_CS_PAGE_REJ;
1499 gmmrr_cs_page_res->susp_gprs = GMMRR_NOT_SUSP_GPRS;
1500 break;
1501
1502 /* PATCH JPS 26.10.02: with class BX, we can have BC in NMOIII */
1503 case GMMREG_CLASS_BG:
1504 if (GMMRR_NET_MODE_III==gmm_data->kern.sig_cell_info.net_mode)
1505 {
1506 gmmrr_cs_page_res->response = GMMRR_CS_PAGE_REJ;
1507 gmmrr_cs_page_res->susp_gprs = GMMRR_NOT_SUSP_GPRS;
1508 break;
1509 }
1510 /* NO break; */
1511 case GMMREG_CLASS_BC:
1512 case GMMREG_CLASS_B:
1513 /* PATCH JPS 26.10.02 END */
1514 switch( GET_STATE( KERN ) )
1515 {
1516 case KERN_GMM_DEREG_RESUMING:
1517 case KERN_GMM_REG_RESUMING:
1518 TRACE_ERROR ("prim should be saved by pei");
1519 break;
1520 case KERN_GMM_DEREG_ATTEMPTING_TO_ATTACH:
1521 gmm_data->kern.attach_cap.enter_attempting_to_update_after_lau = TRUE;
1522 /* NO break;*/
1523 case KERN_GMM_DEREG_NO_IMSI:
1524 case KERN_GMM_DEREG_SUSPENDED:
1525 case KERN_GMM_DEREG_LIMITED_SERVICE:
1526
1527 case KERN_GMM_DEREG_NO_CELL_AVAILABLE:
1528 case KERN_GMM_DEREG_PLMN_SEARCH:
1529 case KERN_GMM_DEREG_INITIATED:
1530 case KERN_GMM_REG_INITIATED:
1531 if (GMM_MM_DEREG != GET_STATE(MM)
1532 && MMGMM_LIMITED_SERVICE!=gmm_data->kern.sig_cell_info.mm_status
1533 )
1534 {
1535 gmmrr_cs_page_res->response = GMMRR_CS_PAGE_CNF;
1536 SET_STATE ( KERN, KERN_GMM_DEREG_SUSPENDED );
1537 #ifdef FF_EM_MODE
1538 EM_GMM_SET_STATE(KERN_GMM_DEREG_SUSPENDED );
1539 #endif
1540 }
1541 else
1542 {
1543 gmmrr_cs_page_res->response = GMMRR_CS_PAGE_REJ;
1544 }
1545 gmmrr_cs_page_res->susp_gprs = GMMRR_NOT_SUSP_GPRS;
1546 break;
1547 case KERN_GMM_REG_SUSPENDED:
1548 case KERN_GMM_REG_LIMITED_SERVICE:
1549 case KERN_GMM_REG_NO_CELL_AVAILABLE:
1550 if (GMM_MM_DEREG != GET_STATE(MM)
1551 && MMGMM_LIMITED_SERVICE!=gmm_data->kern.sig_cell_info.mm_status)
1552 {
1553 gmmrr_cs_page_res->response = GMMRR_CS_PAGE_CNF;
1554 SET_STATE ( KERN, KERN_GMM_REG_SUSPENDED );
1555 #ifdef FF_EM_MODE
1556 EM_GMM_SET_STATE(KERN_GMM_REG_SUSPENDED );
1557 #endif
1558 kern_llgmm_suspend(LLGMM_CALL);
1559 }
1560 else
1561 {
1562 gmmrr_cs_page_res->response = GMMRR_CS_PAGE_REJ;
1563 }
1564 gmmrr_cs_page_res->susp_gprs = GMMRR_NOT_SUSP_GPRS;
1565
1566 break;
1567 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE:
1568 if (GMM_MM_DEREG != GET_STATE(MM)
1569 && MMGMM_LIMITED_SERVICE!=gmm_data->kern.sig_cell_info.mm_status)
1570 {
1571 gmmrr_cs_page_res->response = GMMRR_CS_PAGE_CNF;
1572 gmm_data->kern.attach_cap.enter_attempting_to_update_after_lau = TRUE;
1573 SET_STATE ( KERN, KERN_GMM_REG_SUSPENDED );
1574 #ifdef FF_EM_MODE
1575 EM_GMM_SET_STATE(KERN_GMM_REG_SUSPENDED );
1576 #endif
1577 kern_llgmm_suspend(LLGMM_CALL);
1578 }
1579 else
1580 {
1581 gmmrr_cs_page_res->response = GMMRR_CS_PAGE_REJ;
1582 }
1583 gmmrr_cs_page_res->susp_gprs = GMMRR_SUSP_GPRS;
1584 /*
1585 * kern_llgmm_unassign();
1586 */
1587 break;
1588 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE_MM:
1589 /* IOT: Combined RA/LA is accepted with network cause 16
1590 * MSC temporarily unavailable. MM state is reset to GMM_MM_DEREG
1591 * From the IOT, it was observed that after GMM moves to NMOII, MM
1592 * was able to perform LAU successfully, but not combined RAU. Hence
1593 * in this state we should be able to make and receive CS calls
1594 * Also network is able to reach us through paging */
1595 if (/*GMM_MM_DEREG != GET_STATE(MM)
1596 && */ MMGMM_LIMITED_SERVICE!=gmm_data->kern.sig_cell_info.mm_status)
1597 {
1598 gmmrr_cs_page_res->response = GMMRR_CS_PAGE_CNF;
1599 gmm_data->kern.attach_cap.enter_attempting_to_update_after_lau = TRUE;
1600 SET_STATE ( KERN, KERN_GMM_REG_SUSPENDED );
1601 kern_llgmm_suspend(LLGMM_CALL);
1602 }
1603 else
1604 {
1605 gmmrr_cs_page_res->response = GMMRR_CS_PAGE_REJ;
1606 }
1607 gmmrr_cs_page_res->susp_gprs = GMMRR_SUSP_GPRS;
1608 /*
1609 * kern_llgmm_unassign();
1610 */
1611 break;
1612 case KERN_GMM_RAU_INITIATED:
1613 case KERN_GMM_REG_NORMAL_SERVICE:
1614 if (GMM_MM_DEREG != GET_STATE(MM)
1615 && MMGMM_LIMITED_SERVICE!=gmm_data->kern.sig_cell_info.mm_status)
1616 {
1617 gmmrr_cs_page_res->response = GMMRR_CS_PAGE_CNF;
1618 SET_STATE ( KERN, KERN_GMM_REG_SUSPENDED );
1619 #ifdef FF_EM_MODE
1620 EM_GMM_SET_STATE(KERN_GMM_REG_SUSPENDED );
1621 #endif
1622 kern_llgmm_suspend(LLGMM_CALL);
1623 }
1624 else
1625 {
1626 gmmrr_cs_page_res->response = GMMRR_CS_PAGE_REJ;
1627 }
1628 gmmrr_cs_page_res->susp_gprs = GMMRR_SUSP_GPRS;
1629 /*
1630 * kern_llgmm_unassign();
1631 */
1632 break;
1633 case KERN_GMM_NULL_IMSI:
1634 /*
1635 * in state KERN_GMM_NULL_IMSI MS is doing a GPRS detach
1636 * and GMM has informed MM to act as GSM only mobile but
1637 * before MM processes the message, GMM receives CS_PAGE_IND
1638 * GMM must reject the CS_PAGE as MM will take care of the
1639 * next CS_PAGE_IND after processing MMGMM_REG_REQ to act as
1640 * GSM only mobile. if GMM accepts the CS_PAGE, GRR will be
1641 * suspended and after coming out of dedicated mode MM will
1642 * not inform GMM about CS connection release and GRR will
1643 * not be resumed. This is to prevent such a race condition.
1644 */
1645
1646 TRACE_EVENT("CS Call Received To GMM In GMM_NULL_IMSI state");
1647 gmmrr_cs_page_res->response = GMMRR_CS_PAGE_REJ;
1648 gmmrr_cs_page_res->susp_gprs = GMMRR_NOT_SUSP_GPRS;
1649 break;
1650 case KERN_GMM_NULL_PLMN_SEARCH:
1651 if (GMM_MM_DEREG != GET_STATE(MM)
1652 && MMGMM_LIMITED_SERVICE!=gmm_data->kern.sig_cell_info.mm_status)
1653 {
1654 gmmrr_cs_page_res->response = GMMRR_CS_PAGE_CNF;
1655 }
1656 else
1657 {
1658 gmmrr_cs_page_res->response = GMMRR_CS_PAGE_REJ;
1659 }
1660 gmmrr_cs_page_res->susp_gprs = GMMRR_NOT_SUSP_GPRS;
1661 break;
1662 default:
1663 if (GMM_MM_DEREG != GET_STATE(MM)
1664 && MMGMM_LIMITED_SERVICE!=gmm_data->kern.sig_cell_info.mm_status)
1665 {
1666 gmmrr_cs_page_res->response = GMMRR_CS_PAGE_CNF;
1667 }
1668 else
1669 {
1670 gmmrr_cs_page_res->response = GMMRR_CS_PAGE_REJ;
1671 }
1672 gmmrr_cs_page_res->susp_gprs = GMMRR_NOT_SUSP_GPRS;
1673 TRACE_ERROR( "GMMRR_CS_PAGE_IND unexpected" );
1674 break;
1675 }
1676 break;
1677 case GMMRR_CLASS_A:
1678 case GMMRR_CLASS_CC:
1679 gmmrr_cs_page_res->response = GMMRR_CS_PAGE_CNF;
1680 gmmrr_cs_page_res->susp_gprs = GMMRR_NOT_SUSP_GPRS; /* GMM1903A */
1681 break;
1682 default:
1683 TRACE_ERROR( "unknown MS class");
1684 break;
1685 }
1686 /* START PATCH UBUOB ISSUE 8379 */
1687 if (gmmrr_cs_page_res->response == GMMRR_CS_PAGE_CNF)
1688 {
1689 gmm_data->kern.gmmrr_resume_sent = FALSE;
1690 }
1691 /* END PATCH UBUOB ISSUES 8379 */
1692 PSEND ( hCommGRR, gmmrr_cs_page_res );
1693 }
1694 GMM_RETURN;
1695 } /* kern_gmmrr_cs_page_ind() */
1696
1697 /*
1698 +------------------------------------------------------------------------------
1699 | Function : kern_gmmrr_cr_ind
1700 +------------------------------------------------------------------------------
1701 | Description : Handles the primitive GMMRR_CR_IND
1702 |
1703 | Parameters : *gmmrr_cr_ind - Ptr to primitive payload
1704 |
1705 +------------------------------------------------------------------------------
1706 */
1707 GLOBAL void kern_gmmrr_cr_ind ( T_GMMRR_CR_IND *gmmrr_cr_ind )
1708 {
1709 GMM_TRACE_FUNCTION( "kern_gmmrr_cr_ind" );
1710
1711 PFREE ( gmmrr_cr_ind );
1712 if ( GMM_GRR_STATE_ON == gmm_data->kern.attach_cap.grr_state)
1713 /*
1714 * If GRR is suspended state should be kept.
1715 */
1716 {
1717 gmm_data->kern.attach_cap.grr_state = GMM_GRR_STATE_CR;
1718 }
1719
1720 switch( GET_STATE( KERN ) )
1721 {
1722 case KERN_GMM_REG_INITIATED:
1723 case KERN_GMM_RAU_INITIATED:
1724 /*
1725 * store timer value to be able to restart timer after cell reselection
1726 */
1727 gmm_data->kern.attach_cap.t3310_value=0;
1728 if (VSI_OK == vsi_t_status ( GMM_handle , kern_T3310, &(gmm_data->kern.attach_cap.t3310_value))
1729 && gmm_data->kern.attach_cap.t3310_value>0)
1730 {
1731 vsi_t_stop ( GMM_handle , kern_T3310);
1732 }
1733
1734 TRACE_1_INFO ("TIMER t3310 = %dmsec stopped - waiting for CELL_IND",gmm_data->kern.attach_cap.t3310_value);
1735 break;
1736 default:
1737 break;
1738 }
1739 GMM_RETURN;
1740 }/* kern_gmmrr_cr_ind */
1741
1742
1743 /*
1744 +------------------------------------------------------------------------------
1745 | Function : kern_cgrlc_status_ind (TCS 2.1)
1746 +------------------------------------------------------------------------------
1747 | Description : Handles the primitive CGRLC_STATUS_IND (TCS 2.1)
1748 |
1749 | Parameters : *cgrlc_status_ind - Ptr to primitive payload (TCS 2.1)
1750 |
1751 +------------------------------------------------------------------------------
1752 */
1753 GLOBAL void kern_cgrlc_status_ind ( T_CGRLC_STATUS_IND *cgrlc_status_ind ) /* TCS 2.1 */
1754 {
1755 GMM_TRACE_FUNCTION( "kern_cgrlc_status_ind" ); /* TCS 2.1 */
1756
1757 switch (cgrlc_status_ind->failure) /* TCS 2.1 */
1758 {
1759 case CGRLC_ACCESS_2_NETWORK_NOT_ALLOWED: /* TCS 2.1 */
1760 TRACE_EVENT ("Access to the network is not allowed");
1761 break;
1762 case CGRLC_PACKET_ACCESS_FAILURE: /* TCS 2.1 */
1763 TRACE_EVENT("Failure during packet access procedure, e.g. T3162 expired");
1764 break;
1765 case CGRLC_RLC_MAC_ERROR: /* TCS 2.1 */
1766 TRACE_EVENT("T3168 expires during contention resolution");
1767 break;
1768 case CGRLC_TLLI_MISMATCH: /* TCS 2.1 */
1769 TRACE_EVENT ("TLLI mismatch has occurred");
1770 break;
1771 case CGRLC_TBF_ESTABLISHMENT_FAILURE: /* TCS 2.1 */
1772 TRACE_EVENT ("T3164 expires or failure occurs due to any other reason");
1773 break;
1774 case CGRLC_RESUMPTION_FAILURE: /* TCS 2.1 */
1775 TRACE_EVENT ("resumption failure after dedicated mode was left");
1776 break;
1777 case CGRLC_CONTENTION_RESOLUTION_FAILED: /* TCS 2.1 */
1778 TRACE_EVENT ("Contantion Resolution has failed"); /* TCS 2.1 */
1779 break; /* TCS 2.1 */
1780 default:
1781 TRACE_ERROR ("unknown failure");
1782 break;
1783 }
1784
1785 PFREE (cgrlc_status_ind); /* TCS 2.1 */
1786
1787 switch( GET_STATE( KERN ) )
1788 {
1789 case KERN_GMM_REG_INITIATED:
1790 case KERN_GMM_RAU_INITIATED:
1791 /************************************************************************
1792 * MSC: 3.8 Attach
1793 *
1794 * MSC: 3.8.1 Normal Attach
1795 * MSC: 3.8.1.4 Abnormal cases
1796 * MSC: 3.8.1.4.2 b) Lower layer failure before the ATTACH ACCEPT or
1797 * ATTACH REJECT
1798 * message is received
1799 ************************************************************************
1800 *
1801 *<R.GMM.AGABNORM.M.004>, <R.GMM.LOWERFAIL.M.001>
1802 */
1803 kern_aac( /*llgmm_status_ind->error_cause*/ 0);
1804 break;
1805 case KERN_GMM_DEREG_INITIATED:
1806 /************************************************************************
1807 * MSC: 3.9 GPRS detach procedure
1808 *
1809 * MCS: 3.9.3 Abnormal cases
1810 * MSC: 3.9.3.2 b) Lower layer failure
1811 ************************************************************************/
1812 kern_local_detach ( GMMCS_INT_PROTOCOL_ERROR, FALSE, GMM_LOCAL_DETACH_PROC_ENTER_DEREG); /* TCS 2.1 */
1813 break;
1814 case KERN_GMM_REG_IMSI_DETACH_INITIATED:
1815 /*
1816 * <R.GMM.DMABNORM.M.021>
1817 */
1818 /************************************************************************
1819 * MSC: 3.9 GPRS detach procedure
1820 *
1821 * MCS: 3.9.3 Abnormal cases
1822 * MSC: 3.9.3.2 b) Lower layer failure
1823 ************************************************************************/
1824 gmm_data->kern.detach_cap.detach_type = GMMREG_DT_IMSI;
1825 kern_local_detach( GMMCS_INT_PROTOCOL_ERROR, FALSE, GMM_LOCAL_DETACH_PROC_ENTER_REG_NORMAL); /* TCS 2.1 */
1826 break;
1827 case KERN_GMM_DEREG_RESUMING:
1828 case KERN_GMM_DEREG_SUSPENDED:
1829 case KERN_GMM_REG_RESUMING:
1830 case KERN_GMM_REG_SUSPENDED:
1831 TRACE_ERROR( "CGRLC_STATUS_IND unexpected" ); /* TCS 2.1 */
1832 break;
1833 default:
1834 break;
1835 }
1836 GMM_RETURN;
1837 } /* kern_cgrlc_status_ind() */ /* TCS 2.1 */
1838 /*
1839 +------------------------------------------------------------------------------
1840 | Function : kern_llgmm_status_ind
1841 +------------------------------------------------------------------------------
1842 | Description : Handles the primitive LLGMM_STATUS_IND
1843 |
1844 | Parameters : *llgmm_status_ind - Ptr to primitive payload
1845 |
1846 +------------------------------------------------------------------------------
1847 */
1848 GLOBAL void kern_llgmm_status_ind ( T_LLGMM_STATUS_IND *llgmm_status_ind )
1849 {
1850 GMM_TRACE_FUNCTION( "kern_llgmm_status_ind" );
1851
1852 PFREE (llgmm_status_ind);
1853
1854 switch( GET_STATE( KERN ) )
1855 {
1856 case KERN_GMM_REG_INITIATED:
1857 case KERN_GMM_RAU_INITIATED:
1858 /************************************************************************
1859 * MSC: 3.8 Attach
1860 *
1861 * MSC: 3.8.1 Normal Attach
1862 * MSC: 3.8.1.4 Abnormal cases
1863 * MSC: 3.8.1.4.2 b) Lower layer failure before the ATTACH ACCEPT or
1864 * ATTACH REJECT
1865 * message is received
1866 ************************************************************************
1867 *
1868 *<R.GMM.AGABNORM.M.004>, <R.GMM.LOWERFAIL.M.001>
1869 */
1870 kern_aac( /*llgmm_status_ind->error_cause*/ GMMCS_NO_SERVICE); /* TCS 2.1 */
1871 break;
1872 case KERN_GMM_DEREG_INITIATED:
1873 /************************************************************************
1874 * MSC: 3.9 GPRS detach procedure
1875 *
1876 * MCS: 3.9.3 Abnormal cases
1877 * MSC: 3.9.3.2 b) Lower layer failure
1878 ************************************************************************/
1879 kern_local_detach( GMMCS_INT_PROTOCOL_ERROR, FALSE, GMM_LOCAL_DETACH_PROC_ENTER_DEREG); /* TCS 2.1 */
1880 break;
1881 case KERN_GMM_REG_IMSI_DETACH_INITIATED:
1882 /*
1883 * <R.GMM.DMABNORM.M.021>
1884 */
1885 /************************************************************************
1886 * MSC: 3.9 GPRS detach procedure
1887 *
1888 * MCS: 3.9.3 Abnormal cases
1889 * MSC: 3.9.3.2 b) Lower layer failure
1890 ************************************************************************/
1891 gmm_data->kern.detach_cap.detach_type = GMMREG_DT_IMSI;
1892 kern_local_detach( GMMCS_INT_PROTOCOL_ERROR, FALSE, GMM_LOCAL_DETACH_PROC_ENTER_REG_NORMAL); /* TCS 2.1 */
1893
1894 break;
1895 default:
1896 TRACE_ERROR( "LLGMM_STATUS_IND unexpected" );
1897 break;
1898 }
1899 GMM_RETURN;
1900 } /* kern_llgmm_status_ind() */
1901
1902 /*
1903 +------------------------------------------------------------------------------
1904 | Function : kern_llgmm_tlli_ind
1905 +------------------------------------------------------------------------------
1906 | Description : Handles the primitive LLGMM_TLLI_IND
1907 |
1908 | Parameters : *llgmm_status_ind - Ptr to primitive payload
1909 |
1910 +------------------------------------------------------------------------------
1911 */
1912 GLOBAL void kern_llgmm_tlli_ind ( T_LLGMM_TLLI_IND *llgmm_tlli_ind )
1913 {
1914 GMM_TRACE_FUNCTION( "kern_llgmm_tlli_ind" );
1915 TRACE_1_PARA ("TLLI: 0x%x", llgmm_tlli_ind->new_tlli);
1916
1917 GMM_TRACE_GMM_DATA(GMM_DEBUG_PRINT_MASK_TLLI);
1918
1919 switch( GET_STATE( KERN ) )
1920 {
1921 default:
1922 case KERN_GMM_NULL_NO_IMSI:
1923 case KERN_GMM_NULL_IMSI:
1924 case KERN_GMM_NULL_PLMN_SEARCH:
1925 case KERN_GMM_NULL_NO_IMSI_LIMITED_SERVICE_REQ:
1926 case KERN_GMM_NULL_IMSI_LIMITED_SERVICE_REQ:
1927 TRACE_ERROR("LLGMM_TLLI_IND unexpected");
1928 break;
1929
1930 case KERN_GMM_DEREG_INITIATED:
1931 case KERN_GMM_DEREG_ATTEMPTING_TO_ATTACH:
1932 case KERN_GMM_DEREG_NO_CELL_AVAILABLE:
1933 case KERN_GMM_DEREG_LIMITED_SERVICE:
1934 case KERN_GMM_DEREG_NO_IMSI:
1935 case KERN_GMM_DEREG_PLMN_SEARCH:
1936 case KERN_GMM_DEREG_SUSPENDED:
1937 case KERN_GMM_REG_INITIATED:
1938 case KERN_GMM_REG_NO_CELL_AVAILABLE:
1939 case KERN_GMM_REG_LIMITED_SERVICE:
1940 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE_MM:
1941 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE:
1942 case KERN_GMM_REG_SUSPENDED:
1943 case KERN_GMM_REG_NORMAL_SERVICE:
1944 case KERN_GMM_RAU_INITIATED:
1945 case KERN_GMM_RAU_WAIT_FOR_NPDU_LIST:
1946 case KERN_GMM_REG_IMSI_DETACH_INITIATED:
1947 case KERN_GMM_REG_RESUMING:
1948 case KERN_GMM_DEREG_SUSPENDING:
1949 case KERN_GMM_DEREG_RESUMING:
1950 case KERN_GMM_REG_SUSPENDING:
1951 case KERN_GMM_REG_TEST_MODE:
1952 case KERN_GMM_REG_TEST_MODE_NO_IMSI:
1953
1954 if ( llgmm_tlli_ind->new_tlli != gmm_data->tlli.current)
1955 {
1956 TRACE_ERROR("TLLI value not expected");
1957 }
1958
1959 TRACE_0_OUT_PARA("Unassign Old PTMSI");
1960
1961 gmm_data->tlli.old = GMMRR_TLLI_INVALID;
1962 gmm_data->ptmsi.old = GMMRR_TMSI_INVALID;
1963
1964 GMM_TRACE_GMM_DATA(GMM_DEBUG_PRINT_MASK_TLLI | GMM_DEBUG_PRINT_MASK_PTMSI);
1965 /*
1966 * LLC should know about unassigning itself
1967 */
1968 kern_gmmrr_assign();
1969 break;
1970 }
1971
1972 PFREE (llgmm_tlli_ind);
1973
1974 GMM_RETURN;
1975 } /* kern_llgmm_tlli_ind() */
1976
1977 /*
1978 +------------------------------------------------------------------------------
1979 | Function : kern_sim_gmm_insert_ind
1980 +------------------------------------------------------------------------------
1981 | Description : Handles the primitive SIM_GMM_INSERT_IND
1982 |
1983 | MSC: 3.2 SIM
1984 |
1985 | Parameters : *sim_gmm_insert_ind - Ptr to primitive payload
1986 |
1987 +------------------------------------------------------------------------------
1988 */
1989 GLOBAL void kern_sim_gmm_insert_ind ( T_SIM_GMM_INSERT_IND *sim_gmm_insert_ind )
1990 {
1991 GMM_TRACE_FUNCTION( "kern_sim_gmm_insert_ind" );
1992 /*
1993 * Set IMSI
1994 */
1995
1996 kern_read_imsi ( sim_gmm_insert_ind ) ;
1997
1998 GMM_TRACE_GMM_DATA(GMM_DEBUG_PRINT_MASK_IMSI);
1999
2000 kern_read_loc_info (sim_gmm_insert_ind);
2001
2002 GMM_TRACE_GMM_DATA(GMM_DEBUG_PRINT_MASK_CID);
2003 GMM_TRACE_GMM_DATA(GMM_DEBUG_PRINT_MASK_KERN_ATTACH);
2004
2005 gmm_data->acc_contr_class = sim_gmm_insert_ind->acc_ctrl.acc[0] * 256 +
2006 sim_gmm_insert_ind->acc_ctrl.acc[1];
2007 gmm_data->kern.sim_op_mode = sim_gmm_insert_ind->op_mode;
2008 kern_read_kc_cksn (sim_gmm_insert_ind);
2009
2010 PFREE ( sim_gmm_insert_ind );
2011
2012 switch( GET_STATE( KERN ) )
2013 {
2014 case KERN_GMM_NULL_NO_IMSI:
2015 case KERN_GMM_NULL_NO_IMSI_LIMITED_SERVICE_REQ:
2016 case KERN_GMM_DEREG_NO_IMSI:
2017 /*
2018 * MSC: 3.2 SIM
2019 *
2020 * MSC: 3.2.1 SIM is inserted and valid
2021 */
2022 /*
2023 * SIM is considered as invalid until SIM removed or switching off
2024 */
2025 gmm_data->sim_gprs_invalid = FALSE;
2026 /*
2027 * reset the attach attampt counter and the rau attempt counter
2028 * <R.GMM.ATTACH.M.007>
2029 */
2030 gmm_data->kern.aac = 0;
2031
2032 switch( GET_STATE( KERN ) )
2033 {
2034 case KERN_GMM_NULL_NO_IMSI:
2035 /*
2036 * <R.GMM.DOTHCASE.M.001>
2037 * SET_STATE ( KERN, KERN_GMM_DEREG_PLMN_SEARCH );
2038 *
2039 * state GMM-DEREGISTERED.IMSI discribes the state GMM-NULL.IMSI-VALID
2040 */
2041
2042 SET_STATE ( KERN, KERN_GMM_NULL_IMSI );
2043 #ifdef FF_EM_MODE
2044 EM_GMM_SET_STATE(KERN_GMM_NULL_IMSI );
2045 #endif
2046 break;
2047 case KERN_GMM_NULL_NO_IMSI_LIMITED_SERVICE_REQ:
2048 SET_STATE (KERN, KERN_GMM_NULL_IMSI_LIMITED_SERVICE_REQ);
2049 #ifdef FF_EM_MODE
2050 EM_GMM_SET_STATE(KERN_GMM_NULL_IMSI_LIMITED_SERVICE_REQ);
2051 #endif
2052 break;
2053 case KERN_GMM_DEREG_NO_IMSI:
2054 /*
2055 * GMM enters state NULL_IMSI beause GMM is waiting for a new attach
2056 * prim from GACI (COPS=0)
2057 */
2058 SET_STATE ( KERN, KERN_GMM_NULL_IMSI );
2059 #ifdef FF_EM_MODE
2060 EM_GMM_SET_STATE(KERN_GMM_NULL_IMSI );
2061 #endif
2062 break;
2063 default:
2064 TRACE_ERROR( "State unexpected" );
2065 break;
2066 }
2067 break;
2068 default:
2069 TRACE_ERROR( "SIM_GMM_INSERT_IND unexpected" );
2070 break;
2071 }
2072 GMM_RETURN;
2073 } /* kern_sim_gmm_insert_ind() */
2074
2075
2076
2077 /*
2078 +------------------------------------------------------------------------------
2079 | Function : kern_sim_remove_ind
2080 +------------------------------------------------------------------------------
2081 | Description : Handles the primitive SIM_REMOVE_IND
2082 |
2083 | Parameters : *sim_remove_ind - Ptr to primitive payload
2084 |
2085 +------------------------------------------------------------------------------
2086 */
2087 GLOBAL void kern_sim_remove_ind ( T_SIM_REMOVE_IND *sim_remove_ind )
2088 {
2089 GMM_TRACE_FUNCTION( "kern_sim_remove_ind" );
2090
2091 PFREE ( sim_remove_ind );
2092
2093 gmm_data->sim_gprs_invalid = TRUE;
2094 gmm_data->kern.detach_cap.detach_type = GMMREG_DT_SIM_REMOVED;
2095 /*
2096 * multiple outstanding SIM_AUTHENTICATION_REQ messages reset the
2097 * counter whenever SIM is removed
2098 */
2099 gmm_data->kern.auth_cap.last_auth_req_id = NOT_PRESENT_8BIT;
2100
2101 switch( GET_STATE( KERN ) )
2102 {
2103 /*
2104 * MSC: 3.2 SIM
2105 *
2106 * MSC: 3.2.2. No SIM present or SIM not valid
2107 * MSC: 3.2.2.2 State GMM-REG
2108 */
2109
2110 /*
2111 * MSC: 3.2.2.2.1 Network not reachable
2112 * state GMM_REG
2113 */
2114 case KERN_GMM_DEREG_RESUMING:
2115 case KERN_GMM_DEREG_SUSPENDED:
2116 case KERN_GMM_REG_RESUMING:
2117 case KERN_GMM_REG_SUSPENDED:
2118 if (GMM_GRR_STATE_SUSPENDED==gmm_data->kern.attach_cap.grr_state)
2119 /*
2120 * wait for MMGMM_CM_RELEASE_IND
2121 */
2122 {
2123 break;
2124 }
2125 /* NO break;*/
2126 case KERN_GMM_REG_LIMITED_SERVICE:
2127 case KERN_GMM_REG_NO_CELL_AVAILABLE:
2128 {
2129 kern_local_detach (GMMCS_SIM_REMOVED, FALSE,GMM_LOCAL_DETACH_PROC_SIM_REMOVED); /* TCS 2.1 */
2130 break;
2131 }
2132 case KERN_GMM_REG_TEST_MODE:
2133 {
2134 PALLOC (cgrlc_test_end_req, CGRLC_TEST_END_REQ); /* TCS 2.1 */
2135 SET_STATE (KERN, KERN_GMM_REG_TEST_MODE_NO_IMSI);
2136 #ifdef FF_EM_MODE
2137 EM_GMM_SET_STATE(KERN_GMM_REG_TEST_MODE_NO_IMSI);
2138 #endif
2139 PSEND (hCommGRLC, cgrlc_test_end_req); /* TCS 2.1 */
2140 }
2141 break;
2142 /*
2143 * MSC: 3.2.2.2.2 Network reachable
2144 * state GMM_REG.NORMAL_SERVICE
2145 */
2146 case KERN_GMM_RAU_INITIATED:
2147 case KERN_GMM_RAU_WAIT_FOR_NPDU_LIST:
2148 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE_MM:
2149 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE:
2150 case KERN_GMM_REG_NORMAL_SERVICE:
2151 /*
2152 * <R.GMM.DSUBFANO.M.003>
2153 */
2154
2155 kern_detach ();
2156 break;
2157 /*
2158 * MSC: 3.2 SIM
2159 *
2160 * MSC: 3.2.2. No SIM present or SIM not valid
2161 * MSC: 3.2.2.1 State GMM-DEREG
2162 */
2163
2164 /*
2165 * state GMM_DEREG
2166 */
2167 case KERN_GMM_DEREG_PLMN_SEARCH:
2168 case KERN_GMM_DEREG_NO_CELL_AVAILABLE:
2169 case KERN_GMM_DEREG_LIMITED_SERVICE:
2170 case KERN_GMM_DEREG_ATTEMPTING_TO_ATTACH:
2171 case KERN_GMM_REG_INITIATED:
2172 case KERN_GMM_DEREG_INITIATED:
2173
2174 kern_mm_imsi_detach_ind ( GMMCS_SIM_REMOVED, MMGMM_PERFORM_DETACH,
2175 gmm_data->kern.detach_cap.detach_type); /* TCS 2.1 */
2176 /*
2177 * <R.GMM.ODNOIMSI.M.001>
2178 */
2179 SET_STATE ( KERN, KERN_GMM_DEREG_NO_IMSI );
2180 #ifdef FF_EM_MODE
2181 EM_GMM_SET_STATE(KERN_GMM_DEREG_NO_IMSI );
2182 #endif
2183 break;
2184
2185 case KERN_GMM_NULL_IMSI:
2186
2187 kern_mm_imsi_detach_ind ( GMMCS_SIM_REMOVED, MMGMM_PERFORM_DETACH,
2188 gmm_data->kern.detach_cap.detach_type ); /* TCS 2.1 */
2189 /*
2190 * <R.GMM.ODNOIMSI.M.001>
2191 */
2192 SET_STATE ( KERN, KERN_GMM_NULL_NO_IMSI );
2193 #ifdef FF_EM_MODE
2194 EM_GMM_SET_STATE(KERN_GMM_NULL_NO_IMSI );
2195 #endif
2196 break;
2197
2198 default:
2199 kern_mm_imsi_detach_ind ( GMMCS_SIM_REMOVED, MMGMM_PERFORM_DETACH,
2200 gmm_data->kern.detach_cap.detach_type); /* TCS 2.1 */
2201 TRACE_ERROR( "SIM_REMOVE_IND unexpected" );
2202 break;
2203 }
2204 GMM_RETURN;
2205 } /* kern_sim_remove_ind() */
2206
2207
2208 /*
2209 +------------------------------------------------------------------------------
2210 | Function : kern_gmmrr_suspend_cnf
2211 +------------------------------------------------------------------------------
2212 | Description : Handles the primitive GMMRR_SUSPEND_CNF
2213 |
2214 | GRR confirms that GRR is successful suspended and RR is
2215 | activated.
2216 |
2217 | Parameters : *gmmrr_suspend_cnf - Ptr to primitive payload
2218 |
2219 +------------------------------------------------------------------------------
2220 */
2221 GLOBAL void kern_gmmrr_suspend_cnf ( T_GMMRR_SUSPEND_CNF *gmmrr_suspend_cnf )
2222 {
2223 GMM_TRACE_FUNCTION( "kern_gmmrr_suspend_cnf" );
2224 PFREE(gmmrr_suspend_cnf);
2225 gmm_data->kern.attach_cap.grr_state = GMM_GRR_STATE_SUSPENDED;
2226
2227 TRACE_1_PARA ("susp_type: %x", gmm_data->kern.suspension_type);
2228 switch( GET_STATE( KERN ) )
2229 {
2230 case KERN_GMM_DEREG_SUSPENDING:
2231 SET_STATE (KERN, KERN_GMM_DEREG_SUSPENDED);
2232 #ifdef FF_EM_MODE
2233 EM_GMM_SET_STATE(KERN_GMM_DEREG_SUSPENDED);
2234 #endif
2235 if(gmm_data->kern.detach_cap.detach_type EQ GMMREG_DT_GPRS)
2236 {
2237 if ( GET_STATE(MM) != GMM_MM_REG_NORMAL_SERVICE)
2238 /*
2239 * The state of MM is forwarded to MMI
2240 */
2241 {
2242 gmm_data->kern.detach_cap.detach_type = GMMREG_DT_COMB;
2243 }
2244 if ( kern_lau_needed())
2245 {
2246 /*
2247 * see also kern_enter_der ()
2248 */
2249 kern_gmmreg_detach (gmm_data->kern.detach_cap.detach_type, GMMCS_INT_NOT_PRESENT,
2250 GMMREG_SEARCH_RUNNING, GMMCS_INT_NOT_PRESENT);
2251 }
2252 else
2253 {
2254 kern_gmmreg_detach (gmm_data->kern.detach_cap.detach_type, GMMCS_INT_NOT_PRESENT,
2255 GMMREG_SEARCH_NOT_RUNNING,GMMCS_INT_NOT_PRESENT);
2256 }
2257 }
2258
2259 kern_call_undone_mm_proc_der();
2260 break;
2261
2262 case KERN_GMM_REG_SUSPENDING:
2263 SET_STATE (KERN, KERN_GMM_REG_SUSPENDED);
2264 #ifdef FF_EM_MODE
2265 EM_GMM_SET_STATE(KERN_GMM_REG_SUSPENDED);
2266 #endif
2267 kern_call_undone_mm_proc_reg();
2268 break;
2269
2270 case KERN_GMM_NULL_NO_IMSI:
2271 kern_local_detach ( GMMCS_POWER_OFF, /* TCS 2.1 */
2272 FALSE, GMM_LOCAL_DETACH_PROC_NOTHING);
2273 break;
2274 default:
2275 TRACE_ERROR( "GMMRR_SUSPNED_CNF unexpected" );
2276 break;
2277 }
2278 GMM_RETURN;
2279 } /* kern_gmmrr_suspend_cnf() */
2280 /*
2281 +------------------------------------------------------------------------------
2282 | Function : kern_cgrlc_test_mode_cnf (TCS 2.1)
2283 +------------------------------------------------------------------------------
2284 | Description : Handles the primitive GMMRR_SUSPEND_CNF
2285 |
2286 | GRR confirms that the test mode is finished
2287 |
2288 | Parameters : *cgrlc_test_mode_cnf - Ptr to primitive payload (TCS 2.1)
2289 |
2290 +------------------------------------------------------------------------------
2291 */
2292 GLOBAL void kern_cgrlc_test_mode_cnf ( T_CGRLC_TEST_MODE_CNF *cgrlc_test_mode_cnf ) /* TCS 2.1 */
2293 {
2294 GMM_TRACE_FUNCTION( "kern_cgrlc_test_mode_cnf" ); /* TCS 2.1 */
2295 PFREE (cgrlc_test_mode_cnf); /* TCS 2.1 */
2296
2297 switch( GET_STATE( KERN ) )
2298 {
2299 case KERN_GMM_REG_TEST_MODE:
2300 kern_enter_reg_normal();
2301 break;
2302 case KERN_GMM_REG_TEST_MODE_NO_IMSI:
2303 /*
2304 * <R.GMM.DSUBFANO.M.003>
2305 */
2306
2307 gmm_data->kern.detach_cap.detach_type = GMMREG_DT_SIM_REMOVED;
2308 kern_detach ();
2309 break;
2310 default:
2311 TRACE_ERROR( "CGRLC_TEST_MODE_CNF unexpected" ); /* TCS 2.1 */
2312 break;
2313 }
2314 GMM_RETURN;
2315 } /* kern_cgrlc_test_mode_cnf() */ /* TCS 2.1 */
2316
2317 /*
2318 +------------------------------------------------------------------------------
2319 | Function : kern_mmgmm_lup_needed_ind
2320 +------------------------------------------------------------------------------
2321 | Description : Handles the primitive MMGMM_LUP_NEEDED_IND
2322 |
2323 | MSC: 3.20.8 MMGMM LUP NEEDED IND
2324 |
2325 | Parameters : *mmgmm_lup_needed_ind - Ptr to primitive payload
2326 |
2327 +------------------------------------------------------------------------------
2328 */
2329 GLOBAL void kern_mmgmm_lup_needed_ind ( T_MMGMM_LUP_NEEDED_IND *mmgmm_lup_needed_ind )
2330 {
2331 GMM_TRACE_FUNCTION( "kern_mmgmm_lup_needed_ind" );
2332 #ifndef NTRACE
2333 switch (mmgmm_lup_needed_ind->reason) /* TCS 2.1 */
2334 {
2335 case MMGMM_T3212:
2336 TRACE_EVENT("T3212 has expired");
2337 break;
2338 case MMGMM_T_ACCEPT:
2339 TRACE_EVENT("T_ACCEPT has expired");
2340 break;
2341 case MMGMM_IMSI_IN_VLR:
2342 TRACE_EVENT("IMSI unknown in VLR received");
2343 break;
2344 case MMGMM_RXLEV_JUMP:
2345 TRACE_EVENT("RR indicated an increased RX level");
2346 break;
2347 case MMGMM_REG_TIMER:
2348 TRACE_EVENT("Registration timer in MM expired");
2349 break;
2350 default:
2351 TRACE_ERROR("GPRS indicator is out of range");
2352 break;
2353 }
2354 #endif
2355 switch (GET_STATE( KERN ))
2356 {
2357 case KERN_GMM_DEREG_RESUMING:
2358 case KERN_GMM_DEREG_SUSPENDED:
2359 case KERN_GMM_NULL_NO_IMSI:
2360 case KERN_GMM_NULL_NO_IMSI_LIMITED_SERVICE_REQ:
2361 case KERN_GMM_NULL_IMSI:
2362 case KERN_GMM_NULL_IMSI_LIMITED_SERVICE_REQ:
2363 case KERN_GMM_DEREG_INITIATED:
2364 case KERN_GMM_DEREG_NO_IMSI:
2365 case KERN_GMM_DEREG_PLMN_SEARCH:
2366 case KERN_GMM_DEREG_NO_CELL_AVAILABLE:
2367 case KERN_GMM_DEREG_ATTEMPTING_TO_ATTACH:
2368 case KERN_GMM_DEREG_LIMITED_SERVICE:
2369 case KERN_GMM_DEREG_SUSPENDING:
2370 case KERN_GMM_REG_NO_CELL_AVAILABLE:
2371 break;
2372 default:
2373 if( GMMRR_NET_MODE_I==gmm_data->kern.sig_cell_info.net_mode
2374 && MMGMM_T3212==mmgmm_lup_needed_ind->reason) /* TCS 2.1 */
2375 /*
2376 * <R.GMM.MMGMMONE.M.002>, <R.GMM.MMGMMONE.M.003>
2377 */
2378 {
2379 PFREE (mmgmm_lup_needed_ind);
2380 GMM_RETURN;
2381 }
2382 break;
2383 }
2384
2385
2386 switch( GET_STATE( KERN ) )
2387 {
2388 case KERN_GMM_NULL_NO_IMSI:
2389 case KERN_GMM_NULL_NO_IMSI_LIMITED_SERVICE_REQ:
2390 case KERN_GMM_NULL_IMSI:
2391 case KERN_GMM_NULL_IMSI_LIMITED_SERVICE_REQ:
2392 /*
2393 * After deregistration MM will receive mmgmm_reg_req
2394 * automatically
2395 */
2396 break;
2397 case KERN_GMM_DEREG_NO_IMSI:
2398 /* PLU also if #7 */
2399 /*NO break;*/
2400 case KERN_GMM_DEREG_PLMN_SEARCH:
2401
2402 case KERN_GMM_DEREG_NO_CELL_AVAILABLE:
2403 case KERN_GMM_DEREG_LIMITED_SERVICE:
2404 case KERN_GMM_REG_INITIATED:
2405 SET_STATE ( KERN, KERN_GMM_DEREG_SUSPENDING );
2406 #ifdef FF_EM_MODE
2407 EM_GMM_SET_STATE(KERN_GMM_DEREG_SUSPENDING );
2408 #endif
2409 kern_gmmrr_suspend (GMMRR_NOT_SUSP_GPRS, GMMRR_NORMAL_RELEASE, GMM_SUSP_LAU);
2410 break;
2411
2412 case KERN_GMM_DEREG_ATTEMPTING_TO_ATTACH:
2413 gmm_data->kern.attach_cap.enter_attempting_to_update_after_lau = TRUE;
2414 SET_STATE ( KERN, KERN_GMM_DEREG_SUSPENDING );
2415 #ifdef FF_EM_MODE
2416 EM_GMM_SET_STATE(KERN_GMM_DEREG_SUSPENDING );
2417 #endif
2418 kern_gmmrr_suspend (GMMRR_NOT_SUSP_GPRS, GMMRR_NORMAL_RELEASE, GMM_SUSP_LAU);
2419 break;
2420 case KERN_GMM_DEREG_INITIATED:
2421 case KERN_GMM_DEREG_RESUMING:
2422 case KERN_GMM_DEREG_SUSPENDED:
2423 case KERN_GMM_REG_SUSPENDED:
2424 case KERN_GMM_REG_RESUMING:
2425 case KERN_GMM_RAU_INITIATED:
2426 case KERN_GMM_RAU_WAIT_FOR_NPDU_LIST:
2427 case KERN_GMM_REG_IMSI_DETACH_INITIATED:
2428 SET_STATE(MM, GMM_MM_REG_UPDATE_NEEDED);
2429 break;
2430
2431 case KERN_GMM_REG_SUSPENDING:
2432 case KERN_GMM_DEREG_SUSPENDING:
2433 gmm_data->kern.suspension_type |= GMM_SUSP_LAU;
2434 break;
2435
2436 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE:
2437 gmm_data->kern.attach_cap.enter_attempting_to_update_after_lau=TRUE;
2438 SET_STATE ( KERN, KERN_GMM_REG_SUSPENDING );
2439 #ifdef FF_EM_MODE
2440 EM_GMM_SET_STATE(KERN_GMM_REG_SUSPENDING );
2441 #endif
2442 kern_llgmm_suspend(LLGMM_CALL);
2443 kern_gmmrr_suspend (GMMRR_SUSP_GPRS, GMMRR_NORMAL_RELEASE, GMM_SUSP_LAU);
2444 break;
2445 case KERN_GMM_REG_LIMITED_SERVICE:
2446 case KERN_GMM_REG_NO_CELL_AVAILABLE:
2447 if(gmm_data->kern.gmmrr_resume_sent)
2448 /*
2449 * GMM is waiting for GMMRR_CELL_IND. So I rememmber to attach MM with
2450 * seting mm_imsi_attached to update_needed
2451 */
2452 {
2453 SET_STATE(MM,GMM_MM_REG_UPDATE_NEEDED);
2454 }
2455 else
2456 {
2457 SET_STATE ( KERN, KERN_GMM_REG_SUSPENDING );
2458 #ifdef FF_EM_MODE
2459 EM_GMM_SET_STATE(KERN_GMM_REG_SUSPENDING );
2460 #endif
2461 kern_llgmm_suspend(LLGMM_CALL);
2462 kern_gmmrr_suspend (GMMRR_NOT_SUSP_GPRS, GMMRR_NORMAL_RELEASE, GMM_SUSP_LAU);
2463 }
2464 break;
2465 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE_MM:
2466 case KERN_GMM_REG_NORMAL_SERVICE:
2467 if( GMMRR_NET_MODE_I==gmm_data->kern.sig_cell_info.net_mode)
2468 {
2469 kern_rau();
2470 }
2471 else
2472 {
2473 SET_STATE ( KERN, KERN_GMM_REG_SUSPENDING );
2474 #ifdef FF_EM_MODE
2475 EM_GMM_SET_STATE(KERN_GMM_REG_SUSPENDING );
2476 #endif
2477 kern_llgmm_suspend(LLGMM_CALL);
2478 kern_gmmrr_suspend (GMMRR_SUSP_GPRS, GMMRR_NORMAL_RELEASE, GMM_SUSP_LAU);
2479 }
2480 break;
2481 case KERN_GMM_REG_TEST_MODE_NO_IMSI:
2482 case KERN_GMM_REG_TEST_MODE:
2483 break;
2484 default:
2485 TRACE_ERROR ("Unexpexcted state");
2486 break;
2487 }
2488
2489 PFREE (mmgmm_lup_needed_ind);
2490 GMM_RETURN;
2491 } /* kern_mmgmm_lup_needed_ind() */
2492
2493
2494 /*
2495 +------------------------------------------------------------------------------
2496 | Function : kern_mmgmm_lup_accept_ind
2497 +------------------------------------------------------------------------------
2498 | Description : Handles the primitive MMGMM_LUP_ACCEPT_IND
2499 |
2500 | MSC: 3.20.3 IMSI attach/detach
2501 |
2502 | Parameters : *mmgmm_lup_accept_ind - Ptr to primitive payload
2503 |
2504 +------------------------------------------------------------------------------
2505 */
2506 GLOBAL void kern_mmgmm_lup_accept_ind ( T_MMGMM_LUP_ACCEPT_IND *mmgmm_lup_accept_ind )
2507 {
2508 GMM_TRACE_FUNCTION( "kern_mmgmm_lup_accept_ind" );
2509
2510 switch( GET_STATE( KERN ) )
2511 {
2512 case KERN_GMM_NULL_PLMN_SEARCH:
2513 case KERN_GMM_NULL_IMSI_LIMITED_SERVICE_REQ:
2514 case KERN_GMM_NULL_NO_IMSI_LIMITED_SERVICE_REQ:
2515 case KERN_GMM_NULL_NO_IMSI:
2516
2517 case KERN_GMM_NULL_IMSI:
2518 case KERN_GMM_DEREG_NO_IMSI:
2519 case KERN_GMM_DEREG_LIMITED_SERVICE:
2520 case KERN_GMM_DEREG_ATTEMPTING_TO_ATTACH:
2521 case KERN_GMM_DEREG_NO_CELL_AVAILABLE:
2522 case KERN_GMM_DEREG_PLMN_SEARCH:
2523 case KERN_GMM_REG_INITIATED:
2524
2525 case KERN_GMM_DEREG_RESUMING:
2526 case KERN_GMM_DEREG_SUSPENDED:
2527 case KERN_GMM_DEREG_SUSPENDING:
2528 if ( GMMRR_NET_MODE_III==gmm_data->kern.sig_cell_info.net_mode
2529 && GMMREG_CLASS_BC== gmm_data->kern.attach_cap.mobile_class )
2530 {
2531 kern_mmgmmreg_attach_cnf (GMMREG_AT_IMSI, SEARCH_NOT_RUNNING, (T_MMGMM_REG_CNF*)mmgmm_lup_accept_ind);
2532 }
2533 else
2534 {
2535 kern_mmgmmreg_attach_cnf (GMMREG_AT_IMSI, SEARCH_RUNNING, (T_MMGMM_REG_CNF*)mmgmm_lup_accept_ind);
2536 }
2537 break;
2538 case KERN_GMM_REG_NORMAL_SERVICE:
2539 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE:
2540 case KERN_GMM_REG_NO_CELL_AVAILABLE:
2541 case KERN_GMM_REG_LIMITED_SERVICE:
2542 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE_MM:
2543 case KERN_GMM_DEREG_INITIATED:
2544 case KERN_GMM_RAU_INITIATED:
2545
2546 case KERN_GMM_REG_RESUMING:
2547 case KERN_GMM_REG_SUSPENDED:
2548 kern_mmgmmreg_attach_cnf (GMMREG_AT_COMB, SEARCH_RUNNING, (T_MMGMM_REG_CNF*)mmgmm_lup_accept_ind);
2549 break;
2550 default:
2551 TRACE_ERROR ("Unexpexcted state");
2552 break;
2553 }
2554 PFREE ( mmgmm_lup_accept_ind );
2555 GMM_RETURN;
2556 } /* kern_mmgmm_lup_accept_ind() */
2557 /*
2558 +------------------------------------------------------------------------------
2559 | Function : kern_mmgmm_lup_accept_ind
2560 +------------------------------------------------------------------------------
2561 | Description : Handles the primitive MMGMM_INFO_IND
2562 |
2563 | MSC: 3.20.6 MM Information
2564 |
2565 | Parameters : *mmgmm_info_ind - Ptr to primitive payload
2566 |
2567 +------------------------------------------------------------------------------
2568 */
2569 GLOBAL void kern_mmgmm_info_ind ( T_MMGMM_INFO_IND *mmgmm_info_ind )
2570 {
2571 GMM_TRACE_FUNCTION( "kern_mmgmm_info_ind" );
2572 {
2573 PPASS (mmgmm_info_ind, gmmreg_info_ind, GMMREG_INFO_IND);
2574 PSEND ( hCommMMI, gmmreg_info_ind );
2575 }
2576 GMM_RETURN;
2577 } /* kern_mmgmm_info_ind() */
2578
2579 /*
2580 +------------------------------------------------------------------------------
2581 | Function : kern_sim_authentication_cnf
2582 +------------------------------------------------------------------------------
2583 | Description : The function kern_sim_authentication_cnf
2584 |
2585 | Parameters : *sim_authentication_cnf - Ptr to primitive payload
2586 |
2587 +------------------------------------------------------------------------------
2588 */
2589 GLOBAL void kern_sim_authentication_cnf ( T_SIM_AUTHENTICATION_CNF *
2590 sim_authentication_cnf )
2591 {
2592 GMM_TRACE_FUNCTION( "kern_sim_authentication_cnf" );
2593
2594 switch( GET_STATE( KERN ) )
2595 {
2596 case KERN_GMM_REG_NORMAL_SERVICE:
2597 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE:
2598 case KERN_GMM_REG_NO_CELL_AVAILABLE:
2599 case KERN_GMM_REG_LIMITED_SERVICE:
2600 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE_MM:
2601 case KERN_GMM_REG_INITIATED:
2602 case KERN_GMM_DEREG_INITIATED:
2603 case KERN_GMM_DEREG_ATTEMPTING_TO_ATTACH:
2604 case KERN_GMM_RAU_INITIATED:
2605 case KERN_GMM_REG_IMSI_DETACH_INITIATED:
2606 /*
2607 * PATCH ubuob 19.7.02: multiple outstanding AUTHENTICATION REQ messages
2608 * reduce the count of outstanding requests
2609 */
2610
2611 /*
2612 * only use this SIM answer if there are no other outstanding SIM_AUTHENTICATION_REQ messages!
2613 */
2614
2615 if (gmm_data->kern.auth_cap.last_auth_req_id == sim_authentication_cnf->req_id)
2616
2617
2618 if (gmm_data->kern.auth_cap.last_auth_req_id == sim_authentication_cnf->req_id)
2619 {
2620 MCAST (authentication_and_ciphering_response,
2621 AUTHENTICATION_AND_CIPHERING_RESPONSE);
2622 authentication_and_ciphering_response->a_c_reference_number
2623 .a_c_reference_number_value
2624 = gmm_data->kern.auth_cap.a_c_reference_number;
2625
2626 authentication_and_ciphering_response
2627 ->v_authentication_parameter_sres = TRUE;
2628 authentication_and_ciphering_response
2629 ->authentication_parameter_sres.sres_value.l_sres_value = MAX_SRES*8;
2630 authentication_and_ciphering_response
2631 ->authentication_parameter_sres.sres_value.o_sres_value = 0;
2632 memcpy (authentication_and_ciphering_response->
2633 authentication_parameter_sres.sres_value.b_sres_value,
2634 sim_authentication_cnf->sres, MAX_SRES);
2635
2636 memcpy ( gmm_data->kern.auth_cap.kc, sim_authentication_cnf->kc,
2637 MAX_KC ) ;
2638
2639 #ifdef GMM_TCS4
2640 gmm_data->kern.auth_cap.last_auth_req_id = NOT_PRESENT_8BIT;
2641 #endif
2642
2643 PFREE (sim_authentication_cnf);
2644 /*
2645 * <R.GMM.AUTH_RES.M.006>
2646 */
2647 {
2648 PALLOC ( llgmm_assign_req, LLGMM_ASSIGN_REQ );
2649 llgmm_assign_req->old_tlli = LLGMM_TLLI_INVALID;
2650 llgmm_assign_req->new_tlli = gmm_data->tlli.current;
2651 if (NO_KEY== gmm_data->kern.auth_cap.cksn)
2652 {
2653 memset (llgmm_assign_req->llgmm_kc.key, 0x0, MAX_KC);
2654 }
2655 else
2656 {
2657 memcpy ( llgmm_assign_req->llgmm_kc.key, gmm_data->kern.auth_cap.kc, MAX_KC );
2658 }
2659 llgmm_assign_req->ciphering_algorithm
2660 = gmm_data->kern.auth_cap.ciphering_algorithm;
2661
2662 PSEND ( hCommLLC, llgmm_assign_req );
2663 }
2664
2665
2666 if (IMEISV_REQUESTED == gmm_data->kern.auth_cap.imeisv_requested)
2667 {
2668 authentication_and_ciphering_response->v_gmobile_identity = TRUE;
2669 kern_get_imeisv (
2670 &authentication_and_ciphering_response->gmobile_identity);
2671 }
2672 else
2673 {
2674 authentication_and_ciphering_response->v_gmobile_identity = FALSE;
2675 }
2676 sig_kern_tx_data_req (CURRENT_TLLI,AUTHENTICATION_AND_CIPHERING_RESPONSE);
2677 }
2678 else
2679 {
2680 PFREE (sim_authentication_cnf);
2681 /*
2682 * mutliple authentication request problem occurred!!!!
2683 * ignore this SIM answer because another request has already been sent to
2684 * the SIM again and this overwrote the A&C reference number
2685 */
2686 TRACE_0_INFO ("error: Authentication received twice, SIM ignored");
2687 }
2688 /* end patch ubuob */
2689 break;
2690
2691 default:
2692
2693 PFREE (sim_authentication_cnf);
2694 TRACE_1_INFO ("state: %x", GET_STATE( KERN ));
2695 TRACE_ERROR("A&C RES unexpected");
2696 break;
2697 }
2698 GMM_RETURN;
2699 } /* kern_sim_authentication_cnf() */
2700
2701
2702 /*
2703 +------------------------------------------------------------------------------
2704 | Function : kern_mmgmm_nreg_cnf
2705 +------------------------------------------------------------------------------
2706 | Description : Handles the primitive MMGMM_NREG_CNF
2707 |
2708 | MSC: 3.20.3 IMSI attach/detach
2709 |
2710 | Parameters : *mmgmm_nreg_cnf - Ptr to primitive payload
2711 |
2712 +------------------------------------------------------------------------------
2713 */
2714 GLOBAL void kern_mmgmm_nreg_cnf ( T_MMGMM_NREG_CNF *mmgmm_nreg_cnf )
2715 {
2716 UBYTE detach_type;
2717 GMM_TRACE_FUNCTION( "kern_mmgmm_nreg_cnf" );
2718
2719 if (gmm_data->kern.attach_cap.mobile_class_changed
2720 && GMM_GRR_STATE_ON == gmm_data->kern.attach_cap.grr_state)
2721 {
2722 gmm_data->kern.attach_cap.mobile_class_changed=FALSE;
2723 kern_gmmrr_enable();
2724 }
2725
2726 switch (mmgmm_nreg_cnf->detach_cause) /* TCS 2.1 */
2727 {
2728 case CS_SIM_REM:
2729 detach_type = GMMREG_DT_SIM_REMOVED;
2730 TRACE_EVENT ("SIM is removed");
2731 break;
2732 case CS_POW_OFF:
2733 detach_type = GMMREG_DT_POWER_OFF;
2734 TRACE_EVENT ("Power is switched off");
2735 break;
2736 case CS_SOFT_OFF:
2737 detach_type = GMMREG_DT_SOFT_OFF;
2738 TRACE_EVENT ("Power is soft switched off");
2739 break;
2740 case CS_DISABLE:
2741 detach_type = GMMREG_DT_IMSI;
2742 TRACE_EVENT ("GSM switched off");
2743 break;
2744 default:
2745 detach_type = GMMREG_DT_POWER_OFF;
2746 TRACE_EVENT ("unknown detach type in MMGMM_NREG_CNF");
2747 break;
2748 }
2749 SET_STATE( MM, GMM_MM_DEREG );
2750 sig_kern_sync_set_mm_state(MMGMM_CELL_SELECTED);
2751
2752 if (gmm_data->sim_gprs_invalid && gmm_data->kern.cell_id.lac == GMMREG_LA_INVALID && mmgmm_nreg_cnf->detach_cause == CS_SIM_REM)
2753 {
2754 switch ( GET_STATE (KERN) )
2755 {
2756 case KERN_GMM_DEREG_PLMN_SEARCH:
2757 case KERN_GMM_DEREG_SUSPENDED:
2758 SET_STATE(KERN,KERN_GMM_DEREG_NO_IMSI);
2759 #ifdef FF_EM_MODE
2760 EM_GMM_SET_STATE(KERN_GMM_DEREG_NO_IMSI);
2761 #endif
2762 break;
2763 case KERN_GMM_REG_IMSI_DETACH_INITIATED:
2764 kern_enter_reg_normal();
2765 break;
2766 case KERN_GMM_DEREG_NO_IMSI:
2767 SET_STATE(KERN,KERN_GMM_NULL_NO_IMSI);
2768 #ifdef FF_EM_MODE
2769 EM_GMM_SET_STATE(KERN_GMM_NULL_NO_IMSI);
2770 #endif
2771 break;
2772 default:
2773 break;
2774 }
2775 PFREE ( mmgmm_nreg_cnf );
2776 GMM_RETURN;
2777 }
2778 switch ( GET_STATE (KERN) )
2779 {
2780 case KERN_GMM_DEREG_PLMN_SEARCH:
2781 switch(mmgmm_nreg_cnf->detach_cause) /* TCS 2.1 */
2782 {
2783 case CS_SOFT_OFF:
2784 case CS_POW_OFF:
2785 kern_gmmreg_detach (GMMREG_DT_POWER_OFF,
2786 GMMCS_POWER_OFF, /* TCS 2.1 */
2787 SEARCH_NOT_RUNNING,
2788 GMMCS_POWER_OFF);
2789 break;
2790 case CS_SIM_REM:
2791 SET_STATE(KERN,KERN_GMM_DEREG_NO_IMSI);
2792 #ifdef FF_EM_MODE
2793 EM_GMM_SET_STATE(KERN_GMM_DEREG_NO_IMSI);
2794 #endif
2795 kern_gmmreg_detach (GMMREG_DT_SIM_REMOVED,
2796 GMMCS_SIM_REMOVED, /* TCS 2.1 */
2797 SEARCH_NOT_RUNNING,
2798 GMMCS_SIM_REMOVED);
2799 break;
2800 default:
2801 kern_gmmreg_detach (GMMREG_DT_COMB,
2802 /* START UBUOB PATCH ISSUE 8381 */
2803 GMMCS_NET_CAUSE_NOT_PRESENT, /* TCS 2.1 */
2804 /* END UBUOB PATCH ISSUE 8381 */
2805 SEARCH_RUNNING,
2806 GMMCS_NET_CAUSE_NOT_PRESENT);
2807 kern_mm_activate_rr();
2808 break;
2809 }
2810
2811 break;
2812
2813 case KERN_GMM_NULL_NO_IMSI:
2814 case KERN_GMM_NULL_IMSI:
2815 /*
2816 * POWER OFF
2817 */
2818 if( CS_DISABLE==mmgmm_nreg_cnf->detach_cause) /* TCS 2.1 */
2819 {
2820 detach_type=GMMREG_DT_IMSI;
2821 }
2822 kern_gmmreg_detach (detach_type,
2823 gmm_data->kern.detach_cap.error_cause, /* TCS 2.1 */
2824 SEARCH_NOT_RUNNING,
2825 gmm_data->kern.detach_cap.error_cause);
2826
2827 break;
2828 case KERN_GMM_DEREG_SUSPENDED:
2829 switch(mmgmm_nreg_cnf->detach_cause) /* TCS 2.1 */
2830 {
2831 case CS_SOFT_OFF:
2832 kern_gmmreg_detach (GMMREG_DT_SOFT_OFF,
2833 GMMCS_POWER_OFF, /* TCS 2.1 */
2834 SEARCH_NOT_RUNNING,
2835 GMMCS_POWER_OFF);
2836 break;
2837 case CS_POW_OFF:
2838 kern_gmmreg_detach (GMMREG_DT_POWER_OFF,
2839 GMMCS_POWER_OFF, /* TCS 2.1 */
2840 SEARCH_NOT_RUNNING,
2841 GMMCS_POWER_OFF);
2842 break;
2843 case CS_SIM_REM:
2844 SET_STATE(KERN,KERN_GMM_DEREG_NO_IMSI);
2845 #ifdef FF_EM_MODE
2846 EM_GMM_SET_STATE(KERN_GMM_DEREG_NO_IMSI);
2847 #endif
2848 kern_gmmreg_detach (GMMREG_DT_SIM_REMOVED,
2849 GMMCS_SIM_REMOVED, /* TCS 2.1 */
2850 SEARCH_NOT_RUNNING,
2851 GMMCS_SIM_REMOVED);
2852 break;
2853 default:
2854 /* ACI can not handle SEARCH RUNNING to show GSM detached */
2855 if (GMMRR_NET_MODE_III==gmm_data->kern.sig_cell_info.net_mode
2856 && GMMREG_CLASS_BG== gmm_data->kern.attach_cap.mobile_class )
2857 {
2858 kern_gmmreg_detach (GMMREG_DT_COMB,
2859 GMMCS_NET_CAUSE_NOT_PRESENT, /* TCS 2.1 */
2860 SEARCH_RUNNING,
2861 GMMCS_NET_CAUSE_NOT_PRESENT);
2862 }
2863 else
2864 {
2865 kern_gmmreg_detach (GMMREG_DT_COMB,
2866 GMMCS_NET_CAUSE_NOT_PRESENT, /* TCS 2.1 */
2867 SEARCH_NOT_RUNNING,
2868 GMMCS_NET_CAUSE_NOT_PRESENT);
2869 }
2870 break;
2871 }
2872 kern_call_undone_mm_proc_der();
2873 break;
2874 case KERN_GMM_REG_SUSPENDED:
2875 switch(mmgmm_nreg_cnf->detach_cause) /* TCS 2.1 */
2876 {
2877 case CS_SOFT_OFF:
2878 kern_gmmreg_detach (GMMREG_DT_SOFT_OFF,
2879 GMMCS_POWER_OFF, /* TCS 2.1 */
2880 SEARCH_NOT_RUNNING,
2881 GMMCS_POWER_OFF);
2882 break;
2883 case CS_POW_OFF:
2884 kern_gmmreg_detach (GMMREG_DT_POWER_OFF,
2885 GMMCS_POWER_OFF, /* TCS 2.1 */
2886 SEARCH_NOT_RUNNING,
2887 GMMCS_POWER_OFF);
2888 break;
2889 case CS_DISABLE:
2890 if (GMMREG_DT_IMSI == gmm_data->kern.detach_cap.detach_type)
2891 {
2892 kern_gmmreg_detach (GMMREG_DT_IMSI,
2893 GMMCS_NET_CAUSE_NOT_PRESENT, /* TCS 2.1 */
2894 SEARCH_NOT_RUNNING,
2895 GMMCS_NET_CAUSE_NOT_PRESENT);
2896 break;
2897 }
2898 /*
2899 * else: wait for gprs detach to be finished
2900 * FALLTHROUGH
2901 */
2902 case CS_SIM_REM:
2903 if (GMMRR_NET_MODE_III!=gmm_data->kern.sig_cell_info.net_mode)
2904 {
2905
2906 /*
2907 * Wait until GPRS is deregistered
2908 */
2909 break;
2910 }
2911 /*
2912 * else NO break;
2913 * we are ms class BG and have switched off GSM
2914 */
2915 default:
2916 kern_gmmreg_detach (GMMREG_DT_IMSI,
2917 GMMCS_NET_CAUSE_NOT_PRESENT, /* TCS 2.1 */
2918 SEARCH_NOT_RUNNING,
2919 GMMCS_NET_CAUSE_NOT_PRESENT);
2920 break;
2921 }
2922 kern_call_undone_mm_proc_reg();
2923 break;
2924 case KERN_GMM_REG_IMSI_DETACH_INITIATED:
2925 kern_enter_reg_normal();
2926 if(GMMRR_NET_MODE_I!=gmm_data->kern.sig_cell_info.net_mode)
2927 /*
2928 * In NMO I gmmreg_detach_cnf was sent before requesting
2929 * mmgmm_net_req
2930 */
2931 {
2932 kern_gmmreg_detach (detach_type,
2933 GMMCS_NET_CAUSE_NOT_PRESENT, /* TCS 2.1 */
2934 GMMREG_SEARCH_NOT_RUNNING,
2935 GMMCS_NET_CAUSE_NOT_PRESENT);
2936 }
2937 break;
2938 case KERN_GMM_REG_NORMAL_SERVICE:
2939 break;
2940 case KERN_GMM_DEREG_NO_IMSI:
2941 SET_STATE(KERN,KERN_GMM_NULL_NO_IMSI);
2942 #ifdef FF_EM_MODE
2943 EM_GMM_SET_STATE(KERN_GMM_NULL_NO_IMSI);
2944 #endif
2945 kern_gmmreg_detach (detach_type,
2946 GMMCS_INT_NOT_PRESENT, /* TCS 2.1 */
2947 GMMREG_SEARCH_NOT_RUNNING,
2948 GMMCS_INT_NOT_PRESENT);
2949 break;
2950 default:
2951 TRACE_ERROR( "MMGMM_NREG_CNF unexpected" );
2952 break;
2953 }
2954 PFREE ( mmgmm_nreg_cnf );
2955
2956 #ifdef TRACE_FUNC
2957 #ifdef IDENTATION
2958 if (gmm_data->deep<=0) {
2959 /*
2960 * after power off deep is set to 0 in kern_init so we need here normal
2961 * return
2962 */
2963 return;
2964 }
2965 else
2966 {
2967 GMM_RETURN;
2968 }
2969 #endif
2970 #endif
2971 } /* kern_mmgmm_nreg_cnf() */
2972
2973 /*
2974 +------------------------------------------------------------------------------
2975 | Function : kern_mmgmm_auth_rej_ind
2976 +------------------------------------------------------------------------------
2977 | Description : Handles the primitive MMGMM_AUTH_REJ_IND
2978 |
2979 | Parameters : *mmgmm_auth_rej_ind - Ptr to primitive payload
2980 |
2981 +------------------------------------------------------------------------------
2982 */
2983 GLOBAL void kern_mmgmm_auth_rej_ind ( T_MMGMM_AUTH_REJ_IND *mmgmm_auth_rej_ind )
2984 {
2985 GMM_TRACE_FUNCTION( "kern_mmgmm_auth_rej_ind" );
2986 PFREE (mmgmm_auth_rej_ind);
2987
2988 gmm_data->sim_gprs_invalid = TRUE;
2989 gmm_data->kern.detach_cap.detach_type = GMMREG_DT_SIM_REMOVED;
2990 kern_sim_del_locigprs ();
2991 gmm_data->gu = GU3_ROAMING_NOT_ALLOWED;
2992 kern_sim_gmm_update ();
2993
2994 GMM_RETURN;
2995 } /* kern_mmgmm_auth_rej_ind() */
2996
2997 /*
2998 +------------------------------------------------------------------------------
2999 | Function : kern_mmgmm_t3212_val_ind
3000 |
3001 | Description : Handles the primitive MMGMM_T3212_VAL _IND
3002 |
3003 | Parameters : *mmgmm_t3212_val_ind - Ptr to primitive payload
3004 |
3005 +------------------------------------------------------------------------------
3006 */
3007 GLOBAL void kern_mmgmm_t3212_val_ind ( T_MMGMM_T3212_VAL_IND *mmgmm_t3212_val_ind )
3008 {
3009 GMM_TRACE_FUNCTION( "kern_mmgmm_t3212_val_ind" );
3010
3011 #ifdef REL99
3012 switch (gmm_data->kern.sig_cell_info.sgsnr_flag)/*!gmm_data->release99 =>old code*/ /* TCS 4.0 */
3013 {
3014 default:
3015 case PS_SGSN_UNKNOWN:
3016 case PS_SGSN_98_OLDER:
3017 #endif
3018
3019 /*
3020 * see GSM04.08 ch. 11.2.2 NOTE 4
3021 */
3022 gmm_data->kern.t3302_val = mmgmm_t3212_val_ind->t3212_val;
3023 /*
3024 * Boeser Hack wegen Faulheit, signal should be taken
3025 */
3026 gmm_data->sync.mm_cell_info.t3212_val = gmm_data->kern.t3302_val;
3027
3028 #ifdef REL99
3029 break;
3030 case PS_SGSN_99_ONWARDS:
3031 break;
3032 }
3033 #endif
3034
3035 PFREE ( mmgmm_t3212_val_ind );
3036 GMM_RETURN;
3037 } /* kern_mmgmm_t3212_val_ind() */
3038
3039 /*
3040 +------------------------------------------------------------------------------
3041 | Function : kern_mmgmm_cm_establish_ind
3042 +------------------------------------------------------------------------------
3043 | Description : Handles the primitive MMGMM_CM_ESTABLISH_IND
3044 |
3045 | Parameters : *mmgmm_cm_establish_ind - Ptr to primitive payload
3046 |
3047 +------------------------------------------------------------------------------
3048 */
3049 GLOBAL void kern_mmgmm_cm_establish_ind ( T_MMGMM_CM_ESTABLISH_IND *mmgmm_cm_establish_ind )
3050 {
3051 GMM_TRACE_FUNCTION( "kern_mmgmm_cm_establish_ind" );
3052
3053 PFREE ( mmgmm_cm_establish_ind );
3054
3055 if (gmm_data->kern.gmmrr_resume_sent)
3056 {
3057 kern_mm_cm_establish_res (MMGMM_ESTABLISH_REJECT);
3058 GMM_RETURN;
3059 }
3060
3061 switch( GET_STATE( KERN ) )
3062 {
3063 case KERN_GMM_DEREG_RESUMING:
3064 case KERN_GMM_REG_RESUMING:
3065 TRACE_ERROR ("prim should be saved");
3066 break;
3067 case KERN_GMM_DEREG_SUSPENDING:
3068 case KERN_GMM_REG_SUSPENDING:
3069 gmm_data->kern.suspension_type |= GMM_SUSP_CALL;
3070 break;
3071
3072 case KERN_GMM_DEREG_SUSPENDED:
3073 case KERN_GMM_NULL_IMSI:
3074 kern_mm_cm_establish_res (MMGMM_ESTABLISH_OK);
3075 break;
3076 case KERN_GMM_DEREG_LIMITED_SERVICE:
3077 case KERN_GMM_DEREG_ATTEMPTING_TO_ATTACH:
3078 case KERN_GMM_DEREG_NO_CELL_AVAILABLE:
3079 case KERN_GMM_DEREG_PLMN_SEARCH:
3080 case KERN_GMM_DEREG_INITIATED:
3081 case KERN_GMM_REG_INITIATED:
3082 switch (gmm_data->kern.attach_cap.mobile_class)
3083 {
3084 case GMMREG_CLASS_A:
3085 if (GMMRR_NET_MODE_III == gmm_data->kern.sig_cell_info.net_mode)
3086 {
3087 kern_mm_cm_establish_res (MMGMM_ESTABLISH_REJECT);
3088 }
3089 else
3090 {
3091 kern_mm_cm_establish_res (MMGMM_ESTABLISH_OK);
3092 }
3093 break;
3094 case GMMREG_CLASS_CG:
3095 kern_mm_cm_establish_res (MMGMM_ESTABLISH_REJECT);
3096 break;
3097 case GMMREG_CLASS_BG:
3098 if (GMMRR_NET_MODE_III == gmm_data->kern.sig_cell_info.net_mode)
3099 {
3100 kern_mm_cm_establish_res (MMGMM_ESTABLISH_REJECT);
3101 break;
3102 }
3103 /* NO break */
3104 case GMMREG_CLASS_B:
3105 case GMMREG_CLASS_BC:
3106 /* START PATCH UBUOB ISSUE 8278 */
3107 switch (GET_STATE (KERN))
3108 {
3109 case KERN_GMM_DEREG_ATTEMPTING_TO_ATTACH:
3110 gmm_data->kern.attach_cap.enter_attempting_to_update_after_lau = TRUE;
3111 break;
3112 default:
3113 break;
3114 }
3115 /* END PATCH UBUOB ISSUE 8278 */
3116
3117 if (GMM_MM_DEREG != GET_STATE(MM))
3118 {
3119 SET_STATE ( KERN, KERN_GMM_DEREG_SUSPENDING );
3120 #ifdef FF_EM_MODE
3121 EM_GMM_SET_STATE(KERN_GMM_DEREG_SUSPENDING );
3122 #endif
3123 /* START PATCH UBUOB ISSUE 8781 */
3124 /* kern_gmmreg_suspend (GMMREG_CS_CALL); */
3125 /* END PATCH UBUOB ISSUE 8781 */
3126 kern_gmmrr_suspend (GMMRR_NOT_SUSP_GPRS, GMMRR_ABNORMAL_RELEASE, GMM_SUSP_CALL);
3127 vsi_t_stop(GMM_handle, kern_T3321);
3128 }
3129 else
3130 {
3131 SET_STATE( KERN, KERN_GMM_DEREG_SUSPENDING);
3132 #ifdef FF_EM_MODE
3133 EM_GMM_SET_STATE(KERN_GMM_DEREG_SUSPENDING);
3134 #endif
3135 /*
3136 * kern_llgmm_unassign();
3137 */
3138 kern_llgmm_suspend(LLGMM_CALL);
3139 kern_gmmrr_suspend (GMMRR_NOT_SUSP_GPRS, GMMRR_ABNORMAL_RELEASE, GMM_SUSP_CALL);
3140 }
3141 break;
3142 default:
3143 TRACE_ERROR( "unknown MS class");
3144 break;
3145 }
3146 break;
3147 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE:
3148 case KERN_GMM_REG_NO_CELL_AVAILABLE:
3149 case KERN_GMM_REG_LIMITED_SERVICE:
3150 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE_MM:
3151 case KERN_GMM_RAU_INITIATED:
3152 switch (gmm_data->kern.attach_cap.mobile_class)
3153 {
3154 case GMMREG_CLASS_A:
3155 kern_mm_cm_establish_res (MMGMM_ESTABLISH_OK);
3156 break;
3157 case GMMREG_CLASS_CG:
3158 kern_mm_cm_establish_res (MMGMM_ESTABLISH_REJECT);
3159 break;
3160 case GMMREG_CLASS_BG:
3161 if (GMMRR_NET_MODE_III == gmm_data->kern.sig_cell_info.net_mode)
3162 {
3163 kern_mm_cm_establish_res (MMGMM_ESTABLISH_REJECT);
3164 break;
3165 }
3166 /* NO break; */
3167 case GMMREG_CLASS_B:
3168 case GMMREG_CLASS_BC:
3169 /* START PATCH UBUOB ISSUE 8278 */
3170 switch (GET_STATE (KERN))
3171 {
3172 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE:
3173 gmm_data->kern.attach_cap.enter_attempting_to_update_after_lau = TRUE;
3174 break;
3175 default:
3176 break;
3177 }
3178 /* END PATCH UBUOB ISSUE 8278 */
3179 SET_STATE ( KERN, KERN_GMM_REG_SUSPENDING );
3180 #ifdef FF_EM_MODE
3181 EM_GMM_SET_STATE(KERN_GMM_REG_SUSPENDING );
3182 #endif
3183 kern_llgmm_suspend(LLGMM_CALL);
3184 kern_gmmrr_suspend (GMMRR_NOT_SUSP_GPRS, GMMRR_ABNORMAL_RELEASE, GMM_SUSP_CALL);
3185 break;
3186 default:
3187 TRACE_ERROR( "unknown MS class");
3188 break;
3189 }
3190 break;
3191
3192 case KERN_GMM_REG_NORMAL_SERVICE:
3193 switch (gmm_data->kern.attach_cap.mobile_class)
3194 {
3195 case GMMREG_CLASS_A:
3196 kern_mm_cm_establish_res (MMGMM_ESTABLISH_OK);
3197 break;
3198 case GMMREG_CLASS_CG:
3199 kern_mm_cm_establish_res (MMGMM_ESTABLISH_REJECT);
3200 break;
3201 case GMMREG_CLASS_BG:
3202 if (GMMRR_NET_MODE_III == gmm_data->kern.sig_cell_info.net_mode)
3203 {
3204 kern_mm_cm_establish_res (MMGMM_ESTABLISH_REJECT);
3205 break;
3206 }
3207 /* NO break; */
3208 case GMMREG_CLASS_B:
3209 case GMMREG_CLASS_BC:
3210 SET_STATE ( KERN, KERN_GMM_REG_SUSPENDING );
3211 #ifdef FF_EM_MODE
3212 EM_GMM_SET_STATE(KERN_GMM_REG_SUSPENDING );
3213 #endif
3214 kern_llgmm_suspend(LLGMM_CALL);
3215 kern_gmmrr_suspend (GMMRR_SUSP_GPRS, GMMRR_ABNORMAL_RELEASE, GMM_SUSP_CALL);
3216 break;
3217 default:
3218 TRACE_ERROR( "unknown MS class");
3219 break;
3220 }
3221 break;
3222 case KERN_GMM_REG_SUSPENDED:
3223 switch (gmm_data->kern.attach_cap.mobile_class)
3224 {
3225 case GMMREG_CLASS_A:
3226 kern_mm_cm_establish_res (MMGMM_ESTABLISH_OK);
3227 break;
3228 case GMMREG_CLASS_CG:
3229 kern_mm_cm_establish_res (MMGMM_ESTABLISH_REJECT);
3230 break;
3231 case GMMREG_CLASS_BG:
3232 if (GMMRR_NET_MODE_III == gmm_data->kern.sig_cell_info.net_mode)
3233 {
3234 kern_mm_cm_establish_res (MMGMM_ESTABLISH_REJECT);
3235 break;
3236 }
3237 /* NO break; */
3238 case GMMREG_CLASS_B:
3239 case GMMREG_CLASS_BC:
3240 /*
3241 * call is rejected because MM may establish the call by itself.
3242 * When state REG_RESUMING will be defined than GMM will return OK.
3243 * In case of waiting for GMMRR_CELL_IND after GMMRR_RESUME_REQ
3244 * the mobile will run into a dead lock situation otherwise.
3245 */
3246 kern_mm_cm_establish_res (MMGMM_ESTABLISH_REJECT);
3247 break;
3248 default:
3249 TRACE_ERROR( "unknown MS class");
3250 break;
3251 }
3252 break;
3253 case KERN_GMM_DEREG_NO_IMSI:
3254 case KERN_GMM_NULL_NO_IMSI:
3255 kern_mm_cm_establish_res (MMGMM_ESTABLISH_REJECT);
3256 break;
3257 default:
3258 kern_mm_cm_establish_res (MMGMM_ESTABLISH_REJECT);
3259 TRACE_1_INFO ("state: %x", GET_STATE( KERN ));
3260 TRACE_ERROR( "MMGMM_CM_ESTABLISH_IND unexpected" );
3261 break;
3262 }
3263 GMM_RETURN;
3264 } /* kern_mm_cm_establish_ind() */
3265 /*
3266 +------------------------------------------------------------------------------
3267 | Function : kern_mmgmm_cm_emergency_ind
3268 +------------------------------------------------------------------------------
3269 | Description : Handles the primitive MMGMM_CM_EMERGENCY_IND
3270 |
3271 | Parameters : *mmgmm_cm_emergency_ind - Ptr to primitive payload
3272 |
3273 +------------------------------------------------------------------------------
3274 */
3275 GLOBAL void kern_mmgmm_cm_emergency_ind ( T_MMGMM_CM_EMERGENCY_IND *mmgmm_cm_emergency_ind )
3276 {
3277 GMM_TRACE_FUNCTION( "kern_mmgmm_cm_emeregncy_ind" );
3278
3279 PFREE ( mmgmm_cm_emergency_ind );
3280
3281 if (GMMREG_CLASS_A == gmm_data->kern.attach_cap.mobile_class
3282 && GMMRR_NET_MODE_III != gmm_data->kern.sig_cell_info.net_mode)
3283 {
3284 kern_mm_cm_emergency_res (MMGMM_ESTABLISH_OK);
3285 GMM_RETURN;
3286 }
3287
3288 switch( GET_STATE( KERN ) )
3289 {
3290 case KERN_GMM_DEREG_RESUMING:
3291 case KERN_GMM_REG_RESUMING:
3292 TRACE_ERROR ("prim should be saved");
3293 break;
3294
3295 case KERN_GMM_DEREG_SUSPENDING:
3296 case KERN_GMM_REG_SUSPENDING:
3297 gmm_data->kern.suspension_type |= GMM_SUSP_EM_CALL;
3298 break;
3299 case KERN_GMM_DEREG_SUSPENDED:
3300 case KERN_GMM_REG_SUSPENDED:
3301 case KERN_GMM_NULL_IMSI:
3302 case KERN_GMM_NULL_NO_IMSI:
3303 case KERN_GMM_NULL_PLMN_SEARCH:
3304 case KERN_GMM_NULL_NO_IMSI_LIMITED_SERVICE_REQ:
3305 case KERN_GMM_NULL_IMSI_LIMITED_SERVICE_REQ:
3306 kern_mm_cm_emergency_res (MMGMM_ESTABLISH_OK);
3307 break;
3308 case KERN_GMM_DEREG_NO_IMSI:
3309 if (gmm_data->kern.detach_cap.gmmreg)
3310 /*
3311 * The mobile is switching off this moment. Thera are no power anymore
3312 */
3313 {
3314 kern_mm_cm_emergency_res (MMGMM_ESTABLISH_REJECT);
3315 }
3316 break;
3317
3318 case KERN_GMM_DEREG_PLMN_SEARCH:
3319 case KERN_GMM_DEREG_LIMITED_SERVICE:
3320 case KERN_GMM_DEREG_ATTEMPTING_TO_ATTACH:
3321 case KERN_GMM_DEREG_NO_CELL_AVAILABLE:
3322 case KERN_GMM_DEREG_INITIATED:
3323 case KERN_GMM_REG_INITIATED:
3324 SET_STATE ( KERN, KERN_GMM_DEREG_SUSPENDING );
3325 #ifdef FF_EM_MODE
3326 EM_GMM_SET_STATE(KERN_GMM_DEREG_SUSPENDING );
3327 #endif
3328 kern_llgmm_suspend(LLGMM_CALL);
3329 kern_gmmrr_suspend (GMMRR_NOT_SUSP_GPRS, GMMRR_ABNORMAL_RELEASE, GMM_SUSP_EM_CALL);
3330 break;
3331 case KERN_GMM_RAU_WAIT_FOR_NPDU_LIST:
3332 case KERN_GMM_REG_IMSI_DETACH_INITIATED:
3333 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE:
3334 case KERN_GMM_REG_NO_CELL_AVAILABLE:
3335 case KERN_GMM_REG_LIMITED_SERVICE:
3336 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE_MM:
3337 case KERN_GMM_RAU_INITIATED:
3338 SET_STATE ( KERN, KERN_GMM_REG_SUSPENDING);
3339 #ifdef FF_EM_MODE
3340 EM_GMM_SET_STATE(KERN_GMM_REG_SUSPENDING);
3341 #endif
3342 kern_llgmm_suspend(LLGMM_CALL);
3343 kern_gmmrr_suspend (GMMRR_NOT_SUSP_GPRS, GMMRR_ABNORMAL_RELEASE, GMM_SUSP_EM_CALL);
3344 break;
3345 case KERN_GMM_REG_NORMAL_SERVICE:
3346 SET_STATE ( KERN, KERN_GMM_REG_SUSPENDING );
3347 #ifdef FF_EM_MODE
3348 EM_GMM_SET_STATE(KERN_GMM_REG_SUSPENDING );
3349 #endif
3350 /*
3351 * kern_llgmm_unassign();
3352 */
3353 kern_llgmm_suspend(LLGMM_CALL);
3354 kern_gmmrr_suspend (GMMRR_SUSP_GPRS, GMMRR_ABNORMAL_RELEASE, GMM_SUSP_EM_CALL);
3355 break;
3356 default:
3357 TRACE_ERROR( "MMGMM_CM_EMERGENCY_IND unexpected" );
3358 break;
3359 }
3360 GMM_RETURN;
3361 } /* kern_mm_cm_emergency_ind() */
3362 /*
3363 +------------------------------------------------------------------------------
3364 | Function : kern_mmgmm_cm_release_ind
3365 +------------------------------------------------------------------------------
3366 | Description : Handles the primitive MMGMM_CM_RELEASE_IND
3367 |
3368 | Parameters : *mmgmm_cm_release_ind - Ptr to primitive payload
3369 |
3370 +------------------------------------------------------------------------------
3371 */
3372 GLOBAL void kern_mmgmm_cm_release_ind ( T_MMGMM_CM_RELEASE_IND *mmgmm_cm_release_ind )
3373 {
3374 GMM_TRACE_FUNCTION( "kern_mmgmm_cm_release_ind" );
3375
3376 switch( GET_STATE( KERN ) )
3377 {
3378 case KERN_GMM_REG_SUSPENDED:
3379 /*
3380 * resume with cell_ind
3381 */
3382 if (MMGMM_RESUMPTION_OK!=mmgmm_cm_release_ind->resumption)
3383 {
3384 TRACE_EVENT("Para: resumption failure: RAU needed");
3385 SET_STATE(GU,GU_UPDATE_NEEDED);
3386 }
3387 else
3388 {
3389 TRACE_EVENT("OPar: resumption OK.");
3390 }
3391 PFREE ( mmgmm_cm_release_ind );
3392 kern_call_undone_mm_proc_reg();
3393 break;
3394 case KERN_GMM_DEREG_SUSPENDED:
3395 PFREE ( mmgmm_cm_release_ind );
3396 kern_call_undone_mm_proc_der();
3397 break;
3398 case KERN_GMM_DEREG_SUSPENDING:
3399 case KERN_GMM_REG_SUSPENDING:
3400 gmm_data->kern.suspension_type &= ~ (GMM_SUSP_CALL|GMM_SUSP_EM_CALL);
3401
3402 PFREE ( mmgmm_cm_release_ind );
3403 break;
3404
3405 default:
3406
3407 if (GMMREG_CLASS_A!=gmm_data->kern.attach_cap.mobile_class)
3408 {
3409 TRACE_ERROR( "MMGMM_CM_RELEASE_IND unexpected" );
3410 }
3411 PFREE ( mmgmm_cm_release_ind );
3412 break;
3413 }
3414 GMM_RETURN;
3415 } /* kern_mm_cm_release_ind() */
3416
3417 /*
3418 +------------------------------------------------------------------------------
3419 | Function : kern_mmgmm_plmn_ind
3420 +------------------------------------------------------------------------------
3421 | Description : Handles the primitive MMGMM_PLMN_IND
3422 |
3423 | MSC: 3.20 MM Interface
3424 | MSC: 3.20.2 Network selection
3425 |
3426 | Parameters : *mmgmm_plmn_ind - Ptr to primitive payload
3427 |
3428 +------------------------------------------------------------------------------
3429 */
3430 GLOBAL void kern_mmgmm_plmn_ind ( T_MMGMM_PLMN_IND *mmgmm_plmn_ind )
3431 {
3432 GMM_TRACE_FUNCTION( "kern_mmgmm_plmn_ind" );
3433 {
3434 PPASS (mmgmm_plmn_ind, gmmreg_plmn_ind, GMMREG_PLMN_IND);
3435 PSEND ( hCommMMI, gmmreg_plmn_ind );
3436 }
3437 GMM_RETURN;
3438 } /* kern_mm_plmn_ind() */
3439
3440
3441 /*
3442 +------------------------------------------------------------------------------
3443 | Function : kern_gmmreg_attach_req
3444 +------------------------------------------------------------------------------
3445 | Description : Handles the the primitive GMMREG_ATTACH_REQ
3446 |
3447 | This signal passed the attach_type from MMI to
3448 | the service KERN
3449 |
3450 | MSC : 3.4 MMI-initiated normal/combined GPRS attach
3451 |
3452 | Parameters : *gmmreq_attach_req - Ptr to primitive payload
3453 |
3454 +------------------------------------------------------------------------------
3455 */
3456 GLOBAL void kern_gmmreg_attach_req ( T_GMMREG_ATTACH_REQ *gmmreg_attach_req )
3457 {
3458 U8 attach_type_changed = FALSE;
3459 GMM_TRACE_FUNCTION( "kern_gmmreg_attach_req" );
3460 TRACE_EVENT ("hp_gmm_24473#1#24473"); /* TCS 2.1 */
3461
3462 /* Changes for Boot Time Speedup. GMM will get dummy GMMREG_ATTACH_REQ indicating QUICK_REG.
3463 * GMM will send MMGMM_REG_REQ indicating QUICK_REG. No need to process this request as it is
3464 * dummy request and GMM will get other GMMREG_ATTACH_REQ indicating NORMAL_REG
3465 */
3466 if (gmmreg_attach_req->bootup_act EQ QUICK_REG)
3467 {
3468 kern_mm_reg_req (REG_GPRS_INACTIVE, QUICK_REG);
3469 return ;
3470 }
3471 vsi_t_stop ( GMM_handle, kern_T3302);
3472 sig_kern_rdy_stop_t3302_req();
3473 gmm_data->kern.attach_cap.enter_attempting_to_update_after_lau = FALSE;
3474 /*
3475 * attach_cap.gmmreg sets the caller of the attach procedure to MMI
3476 */
3477 gmm_data->kern.attach_cap.gmmreg = TRUE;
3478 gmm_data->kern.detach_cap.gmmreg = FALSE;
3479
3480 gmm_data->kern.attach_cap.service_mode = gmmreg_attach_req->service_mode;
3481
3482
3483 if (SERVICE_MODE_LIMITED == gmm_data->kern.attach_cap.service_mode)
3484 {
3485 /*
3486 * I expect that limited service means emergency call over GSM only
3487 * CLASS_CC can be set, because service mode is changed via
3488 * GMMREG_ATTACH_REQ only, so that the wanted mobile class is giveb again
3489 */
3490 gmm_data->kern.attach_cap.mobile_class = GMMREG_CLASS_CC;
3491 gmm_data->kern.attach_cap.attach_type = GMMREG_AT_IMSI;
3492
3493 }
3494 else
3495 {
3496 /*
3497 *PATCH TB 26/10/02 <
3498 * Inform GRR of the new MS class
3499 */
3500 attach_type_changed =
3501 ( gmm_data->kern.attach_cap.mobile_class != gmmreg_attach_req->mobile_class
3502 || gmm_data->kern.attach_cap.attach_type!= gmmreg_attach_req->attach_type);
3503
3504 if (GMM_GRR_STATE_OFF != gmm_data->kern.attach_cap.grr_state
3505 && (gmm_data->kern.attach_cap.mobile_class != gmmreg_attach_req->mobile_class))
3506 {
3507 if (GMMRR_NET_MODE_III==gmm_data->kern.sig_cell_info.net_mode)
3508 {
3509 gmm_data->kern.attach_cap.mobile_class_changed = TRUE;
3510 gmm_data->kern.attach_cap.mobile_class = gmmreg_attach_req->mobile_class;
3511 /*
3512 * inform GRR after switch (mmgmm_nreg_cnf xor kern _enter_der)
3513 * kern_gmmrr_enable();
3514 */
3515 }
3516 else
3517 {
3518 gmm_data->kern.attach_cap.mobile_class = gmmreg_attach_req->mobile_class;
3519 kern_gmmrr_enable();
3520 }
3521 }
3522 /* PATCH TB 26/10/02 > */
3523
3524
3525 gmm_data->kern.attach_cap.mobile_class = gmmreg_attach_req->mobile_class;
3526 /*
3527 * if MMI wants to detach, then detach is expected or class change
3528 */
3529 gmm_data->kern.attach_cap.attach_type =
3530 (GMMREG_CLASS_CG == gmmreg_attach_req->mobile_class?
3531 GMMREG_AT_GPRS:
3532 gmm_data->kern.attach_cap.attach_type|gmmreg_attach_req->attach_type);
3533
3534 }
3535
3536
3537
3538 #ifndef NTRACE
3539 switch (gmmreg_attach_req->service_mode)
3540 {
3541 case SERVICE_MODE_LIMITED:
3542 TRACE_EVENT ("Limited Service");
3543 break;
3544 case SERVICE_MODE_FULL:
3545 TRACE_EVENT ("Full Service");
3546 break;
3547 default:
3548 TRACE_ERROR ("wrong Service requested");
3549 }
3550 switch ( gmm_data->kern.attach_cap.mobile_class )
3551 {
3552 case GMMREG_CLASS_CC:
3553 TRACE_0_PARA("MS class CC");
3554 break;
3555 case GMMREG_CLASS_CG:
3556 TRACE_0_PARA("MS class CG");
3557 break;
3558 case GMMREG_CLASS_B:
3559 TRACE_0_PARA("MS class B");
3560 break;
3561 case GMMREG_CLASS_BG:
3562 TRACE_0_PARA("MS class BG");
3563 break;
3564 case GMMREG_CLASS_BC:
3565 TRACE_0_PARA("MS class BC");
3566 break;
3567 case GMMREG_CLASS_A:
3568 TRACE_0_PARA("MS class A");
3569 break;
3570 default:
3571 TRACE_ERROR ("unknown mobile class");
3572 break;
3573 }
3574 switch (gmm_data->kern.attach_cap.attach_type)
3575 {
3576 case GMMREG_AT_IMSI:
3577 TRACE_0_PARA("GSM only attach");
3578 break;
3579 case GMMREG_AT_GPRS:
3580 TRACE_0_PARA("GPRS attach");
3581 break;
3582 case GMMREG_AT_COMB:
3583 TRACE_0_PARA("GSM and GPRS attach");
3584 break;
3585 default:
3586 TRACE_ERROR ("unknown attach type");
3587 TRACE_1_PARA("%d",gmm_data->kern.attach_cap.attach_type);
3588 break;
3589 }
3590 #endif
3591
3592 if (gmm_data->sim_gprs_invalid
3593 && GMMREG_CLASS_CG == gmm_data->kern.attach_cap.mobile_class)
3594 /*
3595 * i.e. error cause 7: gprs not allowed
3596 */
3597 {
3598 PREUSE(gmmreg_attach_req,gmmreg_attach_rej,GMMREG_ATTACH_REJ );
3599 gmmreg_attach_rej->detach_type =
3600 (GMM_MM_REG_NORMAL_SERVICE == GET_STATE(MM)?GMMREG_DT_GPRS:GMMREG_DT_COMB),
3601 gmmreg_attach_rej->search_running = GMMREG_SEARCH_NOT_RUNNING,
3602 gmmreg_attach_rej->cause = GMMCS_GPRS_NOT_ALLOWED; /* TCS 2.1 */
3603 gmmreg_attach_rej->service = GMMCS_GPRS_NOT_ALLOWED;
3604 gmm_data->kern.attach_cap.gmmreg = FALSE;
3605
3606 PSEND ( hCommMMI, gmmreg_attach_rej );
3607 GMM_RETURN;
3608 }
3609
3610
3611 PFREE ( gmmreg_attach_req );
3612
3613 switch( GET_STATE( KERN ) )
3614 {
3615 /*
3616 * GMM-DEREGISTERED
3617 */
3618 case KERN_GMM_DEREG_RESUMING:
3619 case KERN_GMM_REG_RESUMING:
3620 TRACE_ERROR ("prim should be saved");
3621 break;
3622
3623 case KERN_GMM_DEREG_PLMN_SEARCH:
3624 case KERN_GMM_DEREG_LIMITED_SERVICE:
3625 case KERN_GMM_DEREG_NO_CELL_AVAILABLE:
3626 case KERN_GMM_DEREG_ATTEMPTING_TO_ATTACH:
3627
3628 case KERN_GMM_DEREG_SUSPENDING:
3629 case KERN_GMM_DEREG_SUSPENDED:
3630 if (SERVICE_MODE_LIMITED == gmm_data->kern.attach_cap.service_mode)
3631 {
3632 SET_STATE ( KERN, KERN_GMM_NULL_IMSI_LIMITED_SERVICE_REQ);
3633 #ifdef FF_EM_MODE
3634 EM_GMM_SET_STATE(KERN_GMM_NULL_IMSI_LIMITED_SERVICE_REQ);
3635 #endif
3636 kern_gmmrr_disable();
3637 kern_mm_activate_mm();
3638 break;
3639 }
3640
3641 if (GMMREG_CLASS_CC==gmm_data->kern.attach_cap.mobile_class
3642 || GMMREG_AT_IMSI== gmm_data->kern.attach_cap.attach_type)
3643 {
3644 SET_STATE ( KERN, KERN_GMM_NULL_IMSI );
3645 #ifdef FF_EM_MODE
3646 EM_GMM_SET_STATE(KERN_GMM_NULL_IMSI );
3647 #endif
3648 kern_gmmrr_disable();
3649 kern_mm_activate_mm();
3650 if ( GMM_MM_REG_NORMAL_SERVICE == GET_STATE(MM) )
3651 {
3652 kern_gmmreg_attach_cnf( GMMREG_AT_IMSI);
3653 }
3654 break;
3655 }
3656
3657 switch ( gmm_data->kern.attach_cap.mobile_class )
3658 {
3659 case GMMREG_CLASS_CG:
3660 if ( GMM_MM_DEREG != GET_STATE(MM) )
3661 {
3662 switch( GET_STATE( KERN ) )
3663 {
3664 case KERN_GMM_DEREG_SUSPENDED:
3665 /*
3666 * Case GMMREG_CLASS_CG.
3667 * The detach procedure for cs is only possible after receiving
3668 * GMMRR_CELL_IND
3669 */
3670 break;
3671 case KERN_GMM_DEREG_SUSPENDING:
3672 gmm_data->kern.suspension_type |=GMM_SUSP_IMSI_DETACH;
3673 break;
3674 default:
3675 if (kern_lai_changed() )
3676 {
3677 SET_STATE ( KERN, KERN_GMM_DEREG_SUSPENDING );
3678 #ifdef FF_EM_MODE
3679 EM_GMM_SET_STATE(KERN_GMM_DEREG_SUSPENDING );
3680 #endif
3681 kern_gmmrr_suspend (GMMRR_NOT_SUSP_GPRS, GMMRR_NORMAL_RELEASE, GMM_SUSP_LAU);
3682 }
3683 else
3684 {
3685 kern_imsi_detach_der_susp();
3686 }
3687 GMM_RETURN;
3688 }
3689 }
3690 break;
3691 default:
3692 break;
3693 }
3694
3695 switch( GET_STATE( KERN ) )
3696 {
3697 case KERN_GMM_DEREG_SUSPENDED:
3698 gmm_data->kern.attach_cap.mm_lau_attempted=TRUE;
3699 gmm_data->kern.suspension_type &= ~GMM_SUSP_LAU;
3700 break;
3701 case KERN_GMM_DEREG_SUSPENDING:
3702 gmm_data->kern.suspension_type |=GMM_SUSP_LAU;
3703 break;
3704 default:
3705 {
3706 kern_mm_reg_req (REG_CELL_SEARCH_ONLY, NORMAL_REG);
3707 }
3708 break;
3709
3710 }
3711 break;
3712 case KERN_GMM_NULL_PLMN_SEARCH:
3713 if (SERVICE_MODE_LIMITED == gmm_data->kern.attach_cap.service_mode)
3714 {
3715 SET_STATE (KERN,KERN_GMM_NULL_IMSI_LIMITED_SERVICE_REQ);
3716 #ifdef FF_EM_MODE
3717 EM_GMM_SET_STATE(KERN_GMM_NULL_IMSI_LIMITED_SERVICE_REQ);
3718 #endif
3719 kern_mm_activate_mm ();
3720 break;
3721 }
3722
3723 if (GMMREG_CLASS_CC==gmm_data->kern.attach_cap.mobile_class
3724 || GMMREG_AT_IMSI== gmm_data->kern.attach_cap.attach_type)
3725 {
3726 kern_mm_activate_mm ();
3727 break;
3728 }
3729
3730
3731 switch ( gmm_data->kern.attach_cap.mobile_class )
3732 {
3733 case GMMREG_CLASS_CG:
3734 if ( GMM_MM_DEREG != GET_STATE(MM) )
3735 {
3736 SET_STATE(KERN, KERN_GMM_DEREG_PLMN_SEARCH);
3737 #ifdef FF_EM_MODE
3738 EM_GMM_SET_STATE(KERN_GMM_DEREG_PLMN_SEARCH);
3739 #endif
3740 /*
3741 * MM enters autmaticly gprs cell search mode so that GMM
3742 * need not to send mmgmm_reg_req (cell_search_only)
3743 */
3744 kern_mm_imsi_detach();
3745 }
3746 else
3747 {
3748 SET_STATE ( KERN, KERN_GMM_DEREG_PLMN_SEARCH );
3749 #ifdef FF_EM_MODE
3750 EM_GMM_SET_STATE(KERN_GMM_DEREG_PLMN_SEARCH );
3751 #endif
3752 kern_mm_activate_rr();
3753 }
3754 break;
3755 default:
3756 /*
3757 * class A and B
3758 */
3759 SET_STATE ( KERN, KERN_GMM_DEREG_PLMN_SEARCH );
3760 #ifdef FF_EM_MODE
3761 EM_GMM_SET_STATE(KERN_GMM_DEREG_PLMN_SEARCH );
3762 #endif
3763 kern_mm_activate_rr();
3764 break;
3765 }
3766 break;
3767 /*
3768 * GPRS will be enabled
3769 */
3770 case KERN_GMM_NULL_IMSI:
3771 if (SERVICE_MODE_LIMITED == gmm_data->kern.attach_cap.service_mode)
3772 {
3773 SET_STATE (KERN,KERN_GMM_NULL_IMSI_LIMITED_SERVICE_REQ);
3774 #ifdef FF_EM_MODE
3775 EM_GMM_SET_STATE(KERN_GMM_NULL_IMSI_LIMITED_SERVICE_REQ);
3776 #endif
3777 kern_mm_activate_mm ();
3778 break;
3779 }
3780 if (GMM_MM_DEREG != GET_STATE(MM)
3781 && GMMREG_CLASS_CC == gmm_data->kern.attach_cap.mobile_class)
3782 {
3783 TRACE_EVENT ("GMMREG_ATTACH_REQ has been come twice and is ignored!");
3784 /*
3785 * the funcion is not alled because mm_plmn is used.
3786 */
3787
3788 kern_gmmreg_attach_cnf(GMMREG_AT_IMSI);
3789 gmm_data->kern.attach_cap.gmmreg = FALSE;
3790
3791 break;
3792 }
3793 /* NO break */
3794 case KERN_GMM_NULL_IMSI_LIMITED_SERVICE_REQ:
3795 if (SERVICE_MODE_LIMITED != gmm_data->kern.attach_cap.service_mode)
3796 {
3797 gmm_data->kern.sig_cell_info.gmm_status = GMMRR_SERVICE_UNKNOWN ; /* Initalize gmm status value */
3798 switch ( gmm_data->kern.attach_cap.mobile_class )
3799 {
3800 case GMMREG_CLASS_CC:
3801 if (KERN_GMM_NULL_IMSI_LIMITED_SERVICE_REQ==GET_STATE(KERN)
3802 || GMM_MM_DEREG == GET_STATE(MM))
3803 {
3804 SET_STATE ( KERN, KERN_GMM_NULL_PLMN_SEARCH );
3805 #ifdef FF_EM_MODE
3806 EM_GMM_SET_STATE(KERN_GMM_NULL_PLMN_SEARCH );
3807 #endif
3808 kern_mm_activate_mm();
3809 }
3810 else
3811 {
3812 SET_STATE(KERN,KERN_GMM_NULL_IMSI);
3813 #ifdef FF_EM_MODE
3814 EM_GMM_SET_STATE(KERN_GMM_NULL_IMSI);
3815 #endif
3816 kern_gmmreg_attach_cnf( GMMREG_AT_IMSI);
3817 }
3818 break;
3819 case GMMREG_CLASS_CG:
3820 if ( GMM_MM_DEREG != GET_STATE(MM) )
3821 {
3822 switch(GET_STATE(KERN))
3823 {
3824 case KERN_GMM_NULL_IMSI:
3825 SET_STATE ( KERN, KERN_GMM_DEREG_PLMN_SEARCH);
3826 #ifdef FF_EM_MODE
3827 EM_GMM_SET_STATE(KERN_GMM_DEREG_PLMN_SEARCH);
3828 #endif
3829 /*
3830 * MM enters autmaticly gprs cell search mode so that GMM
3831 * need not to send mmgmm_reg_req (cell_search_only)
3832 */
3833 kern_mm_imsi_detach();
3834 break;
3835 default:
3836 break;
3837 }
3838 }
3839 else
3840 {
3841 SET_STATE ( KERN, KERN_GMM_DEREG_PLMN_SEARCH );
3842 #ifdef FF_EM_MODE
3843 EM_GMM_SET_STATE(KERN_GMM_DEREG_PLMN_SEARCH );
3844 #endif
3845 kern_mm_activate_rr();
3846 }
3847 break;
3848 default:
3849 /*
3850 * class A and B
3851 */
3852 if (GMMREG_AT_IMSI== gmm_data->kern.attach_cap.attach_type)
3853 {
3854 SET_STATE ( KERN, KERN_GMM_NULL_PLMN_SEARCH );
3855 #ifdef FF_EM_MODE
3856 EM_GMM_SET_STATE(KERN_GMM_NULL_PLMN_SEARCH );
3857 #endif
3858 kern_mm_activate_mm();
3859 }
3860 else
3861 {
3862 SET_STATE ( KERN, KERN_GMM_DEREG_PLMN_SEARCH );
3863 #ifdef FF_EM_MODE
3864 EM_GMM_SET_STATE(KERN_GMM_DEREG_PLMN_SEARCH );
3865 #endif
3866
3867 kern_mm_activate_rr();
3868 }
3869 break;
3870 }
3871 }
3872 break;
3873 /* end case KERN_GMM_NULL_IMSI */
3874
3875 case KERN_GMM_DEREG_NO_IMSI:
3876 /*
3877 * this state is not necessary, it is the same as NULL_NO_IMSI
3878 * and will be romoved soon
3879 */
3880
3881 if (SERVICE_MODE_LIMITED == gmm_data->kern.attach_cap.service_mode)
3882 {
3883 SET_STATE (KERN,KERN_GMM_NULL_NO_IMSI_LIMITED_SERVICE_REQ);
3884 #ifdef FF_EM_MODE
3885 EM_GMM_SET_STATE(KERN_GMM_NULL_NO_IMSI_LIMITED_SERVICE_REQ);
3886 #endif
3887 }
3888 else
3889 {
3890 SET_STATE (KERN,KERN_GMM_NULL_NO_IMSI);
3891 #ifdef FF_EM_MODE
3892 EM_GMM_SET_STATE(KERN_GMM_NULL_NO_IMSI);
3893 #endif
3894 }
3895 kern_gmmrr_disable();
3896 kern_mm_activate_mm();
3897 break;
3898
3899 case KERN_GMM_NULL_NO_IMSI:
3900 /*
3901 * Attach Rejected for the first time to enable POWER_OFF
3902 */
3903 if (SERVICE_MODE_LIMITED == gmm_data->kern.attach_cap.service_mode)
3904 {
3905 SET_STATE (KERN,KERN_GMM_NULL_NO_IMSI_LIMITED_SERVICE_REQ);
3906 #ifdef FF_EM_MODE
3907 EM_GMM_SET_STATE(KERN_GMM_NULL_NO_IMSI_LIMITED_SERVICE_REQ);
3908 #endif
3909 }
3910 kern_mm_activate_mm();
3911 break;
3912 case KERN_GMM_NULL_NO_IMSI_LIMITED_SERVICE_REQ:
3913 if ( SERVICE_MODE_LIMITED != gmm_data->kern.attach_cap.service_mode)
3914 {
3915 SET_STATE (KERN,KERN_GMM_NULL_NO_IMSI);
3916 #ifdef FF_EM_MODE
3917 EM_GMM_SET_STATE(KERN_GMM_NULL_NO_IMSI);
3918 #endif
3919 }
3920 kern_mm_activate_mm();
3921 break;
3922 case KERN_GMM_REG_NORMAL_SERVICE:
3923 if (SERVICE_MODE_LIMITED == gmm_data->kern.attach_cap.service_mode)
3924 {
3925 kern_l_sim_rem_reg();
3926 }
3927 else
3928 {
3929 switch ( gmm_data->kern.attach_cap.mobile_class )
3930 {
3931 case GMMREG_CLASS_CC:
3932 if ( GMM_MM_REG_NORMAL_SERVICE == GET_STATE(MM) )
3933 {
3934 kern_gmmreg_attach_cnf ( GMMREG_AT_IMSI );
3935 }
3936 kern_disable();
3937 break;
3938 case GMMREG_CLASS_CG:
3939 if (GMM_MM_DEREG != GET_STATE(MM))
3940 {
3941 if (kern_lai_changed() )
3942 {
3943 switch (gmm_data->kern.sig_cell_info.net_mode)
3944 {
3945 case GMMRR_NET_MODE_I:
3946 kern_rau();
3947 break;
3948 default:
3949 SET_STATE ( KERN, KERN_GMM_REG_SUSPENDING );
3950 #ifdef FF_EM_MODE
3951 EM_GMM_SET_STATE(KERN_GMM_REG_SUSPENDING );
3952 #endif
3953 kern_llgmm_suspend(LLGMM_CALL);
3954 kern_gmmrr_suspend (GMMRR_SUSP_GPRS, GMMRR_NORMAL_RELEASE, GMM_SUSP_LAU);
3955 break;
3956 }
3957 }
3958 else
3959 {
3960 switch (gmm_data->kern.sig_cell_info.net_mode)
3961 {
3962 case GMMRR_NET_MODE_I:
3963 gmm_data->kern.detach_cap.detach_type = GMMREG_DT_IMSI;
3964 kern_detach();
3965 break;
3966 default:
3967 kern_imsi_detach_reg_susp();
3968 break;
3969 }
3970 }
3971 GMM_RETURN;
3972 }
3973 /*
3974 * <R.GMM.AGACCEPT.M.027>,
3975 * <R.GMM.PATTCNF.M.001>
3976 */
3977 else
3978 {
3979 kern_gmmreg_attach_cnf ( GMMREG_AT_GPRS );
3980 }
3981 break;
3982 default:
3983 if (attach_type_changed)
3984 {
3985 /*
3986 * class A and B
3987 */
3988 if ( GMM_MM_REG_NORMAL_SERVICE == GET_STATE(MM) )
3989 {
3990 kern_gmmreg_attach_cnf ( GMMREG_AT_COMB );
3991 }
3992 else
3993 {
3994 /*
3995 * Combined RAU procedure is established
3996 * if GPRS is attached and IMSI should attached
3997 */
3998
3999 kern_rau();
4000 }
4001 }
4002 else
4003 {
4004 kern_mm_reg_req (REG_CELL_SEARCH_ONLY, NORMAL_REG);
4005 }
4006 break;
4007 }
4008 }
4009 break;
4010 case KERN_GMM_REG_SUSPENDED:
4011 case KERN_GMM_REG_SUSPENDING:
4012 if (SERVICE_MODE_LIMITED == gmm_data->kern.attach_cap.service_mode)
4013 {
4014 kern_l_sim_rem_reg_lim ();
4015 break;
4016 }
4017 /*
4018 * Attach requests in suspended mode will be handled after resumption
4019 * by triggering form GRR with GMMRR_CELL_IND
4020 */
4021 break;
4022
4023 case KERN_GMM_REG_NO_CELL_AVAILABLE:
4024 case KERN_GMM_REG_LIMITED_SERVICE:
4025 if (SERVICE_MODE_LIMITED == gmm_data->kern.attach_cap.service_mode)
4026 {
4027 kern_l_sim_rem_reg_lim ();
4028 break;
4029 }
4030 /* NO break */
4031 case KERN_GMM_RAU_INITIATED:
4032 case KERN_GMM_REG_INITIATED:
4033 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE_MM:
4034 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE:
4035
4036 if (SERVICE_MODE_LIMITED == gmm_data->kern.attach_cap.service_mode)
4037 {
4038 kern_l_sim_rem_reg ();
4039 }
4040 else
4041 {
4042 switch ( gmm_data->kern.attach_cap.mobile_class )
4043 {
4044 case GMMREG_CLASS_CC:
4045
4046 gmm_data->kern.detach_cap.detach_type = GMMREG_DT_DISABLE_GPRS;
4047
4048 kern_local_detach( GMMCS_INT_PROTOCOL_ERROR, FALSE, GMM_LOCAL_DETACH_PROC_ENTER_NULL_IMSI); /* TCS 2.1 */
4049 if ( GMM_MM_REG_NORMAL_SERVICE == GET_STATE(MM) )
4050 {
4051 kern_gmmreg_attach_cnf ( GMMREG_AT_IMSI );
4052 }
4053 kern_enter_der();
4054 break;
4055 case GMMREG_CLASS_CG:
4056 if (GMM_MM_DEREG != GET_STATE(MM))
4057 {
4058 if (kern_lai_changed() )
4059 {
4060 switch(GET_STATE(KERN))
4061 {
4062 case KERN_GMM_REG_NO_CELL_AVAILABLE:
4063 case KERN_GMM_RAU_INITIATED:
4064 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE_MM:
4065 case KERN_GMM_REG_ATTEMPTING_TO_UPDATE:
4066 kern_llgmm_suspend(LLGMM_CALL);
4067 break;
4068 default:
4069 break;
4070 }
4071
4072 SET_STATE ( KERN, KERN_GMM_REG_SUSPENDING );
4073 #ifdef FF_EM_MODE
4074 EM_GMM_SET_STATE(KERN_GMM_REG_SUSPENDING );
4075 #endif
4076
4077
4078 kern_gmmrr_suspend (GMMRR_SUSP_GPRS, GMMRR_NORMAL_RELEASE, GMM_SUSP_LAU);
4079 }
4080 else
4081 {
4082 kern_imsi_detach_reg_susp();
4083 }
4084 GMM_RETURN;
4085 }
4086 else
4087 /*
4088 * <R.GMM.AGACCEPT.M.027>,
4089 * <R.GMM.PATTCNF.M.001>
4090 */
4091 {
4092 if (KERN_GMM_REG_INITIATED!=GET_STATE(KERN))
4093 {
4094 kern_gmmreg_attach_cnf ( GMMREG_AT_GPRS );
4095 }
4096 }
4097 break;
4098 default:
4099
4100 {
4101 kern_mm_reg_req (REG_CELL_SEARCH_ONLY, NORMAL_REG);
4102 }
4103 break;
4104 }
4105 }
4106 break;
4107 default:
4108 TRACE_ERROR( "GMMREG_ATTACH_REQ unexpected" );
4109 break;
4110
4111 }
4112 GMM_RETURN;
4113 } /* kern_gmmreg_attach_req() */
4114
4115
4116 /*
4117 +------------------------------------------------------------------------------
4118 | Function : kern_gmmsm_sequence_res
4119 +------------------------------------------------------------------------------
4120 | Description : Handles the primitive GMMSM_SEQENCE_RES
4121 |
4122 | Parameters : *gmmsm_sequence_res - Ptr to primitive payload
4123 |
4124 +------------------------------------------------------------------------------
4125 */
4126 #ifdef GMM_TCS4
4127 GLOBAL void kern_gmmsm_sequence_res ( T_MMPM_SEQUENCE_RES *gmmsm_sequence_res )
4128 #else
4129 GLOBAL void kern_gmmsm_sequence_res ( T_GMMSM_SEQUENCE_RES *gmmsm_sequence_res )
4130 #endif
4131 {
4132 GMM_TRACE_FUNCTION( "kern_gmmsm_sequence_res" );
4133
4134
4135 switch( GET_STATE( KERN ) )
4136 {
4137 case KERN_GMM_RAU_WAIT_FOR_NPDU_LIST:
4138 {
4139 int i=0;
4140 MCAST (routing_area_update_complete, ROUTING_AREA_UPDATE_COMPLETE);
4141 routing_area_update_complete->v_receive_n_pdu_number_list = TRUE;
4142 routing_area_update_complete->receive_n_pdu_number_list.
4143 c_receive_n_pdu_number_list_val = gmmsm_sequence_res->c_npdu_list;
4144
4145 for (i=0;i<routing_area_update_complete->receive_n_pdu_number_list.c_receive_n_pdu_number_list_val;i++)
4146 {
4147 routing_area_update_complete
4148 ->receive_n_pdu_number_list.receive_n_pdu_number_list_val[i]
4149 .nsapi
4150 = gmmsm_sequence_res->npdu_list[i].nsapi;
4151
4152 routing_area_update_complete
4153 ->receive_n_pdu_number_list.receive_n_pdu_number_list_val[i]
4154 .receive_n_pdu_number_val
4155
4156 = gmmsm_sequence_res->npdu_list[i].receive_n_pdu_number_val;
4157
4158 }
4159
4160 PFREE (gmmsm_sequence_res);
4161 kern_rau_complete (gmm_data->kern.attach_cap.result_type);
4162
4163 break;
4164 }
4165 default:
4166 PFREE (gmmsm_sequence_res);
4167 TRACE_ERROR( "GMMSM_SEQUENCE_RES received in an unusual state." );
4168 break;
4169 }
4170 GMM_RETURN;
4171 } /* kern_gmmsm_sequence_res() */
4172
4173 /*TI DK primitive*/
4174 #ifdef REL99
4175 /*+------------------------------------------------------------------------------
4176 | Function : kern_gmmsm_pdp_status_req
4177 +------------------------------------------------------------------------------
4178 | Description : Handles the primitive GMMSM_PDP_STATUS_REQ
4179 |
4180 | Parameters : *gmmsm_pdp_status_req - Ptr to primitive payload
4181 |
4182 +------------------------------------------------------------------------------
4183 */
4184 GLOBAL void kern_gmmsm_pdp_status_req ( T_MMPM_PDP_CONTEXT_STATUS_REQ *gmmsm_pdp_status_req )
4185
4186 {
4187 GMM_TRACE_FUNCTION( "kern_gmmsm_pdp_status_req" );
4188
4189 /* Store the data in context */
4190 gmm_data->kern.attach_cap.pdp_context_status =
4191 gmmsm_pdp_status_req->nsapi_set;
4192
4193 GMM_RETURN;
4194 } /* kern_gmmsm_pdp_status_req() */
4195 #endif
4196
4197 /*
4198 +------------------------------------------------------------------------------
4199 | Function : kern_mmgmm_ciphering_ind
4200 +------------------------------------------------------------------------------
4201 | Description : forwards the ciphering indicator of GSM to MMI
4202 |
4203 | Parameters : *mmgmm_ciphering_ind - Ptr to primitive payload
4204 |
4205 +------------------------------------------------------------------------------
4206 */
4207 GLOBAL void kern_mmgmm_ciphering_ind ( T_MMGMM_CIPHERING_IND *mmgmm_ciphering_ind )
4208 {
4209 GMM_TRACE_FUNCTION( "kern_mmgmm_ciphering_ind" );
4210 {
4211 PALLOC (gmmreg_ciphering_ind, GMMREG_CIPHERING_IND);
4212 gmmreg_ciphering_ind->gsm_ciph = mmgmm_ciphering_ind->ciph;
4213 /*
4214 * do not include the ciphering status of gprs purposely to have the
4215 * behaviour for GSM and for GPRS (do not remember the status of the other!)
4216 */
4217 gmmreg_ciphering_ind->gprs_ciph = CIPH_NA;
4218 PFREE ( mmgmm_ciphering_ind );
4219 PSEND ( hCommMMI, gmmreg_ciphering_ind );
4220 }
4221 GMM_RETURN;
4222 } /* kern_mmgmm_ciphering_ind() */
4223 /*
4224 +------------------------------------------------------------------------------
4225 | Function : kern_mmgmm_tmsi_ind
4226 +------------------------------------------------------------------------------
4227 | Description : forwards the TMSI received in MM to GMM
4228 |
4229 | Parameters : *mmgmm_tmsi_ind - Ptr to primitive payload
4230 |
4231 +------------------------------------------------------------------------------
4232 */
4233 GLOBAL void kern_mmgmm_tmsi_ind ( T_MMGMM_TMSI_IND *mmgmm_tmsi_ind )
4234 {
4235 GMM_TRACE_FUNCTION( "kern_mmgmm_tmsi_ind" );
4236 gmm_data->tmsi = mmgmm_tmsi_ind->tmsi;
4237 TRACE_1_PARA("TMSI %x", gmm_data->tmsi );
4238 PFREE ( mmgmm_tmsi_ind );
4239 GMM_RETURN;
4240 } /* kern_mmgmm_ciphering_ind() */
4241
4242 /*
4243 +------------------------------------------------------------------------------
4244 | Function : kern_mmgmm_ahplmn_ind
4245 +------------------------------------------------------------------------------
4246 | Description : forwards the ahplmn indicator to MMI
4247 |
4248 | Parameters : *mmgmm_ahplmn_ind - Ptr to primitive payload
4249 |
4250 +------------------------------------------------------------------------------
4251 */
4252 GLOBAL void kern_mmgmm_ahplmn_ind ( T_MMGMM_AHPLMN_IND *mmgmm_ahplmn_ind )
4253 {
4254 GMM_TRACE_FUNCTION( "kern_mmgmm_ahplmn_ind" );
4255 {
4256 PPASS (mmgmm_ahplmn_ind, gmmreg_ahplmn_ind, GMMREG_AHPLMN_IND);
4257 PSEND ( hCommMMI, gmmreg_ahplmn_ind );
4258 }
4259 GMM_RETURN;
4260 } /* kern_mmgmm_ahplmn_ind() */