view src/g23m-gsm/rr/rr_atts.c @ 303:f76436d19a7a default tip

!GPRS config: fix long-standing AT+COPS chance hanging bug There has been a long-standing bug in FreeCalypso going back years: sometimes in the AT command bring-up sequence of an ACI-only MS, the AT+COPS command would produce only a power scan followed by cessation of protocol stack activity (only L1 ADC traces), instead of the expected network search sequence. This behaviour was seen in different FC firmware versions going back to Citrine, and seemed to follow some law of chance, not reliably repeatable. This bug has been tracked down and found to be specific to !GPRS configuration, stemming from our TCS2/TCS3 hybrid and reconstruction of !GPRS support that was bitrotten in TCS3.2/LoCosto version. ACI module psa_mms.c, needed only for !GPRS, was missing in the TCS3 version and had to be pulled from TCS2 - but as it turns out, there is a new field in the MMR_REG_REQ primitive that needs to be set correctly, and that psa_mms.c module is the place where this initialization needed to be added.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 08 Jun 2023 08:23:37 +0000
parents fa8dc04885d8
children
line wrap: on
line source

/*
+-----------------------------------------------------------------------------
|  Project :
|  Modul   :
+-----------------------------------------------------------------------------
|  Copyright 2002 Texas Instruments Berlin, AG
|                 All rights reserved.
|
|                 This file is confidential and a trade secret of Texas
|                 Instruments Berlin, AG
|                 The receipt of or possession of this file does not convey
|                 any rights to reproduce or disclose its contents or to
|                 manufacture, use, or sell anything it may describe, in
|                 whole, or in part, without the specific written consent of
|                 Texas Instruments Berlin, AG.
+-----------------------------------------------------------------------------
|  Purpose :  Handling of BCCH System Information Message and BSIC
+-----------------------------------------------------------------------------
*/

#ifndef RR_ATTS_C
#define RR_ATTS_C

#define ENTITY_RR

/*==== INCLUDES ===================================================*/

#include <string.h>
#include <stdlib.h>
#include <stddef.h>     /* offsetof */
#include "typedefs.h"
#include "pcm.h"
#include "pconst.cdg"
#include "mconst.cdg"
#include "message.h"
#include "ccdapi.h"
#include "vsi.h"
#include "custom.h"
#include "gsm.h"
#include "prim.h"
#include "cnf_rr.h"
#include "tok.h"
#include "rr.h"
#include "rr_em.h"

/*==== EXPORT =====================================================*/

/*==== PRIVAT =====================================================*/

/*==== VARIABLES ==================================================*/

/*==== FUNCTIONS ==================================================*/
LOCAL void att_sys_info_read(USHORT mess_bit);
LOCAL void att_copy_sys_info_2_2bis_par(UBYTE index,
                                        T_VOID_STRUCT *sys_info_2_2bis,
                                        T_LIST         *new_2_2bis_list,
                                        UBYTE           ncell_ext,
                                        T_SI_TYPE        si_type,
                                        UBYTE     indicate_changes);
/*
 * -------------------------------------------------------------------
 * SIGNAL Processing functions
 * -------------------------------------------------------------------
 */

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147)       MODULE  : RR_ATT                     |
| STATE   : code                ROUTINE : att_dat_dedicated          |
+--------------------------------------------------------------------+

  PURPOSE : The data transfer process indicates that the dedicated
            state is reached.

*/

GLOBAL void att_dat_dedicated (void)
{
  GET_INSTANCE_DATA;

  TRACE_FUNCTION ("att_dat_dedicated()");

  /*
   * align attachment process state
   */
  SET_STATE (STATE_ATT, ATT_DEDICATED);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147)       MODULE  : RR_ATT                     |
| STATE   : code                ROUTINE : att_dat_con_est            |
+--------------------------------------------------------------------+

  PURPOSE : The data transfer process indicates that the connection
            establishment state is reached.

*/
GLOBAL void att_dat_con_est (void)
{
  GET_INSTANCE_DATA;
  TRACE_FUNCTION ("att_dat_con_est()");

  /*
   * stop possibly parallel PLMN search
   */
  if ((rr_data->ms_data.rr_service EQ LIMITED_SERVICE) OR 
      (CS_GET_CURRENT_SEARCH_MODE EQ BLACK_LIST_SEARCH_MODE))
  {
    att_notify_stop_plmn_search (FALSE);
    TRACE_EVENT(" PLMN_SEARCH_STOPPED");
  }


  /*
   * If network search is ongoing, abort
   * and allow cell reselection.
   */
  if (rr_data->ms_data.req_mm_service EQ FUNC_NET_SRCH_BY_MMI)
  {
    /*
     * send Please Retry to the MMI
     */
    rr_data->sc_data.found_entries = 0;
    att_code_rr_abort_ind (RRCS_ABORT_CEL_SEL_FAIL);
  }
  /*
   * reset multiband parameter
   */
  rr_data->ncell_mb = 0;

  /*
   * save the neighbour cell list valid in idle mode
   * (derived from SI 2x) to restore it after
   * dedicated mode shorter than 30 seconds
   * Note: SI 5x may contain other neighbour cells than SI 2x
   */
  memcpy(&rr_data->sc_data.ncell_list_idle,
         &rr_data->sc_data.cd.ncell_list,
         sizeof(T_LIST));

  /*
   * align attachment process state
   */
  SET_STATE (STATE_ATT, ATT_CON_EST);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147)       MODULE  : RR_ATT                     |
| STATE   : code                ROUTINE : att_get_index              |
+--------------------------------------------------------------------+

  PURPOSE : Calculates from the arfcn of the cell the index in the
            data structures:

            0-5          neighbour cell
            6            serving cell (SC_INDEX)
            7            cell reselection cell (CR_INDEX)
            255          not present

*/

GLOBAL UBYTE att_get_index (USHORT arfcn)
{
  GET_INSTANCE_DATA;
  UBYTE i;

  TRACE_FUNCTION ("att_get_index()");

  /*
   * check first cell reselection index
   */
  if (arfcn EQ rr_data->nc_data[CR_INDEX].arfcn)
    return CR_INDEX;

  /*
   * then check serving cell index
   */
  if (arfcn EQ rr_data->nc_data[SC_INDEX].arfcn)
    return SC_INDEX;

  /*
   * third step is to check the neighbourcells
   * if available
   */
  for (i=0;i<6;i++)
  {
    if (rr_data->nc_data[i].bcch_status NEQ EMPTY AND
        rr_data->nc_data[i].arfcn EQ arfcn)
      return i;
  }

  /*
   * nothing found
   */
  return NOT_PRESENT_8BIT;
}


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147)       MODULE  : RR_ATT                     |
| STATE   : code                ROUTINE : att_for_sysinfo_type1      |
+--------------------------------------------------------------------+

  PURPOSE : A system information message one has received.

*/

GLOBAL void att_for_sysinfo_type1 (USHORT         arfcn,
                                   T_D_SYS_INFO_1 *sys_info_1,
                                   T_LIST         *cell_chan_desc)
{
  GET_INSTANCE_DATA;
  /*
   * get the storage area by checking the channel number
   */
  UBYTE index = att_get_index (arfcn);

  TRACE_FUNCTION ("att_for_sysinfo_type1()");

  switch (GET_STATE (STATE_ATT))
  {
    case ATT_CS2:
      /*
       * during cell selection only CR_INDEX is taken in account
       */
      if (index EQ CR_INDEX)
      {
        /*
         * copy relevant parameters and check bcch carrier
         * if the BCCH is read completely.
         */
        att_copy_sys_info_1_par (CR_INDEX,
                                 sys_info_1,
                                 cell_chan_desc);
        att_check_bcch_carrier_si ();
      }
      break;

    case ATT_CS3:
      /*
       * during cell reselection only CR_INDEX is taken in account
       */

      /*
       * copy relevant parameters and check neighbourcell bcch carrier
       * if the BCCH is read completely.
       */
      att_copy_sys_info_1_par (index,
                               sys_info_1,
                               cell_chan_desc);

      if (index EQ CR_INDEX)
      {
        att_check_neighbourcell_si_reestab();
      }
      break;

    case ATT_IDLE:
    case ATT_CON_EST:
      switch (index)
      {
        case SC_INDEX:
          /*
           * changed system information type 1 message received for
           * the serving cell. Store relevant parameter and reconfigure
           * Layer 1 and MM if needed
           */
          att_copy_sys_info_1_par (SC_INDEX,
                                   sys_info_1,
                                   cell_chan_desc);
          att_check_barred_status_in_idle ();
          break;

        case CR_INDEX:
          att_copy_sys_info_1_par (CR_INDEX,
                                   sys_info_1,
                                   cell_chan_desc);
          break;

        default:
          break;
      }
      break;
    default:
      break;
  }
}

/* Implements RR Clone findings #19 */
/*unify functions: att_for_sysinfo_type2 , att_for_sysinfo_type2bis by adding a parameter si_type.*/

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147)       MODULE  : RR_ATT                     |
| STATE   : code                ROUTINE : att_for_sysinfo_type2_2bis |
+--------------------------------------------------------------------+

  PURPOSE :   This function handles the SI type 2 and 2Ter common parameters.

*/
GLOBAL void att_for_sysinfo_type2_2bis (USHORT          arfcn,
                                        T_VOID_STRUCT   *sys_info_2_2bis,
                                        T_LIST         *new_2_2bis_list,
                                        UBYTE           ncell_ext,
                                        T_SI_TYPE        si_type)

{
  GET_INSTANCE_DATA;
/*
   * get the storage area by checking the channel number
   */
  UBYTE index = att_get_index (arfcn);

  TRACE_FUNCTION ("att_for_sysinfo_type2_2bis()");
    
  switch (GET_STATE (STATE_ATT))
  {
    case ATT_CS2:
      /*
       * during cell selection only CR_INDEX is taken in account
       */
      if (index EQ CR_INDEX)
      {
        /*
         * copy relevant parameters and check bcch carrier
         * if the BCCH is read completely.
         */

        att_copy_sys_info_2_2bis_par (CR_INDEX,
                                      sys_info_2_2bis,
                                      new_2_2bis_list,
                                      ncell_ext,
                                      si_type,
                                      FALSE);     

        att_check_bcch_carrier_si ();
      }
      break;

    case ATT_CS3:
      /*
       * during cell reselection only CR_INDEX is taken in account
       */
       
      /*      
       * copy relevant parameters and check neighbourcell bcch carrier
       * if the BCCH is read completely.
       */
      att_copy_sys_info_2_2bis_par (index,
                                    sys_info_2_2bis,
                                    new_2_2bis_list,
                                    ncell_ext,
                                    si_type,
                                    FALSE);

      if (index EQ CR_INDEX)
      {        
        att_check_neighbourcell_si_reestab();
      }
      break;

    case ATT_IDLE:
    case ATT_CON_EST:
      switch (index)
      {
        case SC_INDEX:
          /*
           * changed system information type 2/2bis message received for
           * the serving cell. Store relevant parameter and reconfigure
           * Layer 1 and MM if needed
           */
          att_copy_sys_info_2_2bis_par (SC_INDEX,
                                        sys_info_2_2bis,
                                        new_2_2bis_list,
                                        ncell_ext,
                                        si_type,
                                        TRUE);
         
          att_check_barred_status_in_idle ();
#ifdef GPRS          
          if(att_gprs_is_avail() AND (rr_data->sc_data.cd.sys_info_read EQ ALL_SYS_INFO_READ))
          {
            TRACE_EVENT ("SI 2 or 2bis received after SI 13");

            if(rr_data->sc_data.selection_type EQ CELL_RESELECTION_ON_GPRS_ACT)
            {
              TIMERSTOP(T_RESELECT);
            }

            switch (GET_STATE(STATE_GPRS))
            {
            case GPRS_PIM_PBCCH:
              att_gprs_stop_pl();
              break;
            case GPRS_PIM_BCCH:
              att_build_idle_req(SC_INDEX, MODE_SYS_INFO_CHANGE);
              break;
            default: 
              break;
            }
            att_signal_gprs_support();
          }
#endif          
          break;

        case CR_INDEX:
          /*
           * for 2 case:system information 2 is only important to speed up the
           * PLMN available search.
           * for 2bis case:system information type 2bis message is stored. This is needed
           * for PLMN available search. Really taken in account after
           * reception of system info 2,3 or 4.
           */
          att_copy_sys_info_2_2bis_par (CR_INDEX,
                                         sys_info_2_2bis,
                                         new_2_2bis_list,
                                         ncell_ext,
                                         si_type,
                                         FALSE);
          if (si_type EQ SI_TYPE_2)
          {
           /*
           * if all is read, add the PLMN to the found list
           */
            switch (rr_data->ms_data.req_mm_service)
            {
              case FUNC_NET_SRCH_BY_MMI:
               att_check_bcch_carrier_si ();
               break;
              default:
               TRACE_EVENT_P1 ( "req_mm_service:%d", rr_data->ms_data.req_mm_service );
               break;
            }
          }
          break;
      }
      break;
    default:
      break;
  }
}


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147)       MODULE  : RR_ATT                     |
| STATE   : code                ROUTINE : att_for_sysinfo_type2ter   |
+--------------------------------------------------------------------+

  PURPOSE :   A system information message 2ter has received.

*/
GLOBAL void att_for_sysinfo_type2ter (USHORT             arfcn,
                                      T_D_SYS_INFO_2TER *sys_info_2ter,
                                      T_LIST            *new_2ter_list)
{
  GET_INSTANCE_DATA;
  /*
   * get the storage area by checking the channel number
   */
  UBYTE index = att_get_index (arfcn);

  TRACE_FUNCTION ("att_for_sysinfo_type2ter()");

  switch (GET_STATE (STATE_ATT))
  {
    case ATT_CS2:
      /*
       * during cell selection only CR_INDEX is taken in account
       */
      if (index EQ CR_INDEX)
      {
        /*
         * copy relevant parameters and check bcch carrier
         * if the BCCH is read completely.
         */
        att_copy_sys_info_2ter_par (CR_INDEX,
                                    sys_info_2ter,
                                    new_2ter_list,
                                    FALSE);

        att_check_bcch_carrier_si ();
      }
      break;

    case ATT_CS3:
      /*
       * during cell selection only CR_INDEX is taken in account
       */

      /*
       * copy relevant parameters and check bcch carrier
       * if the BCCH is read completely.
       */
      att_copy_sys_info_2ter_par (index,
                                  sys_info_2ter,
                                  new_2ter_list,
                                  FALSE);

      if (index EQ CR_INDEX)
      {
        att_check_neighbourcell_si_reestab();
      }
      break;

    case ATT_IDLE:
    case ATT_CON_EST:
      switch (index)
      {
        case SC_INDEX:
          /*
           * changed system information type 2bis message received for
           * the serving cell. Store relevant parameter and reconfigure
           * Layer 1 and MM if needed
           */
          att_copy_sys_info_2ter_par (SC_INDEX,
                                      sys_info_2ter,
                                      new_2ter_list,
                                      TRUE);
#ifdef GPRS          
          if(att_gprs_is_avail() AND (rr_data->sc_data.cd.sys_info_read EQ ALL_SYS_INFO_READ))
          {
            TRACE_EVENT ("SI 2ter received after SI 13");

            if(rr_data->sc_data.selection_type EQ CELL_RESELECTION_ON_GPRS_ACT)
            {
              TIMERSTOP(T_RESELECT);
            }

            switch (GET_STATE(STATE_GPRS))
            {
            case GPRS_PIM_PBCCH:
              att_gprs_stop_pl();
              break;
            case GPRS_PIM_BCCH:
              att_build_idle_req(SC_INDEX, MODE_SYS_INFO_CHANGE);
              break;
            default: 
              break;
            }
            att_signal_gprs_support();
          }
#endif          
          break;
        case CR_INDEX:
          /*
           * system information type 2bis message is stored. This is needed
           * for PLMN available search. Really taken in account after
           * reception of system info 2,3 or 4.
           */
          att_copy_sys_info_2ter_par (CR_INDEX,
                                      sys_info_2ter,
                                      new_2ter_list,
                                      FALSE);
          break;
      }
      break;
    default:
      break;
  }
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147)       MODULE  : RR_ATT                     |
| STATE   : code                ROUTINE : att_for_sysinfo_type3      |
+--------------------------------------------------------------------+

  PURPOSE :   A system information message 3 has received.

*/

GLOBAL void att_for_sysinfo_type3 (USHORT         arfcn,
                                   T_D_SYS_INFO_3 *sys_info_3)
{
  GET_INSTANCE_DATA;
  /*
   * get the storage area by checking the channel number
   */
  UBYTE index = att_get_index (arfcn);

  TRACE_FUNCTION ("att_for_sysinfo_type3()");

  TRACE_EVENT_P8 ("SI3: MCC=%X%X%X MNC=%X%X%X LAC=%04X CID=%04X",
                  sys_info_3->loc_area_ident.mcc[0],
                  sys_info_3->loc_area_ident.mcc[1],
                  sys_info_3->loc_area_ident.mcc[2],
                  sys_info_3->loc_area_ident.mnc[0],
                  sys_info_3->loc_area_ident.mnc[1],
                  sys_info_3->loc_area_ident.mnc[2],
                  sys_info_3->loc_area_ident.lac,
                  sys_info_3->cell_ident);

  if ( index EQ NOT_PRESENT_8BIT )
    return;

  #ifdef GPRS
  rr_data->nc_data[index].si13_loc_ind = SI13_NOT_PRESENT;
  if(sys_info_3->si3_rest_oct.v_gprs_indic)
    if(sys_info_3->si3_rest_oct.gprs_indic.si13_pos EQ SI13_ON_BCCH_EXT)
      rr_data->nc_data[index].si13_loc_ind = EXTENDED_BCCH;
    else
      rr_data->nc_data[index].si13_loc_ind = NORMAL_BCCH;
  #endif
  switch (GET_STATE (STATE_ATT))
  {
    case ATT_CS2:
      /*
       * during cell selection only CR_INDEX is taken in account
       */
      if (index EQ CR_INDEX)
      {
        /*
         * copy relevant parameters and check bcch carrier
         * if the BCCH is read completely.
         */
        att_copy_sys_info_3_par (CR_INDEX,
                                 sys_info_3,
                                 FALSE);
        /* 
         * During Cell Selection if received SI3 from a PLMN which doesn't match 
         * requested PLMN then no need to wait for remaining SI messages 
         * The First Scan First Attempt is for Full Service search and only  
         * the carriers with Normal Priority  is scanned and for this if the PLMN 
         * doesnot match, then no need to read remaining SIs. In the sucessive scans 
         * i.e First Scan Second Attempt and Second scan all the carriers are scanned 
         * irrespective of the priority and all the SI messages need to be read.
         */
        if ((rr_data->cs_data.scan_mode EQ CS_FIRST_SCAN_FIRST_ATTEMPT) AND
            (rr_data->ms_data.req_mm_service EQ FUNC_PLMN_SRCH) AND 
            (!dat_plmn_equal_req (sys_info_3->loc_area_ident.mcc,
                                  sys_info_3->loc_area_ident.mnc,
                                  rr_data->ms_data.plmn.mcc,
                                  rr_data->ms_data.plmn.mnc)))
        {
          att_set_sys_info_read ( SYS_INFO_4_READ | 
                                  SYS_INFO_1_READ | 
                                  SYS_INFO_2_READ | 
                                  SYS_INFO_2BIS_READ | 
                                  SYS_INFO_2TER_READ, index);
#ifdef GPRS
          att_set_sys_info_read (SYS_INFO_13_READ, index);
#endif    
        }
#ifdef GPRS
        else
        {
        att_check_gprs_supp (sys_info_3->si3_rest_oct.v_gprs_indic,
                             &sys_info_3->si3_rest_oct.gprs_indic);
        }
#endif
        att_check_bcch_carrier_si ();
      }
      break;

    case ATT_CS3:
      /*
       * during cell reselection only CR_INDEX is taken in account
       */

      /*
       * copy relevant parameters and check neighbourcell bcch carrier
       * if the BCCH is read completely.
       */
      att_copy_sys_info_3_par (index,
                               sys_info_3,
                               FALSE); 

      if (index EQ CR_INDEX)
      {
#ifdef GPRS
        att_check_gprs_supp (sys_info_3->si3_rest_oct.v_gprs_indic,
                             &sys_info_3->si3_rest_oct.gprs_indic);
#endif

        att_check_neighbourcell_si_reestab();
      }
      else
      {
        /* We have received some SYS INFO which is not the CR candidate */
        rr_data->nc_data[index].bcch_status  = DECODED;
        rr_data->nc_data[index].bcch_counter = 0;
        rr_data->nc_data[index].c1_counter   = 0;
      }
      break;

    case ATT_IDLE:
    case ATT_CON_EST:
      switch (index)
      {
        case SC_INDEX:
          /*
           * changed system information type 3 message received for
           * the serving cell. Store relevant parameter and reconfigure
           * Layer 1 and MM if needed
           */
#ifdef GPRS
         att_check_gprs_supp (sys_info_3->si3_rest_oct.v_gprs_indic,
                              &sys_info_3->si3_rest_oct.gprs_indic);
#endif

          att_copy_sys_info_3_par (SC_INDEX,
                                   sys_info_3,
                                   TRUE);

          att_check_barred_status_in_idle ();
          break;

        case CR_INDEX:
          /*
           * it is for a cell which is read in parallel during idle mode
           */
          att_copy_sys_info_3_par (CR_INDEX,
                                   sys_info_3,
                                   FALSE);


          /*
           * depending on the requested MM service
           */

/* Implements RR Clone findings #30 */
          att_sys_info_read(SYS_INFO_4_READ);


        
          break;

        case NOT_PRESENT_8BIT:
          /*
           * unexpected channel number
           */
          break;

        default:
          {
            BOOL plmn_ok = TRUE;

            if(rr_data->ms_data.rr_service EQ FULL_SERVICE)
            {
              /*
               * Sometimes the BA list contains cells from other PLMN's
               */
              plmn_ok = dat_plmn_equal_req (sys_info_3->loc_area_ident.mcc,
                                 sys_info_3->loc_area_ident.mnc,
                                 rr_data->ms_data.plmn.mcc,
                                 rr_data->ms_data.plmn.mnc);
            }
            if(plmn_ok)
            {
              /*
               * neighbour cell, copy parameters and set status to decoded.
               */
              att_copy_sys_info_3_par (index,sys_info_3,FALSE);
              att_bcch_status_to_decoded (index);
            }
            else
              TRACE_EVENT_P2("[%u]i%u Ignoring SI3 as plmn_ok = FALSE", rr_data->nc_data[index].arfcn, index);
          }
        break;
      }
      break;
    default:
      break;
  }
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147)       MODULE  : RR_ATT                     |
| STATE   : code                ROUTINE : att_for_sysinfo_type4      |
+--------------------------------------------------------------------+

  PURPOSE : A system information message 4 has received.

*/

GLOBAL void att_for_sysinfo_type4 (USHORT          arfcn,
                                   T_D_SYS_INFO_4 *sys_info_4)
{
  GET_INSTANCE_DATA;
  /*
   * get the storage area by checking the channel number
   */
  UBYTE index = att_get_index (arfcn);

  TRACE_FUNCTION ("att_for_sysinfo_type4()");

  TRACE_EVENT_P7 ("SI4: MCC=%X%X%X MNC=%X%X%X LAC=%04X",
                  sys_info_4->loc_area_ident.mcc[0],
                  sys_info_4->loc_area_ident.mcc[1],
                  sys_info_4->loc_area_ident.mcc[2],
                  sys_info_4->loc_area_ident.mnc[0],
                  sys_info_4->loc_area_ident.mnc[1],
                  sys_info_4->loc_area_ident.mnc[2],
                  sys_info_4->loc_area_ident.lac);

  if ( index EQ NOT_PRESENT_8BIT )
    return;

  #ifdef GPRS
  rr_data->nc_data[index].si13_loc_ind = SI13_NOT_PRESENT;
  if(sys_info_4->si4_rest_oct.v_gprs_indic)
    if(sys_info_4->si4_rest_oct.gprs_indic.si13_pos EQ SI13_ON_BCCH_EXT)
      rr_data->nc_data[index].si13_loc_ind = EXTENDED_BCCH;
    else
      rr_data->nc_data[index].si13_loc_ind = NORMAL_BCCH;
  #endif
  switch (GET_STATE (STATE_ATT))
  {
    case ATT_CS2:
      /*
       * during cell selection only CR_INDEX is taken in account
       */
      if (index EQ CR_INDEX)
      {
        /*
         * copy relevant parameters and check bcch carrier
         * if the BCCH is read completely.
         */
        att_copy_sys_info_4_par (CR_INDEX,
                                 sys_info_4,
                                 FALSE);
        /* 
         * During Cell Selection if received SI4 from a PLMN which doesn't match 
         * requested PLMN then no need to wait for remaining SI messages 
         * The First Scan First Attempt is for Full Service search and only  
         * the carriers with Normal Priority  is scanned and for this if the PLMN 
         * doesnot match, then no need to read remaining SIs. In the sucessive scans 
         * i.e First Scan Second Attempt and Second scan all the carriers are scanned 
         * irrespective of the priority and all the SI messages need to be read.
         */
        if ((rr_data->cs_data.scan_mode EQ CS_FIRST_SCAN_FIRST_ATTEMPT) AND
            (rr_data->ms_data.req_mm_service EQ FUNC_PLMN_SRCH) AND 
            (!dat_plmn_equal_req (sys_info_4->loc_area_ident.mcc,
                                  sys_info_4->loc_area_ident.mnc,
                                  rr_data->ms_data.plmn.mcc,
                                  rr_data->ms_data.plmn.mnc)))
        {
          att_set_sys_info_read ( SYS_INFO_3_READ | 
                                  SYS_INFO_1_READ | 
                                  SYS_INFO_2_READ | 
                                  SYS_INFO_2BIS_READ | 
                                  SYS_INFO_2TER_READ, index);
#ifdef GPRS
          att_set_sys_info_read (SYS_INFO_13_READ, index);
#endif    
        }
#ifdef GPRS
        else
        {
       if (!sys_info_4->cell_select.acs)
       {
         att_check_gprs_supp(sys_info_4->si4_rest_oct.v_gprs_indic,
                             &sys_info_4->si4_rest_oct.gprs_indic);
       }
        }
#endif
        att_check_bcch_carrier_si ();
      }
      break;

    case ATT_CS3:
      /*
       * during cell reselection only CR_INDEX is taken in account
       */

      /*
       * copy relevant parameters and check neighbourcell bcch carrier
       * if the BCCH is read completely.
       */
      att_copy_sys_info_4_par (index,
                               sys_info_4,
                               FALSE);

      if (index EQ CR_INDEX)
      {        
#ifdef GPRS
       if (!sys_info_4->cell_select.acs)
       {
         att_check_gprs_supp(sys_info_4->si4_rest_oct.v_gprs_indic,
                             &sys_info_4->si4_rest_oct.gprs_indic);
       }
#endif
        att_check_neighbourcell_si_reestab();
      }
      else
      {
        if (!sys_info_4->cell_select.acs)
        {
          /*
           * if system information type 4 contains all information
           * for calculation C2, copy this parameter and declare channel
           * as decoded, that means as a candidate for cell reselection.
           */
          att_copy_c2_parameter_si4 (index, &sys_info_4->si4_rest_oct);
          rr_data->nc_data[index].bcch_status  = DECODED;
          rr_data->nc_data[index].bcch_counter = 0;
          rr_data->nc_data[index].c1_counter   = 0;
        }
      }
      break;

    case ATT_IDLE:
    case ATT_CON_EST:
      switch (index)
      {
        case SC_INDEX:
          /*
           * changed system information type 4 message received for
           * the serving cell. Store relevant parameter and reconfigure
           * Layer 1 and MM if needed
           */
          att_copy_sys_info_4_par (SC_INDEX,
                                   sys_info_4,
                                   TRUE);
          att_check_barred_status_in_idle ();
          break;

        case NOT_PRESENT_8BIT:
          /*
           * unexpected channel number, ignore
           */
          break;

        case CR_INDEX:
          /*
           * channel for which RR searches in parallel
           */
          att_copy_sys_info_4_par (CR_INDEX,
                                   sys_info_4,
                                   FALSE);
          if (!sys_info_4->cell_select.acs)
          {
            att_copy_c2_parameter_si4 (index, &sys_info_4->si4_rest_oct);
          }

          /*
           * depending on the service requested by MM
           */

/* Implements RR Clone findings #30 */
          att_sys_info_read(SYS_INFO_3_READ);

          
          break;

        default:
          {
            BOOL plmn_ok = TRUE;

            if(rr_data->ms_data.rr_service EQ FULL_SERVICE)
            {
            /*
             * Sometimes the BA list contains cells from other PLMN's
             */
            plmn_ok = dat_plmn_equal_req (sys_info_4->loc_area_ident.mcc,
                               sys_info_4->loc_area_ident.mnc,
                               rr_data->ms_data.plmn.mcc,
                               rr_data->ms_data.plmn.mnc);
            }
            if(plmn_ok)
            {
              /*
               * Neighbour cell BCCH
               */
              att_copy_sys_info_4_par (index, sys_info_4, FALSE);

              if (!sys_info_4->cell_select.acs)
              {
                /*
                 * if system information type 4 contains all information
                 * for calculation C2, copy this parameter and declare channel
                 * as decoded, that means as a candidate for cell reselection.
                 */
                att_copy_c2_parameter_si4 (index, &sys_info_4->si4_rest_oct);
                att_bcch_status_to_decoded (index);
              }
            }
            else
              TRACE_EVENT_P2("[%u]i%u Ignoring SI4 as plmn_ok = FALSE", rr_data->nc_data[index].arfcn, index);
         }
         break;
      }
      break;

    default:
      break;
  }
}

/* Implements RR Clone findings #2 */
/*unify functions: att_for_sysinfo_type5, att_for_sysinfo_type5bis by adding a parameter si_type*/

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147)       MODULE  : RR_ATT                     |
| STATE   : code                ROUTINE : att_for_sysinfo_type5_5bis      |
+--------------------------------------------------------------------+

  PURPOSE : This function handles the system information type 5 and 5bis
  common parameters.

*/
GLOBAL  void  att_for_sysinfo_type5_5bis(USHORT             arfcn,
                                         T_LIST             *new_5_5bis_list,
                                         UBYTE              old_index,
                                         UBYTE              ncell_ext,
                                         T_SI_TYPE          si_type)

{
  GET_INSTANCE_DATA;
   /*
   * calculate the index for the channel
   */
  UBYTE index = att_get_index (arfcn);

  USHORT cur_si_type_read; /*Current SI type*/
  USHORT oth_si_type_read; /*The other SI type in this function*/
  USHORT oth_si_to_clean;/*The other SI to clean in this function*/

  TRACE_FUNCTION("att_for_sysinfo_type5_5bis()");

  /*
   * only messages for the serving cell are taken in account
   */
  if (index NEQ SC_INDEX)
  {
    return;
  }

  switch (GET_STATE (STATE_ATT))
  {
    case ATT_DEDICATED:
    case ATT_CON_EST:
      if (dat_check_error_flag (SEND_NO_RR_STATUS))
      {
       /*
        * receiving a modified BA indicator forces discarding the current BA
        * receiving a SI5 while the bit SYS_INFO_5_READ is set   or
        * receiving a SI5Bis while the bit  SYS_INFO_5Bis_READ is set
        * indicates a change of the BA list
        * => clear old channel list
        * => delete other SI5x read bit mask
        */
        if(si_type EQ SI_TYPE_5)
        {
          cur_si_type_read = SYS_INFO_5_READ;
          oth_si_type_read = SYS_INFO_5BIS_READ;
          oth_si_to_clean = IND_SI_5BIS;
        }
        else
        {
          cur_si_type_read = SYS_INFO_5BIS_READ;
          oth_si_type_read = SYS_INFO_5_READ;
          oth_si_to_clean = IND_SI_5;
        }

        if (old_index NEQ rr_data->sc_data.ba_index OR
               (rr_data->sc_data.cd.sys_info_read &  ( cur_si_type_read) )EQ
               (cur_si_type_read))
        {
              srv_copy_list (&rr_data->sc_data.cd.ncell_list, new_5_5bis_list,
                          sizeof (T_LIST));
              srv_clear_list(&rr_data->sc_data.five_ter_list);
              rr_data->sc_data.cd.sys_info_read &=
              ~((oth_si_type_read) | SYS_INFO_5TER_READ);
              att_clean_buf( (USHORT)((oth_si_to_clean) | IND_SI_5TER));
        }
        else if ( (rr_data->sc_data.cd.sys_info_read &
                    (cur_si_type_read | oth_si_type_read)) EQ 0 )
        {
            /* neither SI5 nor SI5bis received before */
              srv_copy_list (&rr_data->sc_data.cd.ncell_list,
                             new_5_5bis_list,
                             sizeof (T_LIST));
        }
        else
        {
          /*
           * SI5bis/SI5 received before
           * merge list of sys info 5/sys info 5bis with the old neighbour cell list
           */
           srv_merge_list (&rr_data->sc_data.cd.ncell_list, new_5_5bis_list);
        }
        /* CSI-LLD section:4.1.1.11
         * This function Updates the black list with the BA list received in si5/si5bis
         */
        cs_remove_BA_MA_from_black_list(rr_data->cs_data.region,new_5_5bis_list);

        /*
         * set concerning bit mask
         * if the extension indication not set,
         * the sys info carries the complete BA
         */
        att_set_sys_info_read ((cur_si_type_read), SC_INDEX);
        if (!ncell_ext) /* in case of 5bis, is't possible, that 5bis carries the complete BA???*/ 
        {
          att_set_sys_info_read ((oth_si_type_read), SC_INDEX);
        }

        att_code_mph_ncell_req_dedicated ();
      }
      break;

    default:
      break;
  }
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147)       MODULE  : RR_ATT                     |
| STATE   : code                ROUTINE : att_for_sysinfo_type5ter   |
+--------------------------------------------------------------------+

  PURPOSE : A system information message 5ter has received.

*/

GLOBAL void att_for_sysinfo_type5ter (USHORT             arfcn,
                                      T_LIST            *new_5ter_list)
{
  GET_INSTANCE_DATA;
  /*
   * calculate the index for the channel
   */
  UBYTE index = att_get_index (arfcn);
  TRACE_FUNCTION ("att_for_sysinfo_type5ter()");

  /*
   * only messages for the serving cell are taken in account
   */
  if (index NEQ SC_INDEX)
    return;

  switch (GET_STATE (STATE_ATT))
  {
    case ATT_DEDICATED:
    case ATT_CON_EST:
      if (dat_check_error_flag (SEND_NO_RR_STATUS))
      {
        /*
         * if there is received a new SI5ter, it replaces the old
         * five_ter_list
         */
        att_set_sys_info_read (SYS_INFO_5TER_READ, SC_INDEX);
        srv_copy_list (&rr_data->sc_data.five_ter_list, new_5ter_list,
                       sizeof (T_LIST));

        /* CSI-LLD section:4.1.1.11
         * This function Updates the black list with the BA list received in si5ter
         */
        cs_remove_BA_MA_from_black_list(rr_data->cs_data.region,new_5ter_list);

        att_code_mph_ncell_req_dedicated ();
      }
      break;

    default:
      break;
  }
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147)       MODULE  : RR_ATT                     |
| STATE   : code                ROUTINE : att_for_sysinfo_type6      |
+--------------------------------------------------------------------+

  PURPOSE : A system information type 6 message has received.

*/

/*
 * two tables to convert air-interface coding for dtx (depending on full
 * or halfrate) to the internal coding
 */
static const UBYTE   dtx_halfrate [8] =
                     { FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE };
static const UBYTE   dtx_fullrate [8] =
                     { TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE };


GLOBAL void att_for_sysinfo_type6 (USHORT          arfcn,
                                   T_D_SYS_INFO_6 *sys_info_6)
{
  GET_INSTANCE_DATA;
  /*
   * calculate the index for the channel
   */
  UBYTE     index    = att_get_index (arfcn);
  UBYTE     transfer = FALSE;
  UBYTE     new_dtx;

  TRACE_FUNCTION ("att_for_sysinfo_type6()");

  /*
   * only messages for the serving cell are taken in account
   */
  if (index NEQ SC_INDEX)
    return;

  switch (GET_STATE (STATE_ATT))
  {
    case ATT_DEDICATED:
    case ATT_CON_EST:
      if (dat_check_error_flag (SEND_NO_RR_STATUS))
      {
        /*
         * store location information for the serving cell
         */
        rr_data->nc_data[SC_INDEX].cell_id = sys_info_6->cell_ident;
        memcpy (&rr_data->nc_data[SC_INDEX].lai,
                &sys_info_6->loc_area_ident,
                sizeof (T_loc_area_ident));

        /*
         * set new dtx values
         */
        rr_data->sc_data.cd.dtx_half = dtx_halfrate [(sys_info_6->cell_opt_sacch.dtx2_s << 2) +
                                                   sys_info_6->cell_opt_sacch.dtx_s];
        rr_data->sc_data.cd.dtx_full = dtx_fullrate [(sys_info_6->cell_opt_sacch.dtx2_s << 2) +
                                                   sys_info_6->cell_opt_sacch.dtx_s];
        if (rr_data->sc_data.chan_desc.chan_type EQ 2 OR
            rr_data->sc_data.chan_desc.chan_type EQ 3)
          new_dtx = rr_data->sc_data.cd.dtx_half;
        else
          new_dtx = rr_data->sc_data.cd.dtx_full;

#ifdef TI_PS_FF_QUAD_BAND_SUPPORT
        rr_data->sc_data.cd.band_indicator = sys_info_6->si6_rest_oct.band_indicator;
        att_update_std_band_indicator (rr_data->sc_data.cd.band_indicator);
#endif

        /*
         * Check change of DTX value
         */
        if (rr_data->sc_data.cd.dtx NEQ new_dtx)
        {
            transfer = TRUE;
            rr_data->sc_data.cd.dtx = new_dtx;
        }

        /*
         * Check Power Control Indicator
         */
        if (rr_data->sc_data.cd.cell_options.pow_ctrl NEQ sys_info_6->cell_opt_sacch.pow_ctrl)
        {
            transfer = TRUE;
            rr_data->sc_data.cd.cell_options.pow_ctrl = sys_info_6->cell_opt_sacch.pow_ctrl;
        }

        /*
         * Check Radio Link Timeout
         */
        if (rr_data->sc_data.cd.cell_options.rlt NEQ sys_info_6->cell_opt_sacch.rlt)
        {
            transfer = TRUE;
            rr_data->sc_data.cd.cell_options.rlt = sys_info_6->cell_opt_sacch.rlt;
        }

        /*
         * Copy NCC Permitted
         */
        rr_data->sc_data.cd.ncc_permitted = sys_info_6->ncc_permit;

        /*
         * transfer changed values to layer 1 if available
         */
        if (transfer)
          dat_code_sys_info_change (rr_data->sc_data.cd.dtx,
                                    rr_data->sc_data.cd.cell_options.pow_ctrl,
                                    rr_data->sc_data.cd.cell_options.rlt);
      }
      break;
  }
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147)       MODULE  : RR_ATT                     |
| STATE   : code                ROUTINE : att_for_sysinfo_type7_8    |
+--------------------------------------------------------------------+

  PURPOSE : a system information message type 7 or 8 has received.

*/

GLOBAL void att_for_sysinfo_type7_8 (USHORT          arfcn,
                                     T_D_SYS_INFO_8 *sys_info_8)
{
  GET_INSTANCE_DATA;
  /*
   * calculate the index for the channel
   */
  UBYTE index = att_get_index (arfcn);

  TRACE_FUNCTION ("att_for_sysinfo_type7_8()");

  if ( index EQ NOT_PRESENT_8BIT )
    return;

  switch (GET_STATE (STATE_ATT))
  {
    case ATT_CS2:
    case ATT_IDLE:
    case ATT_CON_EST:
      switch (index)
      {
        case SC_INDEX:
          att_copy_sys_info_7_8_par (SC_INDEX,
                                     sys_info_8);
          break;
        case CR_INDEX:
          att_copy_sys_info_7_8_par (CR_INDEX,
                                     sys_info_8);
          break;
        case NOT_PRESENT_8BIT:
          break;

        default:
          /*
           * Neighbour cell BCCH requested
           */
          att_copy_sys_info_7_8_par (index,
                                     sys_info_8);
          att_bcch_status_to_decoded (index);
          break;
      }
      break;

    case ATT_CS3:
      att_copy_sys_info_7_8_par (index, sys_info_8);
      rr_data->nc_data[index].bcch_status  = DECODED;
      rr_data->nc_data[index].bcch_counter = 0;
      rr_data->nc_data[index].c1_counter   = 0;
      break;
    default:
      break;
  }
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147)       MODULE  : RR_ATT                     |
| STATE   : code                ROUTINE : att_bsic_ind               |
+--------------------------------------------------------------------+

  PURPOSE : Handling of the signal att_bsic_ind from the cell selection
            process. The signal is the positive result of a bsic request
            to layer 1.

*/

GLOBAL void att_bsic_ind (USHORT arfcn, UBYTE rxlev, UBYTE bsic)
{
  GET_INSTANCE_DATA;
  TRACE_FUNCTION ("att_bsic_ind()");

  switch (GET_STATE (STATE_ATT))
  {
    case ATT_CS1:
    case ATT_CS2:
      /*
       * during cell selection
       *
       * store parameters of the carrier
       */
      rr_data->nc_data[CR_INDEX].arfcn = arfcn;
      rr_data->nc_data[CR_INDEX].rxlev = rxlev;
      rr_data->nc_data[CR_INDEX].bsic  = bsic;

      /*
       * prepare reading of the BCCH, clear bitmap
       * and start timer to control the end of BCCH reading.
       */
      att_init_cr_data();
      TIMERSTART (T_RESELECT, TRESELECT_VALUE);
      rr_data->nc_data[CR_INDEX].bcch_error = 0;
      srv_clear_list (&rr_data->cr_data.cd.ncell_list);
      SET_STATE (STATE_ATT, ATT_CS2);
      srv_use_stored_prim ();
      break;

    case ATT_IDLE:
    case ATT_CON_EST:
      /*
       *  A search in parallel to the idle mode is ongoing.
       */
      if (arfcn EQ rr_data->nc_data[SC_INDEX].arfcn)
      {
        /*
         * short cut if this is the current serving cell
         */
        PALLOC (mph_sync_req, MPH_SYNC_REQ);

        mph_sync_req->cs = CS_STOP_BCCH_READING;

        PSENDX (PL, mph_sync_req);

        /*
         * simulate BCCH reading by copying serving cell data
         */
        memcpy (&rr_data->nc_data[CR_INDEX],
                &rr_data->nc_data[SC_INDEX],
                sizeof (T_NC_DATA));
        /* Copy the neighbour cell list also */
        memcpy (&rr_data->cr_data.cd, &rr_data->sc_data.cd,
                sizeof (T_CELL_DATA));

        rr_data->nc_data[CR_INDEX].arfcn = arfcn;
        rr_data->nc_data[CR_INDEX].rxlev = rxlev;
        rr_data->nc_data[CR_INDEX].bsic  = bsic;

        att_check_bcch_carrier ();
      }
      else
      {
        /*
         * store the data from the BSIC confirmation
         */
        rr_data->nc_data[CR_INDEX].arfcn = arfcn;
        rr_data->nc_data[CR_INDEX].rxlev = rxlev;
        rr_data->nc_data[CR_INDEX].bsic  = bsic;

        /*
         * initialize parameters for BCCH reading
         */
        att_init_cr_data();
        TIMERSTART (T_RESELECT, TRESELECT_VALUE);
        srv_use_stored_prim ();
        rr_data->nc_data[CR_INDEX].bcch_error = 0;
        srv_clear_list (&rr_data->cr_data.cd.ncell_list);
      }
      break;

    default:
      break;
  }
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147)       MODULE  : RR_ATT                     |
| STATE   : code                ROUTINE : att_no_bsic_ind            |
+--------------------------------------------------------------------+

  PURPOSE : no bsic indication from cell selection process indicates
            the end of the search for a carrier by BSIC requests.

*/

GLOBAL void att_no_bsic_ind (void)
{
  GET_INSTANCE_DATA;
  TRACE_FUNCTION ("att_no_bsic_ind()");

  switch (GET_STATE (STATE_ATT))
  {
    case ATT_CS1:
    case ATT_CS2:
      /*
       * depending on the service requested by MM
       */
      switch (rr_data->ms_data.req_mm_service)
      {
        case FUNC_NET_SRCH_BY_MMI:
          /*
           * MM has requested the list of available
           * PLMNs. Allow cell reselection decision
           * again and send list to MM.
           */
          rr_data->ms_data.rr_service = NO_SERVICE;
          att_code_rr_abort_ind (RRCS_ABORT_CEL_SEL_FAIL);
          SET_STATE (STATE_ATT, ATT_NO_SERVICE);
          att_start_registration_timer ();
          srv_use_stored_prim ();
          break;

        default:
          /*
           * limited or full serivce requested by MM
           */
          switch (rr_data->ms_data.req_mm_service)
          {
            case FUNC_LIM_SERV_ST_SRCH:
              /*
               * If MM has requested FUNC_PLMN_SRCH
               * but no suitable cell was found and
               * RR tried to reach limited service
               * or MM only requested limited service
               * but RR could not find an acceptable cell
               * return no service
               */
              rr_data->ms_data.rr_service = NO_SERVICE;
              att_reset_old_lai_rac();
              att_code_rr_abort_ind (RRCS_ABORT_CEL_SEL_FAIL);
              SET_STATE (STATE_ATT, ATT_NO_SERVICE);
              att_start_registration_timer ();
              srv_use_stored_prim ();
              break;

            case FUNC_PLMN_SRCH:
              /*
               * no BCCH for full service found
               */
              if(rr_data->cs_data.scan_mode EQ CS_FIRST_SCAN_FIRST_ATTEMPT)
              {

                rr_data->cs_data.scan_mode = CS_FIRST_SCAN_SECOND_ATTEMPT;

                TRACE_EVENT("First Scan First Attempt done");

                /*
                 * first attempt then look for low priority cells
                 */
                if (cs_def_list (LOW_PRIORITY_CELL))
                {

                  TRACE_EVENT("First Scan Second attempt started");
                  /*
                   * low priority cells available, then try it again
                   */
                  cs_start_sync ();
                  break;
                }
              }

              /*
               * no BCCH for full service available and the low
               * priority cells have been tried. Then try
               * to reach limited service by checking
               * for emergency cells
               */
              if (cs_def_list (EMERGENCY_CELL) AND
                  rr_data->cs_data.scan_mode EQ CS_FIRST_SCAN_SECOND_ATTEMPT)
              {
                /*
                 * emergency cells available
                 */
                rr_data->cs_data.scan_mode      = CS_SECOND_SCAN;
                rr_data->ms_data.rr_service     = LIMITED_SERVICE;
                TRACE_EVENT ("no suitable cell found, find acceptable cell");
                /*
                 * clear any pending RR_ESTABLISH_REQ
                 * MM would retransmit RR_ESTABLISH_REQ for emergency calls
                 */
                srv_clear_stored_prim (RR_ESTABLISH_REQ);
                cs_start_sync ();
              }
              else
              {
                /*
                 * no emergency cells availabe, then no service.
                 */
                srv_clear_stored_prim (RR_ESTABLISH_REQ);
                rr_data->ms_data.rr_service = NO_SERVICE;
                att_reset_old_lai_rac();
                att_code_rr_abort_ind (RRCS_ABORT_CEL_SEL_FAIL);
                SET_STATE (STATE_ATT, ATT_NO_SERVICE);
             
                /* CSI-LLD section:4.1.1.10  
                 * This function updates the black list after the first successful 
                 * FUNC_PLMN_SEARCH 
                 */
                if(rr_data->cs_data.initial_plmn_search EQ INITIAL_PLMN_SEARCH_ACTIVE)
                { 
                  cs_update_black_list();
                  rr_data->cs_data.initial_plmn_search = INITIAL_PLMN_SEARCH_DONE;
                }
             
                att_start_registration_timer ();
                TRACE_EVENT ("no acceptable cell found");
                srv_use_stored_prim ();
              }
              break;
            default:
              break;
          }
          break;
      }
      break;

    case ATT_IDLE:
    case ATT_CON_EST:
      switch (rr_data->ms_data.req_mm_service)
      {
        case FUNC_NET_SRCH_BY_MMI:
          /*
           * allow cell reselection decision
           */
          att_code_rr_abort_ind (RRCS_ABORT_CEL_SEL_FAIL);
          att_start_registration_timer ();
          srv_use_stored_prim ();
          break;

        case FUNC_PLMN_SRCH:
          /*
           * no BCCH for full service found
           */
          TRACE_EVENT ("Full Requested, end of Search");
          if (rr_data->ms_data.rr_service EQ LIMITED_SERVICE)
          {
            /* we trap here if RR tried to reach the from MM requested
               FUNC_PLMN_SRCH service
               but could not find a suitable cell
               The acceptable cell will be the serving cell
               we don't look for another one.
             */
            att_reset_old_lai_rac();
            att_code_rr_abort_ind (RRCS_ABORT_CEL_SEL_FAIL);
          }
          else
          {
            /* this was a search for the HPLMN don't inform
             * MM because we have FULL_SERVICE on a VPLMN
             */
            att_notify_stop_plmn_search (FALSE);
#if 0
            if (rr_data->gprs_data.gprs_indic)
            {
              att_signal_gprs_support();
            }
#endif
            EM_HPLMN_SEARCH_FAILED;
          }

          att_start_registration_timer ();
          break;
        case FUNC_LIM_SERV_ST_SRCH:
          /*
           * no BCCH for limited service found
           */
          rr_data->ms_data.rr_service = NO_SERVICE;
          att_reset_old_lai_rac();
          att_code_rr_abort_ind (RRCS_ABORT_CEL_SEL_FAIL);
          SET_STATE (STATE_ATT, ATT_NO_SERVICE);
          att_start_registration_timer ();
          srv_use_stored_prim ();
          break;

        default:
          break;
      }
      break;
  }
}


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147)       MODULE  : RR_ATT                     |
| STATE   : code                ROUTINE : att_full_service_found     |
+--------------------------------------------------------------------+

  PURPOSE : Performs all tasks required after reaching Full Service
            CSI-LLD section:4.1.3.4.1.7

*/

GLOBAL void att_full_service_found(void)
{
  GET_INSTANCE_DATA;

  TRACE_FUNCTION("att_full_service_found()");
  
  /* Stop search mode timers */
  TIMERSTOP(T_FAST_CS);
  TIMERSTOP(T_NORMAL_CS);
  
  /* Update the white list */
  dat_convert_white_list();

  /* Send SI2 info to MM */
  dat_send_bcchinfo_mm (rr_data->cr_data.cr_white_list.si2);

  TRACE_EVENT("RR SERVICE = FULL SERVICE");

}


/*convert into a function (si_type {SI3,SI4})*/

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147)       MODULE  : RR_ATT                     |
| STATE   : code                ROUTINE : att_sys_info_read          |
+--------------------------------------------------------------------+

  PURPOSE : This function sets the sys_info_read flag based on the passed
  system information type

*/
LOCAL void att_sys_info_read(USHORT mess_bit)
{
  GET_INSTANCE_DATA;
  TRACE_FUNCTION("att_sys_info_read()");

  switch (rr_data->ms_data.req_mm_service)
  {
    case FUNC_NET_SRCH_BY_MMI:
     /*
      * PLMN available search
      *
      * it is useless to read system info 1, 2ter and 4
      */
      att_set_sys_info_read ( mess_bit | 
                              SYS_INFO_1_READ | 
                              SYS_INFO_2_READ | 
                              SYS_INFO_2BIS_READ | 
                              SYS_INFO_2TER_READ, CR_INDEX);
#ifdef GPRS
      att_set_sys_info_read (SYS_INFO_13_READ, CR_INDEX);
#endif

      /*
       * enough info available for PLMN available search
       */
      att_check_bcch_carrier_si ();
      break;

    case FUNC_PLMN_SRCH:
      switch (rr_data->ms_data.rr_service)
      {
        case LIMITED_SERVICE:
        /*
         * RR is in limited service. So this search triggered by
         * RR shall reach full service again.
         */
          att_check_fplmn_cell ();
          break;

        default:
          break;
      }
      break;
  }
}
/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147)     MODULE  : RR_ATT                       |
| STATE   : code              ROUTINE : att_copy_sys_info_2_2bis_par |
+--------------------------------------------------------------------+

  PURPOSE : This function handles system information type 2 and 2bis common
  parameters

*/
LOCAL void att_copy_sys_info_2_2bis_par(UBYTE index,
                                        T_VOID_STRUCT *sys_info_2_2bis,
                                        T_LIST         *new_2_2bis_list,
                                        UBYTE           ncell_ext,
                                        T_SI_TYPE        si_type,
                                        UBYTE     indicate_changes)
{
  TRACE_FUNCTION("att_copy_sys_info_2_2bis_par()");

  if (si_type EQ SI_TYPE_2)
  {
    att_copy_sys_info_2_par (index,
                             (T_D_SYS_INFO_2 *)sys_info_2_2bis,
                             new_2_2bis_list,
                             ncell_ext,
                             indicate_changes);     
  }
  else if (si_type EQ SI_TYPE_2BIS)
  {
    att_copy_sys_info_2bis_par (index,
                                (T_D_SYS_INFO_2BIS *)sys_info_2_2bis,
                                new_2_2bis_list,
                                ncell_ext,
                                indicate_changes);
  }

}
          

#endif