FreeCalypso > hg > fc-magnetite
diff src/g23m-gprs/grr/grr_pgs.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_pgs.c Thu Oct 13 04:24:13 2016 +0000 @@ -0,0 +1,457 @@ +/* ++----------------------------------------------------------------------------- +| 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() */