FreeCalypso > hg > fc-magnetite
comparison src/g23m-gsm/rr/rr_attp.c @ 104:27a4235405c6
src/g23m-gsm: import from LoCosto source
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 04 Oct 2016 18:24:05 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
103:76d139c7a25e | 104:27a4235405c6 |
---|---|
1 /* | |
2 +----------------------------------------------------------------------------- | |
3 | Project : | |
4 | Modul : | |
5 +----------------------------------------------------------------------------- | |
6 | Copyright 2002 Texas Instruments Berlin, AG | |
7 | All rights reserved. | |
8 | | |
9 | This file is confidential and a trade secret of Texas | |
10 | Instruments Berlin, AG | |
11 | The receipt of or possession of this file does not convey | |
12 | any rights to reproduce or disclose its contents or to | |
13 | manufacture, use, or sell anything it may describe, in | |
14 | whole, or in part, without the specific written consent of | |
15 | Texas Instruments Berlin, AG. | |
16 +----------------------------------------------------------------------------- | |
17 | Purpose : This module defines the functions for the attachment | |
18 | capability of the module Radio Resource. | |
19 +----------------------------------------------------------------------------- | |
20 */ | |
21 | |
22 #ifndef RR_ATTP_C | |
23 #define RR_ATTP_C | |
24 | |
25 #define ENTITY_RR | |
26 | |
27 /*==== INCLUDES ===================================================*/ | |
28 | |
29 #include <string.h> | |
30 #include <stdlib.h> | |
31 #include <stddef.h> /* offsetof */ | |
32 #include "typedefs.h" | |
33 #include "pcm.h" | |
34 #include "pconst.cdg" | |
35 #include "mconst.cdg" | |
36 #include "message.h" | |
37 #include "ccdapi.h" | |
38 #include "vsi.h" | |
39 #include "custom.h" | |
40 #include "gsm.h" | |
41 #include "prim.h" | |
42 #include "cnf_rr.h" | |
43 #include "tok.h" | |
44 #include "rr.h" | |
45 #include "rr_em.h" | |
46 #include "cl_shrd.h" | |
47 | |
48 #if defined (_SIMULATION_) | |
49 #include <stdio.h> | |
50 #endif | |
51 | |
52 | |
53 /*==== EXPORT =====================================================*/ | |
54 | |
55 /*==== PRIVATE =====================================================*/ | |
56 /*==== PROTOTYPES =================================================*/ | |
57 | |
58 LOCAL void att_align_sc_meas (T_MPH_MEASUREMENT_IND * mph_meas_ind, | |
59 UBYTE index); | |
60 | |
61 /*==== VARIABLES ==================================================*/ | |
62 /* | |
63 * ------------------------------------------------------------------- | |
64 * PRIMITIVE Processing functions | |
65 * ------------------------------------------------------------------- | |
66 */ | |
67 | |
68 /* | |
69 +--------------------------------------------------------------------+ | |
70 | PROJECT : GSM-PS (6147) MODULE : RR_ATT | | |
71 | STATE : code ROUTINE : att_mph_error_ind | | |
72 +--------------------------------------------------------------------+ | |
73 | |
74 PURPOSE : Process the primitive MPH_ERROR_IND received from PL. | |
75 | |
76 */ | |
77 | |
78 #define MAX_ERROR_CS 9 | |
79 #define MAX_ERROR_IDLE 4 | |
80 | |
81 GLOBAL void att_mph_error_ind (T_MPH_ERROR_IND *mph_error_ind) | |
82 { | |
83 GET_INSTANCE_DATA; | |
84 UBYTE index; | |
85 | |
86 TRACE_FUNCTION ("att_mph_error_ind()"); | |
87 | |
88 switch (GET_STATE (STATE_ATT)) | |
89 { | |
90 case ATT_CS2: | |
91 /* | |
92 * during cell selection | |
93 */ | |
94 switch (mph_error_ind->cs) | |
95 { | |
96 case CS_BCCH_READ_ERROR: | |
97 /* | |
98 * BCCH read error | |
99 */ | |
100 rr_data->bcch_error++; | |
101 if (rr_data->bcch_error EQ MAX_ERROR_CS) | |
102 { | |
103 /* | |
104 * maximum of BCCH read errors reached | |
105 * start next sync request if possible | |
106 */ | |
107 rr_data->bcch_error = 0; | |
108 srv_clear_list (&rr_data->cr_data.cd.ncell_list); | |
109 if (cs_sync_next ()) | |
110 { | |
111 SET_STATE (STATE_ATT, ATT_CS1); | |
112 } | |
113 break; | |
114 } | |
115 break; | |
116 | |
117 case CS_DOWN_LINK_FAIL: | |
118 /* | |
119 * downlink failure, | |
120 * layer 1 has received too many undecodable paging messages | |
121 * that means the synchronisation to the BS is lost | |
122 */ | |
123 TRACE_EVENT ("downlink failure"); | |
124 | |
125 EM_DOWNLINK_FAILURE; | |
126 | |
127 /* | |
128 * stop the controlling timer | |
129 */ | |
130 TIMERSTOP (T_RESELECT); | |
131 | |
132 /* | |
133 * start cell selection, actually its questionable | |
134 * if this ever happens, maybe except for the primitive crossing | |
135 * case | |
136 */ | |
137 /*XY:n don't inform GRR, but call start_cs anyway */ | |
138 #ifdef GPRS | |
139 att_start_cell_selection_gprs ((UBYTE)(rr_data->sc_data.mm_started),FULL_SEARCH_MODE); | |
140 #else | |
141 att_start_cell_selection (rr_data->sc_data.mm_started, CS_NOT_PARALLEL,FULL_SEARCH_MODE); | |
142 #endif | |
143 break; | |
144 | |
145 } | |
146 break; | |
147 | |
148 case ATT_CS3: | |
149 /* | |
150 * during cell reselection | |
151 */ | |
152 switch (mph_error_ind->cs) | |
153 { | |
154 case CS_BCCH_READ_ERROR: | |
155 /* | |
156 * BCCH read error | |
157 */ | |
158 rr_data->bcch_error++; | |
159 TRACE_EVENT_P2 ("bcch_error=%u (%u)", rr_data->bcch_error, MAX_ERROR_CS); | |
160 if (rr_data->bcch_error EQ MAX_ERROR_CS) | |
161 { | |
162 /* | |
163 * the maximum of read errors is reached | |
164 * try the next cell for cell reselection | |
165 */ | |
166 #ifdef GPRS | |
167 if(rr_data->gprs_data.cr_pbcch_active EQ TRUE) | |
168 { | |
169 att_cell_reselection_gprs_failed(); | |
170 } | |
171 else | |
172 { | |
173 #endif | |
174 rr_data->bcch_error = 0; | |
175 rr_data->pag_rec = FALSE; | |
176 srv_clear_stored_prim (MPH_PAGING_IND); | |
177 att_continue_cell_reselect (); | |
178 #ifdef GPRS | |
179 } | |
180 #endif | |
181 } | |
182 break; | |
183 | |
184 case CS_DOWN_LINK_FAIL: | |
185 /* | |
186 * downlink failure, | |
187 * layer 1 has received too many undecodable paging messages | |
188 * that means the synchronisation to the BS is lost | |
189 */ | |
190 TRACE_EVENT ("downlink failure"); | |
191 EM_DOWNLINK_FAILURE; | |
192 | |
193 | |
194 /* | |
195 * try the next candidate for the cell reselection | |
196 */ | |
197 att_continue_cell_reselect () ; | |
198 break; | |
199 | |
200 case CS_NC_SYNC_FAILED: | |
201 /* | |
202 * Cell has no valid synchronization information | |
203 */ | |
204 TRACE_EVENT ("No Valid Sync info"); | |
205 | |
206 /* | |
207 * try the next candidate for the cell reselection | |
208 */ | |
209 att_continue_cell_reselect () ; | |
210 break; | |
211 | |
212 } | |
213 break; | |
214 | |
215 case ATT_DEDICATED: | |
216 /* | |
217 * during dedicated mode | |
218 */ | |
219 switch (mph_error_ind->cs) | |
220 { | |
221 case CS_RADIO_LINK_FAIL: | |
222 /* | |
223 * radio link failure. | |
224 * That means layer 1 has received too many | |
225 * undecodable SACCH blocks in the downlink | |
226 * The synchronisation to the BS is lost. | |
227 */ | |
228 TRACE_EVENT ("radio link failure"); | |
229 | |
230 /* | |
231 * dynamic configuration command : IHO | |
232 * Lock the DUT to the cell it is already camping - | |
233 * Ignore the Radio Link Failures. | |
234 */ | |
235 | |
236 if(rr_data->dyn_config.iho AND (rr_data->sc_data.ch_mode EQ CM_AMR)) | |
237 { | |
238 TRACE_EVENT("MPH_ERROR_IND : IHO"); | |
239 } | |
240 else | |
241 { | |
242 EM_RADIO_LINK_FAILURE; | |
243 | |
244 rr_data->net_lost = TRUE; | |
245 | |
246 /* | |
247 * Inform MM about the radio link failure and | |
248 * start cell reslection | |
249 */ | |
250 att_code_rr_abort_ind (RRCS_ABORT_RAD_LNK_FAIL); | |
251 att_stop_dedicated(); | |
252 } | |
253 break; | |
254 } | |
255 break; | |
256 | |
257 case ATT_IDLE: | |
258 case ATT_CON_EST: | |
259 /* | |
260 * during idle mode or connection establishment | |
261 */ | |
262 switch (mph_error_ind->cs) | |
263 { | |
264 case CS_BCCH_READ_ERROR: | |
265 /* | |
266 * A BCCH read error has occured. | |
267 * It is checked whether the BCCH reading | |
268 * is done for a PLMN search activity | |
269 * originated by RR, else it is ignored. | |
270 */ | |
271 index = att_get_index (mph_error_ind->arfcn); | |
272 if (index EQ CR_INDEX) | |
273 { | |
274 rr_data->bcch_error++; | |
275 if (rr_data->bcch_error EQ MAX_ERROR_IDLE) | |
276 { | |
277 /* | |
278 * if the maximum of read errors is reached | |
279 * the next cell is tried. | |
280 */ | |
281 rr_data->bcch_error = 0; | |
282 TIMERSTOP (T_RESELECT); | |
283 srv_clear_list (&rr_data->cr_data.cd.ncell_list); | |
284 cs_sync_next (); | |
285 } | |
286 break; | |
287 } | |
288 break; | |
289 | |
290 case CS_DOWN_LINK_FAIL: | |
291 /* | |
292 * downlink failure | |
293 */ | |
294 TRACE_EVENT ("downlink failure"); | |
295 EM_DOWNLINK_FAILURE; | |
296 | |
297 rr_data->net_lost = TRUE; | |
298 | |
299 if(GET_STATE (STATE_ATT) EQ ATT_CON_EST) | |
300 { | |
301 switch (rr_data->ms_data.establish_cause) | |
302 { | |
303 #ifdef GPRS | |
304 case ESTCS_GPRS_1P: | |
305 case ESTCS_GPRS_SB: | |
306 case ESTCS_GPRS_PAGING: | |
307 SET_STATE(STATE_GPRS, GPRS_PIM_BCCH); | |
308 break; | |
309 case ESTCS_PAGING: | |
310 dat_rr_release_ind(RRCS_ABNORM_UNSPEC, 0); | |
311 #else | |
312 case ESTCS_PAGING: | |
313 #endif | |
314 break; | |
315 default: | |
316 dat_rr_release_ind(RRCS_ABNORM_UNSPEC, 0); | |
317 break; | |
318 } | |
319 } | |
320 | |
321 /* | |
322 * Only start reselection, if isnīt any PLMN search active | |
323 */ | |
324 if (rr_data->start_cell_reselection) | |
325 { | |
326 /*XY:n inform GRR, and wait for CR_RSP | |
327 should only happen in PIM_BCCH */ | |
328 #ifdef GPRS | |
329 att_start_cell_reselection_gprs (CELL_RESELECTION); | |
330 #else | |
331 att_start_cell_reselection (CELL_RESELECTION); | |
332 #endif | |
333 } | |
334 break; | |
335 | |
336 } | |
337 break; | |
338 | |
339 default: | |
340 break; | |
341 } | |
342 | |
343 | |
344 PFREE (mph_error_ind); | |
345 } | |
346 | |
347 /* | |
348 +--------------------------------------------------------------------+ | |
349 | PROJECT : GSM-PS (6147) MODULE : RR_ATT | | |
350 | STATE : code ROUTINE : att_mph_sync_ind | | |
351 +--------------------------------------------------------------------+ | |
352 | |
353 PURPOSE : Process the primitive MPH_SYNC_IND received from PL. | |
354 | |
355 */ | |
356 | |
357 GLOBAL void att_mph_sync_ind (T_MPH_SYNC_IND *mph_sync_ind) | |
358 { | |
359 GET_INSTANCE_DATA; | |
360 TRACE_FUNCTION ("att_mph_sync_ind()"); | |
361 | |
362 switch (GET_STATE (STATE_ATT)) | |
363 { | |
364 case ATT_CS2: | |
365 case ATT_CS3: | |
366 if (mph_sync_ind->cs EQ CS_SYS_INFO_1_NOT_NEEDED) | |
367 { | |
368 /* | |
369 * layer 1 indicates that system information message type 1 | |
370 * is not available. Update the bitmap of the read messages. | |
371 */ | |
372 att_set_sys_info_read (SYS_INFO_1_READ, CR_INDEX); | |
373 } | |
374 #ifdef GPRS | |
375 else if(mph_sync_ind->cs EQ CS_SCELL_IS_SYNCED) | |
376 { | |
377 if(rr_data->gprs_data.cr_pbcch_active) | |
378 { | |
379 PALLOC(sync_ind, RRGRR_SYNC_IND); | |
380 sync_ind->sync_res = SYNC_OK; | |
381 PSENDX(GRR, sync_ind); | |
382 | |
383 SET_STATE(STATE_GPRS,GPRS_PIM_PBCCH); | |
384 rr_data->gprs_data.cr_pbcch_active = FALSE; | |
385 rr_data->nc_data[CR_INDEX].arfcn = NOT_PRESENT_16BIT; | |
386 SET_STATE (STATE_ATT, ATT_IDLE); | |
387 } | |
388 } | |
389 #endif | |
390 break; | |
391 | |
392 #ifdef GPRS | |
393 case ATT_IDLE: | |
394 { | |
395 T_GPRS_DATA *gprs_data = &rr_data->gprs_data; | |
396 T_RRGRR_EXT_MEAS_REQ *rrgrr_ext_meas_req = gprs_data->rrgrr_ext_meas_req; | |
397 T_RRGRR_EXT_MEAS_CNF *rrgrr_ext_meas_cnf = gprs_data->rrgrr_ext_meas_cnf; | |
398 | |
399 if ( mph_sync_ind->cs EQ CS_STOP_PLMN_SEARCH AND | |
400 rrgrr_ext_meas_req NEQ NULL ) | |
401 { | |
402 rrgrr_ext_meas_cnf->call_ref = rrgrr_ext_meas_req->call_ref; | |
403 if ( gprs_data->ext_meas_ctrl & EXT_MEAS_RESET ) | |
404 rrgrr_ext_meas_cnf->xmeas_cause = EXT_MEAS_RESET; | |
405 else | |
406 rrgrr_ext_meas_cnf->xmeas_cause = EXT_MEAS_OK; | |
407 | |
408 att_ext_meas_end(FALSE); | |
409 SET_STATE (STATE_CELL_SEL, CS_IDLE); | |
410 PSENDX ( GRR, rrgrr_ext_meas_cnf ); | |
411 } | |
412 } | |
413 break; | |
414 #endif | |
415 | |
416 default: | |
417 break; | |
418 } | |
419 PFREE (mph_sync_ind); | |
420 } | |
421 | |
422 /* | |
423 +--------------------------------------------------------------------+ | |
424 | PROJECT : GSM-PS (6147) MODULE : RR_ATT | | |
425 | STATE : code ROUTINE : att_mph_measurement_ind | | |
426 +--------------------------------------------------------------------+ | |
427 | |
428 PURPOSE : Process MPH_MEASUREMENT_IND received from layer 1. | |
429 | |
430 */ | |
431 | |
432 GLOBAL void att_mph_measurement_ind (T_MPH_MEASUREMENT_IND *mph_measurement_ind) | |
433 { | |
434 GET_INSTANCE_DATA; | |
435 TRACE_FUNCTION ("att_mph_measurement_ind()"); | |
436 | |
437 /* | |
438 * Defines the time in frame numbers from the last measurements. | |
439 */ | |
440 rr_data->ms_data.fn_offset = (ULONG)mph_measurement_ind->fn_offset; | |
441 | |
442 switch (GET_STATE (STATE_ATT)) | |
443 { | |
444 case ATT_CS2: | |
445 /* | |
446 * FTA problem with 20.19 testcase | |
447 * This function is used to eliminate poor serving cell | |
448 * RX level values due to spurious measurements. | |
449 */ | |
450 #if defined(_SIMULATION_) | |
451 TRACE_EVENT_WIN_P5 ("ATT_CS2: MPH_MEASUREMENT_IND[%u] rx=%d %svalid (NC%u[%u])", | |
452 mph_measurement_ind->arfcn, mph_measurement_ind->rx_lev_full, | |
453 mph_measurement_ind->valid ? "" : "in", SC_INDEX, | |
454 rr_data->nc_data[SC_INDEX].arfcn); | |
455 #endif | |
456 att_align_sc_meas (mph_measurement_ind, SC_INDEX); | |
457 break; | |
458 | |
459 case ATT_CS3: | |
460 /* | |
461 * clear the barrier for the candidate if exists and | |
462 * update the fieldstrength value | |
463 */ | |
464 #if defined(_SIMULATION_) | |
465 TRACE_EVENT_WIN_P5 ("ATT_CS3: MPH_MEASUREMENT_IND[%u] rx=%d %svalid (NC%u[%u])", | |
466 mph_measurement_ind->arfcn, mph_measurement_ind->rx_lev_full, | |
467 mph_measurement_ind->valid ? "" : "in", | |
468 CR_INDEX, rr_data->nc_data[CR_INDEX].arfcn); | |
469 #endif | |
470 reset_tnnn (CR_INDEX); | |
471 // rr_data->nc_data[CR_INDEX].rxlev = mph_measurement_ind->rx_lev_full; | |
472 att_align_sc_meas (mph_measurement_ind, CR_INDEX); | |
473 break; | |
474 | |
475 case ATT_DEDICATED: | |
476 | |
477 if (mph_measurement_ind->valid) | |
478 { | |
479 /* | |
480 * if the measurement report is valid, store it | |
481 * for later use (building of measurement message | |
482 * and ranking of cells if coming back to idle mode). | |
483 */ | |
484 memcpy (&rr_data->ms_data.measurement_report, mph_measurement_ind, | |
485 sizeof (T_MPH_MEASUREMENT_IND)); | |
486 | |
487 /*Store most recently received timing advance for SC*/ | |
488 rr_data->sc_data.new_ta = rr_data->ms_data.measurement_report.otd/2; | |
489 att_set_tim_advance_info(); | |
490 /* | |
491 * This function is used to eliminate poor serving cell | |
492 * RX level values due to spurious measurements. | |
493 */ | |
494 att_align_sc_meas (mph_measurement_ind, SC_INDEX); | |
495 | |
496 /* | |
497 * Set fieldstrength in dedicated mode, use rxlev sub due to DTX | |
498 */ | |
499 #ifdef FF_PS_RSSI | |
500 RX_SetValue (mph_measurement_ind->rx_lev_sub, | |
501 mph_measurement_ind->rx_qual_sub, | |
502 RX_ACCE_UNAVAILABLE); | |
503 #else | |
504 RX_SetValue (mph_measurement_ind->rx_lev_sub); | |
505 #endif | |
506 } | |
507 | |
508 reset_tnnn (SC_INDEX); | |
509 | |
510 /* | |
511 * increase power on time to delete forbidden | |
512 * location area list after 12 hours | |
513 */ | |
514 att_increase_power_on_time ((USHORT)(rr_data->ms_data.fn_offset / | |
515 PERIOD_1_SEC)); | |
516 | |
517 /* | |
518 * build the uplink SACCH message Measurement Report | |
519 */ | |
520 #if defined (REL99) && defined (TI_PS_FF_EMR) | |
521 if ( ((rr_data->sc_data.enh_para_status EQ ENH_PARA_IDLE) OR | |
522 (rr_data->sc_data.enh_para_status EQ ENH_PARA_DEDICATED)) AND | |
523 rr_data->sc_data.emr_data_current.rep_type EQ REP_TYPE_ENH ) | |
524 dat_code_enh_measure_report (mph_measurement_ind); | |
525 else | |
526 #endif | |
527 dat_code_measure_report (mph_measurement_ind); | |
528 break; | |
529 | |
530 case ATT_IDLE: | |
531 #ifdef GPRS | |
532 #if defined (REL99) && defined (TI_PS_FF_EMR) | |
533 rr_data->sc_data.emr_data_current.scale_used_last = | |
534 mph_measurement_ind->scale_used; | |
535 #endif | |
536 if(att_check_sync_results(mph_measurement_ind)) | |
537 return; | |
538 #endif | |
539 /* | |
540 * special trick for FTA testcase 20.7. | |
541 * The first paging is delayed until the | |
542 * first measurement from layer 1 arrives. | |
543 */ | |
544 rr_data->first_meas_received = TRUE; | |
545 | |
546 /* | |
547 * two dynamic configs to perform | |
548 * fast or slow cell reselection in the lab | |
549 */ | |
550 if (rr_data->dyn_config.fcr) | |
551 mph_measurement_ind->rx_lev_full = 0; | |
552 | |
553 if (rr_data->dyn_config.scr) | |
554 { | |
555 rr_data->dyn_config.scr++; | |
556 if (rr_data->dyn_config.scr < mph_measurement_ind->rx_lev_full) | |
557 mph_measurement_ind->rx_lev_full -= rr_data->dyn_config.scr; | |
558 else | |
559 mph_measurement_ind->rx_lev_full = 0; | |
560 } | |
561 | |
562 if (mph_measurement_ind->valid) | |
563 { | |
564 /* | |
565 * if the measurement report from layer 1 is valid | |
566 * | |
567 * set RX value | |
568 */ | |
569 #ifdef FF_PS_RSSI | |
570 RX_SetValue (mph_measurement_ind->rx_lev_full, | |
571 mph_measurement_ind->rx_qual_full, | |
572 rr_data->nc_data[SC_INDEX].select_para.rxlev_access_min); | |
573 #else | |
574 RX_SetValue (mph_measurement_ind->rx_lev_full); | |
575 #endif | |
576 | |
577 /* | |
578 * store the measurement report for later use, remove | |
579 * bad neighbourcells and analyze the data from layer 1 | |
580 * (remove cells which are not inside the report, | |
581 * store new cells, update counter etc.). | |
582 */ | |
583 mph_measurement_ind->rx_lev_sub = mph_measurement_ind->rx_lev_full; | |
584 memcpy (&rr_data->ms_data.measurement_report, mph_measurement_ind, | |
585 sizeof (T_MPH_MEASUREMENT_IND)); | |
586 | |
587 /* L1 always report BCCH RXLev as Zero in Idle mode, so copy | |
588 * BCCH RXLev as receivied level (rx_lev_full) on BCCH | |
589 * This will be used when we go into dedicated mode | |
590 * And comback to Idle mode within 480MS Or | |
591 * Dedicated mode was very-short duration and | |
592 * RR didn't receive any valid measurement report into | |
593 * dedicate mode. If we don't do this Cell-Reselction | |
594 * will fail as rr_data->nc_data[SC_INDEX].rxlev will be zero | |
595 * Because it is assigned as bcch_rxlev_of_sc of measurement_report | |
596 * in function att_build_back_from_dedicated. | |
597 */ | |
598 rr_data->ms_data.measurement_report.bcch_rxlev_of_sc = mph_measurement_ind->rx_lev_full; | |
599 | |
600 att_remove_bad_ncell (mph_measurement_ind); | |
601 att_analyze_measure_report (mph_measurement_ind); | |
602 | |
603 if( rr_data->c_ncell_bcch EQ NOT_INITIALISED ) | |
604 rr_data->c_ncell_bcch = mph_measurement_ind->ncells.no_of_ncells; | |
605 | |
606 if( (rr_data->c_ncell_bcch EQ 0) AND (rr_data->resel_pending EQ TRUE) ) | |
607 { | |
608 PFREE (mph_measurement_ind); | |
609 #ifdef GPRS | |
610 att_start_cell_reselection_gprs(CELL_RESELECTION_RACH); | |
611 #else | |
612 att_start_cell_reselection(CELL_RESELECTION_RACH); | |
613 #endif | |
614 rr_data->resel_pending = FALSE; | |
615 rr_data->c_ncell_bcch = NOT_INITIALISED; | |
616 return; | |
617 } | |
618 /* | |
619 * check whether a paging has been stored before receiving | |
620 * the measurement from layer 1. | |
621 */ | |
622 if (rr_data->pag_rec) | |
623 { | |
624 srv_use_stored_prim (); | |
625 rr_data->pag_rec = FALSE; | |
626 } | |
627 | |
628 /* | |
629 * delay cell reselection if network search is still ongoing | |
630 * or RR initiated plmn search has started. | |
631 */ | |
632 att_check_reselect_decision (rr_data->start_cell_reselection); | |
633 | |
634 /* | |
635 * increase power on time to delete forbidden | |
636 * location area list after 12 hours | |
637 */ | |
638 att_increase_power_on_time ((USHORT)(rr_data->ms_data.fn_offset / | |
639 PERIOD_1_SEC)); | |
640 | |
641 } | |
642 break; | |
643 | |
644 case ATT_CON_EST: | |
645 /* | |
646 * Measurements from layer 1 during connection establishment | |
647 */ | |
648 if (mph_measurement_ind->valid) | |
649 { | |
650 /* | |
651 * store the measurement report for later use, remove | |
652 * bad neighbourcells and analyze the data from layer 1 | |
653 * (remove cells which are not inside the report, | |
654 * store new cells, update counter etc.). | |
655 */ | |
656 mph_measurement_ind->rx_lev_sub = mph_measurement_ind->rx_lev_full; | |
657 memcpy (&rr_data->ms_data.measurement_report, mph_measurement_ind, | |
658 sizeof (T_MPH_MEASUREMENT_IND)); | |
659 | |
660 /* L1 always report BCCH RXLev as Zero in Connection Establishment mode, so copy | |
661 * BCCH RXLev as receivied level (rx_lev_full). | |
662 * This will be used when we go into dedicated mode | |
663 * And comback to Idle mode within 480MS Or | |
664 * Dedicated mode was very-short duration and | |
665 * RR didn't receive any valid measurement report into | |
666 * dedicate mode. If we don't do this Cell-Reselction | |
667 * will fail as rr_data->nc_data[SC_INDEX].rxlev will be zero | |
668 * Because it is assigned as bcch_rxlev_of_sc of measurement_report | |
669 * in function att_build_back_from_dedicated. | |
670 */ | |
671 rr_data->ms_data.measurement_report.bcch_rxlev_of_sc = mph_measurement_ind->rx_lev_full; | |
672 | |
673 att_remove_bad_ncell (mph_measurement_ind); | |
674 att_analyze_measure_report (mph_measurement_ind); | |
675 | |
676 /* | |
677 * make a cell reselection decision, but do not start it. | |
678 */ | |
679 att_check_reselect_decision (FALSE); | |
680 | |
681 /* | |
682 * increase power on time to delete forbidden | |
683 * location area list after 12 hours | |
684 */ | |
685 att_increase_power_on_time ((USHORT)(rr_data->ms_data.fn_offset / | |
686 PERIOD_1_SEC)); | |
687 } | |
688 break; | |
689 | |
690 default: | |
691 break; | |
692 } | |
693 PFREE (mph_measurement_ind); | |
694 } | |
695 | |
696 /* | |
697 +--------------------------------------------------------------------+ | |
698 | PROJECT : GSM-PS (6147) MODULE : RR_ATT | | |
699 | STATE : code ROUTINE : att_rr_activate_req | | |
700 +--------------------------------------------------------------------+ | |
701 | |
702 PURPOSE : Process the primitive RR_ACTIVATE_REQ received from MM. | |
703 | |
704 */ | |
705 | |
706 GLOBAL void att_rr_activate_req (T_RR_ACTIVATE_REQ *rr_activate_req) | |
707 { | |
708 GET_INSTANCE_DATA; | |
709 #ifdef GPRS | |
710 T_loc_area_ident * lai = &rr_data->nc_data[SC_INDEX].lai; | |
711 #endif /* GPRS */ | |
712 | |
713 TRACE_FUNCTION ("att_rr_activate_req()"); | |
714 | |
715 /* | |
716 * set cell test operation | |
717 */ | |
718 rr_data->cell_test_operation = rr_activate_req->cell_test; | |
719 rr_data->cs_data.check_hplmn = rr_activate_req->check_hplmn; | |
720 TRACE_EVENT_P1 ( "Cell Test Operation =%d", rr_data->cell_test_operation ); | |
721 | |
722 switch (GET_STATE (STATE_ATT)) | |
723 { | |
724 case ATT_NULL: | |
725 #ifdef GPRS | |
726 if(rr_activate_req->gprs_indication AND | |
727 rr_data->gprs_data.start_proc EQ START_PROC_NOTHING) | |
728 { | |
729 att_set_gprs_indication(rr_activate_req->gprs_indication); | |
730 att_rrgrr_cr_ind(CR_NORMAL); | |
731 rr_data->gprs_data.start_proc = START_PROC_ACTIVATE_REQ; | |
732 if ( srv_check_stored_prim (RR_ACTIVATE_REQ) ) | |
733 srv_clear_stored_prim(RR_ACTIVATE_REQ); | |
734 | |
735 if( !srv_store_prim ((T_PRIM *)D2P(rr_activate_req)) ) | |
736 { | |
737 /* | |
738 * primitive already in queue or storing failed | |
739 */ | |
740 PFREE (rr_activate_req); | |
741 } | |
742 /* on CR_RSP use_stored_prim is called */ | |
743 } | |
744 else | |
745 att_handle_rr_act_req (TRUE, rr_activate_req); | |
746 #else | |
747 att_handle_rr_act_req (TRUE, rr_activate_req); | |
748 #endif | |
749 break; | |
750 | |
751 case ATT_CS_INIT: | |
752 #ifdef GPRS | |
753 if(rr_activate_req->gprs_indication AND | |
754 rr_data->gprs_data.start_proc EQ START_PROC_NOTHING) | |
755 { | |
756 TRACE_EVENT("Activating GPRS in ATT_CS_INIT"); | |
757 att_set_gprs_indication(rr_activate_req->gprs_indication); | |
758 att_rrgrr_cr_ind(CR_NORMAL); | |
759 rr_data->gprs_data.start_proc = START_PROC_ACTIVATE_REQ; | |
760 /* go ahead for storing the activate_req message */ | |
761 } | |
762 else | |
763 { | |
764 #endif | |
765 att_handle_rr_act_req (FALSE, rr_activate_req); | |
766 break; | |
767 #ifdef GPRS | |
768 } | |
769 #endif | |
770 /*lint -fallthrough*/ | |
771 | |
772 case ATT_CS1: | |
773 if ( GET_STATE (STATE_CELL_SEL) EQ CS_IDLE_ACTIVE ) | |
774 { | |
775 #ifdef GPRS | |
776 if(rr_activate_req->gprs_indication AND | |
777 rr_data->gprs_data.start_proc EQ START_PROC_NOTHING AND | |
778 rr_data->ms_data.req_mm_service EQ FUNC_LIM_SERV_ST_SRCH) | |
779 { | |
780 TRACE_EVENT("Activating GPRS in ATT_CS1"); | |
781 att_set_gprs_indication(rr_activate_req->gprs_indication); | |
782 att_rrgrr_cr_ind(CR_NORMAL); | |
783 rr_data->gprs_data.start_proc = START_PROC_ACTIVATE_REQ; | |
784 /* go ahead for storing the activate_req message */ | |
785 } | |
786 else | |
787 { | |
788 #endif | |
789 att_handle_rr_act_req (FALSE, rr_activate_req); | |
790 return; | |
791 #ifdef GPRS | |
792 } | |
793 #endif | |
794 } | |
795 /*lint -fallthrough*/ | |
796 case ATT_CS3: | |
797 case ATT_DEDICATED: | |
798 /* | |
799 * store rr activate request during cell reselection and while dedicated | |
800 * only store the latest instance of an ACTIVATE_REQ | |
801 */ | |
802 if ( srv_check_stored_prim (RR_ACTIVATE_REQ) ) | |
803 srv_clear_stored_prim(RR_ACTIVATE_REQ); | |
804 | |
805 if( !srv_store_prim ((T_PRIM *)D2P(rr_activate_req)) ) | |
806 { | |
807 /* | |
808 * primitive already in queue or storing failed | |
809 */ | |
810 PFREE (rr_activate_req); | |
811 } | |
812 break; | |
813 case ATT_CS2: | |
814 case ATT_NO_SERVICE: | |
815 case ATT_IDLE: | |
816 case ATT_CON_EST: | |
817 | |
818 #ifdef GPRS | |
819 | |
820 if(rr_activate_req->gprs_indication AND | |
821 rr_activate_req->op.func NEQ FUNC_NET_SRCH_BY_MMI AND | |
822 rr_data->gprs_data.start_proc EQ START_PROC_NOTHING) | |
823 { | |
824 if( | |
825 ( rr_data->ms_data.operation_mode EQ | |
826 ( (rr_activate_req->op.ts << 7) + (rr_activate_req->op.m << 6) + | |
827 (rr_activate_req->op.sim_ins << 5) | |
828 ) | |
829 ) | |
830 AND | |
831 ( rr_data->ms_data.req_mm_service EQ rr_activate_req->op.func) | |
832 AND | |
833 ( GET_STATE(STATE_GPRS) EQ GPRS_NULL) | |
834 AND | |
835 ( rr_data->nc_data[SC_INDEX].si13_loc_ind NEQ SI13_NOT_PRESENT ) | |
836 AND | |
837 (GET_STATE(STATE_ATT) EQ ATT_IDLE ) | |
838 AND | |
839 (dat_plmn_equal_req ( lai->mcc, | |
840 lai->mnc, | |
841 rr_activate_req->plmn.mcc, | |
842 rr_activate_req->plmn.mnc) ) | |
843 ) | |
844 { | |
845 TRACE_EVENT("gprs activation - cell reselection to same cell"); | |
846 rr_data->gprs_data.start_proc = START_PROC_GPRS_ACT; | |
847 rr_data->sc_data.selection_type = CELL_RESELECTION_ON_GPRS_ACT; | |
848 att_set_gprs_indication(rr_activate_req->gprs_indication); | |
849 PFREE (rr_activate_req); | |
850 } | |
851 else | |
852 { | |
853 rr_data->gprs_data.start_proc = START_PROC_ACTIVATE_REQ; | |
854 att_set_gprs_indication(rr_activate_req->gprs_indication); | |
855 | |
856 /* on CR_RSP use_stored_prim is called */ | |
857 if ( srv_check_stored_prim (RR_ACTIVATE_REQ) ) | |
858 srv_clear_stored_prim(RR_ACTIVATE_REQ); | |
859 if( !srv_store_prim ((T_PRIM *)D2P(rr_activate_req)) ) | |
860 { | |
861 | |
862 /* | |
863 * primitive already in queue or storing failed | |
864 */ | |
865 PFREE (rr_activate_req); | |
866 } | |
867 } | |
868 | |
869 att_rrgrr_cr_ind(CR_NORMAL); | |
870 } | |
871 else if (rr_activate_req->op.func EQ FUNC_NET_SRCH_BY_MMI AND | |
872 (GET_STATE(STATE_GPRS) EQ GPRS_PTM_BCCH OR | |
873 GET_STATE(STATE_GPRS) EQ GPRS_PTM_PBCCH OR | |
874 GET_STATE(STATE_GPRS) EQ GPRS_PAM_BCCH OR | |
875 GET_STATE(STATE_GPRS) EQ GPRS_PAM_PBCCH )) | |
876 { | |
877 rr_data->gprs_data.start_proc = START_PROC_NOTHING; | |
878 /* | |
879 * send Please Retry to the MMI instead of | |
880 * storing the primitive | |
881 */ | |
882 rr_data->sc_data.found_entries = 0; | |
883 att_code_rr_abort_ind(RRCS_ABORT_PTM); | |
884 PFREE (rr_activate_req); | |
885 } | |
886 else if (rr_activate_req->op.func EQ FUNC_NET_SRCH_BY_MMI) | |
887 { | |
888 /* this is a parallel search, don't inform GRR */ | |
889 rr_data->gprs_data.start_proc = START_PROC_NOTHING; | |
890 att_handle_rr_act_req (FALSE, rr_activate_req); | |
891 } | |
892 else if( | |
893 (rr_activate_req->gprs_indication EQ FALSE) AND | |
894 (rr_activate_req->op.func NEQ FUNC_NET_SRCH_BY_MMI) AND | |
895 (GET_STATE(STATE_ATT) EQ ATT_IDLE ) AND | |
896 (rr_data->ms_data.req_mm_service EQ rr_activate_req->op.func) AND | |
897 ( | |
898 rr_data->ms_data.operation_mode EQ | |
899 ((rr_activate_req->op.ts << 7)+(rr_activate_req->op.m << 6)+(rr_activate_req->op.sim_ins << 5)) | |
900 ) AND | |
901 (GET_STATE(STATE_GPRS) EQ GPRS_PIM_BCCH) | |
902 ) | |
903 { | |
904 att_set_gprs_indication(rr_activate_req->gprs_indication); | |
905 att_set_sys_info_read(SYS_INFO_13_READ, SC_INDEX); | |
906 att_build_idle_req(SC_INDEX, MODE_SYS_INFO_CHANGE); | |
907 att_code_rr_act_cnf(); | |
908 PFREE(rr_activate_req); | |
909 } | |
910 else /* called after, the CR_RSP is received or | |
911 if GPRS is not activated */ | |
912 att_handle_rr_act_req (FALSE, rr_activate_req); | |
913 #else | |
914 att_handle_rr_act_req (FALSE, rr_activate_req); | |
915 #endif | |
916 | |
917 break; | |
918 | |
919 | |
920 default: | |
921 PFREE (rr_activate_req); | |
922 break; | |
923 } | |
924 } | |
925 | |
926 /* | |
927 +--------------------------------------------------------------------+ | |
928 | PROJECT : GSM-PS (6147) MODULE : RR_ATT | | |
929 | STATE : code ROUTINE : att_rr_deactivate_req | | |
930 +--------------------------------------------------------------------+ | |
931 | |
932 PURPOSE : Process the primitive RR_DEACTIVATE_REQ received from MM. | |
933 | |
934 */ | |
935 | |
936 GLOBAL void att_rr_deactivate_req (T_RR_DEACTIVATE_REQ *rr_deactivate_req) | |
937 { | |
938 GET_INSTANCE_DATA; | |
939 UBYTE tim_idx; | |
940 PREUSE (rr_deactivate_req, mph_deactivate_req, MPH_DEACTIVATE_REQ); | |
941 | |
942 TRACE_FUNCTION ("att_rr_deactivate_req()"); | |
943 | |
944 EM_DEACTIVATION; | |
945 | |
946 #if defined(_SIMULATION_FFS_) | |
947 if(!dat_test_sim_available()) | |
948 { | |
949 /* store the white list from RAM to FFS */ | |
950 if(rr_data->ms_data.rr_service EQ FULL_SERVICE) | |
951 { | |
952 cs_store_white_list(); | |
953 } | |
954 | |
955 /* store the Black list from RAM to FFS */ | |
956 cs_store_black_list(); | |
957 } | |
958 #endif | |
959 | |
960 /* | |
961 * stop any timer which might be running | |
962 */ | |
963 for (tim_idx = 0; tim_idx < NUM_OF_RR_TIMERS; tim_idx++) | |
964 TIMERSTOP (tim_idx); | |
965 /* | |
966 * reset process states and initialize the | |
967 * gsm related data. | |
968 */ | |
969 dat_att_null (); | |
970 att_init_gsm_data (); | |
971 #ifdef GPRS | |
972 gprs_init_gprs_data(); | |
973 #endif | |
974 | |
975 cs_init_process(); | |
976 SET_STATE (STATE_ATT, ATT_NULL); | |
977 | |
978 /* | |
979 * deactivate layer 1 | |
980 */ | |
981 PSENDX (PL, mph_deactivate_req); | |
982 } | |
983 | |
984 /* | |
985 +--------------------------------------------------------------------+ | |
986 | PROJECT : GSM-PS (6147) MODULE : RR_ATT | | |
987 | STATE : code ROUTINE : att_rr_sync_req | | |
988 +--------------------------------------------------------------------+ | |
989 | |
990 PURPOSE : Process the primitive RR_SYNC_REQ received from MM. | |
991 | |
992 */ | |
993 | |
994 GLOBAL void att_rr_sync_req (T_RR_SYNC_REQ *rr_sync_req) | |
995 { | |
996 GET_INSTANCE_DATA; | |
997 TRACE_FUNCTION ("att_rr_sync_req()"); | |
998 | |
999 TRACE_EVENT_P2 ("RR_SYNC_REQ cs=%x att st=%u", rr_sync_req->synccs, GET_STATE (STATE_ATT)); | |
1000 | |
1001 if ((rr_sync_req->synccs NEQ NOT_PRESENT_16BIT) AND | |
1002 (rr_sync_req->synccs NEQ SYNCCS_LAI_ALLOW)) | |
1003 { | |
1004 rr_data->mode_after_dedi = MODE_CELL_RESELECTION; | |
1005 TRACE_EVENT ("rr_sync_req: MODE_CELL_RESELECTION"); | |
1006 #if defined(DL_TRACE_ENABLED) | |
1007 { | |
1008 sprintf (dl_trace_buf, "sync_req cs=%04x ->mode=%u #%u:%s", | |
1009 rr_sync_req->synccs, rr_data->mode_after_dedi, __LINE__, __FILE10__); | |
1010 DL_OFFLINE_TRACE (dl_trace_buf); | |
1011 } | |
1012 #endif /* DL_TRACE_ENABLED */ | |
1013 } | |
1014 | |
1015 if (rr_sync_req->kcv.v_kc) | |
1016 { | |
1017 /* | |
1018 * change of cipher parameter | |
1019 */ | |
1020 memcpy (rr_data->ms_data.new_kc, &rr_sync_req->kcv.kc, KC_STRING_SIZE); | |
1021 rr_data->ms_data.cksn = rr_sync_req->cksn; | |
1022 }/*if v_kc*/ | |
1023 | |
1024 if (rr_sync_req->tmsi_struct.v_mid) | |
1025 { | |
1026 /* | |
1027 * change of TMSI (a new value is defined) | |
1028 */ | |
1029 rr_data->ms_data.tmsi_available = TRUE; | |
1030 rr_data->ms_data.tmsi_binary = rr_sync_req->tmsi_struct.tmsi_dig; | |
1031 /* | |
1032 * forward the new TMSI to layer 1 | |
1033 */ | |
1034 att_mph_identity_req (); | |
1035 }/* if v_mid*/ | |
1036 | |
1037 if (rr_sync_req->op.v_op) | |
1038 { | |
1039 /* | |
1040 * change of the operation mode, typically | |
1041 * change from automatic to manual mode | |
1042 */ | |
1043 rr_data->ms_data.operation_mode = | |
1044 (rr_sync_req->op.ts << SHIFT_FOR_SIM_TYPE) + | |
1045 (rr_sync_req->op.m << SHIFT_FOR_SEARCH_OFFSET) + | |
1046 (rr_sync_req->op.sim_ins << SHIFT_FOR_SIM_INSERTED); | |
1047 att_set_func (rr_sync_req->op.func); | |
1048 | |
1049 | |
1050 switch (GET_STATE (STATE_ATT)) | |
1051 { | |
1052 case ATT_NO_SERVICE: | |
1053 case ATT_IDLE: | |
1054 case ATT_CON_EST: | |
1055 /* | |
1056 * changes from automatic to manual mode and vice versa | |
1057 * may lead to start or stop of HPLMN search. | |
1058 */ | |
1059 if (rr_data->ms_data.rr_service EQ FULL_SERVICE) | |
1060 att_start_registration_timer (); | |
1061 break; | |
1062 default: | |
1063 break; | |
1064 }/*STATE_ATT*/ | |
1065 | |
1066 }/*if v_op*/ | |
1067 | |
1068 switch (GET_STATE (STATE_ATT)) | |
1069 { | |
1070 case ATT_CS1: | |
1071 switch (rr_sync_req->synccs) | |
1072 { | |
1073 case SYNCCS_TMSI_CKSN_KC_INVAL: | |
1074 case SYNCCS_TMSI_CKSN_KC_INVAL_NO_PAG: | |
1075 /* | |
1076 * store the primitive during cell selection (power measurements) | |
1077 */ | |
1078 if (!srv_store_prim ((T_PRIM *)D2P(rr_sync_req))) | |
1079 { | |
1080 PFREE (rr_sync_req); | |
1081 }/*if*/ | |
1082 return; | |
1083 default: | |
1084 break; | |
1085 }/*synccs*/ | |
1086 break; | |
1087 | |
1088 case ATT_CS2: | |
1089 switch (rr_sync_req->synccs) | |
1090 { | |
1091 case SYNCCS_TMSI_CKSN_KC_INVAL: | |
1092 case SYNCCS_TMSI_CKSN_KC_INVAL_NO_PAG: | |
1093 /* | |
1094 * location updating reject or authentication | |
1095 * failure indicates that a new start of the cell | |
1096 * selection is needed. | |
1097 */ | |
1098 TIMERSTOP (T_RESELECT); | |
1099 /*XY:n don't inform GRR , but call start_cs anyway */ | |
1100 #ifdef GPRS | |
1101 att_start_cell_selection_gprs (RR_ORIGINATED,FULL_SEARCH_MODE); | |
1102 #else | |
1103 att_start_cell_selection (RR_ORIGINATED, CS_NOT_PARALLEL,FULL_SEARCH_MODE); | |
1104 #endif | |
1105 break; | |
1106 default: | |
1107 break; | |
1108 }/*synccs*/ | |
1109 break; | |
1110 | |
1111 case ATT_CS3: | |
1112 case ATT_DEDICATED: | |
1113 case ATT_NO_SERVICE: | |
1114 case ATT_IDLE: | |
1115 case ATT_CON_EST: | |
1116 switch (rr_sync_req->synccs) | |
1117 { | |
1118 case SYNCCS_TMSI_CKSN_KC_INVAL: | |
1119 /* | |
1120 * clear TMSI, CKSN and KC | |
1121 */ | |
1122 att_clear_reg_without_imsi (); | |
1123 break; | |
1124 | |
1125 case SYNCCS_TMSI_CKSN_KC_INVAL_NO_PAG: | |
1126 /* | |
1127 * clear TMSI, IMSI, CKSN and KC | |
1128 */ | |
1129 att_clear_registration_data (); | |
1130 break; | |
1131 default: | |
1132 break; | |
1133 }/*synccs*/ | |
1134 break; | |
1135 | |
1136 default: | |
1137 break;/*state*/ | |
1138 }/*STATE_ATT*/ | |
1139 | |
1140 | |
1141 switch (rr_sync_req->synccs) | |
1142 { | |
1143 case SYNCCS_EPLMN_LIST: | |
1144 /* | |
1145 * If sync info contains an EPLMN list | |
1146 * then this is copied regardless of state. | |
1147 * When EPLMN is not available stored EPLMN | |
1148 * is marked as invalid. | |
1149 */ | |
1150 att_copy_eplmn_list(&rr_sync_req->eq_plmn_list); | |
1151 break; | |
1152 | |
1153 case SYNCCS_LAI_ALLOW: | |
1154 | |
1155 /* Store Last Registered PLMN data from the white list */ | |
1156 rr_data->cs_data.last_reg_plmn.v_plmn = V_PLMN_PRES; | |
1157 | |
1158 memcpy (rr_data->cs_data.last_reg_plmn.mcc, rr_data->cs_data.white_list.last_sc_lac.mcc, SIZE_MCC); | |
1159 memcpy (rr_data->cs_data.last_reg_plmn.mnc, rr_data->cs_data.white_list.last_sc_lac.mnc, SIZE_MNC); | |
1160 | |
1161 TRACE_EVENT("LRPLMN copied from white list"); | |
1162 | |
1163 /* | |
1164 * successful end of location updating request, | |
1165 * remove lai from forbidden list if stored | |
1166 */ | |
1167 att_rem_lai_from_forb_list (&rr_sync_req->plmn, | |
1168 rr_sync_req->lac); | |
1169 break; | |
1170 | |
1171 case SYNCCS_LAI_NOT_ALLOW: | |
1172 /* | |
1173 * location updating reject, lai must be added to the | |
1174 * forbidden lai list. | |
1175 */ | |
1176 att_add_to_forb_list (FORBIDDEN_LIST_NORMAL, | |
1177 &rr_sync_req->plmn, | |
1178 rr_sync_req->lac); | |
1179 /* Specifications 24.008 (section 4.4.4.7) - | |
1180 * # 12: (Location Area not allowed); | |
1181 * The MS shall perform a cell selection when back to the MM IDLE state | |
1182 * according to 3GPP TS 03.22 and 3GPP TS 25.304. | |
1183 */ | |
1184 rr_data->ms_data.req_mm_service = FUNC_NET_SRCH_BY_MMI; | |
1185 att_start_cell_selection (RR_ORIGINATED, CS_PARALLEL,NORMAL_SEARCH_MODE); | |
1186 | |
1187 break; | |
1188 | |
1189 case SYNCCS_LAI_NOT_ALLOW_FOR_ROAMING: | |
1190 /* | |
1191 * location updating reject, lai must be added to the | |
1192 * forbidden lai list for roaming. | |
1193 */ | |
1194 att_add_to_forb_list (FORBIDDEN_LIST_ROAMING, | |
1195 &rr_sync_req->plmn, | |
1196 rr_sync_req->lac); | |
1197 break; | |
1198 | |
1199 case SYNCCS_TMSI_INVAL: | |
1200 /* | |
1201 * TMSI is invalid. Clear in RR and inform layer 1 | |
1202 */ | |
1203 rr_data->ms_data.tmsi_available = FALSE; | |
1204 att_mph_identity_req (); | |
1205 break; | |
1206 | |
1207 case SYNCCS_LIMITED_SERVICE: | |
1208 /* Plmn received matches with LRPLMN, flush LRPLMN */ | |
1209 if (rr_sync_req->plmn.v_plmn EQ V_PLMN_PRES) | |
1210 { | |
1211 if(!memcmp(rr_sync_req->plmn.mcc, rr_data->cs_data.last_reg_plmn.mcc, SIZE_MCC) AND | |
1212 !memcmp(rr_sync_req->plmn.mnc, rr_data->cs_data.last_reg_plmn.mnc, SIZE_MNC) | |
1213 ) | |
1214 { | |
1215 rr_data->cs_data.last_reg_plmn.v_plmn = V_PLMN_NOT_PRES; | |
1216 TRACE_EVENT ("LRPLMN Cleared"); | |
1217 } | |
1218 } | |
1219 | |
1220 /* | |
1221 * Indication to RR that only limited service | |
1222 * is possible due to location updating reject cause | |
1223 */ | |
1224 rr_data->ms_data.rr_service = LIMITED_SERVICE; | |
1225 TRACE_EVENT_P7 ("CLEAR plmn, (old MCC/MNC=%x%x%x/%x%x%x) #%u", | |
1226 rr_data->ms_data.plmn.mcc[0], | |
1227 rr_data->ms_data.plmn.mcc[1], | |
1228 rr_data->ms_data.plmn.mcc[2], | |
1229 rr_data->ms_data.plmn.mnc[0], | |
1230 rr_data->ms_data.plmn.mnc[1], | |
1231 rr_data->ms_data.plmn.mnc[2], | |
1232 __LINE__); | |
1233 memset (&rr_data->ms_data.plmn, 0, sizeof (T_plmn)); | |
1234 att_set_rr_service_info(); | |
1235 | |
1236 switch (GET_STATE (STATE_ATT)) | |
1237 { | |
1238 case ATT_NO_SERVICE: | |
1239 case ATT_IDLE: | |
1240 case ATT_CON_EST: | |
1241 att_start_registration_timer(); | |
1242 break; | |
1243 default: | |
1244 break; | |
1245 }/*STATE_ATT*/ | |
1246 | |
1247 #ifdef GPRS | |
1248 if(att_gprs_is_avail()) | |
1249 { | |
1250 /*XY: inform GRR, and wait for CR_RSP */ | |
1251 /* att_rrgrr_cr_ind(CR_NORMAL); */ | |
1252 /* rr_data->gprs_data.start_proc = START_PROC_ENTER_LIMITED; */ | |
1253 | |
1254 /* | |
1255 * During cell reselection, we should not send the primitive | |
1256 * RRGRR_GPRS_SI13_IND to GRR to inform Limited Service. | |
1257 * As this primitive is also used to mark the end of cell reselection. | |
1258 */ | |
1259 if( GET_STATE(STATE_ATT) NEQ ATT_CS3) | |
1260 att_signal_gprs_support(); | |
1261 /* action will follow after cr_rsp */ | |
1262 } | |
1263 #endif | |
1264 | |
1265 break; | |
1266 | |
1267 case SYNCCS_ACCC: | |
1268 rr_data->ms_data.access_classes = rr_sync_req->accc; | |
1269 break; /* SIM's access class by SAT changed */ | |
1270 | |
1271 default: | |
1272 if(!rr_sync_req->op.v_op OR | |
1273 !rr_sync_req->kcv.v_kc OR | |
1274 !rr_sync_req->tmsi_struct.v_mid) | |
1275 TRACE_ERROR ("Unexpected sync event"); | |
1276 break; | |
1277 }/*synccs*/ | |
1278 | |
1279 PFREE (rr_sync_req); | |
1280 | |
1281 }/*att_rr_sync_reg*/ | |
1282 | |
1283 /* | |
1284 +--------------------------------------------------------------------+ | |
1285 | PROJECT : GSM-PS (6147) MODULE : RR_ATT | | |
1286 | STATE : code ROUTINE : att_mph_meas_rep_cnf | | |
1287 +--------------------------------------------------------------------+ | |
1288 | |
1289 PURPOSE : Process the primitive mph_meas_rep_cnf from ALR. | |
1290 | |
1291 */ | |
1292 | |
1293 #ifdef GPRS | |
1294 GLOBAL void att_mph_meas_rep_cnf(T_MPH_MEAS_REP_CNF* mph_meas_rep_cnf) | |
1295 { | |
1296 UBYTE count; | |
1297 PALLOC(rrgrr_meas_rep_cnf, RRGRR_MEAS_REP_CNF); | |
1298 TRACE_FUNCTION("rrgrr_meas_rep_cnf()"); | |
1299 | |
1300 /*lint -e661 (Possible access of out-of-bounds pointer (26 beyond end of data) by operator '[') */ | |
1301 /*lint -e662 (Possible creation of out-of-bounds pointer (26 beyond end of data) by operator '[') */ | |
1302 for(count=0;count<RRGRR_MEAS_REP_LIST_SIZE;count++) | |
1303 { | |
1304 rrgrr_meas_rep_cnf->meas_res[count].arfcn = mph_meas_rep_cnf->meas_rep[count].arfcn; | |
1305 rrgrr_meas_rep_cnf->meas_res[count].bsic = mph_meas_rep_cnf->meas_rep[count].bsic; | |
1306 rrgrr_meas_rep_cnf->meas_res[count].rxlev = mph_meas_rep_cnf->meas_rep[count].rx_lev; | |
1307 } | |
1308 PFREE(mph_meas_rep_cnf); | |
1309 PSENDX( GRR, rrgrr_meas_rep_cnf ); | |
1310 /*lint +e662 (Possible creation of out-of-bounds pointer (26 beyond end of data) by operator '[') */ | |
1311 /*lint +e661 (Possible access of out-of-bounds pointer (26 beyond end of data) by operator '[') */ | |
1312 } | |
1313 #endif | |
1314 | |
1315 | |
1316 | |
1317 /* | |
1318 +--------------------------------------------------------------------+ | |
1319 | PROJECT : GSM-PS (6147) MODULE : RR_ATT | | |
1320 | STATE : code ROUTINE : att_mph_meas_order_cnf | | |
1321 +--------------------------------------------------------------------+ | |
1322 | |
1323 PURPOSE : | |
1324 | |
1325 */ | |
1326 | |
1327 GLOBAL void att_mph_meas_order_cnf (T_MPH_MEAS_ORDER_CNF* meas) | |
1328 { | |
1329 PFREE(meas); | |
1330 } | |
1331 | |
1332 /* | |
1333 +--------------------------------------------------------------------+ | |
1334 | PROJECT : GSM-PS (6147) MODULE : RR_ATT | | |
1335 | STATE : code ROUTINE : att_align_sc_meas | | |
1336 +--------------------------------------------------------------------+ | |
1337 | |
1338 PURPOSE : | |
1339 | |
1340 index == SC_INDEX: In this case the function is used to eliminate | |
1341 poor serving cell RX level values due to | |
1342 spurious measurements. | |
1343 | |
1344 This function is related to FTA test case 20.19. | |
1345 | |
1346 index == CR_INDEX: In this case the function is used to set the | |
1347 right aligned level of a delayed measurement report | |
1348 during cell reselection (ATT_CS3) to the cell | |
1349 with the CR_INDEX. | |
1350 | |
1351 */ | |
1352 | |
1353 LOCAL void att_align_sc_meas (T_MPH_MEASUREMENT_IND * mph_meas_ind, | |
1354 UBYTE index) | |
1355 { | |
1356 GET_INSTANCE_DATA; | |
1357 UBYTE i; | |
1358 | |
1359 TRACE_FUNCTION ("att_align_sc_meas()"); | |
1360 | |
1361 if (mph_meas_ind->valid) | |
1362 { | |
1363 if (rr_data->nc_data[index].arfcn EQ mph_meas_ind->arfcn) | |
1364 { | |
1365 /* | |
1366 * update the serving cell or cr cell fieldstrength | |
1367 */ | |
1368 #if defined(_SIMULATION_) | |
1369 TRACE_EVENT_WIN_P3 ("att_align_sc_meas(idx=%u): SC/CR=[%u], rx=%d", | |
1370 index, mph_meas_ind->arfcn, mph_meas_ind->rx_lev_full); | |
1371 #endif | |
1372 rr_data->nc_data[index].rxlev = mph_meas_ind->rx_lev_full; | |
1373 } | |
1374 else | |
1375 { | |
1376 /* | |
1377 * check all neighbourcells | |
1378 */ | |
1379 for (i=0;i<mph_meas_ind->ncells.no_of_ncells;i++) | |
1380 { | |
1381 /* | |
1382 * if the cell is also inside the neighbourcells, take | |
1383 * this fieldstrength value. | |
1384 */ | |
1385 if (mph_meas_ind->ncells.arfcn[i] EQ rr_data->nc_data[index].arfcn) | |
1386 { | |
1387 #if defined(_SIMULATION_) | |
1388 TRACE_EVENT_WIN_P3 ("att_align_sc_meas(idx=%u): nc[%u] found, rx=%d", | |
1389 index, mph_meas_ind->ncells.arfcn[i], mph_meas_ind->ncells.rx_lev[i]); | |
1390 #endif | |
1391 rr_data->nc_data[index].rxlev = mph_meas_ind->ncells.rx_lev[i]; | |
1392 return; | |
1393 } | |
1394 } | |
1395 } | |
1396 } | |
1397 } | |
1398 | |
1399 /* | |
1400 +--------------------------------------------------------------------+ | |
1401 | PROJECT : GSM-PS (6147) MODULE : RR_ATT | | |
1402 | STATE : code ROUTINE : att_rr_sync_hplmn_req | | |
1403 +--------------------------------------------------------------------+ | |
1404 | |
1405 PURPOSE : Process the primitive RR_SYNC_HPLMN_REQ received from MM. | |
1406 | |
1407 */ | |
1408 | |
1409 GLOBAL void att_rr_sync_hplmn_req (T_RR_SYNC_HPLMN_REQ *rr_sync_hplmn_req) | |
1410 { | |
1411 GET_INSTANCE_DATA; | |
1412 TRACE_FUNCTION ("att_rr_sync_hplmn_req()"); | |
1413 memcpy (&rr_data->ms_data.ahplmn, &rr_sync_hplmn_req->plmn, sizeof (T_plmn)); | |
1414 rr_data->ms_data.v_eq_plmn = FALSE; | |
1415 memset(&rr_data->ms_data.eq_plmn_list, 0xFF, SIZE_EPLMN); | |
1416 PFREE(rr_sync_hplmn_req); | |
1417 } | |
1418 | |
1419 #if defined FF_EOTD | |
1420 /* | |
1421 +--------------------------------------------------------------------+ | |
1422 | PROJECT : GSM-PS (6147) MODULE : RR_ATT | | |
1423 | STATE : code ROUTINE : att_mph_ncell_pos_ind | | |
1424 +--------------------------------------------------------------------+ | |
1425 | |
1426 PURPOSE : Process the primitive MPH_NCELL_POS_IND received from PL. | |
1427 | |
1428 */ | |
1429 | |
1430 GLOBAL void att_mph_ncell_pos_ind (T_MPH_NCELL_POS_IND *mph_ncell_pos_ind) | |
1431 { | |
1432 GET_INSTANCE_DATA; | |
1433 TRACE_FUNCTION ("att_mph_ncell_pos_ind()"); | |
1434 | |
1435 if ( mph_ncell_pos_ind->eotd_res EQ EOTD_SUCC ) | |
1436 { | |
1437 /* Forward input primitive to LC adding some parameters */ | |
1438 | |
1439 T_loc_area_ident *loc_area_ident; | |
1440 T_NC_DATA *sc; | |
1441 int i,n; | |
1442 | |
1443 PALLOC (rrlc_meas_ind, RRLC_MEAS_IND); | |
1444 | |
1445 sc = &rr_data->nc_data[SC_INDEX]; | |
1446 loc_area_ident = &sc->lai; | |
1447 | |
1448 memcpy ( &rrlc_meas_ind->mcc[0], &loc_area_ident->mcc[0], 3 * sizeof rrlc_meas_ind->mcc[0]); | |
1449 memcpy ( &rrlc_meas_ind->mnc[0], &loc_area_ident->mnc[0], 3 * sizeof rrlc_meas_ind->mnc[0]); | |
1450 rrlc_meas_ind->lac = loc_area_ident->lac; | |
1451 rrlc_meas_ind->cell_id = sc->cell_id; | |
1452 rrlc_meas_ind->req_id = mph_ncell_pos_ind->req_id; | |
1453 rrlc_meas_ind->tav = mph_ncell_pos_ind->ta; | |
1454 rrlc_meas_ind->fn = mph_ncell_pos_ind->fn; | |
1455 rrlc_meas_ind->eotd_sc_res = mph_ncell_pos_ind->eotd_sc_res; | |
1456 rrlc_meas_ind->eotd_sc_res1 = mph_ncell_pos_ind->eotd_sc_res1; | |
1457 n = | |
1458 rrlc_meas_ind->c_eotd_nc_res = mph_ncell_pos_ind->c_eotd_nc_res; | |
1459 for ( i = 0; i < n; ++i ) | |
1460 rrlc_meas_ind->eotd_nc_res[i] = mph_ncell_pos_ind->eotd_nc_res[i]; | |
1461 | |
1462 if ( GET_STATE (STATE_ATT) EQ ATT_DEDICATED | |
1463 #ifdef GPRS | |
1464 OR (GET_STATE (STATE_ATT) EQ ATT_IDLE AND | |
1465 GET_STATE(STATE_GPRS) EQ GPRS_PTM_BCCH AND | |
1466 GET_STATE(STATE_GPRS) EQ GPRS_PTM_PBCCH ) | |
1467 #endif | |
1468 ) | |
1469 rrlc_meas_ind->eotd_mode = EOTD_DEDIC; | |
1470 else | |
1471 rrlc_meas_ind->eotd_mode = EOTD_IDLE; | |
1472 | |
1473 /* | |
1474 * If this is a response to an explicit position measurement request, | |
1475 * then reset the flag which enables handover indications to LC. | |
1476 */ | |
1477 | |
1478 if ( rr_data->eotd_req_id NEQ NOT_PRESENT_16BIT AND | |
1479 rr_data->eotd_req_id EQ mph_ncell_pos_ind->req_id ) | |
1480 rr_data->eotd_req_id = NOT_PRESENT_16BIT; | |
1481 | |
1482 PSENDX (LC, rrlc_meas_ind); | |
1483 } | |
1484 else | |
1485 { | |
1486 PALLOC (rrlc_error_ind, RRLC_ERROR_IND); | |
1487 rrlc_error_ind->cause = LCS_WRONG_BTS; /* exact cause is unclear, assume wrong BTS */ | |
1488 PSENDX (LC, rrlc_error_ind); | |
1489 } | |
1490 PFREE(mph_ncell_pos_ind); | |
1491 } | |
1492 #endif /* FF_EOTD */ | |
1493 | |
1494 #ifdef TI_PS_FF_QUAD_BAND_SUPPORT | |
1495 GLOBAL void att_mph_init_rr_ind(T_MPH_INIT_RR_IND* mph_init_rr_ind) | |
1496 { | |
1497 GET_INSTANCE_DATA; | |
1498 UBYTE freq_bands; | |
1499 T_rf_power *rfp = &rr_data->ms_data.rf_cap.rf_power; | |
1500 | |
1501 TRACE_FUNCTION ("att_mph_init_rr_ind()"); | |
1502 rr_csf_get_freq_bands (&freq_bands); | |
1503 if (mph_init_rr_ind->freq_bands NEQ freq_bands) | |
1504 { | |
1505 TRACE_EVENT_P2 ("FFS data %x, doesn't match L1 compilation flag %x", freq_bands, mph_init_rr_ind->freq_bands); | |
1506 TRACE_ERROR ("FFS data doesn't match L1 compilation flag"); | |
1507 TRACE_ASSERT (freq_bands NEQ mph_init_rr_ind->freq_bands); | |
1508 } | |
1509 | |
1510 if (rfp->pow_class4[IDX_PWRCLASS_900].pow_class NEQ mph_init_rr_ind->pclass_900 OR | |
1511 rfp->pow_class4[IDX_PWRCLASS_850].pow_class NEQ mph_init_rr_ind->pclass_850 OR | |
1512 rfp->pow_class4[IDX_PWRCLASS_1800].pow_class NEQ mph_init_rr_ind->pclass_1800 OR | |
1513 rfp->pow_class4[IDX_PWRCLASS_1900].pow_class NEQ mph_init_rr_ind->pclass_1900) | |
1514 { | |
1515 TRACE_EVENT ("FFS Power Class info doesn't match L1 Powe Class info"); | |
1516 TRACE_ERROR ("FFS Power Class info doesn't match L1 Powe Class info"); | |
1517 TRACE_ASSERT (mph_init_rr_ind->pclass_900 NEQ rfp->pow_class4[IDX_PWRCLASS_900].pow_class); | |
1518 } | |
1519 PFREE(mph_init_rr_ind); | |
1520 } | |
1521 #endif | |
1522 | |
1523 #endif |