view src/g23m-gprs/grr/grr_cpaps.c @ 276:4221c724c664

R2D: preparations for adding LCD hardware suspend handling
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 07 Sep 2021 21:05:38 +0000
parents fa8dc04885d8
children
line wrap: on
line source

/* 
+----------------------------------------------------------------------------- 
|  Project :  GPRS (8441)
|  Modul   :  GRR
+----------------------------------------------------------------------------- 
|  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 :  This module implements signal handler functions for service
|             CPAP of entity GRR.
+----------------------------------------------------------------------------- 
*/ 

#ifndef GRR_CPAPS_C
#define GRR_CPAPS_C
#endif

#define ENTITY_GRR

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

#include "typedefs.h"    /* to get Condat data types */

#include "vsi.h"        /* to get a lot of macros */
#include "macdef.h"
#include "gprs.h"
#include "gsm.h"        /* to get a lot of macros */
#include "ccdapi.h"     /* to get CCD API */
#include "cnf_grr.h"    /* to get cnf-definitions */
#include "mon_grr.h"    /* to get mon-definitions */
#include "prim.h"       /* to get the definitions of used SAP and directions */
#include "message.h"
#include <string.h>
#include "grr.h"        /* to get the global entity definitions */
#include "grr_f.h"
#include "grr_tcs.h"
#include "grr_cpapf.h"




/*==== CONST ================================================================*/

/*==== DIAGNOSTICS ==========================================================*/

/*==== LOCAL VARS ===========================================================*/

/*==== PRIVATE FUNCTIONS ====================================================*/

/*==== PUBLIC FUNCTIONS =====================================================*/
/*
+------------------------------------------------------------------------------
| Function    : sig_tc_cpap_abort_access
+------------------------------------------------------------------------------
| Description : Handles the internal signal SIG_TC_CPAP_ABORT_ACCESS
|
| Parameters  : void
|
+------------------------------------------------------------------------------
*/
GLOBAL void sig_tc_cpap_abort_access ( void ) 
{ 
  TRACE_ISIG( "sig_tc_cpap_abort_access" );

  switch( GET_STATE( CPAP ) )
  {
    case CPAP_WAIT_STOP_TASK_CNF:
      cpap_mfree_ia( FALSE );

      /*lint -fallthrough*/

    case CPAP_SB_STARTED:
    case CPAP_1P_STARTED:
    case CPAP_WAIT_PDCH_ASSIGN: 
      SET_STATE( CPAP, CPAP_IDLE );

      sig_cpap_tc_error_pim();
      break; 
    default:
      TRACE_ERROR( "SIG_TC_CPAP_ABORT_ACCESS unexpected" );
      break;
  }
} /* sig_tc_cpap_abort_access() */

/*
+------------------------------------------------------------------------------
| Function    : sig_tc_cpap_acc_req
+------------------------------------------------------------------------------
| Description : Handles the internal signal SIG_TC_CPAP_ACC_REQ
|
| Parameters  : void
|
+------------------------------------------------------------------------------
*/
GLOBAL void sig_tc_cpap_acc_req ( void ) 
{ 
/*  UBYTE random_value = 0; random value is handled by rr */
  UBYTE req_data = 0;

  TRACE_ISIG( "sig_tc_cpap_acc_req" );

  
 
  switch( GET_STATE( CPAP ) )
  {
    case CPAP_IDLE:
      /* estimate access type */
      switch(grr_data->uplink_tbf.access_type)
      {
        case CGRLC_AT_ONE_PHASE:
        case CGRLC_AT_SHORT_ACCESS:
        /*
           * if ms class allows more than one uplink slot, 
           * then two phase access is triggered.
           * Otherwise multislot uplink is not assigned on some network vendors */
#ifdef _TARGET_  
          if(grr_data->ms_cap[grr_get_gprs_ms_class( )-1].Tx > 1)
          {
            SET_STATE(CPAP,CPAP_SB_STARTED);
            req_data = 0x70;
            TRACE_EVENT_P1("2 PHASE FOR UPLINK MULTISLLOT ms_class=%d"
                             ,grr_get_gprs_ms_class( ));
            break;
          }
#endif
        case CGRLC_AT_PAGE_RESPONSE:
        case CGRLC_AT_MM_PROCEDURE:
        case CGRLC_AT_CELL_UPDATE:
          req_data = 0x78;  
          /*
           * due to 04.08. chapter 9.1.8 random value for last 3 bit 
           * shall be between 0 and 7
           */
          /* random value is handled by rr */
          SET_STATE(CPAP,CPAP_1P_STARTED);
          break;

        case CGRLC_AT_TWO_PHASE:
        case CGRLC_AT_SINGLE_BLOCK:
          req_data = 0x70;  
          /*
           * due to 04.08. chapter 9.1.8 random value for last 3 bit 
           * shall be between 0 and 7
           */
          /* random value is handled by rr */
          SET_STATE(CPAP,CPAP_SB_STARTED);
          break;
        default:
          break;
      }
      {
        PALLOC(rrgrr_gprs_data_req,RRGRR_GPRS_DATA_REQ);

        cpap_build_gprs_data_request(rrgrr_gprs_data_req);
        sig_cpap_tc_send_gprs_data_req(rrgrr_gprs_data_req);
      }
      sig_cpap_tc_channel_req(req_data);
      break;

    default:
      /*
       * SZML-CPAP/017
       */
      TRACE_ERROR( "SIG_TC_CPAP_ACC_REQ unexpected" );
      break;
  }
} /* sig_tc_cpap_acc_req() */




/*
+------------------------------------------------------------------------------
| Function    : sig_tc_cpap_pdch_assign_received
+------------------------------------------------------------------------------
| Description : Handles the internal signal SIG_TC_CPAP_PDCH_ASSIGN_RECEIVED
|
| Parameters  : fn - reception frame number
|
+------------------------------------------------------------------------------
*/
GLOBAL void sig_tc_cpap_pdch_assign_received (T_RRGRR_DATA_IND *rrgrr_data_ind) 
{ 
  TRACE_ISIG( "sig_tc_cpap_pdch_assign_received" );
  grr_data->dl_fn = rrgrr_data_ind->fn;
  grr_data->ul_fn = rrgrr_data_ind->fn;
  switch( GET_STATE( CPAP ) )
  {
    case CPAP_WAIT_PDCH_ASSIGN:
      switch(cpap_eval_pdch_assignment())
      {
        case E_PDCH_ASSIGN_UL:
          memcpy(&grr_data->cpap.pdch_ass_cmd,_decodedMsg,sizeof(T_D_PDCH_ASS_CMD));
          grr_data->cpap.new_tbf_type = CGRLC_TBF_MODE_UL;
          SET_STATE(CPAP,CPAP_WAIT_DEDI_SUSPEND);
          sig_cpap_tc_suspend_dedi_chan();
          break;
        case E_PDCH_ASSIGN_SB:
          break;
        case E_PDCH_ASSIGN_DL:
          break;
        case E_PDCH_ASSIGN_IGNORE:
          break;
        case E_PDCH_ASSIGN_ERROR:
          cpap_send_ass_fail(RRC_CHANNEL_MODE);
          break;
        default:
          break;
      }
      break;
      
    default:
      TRACE_ERROR( "sig_tc_cpap_pdch_assign_received unexpected" );
      break;
  }
} /* sig_tc_cpap_pdch_assign_received() */


/*
+------------------------------------------------------------------------------
| Function    : sig_tc_cpap_ia_received
+------------------------------------------------------------------------------
| Description : Handles the internal signal SIG_TC_CPAP_IA_RECEIVED
|
| Parameters  : void
|
+------------------------------------------------------------------------------
*/
GLOBAL void sig_tc_cpap_ia_received (T_RRGRR_IA_IND *rrgrr_ia_ind) 
{ 
  MCAST(d_imm_assign,D_IMM_ASSIGN); /* T_D_IMM_ASSIGN */
  T_EVAL_IA eval;

  TRACE_ISIG( "sig_tc_cpap_ia_received" );
  
  grr_data->dl_fn = rrgrr_ia_ind->fn;
  grr_data->ul_fn = rrgrr_ia_ind->fn;
  grr_data->r_bit = rrgrr_ia_ind->r_bit; /* chan req is sent at least twice on ccch */
  switch( GET_STATE( CPAP ) )
  {
    case CPAP_SB_STARTED:
    case CPAP_1P_STARTED:
      eval = cpap_eval_ia();
      if(E_IA_TMA_SECOND EQ eval)
      { /* 2nd message of TMA */
        if(grr_data->cpap.v_tma_ia)
        {
          cpap_join_tma_messages();
          eval = cpap_eval_ia();
        }
        else
        {
          TRACE_ERROR("2nd TMA IA received without 1st!");
          SET_STATE(CPAP,CPAP_IDLE);

          sig_cpap_tc_error_pim( );
          return;
        }
      }

      grr_data->cpap.last_ia_type                  = IA_TYPE_UL;
      grr_data->cpap.last_eval_ia.param_ul.eval_ia = eval;
        
      if( E_IA_UL EQ eval )
      { /* Dynamic Allocation */
        grr_data->cpap.v_tma_ia = FALSE;

        if(d_imm_assign->ia_rest_oct.ia_assign_par.pck_upl_ass_ia.tfi_ass_alloc.v_tbf_start_time)
          sig_cpap_tc_send_stop_task_req( DONT_STOP_CCCH );
        else
          sig_cpap_tc_send_stop_task_req( STOP_CCCH );
        
        cpap_malloc_ia( );

        SET_STATE( CPAP, CPAP_WAIT_STOP_TASK_CNF );
        return;
      }
      else if(E_IA_DCCH EQ eval)
      { /* continue on DCCH */
        if(grr_t_status( T3172_1  ) > 0 )
        {
            /*
             * Timer is stil running
             */
            sig_cpap_tc_stop_T3142();
        }
        
        grr_data->cpap.v_tma_ia = FALSE;
        SET_STATE(CPAP,CPAP_WAIT_PDCH_ASSIGN);
      }
      else if(E_IA_SB_2PHASE_ACCESS EQ eval)
      { /* Allocation for 2 Phase of 2_Phase-Access */
        grr_data->cpap.v_tma_ia = FALSE;

        sig_cpap_tc_send_stop_task_req( DONT_STOP_CCCH );
        cpap_malloc_ia( );

        SET_STATE( CPAP, CPAP_WAIT_STOP_TASK_CNF );
      }
      else if(E_IA_TMA EQ eval)
      { /* 1st message of TMA */
        cpap_store_ia_message();
      }
      else if(E_IA_ERROR_RA EQ eval)
      {
        /* errornous messages are ignored?!? */
        TRACE_ERROR("ia message contents nonsense!");
        SET_STATE(CPAP,CPAP_IDLE);
        grr_data->cpap.v_tma_ia = FALSE;
        sig_cpap_tc_error_pim();
      }
      else if(E_IA_NULL EQ eval)
      {
        /* unforeseen mesage  content*/
      }
      else if(E_IA_SB_WITHOUT_TBF EQ eval)
      {
        grr_data->cpap.v_tma_ia = FALSE;

        sig_cpap_tc_send_stop_task_req( DONT_STOP_CCCH );
        cpap_malloc_ia( );

        SET_STATE( CPAP, CPAP_WAIT_STOP_TASK_CNF );
        /*TRACE_EVENT("E_IA_SB_WITHOUT_TBF: stop task");*/
      }
    
      if( grr_data->pwr_ctrl_valid_flags.v_pwr_ctrl_param      OR
          grr_data->pwr_ctrl_valid_flags.v_glbl_pwr_ctrl_param OR
          grr_data->pwr_ctrl_valid_flags.v_freq_param             )
      {
        grr_cgrlc_pwr_ctrl_req( FALSE );
      }
      break;

    case CPAP_IDLE:
    case CPAP_WAIT_PDCH_ASSIGN:
    default:
      TRACE_ERROR( "SIG_TC_CPAP_IA_RECEIVED unexpected" );
      break;
  }
} /* sig_tc_cpap_ia_received() */

/*
+------------------------------------------------------------------------------
| Function    : sig_tc_cpap_iaext_received
+------------------------------------------------------------------------------
| Description : Handles the internal signal SIG_TC_CPAP_IAEXT_RECEIVED
|
| Parameters  : ia_index - indicates the correct immediate assignment
|
+------------------------------------------------------------------------------
*/
GLOBAL void sig_tc_cpap_iaext_received ( T_RRGRR_IAEXT_IND *rrgrr_iaext_ind ) 
{ 
  TRACE_ISIG( "sig_tc_cpap_iaext_received" );
  /* 
   * SZML-CPAP/024
   */
  grr_data->dl_fn = rrgrr_iaext_ind->fn;
  grr_data->ul_fn = rrgrr_iaext_ind->fn;
  grr_data->r_bit = rrgrr_iaext_ind->r_bit; /* chan req is sent at least twice on ccch */

  switch( GET_STATE( CPAP ) )
  {
    case CPAP_IDLE:
      /* SZML-CPAP/025 */
      break;
    case CPAP_SB_STARTED:
    case CPAP_1P_STARTED:
      SET_STATE(CPAP,CPAP_WAIT_PDCH_ASSIGN);
      break;
    case CPAP_WAIT_PDCH_ASSIGN:
      break;

    default:
      TRACE_ERROR( "SIG_TC_CPAP_IAEXT_RECEIVED unexpected" );
      break;
  }
} /* sig_tc_cpap_iaext_received() */

/*
+------------------------------------------------------------------------------
| Function    : sig_tc_cpap_iarej_received
+------------------------------------------------------------------------------
| Description : Handles the internal signal SIG_TC_CPAP_IAREJ_RECEIVED
|
| Parameters  : wait_ind - is taken from the corresponding air message 
|
+------------------------------------------------------------------------------
*/
GLOBAL void sig_tc_cpap_iarej_received (T_RRGRR_ASSIGNMENT_REJ_IND *rrgrr_assignment_rej_ind) 
{ 
  TRACE_ISIG( "sig_tc_cpap_iarej_received" );
  grr_data->r_bit = rrgrr_assignment_rej_ind->r_bit; /* chan req is sent at least twice on ccch */

  switch( GET_STATE( CPAP ) )
  {
    case CPAP_SB_STARTED:
    case CPAP_1P_STARTED:
      if(grr_t_status( T3172_1 ) EQ 0 )
      {
        /*Timer not running*/
        if(rrgrr_assignment_rej_ind->wait_ind)
        {
          sig_cpap_tc_start_T3142(1000 * rrgrr_assignment_rej_ind->wait_ind);
        }
        else
        {
          SET_STATE(CPAP, CPAP_IDLE);

          sig_cpap_tc_error_pim();
        }
      } /* no else path because additional rejects have to be ignored!! */
      break;

    default:
      TRACE_ERROR( "SIG_TC_CPAP_IAREJ_RECEIVED unexpected" );
      break;
  }
} /* sig_tc_cpap_iarej_received() */

/*
+------------------------------------------------------------------------------
| Function    : sig_tc_cpap_ia_downlink_received
+------------------------------------------------------------------------------
| Description : Handles the internal signal SIG_TC_CPAP_IA_DOWNLINK_RECEIVED
|
| Parameters  : void
|
+------------------------------------------------------------------------------
*/
GLOBAL void sig_tc_cpap_ia_downlink_received (T_RRGRR_IA_DOWNLINK_IND *rrgrr_ia_downlink_ind) 
{
  MCAST(d_imm_assign,D_IMM_ASSIGN);/*  T_D_IMM_ASSIGN */
  UBYTE        state = GET_STATE( CPAP );
  T_EVAL_IA_DL eval;

  TRACE_ISIG( "sig_tc_cpap_ia_downlink_received" );

  /* SZML-CPAP/026 */

  grr_data->dl_fn = rrgrr_ia_downlink_ind->fn;
  grr_data->ul_fn = rrgrr_ia_downlink_ind->fn;

  switch( state )
  {
    case CPAP_IDLE:
      eval = cpap_eval_ia_dl();

      if(E_IA_DL_TMA_SECOND EQ eval)
      {
        if(grr_data->cpap.v_tma_ia)
        {
          cpap_join_tma_messages();
          eval = cpap_eval_ia_dl();
        }
        else
        {
          TRACE_ERROR("2nd TMA IA received without 1st!");
          sig_cpap_tc_send_stop_task_req( INVALID_MSG );
          return;
        }
      }

      grr_data->cpap.last_ia_type                     = IA_TYPE_DL;
      grr_data->cpap.last_eval_ia.param_dl.state      = state;
      grr_data->cpap.last_eval_ia.param_dl.eval_ia_dl = eval;  
        
      if(E_IA_DL_SB EQ eval)
      {
        grr_data->cpap.v_tma_ia = FALSE;
        cpap_malloc_ia( );
        sig_cpap_tc_send_stop_task_req( DONT_STOP_CCCH );
        SET_STATE( CPAP, CPAP_WAIT_STOP_TASK_CNF );
      }
      else if(E_IA_DL_ASSIGN EQ eval)
      {
        grr_data->cpap.v_tma_ia = FALSE;
        if(d_imm_assign->ia_rest_oct.ia_assign_par.pck_downl_ass_ia.v_tbf_start_time)
          sig_cpap_tc_send_stop_task_req( DONT_STOP_CCCH );
        else
          sig_cpap_tc_send_stop_task_req( STOP_CCCH );

        cpap_malloc_ia( );
        SET_STATE( CPAP, CPAP_WAIT_STOP_TASK_CNF );
      }
      else if(E_IA_DL_TMA EQ eval)
      {
        cpap_store_ia_message();
      }
      else if(E_IA_DL_NOT_OURS EQ eval)
      {
        TRACE_EVENT("Message not adressed to MS");
        sig_cpap_tc_send_stop_task_req( INVALID_MSG );
      }
      else if(E_IA_DL_IGNORE EQ eval)
      {
        TRACE_EVENT("INVALID DL IA RECEIVED 1 ");
        sig_cpap_tc_send_stop_task_req( INVALID_MSG );
      }

      if( grr_data->pwr_ctrl_valid_flags.v_pwr_ctrl_param      OR
          grr_data->pwr_ctrl_valid_flags.v_glbl_pwr_ctrl_param OR
          grr_data->pwr_ctrl_valid_flags.v_freq_param             )
      {
        grr_cgrlc_pwr_ctrl_req( FALSE );
      }
      break;      
    case CPAP_SB_STARTED:
    case CPAP_1P_STARTED:
      eval = cpap_eval_ia_dl();

      if(E_IA_DL_TMA_SECOND EQ eval)
      {
        if(grr_data->cpap.v_tma_ia)
        {
          cpap_join_tma_messages();
          eval = cpap_eval_ia_dl();
        }
        else
        {
          TRACE_ERROR("2nd TMA IA received without 1st!");
          sig_cpap_tc_send_stop_task_req( INVALID_MSG );
          return;
        }
      }

      grr_data->cpap.last_ia_type                     = IA_TYPE_DL;
      grr_data->cpap.last_eval_ia.param_dl.state      = state;
      grr_data->cpap.last_eval_ia.param_dl.eval_ia_dl = eval;  

        
      if(E_IA_DL_ASSIGN EQ eval)
      {
        grr_data->cpap.v_tma_ia = FALSE;       
        if(d_imm_assign->ia_rest_oct.ia_assign_par.pck_downl_ass_ia.v_tbf_start_time)
          sig_cpap_tc_send_stop_task_req( DONT_STOP_CCCH );
        else
          sig_cpap_tc_send_stop_task_req( STOP_CCCH );
        
        cpap_malloc_ia( );
        SET_STATE( CPAP, CPAP_WAIT_STOP_TASK_CNF );
      }
      else if(E_IA_DL_SB EQ eval)
      {
        TRACE_EVENT_P3("IA_DL_SB ia_type=%d dl_state =%d eval_ia=%d",grr_data->cpap.last_ia_type
                                                                    ,grr_data->cpap.last_eval_ia.param_dl.state
                                                                    ,grr_data->cpap.last_eval_ia.param_dl.eval_ia_dl);
        grr_data->cpap.v_tma_ia = FALSE;
        cpap_malloc_ia( );
        sig_cpap_tc_send_stop_task_req( DONT_STOP_CCCH );
        SET_STATE( CPAP, CPAP_WAIT_STOP_TASK_CNF );
      }
      else if(E_IA_DL_TMA EQ eval)
      {
        cpap_store_ia_message();
      }
      else if(E_IA_DL_NOT_OURS EQ eval)
      {
        sig_cpap_tc_send_stop_task_req( INVALID_MSG );
        TRACE_EVENT("Message not addressed to MS");
      }
      else if(E_IA_DL_IGNORE EQ eval)
      {
        TRACE_EVENT("INVALID DL IA RECEIVED  2 ");
        sig_cpap_tc_send_stop_task_req( INVALID_MSG );
      }
    
      if( grr_data->pwr_ctrl_valid_flags.v_pwr_ctrl_param      OR
          grr_data->pwr_ctrl_valid_flags.v_glbl_pwr_ctrl_param OR
          grr_data->pwr_ctrl_valid_flags.v_freq_param             )
      {
        grr_cgrlc_pwr_ctrl_req( FALSE );
      }
      break;      
    case CPAP_WAIT_STOP_TASK_CNF:
      {
        TRACE_EVENT( "SIG_TC_CPAP_IA_DOWNLINK_RECEIVED processing of another IA not finished" );
      }
      break;
    default:
      {
        TRACE_ERROR( "SIG_TC_CPAP_IA_DOWNLINK_RECEIVED unexpected" );
        sig_cpap_tc_send_stop_task_req( INVALID_MSG );
      }
      break;
  }
} /* sig_tc_cpap_ia_downlink_received() */

/*
+------------------------------------------------------------------------------
| Function    : sig_tc_cpap_stop_task_cnf_received
+------------------------------------------------------------------------------
| Description : Handles the internal signal SIG_TC_CPAP_STOP_TASK_CNF
|
| Parameters  : 
|
+------------------------------------------------------------------------------
*/
GLOBAL void sig_tc_cpap_stop_task_cnf_received( void )
{ 
  T_TBF_TYPE tbf_type;

  TRACE_ISIG( "sig_tc_cpap_stop_task_cnf_received" );
/*
  TRACE_EVENT_P3("IA_DL_SB ia_type=%d dl_state =%d eval_ia=%d",grr_data->cpap.last_ia_type
                                                                    ,grr_data->cpap.last_eval_ia.param_dl.state
                                                                    ,grr_data->cpap.last_eval_ia.param_dl.eval_ia_dl);
*/
  switch( GET_STATE( CPAP ) )
  {
    case CPAP_WAIT_STOP_TASK_CNF:

      cpap_mfree_ia( TRUE );

      switch( grr_data->cpap.last_ia_type )
      {
        case IA_TYPE_UL:
          
          switch( grr_data->cpap.last_eval_ia.param_ul.eval_ia )
          {
            case E_IA_UL:
              tbf_type = CGRLC_TBF_MODE_UL;            
              if( cpap_send_assign_req_ia( tbf_type ) )
              {
                if(grr_t_status( T3172_1 ) > 0 )
                {
                  sig_cpap_tc_stop_T3142( );
                }
                
                SET_STATE( CPAP,CPAP_IDLE );
                
                sig_cpap_tc_tbf_created( tbf_type );
              }
              else
              {
                SET_STATE( CPAP,CPAP_IDLE );
                
                sig_cpap_tc_error_pim();
              }
              break;
          case E_IA_SB_2PHASE_ACCESS:              
              if(cpap_send_resource_request_ia())
              {
                SET_STATE( CPAP,CPAP_IDLE );
                if(grr_t_status( T3172_1 ) > 0 )
                {
                  sig_cpap_tc_stop_T3142();
                }
              }
              else
              {
                SET_STATE( CPAP,CPAP_IDLE );
                sig_cpap_tc_error_pim();
              }
              break;
            case E_IA_SB_WITHOUT_TBF:
              SET_STATE(CPAP,CPAP_IDLE);
              /*TRACE_EVENT("E_IA_SB_WITHOUT_TBF: stop task cnf received");*/
              if(cpap_send_single_block_without_tbf())
              {
                if(grr_t_status( T3172_1 ) > 0 )
                {
                  sig_cpap_tc_stop_T3142();
                }
              }
              else
              {
                sig_cpap_tc_error_pim();
              }
              break;
             default:
               SET_STATE( CPAP, CPAP_IDLE );
               TRACE_ERROR( "SIG_TC_CPAP_STOP_TASK_CNF: eval_ia invalid" );
               return;
          }

          break;

        case IA_TYPE_DL:

          switch( grr_data->cpap.last_eval_ia.param_dl.state )
          {
            case CPAP_IDLE:
            case CPAP_SB_STARTED:
            case CPAP_1P_STARTED:
              switch( grr_data->cpap.last_eval_ia.param_dl.eval_ia_dl )
              {
                case E_IA_DL_ASSIGN:
                  if( cpap_send_assign_req_ia( CGRLC_TBF_MODE_DL ) )
                  {
                    if(grr_t_status( T3172_1 ) > 0 )
                    {
                      sig_cpap_tc_stop_T3142( );
                    }                
                    sig_cpap_tc_tbf_created( CGRLC_TBF_MODE_DL );
                  }
                  else
                  {               
                    sig_cpap_tc_error_pim();
                  }
                break;
                case E_IA_DL_SB:
                  if(!cpap_send_receive_normal_burst())
                  {
                    sig_cpap_tc_error_pim();
                  }
                  else if(grr_t_status( T3172_1 ) > 0)
                  {
                    sig_cpap_tc_stop_T3142();
                  }
                  break;
                default:
                  TRACE_ERROR( "SIG_TC_CPAP_STOP_TASK_CNF: eval_ia_dl invalid cpap_sb_1p_started" );
                  sig_cpap_tc_error_pim();
                  return;
              }
              SET_STATE( CPAP,CPAP_IDLE );
              break;

            default:
               SET_STATE( CPAP, CPAP_IDLE );
               TRACE_ERROR( "SIG_TC_CPAP_STOP_TASK_CNF: state invalid" );
               return;
          }
          break;

        default:
          SET_STATE( CPAP, CPAP_IDLE );
          TRACE_ERROR( "SIG_TC_CPAP_STOP_TASK_CNF: last_ia_type invalid" );
          return;
      }
      break;

    default:
      TRACE_ERROR( "SIG_TC_CPAP_STOP_TASK_CNF unexpected" );
      break;
  }
} /* sig_tc_cpap_stop_task_cnf_received() */

/*
+------------------------------------------------------------------------------
| Function    : sig_tc_cpap_new_cell
+------------------------------------------------------------------------------
| Description : Handles the internal signal SIG_TC_CPAP_NEW_CELL in case of 
|               T3142 is running it shall bestopped. New Access procedures if 
|               necessary will be started by service TC.
|
| Parameters  : void
|
+------------------------------------------------------------------------------
*/
GLOBAL void sig_tc_cpap_new_cell ( void ) 
{ 
  if( GET_STATE( CPAP ) EQ CPAP_WAIT_STOP_TASK_CNF )
  {
    cpap_mfree_ia( FALSE );
  }

  SET_STATE(CPAP,CPAP_IDLE);
} /* sig_tc_cpap_new_cell() */




/*
+------------------------------------------------------------------------------
| Function    : sig_tc_cpap_con_res_fail
+------------------------------------------------------------------------------
| Description : Handles the internal signal SIG_TC_CPAP_CON_RES_FAIL  
|
| Parameters  : void
|
+------------------------------------------------------------------------------
*/
GLOBAL void sig_tc_cpap_con_res_fail ( void ) 
{ 
  TRACE_ISIG( "sig_tc_cpap_con_res_fail" );

  switch(GET_STATE(CPAP))
  {
    default:
      TRACE_ERROR("sig_tc_cpap_con_res_fail unexpected!");
      break;
    case CPAP_IDLE:
      SET_STATE(CPAP,CPAP_WAIT_PDCH_ASSIGN);
      sig_cpap_tc_resume_dedi_chan();
      cpap_send_ass_fail(RRC_PROT_UNSPECIFIED);
      break;
  }
  
      
} /* sig_tc_cpap_con_res_fail() */



/*
+------------------------------------------------------------------------------
| Function    : sig_tc_cpap_suspend_dcch_cnf
+------------------------------------------------------------------------------
| Description : Handles the internal signal SIG_TC_CPAP_SUSPEND_DCCH_CNF  
|
| Parameters  : void
|
+------------------------------------------------------------------------------
*/
GLOBAL void sig_tc_cpap_suspend_dcch_cnf ( void ) 
{ 
  TRACE_ISIG( "sig_tc_cpap_suspend_dcch_cnf" );

  switch(GET_STATE(CPAP))
  {
    case CPAP_WAIT_DEDI_SUSPEND:
      memcpy(_decodedMsg,&grr_data->cpap.pdch_ass_cmd,sizeof(T_D_PDCH_ASS_CMD));
      cpap_send_assign_req_pdch(grr_data->cpap.new_tbf_type);
      sig_cpap_tc_ctrl_ptm();
      sig_cpap_tc_tbf_created(grr_data->cpap.new_tbf_type);

      break;
    default:
      TRACE_ERROR("sig_tc_cpap_suspend_dcch_cnf unexpected!");
      break;
  }
  
      
} /* sig_tc_cpap_suspend_dcch_cnf() */

/*
+------------------------------------------------------------------------------
| Function    : sig_tc_cpap_t3142
+------------------------------------------------------------------------------
| Description : Handles the internal signal SIG_TC_CPAP_T3142
|
| Parameters  : void
|
+------------------------------------------------------------------------------
*/
GLOBAL void sig_tc_cpap_t3142 ( void )
{ 
  TRACE_FUNCTION( "sig_tc_cpap_t3142" );
  
  switch( GET_STATE( CPAP ) )
  {

      
    case CPAP_IDLE:
      /* nothing to do */
      TRACE_EVENT( "SIG_TC_CPAP_T3142 in CPAP_IDLE: nothing to do" );
      /* this should not happen */
      break;
    case CPAP_1P_STARTED:
    case CPAP_SB_STARTED:
      SET_STATE(CPAP,CPAP_IDLE);
      /* sig_cpap_tc_error_pim(); */
      break;
    case CPAP_WAIT_STOP_TASK_CNF:
      SET_STATE(CPAP,CPAP_IDLE);

      cpap_mfree_ia( FALSE );
      /* sig_cpap_tc_error_pim(); */
      break;
    default:
      TRACE_ERROR( "SIG_TC_CPAP_T3142 unexpected" );
      break;

  }

} /* sig_tc_cpap_t3142() */

/*
+------------------------------------------------------------------------------
| Function    : sig_tc_cpap_reconnect_ind
+------------------------------------------------------------------------------
| Description : Handles the internal signal SIG_TC_CPAP_RECONNECT_IND  
|
| Parameters  : void
|
+------------------------------------------------------------------------------
*/

GLOBAL void sig_tc_cpap_reconnect_ind ( void )
{
    switch(GET_STATE(CPAP))
  {
    case CPAP_WAIT_STOP_TASK_CNF:
      cpap_mfree_ia( FALSE );

      /*lint -fallthrough*/

    case CPAP_IDLE:
    case CPAP_SB_STARTED:
    case CPAP_1P_STARTED:
    case CPAP_WAIT_DEDI_SUSPEND:
      SET_STATE(CPAP,CPAP_WAIT_PDCH_ASSIGN);
      break;
    default:
      TRACE_ERROR("sig_tc_cpap_reconnect_ind unexpected!");
      break;
  }
} /* sig_tc_cpap_reconnect_ind ()*/