view src/g23m-gprs/grr/grr_pgs.c @ 300:edcb8364d45b
L1: resurrect TCH tap feature
In this new incarnation of our TCH tap feature, we support DL sniffing
in all 3 of FR1, HR1 and EFR, and the new implementation will capture
every 20 ms frame where the old one silently skipped a frame (sent
nothing) during FACCH stealing. The wire interface on RVTMUX changed
slightly, and fc-shell tch record will need to be updated to support
the new version.
TCH UL play or substitution is supported for FR1 and EFR only;
support for HR1 can be added later if needed.
author
Mychaela Falconia <falcon@freecalypso.org>
date
Tue, 13 Dec 2022 02:44:01 +0000 (2022-12-13)
parents
fa8dc04885d8
children
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
+ − | PG of entity GRR.
+ − +-----------------------------------------------------------------------------
+ − */
+ −
+ − #ifndef GRR_PGS_C
+ − #define GRR_PGS_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 "grr.h" /* to get the global entity definitions */
+ −
+ −
+ − #include "grr_ctrls.h" /* */
+ −
+ − #include "grr_f.h" /* to get the global functions */
+ − #include "grr_pgf.h" /* */
+ −
+ −
+ − /*==== CONST ================================================================*/
+ −
+ − /*==== LOCAL VARS ===========================================================*/
+ −
+ − /*==== PRIVATE FUNCTIONS ====================================================*/
+ −
+ − /*==== PUBLIC FUNCTIONS =====================================================*/
+ − /*
+ − +------------------------------------------------------------------------------
+ − | Function : sig_ctrl_pg_start
+ − +------------------------------------------------------------------------------
+ − | Description : Handles the internal signal SIG_CTRL_PG_START
+ − | PG has to manage the paging procedures according to network mode
+ − | and presence of PBCCH channel
+ − | Parameters : void
+ − |
+ − +------------------------------------------------------------------------------
+ − */
+ − GLOBAL void sig_ctrl_pg_start ( void )
+ − {
+ − TRACE_ISIG( "sig_ctrl_pg_start" );
+ −
+ − switch( GET_STATE( PG ) )
+ − {
+ − case PG_TRANSFER:
+ − TRACE_ERROR("SIG_CTRL_PG_START not expected in transfer mode");
+ − break;
+ − case PG_NULL:
+ − SET_STATE(PG, PG_IDLE);
+ −
+ − /*lint -fallthrough*/
+ −
+ − default:
+ − /* Because of having new cell or new PPCH */
+ − psc_db->last_pg_mode = psc_db->network_pg_mode = REORG_PAGING;
+ −
+ − pg_handle_idle_mode( NULL_IDLE );
+ − break;
+ − }
+ −
+ − } /* sig_ctrl_pg_start() */
+ −
+ − /*
+ − +------------------------------------------------------------------------------
+ − | Function : sig_ctrl_pg_stop
+ − +------------------------------------------------------------------------------
+ − | Description : Handles the internal signal SIG_CTRL_PG_STOP
+ − |
+ − | Parameters : void
+ − |
+ − +------------------------------------------------------------------------------
+ − */
+ − GLOBAL void sig_ctrl_pg_stop ( void )
+ − {
+ − TRACE_ISIG( "sig_ctrl_pg_stop" );
+ −
+ − grr_data->pg.packet_mode = PACKET_MODE_NULL;
+ − SET_STATE(PG,PG_NULL);
+ − pg_send_stop();
+ − psc_db->last_pg_mode = psc_db->network_pg_mode = REORG_PAGING;
+ − } /* sig_ctrl_pg_stop() */
+ −
+ −
+ −
+ − /*
+ − +------------------------------------------------------------------------------
+ − | Function : sig_ctrl_pg_mode_ind
+ − +------------------------------------------------------------------------------
+ − | Description : Handles the internal signal SIG_CTRL_PG_MODE_IND
+ − This signal indicates whether the MS is in idle, transfer or access mode
+ − |
+ − | Parameters : packet_mode
+ − |
+ − +------------------------------------------------------------------------------
+ − */
+ − GLOBAL void sig_ctrl_pg_mode_ind ( T_PACKET_MODE packet_mode)
+ − {
+ − T_PACKET_MODE old_packet_mode;
+ −
+ − TRACE_ISIG( "sig_ctrl_pg_mode_ind" );
+ −
+ − old_packet_mode = grr_data->pg.packet_mode;
+ − grr_data->pg.packet_mode = packet_mode;
+ −
+ − switch( GET_STATE( PG ) )
+ − {
+ − case PG_IDLE:
+ − switch( packet_mode )
+ − {
+ − case PACKET_MODE_PTM:
+ − SET_STATE( PG, PG_TRANSFER );
+ −
+ − pg_handle_transfer_mode( IDLE_PTM );
+ − break;
+ −
+ − case PACKET_MODE_PAM:
+ − SET_STATE( PG, PG_ACCESS );
+ −
+ − pg_handle_access_mode( );
+ − break;
+ −
+ − default:
+ − break;
+ − }
+ − break;
+ −
+ − case PG_TRANSFER:
+ − switch( packet_mode )
+ − {
+ − case PACKET_MODE_PAM:
+ − SET_STATE( PG, PG_ACCESS );
+ −
+ − pg_handle_access_mode( );
+ − break;
+ −
+ − case PACKET_MODE_PIM:
+ − SET_STATE( PG, PG_IDLE );
+ −
+ − pg_handle_non_drx_timers( );
+ − pg_handle_idle_mode( PTM_IDLE );
+ − break;
+ −
+ − case PACKET_MODE_PTM:
+ − //TODOif( grr_test_mode_active( ) )
+ − {
+ − sig_pg_ctrl_stop_mon_ccch( );
+ − }
+ − break;
+ − }
+ − break;
+ −
+ − case PG_ACCESS:
+ − switch( packet_mode )
+ − {
+ − case PACKET_MODE_PAM:
+ − if( old_packet_mode EQ PACKET_MODE_2P_PTM )
+ − {
+ − TRACE_EVENT( "PACKET_MODE_2P_PTM --> PACKET_MODE_PAM" );
+ −
+ − pg_handle_access_mode( );
+ − }
+ − break;
+ −
+ − case PACKET_MODE_2P_PTM:
+ − /*
+ − * Do not change the state to PG_TRANSFER because of transition rule
+ − */
+ − TRACE_EVENT( "PACKET_MODE_2P_PTM in PG_ACCESS" );
+ −
+ − pg_handle_transfer_mode( ACCESS_PTM );
+ − break;
+ −
+ − case PACKET_MODE_PIM:
+ − SET_STATE( PG, PG_IDLE );
+ −
+ − pg_handle_idle_mode( ACCESS_IDLE );
+ − break;
+ −
+ − case PACKET_MODE_PTM:
+ − SET_STATE( PG, PG_TRANSFER );
+ −
+ − pg_handle_transfer_mode( ACCESS_PTM );
+ − break;
+ − }
+ − break;
+ −
+ − default:
+ − TRACE_ERROR( "SIG_CTRL_PG_MODE_IND unexpected" );
+ − break;
+ − }
+ − }/* sig_ctrl_pg_mode_ind() */
+ −
+ − /*
+ − +------------------------------------------------------------------------------
+ − | Function : sig_ctrl_pg_t3172_run
+ − +------------------------------------------------------------------------------
+ − | Description : Handles the internal signal SIG_CTRL_PG_T3172_RUN
+ − |
+ − | Parameters : void
+ − |
+ − +------------------------------------------------------------------------------
+ − */
+ − GLOBAL void sig_ctrl_pg_t3172_run ( void)
+ − {
+ − TRACE_ISIG( "sig_ctrl_pg_t3172_run" );
+ −
+ − } /* sig_ctrl_pg_t3172_run() */
+ −
+ −
+ − /*
+ − +------------------------------------------------------------------------------
+ − | Function : sig_ctrl_pg_indication
+ − +------------------------------------------------------------------------------
+ − | Description : Handles the internal signal SIG_CTRL_PG_INDICATION. This
+ − | signal indicates paging for packet access
+ − |
+ − | Parameters : UBYTE paging_type (IMSI or PTMSI(GPRS TMSI))
+ − |
+ − +------------------------------------------------------------------------------
+ − */
+ − GLOBAL void sig_ctrl_pg_indication ( UBYTE paging_type )
+ − {
+ − UBYTE type;
+ −
+ − TRACE_ISIG( "sig_ctrl_pg_indication" );
+ −
+ − type = (paging_type EQ RRGRR_IMSI)? GMMRR_IMSI: GMMRR_PTMSI;
+ −
+ − switch( GET_STATE( PG ) )
+ − {
+ − case PG_IDLE:
+ − sig_pg_ctrl_downlink_transfer ( type );
+ − break;
+ − case PG_ACCESS:
+ − /* ignore PAGING REQUEST messages indicating a packet paging procedure*/
+ − break;
+ − default:
+ − TRACE_ERROR( "SIG_CTRL_PG_INDICATION unexpected" );
+ − break;
+ − }
+ − } /* sig_ctrl_pg_indication() */
+ −
+ − /*
+ − +------------------------------------------------------------------------------
+ − | Function : sig_ctrl_pg_rr_est
+ − +------------------------------------------------------------------------------
+ − | Description : Handles the internal signal SIG_CTRL_PG_RR_EST. This
+ − | signal indicates paging for RR connection.
+ − | This signal makes no sense in case of Class C mobile
+ − |
+ − | Parameters : no parameters
+ − |
+ − +------------------------------------------------------------------------------
+ − */
+ − GLOBAL void sig_ctrl_pg_rr_est ( void)
+ − {
+ −
+ − TRACE_ISIG( "sig_ctrl_pg_rr_est" );
+ −
+ − if(grr_data->ms.class_of_mode EQ GMMRR_CLASS_CG)
+ − {
+ − TRACE_ERROR("CLASS_CG MS has received a RR_EST ");
+ − }
+ − else
+ − {
+ − switch( GET_STATE( PG ) )
+ − {
+ − case PG_NULL:
+ − case PG_IDLE:
+ − case PG_ACCESS:
+ − /* inform CTRL resp. GMM about the RR connection establishment request:
+ − * GMM has to decide whether accept the request or not
+ − */
+ − sig_pg_ctrl_rr_est_req(PG_ON_CCCH);
+ − break;
+ − case PG_TRANSFER:
+ − if(grr_data->pg.nmo EQ GMMRR_NET_MODE_II)
+ − {
+ − TRACE_EVENT(" CS call in GMMRR_NET_MODE_II transfer mode");
+ − sig_pg_ctrl_rr_est_req(PG_ON_CCCH);
+ − }
+ − else
+ − {
+ − TRACE_EVENT_P1("CS call in transfer mode NMO_%d", grr_data->pg.nmo+1);
+ − }
+ − break;
+ − default:
+ − TRACE_ERROR( "SIG_CTRL_PG_RR_EST unexpected" );
+ − break;
+ − }
+ − }
+ − } /* sig_ctrl_pg_indication() */
+ −
+ −
+ −
+ − /*
+ − +------------------------------------------------------------------------------
+ − | Function : sig_gfp_pg_req
+ − +------------------------------------------------------------------------------
+ − | Description : Handles
+ − |
+ − | Parameters : void
+ − |
+ − +------------------------------------------------------------------------------
+ − */
+ − GLOBAL void sig_gfp_pg_req ( void )
+ − {
+ − MCAST( d_paging_req, D_PAGING_REQ );
+ −
+ − UBYTE state = GET_STATE( PG );
+ −
+ − TRACE_ISIG( "sig_gfp_pg_req" );
+ −
+ − switch( state )
+ − {
+ − case PG_IDLE:
+ − case PG_TRANSFER:
+ − case PG_ACCESS:
+ − pg_process_pp_req( d_paging_req, state );
+ − break;
+ − default:
+ − TRACE_ERROR( "sig_gfp_pg_req: page mode has no meaning in this state" );
+ − break;
+ − }
+ − } /* sig_gfp_pg_req() */
+ −
+ − /*
+ − +------------------------------------------------------------------------------
+ − | Function : sig_gfp_pg_mode
+ − +------------------------------------------------------------------------------
+ − | Description : Handles
+ − |
+ − | Parameters : UBYTE page_mode: requested page mode
+ − | BOOL ms_paging_group: paging belongs to MS paging group
+ − |
+ − +------------------------------------------------------------------------------
+ − */
+ − GLOBAL void sig_gfp_pg_mode ( UBYTE page_mode, BOOL ms_paging_group )
+ − {
+ − TRACE_ISIG( "sig_gfp_pg_mode" );
+ −
+ − if( ms_paging_group )
+ − {
+ − switch( GET_STATE( PG ) )
+ − {
+ − case PG_IDLE:
+ − if( page_mode NEQ SAME_PAGING )
+ − {
+ − psc_db->network_pg_mode = page_mode;
+ − }
+ −
+ − if( grr_is_non_drx_period( ) EQ FALSE AND
+ − psc_db->last_pg_mode NEQ psc_db->network_pg_mode )
+ − {
+ − /*
+ − * To ensure that the paging mode is not set to page normal in other states
+ − * than packet idle mode, the function grr_is_packet_idle_mode is called in
+ − * advance.
+ − *
+ − * State PG_IDLE not necessarily means that GRR is in packet idle mode. In
+ − * case GRR is currently executing the RRGRR_STOP_TASK_REQ/CNF procedure,
+ − * just the services CPAP and TC changes their states. All other services
+ − * remain in state IDLE, which is not quite correct. A similar scenario
+ − * occurs during execution of the MPHP_ASSIGNMENT_REQ/CON procedure.
+ − */
+ − if( grr_is_packet_idle_mode( ) EQ TRUE )
+ − {
+ − pg_send_start( psc_db->network_pg_mode );
+ − }
+ − else
+ − {
+ − TRACE_EVENT( "sig_gfp_pg_mode: Page mode set by next packet idle mode" );
+ − }
+ − }
+ − break;
+ −
+ − case PG_ACCESS:
+ − if( page_mode NEQ SAME_PAGING )
+ − {
+ − psc_db->network_pg_mode = page_mode;
+ − }
+ − break;
+ −
+ − default:
+ −
+ − #ifdef _SIMULATION_
+ −
+ − TRACE_ERROR( "SIG_GFP_PG_MODE unexpected" );
+ −
+ − #endif /* #ifdef _SIMULATION_ */
+ −
+ − break;
+ − }
+ − }
+ − } /* sig_gfp_pg_mode() */
+ −
+ − /*
+ − +------------------------------------------------------------------------------
+ − | Function : sig_gfp_pg_stop_pccch_con
+ − +------------------------------------------------------------------------------
+ − | Description : Handles the internal signal SIG_GFP_PG_STOP_PCCCH_CON
+ − |
+ − | Parameters : mphp_stop_pccch_con: pointer to T_MPHP_STOP_PCCCH_CON
+ − |
+ − +------------------------------------------------------------------------------
+ − */
+ − GLOBAL void sig_gfp_pg_stop_pccch_con ( T_MPHP_STOP_PCCCH_CON *mphp_stop_pccch_con)
+ − {
+ − TRACE_ISIG( "sig_gfp_pg_stop_pccch_con" );
+ − } /* sig_gfp_pg_stop_pccch_con() */
+ −
+ − /*
+ − +------------------------------------------------------------------------------
+ − | Function : sig_cs_pg_start_t_nc2_ndrx
+ − +------------------------------------------------------------------------------
+ − | Description : Handles the internal signal SIG_CS_PG_START_NC2_NDRX
+ − |
+ − | Parameters : void
+ − |
+ − +------------------------------------------------------------------------------
+ − */
+ − GLOBAL void sig_cs_pg_start_t_nc2_ndrx ( UBYTE nc_non_drx_period )
+ − {
+ − TRACE_ISIG( "sig_cs_pg_start_t_nc2_ndrx" );
+ −
+ − pg_start_t_nc2_ndrx( nc_non_drx_period );
+ −
+ − } /* sig_cs_pg_start_t_nc2_ndrx() */