104
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 +-----------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 | Project : GSM-PS (8410)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 | Modul : MM_REGS
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 +-----------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 | Copyright 2002 Texas Instruments Berlin, AG
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 | All rights reserved.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 | This file is confidential and a trade secret of Texas
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 | Instruments Berlin, AG
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 | The receipt of or possession of this file does not convey
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 | any rights to reproduce or disclose its contents or to
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 | manufacture, use, or sell anything it may describe, in
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 | whole, or in part, without the specific written consent of
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 | Texas Instruments Berlin, AG.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 +-----------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 | Purpose : This Modul defines the functions for the registration
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 | capability of the module Mobility Managemant.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 +-----------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 #ifndef MM_REGS_C
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 #define MM_REGS_C
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 #define ENTITY_MM
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 /*==== INCLUDES ===================================================*/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 #if defined (NEW_FRAME)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 #include <string.h>
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 #include <stdlib.h>
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 #include <stddef.h>
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 #include "typedefs.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 #include "pcm.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 #include "pconst.cdg"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 #include "mconst.cdg"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 #include "message.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 #include "ccdapi.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 #include "vsi.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 #include "custom.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 #include "gsm.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 #include "prim.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 #include "cnf_mm.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 #include "mon_mm.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 #include "pei.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 #include "tok.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 #include "mm.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 #else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 #include <string.h>
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 #include <stdlib.h>
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 #include <stddef.h>
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 #include "stddefs.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 #include "pcm.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 #include "pconst.cdg"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 #include "mconst.cdg"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 #include "message.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 #include "ccdapi.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 #include "custom.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 #include "gsm.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 #include "prim.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 #include "cnf_mm.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 #include "mon_mm.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 #include "vsi.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 #include "pei.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 #include "tok.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 #include "mm.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 /*==== EXPORT =====================================================*/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 /*==== PRIVAT =====================================================*/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 /*==== VARIABLES ==================================================*/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 /*==== FUNCTIONS ==================================================*/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 /*==== TEST =====================================================*/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 * -------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 * SIGNAL Processing functions
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 * -------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 | PROJECT : GSM-PS (6147) MODULE : MM_REG |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 | STATE : code ROUTINE : reg_mmr_auth_ind |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 PURPOSE : Process the signal MMR_AUTH_IND.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 GLOBAL void reg_mmr_auth_ind (T_SIM_AUTHENTICATION_REQ *sim_auth_req)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 GET_INSTANCE_DATA;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 MCAST (auth_req, D_AUTH_REQ);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 TRACE_FUNCTION ("reg_mmr_auth_ind()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 if(mm_data->last_auth_req_id != NOT_PRESENT_8BIT)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 mm_data->last_auth_req_id++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 mm_data->last_auth_req_id = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
111
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
112 sim_auth_req->source = SRC_MM;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 sim_auth_req->req_id = mm_data->last_auth_req_id;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
114 sim_auth_req->cksn = auth_req->ciph_key_num.key_seq;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
115 memcpy (sim_auth_req->rand, auth_req->auth_rand.rand,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
116 sizeof (sim_auth_req->rand));
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
117 PSENDX (SIM, sim_auth_req);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
118 if (mm_data->last_auth_req_id != 0)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
119 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
120 /* problem occurred!!!! */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
121 #ifdef WIN32
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
122 vsi_o_ttrace (VSI_CALLER TC_FUNC,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
123 "Authentication problem occurred %d", mm_data->last_auth_req_id);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
124 #endif /* WIN32 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
125 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
126
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
127 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
128
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
129
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
130 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
131 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
132 | PROJECT : GSM-PS (6147) MODULE : MM_REG |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
133 | STATE : code ROUTINE : reg_net_list |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
134 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
135
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
136 PURPOSE : Build a list of available PLMNs for the MMI.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
137 Use the information received from RR to update MM's
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
138 internal PLMN list used for MM's own operation.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
139
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
140 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
141
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
142 #if 0 // The old code
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
143 GLOBAL void reg_net_list (const T_RR_ABORT_IND *rr_abort_ind)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
144 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
145 TRACE_FUNCTION ("reg_net_list()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
146
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
147 /* Create the PLMN list for the MMI and send it */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
148 reg_create_plmn_list (rr_abort_ind, WITH_ALL_PLMNS);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
149
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
150 if (mm_data->reg.plmn_cnt EQ 0)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
151 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
152 if ((rr_abort_ind->op.service NEQ NO_SERVICE) AND
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
153 (rr_abort_ind->cause EQ RRCS_ABORT_CEL_SEL_FAIL))
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
154 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
155 mm_mmgmm_plmn_ind (MMCS_PLMN_NOT_IDLE_MODE);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
156 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
157 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
158 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
159 mm_mmgmm_plmn_ind (MMCS_SUCCESS);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
160 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
161 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
162 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
163 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
164 mm_mmgmm_plmn_ind (MMCS_SUCCESS);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
165 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
166
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
167 /* Do not consider the forbidden PLMN's for MM's internal operation */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
168 reg_create_plmn_list (rr_abort_ind, WITH_OTHER_PLMNS);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
169
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
170 switch (rr_abort_ind->op.service)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
171 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
172 case NO_SERVICE:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
173 mm_mmgmm_nreg_ind (NREG_NO_SERVICE,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
174 SEARCH_NOT_RUNNING,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
175 FORB_PLMN_NOT_INCLUDED);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
176 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
177
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
178 case LIMITED_SERVICE:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
179 mm_mmgmm_nreg_ind (NREG_LIMITED_SERVICE,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
180 SEARCH_NOT_RUNNING,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
181 FORB_PLMN_NOT_INCLUDED);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
182 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
183
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
184 case FULL_SERVICE:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
185 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
186
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
187 default: /* All possible values caught, this is garbage */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
188 TRACE_ERROR (UNEXPECTED_DEFAULT);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
189 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
190 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
191 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
192 #else // The new code
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
193 GLOBAL void reg_net_list (const T_RR_ABORT_IND *rr_abort_ind)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
194 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
195 GET_INSTANCE_DATA;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
196 TRACE_FUNCTION ("reg_net_list()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
197
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
198 if (rr_abort_ind->plmn_avail EQ 0)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
199 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
200 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
201 * Distinguish between "no PLMN found" and search aborted
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
202 * due to eg. paging in RR. In the future, we may introduce
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
203 * a proper cause in the RR_ABORT_IND to distinguish this,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
204 * this here should work but is ugly.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
205 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
206 if ((rr_abort_ind->op.service NEQ NO_SERVICE) AND
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
207 (rr_abort_ind->cause EQ RRCS_ABORT_CEL_SEL_FAIL))
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
208 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
209 mm_mmgmm_plmn_ind (MMCS_PLMN_NOT_IDLE_MODE, NULL);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
210 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
211 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
212 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
213 mm_mmgmm_plmn_ind (MMCS_SUCCESS, rr_abort_ind);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
214 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
215 mm_data->reg.plmn_cnt = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
216 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
217 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
218 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
219 mm_mmgmm_plmn_ind (MMCS_SUCCESS, rr_abort_ind);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
220 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
221
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
222 switch (rr_abort_ind->op.service)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
223 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
224 case NO_SERVICE:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
225 mm_mmgmm_nreg_ind (NREG_NO_SERVICE,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
226 SEARCH_NOT_RUNNING,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
227 FORB_PLMN_NOT_INCLUDED);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
228 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
229
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
230 case LIMITED_SERVICE:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
231 mm_mmgmm_nreg_ind (NREG_LIMITED_SERVICE,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
232 SEARCH_NOT_RUNNING,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
233 FORB_PLMN_NOT_INCLUDED);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
234 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
235
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
236 case FULL_SERVICE:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
237 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
238
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
239 default: /* All possible values caught, this is garbage */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
240 TRACE_ERROR (UNEXPECTED_DEFAULT);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
241 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
242 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
243 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
244 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
245
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
246 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
247 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
248 | PROJECT : GSM-PS (6147) MODULE : MM_REG |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
249 | STATE : code ROUTINE : reg_rr_failure |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
250 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
251
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
252 PURPOSE : Indication from MM/RR about unsuccessfull cell selection.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
253 The new service and the found PLMN indications are for-
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
254 warded to MM.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
255
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
256 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
257
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
258 GLOBAL void reg_rr_failure (T_RR_ABORT_IND *rr_abort_ind)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
259 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
260 GET_INSTANCE_DATA;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
261 unsigned i;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
262 BOOL actual_plmn_found;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
263
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
264 TRACE_FUNCTION ("reg_rr_failure()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
265
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
266 #if defined (WIN32)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
267 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
268 TRACE_EVENT_P1 ("PLMN_AVAIL = %d", rr_abort_ind->plmn_avail);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
269
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
270 for (i = 0 ;i < rr_abort_ind->plmn_avail; i++)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
271 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
272 TRACE_EVENT_P6 ("MCC=%x%x%x MNC=%x%x%x",
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
273 rr_abort_ind->plmn[i].mcc[0],
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
274 rr_abort_ind->plmn[i].mcc[1],
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
275 rr_abort_ind->plmn[i].mcc[2],
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
276 rr_abort_ind->plmn[i].mnc[0],
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
277 rr_abort_ind->plmn[i].mnc[1],
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
278 rr_abort_ind->plmn[i].mnc[2]);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
279 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
280 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
281 #endif /* #if defined (WIN32) */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
282
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
283 if (rr_abort_ind->plmn_avail EQ 0 OR
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
284 mm_data->reg.op.sim_ins EQ SIM_NO_INSRT)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
285 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
286 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
287 * No PLMN delivered by RR to build a PLMN list or no SIM present
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
288 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
289 switch (rr_abort_ind->op.service)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
290 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
291 case NO_SERVICE:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
292 mm_mmgmm_nreg_ind (NREG_NO_SERVICE,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
293 SEARCH_NOT_RUNNING,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
294 FORB_PLMN_NOT_INCLUDED);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
295 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
296
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
297 case LIMITED_SERVICE:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
298 mm_mmgmm_nreg_ind (NREG_LIMITED_SERVICE,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
299 SEARCH_NOT_RUNNING,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
300 FORB_PLMN_NOT_INCLUDED);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
301 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
302
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
303 default: /* eg. FULL_SERVICE and reg_rr_failure => nonsense */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
304 TRACE_ERROR (UNEXPECTED_DEFAULT);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
305 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
306 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
307
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
308 /* Delete the PLMN list, currently no PLMN available */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
309 mm_data->reg.plmn_cnt = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
310
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
311 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
312 // First make sure to understand completely the underlying problem...
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
313 // Patch HM 11.06.01, clear PLMN list in ACI and MM >>>
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
314 mm_mmgmm_plmn_ind (MMCS_SUCCESS, rr_abort_ind);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
315 // Patch HM 11.06.01, clear PLMN list in ACI and MM <<<
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
316 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
317
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
318 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
319 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
320 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
321 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
322 * At least one PLMN found and SIM present, create PLMN list.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
323 * Depending on the selected mode (automatic or manual),
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
324 * either select the next available PLMN or present the
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
325 * list of PLMNs possibly providing full service to the user.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
326 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
327 switch (mm_data->reg.op.m)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
328 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
329 case MODE_AUTO:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
330 // Note: There are better algorithms to decide whether an update
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
331 // of the PLMN list is necessary or not, but for these we need the
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
332 // information from RR whether a found PLMN/location area is
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
333 // forbidden. This becomes especially TRUE for an exhausted PLMN
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
334 // list as we waste a lot of battery here if there is no location
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
335 // area suitable for full service available, but a lot of location
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
336 // areas on VPLMNs which are forbidden for roaming. In this case we
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
337 // run in a loop senseless activating VPLMN which don't provide
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
338 // full service at all.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
339 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
340 * Don't update the PLMN list if the actual PLMN is a member
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
341 * of the PLMN list delivered by RR and the current list is
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
342 * non-exhaused.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
343 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
344 actual_plmn_found = FALSE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
345
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
346 if (mm_data->reg.plmn_cnt > mm_data->reg.plmn_index)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
347 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
348 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
349 * There is a non-exhausted list present in MM.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
350 * Check whether the actual PLMN is a member.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
351 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
352 for (i = 0; i < rr_abort_ind->plmn_avail; i++)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
353 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
354 if (reg_plmn_equal_sim (&rr_abort_ind->plmn[i],
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
355 &mm_data->reg.actual_plmn))
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
356 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
357 actual_plmn_found = TRUE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
358 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
359 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
360 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
361 if (!actual_plmn_found)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
362 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
363 /* The requested PLMN was not found. Update outdated list. */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
364 reg_create_plmn_list (rr_abort_ind, WITH_OTHER_PLMNS);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
365 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
366 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
367 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
368 TRACE_EVENT ("PLMN list ignored");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
369 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
370 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
371 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
372 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
373 /* No non-exhaused list present in MM. Take the new list from RR */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
374 reg_create_plmn_list (rr_abort_ind, WITH_OTHER_PLMNS);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
375 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
376
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
377 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
378 * Select the next PLMN if available
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
379 * else indicate LIMITED SERVICE to MMI
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
380 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
381 reg_plmn_select (FORB_PLMN_NOT_INCLUDED);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
382 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
383
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
384 case MODE_MAN:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
385 reg_create_plmn_list (rr_abort_ind, WITH_ALL_PLMNS);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
386
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
387 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
388 * Forward the PLMN list to MMI for selection
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
389 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
390 switch (rr_abort_ind->op.service)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
391 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
392 case NO_SERVICE:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
393 mm_mmgmm_nreg_ind (NREG_NO_SERVICE,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
394 SEARCH_NOT_RUNNING,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
395 FORB_PLMN_NOT_INCLUDED);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
396 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
397
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
398 case LIMITED_SERVICE:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
399 mm_mmgmm_nreg_ind (NREG_LIMITED_SERVICE,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
400 SEARCH_NOT_RUNNING,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
401 FORB_PLMN_NOT_INCLUDED);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
402 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
403
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
404 default: /* eg. FULL_SERVICE and reg_rr_failure => nonsense */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
405 TRACE_ERROR (UNEXPECTED_DEFAULT);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
406 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
407 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
408 mm_data->plmn_scan_mmi = TRUE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
409 mm_mmgmm_plmn_ind (MMCS_SUCCESS, rr_abort_ind);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
410 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
411
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
412 default: /* No mode left */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
413 TRACE_ERROR (UNEXPECTED_DEFAULT);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
414 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
415 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
416 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
417 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
418
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
419
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
420 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
421 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
422 | PROJECT : GSM-PS (6147) MODULE : MM_REG |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
423 | STATE : code ROUTINE : reg_mm_success |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
424 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
425
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
426 PURPOSE : MM indicates successfull registration.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
427
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
428 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
429
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
430 GLOBAL void reg_mm_success (UBYTE service)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
431 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
432 GET_INSTANCE_DATA;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
433 TRACE_FUNCTION ("reg_mm_success()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
434
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
435 if (mm_data->reg.op.sim_ins EQ SIM_NO_INSRT)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
436 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
437 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
438 * No SIM is inserted
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
439 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
440 mm_mmgmm_nreg_ind (NREG_LIMITED_SERVICE,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
441 SEARCH_NOT_RUNNING,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
442 FORB_PLMN_NOT_INCLUDED);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
443 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
444 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
445 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
446 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
447 * SIM is inserted
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
448 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
449 if (service EQ LIMITED_SERVICE)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
450 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
451 mm_mmgmm_nreg_ind (NREG_LIMITED_SERVICE,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
452 SEARCH_NOT_RUNNING,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
453 FORB_PLMN_NOT_INCLUDED);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
454 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
455 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
456 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
457 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
458 * Send new PLMN identification to MMI or GMM.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
459 * In case we compile for a GPRS protocol stack,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
460 * we will not indicate end of procedure (entering IDLE state)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
461 * by MMGMM_REG_CNF, but sending an intermediate result (full service)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
462 * by MMGMM_LUP_ACCEPT_IND.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
463 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
464 #ifdef GPRS
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
465 if (mm_data->gprs.reg_cnf_on_idle_entry)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
466 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
467 mm_mmgmm_lup_accept_ind ();
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
468 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
469 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
470 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
471 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
472 mm_mmgmm_reg_cnf ();
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
473 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
474
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
475 /* Check HPLMN timer state */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
476 reg_check_hplmn_tim (mm_data->reg.thplmn);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
477
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
478 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
479 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
480 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
481
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
482
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
483 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
484 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
485 | PROJECT : GSM-PS (6147) MODULE : MM_REG |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
486 | STATE : code ROUTINE : reg_mm_cell_selected |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
487 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
488
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
489 PURPOSE : MM indicates successfull cell selection.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
490
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
491 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
492
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
493 GLOBAL void reg_mm_cell_selected (void)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
494 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
495 GET_INSTANCE_DATA;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
496 TRACE_FUNCTION ("reg_mm_cell_selected()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
497
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
498 if (mm_gsm_alone() AND
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
499 mm_data->reg.op.sim_ins EQ SIM_INSRT)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
500 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
501 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
502 * GPRS is inactive (GSM only mobile or GPRS deactivated) AND
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
503 * a valid SIM is inserted. These are the prerequisites to indicate
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
504 * full service to the MMI after cell selection.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
505 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
506 if (!mm_normal_upd_needed())
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
507 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
508 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
509 * If no normal update is needed, the next service state
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
510 * is "normal service" regardless of the need of an IMSI
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
511 * ATTACH. Normal calls are possible, so we have to indicate
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
512 * full service to the MMI.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
513 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
514 mm_mmgmm_reg_cnf ();
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
515 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
516 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
517 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
518
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
519 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
520 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
521 | PROJECT : GSM-PS (6147) MODULE : MM_REG |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
522 | STATE : code ROUTINE : reg_mm_failure |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
523 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
524
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
525 PURPOSE : MM indicates an internal failure during location updating.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
526
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
527 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
528
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
529 GLOBAL void reg_mm_failure (UBYTE forb_ind)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
530 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
531 GET_INSTANCE_DATA;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
532 TRACE_FUNCTION ("reg_mm_failure()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
533
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
534 if (!mm_lup_allowed_by_gmm())
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
535 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
536 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
537 * Call of function caused by MMGMM_ATTACH_REJ_REQ
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
538 * and not by own failed LOCATION UPDATING ATTEMPT - or -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
539 * by MMGMM_NREG_REQ with (cs EQ CS_DISABLE).
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
540 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
541
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
542 // This means, in automatic mode we wait for a
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
543 // GMM decision to try a location update in automatic
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
544 // mode if there are further networks present.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
545 // We have to discuss this item for network mode I!
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
546
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
547 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
548 * Check whether the MM failure was caused by MMGMM_NREG_REQ.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
549 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
550 if (mm_data->nreg_request)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
551 mm_mmgmm_nreg_cnf (mm_data->nreg_cause);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
552 return;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
553 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
554
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
555 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
556 * The MM failure was caused by MM's own location updating procedure,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
557 * LOCATION UPDATING REJECT message has been received.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
558 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
559
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
560 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
561 * In automatic mode with valid SIM, select the next PLMN if available
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
562 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
563 reg_plmn_select (forb_ind);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
564 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
565
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
566 #endif
|