FreeCalypso > hg > fc-magnetite
diff src/g23m-gprs/grr/grr_gfpf.c @ 183:219afcfc6250
src/g23m-gprs: initial import from TCS3.2/LoCosto
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 13 Oct 2016 04:24:13 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-gprs/grr/grr_gfpf.c Thu Oct 13 04:24:13 2016 +0000 @@ -0,0 +1,902 @@ +/* ++----------------------------------------------------------------------------- +| 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() */