view src/g23m-gprs/grr/grr_gfpf.c @ 50:a9a7d531e673

components: initial support for gcc
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 19 Jul 2018 19:23:19 +0000
parents d393cd9bb723
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 local functions for service GFP of
|             entity GRR.
+----------------------------------------------------------------------------- 
*/ 

#ifndef GRR_GFPF_C
#define GRR_GFPF_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 "prim.h"       /* to get the definitions of used SAP and directions */
#include "message.h"
#include "grr.h"        /* to get the global entity definitions */
#include "grr_f.h"      /* to get the global entity procedure definitions */
#include "grr_pgs.h"   
#include "grr_psis.h"   
#include "grr_css.h"   
#include "grr_meass.h"   
#include "grr_tcs.h"   
#include "grr_ctrls.h" 
#include <stdio.h>
#include "cl_rlcmac.h"

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


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

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

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

/*==== PUBLIC FUNCTIONS =====================================================*/
/*
+------------------------------------------------------------------------------
| Function    : gfp_init
+------------------------------------------------------------------------------
| Description : The function gfp_init() initialize all service relevant 
|               variables.
|
| Parameters  : void
|
+------------------------------------------------------------------------------
*/
GLOBAL void gfp_init ( void )
{ 
  TRACE_FUNCTION( "gfp_init" );

  INIT_STATE(GFP,GFP_IDLE);
    
} /* gfp_init() */

/*
+------------------------------------------------------------------------------
| Function    : gfp_prcs_ctrl_msg
+------------------------------------------------------------------------------
| Description : 
|
| Parameters  : 
|
+------------------------------------------------------------------------------
*/
GLOBAL BOOL gfp_prcs_ctrl_msg ( UBYTE* l2_frame,
                                UBYTE  l2_channel,
                                UBYTE  relative_position,
                                ULONG  frame_number )
{ 
  T_MSGBUF * message_complete;
  UBYTE      message_type;
  T_D_HEADER temp_header;
  BOOL       ms_paging_group;
  BOOL       address;
  BOOL       result = FALSE;
#ifdef REL99
  T_TIME time_to_poll=0;
#endif

  TRACE_FUNCTION( "gfp_prcs_ctrl_msg" );

  grr_decode_rlcmac( l2_frame, &temp_header );

#ifdef _SIMULATION_

  TRACE_EVENT_P1( "Control message at FN = %ld", frame_number );

#endif /* #ifdef _SIMULATION_ */

  if( temp_header.payload EQ CTRL_BLK_NO_OPT OR
      temp_header.payload EQ CTRL_BLK_OPT       )  
  {
    ULONG tc_user        = TC_USER4;
    UBYTE trace_msg_type = D_MSG_TYPE_2ND_SEGMENT_c;
    
    if( temp_header.payload     EQ CTRL_BLK_NO_OPT OR 
        temp_header.d_ctrl.rbsn EQ 0                  )
    {
      trace_msg_type = temp_header.d_ctrl.msg_type;
    }

    if( trace_msg_type EQ D_DL_DUMMY_c )
    {
      tc_user = TC_USER5;
    }
    
    TRACE_BINDUMP( hCommGRR, tc_user,
                   cl_rlcmac_get_msg_name( trace_msg_type, RLC_MAC_ROUTE_DL ),
                   l2_frame, MAX_L2_FRAME_SIZE ); /*lint !e569*/

    message_complete = grr_handle_rlcmac_header( PACKET_MODE_PIM,
                                                 &temp_header,
                                                 frame_number );

    if( message_complete NEQ NULL )
    {
      message_type    = grr_decode_grr( message_complete );
      ms_paging_group = ( l2_channel EQ L2_PCHANNEL_PPCH ); 

      /*
       * check address 
       */
      switch( message_type )
      {
        case D_ACCESS_REJ_c:                 /* Packet Access Reject                 */
        case D_CELL_CHAN_ORDER_c:            /* Packet Cell Change Order             */
        case D_DL_ASSIGN_c:                  /* Packet Downlink Assignment           */
        case D_MEAS_ORDER_c:                 /* Packet Measurement Order             */
        case D_PAGING_REQ_c:                 /* Packet Paging Request                */
        case D_POLLING_REQ_c:                /* Packet Polling Request               */
        case D_PRACH_PAR_c:                  /* Packet PRACH Parameters              */
        case D_QUEUING_NOT_c:                /* Packet Queuing Notification          */
        case D_UL_ASSIGN_c:                  /* Packet Uplink Assignment             */
        case D_DL_DUMMY_c:                   /* Packet Downlink Dummy Control Block  */
        case PSI_1_c:                        /* Packet System Information Type 1     */
        case PSI_2_c:                        /* Packet System Information Type 2     */
        case PSI_3_c:                        /* Packet System Information Type 3     */
        case PSI_3_BIS_c:                    /* Packet System Information Type 3 bis */
#if defined (REL99) AND defined (TI_PS_FF_EMR)
        case PSI_3_TER_c:                    /* Packet System Information Type 3 ter */
#endif
        case PSI_4_c:                        /* Packet System Information Type 4     */
        case PSI_5_c:                        /* Packet System Information Type 5     */
#ifdef REL99
        case PSI_8_c:                        /* Packet System Information Type 8     */
#endif
          address = grr_check_address( message_type,0xFF );
          {
            /* the MS shall take into account the page mode info in any message on PCCCH */
            MCAST( d_dl_assign, D_DL_ASSIGN );

            sig_gfp_pg_mode( d_dl_assign->page_mode, ms_paging_group );
          }
          break;
        
        default:
        case D_PDCH_RELEASE_c:
        case D_CTRL_PWR_TA_c:
        case D_TS_RECONFIG_c:
        case D_TBF_RELEASE_c:
        case D_UL_ACK_c:
        case PSI_13_c:
          address = FALSE;

          TRACE_EVENT( "gfp_prcs_ctrl_msg: unexpected control message type" );
          break;
      }

      if( !address )
      {                
        return( result );
      }

      /* 0460 - Section 10.4.5 
        * MS shall ignore the RRBP field if received as part of  
        * packet access reject (or) packet queue notification (or) packet paging request meassages
        * Avoid sending Poll response */
      if ( message_type NEQ D_ACCESS_REJ_c AND 
           message_type NEQ D_QUEUING_NOT_c AND
           message_type NEQ D_PAGING_REQ_c )
      {
      /*
       * save poll position
       */
      if( temp_header.d_ctrl.sp )
      {
        MCAST( d_poll_req, D_POLLING_REQ);


        if( message_type EQ D_POLLING_REQ_c )
        {
          if( d_poll_req->ctrl_ack_type EQ 0 )
          {
            sig_gfp_tc_poll_ind(frame_number,temp_header.d_ctrl.rrbp,CGRLC_POLL_RES_AB,temp_header.pctrl_ack);
          }
          else
          {
            sig_gfp_tc_poll_ind(frame_number,temp_header.d_ctrl.rrbp,CGRLC_POLL_RES_NB,temp_header.pctrl_ack);
          }
        }
        else if(psc_db->gprs_cell_opt.ctrl_ack_type)
        {
          sig_gfp_tc_poll_ind(frame_number,temp_header.d_ctrl.rrbp,CGRLC_POLL_RES_NB,temp_header.pctrl_ack);
        }
        else
        {
          sig_gfp_tc_poll_ind(frame_number,temp_header.d_ctrl.rrbp,CGRLC_POLL_RES_AB,temp_header.pctrl_ack);
        }
#ifdef REL99
        time_to_poll = grr_get_time_to_send_poll(temp_header.d_ctrl.rrbp);
#endif
      }
      }
/*

      if( message_type EQ ... )
      {
        ULONG trace[5];

        trace[0]  = l2_frame[0]  << 24;
        trace[0] |= l2_frame[1]  << 16; 
        trace[0] |= l2_frame[2]  <<  8; 
        trace[0] |= l2_frame[3]  <<  0; 

        trace[1]  = l2_frame[4]  << 24;
        trace[1] |= l2_frame[5]  << 16; 
        trace[1] |= l2_frame[6]  <<  8; 
        trace[1] |= l2_frame[7]  <<  0; 

        trace[2]  = l2_frame[8]  << 24;
        trace[2] |= l2_frame[9]  << 16; 
        trace[2] |= l2_frame[10] <<  8; 
        trace[2] |= l2_frame[11] <<  0; 

        trace[3]  = l2_frame[12] << 24;
        trace[3] |= l2_frame[13] << 16; 
        trace[3] |= l2_frame[14] <<  8; 
        trace[3] |= l2_frame[15] <<  0; 

        trace[4]  = l2_frame[16] << 24;
        trace[4] |= l2_frame[17] << 16; 
        trace[4] |= l2_frame[18] <<  8; 
        trace[4] |= l2_frame[19] <<  0; 

        TRACE_EVENT_P8( "RLC_CTRL: %08X%08X%08X%08X%08X%02X%02X%02X",
                        trace[0], trace[1], trace[2], trace[3], trace[4],
                        l2_frame[20], l2_frame[21], l2_frame[22] ); 
      }

*/

      switch( message_type )
      {
        case D_ACCESS_REJ_c:                 /* Packet Access Reject */
          {
            
            sig_gfp_tc_access_rej( );
          }
          break;

        case D_QUEUING_NOT_c:                /* Packet Queuing Notification */
          {
            
            sig_gfp_tc_queuing_not( );
          }
          break; 

        case D_UL_ASSIGN_c:                  /* Packet Uplink Assignment */
          {
            MCAST( d_ul_assign, D_UL_ASSIGN );
            

            if( d_ul_assign->v_pers_lev )
            {
              sig_gfp_psi_save_persistence_level( &d_ul_assign->pers_lev );
            }
            
            sig_gfp_tc_ul_assign( );

            result = TRUE;
          } 
          break;

        case D_DL_ASSIGN_c:                  /* Packet Downlink Assignment */
          {
            MCAST( d_dl_assign, D_DL_ASSIGN );


            if( d_dl_assign->v_pers_lev )
            {
              sig_gfp_psi_save_persistence_level( &d_dl_assign->pers_lev );
            }

            sig_gfp_tc_dl_assign( );

            result = TRUE;
          }
          break;

        case D_PAGING_REQ_c:                 /* Packet Paging Request */
          {
            MCAST( d_paging_req, D_PAGING_REQ );


            if( d_paging_req->v_pers_lev )
            {
              sig_gfp_psi_save_persistence_level( &d_paging_req->pers_lev );
            }

            sig_gfp_pg_req( );
          }
          break;

        case PSI_1_c:                        /* Packet System Information Type 1 */
          {

            sig_gfp_psi_1( );
          }
          break;

        case PSI_2_c:                        /* Packet System Information Type 2 */
          {

            sig_gfp_psi_2( relative_position );
          }
          break;

        case PSI_3_c:                        /* Packet System Information Type 3 */
          {

            sig_gfp_psi_3( relative_position );
          }
          break;

        case PSI_3_BIS_c:                    /* Packet System Information Type 3 bis */
          {

            sig_gfp_psi_3_bis( relative_position );
          }
          break;

#if defined (REL99) AND defined (TI_PS_FF_EMR)
        case PSI_3_TER_c:                    /* Packet System Information Type 3 ter */
          {
            sig_gfp_psi_3_ter( relative_position );
          }
          break;
#endif

        case PSI_4_c:                        /* Packet System Information Type 4 */
          {

            sig_gfp_psi_4( relative_position );
          }
          break;

        case PSI_5_c:                        /* Packet System Information Type 5 */
          {

            sig_gfp_psi_5( relative_position );
          }
          break;

#ifdef REL99
        case PSI_8_c:                        /* Packet System Information Type 8 */
          {

            sig_gfp_psi_8( relative_position );
          }
          break;
#endif

        case D_CELL_CHAN_ORDER_c:            /* Packet Cell Change Order */
          {
#ifdef REL99
            sig_gfp_ctrl_cc_order(time_to_poll);
#else
            sig_gfp_ctrl_cc_order( );
#endif
          }
          break;

        case D_DL_DUMMY_c:                   /* Packet Downlink Dummy Control Block */
          {
            MCAST( d_dl_dummy, D_DL_DUMMY );

            if(  d_dl_dummy->v_pers_lev  )
            {
              sig_gfp_psi_save_persistence_level( &d_dl_dummy->pers_lev );
            }


            /* 
             * This message is not send to any other service.
             */
          }
          break;

        case D_MEAS_ORDER_c:                 /* Packet Measurement Order */
          {

            sig_gfp_meas_order( );
          }
          break;

        case D_POLLING_REQ_c:                /* Packet Polling Request */
          {

            /* 
             * No signal to GRR, polling is handled with grr_poll_pos_ind
             */
          }
          break;

        case D_PRACH_PAR_c:                  /* Packet PRACH Parameters */
          {

            sig_gfp_psi_prach( );
          }
          break;

        default:
          TRACE_ERROR( "gfp_prcs_ctrl_msg: unexpected control message type" );
          break;
      } /* switch( message_type ) */

      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 );
      }
    } /* if( message_complete NEQ NULL ) */ 
    else 
    {
      TRACE_EVENT_P1( "Incomplete control message at FN = %ld", frame_number );
    }
  }/* if( temp_header.payload EQ CTRL_BLK_NO_OPT OR temp_header.payload EQ CTRL_BLK_OPT )  */
  else 
  {
    TRACE_ERROR( "gfp_prcs_ctrl_msg: unexpected paylaod type" );

    TRACE_BINDUMP( hCommGRR, TC_USER4,
                   cl_rlcmac_get_msg_name( D_MSG_TYPE_UNKNOWN_c, RLC_MAC_ROUTE_DL ),
                   l2_frame, MAX_L2_FRAME_SIZE ); /*lint !e569*/
  }

  return( result );

} /* gfp_prcs_ctrl_msg() */



/*
+------------------------------------------------------------------------------
| Function    : gfp_check_tfi
+------------------------------------------------------------------------------
| Description : The function gfp_check_tfi() .... 
|
| Parameters  : ptr_header_i - header parameter
|               tn           - timeslot
|
+-------------------------------------------------------------------------------
*/
GLOBAL BOOL gfp_check_tfi ( T_D_HEADER * ptr_header_i , UBYTE tn)
{ 
  BOOL result;
  TRACE_FUNCTION( "gfp_check_tfi" );

  grr_data->gfp.tfi_check_needed = TRUE;
  
 if(( ptr_header_i->payload EQ CTRL_BLK_NO_OPT) 
	  OR 
        ((ptr_header_i->payload EQ CTRL_BLK_OPT) 
		   AND 
           !(ptr_header_i->d_ctrl.ac)))
  {
    result = TRUE;
  }
  else if((ptr_header_i->payload EQ CTRL_BLK_OPT) 
	       AND 
		   ptr_header_i->d_ctrl.ac 
		   AND
		   ptr_header_i->d_ctrl.d 
		   AND
		  (ptr_header_i->d_ctrl.tfi EQ grr_data->downlink_tbf.tfi)
       AND
       ((0x80>>tn) & grr_data->downlink_tbf.ts_mask))
  {
    grr_data->gfp.tfi_check_needed = FALSE; /*tfi correct ignore tfi in air message*/
    result = TRUE;
  }
  else if((ptr_header_i->payload EQ CTRL_BLK_OPT) 
	       AND 
		   ptr_header_i->d_ctrl.ac 
		   AND
		   !(ptr_header_i->d_ctrl.d) 
		   AND
		  (ptr_header_i->d_ctrl.tfi EQ grr_data->uplink_tbf.tfi)
       AND
      ((0x80>>tn) & grr_data->uplink_tbf.ts_mask))
  {
    grr_data->gfp.tfi_check_needed = FALSE; /*tfi correct ignore tfi in air message*/
    result = TRUE;
  }
  else if(ptr_header_i->payload EQ 3)
  {
    result = TRUE;
  }
  else
  {
    result = FALSE;
    TRACE_EVENT_P7("wrong tfi in ctrl block  pt=%d ac=%d  d=%d tfi=%d dl_tfi=%d ul_tfi=%d msg_type=0x%x",
                                                             ptr_header_i->payload,
                                                             ptr_header_i->d_ctrl.ac,
                                                             ptr_header_i->d_ctrl.d,
                                                             ptr_header_i->d_ctrl.tfi,
                                                             grr_data->downlink_tbf.tfi,
                                                             grr_data->uplink_tbf.tfi,
                                                             ptr_header_i->ptr_block[0]>>2);  }

  return result;
  
} /* gfp_check_tfi() */


/*
+------------------------------------------------------------------------------
| Function    : gfp_send_ctrl_block
+------------------------------------------------------------------------------
| Description : The function gfp_send_ctrl_block() .... 
|
| Parameters  : dummy - description of parameter dummy
|
+------------------------------------------------------------------------------                       X
*/
GLOBAL void gfp_send_ctrl_block (ULONG fn_i, UBYTE tn_i, UBYTE rrbp_i, UBYTE sp_i,UBYTE pctrl_ack_i , T_MSGBUF * ptr_ctrl_block_i )
{ 
  MCAST(d_dl_assign,D_DL_ASSIGN);
  MCAST(d_poll_req,D_POLLING_REQ);
  UBYTE msg_type;
  BOOL  address;
#ifdef REL99
  T_TIME time_to_poll=0;
#endif
  TRACE_FUNCTION( "gfp_send_ctrl_block" );



  msg_type = ptr_ctrl_block_i->buf[0] >> 2;
  switch(msg_type)
  {

#ifdef _TARGET_    
   case PSI_1_c :                                /* Packet System Information Type 1 */
      /*TRACE_EVENT("PSI 1");*/
      break;
    case PSI_2_c :                                /* Packet System Information Type 2 */
      /*TRACE_EVENT("PSI 2");*/
      break;
    case PSI_3_c :                                /* Packet System Information Type 3 */
      /*TRACE_EVENT("PSI 3");*/
      break;
    case PSI_3_BIS_c :                            /* Packet System Information Type 3 bis */
      /*TRACE_EVENT("PSI 3bis");*/
      break;

#if defined (REL99) AND defined (TI_PS_FF_EMR)
    case PSI_3_TER_c :
      /*TRACE_EVENT("PSI 3ter");*/
#endif

    case PSI_4_c :                                /* Packet System Information Type 4 */
      /*TRACE_EVENT("PSI 4");*/
      break;
#ifdef REL99
    case PSI_8_c :                                /* Packet System Information Type 8 */
      /*TRACE_EVENT("PSI 8");*/
      break;
#endif
#endif /*_TARGET_    */

    /*
     * the PSI5 should not be decoded on TARGET and in SIMULATION
     */
    case PSI_5_c :                                /* Packet System Information Type 5 */
      /*TRACE_EVENT("PSI 5");*/
      break;

    /*
     * the PSI13 should be decoded on TARGET and in SIMULATION
     *
     * case PSI_13_c :                             * Packet System Information Type 13 *
     *   TRACE_EVENT("PSI 13");
     *   break; 
     */

    default:
      msg_type  = grr_decode_grr(ptr_ctrl_block_i);
      if(grr_data->gfp.tfi_check_needed)
      { /* check address within air message */
        address    = grr_check_address(msg_type,tn_i);
      }
      else
      { /* ignore address within airmessage, block was addressed with correct tfi in optional header*/
        address    = TRUE;
      }
  
      /*
       * save  persistence level, even if address is wrong
       */
      switch (msg_type )
      {
        case D_DL_ASSIGN_c :
        case D_PAGING_REQ_c:
        case D_DL_DUMMY_c : 
          if(d_dl_assign->v_pers_lev)
          {
            sig_gfp_psi_save_persistence_level( &(d_dl_assign->pers_lev) );
          }
          break; 
      }

      if (address AND grr_data->uplink_tbf.ti AND 
          (grr_data->tbf_type EQ CGRLC_TBF_MODE_UL))
      {
        /*4.60, 7.1.2.3a	RLC/MAC procedures during contention resolution
        -	the mobile station shall not accept a PACKET MEASUREMENT ORDER
          message, a PACKET CELL CHANGE ORDER message and a PACKET POWER 
          CONTROL/TIMING ADVANCE message addressing the mobile station 
          with the TFI value associated with the uplink TBF ;
        */
        
        switch (msg_type)
        {
        case D_CTRL_PWR_TA_c :
          {
            MCAST(d_ctrl_pwr_ta,D_CTRL_PWR_TA);
            if (!grr_data->gfp.tfi_check_needed OR d_ctrl_pwr_ta->add4.v_glob_tfi)
            {
              TRACE_EVENT("CTRL_PWR_TA ignored - received during contention");
              address = FALSE;
            }
          }
          break;
        case D_MEAS_ORDER_c :
          {
            MCAST(d_meas_order,D_MEAS_ORDER);
            if (!grr_data->gfp.tfi_check_needed OR d_meas_order->add1.v_glob_tfi)
            {
              TRACE_EVENT("MEAS_ORDER ignored - received during contention");
              address = FALSE;
            }
          }
          break;
        case D_CELL_CHAN_ORDER_c :
          {
            MCAST(d_cell_chan_order,D_CELL_CHAN_ORDER);
            if (!grr_data->gfp.tfi_check_needed OR d_cell_chan_order->add1.v_glob_tfi)
            {
              TRACE_EVENT("CELL_CHAN_ORDER ignored - received during contention");
              address = FALSE;
            }
          }
          break;
        default :
          break;
        }
      }

      if(address)
      {
        /*
         * handle poll position
         */
        /* 0460 - Section 10.4.5 
         * MS shall ignore the RRBP field if received as part of  
         * packet access reject (or) packet queue notification (or) packet paging request meassages
         * Avoid sending Poll response */
        if( sp_i  AND 
           (msg_type NEQ D_UL_ACK_c) AND /* packet uplink ack/nack will be handled in grlc*/
           (msg_type NEQ D_ACCESS_REJ_c) AND 
           (msg_type NEQ D_PAGING_REQ_c ) ) 
        {
          PALLOC(cgrlc_poll_req,CGRLC_POLL_REQ);

          cgrlc_poll_req->poll_fn  = grr_calc_new_poll_pos(fn_i, rrbp_i);
          cgrlc_poll_req->tn       = tn_i;
          cgrlc_poll_req->ctrl_ack = pctrl_ack_i;
          if ((msg_type EQ D_POLLING_REQ_c) AND (d_poll_req->ctrl_ack_type))
          {
            cgrlc_poll_req->poll_b_type = CGRLC_POLL_RES_NB;
          }
          else if (msg_type EQ D_POLLING_REQ_c AND (d_poll_req->ctrl_ack_type EQ 0))
          {
            cgrlc_poll_req->poll_b_type = CGRLC_POLL_RES_AB;
          }
          else
          {
            cgrlc_poll_req->poll_b_type = CGRLC_POLL_CTRL;
          }
          grr_data->l1_del_tbf_start_fn = grr_decode_tbf_start_rel (cgrlc_poll_req->poll_fn,1); 
          PSEND(hCommGRLC,cgrlc_poll_req);
#ifdef REL99
          time_to_poll = grr_get_time_to_send_poll(rrbp_i);
#endif
        }
        if(msg_type NEQ D_DL_DUMMY_c)
        {
          if (sp_i)
          {
            TRACE_EVENT_P3("correct add with Poll: msg_type=0x%2x,fn_i=%ld,rrbp=%d ",
                                                                  msg_type,
                                                                  fn_i,
                                                                  rrbp_i );
          }
          else
          {
            TRACE_EVENT_P2("correct add at fn=%ld: msg_type = 0x%2x",fn_i,msg_type);
          }
        }
/*

        if( msg_type EQ ... )
        {
          ULONG trace[5];

          trace[0]  = ptr_ctrl_block_i->buf[0]  << 24;
          trace[0] |= ptr_ctrl_block_i->buf[1]  << 16; 
          trace[0] |= ptr_ctrl_block_i->buf[2]  <<  8; 
          trace[0] |= ptr_ctrl_block_i->buf[3]  <<  0; 

          trace[1]  = ptr_ctrl_block_i->buf[4]  << 24;
          trace[1] |= ptr_ctrl_block_i->buf[5]  << 16; 
          trace[1] |= ptr_ctrl_block_i->buf[6]  <<  8; 
          trace[1] |= ptr_ctrl_block_i->buf[7]  <<  0; 

          trace[2]  = ptr_ctrl_block_i->buf[8]  << 24;
          trace[2] |= ptr_ctrl_block_i->buf[9]  << 16; 
          trace[2] |= ptr_ctrl_block_i->buf[10] <<  8; 
          trace[2] |= ptr_ctrl_block_i->buf[11] <<  0; 

          trace[3]  = ptr_ctrl_block_i->buf[12] << 24;
          trace[3] |= ptr_ctrl_block_i->buf[13] << 16; 
          trace[3] |= ptr_ctrl_block_i->buf[14] <<  8; 
          trace[3] |= ptr_ctrl_block_i->buf[15] <<  0; 

          trace[4]  = ptr_ctrl_block_i->buf[16] << 24;
          trace[4] |= ptr_ctrl_block_i->buf[17] << 16; 
          trace[4] |= ptr_ctrl_block_i->buf[18] <<  8; 
          trace[4] |= ptr_ctrl_block_i->buf[19] <<  0; 

          TRACE_EVENT_P8( "RLC_CTRL: %08X%08X%08X%08X%08X%02X%02X%02X",
                          trace[0], trace[1], trace[2], trace[3], trace[4],
                          ptr_ctrl_block_i->buf[20], ptr_ctrl_block_i->buf[21],
                          ptr_ctrl_block_i->buf[22] ); 
        }

*/

        switch (msg_type )
        {
        case D_ACCESS_REJ_c :                         /* Packet Access Reject */
          sig_gfp_tc_access_rej_ptm();
          break;
        case D_TS_RECONFIG_c:                         /* Packet Timeslot reconfigure */
          sig_gfp_tc_ts_reconfig_ptm ();
          break; 
        case D_UL_ASSIGN_c :                          /* Packet Uplink Assignment */
          sig_gfp_tc_ul_assign_ptm ();
          break;
        case D_DL_ASSIGN_c :                          /* Packet Downlink Assignment */
          sig_gfp_tc_dl_assign_ptm ();
          break;
        case D_TBF_RELEASE_c :                        /* Packet TBF release */
          sig_gfp_tc_packet_tbf_rel_ptm(fn_i,rrbp_i,sp_i);
          break;
        case D_PAGING_REQ_c :                         /* Packet Paging Request */
          sig_gfp_pg_req ();
          break;
        case D_UL_ACK_c :                             /* Packet Uplink Ack/Nack */
          {
            MCAST(d_ul_ack,D_UL_ACK);
            if(grr_data->uplink_tbf.mac_mode EQ FIXED_ALLOCATION)
            {
              sig_gfp_tc_fix_alloc_ack_ptm();
            }
            /* 
             * send ta update, if pta is present and allocation bitmap is not present.
             * If pta and allocation bitmap is present, than the ta update is sent 
             * with MPHP_ASSIGNMENT_REQ primitive.
             */
            if( d_ul_ack->gprs_ul_ack_nack_info.v_pta AND
                (
                  (grr_data->uplink_tbf.mac_mode NEQ FIXED_ALLOCATION)  OR
                  (!(d_ul_ack->gprs_ul_ack_nack_info.v_f_alloc_ack AND d_ul_ack->gprs_ul_ack_nack_info.f_alloc_ack.v_fa_s2))
                )
              )
            {
              sig_gfp_tc_update_ta_req_ptm();
            }
          }
          break;
        case PSI_1_c :                                /* Packet System Information Type 1 */
          sig_gfp_psi_1_ptm ();
          break;
        case PSI_2_c :                                /* Packet System Information Type 2 */
          sig_gfp_psi_2_ptm ();
          break;
        case PSI_3_c :                                /* Packet System Information Type 3 */
          sig_gfp_psi_3_ptm ();
          break;
        case PSI_3_BIS_c :                            /* Packet System Information Type 3 bis */
          sig_gfp_psi_3_bis_ptm ();
          break;

#if defined (REL99) AND defined (TI_PS_FF_EMR)
        case PSI_3_TER_c :                            /* Packet System Information Type 3 ter */
          sig_gfp_psi_3_ter_ptm ();
#endif
		  /*lint -fallthrough*/

        case PSI_4_c :                                /* Packet System Information Type 4 */
          sig_gfp_psi_4_ptm ();
          break;
#ifdef REL99
        case PSI_8_c :                                /* Packet System Information Type 8 */
          sig_gfp_psi_8_ptm ();
          break;
#endif
        case PSI_13_c :                               /* Packet System Information Type 13 */
          sig_gfp_psi_13_ptm ();
          break;
        case D_CELL_CHAN_ORDER_c :                    /* Packet Cell Change Order */
#ifdef REL99
          sig_gfp_ctrl_cc_order (time_to_poll);
#else
          sig_gfp_ctrl_cc_order ();
#endif
          break;
        case D_DL_DUMMY_c :                           /* Packet Downlink Dummy Control Block */
          break;
        case D_MEAS_ORDER_c :                         /* Packet Measurement Order */
          sig_gfp_meas_order ();
          break;
        case D_PDCH_RELEASE_c :                       /* Packet PDCH Release */
          TRACE_EVENT_P4("pdch rel on tn %d: %4x-%4x-%4x",
                                                          tn_i,
                                                          ptr_ctrl_block_i->buf[0],
                                                          ptr_ctrl_block_i->buf[1],
                                                          ptr_ctrl_block_i->buf[2]);/*lint !e415 !e416*/
          sig_gfp_tc_pdch_release_ptm ( tn_i );
          break;
        case D_POLLING_REQ_c :                        /* Packet Polling Request */
          break;
        case D_CTRL_PWR_TA_c :                        /* Packet control power timing advance Parameters */
          sig_gfp_meas_ctrl_pwr_ta_ptm (  );
          break;
        default:
          TRACE_ERROR( "CGRLC_DATA_IND with unexpected ctrl message typ " );
          break;
        } /* switch (msg_type) */

        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 );
        }
      }
      else
      {
        TRACE_EVENT_P3("not add to MS: msg_type = %2x  fn_i=%ld sp=%d",msg_type,fn_i,sp_i);
      }
      break;
  }
  grr_data->l1_del_tbf_start_fn = GRR_INVALID_FN;
}/* gfp_send_ctrl_block() */